Death penalty

Fixed death penalty overflow.
Fixes: http://rathena.org/board/tracker/issue-8522-experience-loss/
This commit is contained in:
Lemongrass3110 2014-01-22 22:42:47 +01:00
parent e3372f2d5d
commit b3d622f823

View File

@ -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);
}
}