diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map/guild.c | 20 | ||||
-rw-r--r-- | src/map/npc.c | 27 |
2 files changed, 36 insertions, 11 deletions
diff --git a/src/map/guild.c b/src/map/guild.c index 64e2b29d2..72bf302f0 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -1500,15 +1500,21 @@ int guild_agit_end(void) int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data) { // Run One NPC_Event[OnAgitEliminate] - size_t len = strlen((const char*)data); - char *evname=(char*)aCallocA(len + 4,sizeof(char)); + char *name = (char*)data; + size_t len = (name) ? strlen(name) : 0; + // the rest is dangerous, but let it crash, + // if this happens, it's ruined anyway + char *evname=(char*)aMalloc( (len + 4) * sizeof(char)); int c=0; - if(!agit_flag) return 0; // Agit already End - memcpy(evname,(const char *)data,len - 5); - strcpy(evname + len - 5,"Eliminate"); - c = npc_event_do(evname); - printf("NPC_Event:[%s] Run (%d) Events.\n",evname,c); + if(agit_flag) // Agit not already End + { + memcpy(evname,name,len - 5); + strcpy(evname + len - 5,"Eliminate"); + c = npc_event_do(evname); + printf("NPC_Event:[%s] Run (%d) Events.\n",evname,c); + } + if(name) aFree(name); return 0; } diff --git a/src/map/npc.c b/src/map/npc.c index 12906a1fc..1ba55699f 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -164,12 +164,31 @@ int npc_delete(struct npc_data *nd) */ int npc_event_timer(int tid,unsigned int tick,int id,int data) { + char *eventname = (char *)data; + struct event_data *ev = (struct event_data *)strdb_search(ev_db,eventname); + struct npc_data *nd; struct map_session_data *sd=map_id2sd(id); - if (sd==NULL) - return 0; + size_t i; - npc_event(sd,(const char *)data,0); - aFree((void*)data); + if((ev==NULL || (nd=ev->nd)==NULL)) + { + if(battle_config.error_log) + printf("npc_event: event not found [%s]\n",eventname); + } + else + { + for(i=0;i<MAX_EVENTTIMER;i++) { + if( nd->eventtimer[i]==tid ) { + nd->eventtimer[i]=-1; + npc_event(sd,eventname,0); // sd NULL check is within + break; + } + } + if(i==MAX_EVENTTIMER && battle_config.error_log) + printf("npc_event_timer: event timer not found [%s]!\n",eventname); + } + + aFree(eventname); return 0; } |