소스 검색

Adds item bonus bReduceDamageReturn (#5601)

* Fixes #5488.
* Adds item bonus bReduceDamageReturn which reduces melee, ranged, and magic reflected damage.
Thanks to @Atemo!
Aleos 4 년 전
부모
커밋
d4d8130bcf
7개의 변경된 파일24개의 추가작업 그리고 5개의 파일을 삭제
  1. 1 0
      doc/item_bonus.txt
  2. 6 0
      src/map/battle.cpp
  3. 1 1
      src/map/map.hpp
  4. 5 0
      src/map/pc.cpp
  5. 1 1
      src/map/pc.hpp
  6. 1 0
      src/map/script_constants.hpp
  7. 9 3
      src/map/skill.cpp

+ 1 - 0
doc/item_bonus.txt

@@ -406,6 +406,7 @@ Damage return
 bonus bShortWeaponDamageReturn,n;	Reflects n% of received melee damage back to the enemy that caused it
 bonus bLongWeaponDamageReturn,n; 	Reflects n% of received ranged damage back to the enemy that caused it
 bonus bMagicDamageReturn,n;      	Adds a n% chance to reflect targetted magic spells back to the enemy that caused it
+bonus bReduceDamageReturn,n;		Reduces reflected damage (melee/ranged/magic) by n%
 
 Strip/Break equipment
 ---------------------

+ 6 - 0
src/map/battle.cpp

@@ -7345,6 +7345,12 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i
 		}
 	}
 
+	if (sd && sd->bonus.reduce_damage_return != 0) {
+		rdamage -= rdamage * sd->bonus.reduce_damage_return / 100;
+		if (rdamage < 1)
+			rdamage = 1;
+	}
+
 	if (ssc) {
 		if (ssc->data[SC_INSPIRATION]) {
 			rdamage += damage / 100;

+ 1 - 1
src/map/map.hpp

@@ -509,7 +509,7 @@ enum _sp {
 	SP_WEAPON_ATK_RATE, SP_WEAPON_MATK_RATE, SP_DROP_ADDRACE, SP_DROP_ADDCLASS, SP_NO_MADO_FUEL, // 2083-2087
 	SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY, SP_NO_WALK_DELAY, //2088-2092
 	SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE, SP_SHORT_ATK_RATE, SP_MAGIC_SUBSIZE, SP_CRIT_DEF_RATE, // 2093-2097
-	SP_MAGIC_SUBDEF_ELE // 2098
+	SP_MAGIC_SUBDEF_ELE, SP_REDUCE_DAMAGE_RETURN // 2098-2099
 };
 
 enum _look {

+ 5 - 0
src/map/pc.cpp

@@ -3541,6 +3541,10 @@ void pc_bonus(struct map_session_data *sd,int type,int val)
 			if(sd->state.lr_flag != 2)
 				sd->bonus.magic_damage_return += val;
 			break;
+		case SP_REDUCE_DAMAGE_RETURN:
+			if (sd->state.lr_flag != 2)
+				sd->bonus.reduce_damage_return += val;
+			break;
 		case SP_ALL_STATS:	// [Valaris]
 			if(sd->state.lr_flag!=2) {
 				sd->indexed_bonus.param_bonus[SP_STR-SP_STR]+=val;
@@ -8881,6 +8885,7 @@ int64 pc_readparam(struct map_session_data* sd,int64 type)
 		case SP_SHORT_WEAPON_DAMAGE_RETURN: val = sd->bonus.short_weapon_damage_return; break;
 		case SP_LONG_WEAPON_DAMAGE_RETURN: val = sd->bonus.long_weapon_damage_return; break;
 		case SP_MAGIC_DAMAGE_RETURN: val = sd->bonus.magic_damage_return; break;
+		case SP_REDUCE_DAMAGE_RETURN: val = sd->bonus.reduce_damage_return; break;
 		case SP_PERFECT_HIDE:    val = sd->special_state.perfect_hiding?1:0; break;
 		case SP_UNBREAKABLE:     val = sd->bonus.unbreakable; break;
 		case SP_UNBREAKABLE_WEAPON: val = (sd->bonus.unbreakable_equip&EQP_WEAPON)?1:0; break;

+ 1 - 1
src/map/pc.hpp

@@ -519,7 +519,7 @@ struct map_session_data {
 		int get_zeny_rate;
 		int get_zeny_num; //Added Get Zeny Rate [Skotlex]
 		int double_add_rate;
-		int short_weapon_damage_return,long_weapon_damage_return;
+		int short_weapon_damage_return,long_weapon_damage_return,reduce_damage_return;
 		int magic_damage_return; // AppleGirl Was Here
 		int break_weapon_rate,break_armor_rate;
 		int crit_atk_rate;

+ 1 - 0
src/map/script_constants.hpp

@@ -762,6 +762,7 @@
 	export_constant2("bMagicSubSize",SP_MAGIC_SUBSIZE);
 	export_constant2("bCritDefRate",SP_CRIT_DEF_RATE);
 	export_constant2("bMagicSubDefEle", SP_MAGIC_SUBDEF_ELE);
+	export_constant2("bReduceDamageReturn",SP_REDUCE_DAMAGE_RETURN);
 
 	/* equip indices */
 	export_constant(EQI_COMPOUND_ON);

+ 9 - 3
src/map/skill.cpp

@@ -3292,7 +3292,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 	struct status_change *sc, *tsc;
 	struct map_session_data *sd, *tsd;
 	int64 damage;
-	int8 rmdamage = 0;//magic reflected
+	bool rmdamage = false;//magic reflected
 	int type;
 	enum e_damage_type dmg_type;
 	bool shadow_flag = false;
@@ -3371,7 +3371,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 		if( (dmg.damage || dmg.damage2) && (type = skill_magic_reflect(src, bl, src==dsrc)) )
 		{	//Magic reflection, switch caster/target
 			struct block_list *tbl = bl;
-			rmdamage = 1;
+			rmdamage = true;
 			bl = src;
 			src = tbl;
 			dsrc = tbl;
@@ -3429,6 +3429,12 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 					//Reduction: 6% + 6% every 20%
 					dmg.damage -= dmg.damage * (6 * (1+per)) / 100;
 				}
+
+				if (sd && sd->bonus.reduce_damage_return != 0) {
+					dmg.damage -= dmg.damage * sd->bonus.reduce_damage_return / 100;
+					if (dmg.damage < 1)
+						dmg.damage = 1;
+				}
 			}
 #endif
 		}
@@ -3819,7 +3825,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 
 	map_freeblock_unlock();
 
-	if ((flag&0x1000000) && rmdamage == 1)
+	if ((flag&0x1000000) && rmdamage)
 		return 0; //Should return 0 when damage was reflected
 
 	return damage;