mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-03 09: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:
@@ -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
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -1177,6 +1177,8 @@ bool Zone::Init(bool is_static) {
|
||||
|
||||
content_db.LoadGlobalLoot();
|
||||
|
||||
LoadBaseData();
|
||||
|
||||
//Load merchant data
|
||||
LoadMerchants();
|
||||
|
||||
|
||||
+10
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user