Turned storage_db into an unordered_map (#6038)

Fixed some inconsistent behaviors between normal and premium storages.

Thanks to @limitro
This commit is contained in:
Lemongrass3110 2021-07-01 09:09:45 +02:00 committed by GitHub
parent 46d9d3f87b
commit 2110a6ead8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 89 deletions

View File

@ -3540,9 +3540,10 @@ static void intif_parse_StorageSaved(int fd)
//ShowInfo("Inventory has been saved (AID: %d).\n", RFIFOL(fd, 2));
break;
case TABLE_STORAGE: //storage
//ShowInfo("Storage has been saved (AID: %d).\n", RFIFOL(fd, 2));
if (RFIFOB(fd, 8))
storage_premiumStorage_saved(map_id2sd(RFIFOL(fd, 2)));
//if (RFIFOB(fd, 8))
// ShowInfo("Storage %d has been saved (AID: %d).\n", RFIFOL(fd, 2), RFIFOB(fd, 8) );
//else
// ShowInfo("Storage has been saved (AID: %d).\n", RFIFOL(fd, 2));
break;
case TABLE_CART: // cart
//ShowInfo("Cart has been saved (AID: %d).\n", RFIFOL(fd, 2));
@ -3566,21 +3567,24 @@ static void intif_parse_StorageSaved(int fd)
* Receive storage information
**/
void intif_parse_StorageInfo_recv(int fd) {
int i, size = sizeof(struct s_storage_table), count = (RFIFOW(fd, 2) - 4) / size;
int size = sizeof(struct s_storage_table), count = (RFIFOW(fd, 2) - 4) / size;
storage_count = 0;
if (storage_db)
aFree(storage_db);
storage_db = NULL;
storage_db.clear();
for (i = 0; i < count; i++) {
RECREATE(storage_db, struct s_storage_table, storage_count+1);
memcpy(&storage_db[storage_count], RFIFOP(fd, 4 + size * i), size);
storage_count++;
for( int i = 0; i < count; i++ ){
struct s_storage_table* ptr = (struct s_storage_table*)RFIFOP( fd, 4 + size * i );
std::shared_ptr<struct s_storage_table> storage = std::make_shared<struct s_storage_table>();
safestrncpy( storage->name, ptr->name, sizeof( storage->name ) );
safestrncpy( storage->table, ptr->table, sizeof( storage->table ) );
storage->max_num = ptr->max_num;
storage->id = ptr->id;
storage_db[storage->id] = storage;
}
if (battle_config.etc_log)
ShowInfo("Received '" CL_WHITE "%d" CL_RESET "' storage info from inter-server.\n", storage_count);
ShowInfo("Received '" CL_WHITE PRIdPTR CL_RESET "' storage info from inter-server.\n", storage_db.size());
}
/**

View File

@ -9,7 +9,6 @@
#include <string.h>
#include "../common/cbasetypes.hpp"
#include "../common/malloc.hpp"
#include "../common/nullpo.hpp"
#include "../common/showmsg.hpp"
#include "../common/utilities.hpp"
@ -28,26 +27,23 @@
using namespace rathena;
std::unordered_map<uint16, std::shared_ptr<struct s_storage_table>> storage_db;
///Databases of guild_storage : int guild_id -> struct guild_storage
std::map<int, struct s_storage> guild_storage_db;
struct s_storage_table *storage_db;
int storage_count;
/**
* Get storage name
* @param id Storage ID
* @return Storage name or "Storage" if not found
* @author [Cydh]
**/
const char *storage_getName(uint8 id) {
if (storage_db && storage_count) {
int i;
for (i = 0; i < storage_count; i++) {
if (&storage_db[i] && storage_db[i].id == id && storage_db[i].name[0])
return storage_db[i].name;
}
std::shared_ptr<struct s_storage_table> storage = util::umap_find( storage_db, (uint16)id );
if( storage ){
return storage->name;
}
return "Storage";
}
@ -57,14 +53,7 @@ const char *storage_getName(uint8 id) {
* @return True:Valid, False:Invalid
**/
bool storage_exists(uint8 id) {
if (storage_db && storage_count) {
int i;
for (i = 0; i < storage_count; i++) {
if (storage_db[i].id == id)
return true;
}
}
return false;
return util::umap_find( storage_db, (uint16)id ) != nullptr;
}
/**
@ -109,8 +98,6 @@ void storage_sortitem(struct item* items, unsigned int size)
*/
void do_init_storage(void)
{
storage_db = NULL;
storage_count = 0;
}
/**
@ -121,10 +108,7 @@ void do_init_storage(void)
void do_final_storage(void)
{
guild_storage_db.clear();
if (storage_db)
aFree(storage_db);
storage_db = NULL;
storage_count = 0;
storage_db.clear();
}
/**
@ -132,7 +116,7 @@ void do_final_storage(void)
* @author [Skotlex]
*/
void do_reconnect_storage(void){
for( auto entry : guild_storage_db ){
for( const auto& entry : guild_storage_db ){
struct s_storage stor = entry.second;
// Save closed storages.
@ -479,23 +463,6 @@ void storage_storagesave(struct map_session_data *sd)
intif_storage_save(sd, &sd->storage);
}
/**
* Ack of storage has been saved
* @param sd: Player who has the storage
*/
void storage_storagesaved(struct map_session_data *sd)
{
if (!sd)
return;
sd->storage.dirty = false;
if (sd->state.storage_flag == 1) {
sd->state.storage_flag = 0;
clif_storageclose(sd);
}
}
/**
* Make player close his storage
* @param sd: Player who has the storage
@ -510,12 +477,12 @@ void storage_storageclose(struct map_session_data *sd)
chrif_save(sd, CSAVE_INVENTORY|CSAVE_CART);
else
storage_storagesave(sd);
if (sd->state.storage_flag == 1) {
sd->state.storage_flag = 0;
clif_storageclose(sd);
}
} else
storage_storagesaved(sd);
}
if( sd->state.storage_flag == 1 ){
sd->state.storage_flag = 0;
clif_storageclose( sd );
}
}
/**
@ -1200,22 +1167,6 @@ void storage_premiumStorage_save(struct map_session_data *sd) {
intif_storage_save(sd, &sd->premiumStorage);
}
/**
* Ack of secondary premium has been saved
* @param sd Player who has the storage
**/
void storage_premiumStorage_saved(struct map_session_data *sd) {
if (!sd)
return;
sd->premiumStorage.dirty = 0;
if (sd->state.storage_flag == 3) {
sd->state.storage_flag = 0;
clif_storageclose(sd);
}
}
/**
* Request to close premium storage
* @param sd Player who has the storage
@ -1228,18 +1179,17 @@ void storage_premiumStorage_close(struct map_session_data *sd) {
if (save_settings&CHARSAVE_STORAGE)
chrif_save(sd, CSAVE_INVENTORY|CSAVE_CART);
else
storage_premiumStorage_save(sd);
if (sd->state.storage_flag == 3) {
sd->state.storage_flag = 0;
clif_storageclose(sd);
}
storage_premiumStorage_save(sd);
}
if( sd->state.storage_flag == 3 ){
sd->state.storage_flag = 0;
clif_storageclose( sd );
}
else
storage_premiumStorage_saved(sd);
}
/**
* Force save then close the premium storage
* Force save the premium storage
* @param sd Player who has the storage
* @author [Cydh]
**/

View File

@ -4,6 +4,8 @@
#ifndef STORAGE_HPP
#define STORAGE_HPP
#include <memory>
#include <unordered_map>
#include <vector>
#include "../common/cbasetypes.hpp"
@ -13,8 +15,7 @@ struct s_storage;
struct item;
struct map_session_data;
extern struct s_storage_table *storage_db;
extern int storage_count;
extern std::unordered_map<uint16, std::shared_ptr<struct s_storage_table>> storage_db;
enum e_storage_add {
STORAGE_ADD_OK,
@ -86,7 +87,6 @@ void storage_guild_storagesaved(int guild_id); //Ack from char server that guild
void storage_premiumStorage_open(struct map_session_data *sd);
bool storage_premiumStorage_load(struct map_session_data *sd, uint8 num, uint8 mode);
void storage_premiumStorage_save(struct map_session_data *sd);
void storage_premiumStorage_saved(struct map_session_data *sd);
void storage_premiumStorage_close(struct map_session_data *sd);
void storage_premiumStorage_quit(struct map_session_data *sd);