Browse Source

- 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
Zido 19 years ago
parent
commit
52ccb9e0b8
2 changed files with 45 additions and 22 deletions
  1. 1 0
      Changelog-Trunk.txt
  2. 44 22
      src/map/pc.c

+ 1 - 0
Changelog-Trunk.txt

@@ -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

+ 44 - 22
src/map/pc.c

@@ -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)
-			status->rhw.atk+=val;
-		else if(sd->state.lr_flag == 1)
-			status->lhw->atk+=val;
+		if(!sd->state.lr_flag) {
+			if(!(val<0 && ((val-val-val)>status->rhw.atk)))
+				status->rhw.atk+=val;
+		}
+		else if(sd->state.lr_flag == 1) {
+			if(!(val<0 && ((val-val-val)>status->lhw.atk)))
+				status->lhw->atk+=val;
+		}
 		break;
 		break;
 	case SP_ATK2:
 	case SP_ATK2:
-		if(!sd->state.lr_flag)
-			status->rhw.atk2+=val;
-		else if(sd->state.lr_flag == 1)
-			status->lhw->atk2+=val;
+		if(!sd->state.lr_flag) {
+			if(!(val<0 && ((val-val-val)>status->rhw.atk2)))
+				status->rhw.atk2+=val;
+		}
+		else if(sd->state.lr_flag == 1) {
+			if(!(val<0 && ((val-val-val)>status->lhw.atk2)))
+				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,41 +1292,55 @@ 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)
-			status->matk_max += val;
+		if(sd->state.lr_flag != 2) {
+			if(!(val<0 && ((val-val-val)>status->matk_max)))
+				status->matk_max += val;
+		}
 		break;
 		break;
 	case SP_MATK2:
 	case SP_MATK2:
-		if(sd->state.lr_flag != 2)
-			status->matk_min += val;
+		if(sd->state.lr_flag != 2) {
+			if(!(val<0 && ((val-val-val)>status->matk_min)))
+				status->matk_min += val;
+		}
 		break;
 		break;
 	case SP_MATK:
 	case SP_MATK:
 		if(sd->state.lr_flag != 2) {
 		if(sd->state.lr_flag != 2) {
-			status->matk_max += val;
-			status->matk_min += val;
+			if(!(val<0 && ((val-val-val)>status->matk_max)))
+				status->matk_max += val;
+			if(!(val<0 && ((val-val-val)>status->matk_min)))
+				status->matk_min += val;
 		}
 		}
 		break;
 		break;
 	case SP_DEF1:
 	case SP_DEF1:
 		if(sd->state.lr_flag != 2) {
 		if(sd->state.lr_flag != 2) {
-			bonus = status->def + val;
-			status->def = cap_value(bonus, CHAR_MIN, CHAR_MAX);
+			if(!(val<0 && ((val-val-val)>status->def))) {
+				bonus = status->def + val;
+				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) {
-			bonus = status->def2 + val;
-			status->def2 = cap_value(bonus, SHRT_MIN, SHRT_MAX);
+			if(!(val<0 && ((val-val-val)>status->def2))) {
+				bonus = status->def2 + val;
+				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) {
-			bonus = status->mdef + val;
-			status->mdef = cap_value(bonus, CHAR_MIN, CHAR_MAX);
+			if(!(val<0 && ((val-val-val)>status->matk_mdef))) {
+				bonus = status->mdef + val;
+				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) {
-			bonus = status->mdef2 + val;
-			status->mdef2 = cap_value(bonus, SHRT_MIN, SHRT_MAX);
+			if(!(val<0 && ((val-val-val)>status->matk_mdef2))) {
+				bonus = status->mdef2 + val;
+				status->mdef2 = cap_value(bonus, SHRT_MIN, SHRT_MAX);
+			}
 		}
 		}
 		break;
 		break;
 	case SP_HIT:
 	case SP_HIT: