summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt7
-rw-r--r--src/map/npc.c22
2 files changed, 28 insertions, 1 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 0d1d1fb1e..da42dc784 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -3,6 +3,13 @@ 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.
+2009/01/23
+ * Changed npc_get_new_npc_id to ensure that it never returns invalid/used ids. [FlavioJS]
+ - npc_get_new_npc_id is used to generate ids for npcs/mobs/homunculus/mercenaries/pets.
+ If the server runs for long enough (years to months or less, depending on settings),
+ the auxiliary variable npc_id will eventually overflow and go negative, then go
+ through the range of object ids, then through the range of account ids.
+ This can lead to all sorts of random crashes and memory leaks.
2009/01/22
* Changed val4 of SC_BLADESTOP from a block_list pointer to an id. [FlavioJS]
2009/01/21
diff --git a/src/map/npc.c b/src/map/npc.c
index 37cf06157..a95b490d9 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -51,7 +51,27 @@ static int npc_script=0;
static int npc_mob=0;
static int npc_delay_mob=0;
static int npc_cache_mob=0;
-int npc_get_new_npc_id(void){ return npc_id++; }
+
+/// Returns a new npc id that isn't being used in id_db.
+/// Fatal error if nothing is available.
+int npc_get_new_npc_id(void)
+{
+ if( npc_id >= START_NPC_NUM && map_id2bl(npc_id) == NULL )
+ return npc_id++;// available
+ {// find next id
+ int base_id = npc_id;
+ while( base_id != ++npc_id )
+ {
+ if( npc_id < START_NPC_NUM )
+ npc_id = START_NPC_NUM;
+ if( map_id2bl(npc_id) == NULL )
+ return npc_id++;// available
+ }
+ // full loop, nothing available
+ ShowFatalError("npc_get_new_npc_id: All ids are taken. Exiting...");
+ exit(1);
+ }
+}
static DBMap* ev_db; // const char* event_name -> struct event_data*
static DBMap* npcname_db; // const char* npc_name -> struct npc_data*