Change npc_src_files linked list to vector (#7598)

This commit is contained in:
Vincent Stumpf
2023-02-12 13:38:12 -08:00
committed by GitHub
parent e235c9cab4
commit 9d2bcc7a70
2 changed files with 35 additions and 95 deletions

View File

@@ -39,12 +39,8 @@ using namespace rathena;
struct npc_data* fake_nd;
// linked list of npc source files
struct npc_src_list {
struct npc_src_list* next;
char name[4]; // dynamic array, the structure is allocated with extra bytes (string length)
};
static struct npc_src_list* npc_src_files = NULL;
std::vector<std::string> npc_src_files;
static int npc_id=START_NPC_NUM;
static int npc_warp=0;
@@ -3565,19 +3561,6 @@ int npc_unload(struct npc_data* nd, bool single) {
// NPC Source Files
//
/// Clears the npc source file list
static void npc_clearsrcfile(void)
{
struct npc_src_list* file = npc_src_files;
while( file != NULL ) {
struct npc_src_list* file_tofree = file;
file = file->next;
aFree(file_tofree);
}
npc_src_files = NULL;
}
/**
* Adds a npc source file (or removes all)
* @param name : file to add
@@ -3586,41 +3569,26 @@ static void npc_clearsrcfile(void)
*/
int npc_addsrcfile(const char* name, bool loadscript)
{
struct npc_src_list* file;
struct npc_src_list* file_prev = NULL;
if( strcmpi(name, "clear") == 0 )
{
npc_clearsrcfile();
npc_src_files.clear();
return 1;
}
//Check if this is not a file
if(check_filepath(name)!=2){
if(check_filepath(name)!=2){
ShowError("npc_addsrcfile: Can't find source file \"%s\"\n", name );
return 0;
}
// prevent multiple insert of source files
file = npc_src_files;
while( file != NULL )
{
if( strcmp(name, file->name) == 0 )
return 0;// found the file, no need to insert it again
file_prev = file;
file = file->next;
if (util::vector_exists(npc_src_files, name)) {
return 0; // found the file, no need to insert it again
}
file = (struct npc_src_list*)aMalloc(sizeof(struct npc_src_list) + strlen(name));
file->next = NULL;
safestrncpy(file->name, name, strlen(name) + 1);
if( file_prev == NULL )
npc_src_files = file;
else
file_prev->next = file;
npc_src_files.push_back(name);
if (loadscript)
return npc_parsesrcfile(file->name);
return npc_parsesrcfile(name);
return 1;
}
@@ -3628,29 +3596,34 @@ int npc_addsrcfile(const char* name, bool loadscript)
/// Removes a npc source file (or all)
void npc_delsrcfile(const char* name)
{
struct npc_src_list* file = npc_src_files;
struct npc_src_list* file_prev = NULL;
if( strcmpi(name, "all") == 0 )
{
npc_clearsrcfile();
npc_src_files.clear();
return;
}
while( file != NULL )
{
if( strcmp(file->name, name) == 0 )
{
if( npc_src_files == file )
npc_src_files = file->next;
else
file_prev->next = file->next;
aFree(file);
break;
}
file_prev = file;
file = file->next;
util::vector_erase_if_exists(npc_src_files, name);
}
/**
* Load all npc files
*/
void npc_loadsrcfiles() {
ShowStatus("Loading NPCs...\n");
for (const auto& file : npc_src_files) {
#ifdef DEBUG
ShowStatus("Loading NPC file: %s" CL_CLL "\r", file.c_str());
#endif
npc_parsesrcfile(file.c_str());
}
ShowInfo ("Done loading '" CL_WHITE "%d" CL_RESET "' NPCs:" CL_CLL "\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Warps\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Shops\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Scripts\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Spawn sets\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Mobs Cached\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Mobs Not Cached\n",
npc_id - START_NPC_NUM, npc_warp, npc_shop, npc_script, npc_mob, npc_cache_mob, npc_delay_mob);
}
/// Parses and sets the name and exname of a npc.
@@ -5959,7 +5932,6 @@ void npc_clear_pathlist(void) {
//Clear then reload npcs files
int npc_reload(void) {
struct npc_src_list *nsl;
int npc_new_min = npc_id;
struct s_mapiterator* iter;
struct block_list* bl;
@@ -6026,24 +5998,7 @@ int npc_reload(void) {
// reset mapflags
map_flags_init();
//TODO: the following code is copy-pasted from do_init_npc(); clean it up
// Reloading npcs now
ShowStatus("Loading NPC Files\n");
for (nsl = npc_src_files; nsl; nsl = nsl->next) {
#ifdef DEBUG
ShowStatus("Loading NPC file: %s" CL_CLL "\r", nsl->name);
#endif
npc_parsesrcfile(nsl->name);
}
ShowInfo("Loaded NPC Files\n");
ShowInfo ("Done loading '" CL_WHITE "%d" CL_RESET "' NPCs:" CL_CLL "\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Warps\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Shops\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Scripts\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Spawn sets\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Mobs Cached\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Mobs Not Cached\n",
npc_id - npc_new_min, npc_warp, npc_shop, npc_script, npc_mob, npc_cache_mob, npc_delay_mob);
npc_loadsrcfiles();
stylist_db.reload();
barter_db.reload();
@@ -6118,7 +6073,7 @@ void do_final_npc(void) {
barter_db.clear();
ers_destroy(timer_event_ers);
ers_destroy(npc_sc_display_ers);
npc_clearsrcfile();
npc_src_files.clear();
}
static void npc_debug_warps_sub(struct npc_data* nd)
@@ -6164,7 +6119,6 @@ static void npc_debug_warps(void){
* npc initialization
*------------------------------------------*/
void do_init_npc(void){
struct npc_src_list *file;
int i;
//Stock view data for normal npcs.
@@ -6186,22 +6140,7 @@ void do_init_npc(void){
timer_event_ers = ers_new(sizeof(struct timer_event_data),"npc.cpp::timer_event_ers",ERS_OPT_NONE);
npc_sc_display_ers = ers_new(sizeof(struct sc_display_entry), "npc.cpp:npc_sc_display_ers", ERS_OPT_NONE);
// process all npc files
ShowStatus("Loading NPCs...\r");
for( file = npc_src_files; file != NULL; file = file->next ) {
#ifdef DEBUG
ShowStatus("Loading NPC file: %s" CL_CLL "\r", file->name);
#endif
npc_parsesrcfile(file->name);
}
ShowInfo ("Done loading '" CL_WHITE "%d" CL_RESET "' NPCs:" CL_CLL "\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Warps\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Shops\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Scripts\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Spawn sets\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Mobs Cached\n"
"\t-'" CL_WHITE "%d" CL_RESET "' Mobs Not Cached\n",
npc_id - START_NPC_NUM, npc_warp, npc_shop, npc_script, npc_mob, npc_cache_mob, npc_delay_mob);
npc_loadsrcfiles();
stylist_db.load();
barter_db.load();