- Added negative value in bonus exploit fix for more stat bonuses

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@7648 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
Zido 2006-07-12 23:09:55 +00:00
parent efe9c7901d
commit 52ccb9e0b8
2 changed files with 45 additions and 22 deletions

View File

@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2006/07/12 2006/07/12
* Added negative value in bonus exploit fix for more stat bonuses [Zido]
* Fixed exploit in pc_bonus there are no checks that check that the value being * Fixed exploit in pc_bonus there are no checks that check that the value being
added onto a status don't make it go below zero, which means if you have a mineral added onto a status don't make it go below zero, which means if you have a mineral
card and reset stats it reduces your base attack to lower than zero, making it card and reset stats it reduces your base attack to lower than zero, making it

View File

@ -1266,16 +1266,24 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
sd->param_bonus[type-SP_STR]+=val; sd->param_bonus[type-SP_STR]+=val;
break; break;
case SP_ATK1: case SP_ATK1:
if(!sd->state.lr_flag) if(!sd->state.lr_flag) {
if(!(val<0 && ((val-val-val)>status->rhw.atk)))
status->rhw.atk+=val; status->rhw.atk+=val;
else if(sd->state.lr_flag == 1) }
else if(sd->state.lr_flag == 1) {
if(!(val<0 && ((val-val-val)>status->lhw.atk)))
status->lhw->atk+=val; status->lhw->atk+=val;
}
break; break;
case SP_ATK2: case SP_ATK2:
if(!sd->state.lr_flag) if(!sd->state.lr_flag) {
if(!(val<0 && ((val-val-val)>status->rhw.atk2)))
status->rhw.atk2+=val; status->rhw.atk2+=val;
else if(sd->state.lr_flag == 1) }
else if(sd->state.lr_flag == 1) {
if(!(val<0 && ((val-val-val)>status->lhw.atk2)))
status->lhw->atk2+=val; status->lhw->atk2+=val;
}
break; break;
case SP_BASE_ATK: case SP_BASE_ATK:
if(sd->state.lr_flag != 2) { if(sd->state.lr_flag != 2) {
@ -1284,42 +1292,56 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
} }
break; break;
case SP_MATK1: case SP_MATK1:
if(sd->state.lr_flag != 2) if(sd->state.lr_flag != 2) {
if(!(val<0 && ((val-val-val)>status->matk_max)))
status->matk_max += val; status->matk_max += val;
}
break; break;
case SP_MATK2: case SP_MATK2:
if(sd->state.lr_flag != 2) if(sd->state.lr_flag != 2) {
if(!(val<0 && ((val-val-val)>status->matk_min)))
status->matk_min += val; status->matk_min += val;
}
break; break;
case SP_MATK: case SP_MATK:
if(sd->state.lr_flag != 2) { if(sd->state.lr_flag != 2) {
if(!(val<0 && ((val-val-val)>status->matk_max)))
status->matk_max += val; status->matk_max += val;
if(!(val<0 && ((val-val-val)>status->matk_min)))
status->matk_min += val; status->matk_min += val;
} }
break; break;
case SP_DEF1: case SP_DEF1:
if(sd->state.lr_flag != 2) { if(sd->state.lr_flag != 2) {
if(!(val<0 && ((val-val-val)>status->def))) {
bonus = status->def + val; bonus = status->def + val;
status->def = cap_value(bonus, CHAR_MIN, CHAR_MAX); status->def = cap_value(bonus, CHAR_MIN, CHAR_MAX);
} }
}
break; break;
case SP_DEF2: case SP_DEF2:
if(sd->state.lr_flag != 2) { if(sd->state.lr_flag != 2) {
if(!(val<0 && ((val-val-val)>status->def2))) {
bonus = status->def2 + val; bonus = status->def2 + val;
status->def2 = cap_value(bonus, SHRT_MIN, SHRT_MAX); status->def2 = cap_value(bonus, SHRT_MIN, SHRT_MAX);
} }
}
break; break;
case SP_MDEF1: case SP_MDEF1:
if(sd->state.lr_flag != 2) { if(sd->state.lr_flag != 2) {
if(!(val<0 && ((val-val-val)>status->matk_mdef))) {
bonus = status->mdef + val; bonus = status->mdef + val;
status->mdef = cap_value(bonus, CHAR_MIN, CHAR_MAX); status->mdef = cap_value(bonus, CHAR_MIN, CHAR_MAX);
} }
}
break; break;
case SP_MDEF2: case SP_MDEF2:
if(sd->state.lr_flag != 2) { if(sd->state.lr_flag != 2) {
if(!(val<0 && ((val-val-val)>status->matk_mdef2))) {
bonus = status->mdef2 + val; bonus = status->mdef2 + val;
status->mdef2 = cap_value(bonus, SHRT_MIN, SHRT_MAX); status->mdef2 = cap_value(bonus, SHRT_MIN, SHRT_MAX);
} }
}
break; break;
case SP_HIT: case SP_HIT:
if(sd->state.lr_flag != 2) { if(sd->state.lr_flag != 2) {