From 1be7e56b86f7b7e755f0e8fc0748c31d0dfb18e9 Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Mon, 16 Jun 2025 16:48:29 -0500 Subject: [PATCH 01/18] [Databuckets] Move Databuckets to Common (#4918) * [Databuckets] Move Databuckets to Common * Fix linking issue --- {zone => common}/data_bucket.cpp | 42 +++++++++--------------------- {zone => common}/data_bucket.h | 10 +++---- world/CMakeLists.txt | 2 ++ world/zoneserver.cpp | 1 - zone/CMakeLists.txt | 4 +-- zone/bot.cpp | 2 +- zone/cli/benchmark_databuckets.cpp | 2 +- zone/client.cpp | 2 +- zone/client_packet.cpp | 4 +-- zone/command.cpp | 2 +- zone/embparser_api.cpp | 2 +- zone/exp.cpp | 2 +- zone/gm_commands/databuckets.cpp | 2 +- zone/gm_commands/devtools.cpp | 2 +- zone/gm_commands/gmzone.cpp | 2 +- zone/lua_bot.cpp | 4 +-- zone/lua_client.cpp | 2 +- zone/lua_general.cpp | 2 +- zone/mob.cpp | 22 +++++++++++++++- zone/mob.h | 3 ++- zone/perl_bot.cpp | 4 +-- zone/perl_client.cpp | 2 +- zone/spells.cpp | 2 +- 23 files changed, 62 insertions(+), 60 deletions(-) rename {zone => common}/data_bucket.cpp (96%) rename {zone => common}/data_bucket.h (91%) diff --git a/zone/data_bucket.cpp b/common/data_bucket.cpp similarity index 96% rename from zone/data_bucket.cpp rename to common/data_bucket.cpp index 4912e634b..d0ad01b7e 100644 --- a/zone/data_bucket.cpp +++ b/common/data_bucket.cpp @@ -1,18 +1,23 @@ -#include "data_bucket.h" -#include "zonedb.h" -#include "mob.h" -#include "client.h" -#include "worldserver.h" +#include "../common/data_bucket.h" +#include "database.h" #include #include #include "../common/json/json.hpp" using json = nlohmann::json; -extern WorldServer worldserver; -const std::string NESTED_KEY_DELIMITER = "."; +const std::string NESTED_KEY_DELIMITER = "."; +std::vector g_data_bucket_cache = {}; -std::vector g_data_bucket_cache = {}; +#if defined(ZONE) +#include "../zone/zonedb.h" +extern ZoneDatabase database; +#elif defined(WORLD) +#include "../world/worlddb.h" +extern WorldDatabase database; +#else +#error "You must define either ZONE or WORLD" +#endif void DataBucket::SetData(const std::string &bucket_key, const std::string &bucket_value, std::string expires_time) { @@ -347,27 +352,6 @@ bool DataBucket::DeleteData(const std::string &bucket_key) return DeleteData(DataBucketKey{.key = bucket_key}); } -// GetDataBuckets bulk loads all data buckets for a mob -bool DataBucket::GetDataBuckets(Mob *mob) -{ - const uint32 id = mob->GetMobTypeIdentifier(); - - if (!id) { - return false; - } - - if (mob->IsBot()) { - BulkLoadEntitiesToCache(DataBucketLoadType::Bot, {id}); - } - else if (mob->IsClient()) { - uint32 account_id = mob->CastToClient()->AccountID(); - BulkLoadEntitiesToCache(DataBucketLoadType::Account, {account_id}); - BulkLoadEntitiesToCache(DataBucketLoadType::Client, {id}); - } - - return true; -} - bool DataBucket::DeleteData(const DataBucketKey &k) { bool is_nested_key = k.key.find(NESTED_KEY_DELIMITER) != std::string::npos; diff --git a/zone/data_bucket.h b/common/data_bucket.h similarity index 91% rename from zone/data_bucket.h rename to common/data_bucket.h index ca2904a43..6f5c1bcc6 100644 --- a/zone/data_bucket.h +++ b/common/data_bucket.h @@ -2,11 +2,9 @@ #define EQEMU_DATABUCKET_H #include -#include "../common/types.h" -#include "../common/repositories/data_buckets_repository.h" -#include "mob.h" -#include "../common/json/json_archive_single_line.h" -#include "../common/servertalk.h" +#include "types.h" +#include "repositories/data_buckets_repository.h" +#include "json/json_archive_single_line.h" struct DataBucketKey { std::string key; @@ -46,8 +44,6 @@ public: static std::string GetDataExpires(const std::string &bucket_key); static std::string GetDataRemaining(const std::string &bucket_key); - static bool GetDataBuckets(Mob *mob); - // scoped bucket methods static void SetData(const DataBucketKey &k_); static bool DeleteData(const DataBucketKey &k); diff --git a/world/CMakeLists.txt b/world/CMakeLists.txt index 1b85ad1ed..0eed74b9b 100644 --- a/world/CMakeLists.txt +++ b/world/CMakeLists.txt @@ -7,6 +7,7 @@ SET(world_sources cliententry.cpp clientlist.cpp console.cpp + ../common/data_bucket.cpp dynamic_zone.cpp dynamic_zone_manager.cpp eql_config.cpp @@ -42,6 +43,7 @@ SET(world_headers cliententry.h clientlist.h console.h + ../common/data_bucket.h dynamic_zone.h dynamic_zone_manager.h eql_config.h diff --git a/world/zoneserver.cpp b/world/zoneserver.cpp index 3a244f785..93500ecf6 100644 --- a/world/zoneserver.cpp +++ b/world/zoneserver.cpp @@ -46,7 +46,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "../common/repositories/player_event_logs_repository.h" #include "../common/events/player_event_logs.h" #include "../common/patches/patches.h" -#include "../zone/data_bucket.h" #include "../common/repositories/guild_tributes_repository.h" #include "../common/skill_caps.h" #include "../common/server_reload_types.h" diff --git a/zone/CMakeLists.txt b/zone/CMakeLists.txt index 35a9203bf..56dcf29fe 100644 --- a/zone/CMakeLists.txt +++ b/zone/CMakeLists.txt @@ -25,7 +25,7 @@ SET(zone_sources combat_record.cpp command.cpp corpse.cpp - data_bucket.cpp + ../common/data_bucket.cpp doors.cpp dialogue_window.cpp dynamic_zone.cpp @@ -195,7 +195,7 @@ SET(zone_headers command.h common.h corpse.h - data_bucket.h + ../common/data_bucket.h doors.h dialogue_window.h dynamic_zone.h diff --git a/zone/bot.cpp b/zone/bot.cpp index ad3a4d4a0..47d153705 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -3640,7 +3640,7 @@ bool Bot::Spawn(Client* botCharacterOwner) { entity_list.AddBot(this, true, true); ClearDataBucketCache(); - DataBucket::GetDataBuckets(this); + LoadDataBucketsCache(); LoadBotSpellSettings(); if (!AI_AddBotSpells(GetBotSpellID())) { GetBotOwner()->CastToClient()->Message( diff --git a/zone/cli/benchmark_databuckets.cpp b/zone/cli/benchmark_databuckets.cpp index f22533d92..383465713 100644 --- a/zone/cli/benchmark_databuckets.cpp +++ b/zone/cli/benchmark_databuckets.cpp @@ -5,7 +5,7 @@ #include "../../common/eqemu_logsys.h" #include "../sidecar_api/sidecar_api.h" #include "../../common/platform.h" -#include "../data_bucket.h" +#include "../../common/data_bucket.h" #include "../zonedb.h" #include "../../common/repositories/data_buckets_repository.h" diff --git a/zone/client.cpp b/zone/client.cpp index 48441a4d3..4b18ab6b8 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -39,7 +39,7 @@ extern volatile bool RunLoops; #include "../common/strings.h" #include "../common/data_verification.h" #include "../common/profanity_manager.h" -#include "data_bucket.h" +#include "../common/data_bucket.h" #include "dynamic_zone.h" #include "expedition_request.h" #include "position.h" diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 634e13334..9ba3bbf8a 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -42,7 +42,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "../common/data_verification.h" #include "../common/rdtsc.h" -#include "data_bucket.h" +#include "../common/data_bucket.h" #include "dynamic_zone.h" #include "event_codes.h" #include "guild_mgr.h" @@ -1473,7 +1473,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) // Load Data Buckets ClearDataBucketCache(); - DataBucket::GetDataBuckets(this); + LoadDataBucketsCache(); // Max Level for Character:PerCharacterQglobalMaxLevel and Character:PerCharacterBucketMaxLevel uint8 client_max_level = 0; diff --git a/zone/command.cpp b/zone/command.cpp index d74d0bd4d..09721321e 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -19,7 +19,7 @@ #include "../common/file.h" #include "../common/repositories/dynamic_zones_repository.h" -#include "data_bucket.h" +#include "../common/data_bucket.h" #include "command.h" #include "dynamic_zone.h" #include "queryserv.h" diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index 91e194a31..81ceff206 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -33,7 +33,7 @@ #include "queryserv.h" #include "questmgr.h" #include "zone.h" -#include "data_bucket.h" +#include "../common/data_bucket.h" #include "../common/events/player_event_logs.h" #include "worldserver.h" diff --git a/zone/exp.cpp b/zone/exp.cpp index bd2bacb74..345ab61a3 100644 --- a/zone/exp.cpp +++ b/zone/exp.cpp @@ -22,7 +22,7 @@ #include "../common/strings.h" #include "client.h" -#include "data_bucket.h" +#include "../common/data_bucket.h" #include "groups.h" #include "mob.h" #include "raids.h" diff --git a/zone/gm_commands/databuckets.cpp b/zone/gm_commands/databuckets.cpp index 8164e3ad4..952a276dd 100755 --- a/zone/gm_commands/databuckets.cpp +++ b/zone/gm_commands/databuckets.cpp @@ -1,5 +1,5 @@ #include "../client.h" -#include "../data_bucket.h" +#include "../../common/data_bucket.h" #include "../dialogue_window.h" #include "../../common/repositories/data_buckets_repository.h" diff --git a/zone/gm_commands/devtools.cpp b/zone/gm_commands/devtools.cpp index 477747ddb..c362a6d05 100755 --- a/zone/gm_commands/devtools.cpp +++ b/zone/gm_commands/devtools.cpp @@ -1,5 +1,5 @@ #include "../client.h" -#include "../data_bucket.h" +#include "../../common/data_bucket.h" void command_devtools(Client *c, const Seperator *sep) { diff --git a/zone/gm_commands/gmzone.cpp b/zone/gm_commands/gmzone.cpp index d10885d62..a26a09d05 100755 --- a/zone/gm_commands/gmzone.cpp +++ b/zone/gm_commands/gmzone.cpp @@ -1,5 +1,5 @@ #include "../client.h" -#include "../data_bucket.h" +#include "../../common/data_bucket.h" void command_gmzone(Client *c, const Seperator *sep) { diff --git a/zone/lua_bot.cpp b/zone/lua_bot.cpp index c3ee8445a..1e537d76a 100644 --- a/zone/lua_bot.cpp +++ b/zone/lua_bot.cpp @@ -107,12 +107,12 @@ void Lua_Bot::SetExpansionBitmask(int expansion_bitmask) { bool Lua_Bot::ReloadBotDataBuckets() { Lua_Safe_Call_Bool(); - return DataBucket::GetDataBuckets(self); + return self->LoadDataBucketsCache();; } bool Lua_Bot::ReloadBotOwnerDataBuckets() { Lua_Safe_Call_Bool(); - return self->HasOwner() && DataBucket::GetDataBuckets(self->GetBotOwner()); + return self->HasOwner() && self->LoadDataBucketsCache(); } bool Lua_Bot::ReloadBotSpells() { diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index 1def6b30a..ece5d4594 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -3131,7 +3131,7 @@ bool Lua_Client::IsAutoFireEnabled() bool Lua_Client::ReloadDataBuckets() { Lua_Safe_Call_Bool(); - return DataBucket::GetDataBuckets(self); + return self->LoadDataBucketsCache(); } uint32 Lua_Client::GetEXPForLevel(uint16 check_level) diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index 8a2e2f21d..e076b2674 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -24,7 +24,7 @@ #include "qglobals.h" #include "encounter.h" #include "lua_encounter.h" -#include "data_bucket.h" +#include "../common/data_bucket.h" #include "dialogue_window.h" #include "dynamic_zone.h" #include "../common/events/player_event_logs.h" diff --git a/zone/mob.cpp b/zone/mob.cpp index e5a5eda05..97c2d17e5 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -24,7 +24,7 @@ #include "../common/repositories/bot_data_repository.h" #include "../common/repositories/character_data_repository.h" -#include "data_bucket.h" +#include "../common/data_bucket.h" #include "quest_parser_collection.h" #include "string_ids.h" #include "worldserver.h" @@ -8772,3 +8772,23 @@ bool Mob::IsGuildmaster() const { return false; } } + +bool Mob::LoadDataBucketsCache() +{ + const uint32 id = GetMobTypeIdentifier(); + + if (!id) { + return false; + } + + if (IsBot()) { + DataBucket::BulkLoadEntitiesToCache(DataBucketLoadType::Bot, {id}); + } + else if (IsClient()) { + uint32 account_id = CastToClient()->AccountID(); + DataBucket::BulkLoadEntitiesToCache(DataBucketLoadType::Account, {account_id}); + DataBucket::BulkLoadEntitiesToCache(DataBucketLoadType::Client, {id}); + } + + return true; +} \ No newline at end of file diff --git a/zone/mob.h b/zone/mob.h index 22a7a57ee..c963dc3fc 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -20,7 +20,7 @@ #define MOB_H #include "common.h" -#include "data_bucket.h" +#include "../common/data_bucket.h" #include "entity.h" #include "hate_list.h" #include "pathfinder_interface.h" @@ -1504,6 +1504,7 @@ public: void CalcHeroicBonuses(StatBonuses* newbon); DataBucketKey GetScopedBucketKeys(); + bool LoadDataBucketsCache(); bool IsCloseToBanker(); diff --git a/zone/perl_bot.cpp b/zone/perl_bot.cpp index a298e4eab..f667eaa44 100644 --- a/zone/perl_bot.cpp +++ b/zone/perl_bot.cpp @@ -492,12 +492,12 @@ void Perl_Bot_SetSpellDurationRaid(Bot* self, int spell_id, int duration, int le bool Perl_Bot_ReloadBotDataBuckets(Bot* self) { - return DataBucket::GetDataBuckets(self); + return self->LoadDataBucketsCache(); } bool Perl_Bot_ReloadBotOwnerDataBuckets(Bot* self) { - return self->HasOwner() && DataBucket::GetDataBuckets(self->GetBotOwner()); + return self->HasOwner() && self->LoadDataBucketsCache(); } bool Perl_Bot_ReloadBotSpells(Bot* self) diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index 6ef4eaa45..20ff56fe3 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -2995,7 +2995,7 @@ bool Perl_Client_IsAutoFireEnabled(Client* self) bool Perl_Client_ReloadDataBuckets(Client* self) { - return DataBucket::GetDataBuckets(self); + return self->LoadDataBucketsCache(); } uint32 Perl_Client_GetEXPForLevel(Client* self, uint16 check_level) diff --git a/zone/spells.cpp b/zone/spells.cpp index bca4caefa..f34914b55 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -80,7 +80,7 @@ Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org) #include "../common/repositories/character_corpses_repository.h" #include "../common/repositories/spell_buckets_repository.h" -#include "data_bucket.h" +#include "../common/data_bucket.h" #include "quest_parser_collection.h" #include "string_ids.h" #include "worldserver.h" From 2aebf1a78ad62a56da9258bda1566149cf691c3d Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sun, 22 Jun 2025 02:49:39 -0400 Subject: [PATCH 02/18] [Code] Remove Unused MZoneShutdown Mutex (#4946) --- zone/zone.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/zone/zone.cpp b/zone/zone.cpp index 6f00f805e..4081c214f 100644 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -88,8 +88,6 @@ extern WorldServer worldserver; extern Zone* zone; extern NpcScaleManager* npc_scale_manager; -Mutex MZoneShutdown; - volatile bool is_zone_loaded = false; Zone* zone = 0; From 3e6a3e2168303db1ac399a07bfd99414c6e7344c Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Sun, 22 Jun 2025 02:08:03 -0500 Subject: [PATCH 03/18] [Build] Significantly Improve Build Times Using Unity Builds (#4948) --- CMakeLists.txt | 1 + zone/CMakeLists.txt | 309 +++++++++++++++++++++----- zone/command.cpp | 158 ------------- zone/gm_commands/databuckets.cpp | 18 +- zone/gm_commands/find/object_type.cpp | 1 + zone/gm_commands/guild.cpp | 34 +-- zone/gm_commands/illusion_block.cpp | 1 + zone/gm_commands/list.cpp | 1 + zone/gm_commands/loc.cpp | 1 + zone/gm_commands/modifynpcstat.cpp | 116 +++++----- zone/gm_commands/mystats.cpp | 1 + zone/gm_commands/npcedit.cpp | 220 +++++++++--------- zone/gm_commands/parcels.cpp | 29 +-- zone/gm_commands/petitems.cpp | 1 + zone/gm_commands/set/haste.cpp | 1 + zone/gm_commands/show/inventory.cpp | 34 +-- zone/gm_commands/zone.cpp | 1 + zone/lua_zone.cpp | 1 - 18 files changed, 488 insertions(+), 440 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f93cabb22..e53a05bef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ IF(USE_MAP_MMFS) ENDIF (USE_MAP_MMFS) IF(MSVC) + add_compile_options(/bigobj) ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS) ADD_DEFINITIONS(-DNOMINMAX) ADD_DEFINITIONS(-DCRASH_LOGGING) diff --git a/zone/CMakeLists.txt b/zone/CMakeLists.txt index 56dcf29fe..8424891e9 100644 --- a/zone/CMakeLists.txt +++ b/zone/CMakeLists.txt @@ -12,7 +12,6 @@ SET(zone_sources bonuses.cpp bot.cpp bot_raid.cpp - bot_command.cpp bot_database.cpp botspellsai.cpp cheat_manager.cpp @@ -23,7 +22,6 @@ SET(zone_sources client_packet.cpp client_process.cpp combat_record.cpp - command.cpp corpse.cpp ../common/data_bucket.cpp doors.cpp @@ -48,36 +46,6 @@ SET(zone_sources horse.cpp inventory.cpp loot.cpp - lua_bot.cpp - lua_bit.cpp - lua_buff.cpp - lua_corpse.cpp - lua_client.cpp - lua_database.cpp - lua_door.cpp - lua_encounter.cpp - lua_entity.cpp - lua_entity_list.cpp - lua_expedition.cpp - lua_general.cpp - lua_group.cpp - lua_hate_list.cpp - lua_inventory.cpp - lua_item.cpp - lua_iteminst.cpp - lua_merc.cpp - lua_mob.cpp - lua_mod.cpp - lua_npc.cpp - lua_object.cpp - lua_packet.cpp - lua_parser.cpp - lua_parser_events.cpp - lua_raid.cpp - lua_spawn.cpp - lua_spell.cpp - lua_stat_bonuses.cpp - lua_zone.cpp embperl.cpp entity.cpp exp.cpp @@ -108,30 +76,6 @@ SET(zone_sources pathfinder_nav_mesh.cpp pathfinder_null.cpp pathing.cpp - perl_bot.cpp - perl_buff.cpp - perl_client.cpp - perl_database.cpp - perl_doors.cpp - perl_entity.cpp - perl_expedition.cpp - perl_groups.cpp - perl_hateentry.cpp - perl_inventory.cpp - perl_merc.cpp - perl_mob.cpp - perl_npc.cpp - perl_object.cpp - perl_perlpacket.cpp - perl_player_corpse.cpp - perl_questitem.cpp - perl_questitem_data.cpp - perl_raids.cpp - perl_spawn.cpp - perl_spell.cpp - perl_stat_bonuses.cpp - perl_zone.cpp - perlpacket.cpp petitions.cpp pets.cpp position.cpp @@ -296,10 +240,247 @@ SET(zone_headers zone_save_state.h zone_cli.cpp) +# lua unity build +set(lua_sources + lua_bot.cpp + lua_bit.cpp + lua_buff.cpp + lua_corpse.cpp + lua_client.cpp + lua_database.cpp + lua_door.cpp + lua_encounter.cpp + lua_entity.cpp + lua_entity_list.cpp + lua_expedition.cpp + lua_general.cpp + lua_group.cpp + lua_hate_list.cpp + lua_inventory.cpp + lua_item.cpp + lua_iteminst.cpp + lua_merc.cpp + lua_mob.cpp + lua_mod.cpp + lua_npc.cpp + lua_object.cpp + lua_packet.cpp + lua_parser.cpp + lua_parser_events.cpp + lua_raid.cpp + lua_spawn.cpp + lua_spell.cpp + lua_stat_bonuses.cpp + lua_zone.cpp +) + +add_library(lua_zone STATIC ${lua_sources}) +set_target_properties(lua_zone PROPERTIES UNITY_BUILD ON UNITY_BUILD_BATCH_SIZE 8) + +# perl unity build +set(perl_sources + perl_bot.cpp + perl_buff.cpp + perl_client.cpp + perl_database.cpp + perl_doors.cpp + perl_entity.cpp + perl_expedition.cpp + perl_groups.cpp + perl_hateentry.cpp + perl_inventory.cpp + perl_merc.cpp + perl_mob.cpp + perl_npc.cpp + perl_object.cpp + perl_perlpacket.cpp + perl_player_corpse.cpp + perl_questitem.cpp + perl_questitem_data.cpp + perl_raids.cpp + perl_spawn.cpp + perl_spell.cpp + perl_stat_bonuses.cpp + perl_zone.cpp + perlpacket.cpp +) + +add_library(perl_zone STATIC ${perl_sources}) +set_target_properties(perl_zone PROPERTIES UNITY_BUILD ON UNITY_BUILD_BATCH_SIZE 8) + +# gm commands +set(gm_command_sources + command.cpp + bot_command.cpp + gm_commands/acceptrules.cpp + gm_commands/advnpcspawn.cpp + gm_commands/aggrozone.cpp + gm_commands/ai.cpp + gm_commands/appearance.cpp + gm_commands/appearanceeffects.cpp + gm_commands/attack.cpp + gm_commands/augmentitem.cpp + gm_commands/ban.cpp + gm_commands/bugs.cpp + gm_commands/camerashake.cpp + gm_commands/castspell.cpp + gm_commands/chat.cpp + gm_commands/clearxtargets.cpp + gm_commands/copycharacter.cpp + gm_commands/corpse.cpp + gm_commands/corpsefix.cpp + gm_commands/countitem.cpp + gm_commands/damage.cpp + gm_commands/databuckets.cpp + gm_commands/dbspawn2.cpp + gm_commands/delacct.cpp + gm_commands/delpetition.cpp + gm_commands/depop.cpp + gm_commands/depopzone.cpp + gm_commands/devtools.cpp + gm_commands/disablerecipe.cpp + gm_commands/disarmtrap.cpp + gm_commands/doanim.cpp + gm_commands/door.cpp + gm_commands/door_manipulation.cpp + gm_commands/dye.cpp + gm_commands/dz.cpp + gm_commands/dzkickplayers.cpp + gm_commands/editmassrespawn.cpp + gm_commands/emote.cpp + gm_commands/emptyinventory.cpp + gm_commands/enablerecipe.cpp + gm_commands/entityvariable.cpp + gm_commands/exptoggle.cpp + gm_commands/faction.cpp + gm_commands/evolving_items.cpp + gm_commands/feature.cpp + gm_commands/find.cpp + gm_commands/fish.cpp + gm_commands/fixmob.cpp + gm_commands/flagedit.cpp + gm_commands/fleeinfo.cpp + gm_commands/forage.cpp + gm_commands/gearup.cpp + gm_commands/giveitem.cpp + gm_commands/givemoney.cpp + gm_commands/gmzone.cpp + gm_commands/goto.cpp + gm_commands/grantaa.cpp + gm_commands/grid.cpp + gm_commands/guild.cpp + gm_commands/hp.cpp + gm_commands/illusion_block.cpp + gm_commands/instance.cpp + gm_commands/interrogateinv.cpp + gm_commands/interrupt.cpp + gm_commands/invsnapshot.cpp + gm_commands/ipban.cpp + gm_commands/kick.cpp + gm_commands/kill.cpp + gm_commands/killallnpcs.cpp + gm_commands/list.cpp + gm_commands/lootsim.cpp + gm_commands/loc.cpp + gm_commands/logs.cpp + gm_commands/makepet.cpp + gm_commands/memspell.cpp + gm_commands/merchantshop.cpp + gm_commands/modifynpcstat.cpp + gm_commands/movechar.cpp + gm_commands/movement.cpp + gm_commands/myskills.cpp + gm_commands/mysql.cpp + gm_commands/mystats.cpp + gm_commands/npccast.cpp + gm_commands/npcedit.cpp + gm_commands/npceditmass.cpp + gm_commands/npcemote.cpp + gm_commands/npcloot.cpp + gm_commands/npcsay.cpp + gm_commands/npcshout.cpp + gm_commands/npcspawn.cpp + gm_commands/npctypespawn.cpp + gm_commands/nudge.cpp + gm_commands/nukebuffs.cpp + gm_commands/nukeitem.cpp + gm_commands/object.cpp + gm_commands/object_manipulation.cpp + gm_commands/parcels.cpp + gm_commands/path.cpp + gm_commands/peqzone.cpp + gm_commands/petitems.cpp + gm_commands/petname.cpp + gm_commands/picklock.cpp + gm_commands/profanity.cpp + gm_commands/push.cpp + gm_commands/raidloot.cpp + gm_commands/randomfeatures.cpp + gm_commands/refreshgroup.cpp + gm_commands/reload.cpp + gm_commands/removeitem.cpp + gm_commands/repop.cpp + gm_commands/resetaa.cpp + gm_commands/resetaa_timer.cpp + gm_commands/resetdisc_timer.cpp + gm_commands/revoke.cpp + gm_commands/roambox.cpp + gm_commands/rules.cpp + gm_commands/save.cpp + gm_commands/scale.cpp + gm_commands/scribespell.cpp + gm_commands/scribespells.cpp + gm_commands/sendzonespawns.cpp + gm_commands/sensetrap.cpp + gm_commands/serverrules.cpp + gm_commands/set.cpp + gm_commands/show.cpp + gm_commands/shutdown.cpp + gm_commands/spawn.cpp + gm_commands/spawneditmass.cpp + gm_commands/spawnfix.cpp + gm_commands/faction_association.cpp + gm_commands/stun.cpp + gm_commands/summon.cpp + gm_commands/summonburiedplayercorpse.cpp + gm_commands/summonitem.cpp + gm_commands/suspend.cpp + gm_commands/suspendmulti.cpp + gm_commands/takeplatinum.cpp + gm_commands/task.cpp + gm_commands/traindisc.cpp + gm_commands/tune.cpp + gm_commands/undye.cpp + gm_commands/unmemspell.cpp + gm_commands/unmemspells.cpp + gm_commands/unscribespell.cpp + gm_commands/unscribespells.cpp + gm_commands/untraindisc.cpp + gm_commands/untraindiscs.cpp + gm_commands/wc.cpp + gm_commands/worldshutdown.cpp + gm_commands/worldwide.cpp + gm_commands/wp.cpp + gm_commands/wpadd.cpp + gm_commands/zone.cpp + gm_commands/zonebootup.cpp + gm_commands/zoneshutdown.cpp + gm_commands/zonevariable.cpp + gm_commands/zone_instance.cpp + gm_commands/zone_shard.cpp + gm_commands/zsave.cpp +) + +add_library(gm_commands_zone STATIC ${gm_command_sources}) +set_target_properties(gm_commands_zone PROPERTIES UNITY_BUILD ON UNITY_BUILD_BATCH_SIZE 32) + +# zone combine sources and headers ADD_EXECUTABLE(zone ${zone_sources} ${zone_headers}) +# binary output directory INSTALL(TARGETS zone RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) +# precompile headers IF (WIN32 AND EQEMU_BUILD_PCH) TARGET_PRECOMPILE_HEADERS(zone PRIVATE ../common/pch/pch.h) TARGET_PRECOMPILE_HEADERS(zone PRIVATE ../common/types.h ../common/eqemu_logsys.h ../common/eqemu_logsys_log_aliases.h ../common/features.h ../common/global_define.h) @@ -308,6 +489,20 @@ ENDIF() ADD_DEFINITIONS(-DZONE) -TARGET_LINK_LIBRARIES(zone ${ZONE_LIBS}) +# link lua_zone unity build against luabind +target_link_libraries(lua_zone PRIVATE luabind) +if (EQEMU_BUILD_STATIC AND LUA_LIBRARY) + target_link_libraries(zone PRIVATE ${LUA_LIBRARY}) +endif() + +# perl unity build links against perl_zone +target_link_libraries(perl_zone PRIVATE perlbind) +if (EQEMU_BUILD_STATIC AND PERL_LIBRARY) + target_link_libraries(zone PRIVATE ${PERL_LIBRARY}) +endif() + +# link zone against common libraries +target_link_libraries(zone PRIVATE ${ZONE_LIBS} lua_zone perl_zone gm_commands_zone) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) + diff --git a/zone/command.cpp b/zone/command.cpp index 09721321e..85e4a7e9d 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -783,161 +783,3 @@ void command_bot(Client *c, const Seperator *sep) c->Message(Chat::Red, "Bots are disabled on this server."); } } - -#include "gm_commands/acceptrules.cpp" -#include "gm_commands/advnpcspawn.cpp" -#include "gm_commands/aggrozone.cpp" -#include "gm_commands/ai.cpp" -#include "gm_commands/appearance.cpp" -#include "gm_commands/appearanceeffects.cpp" -#include "gm_commands/attack.cpp" -#include "gm_commands/augmentitem.cpp" -#include "gm_commands/ban.cpp" -#include "gm_commands/bugs.cpp" -#include "gm_commands/camerashake.cpp" -#include "gm_commands/castspell.cpp" -#include "gm_commands/chat.cpp" -#include "gm_commands/clearxtargets.cpp" -#include "gm_commands/copycharacter.cpp" -#include "gm_commands/corpse.cpp" -#include "gm_commands/corpsefix.cpp" -#include "gm_commands/countitem.cpp" -#include "gm_commands/damage.cpp" -#include "gm_commands/databuckets.cpp" -#include "gm_commands/dbspawn2.cpp" -#include "gm_commands/delacct.cpp" -#include "gm_commands/delpetition.cpp" -#include "gm_commands/depop.cpp" -#include "gm_commands/depopzone.cpp" -#include "gm_commands/devtools.cpp" -#include "gm_commands/disablerecipe.cpp" -#include "gm_commands/disarmtrap.cpp" -#include "gm_commands/doanim.cpp" -#include "gm_commands/door.cpp" -#include "gm_commands/door_manipulation.cpp" -#include "gm_commands/dye.cpp" -#include "gm_commands/dz.cpp" -#include "gm_commands/dzkickplayers.cpp" -#include "gm_commands/editmassrespawn.cpp" -#include "gm_commands/emote.cpp" -#include "gm_commands/emptyinventory.cpp" -#include "gm_commands/enablerecipe.cpp" -#include "gm_commands/entityvariable.cpp" -#include "gm_commands/exptoggle.cpp" -#include "gm_commands/faction.cpp" -#include "gm_commands/evolving_items.cpp" -#include "gm_commands/feature.cpp" -#include "gm_commands/find.cpp" -#include "gm_commands/fish.cpp" -#include "gm_commands/fixmob.cpp" -#include "gm_commands/flagedit.cpp" -#include "gm_commands/fleeinfo.cpp" -#include "gm_commands/forage.cpp" -#include "gm_commands/gearup.cpp" -#include "gm_commands/giveitem.cpp" -#include "gm_commands/givemoney.cpp" -#include "gm_commands/gmzone.cpp" -#include "gm_commands/goto.cpp" -#include "gm_commands/grantaa.cpp" -#include "gm_commands/grid.cpp" -#include "gm_commands/guild.cpp" -#include "gm_commands/hp.cpp" -#include "gm_commands/illusion_block.cpp" -#include "gm_commands/instance.cpp" -#include "gm_commands/interrogateinv.cpp" -#include "gm_commands/interrupt.cpp" -#include "gm_commands/invsnapshot.cpp" -#include "gm_commands/ipban.cpp" -#include "gm_commands/kick.cpp" -#include "gm_commands/kill.cpp" -#include "gm_commands/killallnpcs.cpp" -#include "gm_commands/list.cpp" -#include "gm_commands/lootsim.cpp" -#include "gm_commands/loc.cpp" -#include "gm_commands/logs.cpp" -#include "gm_commands/makepet.cpp" -#include "gm_commands/memspell.cpp" -#include "gm_commands/merchantshop.cpp" -#include "gm_commands/modifynpcstat.cpp" -#include "gm_commands/movechar.cpp" -#include "gm_commands/movement.cpp" -#include "gm_commands/myskills.cpp" -#include "gm_commands/mysql.cpp" -#include "gm_commands/mystats.cpp" -#include "gm_commands/npccast.cpp" -#include "gm_commands/npcedit.cpp" -#include "gm_commands/npceditmass.cpp" -#include "gm_commands/npcemote.cpp" -#include "gm_commands/npcloot.cpp" -#include "gm_commands/npcsay.cpp" -#include "gm_commands/npcshout.cpp" -#include "gm_commands/npcspawn.cpp" -#include "gm_commands/npctypespawn.cpp" -#include "gm_commands/nudge.cpp" -#include "gm_commands/nukebuffs.cpp" -#include "gm_commands/nukeitem.cpp" -#include "gm_commands/object.cpp" -#include "gm_commands/object_manipulation.cpp" -#include "gm_commands/parcels.cpp" -#include "gm_commands/path.cpp" -#include "gm_commands/peqzone.cpp" -#include "gm_commands/petitems.cpp" -#include "gm_commands/petname.cpp" -#include "gm_commands/picklock.cpp" -#include "gm_commands/profanity.cpp" -#include "gm_commands/push.cpp" -#include "gm_commands/raidloot.cpp" -#include "gm_commands/randomfeatures.cpp" -#include "gm_commands/refreshgroup.cpp" -#include "gm_commands/reload.cpp" -#include "gm_commands/removeitem.cpp" -#include "gm_commands/repop.cpp" -#include "gm_commands/resetaa.cpp" -#include "gm_commands/resetaa_timer.cpp" -#include "gm_commands/resetdisc_timer.cpp" -#include "gm_commands/revoke.cpp" -#include "gm_commands/roambox.cpp" -#include "gm_commands/rules.cpp" -#include "gm_commands/save.cpp" -#include "gm_commands/scale.cpp" -#include "gm_commands/scribespell.cpp" -#include "gm_commands/scribespells.cpp" -#include "gm_commands/sendzonespawns.cpp" -#include "gm_commands/sensetrap.cpp" -#include "gm_commands/serverrules.cpp" -#include "gm_commands/set.cpp" -#include "gm_commands/show.cpp" -#include "gm_commands/shutdown.cpp" -#include "gm_commands/spawn.cpp" -#include "gm_commands/spawneditmass.cpp" -#include "gm_commands/spawnfix.cpp" -#include "gm_commands/faction_association.cpp" -#include "gm_commands/stun.cpp" -#include "gm_commands/summon.cpp" -#include "gm_commands/summonburiedplayercorpse.cpp" -#include "gm_commands/summonitem.cpp" -#include "gm_commands/suspend.cpp" -#include "gm_commands/suspendmulti.cpp" -#include "gm_commands/takeplatinum.cpp" -#include "gm_commands/task.cpp" -#include "gm_commands/traindisc.cpp" -#include "gm_commands/tune.cpp" -#include "gm_commands/undye.cpp" -#include "gm_commands/unmemspell.cpp" -#include "gm_commands/unmemspells.cpp" -#include "gm_commands/unscribespell.cpp" -#include "gm_commands/unscribespells.cpp" -#include "gm_commands/untraindisc.cpp" -#include "gm_commands/untraindiscs.cpp" -#include "gm_commands/wc.cpp" -#include "gm_commands/worldshutdown.cpp" -#include "gm_commands/worldwide.cpp" -#include "gm_commands/wp.cpp" -#include "gm_commands/wpadd.cpp" -#include "gm_commands/zone.cpp" -#include "gm_commands/zonebootup.cpp" -#include "gm_commands/zoneshutdown.cpp" -#include "gm_commands/zonevariable.cpp" -#include "gm_commands/zone_instance.cpp" -#include "gm_commands/zone_shard.cpp" -#include "gm_commands/zsave.cpp" diff --git a/zone/gm_commands/databuckets.cpp b/zone/gm_commands/databuckets.cpp index 952a276dd..af78f528e 100755 --- a/zone/gm_commands/databuckets.cpp +++ b/zone/gm_commands/databuckets.cpp @@ -3,6 +3,15 @@ #include "../dialogue_window.h" #include "../../common/repositories/data_buckets_repository.h" +void SendDataBucketsSubCommands(Client *c) +{ + c->Message(Chat::White, "Usage: #databuckets delete [Key] [Character ID] [NPC ID] [Bot ID]"); + c->Message(Chat::White, "Usage: #databuckets edit [Key] [Character ID] [NPC ID] [Bot ID] [Value] [Expires]"); + c->Message(Chat::White, "Usage: #databuckets view [Partial Key] [Character ID] [NPC ID] [Bot ID]"); + c->Message(Chat::White, "Note: Character ID, NPC ID, and Bot ID are optional if not needed, if needed they are required for specificity"); + c->Message(Chat::White, "Note: Edit requires Character ID, NPC ID, Bot ID, and Value, Expires is optional and does not modify the existing expiration time if not provided"); +} + void command_databuckets(Client *c, const Seperator *sep) { const int arguments = sep->argnum; @@ -251,12 +260,3 @@ void command_databuckets(Client *c, const Seperator *sep) c->Message(Chat::White, response.c_str()); } } - -void SendDataBucketsSubCommands(Client *c) -{ - c->Message(Chat::White, "Usage: #databuckets delete [Key] [Character ID] [NPC ID] [Bot ID]"); - c->Message(Chat::White, "Usage: #databuckets edit [Key] [Character ID] [NPC ID] [Bot ID] [Value] [Expires]"); - c->Message(Chat::White, "Usage: #databuckets view [Partial Key] [Character ID] [NPC ID] [Bot ID]"); - c->Message(Chat::White, "Note: Character ID, NPC ID, and Bot ID are optional if not needed, if needed they are required for specificity"); - c->Message(Chat::White, "Note: Edit requires Character ID, NPC ID, Bot ID, and Value, Expires is optional and does not modify the existing expiration time if not provided"); -} diff --git a/zone/gm_commands/find/object_type.cpp b/zone/gm_commands/find/object_type.cpp index 39a94fd5e..1e7dc69aa 100644 --- a/zone/gm_commands/find/object_type.cpp +++ b/zone/gm_commands/find/object_type.cpp @@ -1,3 +1,4 @@ +#include "../../object.h" #include "../../client.h" void FindObjectType(Client *c, const Seperator *sep) diff --git a/zone/gm_commands/guild.cpp b/zone/gm_commands/guild.cpp index 39a30c4ed..97d280e80 100755 --- a/zone/gm_commands/guild.cpp +++ b/zone/gm_commands/guild.cpp @@ -8,6 +8,22 @@ extern QueryServ *QServ; #include "../guild_mgr.h" #include "../doors.h" +void SendGuildSubCommands(Client* c) +{ + c->Message(Chat::White, "#guild create [Character ID|Character Name] [Guild Name]"); + c->Message(Chat::White, "#guild delete [Guild ID]"); + c->Message(Chat::White, "#guild details [Guild ID]"); + c->Message(Chat::White, "#guild help"); + c->Message(Chat::White, "#guild info [Guild ID]"); + c->Message(Chat::White, "#guild list"); + c->Message(Chat::White, "#guild rename [Guild ID] [New Name]"); + c->Message(Chat::White, "#guild search [Search Criteria]"); + c->Message(Chat::White, "#guild set [Character ID|Character Name] [Guild ID] (Guild ID 0 is Guildless)"); + c->Message(Chat::White, "#guild setleader [Guild ID] [Character ID|Character Name]"); + c->Message(Chat::White, "#guild setrank [Character ID|Character Name] [Rank]"); + c->Message(Chat::White, "#guild status [Character ID|Character Name]"); +} + void command_guild(Client* c, const Seperator* sep) { const auto arguments = sep->argnum; @@ -675,20 +691,4 @@ void command_guild(Client* c, const Seperator* sep) // } } } -} - -void SendGuildSubCommands(Client* c) -{ - c->Message(Chat::White, "#guild create [Character ID|Character Name] [Guild Name]"); - c->Message(Chat::White, "#guild delete [Guild ID]"); - c->Message(Chat::White, "#guild details [Guild ID]"); - c->Message(Chat::White, "#guild help"); - c->Message(Chat::White, "#guild info [Guild ID]"); - c->Message(Chat::White, "#guild list"); - c->Message(Chat::White, "#guild rename [Guild ID] [New Name]"); - c->Message(Chat::White, "#guild search [Search Criteria]"); - c->Message(Chat::White, "#guild set [Character ID|Character Name] [Guild ID] (Guild ID 0 is Guildless)"); - c->Message(Chat::White, "#guild setleader [Guild ID] [Character ID|Character Name]"); - c->Message(Chat::White, "#guild setrank [Character ID|Character Name] [Rank]"); - c->Message(Chat::White, "#guild status [Character ID|Character Name]"); -} +} \ No newline at end of file diff --git a/zone/gm_commands/illusion_block.cpp b/zone/gm_commands/illusion_block.cpp index f9c3e9514..8aa274b4a 100644 --- a/zone/gm_commands/illusion_block.cpp +++ b/zone/gm_commands/illusion_block.cpp @@ -1,3 +1,4 @@ +#include "../dialogue_window.h" #include "../client.h" void command_illusion_block(Client* c, const Seperator* sep) diff --git a/zone/gm_commands/list.cpp b/zone/gm_commands/list.cpp index 7e05a1d6a..d39b424ba 100755 --- a/zone/gm_commands/list.cpp +++ b/zone/gm_commands/list.cpp @@ -2,6 +2,7 @@ #include "../corpse.h" #include "../object.h" #include "../doors.h" +#include "../command.h" struct UniqueEntity { uint16 entity_id; diff --git a/zone/gm_commands/loc.cpp b/zone/gm_commands/loc.cpp index 4e4085add..b7b627fcb 100755 --- a/zone/gm_commands/loc.cpp +++ b/zone/gm_commands/loc.cpp @@ -1,4 +1,5 @@ #include "../client.h" +#include "../water_map.h" void command_loc(Client *c, const Seperator *sep) { diff --git a/zone/gm_commands/modifynpcstat.cpp b/zone/gm_commands/modifynpcstat.cpp index 463e625f1..124f8ceca 100755 --- a/zone/gm_commands/modifynpcstat.cpp +++ b/zone/gm_commands/modifynpcstat.cpp @@ -1,63 +1,5 @@ #include "../client.h" -void command_modifynpcstat(Client *c, const Seperator *sep) -{ - auto arguments = sep->argnum; - if (!arguments) { - c->Message(Chat::White, "Usage: #modifynpcstat [Stat] [Value]"); - ListModifyNPCStatMap(c); - return; - } - - if (!c->GetTarget() || !c->GetTarget()->IsNPC()) { - c->Message(Chat::White, "You must target an NPC to use this command."); - return; - } - - auto target = c->GetTarget()->CastToNPC(); - - const std::string& stat = sep->arg[1] ? sep->arg[1] : ""; - const std::string& value = sep->arg[2] ? sep->arg[2] : ""; - - if (stat.empty() || value.empty()) { - c->Message(Chat::White, "Usage: #modifynpcstat [Stat] [Value]"); - ListModifyNPCStatMap(c); - return; - } - - auto stat_description = GetModifyNPCStatDescription(stat); - if (!stat_description.length()) { - c->Message( - Chat::White, - fmt::format( - "Stat '{}' does not exist.", - stat - ).c_str() - ); - return; - } - - target->ModifyNPCStat(stat, value); - - c->Message( - Chat::White, - fmt::format( - "Stat Modified | Target: {}", - c->GetTargetDescription(target) - ).c_str() - ); - - c->Message( - Chat::White, - fmt::format( - "Stat Modified | Stat: {} ({}) Value: {}", - GetModifyNPCStatDescription(stat), - stat, - value - ).c_str() - ); -} - std::map GetModifyNPCStatMap() { std::map identifiers_map = { @@ -134,3 +76,61 @@ void ListModifyNPCStatMap(Client *c) ); } } + +void command_modifynpcstat(Client *c, const Seperator *sep) +{ + auto arguments = sep->argnum; + if (!arguments) { + c->Message(Chat::White, "Usage: #modifynpcstat [Stat] [Value]"); + ListModifyNPCStatMap(c); + return; + } + + if (!c->GetTarget() || !c->GetTarget()->IsNPC()) { + c->Message(Chat::White, "You must target an NPC to use this command."); + return; + } + + auto target = c->GetTarget()->CastToNPC(); + + const std::string& stat = sep->arg[1] ? sep->arg[1] : ""; + const std::string& value = sep->arg[2] ? sep->arg[2] : ""; + + if (stat.empty() || value.empty()) { + c->Message(Chat::White, "Usage: #modifynpcstat [Stat] [Value]"); + ListModifyNPCStatMap(c); + return; + } + + auto stat_description = GetModifyNPCStatDescription(stat); + if (!stat_description.length()) { + c->Message( + Chat::White, + fmt::format( + "Stat '{}' does not exist.", + stat + ).c_str() + ); + return; + } + + target->ModifyNPCStat(stat, value); + + c->Message( + Chat::White, + fmt::format( + "Stat Modified | Target: {}", + c->GetTargetDescription(target) + ).c_str() + ); + + c->Message( + Chat::White, + fmt::format( + "Stat Modified | Stat: {} ({}) Value: {}", + GetModifyNPCStatDescription(stat), + stat, + value + ).c_str() + ); +} diff --git a/zone/gm_commands/mystats.cpp b/zone/gm_commands/mystats.cpp index 69343b304..fc16929d4 100755 --- a/zone/gm_commands/mystats.cpp +++ b/zone/gm_commands/mystats.cpp @@ -1,3 +1,4 @@ +#include "../bot.h" #include "../client.h" void command_mystats(Client *c, const Seperator *sep) diff --git a/zone/gm_commands/npcedit.cpp b/zone/gm_commands/npcedit.cpp index 54315070e..4f372b1e0 100755 --- a/zone/gm_commands/npcedit.cpp +++ b/zone/gm_commands/npcedit.cpp @@ -3,6 +3,115 @@ #include "../raids.h" #include "../../common/repositories/npc_types_repository.h" +void SendNPCEditSubCommands(Client *c) +{ + c->Message(Chat::White, "Usage: #npcedit name [Name] - Sets an NPC's Name"); + c->Message(Chat::White, "Usage: #npcedit lastname [Last Name] - Sets an NPC's Last Name"); + c->Message(Chat::White, "Usage: #npcedit level [Level] - Sets an NPC's Level"); + c->Message(Chat::White, "Usage: #npcedit race [Race ID] - Sets an NPC's Race"); + c->Message(Chat::White, "Usage: #npcedit class [Class ID] - Sets an NPC's Class"); + c->Message(Chat::White, "Usage: #npcedit bodytype [Body Type ID] - Sets an NPC's Bodytype"); + c->Message(Chat::White, "Usage: #npcedit hp [HP] - Sets an NPC's HP"); + c->Message(Chat::White, "Usage: #npcedit mana [Mana] - Sets an NPC's Mana"); + c->Message(Chat::White, "Usage: #npcedit gender [Gender ID] - Sets an NPC's Gender"); + c->Message(Chat::White, "Usage: #npcedit texture [Texture] - Sets an NPC's Texture"); + c->Message(Chat::White, "Usage: #npcedit helmtexture [Helmet Texture] - Sets an NPC's Helmet Texture"); + c->Message(Chat::White, "Usage: #npcedit herosforgemodel [Model Number] - Sets an NPC's Hero's Forge Model"); + c->Message(Chat::White, "Usage: #npcedit size [Size] - Sets an NPC's Size"); + c->Message(Chat::White, "Usage: #npcedit hpregen [HP Regen] - Sets an NPC's HP Regen Rate Per Tick"); + c->Message(Chat::White, "Usage: #npcedit hp_regen_per_second [HP Regen] - Sets an NPC's HP Regen Rate Per Second"); + c->Message(Chat::White, "Usage: #npcedit manaregen [Mana Regen] - Sets an NPC's Mana Regen Rate Per Tick"); + c->Message(Chat::White, "Usage: #npcedit loottable [Loottable ID] - Sets an NPC's Loottable ID"); + c->Message(Chat::White, "Usage: #npcedit merchantid [Merchant ID] - Sets an NPC's Merchant ID"); + c->Message(Chat::White, "Usage: #npcedit alt_currency_id [Alternate Currency ID] - Sets an NPC's Alternate Currency ID"); + c->Message(Chat::White, "Usage: #npcedit spell [Spell List ID] - Sets an NPC's Spells List ID"); + c->Message(Chat::White, "Usage: #npcedit npc_spells_effects_id [Spell Effects ID] - Sets an NPC's Spell Effects ID"); + c->Message(Chat::White, "Usage: #npcedit faction [Faction ID] - Sets an NPC's Faction ID"); + c->Message(Chat::White, "Usage: #npcedit adventure_template_id [Template ID] - Sets an NPC's Adventure Template ID"); + c->Message(Chat::White, "Usage: #npcedit trap_template [Template ID] - Sets an NPC's Trap Template ID"); + c->Message(Chat::White, "Usage: #npcedit damage [Minimum] [Maximum] - Sets an NPC's Damage"); + c->Message(Chat::White, "Usage: #npcedit attackcount [Attack Count] - Sets an NPC's Attack Count"); + c->Message(Chat::White, "Usage: #npcedit special_attacks [Special Attacks] - Sets an NPC's Special Attacks"); + c->Message(Chat::White, "Usage: #npcedit special_abilities [Special Abilities] - Sets an NPC's Special Abilities"); + c->Message(Chat::White, "Usage: #npcedit aggroradius [Radius] - Sets an NPC's Aggro Radius"); + c->Message(Chat::White, "Usage: #npcedit assistradius [Radius] - Sets an NPC's Assist Radius"); + c->Message(Chat::White, "Usage: #npcedit featuresave - Saves an NPC's current facial features to the database"); + c->Message(Chat::White, "Usage: #npcedit armortint_id [Armor Tint ID] - Sets an NPC's Armor Tint ID"); + c->Message(Chat::White, "Usage: #npcedit color [Red] [Green] [Blue] - Sets an NPC's Red, Green, and Blue armor tint"); + c->Message(Chat::White, "Usage: #npcedit ammoidfile [ID File] - Sets an NPC's Ammo ID File"); + c->Message(Chat::White, "Usage: #npcedit weapon [Primary Model] [Secondary Model] - Sets an NPC's Primary and Secondary Weapon Model"); + c->Message(Chat::White, "Usage: #npcedit meleetype [Primary Type] [Secondary Type] - Sets an NPC's Melee Skill Types"); + c->Message(Chat::White, "Usage: #npcedit rangedtype [Type] - Sets an NPC's Ranged Skill Type"); + c->Message(Chat::White, "Usage: #npcedit runspeed [Run Speed] - Sets an NPC's Run Speed"); + c->Message(Chat::White, "Usage: #npcedit mr [Resistance] - Sets an NPC's Magic Resistance"); + c->Message(Chat::White, "Usage: #npcedit pr [Resistance] - Sets an NPC's Poison Resistance"); + c->Message(Chat::White, "Usage: #npcedit dr [Resistance] - Sets an NPC's Disease Resistance"); + c->Message(Chat::White, "Usage: #npcedit fr [Resistance] - Sets an NPC's Fire Resistance"); + c->Message(Chat::White, "Usage: #npcedit cr [Resistance] - Sets an NPC's Cold Resistance"); + c->Message(Chat::White, "Usage: #npcedit corrup [Resistance] - Sets an NPC's Corruption Resistance"); + c->Message(Chat::White, "Usage: #npcedit phr [Resistance] - Sets and NPC's Physical Resistance"); + c->Message(Chat::White, "Usage: #npcedit seeinvis [Flag] - Sets an NPC's See Invisible Flag [0 = Cannot See Invisible, 1 = Can See Invisible]"); + c->Message(Chat::White, "Usage: #npcedit seeinvisundead [Flag] - Sets an NPC's See Invisible vs. Undead Flag [0 = Cannot See Invisible vs. Undead, 1 = Can See Invisible vs. Undead]"); + c->Message(Chat::White, "Usage: #npcedit qglobal [Flag] - Sets an NPC's Quest Global Flag [0 = Quest Globals Off, 1 = Quest Globals On]"); + c->Message(Chat::White, "Usage: #npcedit ac [Armor Class] - Sets an NPC's Armor Class"); + c->Message(Chat::White, "Usage: #npcedit npcaggro [Flag] - Sets an NPC's NPC Aggro Flag [0 = Aggro NPCs Off, 1 = Aggro NPCs On]"); + c->Message(Chat::White, "Usage: #npcedit spawn_limit [Limit] - Sets an NPC's Spawn Limit Counter"); + c->Message(Chat::White, "Usage: #npcedit attackspeed [Attack Speed] - Sets an NPC's Attack Speed Modifier"); + c->Message(Chat::White, "Usage: #npcedit attackdelay [Attack Delay] - Sets an NPC's Attack Delay"); + c->Message(Chat::White, "Usage: #npcedit findable [Flag] - Sets an NPC's Findable Flag [0 = Not Findable, 1 = Findable]"); + c->Message(Chat::White, "Usage: #npcedit str [Strength] - Sets an NPC's Strength"); + c->Message(Chat::White, "Usage: #npcedit sta [Stamina] - Sets an NPC's Stamina"); + c->Message(Chat::White, "Usage: #npcedit agi [Agility] - Sets an NPC's Agility"); + c->Message(Chat::White, "Usage: #npcedit dex [Dexterity] - Sets an NPC's Dexterity"); + c->Message(Chat::White, "Usage: #npcedit int [Intelligence] - Sets an NPC's Intelligence"); + c->Message(Chat::White, "Usage: #npcedit wis [Wisdom] - Sets an NPC's Wisdom"); + c->Message(Chat::White, "Usage: #npcedit cha [Charisma] - Sets an NPC's Charisma"); + c->Message(Chat::White, "Usage: #npcedit seehide [Flag] - Sets an NPC's See Hide Flag [0 = Cannot See Hide, 1 = Can See Hide]"); + c->Message(Chat::White, "Usage: #npcedit seeimprovedhide [Flag] - Sets an NPC's See Improved Hide Flag [0 = Cannot See Improved Hide, 1 = Can See Improved Hide]"); + c->Message(Chat::White, "Usage: #npcedit trackable [Flag] - Sets an NPC's Trackable Flag [0 = Not Trackable, 1 = Trackable]"); + c->Message(Chat::White, "Usage: #npcedit atk [Attack] - Sets an NPC's Attack"); + c->Message(Chat::White, "Usage: #npcedit accuracy [Accuracy] - Sets an NPC's Accuracy"); + c->Message(Chat::White, "Usage: #npcedit avoidance [Avoidance] - Sets an NPC's Avoidance"); + c->Message(Chat::White, "Usage: #npcedit slow_mitigation [Slow Mitigation] - Sets an NPC's Slow Mitigation"); + c->Message(Chat::White, "Usage: #npcedit version [Version] - Sets an NPC's Version"); + c->Message(Chat::White, "Usage: #npcedit maxlevel [Max Level] - Sets an NPC's Maximum Level"); + c->Message(Chat::White, "Usage: #npcedit scalerate [Scale Rate] - Sets an NPC's Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"); + c->Message(Chat::White, "Usage: #npcedit emoteid [Emote ID] - Sets an NPC's Emote ID"); + c->Message(Chat::White, "Usage: #npcedit spellscale [Scale Rate] - Sets an NPC's Spell Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"); + c->Message(Chat::White, "Usage: #npcedit healscale [Scale Rate] - Sets an NPC's Heal Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"); + c->Message(Chat::White, "Usage: #npcedit no_target [Flag] - Sets an NPC's No Target Hotkey Flag [0 = Not Targetable with Target Hotkey, 1 = Targetable with Target Hotkey]"); + c->Message(Chat::White, "Usage: #npcedit raidtarget [Flag] - Sets an NPC's Raid Target Flag [0 = Not a Raid Target, 1 = Raid Target]"); + c->Message(Chat::White, "Usage: #npcedit armtexture [Texture] - Sets an NPC's Arm Texture"); + c->Message(Chat::White, "Usage: #npcedit bracertexture [Texture] - Sets an NPC's Bracer Texture"); + c->Message(Chat::White, "Usage: #npcedit handtexture [Texture] - Sets an NPC's Hand Texture"); + c->Message(Chat::White, "Usage: #npcedit legtexture [Texture] - Sets an NPC's Leg Texture"); + c->Message(Chat::White, "Usage: #npcedit feettexture [Texture] - Sets an NPC's Feet Texture"); + c->Message(Chat::White, "Usage: #npcedit walkspeed [Walk Speed] - Sets an NPC's Walk Speed"); + c->Message(Chat::White, "Usage: #npcedit show_name [Flag] - Sets an NPC's Show Name Flag [0 = Hidden, 1 = Shown]"); + c->Message(Chat::White, "Usage: #npcedit untargetable [Flag] - Sets an NPC's Untargetable Flag [0 = Targetable, 1 = Untargetable]"); + c->Message(Chat::White, "Usage: #npcedit charm_ac [Armor Class] - Sets an NPC's Armor Class while Charmed"); + c->Message(Chat::White, "Usage: #npcedit charm_min_dmg [Damage] - Sets an NPC's Minimum Damage while Charmed"); + c->Message(Chat::White, "Usage: #npcedit charm_max_dmg [Damage] - Sets an NPC's Maximum Damage while Charmed"); + c->Message(Chat::White, "Usage: #npcedit charm_attack_delay [Attack Delay] - Sets an NPC's Attack Delay while Charmed"); + c->Message(Chat::White, "Usage: #npcedit charm_accuracy_rating [Accuracy] - Sets an NPC's Accuracy Rating while Charmed"); + c->Message(Chat::White, "Usage: #npcedit charm_avoidance_rating [Avoidance] - Sets an NPC's Avoidance Rating while Charmed"); + c->Message(Chat::White, "Usage: #npcedit charm_atk [Attack] - Sets an NPC's Attack while Charmed"); + c->Message(Chat::White, "Usage: #npcedit skip_global_loot [Flag] - Sets an NPC's Skip Global Loot Flag [0 = Don't Skip, 1 = Skip"); + c->Message(Chat::White, "Usage: #npcedit rarespawn [Flag] - Sets an NPC's Rare Spawn Flag [0 = Not a Rare Spawn, 1 = Rare Spawn]"); + c->Message(Chat::White, "Usage: #npcedit stuck_behavior [Stuck Behavior] - Sets an NPC's Stuck Behavior [0 = Run to Target, 1 = Warp to Target, 2 = Take No Action, 3 = Evade Combat]"); + c->Message(Chat::White, "Usage: #npcedit model [Race ID] - Sets an NPC's Race Model"); + c->Message(Chat::White, "Usage: #npcedit flymode [Fly Mode] - Sets an NPC's Fly Mode [0 = Ground, 1 = Flying, 2 = Levitating, 3 = Water, 4 = Floating, 5 = Levitating While Running]"); + c->Message(Chat::White, "Usage: #npcedit always_aggro [Flag] - Sets an NPC's Always Aggro Flag [0 = Does not Always Aggro, 1 = Always Aggro]"); + c->Message(Chat::White, "Usage: #npcedit exp_mod [Modifier] - Sets an NPC's Experience Modifier [50 = 50%, 100 = 100%, 200 = 200%]"); + c->Message(Chat::White, "Usage: #npcedit heroic_strikethrough [Heroic Strikethrough] - Sets an NPC's Heroic Strikethrough"); + c->Message(Chat::White, "Usage: #npcedit faction_amount [Faction Amount] - Sets an NPC's Faction Amount"); + c->Message(Chat::White, "Usage: #npcedit keeps_sold_items [Flag] - Sets an NPC's Keeps Sold Items Flag [0 = False, 1 = True]"); + c->Message(Chat::White, "Usage: #npcedit is_parcel_merchant [Flag] - Sets an NPC's Parcel Merchant Flag [0 = False, 1 = True]"); + c->Message(Chat::White, "Usage: #npcedit setanimation [Animation ID] - Sets an NPC's Animation on Spawn (Stored in spawn2 table)"); + c->Message(Chat::White, "Usage: #npcedit respawntime [Respawn Time] - Sets an NPC's Respawn Timer in Seconds (Stored in spawn2 table)"); + c->Message(Chat::White, "Usage: #npcedit set_grid [Grid ID] - Sets an NPC's Grid ID"); +} + void command_npcedit(Client *c, const Seperator *sep) { if (!c->GetTarget() || !c->GetTarget()->IsNPC()) { @@ -1727,113 +1836,4 @@ void command_npcedit(Client *c, const Seperator *sep) } c->Message(Chat::White, d.c_str()); -} - -void SendNPCEditSubCommands(Client *c) -{ - c->Message(Chat::White, "Usage: #npcedit name [Name] - Sets an NPC's Name"); - c->Message(Chat::White, "Usage: #npcedit lastname [Last Name] - Sets an NPC's Last Name"); - c->Message(Chat::White, "Usage: #npcedit level [Level] - Sets an NPC's Level"); - c->Message(Chat::White, "Usage: #npcedit race [Race ID] - Sets an NPC's Race"); - c->Message(Chat::White, "Usage: #npcedit class [Class ID] - Sets an NPC's Class"); - c->Message(Chat::White, "Usage: #npcedit bodytype [Body Type ID] - Sets an NPC's Bodytype"); - c->Message(Chat::White, "Usage: #npcedit hp [HP] - Sets an NPC's HP"); - c->Message(Chat::White, "Usage: #npcedit mana [Mana] - Sets an NPC's Mana"); - c->Message(Chat::White, "Usage: #npcedit gender [Gender ID] - Sets an NPC's Gender"); - c->Message(Chat::White, "Usage: #npcedit texture [Texture] - Sets an NPC's Texture"); - c->Message(Chat::White, "Usage: #npcedit helmtexture [Helmet Texture] - Sets an NPC's Helmet Texture"); - c->Message(Chat::White, "Usage: #npcedit herosforgemodel [Model Number] - Sets an NPC's Hero's Forge Model"); - c->Message(Chat::White, "Usage: #npcedit size [Size] - Sets an NPC's Size"); - c->Message(Chat::White, "Usage: #npcedit hpregen [HP Regen] - Sets an NPC's HP Regen Rate Per Tick"); - c->Message(Chat::White, "Usage: #npcedit hp_regen_per_second [HP Regen] - Sets an NPC's HP Regen Rate Per Second"); - c->Message(Chat::White, "Usage: #npcedit manaregen [Mana Regen] - Sets an NPC's Mana Regen Rate Per Tick"); - c->Message(Chat::White, "Usage: #npcedit loottable [Loottable ID] - Sets an NPC's Loottable ID"); - c->Message(Chat::White, "Usage: #npcedit merchantid [Merchant ID] - Sets an NPC's Merchant ID"); - c->Message(Chat::White, "Usage: #npcedit alt_currency_id [Alternate Currency ID] - Sets an NPC's Alternate Currency ID"); - c->Message(Chat::White, "Usage: #npcedit spell [Spell List ID] - Sets an NPC's Spells List ID"); - c->Message(Chat::White, "Usage: #npcedit npc_spells_effects_id [Spell Effects ID] - Sets an NPC's Spell Effects ID"); - c->Message(Chat::White, "Usage: #npcedit faction [Faction ID] - Sets an NPC's Faction ID"); - c->Message(Chat::White, "Usage: #npcedit adventure_template_id [Template ID] - Sets an NPC's Adventure Template ID"); - c->Message(Chat::White, "Usage: #npcedit trap_template [Template ID] - Sets an NPC's Trap Template ID"); - c->Message(Chat::White, "Usage: #npcedit damage [Minimum] [Maximum] - Sets an NPC's Damage"); - c->Message(Chat::White, "Usage: #npcedit attackcount [Attack Count] - Sets an NPC's Attack Count"); - c->Message(Chat::White, "Usage: #npcedit special_attacks [Special Attacks] - Sets an NPC's Special Attacks"); - c->Message(Chat::White, "Usage: #npcedit special_abilities [Special Abilities] - Sets an NPC's Special Abilities"); - c->Message(Chat::White, "Usage: #npcedit aggroradius [Radius] - Sets an NPC's Aggro Radius"); - c->Message(Chat::White, "Usage: #npcedit assistradius [Radius] - Sets an NPC's Assist Radius"); - c->Message(Chat::White, "Usage: #npcedit featuresave - Saves an NPC's current facial features to the database"); - c->Message(Chat::White, "Usage: #npcedit armortint_id [Armor Tint ID] - Sets an NPC's Armor Tint ID"); - c->Message(Chat::White, "Usage: #npcedit color [Red] [Green] [Blue] - Sets an NPC's Red, Green, and Blue armor tint"); - c->Message(Chat::White, "Usage: #npcedit ammoidfile [ID File] - Sets an NPC's Ammo ID File"); - c->Message(Chat::White, "Usage: #npcedit weapon [Primary Model] [Secondary Model] - Sets an NPC's Primary and Secondary Weapon Model"); - c->Message(Chat::White, "Usage: #npcedit meleetype [Primary Type] [Secondary Type] - Sets an NPC's Melee Skill Types"); - c->Message(Chat::White, "Usage: #npcedit rangedtype [Type] - Sets an NPC's Ranged Skill Type"); - c->Message(Chat::White, "Usage: #npcedit runspeed [Run Speed] - Sets an NPC's Run Speed"); - c->Message(Chat::White, "Usage: #npcedit mr [Resistance] - Sets an NPC's Magic Resistance"); - c->Message(Chat::White, "Usage: #npcedit pr [Resistance] - Sets an NPC's Poison Resistance"); - c->Message(Chat::White, "Usage: #npcedit dr [Resistance] - Sets an NPC's Disease Resistance"); - c->Message(Chat::White, "Usage: #npcedit fr [Resistance] - Sets an NPC's Fire Resistance"); - c->Message(Chat::White, "Usage: #npcedit cr [Resistance] - Sets an NPC's Cold Resistance"); - c->Message(Chat::White, "Usage: #npcedit corrup [Resistance] - Sets an NPC's Corruption Resistance"); - c->Message(Chat::White, "Usage: #npcedit phr [Resistance] - Sets and NPC's Physical Resistance"); - c->Message(Chat::White, "Usage: #npcedit seeinvis [Flag] - Sets an NPC's See Invisible Flag [0 = Cannot See Invisible, 1 = Can See Invisible]"); - c->Message(Chat::White, "Usage: #npcedit seeinvisundead [Flag] - Sets an NPC's See Invisible vs. Undead Flag [0 = Cannot See Invisible vs. Undead, 1 = Can See Invisible vs. Undead]"); - c->Message(Chat::White, "Usage: #npcedit qglobal [Flag] - Sets an NPC's Quest Global Flag [0 = Quest Globals Off, 1 = Quest Globals On]"); - c->Message(Chat::White, "Usage: #npcedit ac [Armor Class] - Sets an NPC's Armor Class"); - c->Message(Chat::White, "Usage: #npcedit npcaggro [Flag] - Sets an NPC's NPC Aggro Flag [0 = Aggro NPCs Off, 1 = Aggro NPCs On]"); - c->Message(Chat::White, "Usage: #npcedit spawn_limit [Limit] - Sets an NPC's Spawn Limit Counter"); - c->Message(Chat::White, "Usage: #npcedit attackspeed [Attack Speed] - Sets an NPC's Attack Speed Modifier"); - c->Message(Chat::White, "Usage: #npcedit attackdelay [Attack Delay] - Sets an NPC's Attack Delay"); - c->Message(Chat::White, "Usage: #npcedit findable [Flag] - Sets an NPC's Findable Flag [0 = Not Findable, 1 = Findable]"); - c->Message(Chat::White, "Usage: #npcedit str [Strength] - Sets an NPC's Strength"); - c->Message(Chat::White, "Usage: #npcedit sta [Stamina] - Sets an NPC's Stamina"); - c->Message(Chat::White, "Usage: #npcedit agi [Agility] - Sets an NPC's Agility"); - c->Message(Chat::White, "Usage: #npcedit dex [Dexterity] - Sets an NPC's Dexterity"); - c->Message(Chat::White, "Usage: #npcedit int [Intelligence] - Sets an NPC's Intelligence"); - c->Message(Chat::White, "Usage: #npcedit wis [Wisdom] - Sets an NPC's Wisdom"); - c->Message(Chat::White, "Usage: #npcedit cha [Charisma] - Sets an NPC's Charisma"); - c->Message(Chat::White, "Usage: #npcedit seehide [Flag] - Sets an NPC's See Hide Flag [0 = Cannot See Hide, 1 = Can See Hide]"); - c->Message(Chat::White, "Usage: #npcedit seeimprovedhide [Flag] - Sets an NPC's See Improved Hide Flag [0 = Cannot See Improved Hide, 1 = Can See Improved Hide]"); - c->Message(Chat::White, "Usage: #npcedit trackable [Flag] - Sets an NPC's Trackable Flag [0 = Not Trackable, 1 = Trackable]"); - c->Message(Chat::White, "Usage: #npcedit atk [Attack] - Sets an NPC's Attack"); - c->Message(Chat::White, "Usage: #npcedit accuracy [Accuracy] - Sets an NPC's Accuracy"); - c->Message(Chat::White, "Usage: #npcedit avoidance [Avoidance] - Sets an NPC's Avoidance"); - c->Message(Chat::White, "Usage: #npcedit slow_mitigation [Slow Mitigation] - Sets an NPC's Slow Mitigation"); - c->Message(Chat::White, "Usage: #npcedit version [Version] - Sets an NPC's Version"); - c->Message(Chat::White, "Usage: #npcedit maxlevel [Max Level] - Sets an NPC's Maximum Level"); - c->Message(Chat::White, "Usage: #npcedit scalerate [Scale Rate] - Sets an NPC's Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"); - c->Message(Chat::White, "Usage: #npcedit emoteid [Emote ID] - Sets an NPC's Emote ID"); - c->Message(Chat::White, "Usage: #npcedit spellscale [Scale Rate] - Sets an NPC's Spell Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"); - c->Message(Chat::White, "Usage: #npcedit healscale [Scale Rate] - Sets an NPC's Heal Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"); - c->Message(Chat::White, "Usage: #npcedit no_target [Flag] - Sets an NPC's No Target Hotkey Flag [0 = Not Targetable with Target Hotkey, 1 = Targetable with Target Hotkey]"); - c->Message(Chat::White, "Usage: #npcedit raidtarget [Flag] - Sets an NPC's Raid Target Flag [0 = Not a Raid Target, 1 = Raid Target]"); - c->Message(Chat::White, "Usage: #npcedit armtexture [Texture] - Sets an NPC's Arm Texture"); - c->Message(Chat::White, "Usage: #npcedit bracertexture [Texture] - Sets an NPC's Bracer Texture"); - c->Message(Chat::White, "Usage: #npcedit handtexture [Texture] - Sets an NPC's Hand Texture"); - c->Message(Chat::White, "Usage: #npcedit legtexture [Texture] - Sets an NPC's Leg Texture"); - c->Message(Chat::White, "Usage: #npcedit feettexture [Texture] - Sets an NPC's Feet Texture"); - c->Message(Chat::White, "Usage: #npcedit walkspeed [Walk Speed] - Sets an NPC's Walk Speed"); - c->Message(Chat::White, "Usage: #npcedit show_name [Flag] - Sets an NPC's Show Name Flag [0 = Hidden, 1 = Shown]"); - c->Message(Chat::White, "Usage: #npcedit untargetable [Flag] - Sets an NPC's Untargetable Flag [0 = Targetable, 1 = Untargetable]"); - c->Message(Chat::White, "Usage: #npcedit charm_ac [Armor Class] - Sets an NPC's Armor Class while Charmed"); - c->Message(Chat::White, "Usage: #npcedit charm_min_dmg [Damage] - Sets an NPC's Minimum Damage while Charmed"); - c->Message(Chat::White, "Usage: #npcedit charm_max_dmg [Damage] - Sets an NPC's Maximum Damage while Charmed"); - c->Message(Chat::White, "Usage: #npcedit charm_attack_delay [Attack Delay] - Sets an NPC's Attack Delay while Charmed"); - c->Message(Chat::White, "Usage: #npcedit charm_accuracy_rating [Accuracy] - Sets an NPC's Accuracy Rating while Charmed"); - c->Message(Chat::White, "Usage: #npcedit charm_avoidance_rating [Avoidance] - Sets an NPC's Avoidance Rating while Charmed"); - c->Message(Chat::White, "Usage: #npcedit charm_atk [Attack] - Sets an NPC's Attack while Charmed"); - c->Message(Chat::White, "Usage: #npcedit skip_global_loot [Flag] - Sets an NPC's Skip Global Loot Flag [0 = Don't Skip, 1 = Skip"); - c->Message(Chat::White, "Usage: #npcedit rarespawn [Flag] - Sets an NPC's Rare Spawn Flag [0 = Not a Rare Spawn, 1 = Rare Spawn]"); - c->Message(Chat::White, "Usage: #npcedit stuck_behavior [Stuck Behavior] - Sets an NPC's Stuck Behavior [0 = Run to Target, 1 = Warp to Target, 2 = Take No Action, 3 = Evade Combat]"); - c->Message(Chat::White, "Usage: #npcedit model [Race ID] - Sets an NPC's Race Model"); - c->Message(Chat::White, "Usage: #npcedit flymode [Fly Mode] - Sets an NPC's Fly Mode [0 = Ground, 1 = Flying, 2 = Levitating, 3 = Water, 4 = Floating, 5 = Levitating While Running]"); - c->Message(Chat::White, "Usage: #npcedit always_aggro [Flag] - Sets an NPC's Always Aggro Flag [0 = Does not Always Aggro, 1 = Always Aggro]"); - c->Message(Chat::White, "Usage: #npcedit exp_mod [Modifier] - Sets an NPC's Experience Modifier [50 = 50%, 100 = 100%, 200 = 200%]"); - c->Message(Chat::White, "Usage: #npcedit heroic_strikethrough [Heroic Strikethrough] - Sets an NPC's Heroic Strikethrough"); - c->Message(Chat::White, "Usage: #npcedit faction_amount [Faction Amount] - Sets an NPC's Faction Amount"); - c->Message(Chat::White, "Usage: #npcedit keeps_sold_items [Flag] - Sets an NPC's Keeps Sold Items Flag [0 = False, 1 = True]"); - c->Message(Chat::White, "Usage: #npcedit is_parcel_merchant [Flag] - Sets an NPC's Parcel Merchant Flag [0 = False, 1 = True]"); - c->Message(Chat::White, "Usage: #npcedit setanimation [Animation ID] - Sets an NPC's Animation on Spawn (Stored in spawn2 table)"); - c->Message(Chat::White, "Usage: #npcedit respawntime [Respawn Time] - Sets an NPC's Respawn Timer in Seconds (Stored in spawn2 table)"); - c->Message(Chat::White, "Usage: #npcedit set_grid [Grid ID] - Sets an NPC's Grid ID"); -} +} \ No newline at end of file diff --git a/zone/gm_commands/parcels.cpp b/zone/gm_commands/parcels.cpp index 07cb8244c..141dfdd69 100644 --- a/zone/gm_commands/parcels.cpp +++ b/zone/gm_commands/parcels.cpp @@ -1,9 +1,23 @@ #include "../client.h" +#include "../queryserv.h" #include "../worldserver.h" -#include "../../common/events/player_events.h" +#include "../../common/events/player_event_logs.h" +#include "../string_ids.h" +extern QueryServ *QServ; extern WorldServer worldserver; +void SendParcelsSubCommands(Client *c) +{ + c->Message(Chat::White, "#parcels listdb [Character Name]"); + c->Message(Chat::White, "#parcels listmemory [Character Name] (Must be in the same zone)"); + c->Message( + Chat::White, + "#parcels add [Character Name] [item id] [quantity] [note]. To send money use item id of 99990. Quantity is valid for stackable items, charges on an item, or amount of copper." + ); + c->Message(Chat::White, "#parcels details [Character Name]"); +} + void command_parcels(Client *c, const Seperator *sep) { const auto arguments = sep->argnum; @@ -305,15 +319,4 @@ void command_parcels(Client *c, const Seperator *sep) c->SendParcelDeliveryToWorld(ps); } } -} - -void SendParcelsSubCommands(Client *c) -{ - c->Message(Chat::White, "#parcels listdb [Character Name]"); - c->Message(Chat::White, "#parcels listmemory [Character Name] (Must be in the same zone)"); - c->Message( - Chat::White, - "#parcels add [Character Name] [item id] [quantity] [note]. To send money use item id of 99990. Quantity is valid for stackable items, charges on an item, or amount of copper." - ); - c->Message(Chat::White, "#parcels details [Character Name]"); -} +} \ No newline at end of file diff --git a/zone/gm_commands/petitems.cpp b/zone/gm_commands/petitems.cpp index 5fded03cc..6dd6462e5 100644 --- a/zone/gm_commands/petitems.cpp +++ b/zone/gm_commands/petitems.cpp @@ -1,3 +1,4 @@ +#include "../bot.h" #include "../client.h" void command_petitems(Client *c, const Seperator *sep) diff --git a/zone/gm_commands/set/haste.cpp b/zone/gm_commands/set/haste.cpp index a7e9b118f..96647c970 100644 --- a/zone/gm_commands/set/haste.cpp +++ b/zone/gm_commands/set/haste.cpp @@ -1,3 +1,4 @@ +#include "../../bot.h" #include "../../client.h" void SetHaste(Client *c, const Seperator *sep) diff --git a/zone/gm_commands/show/inventory.cpp b/zone/gm_commands/show/inventory.cpp index 2cffdc82f..2a3e2a377 100644 --- a/zone/gm_commands/show/inventory.cpp +++ b/zone/gm_commands/show/inventory.cpp @@ -1,6 +1,22 @@ #include "../../client.h" #include "../../object.h" +void SendShowInventorySubCommands(Client* c) { + c->Message(Chat::White, "Usage: #show inventory equip - Shows items in Equipment slots"); + c->Message(Chat::White, "Usage: #show inventory gen - Shows items in General slots"); + c->Message(Chat::White, "Usage: #show inventory cursor - Shows items in Cursor slots"); + c->Message(Chat::White, "Usage: #show inventory poss - Shows items in Equipment, General, and Cursor slots"); + c->Message(Chat::White, "Usage: #show inventory limbo - Shows items in Limbo slots"); + c->Message(Chat::White, "Usage: #show inventory curlim - Shows items in Cursor and Limbo slots"); + c->Message(Chat::White, "Usage: #show inventory trib - Shows items in Tribute slots"); + c->Message(Chat::White, "Usage: #show inventory bank - Shows items in Bank slots"); + c->Message(Chat::White, "Usage: #show inventory shbank - Shows items in Shared Bank slots"); + c->Message(Chat::White, "Usage: #show inventory allbank - Shows items in Bank and Shared Bank slots"); + c->Message(Chat::White, "Usage: #show inventory trade - Shows items in Trade slots"); + c->Message(Chat::White, "Usage: #show inventory world - Shows items in World slots"); + c->Message(Chat::White, "Usage: #show inventory all - Shows items in all slots"); +} + void ShowInventory(Client *c, const Seperator *sep) { const auto arguments = sep->argnum; @@ -432,20 +448,4 @@ void ShowInventory(Client *c, const Seperator *sep) if (!found_items) { c->Message(Chat::White, "No items found."); } -} - -void SendShowInventorySubCommands(Client* c) { - c->Message(Chat::White, "Usage: #show inventory equip - Shows items in Equipment slots"); - c->Message(Chat::White, "Usage: #show inventory gen - Shows items in General slots"); - c->Message(Chat::White, "Usage: #show inventory cursor - Shows items in Cursor slots"); - c->Message(Chat::White, "Usage: #show inventory poss - Shows items in Equipment, General, and Cursor slots"); - c->Message(Chat::White, "Usage: #show inventory limbo - Shows items in Limbo slots"); - c->Message(Chat::White, "Usage: #show inventory curlim - Shows items in Cursor and Limbo slots"); - c->Message(Chat::White, "Usage: #show inventory trib - Shows items in Tribute slots"); - c->Message(Chat::White, "Usage: #show inventory bank - Shows items in Bank slots"); - c->Message(Chat::White, "Usage: #show inventory shbank - Shows items in Shared Bank slots"); - c->Message(Chat::White, "Usage: #show inventory allbank - Shows items in Bank and Shared Bank slots"); - c->Message(Chat::White, "Usage: #show inventory trade - Shows items in Trade slots"); - c->Message(Chat::White, "Usage: #show inventory world - Shows items in World slots"); - c->Message(Chat::White, "Usage: #show inventory all - Shows items in all slots"); -} +} \ No newline at end of file diff --git a/zone/gm_commands/zone.cpp b/zone/gm_commands/zone.cpp index 13601da4d..99317e232 100644 --- a/zone/gm_commands/zone.cpp +++ b/zone/gm_commands/zone.cpp @@ -1,3 +1,4 @@ +#include "../bot.h" #include "../client.h" void command_zone(Client *c, const Seperator *sep) diff --git a/zone/lua_zone.cpp b/zone/lua_zone.cpp index 79f4f0982..feadb4f3c 100644 --- a/zone/lua_zone.cpp +++ b/zone/lua_zone.cpp @@ -4,7 +4,6 @@ #include #include "../common/global_define.h" -#include "embperl.h" #include "lua_zone.h" bool Lua_Zone::BuffTimersSuspended() From e846bb86b64b73dfccef04e6b8b1818dfd4b170e Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Sun, 22 Jun 2025 02:08:15 -0500 Subject: [PATCH 04/18] [Code] Remove Regex Compile Bloat (#4947) --- common/discord/discord.h | 1 - utils/scripts/build/should-release/go.mod | 4 +++- zone/cli/tests/npc_handins_multiquest.cpp | 1 - zone/dialogue_window.cpp | 19 ++++++++++++------- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/common/discord/discord.h b/common/discord/discord.h index 5cc59202a..8b8a19290 100644 --- a/common/discord/discord.h +++ b/common/discord/discord.h @@ -4,7 +4,6 @@ #include #include "../types.h" -#include "../http/httplib.h" #include "../repositories/player_event_logs_repository.h" #include "../events/player_events.h" diff --git a/utils/scripts/build/should-release/go.mod b/utils/scripts/build/should-release/go.mod index b74fc2889..eaa798134 100644 --- a/utils/scripts/build/should-release/go.mod +++ b/utils/scripts/build/should-release/go.mod @@ -1,6 +1,8 @@ module should-release -go 1.18 +go 1.23.0 + +toolchain go1.23.5 require ( github.com/google/go-github/v41 v41.0.0 diff --git a/zone/cli/tests/npc_handins_multiquest.cpp b/zone/cli/tests/npc_handins_multiquest.cpp index 43f141591..39af0d952 100644 --- a/zone/cli/tests/npc_handins_multiquest.cpp +++ b/zone/cli/tests/npc_handins_multiquest.cpp @@ -1,4 +1,3 @@ -#include "../../common/http/httplib.h" #include "../../common/eqemu_logsys.h" #include "../../common/platform.h" #include "../../zone.h" diff --git a/zone/dialogue_window.cpp b/zone/dialogue_window.cpp index a02e90723..326d706d4 100644 --- a/zone/dialogue_window.cpp +++ b/zone/dialogue_window.cpp @@ -1,5 +1,3 @@ -#include - #include "dialogue_window.h" void DialogueWindow::Render(Client *c, std::string markdown) @@ -529,12 +527,19 @@ std::string DialogueWindow::CenterMessage(std::string message) return std::string(); } - auto cleaned_message = message; + std::string cleaned_message; + cleaned_message.reserve(message.size()); - std::regex tags("<[^>]*>"); - - if (std::regex_search(cleaned_message, tags)) { - std::regex_replace(cleaned_message, tags, cleaned_message); + // Strip HTML-like tags + bool in_tag = false; + for (char c : message) { + if (c == '<') { + in_tag = true; + } else if (c == '>' && in_tag) { + in_tag = false; + } else if (!in_tag) { + cleaned_message += c; + } } auto message_len = cleaned_message.length(); From df86ad371b9dc6a086a50838905c34a25d3c4eb9 Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Sun, 22 Jun 2025 12:50:52 -0500 Subject: [PATCH 05/18] [Code] PathManager Global to Singleton Cleanup (#4924) --- client_files/export/main.cpp | 13 ++++++------- client_files/import/main.cpp | 13 ++++++------- common/eqemu_config.cpp | 4 ++-- common/eqemu_config.h | 2 +- common/eqemu_logsys.cpp | 6 +++--- common/ipc_mutex.cpp | 2 +- common/patches/rof.cpp | 4 ++-- common/patches/rof2.cpp | 4 ++-- common/patches/sod.cpp | 4 ++-- common/patches/sof.cpp | 4 ++-- common/patches/titanium.cpp | 4 ++-- common/patches/uf.cpp | 4 ++-- common/path_manager.cpp | 2 +- common/path_manager.h | 10 +++++++--- common/shareddb.cpp | 4 ++-- eqlaunch/eqlaunch.cpp | 3 +-- loginserver/client_manager.cpp | 6 +++--- loginserver/main.cpp | 5 ++--- queryserv/queryserv.cpp | 5 ++--- shared_memory/main.cpp | 5 ++--- tests/main.cpp | 3 +-- ucs/clientlist.cpp | 2 +- ucs/ucs.cpp | 5 ++--- world/main.cpp | 3 +-- world/world_boot.cpp | 4 ++-- zone/embperl.cpp | 2 +- zone/lua_parser.cpp | 12 ++++++------ zone/main.cpp | 7 +++---- zone/map.cpp | 2 +- zone/pathfinder_interface.cpp | 2 +- zone/quest_parser_collection.cpp | 22 +++++++++++----------- zone/questmgr.cpp | 2 +- zone/water_map.cpp | 2 +- 33 files changed, 83 insertions(+), 89 deletions(-) diff --git a/client_files/export/main.cpp b/client_files/export/main.cpp index a930d5404..faad88103 100644 --- a/client_files/export/main.cpp +++ b/client_files/export/main.cpp @@ -41,7 +41,6 @@ EQEmuLogSys LogSys; WorldContentService content_service; ZoneStore zone_store; -PathManager path; PlayerEventLogs player_event_logs; EvolvingItemsManager evolving_items_manager; @@ -56,7 +55,7 @@ int main(int argc, char **argv) LogSys.LoadLogSettingsDefaults(); set_exception_handler(); - path.LoadPaths(); + PathManager::Instance()->Init(); LogInfo("Client Files Export Utility"); if (!EQEmuConfig::LoadConfig()) { @@ -100,7 +99,7 @@ int main(int argc, char **argv) } LogSys.SetDatabase(&database) - ->SetLogPath(path.GetLogPath()) + ->SetLogPath(PathManager::Instance()->GetLogPath()) ->LoadLogDatabaseSettings() ->StartFileLogs(); @@ -136,7 +135,7 @@ int main(int argc, char **argv) void ExportSpells(SharedDatabase* db) { - std::ofstream file(fmt::format("{}/export/spells_us.txt", path.GetServerPath())); + std::ofstream file(fmt::format("{}/export/spells_us.txt", PathManager::Instance()->GetServerPath())); if (!file || !file.is_open()) { LogError("Unable to open export/spells_us.txt to write, skipping."); return; @@ -155,7 +154,7 @@ void ExportSpells(SharedDatabase* db) void ExportSkillCaps(SharedDatabase* db) { - std::ofstream file(fmt::format("{}/export/SkillCaps.txt", path.GetServerPath())); + std::ofstream file(fmt::format("{}/export/SkillCaps.txt", PathManager::Instance()->GetServerPath())); if (!file || !file.is_open()) { LogError("Unable to open export/SkillCaps.txt to write, skipping."); return; @@ -174,7 +173,7 @@ void ExportSkillCaps(SharedDatabase* db) void ExportBaseData(SharedDatabase *db) { - std::ofstream file(fmt::format("{}/export/BaseData.txt", path.GetServerPath())); + std::ofstream file(fmt::format("{}/export/BaseData.txt", PathManager::Instance()->GetServerPath())); if (!file || !file.is_open()) { LogError("Unable to open export/BaseData.txt to write, skipping."); return; @@ -193,7 +192,7 @@ void ExportBaseData(SharedDatabase *db) void ExportDBStrings(SharedDatabase *db) { - std::ofstream file(fmt::format("{}/export/dbstr_us.txt", path.GetServerPath())); + std::ofstream file(fmt::format("{}/export/dbstr_us.txt", PathManager::Instance()->GetServerPath())); if (!file || !file.is_open()) { LogError("Unable to open export/dbstr_us.txt to write, skipping."); return; diff --git a/client_files/import/main.cpp b/client_files/import/main.cpp index 74f447a23..286f76572 100644 --- a/client_files/import/main.cpp +++ b/client_files/import/main.cpp @@ -35,7 +35,6 @@ EQEmuLogSys LogSys; WorldContentService content_service; ZoneStore zone_store; -PathManager path; PlayerEventLogs player_event_logs; EvolvingItemsManager evolving_items_manager; @@ -49,7 +48,7 @@ int main(int argc, char **argv) { LogSys.LoadLogSettingsDefaults(); set_exception_handler(); - path.LoadPaths(); + PathManager::Instance()->Init(); LogInfo("Client Files Import Utility"); if(!EQEmuConfig::LoadConfig()) { @@ -93,7 +92,7 @@ int main(int argc, char **argv) { } LogSys.SetDatabase(&database) - ->SetLogPath(path.GetLogPath()) + ->SetLogPath(PathManager::Instance()->GetLogPath()) ->LoadLogDatabaseSettings() ->StartFileLogs(); @@ -138,7 +137,7 @@ bool IsStringField(int i) { void ImportSpells(SharedDatabase *db) { LogInfo("Importing Spells"); - std::string file = fmt::format("{}/import/spells_us.txt", path.GetServerPath()); + std::string file = fmt::format("{}/import/spells_us.txt", PathManager::Instance()->GetServerPath()); FILE *f = fopen(file.c_str(), "r"); if(!f) { LogError("Unable to open {} to read, skipping.", file); @@ -228,7 +227,7 @@ void ImportSpells(SharedDatabase *db) { void ImportSkillCaps(SharedDatabase *db) { LogInfo("Importing Skill Caps"); - std::string file = fmt::format("{}/import/SkillCaps.txt", path.GetServerPath()); + std::string file = fmt::format("{}/import/SkillCaps.txt", PathManager::Instance()->GetServerPath()); FILE *f = fopen(file.c_str(), "r"); if(!f) { LogError("Unable to open {} to read, skipping.", file); @@ -265,7 +264,7 @@ void ImportBaseData(SharedDatabase *db) { LogInfo("Importing Base Data"); - const std::string& file_name = fmt::format("{}/import/BaseData.txt", path.GetServerPath()); + const std::string& file_name = fmt::format("{}/import/BaseData.txt", PathManager::Instance()->GetServerPath()); const auto& file_contents = File::GetContents(file_name); if (!file_contents.error.empty()) { @@ -305,7 +304,7 @@ void ImportBaseData(SharedDatabase *db) void ImportDBStrings(SharedDatabase *db) { LogInfo("Importing DB Strings"); - std::string file = fmt::format("{}/import/dbstr_us.txt", path.GetServerPath()); + std::string file = fmt::format("{}/import/dbstr_us.txt", PathManager::Instance()->GetServerPath()); FILE *f = fopen(file.c_str(), "r"); if(!f) { LogError("Unable to open {} to read, skipping.", file); diff --git a/common/eqemu_config.cpp b/common/eqemu_config.cpp index 453234604..e2f35106c 100644 --- a/common/eqemu_config.cpp +++ b/common/eqemu_config.cpp @@ -436,11 +436,11 @@ void EQEmuConfig::CheckUcsConfigConversion() LogInfo("Migrating old [eqemu_config] UCS configuration to new configuration"); std::string config_file_path = std::filesystem::path{ - path.GetServerPath() + "/eqemu_config.json" + PathManager::Instance()->GetServerPath() + "/eqemu_config.json" }.string(); std::string config_file_bak_path = std::filesystem::path{ - path.GetServerPath() + "/eqemu_config.ucs-migrate-json.bak" + PathManager::Instance()->GetServerPath() + "/eqemu_config.ucs-migrate-json.bak" }.string(); // copy eqemu_config.json to eqemu_config.json.bak diff --git a/common/eqemu_config.h b/common/eqemu_config.h index 6ba637ea8..57a0543c8 100644 --- a/common/eqemu_config.h +++ b/common/eqemu_config.h @@ -191,7 +191,7 @@ class EQEmuConfig std::string file = fmt::format( "{}/{}", - (file_path.empty() ? path.GetServerPath() : file_path), + (file_path.empty() ? PathManager::Instance()->GetServerPath() : file_path), EQEmuConfig::ConfigFile ); diff --git a/common/eqemu_logsys.cpp b/common/eqemu_logsys.cpp index bb28d0aec..3e9fc9402 100644 --- a/common/eqemu_logsys.cpp +++ b/common/eqemu_logsys.cpp @@ -537,9 +537,9 @@ void EQEmuLogSys::StartFileLogs(const std::string &log_name) { EQEmuLogSys::CloseFileLogs(); - if (!File::Exists(path.GetLogPath())) { - LogInfo("Logs directory not found, creating [{}]", path.GetLogPath()); - File::Makedir(path.GetLogPath()); + if (!File::Exists(PathManager::Instance()->GetLogPath())) { + LogInfo("Logs directory not found, creating [{}]", PathManager::Instance()->GetLogPath()); + File::Makedir(PathManager::Instance()->GetLogPath()); } /** diff --git a/common/ipc_mutex.cpp b/common/ipc_mutex.cpp index e2c123f22..ebd13a693 100644 --- a/common/ipc_mutex.cpp +++ b/common/ipc_mutex.cpp @@ -55,7 +55,7 @@ namespace EQ { EQ_EXCEPT("IPC Mutex", "Could not create mutex."); } #else - std::string final_name = fmt::format("{}/{}.lock", path.GetSharedMemoryPath(), name); + std::string final_name = fmt::format("{}/{}.lock", PathManager::Instance()->GetSharedMemoryPath(), name); #ifdef __DARWIN #if __DARWIN_C_LEVEL < 200809L diff --git a/common/patches/rof.cpp b/common/patches/rof.cpp index 0e23bb429..15b745b16 100644 --- a/common/patches/rof.cpp +++ b/common/patches/rof.cpp @@ -78,7 +78,7 @@ namespace RoF { //create our opcode manager if we havent already if (opcodes == nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); //load up the opcode manager. //TODO: figure out how to support shared memory with multiple patches... @@ -117,7 +117,7 @@ namespace RoF //we need to go to every stream and replace it's manager. if (opcodes != nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); if (!opcodes->ReloadOpcodes(opfile.c_str())) { LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); return; diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index 747d68204..0d4043d30 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -81,7 +81,7 @@ namespace RoF2 //create our opcode manager if we havent already if (opcodes == nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); //load up the opcode manager. //TODO: figure out how to support shared memory with multiple patches... @@ -123,7 +123,7 @@ namespace RoF2 //we need to go to every stream and replace it's manager. if (opcodes != nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); if (!opcodes->ReloadOpcodes(opfile.c_str())) { LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); return; diff --git a/common/patches/sod.cpp b/common/patches/sod.cpp index d8f174196..b7eb890e7 100644 --- a/common/patches/sod.cpp +++ b/common/patches/sod.cpp @@ -72,7 +72,7 @@ namespace SoD { //create our opcode manager if we havent already if (opcodes == nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); //load up the opcode manager. //TODO: figure out how to support shared memory with multiple patches... opcodes = new RegularOpcodeManager(); @@ -113,7 +113,7 @@ namespace SoD //we need to go to every stream and replace it's manager. if (opcodes != nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); if (!opcodes->ReloadOpcodes(opfile.c_str())) { LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); return; diff --git a/common/patches/sof.cpp b/common/patches/sof.cpp index be18a78c7..0b31cb2f2 100644 --- a/common/patches/sof.cpp +++ b/common/patches/sof.cpp @@ -71,7 +71,7 @@ namespace SoF { //create our opcode manager if we havent already if (opcodes == nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); //load up the opcode manager. //TODO: figure out how to support shared memory with multiple patches... opcodes = new RegularOpcodeManager(); @@ -110,7 +110,7 @@ namespace SoF //we need to go to every stream and replace it's manager. if (opcodes != nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); if (!opcodes->ReloadOpcodes(opfile.c_str())) { LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); return; diff --git a/common/patches/titanium.cpp b/common/patches/titanium.cpp index e9cec60a6..9c8a1df07 100644 --- a/common/patches/titanium.cpp +++ b/common/patches/titanium.cpp @@ -73,7 +73,7 @@ namespace Titanium auto Config = EQEmuConfig::get(); //create our opcode manager if we havent already if (opcodes == nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); //load up the opcode manager. //TODO: figure out how to support shared memory with multiple patches... opcodes = new RegularOpcodeManager(); @@ -114,7 +114,7 @@ namespace Titanium //we need to go to every stream and replace it's manager. if (opcodes != nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); if (!opcodes->ReloadOpcodes(opfile.c_str())) { LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); return; diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index 35452727b..6433621f5 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -76,7 +76,7 @@ namespace UF { //create our opcode manager if we havent already if (opcodes == nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); //load up the opcode manager. //TODO: figure out how to support shared memory with multiple patches... opcodes = new RegularOpcodeManager(); @@ -117,7 +117,7 @@ namespace UF //we need to go to every stream and replace it's manager. if (opcodes != nullptr) { - std::string opfile = fmt::format("{}/patch_{}.conf", path.GetPatchPath(), name); + std::string opfile = fmt::format("{}/patch_{}.conf", PathManager::Instance()->GetPatchPath(), name); if (!opcodes->ReloadOpcodes(opfile.c_str())) { LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); return; diff --git a/common/path_manager.cpp b/common/path_manager.cpp index ed57f2f4a..c63835854 100644 --- a/common/path_manager.cpp +++ b/common/path_manager.cpp @@ -8,7 +8,7 @@ namespace fs = std::filesystem; -void PathManager::LoadPaths() +void PathManager::Init() { m_server_path = File::FindEqemuConfigPath(); diff --git a/common/path_manager.h b/common/path_manager.h index 55cc1489c..67919511e 100644 --- a/common/path_manager.h +++ b/common/path_manager.h @@ -7,7 +7,13 @@ class PathManager { public: - void LoadPaths(); + void Init(); + + static PathManager *Instance() + { + static PathManager instance; + return &instance; + } [[nodiscard]] const std::string &GetLogPath() const; [[nodiscard]] const std::string &GetLuaModsPath() const; @@ -38,6 +44,4 @@ private: std::string m_shared_memory_path; }; -extern PathManager path; - #endif //EQEMU_PATH_MANAGER_H diff --git a/common/shareddb.cpp b/common/shareddb.cpp index 1187d80bb..8fe9d61bf 100644 --- a/common/shareddb.cpp +++ b/common/shareddb.cpp @@ -974,7 +974,7 @@ bool SharedDatabase::LoadItems(const std::string &prefix) { const auto Config = EQEmuConfig::get(); EQ::IPCMutex mutex("items"); mutex.Lock(); - std::string file_name = fmt::format("{}/{}{}", path.GetSharedMemoryPath(), prefix, std::string("items")); + std::string file_name = fmt::format("{}/{}{}", PathManager::Instance()->GetSharedMemoryPath(), prefix, std::string("items")); items_mmf = std::make_unique(file_name); items_hash = std::make_unique>(static_cast(items_mmf->Get()), items_mmf->Size()); mutex.Unlock(); @@ -1665,7 +1665,7 @@ bool SharedDatabase::LoadSpells(const std::string &prefix, int32 *records, const EQ::IPCMutex mutex("spells"); mutex.Lock(); - std::string file_name = fmt::format("{}/{}{}", path.GetSharedMemoryPath(), prefix, std::string("spells")); + std::string file_name = fmt::format("{}/{}{}", PathManager::Instance()->GetSharedMemoryPath(), prefix, std::string("spells")); spells_mmf = std::make_unique(file_name); LogInfo("Loading [{}]", file_name); *records = *static_cast(spells_mmf->Get()); diff --git a/eqlaunch/eqlaunch.cpp b/eqlaunch/eqlaunch.cpp index ea41b1803..932b52f3f 100644 --- a/eqlaunch/eqlaunch.cpp +++ b/eqlaunch/eqlaunch.cpp @@ -34,7 +34,6 @@ #include EQEmuLogSys LogSys; -PathManager path; bool RunLoops = false; @@ -45,7 +44,7 @@ int main(int argc, char *argv[]) { LogSys.LoadLogSettingsDefaults(); set_exception_handler(); - path.LoadPaths(); + PathManager::Instance()->Init(); std::string launcher_name; if(argc == 2) { diff --git a/loginserver/client_manager.cpp b/loginserver/client_manager.cpp index 8f283c973..5767f538b 100644 --- a/loginserver/client_manager.cpp +++ b/loginserver/client_manager.cpp @@ -94,7 +94,7 @@ ClientManager::ClientManager() std::string opcodes_path = fmt::format( "{}/{}", - path.GetOpcodePath(), + PathManager::Instance()->GetOpcodePath(), "login_opcodes.conf" ); @@ -131,7 +131,7 @@ ClientManager::ClientManager() opcodes_path = fmt::format( "{}/{}", - path.GetOpcodePath(), + PathManager::Instance()->GetOpcodePath(), "login_opcodes_sod.conf" ); @@ -169,7 +169,7 @@ ClientManager::ClientManager() opcodes_path = fmt::format( "{}/{}", - path.GetOpcodePath(), + PathManager::Instance()->GetOpcodePath(), "login_opcodes_larion.conf" ); diff --git a/loginserver/main.cpp b/loginserver/main.cpp index c541930ff..f1dc3ab09 100644 --- a/loginserver/main.cpp +++ b/loginserver/main.cpp @@ -24,7 +24,6 @@ LoginServer server; EQEmuLogSys LogSys; bool run_server = true; -PathManager path; Database database; PlayerEventLogs player_event_logs; ZoneStore zone_store; @@ -52,7 +51,7 @@ void LoadDatabaseConnection() void LoadServerConfig() { server.config = EQ::JsonConfigFile::Load( - fmt::format("{}/login.json", path.GetServerPath()) + fmt::format("{}/login.json", PathManager::Instance()->GetServerPath()) ); LogInfo("Config System Init"); @@ -162,7 +161,7 @@ int main(int argc, char **argv) LogSys.LoadLogSettingsDefaults(); } - path.LoadPaths(); + PathManager::Instance()->Init(); // command handler if (argc > 1) { diff --git a/queryserv/queryserv.cpp b/queryserv/queryserv.cpp index 74c6244a8..2224443d4 100644 --- a/queryserv/queryserv.cpp +++ b/queryserv/queryserv.cpp @@ -31,7 +31,6 @@ std::string WorldShortName; const queryservconfig *Config; WorldServer *worldserver = 0; EQEmuLogSys LogSys; -PathManager path; ZoneStore zone_store; PlayerEventLogs player_event_logs; ZSList zs_list; @@ -50,7 +49,7 @@ int main() set_exception_handler(); Timer LFGuildExpireTimer(60000); - path.LoadPaths(); + PathManager::Instance()->Init(); LogInfo("Starting EQEmu QueryServ"); if (!queryservconfig::LoadConfig()) { @@ -86,7 +85,7 @@ int main() } LogSys.SetDatabase(&database) - ->SetLogPath(path.GetLogPath()) + ->SetLogPath(PathManager::Instance()->GetLogPath()) ->LoadLogDatabaseSettings() ->StartFileLogs(); diff --git a/shared_memory/main.cpp b/shared_memory/main.cpp index f395867ce..03d44a03f 100644 --- a/shared_memory/main.cpp +++ b/shared_memory/main.cpp @@ -38,7 +38,6 @@ EQEmuLogSys LogSys; WorldContentService content_service; ZoneStore zone_store; -PathManager path; PlayerEventLogs player_event_logs; EvolvingItemsManager evolving_items_manager; @@ -84,7 +83,7 @@ int main(int argc, char **argv) LogSys.LoadLogSettingsDefaults(); set_exception_handler(); - path.LoadPaths(); + PathManager::Instance()->Init(); LogInfo("Shared Memory Loader Program"); if (!EQEmuConfig::LoadConfig()) { @@ -127,7 +126,7 @@ int main(int argc, char **argv) } LogSys.SetDatabase(&database) - ->SetLogPath(path.GetLogPath()) + ->SetLogPath(PathManager::Instance()->GetLogPath()) ->LoadLogDatabaseSettings() ->StartFileLogs(); diff --git a/tests/main.cpp b/tests/main.cpp index 50ddf890b..03f3deacf 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -35,13 +35,12 @@ const EQEmuConfig *Config; EQEmuLogSys LogSys; -PathManager path; int main() { RegisterExecutablePlatform(ExePlatformClientImport); LogSys.LoadLogSettingsDefaults(); - path.LoadPaths(); + PathManager::Instance()->Init(); auto ConfigLoadResult = EQEmuConfig::LoadConfig(); Config = EQEmuConfig::get(); diff --git a/ucs/clientlist.cpp b/ucs/clientlist.cpp index cbb6e0910..7d11abe82 100644 --- a/ucs/clientlist.cpp +++ b/ucs/clientlist.cpp @@ -482,7 +482,7 @@ Clientlist::Clientlist(int ChatPort) { const ucsconfig *Config = ucsconfig::get(); - std::string opcodes_file = fmt::format("{}/{}", path.GetServerPath(), Config->MailOpCodesFile); + std::string opcodes_file = fmt::format("{}/{}", PathManager::Instance()->GetServerPath(), Config->MailOpCodesFile); LogInfo("Loading [{}]", opcodes_file); if (!ChatOpMgr->LoadOpcodes(opcodes_file.c_str())) diff --git a/ucs/ucs.cpp b/ucs/ucs.cpp index c89c3f4fd..92909e921 100644 --- a/ucs/ucs.cpp +++ b/ucs/ucs.cpp @@ -48,7 +48,6 @@ EQEmuLogSys LogSys; UCSDatabase database; WorldServer *worldserver = nullptr; DiscordManager discord_manager; -PathManager path; ZoneStore zone_store; PlayerEventLogs player_event_logs; @@ -107,7 +106,7 @@ int main() { LogSys.LoadLogSettingsDefaults(); set_exception_handler(); - path.LoadPaths(); + PathManager::Instance()->Init(); // Check every minute for unused channels we can delete // @@ -140,7 +139,7 @@ int main() { } LogSys.SetDatabase(&database) - ->SetLogPath(path.GetLogPath()) + ->SetLogPath(PathManager::Instance()->GetLogPath()) ->LoadLogDatabaseSettings() ->StartFileLogs(); diff --git a/world/main.cpp b/world/main.cpp index 8c5c66ee2..a6be1319b 100644 --- a/world/main.cpp +++ b/world/main.cpp @@ -111,7 +111,6 @@ const WorldConfig *Config; EQEmuLogSys LogSys; WorldContentService content_service; WebInterfaceList web_interface; -PathManager path; PlayerEventLogs player_event_logs; EvolvingItemsManager evolving_items_manager; @@ -142,7 +141,7 @@ int main(int argc, char **argv) return 0; } - path.LoadPaths(); + PathManager::Instance()->Init(); if (!WorldBoot::LoadServerConfig()) { return 0; diff --git a/world/world_boot.cpp b/world/world_boot.cpp index 3ae9816f5..7c3c18f81 100644 --- a/world/world_boot.cpp +++ b/world/world_boot.cpp @@ -84,7 +84,7 @@ bool WorldBoot::HandleCommandInput(int argc, char **argv) // command handler if (argc > 1) { LogSys.SilenceConsoleLogging(); - path.LoadPaths(); + PathManager::Instance()->Init(); WorldConfig::LoadConfig(); LoadDatabaseConnections(); RuleManager::Instance()->LoadRules(&database, "default", false); @@ -234,7 +234,7 @@ bool WorldBoot::DatabaseLoadRoutines(int argc, char **argv) { // logging system init auto logging = LogSys.SetDatabase(&database) - ->SetLogPath(path.GetLogPath()) + ->SetLogPath(PathManager::Instance()->GetLogPath()) ->LoadLogDatabaseSettings(); LogSys.SetDiscordHandler(&WorldBoot::DiscordWebhookMessageHandler); diff --git a/zone/embperl.cpp b/zone/embperl.cpp index 799669ec3..b48c714e3 100644 --- a/zone/embperl.cpp +++ b/zone/embperl.cpp @@ -138,7 +138,7 @@ void Embperl::DoInit() LogQuests("Warning [{}]: [{}]", Config->PluginPlFile, e); } - for (auto & dir : path.GetPluginPaths()) { + for (auto & dir : PathManager::Instance()->GetPluginPaths()) { try { //should probably read the directory in c, instead, so that //I can echo filenames as I do it, but c'mon... I'm lazy and this 1 line reads in all the plugins diff --git a/zone/lua_parser.cpp b/zone/lua_parser.cpp index bd3544b6a..2a9af1eef 100644 --- a/zone/lua_parser.cpp +++ b/zone/lua_parser.cpp @@ -1070,7 +1070,7 @@ void LuaParser::ReloadQuests() { std::string module_path = lua_tostring(L, -1); lua_pop(L, 1); - for (const auto& dir : path.GetLuaModulePaths()) { + for (const auto& dir : PathManager::Instance()->GetLuaModulePaths()) { module_path += fmt::format(";{}/?.lua", dir); module_path += fmt::format(";{}/?/init.lua", dir); module_path += fmt::format(";{}/share/lua/{}/?.lua", dir, lua_version); @@ -1086,7 +1086,7 @@ void LuaParser::ReloadQuests() { module_path = lua_tostring(L, -1); lua_pop(L, 1); - for (const auto& dir : path.GetLuaModulePaths()) { + for (const auto& dir : PathManager::Instance()->GetLuaModulePaths()) { module_path += fmt::format(";{}/?{}", dir, libext); module_path += fmt::format(";{}/lib/lua/{}/?{}", dir, lua_version, libext); } @@ -1098,7 +1098,7 @@ void LuaParser::ReloadQuests() { MapFunctions(L); // load init - for (auto& dir : path.GetQuestPaths()) { + for (auto& dir : PathManager::Instance()->GetQuestPaths()) { std::string filename = fmt::format("{}/{}/script_init.lua", dir, QUEST_GLOBAL_DIRECTORY); FILE* f = fopen(filename.c_str(), "r"); @@ -1114,7 +1114,7 @@ void LuaParser::ReloadQuests() { //zone init - always loads after global if (zone) { - for (auto& dir : path.GetQuestPaths()) { + for (auto& dir : PathManager::Instance()->GetQuestPaths()) { std::string zone_script = fmt::format( "{}/{}/script_init_v{}.lua", dir, @@ -1147,7 +1147,7 @@ void LuaParser::ReloadQuests() { } } - FILE *load_order = fopen(fmt::format("{}/load_order.txt", path.GetLuaModsPath()).c_str(), "r"); + FILE *load_order = fopen(fmt::format("{}/load_order.txt", PathManager::Instance()->GetLuaModsPath()).c_str(), "r"); if (load_order) { char file_name[256] = { 0 }; while (fgets(file_name, 256, load_order) != nullptr) { @@ -1159,7 +1159,7 @@ void LuaParser::ReloadQuests() { } } - LoadScript(fmt::format("{}/{}", path.GetLuaModsPath(), std::string(file_name)), file_name); + LoadScript(fmt::format("{}/{}", PathManager::Instance()->GetLuaModsPath(), std::string(file_name)), file_name); mods_.emplace_back(L, this, file_name); } diff --git a/zone/main.cpp b/zone/main.cpp index 0f9abef3f..69f363d9f 100644 --- a/zone/main.cpp +++ b/zone/main.cpp @@ -107,7 +107,6 @@ QuestParserCollection *parse = 0; EQEmuLogSys LogSys; ZoneEventScheduler event_scheduler; WorldContentService content_service; -PathManager path; PlayerEventLogs player_event_logs; DatabaseUpdate database_update; SkillCaps skill_caps; @@ -137,7 +136,7 @@ int main(int argc, char **argv) LogSys.SilenceConsoleLogging(); } - path.LoadPaths(); + PathManager::Instance()->Init(); #ifdef USE_MAP_MMFS if (argc == 3 && strcasecmp(argv[1], "convert_map") == 0) { @@ -305,7 +304,7 @@ int main(int argc, char **argv) } LogSys.SetDatabase(&database) - ->SetLogPath(path.GetLogPath()) + ->SetLogPath(PathManager::Instance()->GetLogPath()) ->LoadLogDatabaseSettings(ZoneCLI::RanTestCommand(argc, argv)) ->SetGMSayHandler(&Zone::GMSayHookCallBackProcess) ->StartFileLogs(); @@ -752,7 +751,7 @@ bool CheckForCompatibleQuestPlugins() try { for (const auto &[directory, flag]: directories) { - std::string dir_path = path.GetServerPath() + "/" + directory; + std::string dir_path = PathManager::Instance()->GetServerPath() + "/" + directory; if (!File::Exists(dir_path)) { continue; } for (const auto &file: fs::directory_iterator(dir_path)) { diff --git a/zone/map.cpp b/zone/map.cpp index 7e3d8822c..bf6ff68ec 100644 --- a/zone/map.cpp +++ b/zone/map.cpp @@ -271,7 +271,7 @@ bool Map::DoCollisionCheck(glm::vec3 myloc, glm::vec3 oloc, glm::vec3 &outnorm, Map *Map::LoadMapFile(std::string file) { std::transform(file.begin(), file.end(), file.begin(), ::tolower); - std::string filename = fmt::format("{}/base/{}.map", path.GetMapsPath(), file); + std::string filename = fmt::format("{}/base/{}.map", PathManager::Instance()->GetMapsPath(), file); LogInfo("Attempting to load Map File [{}]", filename.c_str()); diff --git a/zone/pathfinder_interface.cpp b/zone/pathfinder_interface.cpp index 74209703c..e6aef0cd9 100644 --- a/zone/pathfinder_interface.cpp +++ b/zone/pathfinder_interface.cpp @@ -7,7 +7,7 @@ IPathfinder *IPathfinder::Load(const std::string &zone) { struct stat statbuffer; - std::string navmesh_path = fmt::format("{}/maps/nav/{}.nav", path.GetServerPath(), zone); + std::string navmesh_path = fmt::format("{}/maps/nav/{}.nav", PathManager::Instance()->GetServerPath(), zone); if (stat(navmesh_path.c_str(), &statbuffer) == 0) { return new PathfinderNavmesh(navmesh_path); } diff --git a/zone/quest_parser_collection.cpp b/zone/quest_parser_collection.cpp index 18022b570..2ab537c64 100644 --- a/zone/quest_parser_collection.cpp +++ b/zone/quest_parser_collection.cpp @@ -939,7 +939,7 @@ QuestInterface* QuestParserCollection::GetQIByNPCQuest(uint32 npc_id, std::strin Strings::FindReplace(npc_name, "`", "-"); - for (auto & dir : path.GetQuestPaths()) { + for (auto & dir : PathManager::Instance()->GetQuestPaths()) { const std::string& npc_id_and_name = fmt::format( "{}_{}", npc_name, @@ -1007,7 +1007,7 @@ QuestInterface* QuestParserCollection::GetQIByPlayerQuest(std::string& filename) return nullptr; } - for (auto & dir : path.GetQuestPaths()) { + for (auto & dir : PathManager::Instance()->GetQuestPaths()) { const std::string& global_path = fmt::format( "{}/{}", dir, @@ -1062,7 +1062,7 @@ QuestInterface* QuestParserCollection::GetQIByGlobalNPCQuest(std::string& filena std::string file_name; - for (auto & dir : path.GetQuestPaths()) { + for (auto & dir : PathManager::Instance()->GetQuestPaths()) { for (auto* e: _load_precedence) { file_name = fmt::format( "{}/{}/global_npc.{}", @@ -1088,7 +1088,7 @@ QuestInterface* QuestParserCollection::GetQIByGlobalPlayerQuest(std::string& fil } std::string file_name; - for (auto & dir : path.GetQuestPaths()) { + for (auto & dir : PathManager::Instance()->GetQuestPaths()) { for (auto* e: _load_precedence) { file_name = fmt::format( "{}/{}/global_player.{}", @@ -1113,7 +1113,7 @@ QuestInterface* QuestParserCollection::GetQIBySpellQuest(uint32 spell_id, std::s return nullptr; } - for (auto & dir : path.GetQuestPaths()) { + for (auto & dir : PathManager::Instance()->GetQuestPaths()) { const std::string& global_path = fmt::format( "{}/{}/spells", dir, @@ -1167,7 +1167,7 @@ QuestInterface* QuestParserCollection::GetQIByItemQuest(std::string item_script, return nullptr; } - for (auto & dir : path.GetQuestPaths()) { + for (auto & dir : PathManager::Instance()->GetQuestPaths()) { const std::string& global_path = fmt::format( "{}/{}/items", dir, @@ -1221,7 +1221,7 @@ QuestInterface* QuestParserCollection::GetQIByEncounterQuest(std::string encount return nullptr; } - for (auto & dir : path.GetQuestPaths()) { + for (auto & dir : PathManager::Instance()->GetQuestPaths()) { const std::string& global_path = fmt::format( "{}/{}/encounters", dir, @@ -1273,7 +1273,7 @@ QuestInterface* QuestParserCollection::GetQIByBotQuest(std::string& filename) return nullptr; } - for (auto & dir : path.GetQuestPaths()) { + for (auto & dir : PathManager::Instance()->GetQuestPaths()) { const std::string& global_path = fmt::format( "{}/{}", dir, @@ -1327,7 +1327,7 @@ QuestInterface* QuestParserCollection::GetQIByGlobalBotQuest(std::string& filena } std::string file_name; - for (auto & dir : path.GetQuestPaths()) { + for (auto & dir : PathManager::Instance()->GetQuestPaths()) { for (auto* e: _load_precedence) { file_name = fmt::format( "{}/{}/global_bot.{}", @@ -1352,7 +1352,7 @@ QuestInterface* QuestParserCollection::GetQIByMercQuest(std::string& filename) return nullptr; } - for (auto & dir : path.GetQuestPaths()) { + for (auto & dir : PathManager::Instance()->GetQuestPaths()) { const std::string& global_path = fmt::format( "{}/{}", dir, @@ -1406,7 +1406,7 @@ QuestInterface* QuestParserCollection::GetQIByGlobalMercQuest(std::string& filen } std::string file_name; - for (auto & dir : path.GetQuestPaths()) { + for (auto & dir : PathManager::Instance()->GetQuestPaths()) { for (auto* e: _load_precedence) { file_name = fmt::format( "{}/{}/global_merc.{}", diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index b9807703e..b2b2ce193 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -200,7 +200,7 @@ void QuestManager::summonitem(uint32 itemid, int16 charges) { void QuestManager::write(const char *file, const char *str) { FILE * pFile; - pFile = fopen (fmt::format("{}/{}", path.GetServerPath(), file).c_str(), "a"); + pFile = fopen (fmt::format("{}/{}", PathManager::Instance()->GetServerPath(), file).c_str(), "a"); if(!pFile) return; fprintf(pFile, "%s\n", str); diff --git a/zone/water_map.cpp b/zone/water_map.cpp index 27289abd6..e31bb0c75 100644 --- a/zone/water_map.cpp +++ b/zone/water_map.cpp @@ -17,7 +17,7 @@ WaterMap* WaterMap::LoadWaterMapfile(std::string zone_name) { std::transform(zone_name.begin(), zone_name.end(), zone_name.begin(), ::tolower); - std::string file_path = fmt::format("{}/water/{}.wtr", path.GetMapsPath(), zone_name); + std::string file_path = fmt::format("{}/water/{}.wtr", PathManager::Instance()->GetMapsPath(), zone_name); LogDebug("Attempting to load water map with path [{}]", file_path.c_str()); FILE *f = fopen(file_path.c_str(), "rb"); if(f) { From f8ee664b27747b978ba6d56243b8c685032e758a Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Sun, 22 Jun 2025 12:55:55 -0500 Subject: [PATCH 06/18] [Code] Remove Lua Rule Constants (#4949) --- zone/lua_general.cpp | 27 --------------------------- zone/lua_parser.cpp | 1 - 2 files changed, 28 deletions(-) diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index e076b2674..c7a631a68 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -7963,33 +7963,6 @@ luabind::scope lua_register_languages() { )]; } -luabind::scope lua_register_rules_const() { - return luabind::class_("Rule") - .enum_("constants") - [( -#define RULE_INT(cat, rule, default_value, notes) \ - luabind::value(#rule, RuleManager::Int__##rule), -#include "../common/ruletypes.h" - luabind::value("_IntRuleCount", RuleManager::_IntRuleCount), -#undef RULE_INT -#define RULE_REAL(cat, rule, default_value, notes) \ - luabind::value(#rule, RuleManager::Real__##rule), -#include "../common/ruletypes.h" - luabind::value("_RealRuleCount", RuleManager::_RealRuleCount), -#undef RULE_REAL -#define RULE_BOOL(cat, rule, default_value, notes) \ - luabind::value(#rule, RuleManager::Bool__##rule), -#include "../common/ruletypes.h" - luabind::value("_BoolRuleCount", RuleManager::_BoolRuleCount), -#undef RULE_BOOL -#define RULE_STRING(cat, rule, default_value, notes) \ - luabind::value(#rule, RuleManager::String__##rule), -#include "../common/ruletypes.h" - luabind::value("_StringRuleCount", RuleManager::_StringRuleCount) -#undef RULE_STRING - )]; -} - luabind::scope lua_register_rulei() { return luabind::namespace_("RuleI") [ diff --git a/zone/lua_parser.cpp b/zone/lua_parser.cpp index 2a9af1eef..d44fb2bfa 100644 --- a/zone/lua_parser.cpp +++ b/zone/lua_parser.cpp @@ -1320,7 +1320,6 @@ void LuaParser::MapFunctions(lua_State *L) { lua_register_packet(), lua_register_packet_opcodes(), lua_register_stat_bonuses(), - lua_register_rules_const(), lua_register_rulei(), lua_register_ruler(), lua_register_ruleb(), From 940f97c9ae24bceb783cb5fb032ac2b5f9838512 Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sun, 22 Jun 2025 14:10:48 -0400 Subject: [PATCH 07/18] [Code] TaskManager Global to Singleton Cleanup (#4945) * [Code] TaskManager Global to Singleton Cleanup * Remove checks for existence * Final --- zone/attack.cpp | 2 +- zone/bot_command.cpp | 9 ++- zone/client.h | 11 ++-- zone/command.cpp | 1 - zone/entity.cpp | 9 +-- zone/gm_commands/find/task.cpp | 4 +- zone/gm_commands/task.cpp | 18 +++--- zone/main.cpp | 5 +- zone/questmgr.cpp | 36 +++++------ zone/shared_task_zone_messaging.cpp | 2 +- zone/task_client_state.cpp | 94 ++++++++++++----------------- zone/task_manager.h | 6 ++ zone/tasks.cpp | 8 +-- zone/worldserver.cpp | 6 +- 14 files changed, 94 insertions(+), 117 deletions(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index 10cec2877..e46177352 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -2683,7 +2683,7 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy give_exp_client->GetCleanName(), GetNPCTypeID() ); - task_manager->HandleUpdateTasksOnKill(give_exp_client, this); + TaskManager::Instance()->HandleUpdateTasksOnKill(give_exp_client, this); } if (killer_raid) { diff --git a/zone/bot_command.cpp b/zone/bot_command.cpp index 854054bfa..a697fc6bb 100644 --- a/zone/bot_command.cpp +++ b/zone/bot_command.cpp @@ -63,7 +63,6 @@ extern QueryServ* QServ; extern WorldServer worldserver; -extern TaskManager *task_manager; int bot_command_count; @@ -165,7 +164,7 @@ int bot_command_init(void) bot_command_add("inventoryremove", "Removes an item from a bot's inventory", AccountStatus::Player, bot_command_inventory_remove) || bot_command_add("inventorywindow", "Displays all items in a bot's inventory in a pop-up window", AccountStatus::Player, bot_command_inventory_window) || bot_command_add("itemuse", "Elicits a report from spawned bots that can use the item on your cursor (option 'empty' yields only empty slots)", AccountStatus::Player, bot_command_item_use) || - bot_command_add("maxmeleerange", "Toggles whether your bot is at max melee range or not. This will disable all special abilities, including taunt.", AccountStatus::Player, bot_command_max_melee_range) || + bot_command_add("maxmeleerange", "Toggles whether your bot is at max melee range or not. This will disable all special abilities, including taunt.", AccountStatus::Player, bot_command_max_melee_range) || bot_command_add("owneroption", "Sets options available to bot owners", AccountStatus::Player, bot_command_owner_option) || bot_command_add("pet", "Lists the available bot pet [subcommands]", AccountStatus::Player, bot_command_pet) || bot_command_add("petgetlost", "Orders a bot to remove its summoned pet", AccountStatus::Player, bot_command_pet_get_lost) || @@ -189,11 +188,11 @@ int bot_command_init(void) bot_command_add("spellmaxhppct", "Controls at what HP percent a bot will stop casting different spell types", AccountStatus::Player, bot_command_spell_max_hp_pct) || bot_command_add("spellmaxmanapct", "Controls at what mana percent a bot will stop casting different spell types", AccountStatus::Player, bot_command_spell_max_mana_pct) || bot_command_add("spellmaxthresholds", "Controls the minimum target HP threshold for a spell to be cast for a specific type", AccountStatus::Player, bot_command_spell_max_thresholds) || - bot_command_add("spellminhppct", "Controls at what HP percent a bot will start casting different spell types", AccountStatus::Player, bot_command_spell_min_hp_pct) || + bot_command_add("spellminhppct", "Controls at what HP percent a bot will start casting different spell types", AccountStatus::Player, bot_command_spell_min_hp_pct) || bot_command_add("spellminmanapct", "Controls at what mana percent a bot will start casting different spell types", AccountStatus::Player, bot_command_spell_min_mana_pct) || - bot_command_add("spellminthresholds", "Controls the maximum target HP threshold for a spell to be cast for a specific type", AccountStatus::Player, bot_command_spell_min_thresholds) || + bot_command_add("spellminthresholds", "Controls the maximum target HP threshold for a spell to be cast for a specific type", AccountStatus::Player, bot_command_spell_min_thresholds) || bot_command_add("spellresistlimits", "Controls the resist limits for bots to cast spells on their target", AccountStatus::Player, bot_command_spell_resist_limits) || - bot_command_add("spellpursuepriority", "Controls the order of casts by spell type when pursuing in combat", AccountStatus::Player, bot_command_spell_pursue_priority) || + bot_command_add("spellpursuepriority", "Controls the order of casts by spell type when pursuing in combat", AccountStatus::Player, bot_command_spell_pursue_priority) || bot_command_add("spelltargetcount", "Sets the required target amount for group/AE spells by spell type", AccountStatus::Player, bot_command_spell_target_count) || bot_command_add("spellinfo", "Opens a dialogue window with spell info", AccountStatus::Player, bot_spell_info_dialogue_window) || bot_command_add("spells", "Lists all Spells learned by the Bot.", AccountStatus::Player, bot_command_spell_list) || diff --git a/zone/client.h b/zone/client.h index 9f96ba235..4aa0da353 100644 --- a/zone/client.h +++ b/zone/client.h @@ -98,7 +98,6 @@ namespace EQ #define MAX_SPECIALIZED_SKILL 50 extern Zone* zone; -extern TaskManager *task_manager; class CLIENTPACKET { @@ -1359,7 +1358,7 @@ public: } inline bool SaveTaskState() { - return task_manager != nullptr && task_manager->SaveClientState(this, task_state); + return TaskManager::Instance()->SaveClientState(this, task_state); } inline bool IsTaskStateLoaded() { return task_state != nullptr; } inline bool IsTaskActive(int task_id) { return task_state != nullptr && task_state->IsTaskActive(task_id); } @@ -1433,14 +1432,14 @@ public: } inline void TaskSetSelector(Mob* mob, int task_set_id, bool ignore_cooldown) { - if (task_manager && task_state) { - task_manager->TaskSetSelector(this, mob, task_set_id, ignore_cooldown); + if (task_state) { + TaskManager::Instance()->TaskSetSelector(this, mob, task_set_id, ignore_cooldown); } } inline void TaskQuestSetSelector(Mob* mob, const std::vector& tasks, bool ignore_cooldown) { - if (task_manager && task_state) { - task_manager->TaskQuestSetSelector(this, mob, tasks, ignore_cooldown); + if (task_state) { + TaskManager::Instance()->TaskQuestSetSelector(this, mob, tasks, ignore_cooldown); } } inline void EnableTask(int task_count, int *task_list) diff --git a/zone/command.cpp b/zone/command.cpp index 85e4a7e9d..ff3a9f0e7 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -34,7 +34,6 @@ extern QueryServ* QServ; extern WorldServer worldserver; -extern TaskManager *task_manager; extern FastMath g_Math; void CatchSignal(int sig_num); diff --git a/zone/entity.cpp b/zone/entity.cpp index 3658c9045..9a93a3620 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -4175,10 +4175,6 @@ void EntityList::ProcessProximitySay(const char *message, Client *c, uint8 langu void EntityList::SaveAllClientsTaskState() { - if (!task_manager) { - return; - } - auto it = client_list.begin(); while (it != client_list.end()) { Client *client = it->second; @@ -4192,9 +4188,6 @@ void EntityList::SaveAllClientsTaskState() void EntityList::ReloadAllClientsTaskState(int task_id) { - if (!task_manager) - return; - auto it = client_list.begin(); while (it != client_list.end()) { Client *client = it->second; @@ -4205,7 +4198,7 @@ void EntityList::ReloadAllClientsTaskState(int task_id) Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] Reloading Task State For Client %s", client->GetName()); client->RemoveClientTaskState(); client->LoadClientTaskState(); - task_manager->SendActiveTasksToClient(client); + TaskManager::Instance()->SendActiveTasksToClient(client); } } ++it; diff --git a/zone/gm_commands/find/task.cpp b/zone/gm_commands/find/task.cpp index ed08ad534..c51f1892d 100644 --- a/zone/gm_commands/find/task.cpp +++ b/zone/gm_commands/find/task.cpp @@ -11,7 +11,7 @@ void FindTask(Client *c, const Seperator *sep) if (sep->IsNumber(2)) { const auto task_id = Strings::ToUnsignedInt(sep->arg[2]); - const auto& task_name = task_manager->GetTaskName(task_id); + const auto& task_name = TaskManager::Instance()->GetTaskName(task_id); if (task_name.empty()) { c->Message( @@ -41,7 +41,7 @@ void FindTask(Client *c, const Seperator *sep) auto found_count = 0; - for (const auto& t : task_manager->GetTaskData()) { + for (const auto& t : TaskManager::Instance()->GetTaskData()) { const auto& task_name = t.second.title; const auto& task_name_lower = Strings::ToLower(task_name); if (!Strings::Contains(task_name_lower, search_criteria)) { diff --git a/zone/gm_commands/task.cpp b/zone/gm_commands/task.cpp index bd28c2518..6e71a59ae 100755 --- a/zone/gm_commands/task.cpp +++ b/zone/gm_commands/task.cpp @@ -176,7 +176,7 @@ void command_task(Client *c, const Seperator *sep) Chat::White, fmt::format( "Assigned {} (ID {}) to {}.", - task_manager->GetTaskName(task_id), + TaskManager::Instance()->GetTaskName(task_id), task_id, c->GetTargetDescription(t) ).c_str() @@ -197,7 +197,7 @@ void command_task(Client *c, const Seperator *sep) Chat::White, fmt::format( "Successfully completed {} (ID {}) for {}.", - task_manager->GetTaskName(task_id), + TaskManager::Instance()->GetTaskName(task_id), task_id, c->GetTargetDescription(t) ).c_str() @@ -207,7 +207,7 @@ void command_task(Client *c, const Seperator *sep) Chat::White, fmt::format( "Failed to complete {} (ID {}) for {}.", - task_manager->GetTaskName(task_id), + TaskManager::Instance()->GetTaskName(task_id), task_id, c->GetTargetDescription(t) ).c_str() @@ -220,7 +220,7 @@ void command_task(Client *c, const Seperator *sep) "{} {} not have not {} (ID {}) assigned to them.", c->GetTargetDescription(t, TargetDescriptionType::UCYou), c == t ? "do" : "does", - task_manager->GetTaskName(task_id), + TaskManager::Instance()->GetTaskName(task_id), task_id ).c_str() ); @@ -256,7 +256,7 @@ void command_task(Client *c, const Seperator *sep) Chat::White, fmt::format( "Attempting to reload {} (ID {}).", - task_manager->GetTaskName(task_id), + TaskManager::Instance()->GetTaskName(task_id), task_id ).c_str() ); @@ -265,7 +265,7 @@ void command_task(Client *c, const Seperator *sep) Chat::White, fmt::format( "Successfully reloaded {} (ID {}).", - task_manager->GetTaskName(task_id), + TaskManager::Instance()->GetTaskName(task_id), task_id ).c_str() ); @@ -318,7 +318,7 @@ void command_task(Client *c, const Seperator *sep) Chat::White, fmt::format( "Successfully uncompleted {} (ID {}) for {}.", - task_manager->GetTaskName(task_id), + TaskManager::Instance()->GetTaskName(task_id), task_id, c->GetTargetDescription(t) ).c_str() @@ -330,7 +330,7 @@ void command_task(Client *c, const Seperator *sep) "{} {} not completed {} (ID {}).", c->GetTargetDescription(t, TargetDescriptionType::UCYou), c == t ? "have" : "has", - task_manager->GetTaskName(task_id), + TaskManager::Instance()->GetTaskName(task_id), task_id ).c_str() ); @@ -353,7 +353,7 @@ void command_task(Client *c, const Seperator *sep) Chat::White, fmt::format( "Updating {} (ID {}), activity {} with a count of {} for {}.", - task_manager->GetTaskName(task_id), + TaskManager::Instance()->GetTaskName(task_id), task_id, activity_id, count, diff --git a/zone/main.cpp b/zone/main.cpp index 69f363d9f..24bc85c4b 100644 --- a/zone/main.cpp +++ b/zone/main.cpp @@ -101,7 +101,6 @@ extern Zone *zone; npcDecayTimes_Struct npcCorpseDecayTimes[100]; TitleManager title_manager; QueryServ *QServ = 0; -TaskManager *task_manager = 0; NpcScaleManager *npc_scale_manager; QuestParserCollection *parse = 0; EQEmuLogSys LogSys; @@ -449,8 +448,7 @@ int main(int argc, char **argv) npc_scale_manager->LoadScaleData(); if (RuleB(TaskSystem, EnableTaskSystem)) { - task_manager = new TaskManager; - task_manager->LoadTasks(); + TaskManager::Instance()->LoadTasks(); } parse = new QuestParserCollection(); @@ -681,7 +679,6 @@ int main(int argc, char **argv) zone->Shutdown(true); } //Fix for Linux world server problem. - safe_delete(task_manager); safe_delete(npc_scale_manager); command_deinit(); bot_command_deinit(); diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index b2b2ce193..1e6e3fc3f 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -2868,27 +2868,27 @@ bool QuestManager::createBot(const char *name, const char *lastname, uint8 level void QuestManager::taskselector(const std::vector& tasks, bool ignore_cooldown) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && task_manager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner) initiator->TaskQuestSetSelector(owner, tasks, ignore_cooldown); } void QuestManager::enabletask(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator) initiator->EnableTask(taskcount, tasks); } void QuestManager::disabletask(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator) initiator->DisableTask(taskcount, tasks); } bool QuestManager::istaskenabled(int taskid) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator) return initiator->IsTaskEnabled(taskid); return false; @@ -2897,7 +2897,7 @@ bool QuestManager::istaskenabled(int taskid) { void QuestManager::tasksetselector(int tasksetid, bool ignore_cooldown) { QuestManagerCurrentQuestVars(); Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSetSelector called for task set %i", tasksetid); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && task_manager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner) initiator->TaskSetSelector(owner, tasksetid, ignore_cooldown); } @@ -2979,8 +2979,8 @@ int QuestManager::enabledtaskcount(int taskset) { int QuestManager::firsttaskinset(int taskset) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && task_manager) - return task_manager->FirstTaskInSet(taskset); + if(RuleB(TaskSystem, EnableTaskSystem)) + return TaskManager::Instance()->FirstTaskInSet(taskset); return -1; } @@ -2988,8 +2988,8 @@ int QuestManager::firsttaskinset(int taskset) { int QuestManager::lasttaskinset(int taskset) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && task_manager) - return task_manager->LastTaskInSet(taskset); + if(RuleB(TaskSystem, EnableTaskSystem)) + return TaskManager::Instance()->LastTaskInSet(taskset); return -1; } @@ -2997,8 +2997,8 @@ int QuestManager::lasttaskinset(int taskset) { int QuestManager::nexttaskinset(int taskset, int taskid) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && task_manager) - return task_manager->NextTaskInSet(taskset, taskid); + if(RuleB(TaskSystem, EnableTaskSystem)) + return TaskManager::Instance()->NextTaskInSet(taskset, taskid); return -1; } @@ -3063,8 +3063,8 @@ int QuestManager::completedtasksinset(int taskset) { bool QuestManager::istaskappropriate(int task) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) - return task_manager->ValidateLevel(task, initiator->GetLevel()); + if(RuleB(TaskSystem, EnableTaskSystem) && initiator) + return TaskManager::Instance()->ValidateLevel(task, initiator->GetLevel()); return false; } @@ -3073,7 +3073,7 @@ std::string QuestManager::gettaskname(uint32 task_id) { QuestManagerCurrentQuestVars(); if (RuleB(TaskSystem, EnableTaskSystem)) { - return task_manager->GetTaskName(task_id); + return TaskManager::Instance()->GetTaskName(task_id); } return std::string(); @@ -3082,8 +3082,8 @@ std::string QuestManager::gettaskname(uint32 task_id) { int QuestManager::GetCurrentDzTaskID() { QuestManagerCurrentQuestVars(); - if (RuleB(TaskSystem, EnableTaskSystem) && zone && task_manager) { - return task_manager->GetCurrentDzTaskID(); + if (RuleB(TaskSystem, EnableTaskSystem) && zone) { + return TaskManager::Instance()->GetCurrentDzTaskID(); } return 0; @@ -3092,8 +3092,8 @@ int QuestManager::GetCurrentDzTaskID() { void QuestManager::EndCurrentDzTask(bool send_fail) { QuestManagerCurrentQuestVars(); - if (RuleB(TaskSystem, EnableTaskSystem) && zone && task_manager) { - task_manager->EndCurrentDzTask(send_fail); + if (RuleB(TaskSystem, EnableTaskSystem) && zone) { + TaskManager::Instance()->EndCurrentDzTask(send_fail); } } diff --git a/zone/shared_task_zone_messaging.cpp b/zone/shared_task_zone_messaging.cpp index eac3a783a..f3cbe0983 100644 --- a/zone/shared_task_zone_messaging.cpp +++ b/zone/shared_task_zone_messaging.cpp @@ -157,7 +157,7 @@ void SharedTaskZoneMessaging::HandleWorldMessage(ServerPacket *pack) for (auto &client: entity_list.GetClientList()) { Client *c = client.second; - task_manager->SyncClientSharedTaskState(c, c->GetTaskState()); + TaskManager::Instance()->SyncClientSharedTaskState(c, c->GetTaskState()); c->RemoveClientTaskState(); c->LoadClientTaskState(); } diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp index 1bd633ddf..f3e5deaeb 100644 --- a/zone/task_client_state.cpp +++ b/zone/task_client_state.cpp @@ -66,7 +66,7 @@ void ClientTaskState::SendTaskHistory(Client *client, int task_index) return; } - const auto task_data = task_manager->GetTaskData(task_id); + const auto task_data = TaskManager::Instance()->GetTaskData(task_id); if (!task_data) { return; } @@ -252,16 +252,16 @@ int ClientTaskState::EnabledTaskCount(int task_set_id) if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } while ((enabled_task_index < m_enabled_tasks.size()) && - (task_set_index < task_manager->m_task_sets[task_set_id].size())) { + (task_set_index < TaskManager::Instance()->m_task_sets[task_set_id].size())) { - if (m_enabled_tasks[enabled_task_index] == task_manager->m_task_sets[task_set_id][task_set_index]) { + if (m_enabled_tasks[enabled_task_index] == TaskManager::Instance()->m_task_sets[task_set_id][task_set_index]) { enabled_task_count++; enabled_task_index++; task_set_index++; continue; } - if (m_enabled_tasks[enabled_task_index] < task_manager->m_task_sets[task_set_id][task_set_index]) { + if (m_enabled_tasks[enabled_task_index] < TaskManager::Instance()->m_task_sets[task_set_id][task_set_index]) { enabled_task_index++; } else { @@ -281,7 +281,7 @@ int ClientTaskState::ActiveTasksInSet(int task_set_id) int active_task_in_set_count = 0; - for (int task_id : task_manager->m_task_sets[task_set_id]) { + for (int task_id : TaskManager::Instance()->m_task_sets[task_set_id]) { if (IsTaskActive(task_id)) { active_task_in_set_count++; } @@ -298,7 +298,7 @@ int ClientTaskState::CompletedTasksInSet(int task_set_id) int completed_tasks_count = 0; - for (int i : task_manager->m_task_sets[task_set_id]) { + for (int i : TaskManager::Instance()->m_task_sets[task_set_id]) { if (IsTaskCompleted(i)) { completed_tasks_count++; } @@ -362,7 +362,7 @@ bool ClientTaskState::UnlockActivities(Client* client, ClientTaskInformation& ta task_info.updated ); - const auto task = task_manager->GetTaskData(task_info.task_id); + const auto task = TaskManager::Instance()->GetTaskData(task_info.task_id); if (!task) { return true; @@ -453,7 +453,7 @@ const TaskInformation* ClientTaskState::GetTaskData(const ClientTaskInformation& return nullptr; } - return task_manager->GetTaskData(client_task.task_id); + return TaskManager::Instance()->GetTaskData(client_task.task_id); } bool ClientTaskState::CanUpdate(Client* client, const TaskUpdateFilter& filter, int task_id, @@ -521,11 +521,6 @@ bool ClientTaskState::CanUpdate(Client* client, const TaskUpdateFilter& filter, int ClientTaskState::UpdateTasks(Client* client, const TaskUpdateFilter& filter, int count) { - if (!task_manager) - { - return 0; - } - int max_updated = 0; for (const auto& client_task : m_active_tasks) @@ -593,11 +588,6 @@ int ClientTaskState::UpdateTasks(Client* client, const TaskUpdateFilter& filter, std::pair ClientTaskState::FindTask(Client* client, const TaskUpdateFilter& filter) const { - if (!task_manager) - { - return std::make_pair(0, 0); - } - for (const auto& client_task : m_active_tasks) { const auto task = GetTaskData(client_task); @@ -901,7 +891,7 @@ int ClientTaskState::IncrementDoneCount( // and by the 'Task Stage Completed' message client->SendTaskActivityComplete(info->task_id, activity_id, task_index, task_data->type); // Send the updated task/activity_information list to the client - task_manager->SendSingleActiveTaskToClient(client, *info, task_complete, false); + TaskManager::Instance()->SendSingleActiveTaskToClient(client, *info, task_complete, false); if (!ignore_quest_update) { if (parse->PlayerHasQuestSub(EVENT_TASK_STAGE_COMPLETE)) { @@ -929,7 +919,7 @@ int ClientTaskState::IncrementDoneCount( if (player_event_logs.IsEventEnabled(PlayerEvent::TASK_COMPLETE)) { auto e = PlayerEvent::TaskCompleteEvent{ .task_id = static_cast(info->task_id), - .task_name = task_manager->GetTaskName(static_cast(info->task_id)), + .task_name = TaskManager::Instance()->GetTaskName(static_cast(info->task_id)), .activity_id = static_cast(info->activity[activity_id].activity_id), .done_count = static_cast(info->activity[activity_id].done_count) }; @@ -948,7 +938,7 @@ int ClientTaskState::IncrementDoneCount( // shared tasks linger at the completion step and do not get removed from the task window unlike quests/task if (task_data->type != TaskType::Shared) { - task_manager->SendCompletedTasksToClient(client, this); + TaskManager::Instance()->SendCompletedTasksToClient(client, this); client->CancelTask(task_index, task_data->type); } @@ -958,7 +948,7 @@ int ClientTaskState::IncrementDoneCount( } else { // Send an updated packet for this single activity_information - task_manager->SendTaskActivityLong( + TaskManager::Instance()->SendTaskActivityLong( client, info->task_id, activity_id, @@ -968,7 +958,7 @@ int ClientTaskState::IncrementDoneCount( if (player_event_logs.IsEventEnabled(PlayerEvent::TASK_UPDATE)) { auto e = PlayerEvent::TaskUpdateEvent{ .task_id = static_cast(info->task_id), - .task_name = task_manager->GetTaskName(static_cast(info->task_id)), + .task_name = TaskManager::Instance()->GetTaskName(static_cast(info->task_id)), .activity_id = static_cast(info->activity[activity_id].activity_id), .done_count = static_cast(info->activity[activity_id].done_count) }; @@ -976,7 +966,7 @@ int ClientTaskState::IncrementDoneCount( } } - task_manager->SaveClientState(client, this); + TaskManager::Instance()->SaveClientState(client, this); return count; } @@ -1149,7 +1139,7 @@ void ClientTaskState::FailTask(Client *client, int task_id) // type: Shared Task (failed via world for all members) if (m_active_shared_task.task_id == task_id) { - task_manager->EndSharedTask(*client, task_id, true); + TaskManager::Instance()->EndSharedTask(*client, task_id, true); return; } @@ -1211,7 +1201,7 @@ bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) return false; } - const auto task_data = task_manager->GetTaskData(info->task_id); + const auto task_data = TaskManager::Instance()->GetTaskData(info->task_id); if (!task_data) { return false; } @@ -1282,7 +1272,7 @@ void ClientTaskState::UpdateTaskActivity( return; } - const auto task_data = task_manager->GetTaskData(info->task_id); + const auto task_data = TaskManager::Instance()->GetTaskData(info->task_id); if (!task_data) { return; } @@ -1352,7 +1342,7 @@ void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activit return; } - const auto task_data = task_manager->GetTaskData(info->task_id); + const auto task_data = TaskManager::Instance()->GetTaskData(info->task_id); if (!task_data) { return; } @@ -1386,14 +1376,14 @@ void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activit bool ClientTaskState::CompleteTask(Client *c, uint32 task_id) { - const auto task_data = task_manager->GetTaskData(task_id); + const auto task_data = TaskManager::Instance()->GetTaskData(task_id); if (!task_data) { return false; } for ( int activity_id = 0; - activity_id < task_manager->GetActivityCount(task_id); + activity_id < TaskManager::Instance()->GetActivityCount(task_id); activity_id++ ) { c->UpdateTaskActivity( @@ -1408,7 +1398,7 @@ bool ClientTaskState::CompleteTask(Client *c, uint32 task_id) void ClientTaskState::ShowClientTaskInfoMessage(ClientTaskInformation *task, Client *c) { - const auto task_data = task_manager->GetTaskData(task->task_id); + const auto task_data = TaskManager::Instance()->GetTaskData(task->task_id); c->Message(Chat::White, "------------------------------------------------"); c->Message( @@ -1430,7 +1420,7 @@ void ClientTaskState::ShowClientTaskInfoMessage(ClientTaskInformation *task, Cli ).c_str() ); - for (int activity_id = 0; activity_id < task_manager->GetActivityCount(task->task_id); activity_id++) { + for (int activity_id = 0; activity_id < TaskManager::Instance()->GetActivityCount(task->task_id); activity_id++) { std::vector update_increments = { "1", "5", "10", "20", "50" }; std::vector update_saylinks; @@ -1501,7 +1491,7 @@ int ClientTaskState::TaskTimeLeft(int task_id) if (m_active_task.task_id == task_id) { int time_now = time(nullptr); - const auto task_data = task_manager->GetTaskData(task_id); + const auto task_data = TaskManager::Instance()->GetTaskData(task_id); if (!task_data) { return -1; } @@ -1519,7 +1509,7 @@ int ClientTaskState::TaskTimeLeft(int task_id) if (m_active_shared_task.task_id == task_id) { int time_now = time(nullptr); - const auto task_data = task_manager->GetTaskData(task_id); + const auto task_data = TaskManager::Instance()->GetTaskData(task_id); if (!task_data) { return -1; } @@ -1544,7 +1534,7 @@ int ClientTaskState::TaskTimeLeft(int task_id) int time_now = time(nullptr); - const auto task_data = task_manager->GetTaskData(active_quest.task_id); + const auto task_data = TaskManager::Instance()->GetTaskData(active_quest.task_id); if (!task_data) { return -1; } @@ -1616,7 +1606,7 @@ bool ClientTaskState::TaskOutOfTime(TaskType task_type, int index) } int time_now = time(nullptr); - const auto task_data = task_manager->GetTaskData(info->task_id); + const auto task_data = TaskManager::Instance()->GetTaskData(info->task_id); if (!task_data) { return false; } @@ -1936,7 +1926,7 @@ void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType t void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) { - switch (task_manager->GetTaskType(task_id)) { + switch (TaskManager::Instance()->GetTaskType(task_id)) { case TaskType::Task: { if (m_active_task.task_id == task_id) { LogTasks("RemoveTaskByTaskID found Task [{}]", task_id); @@ -1973,12 +1963,12 @@ void ClientTaskState::AcceptNewTask( bool enforce_level_requirement ) { - if (!task_manager || task_id < 0) { + if (task_id < 0) { client->Message(Chat::Red, "Task system not functioning, or task_id %i out of range.", task_id); return; } - const auto task = task_manager->GetTaskData(task_id); + const auto task = TaskManager::Instance()->GetTaskData(task_id); if (!task) { client->Message(Chat::Red, "Invalid task_id %i", task_id); return; @@ -2048,12 +2038,12 @@ void ClientTaskState::AcceptNewTask( } } - if (enforce_level_requirement && !task_manager->ValidateLevel(task_id, client->GetLevel())) { + if (enforce_level_requirement && !TaskManager::Instance()->ValidateLevel(task_id, client->GetLevel())) { client->MessageString(Chat::Yellow, TASK_NOT_RIGHT_LEVEL); return; } - if (!task_manager->IsTaskRepeatable(task_id) && IsTaskCompleted(task_id)) { + if (!TaskManager::Instance()->IsTaskRepeatable(task_id) && IsTaskCompleted(task_id)) { return; } @@ -2184,11 +2174,11 @@ void ClientTaskState::AcceptNewTask( } } - task_manager->SendSingleActiveTaskToClient(client, *active_slot, false, true); + TaskManager::Instance()->SendSingleActiveTaskToClient(client, *active_slot, false, true); client->StartTaskRequestCooldownTimer(); client->MessageString(Chat::DefaultText, YOU_ASSIGNED_TASK, task->title.c_str()); - task_manager->SaveClientState(client, this); + TaskManager::Instance()->SaveClientState(client, this); NPC *npc = entity_list.GetNPCByID(npc_entity_id); if (npc) { @@ -2197,7 +2187,7 @@ void ClientTaskState::AcceptNewTask( .npc_id = npc->GetNPCTypeID(), .npc_name = npc->GetCleanName(), .task_id = static_cast(task_id), - .task_name = task_manager->GetTaskName(static_cast(task_id)), + .task_name = TaskManager::Instance()->GetTaskName(static_cast(task_id)), }; RecordPlayerEventLogWithClient(client, PlayerEvent::TASK_ACCEPT, e); } @@ -2211,7 +2201,7 @@ void ClientTaskState::AcceptNewTask( .npc_id = 0, .npc_name = "No NPC", .task_id = static_cast(task_id), - .task_name = task_manager->GetTaskName(static_cast(task_id)), + .task_name = TaskManager::Instance()->GetTaskName(static_cast(task_id)), }; RecordPlayerEventLogWithClient(client, PlayerEvent::TASK_ACCEPT, e); } @@ -2247,7 +2237,7 @@ void ClientTaskState::SharedTaskIncrementDoneCount( bool ignore_quest_update ) { - const auto t = task_manager->GetTaskData(task_id); + const auto t = TaskManager::Instance()->GetTaskData(task_id); auto info = GetClientTaskInfo(t->type, TASKSLOTSHAREDTASK); if (info == nullptr) { @@ -2286,7 +2276,7 @@ bool ClientTaskState::HasActiveSharedTask() void ClientTaskState::CreateTaskDynamicZone(Client* client, int task_id, DynamicZone& dz_request) { - const auto task = task_manager->GetTaskData(task_id); + const auto task = TaskManager::Instance()->GetTaskData(task_id); if (!task) { return; @@ -2349,7 +2339,7 @@ void ClientTaskState::ListTaskTimers(Client* client) for (const auto& task_timer : character_task_timers) { - const auto task = task_manager->GetTaskData(task_timer.task_id); + const auto task = TaskManager::Instance()->GetTaskData(task_timer.task_id); if (task) { auto timer_type = static_cast(task_timer.timer_type); @@ -2455,10 +2445,6 @@ void ClientTaskState::SyncSharedTaskZoneClientDoneCountState( bool ClientTaskState::HasActiveTasks() { - if (!task_manager) { - return false; - } - if (m_active_task.task_id != TASKSLOTEMPTY) { return true; } @@ -2495,9 +2481,9 @@ void ClientTaskState::LockSharedTask(Client* client, bool lock) void ClientTaskState::EndSharedTask(Client* client, bool send_fail) { - if (task_manager && m_active_shared_task.task_id != TASKSLOTEMPTY) + if (m_active_shared_task.task_id != TASKSLOTEMPTY) { - task_manager->EndSharedTask(*client, m_active_shared_task.task_id, send_fail); + TaskManager::Instance()->EndSharedTask(*client, m_active_shared_task.task_id, send_fail); } } bool ClientTaskState::CanAcceptNewTask(Client* client, int task_id, int npc_entity_id) const diff --git a/zone/task_manager.h b/zone/task_manager.h index e1f1a1154..abd1255a4 100644 --- a/zone/task_manager.h +++ b/zone/task_manager.h @@ -70,6 +70,12 @@ public: return it != m_task_data.end() ? &it->second : nullptr; } + static TaskManager* Instance() + { + static TaskManager instance; + return &instance; + } + private: std::vector m_task_sets[MAXTASKSETS]; std::unordered_map m_task_data; diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 33c5150a6..708a43e84 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -14,17 +14,17 @@ extern QueryServ *QServ; void Client::LoadClientTaskState() { - if (RuleB(TaskSystem, EnableTaskSystem) && task_manager) { + if (RuleB(TaskSystem, EnableTaskSystem)) { LoadClientSharedCompletedTasks(); safe_delete(task_state); task_state = new ClientTaskState(); - if (!task_manager->LoadClientState(this, task_state)) { + if (!TaskManager::Instance()->LoadClientState(this, task_state)) { safe_delete(task_state); } else { - task_manager->SendActiveTasksToClient(this); - task_manager->SendCompletedTasksToClient(this, task_state); + TaskManager::Instance()->SendActiveTasksToClient(this); + TaskManager::Instance()->SendCompletedTasksToClient(this, task_state); } } } diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 209ff87db..519bf87ae 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -4644,11 +4644,9 @@ void WorldServer::ProcessReload(const ServerReload::Request& request) case ServerReload::Type::Tasks: if (RuleB(Tasks, EnableTaskSystem)) { entity_list.SaveAllClientsTaskState(); - safe_delete(task_manager); - task_manager = new TaskManager; - task_manager->LoadTasks(); + TaskManager::Instance()->LoadTasks(); entity_list.ReloadAllClientsTaskState(); - task_manager->LoadTaskSets(); + TaskManager::Instance()->LoadTaskSets(); } break; From 2f4a5b56dda3ca8124d3d01afbd124783e757968 Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sun, 22 Jun 2025 14:13:16 -0400 Subject: [PATCH 08/18] [Code] SkillCaps Global to Singleton Cleanup (#4933) --- common/skill_caps.h | 8 ++++++-- world/client.cpp | 2 +- world/main.cpp | 3 +-- world/zonelist.cpp | 2 +- zone/bot.cpp | 10 +++++----- zone/client.cpp | 8 ++++---- zone/main.cpp | 3 +-- zone/merc.cpp | 6 +++--- zone/npc.cpp | 4 ++-- zone/worldserver.cpp | 2 +- 10 files changed, 25 insertions(+), 23 deletions(-) diff --git a/common/skill_caps.h b/common/skill_caps.h index 9630ed7d7..6566a1104 100644 --- a/common/skill_caps.h +++ b/common/skill_caps.h @@ -16,12 +16,16 @@ public: static int32_t GetSkillCapMaxLevel(uint8 class_id, EQ::skills::SkillType skill_id); SkillCaps *SetContentDatabase(Database *db); + + static SkillCaps* Instance() + { + static SkillCaps instance; + return &instance; + } private: Database *m_content_database{}; std::map m_skill_caps = {}; }; -extern SkillCaps skill_caps; - #endif //CODE_SKILL_CAPS_H diff --git a/world/client.cpp b/world/client.cpp index 243d9f203..60ad59ef9 100644 --- a/world/client.cpp +++ b/world/client.cpp @@ -2171,7 +2171,7 @@ void Client::SetClassStartingSkills(PlayerProfile_Struct *pp) i == EQ::skills::SkillAlcoholTolerance || i == EQ::skills::SkillBindWound) continue; - pp->skills[i] = skill_caps.GetSkillCap(pp->class_, (EQ::skills::SkillType)i, 1).cap; + pp->skills[i] = SkillCaps::Instance()->GetSkillCap(pp->class_, (EQ::skills::SkillType)i, 1).cap; } } diff --git a/world/main.cpp b/world/main.cpp index a6be1319b..ab790bc4f 100644 --- a/world/main.cpp +++ b/world/main.cpp @@ -91,7 +91,6 @@ #include "../common/repositories/character_parcels_repository.h" #include "../common/ip_util.h" -SkillCaps skill_caps; ZoneStore zone_store; ClientList client_list; GroupLFPList LFPGroupList; @@ -206,7 +205,7 @@ int main(int argc, char **argv) ->SetExpansionContext() ->ReloadContentFlags(); - skill_caps.SetContentDatabase(&content_db)->LoadSkillCaps(); + SkillCaps::Instance()->SetContentDatabase(&content_db)->LoadSkillCaps(); std::unique_ptr server_connection; server_connection = std::make_unique(); diff --git a/world/zonelist.cpp b/world/zonelist.cpp index 9f24c021b..84bf09c6d 100644 --- a/world/zonelist.cpp +++ b/world/zonelist.cpp @@ -978,7 +978,7 @@ void ZSList::SendServerReload(ServerReload::Type type, uchar *packet) } else if (type == ServerReload::Type::Rules) { RuleManager::Instance()->LoadRules(&database, RuleManager::Instance()->GetActiveRuleset(), true); } else if (type == ServerReload::Type::SkillCaps) { - skill_caps.ReloadSkillCaps(); + SkillCaps::Instance()->ReloadSkillCaps(); } else if (type == ServerReload::Type::ContentFlags) { content_service.SetExpansionContext()->ReloadContentFlags(); } else if (type == ServerReload::Type::Logs) { diff --git a/zone/bot.cpp b/zone/bot.cpp index 47d153705..36fd4e753 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -1242,7 +1242,7 @@ uint16 Bot::GetPrimarySkillValue() { } uint16 Bot::MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const { - return skill_caps.GetSkillCap(class_, skillid, level).cap; + return SkillCaps::Instance()->GetSkillCap(class_, skillid, level).cap; } uint32 Bot::GetTotalATK() { @@ -3575,7 +3575,7 @@ void Bot::Depop() { RemoveAllAuras(); Mob* bot_pet = GetPet(); - + if (bot_pet) { if (bot_pet->Charmed()) { bot_pet->BuffFadeByEffect(SE_Charm); @@ -7342,7 +7342,7 @@ void Bot::CalcBotStats(bool showtext) { SetLevel(GetBotOwner()->GetLevel()); for (int sindex = 0; sindex <= EQ::skills::HIGHEST_SKILL; ++sindex) { - skills[sindex] = skill_caps.GetSkillCap(GetClass(), (EQ::skills::SkillType)sindex, GetLevel()).cap; + skills[sindex] = SkillCaps::Instance()->GetSkillCap(GetClass(), (EQ::skills::SkillType)sindex, GetLevel()).cap; } taunt_timer.Start(1000); @@ -11274,7 +11274,7 @@ void Bot::SetSpellTypePriority(uint16 spell_type, uint8 priority_type, uint16 pr std::list Bot::GetSpellTypesPrioritized(uint8 priority_type) { std::list cast_order; - + for (uint16 i = BotSpellTypes::START; i <= BotSpellTypes::END; i++) { BotSpellTypeOrder typeSettings = { .spellType = i, @@ -13463,4 +13463,4 @@ bool Bot::HasControllablePet(uint8 ranks_required) { return GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= ranks_required; -} \ No newline at end of file +} diff --git a/zone/client.cpp b/zone/client.cpp index 4b18ab6b8..0d53b7ce5 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -3196,7 +3196,7 @@ bool Client::CanHaveSkill(EQ::skills::SkillType skill_id) const skill_id = EQ::skills::Skill2HPiercing; } - return skill_caps.GetSkillCap(GetClass(), skill_id, RuleI(Character, MaxLevel)).cap > 0; + return SkillCaps::Instance()->GetSkillCap(GetClass(), skill_id, RuleI(Character, MaxLevel)).cap > 0; } uint16 Client::MaxSkill(EQ::skills::SkillType skill_id, uint8 class_id, uint8 level) const @@ -3209,7 +3209,7 @@ uint16 Client::MaxSkill(EQ::skills::SkillType skill_id, uint8 class_id, uint8 le skill_id = EQ::skills::Skill2HPiercing; } - return skill_caps.GetSkillCap(class_id, skill_id, level).cap; + return SkillCaps::Instance()->GetSkillCap(class_id, skill_id, level).cap; } uint8 Client::GetSkillTrainLevel(EQ::skills::SkillType skill_id, uint8 class_id) @@ -3222,7 +3222,7 @@ uint8 Client::GetSkillTrainLevel(EQ::skills::SkillType skill_id, uint8 class_id) skill_id = EQ::skills::Skill2HPiercing; } - return skill_caps.GetSkillTrainLevel(class_id, skill_id, RuleI(Character, MaxLevel)); + return SkillCaps::Instance()->GetSkillTrainLevel(class_id, skill_id, RuleI(Character, MaxLevel)); } uint16 Client::GetMaxSkillAfterSpecializationRules(EQ::skills::SkillType skillid, uint16 maxSkill) @@ -12099,7 +12099,7 @@ void Client::MaxSkills() auto current_skill_value = ( EQ::skills::IsSpecializedSkill(s.first) ? MAX_SPECIALIZED_SKILL : - skill_caps.GetSkillCap(GetClass(), s.first, GetLevel()).cap + SkillCaps::Instance()->GetSkillCap(GetClass(), s.first, GetLevel()).cap ); if (GetSkill(s.first) < current_skill_value) { diff --git a/zone/main.cpp b/zone/main.cpp index 24bc85c4b..a17b36e8e 100644 --- a/zone/main.cpp +++ b/zone/main.cpp @@ -108,7 +108,6 @@ ZoneEventScheduler event_scheduler; WorldContentService content_service; PlayerEventLogs player_event_logs; DatabaseUpdate database_update; -SkillCaps skill_caps; EvolvingItemsManager evolving_items_manager; const SPDat_Spell_Struct* spells; @@ -314,7 +313,7 @@ int main(int argc, char **argv) player_event_logs.SetDatabase(&database)->Init(); - skill_caps.SetContentDatabase(&content_db)->LoadSkillCaps(); + SkillCaps::Instance()->SetContentDatabase(&content_db)->LoadSkillCaps(); const auto c = EQEmuConfig::get(); if (c->auto_database_updates) { diff --git a/zone/merc.cpp b/zone/merc.cpp index c54585f9e..f19287e86 100644 --- a/zone/merc.cpp +++ b/zone/merc.cpp @@ -67,7 +67,7 @@ Merc::Merc(const NPCType* d, float x, float y, float z, float heading) int r; for (r = 0; r <= EQ::skills::HIGHEST_SKILL; r++) { - skills[r] = skill_caps.GetSkillCap(GetClass(), (EQ::skills::SkillType)r, GetLevel()).cap; + skills[r] = SkillCaps::Instance()->GetSkillCap(GetClass(), (EQ::skills::SkillType)r, GetLevel()).cap; } size = d->size; @@ -774,12 +774,12 @@ bool Merc::HasSkill(EQ::skills::SkillType skill_id) const { } bool Merc::CanHaveSkill(EQ::skills::SkillType skill_id) const { - return skill_caps.GetSkillCap(GetClass(), skill_id, RuleI(Character, MaxLevel)).cap > 0; + return SkillCaps::Instance()->GetSkillCap(GetClass(), skill_id, RuleI(Character, MaxLevel)).cap > 0; //if you don't have it by max level, then odds are you never will? } uint16 Merc::MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const { - return skill_caps.GetSkillCap(class_, skillid, level).cap; + return SkillCaps::Instance()->GetSkillCap(class_, skillid, level).cap; } void Merc::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) { diff --git a/zone/npc.cpp b/zone/npc.cpp index defebff94..1f02330d8 100644 --- a/zone/npc.cpp +++ b/zone/npc.cpp @@ -370,7 +370,7 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi //give NPCs skill values... int r; for (r = 0; r <= EQ::skills::HIGHEST_SKILL; r++) { - skills[r] = skill_caps.GetSkillCap(GetClass(), (EQ::skills::SkillType)r, moblevel).cap; + skills[r] = SkillCaps::Instance()->GetSkillCap(GetClass(), (EQ::skills::SkillType)r, moblevel).cap; } // some overrides -- really we need to be able to set skills for mobs in the DB // There are some known low level SHM/BST pets that do not follow this, which supports @@ -3726,7 +3726,7 @@ void NPC::RecalculateSkills() { int r; for (r = 0; r <= EQ::skills::HIGHEST_SKILL; r++) { - skills[r] = skill_caps.GetSkillCap(GetClass(), (EQ::skills::SkillType)r, level).cap; + skills[r] = SkillCaps::Instance()->GetSkillCap(GetClass(), (EQ::skills::SkillType)r, level).cap; } // some overrides -- really we need to be able to set skills for mobs in the DB diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 519bf87ae..978630f09 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -4627,7 +4627,7 @@ void WorldServer::ProcessReload(const ServerReload::Request& request) break; case ServerReload::Type::SkillCaps: - skill_caps.ReloadSkillCaps(); + SkillCaps::Instance()->ReloadSkillCaps(); break; case ServerReload::Type::DataBucketsCache: From f0c041e8b3325dfec07b823bd9ee0411aa23b40c Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sun, 22 Jun 2025 14:13:58 -0400 Subject: [PATCH 09/18] [Code] EQ::Random Global to Singleton Cleanup (#4936) --- common/random.h | 6 ++++++ world/adventure.cpp | 5 ++--- world/adventure_manager.cpp | 3 +-- world/client.cpp | 3 +-- world/main.cpp | 1 - world/zonelist.cpp | 3 +-- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/common/random.h b/common/random.h index 6d351121f..73b14369e 100644 --- a/common/random.h +++ b/common/random.h @@ -116,6 +116,12 @@ namespace EQ { Reseed(); } + static Random* Instance() + { + static Random instance; + return &instance; + } + private: #ifndef BIASED_INT_DIST typedef std::uniform_int_distribution::param_type int_param_t; diff --git a/world/adventure.cpp b/world/adventure.cpp index ae923b3be..3abd5aa61 100644 --- a/world/adventure.cpp +++ b/world/adventure.cpp @@ -18,7 +18,6 @@ extern ZSList zoneserver_list; extern ClientList client_list; extern AdventureManager adventure_manager; -extern EQ::Random emu_random; Adventure::Adventure(AdventureTemplate *t) { @@ -368,8 +367,8 @@ void Adventure::MoveCorpsesToGraveyard() glm::vec4 position; - float x = GetTemplate()->graveyard_x + emu_random.Real(-GetTemplate()->graveyard_radius, GetTemplate()->graveyard_radius); - float y = GetTemplate()->graveyard_y + emu_random.Real(-GetTemplate()->graveyard_radius, GetTemplate()->graveyard_radius); + float x = GetTemplate()->graveyard_x + EQ::Random::Instance()->Real(-GetTemplate()->graveyard_radius, GetTemplate()->graveyard_radius); + float y = GetTemplate()->graveyard_y + EQ::Random::Instance()->Real(-GetTemplate()->graveyard_radius, GetTemplate()->graveyard_radius); float z = GetTemplate()->graveyard_z; position.x = x; diff --git a/world/adventure_manager.cpp b/world/adventure_manager.cpp index 3d8442e53..bebcc369c 100644 --- a/world/adventure_manager.cpp +++ b/world/adventure_manager.cpp @@ -16,7 +16,6 @@ extern ZSList zoneserver_list; extern ClientList client_list; -extern EQ::Random emu_random; AdventureManager::AdventureManager() { @@ -324,7 +323,7 @@ void AdventureManager::CalculateAdventureRequestReply(const char *data) if(eligible_adventures.size() > 0) { ea_iter = eligible_adventures.begin(); - int c_index = emu_random.Int(0, (eligible_adventures.size()-1)); + int c_index = EQ::Random::Instance()->Int(0, (eligible_adventures.size()-1)); for(int i = 0; i < c_index; ++i) { ++ea_iter; diff --git a/world/client.cpp b/world/client.cpp index 60ad59ef9..8da802d90 100644 --- a/world/client.cpp +++ b/world/client.cpp @@ -91,7 +91,6 @@ std::vector character_create_race_class_combos; extern ZSList zoneserver_list; extern LoginServerList loginserverlist; extern ClientList client_list; -extern EQ::Random emu_random; extern uint32 numclients; extern volatile bool RunLoops; extern volatile bool UCSServerAvailable_; @@ -984,7 +983,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { safe_delete(outapp); // set mailkey - used for duration of character session - int mail_key = emu_random.Int(1, INT_MAX); + int mail_key = EQ::Random::Instance()->Int(1, INT_MAX); database.SetMailKey(charid, GetIP(), mail_key); if (UCSServerAvailable_) { diff --git a/world/main.cpp b/world/main.cpp index ab790bc4f..aadfd2420 100644 --- a/world/main.cpp +++ b/world/main.cpp @@ -102,7 +102,6 @@ LauncherList launcher_list; AdventureManager adventure_manager; WorldEventScheduler event_scheduler; SharedTaskManager shared_task_manager; -EQ::Random emu_random; volatile bool RunLoops = true; uint32 numclients = 0; uint32 numzones = 0; diff --git a/world/zonelist.cpp b/world/zonelist.cpp index 84bf09c6d..386f5c781 100644 --- a/world/zonelist.cpp +++ b/world/zonelist.cpp @@ -41,7 +41,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "../common/repositories/buyer_repository.h" extern uint32 numzones; -extern EQ::Random emu_random; extern WebInterfaceList web_interface; extern SharedTaskManager shared_task_manager; extern ClientList client_list; @@ -694,7 +693,7 @@ void ZSList::RebootZone(const char* ip1, uint16 port, const char* ip2, uint32 sk safe_delete_array(tmp); return; } - uint32 z = emu_random.Int(0, y - 1); + uint32 z = EQ::Random::Instance()->Int(0, y - 1); auto pack = new ServerPacket(ServerOP_ZoneReboot, sizeof(ServerZoneReboot_Struct)); ServerZoneReboot_Struct* s = (ServerZoneReboot_Struct*)pack->pBuffer; From 5ac9dd04e4bfbe19e2ec241078171881a4424b77 Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Sun, 22 Jun 2025 13:52:13 -0500 Subject: [PATCH 10/18] [Code] Cleanup Strings Header (#4950) * [Code] Cleanup Strings Header * Include optimize --- common/database.cpp | 14 ++ common/process/process.cpp | 1 + common/repositories/rule_values_repository.h | 61 +++++- common/shareddb.cpp | 54 ++++- common/strings.cpp | 20 ++ common/strings.h | 196 +------------------ tests/string_util_test.h | 16 -- zone/bot_database.cpp | 62 +++++- zone/position.cpp | 1 + 9 files changed, 204 insertions(+), 221 deletions(-) diff --git a/common/database.cpp b/common/database.cpp index c79ae0117..099b796ad 100644 --- a/common/database.cpp +++ b/common/database.cpp @@ -708,6 +708,20 @@ const std::string Database::GetNPCNameByID(uint32 npc_id) return e.id ? e.name : std::string(); } +template +inline auto CleanMobName(InputIterator first, InputIterator last, OutputIterator result) +{ + for (; first != last; ++first) { + if (*first == '_') { + *result = ' '; + } + else if (isalpha(*first) || *first == '`') { + *result = *first; + } + } + return result; +} + const std::string Database::GetCleanNPCNameByID(uint32 npc_id) { const auto& e = NpcTypesRepository::FindOne(*this, npc_id); diff --git a/common/process/process.cpp b/common/process/process.cpp index badb0fe11..56bbeff2b 100644 --- a/common/process/process.cpp +++ b/common/process/process.cpp @@ -1,6 +1,7 @@ #include #include #include "process.h" +#include std::string Process::execute(const std::string &cmd) { diff --git a/common/repositories/rule_values_repository.h b/common/repositories/rule_values_repository.h index 072175d5f..d7eb1530e 100644 --- a/common/repositories/rule_values_repository.h +++ b/common/repositories/rule_values_repository.h @@ -43,6 +43,47 @@ public: * method and encapsulate filters there */ + template + static std::vector join_tuple( + const std::string &glue, + const std::pair &encapsulation, + const std::vector> &src + ) + { + if (src.empty()) { + return {}; + } + + std::vector output; + + for (const std::tuple &src_iter: src) { + + output.emplace_back( + + fmt::format( + "{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}", + encapsulation.first, + std::get<0>(src_iter), + encapsulation.second, + glue, + encapsulation.first, + std::get<1>(src_iter), + encapsulation.second, + glue, + encapsulation.first, + std::get<2>(src_iter), + encapsulation.second, + glue, + encapsulation.first, + std::get<3>(src_iter), + encapsulation.second + ) + ); + } + + return output; + } + // Custom extended repository methods here static std::vector GetRuleNames(Database &db, int rule_set_id) { @@ -87,12 +128,28 @@ public: return v; } + template + static std::string + ImplodePair(const std::string &glue, const std::pair &encapsulation, const std::vector &src) + { + if (src.empty()) { + return {}; + } + std::ostringstream oss; + for (const T &src_iter: src) { + oss << encapsulation.first << src_iter << encapsulation.second << glue; + } + std::string output(oss.str()); + output.resize(output.size() - glue.size()); + return output; + } + static bool DeleteOrphanedRules(Database& db, std::vector& v) { const auto query = fmt::format( "DELETE FROM {} WHERE rule_name IN ({})", TableName(), - Strings::ImplodePair(",", std::pair('\'', '\''), v) + ImplodePair(",", std::pair('\'', '\''), v) ); return db.QueryDatabase(query).Success(); @@ -103,7 +160,7 @@ public: const auto query = fmt::format( "REPLACE INTO {} (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES {}", TableName(), - Strings::ImplodePair( + ImplodePair( ",", std::pair('(', ')'), join_tuple(",", std::pair('\'', '\''), v) diff --git a/common/shareddb.cpp b/common/shareddb.cpp index 8fe9d61bf..d143dfbfd 100644 --- a/common/shareddb.cpp +++ b/common/shareddb.cpp @@ -1544,12 +1544,60 @@ bool SharedDatabase::GetCommandSettings(std::map +inline std::vector join_pair( + const std::string &glue, + const std::pair &encapsulation, + const std::vector> &src +) +{ + if (src.empty()) { + return {}; + } + + std::vector output; + + for (const std::pair &src_iter: src) { + output.emplace_back( + + fmt::format( + "{}{}{}{}{}{}{}", + encapsulation.first, + src_iter.first, + encapsulation.second, + glue, + encapsulation.first, + src_iter.second, + encapsulation.second + ) + ); + } + + return output; +} + +template +inline std::string +ImplodePair(const std::string &glue, const std::pair &encapsulation, const std::vector &src) +{ + if (src.empty()) { + return {}; + } + std::ostringstream oss; + for (const T &src_iter: src) { + oss << encapsulation.first << src_iter << encapsulation.second << glue; + } + std::string output(oss.str()); + output.resize(output.size() - glue.size()); + return output; +} + bool SharedDatabase::UpdateInjectedCommandSettings(const std::vector> &injected) { if (injected.size()) { const std::string query = fmt::format( "REPLACE INTO `command_settings`(`command`, `access`) VALUES {}", - Strings::ImplodePair( + ImplodePair( ",", std::pair('(', ')'), join_pair(",", std::pair('\'', '\''), injected) @@ -1576,7 +1624,7 @@ bool SharedDatabase::UpdateOrphanedCommandSettings(const std::vector('\'', '\''), orphaned) + ImplodePair(",", std::pair('\'', '\''), orphaned) ); auto results = QueryDatabase(query); @@ -1586,7 +1634,7 @@ bool SharedDatabase::UpdateOrphanedCommandSettings(const std::vector('\'', '\''), orphaned) + ImplodePair(",", std::pair('\'', '\''), orphaned) ); auto results_two = QueryDatabase(query); diff --git a/common/strings.cpp b/common/strings.cpp index 58261388f..52990aa85 100644 --- a/common/strings.cpp +++ b/common/strings.cpp @@ -34,6 +34,7 @@ */ #include "strings.h" +#include #include #include #include @@ -41,6 +42,7 @@ #include #include #include +#include #include #include @@ -49,6 +51,12 @@ #include "strings_legacy.cpp" // legacy c functions #include "strings_misc.cpp" // anything non "Strings" scoped +#ifdef _WINDOWS +#include +#include +#include +#endif + std::string Strings::Random(size_t length) { static auto &chrs = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; @@ -701,6 +709,18 @@ std::string &Strings::Trim(std::string &str, const std::string &chars) return LTrim(RTrim(str, chars), chars); } +const std::string NUM_TO_ENGLISH_X[] = { + "", "One ", "Two ", "Three ", "Four ", + "Five ", "Six ", "Seven ", "Eight ", "Nine ", "Ten ", "Eleven ", + "Twelve ", "Thirteen ", "Fourteen ", "Fifteen ", + "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen " +}; + +const std::string NUM_TO_ENGLISH_Y[] = { + "", "", "Twenty ", "Thirty ", "Forty ", + "Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety " +}; + // Function to convert single digit or two digit number into words std::string Strings::ConvertToDigit(int n, const std::string& suffix) { diff --git a/common/strings.h b/common/strings.h index 5338949b5..8ae8fee25 100644 --- a/common/strings.h +++ b/common/strings.h @@ -36,53 +36,19 @@ #define _STRINGUTIL_H_ #include -#include -#include +#include #include +#include #include #include -#include #include -#include -#include - -#ifndef _WIN32 -// this doesn't appear to affect linux-based systems..need feedback for _WIN64 - -#endif - -#ifdef _WINDOWS +#ifdef _WIN32 #include -#include -#include #endif #include "types.h" -namespace detail { - // template magic to check if std::from_chars floating point functions exist - template - struct has_from_chars_float : std::false_type { }; - - // basically it "uses" this template if they do exist because reasons - template - struct has_from_chars_float < T, - std::void_t(), std::declval(), - std::declval()))>> : std::true_type { }; -}; // namespace detail - -namespace EQ { -// lame -- older GCC's didn't define this, clang's libc++ however does, even though they lack FP support -#if defined(__GNUC__) && (__GNUC__ < 11) && !defined(__clang__) - enum class chars_format { - scientific = 1, fixed = 2, hex = 4, general = fixed | scientific - }; -#else - using chars_format = std::chars_format; -#endif -}; // namespace EQ - class Strings { public: static bool Contains(std::vector container, const std::string& element); @@ -133,61 +99,6 @@ public: static bool BeginsWith(const std::string& subject, const std::string& search); static bool EndsWith(const std::string& subject, const std::string& search); static std::string ZoneTime(const uint8 hours, const uint8 minutes); - - template - static std::string - ImplodePair(const std::string &glue, const std::pair &encapsulation, const std::vector &src) - { - if (src.empty()) { - return {}; - } - std::ostringstream oss; - for (const T &src_iter: src) { - oss << encapsulation.first << src_iter << encapsulation.second << glue; - } - std::string output(oss.str()); - output.resize(output.size() - glue.size()); - return output; - } - - // basic string_view overloads that just use std stuff since they work! - template - std::enable_if_t && detail::has_from_chars_float::value, std::from_chars_result> - static from_chars(std::string_view str, T& value, EQ::chars_format fmt = EQ::chars_format::general) - { - return std::from_chars(str.data(), str.data() + str.size(), value, fmt); - } - - template - std::enable_if_t, std::from_chars_result> - static from_chars(std::string_view str, T& value, int base = 10) - { - return std::from_chars(str.data(), str.data() + str.size(), value, base); - } - - // fallback versions of floating point in case they're not implemented - // TODO: add error handling ... - // This does have to allocate since from_chars doesn't need a null terminated string and neither does string_view - template - std::enable_if_t && !detail::has_from_chars_float::value && std::is_same_v, std::from_chars_result> - static from_chars(std::string_view str, T& value, EQ::chars_format fmt = EQ::chars_format::general) - { - std::from_chars_result res{}; - std::string tmp_str(str.data(), str.size()); - value = strtof(tmp_str.data(), nullptr); - return res; - } - - template - std::enable_if_t && !detail::has_from_chars_float::value && std::is_same_v, std::from_chars_result> - static from_chars(std::string_view str, T& value, EQ::chars_format fmt = EQ::chars_format::general) - { - std::from_chars_result res{}; - std::string tmp_str(str.data(), str.size()); - value = strtod(tmp_str.data(), nullptr); - return res; - } - static std::string Slugify(const std::string &input, const std::string &separator = "-"); static bool IsValidJson(const std::string& json); }; @@ -199,93 +110,6 @@ const std::string vStringFormat(const char *format, va_list args); // Used for grid nodes, as NPC names remove numerals. // But general purpose -const std::string NUM_TO_ENGLISH_X[] = { - "", "One ", "Two ", "Three ", "Four ", - "Five ", "Six ", "Seven ", "Eight ", "Nine ", "Ten ", "Eleven ", - "Twelve ", "Thirteen ", "Fourteen ", "Fifteen ", - "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen " -}; - -const std::string NUM_TO_ENGLISH_Y[] = { - "", "", "Twenty ", "Thirty ", "Forty ", - "Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety " -}; - -// _WIN32 builds require that #include be included in whatever code file the invocation is made from (no header files) -template -std::vector join_pair( - const std::string &glue, - const std::pair &encapsulation, - const std::vector> &src -) -{ - if (src.empty()) { - return {}; - } - - std::vector output; - - for (const std::pair &src_iter: src) { - output.emplace_back( - - fmt::format( - "{}{}{}{}{}{}{}", - encapsulation.first, - src_iter.first, - encapsulation.second, - glue, - encapsulation.first, - src_iter.second, - encapsulation.second - ) - ); - } - - return output; -} - -// _WIN32 builds require that #include be included in whatever code file the invocation is made from (no header files) -template -std::vector join_tuple( - const std::string &glue, - const std::pair &encapsulation, - const std::vector> &src -) -{ - if (src.empty()) { - return {}; - } - - std::vector output; - - for (const std::tuple &src_iter: src) { - - output.emplace_back( - - fmt::format( - "{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}", - encapsulation.first, - std::get<0>(src_iter), - encapsulation.second, - glue, - encapsulation.first, - std::get<1>(src_iter), - encapsulation.second, - glue, - encapsulation.first, - std::get<2>(src_iter), - encapsulation.second, - glue, - encapsulation.first, - std::get<3>(src_iter), - encapsulation.second - ) - ); - } - - return output; -} - // misc functions std::string SanitizeWorldServerName(std::string server_long_name); std::vector GetBadWords(); @@ -310,18 +134,4 @@ std::string FormatName(const std::string &char_name); bool IsAllowedWorldServerCharacterList(char c); void SanitizeWorldServerName(char *name); -template -auto CleanMobName(InputIterator first, InputIterator last, OutputIterator result) -{ - for (; first != last; ++first) { - if (*first == '_') { - *result = ' '; - } - else if (isalpha(*first) || *first == '`') { - *result = *first; - } - } - return result; -} - #endif diff --git a/tests/string_util_test.h b/tests/string_util_test.h index af88a5a03..37bd539f7 100644 --- a/tests/string_util_test.h +++ b/tests/string_util_test.h @@ -30,7 +30,6 @@ public: TEST_ADD(StringUtilTest::EscapeStringTest); TEST_ADD(StringUtilTest::SearchDeliminatedStringTest); TEST_ADD(StringUtilTest::SplitStringTest); - TEST_ADD(StringUtilTest::FromCharsTest); TEST_ADD(StringUtilTest::TestIsFloat); TEST_ADD(StringUtilTest::TestIsNumber); } @@ -108,21 +107,6 @@ public: TEST_ASSERT(v[2] == "789"); } - void FromCharsTest() { - char int_chars[] = "123"; - int int_value = 0; - - char float_chars[] = "3.14"; - float float_value = 0.0f; - - Strings::from_chars(int_chars, int_value); - TEST_ASSERT(int_value == 123); - - Strings::from_chars(float_chars, float_value); - TEST_ASSERT(float_value == 3.14f); - - } - void TestIsFloat() { TEST_ASSERT_EQUALS(Strings::IsFloat("0.23424523"), true); TEST_ASSERT_EQUALS(Strings::IsFloat("12312312313.23424523"), true); diff --git a/zone/bot_database.cpp b/zone/bot_database.cpp index 4c78284e6..10d681913 100644 --- a/zone/bot_database.cpp +++ b/zone/bot_database.cpp @@ -74,13 +74,61 @@ bool BotDatabase::LoadBotCommandSettings(std::map +inline std::vector join_pair( + const std::string &glue, + const std::pair &encapsulation, + const std::vector> &src +) +{ + if (src.empty()) { + return {}; + } + + std::vector output; + + for (const std::pair &src_iter: src) { + output.emplace_back( + + fmt::format( + "{}{}{}{}{}{}{}", + encapsulation.first, + src_iter.first, + encapsulation.second, + glue, + encapsulation.first, + src_iter.second, + encapsulation.second + ) + ); + } + + return output; +} + +template +inline std::string +ImplodePair(const std::string &glue, const std::pair &encapsulation, const std::vector &src) +{ + if (src.empty()) { + return {}; + } + std::ostringstream oss; + for (const T &src_iter: src) { + oss << encapsulation.first << src_iter << encapsulation.second << glue; + } + std::string output(oss.str()); + output.resize(output.size() - glue.size()); + return output; +} + bool BotDatabase::UpdateInjectedBotCommandSettings(const std::vector> &injected) { if (injected.size()) { query = fmt::format( "REPLACE INTO `bot_command_settings`(`bot_command`, `access`) VALUES {}", - Strings::ImplodePair( + ImplodePair( ",", std::pair('(', ')'), join_pair(",", std::pair('\'', '\''), injected) @@ -107,7 +155,7 @@ bool BotDatabase::UpdateOrphanedBotCommandSettings(const std::vector('\'', '\''), orphaned) + ImplodePair(",", std::pair('\'', '\''), orphaned) ); if (!database.QueryDatabase(query).Success()) { @@ -248,7 +296,7 @@ bool BotDatabase::LoadBotsList(const uint32 owner_id, std::listGetCleanName(), Stance::GetName(Stance::Passive), Stance::Passive); return true; @@ -2278,7 +2326,7 @@ bool BotDatabase::SaveBotSettings(Mob* m) if (!m->IsOfClientBot()) { return false; } - + uint32 bot_id = (m->IsBot() ? m->CastToBot()->GetBotID() : 0); uint32 character_id = (m->IsClient() ? m->CastToClient()->CharacterID() : 0); uint8 stance_id = (m->IsBot() ? m->CastToBot()->GetBotStance() : 0); @@ -2289,10 +2337,10 @@ bool BotDatabase::SaveBotSettings(Mob* m) } std::string query = ""; - + if (m->IsClient()) { query = fmt::format("`character_id` = {} AND `stance` = {}", character_id, stance_id); - } + } else { query = fmt::format("`bot_id` = {} AND `stance` = {}", bot_id, stance_id); } diff --git a/zone/position.cpp b/zone/position.cpp index 52062120e..39cb5b6d4 100644 --- a/zone/position.cpp +++ b/zone/position.cpp @@ -6,6 +6,7 @@ #include "../common/data_verification.h" #include #include "../common/types.h" +#include constexpr float position_eps = 0.0001f; From 4005b68383538b1b33fd95d98dd9f5dee14cc3c7 Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Sun, 22 Jun 2025 13:52:23 -0500 Subject: [PATCH 11/18] [Code] Optimize PCH Config (Faster Builds) (#4951) --- common/CMakeLists.txt | 2 +- common/pch/app-pch.h | 7 +++++++ common/pch/{pch.h => std-pch.h} | 0 world/CMakeLists.txt | 2 +- zone/CMakeLists.txt | 10 ++++++---- 5 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 common/pch/app-pch.h rename common/pch/{pch.h => std-pch.h} (100%) diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 0350cb6d4..787cd299c 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -842,7 +842,7 @@ IF (UNIX) ENDIF (UNIX) IF (WIN32 AND EQEMU_BUILD_PCH) - TARGET_PRECOMPILE_HEADERS(common PRIVATE pch/pch.h) + TARGET_PRECOMPILE_HEADERS(common PRIVATE pch/std-pch.h) ENDIF () SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) diff --git a/common/pch/app-pch.h b/common/pch/app-pch.h new file mode 100644 index 000000000..6c1f216aa --- /dev/null +++ b/common/pch/app-pch.h @@ -0,0 +1,7 @@ +#include "../types.h" +#include "../database.h" +#include "../strings.h" +#include "../eqemu_logsys.h" +#include "../eqemu_logsys_log_aliases.h" +#include "../features.h" +#include "../global_define.h" diff --git a/common/pch/pch.h b/common/pch/std-pch.h similarity index 100% rename from common/pch/pch.h rename to common/pch/std-pch.h diff --git a/world/CMakeLists.txt b/world/CMakeLists.txt index 0eed74b9b..1963c83ae 100644 --- a/world/CMakeLists.txt +++ b/world/CMakeLists.txt @@ -77,7 +77,7 @@ ADD_EXECUTABLE(world ${world_sources} ${world_headers}) INSTALL(TARGETS world RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) IF (WIN32 AND EQEMU_BUILD_PCH) - TARGET_PRECOMPILE_HEADERS(world PRIVATE ../common/pch/pch.h) + TARGET_PRECOMPILE_HEADERS(world PRIVATE ../common/pch/std-pch.h) ENDIF () ADD_DEFINITIONS(-DWORLD) diff --git a/zone/CMakeLists.txt b/zone/CMakeLists.txt index 8424891e9..ecc9d35a8 100644 --- a/zone/CMakeLists.txt +++ b/zone/CMakeLists.txt @@ -480,13 +480,15 @@ ADD_EXECUTABLE(zone ${zone_sources} ${zone_headers}) # binary output directory INSTALL(TARGETS zone RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) -# precompile headers +# precompiled headers IF (WIN32 AND EQEMU_BUILD_PCH) - TARGET_PRECOMPILE_HEADERS(zone PRIVATE ../common/pch/pch.h) - TARGET_PRECOMPILE_HEADERS(zone PRIVATE ../common/types.h ../common/eqemu_logsys.h ../common/eqemu_logsys_log_aliases.h ../common/features.h ../common/global_define.h) - TARGET_PRECOMPILE_HEADERS(zone PRIVATE mob.h npc.h corpse.h doors.h bot.h entity.h client.h zone.h) + TARGET_PRECOMPILE_HEADERS(zone PRIVATE ../common/pch/std-pch.h) ENDIF() +# precompiled headers +TARGET_PRECOMPILE_HEADERS(zone PRIVATE ../common/pch/app-pch.h) +TARGET_PRECOMPILE_HEADERS(zone PRIVATE merc.h mob.h npc.h corpse.h doors.h bot.h entity.h client.h zone.h) + ADD_DEFINITIONS(-DZONE) # link lua_zone unity build against luabind From bac892b582ca59d34ad25cd6a2d442a353b66247 Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Mon, 23 Jun 2025 04:25:50 -0500 Subject: [PATCH 12/18] [API] Add wwmarquee (#4919) * [API] Implement Console "wwmarquee" * Fin --- world/console.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ zone/worldserver.cpp | 1 - 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/world/console.cpp b/world/console.cpp index 2fcc878bf..b86757c45 100644 --- a/world/console.cpp +++ b/world/console.cpp @@ -1330,6 +1330,42 @@ void ConsoleWorldWideMove( ); } +void ConsoleWWMarquee( + EQ::Net::ConsoleServerConnection* connection, + const std::string& command, + const std::vector& args +) +{ + if (args.size() < 2) { + connection->SendLine("Usage: wwmarquee "); + return; + } + + const uint32 type = Strings::IsNumber(args[0]) ? Strings::ToUnsignedInt(args[0]) : 0; + std::string message = Strings::Join(std::vector(args.begin() + 1, args.end()), " "); + if (message.empty()) { + connection->SendLine("Message cannot be empty."); + return; + } + + auto pack = new ServerPacket(ServerOP_WWMarquee, sizeof(WWMarquee_Struct)); + auto* wwm = (WWMarquee_Struct*)pack->pBuffer; + + wwm->type = type; + wwm->priority = 510; + wwm->fade_in = 0; + wwm->fade_out = 0; + wwm->duration = 5000; + wwm->min_status = AccountStatus::Player; + wwm->max_status = AccountStatus::Player; + + strn0cpy(wwm->message, message.c_str(), sizeof(wwm->message)); + + zoneserver_list.SendPacket(pack); + safe_delete(pack); + + connection->SendLine(fmt::format("Sent world marquee type {}: {}", type, message)); +} /** * @param console @@ -1367,6 +1403,12 @@ void RegisterConsoleFunctions(std::unique_ptr& console) console->RegisterCall("whoami", 50, "whoami", std::bind(ConsoleWhoami, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); console->RegisterCall("worldshutdown", 200, "worldshutdown", std::bind(ConsoleWorldShutdown, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); console->RegisterCall("wwcast", 50, "wwcast [spell_id] [min_status] [max_status] - min_status and max_status are optional", std::bind(ConsoleWorldWideCastSpell, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + console->RegisterCall( + "wwmarquee", + 50, + "wwmarquee ", + std::bind(ConsoleWWMarquee, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3) + ); console->RegisterCall("wwmove", 50, "wwmove [instance_id|zone_short_name] [min_status] [max_status] - min_status and max_status are optional, instance_id and zone_short_name are interchangeable", std::bind(ConsoleWorldWideMove, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); console->RegisterCall("zonebootup", 150, "zonebootup [zone_server_id] [zone_short_name]", std::bind(ConsoleZoneBootup, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); console->RegisterCall("zonelock", 150, "zonelock [list|lock|unlock] [zone_short_name]", std::bind(ConsoleZoneLock, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 978630f09..6df196e1d 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -3140,7 +3140,6 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) case ServerOP_WWMarquee: { auto s = (WWMarquee_Struct*) pack->pBuffer; - for (const auto& c : entity_list.GetClientList()) { if ( c.second->Admin() >= s->min_status && From 2e760d6397c57421bacfd5027398e28f8822fd9a Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Mon, 23 Jun 2025 06:45:06 -0400 Subject: [PATCH 13/18] [Code] ZoneStore Global to Singleton Cleanup (#4934) --- client_files/export/main.cpp | 1 - client_files/import/main.cpp | 1 - common/content/world_content_service.cpp | 4 +- common/zone_store.h | 23 +- loginserver/main.cpp | 1 - queryserv/queryserv.cpp | 1 - shared_memory/main.cpp | 1 - ucs/ucs.cpp | 1 - world/client.cpp | 2 +- world/console.cpp | 4 +- world/main.cpp | 1 - world/world_boot.cpp | 4 +- zone/client_packet.cpp | 2 +- zone/embparser_api.cpp | 254 +++++++++++------------ zone/gm_commands/set/zone.cpp | 2 +- zone/gm_commands/zone.cpp | 2 +- zone/gm_commands/zone_shard.cpp | 2 +- zone/lua_general.cpp | 246 +++++++++++----------- zone/lua_zone.cpp | 104 +++++----- zone/main.cpp | 5 +- zone/perl_zone.cpp | 86 ++++---- zone/task_client_state.cpp | 2 +- zone/worldserver.cpp | 2 +- zone/zone.cpp | 6 +- zone/zonedb.cpp | 4 +- zone/zoning.cpp | 2 +- 26 files changed, 379 insertions(+), 384 deletions(-) diff --git a/client_files/export/main.cpp b/client_files/export/main.cpp index faad88103..c75645f88 100644 --- a/client_files/export/main.cpp +++ b/client_files/export/main.cpp @@ -40,7 +40,6 @@ EQEmuLogSys LogSys; WorldContentService content_service; -ZoneStore zone_store; PlayerEventLogs player_event_logs; EvolvingItemsManager evolving_items_manager; diff --git a/client_files/import/main.cpp b/client_files/import/main.cpp index 286f76572..36bcdedf2 100644 --- a/client_files/import/main.cpp +++ b/client_files/import/main.cpp @@ -34,7 +34,6 @@ EQEmuLogSys LogSys; WorldContentService content_service; -ZoneStore zone_store; PlayerEventLogs player_event_logs; EvolvingItemsManager evolving_items_manager; diff --git a/common/content/world_content_service.cpp b/common/content/world_content_service.cpp index 7d23c9d13..b54dd7032 100644 --- a/common/content/world_content_service.cpp +++ b/common/content/world_content_service.cpp @@ -185,7 +185,7 @@ void WorldContentService::ReloadContentFlags() SetContentFlags(set_content_flags); LoadStaticGlobalZoneInstances(); - zone_store.LoadZones(*m_content_database); + ZoneStore::Instance()->LoadZones(*m_content_database); } Database *WorldContentService::GetDatabase() const @@ -291,7 +291,7 @@ WorldContentService *WorldContentService::LoadStaticGlobalZoneInstances() // instance_list table entry for lavastorm has version = 1, is_global = 1, never_expires = 1 WorldContentService::FindZoneResult WorldContentService::FindZone(uint32 zone_id, uint32 instance_id) { - for (const auto &z: zone_store.GetZones()) { + for (const auto &z: ZoneStore::Instance()->GetZones()) { for (auto &i: m_zone_static_instances) { if ( z.zoneidnumber == zone_id && diff --git a/common/zone_store.h b/common/zone_store.h index d8ee7233d..4a6940f4d 100644 --- a/common/zone_store.h +++ b/common/zone_store.h @@ -104,36 +104,39 @@ public: uint8 GetZoneIdleWhenEmpty(uint32 zone_id, int version = 0); uint32 GetZoneSecondsBeforeIdle(uint32 zone_id, int version = 0); + static ZoneStore* Instance() + { + static ZoneStore instance; + return &instance; + } private: std::vector m_zones; }; -extern ZoneStore zone_store; - /** * Global helpers */ -inline uint32 ZoneID(const char *in_zone_name) { return zone_store.GetZoneID(in_zone_name); } -inline uint32 ZoneID(const std::string& zone_name) { return zone_store.GetZoneID(zone_name); } +inline uint32 ZoneID(const char *in_zone_name) { return ZoneStore::Instance()->GetZoneID(in_zone_name); } +inline uint32 ZoneID(const std::string& zone_name) { return ZoneStore::Instance()->GetZoneID(zone_name); } inline const char *ZoneName(uint32 zone_id, bool error_unknown = false) { - return zone_store.GetZoneName( + return ZoneStore::Instance()->GetZoneName( zone_id, error_unknown ); } inline const char *ZoneLongName(uint32 zone_id, bool error_unknown = false) { - return zone_store.GetZoneLongName( + return ZoneStore::Instance()->GetZoneLongName( zone_id, error_unknown ); } -inline ZoneRepository::Zone *GetZone(uint32 zone_id, int version = 0) { return zone_store.GetZone(zone_id, version); }; -inline ZoneRepository::Zone *GetZone(const char *in_zone_name) { return zone_store.GetZone(in_zone_name); }; +inline ZoneRepository::Zone *GetZone(uint32 zone_id, int version = 0) { return ZoneStore::Instance()->GetZone(zone_id, version); }; +inline ZoneRepository::Zone *GetZone(const char *in_zone_name) { return ZoneStore::Instance()->GetZone(in_zone_name); }; inline ZoneRepository::Zone *GetZone(const char *in_zone_name, int version = 0) { - return zone_store.GetZone( + return ZoneStore::Instance()->GetZone( ZoneID( in_zone_name ), version @@ -141,7 +144,7 @@ inline ZoneRepository::Zone *GetZone(const char *in_zone_name, int version = 0) }; inline ZoneRepository::Zone *GetZoneVersionWithFallback(uint32 zone_id, int version = 0) { - return zone_store.GetZoneWithFallback( + return ZoneStore::Instance()->GetZoneWithFallback( zone_id, version ); diff --git a/loginserver/main.cpp b/loginserver/main.cpp index f1dc3ab09..e1499dace 100644 --- a/loginserver/main.cpp +++ b/loginserver/main.cpp @@ -26,7 +26,6 @@ EQEmuLogSys LogSys; bool run_server = true; Database database; PlayerEventLogs player_event_logs; -ZoneStore zone_store; void CatchSignal(int sig_num) { diff --git a/queryserv/queryserv.cpp b/queryserv/queryserv.cpp index 2224443d4..667f06e66 100644 --- a/queryserv/queryserv.cpp +++ b/queryserv/queryserv.cpp @@ -31,7 +31,6 @@ std::string WorldShortName; const queryservconfig *Config; WorldServer *worldserver = 0; EQEmuLogSys LogSys; -ZoneStore zone_store; PlayerEventLogs player_event_logs; ZSList zs_list; uint32 numzones = 0; diff --git a/shared_memory/main.cpp b/shared_memory/main.cpp index 03d44a03f..0935e5d99 100644 --- a/shared_memory/main.cpp +++ b/shared_memory/main.cpp @@ -37,7 +37,6 @@ EQEmuLogSys LogSys; WorldContentService content_service; -ZoneStore zone_store; PlayerEventLogs player_event_logs; EvolvingItemsManager evolving_items_manager; diff --git a/ucs/ucs.cpp b/ucs/ucs.cpp index 92909e921..7e44a4f3a 100644 --- a/ucs/ucs.cpp +++ b/ucs/ucs.cpp @@ -48,7 +48,6 @@ EQEmuLogSys LogSys; UCSDatabase database; WorldServer *worldserver = nullptr; DiscordManager discord_manager; -ZoneStore zone_store; PlayerEventLogs player_event_logs; const ucsconfig *Config; diff --git a/world/client.cpp b/world/client.cpp index 8da802d90..9b6cbc6ee 100644 --- a/world/client.cpp +++ b/world/client.cpp @@ -2368,7 +2368,7 @@ bool Client::StoreCharacter( return false; } - const std::string& zone_name = zone_store.GetZoneName(p_player_profile_struct->zone_id, true); + const std::string& zone_name = ZoneStore::Instance()->GetZoneName(p_player_profile_struct->zone_id, true); if (Strings::EqualFold(zone_name, "UNKNOWN")) { p_player_profile_struct->zone_id = Zones::QEYNOS; } diff --git a/world/console.cpp b/world/console.cpp index b86757c45..599bb8125 100644 --- a/world/console.cpp +++ b/world/console.cpp @@ -1219,7 +1219,7 @@ void ConsoleCrossZoneMove( const auto& zone_short_name = !Strings::IsNumber(args[2]) ? args[2] : ""; const uint16 instance_id = Strings::IsNumber(args[2]) ? static_cast(Strings::ToUnsignedInt(args[2])) : 0; - const auto& z = !zone_short_name.empty() ? zone_store.GetZone(zone_short_name) : nullptr; + const auto& z = !zone_short_name.empty() ? ZoneStore::Instance()->GetZone(zone_short_name) : nullptr; if (z && !z->id) { connection->SendLine(fmt::format("No zone with the short name '{}' exists.", zone_short_name)); @@ -1289,7 +1289,7 @@ void ConsoleWorldWideMove( const auto& zone_short_name = !Strings::IsNumber(args[2]) ? args[2] : ""; const uint16 instance_id = Strings::IsNumber(args[2]) ? static_cast(Strings::ToUnsignedInt(args[2])) : 0; - const auto& z = !zone_short_name.empty() ? zone_store.GetZone(zone_short_name) : nullptr; + const auto& z = !zone_short_name.empty() ? ZoneStore::Instance()->GetZone(zone_short_name) : nullptr; if (z && !z->id) { connection->SendLine(fmt::format("No zone with the short name '{}' exists.", zone_short_name)); diff --git a/world/main.cpp b/world/main.cpp index aadfd2420..bcd7c0737 100644 --- a/world/main.cpp +++ b/world/main.cpp @@ -91,7 +91,6 @@ #include "../common/repositories/character_parcels_repository.h" #include "../common/ip_util.h" -ZoneStore zone_store; ClientList client_list; GroupLFPList LFPGroupList; ZSList zoneserver_list; diff --git a/world/world_boot.cpp b/world/world_boot.cpp index 7c3c18f81..0bf727a02 100644 --- a/world/world_boot.cpp +++ b/world/world_boot.cpp @@ -279,9 +279,9 @@ bool WorldBoot::DatabaseLoadRoutines(int argc, char **argv) LogInfo("Loading zones"); - zone_store.LoadZones(content_db); + ZoneStore::Instance()->LoadZones(content_db); - if (zone_store.GetZones().empty()) { + if (ZoneStore::Instance()->GetZones().empty()) { LogError("Failed to load zones data, check your schema for possible errors"); return 1; } diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 9ba3bbf8a..7971a38d3 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -6963,7 +6963,7 @@ void Client::Handle_OP_GMSearchCorpse(const EQApplicationPacket *app) DialogueWindow::TableCell( fmt::format( "{} ({})", - zone_store.GetZoneLongName(e.zone_id, true), + ZoneStore::Instance()->GetZoneLongName(e.zone_id, true), e.zone_id ) ) + diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index 81ceff206..135b6227e 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -5115,627 +5115,627 @@ void Perl__send_player_handin_event() float Perl__GetZoneSafeX(uint32 zone_id) { - return zone_store.GetZoneSafeCoordinates(zone_id).x; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id).x; } float Perl__GetZoneSafeX(uint32 zone_id, int version) { - return zone_store.GetZoneSafeCoordinates(zone_id, version).x; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id, version).x; } float Perl__GetZoneSafeY(uint32 zone_id) { - return zone_store.GetZoneSafeCoordinates(zone_id).y; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id).y; } float Perl__GetZoneSafeY(uint32 zone_id, int version) { - return zone_store.GetZoneSafeCoordinates(zone_id, version).y; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id, version).y; } float Perl__GetZoneSafeZ(uint32 zone_id) { - return zone_store.GetZoneSafeCoordinates(zone_id).z; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id).z; } float Perl__GetZoneSafeZ(uint32 zone_id, int version) { - return zone_store.GetZoneSafeCoordinates(zone_id, version).z; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id, version).z; } float Perl__GetZoneSafeHeading(uint32 zone_id) { - return zone_store.GetZoneSafeCoordinates(zone_id).w; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id).w; } float Perl__GetZoneSafeHeading(uint32 zone_id, int version) { - return zone_store.GetZoneSafeCoordinates(zone_id, version).w; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id, version).w; } float Perl__GetZoneGraveyardID(uint32 zone_id) { - return zone_store.GetZoneGraveyardID(zone_id); + return ZoneStore::Instance()->GetZoneGraveyardID(zone_id); } float Perl__GetZoneGraveyardID(uint32 zone_id, int version) { - return zone_store.GetZoneGraveyardID(zone_id, version); + return ZoneStore::Instance()->GetZoneGraveyardID(zone_id, version); } uint8 Perl__GetZoneMinimumLevel(uint32 zone_id) { - return zone_store.GetZoneMinimumLevel(zone_id); + return ZoneStore::Instance()->GetZoneMinimumLevel(zone_id); } uint8 Perl__GetZoneMinimumLevel(uint32 zone_id, int version) { - return zone_store.GetZoneMinimumLevel(zone_id, version); + return ZoneStore::Instance()->GetZoneMinimumLevel(zone_id, version); } uint8 Perl__GetZoneMaximumLevel(uint32 zone_id) { - return zone_store.GetZoneMaximumLevel(zone_id); + return ZoneStore::Instance()->GetZoneMaximumLevel(zone_id); } uint8 Perl__GetZoneMaximumLevel(uint32 zone_id, int version) { - return zone_store.GetZoneMaximumLevel(zone_id, version); + return ZoneStore::Instance()->GetZoneMaximumLevel(zone_id, version); } uint8 Perl__GetZoneMinimumStatus(uint32 zone_id) { - return zone_store.GetZoneMinimumStatus(zone_id); + return ZoneStore::Instance()->GetZoneMinimumStatus(zone_id); } uint8 Perl__GetZoneMinimumStatus(uint32 zone_id, int version) { - return zone_store.GetZoneMinimumStatus(zone_id, version); + return ZoneStore::Instance()->GetZoneMinimumStatus(zone_id, version); } int Perl__GetZoneTimeZone(uint32 zone_id) { - return zone_store.GetZoneTimeZone(zone_id); + return ZoneStore::Instance()->GetZoneTimeZone(zone_id); } int Perl__GetZoneTimeZone(uint32 zone_id, int version) { - return zone_store.GetZoneTimeZone(zone_id, version); + return ZoneStore::Instance()->GetZoneTimeZone(zone_id, version); } int Perl__GetZoneMaximumPlayers(uint32 zone_id) { - return zone_store.GetZoneMaximumPlayers(zone_id); + return ZoneStore::Instance()->GetZoneMaximumPlayers(zone_id); } int Perl__GetZoneMaximumPlayers(uint32 zone_id, int version) { - return zone_store.GetZoneMaximumPlayers(zone_id, version); + return ZoneStore::Instance()->GetZoneMaximumPlayers(zone_id, version); } uint32 Perl__GetZoneRuleSet(uint32 zone_id) { - return zone_store.GetZoneRuleSet(zone_id); + return ZoneStore::Instance()->GetZoneRuleSet(zone_id); } uint32 Perl__GetZoneRuleSet(uint32 zone_id, int version) { - return zone_store.GetZoneRuleSet(zone_id, version); + return ZoneStore::Instance()->GetZoneRuleSet(zone_id, version); } std::string Perl__GetZoneNote(uint32 zone_id) { - return zone_store.GetZoneNote(zone_id); + return ZoneStore::Instance()->GetZoneNote(zone_id); } std::string Perl__GetZoneNote(uint32 zone_id, int version) { - return zone_store.GetZoneNote(zone_id, version); + return ZoneStore::Instance()->GetZoneNote(zone_id, version); } float Perl__GetZoneUnderworld(uint32 zone_id) { - return zone_store.GetZoneUnderworld(zone_id); + return ZoneStore::Instance()->GetZoneUnderworld(zone_id); } float Perl__GetZoneUnderworld(uint32 zone_id, int version) { - return zone_store.GetZoneUnderworld(zone_id, version); + return ZoneStore::Instance()->GetZoneUnderworld(zone_id, version); } float Perl__GetZoneMinimumClip(uint32 zone_id) { - return zone_store.GetZoneMinimumClip(zone_id); + return ZoneStore::Instance()->GetZoneMinimumClip(zone_id); } float Perl__GetZoneMinimumClip(uint32 zone_id, int version) { - return zone_store.GetZoneMinimumClip(zone_id, version); + return ZoneStore::Instance()->GetZoneMinimumClip(zone_id, version); } float Perl__GetZoneMaximumClip(uint32 zone_id) { - return zone_store.GetZoneMaximumClip(zone_id); + return ZoneStore::Instance()->GetZoneMaximumClip(zone_id); } float Perl__GetZoneMaximumClip(uint32 zone_id, int version) { - return zone_store.GetZoneMaximumClip(zone_id, version); + return ZoneStore::Instance()->GetZoneMaximumClip(zone_id, version); } float Perl__GetZoneFogMinimumClip(uint32 zone_id) { - return zone_store.GetZoneFogMinimumClip(zone_id); + return ZoneStore::Instance()->GetZoneFogMinimumClip(zone_id); } float Perl__GetZoneFogMinimumClip(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneFogMinimumClip(zone_id, slot); + return ZoneStore::Instance()->GetZoneFogMinimumClip(zone_id, slot); } float Perl__GetZoneFogMinimumClip(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneFogMinimumClip(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneFogMinimumClip(zone_id, slot, version); } float Perl__GetZoneFogMaximumClip(uint32 zone_id) { - return zone_store.GetZoneFogMaximumClip(zone_id); + return ZoneStore::Instance()->GetZoneFogMaximumClip(zone_id); } float Perl__GetZoneFogMaximumClip(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneFogMaximumClip(zone_id, slot); + return ZoneStore::Instance()->GetZoneFogMaximumClip(zone_id, slot); } float Perl__GetZoneFogMaximumClip(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneFogMaximumClip(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneFogMaximumClip(zone_id, slot, version); } uint8 Perl__GetZoneFogRed(uint32 zone_id) { - return zone_store.GetZoneFogRed(zone_id); + return ZoneStore::Instance()->GetZoneFogRed(zone_id); } uint8 Perl__GetZoneFogRed(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneFogRed(zone_id, slot); + return ZoneStore::Instance()->GetZoneFogRed(zone_id, slot); } uint8 Perl__GetZoneFogRed(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneFogRed(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneFogRed(zone_id, slot, version); } uint8 Perl__GetZoneFogGreen(uint32 zone_id) { - return zone_store.GetZoneFogGreen(zone_id); + return ZoneStore::Instance()->GetZoneFogGreen(zone_id); } uint8 Perl__GetZoneFogGreen(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneFogGreen(zone_id, slot); + return ZoneStore::Instance()->GetZoneFogGreen(zone_id, slot); } uint8 Perl__GetZoneFogGreen(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneFogGreen(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneFogGreen(zone_id, slot, version); } uint8 Perl__GetZoneFogBlue(uint32 zone_id) { - return zone_store.GetZoneFogBlue(zone_id); + return ZoneStore::Instance()->GetZoneFogBlue(zone_id); } uint8 Perl__GetZoneFogBlue(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneFogBlue(zone_id, slot); + return ZoneStore::Instance()->GetZoneFogBlue(zone_id, slot); } uint8 Perl__GetZoneFogBlue(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneFogBlue(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneFogBlue(zone_id, slot, version); } uint8 Perl__GetZoneSky(uint32 zone_id) { - return zone_store.GetZoneSky(zone_id); + return ZoneStore::Instance()->GetZoneSky(zone_id); } uint8 Perl__GetZoneSky(uint32 zone_id, int version) { - return zone_store.GetZoneSky(zone_id, version); + return ZoneStore::Instance()->GetZoneSky(zone_id, version); } uint8 Perl__GetZoneZType(uint32 zone_id) { - return zone_store.GetZoneZType(zone_id); + return ZoneStore::Instance()->GetZoneZType(zone_id); } uint8 Perl__GetZoneZType(uint32 zone_id, int version) { - return zone_store.GetZoneZType(zone_id, version); + return ZoneStore::Instance()->GetZoneZType(zone_id, version); } float Perl__GetZoneExperienceMultiplier(uint32 zone_id) { - return zone_store.GetZoneExperienceMultiplier(zone_id); + return ZoneStore::Instance()->GetZoneExperienceMultiplier(zone_id); } float Perl__GetZoneExperienceMultiplier(uint32 zone_id, int version) { - return zone_store.GetZoneExperienceMultiplier(zone_id, version); + return ZoneStore::Instance()->GetZoneExperienceMultiplier(zone_id, version); } float Perl__GetZoneWalkSpeed(uint32 zone_id) { - return zone_store.GetZoneWalkSpeed(zone_id); + return ZoneStore::Instance()->GetZoneWalkSpeed(zone_id); } float Perl__GetZoneWalkSpeed(uint32 zone_id, int version) { - return zone_store.GetZoneWalkSpeed(zone_id, version); + return ZoneStore::Instance()->GetZoneWalkSpeed(zone_id, version); } uint8 Perl__GetZoneTimeType(uint32 zone_id) { - return zone_store.GetZoneTimeType(zone_id); + return ZoneStore::Instance()->GetZoneTimeType(zone_id); } uint8 Perl__GetZoneTimeType(uint32 zone_id, int version) { - return zone_store.GetZoneTimeType(zone_id, version); + return ZoneStore::Instance()->GetZoneTimeType(zone_id, version); } float Perl__GetZoneFogDensity(uint32 zone_id) { - return zone_store.GetZoneFogDensity(zone_id); + return ZoneStore::Instance()->GetZoneFogDensity(zone_id); } float Perl__GetZoneFogDensity(uint32 zone_id, int version) { - return zone_store.GetZoneFogDensity(zone_id, version); + return ZoneStore::Instance()->GetZoneFogDensity(zone_id, version); } std::string Perl__GetZoneFlagNeeded(uint32 zone_id) { - return zone_store.GetZoneFlagNeeded(zone_id); + return ZoneStore::Instance()->GetZoneFlagNeeded(zone_id); } std::string Perl__GetZoneFlagNeeded(uint32 zone_id, int version) { - return zone_store.GetZoneFlagNeeded(zone_id, version); + return ZoneStore::Instance()->GetZoneFlagNeeded(zone_id, version); } int8 Perl__GetZoneCanBind(uint32 zone_id) { - return zone_store.GetZoneCanBind(zone_id); + return ZoneStore::Instance()->GetZoneCanBind(zone_id); } int8 Perl__GetZoneCanBind(uint32 zone_id, int version) { - return zone_store.GetZoneCanBind(zone_id, version); + return ZoneStore::Instance()->GetZoneCanBind(zone_id, version); } int8 Perl__GetZoneCanCombat(uint32 zone_id) { - return zone_store.GetZoneCanCombat(zone_id); + return ZoneStore::Instance()->GetZoneCanCombat(zone_id); } int8 Perl__GetZoneCanCombat(uint32 zone_id, int version) { - return zone_store.GetZoneCanCombat(zone_id, version); + return ZoneStore::Instance()->GetZoneCanCombat(zone_id, version); } int8 Perl__GetZoneCanLevitate(uint32 zone_id) { - return zone_store.GetZoneCanLevitate(zone_id); + return ZoneStore::Instance()->GetZoneCanLevitate(zone_id); } int8 Perl__GetZoneCanLevitate(uint32 zone_id, int version) { - return zone_store.GetZoneCanLevitate(zone_id, version); + return ZoneStore::Instance()->GetZoneCanLevitate(zone_id, version); } int8 Perl__GetZoneCastOutdoor(uint32 zone_id) { - return zone_store.GetZoneCastOutdoor(zone_id); + return ZoneStore::Instance()->GetZoneCastOutdoor(zone_id); } int8 Perl__GetZoneCastOutdoor(uint32 zone_id, int version) { - return zone_store.GetZoneCastOutdoor(zone_id, version); + return ZoneStore::Instance()->GetZoneCastOutdoor(zone_id, version); } uint8 Perl__GetZoneHotzone(uint32 zone_id) { - return zone_store.GetZoneHotzone(zone_id); + return ZoneStore::Instance()->GetZoneHotzone(zone_id); } uint8 Perl__GetZoneHotzone(uint32 zone_id, int version) { - return zone_store.GetZoneHotzone(zone_id, version); + return ZoneStore::Instance()->GetZoneHotzone(zone_id, version); } uint8 Perl__GetZoneInstanceType(uint32 zone_id) { - return zone_store.GetZoneInstanceType(zone_id); + return ZoneStore::Instance()->GetZoneInstanceType(zone_id); } uint8 Perl__GetZoneInstanceType(uint32 zone_id, int version) { - return zone_store.GetZoneInstanceType(zone_id, version); + return ZoneStore::Instance()->GetZoneInstanceType(zone_id, version); } uint64 Perl__GetZoneShutdownDelay(uint32 zone_id) { - return zone_store.GetZoneShutdownDelay(zone_id); + return ZoneStore::Instance()->GetZoneShutdownDelay(zone_id); } uint64 Perl__GetZoneShutdownDelay(uint32 zone_id, int version) { - return zone_store.GetZoneShutdownDelay(zone_id, version); + return ZoneStore::Instance()->GetZoneShutdownDelay(zone_id, version); } int8 Perl__GetZonePEQZone(uint32 zone_id) { - return zone_store.GetZonePEQZone(zone_id); + return ZoneStore::Instance()->GetZonePEQZone(zone_id); } int8 Perl__GetZonePEQZone(uint32 zone_id, int version) { - return zone_store.GetZonePEQZone(zone_id, version); + return ZoneStore::Instance()->GetZonePEQZone(zone_id, version); } int8 Perl__GetZoneExpansion(uint32 zone_id) { - return zone_store.GetZoneExpansion(zone_id); + return ZoneStore::Instance()->GetZoneExpansion(zone_id); } int8 Perl__GetZoneExpansion(uint32 zone_id, int version) { - return zone_store.GetZoneExpansion(zone_id, version); + return ZoneStore::Instance()->GetZoneExpansion(zone_id, version); } int8 Perl__GetZoneBypassExpansionCheck(uint32 zone_id) { - return zone_store.GetZoneBypassExpansionCheck(zone_id); + return ZoneStore::Instance()->GetZoneBypassExpansionCheck(zone_id); } int8 Perl__GetZoneBypassExpansionCheck(uint32 zone_id, int version) { - return zone_store.GetZoneBypassExpansionCheck(zone_id, version); + return ZoneStore::Instance()->GetZoneBypassExpansionCheck(zone_id, version); } uint8 Perl__GetZoneSuspendBuffs(uint32 zone_id) { - return zone_store.GetZoneSuspendBuffs(zone_id); + return ZoneStore::Instance()->GetZoneSuspendBuffs(zone_id); } uint8 Perl__GetZoneSuspendBuffs(uint32 zone_id, int version) { - return zone_store.GetZoneSuspendBuffs(zone_id, version); + return ZoneStore::Instance()->GetZoneSuspendBuffs(zone_id, version); } int Perl__GetZoneRainChance(uint32 zone_id) { - return zone_store.GetZoneRainChance(zone_id); + return ZoneStore::Instance()->GetZoneRainChance(zone_id); } int Perl__GetZoneRainChance(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneRainChance(zone_id, slot); + return ZoneStore::Instance()->GetZoneRainChance(zone_id, slot); } int Perl__GetZoneRainChance(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneRainChance(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneRainChance(zone_id, slot, version); } int Perl__GetZoneRainDuration(uint32 zone_id) { - return zone_store.GetZoneRainDuration(zone_id); + return ZoneStore::Instance()->GetZoneRainDuration(zone_id); } int Perl__GetZoneRainDuration(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneRainDuration(zone_id, slot); + return ZoneStore::Instance()->GetZoneRainDuration(zone_id, slot); } int Perl__GetZoneRainDuration(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneRainDuration(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneRainDuration(zone_id, slot, version); } int Perl__GetZoneSnowChance(uint32 zone_id) { - return zone_store.GetZoneSnowChance(zone_id); + return ZoneStore::Instance()->GetZoneSnowChance(zone_id); } int Perl__GetZoneSnowChance(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneSnowChance(zone_id, slot); + return ZoneStore::Instance()->GetZoneSnowChance(zone_id, slot); } int Perl__GetZoneSnowChance(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneSnowChance(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneSnowChance(zone_id, slot, version); } int Perl__GetZoneSnowDuration(uint32 zone_id) { - return zone_store.GetZoneSnowDuration(zone_id); + return ZoneStore::Instance()->GetZoneSnowDuration(zone_id); } int Perl__GetZoneSnowDuration(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneSnowDuration(zone_id, slot); + return ZoneStore::Instance()->GetZoneSnowDuration(zone_id, slot); } int Perl__GetZoneSnowDuration(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneSnowDuration(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneSnowDuration(zone_id, slot, version); } float Perl__GetZoneGravity(uint32 zone_id) { - return zone_store.GetZoneGravity(zone_id); + return ZoneStore::Instance()->GetZoneGravity(zone_id); } float Perl__GetZoneGravity(uint32 zone_id, int version) { - return zone_store.GetZoneGravity(zone_id, version); + return ZoneStore::Instance()->GetZoneGravity(zone_id, version); } int Perl__GetZoneType(uint32 zone_id) { - return zone_store.GetZoneType(zone_id); + return ZoneStore::Instance()->GetZoneType(zone_id); } int Perl__GetZoneType(uint32 zone_id, int version) { - return zone_store.GetZoneType(zone_id, version); + return ZoneStore::Instance()->GetZoneType(zone_id, version); } int8 Perl__GetZoneSkyLock(uint32 zone_id) { - return zone_store.GetZoneSkyLock(zone_id); + return ZoneStore::Instance()->GetZoneSkyLock(zone_id); } int8 Perl__GetZoneSkyLock(uint32 zone_id, int version) { - return zone_store.GetZoneSkyLock(zone_id, version); + return ZoneStore::Instance()->GetZoneSkyLock(zone_id, version); } int Perl__GetZoneFastRegenHP(uint32 zone_id) { - return zone_store.GetZoneFastRegenHP(zone_id); + return ZoneStore::Instance()->GetZoneFastRegenHP(zone_id); } int Perl__GetZoneFastRegenHP(uint32 zone_id, int version) { - return zone_store.GetZoneFastRegenHP(zone_id, version); + return ZoneStore::Instance()->GetZoneFastRegenHP(zone_id, version); } int Perl__GetZoneFastRegenMana(uint32 zone_id) { - return zone_store.GetZoneFastRegenMana(zone_id); + return ZoneStore::Instance()->GetZoneFastRegenMana(zone_id); } int Perl__GetZoneFastRegenMana(uint32 zone_id, int version) { - return zone_store.GetZoneFastRegenMana(zone_id, version); + return ZoneStore::Instance()->GetZoneFastRegenMana(zone_id, version); } int Perl__GetZoneFastRegenEndurance(uint32 zone_id) { - return zone_store.GetZoneFastRegenEndurance(zone_id); + return ZoneStore::Instance()->GetZoneFastRegenEndurance(zone_id); } int Perl__GetZoneFastRegenEndurance(uint32 zone_id, int version) { - return zone_store.GetZoneFastRegenEndurance(zone_id, version); + return ZoneStore::Instance()->GetZoneFastRegenEndurance(zone_id, version); } int Perl__GetZoneNPCMaximumAggroDistance(uint32 zone_id) { - return zone_store.GetZoneNPCMaximumAggroDistance(zone_id); + return ZoneStore::Instance()->GetZoneNPCMaximumAggroDistance(zone_id); } int Perl__GetZoneNPCMaximumAggroDistance(uint32 zone_id, int version) { - return zone_store.GetZoneNPCMaximumAggroDistance(zone_id, version); + return ZoneStore::Instance()->GetZoneNPCMaximumAggroDistance(zone_id, version); } int8 Perl__GetZoneMinimumExpansion(uint32 zone_id) { - return zone_store.GetZoneMinimumExpansion(zone_id); + return ZoneStore::Instance()->GetZoneMinimumExpansion(zone_id); } int8 Perl__GetZoneMinimumExpansion(uint32 zone_id, int version) { - return zone_store.GetZoneMinimumExpansion(zone_id, version); + return ZoneStore::Instance()->GetZoneMinimumExpansion(zone_id, version); } int8 Perl__GetZoneMaximumExpansion(uint32 zone_id) { - return zone_store.GetZoneMaximumExpansion(zone_id); + return ZoneStore::Instance()->GetZoneMaximumExpansion(zone_id); } int8 Perl__GetZoneMaximumExpansion(uint32 zone_id, int version) { - return zone_store.GetZoneMaximumExpansion(zone_id, version); + return ZoneStore::Instance()->GetZoneMaximumExpansion(zone_id, version); } std::string Perl__GetZoneContentFlags(uint32 zone_id) { - return zone_store.GetZoneContentFlags(zone_id); + return ZoneStore::Instance()->GetZoneContentFlags(zone_id); } std::string Perl__GetZoneContentFlags(uint32 zone_id, int version) { - return zone_store.GetZoneContentFlags(zone_id, version); + return ZoneStore::Instance()->GetZoneContentFlags(zone_id, version); } std::string Perl__GetZoneContentFlagsDisabled(uint32 zone_id) { - return zone_store.GetZoneContentFlagsDisabled(zone_id); + return ZoneStore::Instance()->GetZoneContentFlagsDisabled(zone_id); } std::string Perl__GetZoneContentFlagsDisabled(uint32 zone_id, int version) { - return zone_store.GetZoneContentFlagsDisabled(zone_id, version); + return ZoneStore::Instance()->GetZoneContentFlagsDisabled(zone_id, version); } int Perl__GetZoneUnderworldTeleportIndex(uint32 zone_id) { - return zone_store.GetZoneUnderworldTeleportIndex(zone_id); + return ZoneStore::Instance()->GetZoneUnderworldTeleportIndex(zone_id); } int Perl__GetZoneUnderworldTeleportIndex(uint32 zone_id, int version) { - return zone_store.GetZoneUnderworldTeleportIndex(zone_id, version); + return ZoneStore::Instance()->GetZoneUnderworldTeleportIndex(zone_id, version); } int Perl__GetZoneLavaDamage(uint32 zone_id) { - return zone_store.GetZoneLavaDamage(zone_id); + return ZoneStore::Instance()->GetZoneLavaDamage(zone_id); } int Perl__GetZoneLavaDamage(uint32 zone_id, int version) { - return zone_store.GetZoneLavaDamage(zone_id, version); + return ZoneStore::Instance()->GetZoneLavaDamage(zone_id, version); } int Perl__GetZoneMinimumLavaDamage(uint32 zone_id) { - return zone_store.GetZoneMinimumLavaDamage(zone_id); + return ZoneStore::Instance()->GetZoneMinimumLavaDamage(zone_id); } int Perl__GetZoneMinimumLavaDamage(uint32 zone_id, int version) { - return zone_store.GetZoneMinimumLavaDamage(zone_id, version); + return ZoneStore::Instance()->GetZoneMinimumLavaDamage(zone_id, version); } uint8 Perl__GetZoneIdleWhenEmpty(uint32 zone_id) { - return zone_store.GetZoneIdleWhenEmpty(zone_id); + return ZoneStore::Instance()->GetZoneIdleWhenEmpty(zone_id); } uint8 Perl__GetZoneIdleWhenEmpty(uint32 zone_id, int version) { - return zone_store.GetZoneIdleWhenEmpty(zone_id, version); + return ZoneStore::Instance()->GetZoneIdleWhenEmpty(zone_id, version); } uint32 Perl__GetZoneSecondsBeforeIdle(uint32 zone_id) { - return zone_store.GetZoneSecondsBeforeIdle(zone_id); + return ZoneStore::Instance()->GetZoneSecondsBeforeIdle(zone_id); } uint32 Perl__GetZoneSecondsBeforeIdle(uint32 zone_id, int version) { - return zone_store.GetZoneSecondsBeforeIdle(zone_id, version); + return ZoneStore::Instance()->GetZoneSecondsBeforeIdle(zone_id, version); } void Perl__send_channel_message(uint8 channel_number, uint32 guild_id, uint8 language_id, uint8 language_skill, const char* message) @@ -5860,12 +5860,12 @@ bool Perl__SetAutoLoginCharacterNameByAccountID(uint32 account_id, std::string c uint32 Perl__GetZoneIDByLongName(std::string zone_long_name) { - return zone_store.GetZoneIDByLongName(zone_long_name); + return ZoneStore::Instance()->GetZoneIDByLongName(zone_long_name); } std::string Perl__GetZoneShortNameByLongName(std::string zone_long_name) { - return zone_store.GetZoneShortNameByLongName(zone_long_name); + return ZoneStore::Instance()->GetZoneShortNameByLongName(zone_long_name); } bool Perl__send_parcel(perl::reference table_ref) diff --git a/zone/gm_commands/set/zone.cpp b/zone/gm_commands/set/zone.cpp index e1bf852ea..0ff3c24cb 100755 --- a/zone/gm_commands/set/zone.cpp +++ b/zone/gm_commands/set/zone.cpp @@ -273,7 +273,7 @@ void SetZoneData(Client *c, const Seperator *sep) entity_list.QueueClients(c, outapp); safe_delete(outapp); - zone_store.LoadZones(content_db); + ZoneStore::Instance()->LoadZones(content_db); c->Message( Chat::White, diff --git a/zone/gm_commands/zone.cpp b/zone/gm_commands/zone.cpp index 99317e232..46caf373f 100644 --- a/zone/gm_commands/zone.cpp +++ b/zone/gm_commands/zone.cpp @@ -26,7 +26,7 @@ void command_zone(Client *c, const Seperator *sep) } else { // validate - if (!zone_store.GetZone(zone_input)) { + if (!ZoneStore::Instance()->GetZone(zone_input)) { c->Message(Chat::White, fmt::format("Could not find zone by short_name [{}]", zone_input).c_str()); return; } diff --git a/zone/gm_commands/zone_shard.cpp b/zone/gm_commands/zone_shard.cpp index 07ef0541e..9e468ba7d 100644 --- a/zone/gm_commands/zone_shard.cpp +++ b/zone/gm_commands/zone_shard.cpp @@ -31,7 +31,7 @@ void command_zone_shard(Client *c, const Seperator *sep) } else { // validate - if (!zone_store.GetZone(zone_input)) { + if (!ZoneStore::Instance()->GetZone(zone_input)) { c->Message(Chat::White, fmt::format("Could not find zone by short_name [{}]", zone_input).c_str()); return; } diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index c7a631a68..90c0c33be 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -4157,607 +4157,607 @@ void lua_send_player_handin_event() float lua_get_zone_safe_x(uint32 zone_id) { - return zone_store.GetZoneSafeCoordinates(zone_id).x; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id).x; } float lua_get_zone_safe_x(uint32 zone_id, int version) { - return zone_store.GetZoneSafeCoordinates(zone_id, version).x; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id, version).x; } float lua_get_zone_safe_y(uint32 zone_id) { - return zone_store.GetZoneSafeCoordinates(zone_id).y; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id).y; } float lua_get_zone_safe_y(uint32 zone_id, int version) { - return zone_store.GetZoneSafeCoordinates(zone_id, version).y; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id, version).y; } float lua_get_zone_safe_z(uint32 zone_id) { - return zone_store.GetZoneSafeCoordinates(zone_id).z; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id).z; } float lua_get_zone_safe_z(uint32 zone_id, int version) { - return zone_store.GetZoneSafeCoordinates(zone_id, version).z; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id, version).z; } float lua_get_zone_safe_heading(uint32 zone_id) { - return zone_store.GetZoneSafeCoordinates(zone_id).w; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id).w; } float lua_get_zone_safe_heading(uint32 zone_id, int version) { - return zone_store.GetZoneSafeCoordinates(zone_id, version).w; + return ZoneStore::Instance()->GetZoneSafeCoordinates(zone_id, version).w; } float lua_get_zone_graveyard_id(uint32 zone_id) { - return zone_store.GetZoneGraveyardID(zone_id); + return ZoneStore::Instance()->GetZoneGraveyardID(zone_id); } float lua_get_zone_graveyard_id(uint32 zone_id, int version) { - return zone_store.GetZoneGraveyardID(zone_id, version); + return ZoneStore::Instance()->GetZoneGraveyardID(zone_id, version); } uint8 lua_get_zone_minimum_level(uint32 zone_id) { - return zone_store.GetZoneMinimumLevel(zone_id); + return ZoneStore::Instance()->GetZoneMinimumLevel(zone_id); } uint8 lua_get_zone_minimum_level(uint32 zone_id, int version) { - return zone_store.GetZoneMinimumLevel(zone_id, version); + return ZoneStore::Instance()->GetZoneMinimumLevel(zone_id, version); } uint8 lua_get_zone_maximum_level(uint32 zone_id) { - return zone_store.GetZoneMaximumLevel(zone_id); + return ZoneStore::Instance()->GetZoneMaximumLevel(zone_id); } uint8 lua_get_zone_maximum_level(uint32 zone_id, int version) { - return zone_store.GetZoneMaximumLevel(zone_id, version); + return ZoneStore::Instance()->GetZoneMaximumLevel(zone_id, version); } uint8 lua_get_zone_minimum_status(uint32 zone_id) { - return zone_store.GetZoneMinimumStatus(zone_id); + return ZoneStore::Instance()->GetZoneMinimumStatus(zone_id); } uint8 lua_get_zone_minimum_status(uint32 zone_id, int version) { - return zone_store.GetZoneMinimumStatus(zone_id, version); + return ZoneStore::Instance()->GetZoneMinimumStatus(zone_id, version); } int lua_get_zone_time_zone(uint32 zone_id) { - return zone_store.GetZoneTimeZone(zone_id); + return ZoneStore::Instance()->GetZoneTimeZone(zone_id); } int lua_get_zone_time_zone(uint32 zone_id, int version) { - return zone_store.GetZoneTimeZone(zone_id, version); + return ZoneStore::Instance()->GetZoneTimeZone(zone_id, version); } int lua_get_zone_maximum_players(uint32 zone_id) { - return zone_store.GetZoneMaximumPlayers(zone_id); + return ZoneStore::Instance()->GetZoneMaximumPlayers(zone_id); } int lua_get_zone_maximum_players(uint32 zone_id, int version) { - return zone_store.GetZoneMaximumPlayers(zone_id, version); + return ZoneStore::Instance()->GetZoneMaximumPlayers(zone_id, version); } uint32 lua_get_zone_rule_set(uint32 zone_id) { - return zone_store.GetZoneRuleSet(zone_id); + return ZoneStore::Instance()->GetZoneRuleSet(zone_id); } uint32 lua_get_zone_rule_set(uint32 zone_id, int version) { - return zone_store.GetZoneRuleSet(zone_id, version); + return ZoneStore::Instance()->GetZoneRuleSet(zone_id, version); } std::string lua_get_zone_note(uint32 zone_id) { - return zone_store.GetZoneNote(zone_id); + return ZoneStore::Instance()->GetZoneNote(zone_id); } std::string lua_get_zone_note(uint32 zone_id, int version) { - return zone_store.GetZoneNote(zone_id, version); + return ZoneStore::Instance()->GetZoneNote(zone_id, version); } float lua_get_zone_underworld(uint32 zone_id) { - return zone_store.GetZoneUnderworld(zone_id); + return ZoneStore::Instance()->GetZoneUnderworld(zone_id); } float lua_get_zone_underworld(uint32 zone_id, int version) { - return zone_store.GetZoneUnderworld(zone_id, version); + return ZoneStore::Instance()->GetZoneUnderworld(zone_id, version); } float lua_get_zone_minimum_clip(uint32 zone_id) { - return zone_store.GetZoneMinimumClip(zone_id); + return ZoneStore::Instance()->GetZoneMinimumClip(zone_id); } float lua_get_zone_minimum_clip(uint32 zone_id, int version) { - return zone_store.GetZoneMinimumClip(zone_id, version); + return ZoneStore::Instance()->GetZoneMinimumClip(zone_id, version); } float lua_get_zone_maximum_clip(uint32 zone_id) { - return zone_store.GetZoneMaximumClip(zone_id); + return ZoneStore::Instance()->GetZoneMaximumClip(zone_id); } float lua_get_zone_maximum_clip(uint32 zone_id, int version) { - return zone_store.GetZoneMaximumClip(zone_id, version); + return ZoneStore::Instance()->GetZoneMaximumClip(zone_id, version); } float lua_get_zone_fog_minimum_clip(uint32 zone_id) { - return zone_store.GetZoneFogMinimumClip(zone_id); + return ZoneStore::Instance()->GetZoneFogMinimumClip(zone_id); } float lua_get_zone_fog_minimum_clip(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneFogMinimumClip(zone_id, slot); + return ZoneStore::Instance()->GetZoneFogMinimumClip(zone_id, slot); } float lua_get_zone_fog_minimum_clip(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneFogMinimumClip(zone_id, slot); + return ZoneStore::Instance()->GetZoneFogMinimumClip(zone_id, slot); } float lua_get_zone_fog_maximum_clip(uint32 zone_id) { - return zone_store.GetZoneFogMaximumClip(zone_id); + return ZoneStore::Instance()->GetZoneFogMaximumClip(zone_id); } float lua_get_zone_fog_maximum_clip(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneFogMaximumClip(zone_id, slot); + return ZoneStore::Instance()->GetZoneFogMaximumClip(zone_id, slot); } float lua_get_zone_fog_maximum_clip(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneFogMaximumClip(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneFogMaximumClip(zone_id, slot, version); } uint8 lua_get_zone_fog_red(uint32 zone_id) { - return zone_store.GetZoneFogRed(zone_id); + return ZoneStore::Instance()->GetZoneFogRed(zone_id); } uint8 lua_get_zone_fog_red(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneFogRed(zone_id, slot); + return ZoneStore::Instance()->GetZoneFogRed(zone_id, slot); } uint8 lua_get_zone_fog_red(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneFogRed(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneFogRed(zone_id, slot, version); } uint8 lua_get_zone_fog_green(uint32 zone_id) { - return zone_store.GetZoneFogGreen(zone_id); + return ZoneStore::Instance()->GetZoneFogGreen(zone_id); } uint8 lua_get_zone_fog_green(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneFogGreen(zone_id, slot); + return ZoneStore::Instance()->GetZoneFogGreen(zone_id, slot); } uint8 lua_get_zone_fog_green(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneFogGreen(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneFogGreen(zone_id, slot, version); } uint8 lua_get_zone_fog_blue(uint32 zone_id) { - return zone_store.GetZoneFogBlue(zone_id); + return ZoneStore::Instance()->GetZoneFogBlue(zone_id); } uint8 lua_get_zone_fog_blue(uint32 zone_id, uint8 slot) { - return zone_store.GetZoneFogBlue(zone_id, slot); + return ZoneStore::Instance()->GetZoneFogBlue(zone_id, slot); } uint8 lua_get_zone_fog_blue(uint32 zone_id, uint8 slot, int version) { - return zone_store.GetZoneFogBlue(zone_id, slot, version); + return ZoneStore::Instance()->GetZoneFogBlue(zone_id, slot, version); } uint8 lua_get_zone_sky(uint32 zone_id) { - return zone_store.GetZoneSky(zone_id); + return ZoneStore::Instance()->GetZoneSky(zone_id); } uint8 lua_get_zone_sky(uint32 zone_id, int version) { - return zone_store.GetZoneSky(zone_id, version); + return ZoneStore::Instance()->GetZoneSky(zone_id, version); } uint8 lua_get_zone_ztype(uint32 zone_id) { - return zone_store.GetZoneZType(zone_id); + return ZoneStore::Instance()->GetZoneZType(zone_id); } uint8 lua_get_zone_ztype(uint32 zone_id, int version) { - return zone_store.GetZoneZType(zone_id, version); + return ZoneStore::Instance()->GetZoneZType(zone_id, version); } float lua_get_zone_experience_multiplier(uint32 zone_id) { - return zone_store.GetZoneExperienceMultiplier(zone_id); + return ZoneStore::Instance()->GetZoneExperienceMultiplier(zone_id); } float lua_get_zone_experience_multiplier(uint32 zone_id, int version) { - return zone_store.GetZoneExperienceMultiplier(zone_id, version); + return ZoneStore::Instance()->GetZoneExperienceMultiplier(zone_id, version); } float lua_get_zone_walk_speed(uint32 zone_id) { - return zone_store.GetZoneWalkSpeed(zone_id); + return ZoneStore::Instance()->GetZoneWalkSpeed(zone_id); } float lua_get_zone_walk_speed(uint32 zone_id, int version) { - return zone_store.GetZoneWalkSpeed(zone_id, version); + return ZoneStore::Instance()->GetZoneWalkSpeed(zone_id, version); } uint8 lua_get_zone_time_type(uint32 zone_id) { - return zone_store.GetZoneTimeType(zone_id); + return ZoneStore::Instance()->GetZoneTimeType(zone_id); } uint8 lua_get_zone_time_type(uint32 zone_id, int version) { - return zone_store.GetZoneTimeType(zone_id, version); + return ZoneStore::Instance()->GetZoneTimeType(zone_id, version); } float lua_get_zone_fog_density(uint32 zone_id) { - return zone_store.GetZoneFogDensity(zone_id); + return ZoneStore::Instance()->GetZoneFogDensity(zone_id); } float lua_get_zone_fog_density(uint32 zone_id, int version) { - return zone_store.GetZoneFogDensity(zone_id, version); + return ZoneStore::Instance()->GetZoneFogDensity(zone_id, version); } std::string lua_get_zone_flag_needed(uint32 zone_id) { - return zone_store.GetZoneFlagNeeded(zone_id); + return ZoneStore::Instance()->GetZoneFlagNeeded(zone_id); } std::string lua_get_zone_flag_needed(uint32 zone_id, int version) { - return zone_store.GetZoneFlagNeeded(zone_id, version); + return ZoneStore::Instance()->GetZoneFlagNeeded(zone_id, version); } int8 lua_get_zone_can_bind(uint32 zone_id) { - return zone_store.GetZoneCanBind(zone_id); + return ZoneStore::Instance()->GetZoneCanBind(zone_id); } int8 lua_get_zone_can_bind(uint32 zone_id, int version) { - return zone_store.GetZoneCanBind(zone_id, version); + return ZoneStore::Instance()->GetZoneCanBind(zone_id, version); } int8 lua_get_zone_can_combat(uint32 zone_id) { - return zone_store.GetZoneCanCombat(zone_id); + return ZoneStore::Instance()->GetZoneCanCombat(zone_id); } int8 lua_get_zone_can_combat(uint32 zone_id, int version) { - return zone_store.GetZoneCanCombat(zone_id, version); + return ZoneStore::Instance()->GetZoneCanCombat(zone_id, version); } int8 lua_get_zone_can_levitate(uint32 zone_id) { - return zone_store.GetZoneCanLevitate(zone_id); + return ZoneStore::Instance()->GetZoneCanLevitate(zone_id); } int8 lua_get_zone_can_levitate(uint32 zone_id, int version) { - return zone_store.GetZoneCanLevitate(zone_id, version); + return ZoneStore::Instance()->GetZoneCanLevitate(zone_id, version); } int8 lua_get_zone_cast_outdoor(uint32 zone_id) { - return zone_store.GetZoneCastOutdoor(zone_id); + return ZoneStore::Instance()->GetZoneCastOutdoor(zone_id); } int8 lua_get_zone_cast_outdoor(uint32 zone_id, int version) { - return zone_store.GetZoneCastOutdoor(zone_id, version); + return ZoneStore::Instance()->GetZoneCastOutdoor(zone_id, version); } uint8 lua_get_zone_hotzone(uint32 zone_id) { - return zone_store.GetZoneHotzone(zone_id); + return ZoneStore::Instance()->GetZoneHotzone(zone_id); } uint8 lua_get_zone_hotzone(uint32 zone_id, int version) { - return zone_store.GetZoneHotzone(zone_id, version); + return ZoneStore::Instance()->GetZoneHotzone(zone_id, version); } uint8 lua_get_zone_instance_type(uint32 zone_id) { - return zone_store.GetZoneInstanceType(zone_id); + return ZoneStore::Instance()->GetZoneInstanceType(zone_id); } uint8 lua_get_zone_instance_type(uint32 zone_id, int version) { - return zone_store.GetZoneInstanceType(zone_id, version); + return ZoneStore::Instance()->GetZoneInstanceType(zone_id, version); } uint64 lua_get_zone_shutdown_delay(uint32 zone_id) { - return zone_store.GetZoneShutdownDelay(zone_id); + return ZoneStore::Instance()->GetZoneShutdownDelay(zone_id); } uint64 lua_get_zone_shutdown_delay(uint32 zone_id, int version) { - return zone_store.GetZoneShutdownDelay(zone_id, version); + return ZoneStore::Instance()->GetZoneShutdownDelay(zone_id, version); } int8 lua_get_zone_peqzone(uint32 zone_id) { - return zone_store.GetZonePEQZone(zone_id); + return ZoneStore::Instance()->GetZonePEQZone(zone_id); } int8 lua_get_zone_peqzone(uint32 zone_id, int version) { - return zone_store.GetZonePEQZone(zone_id, version); + return ZoneStore::Instance()->GetZonePEQZone(zone_id, version); } int8 lua_get_zone_expansion(uint32 zone_id) { - return zone_store.GetZoneExpansion(zone_id); + return ZoneStore::Instance()->GetZoneExpansion(zone_id); } int8 lua_get_zone_expansion(uint32 zone_id, int version) { - return zone_store.GetZoneExpansion(zone_id, version); + return ZoneStore::Instance()->GetZoneExpansion(zone_id, version); } int8 lua_get_zone_bypass_expansion_check(uint32 zone_id) { - return zone_store.GetZoneBypassExpansionCheck(zone_id); + return ZoneStore::Instance()->GetZoneBypassExpansionCheck(zone_id); } int8 lua_get_zone_bypass_expansion_check(uint32 zone_id, int version) { - return zone_store.GetZoneBypassExpansionCheck(zone_id, version); + return ZoneStore::Instance()->GetZoneBypassExpansionCheck(zone_id, version); } int8 lua_get_zone_suspend_buffs(uint32 zone_id) { - return zone_store.GetZoneSuspendBuffs(zone_id); + return ZoneStore::Instance()->GetZoneSuspendBuffs(zone_id); } int8 lua_get_zone_suspend_buffs(uint32 zone_id, int version) { - return zone_store.GetZoneSuspendBuffs(zone_id, version); + return ZoneStore::Instance()->GetZoneSuspendBuffs(zone_id, version); } int lua_get_zone_rain_chance(uint32 zone_id) { - return zone_store.GetZoneRainChance(zone_id); + return ZoneStore::Instance()->GetZoneRainChance(zone_id); } int lua_get_zone_rain_chance(uint32 zone_id, int version) { - return zone_store.GetZoneRainChance(zone_id, version); + return ZoneStore::Instance()->GetZoneRainChance(zone_id, version); } int lua_get_zone_rain_duration(uint32 zone_id) { - return zone_store.GetZoneRainDuration(zone_id); + return ZoneStore::Instance()->GetZoneRainDuration(zone_id); } int lua_get_zone_rain_duration(uint32 zone_id, int version) { - return zone_store.GetZoneRainDuration(zone_id, version); + return ZoneStore::Instance()->GetZoneRainDuration(zone_id, version); } int lua_get_zone_snow_chance(uint32 zone_id) { - return zone_store.GetZoneSnowChance(zone_id); + return ZoneStore::Instance()->GetZoneSnowChance(zone_id); } int lua_get_zone_snow_chance(uint32 zone_id, int version) { - return zone_store.GetZoneSnowChance(zone_id, version); + return ZoneStore::Instance()->GetZoneSnowChance(zone_id, version); } int lua_get_zone_snow_duration(uint32 zone_id) { - return zone_store.GetZoneSnowDuration(zone_id); + return ZoneStore::Instance()->GetZoneSnowDuration(zone_id); } int lua_get_zone_snow_duration(uint32 zone_id, int version) { - return zone_store.GetZoneSnowDuration(zone_id, version); + return ZoneStore::Instance()->GetZoneSnowDuration(zone_id, version); } float lua_get_zone_gravity(uint32 zone_id) { - return zone_store.GetZoneGravity(zone_id); + return ZoneStore::Instance()->GetZoneGravity(zone_id); } float lua_get_zone_gravity(uint32 zone_id, int version) { - return zone_store.GetZoneGravity(zone_id, version); + return ZoneStore::Instance()->GetZoneGravity(zone_id, version); } int lua_get_zone_type(uint32 zone_id) { - return zone_store.GetZoneType(zone_id); + return ZoneStore::Instance()->GetZoneType(zone_id); } int lua_get_zone_type(uint32 zone_id, int version) { - return zone_store.GetZoneType(zone_id, version); + return ZoneStore::Instance()->GetZoneType(zone_id, version); } int lua_get_zone_sky_lock(uint32 zone_id) { - return zone_store.GetZoneSkyLock(zone_id); + return ZoneStore::Instance()->GetZoneSkyLock(zone_id); } int lua_get_zone_sky_lock(uint32 zone_id, int version) { - return zone_store.GetZoneSkyLock(zone_id, version); + return ZoneStore::Instance()->GetZoneSkyLock(zone_id, version); } int lua_get_zone_fast_regen_hp(uint32 zone_id) { - return zone_store.GetZoneFastRegenHP(zone_id); + return ZoneStore::Instance()->GetZoneFastRegenHP(zone_id); } int lua_get_zone_fast_regen_hp(uint32 zone_id, int version) { - return zone_store.GetZoneFastRegenHP(zone_id, version); + return ZoneStore::Instance()->GetZoneFastRegenHP(zone_id, version); } int lua_get_zone_fast_regen_mana(uint32 zone_id) { - return zone_store.GetZoneFastRegenMana(zone_id); + return ZoneStore::Instance()->GetZoneFastRegenMana(zone_id); } int lua_get_zone_fast_regen_mana(uint32 zone_id, int version) { - return zone_store.GetZoneFastRegenMana(zone_id, version); + return ZoneStore::Instance()->GetZoneFastRegenMana(zone_id, version); } int lua_get_zone_fast_regen_endurance(uint32 zone_id) { - return zone_store.GetZoneFastRegenEndurance(zone_id); + return ZoneStore::Instance()->GetZoneFastRegenEndurance(zone_id); } int lua_get_zone_fast_regen_endurance(uint32 zone_id, int version) { - return zone_store.GetZoneFastRegenEndurance(zone_id, version); + return ZoneStore::Instance()->GetZoneFastRegenEndurance(zone_id, version); } int lua_get_zone_npc_maximum_aggro_distance(uint32 zone_id) { - return zone_store.GetZoneNPCMaximumAggroDistance(zone_id); + return ZoneStore::Instance()->GetZoneNPCMaximumAggroDistance(zone_id); } int lua_get_zone_npc_maximum_aggro_distance(uint32 zone_id, int version) { - return zone_store.GetZoneNPCMaximumAggroDistance(zone_id, version); + return ZoneStore::Instance()->GetZoneNPCMaximumAggroDistance(zone_id, version); } int8 lua_get_zone_minimum_expansion(uint32 zone_id) { - return zone_store.GetZoneMinimumExpansion(zone_id); + return ZoneStore::Instance()->GetZoneMinimumExpansion(zone_id); } int8 lua_get_zone_minimum_expansion(uint32 zone_id, int version) { - return zone_store.GetZoneMinimumExpansion(zone_id, version); + return ZoneStore::Instance()->GetZoneMinimumExpansion(zone_id, version); } int8 lua_get_zone_maximum_expansion(uint32 zone_id) { - return zone_store.GetZoneMaximumExpansion(zone_id); + return ZoneStore::Instance()->GetZoneMaximumExpansion(zone_id); } int8 lua_get_zone_maximum_expansion(uint32 zone_id, int version) { - return zone_store.GetZoneMaximumExpansion(zone_id, version); + return ZoneStore::Instance()->GetZoneMaximumExpansion(zone_id, version); } std::string lua_get_zone_content_flags(uint32 zone_id) { - return zone_store.GetZoneContentFlags(zone_id); + return ZoneStore::Instance()->GetZoneContentFlags(zone_id); } std::string lua_get_zone_content_flags(uint32 zone_id, int version) { - return zone_store.GetZoneContentFlags(zone_id, version); + return ZoneStore::Instance()->GetZoneContentFlags(zone_id, version); } std::string lua_get_zone_content_flags_disabled(uint32 zone_id) { - return zone_store.GetZoneContentFlagsDisabled(zone_id); + return ZoneStore::Instance()->GetZoneContentFlagsDisabled(zone_id); } std::string lua_get_zone_content_flags_disabled(uint32 zone_id, int version) { - return zone_store.GetZoneContentFlagsDisabled(zone_id, version); + return ZoneStore::Instance()->GetZoneContentFlagsDisabled(zone_id, version); } int lua_get_zone_underworld_teleport_index(uint32 zone_id) { - return zone_store.GetZoneUnderworldTeleportIndex(zone_id); + return ZoneStore::Instance()->GetZoneUnderworldTeleportIndex(zone_id); } int lua_get_zone_underworld_teleport_index(uint32 zone_id, int version) { - return zone_store.GetZoneUnderworldTeleportIndex(zone_id, version); + return ZoneStore::Instance()->GetZoneUnderworldTeleportIndex(zone_id, version); } int lua_get_zone_lava_damage(uint32 zone_id) { - return zone_store.GetZoneLavaDamage(zone_id); + return ZoneStore::Instance()->GetZoneLavaDamage(zone_id); } int lua_get_zone_lava_damage(uint32 zone_id, int version) { - return zone_store.GetZoneLavaDamage(zone_id, version); + return ZoneStore::Instance()->GetZoneLavaDamage(zone_id, version); } int lua_get_zone_minimum_lava_damage(uint32 zone_id) { - return zone_store.GetZoneMinimumLavaDamage(zone_id); + return ZoneStore::Instance()->GetZoneMinimumLavaDamage(zone_id); } int lua_get_zone_minimum_lava_damage(uint32 zone_id, int version) { - return zone_store.GetZoneMinimumLavaDamage(zone_id, version); + return ZoneStore::Instance()->GetZoneMinimumLavaDamage(zone_id, version); } uint8 lua_get_zone_idle_when_empty(uint32 zone_id) { - return zone_store.GetZoneIdleWhenEmpty(zone_id); + return ZoneStore::Instance()->GetZoneIdleWhenEmpty(zone_id); } uint8 lua_get_zone_idle_when_empty(uint32 zone_id, int version) { - return zone_store.GetZoneIdleWhenEmpty(zone_id, version); + return ZoneStore::Instance()->GetZoneIdleWhenEmpty(zone_id, version); } uint32 lua_get_zone_seconds_before_idle(uint32 zone_id) { - return zone_store.GetZoneSecondsBeforeIdle(zone_id); + return ZoneStore::Instance()->GetZoneSecondsBeforeIdle(zone_id); } uint32 lua_get_zone_seconds_before_idle(uint32 zone_id, int version) { - return zone_store.GetZoneSecondsBeforeIdle(zone_id, version); + return ZoneStore::Instance()->GetZoneSecondsBeforeIdle(zone_id, version); } void lua_send_channel_message(uint8 channel_number, uint32 guild_id, uint8 language_id, uint8 language_skill, const char* message) @@ -5497,11 +5497,11 @@ bool lua_set_auto_login_character_name_by_account_id(uint32 account_id, std::str } uint32 lua_get_zone_id_by_long_name(std::string zone_long_name) { - return zone_store.GetZoneIDByLongName(zone_long_name); + return ZoneStore::Instance()->GetZoneIDByLongName(zone_long_name); } std::string lua_get_zone_short_name_by_long_name(std::string zone_long_name) { - return zone_store.GetZoneShortNameByLongName(zone_long_name); + return ZoneStore::Instance()->GetZoneShortNameByLongName(zone_long_name); } bool lua_send_parcel(luabind::object lua_table) diff --git a/zone/lua_zone.cpp b/zone/lua_zone.cpp index feadb4f3c..8250296ff 100644 --- a/zone/lua_zone.cpp +++ b/zone/lua_zone.cpp @@ -15,7 +15,7 @@ bool Lua_Zone::BuffTimersSuspended() bool Lua_Zone::BypassesExpansionCheck() { Lua_Safe_Call_Bool(); - return zone_store.GetZoneBypassExpansionCheck(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneBypassExpansionCheck(self->GetZoneID(), self->GetInstanceVersion()); } bool Lua_Zone::CanBind() @@ -87,25 +87,25 @@ float Lua_Zone::GetAAEXPModifierByCharacterID(uint32 character_id) std::string Lua_Zone::GetContentFlags() { Lua_Safe_Call_String(); - return zone_store.GetZoneContentFlags(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneContentFlags(self->GetZoneID(), self->GetInstanceVersion()); } std::string Lua_Zone::GetContentFlagsDisabled() { Lua_Safe_Call_String(); - return zone_store.GetZoneContentFlagsDisabled(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneContentFlagsDisabled(self->GetZoneID(), self->GetInstanceVersion()); } float Lua_Zone::GetExperienceMultiplier() { Lua_Safe_Call_Real(); - return zone_store.GetZoneExperienceMultiplier(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneExperienceMultiplier(self->GetZoneID(), self->GetInstanceVersion()); } int8 Lua_Zone::GetExpansion() { Lua_Safe_Call_Int(); - return zone_store.GetZoneExpansion(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneExpansion(self->GetZoneID(), self->GetInstanceVersion()); } float Lua_Zone::GetEXPModifier(Lua_Client c) @@ -123,19 +123,19 @@ float Lua_Zone::GetEXPModifierByCharacterID(uint32 character_id) int Lua_Zone::GetFastRegenEndurance() { Lua_Safe_Call_Int(); - return zone_store.GetZoneFastRegenEndurance(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFastRegenEndurance(self->GetZoneID(), self->GetInstanceVersion()); } int Lua_Zone::GetFastRegenHP() { Lua_Safe_Call_Int(); - return zone_store.GetZoneFastRegenHP(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFastRegenHP(self->GetZoneID(), self->GetInstanceVersion()); } int Lua_Zone::GetFastRegenMana() { Lua_Safe_Call_Int(); - return zone_store.GetZoneFastRegenMana(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFastRegenMana(self->GetZoneID(), self->GetInstanceVersion()); } std::string Lua_Zone::GetFileName() @@ -147,73 +147,73 @@ std::string Lua_Zone::GetFileName() std::string Lua_Zone::GetFlagNeeded() { Lua_Safe_Call_String(); - return zone_store.GetZoneFlagNeeded(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFlagNeeded(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Lua_Zone::GetFogBlue() { Lua_Safe_Call_Int(); - return zone_store.GetZoneFogBlue(self->GetZoneID(), 0, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogBlue(self->GetZoneID(), 0, self->GetInstanceVersion()); } uint8 Lua_Zone::GetFogBlue(uint8 slot) { Lua_Safe_Call_Int(); - return zone_store.GetZoneFogBlue(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogBlue(self->GetZoneID(), slot, self->GetInstanceVersion()); } float Lua_Zone::GetFogDensity() { Lua_Safe_Call_Real(); - return zone_store.GetZoneFogDensity(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogDensity(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Lua_Zone::GetFogGreen() { Lua_Safe_Call_Int(); - return zone_store.GetZoneFogGreen(self->GetZoneID(), 0, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogGreen(self->GetZoneID(), 0, self->GetInstanceVersion()); } uint8 Lua_Zone::GetFogGreen(uint8 slot) { Lua_Safe_Call_Int(); - return zone_store.GetZoneFogGreen(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogGreen(self->GetZoneID(), slot, self->GetInstanceVersion()); } float Lua_Zone::GetFogMaximumClip() { Lua_Safe_Call_Real(); - return zone_store.GetZoneFogMaximumClip(self->GetZoneID(), 0, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogMaximumClip(self->GetZoneID(), 0, self->GetInstanceVersion()); } float Lua_Zone::GetFogMaximumClip(uint8 slot) { Lua_Safe_Call_Real(); - return zone_store.GetZoneFogMaximumClip(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogMaximumClip(self->GetZoneID(), slot, self->GetInstanceVersion()); } float Lua_Zone::GetFogMinimumClip() { Lua_Safe_Call_Real(); - return zone_store.GetZoneFogMinimumClip(self->GetZoneID(), 0, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogMinimumClip(self->GetZoneID(), 0, self->GetInstanceVersion()); } float Lua_Zone::GetFogMinimumClip(uint8 slot) { Lua_Safe_Call_Real(); - return zone_store.GetZoneFogMinimumClip(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogMinimumClip(self->GetZoneID(), slot, self->GetInstanceVersion()); } uint8 Lua_Zone::GetFogRed() { Lua_Safe_Call_Int(); - return zone_store.GetZoneFogRed(self->GetZoneID(), 0, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogRed(self->GetZoneID(), 0, self->GetInstanceVersion()); } uint8 Lua_Zone::GetFogRed(uint8 slot) { Lua_Safe_Call_Int(); - return zone_store.GetZoneFogRed(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogRed(self->GetZoneID(), slot, self->GetInstanceVersion()); } float Lua_Zone::GetGraveyardHeading() @@ -255,7 +255,7 @@ uint32 Lua_Zone::GetGraveyardZoneID() float Lua_Zone::GetGravity() { Lua_Safe_Call_Real(); - return zone_store.GetZoneGravity(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneGravity(self->GetZoneID(), self->GetInstanceVersion()); } uint32 Lua_Zone::GetInstanceID() @@ -267,7 +267,7 @@ uint32 Lua_Zone::GetInstanceID() uint8 Lua_Zone::GetInstanceType() { Lua_Safe_Call_Int(); - return zone_store.GetZoneInstanceType(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneInstanceType(self->GetZoneID(), self->GetInstanceVersion()); } uint16 Lua_Zone::GetInstanceVersion() @@ -285,7 +285,7 @@ uint32 Lua_Zone::GetInstanceTimeRemaining() int Lua_Zone::GetLavaDamage() { Lua_Safe_Call_Int(); - return zone_store.GetZoneLavaDamage(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneLavaDamage(self->GetZoneID(), self->GetInstanceVersion()); } std::string Lua_Zone::GetLongName() @@ -297,19 +297,19 @@ std::string Lua_Zone::GetLongName() float Lua_Zone::GetMaximumClip() { Lua_Safe_Call_Real(); - return zone_store.GetZoneMaximumClip(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMaximumClip(self->GetZoneID(), self->GetInstanceVersion()); } int8 Lua_Zone::GetMaximumExpansion() { Lua_Safe_Call_Int(); - return zone_store.GetZoneMaximumExpansion(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMaximumExpansion(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Lua_Zone::GetMaximumLevel() { Lua_Safe_Call_Int(); - return zone_store.GetZoneMaximumLevel(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMaximumLevel(self->GetZoneID(), self->GetInstanceVersion()); } uint32 Lua_Zone::GetMaxClients() @@ -321,79 +321,79 @@ uint32 Lua_Zone::GetMaxClients() float Lua_Zone::GetMinimumClip() { Lua_Safe_Call_Int(); - return zone_store.GetZoneMinimumClip(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMinimumClip(self->GetZoneID(), self->GetInstanceVersion()); } int8 Lua_Zone::GetMinimumExpansion() { Lua_Safe_Call_Int(); - return zone_store.GetZoneMinimumExpansion(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMinimumExpansion(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Lua_Zone::GetMinimumLevel() { Lua_Safe_Call_Int(); - return zone_store.GetZoneMinimumLevel(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMinimumLevel(self->GetZoneID(), self->GetInstanceVersion()); } int Lua_Zone::GetMinimumLavaDamage() { Lua_Safe_Call_Int(); - return zone_store.GetZoneMinimumLavaDamage(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMinimumLavaDamage(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Lua_Zone::GetMinimumStatus() { Lua_Safe_Call_Int(); - return zone_store.GetZoneMinimumStatus(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMinimumStatus(self->GetZoneID(), self->GetInstanceVersion()); } std::string Lua_Zone::GetNote() { Lua_Safe_Call_String(); - return zone_store.GetZoneNote(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneNote(self->GetZoneID(), self->GetInstanceVersion()); } int Lua_Zone::GetNPCMaximumAggroDistance() { Lua_Safe_Call_Int(); - return zone_store.GetZoneNPCMaximumAggroDistance(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneNPCMaximumAggroDistance(self->GetZoneID(), self->GetInstanceVersion()); } int8 Lua_Zone::GetPEQZone() { Lua_Safe_Call_Int(); - return zone_store.GetZonePEQZone(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZonePEQZone(self->GetZoneID(), self->GetInstanceVersion()); } int Lua_Zone::GetRainChance() { Lua_Safe_Call_Int(); - return zone_store.GetZoneRainChance(self->GetZoneID(), 0, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneRainChance(self->GetZoneID(), 0, self->GetInstanceVersion()); } int Lua_Zone::GetRainChance(uint8 slot) { Lua_Safe_Call_Int(); - return zone_store.GetZoneRainChance(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneRainChance(self->GetZoneID(), slot, self->GetInstanceVersion()); } int Lua_Zone::GetRainDuration() { Lua_Safe_Call_Int(); - return zone_store.GetZoneRainDuration(self->GetZoneID(), 0, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneRainDuration(self->GetZoneID(), 0, self->GetInstanceVersion()); } int Lua_Zone::GetRainDuration(uint8 slot) { Lua_Safe_Call_Int(); - return zone_store.GetZoneRainDuration(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneRainDuration(self->GetZoneID(), slot, self->GetInstanceVersion()); } uint32 Lua_Zone::GetRuleSet() { Lua_Safe_Call_Int(); - return zone_store.GetZoneRuleSet(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneRuleSet(self->GetZoneID(), self->GetInstanceVersion()); } float Lua_Zone::GetSafeHeading() @@ -435,55 +435,55 @@ uint32 Lua_Zone::GetSecondsBeforeIdle() uint64 Lua_Zone::GetShutdownDelay() { Lua_Safe_Call_Int(); - return zone_store.GetZoneShutdownDelay(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneShutdownDelay(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Lua_Zone::GetSky() { Lua_Safe_Call_Int(); - return zone_store.GetZoneSky(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneSky(self->GetZoneID(), self->GetInstanceVersion()); } int8 Lua_Zone::GetSkyLock() { Lua_Safe_Call_Int(); - return zone_store.GetZoneSkyLock(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneSkyLock(self->GetZoneID(), self->GetInstanceVersion()); } int Lua_Zone::GetSnowChance() { Lua_Safe_Call_Int(); - return zone_store.GetZoneSnowChance(self->GetZoneID(), 0, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneSnowChance(self->GetZoneID(), 0, self->GetInstanceVersion()); } int Lua_Zone::GetSnowChance(uint8 slot) { Lua_Safe_Call_Int(); - return zone_store.GetZoneSnowChance(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneSnowChance(self->GetZoneID(), slot, self->GetInstanceVersion()); } int Lua_Zone::GetSnowDuration() { Lua_Safe_Call_Int(); - return zone_store.GetZoneSnowDuration(self->GetZoneID(), 0, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneSnowDuration(self->GetZoneID(), 0, self->GetInstanceVersion()); } int Lua_Zone::GetSnowDuration(uint8 slot) { Lua_Safe_Call_Int(); - return zone_store.GetZoneSnowDuration(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneSnowDuration(self->GetZoneID(), slot, self->GetInstanceVersion()); } uint8 Lua_Zone::GetTimeType() { Lua_Safe_Call_Int(); - return zone_store.GetZoneTimeType(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneTimeType(self->GetZoneID(), self->GetInstanceVersion()); } int Lua_Zone::GetTimeZone() { Lua_Safe_Call_Int(); - return zone_store.GetZoneTimeZone(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneTimeZone(self->GetZoneID(), self->GetInstanceVersion()); } std::string Lua_Zone::GetZoneDescription() @@ -507,25 +507,25 @@ uint8 Lua_Zone::GetZoneType() float Lua_Zone::GetUnderworld() { Lua_Safe_Call_Real(); - return zone_store.GetZoneUnderworld(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneUnderworld(self->GetZoneID(), self->GetInstanceVersion()); } int Lua_Zone::GetUnderworldTeleportIndex() { Lua_Safe_Call_Int(); - return zone_store.GetZoneUnderworldTeleportIndex(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneUnderworldTeleportIndex(self->GetZoneID(), self->GetInstanceVersion()); } float Lua_Zone::GetWalkSpeed() { Lua_Safe_Call_Real(); - return zone_store.GetZoneWalkSpeed(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneWalkSpeed(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Lua_Zone::GetZoneZType() { Lua_Safe_Call_Int(); - return zone_store.GetZoneZType(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneZType(self->GetZoneID(), self->GetInstanceVersion()); } int Lua_Zone::GetZoneTotalBlockedSpells() diff --git a/zone/main.cpp b/zone/main.cpp index a17b36e8e..5a9490802 100644 --- a/zone/main.cpp +++ b/zone/main.cpp @@ -93,7 +93,6 @@ extern volatile bool is_zone_loaded; EntityList entity_list; WorldServer worldserver; -ZoneStore zone_store; uint32 numclients = 0; char errorname[32]; extern Zone *zone; @@ -364,9 +363,9 @@ int main(int argc, char **argv) } } - zone_store.LoadZones(content_db); + ZoneStore::Instance()->LoadZones(content_db); - if (zone_store.GetZones().empty()) { + if (ZoneStore::Instance()->GetZones().empty()) { LogError("Failed to load zones data, check your schema for possible errors"); return 1; } diff --git a/zone/perl_zone.cpp b/zone/perl_zone.cpp index 0d9cd8ddb..6cb49f557 100644 --- a/zone/perl_zone.cpp +++ b/zone/perl_zone.cpp @@ -13,7 +13,7 @@ bool Perl_Zone_BuffTimersSuspended(Zone* self) bool Perl_Zone_BypassesExpansionCheck(Zone* self) { - return zone_store.GetZoneBypassExpansionCheck(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneBypassExpansionCheck(self->GetZoneID(), self->GetInstanceVersion()); } bool Perl_Zone_CanBind(Zone* self) @@ -73,22 +73,22 @@ float Perl_Zone_GetAAEXPModifierByCharacterID(Zone* self, uint32 character_id) std::string Perl_Zone_GetContentFlags(Zone* self) { - return zone_store.GetZoneContentFlags(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneContentFlags(self->GetZoneID(), self->GetInstanceVersion()); } std::string Perl_Zone_GetContentFlagsDisabled(Zone* self) { - return zone_store.GetZoneContentFlagsDisabled(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneContentFlagsDisabled(self->GetZoneID(), self->GetInstanceVersion()); } float Perl_Zone_GetExperienceMultiplier(Zone* self) { - return zone_store.GetZoneExperienceMultiplier(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneExperienceMultiplier(self->GetZoneID(), self->GetInstanceVersion()); } int8 Perl_Zone_GetExpansion(Zone* self) { - return zone_store.GetZoneExpansion(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneExpansion(self->GetZoneID(), self->GetInstanceVersion()); } float Perl_Zone_GetEXPModifier(Zone* self, Client* c) @@ -103,17 +103,17 @@ float Perl_Zone_GetEXPModifierByCharacterID(Zone* self, uint32 character_id) int Perl_Zone_GetFastRegenEndurance(Zone* self) { - return zone_store.GetZoneFastRegenEndurance(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFastRegenEndurance(self->GetZoneID(), self->GetInstanceVersion()); } int Perl_Zone_GetFastRegenHP(Zone* self) { - return zone_store.GetZoneFastRegenHP(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFastRegenHP(self->GetZoneID(), self->GetInstanceVersion()); } int Perl_Zone_GetFastRegenMana(Zone* self) { - return zone_store.GetZoneFastRegenMana(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFastRegenMana(self->GetZoneID(), self->GetInstanceVersion()); } std::string Perl_Zone_GetFileName(Zone* self) @@ -123,37 +123,37 @@ std::string Perl_Zone_GetFileName(Zone* self) std::string Perl_Zone_GetFlagNeeded(Zone* self) { - return zone_store.GetZoneFlagNeeded(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFlagNeeded(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Perl_Zone_GetFogBlue(Zone* self, uint8 slot = 0) { - return zone_store.GetZoneFogBlue(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogBlue(self->GetZoneID(), slot, self->GetInstanceVersion()); } float Perl_Zone_GetFogDensity(Zone* self) { - return zone_store.GetZoneFogDensity(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogDensity(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Perl_Zone_GetFogGreen(Zone* self, uint8 slot = 0) { - return zone_store.GetZoneFogGreen(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogGreen(self->GetZoneID(), slot, self->GetInstanceVersion()); } float Perl_Zone_GetFogMaximumClip(Zone* self, uint8 slot = 0) { - return zone_store.GetZoneFogMaximumClip(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogMaximumClip(self->GetZoneID(), slot, self->GetInstanceVersion()); } float Perl_Zone_GetFogMinimumClip(Zone* self, uint8 slot = 0) { - return zone_store.GetZoneFogMinimumClip(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogMinimumClip(self->GetZoneID(), slot, self->GetInstanceVersion()); } uint8 Perl_Zone_GetFogRed(Zone* self, uint8 slot = 0) { - return zone_store.GetZoneFogRed(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneFogRed(self->GetZoneID(), slot, self->GetInstanceVersion()); } float Perl_Zone_GetGraveyardHeading(Zone* self) @@ -188,7 +188,7 @@ uint32 Perl_Zone_GetGraveyardZoneID(Zone* self) float Perl_Zone_GetGravity(Zone* self) { - return zone_store.GetZoneGravity(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneGravity(self->GetZoneID(), self->GetInstanceVersion()); } uint32 Perl_Zone_GetInstanceID(Zone* self) @@ -198,7 +198,7 @@ uint32 Perl_Zone_GetInstanceID(Zone* self) uint8 Perl_Zone_GetInstanceType(Zone* self) { - return zone_store.GetZoneInstanceType(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneInstanceType(self->GetZoneID(), self->GetInstanceVersion()); } uint16 Perl_Zone_GetInstanceVersion(Zone* self) @@ -213,7 +213,7 @@ uint32 Perl_Zone_GetInstanceTimeRemaining(Zone* self) int Perl_Zone_GetLavaDamage(Zone* self) { - return zone_store.GetZoneLavaDamage(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneLavaDamage(self->GetZoneID(), self->GetInstanceVersion()); } std::string Perl_Zone_GetLongName(Zone* self) @@ -223,17 +223,17 @@ std::string Perl_Zone_GetLongName(Zone* self) float Perl_Zone_GetMaximumClip(Zone* self) { - return zone_store.GetZoneMaximumClip(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMaximumClip(self->GetZoneID(), self->GetInstanceVersion()); } int8 Perl_Zone_GetMaximumExpansion(Zone* self) { - return zone_store.GetZoneMaximumExpansion(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMaximumExpansion(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Perl_Zone_GetMaximumLevel(Zone* self) { - return zone_store.GetZoneMaximumLevel(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMaximumLevel(self->GetZoneID(), self->GetInstanceVersion()); } uint32 Perl_Zone_GetMaxClients(Zone* self) @@ -243,57 +243,57 @@ uint32 Perl_Zone_GetMaxClients(Zone* self) float Perl_Zone_GetMinimumClip(Zone* self) { - return zone_store.GetZoneMinimumClip(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMinimumClip(self->GetZoneID(), self->GetInstanceVersion()); } int8 Perl_Zone_GetMinimumExpansion(Zone* self) { - return zone_store.GetZoneMinimumExpansion(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMinimumExpansion(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Perl_Zone_GetMinimumLevel(Zone* self) { - return zone_store.GetZoneMinimumLevel(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMinimumLevel(self->GetZoneID(), self->GetInstanceVersion()); } int Perl_Zone_GetMinimumLavaDamage(Zone* self) { - return zone_store.GetZoneMinimumLavaDamage(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMinimumLavaDamage(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Perl_Zone_GetMinimumStatus(Zone* self) { - return zone_store.GetZoneMinimumStatus(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneMinimumStatus(self->GetZoneID(), self->GetInstanceVersion()); } std::string Perl_Zone_GetNote(Zone* self) { - return zone_store.GetZoneNote(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneNote(self->GetZoneID(), self->GetInstanceVersion()); } int Perl_Zone_GetNPCMaximumAggroDistance(Zone* self) { - return zone_store.GetZoneNPCMaximumAggroDistance(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneNPCMaximumAggroDistance(self->GetZoneID(), self->GetInstanceVersion()); } int8 Perl_Zone_GetPEQZone(Zone* self) { - return zone_store.GetZonePEQZone(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZonePEQZone(self->GetZoneID(), self->GetInstanceVersion()); } int Perl_Zone_GetRainChance(Zone* self, uint8 slot = 0) { - return zone_store.GetZoneRainChance(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneRainChance(self->GetZoneID(), slot, self->GetInstanceVersion()); } int Perl_Zone_GetRainDuration(Zone* self, uint8 slot = 0) { - return zone_store.GetZoneRainDuration(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneRainDuration(self->GetZoneID(), slot, self->GetInstanceVersion()); } uint32 Perl_Zone_GetRuleSet(Zone* self) { - return zone_store.GetZoneRuleSet(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneRuleSet(self->GetZoneID(), self->GetInstanceVersion()); } float Perl_Zone_GetSafeHeading(Zone* self) @@ -328,37 +328,37 @@ uint32 Perl_Zone_GetSecondsBeforeIdle(Zone* self) uint64 Perl_Zone_GetShutdownDelay(Zone* self) { - return zone_store.GetZoneShutdownDelay(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneShutdownDelay(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Perl_Zone_GetSky(Zone* self) { - return zone_store.GetZoneSky(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneSky(self->GetZoneID(), self->GetInstanceVersion()); } int8 Perl_Zone_GetSkyLock(Zone* self) { - return zone_store.GetZoneSkyLock(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneSkyLock(self->GetZoneID(), self->GetInstanceVersion()); } int Perl_Zone_GetSnowChance(Zone* self, uint8 slot = 0) { - return zone_store.GetZoneSnowChance(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneSnowChance(self->GetZoneID(), slot, self->GetInstanceVersion()); } int Perl_Zone_GetSnowDuration(Zone* self, uint8 slot = 0) { - return zone_store.GetZoneSnowDuration(self->GetZoneID(), slot, self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneSnowDuration(self->GetZoneID(), slot, self->GetInstanceVersion()); } uint8 Perl_Zone_GetTimeType(Zone* self) { - return zone_store.GetZoneTimeType(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneTimeType(self->GetZoneID(), self->GetInstanceVersion()); } int Perl_Zone_GetTimeZone(Zone* self) { - return zone_store.GetZoneTimeZone(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneTimeZone(self->GetZoneID(), self->GetInstanceVersion()); } std::string Perl_Zone_GetZoneDescription(Zone* self) @@ -378,22 +378,22 @@ uint8 Perl_Zone_GetZoneType(Zone* self) float Perl_Zone_GetUnderworld(Zone* self) { - return zone_store.GetZoneUnderworld(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneUnderworld(self->GetZoneID(), self->GetInstanceVersion()); } int Perl_Zone_GetUnderworldTeleportIndex(Zone* self) { - return zone_store.GetZoneUnderworldTeleportIndex(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneUnderworldTeleportIndex(self->GetZoneID(), self->GetInstanceVersion()); } float Perl_Zone_GetWalkSpeed(Zone* self) { - return zone_store.GetZoneWalkSpeed(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneWalkSpeed(self->GetZoneID(), self->GetInstanceVersion()); } uint8 Perl_Zone_GetZoneZType(Zone* self) { - return zone_store.GetZoneZType(self->GetZoneID(), self->GetInstanceVersion()); + return ZoneStore::Instance()->GetZoneZType(self->GetZoneID(), self->GetInstanceVersion()); } int Perl_Zone_GetZoneTotalBlockedSpells(Zone* self) diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp index f3e5deaeb..16205187a 100644 --- a/zone/task_client_state.cpp +++ b/zone/task_client_state.cpp @@ -2283,7 +2283,7 @@ void ClientTaskState::CreateTaskDynamicZone(Client* client, int task_id, Dynamic } // dz should be named the version-based zone name (used in choose zone window and dz window on live) - auto zone_info = zone_store.GetZoneWithFallback(dz_request.GetZoneID(), dz_request.GetZoneVersion()); + auto zone_info = ZoneStore::Instance()->GetZoneWithFallback(dz_request.GetZoneID(), dz_request.GetZoneVersion()); dz_request.SetName(zone_info && !zone_info->long_name.empty() ? zone_info->long_name : task->title); dz_request.SetMinPlayers(task->min_players); dz_request.SetMaxPlayers(task->max_players); diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 6df196e1d..7bac46737 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -4697,7 +4697,7 @@ void WorldServer::ProcessReload(const ServerReload::Request& request) break; case ServerReload::Type::ZoneData: - zone_store.LoadZones(content_db); + ZoneStore::Instance()->LoadZones(content_db); zone->LoadZoneCFG(zone->GetShortName(), zone->GetInstanceVersion()); break; diff --git a/zone/zone.cpp b/zone/zone.cpp index 4081c214f..5145ac423 100644 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -1300,7 +1300,7 @@ void Zone::ReloadStaticData() { bool Zone::LoadZoneCFG(const char* filename, uint16 instance_version) { - auto z = zone_store.GetZoneWithFallback(ZoneID(filename), instance_version); + auto z = ZoneStore::Instance()->GetZoneWithFallback(ZoneID(filename), instance_version); if (!z) { LogError("Failed to load zone data for [{}] instance_version [{}]", filename, instance_version); @@ -2251,7 +2251,7 @@ void Zone::LoadZoneBlockedSpells() if (!content_db.LoadBlockedSpells(zone_total_blocked_spells, blocked_spells, GetZoneID())) { LogError( "Failed to load blocked spells for {} ({}).", - zone_store.GetZoneName(GetZoneID(), true), + ZoneStore::Instance()->GetZoneName(GetZoneID(), true), GetZoneID() ); ClearBlockedSpells(); @@ -2261,7 +2261,7 @@ void Zone::LoadZoneBlockedSpells() LogInfo( "Loaded [{}] blocked spells(s) for {} ({}).", Strings::Commify(zone_total_blocked_spells), - zone_store.GetZoneName(GetZoneID(), true), + ZoneStore::Instance()->GetZoneName(GetZoneID(), true), GetZoneID() ); } diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index d85d9cf63..7cd66a836 100644 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -2639,7 +2639,7 @@ int64 ZoneDatabase::GetBlockedSpellsCount(uint32 zone_id) bool ZoneDatabase::LoadBlockedSpells(int64 blocked_spells_count, ZoneSpellsBlocked* into, uint32 zone_id) { - LogInfo("Loading Blocked Spells from database for {} ({}).", zone_store.GetZoneName(zone_id, true), zone_id); + LogInfo("Loading Blocked Spells from database for {} ({}).", ZoneStore::Instance()->GetZoneName(zone_id, true), zone_id); const auto& l = BlockedSpellsRepository::GetWhere( *this, @@ -2661,7 +2661,7 @@ bool ZoneDatabase::LoadBlockedSpells(int64 blocked_spells_count, ZoneSpellsBlock LogError( "Blocked spells count of {} exceeded for {} ({}).", blocked_spells_count, - zone_store.GetZoneName(zone_id, true), + ZoneStore::Instance()->GetZoneName(zone_id, true), zone_id ); break; diff --git a/zone/zoning.cpp b/zone/zoning.cpp index 1f84ff6e3..dad889251 100644 --- a/zone/zoning.cpp +++ b/zone/zoning.cpp @@ -352,7 +352,7 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) { if (content_service.GetCurrentExpansion() >= Expansion::Classic && !GetGM()) { bool meets_zone_expansion_check = false; - auto z = zone_store.GetZoneWithFallback(ZoneID(target_zone_name), 0); + auto z = ZoneStore::Instance()->GetZoneWithFallback(ZoneID(target_zone_name), 0); if (z->expansion <= content_service.GetCurrentExpansion() || z->bypass_expansion_check) { meets_zone_expansion_check = true; } From c3f2708f1b4b906e01509577fc5d36fed70a612f Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Tue, 24 Jun 2025 19:14:51 -0500 Subject: [PATCH 14/18] [Player Events] Don't Write Empty Data (#4912) * [Player Events] Don't Write Empty Data * Revert "[Player Events] Don't Write Empty Data" This reverts commit f64a824b33c467697cdd377261745add889db206. * Update player_events.h * Augs --- .../events/player_event_discord_formatter.cpp | 4 +- common/events/player_events.h | 661 +++++++++++++++--- common/item_instance.cpp | 2 +- 3 files changed, 550 insertions(+), 117 deletions(-) diff --git a/common/events/player_event_discord_formatter.cpp b/common/events/player_event_discord_formatter.cpp index e3e4e5c27..5b068f507 100644 --- a/common/events/player_event_discord_formatter.cpp +++ b/common/events/player_event_discord_formatter.cpp @@ -716,7 +716,7 @@ std::string PlayerEventDiscordFormatter::FormatNPCHandinEvent( ); for (int i = 0; i < h.augment_ids.size(); i++) { - if (!Strings::EqualFold(h.augment_names[i], "None")) { + if (!h.augment_names[i].empty()) { const uint8 slot_id = (i + 1); handin_items_info += fmt::format( "Augment {}: {} ({})\n", @@ -741,7 +741,7 @@ std::string PlayerEventDiscordFormatter::FormatNPCHandinEvent( ); for (int i = 0; i < r.augment_ids.size(); i++) { - if (!Strings::EqualFold(r.augment_names[i], "None")) { + if (!r.augment_names[i].empty()) { const uint8 slot_id = (i + 1); return_items_info += fmt::format( "Augment {}: {} ({})\n", diff --git a/common/events/player_events.h b/common/events/player_events.h index 78b9fc10d..b2a485621 100644 --- a/common/events/player_events.h +++ b/common/events/player_events.h @@ -7,8 +7,16 @@ #include "../rulesys.h" #include "../repositories/player_event_logs_repository.h" -namespace PlayerEvent { +#define CEREAL_NVP_IF_NONZERO(ar, name) \ +if ((name) != 0) ar(cereal::make_nvp(#name, name)) +#define CEREAL_NVP_IF_NOT_EMPTY(ar, name) \ +if (!(name).empty()) ar(cereal::make_nvp(#name, name)) + +#define CEREAL_NVP_IF_TRUE(ar, name) \ +if ((name)) ar(cereal::make_nvp(#name, name)) + +namespace PlayerEvent { enum EventType { GM_COMMAND = 1, ZONING, @@ -26,10 +34,10 @@ namespace PlayerEvent { LOOT_ITEM, MERCHANT_PURCHASE, MERCHANT_SELL, - GROUP_JOIN, // unimplemented + GROUP_JOIN, // unimplemented GROUP_LEAVE, // unimplemented - RAID_JOIN, // unimplemented - RAID_LEAVE, // unimplemented + RAID_JOIN, // unimplemented + RAID_LEAVE, // unimplemented GROUNDSPAWN_PICKUP, NPC_HANDIN, SKILL_UP, @@ -45,12 +53,12 @@ namespace PlayerEvent { COMBINE_SUCCESS, DROPPED_ITEM, SPLIT_MONEY, - DZ_JOIN, // unimplemented + DZ_JOIN, // unimplemented DZ_LEAVE, // unimplemented TRADER_PURCHASE, TRADER_SELL, BANDOLIER_CREATE, // unimplemented - BANDOLIER_SWAP, // unimplemented + BANDOLIER_SWAP, // unimplemented DISCOVER_ITEM, POSSIBLE_HACK, KILLED_NPC, @@ -76,7 +84,7 @@ namespace PlayerEvent { // If event is unimplemented just tag (Unimplemented) in the name // Events don't get saved to the database if unimplemented or deprecated // Events tagged as deprecated will get automatically removed - static const char *EventName[EventType::MAX] = { + static const char* EventName[EventType::MAX] = { "None", "GM Command", "Zoning", @@ -156,8 +164,8 @@ namespace PlayerEvent { float heading; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(account_id), @@ -185,8 +193,8 @@ namespace PlayerEvent { PlayerEventLogsRepository::PlayerEventLogs player_event_log; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(player_event), @@ -200,8 +208,8 @@ namespace PlayerEvent { std::string noop; // noop, gets discard upstream // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(noop) @@ -224,8 +232,38 @@ namespace PlayerEvent { bool attuned; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar( + CEREAL_NVP(item_id), + CEREAL_NVP(item_name), + CEREAL_NVP(to_slot), + CEREAL_NVP(charges) + ); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + CEREAL_NVP_IF_TRUE(ar, attuned); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -284,8 +322,37 @@ namespace PlayerEvent { // cereal - template - void serialize(Archive &ar) + template + void save(Archive& ar) const + { + ar( + CEREAL_NVP(slot), + CEREAL_NVP(item_id) + ); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NOT_EMPTY(ar, augment_1_name); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NOT_EMPTY(ar, augment_2_name); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NOT_EMPTY(ar, augment_3_name); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NOT_EMPTY(ar, augment_4_name); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NOT_EMPTY(ar, augment_5_name); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + CEREAL_NVP_IF_NOT_EMPTY(ar, augment_6_name); + + ar( + CEREAL_NVP(item_name), + CEREAL_NVP(charges) + ); + + CEREAL_NVP_IF_TRUE(ar, in_bag); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(slot), @@ -295,7 +362,7 @@ namespace PlayerEvent { CEREAL_NVP(augment_2_id), CEREAL_NVP(augment_2_name), CEREAL_NVP(augment_3_id), - CEREAL_NVP(augment_1_name), + CEREAL_NVP(augment_3_name), CEREAL_NVP(augment_4_id), CEREAL_NVP(augment_4_name), CEREAL_NVP(augment_5_id), @@ -319,8 +386,8 @@ namespace PlayerEvent { int32 copper; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(platinum), @@ -342,8 +409,8 @@ namespace PlayerEvent { std::vector character_2_give_items; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(character_1_id), @@ -363,8 +430,8 @@ namespace PlayerEvent { std::string target; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(message), @@ -386,8 +453,8 @@ namespace PlayerEvent { int32 to_instance_version; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(from_zone_long_name), @@ -408,8 +475,8 @@ namespace PlayerEvent { uint32 aa_gained; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar(CEREAL_NVP(aa_gained)); } @@ -422,8 +489,8 @@ namespace PlayerEvent { int32 aa_next_id; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(aa_id), @@ -444,9 +511,34 @@ namespace PlayerEvent { uint32 augment_6_id; std::string item_name; - // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar(CEREAL_NVP(item_id)); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + + ar(CEREAL_NVP(item_name)); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -471,9 +563,34 @@ namespace PlayerEvent { uint32 augment_6_id; std::string item_name; - // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar(CEREAL_NVP(item_id)); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + + ar(CEREAL_NVP(item_name)); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -501,9 +618,41 @@ namespace PlayerEvent { bool attuned; std::string reason; - // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar( + CEREAL_NVP(item_id), + CEREAL_NVP(item_name), + CEREAL_NVP(charges) + ); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + + ar( + CEREAL_NVP(attuned), + CEREAL_NVP(reason) + ); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -521,14 +670,15 @@ namespace PlayerEvent { } }; + struct LevelGainedEvent { uint32 from_level; uint8 to_level; int levels_gained; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(from_level), @@ -544,8 +694,8 @@ namespace PlayerEvent { int levels_lost; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(from_level), @@ -569,8 +719,41 @@ namespace PlayerEvent { std::string corpse_name; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar( + CEREAL_NVP(item_id), + CEREAL_NVP(item_name), + CEREAL_NVP(charges) + ); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + + ar( + CEREAL_NVP(npc_id), + CEREAL_NVP(corpse_name) + ); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -601,8 +784,8 @@ namespace PlayerEvent { uint64 player_currency_balance; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(npc_id), @@ -632,8 +815,8 @@ namespace PlayerEvent { uint64 player_currency_balance; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(npc_id), @@ -657,8 +840,8 @@ namespace PlayerEvent { std::string against_who; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(skill_id), @@ -676,8 +859,8 @@ namespace PlayerEvent { std::string task_name; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(npc_id), @@ -695,8 +878,8 @@ namespace PlayerEvent { uint32 done_count; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(task_id), @@ -714,8 +897,8 @@ namespace PlayerEvent { uint32 done_count; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(task_id), @@ -731,8 +914,8 @@ namespace PlayerEvent { std::string item_name; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -746,8 +929,8 @@ namespace PlayerEvent { std::string target; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(message), @@ -762,8 +945,8 @@ namespace PlayerEvent { uint32 spell_id; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(resurrecter_name), @@ -780,8 +963,8 @@ namespace PlayerEvent { uint32 tradeskill_id; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(recipe_id), @@ -805,8 +988,38 @@ namespace PlayerEvent { uint32 charges; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar(CEREAL_NVP(item_id)); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + + ar( + CEREAL_NVP(item_name), + CEREAL_NVP(slot_id), + CEREAL_NVP(charges) + ); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -833,8 +1046,8 @@ namespace PlayerEvent { std::string skill_name; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(killer_id), @@ -856,8 +1069,8 @@ namespace PlayerEvent { uint64 player_money_balance; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(copper), @@ -886,10 +1099,44 @@ namespace PlayerEvent { uint64 total_cost; uint64 player_money_balance; - // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar(CEREAL_NVP(item_id)); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + + ar( + CEREAL_NVP(item_name), + CEREAL_NVP(trader_id), + CEREAL_NVP(trader_name), + CEREAL_NVP(price), + CEREAL_NVP(quantity), + CEREAL_NVP(charges), + CEREAL_NVP(total_cost), + CEREAL_NVP(player_money_balance) + ); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -928,10 +1175,43 @@ namespace PlayerEvent { uint64 total_cost; uint64 player_money_balance; + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } - // cereal - template - void serialize(Archive &ar) + template + void save(Archive& ar) const + { + ar(CEREAL_NVP(item_id)); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + + ar( + CEREAL_NVP(item_name), + CEREAL_NVP(buyer_id), + CEREAL_NVP(buyer_name), + CEREAL_NVP(price), + CEREAL_NVP(quantity), + CEREAL_NVP(charges), + CEREAL_NVP(total_cost), + CEREAL_NVP(player_money_balance) + ); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -958,8 +1238,8 @@ namespace PlayerEvent { std::string item_name; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -978,8 +1258,8 @@ namespace PlayerEvent { bool attuned; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -1000,8 +1280,8 @@ namespace PlayerEvent { uint32 platinum; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(copper), @@ -1022,8 +1302,8 @@ namespace PlayerEvent { bool is_quest_handin; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(npc_id), @@ -1041,8 +1321,8 @@ namespace PlayerEvent { std::string message; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(message) @@ -1058,8 +1338,8 @@ namespace PlayerEvent { uint64 total_heal_per_second_taken; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(npc_id), @@ -1083,9 +1363,36 @@ namespace PlayerEvent { bool attuned; uint32 guild_favor; - // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar(CEREAL_NVP(item_id)); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + CEREAL_NVP_IF_NONZERO(ar, charges); + CEREAL_NVP_IF_TRUE(ar, attuned); + + ar(CEREAL_NVP(guild_favor)); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -1095,6 +1402,8 @@ namespace PlayerEvent { CEREAL_NVP(augment_4_id), CEREAL_NVP(augment_5_id), CEREAL_NVP(augment_6_id), + CEREAL_NVP(charges), + CEREAL_NVP(attuned), CEREAL_NVP(guild_favor) ); } @@ -1105,8 +1414,8 @@ namespace PlayerEvent { uint32 guild_favor; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(plat), @@ -1127,9 +1436,38 @@ namespace PlayerEvent { std::string from_player_name; uint32 sent_date; - // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar(CEREAL_NVP(item_id)); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + + ar( + CEREAL_NVP(quantity), + CEREAL_NVP(from_player_name), + CEREAL_NVP(sent_date) + ); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -1160,9 +1498,40 @@ namespace PlayerEvent { std::string to_player_name; uint32 sent_date; - // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar(CEREAL_NVP(item_id)); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + CEREAL_NVP_IF_NONZERO(ar, charges); + + ar( + CEREAL_NVP(quantity), + CEREAL_NVP(from_player_name), + CEREAL_NVP(to_player_name), + CEREAL_NVP(sent_date) + ); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -1195,9 +1564,40 @@ namespace PlayerEvent { std::string from_name; std::string note; - // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar(CEREAL_NVP(item_id)); + + CEREAL_NVP_IF_NONZERO(ar, augment_1_id); + CEREAL_NVP_IF_NONZERO(ar, augment_2_id); + CEREAL_NVP_IF_NONZERO(ar, augment_3_id); + CEREAL_NVP_IF_NONZERO(ar, augment_4_id); + CEREAL_NVP_IF_NONZERO(ar, augment_5_id); + CEREAL_NVP_IF_NONZERO(ar, augment_6_id); + + ar( + CEREAL_NVP(quantity), + CEREAL_NVP(char_id), + CEREAL_NVP(from_name), + CEREAL_NVP(note), + CEREAL_NVP(sent_date) + ); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(item_id), @@ -1226,8 +1626,8 @@ namespace PlayerEvent { std::string seller_name; uint64 total_cost; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(status), @@ -1251,8 +1651,8 @@ namespace PlayerEvent { double progression; // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(status), @@ -1273,8 +1673,8 @@ namespace PlayerEvent { uint32 type; std::string message; - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) { ar( CEREAL_NVP(to), @@ -1300,9 +1700,41 @@ namespace PlayerEvent { uint32 quantity; uint32 permission; - // cereal - template - void serialize(Archive &ar) + template + void serialize(Archive& ar) + { + if constexpr (Archive::is_saving::value) { + save(ar); + } + else { + load(ar); + } + } + + template + void save(Archive& ar) const + { + ar( + CEREAL_NVP(char_id), + CEREAL_NVP(guild_id), + CEREAL_NVP(item_id) + ); + + CEREAL_NVP_IF_NONZERO(ar, aug_slot_one); + CEREAL_NVP_IF_NONZERO(ar, aug_slot_two); + CEREAL_NVP_IF_NONZERO(ar, aug_slot_three); + CEREAL_NVP_IF_NONZERO(ar, aug_slot_four); + CEREAL_NVP_IF_NONZERO(ar, aug_slot_five); + CEREAL_NVP_IF_NONZERO(ar, aug_slot_six); + + ar( + CEREAL_NVP(quantity), + CEREAL_NVP(permission) + ); + } + + template + void load(Archive& ar) { ar( CEREAL_NVP(char_id), @@ -1314,8 +1746,9 @@ namespace PlayerEvent { CEREAL_NVP(aug_slot_four), CEREAL_NVP(aug_slot_five), CEREAL_NVP(aug_slot_six), - CEREAL_NVP(quantity) - ); + CEREAL_NVP(quantity), + CEREAL_NVP(permission) + ); } }; } diff --git a/common/item_instance.cpp b/common/item_instance.cpp index c25ea09d2..b2d619b5a 100644 --- a/common/item_instance.cpp +++ b/common/item_instance.cpp @@ -1799,7 +1799,7 @@ std::vector EQ::ItemInstance::GetAugmentNames() const for (uint8 slot_id = invaug::SOCKET_BEGIN; slot_id <= invaug::SOCKET_END; slot_id++) { const auto augment = GetAugment(slot_id); - augment_names.push_back(augment ? augment->GetItem()->Name : "None"); + augment_names.push_back(augment ? augment->GetItem()->Name : ""); } return augment_names; From f025e5741bdfbfd3a12ca71eae46681670a536ad Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Tue, 24 Jun 2025 19:15:22 -0500 Subject: [PATCH 15/18] [Player Event Logs] Don't Clear Event Data on ETL Events (#4913) * [Player Event Logs] Don't Clear Event Data on ETL Events * Migration --- common/database/database_update_manifest.cpp | 12 ++++++++++++ common/events/player_event_logs.cpp | 11 ++++++----- common/version.h | 2 +- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/common/database/database_update_manifest.cpp b/common/database/database_update_manifest.cpp index 1b2f7bc61..5a3a8f683 100644 --- a/common/database/database_update_manifest.cpp +++ b/common/database/database_update_manifest.cpp @@ -7109,6 +7109,18 @@ ALTER TABLE `npc_types` ALTER TABLE `character_data` CHANGE COLUMN `firstlogon` `ingame` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 AFTER `xtargets`, ADD COLUMN `first_login` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `xtargets`; +)", + .content_schema_update = false + }, + ManifestEntry{ + .version = 9324, + .description = "2025_06_11_player_event_logs_table.sql", + .check = "SHOW CREATE TABLE `player_event_logs`", + .condition = "missing", + .match = "COMPRESS", + .sql = R"( +ALTER TABLE player_event_logs ROW_FORMAT=COMPRESSED; +CREATE INDEX idx_event_type_char_id ON player_event_logs (event_type_id, character_id); )", .content_schema_update = false }, diff --git a/common/events/player_event_logs.cpp b/common/events/player_event_logs.cpp index 41be9f7d1..9288db854 100644 --- a/common/events/player_event_logs.cpp +++ b/common/events/player_event_logs.cpp @@ -195,10 +195,12 @@ void PlayerEventLogs::ProcessBatchQueue() }; // Helper to assign ETL table ID - auto AssignEtlId = [&]( - PlayerEventLogsRepository::PlayerEventLogs &r, - PlayerEvent::EventType type - ) { + + auto AssignEtlId = [&]( + PlayerEventLogsRepository::PlayerEventLogs& r, + PlayerEvent::EventType type + ) + { if (m_etl_settings.contains(type)) { r.etl_table_id = m_etl_settings.at(type).next_id++; } @@ -406,7 +408,6 @@ void PlayerEventLogs::ProcessBatchQueue() auto it = event_processors.find(static_cast(r.event_type_id)); if (it != event_processors.end()) { it->second(r); // Call the appropriate lambda - r.event_data = "{}"; // Clear event data } else { LogPlayerEventsDetail("Non-Implemented ETL routing [{}]", r.event_type_id); diff --git a/common/version.h b/common/version.h index 5a2c1bdff..9e0614f12 100644 --- a/common/version.h +++ b/common/version.h @@ -42,7 +42,7 @@ * Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt */ -#define CURRENT_BINARY_DATABASE_VERSION 9323 +#define CURRENT_BINARY_DATABASE_VERSION 9324 #define CURRENT_BINARY_BOTS_DATABASE_VERSION 9054 #define CUSTOM_BINARY_DATABASE_VERSION 0 From fb4d003e191f2ac725c304769257a4089c2313b2 Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Wed, 25 Jun 2025 12:21:35 -0500 Subject: [PATCH 16/18] [Player Events] Zone Fetch Settings from QS if Enabled (#4915) * [Player Events] Zone Fetch Settings from QS if Enabled * Update zonelist.cpp * Update zoneserver.cpp --- common/events/player_event_logs.cpp | 14 ++++ common/events/player_event_logs.h | 8 ++- ...ase_player_event_log_settings_repository.h | 16 ++++- common/servertalk.h | 4 +- queryserv/worldserver.cpp | 4 ++ queryserv/zonelist.cpp | 9 +++ queryserv/zonelist.h | 7 +- queryserv/zoneserver.cpp | 25 +++++++ queryserv/zoneserver.h | 9 +-- .../generators/repository-generator.pl | 3 +- world/zonelist.cpp | 3 + zone/queryserv.cpp | 68 ++++++++++++++++--- zone/worldserver.cpp | 5 +- 13 files changed, 151 insertions(+), 24 deletions(-) diff --git a/common/events/player_event_logs.cpp b/common/events/player_event_logs.cpp index 9288db854..f39242901 100644 --- a/common/events/player_event_logs.cpp +++ b/common/events/player_event_logs.cpp @@ -536,6 +536,20 @@ std::string PlayerEventLogs::GetDiscordWebhookUrlFromEventType(int32_t event_typ return ""; } +void PlayerEventLogs::LoadPlayerEventSettingsFromQS( + const std::vector &settings +) +{ + for (const auto &e : settings) { + if (e.id >= PlayerEvent::MAX || e.id < 0) { + continue; + } + m_settings[e.id] = e; + } + + LogInfo("Applied [{}] player event log settings from QS", settings.size()); +} + // GM_COMMAND | [x] Implemented Formatter // ZONING | [x] Implemented Formatter // AA_GAIN | [x] Implemented Formatter diff --git a/common/events/player_event_logs.h b/common/events/player_event_logs.h index 8a9ccb202..cbc455666 100644 --- a/common/events/player_event_logs.h +++ b/common/events/player_event_logs.h @@ -73,9 +73,11 @@ public: return BuildPlayerEventPacket(c); } - [[nodiscard]] const PlayerEventLogSettingsRepository::PlayerEventLogSettings *GetSettings() const; - bool IsEventDiscordEnabled(int32_t event_type_id); - std::string GetDiscordWebhookUrlFromEventType(int32_t event_type_id); + [[nodiscard]] const PlayerEventLogSettingsRepository::PlayerEventLogSettings * GetSettings() const; + bool IsEventDiscordEnabled(int32_t event_type_id); + std::string GetDiscordWebhookUrlFromEventType(int32_t event_type_id); + + void LoadPlayerEventSettingsFromQS(const std::vector& settings); static std::string GetDiscordPayloadFromEvent(const PlayerEvent::PlayerEventContainer &e); diff --git a/common/repositories/base/base_player_event_log_settings_repository.h b/common/repositories/base/base_player_event_log_settings_repository.h index 4a2457576..94a53b981 100644 --- a/common/repositories/base/base_player_event_log_settings_repository.h +++ b/common/repositories/base/base_player_event_log_settings_repository.h @@ -15,7 +15,7 @@ #include "../../database.h" #include "../../strings.h" #include - +#include class BasePlayerEventLogSettingsRepository { public: struct PlayerEventLogSettings { @@ -25,6 +25,20 @@ public: int32_t retention_days; int32_t discord_webhook_id; uint8_t etl_enabled; + + // cereal + template + void serialize(Archive &ar) + { + ar( + CEREAL_NVP(id), + CEREAL_NVP(event_name), + CEREAL_NVP(event_enabled), + CEREAL_NVP(retention_days), + CEREAL_NVP(discord_webhook_id), + CEREAL_NVP(etl_enabled) + ); + } }; static std::string PrimaryKey() diff --git a/common/servertalk.h b/common/servertalk.h index 3680ac76d..9985c875c 100644 --- a/common/servertalk.h +++ b/common/servertalk.h @@ -273,8 +273,9 @@ #define ServerOP_WWTaskUpdate 0x4758 // player events -#define ServerOP_QSSendQuery 0x5000 +#define ServerOP_QSSendQuery 0x5000 #define ServerOP_PlayerEvent 0x5100 +#define ServerOP_SendPlayerEventSettings 0x5101 enum { CZUpdateType_Character, @@ -1778,6 +1779,7 @@ struct BazaarPurchaseMessaging_Struct { uint32 id; }; + #pragma pack() #endif diff --git a/queryserv/worldserver.cpp b/queryserv/worldserver.cpp index 948ab931e..e2270c57c 100644 --- a/queryserv/worldserver.cpp +++ b/queryserv/worldserver.cpp @@ -21,10 +21,13 @@ #include #include +#include "zonelist.h" + extern WorldServer worldserver; extern const queryservconfig *Config; extern QSDatabase qs_database; extern LFGuildManager lfguildmanager; +extern ZSList zs_list; WorldServer::WorldServer() { @@ -78,6 +81,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) if (o->type == ServerReload::Type::Logs) { LogSys.LoadLogDatabaseSettings(); player_event_logs.ReloadSettings(); + zs_list.SendPlayerEventLogSettings(); } break; diff --git a/queryserv/zonelist.cpp b/queryserv/zonelist.cpp index d06cfefe8..16ad65371 100644 --- a/queryserv/zonelist.cpp +++ b/queryserv/zonelist.cpp @@ -5,6 +5,8 @@ void ZSList::Add(ZoneServer* zoneserver) { zone_server_list.emplace_back(std::unique_ptr(zoneserver)); zoneserver->SetIsZoneConnected(true); + + zoneserver->SendPlayerEventLogSettings(); } void ZSList::Remove(const std::string &uuid) @@ -18,3 +20,10 @@ void ZSList::Remove(const std::string &uuid) iter++; } } + +void ZSList::SendPlayerEventLogSettings() +{ + for (auto &zs : zone_server_list) { + zs->SendPlayerEventLogSettings(); + } +} diff --git a/queryserv/zonelist.h b/queryserv/zonelist.h index c63d1c211..3fc41676d 100644 --- a/queryserv/zonelist.h +++ b/queryserv/zonelist.h @@ -12,9 +12,10 @@ class ZoneServer; class ZSList { public: - std::list> &GetZsList() { return zone_server_list; } - void Add(ZoneServer *zoneserver); - void Remove(const std::string &uuid); + std::list>& GetZsList() { return zone_server_list; } + void Add(ZoneServer* zoneserver); + void Remove(const std::string& uuid); + void SendPlayerEventLogSettings(); private: std::list> zone_server_list; diff --git a/queryserv/zoneserver.cpp b/queryserv/zoneserver.cpp index 2c3fd92d4..b540cf63f 100644 --- a/queryserv/zoneserver.cpp +++ b/queryserv/zoneserver.cpp @@ -7,6 +7,7 @@ extern DiscordManager discord_manager; + ZoneServer::ZoneServer( std::shared_ptr in_connection, EQ::Net::ConsoleServer *in_console @@ -46,3 +47,27 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } } } + +void ZoneServer::SendPlayerEventLogSettings() +{ + EQ::Net::DynamicPacket dyn_pack; + std::vector settings( + player_event_logs.GetSettings(), + player_event_logs.GetSettings() + PlayerEvent::EventType::MAX + ); + + dyn_pack.PutSerialize(0, settings); + + auto packet_size = sizeof(ServerSendPlayerEvent_Struct) + dyn_pack.Length(); + + auto pack = std::make_unique( + ServerOP_SendPlayerEventSettings, + static_cast(packet_size) + ); + + auto* buf = reinterpret_cast(pack->pBuffer); + buf->cereal_size = static_cast(dyn_pack.Length()); + memcpy(buf->cereal_data, dyn_pack.Data(), dyn_pack.Length()); + + SendPacket(pack.release()); +} diff --git a/queryserv/zoneserver.h b/queryserv/zoneserver.h index db36bd4ff..f4a4b08e6 100644 --- a/queryserv/zoneserver.h +++ b/queryserv/zoneserver.h @@ -16,11 +16,12 @@ class ZoneServer : public WorldTCPConnection { public: ZoneServer(std::shared_ptr in_connection, EQ::Net::ConsoleServer *in_console); ~ZoneServer(); - void SendPacket(ServerPacket *pack) { m_connection->SendPacket(pack); } - void SetIsZoneConnected(bool in) { m_is_zone_connected = in; } - bool GetIsZoneConnected() { return m_is_zone_connected; } - void HandleMessage(uint16 opcode, const EQ::Net::Packet &p); + void SendPacket(ServerPacket *pack) { m_connection->SendPacket(pack); } + void SetIsZoneConnected(bool in) { m_is_zone_connected = in; } + bool GetIsZoneConnected() { return m_is_zone_connected; } + void HandleMessage(uint16 opcode, const EQ::Net::Packet &p); std::string GetUUID() const { return m_connection->GetUUID(); } + void SendPlayerEventLogSettings(); private: std::shared_ptr m_connection{}; diff --git a/utils/scripts/generators/repository-generator.pl b/utils/scripts/generators/repository-generator.pl index 6cb6a137c..3def50506 100644 --- a/utils/scripts/generators/repository-generator.pl +++ b/utils/scripts/generators/repository-generator.pl @@ -114,7 +114,8 @@ if ($requested_table_to_generate ne "all") { my @cereal_enabled_tables = ( "data_buckets", - "player_event_logs" + "player_event_logs", + "player_event_log_settings" ); my $generated_base_repository_files = ""; diff --git a/world/zonelist.cpp b/world/zonelist.cpp index 386f5c781..9394a205e 100644 --- a/world/zonelist.cpp +++ b/world/zonelist.cpp @@ -37,6 +37,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "dynamic_zone_manager.h" #include "ucs.h" #include "clientlist.h" +#include "queryserv.h" #include "../common/repositories/trader_repository.h" #include "../common/repositories/buyer_repository.h" @@ -44,6 +45,7 @@ extern uint32 numzones; extern WebInterfaceList web_interface; extern SharedTaskManager shared_task_manager; extern ClientList client_list; +extern QueryServConnection QSLink; volatile bool UCSServerAvailable_ = false; void CatchSignal(int sig_num); @@ -984,6 +986,7 @@ void ZSList::SendServerReload(ServerReload::Type type, uchar *packet) LogSys.LoadLogDatabaseSettings(); player_event_logs.ReloadSettings(); UCSLink.SendPacket(&pack); + QSLink.SendPacket(&pack); } else if (type == ServerReload::Type::Tasks) { shared_task_manager.LoadTaskData(); } else if (type == ServerReload::Type::DzTemplates) { diff --git a/zone/queryserv.cpp b/zone/queryserv.cpp index c94d88795..77a00b8e2 100644 --- a/zone/queryserv.cpp +++ b/zone/queryserv.cpp @@ -1,12 +1,13 @@ #include "../common/global_define.h" #include "../common/servertalk.h" #include "../common/strings.h" +#include "../common/events/player_event_logs.h" #include "queryserv.h" #include "worldserver.h" extern WorldServer worldserver; -extern QueryServ *QServ; +extern QueryServ* QServ; QueryServ::QueryServ() { @@ -20,18 +21,29 @@ void QueryServ::SendQuery(std::string Query) { auto pack = new ServerPacket(ServerOP_QSSendQuery, Query.length() + 5); pack->WriteUInt32(Query.length()); /* Pack Query String Size so it can be dynamically broken out at queryserv */ - pack->WriteString(Query.c_str()); /* Query */ + pack->WriteString(Query.c_str()); /* Query */ worldserver.SendPacket(pack); safe_delete(pack); } void QueryServ::Connect() { - m_connection = std::make_unique(Config->QSHost, Config->QSPort, false, "Zone", Config->SharedKey); + m_connection = std::make_unique( + Config->QSHost, + Config->QSPort, + false, + "Zone", + Config->SharedKey + ); m_connection->OnMessage(std::bind(&QueryServ::HandleMessage, this, std::placeholders::_1, std::placeholders::_2)); - m_connection->OnConnect([this](EQ::Net::ServertalkClient *client) { + m_connection->OnConnect([this](EQ::Net::ServertalkClient* client) + { m_is_qs_connected = true; - LogInfo("Query Server connection established to [{}] [{}]", client->Handle()->RemoteIP(), client->Handle()->RemotePort()); + LogInfo( + "Query Server connection established to [{}] [{}]", + client->Handle()->RemoteIP(), + client->Handle()->RemotePort() + ); }); LogInfo( @@ -41,7 +53,7 @@ void QueryServ::Connect() ); } -bool QueryServ::SendPacket(ServerPacket *pack) +bool QueryServ::SendPacket(ServerPacket* pack) { if (m_connection.get() == nullptr) { Connect(); @@ -59,14 +71,50 @@ bool QueryServ::SendPacket(ServerPacket *pack) return false; } -void QueryServ::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) +void QueryServ::HandleMessage(uint16 opcode, const EQ::Net::Packet& p) { ServerPacket tpack(opcode, p); - auto pack = &tpack; + auto pack = &tpack; switch (opcode) { - default: { - LogInfo("Unknown ServerOP Received [{}]", opcode); + case ServerOP_SendPlayerEventSettings: + { + if (pack->size < sizeof(ServerSendPlayerEvent_Struct)) { + LogError("ServerOP_SendPlayerEventSettings: packet too small"); + break; + } + + auto* data = reinterpret_cast(pack->pBuffer); + const uint32_t expected_size = sizeof(ServerSendPlayerEvent_Struct) + data->cereal_size; + + if (pack->size < expected_size) { + LogError( + "ServerOP_SendPlayerEventSettings: packet size mismatch, expected {}, got {}", expected_size, + pack->size + ); + break; + } + + std::vector settings; + + try { + EQ::Util::MemoryStreamReader ms(const_cast(data->cereal_data), data->cereal_size); + cereal::BinaryInputArchive ar(ms); + ar(settings); + } + catch (const std::exception& ex) { + LogError("Failed to deserialize PlayerEventLogSettings: {}", ex.what()); + break; + } + + player_event_logs.LoadPlayerEventSettingsFromQS(settings); + LogInfo("Loaded {} PlayerEventLogSettings from queryserv", settings.size()); + break; + } + + default: + { + LogInfo("Unknown ServerOP Received [{}]", opcode); break; } } diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 7bac46737..9cab52849 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -4591,7 +4591,10 @@ void WorldServer::ProcessReload(const ServerReload::Request& request) case ServerReload::Type::Logs: LogSys.LoadLogDatabaseSettings(); - player_event_logs.ReloadSettings(); + // if QS process is enabled, we get settings from QS + if (!RuleB(Logging, PlayerEventsQSProcess)) { + player_event_logs.ReloadSettings(); + } break; case ServerReload::Type::Loot: From 27b5c80c3c73e9d87925029247ac5eb56927d8c5 Mon Sep 17 00:00:00 2001 From: Fryguy Date: Wed, 25 Jun 2025 13:25:35 -0400 Subject: [PATCH 17/18] [Quest API] Lua Client Scoped EnableTitleSets (#4914) Example usage: ```lua client:EnableTitleSet(reward.title_set) ``` --- zone/lua_client.cpp | 6 ++++++ zone/lua_client.h | 1 + 2 files changed, 7 insertions(+) diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index ece5d4594..418492372 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -3584,6 +3584,11 @@ bool Lua_Client::KeyRingRemove(uint32 item_id) return self->KeyRingRemove(item_id); } +void Lua_Client::EnableTitleSet(uint32 title_set) { + Lua_Safe_Call_Void(); + self->EnableTitle(title_set); +} + luabind::scope lua_register_client() { return luabind::class_("Client") .def(luabind::constructor<>()) @@ -3693,6 +3698,7 @@ luabind::scope lua_register_client() { .def("EnableAreaHPRegen", &Lua_Client::EnableAreaHPRegen) .def("EnableAreaManaRegen", &Lua_Client::EnableAreaManaRegen) .def("EnableAreaRegens", &Lua_Client::EnableAreaRegens) + .def("EnableTitleSet", &Lua_Client::EnableTitleSet) .def("EndSharedTask", (void(Lua_Client::*)(void))&Lua_Client::EndSharedTask) .def("EndSharedTask", (void(Lua_Client::*)(bool))&Lua_Client::EndSharedTask) .def("Escape", (void(Lua_Client::*)(void))&Lua_Client::Escape) diff --git a/zone/lua_client.h b/zone/lua_client.h index 0e197f013..932e279c6 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -297,6 +297,7 @@ public: int GetClientVersion(); uint32 GetClientVersionBit(); void SetTitleSuffix(const char *text); + void EnableTitleSet(uint32 title_set); void SetAAPoints(int points); int GetAAPoints(); int GetSpentAA(); From b3b228c26c295fee77174b5cbc6e5f87e9fcbb29 Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Wed, 25 Jun 2025 12:26:38 -0500 Subject: [PATCH 18/18] [Code] PCH Cleanup (#4952) * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update app-pch.h * Update CMakeLists.txt * Split out pch to zone * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update windows-build.ps1 * Update windows-build.ps1 * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt * Update CMakeLists.txt --- common/pch/app-pch.h | 2 ++ zone/CMakeLists.txt | 9 +++------ zone/pch/pch.h | 11 +++++++++++ 3 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 zone/pch/pch.h diff --git a/common/pch/app-pch.h b/common/pch/app-pch.h index 6c1f216aa..aa2244f13 100644 --- a/common/pch/app-pch.h +++ b/common/pch/app-pch.h @@ -1,3 +1,5 @@ +#pragma once + #include "../types.h" #include "../database.h" #include "../strings.h" diff --git a/zone/CMakeLists.txt b/zone/CMakeLists.txt index ecc9d35a8..07ac97cdc 100644 --- a/zone/CMakeLists.txt +++ b/zone/CMakeLists.txt @@ -481,14 +481,11 @@ ADD_EXECUTABLE(zone ${zone_sources} ${zone_headers}) INSTALL(TARGETS zone RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) # precompiled headers -IF (WIN32 AND EQEMU_BUILD_PCH) - TARGET_PRECOMPILE_HEADERS(zone PRIVATE ../common/pch/std-pch.h) +IF (EQEMU_BUILD_PCH) + TARGET_PRECOMPILE_HEADERS(zone PRIVATE ../common/pch/app-pch.h) + TARGET_PRECOMPILE_HEADERS(zone PRIVATE ./pch/pch.h) ENDIF() -# precompiled headers -TARGET_PRECOMPILE_HEADERS(zone PRIVATE ../common/pch/app-pch.h) -TARGET_PRECOMPILE_HEADERS(zone PRIVATE merc.h mob.h npc.h corpse.h doors.h bot.h entity.h client.h zone.h) - ADD_DEFINITIONS(-DZONE) # link lua_zone unity build against luabind diff --git a/zone/pch/pch.h b/zone/pch/pch.h new file mode 100644 index 000000000..a34b69021 --- /dev/null +++ b/zone/pch/pch.h @@ -0,0 +1,11 @@ +#pragma once + +#include "../merc.h" +#include "../mob.h" +#include "../npc.h" +#include "../corpse.h" +#include "../doors.h" +#include "../bot.h" +#include "../entity.h" +#include "../client.h" +#include "../zone.h" \ No newline at end of file