Pārlūkot izejas kodu

Fixed bShortWeaponDamage to work against cart termination, bugreport:5328

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@15593 54d463be-8e91-2dee-dedb-b68131a5f0ec
shennetsind 13 gadi atpakaļ
vecāks
revīzija
472348fad1
3 mainītis faili ar 10 papildinājumiem un 13 dzēšanām
  1. 6 9
      src/map/battle.c
  2. 1 1
      src/map/battle.h
  3. 3 3
      src/map/skill.c

+ 6 - 9
src/map/battle.c

@@ -3674,8 +3674,7 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl
 }
 
 //Calculates BF_WEAPON returned damage.
-int battle_calc_return_damage(struct block_list* bl, struct block_list *src, int *dmg, int flag)
-{
+int battle_calc_return_damage(struct block_list* bl, struct block_list *src, int *dmg, int flag, int skillid){
 	struct map_session_data* sd = NULL;
 	int rdamage = 0, damage = *dmg;
 	struct status_change* sc;
@@ -3688,17 +3687,16 @@ int battle_calc_return_damage(struct block_list* bl, struct block_list *src, int
 		rdamage = (*dmg) * sc->data[SC_REFLECTDAMAGE]->val2 / 100;
 		if( rdamage > max_damage ) rdamage = max_damage;
 	} else if (flag & BF_SHORT) {//Bounces back part of the damage.
-		if (sd && sd->short_weapon_damage_return)
-		{
+		if (sd && sd->short_weapon_damage_return){
 			rdamage += damage * sd->short_weapon_damage_return / 100;
 			if(rdamage < 1) rdamage = 1;
 		}
 		if( sc && sc->count ) {
-			if (sc->data[SC_REFLECTSHIELD]) {
+			if ( sc->data[SC_REFLECTSHIELD] && skillid != WS_CARTTERMINATION ) {
 				rdamage += damage * sc->data[SC_REFLECTSHIELD]->val2 / 100;
 				if (rdamage < 1) rdamage = 1;
 			}
-			if(sc->data[SC_DEATHBOUND] && !(src->type == BL_MOB && is_boss(src)) ) {
+			if(sc->data[SC_DEATHBOUND] && skillid != WS_CARTTERMINATION && !(src->type == BL_MOB && is_boss(src)) ) {
 				int dir = map_calc_dir(bl,src->x,src->y),
 					t_dir = unit_getdir(bl), rd1 = 0;
 
@@ -3713,8 +3711,7 @@ int battle_calc_return_damage(struct block_list* bl, struct block_list *src, int
 			}
 		}
 	} else {
-		if (sd && sd->long_weapon_damage_return)
-		{
+		if (sd && sd->long_weapon_damage_return) {
 			rdamage += damage * sd->long_weapon_damage_return / 100;
 			if (rdamage < 1) rdamage = 1;
 		}
@@ -3966,7 +3963,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
 			skill_attack(skill_get_type(skillid), src, src, target, skillid, sc->data[SC_DUPLELIGHT]->val1, tick, SD_LEVEL);
 		}
 
-		rdamage = battle_calc_return_damage(target,src, &damage, wd.flag);
+		rdamage = battle_calc_return_damage(target,src, &damage, wd.flag, 0);
 		if( rdamage > 0 ) {
 			if( tsc && tsc->data[SC_REFLECTDAMAGE] ) {
 				if( src != target )// Don't reflect your own damage (Grand Cross)

+ 1 - 1
src/map/battle.h

@@ -35,7 +35,7 @@ struct block_list;
 
 struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int count);
 
-int battle_calc_return_damage(struct block_list *bl, struct block_list *src, int *, int flag);
+int battle_calc_return_damage(struct block_list *bl, struct block_list *src, int *, int flag, int skillid);
 
 void battle_drain(struct map_session_data *sd, struct block_list *tbl, int rdamage, int ldamage, int race, int boss);
 

+ 3 - 3
src/map/skill.c

@@ -2054,9 +2054,9 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 		skillid == MER_INCAGI || skillid == MER_BLESSING) && tsd->sc.data[SC_CHANGEUNDEAD] )
 		damage = 1;
 
-	if( damage > 0 && (( dmg.flag&BF_WEAPON && src != bl && ( src == dsrc || ( dsrc->type == BL_SKILL && ( skillid == SG_SUN_WARM || skillid == SG_MOON_WARM || skillid == SG_STAR_WARM ) ) )
-		&& skillid != WS_CARTTERMINATION) || (sc && sc->data[SC_REFLECTDAMAGE])) )
-		rdamage = battle_calc_return_damage(bl,src, &damage, dmg.flag);
+	if( damage > 0 && (( dmg.flag&BF_WEAPON && src != bl && ( src == dsrc || ( dsrc->type == BL_SKILL && ( skillid == SG_SUN_WARM || skillid == SG_MOON_WARM || skillid == SG_STAR_WARM ) ) ))
+			|| (sc && sc->data[SC_REFLECTDAMAGE])) )
+		rdamage = battle_calc_return_damage(bl,src, &damage, dmg.flag, skillid);
 
 	//Skill hit type
 	type=(skillid==0)?5:skill_get_hit(skillid);