Kaynağa Gözat

- Fixed the value range checks added by Zido on pc_bonus (some of them were even redundant...)
- Fixed script command "recovery".


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

skotlex 19 yıl önce
ebeveyn
işleme
6ec9580e34
3 değiştirilmiş dosya ile 34 ekleme ve 46 silme
  1. 2 0
      Changelog-Trunk.txt
  2. 28 38
      src/map/pc.c
  3. 4 8
      src/map/script.c

+ 2 - 0
Changelog-Trunk.txt

@@ -3,6 +3,8 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2006/07/13
+	* Fixed script command "recovery". [Skotlex]
 2006/07/12
 	* Fixed a small typo in my code [Zido]
 	* Added negative value in bonus exploit fix for more stat bonuses [Zido]

+ 28 - 38
src/map/pc.c

@@ -1267,80 +1267,72 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 		break;
 	case SP_ATK1:
 		if(!sd->state.lr_flag) {
-			if(!(val<0 && ((val-val-val)>status->rhw.atk)))
-				status->rhw.atk+=val;
+			bonus = status->rhw.atk + val;
+			status->rhw.atk = cap_value(bonus, 0, USHRT_MAX);
 		}
 		else if(sd->state.lr_flag == 1) {
-			if(!(val<0 && ((val-val-val)>status->lhw->atk)))
-				status->lhw->atk+=val;
+			bonus = status->lhw->atk + val;
+			status->lhw->atk =  cap_value(bonus, 0, USHRT_MAX);
 		}
 		break;
 	case SP_ATK2:
 		if(!sd->state.lr_flag) {
-			if(!(val<0 && ((val-val-val)>status->rhw.atk2)))
-				status->rhw.atk2+=val;
+			bonus = status->rhw.atk2 + val;
+			status->rhw.atk2 = cap_value(bonus, 0, USHRT_MAX);
 		}
 		else if(sd->state.lr_flag == 1) {
-			if(!(val<0 && ((val-val-val)>status->lhw->atk2)))
-				status->lhw->atk2+=val;
+			bonus = status->lhw->atk2 + val;
+			status->lhw->atk2 =  cap_value(bonus, 0, USHRT_MAX);
 		}
 		break;
 	case SP_BASE_ATK:
 		if(sd->state.lr_flag != 2) {
-			if(!(val<0 && ((val-val-val)>status->batk)))
-				status->batk+=val;
+			bonus = status->batk + val;
+			status->batk = cap_value(bonus, 0, USHRT_MAX);
 		}
 		break;
 	case SP_MATK1:
 		if(sd->state.lr_flag != 2) {
-			if(!(val<0 && ((val-val-val)>status->matk_max)))
-				status->matk_max += val;
+			bonus = status->matk_max + val;
+			status->matk_max = cap_value(bonus, 0, USHRT_MAX);
 		}
 		break;
 	case SP_MATK2:
 		if(sd->state.lr_flag != 2) {
-			if(!(val<0 && ((val-val-val)>status->matk_min)))
-				status->matk_min += val;
+			bonus = status->matk_min + val;
+			status->matk_min = cap_value(bonus, 0, USHRT_MAX);
 		}
 		break;
 	case SP_MATK:
 		if(sd->state.lr_flag != 2) {
-			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;
+			bonus = status->matk_max + val;
+			status->matk_max = cap_value(bonus, 0, USHRT_MAX);
+			bonus = status->matk_min + val;
+			status->matk_min = cap_value(bonus, 0, USHRT_MAX);
 		}
 		break;
 	case SP_DEF1:
 		if(sd->state.lr_flag != 2) {
-			if(!(val<0 && ((val-val-val)>status->def))) {
-				bonus = status->def + val;
-				status->def = cap_value(bonus, CHAR_MIN, CHAR_MAX);
-			}
+			bonus = status->def + val;
+			status->def = cap_value(bonus, CHAR_MIN, CHAR_MAX);
 		}
 		break;
 	case SP_DEF2:
 		if(sd->state.lr_flag != 2) {
-			if(!(val<0 && ((val-val-val)>status->def2))) {
-				bonus = status->def2 + val;
-				status->def2 = cap_value(bonus, SHRT_MIN, SHRT_MAX);
-			}
+			bonus = status->def2 + val;
+			status->def2 = cap_value(bonus, SHRT_MIN, SHRT_MAX);
 		}
 		break;
 	case SP_MDEF1:
 		if(sd->state.lr_flag != 2) {
-			if(!(val<0 && ((val-val-val)>status->mdef))) {
-				bonus = status->mdef + val;
-				status->mdef = cap_value(bonus, CHAR_MIN, CHAR_MAX);
-			}
+			bonus = status->mdef + val;
+			status->mdef = cap_value(bonus, CHAR_MIN, CHAR_MAX);
 		}
 		break;
 	case SP_MDEF2:
 		if(sd->state.lr_flag != 2) {
-			if(!(val<0 && ((val-val-val)>status->mdef2))) {
-				bonus = status->mdef2 + val;
-				status->mdef2 = cap_value(bonus, SHRT_MIN, SHRT_MAX);
-			}
+			bonus = status->mdef2 + val;
+			status->mdef2 = cap_value(bonus, SHRT_MIN, SHRT_MAX);
 		}
 		break;
 	case SP_HIT:
@@ -1692,14 +1684,12 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 		}
 		break;
 	case SP_PERFECT_HIDE: // [Valaris]
-		if(sd->state.lr_flag!=2) {
+		if(sd->state.lr_flag!=2)
 			sd->state.perfect_hiding=1;
-		}
 		break;
 	case SP_UNBREAKABLE:
-		if(sd->state.lr_flag!=2) {
+		if(sd->state.lr_flag!=2)
 			sd->unbreakable += val;
-		}
 		break;
 	case SP_UNBREAKABLE_WEAPON:
 		if(sd->state.lr_flag != 2)

+ 4 - 8
src/map/script.c

@@ -8815,14 +8815,10 @@ int buildin_recovery(struct script_state *st)
 	for (i = 0; i < users; i++)
 	{
 		sd = all_sd[i];
-		sd->status.hp = sd->status.max_hp;
-		sd->status.sp = sd->status.max_sp;
-		clif_updatestatus(sd, SP_HP);
-		clif_updatestatus(sd, SP_SP);
-		if(pc_isdead(sd)){
-			pc_setstand(sd);
-			clif_resurrection(&sd->bl, 1);
-		}
+		if(pc_isdead(sd))
+			status_revive(&sd->bl, 100, 100);
+		else
+			status_percent_heal(&sd->bl, 100, 100);
 		clif_displaymessage(sd->fd,"You have been recovered!");
 	}
 	return 0;