Disable instances from using OnPC Events (#2278)

* Fixes #2273.
* Disable the use of OnPC Events in instance scripts since player's aren't actually attached to the event thus causing a crash.
Thanks to @Tokeiburu!
This commit is contained in:
Aleos 2017-07-24 17:38:05 -04:00 committed by GitHub
parent 7c2f3c4db9
commit 8b3e9cd28f
2 changed files with 42 additions and 17 deletions

View File

@ -339,6 +339,17 @@ static int npc_event_export(struct npc_data *nd, int i)
struct event_data *ev;
char buf[EVENT_NAME_LENGTH];
if (nd->bl.m > -1 && map[nd->bl.m].instance_id > 0) { // Block script events in instances
int j;
for (j = 0; j < NPCE_MAX; j++) {
if (strcmpi(npc_get_script_event_name(j), lname) == 0) {
ShowWarning("npc_event_export: attempting to duplicate a script event in an instance (%s::%s), ignoring\n", nd->name, lname);
return 0;
}
}
}
// NPC:<name> the prefix uses 4 characters
if( !strncasecmp( lname, script_config.onwhisper_event_name, NAME_LENGTH ) && strlen(nd->exname) > ( NAME_LENGTH - 4 ) ){
// The client only allows that many character so that NPC could not be whispered by unmodified clients
@ -4439,23 +4450,36 @@ int npc_script_event(struct map_session_data* sd, enum npce_event type)
return i;
}
const char *npc_get_script_event_name(int npce_index)
{
switch (npce_index) {
case NPCE_LOGIN:
return script_config.login_event_name;
case NPCE_LOGOUT:
return script_config.logout_event_name;
case NPCE_LOADMAP:
return script_config.loadmap_event_name;
case NPCE_BASELVUP:
return script_config.baselvup_event_name;
case NPCE_JOBLVUP:
return script_config.joblvup_event_name;
case NPCE_DIE:
return script_config.die_event_name;
case NPCE_KILLPC:
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;
}
}
void npc_read_event_script(void)
{
int i;
struct {
char *name;
const char *event_name;
} config[] = {
{"Login Event",script_config.login_event_name},
{"Logout Event",script_config.logout_event_name},
{"Load Map Event",script_config.loadmap_event_name},
{"Base LV Up Event",script_config.baselvup_event_name},
{"Job LV Up Event",script_config.joblvup_event_name},
{"Die Event",script_config.die_event_name},
{"Kill PC Event",script_config.kill_pc_event_name},
{"Kill NPC Event",script_config.kill_mob_event_name},
{"Stat Calc Event",script_config.stat_calc_event_name},
};
for (i = 0; i < NPCE_MAX; i++)
{
@ -4464,7 +4488,7 @@ void npc_read_event_script(void)
DBData *data;
char name[EVENT_NAME_LENGTH];
safesnprintf(name,EVENT_NAME_LENGTH,"::%s",config[i].event_name);
safesnprintf(name,EVENT_NAME_LENGTH,"::%s", npc_get_script_event_name(i));
script_event[i].event_count = 0;
iter = db_iterator(ev_db);
@ -4476,7 +4500,7 @@ void npc_read_event_script(void)
if( count >= ARRAYLENGTH(script_event[i].event) )
{
ShowWarning("npc_read_event_script: too many occurences of event '%s'!\n", config[i].event_name);
ShowWarning("npc_read_event_script: too many occurences of event '%s'!\n", npc_get_script_event_name(i));
break;
}
@ -4493,7 +4517,7 @@ void npc_read_event_script(void)
if (battle_config.etc_log) {
//Print summary.
for (i = 0; i < NPCE_MAX; i++)
ShowInfo("%s: %d '%s' events.\n", config[i].name, script_event[i].event_count, config[i].event_name);
ShowInfo("%d '%s' events.\n", script_event[i].event_count, npc_get_script_event_name(i));
}
}

View File

@ -164,6 +164,7 @@ void npc_parse_mob2(struct spawn_data* mob);
bool npc_viewisid(const char * viewid);
struct npc_data* npc_add_warp(char* name, short from_mapid, short from_x, short from_y, short xs, short ys, unsigned short to_mapindex, short to_x, short to_y);
int npc_globalmessage(const char* name,const char* mes);
const char *npc_get_script_event_name(int npce_index);
void npc_setcells(struct npc_data* nd);
void npc_unsetcells(struct npc_data* nd);