[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:
Alex King
2024-02-05 18:11:20 -05:00
committed by GitHub
parent b6b779723e
commit 8edf7a07e3
24 changed files with 213 additions and 381 deletions
+1
View File
@@ -160,6 +160,7 @@ SET(zone_sources
zone.cpp
zone_config.cpp
zonedb.cpp
zone_base_data.cpp
zone_event_scheduler.cpp
zone_npc_factions.cpp
zone_reload.cpp
+11
View File
@@ -9087,6 +9087,7 @@ void Client::ShowDevToolsMenu()
*/
menu_reload_one += Saylink::Silent("#reload aa", "AAs");
menu_reload_one += " | " + Saylink::Silent("#reload alternate_currencies", "Alternate Currencies");
menu_reload_one += " | " + Saylink::Silent("#reload base_data", "Base Data");
menu_reload_one += " | " + Saylink::Silent("#reload blocked_spells", "Blocked Spells");
menu_reload_two += Saylink::Silent("#reload commands", "Commands");
@@ -11019,6 +11020,16 @@ void Client::SendReloadCommandMessages() {
).c_str()
);
auto base_data_link = Saylink::Silent("#reload base_data");
Message(
Chat::White,
fmt::format(
"Usage: {} - Reloads Base Data globally",
base_data_link
).c_str()
);
auto blocked_spells_link = Saylink::Silent("#reload blocked_spells");
Message(
+19 -20
View File
@@ -237,9 +237,10 @@ int64 Client::CalcHPRegen(bool bCombat)
item_regen += aabonuses.HPRegen;
int64 base = 0;
auto base_data = database.GetBaseData(GetLevel(), GetClass());
if (base_data)
base = static_cast<int>(base_data->hp_regen);
auto base_data = zone->GetBaseData(GetLevel(), GetClass());
if (base_data.level == GetLevel()) {
base = static_cast<int>(base_data.hp_regen);
}
auto level = GetLevel();
bool skip_innate = false;
@@ -486,9 +487,9 @@ int64 Client::CalcBaseHP()
stats += 255;
}
base_hp = 5;
auto base_data = database.GetBaseData(GetLevel(), GetClass());
if (base_data) {
base_hp += base_data->base_hp + (base_data->hp_factor * stats);
auto base_data = zone->GetBaseData(GetLevel(), GetClass());
if (base_data.level == GetLevel()) {
base_hp += base_data.hp + (base_data.hp_fac * stats);
base_hp += itembonuses.heroic_max_hp;
}
}
@@ -575,10 +576,9 @@ int64 Client::CalcBaseMana()
}
ConvertedWisInt = (3 * over200 - 300) / 2 + over200;
}
auto base_data = database.GetBaseData(GetLevel(), GetClass());
if (base_data) {
max_m = base_data->base_mana +
(ConvertedWisInt * base_data->mana_factor) + itembonuses.heroic_max_mana;
auto base_data = zone->GetBaseData(GetLevel(), GetClass());
if (base_data.level == GetLevel()) {
max_m = base_data.mana + (ConvertedWisInt * base_data.mana_fac) + itembonuses.heroic_max_mana;
}
}
else {
@@ -608,10 +608,9 @@ int64 Client::CalcBaseMana()
}
ConvertedWisInt = (3 * over200 - 300) / 2 + over200;
}
auto base_data = database.GetBaseData(GetLevel(), GetClass());
if (base_data) {
max_m = base_data->base_mana +
(ConvertedWisInt * base_data->mana_factor) + itembonuses.heroic_max_mana;
auto base_data = zone->GetBaseData(GetLevel(), GetClass());
if (base_data.level == GetLevel()) {
max_m = base_data.mana + (ConvertedWisInt * base_data.mana_fac) + itembonuses.heroic_max_mana;
}
}
else {
@@ -1639,9 +1638,9 @@ int64 Client::CalcBaseEndurance()
else if (stats > 100.0f) {
stats = 2.5f * (stats - 100.0f) + 100.0f;
}
auto base_data = database.GetBaseData(GetLevel(), GetClass());
if (base_data) {
base_end = base_data->base_end + itembonuses.heroic_max_end + (base_data->endurance_factor * static_cast<int>(stats));
auto base_data = zone->GetBaseData(GetLevel(), GetClass());
if (base_data.level == GetLevel()) {
base_end = base_data.end + itembonuses.heroic_max_end + (base_data.end_fac * static_cast<int>(stats));
}
}
else {
@@ -1676,9 +1675,9 @@ int64 Client::CalcEnduranceRegen(bool bCombat)
{
int64 base = 0;
if (!IsStarved()) {
auto base_data = database.GetBaseData(GetLevel(), GetClass());
if (base_data) {
base = static_cast<int>(base_data->end_regen);
auto base_data = zone->GetBaseData(GetLevel(), GetClass());
if (base_data.level == GetLevel()) {
base = static_cast<int>(base_data.end_regen);
if (!auto_attack && base > 0)
base += base / 2;
}
+5
View File
@@ -15,6 +15,7 @@ void command_reload(Client *c, const Seperator *sep)
bool is_rq_alias = sep->arg[0] && Strings::Contains(command, "#rq");
bool is_aa = !strcasecmp(sep->arg[1], "aa");
bool is_alternate_currencies = !strcasecmp(sep->arg[1], "alternate_currencies");
bool is_base_data = !strcasecmp(sep->arg[1], "base_data");
bool is_blocked_spells = !strcasecmp(sep->arg[1], "blocked_spells");
bool is_commands = !strcasecmp(sep->arg[1], "commands");
bool is_content_flags = !strcasecmp(sep->arg[1], "content_flags");
@@ -46,6 +47,7 @@ void command_reload(Client *c, const Seperator *sep)
if (
!is_aa &&
!is_alternate_currencies &&
!is_base_data &&
!is_blocked_spells &&
!is_commands &&
!is_content_flags &&
@@ -86,6 +88,9 @@ void command_reload(Client *c, const Seperator *sep)
} else if (is_alternate_currencies) {
c->Message(Chat::White, "Attempting to reload Alternate Currencies globally.");
pack = new ServerPacket(ServerOP_ReloadAlternateCurrencies, 0);
} else if (is_base_data) {
c->Message(Chat::White, "Attempting to reload Base Data globally.");
pack = new ServerPacket(ServerOP_ReloadBaseData, 0);
} else if (is_blocked_spells) {
c->Message(Chat::White, "Attempting to reload Blocked Spells globally.");
pack = new ServerPacket(ServerOP_ReloadBlockedSpells, 0);
-5
View File
@@ -381,11 +381,6 @@ int main(int argc, char **argv)
return 1;
}
if (!database.LoadBaseData(hotfix_name)) {
LogError("Loading base data failed!");
return 1;
}
guild_mgr.LoadGuilds();
content_db.LoadFactionData();
title_manager.LoadTitles();
+9 -5
View File
@@ -1957,6 +1957,15 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
}
break;
}
case ServerOP_ReloadBaseData:
{
if (zone && zone->IsLoaded()) {
zone->SendReloadMessage("Base Data");
zone->ReloadBaseData();
}
break;
}
case ServerOP_ReloadBlockedSpells:
{
if (zone && zone->IsLoaded()) {
@@ -3525,11 +3534,6 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
if (!content_db.LoadSpells(hotfix_name, &SPDAT_RECORDS, &spells)) {
LogError("Loading spells failed!");
}
LogInfo("Loading base data");
if (!content_db.LoadBaseData(hotfix_name)) {
LogError("Loading base data failed!");
}
break;
}
case ServerOP_CZClientMessageString:
+2
View File
@@ -1177,6 +1177,8 @@ bool Zone::Init(bool is_static) {
content_db.LoadGlobalLoot();
LoadBaseData();
//Load merchant data
LoadMerchants();
+10
View File
@@ -45,6 +45,7 @@
#include "../common/repositories/loottable_entries_repository.h"
#include "../common/repositories/lootdrop_repository.h"
#include "../common/repositories/lootdrop_entries_repository.h"
#include "../common/repositories/base_data_repository.h"
struct EXPModifier
{
@@ -439,6 +440,12 @@ public:
LootdropRepository::Lootdrop GetLootdrop(const uint32 lootdrop_id) const;
std::vector<LootdropEntriesRepository::LootdropEntries> GetLootdropEntries(const uint32 lootdrop_id) const;
// Base Data
inline void ClearBaseData() { m_base_data.clear(); };
BaseDataRepository::BaseData GetBaseData(uint8 level, uint8 class_id);
void LoadBaseData();
void ReloadBaseData();
private:
bool allow_mercs;
bool can_bind;
@@ -499,6 +506,9 @@ private:
std::vector<LoottableEntriesRepository::LoottableEntries> m_loottable_entries = {};
std::vector<LootdropRepository::Lootdrop> m_lootdrops = {};
std::vector<LootdropEntriesRepository::LootdropEntries> m_lootdrop_entries = {};
// Base Data
std::vector<BaseDataRepository::BaseData> m_base_data = { };
};
#endif
+39
View File
@@ -0,0 +1,39 @@
#include "zone.h"
BaseDataRepository::BaseData Zone::GetBaseData(uint8 level, uint8 class_id)
{
for (const auto& e : m_base_data) {
if (e.level == level && e.class_ == class_id) {
return e;
}
}
return BaseDataRepository::NewEntity();
}
void Zone::LoadBaseData()
{
const auto& l = BaseDataRepository::All(content_db);
m_base_data.reserve(l.size());
for (const auto& e : l) {
if (e.level < 1 || !IsPlayerClass(e.class_)) {
continue;
}
m_base_data.emplace_back(e);
}
LogInfo(
"Loaded [{}] Base Data Entr{}",
l.size(),
l.size() != 1 ? "ies" : "y"
);
}
void Zone::ReloadBaseData()
{
ClearBaseData();
LoadBaseData();
}