Removal of OnPCStatCalcEvent (#4831)

* Fixes #4812.
* This script event can be replaced with the other various player script events.
* The trigger during equipment changing causes headache across other calculation events in source.
This commit is contained in:
Aleos 2020-04-23 16:53:07 -04:00 committed by GitHub
parent 4a3dac6c93
commit b65443d8f5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 17 additions and 80 deletions

View File

@ -958,13 +958,6 @@ mapflag for it to work is because, otherwise, it'd be server-wide and trigger
every time a player would change maps. Imagine the server load with 1,000 players
(oh the pain...)
OnPCStatCalcEvent:
This special label triggers when a player's stats are recalculated, such as when
changing stats, equipment, or maps, as well as when logging in, leveling up, and
mounting a job mount. This can be used to grant additional item bonuses to certain
player groups, for instance.
OnWhisperGlobal:
This special label triggers when a player whispers the NPC, and will run with the

View File

@ -4599,8 +4599,6 @@ const char *npc_get_script_event_name(int npce_index)
return script_config.kill_pc_event_name;
case NPCE_KILLNPC:
return script_config.kill_mob_event_name;
case NPCE_STATCALC:
return script_config.stat_calc_event_name;
default:
ShowError("npc_get_script_event_name: npce_index is outside the array limits: %d (max: %d).\n", npce_index, NPCE_MAX);
return NULL;

View File

@ -1196,7 +1196,6 @@ enum npce_event : uint8 {
NPCE_DIE,
NPCE_KILLPC,
NPCE_KILLNPC,
NPCE_STATCALC,
NPCE_MAX
};
struct view_data* npc_get_viewdata(int class_);

View File

@ -3577,10 +3577,7 @@ void pc_bonus(struct map_session_data *sd,int type,int val)
sd->special_state.no_walk_delay = 1;
break;
default:
if (running_npc_stat_calc_event) {
ShowWarning("pc_bonus: unknown bonus type %d %d in OnPCStatCalcEvent!\n", type, val);
}
else if (current_equip_combo_pos > 0) {
if (current_equip_combo_pos > 0) {
ShowWarning("pc_bonus: unknown bonus type %d %d in a combo with item #%d\n", type, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid);
}
else if (current_equip_card_id > 0 || current_equip_item_index > 0) {
@ -4164,10 +4161,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
sd->dropaddclass[type2] += val;
break;
default:
if (running_npc_stat_calc_event) {
ShowWarning("pc_bonus2: unknown bonus type %d %d %d in OnPCStatCalcEvent!\n", type, type2, val);
}
else if (current_equip_combo_pos > 0) {
if (current_equip_combo_pos > 0) {
ShowWarning("pc_bonus2: unknown bonus type %d %d %d in a combo with item #%d\n", type, type2, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid);
}
else if (current_equip_card_id > 0 || current_equip_item_index > 0) {
@ -4301,10 +4295,7 @@ void pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
sd->norecover_state_race[type2].tick = val;
break;
default:
if (running_npc_stat_calc_event) {
ShowWarning("pc_bonus3: unknown bonus type %d %d %d %d in OnPCStatCalcEvent!\n", type, type2, type3, val);
}
else if (current_equip_combo_pos > 0) {
if (current_equip_combo_pos > 0) {
ShowWarning("pc_bonus3: unknown bonus type %d %d %d %d in a combo with item #%d\n", type, type2, type3, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid);
}
else if (current_equip_card_id > 0 || current_equip_item_index > 0) {
@ -4387,10 +4378,7 @@ void pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type
break;
default:
if (running_npc_stat_calc_event) {
ShowWarning("pc_bonus4: unknown bonus type %d %d %d %d %d in OnPCStatCalcEvent!\n", type, type2, type3, type4, val);
}
else if (current_equip_combo_pos > 0) {
if (current_equip_combo_pos > 0) {
ShowWarning("pc_bonus4: unknown bonus type %d %d %d %d %d in a combo with item #%d\n", type, type2, type3, type4, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid);
}
else if (current_equip_card_id > 0 || current_equip_item_index > 0) {
@ -4439,10 +4427,7 @@ void pc_bonus5(struct map_session_data *sd,int type,int type2,int type3,int type
break;
default:
if (running_npc_stat_calc_event) {
ShowWarning("pc_bonus5: unknown bonus type %d %d %d %d %d %d in OnPCStatCalcEvent!\n", type, type2, type3, type4, type5, val);
}
else if (current_equip_combo_pos > 0) {
if (current_equip_combo_pos > 0) {
ShowWarning("pc_bonus5: unknown bonus type %d %d %d %d %d %d in a combo with item #%d\n", type, type2, type3, type4, type5, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid);
}
else if (current_equip_card_id > 0 || current_equip_item_index > 0) {

View File

@ -266,7 +266,6 @@ struct Script_Config script_config = {
"OnPCLoadMapEvent", //loadmap_event_name
"OnPCBaseLvUpEvent", //baselvup_event_name
"OnPCJobLvUpEvent", //joblvup_event_name
"OnPCStatCalcEvent", //stat_calc_event_name
// NPC related
"OnTouch_", //ontouch_event_name (runs on first visible char to enter area, picks another char if the first char leaves)
"OnTouch", //ontouch2_event_name (run whenever a char walks into the OnTouch area)
@ -23768,13 +23767,8 @@ BUILDIN_FUNC(achievementadd) {
}
if( !sd->state.pc_loaded ){
if( !running_npc_stat_calc_event ){
ShowError( "buildin_achievementadd: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id );
return SCRIPT_CMD_FAILURE;
}else{
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
if (achievement_add(sd, achievement_id))
@ -23805,13 +23799,8 @@ BUILDIN_FUNC(achievementremove) {
}
if( !sd->state.pc_loaded ){
if( !running_npc_stat_calc_event ){
ShowError( "buildin_achievementremove: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id );
return SCRIPT_CMD_FAILURE;
}else{
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
if (achievement_remove(sd, achievement_id))
@ -23842,13 +23831,8 @@ BUILDIN_FUNC(achievementinfo) {
if( !sd->state.pc_loaded ){
script_pushint(st, false);
if( !running_npc_stat_calc_event ){
ShowError( "buildin_achievementinfo: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id );
return SCRIPT_CMD_FAILURE;
}else{
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
script_pushint(st, achievement_check_progress(sd, achievement_id, script_getnum(st, 3)));
@ -23875,13 +23859,8 @@ BUILDIN_FUNC(achievementcomplete) {
}
if( !sd->state.pc_loaded ){
if( !running_npc_stat_calc_event ){
ShowError( "buildin_achievementcomplete: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id );
return SCRIPT_CMD_FAILURE;
}else{
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id);
@ -23913,13 +23892,8 @@ BUILDIN_FUNC(achievementexists) {
if( !sd->state.pc_loaded ){
script_pushint(st, false);
if( !running_npc_stat_calc_event ){
ShowError( "buildin_achievementexists: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id );
return SCRIPT_CMD_FAILURE;
}else{
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id && sd->achievement_data.achievements[i].completed > 0 );
@ -23951,13 +23925,8 @@ BUILDIN_FUNC(achievementupdate) {
}
if( !sd->state.pc_loaded ){
if( !running_npc_stat_calc_event ){
ShowError( "buildin_achievementupdate: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id );
return SCRIPT_CMD_FAILURE;
}else{
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
// Simply ignore it on the first call, because the status will be recalculated after loading anyway
return SCRIPT_CMD_SUCCESS;
}
ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id);

View File

@ -160,7 +160,6 @@ struct Script_Config {
const char *loadmap_event_name;
const char *baselvup_event_name;
const char *joblvup_event_name;
const char *stat_calc_event_name;
// NPC related
const char* ontouch_event_name;

View File

@ -62,7 +62,6 @@ static struct status_data dummy_status;
short current_equip_item_index; /// Contains inventory index of an equipped item. To pass it into the EQUP_SCRIPT [Lupus]
unsigned int current_equip_combo_pos; /// For combo items we need to save the position of all involved items here
int current_equip_card_id; /// To prevent card-stacking (from jA) [Skotlex]
bool running_npc_stat_calc_event; /// Indicate if OnPCStatCalcEvent is running.
// We need it for new cards 15 Feb 2005, to check if the combo cards are insrerted into the CURRENT weapon only to avoid cards exploits
short current_equip_opt_index; /// Contains random option index of an equipped item. [Secret]
@ -3846,10 +3845,6 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
pc_delautobonus(sd, sd->autobonus2, true);
pc_delautobonus(sd, sd->autobonus3, true);
running_npc_stat_calc_event = true;
npc_script_event(sd, NPCE_STATCALC);
running_npc_stat_calc_event = false;
// Parse equipment
for (i = 0; i < EQI_MAX; i++) {
current_equip_item_index = index = sd->equip_index[i]; // We pass INDEX to current_equip_item_index - for EQUIP_SCRIPT (new cards solution) [Lupus]

View File

@ -2082,7 +2082,6 @@ enum e_joint_break : uint8 {
extern short current_equip_item_index;
extern unsigned int current_equip_combo_pos;
extern int current_equip_card_id;
extern bool running_npc_stat_calc_event;
extern short current_equip_opt_index;
//Status change option definitions (options are what makes status changes visible to chars