From 9478575520ed4ee5d36c4996522171cb35aab756 Mon Sep 17 00:00:00 2001 From: Dennis Friis Date: Thu, 25 Jun 2009 00:49:36 +0200 Subject: Improved storage saving, derived from ea stable. --- src/map/storage.c | 60 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 16 deletions(-) (limited to 'src/map/storage.c') diff --git a/src/map/storage.c b/src/map/storage.c index 09dc17b..7a7c893 100644 --- a/src/map/storage.c +++ b/src/map/storage.c @@ -92,13 +92,13 @@ static int storage_reconnect_sub(void *key,void *data,va_list ap) { //Guild Storage struct guild_storage* stor = (struct guild_storage*) data; if (stor->dirty && stor->storage_status == 0) //Save closed storages. - storage_guild_storagesave(0, stor->guild_id); + storage_guild_storagesave(0, stor->guild_id,0); } else { //Account Storage struct storage* stor = (struct storage*) data; if (stor->dirty && stor->storage_status == 0) //Save closed storages. - storage_storage_save(stor->account_id); + storage_storage_save(stor->account_id,stor->dirty==2?1:0); } return 0; } @@ -359,8 +359,12 @@ int storage_storageclose(struct map_session_data *sd) clif_storageclose(sd); if (stor->storage_status) - chrif_save(sd); //This will invoke the storage save function as well. [Skotlex] - + { + if (save_settings&4) + chrif_save(sd); //Invokes the storage saving as well. + else + storage_storage_save(sd->status.account_id, 0); + } stor->storage_status=0; sd->state.storage_flag=0; return 0; @@ -396,16 +400,27 @@ void storage_storage_dirty(struct map_session_data *sd) stor->dirty = 1; } -int storage_storage_save(int account_id) +int storage_storage_save(int account_id, int final) { struct storage *stor; stor=account2storage2(account_id); - if(stor && stor->dirty) + if(!stor) return 0; + + if(stor->dirty) { + if (final) { + stor->dirty = 2; + stor->storage_status = 0; //To prevent further manipulation of it. + } intif_send_storage(stor); return 1; } + if (final) + { //Clear storage from memory. Nothing to save. + storage_delete(account_id); + return 1; + } return 0; } @@ -651,19 +666,22 @@ int storage_guild_storagegettocart(struct map_session_data *sd,int index,int amo return 1; } -int storage_guild_storagesave(int account_id, int guild_id) +int storage_guild_storagesave(int account_id, int guild_id, int flag) { struct guild_storage *stor = guild2storage2(guild_id); - if(stor && stor->dirty) + if(stor) { - intif_send_guild_storage(account_id,stor); + if (flag) //Char quitting, close it. + stor->storage_status = 0; + if (stor->dirty) + intif_send_guild_storage(account_id,stor); return 1; } return 0; } -int storage_guild_storagesaved(int account_id, int guild_id) +int storage_guild_storagesaved(int guild_id) { struct guild_storage *stor; @@ -701,14 +719,24 @@ int storage_guild_storage_quit(struct map_session_data *sd,int flag) nullpo_retr(0, sd); nullpo_retr(0, stor=guild2storage2(sd->status.guild_id)); + if(flag) + { //Only during a guild break flag is 1 (don't save storage) + sd->state.storage_flag = 0; + stor->storage_status = 0; + clif_storageclose(sd); + if (save_settings&4) + chrif_save(sd); + return 0; + } + + if(stor->storage_status) { + if (save_settings&4) + chrif_save(sd); + else + storage_guild_storagesave(sd->status.account_id,sd->status.guild_id,1); + } sd->state.storage_flag = 0; stor->storage_status = 0; - chrif_save(sd); - if(!flag) //Only during a guild break flag is 1. - storage_guild_storagesave(sd->status.account_id,sd->status.guild_id); - else //When the guild was broken, close the storage of he who has it open. - clif_storageclose(sd); - return 0; } -- cgit v1.2.3-60-g2f50