Selaa lähdekoodia

Partial revert of ce7aacb
* Added job, skill, and item stat bonuses back into base status.
* Adjusted specific skills that used base stats to use info stored in mmo_charstatus.
* Fixes #713 - Resolved issue with atcommand 'speed' not adjusting player's movement speed.

aleos89 9 vuotta sitten
vanhempi
commit
ea497b2938
3 muutettua tiedostoa jossa 43 lisäystä ja 71 poistoa
  1. 2 4
      src/map/battle.c
  2. 3 6
      src/map/skill.c
  3. 38 61
      src/map/status.c

+ 2 - 4
src/map/battle.c

@@ -4014,10 +4014,8 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
 			break;
 		case GN_CART_TORNADO: { // ATK [( Skill Level x 50 ) + ( Cart Weight / ( 150 - Caster Base STR ))] + ( Cart Remodeling Skill Level x 50 )] %
 				skillratio += -100 + 50 * skill_lv;
-				if(sd && sd->cart_weight) {
-					int strbonus = status_get_base_status(src)->str; // Only use base STR
-					skillratio += sd->cart_weight / 10 / (150 - min(strbonus,120)) + pc_checkskill(sd,GN_REMODELING_CART) * 50;
-				}
+				if(sd && sd->cart_weight)
+					skillratio += sd->cart_weight / 10 / (150 - min(sd->status.str,120)) + pc_checkskill(sd,GN_REMODELING_CART) * 50;
 			}
 			break;
 		case GN_CARTCANNON:

+ 3 - 6
src/map/skill.c

@@ -9898,9 +9898,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		{
 			// Success chance: [(15 + 5 * Skill Level) + ( Caster's INT / 5 ) + ( Caster's Job Level / 5 ) - ( Target's INT / 6 ) - ( Target's LUK / 10 )] %
 			int rate = (15 + 5 * skill_lv) * 1000 + status_get_int(src) * 200 + (sd ? sd->status.job_level * 200 : 0) - status_get_int(bl) * 1000 / 6 - status_get_luk(bl) * 100;
-			struct status_data *bstatus = status_get_base_status(bl);
 			// Resistance: {(Target's Base Level / 20) + (Target's Base INT / 40)} seconds
-			int duration = skill_get_time(skill_id, skill_lv) - (status_get_lv(bl) * 50 + bstatus->int_ * 25);
+			int duration = skill_get_time(skill_id, skill_lv) - (status_get_lv(bl) * 50 + (sd ? sd->status.int_ : status_get_base_status(bl)->int_) * 25);
 			clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
 			status_change_start(src,bl,type,rate,skill_lv,0,0,0,max(duration,5000),SCSTART_NORATEDEF|SCSTART_NOTICKDEF); // Avoid general resistance
 		}
@@ -9908,12 +9907,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 
 	case WM_LULLABY_DEEPSLEEP:
 		if (flag&1) {
-			struct status_data *bstatus = status_get_base_status(bl);
 			// Resistance: {(Target's Base Level / 20) + (Target's Base INT / 20)} seconds
-			int duration = skill_area_temp[6] - (status_get_lv(bl) * 50 + bstatus->int_ * 50);
+			int duration = skill_area_temp[6] - (status_get_lv(bl) * 50 + (sd ? sd->status.int_ : status_get_base_status(bl)->int_) * 50);
 			status_change_start(src,bl,type,skill_area_temp[5],skill_lv,0,0,0,max(duration,5000),SCSTART_NORATEDEF|SCSTART_NOTICKDEF); // Avoid general resistance
-		}
-		else {
+		} else {
 			// Success chance: [(Skill Level x 4) + (Voice Lessons Skill Level x 2) + (Caster's Base Level / 15) + (Caster's Job Level / 5)] %
 			skill_area_temp[5] = (4 * skill_lv * 1000) + ((sd) ? pc_checkskill(sd,WM_LESSON) : skill_get_max(WM_LESSON)) * 2000 + (status_get_lv(src) * 1000 / 15) + (sd ? sd->status.job_level * 200 : 0);
 			skill_area_temp[6] = skill_get_time(skill_id,skill_lv);

+ 38 - 61
src/map/status.c

@@ -2955,7 +2955,6 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
 {
 	static int calculating = 0; ///< Check for recursive call preemption. [Skotlex]
 	struct status_data *base_status; ///< Pointer to the player's base status
-	short bStr = 0, bAgi = 0, bVit = 0, bInt_ = 0, bDex = 0, bLuk = 0; ///< Stat addition to the player's battle status
 	const struct status_change *sc = &sd->sc;
 	struct s_skill b_skill[MAX_SKILL]; ///< Previous skill tree
 	int b_weight, b_max_weight, b_cart_weight_max, ///< Previous weight
@@ -3363,62 +3362,54 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
 
 // ----- STATS CALCULATION -----
 
-	// Untouched Base Stats
-	base_status->str = sd->status.str;
-	base_status->agi = sd->status.agi;
-	base_status->vit = sd->status.vit;
-	base_status->int_ = sd->status.int_;
-	base_status->dex = sd->status.dex;
-	base_status->luk = sd->status.luk;
-
 	// Job bonuses
 	index = pc_class2idx(sd->status.class_);
 	for(i=0;i<(int)sd->status.job_level && i<MAX_LEVEL;i++) {
 		if(!job_info[index].job_bonus[i])
 			continue;
 		switch(job_info[index].job_bonus[i]) {
-			case 1: bStr++; break;
-			case 2: bAgi++; break;
-			case 3: bVit++; break;
-			case 4: bInt_++; break;
-			case 5: bDex++; break;
-			case 6: bLuk++; break;
+			case 1: base_status->str++; break;
+			case 2: base_status->agi++; break;
+			case 3: base_status->vit++; break;
+			case 4: base_status->int_++; break;
+			case 5: base_status->dex++; break;
+			case 6: base_status->luk++; break;
 		}
 	}
 
 	// If a Super Novice has never died and is at least joblv 70, he gets all stats +10
 	if(((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && (sd->status.job_level >= 70  || sd->class_&JOBL_THIRD)) && sd->die_counter == 0) {
-		bStr += 10;
-		bAgi += 10;
-		bVit += 10;
-		bInt_+= 10;
-		bDex += 10;
-		bLuk += 10;
+		base_status->str += 10;
+		base_status->agi += 10;
+		base_status->vit += 10;
+		base_status->int_+= 10;
+		base_status->dex += 10;
+		base_status->luk += 10;
 	}
 
 	// Absolute modifiers from passive skills
 	if(pc_checkskill(sd,BS_HILTBINDING)>0)
-		bStr++;
+		base_status->str++;
 	if((skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0)
-		bInt_ += (skill+1)/2; // +1 INT / 2 lv
+		base_status->int_ += (skill+1)/2; // +1 INT / 2 lv
 	if((skill=pc_checkskill(sd,AC_OWL))>0)
-		bDex += skill;
+		base_status->dex += skill;
 	if((skill = pc_checkskill(sd,RA_RESEARCHTRAP))>0)
-		bInt_ += skill;
-
-	// Bonuses from cards and equipment, remember to avoid overflows.
-	i = bStr + sd->param_bonus[0] + sd->param_equip[0];
-	bStr = cap_value(i,0,USHRT_MAX);
-	i = bAgi + sd->param_bonus[1] + sd->param_equip[1];
-	bAgi = cap_value(i,0,USHRT_MAX);
-	i = bVit + sd->param_bonus[2] + sd->param_equip[2];
-	bVit = cap_value(i,0,USHRT_MAX);
-	i = bInt_+ sd->param_bonus[3] + sd->param_equip[3];
-	bInt_ = cap_value(i,0,USHRT_MAX);
-	i = bDex + sd->param_bonus[4] + sd->param_equip[4];
-	bDex = cap_value(i,0,USHRT_MAX);
-	i = bLuk + sd->param_bonus[5] + sd->param_equip[5];
-	bLuk = cap_value(i,0,USHRT_MAX);
+		base_status->int_ += skill;
+
+	// Bonuses from cards and equipment as well as base stat, remember to avoid overflows.
+	i = base_status->str + sd->status.str + sd->param_bonus[0] + sd->param_equip[0];
+	base_status->str = cap_value(i,0,USHRT_MAX);
+	i = base_status->agi + sd->status.agi + sd->param_bonus[1] + sd->param_equip[1];
+	base_status->agi = cap_value(i,0,USHRT_MAX);
+	i = base_status->vit + sd->status.vit + sd->param_bonus[2] + sd->param_equip[2];
+	base_status->vit = cap_value(i,0,USHRT_MAX);
+	i = base_status->int_+ sd->status.int_+ sd->param_bonus[3] + sd->param_equip[3];
+	base_status->int_ = cap_value(i,0,USHRT_MAX);
+	i = base_status->dex + sd->status.dex + sd->param_bonus[4] + sd->param_equip[4];
+	base_status->dex = cap_value(i,0,USHRT_MAX);
+	i = base_status->luk + sd->status.luk + sd->param_bonus[5] + sd->param_equip[5];
+	base_status->luk = cap_value(i,0,USHRT_MAX);
 
 // ------ ATTACK CALCULATION ------
 
@@ -3772,14 +3763,6 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
 	}
 	status_cpy(&sd->battle_status, base_status);
 
-	// Add to Battle Stats after copy
-	sd->battle_status.str += bStr;
-	sd->battle_status.agi += bAgi;
-	sd->battle_status.vit += bVit;
-	sd->battle_status.int_ += bInt_;
-	sd->battle_status.dex += bDex;
-	sd->battle_status.luk += bLuk;
-
 // ----- CLIENT-SIDE REFRESH -----
 	if(!sd->bl.prev) {
 		// Will update on LoadEndAck
@@ -4296,17 +4279,12 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, enum sc
  */
 void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
 {
-	const struct status_data *b_status;
-	struct status_data *status = status_get_status_data(bl);
+	const struct status_data *b_status = status_get_base_status(bl); // Base Status
+	struct status_data *status = status_get_status_data(bl); // Battle Status
 	struct status_change *sc = status_get_sc(bl);
 	TBL_PC *sd = BL_CAST(BL_PC,bl);
 	int temp;
 
-	if (bl->type == BL_PC)
-		b_status = &sd->battle_status;
-	else
-		b_status = status_get_base_status(bl);
-
 	if (!b_status || !status)
 		return;
 
@@ -7321,7 +7299,7 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
 	///				2500ms -> tick_def2=2000 -> 500ms
 	int sc_def2 = 0, tick_def2 = 0;
 
-	struct status_data *status, *status_src, *b_status;
+	struct status_data *status, *status_src;
 	struct status_change *sc;
 	struct map_session_data *sd;
 
@@ -7368,7 +7346,6 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
 	sd = BL_CAST(BL_PC,bl);
 	status = status_get_status_data(bl);
 	status_src = status_get_status_data(src);
-	b_status = status_get_base_status(bl);
 	sc = status_get_sc(bl);
 	if( sc && !sc->count )
 		sc = NULL;
@@ -7465,9 +7442,9 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
 			sc_def = status->agi*50;
 			break;
 		case SC_DEEPSLEEP:
-			sc_def = b_status->int_*50;
+			sc_def = (sd ? sd->status.int_ : status_get_base_status(bl)->int_) * 50;
 			tick_def = 0; // Linear reduction instead
-			tick_def2 = (b_status->int_ + status_get_lv(bl))*50; // kRO balance update lists this formula
+			tick_def2 = ((sd ? sd->status.int_ : status_get_base_status(bl)->int_) + status_get_lv(bl)) * 50; // kRO balance update lists this formula
 			break;
 		case SC_NETHERWORLD:
 			// Resistance: {(Target's Base Level / 50) + (Target's Job Level / 10)} seconds
@@ -7506,10 +7483,10 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
 			tick_def2 = (status->vit + status->agi) * 70;
 			break;
 		case SC_CRYSTALIZE:
-			tick_def2 = b_status->vit*100;
+			tick_def2 = (sd ? sd->status.vit : status_get_base_status(bl)->vit) * 100;
 			break;
 		case SC_VACUUM_EXTREME:
-			tick_def2 = b_status->str*50;
+			tick_def2 = (sd ? sd->status.str : status_get_base_status(bl)->str) * 50;
 			break;
 		case SC_KYOUGAKU:
 			tick_def2 = 30*status->int_;
@@ -7522,7 +7499,7 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
 			tick_def2 = status_get_lv(bl) * 100 + (sd ? sd->status.job_level : 1) * 200;
 			break;
 		case SC_B_TRAP:
-			tick_def = b_status->str * 50; // (custom)
+			tick_def = (sd ? sd->status.str : status_get_base_status(bl)->str) * 50; // (custom)
 			break;
 		default:
 			// Effect that cannot be reduced? Likely a buff.