From 63efe8b1c659a3b1491321bbfbd0d1731daf8e74 Mon Sep 17 00:00:00 2001 From: skotlex Date: Thu, 5 Oct 2006 14:37:06 +0000 Subject: - Added function npc_unload_duplicates(), it unloads all npcs that are a duplicate of the passed one. For use with @unloadnpc to prevent crashes when you unload the npc that has duplicates. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8939 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 4 ++++ src/map/atcommand.c | 1 + src/map/npc.c | 21 +++++++++++++++++++++ src/map/npc.h | 1 + 4 files changed, 27 insertions(+) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 5a654a3b8..7c16e98aa 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -3,6 +3,10 @@ Date Added AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. +2006/10/05 + * Added function npc_unload_duplicates(), it unloads all npcs that are a + duplicate of the passed one. For use with @unloadnpc to prevent crashes + when you unload the npc that has duplicates. [Skotlex] 2006/10/04 * Bowling bash now always hits twice regardless of situation. [Skotlex] * Added an underflow check to prevent sending to the client negative mdef2 diff --git a/src/map/atcommand.c b/src/map/atcommand.c index d0bf422e0..836f40f40 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -6234,6 +6234,7 @@ int atcommand_unloadnpc(const int fd, struct map_session_data* sd, } if ((nd = npc_name2id(NPCname)) != NULL) { + npc_unload_duplicates(nd); npc_unload(nd); clif_displaymessage(fd, msg_txt(112)); // Npc Disabled. } else { diff --git a/src/map/npc.c b/src/map/npc.c index 1954b5d7f..7724a2b8a 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -1417,6 +1417,27 @@ static int npc_unload_ev(DBKey key,void *data,va_list ap) { return 0; } +static int npc_unload_dup_sub(DBKey key,void * data,va_list app) +{ + struct npc_data *nd = (struct npc_data *)data; + va_list ap; + int src_id; + + if(nd->bl.type!=BL_NPC || nd->bl.subtype != SCRIPT) + return 0; + + ap = va_arg(app, va_list); + src_id=va_arg(ap,int); + if (nd->u.scr.src_id == src_id) + npc_unload(nd); + return 0; +} +//Removes all npcs that are duplicates of the passed one. [Skotlex] +void npc_unload_duplicates (struct npc_data *nd) +{ + map_foreachiddb(npc_unload_dup_sub,nd->bl.id); +} + int npc_unload (struct npc_data *nd) { nullpo_ret(nd); diff --git a/src/map/npc.h b/src/map/npc.h index 94de8064a..2ea4f7eb7 100644 --- a/src/map/npc.h +++ b/src/map/npc.h @@ -77,6 +77,7 @@ void npc_timerevent_quit(struct map_session_data *sd); int npc_gettimerevent_tick(struct npc_data *nd); int npc_settimerevent_tick(struct npc_data *nd,int newtimer); int npc_remove_map(struct npc_data *nd); +void npc_unload_duplicates (struct npc_data *nd); int npc_unload(struct npc_data *nd); int npc_reload(void); int npc_script_event(TBL_PC* sd, int type); -- cgit v1.2.3-70-g09d2