diff options
Diffstat (limited to 'src/map/map.c')
-rw-r--r-- | src/map/map.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/src/map/map.c b/src/map/map.c index c086b73c0..bc9465781 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -240,7 +240,7 @@ int map_freeblock_unlock (void) // この関数は、do_timer() のトップレベルから呼ばれるので、 // block_free_lock を直接いじっても支障無いはず。 -int map_freeblock_timer(int tid, unsigned int tick, int id, intptr data) +int map_freeblock_timer(int tid, unsigned int tick, int id, intptr_t data) { if (block_free_lock > 0) { ShowError("map_freeblock_timer: block_free_lock(%d) is invalid.\n", block_free_lock); @@ -1217,7 +1217,7 @@ int map_get_new_object_id(void) * 後者は、map_clearflooritem(id)へ * map.h?で#defineしてある *------------------------------------------*/ -int map_clearflooritem_timer(int tid, unsigned int tick, int id, intptr data) +int map_clearflooritem_timer(int tid, unsigned int tick, int id, intptr_t data) { struct flooritem_data* fitem = (struct flooritem_data*)idb_get(id_db, id); if( fitem==NULL || fitem->bl.type!=BL_ITEM || (!data && fitem->cleartimer != tid) ) @@ -2146,7 +2146,7 @@ int map_removemobs_sub(struct block_list *bl, va_list ap) return 1; } -int map_removemobs_timer(int tid, unsigned int tick, int id, intptr data) +int map_removemobs_timer(int tid, unsigned int tick, int id, intptr_t data) { int count; const int m = id; @@ -2727,7 +2727,7 @@ int map_readfromcache(struct map_data *m, char *buffer, char *decode_buffer) } // TO-DO: Maybe handle the scenario, if the decoded buffer isn't the same size as expected? [Shinryo] - uncompress(decode_buffer, &size, p+sizeof(struct map_cache_map_info), info->len); + decode_zip(decode_buffer, &size, p+sizeof(struct map_cache_map_info), info->len); CREATE(m->cell, struct mapcell, size); @@ -3436,9 +3436,6 @@ void do_final(void) for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) map_quit(sd); mapit_free(iter); - - for( i = 0; i < MAX_INSTANCE; i++ ) - instance_destroy(i); id_db->foreach(id_db,cleanup_db_sub); chrif_char_reset_offline(); @@ -3449,6 +3446,7 @@ void do_final(void) do_final_chrif(); do_final_npc(); do_final_script(); + do_final_instance(); do_final_itemdb(); do_final_storage(); do_final_guild(); @@ -3491,7 +3489,7 @@ void do_final(void) #ifndef TXT_ONLY map_sql_close(); #endif /* not TXT_ONLY */ - ShowStatus("Successfully terminated.\n"); + ShowStatus("Finished.\n"); } static int map_abort_sub(struct map_session_data* sd, va_list ap) @@ -3573,6 +3571,27 @@ void set_server_type(void) SERVER_TYPE = ATHENA_SERVER_MAP; } + +/// Called when a terminate signal is received. +void do_shutdown(void) +{ + if( runflag != MAPSERVER_ST_SHUTDOWN ) + { + runflag = MAPSERVER_ST_SHUTDOWN; + ShowStatus("Shutting down...\n"); + { + struct map_session_data* sd; + struct s_mapiterator* iter = mapit_getallusers(); + for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) + clif_GM_kick(NULL, sd); + mapit_free(iter); + flush_fifos(); + } + chrif_check_shutdown(); + } +} + + int do_init(int argc, char *argv[]) { int i; @@ -3710,6 +3729,12 @@ int do_init(int argc, char *argv[]) ShowNotice("Server is running on '"CL_WHITE"PK Mode"CL_RESET"'.\n"); ShowStatus("Server is '"CL_GREEN"ready"CL_RESET"' and listening on port '"CL_WHITE"%d"CL_RESET"'.\n\n", map_port); + + if( runflag != CORE_ST_STOP ) + { + shutdown_callback = do_shutdown; + runflag = MAPSERVER_ST_RUNNING; + } return 0; } |