diff options
author | ultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2008-07-13 16:14:32 +0000 |
---|---|---|
committer | ultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2008-07-13 16:14:32 +0000 |
commit | fb45ace1b19f98add7e1d0a0fc6fe45bc1ebac63 (patch) | |
tree | 52b66f102c20e6b47e060efe0e7ceabd36d5aa29 /src/char | |
parent | 2e7ba13554118cdc78c9bfa5a6f0e5e8e58baf7b (diff) | |
download | hercules-fb45ace1b19f98add7e1d0a0fc6fe45bc1ebac63.tar.gz hercules-fb45ace1b19f98add7e1d0a0fc6fe45bc1ebac63.tar.bz2 hercules-fb45ace1b19f98add7e1d0a0fc6fe45bc1ebac63.tar.xz hercules-fb45ace1b19f98add7e1d0a0fc6fe45bc1ebac63.zip |
Modified storage data loading
* storage is now loaded/saved along with character status
* as a consequence, a lot of storage handling code was removed
* there is no more locking done within storage data
* mapservers no longer cache the data (solves muiltimapserver exploit)
* loading storage on char select may decrease charserver performance
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@12950 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/char')
-rw-r--r-- | src/char/char.c | 6 | ||||
-rw-r--r-- | src/char/int_storage.c | 73 | ||||
-rw-r--r-- | src/char/int_storage.h | 3 |
3 files changed, 29 insertions, 53 deletions
diff --git a/src/char/char.c b/src/char/char.c index c57ba86fa..19887b737 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -1003,6 +1003,8 @@ int mmo_char_init(void) ret = mmo_char_fromstr(line, &char_dat[char_num].status, char_dat[char_num].global, &char_dat[char_num].global_num); + // load storage + storage_load(char_dat[char_num].status.account_id, &char_dat[char_num].status.storage); // Initialize friends list parse_friend_txt(&char_dat[char_num].status); // Grab friends for the character // Initialize hotkey list @@ -2774,7 +2776,11 @@ int parse_frommap(int fd) break; } if (i != char_num) + { memcpy(&char_dat[i].status, RFIFOP(fd,13), sizeof(struct mmo_charstatus)); + storage_save(char_dat[i].status.account_id, &char_dat[i].status.storage); + } + if (RFIFOB(fd,12)) { //Flag, set character offline. [Skotlex] set_char_offline(RFIFOL(fd,8),RFIFOL(fd,4)); diff --git a/src/char/int_storage.c b/src/char/int_storage.c index a1b4d33f1..d2e1f0403 100644 --- a/src/char/int_storage.c +++ b/src/char/int_storage.c @@ -32,7 +32,7 @@ int storage_tostr(char* str, struct storage_data* p) { int i,j,f=0; char *str_p = str; - str_p += sprintf(str_p,"%d,%d\t",p->account_id,p->storage_amount); + str_p += sprintf(str_p, "%d,%d\t", p->account_id, p->storage_amount); for(i=0;i<MAX_STORAGE;i++) if( (p->items[i].nameid) && (p->items[i].amount) ) @@ -176,7 +176,7 @@ static void* create_storage(DBKey key, va_list args) // アカウントから倉庫データインデックスを得る(新規倉庫追加可能) struct storage_data *account2storage(int account_id) { - return (struct storage_data*)idb_ensure(storage_db, account_id, create_storage); + return (struct storage_data*)idb_get(storage_db, account_id); } static void* create_guildstorage(DBKey key, va_list args) { @@ -194,6 +194,24 @@ struct guild_storage *guild2storage(int guild_id) return gs; } +// loads storage data into the provided data structure +bool storage_load(int account_id, struct storage_data* storage) +{ + struct storage_data* s = account2storage(account_id); + if( s != NULL ) + memcpy(storage, s, sizeof(struct storage_data)); + return( s != NULL ); +} + +// writes provided data into storage cache +bool storage_save(int account_id, struct storage_data* storage) +{ + struct storage_data* s = account2storage(account_id); + if( s != NULL ) + memcpy(s, storage, sizeof(struct storage_data)); + return( s != NULL ); +} + //--------------------------------------------------------- // 倉庫データを読み込む int inter_storage_init() @@ -359,29 +377,6 @@ int inter_guild_storage_delete(int guild_id) //--------------------------------------------------------- // map serverへの通信 -// 倉庫データの送信 -int mapif_load_storage(int fd,int account_id) -{ - struct storage_data *s=account2storage(account_id); - WFIFOHEAD(fd, sizeof(struct storage_data)+8); - WFIFOW(fd,0)=0x3810; - WFIFOW(fd,2)=sizeof(struct storage_data)+8; - WFIFOL(fd,4)=account_id; - memcpy(WFIFOP(fd,8),s,sizeof(struct storage_data)); - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; -} -// 倉庫データ保存完了送信 -int mapif_save_storage_ack(int fd,int account_id) -{ - WFIFOHEAD(fd,7); - WFIFOW(fd,0)=0x3811; - WFIFOL(fd,2)=account_id; - WFIFOB(fd,6)=0; - WFIFOSET(fd,7); - return 0; -} - int mapif_load_guild_storage(int fd,int account_id,int guild_id) { struct guild_storage *gs=guild2storage(guild_id); @@ -417,32 +412,6 @@ int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail) //--------------------------------------------------------- // map serverからの通信 -// 倉庫データ要求受信 -int mapif_parse_LoadStorage(int fd) -{ - RFIFOHEAD(fd); - mapif_load_storage(fd,RFIFOL(fd,2)); - return 0; -} -// 倉庫データ受信&保存 -int mapif_parse_SaveStorage(int fd) -{ - struct storage_data *s; - int account_id, len; - RFIFOHEAD(fd); - account_id=RFIFOL(fd,4); - len=RFIFOW(fd,2); - if(sizeof(struct storage_data)!=len-8){ - ShowError("inter storage: data size error %d %d\n",sizeof(struct storage_data),len-8); - } - else { - s=account2storage(account_id); - memcpy(s,RFIFOP(fd,8),sizeof(struct storage_data)); - mapif_save_storage_ack(fd,account_id); - } - return 0; -} - int mapif_parse_LoadGuildStorage(int fd) { RFIFOHEAD(fd); @@ -481,8 +450,6 @@ int inter_storage_parse_frommap(int fd) { RFIFOHEAD(fd); switch(RFIFOW(fd,0)){ - case 0x3010: mapif_parse_LoadStorage(fd); break; - case 0x3011: mapif_parse_SaveStorage(fd); break; case 0x3018: mapif_parse_LoadGuildStorage(fd); break; case 0x3019: mapif_parse_SaveGuildStorage(fd); break; default: diff --git a/src/char/int_storage.h b/src/char/int_storage.h index 44054079a..79e436093 100644 --- a/src/char/int_storage.h +++ b/src/char/int_storage.h @@ -22,4 +22,7 @@ extern char guild_storage_txt[1024]; int storage_fromstr(char *str,struct storage_data *p); int guild_storage_fromstr(char *str,struct guild_storage *p); +bool storage_load(int account_id, struct storage_data* storage); +bool storage_save(int account_id, struct storage_data* storage); + #endif /* _INT_STORAGE_H_ */ |