Browse Source

Player skills no longer proc equip break on mobs (#7005)

* Fixes #5906.
* Player skills and items that have the ability to break a target's equipment will no longer "break" a non-player's equipment.
* WS_MELTDOWN (Shattering Strike) is able to bypass the non-player check as it does affect all target types.
* Adds a battle config to toggle the behavior.
Thanks to @Tydus1, @Xelliekins, @Atemo, @Daegaladh, and @Lemongrass3110!
Aleos 2 years ago
parent
commit
038c1778e1
4 changed files with 15 additions and 0 deletions
  1. 6 0
      conf/battle/battle.conf
  2. 1 0
      src/map/battle.cpp
  3. 1 0
      src/map/battle.hpp
  4. 7 0
      src/map/skill.cpp

+ 6 - 0
conf/battle/battle.conf

@@ -167,3 +167,9 @@ warg_can_falcon: no
 // Should the target be able of dodging damage by snapping away to the edge of the screen?
 // Official behavior is "no"
 snap_dodge: no
+
+// Grant player skills/items the ability to "break" non-player equipment. (Note 1)
+// This will effectively apply the strip equip effect to the non-player target.
+// NOTE: WS_MELTDOWN is exempt from this check when disabled.
+// Official: no
+break_mob_equip: no

+ 1 - 0
src/map/battle.cpp

@@ -10126,6 +10126,7 @@ static const struct _battle_data {
 
 	{ "feature.barter",                     &battle_config.feature_barter,                  1,      0,      1,              },
 	{ "feature.barter_extended",            &battle_config.feature_barter_extended,         1,      0,      1,              },
+	{ "break_mob_equip",                    &battle_config.break_mob_equip,                 0,      0,      1,              },
 
 #include "../custom/battle_config_init.inc"
 };

+ 1 - 0
src/map/battle.hpp

@@ -710,6 +710,7 @@ struct Battle_Config
 
 	int feature_barter;
 	int feature_barter_extended;
+	int break_mob_equip;
 
 #include "../custom/battle_config_struct.inc"
 };

+ 7 - 0
src/map/skill.cpp

@@ -2697,6 +2697,13 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list *
 --------------------------------------------------------------------------*/
 int skill_break_equip(struct block_list *src, struct block_list *bl, unsigned short where, int rate, int flag)
 {
+	status_change *src_sc = status_get_sc(src);
+
+	// Grant player skills/items the ability to "break" non-player equipment.
+	// WS_MELTDOWN is exempt from this check.
+	if (!battle_config.break_mob_equip && bl->type != BL_PC && !(src_sc && src_sc->data[SC_MELTDOWN]))
+		return 0;
+
 	const int where_list[6]     = { EQP_WEAPON, EQP_ARMOR, EQP_SHIELD, EQP_HELM, EQP_ACC, EQP_SHADOW_GEAR };
 	const enum sc_type scatk[6] = { SC_STRIPWEAPON, SC_STRIPARMOR, SC_STRIPSHIELD, SC_STRIPHELM, SC__STRIPACCESSORY, SC_SHADOW_STRIP };
 	const enum sc_type scdef[6] = { SC_CP_WEAPON, SC_CP_ARMOR, SC_CP_SHIELD, SC_CP_HELM, SC_NONE, SC_PROTECTSHADOWEQUIP };