diff options
author | Dennis Friis <peavey@inspircd.org> | 2009-06-25 00:49:36 +0200 |
---|---|---|
committer | Dennis Friis <peavey@inspircd.org> | 2009-06-25 01:13:21 +0200 |
commit | 9478575520ed4ee5d36c4996522171cb35aab756 (patch) | |
tree | be316709feae5d8568dc0a07b10ed83af29b0d66 /src/map/storage.c | |
parent | 3c6a843e796541aa36008a291667bceabe00645e (diff) | |
download | tmwa-9478575520ed4ee5d36c4996522171cb35aab756.tar.gz tmwa-9478575520ed4ee5d36c4996522171cb35aab756.tar.bz2 tmwa-9478575520ed4ee5d36c4996522171cb35aab756.tar.xz tmwa-9478575520ed4ee5d36c4996522171cb35aab756.zip |
Improved storage saving, derived from ea stable.
Diffstat (limited to 'src/map/storage.c')
-rw-r--r-- | src/map/storage.c | 60 |
1 files changed, 44 insertions, 16 deletions
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; } |