From f197f82f1fdb1ea4766dc60288bfda730b4c3760 Mon Sep 17 00:00:00 2001 From: Jeybla Date: Thu, 31 Aug 2017 19:02:22 +0200 Subject: [PATCH] Removed reset of monster drops on mobdb reload. (#2394) Does not clear item_drop_ers on mobdbreload anymore. - Fixes #2355 - Thanks to @Zellukas. --- src/map/map.cpp | 2 +- src/map/mob.c | 24 +++++++++++++++--------- src/map/mob.h | 2 +- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/map/map.cpp b/src/map/map.cpp index 983c2e4fb9..57486ac58d 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -4407,7 +4407,7 @@ void do_final(void) do_final_pet(); do_final_homunculus(); do_final_mercenary(); - do_final_mob(); + do_final_mob(false); do_final_msg(); do_final_skill(); do_final_status(); diff --git a/src/map/mob.c b/src/map/mob.c index 3d90e21a02..0f25ab4ca3 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -5237,12 +5237,16 @@ static void mob_load(void) /** * Initialize monster data */ -void mob_db_load(void){ +void mob_db_load(bool is_reload){ memset(mob_db_data,0,sizeof(mob_db_data)); //Clear the array mob_db_data[0] = (struct mob_db*)aCalloc(1, sizeof (struct mob_db)); //This mob is used for random spawns mob_makedummymobdb(0); //The first time this is invoked, it creates the dummy mob - item_drop_ers = ers_new(sizeof(struct item_drop),"mob.c::item_drop_ers",ERS_OPT_CLEAN); - item_drop_list_ers = ers_new(sizeof(struct item_drop_list),"mob.c::item_drop_list_ers",ERS_OPT_NONE); + if( !is_reload ) { + // on mobdbreload it's not neccessary to execute this + // item ers needs to be allocated only once + item_drop_ers = ers_new(sizeof(struct item_drop),"mob.c::item_drop_ers",ERS_OPT_CLEAN); + item_drop_list_ers = ers_new(sizeof(struct item_drop_list),"mob.c::item_drop_list_ers",ERS_OPT_NONE); + } mob_item_drop_ratio = idb_alloc(DB_OPT_BASE); mob_skill_db = idb_alloc(DB_OPT_BASE); mob_summon_db = idb_alloc(DB_OPT_BASE); @@ -5302,8 +5306,8 @@ static int mob_reload_sub_npc( struct npc_data *nd, va_list args ){ * Reload monster data */ void mob_reload(void) { - do_final_mob(); - mob_db_load(); + do_final_mob(true); + mob_db_load(true); map_foreachmob(mob_reload_sub); map_foreachnpc(mob_reload_sub_npc); } @@ -5323,7 +5327,7 @@ void mob_clear_spawninfo() * Circumference initialization of mob *------------------------------------------*/ void do_init_mob(void){ - mob_db_load(); + mob_db_load(false); add_timer_func_list(mob_delayspawn,"mob_delayspawn"); add_timer_func_list(mob_delay_item_drop,"mob_delay_item_drop"); @@ -5340,7 +5344,7 @@ void do_init_mob(void){ /*========================================== * Clean memory usage. *------------------------------------------*/ -void do_final_mob(void){ +void do_final_mob(bool is_reload){ int i; if (mob_dummy) { @@ -5366,6 +5370,8 @@ void do_final_mob(void){ mob_item_drop_ratio->destroy(mob_item_drop_ratio,mob_item_drop_ratio_free); mob_skill_db->destroy(mob_skill_db, mob_skill_db_free); mob_summon_db->destroy(mob_summon_db, mob_summon_db_free); - ers_destroy(item_drop_ers); - ers_destroy(item_drop_list_ers); + if( !is_reload ) { + ers_destroy(item_drop_ers); + ers_destroy(item_drop_list_ers); + } } diff --git a/src/map/mob.h b/src/map/mob.h index 41adc25963..99f440549f 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -337,7 +337,7 @@ void mob_heal(struct mob_data *md,unsigned int heal); void mob_clear_spawninfo(); void do_init_mob(void); -void do_final_mob(void); +void do_final_mob(bool is_reload); int mob_timer_delete(int tid, unsigned int tick, int id, intptr_t data); int mob_deleteslave(struct mob_data *md);