Browse Source

Apply MHP limit based on bLv (#3003)

* Fixes #814.
* Applies the official maximum HP limit on players.
* Official notice: http://ro.gnjoy.com/news/notice/View.asp?BBSMode=10001&seq=6322
* Levels caps are as follows: Lv 99 = 330k; Lv 150 = 660k; Lv 175 = 1.1m
Thanks to @flamefury!
flamefury 7 years ago
parent
commit
7f2c6cf2f5
5 changed files with 30 additions and 6 deletions
  1. 7 2
      conf/battle/player.conf
  2. 3 1
      src/map/battle.cpp
  3. 2 0
      src/map/battle.hpp
  4. 6 1
      src/map/pc.cpp
  5. 12 2
      src/map/status.cpp

+ 7 - 2
conf/battle/player.conf

@@ -75,8 +75,13 @@ max_extended_aspd: 193
 // Maximum walk speed rate (200 would be capped to twice the normal speed)
 max_walk_speed: 300
 
-// Maximum HP. (Default is 1000000)
-max_hp: 1000000
+// Maximum HPs depending on base level. Default values are:
+// Lv 99:  330000
+// Lv150:  660000
+// Lv175: 1100000
+max_hp_lv99: 330000
+max_hp_lv150: 660000
+max_hp: 1100000
 
 // Maximum SP. (Default is 1000000)
 max_sp: 1000000

+ 3 - 1
src/map/battle.cpp

@@ -8133,7 +8133,9 @@ static const struct _battle_data {
 	{ "max_walk_speed",                     &battle_config.max_walk_speed,                  300,    100,    100*DEFAULT_WALK_SPEED, },
 	{ "max_lv",                             &battle_config.max_lv,                          99,     0,      MAX_LEVEL,      },
 	{ "aura_lv",                            &battle_config.aura_lv,                         99,     0,      INT_MAX,        },
-	{ "max_hp",                             &battle_config.max_hp,                          32500,  100,    1000000000,     },
+	{ "max_hp_lv99",                        &battle_config.max_hp_lv99,                    330000,  100,    1000000000,     },
+	{ "max_hp_lv150",                       &battle_config.max_hp_lv150,                   660000,  100,    1000000000,     },
+	{ "max_hp",                             &battle_config.max_hp,                        1100000,  100,    1000000000,     },
 	{ "max_sp",                             &battle_config.max_sp,                          32500,  100,    1000000000,     },
 	{ "max_cart_weight",                    &battle_config.max_cart_weight,                 8000,   100,    1000000,        },
 	{ "max_parameter",                      &battle_config.max_parameter,                   99,     10,     SHRT_MAX,       },

+ 2 - 0
src/map/battle.hpp

@@ -265,6 +265,8 @@ struct Battle_Config
 	int arrow_decrement;
 	int max_aspd;
 	int max_walk_speed;	//Maximum walking speed after buffs [Skotlex]
+	int max_hp_lv99;
+	int max_hp_lv150;
 	int max_hp;
 	int max_sp;
 	int max_lv, aura_lv;

+ 6 - 1
src/map/pc.cpp

@@ -8249,7 +8249,12 @@ bool pc_setparam(struct map_session_data *sd,int type,int val)
 		sd->battle_status.hp = cap_value(val, 1, (int)sd->battle_status.max_hp);
 		break;
 	case SP_MAXHP:
-		sd->battle_status.max_hp = cap_value(val, 1, battle_config.max_hp);
+		if (sd->status.base_level < 100)
+			sd->battle_status.max_hp = cap_value(val, 1, battle_config.max_hp_lv99);
+		else if (sd->status.base_level < 151)
+			sd->battle_status.max_hp = cap_value(val, 1, battle_config.max_hp_lv150);
+		else
+			sd->battle_status.max_hp = cap_value(val, 1, battle_config.max_hp);
 
 		if( sd->battle_status.max_hp < sd->battle_status.hp )
 		{

+ 12 - 2
src/map/status.cpp

@@ -3835,7 +3835,12 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
 	if(battle_config.hp_rate != 100)
 		base_status->max_hp = (unsigned int)(battle_config.hp_rate * (base_status->max_hp/100.));
 
-	base_status->max_hp = cap_value(base_status->max_hp,1,(unsigned int)battle_config.max_hp);
+	if (sd->status.base_level < 100)
+		base_status->max_hp = cap_value(base_status->max_hp,1,(unsigned int)battle_config.max_hp_lv99);
+	else if (sd->status.base_level < 151)
+		base_status->max_hp = cap_value(base_status->max_hp,1,(unsigned int)battle_config.max_hp_lv150);
+	else
+		base_status->max_hp = cap_value(base_status->max_hp,1,(unsigned int)battle_config.max_hp);
 
 // ----- SP MAX CALCULATION -----
 	base_status->max_sp = sd->status.max_sp = status_calc_maxhpsp_pc(sd,base_status->int_,false);
@@ -4993,7 +4998,12 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
 			if(battle_config.hp_rate != 100)
 				status->max_hp = (unsigned int)(battle_config.hp_rate * (status->max_hp/100.));
 
-			status->max_hp = umin(status->max_hp,(unsigned int)battle_config.max_hp);
+			if (sd->status.base_level < 100)
+				status->max_hp = umin(status->max_hp,(unsigned int)battle_config.max_hp_lv99);
+			else if (sd->status.base_level < 151)
+				status->max_hp = umin(status->max_hp,(unsigned int)battle_config.max_hp_lv150);
+			else
+				status->max_hp = umin(status->max_hp,(unsigned int)battle_config.max_hp);
 		}
 		else
 			status->max_hp = status_calc_maxhp(bl, b_status->max_hp);