summaryrefslogtreecommitdiff
path: root/src/map/npc.c
diff options
context:
space:
mode:
authorFlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec>2009-01-23 17:49:44 +0000
committerFlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec>2009-01-23 17:49:44 +0000
commitbbc69c87b96710a51b19b94aee1cedbb0f555336 (patch)
tree4cb1901e7365289f5439c6fbda60e2755a5fef42 /src/map/npc.c
parent88c8f196133a694bac6023244774063332987f7b (diff)
downloadhercules-bbc69c87b96710a51b19b94aee1cedbb0f555336.tar.gz
hercules-bbc69c87b96710a51b19b94aee1cedbb0f555336.tar.bz2
hercules-bbc69c87b96710a51b19b94aee1cedbb0f555336.tar.xz
hercules-bbc69c87b96710a51b19b94aee1cedbb0f555336.zip
* Changed npc_get_new_npc_id to ensure that it never returns invalid/used ids.
- 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. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@13481 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/npc.c')
-rw-r--r--src/map/npc.c22
1 files changed, 21 insertions, 1 deletions
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*