Fixed atcommands for NPC loading (fixes #203)

* Resolves atcommand loadnpc not working in sequence with atcommand unloadnpc multiple times on the same NPC.
* Added atcommand reloadnpc.
Thanks to @Tokeiburu!
This commit is contained in:
aleos89 2017-01-25 13:06:45 -05:00
parent 0b2e0cc3fd
commit 9c2026d216
6 changed files with 55 additions and 17 deletions

View File

@ -770,7 +770,7 @@
732: Item cannot be opened when your inventory is full.
//733 free
733: Please enter a NPC name (usage: @reloadnpc <NPC_name>).
// @cloneequip/@clonestat
734: Cannot clone your own %s.

View File

@ -1435,6 +1435,16 @@ Example:
---------------------------------------
@reloadnpc <npc name>
Unloads and loads an NPC.
Same as @unloadnpc and @loadnpc but ran as one command.
Example:
@reloadnpc npc/custom/jobmaster.txt
---------------------------------------
=====================
| 6. Party Commands |
=====================

View File

@ -4611,15 +4611,12 @@ ACMD_FUNC(loadnpc)
clif_displaymessage(fd, msg_txt(sd,1132)); // Please enter a script file name (usage: @loadnpc <file name>).
return -1;
}
// add to list of script sources and run it
if( !npc_addsrcfile(message) //try to read file
|| !npc_parsesrcfile(message,true)
){
clif_displaymessage(fd, msg_txt(sd,261));
return -1;
}
if (!npc_addsrcfile(message, true)) {
clif_displaymessage(fd, msg_txt(sd,261));
return -1;
}
npc_read_event_script();
clif_displaymessage(fd, msg_txt(sd,262));
@ -4651,6 +4648,26 @@ ACMD_FUNC(unloadnpc)
return 0;
}
ACMD_FUNC(reloadnpc) {
if (!message || !*message) {
clif_displaymessage(fd, msg_txt(sd,733)); // Please enter a NPC name (usage: @reloadnpc <NPC_name>).
return -1;
}
if (npc_unloadfile(message))
clif_displaymessage(fd, msg_txt(sd,1386)); // File unloaded. Be aware that mapflags and monsters spawned directly are not removed.
if (!npc_addsrcfile(message, true)) {
clif_displaymessage(fd, msg_txt(sd,261));
return -1;
}
npc_read_event_script();
clif_displaymessage(fd, msg_txt(sd,262));
return 0;
}
/*==========================================
* time in txt for time command (by [Yor])
*------------------------------------------*/
@ -10063,6 +10080,7 @@ void atcommand_basecommands(void) {
ACMD_DEF(hidenpc),
ACMD_DEF(loadnpc),
ACMD_DEF(unloadnpc),
ACMD_DEF(reloadnpc),
ACMD_DEF2("time", servertime),
ACMD_DEF(jail),
ACMD_DEF(unjail),

View File

@ -3851,7 +3851,7 @@ int map_config_read(char *cfgName)
else if (strcmpi(w1, "delmap") == 0)
map_delmap(w2);
else if (strcmpi(w1, "npc") == 0)
npc_addsrcfile(w2);
npc_addsrcfile(w2, false);
else if (strcmpi(w1, "delnpc") == 0)
npc_delsrcfile(w2);
else if (strcmpi(w1, "autosave_time") == 0) {
@ -3928,7 +3928,7 @@ void map_reloadnpc_sub(char *cfgName)
*ptr = '\0';
if (strcmpi(w1, "npc") == 0)
npc_addsrcfile(w2);
npc_addsrcfile(w2, false);
else if (strcmpi(w1, "delnpc") == 0)
npc_delsrcfile(w2);
else if (strcmpi(w1, "import") == 0)
@ -3943,7 +3943,7 @@ void map_reloadnpc_sub(char *cfgName)
void map_reloadnpc(bool clear)
{
if (clear)
npc_addsrcfile("clear"); // this will clear the current script list
npc_addsrcfile("clear", false); // this will clear the current script list
#ifdef RENEWAL
map_reloadnpc_sub("npc/re/scripts_main.conf");

View File

@ -2093,13 +2093,19 @@ int npc_unload(struct npc_data* nd, bool single) {
if( single && nd->path ) {
struct npc_path_data* npd = NULL;
if( nd->path && nd->path != npc_last_ref ) {
if( nd->path ) {
npd = (struct npc_path_data*)strdb_get(npc_path_db, nd->path);
}
if( npd && --npd->references == 0 ) {
strdb_remove(npc_path_db, nd->path);/* remove from db */
aFree(nd->path);/* remove now that no other instances exist */
if (npd == npc_last_npd) {
npc_last_npd = NULL;
npc_last_ref = NULL;
npc_last_path = NULL;
}
}
}
@ -2181,9 +2187,10 @@ static void npc_clearsrcfile(void)
/**
* Adds a npc source file (or removes all)
* @param name : file to add
* @param loadscript : flag to parse the script immediately after adding the src file
* @return 0=error, 1=sucess
*/
int npc_addsrcfile(const char* name)
int npc_addsrcfile(const char* name, bool loadscript)
{
struct npc_src_list* file;
struct npc_src_list* file_prev = NULL;
@ -2217,8 +2224,11 @@ int npc_addsrcfile(const char* name)
npc_src_files = file;
else
file_prev->next = file;
return 1;
if (loadscript)
return npc_parsesrcfile(file->name, true);
return 1;
}
/// Removes a npc source file (or all)

View File

@ -162,7 +162,7 @@ bool npc_isnear(struct block_list * bl);
int npc_get_new_npc_id(void);
int npc_addsrcfile(const char* name);
int npc_addsrcfile(const char* name, bool loadscript);
void npc_delsrcfile(const char* name);
int npc_parsesrcfile(const char* filepath, bool runOnInit);
void do_clear_npc(void);