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:
parent
46d9d3f87b
commit
2110a6ead8
@ -3540,9 +3540,10 @@ static void intif_parse_StorageSaved(int fd)
|
|||||||
//ShowInfo("Inventory has been saved (AID: %d).\n", RFIFOL(fd, 2));
|
//ShowInfo("Inventory has been saved (AID: %d).\n", RFIFOL(fd, 2));
|
||||||
break;
|
break;
|
||||||
case TABLE_STORAGE: //storage
|
case TABLE_STORAGE: //storage
|
||||||
//ShowInfo("Storage has been saved (AID: %d).\n", RFIFOL(fd, 2));
|
//if (RFIFOB(fd, 8))
|
||||||
if (RFIFOB(fd, 8))
|
// ShowInfo("Storage %d has been saved (AID: %d).\n", RFIFOL(fd, 2), RFIFOB(fd, 8) );
|
||||||
storage_premiumStorage_saved(map_id2sd(RFIFOL(fd, 2)));
|
//else
|
||||||
|
// ShowInfo("Storage has been saved (AID: %d).\n", RFIFOL(fd, 2));
|
||||||
break;
|
break;
|
||||||
case TABLE_CART: // cart
|
case TABLE_CART: // cart
|
||||||
//ShowInfo("Cart has been saved (AID: %d).\n", RFIFOL(fd, 2));
|
//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
|
* Receive storage information
|
||||||
**/
|
**/
|
||||||
void intif_parse_StorageInfo_recv(int fd) {
|
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;
|
storage_db.clear();
|
||||||
if (storage_db)
|
|
||||||
aFree(storage_db);
|
|
||||||
storage_db = NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for( int i = 0; i < count; i++ ){
|
||||||
RECREATE(storage_db, struct s_storage_table, storage_count+1);
|
struct s_storage_table* ptr = (struct s_storage_table*)RFIFOP( fd, 4 + size * i );
|
||||||
memcpy(&storage_db[storage_count], RFIFOP(fd, 4 + size * i), size);
|
std::shared_ptr<struct s_storage_table> storage = std::make_shared<struct s_storage_table>();
|
||||||
storage_count++;
|
|
||||||
|
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)
|
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "../common/cbasetypes.hpp"
|
#include "../common/cbasetypes.hpp"
|
||||||
#include "../common/malloc.hpp"
|
|
||||||
#include "../common/nullpo.hpp"
|
#include "../common/nullpo.hpp"
|
||||||
#include "../common/showmsg.hpp"
|
#include "../common/showmsg.hpp"
|
||||||
#include "../common/utilities.hpp"
|
#include "../common/utilities.hpp"
|
||||||
@ -28,26 +27,23 @@
|
|||||||
|
|
||||||
using namespace rathena;
|
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
|
///Databases of guild_storage : int guild_id -> struct guild_storage
|
||||||
std::map<int, struct s_storage> guild_storage_db;
|
std::map<int, struct s_storage> guild_storage_db;
|
||||||
|
|
||||||
struct s_storage_table *storage_db;
|
|
||||||
int storage_count;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get storage name
|
* Get storage name
|
||||||
* @param id Storage ID
|
* @param id Storage ID
|
||||||
* @return Storage name or "Storage" if not found
|
* @return Storage name or "Storage" if not found
|
||||||
* @author [Cydh]
|
|
||||||
**/
|
**/
|
||||||
const char *storage_getName(uint8 id) {
|
const char *storage_getName(uint8 id) {
|
||||||
if (storage_db && storage_count) {
|
std::shared_ptr<struct s_storage_table> storage = util::umap_find( storage_db, (uint16)id );
|
||||||
int i;
|
|
||||||
for (i = 0; i < storage_count; i++) {
|
if( storage ){
|
||||||
if (&storage_db[i] && storage_db[i].id == id && storage_db[i].name[0])
|
return storage->name;
|
||||||
return storage_db[i].name;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return "Storage";
|
return "Storage";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,14 +53,7 @@ const char *storage_getName(uint8 id) {
|
|||||||
* @return True:Valid, False:Invalid
|
* @return True:Valid, False:Invalid
|
||||||
**/
|
**/
|
||||||
bool storage_exists(uint8 id) {
|
bool storage_exists(uint8 id) {
|
||||||
if (storage_db && storage_count) {
|
return util::umap_find( storage_db, (uint16)id ) != nullptr;
|
||||||
int i;
|
|
||||||
for (i = 0; i < storage_count; i++) {
|
|
||||||
if (storage_db[i].id == id)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -109,8 +98,6 @@ void storage_sortitem(struct item* items, unsigned int size)
|
|||||||
*/
|
*/
|
||||||
void do_init_storage(void)
|
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)
|
void do_final_storage(void)
|
||||||
{
|
{
|
||||||
guild_storage_db.clear();
|
guild_storage_db.clear();
|
||||||
if (storage_db)
|
storage_db.clear();
|
||||||
aFree(storage_db);
|
|
||||||
storage_db = NULL;
|
|
||||||
storage_count = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -132,7 +116,7 @@ void do_final_storage(void)
|
|||||||
* @author [Skotlex]
|
* @author [Skotlex]
|
||||||
*/
|
*/
|
||||||
void do_reconnect_storage(void){
|
void do_reconnect_storage(void){
|
||||||
for( auto entry : guild_storage_db ){
|
for( const auto& entry : guild_storage_db ){
|
||||||
struct s_storage stor = entry.second;
|
struct s_storage stor = entry.second;
|
||||||
|
|
||||||
// Save closed storages.
|
// Save closed storages.
|
||||||
@ -479,23 +463,6 @@ void storage_storagesave(struct map_session_data *sd)
|
|||||||
intif_storage_save(sd, &sd->storage);
|
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
|
* Make player close his storage
|
||||||
* @param sd: Player who has the 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);
|
chrif_save(sd, CSAVE_INVENTORY|CSAVE_CART);
|
||||||
else
|
else
|
||||||
storage_storagesave(sd);
|
storage_storagesave(sd);
|
||||||
if (sd->state.storage_flag == 1) {
|
}
|
||||||
sd->state.storage_flag = 0;
|
|
||||||
clif_storageclose(sd);
|
if( sd->state.storage_flag == 1 ){
|
||||||
}
|
sd->state.storage_flag = 0;
|
||||||
} else
|
clif_storageclose( sd );
|
||||||
storage_storagesaved(sd);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1200,22 +1167,6 @@ void storage_premiumStorage_save(struct map_session_data *sd) {
|
|||||||
intif_storage_save(sd, &sd->premiumStorage);
|
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
|
* Request to close premium storage
|
||||||
* @param sd Player who has the 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)
|
if (save_settings&CHARSAVE_STORAGE)
|
||||||
chrif_save(sd, CSAVE_INVENTORY|CSAVE_CART);
|
chrif_save(sd, CSAVE_INVENTORY|CSAVE_CART);
|
||||||
else
|
else
|
||||||
storage_premiumStorage_save(sd);
|
storage_premiumStorage_save(sd);
|
||||||
if (sd->state.storage_flag == 3) {
|
}
|
||||||
sd->state.storage_flag = 0;
|
|
||||||
clif_storageclose(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
|
* @param sd Player who has the storage
|
||||||
* @author [Cydh]
|
* @author [Cydh]
|
||||||
**/
|
**/
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
#ifndef STORAGE_HPP
|
#ifndef STORAGE_HPP
|
||||||
#define STORAGE_HPP
|
#define STORAGE_HPP
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "../common/cbasetypes.hpp"
|
#include "../common/cbasetypes.hpp"
|
||||||
@ -13,8 +15,7 @@ struct s_storage;
|
|||||||
struct item;
|
struct item;
|
||||||
struct map_session_data;
|
struct map_session_data;
|
||||||
|
|
||||||
extern struct s_storage_table *storage_db;
|
extern std::unordered_map<uint16, std::shared_ptr<struct s_storage_table>> storage_db;
|
||||||
extern int storage_count;
|
|
||||||
|
|
||||||
enum e_storage_add {
|
enum e_storage_add {
|
||||||
STORAGE_ADD_OK,
|
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);
|
void storage_premiumStorage_open(struct map_session_data *sd);
|
||||||
bool storage_premiumStorage_load(struct map_session_data *sd, uint8 num, uint8 mode);
|
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_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_close(struct map_session_data *sd);
|
||||||
void storage_premiumStorage_quit(struct map_session_data *sd);
|
void storage_premiumStorage_quit(struct map_session_data *sd);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user