浏览代码

Death penalty

Fixed death penalty overflow.
Fixes: http://rathena.org/board/tracker/issue-8522-experience-loss/
Lemongrass3110 11 年之前
父节点
当前提交
b3d622f823
共有 1 个文件被更改,包括 19 次插入13 次删除
  1. 19 13
      src/map/pc.c

+ 19 - 13
src/map/pc.c

@@ -7009,21 +7009,25 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
 		&& !map[sd->bl.m].flag.noexppenalty && !map_flag_gvg(sd->bl.m)
 		&& !sd->sc.data[SC_BABY] && !sd->sc.data[SC_LIFEINSURANCE])
 	{
-		unsigned int base_penalty = battle_config.death_penalty_base, job_penalty = battle_config.death_penalty_job;
+		uint32 base_penalty = battle_config.death_penalty_base;
+		uint32 job_penalty = battle_config.death_penalty_job;
+		uint32 zeny_penalty = battle_config.zeny_penalty;
+
 #ifdef VIP_ENABLE
 		if(pc_isvip(sd)){
-			base_penalty = base_penalty*battle_config.vip_exp_penalty_base;
-			job_penalty = job_penalty*battle_config.vip_exp_penalty_job;
+			base_penalty *= battle_config.vip_exp_penalty_base;
+			job_penalty *= battle_config.vip_exp_penalty_job;
 		}
 		else {
-			base_penalty = base_penalty*battle_config.vip_exp_penalty_base_normal;
-			job_penalty = job_penalty*battle_config.vip_exp_penalty_job_normal;
+			base_penalty *= battle_config.vip_exp_penalty_base_normal;
+			job_penalty *= battle_config.vip_exp_penalty_job_normal;
 		}
 #endif
+
 		if (base_penalty > 0) {
 			switch (battle_config.death_penalty_type) {
-				case 1: base_penalty = (uint32) ((double)(pc_nextbaseexp(sd) * base_penalty)/10000); break;
-				case 2: base_penalty = (uint32) ((double)(sd->status.base_exp * base_penalty)/10000); break;
+				case 1: base_penalty = (uint32) ( pc_nextbaseexp(sd) * ( base_penalty / 10000. ) ); break;
+				case 2: base_penalty = (uint32) ( sd->status.base_exp * ( base_penalty / 10000. ) ); break;
 			}
 			if (base_penalty > 0){ //recheck after altering to speedup
 				if (battle_config.pk_mode && src && src->type==BL_PC)
@@ -7032,10 +7036,11 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
 				clif_updatestatus(sd,SP_BASEEXP);
 			}
 		}
+
 		if(job_penalty > 0) {
 			switch (battle_config.death_penalty_type) {
-				case 1: job_penalty = (uint32) ((double)(pc_nextjobexp(sd) * job_penalty)/10000); break;
-				case 2: job_penalty = (uint32) ((double)(sd->status.job_exp * job_penalty)/10000); break;
+				case 1: job_penalty = (uint32) ( pc_nextjobexp(sd) * ( job_penalty / 10000. ) ); break;
+				case 2: job_penalty = (uint32) ( sd->status.job_exp * ( job_penalty /10000. ) ); break;
 			}
 			if(job_penalty) {
 				if (battle_config.pk_mode && src && src->type==BL_PC)
@@ -7044,10 +7049,11 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
 				clif_updatestatus(sd,SP_JOBEXP);
 			}
 		}
-		if(battle_config.zeny_penalty > 0 && !map[sd->bl.m].flag.nozenypenalty) {
-			base_penalty = (unsigned int)((double)sd->status.zeny * (double)battle_config.zeny_penalty / 10000.);
-			if(base_penalty)
-				pc_payzeny(sd, base_penalty, LOG_TYPE_PICKDROP_PLAYER, NULL);
+
+		if( zeny_penalty > 0 && !map[sd->bl.m].flag.nozenypenalty) {
+			zeny_penalty = (uint32)( sd->status.zeny * ( zeny_penalty / 10000. ) );
+			if(zeny_penalty)
+				pc_payzeny(sd, zeny_penalty, LOG_TYPE_PICKDROP_PLAYER, NULL);
 		}
 	}