mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-02 08:26:36 +00:00
[Base Data] Remove from shared memory and simplify (#4045)
* [Base Data] Remove from shared memory and simplify - Removes Base Data loading from shared memory and puts it into zone. - Changes type of `level` and `class` to `uint8_t` from `uint32_t` for consistency since we're renaming fields here anyway. - Renames `unk1` to `hp_regen` in `base_data` table. - Renames `unk2` to `end_regen` in `base_data` table. - These changed fields were already mapped, we just hadn't renamed them for whatever reason. - Regenerates Base Data repository. - Adds `#reload base_data` to reload base data in real time. * Cleanup * Update shareddb.h * Cleanup. * Update shareddb.cpp * Update main.cpp
This commit is contained in:
@@ -491,7 +491,6 @@ SET(repositories
|
||||
SET(common_headers
|
||||
additive_lagged_fibonacci_engine.h
|
||||
base_packet.h
|
||||
base_data.h
|
||||
bodytypes.h
|
||||
classes.h
|
||||
compression.h
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
/* EQEMu: Everquest Server Emulator
|
||||
Copyright (C) 2001-2013 EQEMu Development Team (http://eqemulator.net)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||
are required to give you total support for your newly bought product;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef __EQEMU_COMMON_BASE_DATA_H
|
||||
#define __EQEMU_COMMON_BASE_DATA_H
|
||||
|
||||
struct BaseDataStruct
|
||||
{
|
||||
double base_hp;
|
||||
double base_mana;
|
||||
double base_end;
|
||||
double hp_regen;
|
||||
double end_regen;
|
||||
double hp_factor;
|
||||
double mana_factor;
|
||||
double endurance_factor;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -5253,6 +5253,21 @@ MODIFY COLUMN `name` varchar(200) CHARACTER SET latin1 COLLATE latin1_swedish_ci
|
||||
ALTER TABLE `ground_spawns`
|
||||
ADD COLUMN `fix_z` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 AFTER `respawn_timer`;
|
||||
)"
|
||||
},
|
||||
ManifestEntry{
|
||||
.version = 9258,
|
||||
.description = "2024_02_04_base_data.sql",
|
||||
.check = "SHOW COLUMNS FROM `base_data` LIKE `hp_regen`",
|
||||
.condition = "empty",
|
||||
.match = "",
|
||||
.sql = R"(
|
||||
ALTER TABLE `base_data`
|
||||
CHANGE COLUMN `unk1` `hp_regen` double NOT NULL AFTER `end`,
|
||||
CHANGE COLUMN `unk2` `end_regen` double NOT NULL AFTER `hp_regen`,
|
||||
MODIFY COLUMN `level` tinyint(3) UNSIGNED NOT NULL FIRST,
|
||||
MODIFY COLUMN `class` tinyint(2) UNSIGNED NOT NULL AFTER `level`;
|
||||
)",
|
||||
.content_schema_update = true
|
||||
}
|
||||
// -- template; copy/paste this when you need to create a new entry
|
||||
// ManifestEntry{
|
||||
|
||||
@@ -19,16 +19,16 @@
|
||||
class BaseBaseDataRepository {
|
||||
public:
|
||||
struct BaseData {
|
||||
uint32_t level;
|
||||
uint32_t class_;
|
||||
double hp;
|
||||
double mana;
|
||||
double end;
|
||||
double unk1;
|
||||
double unk2;
|
||||
double hp_fac;
|
||||
double mana_fac;
|
||||
double end_fac;
|
||||
uint8_t level;
|
||||
uint8_t class_;
|
||||
double hp;
|
||||
double mana;
|
||||
double end;
|
||||
double hp_regen;
|
||||
double end_regen;
|
||||
double hp_fac;
|
||||
double mana_fac;
|
||||
double end_fac;
|
||||
};
|
||||
|
||||
static std::string PrimaryKey()
|
||||
@@ -44,8 +44,8 @@ public:
|
||||
"hp",
|
||||
"mana",
|
||||
"end",
|
||||
"unk1",
|
||||
"unk2",
|
||||
"hp_regen",
|
||||
"end_regen",
|
||||
"hp_fac",
|
||||
"mana_fac",
|
||||
"end_fac",
|
||||
@@ -60,8 +60,8 @@ public:
|
||||
"hp",
|
||||
"mana",
|
||||
"end",
|
||||
"unk1",
|
||||
"unk2",
|
||||
"hp_regen",
|
||||
"end_regen",
|
||||
"hp_fac",
|
||||
"mana_fac",
|
||||
"end_fac",
|
||||
@@ -105,16 +105,16 @@ public:
|
||||
{
|
||||
BaseData e{};
|
||||
|
||||
e.level = 0;
|
||||
e.class_ = 0;
|
||||
e.hp = 0;
|
||||
e.mana = 0;
|
||||
e.end = 0;
|
||||
e.unk1 = 0;
|
||||
e.unk2 = 0;
|
||||
e.hp_fac = 0;
|
||||
e.mana_fac = 0;
|
||||
e.end_fac = 0;
|
||||
e.level = 0;
|
||||
e.class_ = 0;
|
||||
e.hp = 0;
|
||||
e.mana = 0;
|
||||
e.end = 0;
|
||||
e.hp_regen = 0;
|
||||
e.end_regen = 0;
|
||||
e.hp_fac = 0;
|
||||
e.mana_fac = 0;
|
||||
e.end_fac = 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
@@ -151,16 +151,16 @@ public:
|
||||
if (results.RowCount() == 1) {
|
||||
BaseData e{};
|
||||
|
||||
e.level = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.class_ = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.hp = row[2] ? strtod(row[2], nullptr) : 0;
|
||||
e.mana = row[3] ? strtod(row[3], nullptr) : 0;
|
||||
e.end = row[4] ? strtod(row[4], nullptr) : 0;
|
||||
e.unk1 = row[5] ? strtod(row[5], nullptr) : 0;
|
||||
e.unk2 = row[6] ? strtod(row[6], nullptr) : 0;
|
||||
e.hp_fac = row[7] ? strtod(row[7], nullptr) : 0;
|
||||
e.mana_fac = row[8] ? strtod(row[8], nullptr) : 0;
|
||||
e.end_fac = row[9] ? strtod(row[9], nullptr) : 0;
|
||||
e.level = row[0] ? static_cast<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.class_ = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.hp = row[2] ? strtod(row[2], nullptr) : 0;
|
||||
e.mana = row[3] ? strtod(row[3], nullptr) : 0;
|
||||
e.end = row[4] ? strtod(row[4], nullptr) : 0;
|
||||
e.hp_regen = row[5] ? strtod(row[5], nullptr) : 0;
|
||||
e.end_regen = row[6] ? strtod(row[6], nullptr) : 0;
|
||||
e.hp_fac = row[7] ? strtod(row[7], nullptr) : 0;
|
||||
e.mana_fac = row[8] ? strtod(row[8], nullptr) : 0;
|
||||
e.end_fac = row[9] ? strtod(row[9], nullptr) : 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
@@ -199,8 +199,8 @@ public:
|
||||
v.push_back(columns[2] + " = " + std::to_string(e.hp));
|
||||
v.push_back(columns[3] + " = " + std::to_string(e.mana));
|
||||
v.push_back(columns[4] + " = " + std::to_string(e.end));
|
||||
v.push_back(columns[5] + " = " + std::to_string(e.unk1));
|
||||
v.push_back(columns[6] + " = " + std::to_string(e.unk2));
|
||||
v.push_back(columns[5] + " = " + std::to_string(e.hp_regen));
|
||||
v.push_back(columns[6] + " = " + std::to_string(e.end_regen));
|
||||
v.push_back(columns[7] + " = " + std::to_string(e.hp_fac));
|
||||
v.push_back(columns[8] + " = " + std::to_string(e.mana_fac));
|
||||
v.push_back(columns[9] + " = " + std::to_string(e.end_fac));
|
||||
@@ -230,8 +230,8 @@ public:
|
||||
v.push_back(std::to_string(e.hp));
|
||||
v.push_back(std::to_string(e.mana));
|
||||
v.push_back(std::to_string(e.end));
|
||||
v.push_back(std::to_string(e.unk1));
|
||||
v.push_back(std::to_string(e.unk2));
|
||||
v.push_back(std::to_string(e.hp_regen));
|
||||
v.push_back(std::to_string(e.end_regen));
|
||||
v.push_back(std::to_string(e.hp_fac));
|
||||
v.push_back(std::to_string(e.mana_fac));
|
||||
v.push_back(std::to_string(e.end_fac));
|
||||
@@ -269,8 +269,8 @@ public:
|
||||
v.push_back(std::to_string(e.hp));
|
||||
v.push_back(std::to_string(e.mana));
|
||||
v.push_back(std::to_string(e.end));
|
||||
v.push_back(std::to_string(e.unk1));
|
||||
v.push_back(std::to_string(e.unk2));
|
||||
v.push_back(std::to_string(e.hp_regen));
|
||||
v.push_back(std::to_string(e.end_regen));
|
||||
v.push_back(std::to_string(e.hp_fac));
|
||||
v.push_back(std::to_string(e.mana_fac));
|
||||
v.push_back(std::to_string(e.end_fac));
|
||||
@@ -307,16 +307,16 @@ public:
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
BaseData e{};
|
||||
|
||||
e.level = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.class_ = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.hp = row[2] ? strtod(row[2], nullptr) : 0;
|
||||
e.mana = row[3] ? strtod(row[3], nullptr) : 0;
|
||||
e.end = row[4] ? strtod(row[4], nullptr) : 0;
|
||||
e.unk1 = row[5] ? strtod(row[5], nullptr) : 0;
|
||||
e.unk2 = row[6] ? strtod(row[6], nullptr) : 0;
|
||||
e.hp_fac = row[7] ? strtod(row[7], nullptr) : 0;
|
||||
e.mana_fac = row[8] ? strtod(row[8], nullptr) : 0;
|
||||
e.end_fac = row[9] ? strtod(row[9], nullptr) : 0;
|
||||
e.level = row[0] ? static_cast<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.class_ = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.hp = row[2] ? strtod(row[2], nullptr) : 0;
|
||||
e.mana = row[3] ? strtod(row[3], nullptr) : 0;
|
||||
e.end = row[4] ? strtod(row[4], nullptr) : 0;
|
||||
e.hp_regen = row[5] ? strtod(row[5], nullptr) : 0;
|
||||
e.end_regen = row[6] ? strtod(row[6], nullptr) : 0;
|
||||
e.hp_fac = row[7] ? strtod(row[7], nullptr) : 0;
|
||||
e.mana_fac = row[8] ? strtod(row[8], nullptr) : 0;
|
||||
e.end_fac = row[9] ? strtod(row[9], nullptr) : 0;
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
@@ -341,16 +341,16 @@ public:
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
BaseData e{};
|
||||
|
||||
e.level = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.class_ = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.hp = row[2] ? strtod(row[2], nullptr) : 0;
|
||||
e.mana = row[3] ? strtod(row[3], nullptr) : 0;
|
||||
e.end = row[4] ? strtod(row[4], nullptr) : 0;
|
||||
e.unk1 = row[5] ? strtod(row[5], nullptr) : 0;
|
||||
e.unk2 = row[6] ? strtod(row[6], nullptr) : 0;
|
||||
e.hp_fac = row[7] ? strtod(row[7], nullptr) : 0;
|
||||
e.mana_fac = row[8] ? strtod(row[8], nullptr) : 0;
|
||||
e.end_fac = row[9] ? strtod(row[9], nullptr) : 0;
|
||||
e.level = row[0] ? static_cast<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.class_ = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.hp = row[2] ? strtod(row[2], nullptr) : 0;
|
||||
e.mana = row[3] ? strtod(row[3], nullptr) : 0;
|
||||
e.end = row[4] ? strtod(row[4], nullptr) : 0;
|
||||
e.hp_regen = row[5] ? strtod(row[5], nullptr) : 0;
|
||||
e.end_regen = row[6] ? strtod(row[6], nullptr) : 0;
|
||||
e.hp_fac = row[7] ? strtod(row[7], nullptr) : 0;
|
||||
e.mana_fac = row[8] ? strtod(row[8], nullptr) : 0;
|
||||
e.end_fac = row[9] ? strtod(row[9], nullptr) : 0;
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
@@ -430,8 +430,8 @@ public:
|
||||
v.push_back(std::to_string(e.hp));
|
||||
v.push_back(std::to_string(e.mana));
|
||||
v.push_back(std::to_string(e.end));
|
||||
v.push_back(std::to_string(e.unk1));
|
||||
v.push_back(std::to_string(e.unk2));
|
||||
v.push_back(std::to_string(e.hp_regen));
|
||||
v.push_back(std::to_string(e.end_regen));
|
||||
v.push_back(std::to_string(e.hp_fac));
|
||||
v.push_back(std::to_string(e.mana_fac));
|
||||
v.push_back(std::to_string(e.end_fac));
|
||||
@@ -462,8 +462,8 @@ public:
|
||||
v.push_back(std::to_string(e.hp));
|
||||
v.push_back(std::to_string(e.mana));
|
||||
v.push_back(std::to_string(e.end));
|
||||
v.push_back(std::to_string(e.unk1));
|
||||
v.push_back(std::to_string(e.unk2));
|
||||
v.push_back(std::to_string(e.hp_regen));
|
||||
v.push_back(std::to_string(e.end_regen));
|
||||
v.push_back(std::to_string(e.hp_fac));
|
||||
v.push_back(std::to_string(e.mana_fac));
|
||||
v.push_back(std::to_string(e.end_fac));
|
||||
|
||||
@@ -253,6 +253,7 @@
|
||||
#define ServerOP_ReloadDataBucketsCache 0x4125
|
||||
#define ServerOP_ReloadFactions 0x4126
|
||||
#define ServerOP_ReloadLoot 0x4127
|
||||
#define ServerOP_ReloadBaseData 0x4128
|
||||
|
||||
#define ServerOP_CZDialogueWindow 0x4500
|
||||
#define ServerOP_CZLDoNUpdate 0x4501
|
||||
|
||||
@@ -1974,117 +1974,6 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) {
|
||||
LoadDamageShieldTypes(sp, max_spells);
|
||||
}
|
||||
|
||||
int SharedDatabase::GetMaxBaseDataLevel() {
|
||||
const std::string query = "SELECT MAX(level) FROM base_data";
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (results.RowCount() == 0)
|
||||
return -1;
|
||||
|
||||
auto& row = results.begin();
|
||||
|
||||
return Strings::ToInt(row[0]);
|
||||
}
|
||||
|
||||
bool SharedDatabase::LoadBaseData(const std::string &prefix) {
|
||||
base_data_mmf.reset(nullptr);
|
||||
|
||||
try {
|
||||
const auto Config = EQEmuConfig::get();
|
||||
EQ::IPCMutex mutex("base_data");
|
||||
mutex.Lock();
|
||||
|
||||
std::string file_name = fmt::format("{}/{}{}", path.GetSharedMemoryPath(), prefix, std::string("base_data"));
|
||||
base_data_mmf = std::make_unique<EQ::MemoryMappedFile>(file_name);
|
||||
mutex.Unlock();
|
||||
|
||||
LogInfo("Loaded base data via shared memory");
|
||||
} catch(std::exception& ex) {
|
||||
LogError("Error Loading Base Data: {}", ex.what());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void SharedDatabase::LoadBaseData(void *data, int max_level) {
|
||||
char *base_ptr = static_cast<char*>(data);
|
||||
|
||||
const std::string query = "SELECT * FROM base_data ORDER BY level, class ASC";
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto& row = results.begin(); row != results.end(); ++row) {
|
||||
const int lvl = Strings::ToInt(row[0]);
|
||||
const int cl = Strings::ToInt(row[1]);
|
||||
|
||||
if(lvl <= 0) {
|
||||
LogError("Non fatal error: base_data.level <= 0, ignoring.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if(lvl >= max_level) {
|
||||
LogError("Non fatal error: base_data.level >= max_level, ignoring.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if(cl <= 0) {
|
||||
LogError("Non fatal error: base_data.cl <= 0, ignoring.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if(cl > 16) {
|
||||
LogError("Non fatal error: base_data.class > 16, ignoring.");
|
||||
continue;
|
||||
}
|
||||
|
||||
BaseDataStruct *bd = reinterpret_cast<BaseDataStruct*>(base_ptr + (((16 * (lvl - 1)) + (cl - 1)) * sizeof(BaseDataStruct)));
|
||||
bd->base_hp = Strings::ToFloat(row[2]);
|
||||
bd->base_mana = Strings::ToFloat(row[3]);
|
||||
bd->base_end = Strings::ToFloat(row[4]);
|
||||
bd->hp_regen = Strings::ToFloat(row[5]);
|
||||
bd->end_regen = Strings::ToFloat(row[6]);
|
||||
bd->hp_factor = Strings::ToFloat(row[7]);
|
||||
bd->mana_factor = Strings::ToFloat(row[8]);
|
||||
bd->endurance_factor = Strings::ToFloat(row[9]);
|
||||
}
|
||||
}
|
||||
|
||||
const BaseDataStruct* SharedDatabase::GetBaseData(int lvl, int cl) const
|
||||
{
|
||||
if(!base_data_mmf) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if(lvl <= 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if(cl <= 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if(cl > 16) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
char *base_ptr = static_cast<char*>(base_data_mmf->Get());
|
||||
|
||||
const uint32 offset = ((16 * (lvl - 1)) + (cl - 1)) * sizeof(BaseDataStruct);
|
||||
|
||||
if(offset >= base_data_mmf->Size()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const BaseDataStruct *bd = reinterpret_cast<BaseDataStruct*>(base_ptr + offset);
|
||||
return bd;
|
||||
}
|
||||
|
||||
void SharedDatabase::LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* message) {
|
||||
const std::string query = StringFormat("SELECT `inspect_message` FROM `character_inspect_messages` WHERE `id` = %u LIMIT 1", character_id);
|
||||
auto results = QueryDatabase(query);
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include "database.h"
|
||||
#include "skills.h"
|
||||
#include "spdat.h"
|
||||
#include "base_data.h"
|
||||
#include "fixed_memory_hash_set.h"
|
||||
#include "fixed_memory_variable_hash_set.h"
|
||||
#include "say_link.h"
|
||||
@@ -35,7 +34,6 @@
|
||||
#include <memory>
|
||||
|
||||
class EvolveInfo;
|
||||
struct BaseDataStruct;
|
||||
struct InspectMessage_Struct;
|
||||
struct PlayerProfile_Struct;
|
||||
struct SPDat_Spell_Struct;
|
||||
@@ -180,14 +178,6 @@ public:
|
||||
uint32 GetSharedSpellsCount() { return m_shared_spells_count; }
|
||||
uint32 GetSpellsCount();
|
||||
|
||||
/**
|
||||
* basedata
|
||||
*/
|
||||
int GetMaxBaseDataLevel();
|
||||
bool LoadBaseData(const std::string &prefix);
|
||||
void LoadBaseData(void *data, int max_level);
|
||||
const BaseDataStruct *GetBaseData(int lvl, int cl) const;
|
||||
|
||||
std::string CreateItemLink(uint32 item_id) const
|
||||
{
|
||||
EQ::SayLinkEngine linker;
|
||||
@@ -206,7 +196,6 @@ protected:
|
||||
std::unique_ptr<EQ::FixedMemoryHashSet<NPCFactionList>> faction_hash;
|
||||
std::unique_ptr<EQ::MemoryMappedFile> faction_associations_mmf;
|
||||
std::unique_ptr<EQ::FixedMemoryHashSet<FactionAssociations>> faction_associations_hash;
|
||||
std::unique_ptr<EQ::MemoryMappedFile> base_data_mmf;
|
||||
std::unique_ptr<EQ::MemoryMappedFile> spells_mmf;
|
||||
|
||||
public:
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@
|
||||
* Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
||||
*/
|
||||
|
||||
#define CURRENT_BINARY_DATABASE_VERSION 9257
|
||||
#define CURRENT_BINARY_DATABASE_VERSION 9258
|
||||
|
||||
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9042
|
||||
|
||||
|
||||
Reference in New Issue
Block a user