mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-17 07:18:37 +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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user