浏览代码

Partial(?) fix to damage reduction from cards - Concerning bugreport:7809
Moved pc_dead NPC event calls to the end of the death process - Fixes bugreport:7829
Super Novices are no longer counted as dead when saved by their angel - Fixes bugreport:4053 and bugreport:1601
- They won't lose their +10 bonus on the first death
- Pet intimacy, mercenaries, skull drops are unaffected by first death
- Steel Body is level 5 when saved

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@17420 54d463be-8e91-2dee-dedb-b68131a5f0ec

akinari1087 12 年之前
父节点
当前提交
43688de318
共有 3 个文件被更改,包括 34 次插入35 次删除
  1. 2 8
      src/map/battle.c
  2. 19 27
      src/map/pc.c
  3. 13 0
      src/map/status.c

+ 2 - 8
src/map/battle.c

@@ -4396,14 +4396,8 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
 #endif
 #endif
 	}
 	}
 
 
-#ifdef RENEWAL
-	if(!sd) {
-#endif
-		if(tsd) // Card Fix for target (tsd), 2 is not added to the "left" flag meaning "target cards only" 
-			wd.damage += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), right_element, left_element, wd.damage, is_attack_left_handed(src, skill_id), wd.flag);
-#ifdef RENEWAL
-	}
-#endif
+	if(tsd) // Card Fix for target (tsd), 2 is not added to the "left" flag meaning "target cards only" 
+		wd.damage += battle_calc_cardfix(BF_WEAPON, src, target, battle_skill_get_damage_properties(skill_id, wd.miscflag), right_element, left_element, wd.damage, is_attack_left_handed(src, skill_id), wd.flag);
 
 
 	// forced to neutral skills [helvetica]
 	// forced to neutral skills [helvetica]
 	// skills forced to neutral gain benefits from weapon element
 	// skills forced to neutral gain benefits from weapon element

+ 19 - 27
src/map/pc.c

@@ -6666,6 +6666,25 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
 	int i=0,j=0,k=0;
 	int i=0,j=0,k=0;
 	unsigned int tick = gettick();
 	unsigned int tick = gettick();
 
 
+	// Activate Steel body if a super novice dies at 99+% exp [celest]
+	// Super Novices have no kill or die functions attached when saved by their angel
+	if ((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && !sd->state.snovice_dead_flag) {
+		unsigned int next = pc_nextbaseexp(sd);
+		if( next == 0 ) next = pc_thisbaseexp(sd);
+		if( get_percentage(sd->status.base_exp,next) >= 99 ) {
+			sd->state.snovice_dead_flag = 1;
+			pc_setrestartvalue(sd,1);
+			status_percent_heal(&sd->bl, 100, 100);
+			clif_resurrection(&sd->bl, 1);
+			if(battle_config.pc_invincible_time)
+				pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
+			sc_start(&sd->bl,&sd->bl,status_skill2sc(MO_STEELBODY),100,5,skill_get_time(MO_STEELBODY,5));
+			if(map_flag_gvg(sd->bl.m))
+				pc_respawn_timer(INVALID_TIMER, gettick(), sd->bl.id, 0);
+			return 0;
+		}
+	}
+
 	for(k = 0; k < 5; k++)
 	for(k = 0; k < 5; k++)
 		if (sd->devotion[k]){
 		if (sd->devotion[k]){
 			struct map_session_data *devsd = map_id2sd(sd->devotion[k]);
 			struct map_session_data *devsd = map_id2sd(sd->devotion[k]);
@@ -6721,14 +6740,6 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
 	pc_setglobalreg(sd,"PC_DIE_COUNTER",sd->die_counter+1);
 	pc_setglobalreg(sd,"PC_DIE_COUNTER",sd->die_counter+1);
 	pc_setparam(sd, SP_KILLERRID, src?src->id:0);
 	pc_setparam(sd, SP_KILLERRID, src?src->id:0);
 
 
-	if( sd->bg_id ) {
-		struct battleground_data *bg;
-		if( (bg = bg_team_search(sd->bg_id)) != NULL && bg->die_event[0] )
-			npc_event(sd, bg->die_event, 0);
-	}
-
-	npc_script_event(sd,NPCE_DIE);
-
 	//Reset menu skills/item skills
 	//Reset menu skills/item skills
 	if (sd->skillitem)
 	if (sd->skillitem)
 		sd->skillitem = sd->skillitemlv = 0;
 		sd->skillitem = sd->skillitemlv = 0;
@@ -6823,25 +6834,6 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
 		map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0);
 		map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0);
 	}
 	}
 
 
-	// activate Steel body if a super novice dies at 99+% exp [celest]
-	if ((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && !sd->state.snovice_dead_flag) {
-		unsigned int next = pc_nextbaseexp(sd);
-		if( next == 0 ) next = pc_thisbaseexp(sd);
-		if( get_percentage(sd->status.base_exp,next) >= 99 ) {
-			sd->state.snovice_dead_flag = 1;
-			pc_setstand(sd);
-			pc_setrestartvalue(sd,1);
-			status_percent_heal(&sd->bl, 100, 100);
-			clif_resurrection(&sd->bl, 1);
-			if(battle_config.pc_invincible_time)
-				pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
-			sc_start(&sd->bl,&sd->bl,status_skill2sc(MO_STEELBODY),100,1,skill_get_time(MO_STEELBODY,1));
-			if(map_flag_gvg(sd->bl.m))
-				pc_respawn_timer(INVALID_TIMER, gettick(), sd->bl.id, 0);
-			return 0;
-		}
-	}
-
 	// changed penalty options, added death by player if pk_mode [Valaris]
 	// changed penalty options, added death by player if pk_mode [Valaris]
 	if(battle_config.death_penalty_type
 	if(battle_config.death_penalty_type
 		&& (sd->class_&MAPID_UPPERMASK) != MAPID_NOVICE	// only novices will receive no penalty
 		&& (sd->class_&MAPID_UPPERMASK) != MAPID_NOVICE	// only novices will receive no penalty

+ 13 - 0
src/map/status.c

@@ -22,6 +22,7 @@
 #include "skill.h"
 #include "skill.h"
 #include "itemdb.h"
 #include "itemdb.h"
 #include "battle.h"
 #include "battle.h"
+#include "battleground.h"
 #include "chrif.h"
 #include "chrif.h"
 #include "skill.h"
 #include "skill.h"
 #include "status.h"
 #include "status.h"
@@ -1338,6 +1339,18 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s
 		skill_cleartimerskill(target);
 		skill_cleartimerskill(target);
 	}
 	}
 
 
+	// Always run NPC scripts for players last
+	if(target->type == BL_PC) {
+		TBL_PC *sd = BL_CAST(BL_PC,target);
+		if( sd->bg_id ) {
+			struct battleground_data *bg;
+			if( (bg = bg_team_search(sd->bg_id)) != NULL && bg->die_event[0] )
+				npc_event(sd, bg->die_event, 0);
+		}
+
+		npc_script_event(sd,NPCE_DIE);
+	}
+
 	return hp+sp;
 	return hp+sp;
 }
 }