From 1195b69fb88843d6813253fcedda35e416ff2e96 Mon Sep 17 00:00:00 2001 From: skotlex Date: Thu, 27 Jul 2006 16:15:26 +0000 Subject: - Added a cleanup routine on shutdown to remove all characters from memory for whom the save ack has not returned from the char-server yet. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@7923 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/map.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/map') diff --git a/src/map/map.c b/src/map/map.c index 323ad3681..d217f0b35 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -3617,6 +3617,18 @@ static int cleanup_db_sub(DBKey key,void *data,va_list va) { return cleanup_sub((struct block_list*)data, NULL); } +static int cleanup_db_subpc(DBKey key,void *data,va_list va) { + struct map_session_data *sd = (TBL_PC*)data; + if (!sd->state.finalsave) + { //Error? + ShowError("do_final: Player character in DB which was not sent to save! %d:%d\n", sd->status.account_id, sd->status.char_id); + map_quit(sd); //Attempt force-save + } + //Force remove from memory... + map_quit_ack(sd); + return 1; +} + /*========================================== * mapIIE *------------------------------------------ @@ -3645,9 +3657,12 @@ void do_final(void) { for (i = 0; i < j; i++) map_quit(pl_allsd[i]); - i = id_db->foreach(id_db,cleanup_db_sub); + id_db->foreach(id_db,cleanup_db_sub); chrif_char_reset_offline(); chrif_flush_fifo(); + //Online players were sent to save, but the ack will not arrive on time! + //They have to be removed from memory, and assume the char-server saved them. + pc_db->foreach(pc_db,cleanup_db_subpc); do_final_atcommand(); do_final_battle(); -- cgit v1.2.3-70-g09d2