summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-10-05 14:37:06 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-10-05 14:37:06 +0000
commit63efe8b1c659a3b1491321bbfbd0d1731daf8e74 (patch)
tree426cec7f0841c0c28dae3d9ee6ddac07ba3effa1
parentaf15657c15e2f506a379d8a7babd4200c770e135 (diff)
downloadhercules-63efe8b1c659a3b1491321bbfbd0d1731daf8e74.tar.gz
hercules-63efe8b1c659a3b1491321bbfbd0d1731daf8e74.tar.bz2
hercules-63efe8b1c659a3b1491321bbfbd0d1731daf8e74.tar.xz
hercules-63efe8b1c659a3b1491321bbfbd0d1731daf8e74.zip
- 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
-rw-r--r--Changelog-Trunk.txt4
-rw-r--r--src/map/atcommand.c1
-rw-r--r--src/map/npc.c21
-rw-r--r--src/map/npc.h1
4 files changed, 27 insertions, 0 deletions
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);