From d398b01eb2dceba231b7c313e402817554c3a43d Mon Sep 17 00:00:00 2001 From: shennetsind Date: Fri, 17 Aug 2012 19:41:29 +0000 Subject: Added 2 (3) new atcommands: * @unloadnpcfile ** e.g. "@unloadnpcfile npc/cities/alberta.txt" unloads all npcs created by the npc/cities/alberta.txt file. * @addperm/@rmvperm ** e.g. "@addperm skill_unconditional" / "#rmvperm "player" skill_unconditional" git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@16656 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/npc.c | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) (limited to 'src/map/npc.c') diff --git a/src/map/npc.c b/src/map/npc.c index 4faa54e24..e8ebb3180 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -1749,6 +1749,9 @@ int npc_unload(struct npc_data* nd, bool single) { npc_chat_finalize(nd); // deallocate npc PCRE data structures #endif + if( nd->path ) + aFree(nd->path); + if( (nd->subtype == SHOP || nd->subtype == CASHSHOP) && nd->src_id == 0) //src check for duplicate shops [Orcao] aFree(nd->u.shop.shop_item); else if( nd->subtype == SCRIPT ) { @@ -1892,16 +1895,12 @@ static void npc_parsename(struct npc_data* nd, const char* name, const char* sta // parse name p = strstr(name,"::"); - if( p ) - {// :: + if( p ) { // :: size_t len = p-name; - if( len > NAME_LENGTH ) - { + if( len > NAME_LENGTH ) { ShowWarning("npc_parsename: Display name of '%s' is too long (len=%u) in file '%s', line'%d'. Truncating to %u characters.\n", name, (unsigned int)len, filepath, strline(buffer,start-buffer), NAME_LENGTH); safestrncpy(nd->name, name, sizeof(nd->name)); - } - else - { + } else { memcpy(nd->name, name, len); memset(nd->name+len, 0, sizeof(nd->name)-len); } @@ -1909,9 +1908,7 @@ static void npc_parsename(struct npc_data* nd, const char* name, const char* sta if( len > NAME_LENGTH ) ShowWarning("npc_parsename: Unique name of '%s' is too long (len=%u) in file '%s', line'%d'. Truncating to %u characters.\n", name, (unsigned int)len, filepath, strline(buffer,start-buffer), NAME_LENGTH); safestrncpy(nd->exname, p+2, sizeof(nd->exname)); - } - else - {// + } else {// size_t len = strlen(name); if( len > NAME_LENGTH ) ShowWarning("npc_parsename: Name '%s' is too long (len=%u) in file '%s', line'%d'. Truncating to %u characters.\n", name, (unsigned int)len, filepath, strline(buffer,start-buffer), NAME_LENGTH); @@ -1919,15 +1916,13 @@ static void npc_parsename(struct npc_data* nd, const char* name, const char* sta safestrncpy(nd->exname, name, sizeof(nd->exname)); } - if( *nd->exname == '\0' || strstr(nd->exname,"::") != NULL ) - {// invalid + if( *nd->exname == '\0' || strstr(nd->exname,"::") != NULL ) {// invalid snprintf(newname, ARRAYLENGTH(newname), "0_%d_%d_%d", nd->bl.m, nd->bl.x, nd->bl.y); ShowWarning("npc_parsename: Invalid unique name in file '%s', line'%d'. Renaming '%s' to '%s'.\n", filepath, strline(buffer,start-buffer), nd->exname, newname); safestrncpy(nd->exname, newname, sizeof(nd->exname)); } - if( (dnd=npc_name2id(nd->exname)) != NULL ) - {// duplicate unique name, generate new one + if( (dnd=npc_name2id(nd->exname)) != NULL ) {// duplicate unique name, generate new one char this_mapname[32]; char other_mapname[32]; int i = 0; @@ -1947,6 +1942,9 @@ static void npc_parsename(struct npc_data* nd, const char* name, const char* sta ShowDebug("other npc:\n display name '%s'\n unique name '%s'\n map=%s, x=%d, y=%d\n", dnd->name, dnd->exname, other_mapname, dnd->bl.x, dnd->bl.y); safestrncpy(nd->exname, newname, sizeof(nd->exname)); } + + CREATE(nd->path, char, strlen(filepath)+1); + safestrncpy(nd->path, filepath, strlen(filepath)+1); } struct npc_data* npc_add_warp(short from_mapid, short from_x, short from_y, short xs, short ys, unsigned short to_mapindex, short to_x, short to_y) @@ -3588,6 +3586,22 @@ int npc_reload(void) { } return 0; } +bool npc_unloadfile( const char* path ) { + DBIterator * iter = db_iterator(npcname_db); + struct npc_data* nd = NULL; + bool found = false; + + for( nd = dbi_first(iter); dbi_exists(iter); nd = dbi_next(iter) ) { + if( nd->path && strcasecmp(nd->path,path) == 0 ) { + found = true; + npc_unload(nd, true); + } + } + + dbi_destroy(iter); + + return found; +} void do_clear_npc(void) { db_clear(npcname_db); db_clear(ev_db); @@ -3657,6 +3671,7 @@ int do_init_npc(void) npcname_db = strdb_alloc(DB_OPT_BASE,NAME_LENGTH); timer_event_ers = ers_new(sizeof(struct timer_event_data)); + // process all npc files ShowStatus("Loading NPCs...\r"); for( file = npc_src_files; file != NULL; file = file->next ) { -- cgit v1.2.3-60-g2f50