summaryrefslogtreecommitdiff
path: root/src/map/storage.c
diff options
context:
space:
mode:
authorDennis Friis <peavey@inspircd.org>2009-06-25 00:49:36 +0200
committerDennis Friis <peavey@inspircd.org>2009-06-25 01:13:21 +0200
commit9478575520ed4ee5d36c4996522171cb35aab756 (patch)
treebe316709feae5d8568dc0a07b10ed83af29b0d66 /src/map/storage.c
parent3c6a843e796541aa36008a291667bceabe00645e (diff)
downloadtmwa-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.c60
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;
}