Merge branch 'master' into kinglykrab/databaseupdate-global-to-singleton

This commit is contained in:
Chris Miles
2025-06-25 13:26:38 -05:00
committed by GitHub
135 changed files with 2625 additions and 1625 deletions
+1
View File
@@ -42,6 +42,7 @@ IF(USE_MAP_MMFS)
ENDIF (USE_MAP_MMFS) ENDIF (USE_MAP_MMFS)
IF(MSVC) IF(MSVC)
add_compile_options(/bigobj)
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS) ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
ADD_DEFINITIONS(-DNOMINMAX) ADD_DEFINITIONS(-DNOMINMAX)
ADD_DEFINITIONS(-DCRASH_LOGGING) ADD_DEFINITIONS(-DCRASH_LOGGING)
+8 -9
View File
@@ -5,7 +5,7 @@
</p> </p>
<p align="center"> <p align="center">
<b>EverQuest Emulator (EQEmu) - A Fan-Made Project Honoring the Legendary MMORPG</b> <b>EQEmulator - A Fan-Made Project Honoring a Legendary MMORPG</b>
</p> </p>
<p align="center"> <p align="center">
@@ -26,19 +26,19 @@
*** ***
<p align="center"> <p align="center">
EQEmulator is a <b>passion-driven</b>, <b>open source server emulator</b> project dedicated to preserving and celebrating the groundbreaking world of <b>EverQuest</b>, the massively multiplayer online role-playing game originally developed by <b>Verant Interactive</b> and <b>Sony Online Entertainment (now Daybreak Game Company)</b>. EQEmulator is a <b>passion-driven</b>, <b>open source server emulator</b> project dedicated to preserving and celebrating the legacy of a groundbreaking classic MMORPG.
</p> </p>
<p align="center"> <p align="center">
For over two decades and continuing, EQEmulator has served as a <strong>fan tribute</strong>, providing tools and technology that allow players to explore, customize, and experience EverQuests iconic gameplay in new ways. This project exists solely out of <strong>deep admiration</strong> for the original developers, artists, designers, and visionaries who created one of the most influential online worlds of all time. For over two decades and continuing, EQEmulator has served as a <strong>fan tribute</strong>, providing tools and technology that allow players to explore, customize, and experience the legendary game's iconic gameplay in new ways. This project exists solely out of <strong>deep admiration</strong> for the original developers, artists, designers, and visionaries who created one of the most influential online worlds of all time.
</p> </p>
<p align="center"> <p align="center">
We do not claim ownership of EverQuest or its assets. <strong>All credit and respect belong to the original creators and Daybreak Game Company</strong>, whose work continues to inspire generations of players and developers alike. We do not claim ownership of the original game or its assets. <strong>All credit and respect belong to the original creators and Daybreak Game Company</strong>, whose work continues to inspire generations of players and developers alike.
</p> </p>
<p align="center"> <p align="center">
EQEmulator has for over 20 years and always will be a <strong>fan-based, non-commercial open-source effort</strong> made by players, for players—preserving the legacy of EverQuest while empowering community-driven creativity, learning and joy that the game and its creators has so strongly inspired in us all. EQEmulator has for over 20 years and always will be a <strong>fan-based, non-commercial open-source effort</strong> made by players, for players—preserving the legacy of the game while empowering community-driven creativity, learning and joy that the game and its creators has so strongly inspired in us all.
</p> </p>
*** ***
@@ -47,7 +47,7 @@ EQEmulator has for over 20 years and always will be a <strong>fan-based, non-com
Technical Overview & Reverse Engineering Effort Technical Overview & Reverse Engineering Effort
</h1> </h1>
<p align="center">EQEmulator represents <strong>over two decades of collaborative reverse engineering</strong>, rebuilding the EverQuest server from the ground up without access to the original source code. This effort was achieved entirely through <strong>community-driven analysis, network protocol decoding, and in-game behavioral research</strong>.</p> <p align="center">EQEmulator represents <strong>over two decades of collaborative reverse engineering</strong>, building the server from the ground up without access to the original source code. This effort was achieved entirely through <strong>community-driven analysis, network protocol decoding, and in-game behavioral research</strong>.</p>
<h1 align="center"> <h1 align="center">
💡 How We Did It 💡 How We Did It
@@ -104,10 +104,10 @@ Every system, packet, opcode, and game mechanic has been reconstructed through c
🚀 Why It Matters 🚀 Why It Matters
</h1> </h1>
<p align="center">🧬 EQEmulator stands as a <strong>technical preservation project</strong>, ensuring that the magic of classic and custom EverQuest servers lives on for future generations of players, tinkerers, and game designers. <p align="center">🧬 EQEmulator stands as a <strong>technical preservation project</strong>, ensuring that the magic of classic and custom servers lives on for future generations of players, tinkerers, and game designers.
</p> </p>
> We humbly acknowledge and thank the original developers at **Verant Interactive** and **Sony Online Entertainment (now Daybreak Game Company)** for creating one of the most influential online experiences in gaming history. > We humbly acknowledge and thank the original developers for creating one of the most influential online experiences in gaming history.
<h1 align="center"> <h1 align="center">
🧑‍💻🖥️ Supported Clients 🧑‍💻🖥️ Supported Clients
@@ -148,4 +148,3 @@ If you want to set up your own EQEmulator server, please refer to the current [s
<a href="https://github.com/EQEmu/server/graphs/contributors"> <a href="https://github.com/EQEmu/server/graphs/contributors">
<img src="https://contributors-img.firebaseapp.com/image?repo=EQEmu/server" /> <img src="https://contributors-img.firebaseapp.com/image?repo=EQEmu/server" />
</a> </a>
+6 -8
View File
@@ -40,8 +40,6 @@
EQEmuLogSys LogSys; EQEmuLogSys LogSys;
WorldContentService content_service; WorldContentService content_service;
ZoneStore zone_store;
PathManager path;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
EvolvingItemsManager evolving_items_manager; EvolvingItemsManager evolving_items_manager;
@@ -56,7 +54,7 @@ int main(int argc, char **argv)
LogSys.LoadLogSettingsDefaults(); LogSys.LoadLogSettingsDefaults();
set_exception_handler(); set_exception_handler();
path.LoadPaths(); PathManager::Instance()->Init();
LogInfo("Client Files Export Utility"); LogInfo("Client Files Export Utility");
if (!EQEmuConfig::LoadConfig()) { if (!EQEmuConfig::LoadConfig()) {
@@ -100,7 +98,7 @@ int main(int argc, char **argv)
} }
LogSys.SetDatabase(&database) LogSys.SetDatabase(&database)
->SetLogPath(path.GetLogPath()) ->SetLogPath(PathManager::Instance()->GetLogPath())
->LoadLogDatabaseSettings() ->LoadLogDatabaseSettings()
->StartFileLogs(); ->StartFileLogs();
@@ -136,7 +134,7 @@ int main(int argc, char **argv)
void ExportSpells(SharedDatabase* db) 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()) { if (!file || !file.is_open()) {
LogError("Unable to open export/spells_us.txt to write, skipping."); LogError("Unable to open export/spells_us.txt to write, skipping.");
return; return;
@@ -155,7 +153,7 @@ void ExportSpells(SharedDatabase* db)
void ExportSkillCaps(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()) { if (!file || !file.is_open()) {
LogError("Unable to open export/SkillCaps.txt to write, skipping."); LogError("Unable to open export/SkillCaps.txt to write, skipping.");
return; return;
@@ -174,7 +172,7 @@ void ExportSkillCaps(SharedDatabase* db)
void ExportBaseData(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()) { if (!file || !file.is_open()) {
LogError("Unable to open export/BaseData.txt to write, skipping."); LogError("Unable to open export/BaseData.txt to write, skipping.");
return; return;
@@ -193,7 +191,7 @@ void ExportBaseData(SharedDatabase *db)
void ExportDBStrings(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()) { if (!file || !file.is_open()) {
LogError("Unable to open export/dbstr_us.txt to write, skipping."); LogError("Unable to open export/dbstr_us.txt to write, skipping.");
return; return;
+6 -8
View File
@@ -34,8 +34,6 @@
EQEmuLogSys LogSys; EQEmuLogSys LogSys;
WorldContentService content_service; WorldContentService content_service;
ZoneStore zone_store;
PathManager path;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
EvolvingItemsManager evolving_items_manager; EvolvingItemsManager evolving_items_manager;
@@ -49,7 +47,7 @@ int main(int argc, char **argv) {
LogSys.LoadLogSettingsDefaults(); LogSys.LoadLogSettingsDefaults();
set_exception_handler(); set_exception_handler();
path.LoadPaths(); PathManager::Instance()->Init();
LogInfo("Client Files Import Utility"); LogInfo("Client Files Import Utility");
if(!EQEmuConfig::LoadConfig()) { if(!EQEmuConfig::LoadConfig()) {
@@ -93,7 +91,7 @@ int main(int argc, char **argv) {
} }
LogSys.SetDatabase(&database) LogSys.SetDatabase(&database)
->SetLogPath(path.GetLogPath()) ->SetLogPath(PathManager::Instance()->GetLogPath())
->LoadLogDatabaseSettings() ->LoadLogDatabaseSettings()
->StartFileLogs(); ->StartFileLogs();
@@ -138,7 +136,7 @@ bool IsStringField(int i) {
void ImportSpells(SharedDatabase *db) { void ImportSpells(SharedDatabase *db) {
LogInfo("Importing Spells"); 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"); FILE *f = fopen(file.c_str(), "r");
if(!f) { if(!f) {
LogError("Unable to open {} to read, skipping.", file); LogError("Unable to open {} to read, skipping.", file);
@@ -228,7 +226,7 @@ void ImportSpells(SharedDatabase *db) {
void ImportSkillCaps(SharedDatabase *db) { void ImportSkillCaps(SharedDatabase *db) {
LogInfo("Importing Skill Caps"); 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"); FILE *f = fopen(file.c_str(), "r");
if(!f) { if(!f) {
LogError("Unable to open {} to read, skipping.", file); LogError("Unable to open {} to read, skipping.", file);
@@ -265,7 +263,7 @@ void ImportBaseData(SharedDatabase *db)
{ {
LogInfo("Importing Base Data"); 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); const auto& file_contents = File::GetContents(file_name);
if (!file_contents.error.empty()) { if (!file_contents.error.empty()) {
@@ -305,7 +303,7 @@ void ImportBaseData(SharedDatabase *db)
void ImportDBStrings(SharedDatabase *db) { void ImportDBStrings(SharedDatabase *db) {
LogInfo("Importing DB Strings"); 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"); FILE *f = fopen(file.c_str(), "r");
if(!f) { if(!f) {
LogError("Unable to open {} to read, skipping.", file); LogError("Unable to open {} to read, skipping.", file);
+1 -1
View File
@@ -842,7 +842,7 @@ IF (UNIX)
ENDIF (UNIX) ENDIF (UNIX)
IF (WIN32 AND EQEMU_BUILD_PCH) IF (WIN32 AND EQEMU_BUILD_PCH)
TARGET_PRECOMPILE_HEADERS(common PRIVATE pch/pch.h) TARGET_PRECOMPILE_HEADERS(common PRIVATE pch/std-pch.h)
ENDIF () ENDIF ()
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
+2 -2
View File
@@ -185,7 +185,7 @@ void WorldContentService::ReloadContentFlags()
SetContentFlags(set_content_flags); SetContentFlags(set_content_flags);
LoadStaticGlobalZoneInstances(); LoadStaticGlobalZoneInstances();
zone_store.LoadZones(*m_content_database); ZoneStore::Instance()->LoadZones(*m_content_database);
} }
Database *WorldContentService::GetDatabase() const 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 // 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) 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) { for (auto &i: m_zone_static_instances) {
if ( if (
z.zoneidnumber == zone_id && z.zoneidnumber == zone_id &&
+81 -7
View File
@@ -19,6 +19,37 @@ extern WorldDatabase database;
#error "You must define either ZONE or WORLD" #error "You must define either ZONE or WORLD"
#endif #endif
// Key: compound cache key (e.g., account_id|character_id|zone_id|instance_id|top_key|full_key)
// Value: resolved DataBuckets with extracted nested value
static std::unordered_map<std::string, DataBucketsRepository::DataBuckets> g_nested_bucket_cache;
static std::string MakeNestedCacheKey(const DataBucketKey &k, const std::string &full_key) {
return fmt::format(
"account_id:{}|character_id:{}|npc_id:{}|bot_id:{}|zone_id:{}|instance_id:{}|top_key:{}|full_key:{}",
k.account_id, k.character_id, k.npc_id, k.bot_id, k.zone_id, k.instance_id,
Strings::Split(full_key, NESTED_KEY_DELIMITER).front(),
full_key
);
}
static std::string MakeNestedCacheKeyPrefix(const DataBucketKey &k, const std::string &top_key) {
return fmt::format(
"account_id:{}|character_id:{}|npc_id:{}|bot_id:{}|zone_id:{}|instance_id:{}|top_key:{}|",
k.account_id, k.character_id, k.npc_id, k.bot_id, k.zone_id, k.instance_id, top_key
);
}
static void InvalidateNestedCacheForKey(const DataBucketKey &k, const std::string &top_key) {
std::string prefix = MakeNestedCacheKeyPrefix(k, top_key);
for (auto it = g_nested_bucket_cache.begin(); it != g_nested_bucket_cache.end(); ) {
if (it->first.find(prefix) == 0) {
it = g_nested_bucket_cache.erase(it);
} else {
++it;
}
}
}
void DataBucket::SetData(const std::string &bucket_key, const std::string &bucket_value, std::string expires_time) void DataBucket::SetData(const std::string &bucket_key, const std::string &bucket_value, std::string expires_time)
{ {
auto k = DataBucketKey{ auto k = DataBucketKey{
@@ -136,6 +167,15 @@ void DataBucket::SetData(const DataBucketKey &k_)
// Serialize JSON back to string // Serialize JSON back to string
b.value = json_value.dump(); b.value = json_value.dump();
b.key_ = top_key; // Use the top-level key b.key_ = top_key; // Use the top-level key
if (CanCache(k_)) {
InvalidateNestedCacheForKey(k_, top_key);
std::string nested_cache_key = MakeNestedCacheKey(k_, k_.key);
auto extracted = ExtractNestedValue(b, k_.key);
if (extracted.id > 0) {
g_nested_bucket_cache[nested_cache_key] = extracted;
}
}
} }
if (bucket_id) { if (bucket_id) {
@@ -251,12 +291,27 @@ DataBucketsRepository::DataBuckets DataBucket::GetData(const DataBucketKey &k_,
LogDataBuckets("Returning key [{}] value [{}] from cache", e.key_, e.value); LogDataBuckets("Returning key [{}] value [{}] from cache", e.key_, e.value);
if (is_nested_key && !k_.key.empty()) { if (is_nested_key && !k_.key.empty()) {
return ExtractNestedValue(e, k_.key); std::string nested_cache_key = MakeNestedCacheKey(k_, k.key);
auto it = g_nested_bucket_cache.find(nested_cache_key);
if (it != g_nested_bucket_cache.end()) {
LogDataBucketsDetail("Nested cache hit for key [{}]", nested_cache_key);
return it->second;
}
auto extracted = ExtractNestedValue(e, k_.key);
if (extracted.id > 0) {
g_nested_bucket_cache[nested_cache_key] = extracted;
}
return extracted;
} }
return e; return e;
} }
} }
// if we can cache its assumed we didn't load this into the cache so we should not return a miss
return DataBucketsRepository::NewEntity(); // Not found in cache
} }
// Fetch the value from the database // Fetch the value from the database
@@ -315,23 +370,42 @@ DataBucketsRepository::DataBuckets DataBucket::GetData(const DataBucketKey &k_,
} }
// Add the value to the cache if it doesn't exist // Add the value to the cache if it doesn't exist
// If cacheable and not found in cache, short-circuit and assume it doesn't exist
if (can_cache) { if (can_cache) {
bool has_cache = false; bool found_in_cache = false;
for (const auto &e : g_data_bucket_cache) { for (const auto &e : g_data_bucket_cache) {
if (e.id == bucket.id) { if (CheckBucketMatch(e, k)) {
has_cache = true; found_in_cache = true;
break; break;
} }
} }
if (!has_cache) { if (!found_in_cache) {
g_data_bucket_cache.emplace_back(bucket); LogDataBuckets("Cache miss for key [{}] - skipping DB due to CanCache", k.key);
return DataBucketsRepository::NewEntity();
} }
} }
// Handle nested key extraction // Handle nested key extraction
if (is_nested_key && !k_.key.empty()) { if (is_nested_key && !k_.key.empty()) {
return ExtractNestedValue(bucket, k_.key); if (CanCache(k_)) {
std::string nested_cache_key = MakeNestedCacheKey(k_, k.key);
auto it = g_nested_bucket_cache.find(nested_cache_key);
if (it != g_nested_bucket_cache.end()) {
LogDataBucketsDetail("Nested cache hit for key [{}]", nested_cache_key);
return it->second;
}
auto extracted = ExtractNestedValue(bucket, k_.key);
if (extracted.id > 0) {
g_nested_bucket_cache[nested_cache_key] = extracted;
}
return extracted;
} else {
// Not cacheable, just extract and return
return ExtractNestedValue(bucket, k_.key);
}
} }
return bucket; return bucket;
+14
View File
@@ -708,6 +708,20 @@ const std::string Database::GetNPCNameByID(uint32 npc_id)
return e.id ? e.name : std::string(); return e.id ? e.name : std::string();
} }
template<typename InputIterator, typename OutputIterator>
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 std::string Database::GetCleanNPCNameByID(uint32 npc_id)
{ {
const auto& e = NpcTypesRepository::FindOne(*this, npc_id); const auto& e = NpcTypesRepository::FindOne(*this, npc_id);
@@ -7109,6 +7109,18 @@ ALTER TABLE `npc_types`
ALTER TABLE `character_data` ALTER TABLE `character_data`
CHANGE COLUMN `firstlogon` `ingame` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 AFTER `xtargets`, 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`; 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 .content_schema_update = false
}, },
-1
View File
@@ -4,7 +4,6 @@
#include <string> #include <string>
#include "../types.h" #include "../types.h"
#include "../http/httplib.h"
#include "../repositories/player_event_logs_repository.h" #include "../repositories/player_event_logs_repository.h"
#include "../events/player_events.h" #include "../events/player_events.h"
+2 -2
View File
@@ -436,11 +436,11 @@ void EQEmuConfig::CheckUcsConfigConversion()
LogInfo("Migrating old [eqemu_config] UCS configuration to new configuration"); LogInfo("Migrating old [eqemu_config] UCS configuration to new configuration");
std::string config_file_path = std::filesystem::path{ std::string config_file_path = std::filesystem::path{
path.GetServerPath() + "/eqemu_config.json" PathManager::Instance()->GetServerPath() + "/eqemu_config.json"
}.string(); }.string();
std::string config_file_bak_path = std::filesystem::path{ 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(); }.string();
// copy eqemu_config.json to eqemu_config.json.bak // copy eqemu_config.json to eqemu_config.json.bak
+1 -1
View File
@@ -191,7 +191,7 @@ class EQEmuConfig
std::string file = fmt::format( std::string file = fmt::format(
"{}/{}", "{}/{}",
(file_path.empty() ? path.GetServerPath() : file_path), (file_path.empty() ? PathManager::Instance()->GetServerPath() : file_path),
EQEmuConfig::ConfigFile EQEmuConfig::ConfigFile
); );
+3 -3
View File
@@ -537,9 +537,9 @@ void EQEmuLogSys::StartFileLogs(const std::string &log_name)
{ {
EQEmuLogSys::CloseFileLogs(); EQEmuLogSys::CloseFileLogs();
if (!File::Exists(path.GetLogPath())) { if (!File::Exists(PathManager::Instance()->GetLogPath())) {
LogInfo("Logs directory not found, creating [{}]", path.GetLogPath()); LogInfo("Logs directory not found, creating [{}]", PathManager::Instance()->GetLogPath());
File::Makedir(path.GetLogPath()); File::Makedir(PathManager::Instance()->GetLogPath());
} }
/** /**
@@ -716,7 +716,7 @@ std::string PlayerEventDiscordFormatter::FormatNPCHandinEvent(
); );
for (int i = 0; i < h.augment_ids.size(); i++) { 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); const uint8 slot_id = (i + 1);
handin_items_info += fmt::format( handin_items_info += fmt::format(
"Augment {}: {} ({})\n", "Augment {}: {} ({})\n",
@@ -741,7 +741,7 @@ std::string PlayerEventDiscordFormatter::FormatNPCHandinEvent(
); );
for (int i = 0; i < r.augment_ids.size(); i++) { 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); const uint8 slot_id = (i + 1);
return_items_info += fmt::format( return_items_info += fmt::format(
"Augment {}: {} ({})\n", "Augment {}: {} ({})\n",
+20 -5
View File
@@ -195,10 +195,12 @@ void PlayerEventLogs::ProcessBatchQueue()
}; };
// Helper to assign ETL table ID // Helper to assign ETL table ID
auto AssignEtlId = [&](
PlayerEventLogsRepository::PlayerEventLogs &r, auto AssignEtlId = [&](
PlayerEvent::EventType type PlayerEventLogsRepository::PlayerEventLogs& r,
) { PlayerEvent::EventType type
)
{
if (m_etl_settings.contains(type)) { if (m_etl_settings.contains(type)) {
r.etl_table_id = m_etl_settings.at(type).next_id++; 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<PlayerEvent::EventType>(r.event_type_id)); auto it = event_processors.find(static_cast<PlayerEvent::EventType>(r.event_type_id));
if (it != event_processors.end()) { if (it != event_processors.end()) {
it->second(r); // Call the appropriate lambda it->second(r); // Call the appropriate lambda
r.event_data = "{}"; // Clear event data
} }
else { else {
LogPlayerEventsDetail("Non-Implemented ETL routing [{}]", r.event_type_id); LogPlayerEventsDetail("Non-Implemented ETL routing [{}]", r.event_type_id);
@@ -535,6 +536,20 @@ std::string PlayerEventLogs::GetDiscordWebhookUrlFromEventType(int32_t event_typ
return ""; return "";
} }
void PlayerEventLogs::LoadPlayerEventSettingsFromQS(
const std::vector<PlayerEventLogSettingsRepository::PlayerEventLogSettings> &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 // GM_COMMAND | [x] Implemented Formatter
// ZONING | [x] Implemented Formatter // ZONING | [x] Implemented Formatter
// AA_GAIN | [x] Implemented Formatter // AA_GAIN | [x] Implemented Formatter
+5 -3
View File
@@ -73,9 +73,11 @@ public:
return BuildPlayerEventPacket(c); return BuildPlayerEventPacket(c);
} }
[[nodiscard]] const PlayerEventLogSettingsRepository::PlayerEventLogSettings *GetSettings() const; [[nodiscard]] const PlayerEventLogSettingsRepository::PlayerEventLogSettings * GetSettings() const;
bool IsEventDiscordEnabled(int32_t event_type_id); bool IsEventDiscordEnabled(int32_t event_type_id);
std::string GetDiscordWebhookUrlFromEventType(int32_t event_type_id); std::string GetDiscordWebhookUrlFromEventType(int32_t event_type_id);
void LoadPlayerEventSettingsFromQS(const std::vector<PlayerEventLogSettingsRepository::PlayerEventLogSettings>& settings);
static std::string GetDiscordPayloadFromEvent(const PlayerEvent::PlayerEventContainer &e); static std::string GetDiscordPayloadFromEvent(const PlayerEvent::PlayerEventContainer &e);
+547 -114
View File
@@ -7,8 +7,16 @@
#include "../rulesys.h" #include "../rulesys.h"
#include "../repositories/player_event_logs_repository.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 { enum EventType {
GM_COMMAND = 1, GM_COMMAND = 1,
ZONING, ZONING,
@@ -26,10 +34,10 @@ namespace PlayerEvent {
LOOT_ITEM, LOOT_ITEM,
MERCHANT_PURCHASE, MERCHANT_PURCHASE,
MERCHANT_SELL, MERCHANT_SELL,
GROUP_JOIN, // unimplemented GROUP_JOIN, // unimplemented
GROUP_LEAVE, // unimplemented GROUP_LEAVE, // unimplemented
RAID_JOIN, // unimplemented RAID_JOIN, // unimplemented
RAID_LEAVE, // unimplemented RAID_LEAVE, // unimplemented
GROUNDSPAWN_PICKUP, GROUNDSPAWN_PICKUP,
NPC_HANDIN, NPC_HANDIN,
SKILL_UP, SKILL_UP,
@@ -45,12 +53,12 @@ namespace PlayerEvent {
COMBINE_SUCCESS, COMBINE_SUCCESS,
DROPPED_ITEM, DROPPED_ITEM,
SPLIT_MONEY, SPLIT_MONEY,
DZ_JOIN, // unimplemented DZ_JOIN, // unimplemented
DZ_LEAVE, // unimplemented DZ_LEAVE, // unimplemented
TRADER_PURCHASE, TRADER_PURCHASE,
TRADER_SELL, TRADER_SELL,
BANDOLIER_CREATE, // unimplemented BANDOLIER_CREATE, // unimplemented
BANDOLIER_SWAP, // unimplemented BANDOLIER_SWAP, // unimplemented
DISCOVER_ITEM, DISCOVER_ITEM,
POSSIBLE_HACK, POSSIBLE_HACK,
KILLED_NPC, KILLED_NPC,
@@ -76,7 +84,7 @@ namespace PlayerEvent {
// If event is unimplemented just tag (Unimplemented) in the name // If event is unimplemented just tag (Unimplemented) in the name
// Events don't get saved to the database if unimplemented or deprecated // Events don't get saved to the database if unimplemented or deprecated
// Events tagged as deprecated will get automatically removed // Events tagged as deprecated will get automatically removed
static const char *EventName[EventType::MAX] = { static const char* EventName[EventType::MAX] = {
"None", "None",
"GM Command", "GM Command",
"Zoning", "Zoning",
@@ -156,8 +164,8 @@ namespace PlayerEvent {
float heading; float heading;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(account_id), CEREAL_NVP(account_id),
@@ -185,8 +193,8 @@ namespace PlayerEvent {
PlayerEventLogsRepository::PlayerEventLogs player_event_log; PlayerEventLogsRepository::PlayerEventLogs player_event_log;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(player_event), CEREAL_NVP(player_event),
@@ -200,8 +208,8 @@ namespace PlayerEvent {
std::string noop; // noop, gets discard upstream std::string noop; // noop, gets discard upstream
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(noop) CEREAL_NVP(noop)
@@ -224,8 +232,38 @@ namespace PlayerEvent {
bool attuned; bool attuned;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -284,8 +322,37 @@ namespace PlayerEvent {
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) 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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(slot), CEREAL_NVP(slot),
@@ -295,7 +362,7 @@ namespace PlayerEvent {
CEREAL_NVP(augment_2_id), CEREAL_NVP(augment_2_id),
CEREAL_NVP(augment_2_name), CEREAL_NVP(augment_2_name),
CEREAL_NVP(augment_3_id), CEREAL_NVP(augment_3_id),
CEREAL_NVP(augment_1_name), CEREAL_NVP(augment_3_name),
CEREAL_NVP(augment_4_id), CEREAL_NVP(augment_4_id),
CEREAL_NVP(augment_4_name), CEREAL_NVP(augment_4_name),
CEREAL_NVP(augment_5_id), CEREAL_NVP(augment_5_id),
@@ -319,8 +386,8 @@ namespace PlayerEvent {
int32 copper; int32 copper;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(platinum), CEREAL_NVP(platinum),
@@ -342,8 +409,8 @@ namespace PlayerEvent {
std::vector<TradeItemEntry> character_2_give_items; std::vector<TradeItemEntry> character_2_give_items;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(character_1_id), CEREAL_NVP(character_1_id),
@@ -363,8 +430,8 @@ namespace PlayerEvent {
std::string target; std::string target;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(message), CEREAL_NVP(message),
@@ -386,8 +453,8 @@ namespace PlayerEvent {
int32 to_instance_version; int32 to_instance_version;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(from_zone_long_name), CEREAL_NVP(from_zone_long_name),
@@ -408,8 +475,8 @@ namespace PlayerEvent {
uint32 aa_gained; uint32 aa_gained;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar(CEREAL_NVP(aa_gained)); ar(CEREAL_NVP(aa_gained));
} }
@@ -422,8 +489,8 @@ namespace PlayerEvent {
int32 aa_next_id; int32 aa_next_id;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(aa_id), CEREAL_NVP(aa_id),
@@ -444,9 +511,34 @@ namespace PlayerEvent {
uint32 augment_6_id; uint32 augment_6_id;
std::string item_name; std::string item_name;
// cereal template <class Archive>
template<class Archive> void serialize(Archive& ar)
void serialize(Archive &ar) {
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -471,9 +563,34 @@ namespace PlayerEvent {
uint32 augment_6_id; uint32 augment_6_id;
std::string item_name; std::string item_name;
// cereal template <class Archive>
template<class Archive> void serialize(Archive& ar)
void serialize(Archive &ar) {
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -501,9 +618,41 @@ namespace PlayerEvent {
bool attuned; bool attuned;
std::string reason; std::string reason;
// cereal template <class Archive>
template<class Archive> void serialize(Archive& ar)
void serialize(Archive &ar) {
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -521,14 +670,15 @@ namespace PlayerEvent {
} }
}; };
struct LevelGainedEvent { struct LevelGainedEvent {
uint32 from_level; uint32 from_level;
uint8 to_level; uint8 to_level;
int levels_gained; int levels_gained;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(from_level), CEREAL_NVP(from_level),
@@ -544,8 +694,8 @@ namespace PlayerEvent {
int levels_lost; int levels_lost;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(from_level), CEREAL_NVP(from_level),
@@ -569,8 +719,41 @@ namespace PlayerEvent {
std::string corpse_name; std::string corpse_name;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -601,8 +784,8 @@ namespace PlayerEvent {
uint64 player_currency_balance; uint64 player_currency_balance;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(npc_id), CEREAL_NVP(npc_id),
@@ -632,8 +815,8 @@ namespace PlayerEvent {
uint64 player_currency_balance; uint64 player_currency_balance;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(npc_id), CEREAL_NVP(npc_id),
@@ -657,8 +840,8 @@ namespace PlayerEvent {
std::string against_who; std::string against_who;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(skill_id), CEREAL_NVP(skill_id),
@@ -676,8 +859,8 @@ namespace PlayerEvent {
std::string task_name; std::string task_name;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(npc_id), CEREAL_NVP(npc_id),
@@ -695,8 +878,8 @@ namespace PlayerEvent {
uint32 done_count; uint32 done_count;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(task_id), CEREAL_NVP(task_id),
@@ -714,8 +897,8 @@ namespace PlayerEvent {
uint32 done_count; uint32 done_count;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(task_id), CEREAL_NVP(task_id),
@@ -731,8 +914,8 @@ namespace PlayerEvent {
std::string item_name; std::string item_name;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -746,8 +929,8 @@ namespace PlayerEvent {
std::string target; std::string target;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(message), CEREAL_NVP(message),
@@ -762,8 +945,8 @@ namespace PlayerEvent {
uint32 spell_id; uint32 spell_id;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(resurrecter_name), CEREAL_NVP(resurrecter_name),
@@ -780,8 +963,8 @@ namespace PlayerEvent {
uint32 tradeskill_id; uint32 tradeskill_id;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(recipe_id), CEREAL_NVP(recipe_id),
@@ -805,8 +988,38 @@ namespace PlayerEvent {
uint32 charges; uint32 charges;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -833,8 +1046,8 @@ namespace PlayerEvent {
std::string skill_name; std::string skill_name;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(killer_id), CEREAL_NVP(killer_id),
@@ -856,8 +1069,8 @@ namespace PlayerEvent {
uint64 player_money_balance; uint64 player_money_balance;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(copper), CEREAL_NVP(copper),
@@ -886,10 +1099,44 @@ namespace PlayerEvent {
uint64 total_cost; uint64 total_cost;
uint64 player_money_balance; uint64 player_money_balance;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -928,10 +1175,43 @@ namespace PlayerEvent {
uint64 total_cost; uint64 total_cost;
uint64 player_money_balance; uint64 player_money_balance;
template <class Archive>
void serialize(Archive& ar)
{
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
// cereal template <class Archive>
template<class Archive> void save(Archive& ar) const
void serialize(Archive &ar) {
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -958,8 +1238,8 @@ namespace PlayerEvent {
std::string item_name; std::string item_name;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -978,8 +1258,8 @@ namespace PlayerEvent {
bool attuned; bool attuned;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -1000,8 +1280,8 @@ namespace PlayerEvent {
uint32 platinum; uint32 platinum;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(copper), CEREAL_NVP(copper),
@@ -1022,8 +1302,8 @@ namespace PlayerEvent {
bool is_quest_handin; bool is_quest_handin;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(npc_id), CEREAL_NVP(npc_id),
@@ -1041,8 +1321,8 @@ namespace PlayerEvent {
std::string message; std::string message;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(message) CEREAL_NVP(message)
@@ -1058,8 +1338,8 @@ namespace PlayerEvent {
uint64 total_heal_per_second_taken; uint64 total_heal_per_second_taken;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(npc_id), CEREAL_NVP(npc_id),
@@ -1083,9 +1363,36 @@ namespace PlayerEvent {
bool attuned; bool attuned;
uint32 guild_favor; uint32 guild_favor;
// cereal template <class Archive>
template<class Archive> void serialize(Archive& ar)
void serialize(Archive &ar) {
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -1095,6 +1402,8 @@ namespace PlayerEvent {
CEREAL_NVP(augment_4_id), CEREAL_NVP(augment_4_id),
CEREAL_NVP(augment_5_id), CEREAL_NVP(augment_5_id),
CEREAL_NVP(augment_6_id), CEREAL_NVP(augment_6_id),
CEREAL_NVP(charges),
CEREAL_NVP(attuned),
CEREAL_NVP(guild_favor) CEREAL_NVP(guild_favor)
); );
} }
@@ -1105,8 +1414,8 @@ namespace PlayerEvent {
uint32 guild_favor; uint32 guild_favor;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(plat), CEREAL_NVP(plat),
@@ -1127,9 +1436,38 @@ namespace PlayerEvent {
std::string from_player_name; std::string from_player_name;
uint32 sent_date; uint32 sent_date;
// cereal template <class Archive>
template<class Archive> void serialize(Archive& ar)
void serialize(Archive &ar) {
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -1160,9 +1498,40 @@ namespace PlayerEvent {
std::string to_player_name; std::string to_player_name;
uint32 sent_date; uint32 sent_date;
// cereal template <class Archive>
template<class Archive> void serialize(Archive& ar)
void serialize(Archive &ar) {
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -1195,9 +1564,40 @@ namespace PlayerEvent {
std::string from_name; std::string from_name;
std::string note; std::string note;
// cereal template <class Archive>
template<class Archive> void serialize(Archive& ar)
void serialize(Archive &ar) {
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(item_id), CEREAL_NVP(item_id),
@@ -1226,8 +1626,8 @@ namespace PlayerEvent {
std::string seller_name; std::string seller_name;
uint64 total_cost; uint64 total_cost;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(status), CEREAL_NVP(status),
@@ -1251,8 +1651,8 @@ namespace PlayerEvent {
double progression; double progression;
// cereal // cereal
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(status), CEREAL_NVP(status),
@@ -1273,8 +1673,8 @@ namespace PlayerEvent {
uint32 type; uint32 type;
std::string message; std::string message;
template<class Archive> template <class Archive>
void serialize(Archive &ar) void serialize(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(to), CEREAL_NVP(to),
@@ -1300,9 +1700,41 @@ namespace PlayerEvent {
uint32 quantity; uint32 quantity;
uint32 permission; uint32 permission;
// cereal template <class Archive>
template<class Archive> void serialize(Archive& ar)
void serialize(Archive &ar) {
if constexpr (Archive::is_saving::value) {
save(ar);
}
else {
load(ar);
}
}
template <class Archive>
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 <class Archive>
void load(Archive& ar)
{ {
ar( ar(
CEREAL_NVP(char_id), CEREAL_NVP(char_id),
@@ -1314,8 +1746,9 @@ namespace PlayerEvent {
CEREAL_NVP(aug_slot_four), CEREAL_NVP(aug_slot_four),
CEREAL_NVP(aug_slot_five), CEREAL_NVP(aug_slot_five),
CEREAL_NVP(aug_slot_six), CEREAL_NVP(aug_slot_six),
CEREAL_NVP(quantity) CEREAL_NVP(quantity),
); CEREAL_NVP(permission)
);
} }
}; };
} }
+1 -1
View File
@@ -55,7 +55,7 @@ namespace EQ {
EQ_EXCEPT("IPC Mutex", "Could not create mutex."); EQ_EXCEPT("IPC Mutex", "Could not create mutex.");
} }
#else #else
std::string final_name = fmt::format("{}/{}.lock", path.GetSharedMemoryPath(), name); std::string final_name = fmt::format("{}/{}.lock", PathManager::Instance()->GetSharedMemoryPath(), name);
#ifdef __DARWIN #ifdef __DARWIN
#if __DARWIN_C_LEVEL < 200809L #if __DARWIN_C_LEVEL < 200809L
+1 -1
View File
@@ -1799,7 +1799,7 @@ std::vector<std::string> EQ::ItemInstance::GetAugmentNames() const
for (uint8 slot_id = invaug::SOCKET_BEGIN; slot_id <= invaug::SOCKET_END; slot_id++) { for (uint8 slot_id = invaug::SOCKET_BEGIN; slot_id <= invaug::SOCKET_END; slot_id++) {
const auto augment = GetAugment(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; return augment_names;
+2 -2
View File
@@ -78,7 +78,7 @@ namespace RoF
{ {
//create our opcode manager if we havent already //create our opcode manager if we havent already
if (opcodes == nullptr) { 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. //load up the opcode manager.
//TODO: figure out how to support shared memory with multiple patches... //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. //we need to go to every stream and replace it's manager.
if (opcodes != nullptr) { 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())) { if (!opcodes->ReloadOpcodes(opfile.c_str())) {
LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name);
return; return;
+2 -2
View File
@@ -81,7 +81,7 @@ namespace RoF2
//create our opcode manager if we havent already //create our opcode manager if we havent already
if (opcodes == nullptr) { 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. //load up the opcode manager.
//TODO: figure out how to support shared memory with multiple patches... //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. //we need to go to every stream and replace it's manager.
if (opcodes != nullptr) { 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())) { if (!opcodes->ReloadOpcodes(opfile.c_str())) {
LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name);
return; return;
+13 -13
View File
@@ -72,7 +72,7 @@ namespace SoD
{ {
//create our opcode manager if we havent already //create our opcode manager if we havent already
if (opcodes == nullptr) { 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. //load up the opcode manager.
//TODO: figure out how to support shared memory with multiple patches... //TODO: figure out how to support shared memory with multiple patches...
opcodes = new RegularOpcodeManager(); opcodes = new RegularOpcodeManager();
@@ -113,7 +113,7 @@ namespace SoD
//we need to go to every stream and replace it's manager. //we need to go to every stream and replace it's manager.
if (opcodes != nullptr) { 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())) { if (!opcodes->ReloadOpcodes(opfile.c_str())) {
LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name);
return; return;
@@ -3966,12 +3966,12 @@ namespace SoD
SoDSlot = serverSlot - 2; SoDSlot = serverSlot - 2;
} }
else if (serverSlot <= EQ::invbag::GENERAL_BAGS_8_END && serverSlot >= EQ::invbag::GENERAL_BAGS_BEGIN) { else if (serverSlot <= EQ::invbag::GENERAL_BAGS_END && serverSlot >= EQ::invbag::GENERAL_BAGS_BEGIN) {
SoDSlot = serverSlot + 11; SoDSlot = serverSlot - (EQ::invbag::GENERAL_BAGS_BEGIN - invbag::GENERAL_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((serverSlot - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));;
} }
else if (serverSlot <= EQ::invbag::CURSOR_BAG_END && serverSlot >= EQ::invbag::CURSOR_BAG_BEGIN) { else if (serverSlot <= EQ::invbag::CURSOR_BAG_END && serverSlot >= EQ::invbag::CURSOR_BAG_BEGIN) {
SoDSlot = serverSlot - 9; SoDSlot = serverSlot - (EQ::invbag::CURSOR_BAG_BEGIN - invbag::CURSOR_BAG_BEGIN);
} }
else if (serverSlot <= EQ::invslot::TRIBUTE_END && serverSlot >= EQ::invslot::TRIBUTE_BEGIN) { else if (serverSlot <= EQ::invslot::TRIBUTE_END && serverSlot >= EQ::invslot::TRIBUTE_BEGIN) {
@@ -3991,7 +3991,7 @@ namespace SoD
} }
else if (serverSlot <= EQ::invbag::BANK_BAGS_END && serverSlot >= EQ::invbag::BANK_BAGS_BEGIN) { else if (serverSlot <= EQ::invbag::BANK_BAGS_END && serverSlot >= EQ::invbag::BANK_BAGS_BEGIN) {
SoDSlot = serverSlot + 1; SoDSlot = serverSlot - (EQ::invbag::BANK_BAGS_BEGIN - invbag::BANK_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((serverSlot - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));;
} }
else if (serverSlot <= EQ::invslot::SHARED_BANK_END && serverSlot >= EQ::invslot::SHARED_BANK_BEGIN) { else if (serverSlot <= EQ::invslot::SHARED_BANK_END && serverSlot >= EQ::invslot::SHARED_BANK_BEGIN) {
@@ -3999,7 +3999,7 @@ namespace SoD
} }
else if (serverSlot <= EQ::invbag::SHARED_BANK_BAGS_END && serverSlot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) { else if (serverSlot <= EQ::invbag::SHARED_BANK_BAGS_END && serverSlot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) {
SoDSlot = serverSlot + 1; SoDSlot = serverSlot - (EQ::invbag::SHARED_BANK_BAGS_BEGIN - invbag::SHARED_BANK_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((serverSlot - EQ::invbag::SHARED_BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));
} }
else if (serverSlot <= EQ::invslot::TRADE_END && serverSlot >= EQ::invslot::TRADE_BEGIN) { else if (serverSlot <= EQ::invslot::TRADE_END && serverSlot >= EQ::invslot::TRADE_BEGIN) {
@@ -4007,7 +4007,7 @@ namespace SoD
} }
else if (serverSlot <= EQ::invbag::TRADE_BAGS_END && serverSlot >= EQ::invbag::TRADE_BAGS_BEGIN) { else if (serverSlot <= EQ::invbag::TRADE_BAGS_END && serverSlot >= EQ::invbag::TRADE_BAGS_BEGIN) {
SoDSlot = serverSlot; SoDSlot = serverSlot - (EQ::invbag::TRADE_BAGS_BEGIN - invbag::TRADE_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((serverSlot - EQ::invbag::TRADE_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));
} }
else if (serverSlot <= EQ::invslot::WORLD_END && serverSlot >= EQ::invslot::WORLD_BEGIN) { else if (serverSlot <= EQ::invslot::WORLD_END && serverSlot >= EQ::invslot::WORLD_BEGIN) {
@@ -4049,11 +4049,11 @@ namespace SoD
} }
else if (sod_slot <= invbag::GENERAL_BAGS_END && sod_slot >= invbag::GENERAL_BAGS_BEGIN) { else if (sod_slot <= invbag::GENERAL_BAGS_END && sod_slot >= invbag::GENERAL_BAGS_BEGIN) {
server_slot = sod_slot - 11; server_slot = sod_slot + (EQ::invbag::GENERAL_BAGS_BEGIN - invbag::GENERAL_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((sod_slot - invbag::GENERAL_BAGS_BEGIN) / invbag::SLOT_COUNT));
} }
else if (sod_slot <= invbag::CURSOR_BAG_END && sod_slot >= invbag::CURSOR_BAG_BEGIN) { else if (sod_slot <= invbag::CURSOR_BAG_END && sod_slot >= invbag::CURSOR_BAG_BEGIN) {
server_slot = sod_slot + 9; server_slot = sod_slot + (EQ::invbag::CURSOR_BAG_BEGIN - invbag::CURSOR_BAG_BEGIN);
} }
else if (sod_slot <= invslot::TRIBUTE_END && sod_slot >= invslot::TRIBUTE_BEGIN) { else if (sod_slot <= invslot::TRIBUTE_END && sod_slot >= invslot::TRIBUTE_BEGIN) {
@@ -4073,7 +4073,7 @@ namespace SoD
} }
else if (sod_slot <= invbag::BANK_BAGS_END && sod_slot >= invbag::BANK_BAGS_BEGIN) { else if (sod_slot <= invbag::BANK_BAGS_END && sod_slot >= invbag::BANK_BAGS_BEGIN) {
server_slot = sod_slot - 1; server_slot = sod_slot + (EQ::invbag::BANK_BAGS_BEGIN - invbag::BANK_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((sod_slot - invbag::BANK_BAGS_BEGIN) / invbag::SLOT_COUNT));
} }
else if (sod_slot <= invslot::SHARED_BANK_END && sod_slot >= invslot::SHARED_BANK_BEGIN) { else if (sod_slot <= invslot::SHARED_BANK_END && sod_slot >= invslot::SHARED_BANK_BEGIN) {
@@ -4081,7 +4081,7 @@ namespace SoD
} }
else if (sod_slot <= invbag::SHARED_BANK_BAGS_END && sod_slot >= invbag::SHARED_BANK_BAGS_BEGIN) { else if (sod_slot <= invbag::SHARED_BANK_BAGS_END && sod_slot >= invbag::SHARED_BANK_BAGS_BEGIN) {
server_slot = sod_slot - 1; server_slot = sod_slot + (EQ::invbag::SHARED_BANK_BAGS_BEGIN - invbag::SHARED_BANK_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((sod_slot - invbag::SHARED_BANK_BAGS_BEGIN) / invbag::SLOT_COUNT));
} }
else if (sod_slot <= invslot::TRADE_END && sod_slot >= invslot::TRADE_BEGIN) { else if (sod_slot <= invslot::TRADE_END && sod_slot >= invslot::TRADE_BEGIN) {
@@ -4089,7 +4089,7 @@ namespace SoD
} }
else if (sod_slot <= invbag::TRADE_BAGS_END && sod_slot >= invbag::TRADE_BAGS_BEGIN) { else if (sod_slot <= invbag::TRADE_BAGS_END && sod_slot >= invbag::TRADE_BAGS_BEGIN) {
server_slot = sod_slot; server_slot = sod_slot + (EQ::invbag::TRADE_BAGS_BEGIN - invbag::TRADE_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((sod_slot - invbag::TRADE_BAGS_BEGIN) / invbag::SLOT_COUNT));
} }
else if (sod_slot <= invslot::WORLD_END && sod_slot >= invslot::WORLD_BEGIN) { else if (sod_slot <= invslot::WORLD_END && sod_slot >= invslot::WORLD_BEGIN) {
+13 -13
View File
@@ -71,7 +71,7 @@ namespace SoF
{ {
//create our opcode manager if we havent already //create our opcode manager if we havent already
if (opcodes == nullptr) { 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. //load up the opcode manager.
//TODO: figure out how to support shared memory with multiple patches... //TODO: figure out how to support shared memory with multiple patches...
opcodes = new RegularOpcodeManager(); opcodes = new RegularOpcodeManager();
@@ -110,7 +110,7 @@ namespace SoF
//we need to go to every stream and replace it's manager. //we need to go to every stream and replace it's manager.
if (opcodes != nullptr) { 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())) { if (!opcodes->ReloadOpcodes(opfile.c_str())) {
LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name);
return; return;
@@ -3355,12 +3355,12 @@ namespace SoF
sof_slot = server_slot - 2; sof_slot = server_slot - 2;
} }
else if (server_slot <= EQ::invbag::GENERAL_BAGS_8_END && server_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) { else if (server_slot <= EQ::invbag::GENERAL_BAGS_END && server_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) {
sof_slot = server_slot + 11; sof_slot = server_slot - (EQ::invbag::GENERAL_BAGS_BEGIN - invbag::GENERAL_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((server_slot - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));;
} }
else if (server_slot <= EQ::invbag::CURSOR_BAG_END && server_slot >= EQ::invbag::CURSOR_BAG_BEGIN) { else if (server_slot <= EQ::invbag::CURSOR_BAG_END && server_slot >= EQ::invbag::CURSOR_BAG_BEGIN) {
sof_slot = server_slot - 9; sof_slot = server_slot - (EQ::invbag::CURSOR_BAG_BEGIN - invbag::CURSOR_BAG_BEGIN);
} }
else if (server_slot <= EQ::invslot::TRIBUTE_END && server_slot >= EQ::invslot::TRIBUTE_BEGIN) { else if (server_slot <= EQ::invslot::TRIBUTE_END && server_slot >= EQ::invslot::TRIBUTE_BEGIN) {
@@ -3380,7 +3380,7 @@ namespace SoF
} }
else if (server_slot <= EQ::invbag::BANK_BAGS_END && server_slot >= EQ::invbag::BANK_BAGS_BEGIN) { else if (server_slot <= EQ::invbag::BANK_BAGS_END && server_slot >= EQ::invbag::BANK_BAGS_BEGIN) {
sof_slot = server_slot + 1; sof_slot = server_slot - (EQ::invbag::BANK_BAGS_BEGIN - invbag::BANK_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((server_slot - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));
} }
else if (server_slot <= EQ::invslot::SHARED_BANK_END && server_slot >= EQ::invslot::SHARED_BANK_BEGIN) { else if (server_slot <= EQ::invslot::SHARED_BANK_END && server_slot >= EQ::invslot::SHARED_BANK_BEGIN) {
@@ -3388,7 +3388,7 @@ namespace SoF
} }
else if (server_slot <= EQ::invbag::SHARED_BANK_BAGS_END && server_slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) { else if (server_slot <= EQ::invbag::SHARED_BANK_BAGS_END && server_slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) {
sof_slot = server_slot + 1; sof_slot = server_slot - (EQ::invbag::SHARED_BANK_BAGS_BEGIN - invbag::SHARED_BANK_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((server_slot - EQ::invbag::SHARED_BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));
} }
else if (server_slot <= EQ::invslot::TRADE_END && server_slot >= EQ::invslot::TRADE_BEGIN) { else if (server_slot <= EQ::invslot::TRADE_END && server_slot >= EQ::invslot::TRADE_BEGIN) {
@@ -3396,7 +3396,7 @@ namespace SoF
} }
else if (server_slot <= EQ::invbag::TRADE_BAGS_END && server_slot >= EQ::invbag::TRADE_BAGS_BEGIN) { else if (server_slot <= EQ::invbag::TRADE_BAGS_END && server_slot >= EQ::invbag::TRADE_BAGS_BEGIN) {
sof_slot = server_slot; sof_slot = server_slot - (EQ::invbag::TRADE_BAGS_BEGIN - invbag::TRADE_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((server_slot - EQ::invbag::TRADE_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));
} }
else if (server_slot <= EQ::invslot::WORLD_END && server_slot >= EQ::invslot::WORLD_BEGIN) { else if (server_slot <= EQ::invslot::WORLD_END && server_slot >= EQ::invslot::WORLD_BEGIN) {
@@ -3442,11 +3442,11 @@ namespace SoF
} }
else if (sof_slot <= invbag::GENERAL_BAGS_END && sof_slot >= invbag::GENERAL_BAGS_BEGIN) { else if (sof_slot <= invbag::GENERAL_BAGS_END && sof_slot >= invbag::GENERAL_BAGS_BEGIN) {
server_slot = sof_slot - 11; server_slot = sof_slot + (EQ::invbag::GENERAL_BAGS_BEGIN - invbag::GENERAL_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((sof_slot - invbag::GENERAL_BAGS_BEGIN) / invbag::SLOT_COUNT));;
} }
else if (sof_slot <= invbag::CURSOR_BAG_END && sof_slot >= invbag::CURSOR_BAG_BEGIN) { else if (sof_slot <= invbag::CURSOR_BAG_END && sof_slot >= invbag::CURSOR_BAG_BEGIN) {
server_slot = sof_slot + 9; server_slot = sof_slot + (EQ::invbag::CURSOR_BAG_BEGIN - invbag::CURSOR_BAG_BEGIN);
} }
else if (sof_slot <= invslot::TRIBUTE_END && sof_slot >= invslot::TRIBUTE_BEGIN) { else if (sof_slot <= invslot::TRIBUTE_END && sof_slot >= invslot::TRIBUTE_BEGIN) {
@@ -3466,7 +3466,7 @@ namespace SoF
} }
else if (sof_slot <= invbag::BANK_BAGS_END && sof_slot >= invbag::BANK_BAGS_BEGIN) { else if (sof_slot <= invbag::BANK_BAGS_END && sof_slot >= invbag::BANK_BAGS_BEGIN) {
server_slot = sof_slot - 1; server_slot = sof_slot + (EQ::invbag::BANK_BAGS_BEGIN - invbag::BANK_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((sof_slot - invbag::BANK_BAGS_BEGIN) / invbag::SLOT_COUNT));;
} }
else if (sof_slot <= invslot::SHARED_BANK_END && sof_slot >= invslot::SHARED_BANK_BEGIN) { else if (sof_slot <= invslot::SHARED_BANK_END && sof_slot >= invslot::SHARED_BANK_BEGIN) {
@@ -3474,7 +3474,7 @@ namespace SoF
} }
else if (sof_slot <= invbag::SHARED_BANK_BAGS_END && sof_slot >= invbag::SHARED_BANK_BAGS_BEGIN) { else if (sof_slot <= invbag::SHARED_BANK_BAGS_END && sof_slot >= invbag::SHARED_BANK_BAGS_BEGIN) {
server_slot = sof_slot - 1; server_slot = sof_slot + (EQ::invbag::SHARED_BANK_BAGS_BEGIN - invbag::SHARED_BANK_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((sof_slot - invbag::SHARED_BANK_BAGS_BEGIN) / invbag::SLOT_COUNT));;
} }
else if (sof_slot <= invslot::TRADE_END && sof_slot >= invslot::TRADE_BEGIN) { else if (sof_slot <= invslot::TRADE_END && sof_slot >= invslot::TRADE_BEGIN) {
@@ -3482,7 +3482,7 @@ namespace SoF
} }
else if (sof_slot <= invbag::TRADE_BAGS_END && sof_slot >= invbag::TRADE_BAGS_BEGIN) { else if (sof_slot <= invbag::TRADE_BAGS_END && sof_slot >= invbag::TRADE_BAGS_BEGIN) {
server_slot = sof_slot; server_slot = sof_slot + (EQ::invbag::TRADE_BAGS_BEGIN - invbag::TRADE_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((sof_slot - invbag::TRADE_BAGS_BEGIN) / invbag::SLOT_COUNT));;
} }
else if (sof_slot <= invslot::WORLD_END && sof_slot >= invslot::WORLD_BEGIN) { else if (sof_slot <= invslot::WORLD_END && sof_slot >= invslot::WORLD_BEGIN) {
+14 -14
View File
@@ -73,7 +73,7 @@ namespace Titanium
auto Config = EQEmuConfig::get(); auto Config = EQEmuConfig::get();
//create our opcode manager if we havent already //create our opcode manager if we havent already
if (opcodes == nullptr) { 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. //load up the opcode manager.
//TODO: figure out how to support shared memory with multiple patches... //TODO: figure out how to support shared memory with multiple patches...
opcodes = new RegularOpcodeManager(); opcodes = new RegularOpcodeManager();
@@ -114,7 +114,7 @@ namespace Titanium
//we need to go to every stream and replace it's manager. //we need to go to every stream and replace it's manager.
if (opcodes != nullptr) { 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())) { if (!opcodes->ReloadOpcodes(opfile.c_str())) {
LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name);
return; return;
@@ -3596,12 +3596,12 @@ namespace Titanium
else if (server_slot == (EQ::invslot::POSSESSIONS_COUNT + EQ::invslot::slotAmmo)) { else if (server_slot == (EQ::invslot::POSSESSIONS_COUNT + EQ::invslot::slotAmmo)) {
titanium_slot = server_slot - 4; titanium_slot = server_slot - 4;
} }
else if (server_slot <= EQ::invbag::GENERAL_BAGS_8_END && else if (server_slot <= EQ::invbag::GENERAL_BAGS_END &&
server_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) { server_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) {
titanium_slot = server_slot; titanium_slot = server_slot - (EQ::invbag::GENERAL_BAGS_BEGIN - invbag::GENERAL_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((server_slot - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));
} }
else if (server_slot <= EQ::invbag::CURSOR_BAG_END && server_slot >= EQ::invbag::CURSOR_BAG_BEGIN) { else if (server_slot <= EQ::invbag::CURSOR_BAG_END && server_slot >= EQ::invbag::CURSOR_BAG_BEGIN) {
titanium_slot = server_slot - 20; titanium_slot = server_slot - (EQ::invbag::CURSOR_BAG_BEGIN - invbag::CURSOR_BAG_BEGIN);
} }
else if (server_slot <= EQ::invslot::TRIBUTE_END && server_slot >= EQ::invslot::TRIBUTE_BEGIN) { else if (server_slot <= EQ::invslot::TRIBUTE_END && server_slot >= EQ::invslot::TRIBUTE_BEGIN) {
titanium_slot = server_slot; titanium_slot = server_slot;
@@ -3616,21 +3616,21 @@ namespace Titanium
else if (server_slot <= EQ::invslot::BANK_END && server_slot >= EQ::invslot::BANK_BEGIN) { else if (server_slot <= EQ::invslot::BANK_END && server_slot >= EQ::invslot::BANK_BEGIN) {
titanium_slot = server_slot; titanium_slot = server_slot;
} }
else if (server_slot <= EQ::invbag::BANK_BAGS_16_END && server_slot >= EQ::invbag::BANK_BAGS_BEGIN) { else if (server_slot <= EQ::invbag::BANK_BAGS_END && server_slot >= EQ::invbag::BANK_BAGS_BEGIN) {
titanium_slot = server_slot; titanium_slot = server_slot - (EQ::invbag::BANK_BAGS_BEGIN - invbag::BANK_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((server_slot - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));
} }
else if (server_slot <= EQ::invslot::SHARED_BANK_END && server_slot >= EQ::invslot::SHARED_BANK_BEGIN) { else if (server_slot <= EQ::invslot::SHARED_BANK_END && server_slot >= EQ::invslot::SHARED_BANK_BEGIN) {
titanium_slot = server_slot; titanium_slot = server_slot;
} }
else if (server_slot <= EQ::invbag::SHARED_BANK_BAGS_END && else if (server_slot <= EQ::invbag::SHARED_BANK_BAGS_END &&
server_slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) { server_slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) {
titanium_slot = server_slot; titanium_slot = server_slot - (EQ::invbag::SHARED_BANK_BAGS_BEGIN - invbag::SHARED_BANK_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((server_slot - EQ::invbag::SHARED_BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));
} }
else if (server_slot <= EQ::invslot::TRADE_END && server_slot >= EQ::invslot::TRADE_BEGIN) { else if (server_slot <= EQ::invslot::TRADE_END && server_slot >= EQ::invslot::TRADE_BEGIN) {
titanium_slot = server_slot; titanium_slot = server_slot;
} }
else if (server_slot <= EQ::invbag::TRADE_BAGS_END && server_slot >= EQ::invbag::TRADE_BAGS_BEGIN) { else if (server_slot <= EQ::invbag::TRADE_BAGS_END && server_slot >= EQ::invbag::TRADE_BAGS_BEGIN) {
titanium_slot = server_slot; titanium_slot = server_slot - (EQ::invbag::TRADE_BAGS_BEGIN - invbag::TRADE_BAGS_BEGIN) - ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((server_slot - EQ::invbag::TRADE_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT));
} }
else if (server_slot <= EQ::invslot::WORLD_END && server_slot >= EQ::invslot::WORLD_BEGIN) { else if (server_slot <= EQ::invslot::WORLD_END && server_slot >= EQ::invslot::WORLD_BEGIN) {
titanium_slot = server_slot; titanium_slot = server_slot;
@@ -3687,10 +3687,10 @@ namespace Titanium
server_slot = titanium_slot + 4; server_slot = titanium_slot + 4;
} }
else if (titanium_slot <= invbag::GENERAL_BAGS_END && titanium_slot >= invbag::GENERAL_BAGS_BEGIN) { else if (titanium_slot <= invbag::GENERAL_BAGS_END && titanium_slot >= invbag::GENERAL_BAGS_BEGIN) {
server_slot = titanium_slot; server_slot = titanium_slot + (EQ::invbag::GENERAL_BAGS_BEGIN - invbag::GENERAL_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((titanium_slot - invbag::GENERAL_BAGS_BEGIN) / invbag::SLOT_COUNT));
} }
else if (titanium_slot <= invbag::CURSOR_BAG_END && titanium_slot >= invbag::CURSOR_BAG_BEGIN) { else if (titanium_slot <= invbag::CURSOR_BAG_END && titanium_slot >= invbag::CURSOR_BAG_BEGIN) {
server_slot = titanium_slot + 20; server_slot = titanium_slot + (EQ::invbag::CURSOR_BAG_BEGIN - invbag::CURSOR_BAG_BEGIN);
} }
else if (titanium_slot <= invslot::TRIBUTE_END && titanium_slot >= invslot::TRIBUTE_BEGIN) { else if (titanium_slot <= invslot::TRIBUTE_END && titanium_slot >= invslot::TRIBUTE_BEGIN) {
server_slot = titanium_slot; server_slot = titanium_slot;
@@ -3705,19 +3705,19 @@ namespace Titanium
server_slot = titanium_slot; server_slot = titanium_slot;
} }
else if (titanium_slot <= invbag::BANK_BAGS_END && titanium_slot >= invbag::BANK_BAGS_BEGIN) { else if (titanium_slot <= invbag::BANK_BAGS_END && titanium_slot >= invbag::BANK_BAGS_BEGIN) {
server_slot = titanium_slot; server_slot = titanium_slot + (EQ::invbag::BANK_BAGS_BEGIN - invbag::BANK_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((titanium_slot - invbag::BANK_BAGS_BEGIN) / invbag::SLOT_COUNT));
} }
else if (titanium_slot <= invslot::SHARED_BANK_END && titanium_slot >= invslot::SHARED_BANK_BEGIN) { else if (titanium_slot <= invslot::SHARED_BANK_END && titanium_slot >= invslot::SHARED_BANK_BEGIN) {
server_slot = titanium_slot; server_slot = titanium_slot;
} }
else if (titanium_slot <= invbag::SHARED_BANK_BAGS_END && titanium_slot >= invbag::SHARED_BANK_BAGS_BEGIN) { else if (titanium_slot <= invbag::SHARED_BANK_BAGS_END && titanium_slot >= invbag::SHARED_BANK_BAGS_BEGIN) {
server_slot = titanium_slot; server_slot = titanium_slot + (EQ::invbag::SHARED_BANK_BAGS_BEGIN - invbag::SHARED_BANK_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((titanium_slot - invbag::SHARED_BANK_BAGS_BEGIN) / invbag::SLOT_COUNT));
} }
else if (titanium_slot <= invslot::TRADE_END && titanium_slot >= invslot::TRADE_BEGIN) { else if (titanium_slot <= invslot::TRADE_END && titanium_slot >= invslot::TRADE_BEGIN) {
server_slot = titanium_slot; server_slot = titanium_slot;
} }
else if (titanium_slot <= invbag::TRADE_BAGS_END && titanium_slot >= invbag::TRADE_BAGS_BEGIN) { else if (titanium_slot <= invbag::TRADE_BAGS_END && titanium_slot >= invbag::TRADE_BAGS_BEGIN) {
server_slot = titanium_slot; server_slot = titanium_slot + (EQ::invbag::TRADE_BAGS_BEGIN - invbag::TRADE_BAGS_BEGIN) + ((EQ::invbag::SLOT_COUNT - invbag::SLOT_COUNT) * ((titanium_slot - invbag::TRADE_BAGS_BEGIN) / invbag::SLOT_COUNT));
} }
else if (titanium_slot <= invslot::WORLD_END && titanium_slot >= invslot::WORLD_BEGIN) { else if (titanium_slot <= invslot::WORLD_END && titanium_slot >= invslot::WORLD_BEGIN) {
server_slot = titanium_slot; server_slot = titanium_slot;
+2 -2
View File
@@ -76,7 +76,7 @@ namespace UF
{ {
//create our opcode manager if we havent already //create our opcode manager if we havent already
if (opcodes == nullptr) { 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. //load up the opcode manager.
//TODO: figure out how to support shared memory with multiple patches... //TODO: figure out how to support shared memory with multiple patches...
opcodes = new RegularOpcodeManager(); opcodes = new RegularOpcodeManager();
@@ -117,7 +117,7 @@ namespace UF
//we need to go to every stream and replace it's manager. //we need to go to every stream and replace it's manager.
if (opcodes != nullptr) { 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())) { if (!opcodes->ReloadOpcodes(opfile.c_str())) {
LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name); LogNetcode("[OPCODES] Error reloading opcodes file [{}] for patch [{}]", opfile.c_str(), name);
return; return;
+1 -1
View File
@@ -8,7 +8,7 @@
namespace fs = std::filesystem; namespace fs = std::filesystem;
void PathManager::LoadPaths() void PathManager::Init()
{ {
m_server_path = File::FindEqemuConfigPath(); m_server_path = File::FindEqemuConfigPath();
+7 -3
View File
@@ -7,7 +7,13 @@
class PathManager { class PathManager {
public: public:
void LoadPaths(); void Init();
static PathManager *Instance()
{
static PathManager instance;
return &instance;
}
[[nodiscard]] const std::string &GetLogPath() const; [[nodiscard]] const std::string &GetLogPath() const;
[[nodiscard]] const std::string &GetLuaModsPath() const; [[nodiscard]] const std::string &GetLuaModsPath() const;
@@ -38,6 +44,4 @@ private:
std::string m_shared_memory_path; std::string m_shared_memory_path;
}; };
extern PathManager path;
#endif //EQEMU_PATH_MANAGER_H #endif //EQEMU_PATH_MANAGER_H
+9
View File
@@ -0,0 +1,9 @@
#pragma once
#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"
+1
View File
@@ -1,6 +1,7 @@
#include <string> #include <string>
#include <memory> #include <memory>
#include "process.h" #include "process.h"
#include <fmt/format.h>
std::string Process::execute(const std::string &cmd) std::string Process::execute(const std::string &cmd)
{ {
+6
View File
@@ -116,6 +116,12 @@ namespace EQ {
Reseed(); Reseed();
} }
static Random* Instance()
{
static Random instance;
return &instance;
}
private: private:
#ifndef BIASED_INT_DIST #ifndef BIASED_INT_DIST
typedef std::uniform_int_distribution<int>::param_type int_param_t; typedef std::uniform_int_distribution<int>::param_type int_param_t;
@@ -15,7 +15,7 @@
#include "../../database.h" #include "../../database.h"
#include "../../strings.h" #include "../../strings.h"
#include <ctime> #include <ctime>
#include <cereal/cereal.hpp>
class BasePlayerEventLogSettingsRepository { class BasePlayerEventLogSettingsRepository {
public: public:
struct PlayerEventLogSettings { struct PlayerEventLogSettings {
@@ -25,6 +25,20 @@ public:
int32_t retention_days; int32_t retention_days;
int32_t discord_webhook_id; int32_t discord_webhook_id;
uint8_t etl_enabled; uint8_t etl_enabled;
// cereal
template<class Archive>
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() static std::string PrimaryKey()
@@ -167,6 +167,30 @@ public:
return zone_player_counts; return zone_player_counts;
} }
static std::vector<uint32_t> GetCharacterIDsByAccountID(
Database& db,
uint32_t account_id
)
{
std::vector<uint32_t> character_ids;
auto query = fmt::format(
"SELECT id FROM character_data WHERE account_id = {} AND deleted_at IS NULL",
account_id
);
auto results = db.QueryDatabase(query);
if (results.Success()) {
for (auto row : results) {
if (row[0]) {
character_ids.push_back(static_cast<uint32_t>(std::stoul(row[0])));
}
}
}
return character_ids;
}
}; };
#endif //EQEMU_CHARACTER_DATA_REPOSITORY_H #endif //EQEMU_CHARACTER_DATA_REPOSITORY_H
+59 -2
View File
@@ -43,6 +43,47 @@ public:
* method and encapsulate filters there * method and encapsulate filters there
*/ */
template<typename T1, typename T2, typename T3, typename T4>
static std::vector<std::string> join_tuple(
const std::string &glue,
const std::pair<char, char> &encapsulation,
const std::vector<std::tuple<T1, T2, T3, T4>> &src
)
{
if (src.empty()) {
return {};
}
std::vector<std::string> output;
for (const std::tuple<T1, T2, T3, T4> &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 // Custom extended repository methods here
static std::vector<std::string> GetRuleNames(Database &db, int rule_set_id) static std::vector<std::string> GetRuleNames(Database &db, int rule_set_id)
{ {
@@ -87,12 +128,28 @@ public:
return v; return v;
} }
template<typename T>
static std::string
ImplodePair(const std::string &glue, const std::pair<char, char> &encapsulation, const std::vector<T> &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<std::string>& v) static bool DeleteOrphanedRules(Database& db, std::vector<std::string>& v)
{ {
const auto query = fmt::format( const auto query = fmt::format(
"DELETE FROM {} WHERE rule_name IN ({})", "DELETE FROM {} WHERE rule_name IN ({})",
TableName(), TableName(),
Strings::ImplodePair(",", std::pair<char, char>('\'', '\''), v) ImplodePair(",", std::pair<char, char>('\'', '\''), v)
); );
return db.QueryDatabase(query).Success(); return db.QueryDatabase(query).Success();
@@ -103,7 +160,7 @@ public:
const auto query = fmt::format( const auto query = fmt::format(
"REPLACE INTO {} (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES {}", "REPLACE INTO {} (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES {}",
TableName(), TableName(),
Strings::ImplodePair( ImplodePair(
",", ",",
std::pair<char, char>('(', ')'), std::pair<char, char>('(', ')'),
join_tuple(",", std::pair<char, char>('\'', '\''), v) join_tuple(",", std::pair<char, char>('\'', '\''), v)
+3 -1
View File
@@ -273,8 +273,9 @@
#define ServerOP_WWTaskUpdate 0x4758 #define ServerOP_WWTaskUpdate 0x4758
// player events // player events
#define ServerOP_QSSendQuery 0x5000 #define ServerOP_QSSendQuery 0x5000
#define ServerOP_PlayerEvent 0x5100 #define ServerOP_PlayerEvent 0x5100
#define ServerOP_SendPlayerEventSettings 0x5101
enum { enum {
CZUpdateType_Character, CZUpdateType_Character,
@@ -1778,6 +1779,7 @@ struct BazaarPurchaseMessaging_Struct {
uint32 id; uint32 id;
}; };
#pragma pack() #pragma pack()
#endif #endif
+53 -5
View File
@@ -974,7 +974,7 @@ bool SharedDatabase::LoadItems(const std::string &prefix) {
const auto Config = EQEmuConfig::get(); const auto Config = EQEmuConfig::get();
EQ::IPCMutex mutex("items"); EQ::IPCMutex mutex("items");
mutex.Lock(); 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<EQ::MemoryMappedFile>(file_name); items_mmf = std::make_unique<EQ::MemoryMappedFile>(file_name);
items_hash = std::make_unique<EQ::FixedMemoryHashSet<EQ::ItemData>>(static_cast<uint8*>(items_mmf->Get()), items_mmf->Size()); items_hash = std::make_unique<EQ::FixedMemoryHashSet<EQ::ItemData>>(static_cast<uint8*>(items_mmf->Get()), items_mmf->Size());
mutex.Unlock(); mutex.Unlock();
@@ -1544,12 +1544,60 @@ bool SharedDatabase::GetCommandSettings(std::map<std::string, std::pair<uint8, s
return true; return true;
} }
template<typename T1, typename T2>
inline std::vector<std::string> join_pair(
const std::string &glue,
const std::pair<char, char> &encapsulation,
const std::vector<std::pair<T1, T2>> &src
)
{
if (src.empty()) {
return {};
}
std::vector<std::string> output;
for (const std::pair<T1, T2> &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<typename T>
inline std::string
ImplodePair(const std::string &glue, const std::pair<char, char> &encapsulation, const std::vector<T> &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<std::pair<std::string, uint8>> &injected) bool SharedDatabase::UpdateInjectedCommandSettings(const std::vector<std::pair<std::string, uint8>> &injected)
{ {
if (injected.size()) { if (injected.size()) {
const std::string query = fmt::format( const std::string query = fmt::format(
"REPLACE INTO `command_settings`(`command`, `access`) VALUES {}", "REPLACE INTO `command_settings`(`command`, `access`) VALUES {}",
Strings::ImplodePair( ImplodePair(
",", ",",
std::pair<char, char>('(', ')'), std::pair<char, char>('(', ')'),
join_pair(",", std::pair<char, char>('\'', '\''), injected) join_pair(",", std::pair<char, char>('\'', '\''), injected)
@@ -1576,7 +1624,7 @@ bool SharedDatabase::UpdateOrphanedCommandSettings(const std::vector<std::string
if (orphaned.size()) { if (orphaned.size()) {
std::string query = fmt::format( std::string query = fmt::format(
"DELETE FROM `command_settings` WHERE `command` IN ({})", "DELETE FROM `command_settings` WHERE `command` IN ({})",
Strings::ImplodePair(",", std::pair<char, char>('\'', '\''), orphaned) ImplodePair(",", std::pair<char, char>('\'', '\''), orphaned)
); );
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1586,7 +1634,7 @@ bool SharedDatabase::UpdateOrphanedCommandSettings(const std::vector<std::string
query = fmt::format( query = fmt::format(
"DELETE FROM `command_subsettings` WHERE `parent_command` IN ({})", "DELETE FROM `command_subsettings` WHERE `parent_command` IN ({})",
Strings::ImplodePair(",", std::pair<char, char>('\'', '\''), orphaned) ImplodePair(",", std::pair<char, char>('\'', '\''), orphaned)
); );
auto results_two = QueryDatabase(query); auto results_two = QueryDatabase(query);
@@ -1665,7 +1713,7 @@ bool SharedDatabase::LoadSpells(const std::string &prefix, int32 *records, const
EQ::IPCMutex mutex("spells"); EQ::IPCMutex mutex("spells");
mutex.Lock(); 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<EQ::MemoryMappedFile>(file_name); spells_mmf = std::make_unique<EQ::MemoryMappedFile>(file_name);
LogInfo("Loading [{}]", file_name); LogInfo("Loading [{}]", file_name);
*records = *static_cast<uint32*>(spells_mmf->Get()); *records = *static_cast<uint32*>(spells_mmf->Get());
+6 -2
View File
@@ -16,12 +16,16 @@ public:
static int32_t GetSkillCapMaxLevel(uint8 class_id, EQ::skills::SkillType skill_id); static int32_t GetSkillCapMaxLevel(uint8 class_id, EQ::skills::SkillType skill_id);
SkillCaps *SetContentDatabase(Database *db); SkillCaps *SetContentDatabase(Database *db);
static SkillCaps* Instance()
{
static SkillCaps instance;
return &instance;
}
private: private:
Database *m_content_database{}; Database *m_content_database{};
std::map<uint64, SkillCapsRepository::SkillCaps> m_skill_caps = {}; std::map<uint64, SkillCapsRepository::SkillCaps> m_skill_caps = {};
}; };
extern SkillCaps skill_caps;
#endif //CODE_SKILL_CAPS_H #endif //CODE_SKILL_CAPS_H
+20
View File
@@ -34,6 +34,7 @@
*/ */
#include "strings.h" #include "strings.h"
#include <cereal/external/rapidjson/document.h>
#include <fmt/format.h> #include <fmt/format.h>
#include <algorithm> #include <algorithm>
#include <cctype> #include <cctype>
@@ -41,6 +42,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <iostream> #include <iostream>
#include <sstream>
#include <random> #include <random>
#include <string> #include <string>
@@ -49,6 +51,12 @@
#include "strings_legacy.cpp" // legacy c functions #include "strings_legacy.cpp" // legacy c functions
#include "strings_misc.cpp" // anything non "Strings" scoped #include "strings_misc.cpp" // anything non "Strings" scoped
#ifdef _WINDOWS
#include <ctype.h>
#include <functional>
#include <algorithm>
#endif
std::string Strings::Random(size_t length) std::string Strings::Random(size_t length)
{ {
static auto &chrs = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 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); 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 // Function to convert single digit or two digit number into words
std::string Strings::ConvertToDigit(int n, const std::string& suffix) std::string Strings::ConvertToDigit(int n, const std::string& suffix)
{ {
+3 -193
View File
@@ -36,53 +36,19 @@
#define _STRINGUTIL_H_ #define _STRINGUTIL_H_
#include <charconv> #include <charconv>
#include <sstream> #include <cstring>
#include <string.h>
#include <string_view> #include <string_view>
#include <string>
#include <vector> #include <vector>
#include <cstdarg> #include <cstdarg>
#include <tuple>
#include <type_traits> #include <type_traits>
#include <fmt/format.h> #ifdef _WIN32
#include <cereal/external/rapidjson/document.h>
#ifndef _WIN32
// this doesn't appear to affect linux-based systems..need feedback for _WIN64
#endif
#ifdef _WINDOWS
#include <ctype.h> #include <ctype.h>
#include <functional>
#include <algorithm>
#endif #endif
#include "types.h" #include "types.h"
namespace detail {
// template magic to check if std::from_chars floating point functions exist
template <typename T, typename = void>
struct has_from_chars_float : std::false_type { };
// basically it "uses" this template if they do exist because reasons
template <typename T>
struct has_from_chars_float < T,
std::void_t<decltype(std::from_chars(std::declval<const char *>(), std::declval<const char *>(),
std::declval<T &>()))>> : 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 { class Strings {
public: public:
static bool Contains(std::vector<std::string> container, const std::string& element); static bool Contains(std::vector<std::string> container, const std::string& element);
@@ -133,61 +99,6 @@ public:
static bool BeginsWith(const std::string& subject, const std::string& search); static bool BeginsWith(const std::string& subject, const std::string& search);
static bool EndsWith(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); static std::string ZoneTime(const uint8 hours, const uint8 minutes);
template<typename T>
static std::string
ImplodePair(const std::string &glue, const std::pair<char, char> &encapsulation, const std::vector<T> &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 <typename T>
std::enable_if_t<std::is_floating_point_v<T> && detail::has_from_chars_float<T>::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 <typename T>
std::enable_if_t<std::is_integral_v<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 <typename T>
std::enable_if_t<std::is_floating_point_v<T> && !detail::has_from_chars_float<T>::value && std::is_same_v<T, float>, 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 <typename T>
std::enable_if_t<std::is_floating_point_v<T> && !detail::has_from_chars_float<T>::value && std::is_same_v<T, double>, 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 std::string Slugify(const std::string &input, const std::string &separator = "-");
static bool IsValidJson(const std::string& json); 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. // Used for grid nodes, as NPC names remove numerals.
// But general purpose // 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<fmt/format.h> be included in whatever code file the invocation is made from (no header files)
template<typename T1, typename T2>
std::vector<std::string> join_pair(
const std::string &glue,
const std::pair<char, char> &encapsulation,
const std::vector<std::pair<T1, T2>> &src
)
{
if (src.empty()) {
return {};
}
std::vector<std::string> output;
for (const std::pair<T1, T2> &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<fmt/format.h> be included in whatever code file the invocation is made from (no header files)
template<typename T1, typename T2, typename T3, typename T4>
std::vector<std::string> join_tuple(
const std::string &glue,
const std::pair<char, char> &encapsulation,
const std::vector<std::tuple<T1, T2, T3, T4>> &src
)
{
if (src.empty()) {
return {};
}
std::vector<std::string> output;
for (const std::tuple<T1, T2, T3, T4> &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 // misc functions
std::string SanitizeWorldServerName(std::string server_long_name); std::string SanitizeWorldServerName(std::string server_long_name);
std::vector<std::string> GetBadWords(); std::vector<std::string> GetBadWords();
@@ -310,18 +134,4 @@ std::string FormatName(const std::string &char_name);
bool IsAllowedWorldServerCharacterList(char c); bool IsAllowedWorldServerCharacterList(char c);
void SanitizeWorldServerName(char *name); void SanitizeWorldServerName(char *name);
template<typename InputIterator, typename OutputIterator>
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 #endif
+1 -1
View File
@@ -42,7 +42,7 @@
* Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt * 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 CURRENT_BINARY_BOTS_DATABASE_VERSION 9054
#define CUSTOM_BINARY_DATABASE_VERSION 0 #define CUSTOM_BINARY_DATABASE_VERSION 0
+13 -10
View File
@@ -104,36 +104,39 @@ public:
uint8 GetZoneIdleWhenEmpty(uint32 zone_id, int version = 0); uint8 GetZoneIdleWhenEmpty(uint32 zone_id, int version = 0);
uint32 GetZoneSecondsBeforeIdle(uint32 zone_id, int version = 0); uint32 GetZoneSecondsBeforeIdle(uint32 zone_id, int version = 0);
static ZoneStore* Instance()
{
static ZoneStore instance;
return &instance;
}
private: private:
std::vector<ZoneRepository::Zone> m_zones; std::vector<ZoneRepository::Zone> m_zones;
}; };
extern ZoneStore zone_store;
/** /**
* Global helpers * Global helpers
*/ */
inline uint32 ZoneID(const char *in_zone_name) { return zone_store.GetZoneID(in_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 zone_store.GetZoneID(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) inline const char *ZoneName(uint32 zone_id, bool error_unknown = false)
{ {
return zone_store.GetZoneName( return ZoneStore::Instance()->GetZoneName(
zone_id, zone_id,
error_unknown error_unknown
); );
} }
inline const char *ZoneLongName(uint32 zone_id, bool error_unknown = false) inline const char *ZoneLongName(uint32 zone_id, bool error_unknown = false)
{ {
return zone_store.GetZoneLongName( return ZoneStore::Instance()->GetZoneLongName(
zone_id, zone_id,
error_unknown error_unknown
); );
} }
inline ZoneRepository::Zone *GetZone(uint32 zone_id, int version = 0) { return zone_store.GetZone(zone_id, version); }; 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 zone_store.GetZone(in_zone_name); }; 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) inline ZoneRepository::Zone *GetZone(const char *in_zone_name, int version = 0)
{ {
return zone_store.GetZone( return ZoneStore::Instance()->GetZone(
ZoneID( ZoneID(
in_zone_name in_zone_name
), version ), 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) inline ZoneRepository::Zone *GetZoneVersionWithFallback(uint32 zone_id, int version = 0)
{ {
return zone_store.GetZoneWithFallback( return ZoneStore::Instance()->GetZoneWithFallback(
zone_id, zone_id,
version version
); );
+1 -2
View File
@@ -34,7 +34,6 @@
#include <time.h> #include <time.h>
EQEmuLogSys LogSys; EQEmuLogSys LogSys;
PathManager path;
bool RunLoops = false; bool RunLoops = false;
@@ -45,7 +44,7 @@ int main(int argc, char *argv[]) {
LogSys.LoadLogSettingsDefaults(); LogSys.LoadLogSettingsDefaults();
set_exception_handler(); set_exception_handler();
path.LoadPaths(); PathManager::Instance()->Init();
std::string launcher_name; std::string launcher_name;
if(argc == 2) { if(argc == 2) {
+3 -3
View File
@@ -94,7 +94,7 @@ ClientManager::ClientManager()
std::string opcodes_path = fmt::format( std::string opcodes_path = fmt::format(
"{}/{}", "{}/{}",
path.GetOpcodePath(), PathManager::Instance()->GetOpcodePath(),
"login_opcodes.conf" "login_opcodes.conf"
); );
@@ -131,7 +131,7 @@ ClientManager::ClientManager()
opcodes_path = fmt::format( opcodes_path = fmt::format(
"{}/{}", "{}/{}",
path.GetOpcodePath(), PathManager::Instance()->GetOpcodePath(),
"login_opcodes_sod.conf" "login_opcodes_sod.conf"
); );
@@ -169,7 +169,7 @@ ClientManager::ClientManager()
opcodes_path = fmt::format( opcodes_path = fmt::format(
"{}/{}", "{}/{}",
path.GetOpcodePath(), PathManager::Instance()->GetOpcodePath(),
"login_opcodes_larion.conf" "login_opcodes_larion.conf"
); );
+2 -4
View File
@@ -24,10 +24,8 @@
LoginServer server; LoginServer server;
EQEmuLogSys LogSys; EQEmuLogSys LogSys;
bool run_server = true; bool run_server = true;
PathManager path;
Database database; Database database;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
ZoneStore zone_store;
void CatchSignal(int sig_num) void CatchSignal(int sig_num)
{ {
@@ -52,7 +50,7 @@ void LoadDatabaseConnection()
void LoadServerConfig() void LoadServerConfig()
{ {
server.config = EQ::JsonConfigFile::Load( server.config = EQ::JsonConfigFile::Load(
fmt::format("{}/login.json", path.GetServerPath()) fmt::format("{}/login.json", PathManager::Instance()->GetServerPath())
); );
LogInfo("Config System Init"); LogInfo("Config System Init");
@@ -162,7 +160,7 @@ int main(int argc, char **argv)
LogSys.LoadLogSettingsDefaults(); LogSys.LoadLogSettingsDefaults();
} }
path.LoadPaths(); PathManager::Instance()->Init();
// command handler // command handler
if (argc > 1) { if (argc > 1) {
+2 -4
View File
@@ -31,8 +31,6 @@ std::string WorldShortName;
const queryservconfig *Config; const queryservconfig *Config;
WorldServer *worldserver = 0; WorldServer *worldserver = 0;
EQEmuLogSys LogSys; EQEmuLogSys LogSys;
PathManager path;
ZoneStore zone_store;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
ZSList zs_list; ZSList zs_list;
uint32 numzones = 0; uint32 numzones = 0;
@@ -50,7 +48,7 @@ int main()
set_exception_handler(); set_exception_handler();
Timer LFGuildExpireTimer(60000); Timer LFGuildExpireTimer(60000);
path.LoadPaths(); PathManager::Instance()->Init();
LogInfo("Starting EQEmu QueryServ"); LogInfo("Starting EQEmu QueryServ");
if (!queryservconfig::LoadConfig()) { if (!queryservconfig::LoadConfig()) {
@@ -86,7 +84,7 @@ int main()
} }
LogSys.SetDatabase(&database) LogSys.SetDatabase(&database)
->SetLogPath(path.GetLogPath()) ->SetLogPath(PathManager::Instance()->GetLogPath())
->LoadLogDatabaseSettings() ->LoadLogDatabaseSettings()
->StartFileLogs(); ->StartFileLogs();
+4
View File
@@ -21,10 +21,13 @@
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include "zonelist.h"
extern WorldServer worldserver; extern WorldServer worldserver;
extern const queryservconfig *Config; extern const queryservconfig *Config;
extern QSDatabase qs_database; extern QSDatabase qs_database;
extern LFGuildManager lfguildmanager; extern LFGuildManager lfguildmanager;
extern ZSList zs_list;
WorldServer::WorldServer() WorldServer::WorldServer()
{ {
@@ -78,6 +81,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
if (o->type == ServerReload::Type::Logs) { if (o->type == ServerReload::Type::Logs) {
LogSys.LoadLogDatabaseSettings(); LogSys.LoadLogDatabaseSettings();
player_event_logs.ReloadSettings(); player_event_logs.ReloadSettings();
zs_list.SendPlayerEventLogSettings();
} }
break; break;
+9
View File
@@ -5,6 +5,8 @@
void ZSList::Add(ZoneServer* zoneserver) { void ZSList::Add(ZoneServer* zoneserver) {
zone_server_list.emplace_back(std::unique_ptr<ZoneServer>(zoneserver)); zone_server_list.emplace_back(std::unique_ptr<ZoneServer>(zoneserver));
zoneserver->SetIsZoneConnected(true); zoneserver->SetIsZoneConnected(true);
zoneserver->SendPlayerEventLogSettings();
} }
void ZSList::Remove(const std::string &uuid) void ZSList::Remove(const std::string &uuid)
@@ -18,3 +20,10 @@ void ZSList::Remove(const std::string &uuid)
iter++; iter++;
} }
} }
void ZSList::SendPlayerEventLogSettings()
{
for (auto &zs : zone_server_list) {
zs->SendPlayerEventLogSettings();
}
}
+4 -3
View File
@@ -12,9 +12,10 @@ class ZoneServer;
class ZSList { class ZSList {
public: public:
std::list<std::unique_ptr<ZoneServer>> &GetZsList() { return zone_server_list; } std::list<std::unique_ptr<ZoneServer>>& GetZsList() { return zone_server_list; }
void Add(ZoneServer *zoneserver); void Add(ZoneServer* zoneserver);
void Remove(const std::string &uuid); void Remove(const std::string& uuid);
void SendPlayerEventLogSettings();
private: private:
std::list<std::unique_ptr<ZoneServer>> zone_server_list; std::list<std::unique_ptr<ZoneServer>> zone_server_list;
+25
View File
@@ -7,6 +7,7 @@
extern DiscordManager discord_manager; extern DiscordManager discord_manager;
ZoneServer::ZoneServer( ZoneServer::ZoneServer(
std::shared_ptr<EQ::Net::ServertalkServerConnection> in_connection, std::shared_ptr<EQ::Net::ServertalkServerConnection> in_connection,
EQ::Net::ConsoleServer *in_console 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<PlayerEventLogSettingsRepository::PlayerEventLogSettings> 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<ServerPacket>(
ServerOP_SendPlayerEventSettings,
static_cast<uint32_t>(packet_size)
);
auto* buf = reinterpret_cast<ServerSendPlayerEvent_Struct*>(pack->pBuffer);
buf->cereal_size = static_cast<uint32_t>(dyn_pack.Length());
memcpy(buf->cereal_data, dyn_pack.Data(), dyn_pack.Length());
SendPacket(pack.release());
}
+5 -4
View File
@@ -16,11 +16,12 @@ class ZoneServer : public WorldTCPConnection {
public: public:
ZoneServer(std::shared_ptr<EQ::Net::ServertalkServerConnection> in_connection, EQ::Net::ConsoleServer *in_console); ZoneServer(std::shared_ptr<EQ::Net::ServertalkServerConnection> in_connection, EQ::Net::ConsoleServer *in_console);
~ZoneServer(); ~ZoneServer();
void SendPacket(ServerPacket *pack) { m_connection->SendPacket(pack); } void SendPacket(ServerPacket *pack) { m_connection->SendPacket(pack); }
void SetIsZoneConnected(bool in) { m_is_zone_connected = in; } void SetIsZoneConnected(bool in) { m_is_zone_connected = in; }
bool GetIsZoneConnected() { return m_is_zone_connected; } bool GetIsZoneConnected() { return m_is_zone_connected; }
void HandleMessage(uint16 opcode, const EQ::Net::Packet &p); void HandleMessage(uint16 opcode, const EQ::Net::Packet &p);
std::string GetUUID() const { return m_connection->GetUUID(); } std::string GetUUID() const { return m_connection->GetUUID(); }
void SendPlayerEventLogSettings();
private: private:
std::shared_ptr<EQ::Net::ServertalkServerConnection> m_connection{}; std::shared_ptr<EQ::Net::ServertalkServerConnection> m_connection{};
+2 -4
View File
@@ -37,8 +37,6 @@
EQEmuLogSys LogSys; EQEmuLogSys LogSys;
WorldContentService content_service; WorldContentService content_service;
ZoneStore zone_store;
PathManager path;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
EvolvingItemsManager evolving_items_manager; EvolvingItemsManager evolving_items_manager;
@@ -84,7 +82,7 @@ int main(int argc, char **argv)
LogSys.LoadLogSettingsDefaults(); LogSys.LoadLogSettingsDefaults();
set_exception_handler(); set_exception_handler();
path.LoadPaths(); PathManager::Instance()->Init();
LogInfo("Shared Memory Loader Program"); LogInfo("Shared Memory Loader Program");
if (!EQEmuConfig::LoadConfig()) { if (!EQEmuConfig::LoadConfig()) {
@@ -127,7 +125,7 @@ int main(int argc, char **argv)
} }
LogSys.SetDatabase(&database) LogSys.SetDatabase(&database)
->SetLogPath(path.GetLogPath()) ->SetLogPath(PathManager::Instance()->GetLogPath())
->LoadLogDatabaseSettings() ->LoadLogDatabaseSettings()
->StartFileLogs(); ->StartFileLogs();
+1 -2
View File
@@ -35,13 +35,12 @@
const EQEmuConfig *Config; const EQEmuConfig *Config;
EQEmuLogSys LogSys; EQEmuLogSys LogSys;
PathManager path;
int main() int main()
{ {
RegisterExecutablePlatform(ExePlatformClientImport); RegisterExecutablePlatform(ExePlatformClientImport);
LogSys.LoadLogSettingsDefaults(); LogSys.LoadLogSettingsDefaults();
path.LoadPaths(); PathManager::Instance()->Init();
auto ConfigLoadResult = EQEmuConfig::LoadConfig(); auto ConfigLoadResult = EQEmuConfig::LoadConfig();
Config = EQEmuConfig::get(); Config = EQEmuConfig::get();
-16
View File
@@ -30,7 +30,6 @@ public:
TEST_ADD(StringUtilTest::EscapeStringTest); TEST_ADD(StringUtilTest::EscapeStringTest);
TEST_ADD(StringUtilTest::SearchDeliminatedStringTest); TEST_ADD(StringUtilTest::SearchDeliminatedStringTest);
TEST_ADD(StringUtilTest::SplitStringTest); TEST_ADD(StringUtilTest::SplitStringTest);
TEST_ADD(StringUtilTest::FromCharsTest);
TEST_ADD(StringUtilTest::TestIsFloat); TEST_ADD(StringUtilTest::TestIsFloat);
TEST_ADD(StringUtilTest::TestIsNumber); TEST_ADD(StringUtilTest::TestIsNumber);
} }
@@ -108,21 +107,6 @@ public:
TEST_ASSERT(v[2] == "789"); 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() { void TestIsFloat() {
TEST_ASSERT_EQUALS(Strings::IsFloat("0.23424523"), true); TEST_ASSERT_EQUALS(Strings::IsFloat("0.23424523"), true);
TEST_ASSERT_EQUALS(Strings::IsFloat("12312312313.23424523"), true); TEST_ASSERT_EQUALS(Strings::IsFloat("12312312313.23424523"), true);
+1 -1
View File
@@ -482,7 +482,7 @@ Clientlist::Clientlist(int ChatPort) {
const ucsconfig *Config = ucsconfig::get(); 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); LogInfo("Loading [{}]", opcodes_file);
if (!ChatOpMgr->LoadOpcodes(opcodes_file.c_str())) if (!ChatOpMgr->LoadOpcodes(opcodes_file.c_str()))
+2 -4
View File
@@ -48,8 +48,6 @@ EQEmuLogSys LogSys;
UCSDatabase database; UCSDatabase database;
WorldServer *worldserver = nullptr; WorldServer *worldserver = nullptr;
DiscordManager discord_manager; DiscordManager discord_manager;
PathManager path;
ZoneStore zone_store;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
const ucsconfig *Config; const ucsconfig *Config;
@@ -107,7 +105,7 @@ int main() {
LogSys.LoadLogSettingsDefaults(); LogSys.LoadLogSettingsDefaults();
set_exception_handler(); set_exception_handler();
path.LoadPaths(); PathManager::Instance()->Init();
// Check every minute for unused channels we can delete // Check every minute for unused channels we can delete
// //
@@ -140,7 +138,7 @@ int main() {
} }
LogSys.SetDatabase(&database) LogSys.SetDatabase(&database)
->SetLogPath(path.GetLogPath()) ->SetLogPath(PathManager::Instance()->GetLogPath())
->LoadLogDatabaseSettings() ->LoadLogDatabaseSettings()
->StartFileLogs(); ->StartFileLogs();
+3 -1
View File
@@ -1,6 +1,8 @@
module should-release module should-release
go 1.18 go 1.23.0
toolchain go1.23.5
require ( require (
github.com/google/go-github/v41 v41.0.0 github.com/google/go-github/v41 v41.0.0
@@ -114,7 +114,8 @@ if ($requested_table_to_generate ne "all") {
my @cereal_enabled_tables = ( my @cereal_enabled_tables = (
"data_buckets", "data_buckets",
"player_event_logs" "player_event_logs",
"player_event_log_settings"
); );
my $generated_base_repository_files = ""; my $generated_base_repository_files = "";
+1 -1
View File
@@ -77,7 +77,7 @@ ADD_EXECUTABLE(world ${world_sources} ${world_headers})
INSTALL(TARGETS world RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) INSTALL(TARGETS world RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
IF (WIN32 AND EQEMU_BUILD_PCH) 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 () ENDIF ()
ADD_DEFINITIONS(-DWORLD) ADD_DEFINITIONS(-DWORLD)
+2 -3
View File
@@ -18,7 +18,6 @@
extern ZSList zoneserver_list; extern ZSList zoneserver_list;
extern ClientList client_list; extern ClientList client_list;
extern AdventureManager adventure_manager; extern AdventureManager adventure_manager;
extern EQ::Random emu_random;
Adventure::Adventure(AdventureTemplate *t) Adventure::Adventure(AdventureTemplate *t)
{ {
@@ -368,8 +367,8 @@ void Adventure::MoveCorpsesToGraveyard()
glm::vec4 position; glm::vec4 position;
float x = GetTemplate()->graveyard_x + 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 + emu_random.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; float z = GetTemplate()->graveyard_z;
position.x = x; position.x = x;
+1 -2
View File
@@ -16,7 +16,6 @@
extern ZSList zoneserver_list; extern ZSList zoneserver_list;
extern ClientList client_list; extern ClientList client_list;
extern EQ::Random emu_random;
AdventureManager::AdventureManager() AdventureManager::AdventureManager()
{ {
@@ -324,7 +323,7 @@ void AdventureManager::CalculateAdventureRequestReply(const char *data)
if(eligible_adventures.size() > 0) if(eligible_adventures.size() > 0)
{ {
ea_iter = eligible_adventures.begin(); 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) for(int i = 0; i < c_index; ++i)
{ {
++ea_iter; ++ea_iter;
+24 -4
View File
@@ -36,6 +36,7 @@
#include "../common/shareddb.h" #include "../common/shareddb.h"
#include "../common/opcodemgr.h" #include "../common/opcodemgr.h"
#include "../common/data_verification.h" #include "../common/data_verification.h"
#include "../common/data_bucket.h"
#include "client.h" #include "client.h"
#include "worlddb.h" #include "worlddb.h"
@@ -91,7 +92,6 @@ std::vector<RaceClassCombos> character_create_race_class_combos;
extern ZSList zoneserver_list; extern ZSList zoneserver_list;
extern LoginServerList loginserverlist; extern LoginServerList loginserverlist;
extern ClientList client_list; extern ClientList client_list;
extern EQ::Random emu_random;
extern uint32 numclients; extern uint32 numclients;
extern volatile bool RunLoops; extern volatile bool RunLoops;
extern volatile bool UCSServerAvailable_; extern volatile bool UCSServerAvailable_;
@@ -135,6 +135,8 @@ Client::Client(EQStreamInterface* ieqs)
} }
Client::~Client() { Client::~Client() {
ClearDataBucketsCache();
if (RunLoops && cle && zone_id == 0) if (RunLoops && cle && zone_id == 0)
cle->SetOnline(CLE_Status::Offline); cle->SetOnline(CLE_Status::Offline);
@@ -477,6 +479,8 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app)
LogClientLogin("Checking authentication id [{}]", id); LogClientLogin("Checking authentication id [{}]", id);
if ((cle = client_list.CheckAuth(id, password))) { if ((cle = client_list.CheckAuth(id, password))) {
LoadDataBucketsCache();
LogClientLogin("Checking authentication id [{}] passed", id); LogClientLogin("Checking authentication id [{}] passed", id);
if (!is_player_zoning) { if (!is_player_zoning) {
// Track who is in and who is out of the game // Track who is in and who is out of the game
@@ -984,7 +988,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) {
safe_delete(outapp); safe_delete(outapp);
// set mailkey - used for duration of character session // 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); database.SetMailKey(charid, GetIP(), mail_key);
if (UCSServerAvailable_) { if (UCSServerAvailable_) {
@@ -2171,7 +2175,7 @@ void Client::SetClassStartingSkills(PlayerProfile_Struct *pp)
i == EQ::skills::SkillAlcoholTolerance || i == EQ::skills::SkillBindWound) i == EQ::skills::SkillAlcoholTolerance || i == EQ::skills::SkillBindWound)
continue; 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;
} }
} }
@@ -2369,7 +2373,7 @@ bool Client::StoreCharacter(
return false; 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")) { if (Strings::EqualFold(zone_name, "UNKNOWN")) {
p_player_profile_struct->zone_id = Zones::QEYNOS; p_player_profile_struct->zone_id = Zones::QEYNOS;
} }
@@ -2518,3 +2522,19 @@ void Client::SendUnsupportedClientPacket(const std::string& message)
QueuePacket(&packet); QueuePacket(&packet);
} }
void Client::LoadDataBucketsCache()
{
DataBucket::BulkLoadEntitiesToCache(DataBucketLoadType::Account, {GetAccountID()});
const auto ids = CharacterDataRepository::GetCharacterIDsByAccountID(database, GetAccountID());
DataBucket::BulkLoadEntitiesToCache(DataBucketLoadType::Client, ids);
}
void Client::ClearDataBucketsCache()
{
DataBucket::DeleteFromCache(GetAccountID(), DataBucketLoadType::Account);
auto ids = CharacterDataRepository::GetCharacterIDsByAccountID(database, GetAccountID());
for (const auto& id : ids) {
DataBucket::DeleteFromCache(id, DataBucketLoadType::Client);
}
}
+3
View File
@@ -121,6 +121,9 @@ private:
bool CanTradeFVNoDropItem(); bool CanTradeFVNoDropItem();
void RecordPossibleHack(const std::string& message); void RecordPossibleHack(const std::string& message);
void SendUnsupportedClientPacket(const std::string& message); void SendUnsupportedClientPacket(const std::string& message);
void LoadDataBucketsCache();
void ClearDataBucketsCache();
}; };
bool CheckCharCreateInfoSoF(CharCreate_Struct *cc); bool CheckCharCreateInfoSoF(CharCreate_Struct *cc);
+44 -2
View File
@@ -1219,7 +1219,7 @@ void ConsoleCrossZoneMove(
const auto& zone_short_name = !Strings::IsNumber(args[2]) ? args[2] : ""; const auto& zone_short_name = !Strings::IsNumber(args[2]) ? args[2] : "";
const uint16 instance_id = Strings::IsNumber(args[2]) ? static_cast<uint16>(Strings::ToUnsignedInt(args[2])) : 0; const uint16 instance_id = Strings::IsNumber(args[2]) ? static_cast<uint16>(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) { if (z && !z->id) {
connection->SendLine(fmt::format("No zone with the short name '{}' exists.", zone_short_name)); 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 auto& zone_short_name = !Strings::IsNumber(args[2]) ? args[2] : "";
const uint16 instance_id = Strings::IsNumber(args[2]) ? static_cast<uint16>(Strings::ToUnsignedInt(args[2])) : 0; const uint16 instance_id = Strings::IsNumber(args[2]) ? static_cast<uint16>(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) { if (z && !z->id) {
connection->SendLine(fmt::format("No zone with the short name '{}' exists.", zone_short_name)); connection->SendLine(fmt::format("No zone with the short name '{}' exists.", zone_short_name));
@@ -1330,6 +1330,42 @@ void ConsoleWorldWideMove(
); );
} }
void ConsoleWWMarquee(
EQ::Net::ConsoleServerConnection* connection,
const std::string& command,
const std::vector<std::string>& args
)
{
if (args.size() < 2) {
connection->SendLine("Usage: wwmarquee <type> <message>");
return;
}
const uint32 type = Strings::IsNumber(args[0]) ? Strings::ToUnsignedInt(args[0]) : 0;
std::string message = Strings::Join(std::vector<std::string>(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 * @param console
@@ -1367,6 +1403,12 @@ void RegisterConsoleFunctions(std::unique_ptr<EQ::Net::ConsoleServer>& console)
console->RegisterCall("whoami", 50, "whoami", std::bind(ConsoleWhoami, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); 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("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("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 <type> <message>",
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("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("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)); console->RegisterCall("zonelock", 150, "zonelock [list|lock|unlock] [zone_short_name]", std::bind(ConsoleZoneLock, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
+2 -6
View File
@@ -91,8 +91,6 @@
#include "../common/repositories/character_parcels_repository.h" #include "../common/repositories/character_parcels_repository.h"
#include "../common/ip_util.h" #include "../common/ip_util.h"
SkillCaps skill_caps;
ZoneStore zone_store;
ClientList client_list; ClientList client_list;
GroupLFPList LFPGroupList; GroupLFPList LFPGroupList;
ZSList zoneserver_list; ZSList zoneserver_list;
@@ -103,7 +101,6 @@ LauncherList launcher_list;
AdventureManager adventure_manager; AdventureManager adventure_manager;
WorldEventScheduler event_scheduler; WorldEventScheduler event_scheduler;
SharedTaskManager shared_task_manager; SharedTaskManager shared_task_manager;
EQ::Random emu_random;
volatile bool RunLoops = true; volatile bool RunLoops = true;
uint32 numclients = 0; uint32 numclients = 0;
uint32 numzones = 0; uint32 numzones = 0;
@@ -111,7 +108,6 @@ const WorldConfig *Config;
EQEmuLogSys LogSys; EQEmuLogSys LogSys;
WorldContentService content_service; WorldContentService content_service;
WebInterfaceList web_interface; WebInterfaceList web_interface;
PathManager path;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
EvolvingItemsManager evolving_items_manager; EvolvingItemsManager evolving_items_manager;
@@ -142,7 +138,7 @@ int main(int argc, char **argv)
return 0; return 0;
} }
path.LoadPaths(); PathManager::Instance()->Init();
if (!WorldBoot::LoadServerConfig()) { if (!WorldBoot::LoadServerConfig()) {
return 0; return 0;
@@ -207,7 +203,7 @@ int main(int argc, char **argv)
->SetExpansionContext() ->SetExpansionContext()
->ReloadContentFlags(); ->ReloadContentFlags();
skill_caps.SetContentDatabase(&content_db)->LoadSkillCaps(); SkillCaps::Instance()->SetContentDatabase(&content_db)->LoadSkillCaps();
std::unique_ptr<EQ::Net::ServertalkServer> server_connection; std::unique_ptr<EQ::Net::ServertalkServer> server_connection;
server_connection = std::make_unique<EQ::Net::ServertalkServer>(); server_connection = std::make_unique<EQ::Net::ServertalkServer>();
+4 -4
View File
@@ -84,7 +84,7 @@ bool WorldBoot::HandleCommandInput(int argc, char **argv)
// command handler // command handler
if (argc > 1) { if (argc > 1) {
LogSys.SilenceConsoleLogging(); LogSys.SilenceConsoleLogging();
path.LoadPaths(); PathManager::Instance()->Init();
WorldConfig::LoadConfig(); WorldConfig::LoadConfig();
LoadDatabaseConnections(); LoadDatabaseConnections();
RuleManager::Instance()->LoadRules(&database, "default", false); RuleManager::Instance()->LoadRules(&database, "default", false);
@@ -234,7 +234,7 @@ bool WorldBoot::DatabaseLoadRoutines(int argc, char **argv)
{ {
// logging system init // logging system init
auto logging = LogSys.SetDatabase(&database) auto logging = LogSys.SetDatabase(&database)
->SetLogPath(path.GetLogPath()) ->SetLogPath(PathManager::Instance()->GetLogPath())
->LoadLogDatabaseSettings(); ->LoadLogDatabaseSettings();
LogSys.SetDiscordHandler(&WorldBoot::DiscordWebhookMessageHandler); LogSys.SetDiscordHandler(&WorldBoot::DiscordWebhookMessageHandler);
@@ -279,9 +279,9 @@ bool WorldBoot::DatabaseLoadRoutines(int argc, char **argv)
LogInfo("Loading zones"); 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"); LogError("Failed to load zones data, check your schema for possible errors");
return 1; return 1;
} }
+5 -3
View File
@@ -37,14 +37,15 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "dynamic_zone_manager.h" #include "dynamic_zone_manager.h"
#include "ucs.h" #include "ucs.h"
#include "clientlist.h" #include "clientlist.h"
#include "queryserv.h"
#include "../common/repositories/trader_repository.h" #include "../common/repositories/trader_repository.h"
#include "../common/repositories/buyer_repository.h" #include "../common/repositories/buyer_repository.h"
extern uint32 numzones; extern uint32 numzones;
extern EQ::Random emu_random;
extern WebInterfaceList web_interface; extern WebInterfaceList web_interface;
extern SharedTaskManager shared_task_manager; extern SharedTaskManager shared_task_manager;
extern ClientList client_list; extern ClientList client_list;
extern QueryServConnection QSLink;
volatile bool UCSServerAvailable_ = false; volatile bool UCSServerAvailable_ = false;
void CatchSignal(int sig_num); void CatchSignal(int sig_num);
@@ -694,7 +695,7 @@ void ZSList::RebootZone(const char* ip1, uint16 port, const char* ip2, uint32 sk
safe_delete_array(tmp); safe_delete_array(tmp);
return; 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)); auto pack = new ServerPacket(ServerOP_ZoneReboot, sizeof(ServerZoneReboot_Struct));
ServerZoneReboot_Struct* s = (ServerZoneReboot_Struct*)pack->pBuffer; ServerZoneReboot_Struct* s = (ServerZoneReboot_Struct*)pack->pBuffer;
@@ -978,13 +979,14 @@ void ZSList::SendServerReload(ServerReload::Type type, uchar *packet)
} else if (type == ServerReload::Type::Rules) { } else if (type == ServerReload::Type::Rules) {
RuleManager::Instance()->LoadRules(&database, RuleManager::Instance()->GetActiveRuleset(), true); RuleManager::Instance()->LoadRules(&database, RuleManager::Instance()->GetActiveRuleset(), true);
} else if (type == ServerReload::Type::SkillCaps) { } else if (type == ServerReload::Type::SkillCaps) {
skill_caps.ReloadSkillCaps(); SkillCaps::Instance()->ReloadSkillCaps();
} else if (type == ServerReload::Type::ContentFlags) { } else if (type == ServerReload::Type::ContentFlags) {
content_service.SetExpansionContext()->ReloadContentFlags(); content_service.SetExpansionContext()->ReloadContentFlags();
} else if (type == ServerReload::Type::Logs) { } else if (type == ServerReload::Type::Logs) {
LogSys.LoadLogDatabaseSettings(); LogSys.LoadLogDatabaseSettings();
player_event_logs.ReloadSettings(); player_event_logs.ReloadSettings();
UCSLink.SendPacket(&pack); UCSLink.SendPacket(&pack);
QSLink.SendPacket(&pack);
} else if (type == ServerReload::Type::Tasks) { } else if (type == ServerReload::Type::Tasks) {
shared_task_manager.LoadTaskData(); shared_task_manager.LoadTaskData();
} else if (type == ServerReload::Type::DzTemplates) { } else if (type == ServerReload::Type::DzTemplates) {
+255 -61
View File
@@ -12,7 +12,6 @@ SET(zone_sources
bonuses.cpp bonuses.cpp
bot.cpp bot.cpp
bot_raid.cpp bot_raid.cpp
bot_command.cpp
bot_database.cpp bot_database.cpp
botspellsai.cpp botspellsai.cpp
cheat_manager.cpp cheat_manager.cpp
@@ -23,7 +22,6 @@ SET(zone_sources
client_packet.cpp client_packet.cpp
client_process.cpp client_process.cpp
combat_record.cpp combat_record.cpp
command.cpp
corpse.cpp corpse.cpp
../common/data_bucket.cpp ../common/data_bucket.cpp
doors.cpp doors.cpp
@@ -48,36 +46,6 @@ SET(zone_sources
horse.cpp horse.cpp
inventory.cpp inventory.cpp
loot.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 embperl.cpp
entity.cpp entity.cpp
exp.cpp exp.cpp
@@ -108,30 +76,6 @@ SET(zone_sources
pathfinder_nav_mesh.cpp pathfinder_nav_mesh.cpp
pathfinder_null.cpp pathfinder_null.cpp
pathing.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 petitions.cpp
pets.cpp pets.cpp
position.cpp position.cpp
@@ -296,18 +240,268 @@ SET(zone_headers
zone_save_state.h zone_save_state.h
zone_cli.cpp) 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}) ADD_EXECUTABLE(zone ${zone_sources} ${zone_headers})
# binary output directory
INSTALL(TARGETS zone RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) INSTALL(TARGETS zone RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
IF (WIN32 AND EQEMU_BUILD_PCH) # precompiled headers
TARGET_PRECOMPILE_HEADERS(zone PRIVATE ../common/pch/pch.h) IF (EQEMU_BUILD_PCH)
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 ../common/pch/app-pch.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 ./pch/pch.h)
ENDIF() ENDIF()
ADD_DEFINITIONS(-DZONE) 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) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
+1 -1
View File
@@ -2683,7 +2683,7 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
give_exp_client->GetCleanName(), give_exp_client->GetCleanName(),
GetNPCTypeID() GetNPCTypeID()
); );
task_manager->HandleUpdateTasksOnKill(give_exp_client, this); TaskManager::Instance()->HandleUpdateTasksOnKill(give_exp_client, this);
} }
if (killer_raid) { if (killer_raid) {
+2 -2
View File
@@ -1242,7 +1242,7 @@ uint16 Bot::GetPrimarySkillValue() {
} }
uint16 Bot::MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const { 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() { uint32 Bot::GetTotalATK() {
@@ -7342,7 +7342,7 @@ void Bot::CalcBotStats(bool showtext) {
SetLevel(GetBotOwner()->GetLevel()); SetLevel(GetBotOwner()->GetLevel());
for (int sindex = 0; sindex <= EQ::skills::HIGHEST_SKILL; ++sindex) { 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); taunt_timer.Start(1000);
-1
View File
@@ -63,7 +63,6 @@
extern QueryServ* QServ; extern QueryServ* QServ;
extern WorldServer worldserver; extern WorldServer worldserver;
extern TaskManager *task_manager;
int bot_command_count; int bot_command_count;
+50 -2
View File
@@ -74,13 +74,61 @@ bool BotDatabase::LoadBotCommandSettings(std::map<std::string, std::pair<uint8,
return true; return true;
} }
template<typename T1, typename T2>
inline std::vector<std::string> join_pair(
const std::string &glue,
const std::pair<char, char> &encapsulation,
const std::vector<std::pair<T1, T2>> &src
)
{
if (src.empty()) {
return {};
}
std::vector<std::string> output;
for (const std::pair<T1, T2> &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<typename T>
inline std::string
ImplodePair(const std::string &glue, const std::pair<char, char> &encapsulation, const std::vector<T> &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<std::pair<std::string, uint8>> &injected) bool BotDatabase::UpdateInjectedBotCommandSettings(const std::vector<std::pair<std::string, uint8>> &injected)
{ {
if (injected.size()) { if (injected.size()) {
query = fmt::format( query = fmt::format(
"REPLACE INTO `bot_command_settings`(`bot_command`, `access`) VALUES {}", "REPLACE INTO `bot_command_settings`(`bot_command`, `access`) VALUES {}",
Strings::ImplodePair( ImplodePair(
",", ",",
std::pair<char, char>('(', ')'), std::pair<char, char>('(', ')'),
join_pair(",", std::pair<char, char>('\'', '\''), injected) join_pair(",", std::pair<char, char>('\'', '\''), injected)
@@ -107,7 +155,7 @@ bool BotDatabase::UpdateOrphanedBotCommandSettings(const std::vector<std::string
query = fmt::format( query = fmt::format(
"DELETE FROM `bot_command_settings` WHERE `bot_command` IN ({})", "DELETE FROM `bot_command_settings` WHERE `bot_command` IN ({})",
Strings::ImplodePair(",", std::pair<char, char>('\'', '\''), orphaned) ImplodePair(",", std::pair<char, char>('\'', '\''), orphaned)
); );
if (!database.QueryDatabase(query).Success()) { if (!database.QueryDatabase(query).Success()) {
+19
View File
@@ -195,6 +195,25 @@ void RunBenchmarkCycle(uint64_t target_rows)
std::cout << "✅ Completed " << Strings::Commify(OPERATIONS_PER_TEST) << " cached reads in " std::cout << "✅ Completed " << Strings::Commify(OPERATIONS_PER_TEST) << " cached reads in "
<< read_cached_time.count() << " seconds. (DataBucket::GetData)\n"; << read_cached_time.count() << " seconds. (DataBucket::GetData)\n";
// 🔍 **Measure Client-Scoped Cache Miss Performance (Skips DB via CanCache)**
auto read_client_cache_miss_start = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i < OPERATIONS_PER_TEST; ++i) {
// generate key that doesn't exist
std::string key = "nonexistent_key_" + std::to_string(i);
DataBucketKey k{
.key = key,
.character_id = 999999999, // use scoped value
};
DataBucket::GetData(k);
}
auto read_client_cache_miss_end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> read_client_cache_miss_time = read_client_cache_miss_end - read_client_cache_miss_start;
std::cout << "✅ Completed " << Strings::Commify(OPERATIONS_PER_TEST)
<< " scoped cache-miss reads (no DB) in "
<< read_client_cache_miss_time.count() << " seconds. (Client Scoped, Cache Miss, No DB)\n";
// 🔍 **Measure Non-Cached Read Performance (Direct Query)** // 🔍 **Measure Non-Cached Read Performance (Direct Query)**
auto read_uncached_start = std::chrono::high_resolution_clock::now(); auto read_uncached_start = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i < OPERATIONS_PER_TEST; ++i) { for (size_t i = 0; i < OPERATIONS_PER_TEST; ++i) {
+124 -19
View File
@@ -5,16 +5,16 @@
#include "../../client.h" #include "../../client.h"
#include "../../common/net/eqstream.h" #include "../../common/net/eqstream.h"
extern Zone *zone; extern Zone* zone;
void ZoneCLI::TestDataBuckets(int argc, char **argv, argh::parser &cmd, std::string &description) void ZoneCLI::TestDataBuckets(int argc, char** argv, argh::parser& cmd, std::string& description)
{ {
if (cmd[{"-h", "--help"}]) { if (cmd[{"-h", "--help"}]) {
return; return;
} }
uint32 break_length = 50; uint32 break_length = 50;
int failed_count = 0; int failed_count = 0;
LogSys.SilenceConsoleLogging(); LogSys.SilenceConsoleLogging();
@@ -25,14 +25,36 @@ void ZoneCLI::TestDataBuckets(int argc, char **argv, argh::parser &cmd, std::str
entity_list.Process(); entity_list.Process();
entity_list.MobProcess(); entity_list.MobProcess();
Client* client = new Client();
client->SetCharacterId(1); // Set a dummy character ID for testing
LogSys.EnableConsoleLogging(); LogSys.EnableConsoleLogging();
LogSys.log_settings[Logs::MySQLQuery].is_category_enabled = std::getenv("DEBUG") ? 1 : 0;
LogSys.log_settings[Logs::MySQLQuery].log_to_console = std::getenv("DEBUG") ? 3 : 0;
// 🧹 Delete all test keys before running tests
std::vector<std::string> test_keys_to_clear = {
"basic_key", "expiring_key", "cache_key", "json_key", "non_existent_key", "simple_key",
"nested", "nested.test1", "nested.test2", "nested.test1.a", "nested.test2.a",
"exp_test", "cache_test", "full_json", "full_json.key2", "complex", "complex.nested.obj1",
"complex.nested.obj2", "plain_string", "json_array", "nested_partial",
"nested_override", "empty_json", "json_string", "deep_nested",
"nested_expire", "scoped_miss_test", "scoped_nested_miss.key",
"cache_miss_overwrite", "missed_nested_set", "account_client_test", "ac_nested.test",
"scoped_db_only_key"
};
DataBucketsRepository::DeleteWhere(
database,
fmt::format("`key` IN ('{}')", Strings::Join(test_keys_to_clear, "','"))
);
DataBucket::ClearCache();
std::cout << "===========================================\n"; std::cout << "===========================================\n";
std::cout << "\uFE0F> Running DataBuckets Tests...\n"; std::cout << "\uFE0F> Running DataBuckets Tests...\n";
std::cout << "===========================================\n\n"; std::cout << "===========================================\n\n";
Client *client = new Client();
// Basic Key-Value Set/Get // Basic Key-Value Set/Get
client->DeleteBucket("basic_key"); client->DeleteBucket("basic_key");
client->SetBucket("basic_key", "simple_value"); client->SetBucket("basic_key", "simple_value");
@@ -101,7 +123,7 @@ void ZoneCLI::TestDataBuckets(int argc, char **argv, argh::parser &cmd, std::str
client->DeleteBucket("nested"); client->DeleteBucket("nested");
client->SetBucket("nested.test1.a", "value1"); client->SetBucket("nested.test1.a", "value1");
client->SetBucket("nested.test2.a", "value2"); client->SetBucket("nested.test2.a", "value2");
client->SetBucket("nested.test2", "new_value"); // Should be **rejected** client->SetBucket("nested.test2", "new_value"); // Should be **rejected**
value = client->GetBucket("nested"); value = client->GetBucket("nested");
RunTest("Prevent Overwriting Objects", R"({"test1":{"a":"value1"},"test2":{"a":"value2"}})", value); RunTest("Prevent Overwriting Objects", R"({"test1":{"a":"value1"},"test2":{"a":"value2"}})", value);
@@ -160,9 +182,10 @@ void ZoneCLI::TestDataBuckets(int argc, char **argv, argh::parser &cmd, std::str
client->DeleteBucket("complex"); client->DeleteBucket("complex");
client->SetBucket("complex.nested.obj1", "data1"); client->SetBucket("complex.nested.obj1", "data1");
client->SetBucket("complex.nested.obj2", "data2"); client->SetBucket("complex.nested.obj2", "data2");
client->DeleteBucket("does_not_exist"); // Should do nothing client->DeleteBucket("does_not_exist"); // Should do nothing
value = client->GetBucket("complex"); value = client->GetBucket("complex");
RunTest("Deleting Non-Existent Key Doesn't Break Existing Data", R"({"nested":{"obj1":"data1","obj2":"data2"}})", value); RunTest("Deleting Non-Existent Key Doesn't Break Existing Data", R"({"nested":{"obj1":"data1","obj2":"data2"}})",
value);
// Get nested key value one level up ** // Get nested key value one level up **
client->DeleteBucket("complex"); client->DeleteBucket("complex");
@@ -190,12 +213,12 @@ void ZoneCLI::TestDataBuckets(int argc, char **argv, argh::parser &cmd, std::str
value = client->GetBucket("json_array"); value = client->GetBucket("json_array");
RunTest("Store and Retrieve JSON Array", R"(["item1", "item2"])", value); RunTest("Store and Retrieve JSON Array", R"(["item1", "item2"])", value);
// // Prevent Overwriting Array with Object** // // Prevent Overwriting Array with Object**
// client->DeleteBucket("json_array"); // client->DeleteBucket("json_array");
// client->SetBucket("json_array", R"(["item1", "item2"])"); // client->SetBucket("json_array", R"(["item1", "item2"])");
// client->SetBucket("json_array.item", "new_value"); // Should be rejected // client->SetBucket("json_array.item", "new_value"); // Should be rejected
// value = client->GetBucket("json_array"); // value = client->GetBucket("json_array");
// RunTest("Prevent Overwriting Array with Object", R"(["item1", "item2"])", value); // RunTest("Prevent Overwriting Array with Object", R"(["item1", "item2"])", value);
// Retrieve Non-Existent Nested Key** // Retrieve Non-Existent Nested Key**
client->DeleteBucket("nested_partial"); client->DeleteBucket("nested_partial");
@@ -235,11 +258,93 @@ void ZoneCLI::TestDataBuckets(int argc, char **argv, argh::parser &cmd, std::str
RunTest("Setting a nested key with an expiration protection test", R"({"test":{"test":"shouldnt_expire"}})", value); RunTest("Setting a nested key with an expiration protection test", R"({"test":{"test":"shouldnt_expire"}})", value);
// Delete Deep Nested Key Keeps Parent** // Delete Deep Nested Key Keeps Parent**
// client->DeleteBucket("deep_nested"); // client->DeleteBucket("deep_nested");
// client->SetBucket("deep_nested.level1.level2.level3", R"({"key": "value"})"); // client->SetBucket("deep_nested.level1.level2.level3", R"({"key": "value"})");
// client->DeleteBucket("deep_nested.level1.level2.level3.key"); // client->DeleteBucket("deep_nested.level1.level2.level3.key");
// value = client->GetBucket("deep_nested.level1.level2.level3"); // value = client->GetBucket("deep_nested.level1.level2.level3");
// RunTest("Delete Deep Nested Key Keeps Parent", "{}", value); // RunTest("Delete Deep Nested Key Keeps Parent", "{}", value);
// ================================
// 🧪 Scoped Cache-Miss Behavior Tests
// ================================
// Ensure a scoped key (character ID) that doesn't exist is not fetched from DB if not in cache
client->DeleteBucket("scoped_miss_test"); // Ensure not in DB
DataBucket::ClearCache(); // Clear all caches
std::string scoped_miss_value = client->GetBucket("scoped_miss_test");
RunTest("Scoped Missing Key Returns Empty (Skips DB)", "", scoped_miss_value);
// Ensure nested scoped key that isn't in cache returns empty immediately
client->DeleteBucket("scoped_nested_miss.key");
DataBucket::ClearCache(); // Clear cache again
std::string scoped_nested_miss = client->GetBucket("scoped_nested_miss.key");
RunTest("Nested Scoped Key Miss Returns Empty (Skips DB)", "", scoped_nested_miss);
// Write to a key that was previously missed (0-id cached miss)
client->DeleteBucket("cache_miss_overwrite");
DataBucket::ClearCache(); // Ensure clean slate
std::string missed_value = client->GetBucket("cache_miss_overwrite");
RunTest("Initial Cache Miss Returns Empty", "", missed_value);
client->SetBucket("cache_miss_overwrite", "new_value");
std::string new_val = client->GetBucket("cache_miss_overwrite");
RunTest("Overwrite After Cache Miss Works", "new_value", new_val);
// Write a nested key that previously missed
client->DeleteBucket("missed_nested_set.test");
DataBucket::ClearCache();
std::string initial = client->GetBucket("missed_nested_set.test");
RunTest("Missed Nested Key Returns Empty", "", initial);
client->SetBucket("missed_nested_set.test", "set_value");
std::string after_write = client->GetBucket("missed_nested_set.test");
RunTest("Nested Set After Miss Works", "set_value", after_write);
// ================================
// 🧪 Scoped Cache Preload Tests (Account + Client)
// ================================
// Clear everything for a clean test
// Insert directly into the DB without touching cache
const std::string scoped_key = "scoped_db_only_key";
client->DeleteBucket(scoped_key);
DataBucket::ClearCache();
// ✅ Scoped insert
DataBucketsRepository::InsertOne(
database, {
.key_ = scoped_key,
.value = "cached_value",
.character_id = client->CharacterID()
}
);
// Cold cache test — should return ""
std::string cold_value = client->GetBucket(scoped_key);
RunTest("Cold Cache Scoped Key Returns Empty (Due to Skip DB)", "", cold_value);
// ✅ Reload cache
client->LoadDataBucketsCache();
// Cache should now return the value
std::string hot_value = client->GetBucket(scoped_key);
RunTest("Post-BulkLoad Scoped Key Returns Value", "cached_value", hot_value);
// Also test nested key after preload
client->DeleteBucket("ac_nested.test");
client->SetBucket("ac_nested.test", "nested_val");
// Clear cache, then preload
DataBucket::ClearCache();
client->LoadDataBucketsCache();
std::string nested_value = client->GetBucket("ac_nested.test");
RunTest("Post-BulkLoad Nested Scoped Key Returns Value", "nested_val", nested_value);
// Remove and check that cache misses properly again
client->DeleteBucket("ac_nested.test");
DataBucket::ClearCache();
std::string post_delete_check = client->GetBucket("ac_nested.test");
RunTest("Post-Delete Nested Scoped Key Returns Empty", "", post_delete_check);
std::cout << "\n===========================================\n"; std::cout << "\n===========================================\n";
std::cout << "✅ All DataBucket Tests Completed!\n"; std::cout << "✅ All DataBucket Tests Completed!\n";
@@ -1,4 +1,3 @@
#include "../../common/http/httplib.h"
#include "../../common/eqemu_logsys.h" #include "../../common/eqemu_logsys.h"
#include "../../common/platform.h" #include "../../common/platform.h"
#include "../../zone.h" #include "../../zone.h"
+20 -6
View File
@@ -68,6 +68,7 @@ extern volatile bool RunLoops;
#include "../common/repositories/character_disciplines_repository.h" #include "../common/repositories/character_disciplines_repository.h"
#include "../common/repositories/character_data_repository.h" #include "../common/repositories/character_data_repository.h"
#include "../common/repositories/character_pet_name_repository.h" #include "../common/repositories/character_pet_name_repository.h"
#include "../common/repositories/completed_tasks_repository.h"
#include "../common/repositories/discovered_items_repository.h" #include "../common/repositories/discovered_items_repository.h"
#include "../common/repositories/inventory_repository.h" #include "../common/repositories/inventory_repository.h"
#include "../common/repositories/keyring_repository.h" #include "../common/repositories/keyring_repository.h"
@@ -85,7 +86,6 @@ extern Zone* zone;
extern volatile bool is_zone_loaded; extern volatile bool is_zone_loaded;
extern WorldServer worldserver; extern WorldServer worldserver;
extern uint32 numclients; extern uint32 numclients;
extern PetitionList petition_list;
void UpdateWindowTitle(char* iNewTitle); void UpdateWindowTitle(char* iNewTitle);
@@ -2232,7 +2232,7 @@ void Client::UpdateAdmin(bool from_database) {
if (m_pp.gm) { if (m_pp.gm) {
LogInfo("[{}] - [{}] is a GM", __FUNCTION__ , GetName()); LogInfo("[{}] - [{}] is a GM", __FUNCTION__ , GetName());
petition_list.UpdateGMQueue(); PetitionList::Instance()->UpdateGMQueue();
} }
UpdateWho(); UpdateWho();
@@ -3196,7 +3196,7 @@ bool Client::CanHaveSkill(EQ::skills::SkillType skill_id) const
skill_id = EQ::skills::Skill2HPiercing; 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 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; 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) 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; 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) uint16 Client::GetMaxSkillAfterSpecializationRules(EQ::skills::SkillType skillid, uint16 maxSkill)
@@ -12099,7 +12099,7 @@ void Client::MaxSkills()
auto current_skill_value = ( auto current_skill_value = (
EQ::skills::IsSpecializedSkill(s.first) ? EQ::skills::IsSpecializedSkill(s.first) ?
MAX_SPECIALIZED_SKILL : 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) { if (GetSkill(s.first) < current_skill_value) {
@@ -13253,3 +13253,17 @@ void Client::CheckItemDiscoverability(uint32 item_id)
DiscoverItem(item_id); DiscoverItem(item_id);
} }
bool Client::UncompleteTask(int task_id)
{
CompletedTasksRepository::DeleteWhere(
database,
fmt::format(
"charid = {} AND taskid = {}",
CharacterID(),
task_id
)
);
return task_state->UncompleteTask(task_id);
}
+9 -6
View File
@@ -98,7 +98,6 @@ namespace EQ
#define MAX_SPECIALIZED_SKILL 50 #define MAX_SPECIALIZED_SKILL 50
extern Zone* zone; extern Zone* zone;
extern TaskManager *task_manager;
class CLIENTPACKET class CLIENTPACKET
{ {
@@ -1359,7 +1358,7 @@ public:
} }
inline bool SaveTaskState() 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 IsTaskStateLoaded() { return task_state != nullptr; }
inline bool IsTaskActive(int task_id) { return task_state != nullptr && task_state->IsTaskActive(task_id); } 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) inline void TaskSetSelector(Mob* mob, int task_set_id, bool ignore_cooldown)
{ {
if (task_manager && task_state) { if (task_state) {
task_manager->TaskSetSelector(this, mob, task_set_id, ignore_cooldown); TaskManager::Instance()->TaskSetSelector(this, mob, task_set_id, ignore_cooldown);
} }
} }
inline void TaskQuestSetSelector(Mob* mob, const std::vector<int>& tasks, bool ignore_cooldown) inline void TaskQuestSetSelector(Mob* mob, const std::vector<int>& tasks, bool ignore_cooldown)
{ {
if (task_manager && task_state) { if (task_state) {
task_manager->TaskQuestSetSelector(this, mob, tasks, ignore_cooldown); TaskManager::Instance()->TaskQuestSetSelector(this, mob, tasks, ignore_cooldown);
} }
} }
inline void EnableTask(int task_count, int *task_list) inline void EnableTask(int task_count, int *task_list)
@@ -1501,6 +1500,7 @@ public:
{ {
return task_state ? task_state->CompleteTask(this, task_id) : false; return task_state ? task_state->CompleteTask(this, task_id) : false;
} }
bool UncompleteTask(int task_id);
inline void FailTask(int task_id) { if (task_state) { task_state->FailTask(this, task_id); }} inline void FailTask(int task_id) { if (task_state) { task_state->FailTask(this, task_id); }}
inline int TaskTimeLeft(int task_id) { return (task_state ? task_state->TaskTimeLeft(task_id) : 0); } inline int TaskTimeLeft(int task_id) { return (task_state ? task_state->TaskTimeLeft(task_id) : 0); }
inline int EnabledTaskCount(int task_set_id) inline int EnabledTaskCount(int task_set_id)
@@ -1959,6 +1959,9 @@ public:
ExternalHandinMoneyReturned GetExternalHandinMoneyReturned() { return m_external_handin_money_returned; } ExternalHandinMoneyReturned GetExternalHandinMoneyReturned() { return m_external_handin_money_returned; }
std::vector<uint32_t> GetExternalHandinItemsReturned() { return m_external_handin_items_returned; } std::vector<uint32_t> GetExternalHandinItemsReturned() { return m_external_handin_items_returned; }
// used only for testing
inline void SetCharacterId(uint32_t id) { character_id = id; }
protected: protected:
friend class Mob; friend class Mob;
void CalcEdibleBonuses(StatBonuses* newbon); void CalcEdibleBonuses(StatBonuses* newbon);
+26 -19
View File
@@ -337,24 +337,29 @@ bool Client::DoEvolveCheckProgression(EQ::ItemInstance &inst)
!RuleB(EvolvingItems, DestroyAugmentsOnEvolve) && !RuleB(EvolvingItems, DestroyAugmentsOnEvolve) &&
inst.IsAugmented() inst.IsAugmented()
) { ) {
auto const augs = inst.GetAugmentIDs(); auto const augs = inst.GetAugmentIDs();
std::vector<CharacterParcelsRepository::CharacterParcels> parcels; std::vector<CharacterParcelsRepository::CharacterParcels> parcels;
for (auto const &item_id: augs) { int32 next_slot = FindNextFreeParcelSlotUsingMemory();
if (!item_id) { for (auto const &item_id: augs) {
continue; if (!item_id) {
} continue;
}
CharacterParcelsRepository::CharacterParcels p{}; if (next_slot == INVALID_INDEX) {
p.char_id = CharacterID(); break;
p.from_name = "Evolving Item Sub-System"; }
p.note = fmt::format(
"System automatically removed from {} which recently evolved.", CharacterParcelsRepository::CharacterParcels p{};
inst.GetItem()->Name p.char_id = CharacterID();
); p.from_name = "Evolving Item Sub-System";
p.slot_id = FindNextFreeParcelSlotUsingMemory(); p.note = fmt::format(
p.sent_date = time(nullptr); "System automatically removed from {} which recently evolved.",
p.item_id = item_id; inst.GetItem()->Name
p.quantity = 1; );
p.slot_id = next_slot;
p.sent_date = time(nullptr);
p.item_id = item_id;
p.quantity = 1;
if (player_event_logs.IsEventEnabled(PlayerEvent::PARCEL_SEND)) { if (player_event_logs.IsEventEnabled(PlayerEvent::PARCEL_SEND)) {
PlayerEvent::ParcelSend e{}; PlayerEvent::ParcelSend e{};
@@ -367,8 +372,10 @@ bool Client::DoEvolveCheckProgression(EQ::ItemInstance &inst)
RecordPlayerEventLog(PlayerEvent::PARCEL_SEND, e); RecordPlayerEventLog(PlayerEvent::PARCEL_SEND, e);
} }
parcels.push_back(p); parcels.push_back(p);
} m_parcels.emplace(p.slot_id, p);
next_slot = FindNextFreeParcelSlotUsingMemory();
}
CharacterParcelsRepository::InsertMany(database, parcels); CharacterParcelsRepository::InsertMany(database, parcels);
SendParcelStatus(); SendParcelStatus();
+24 -25
View File
@@ -79,7 +79,6 @@ extern QueryServ* QServ;
extern Zone* zone; extern Zone* zone;
extern volatile bool is_zone_loaded; extern volatile bool is_zone_loaded;
extern WorldServer worldserver; extern WorldServer worldserver;
extern PetitionList petition_list;
extern EntityList entity_list; extern EntityList entity_list;
typedef void (Client::*ClientPacketProc)(const EQApplicationPacket *app); typedef void (Client::*ClientPacketProc)(const EQApplicationPacket *app);
@@ -6963,7 +6962,7 @@ void Client::Handle_OP_GMSearchCorpse(const EQApplicationPacket *app)
DialogueWindow::TableCell( DialogueWindow::TableCell(
fmt::format( fmt::format(
"{} ({})", "{} ({})",
zone_store.GetZoneLongName(e.zone_id, true), ZoneStore::Instance()->GetZoneLongName(e.zone_id, true),
e.zone_id e.zone_id
) )
) + ) +
@@ -11058,7 +11057,7 @@ void Client::Handle_OP_PDeletePetition(const EQApplicationPacket *app)
LogError("Wrong size: OP_PDeletePetition, size=[{}], expected [{}]", app->size, 2); LogError("Wrong size: OP_PDeletePetition, size=[{}], expected [{}]", app->size, 2);
return; return;
} }
if (petition_list.DeletePetitionByCharName((char*)app->pBuffer)) if (PetitionList::Instance()->DeletePetitionByCharName((char*)app->pBuffer))
MessageString(Chat::White, PETITION_DELETED); MessageString(Chat::White, PETITION_DELETED);
else else
MessageString(Chat::White, PETITION_NO_DELETE); MessageString(Chat::White, PETITION_NO_DELETE);
@@ -11736,7 +11735,7 @@ void Client::Handle_OP_Petition(const EQApplicationPacket *app)
}*/ }*/
else else
{ {
if (petition_list.FindPetitionByAccountName(AccountName())) if (PetitionList::Instance()->FindPetitionByAccountName(AccountName()))
{ {
Message(Chat::White, "You already have a petition in the queue, you must wait for it to be answered or use /deletepetition to delete it."); Message(Chat::White, "You already have a petition in the queue, you must wait for it to be answered or use /deletepetition to delete it.");
return; return;
@@ -11752,10 +11751,10 @@ void Client::Handle_OP_Petition(const EQApplicationPacket *app)
pet->SetPetitionText((char*)app->pBuffer); pet->SetPetitionText((char*)app->pBuffer);
pet->SetZone(zone->GetZoneID()); pet->SetZone(zone->GetZoneID());
pet->SetUrgency(0); pet->SetUrgency(0);
petition_list.AddPetition(pet); PetitionList::Instance()->AddPetition(pet);
database.InsertPetitionToDB(pet); database.InsertPetitionToDB(pet);
petition_list.UpdateGMQueue(); PetitionList::Instance()->UpdateGMQueue();
petition_list.UpdateZoneListQueue(); PetitionList::Instance()->UpdateZoneListQueue();
worldserver.SendEmoteMessage( worldserver.SendEmoteMessage(
0, 0,
0, 0,
@@ -11786,16 +11785,16 @@ void Client::Handle_OP_PetitionCheckIn(const EQApplicationPacket *app)
} }
Petition_Struct* inpet = (Petition_Struct*)app->pBuffer; Petition_Struct* inpet = (Petition_Struct*)app->pBuffer;
Petition* pet = petition_list.GetPetitionByID(inpet->petnumber); Petition* pet = PetitionList::Instance()->GetPetitionByID(inpet->petnumber);
//if (inpet->urgency != pet->GetUrgency()) //if (inpet->urgency != pet->GetUrgency())
pet->SetUrgency(inpet->urgency); pet->SetUrgency(inpet->urgency);
pet->SetLastGM(GetName()); pet->SetLastGM(GetName());
pet->SetGMText(inpet->gmtext); pet->SetGMText(inpet->gmtext);
pet->SetCheckedOut(false); pet->SetCheckedOut(false);
petition_list.UpdatePetition(pet); PetitionList::Instance()->UpdatePetition(pet);
petition_list.UpdateGMQueue(); PetitionList::Instance()->UpdateGMQueue();
petition_list.UpdateZoneListQueue(); PetitionList::Instance()->UpdateZoneListQueue();
return; return;
} }
@@ -11809,14 +11808,14 @@ void Client::Handle_OP_PetitionCheckout(const EQApplicationPacket *app)
Message(Chat::Red, "Error: World server disconnected"); Message(Chat::Red, "Error: World server disconnected");
else { else {
uint32 getpetnum = *((uint32*)app->pBuffer); uint32 getpetnum = *((uint32*)app->pBuffer);
Petition* getpet = petition_list.GetPetitionByID(getpetnum); Petition* getpet = PetitionList::Instance()->GetPetitionByID(getpetnum);
if (getpet != 0) { if (getpet != 0) {
getpet->AddCheckout(); getpet->AddCheckout();
getpet->SetCheckedOut(true); getpet->SetCheckedOut(true);
getpet->SendPetitionToPlayer(CastToClient()); getpet->SendPetitionToPlayer(CastToClient());
petition_list.UpdatePetition(getpet); PetitionList::Instance()->UpdatePetition(getpet);
petition_list.UpdateGMQueue(); PetitionList::Instance()->UpdateGMQueue();
petition_list.UpdateZoneListQueue(); PetitionList::Instance()->UpdateZoneListQueue();
} }
} }
return; return;
@@ -11836,16 +11835,16 @@ void Client::Handle_OP_PetitionDelete(const EQApplicationPacket *app)
pet->senttime = 0; pet->senttime = 0;
strcpy(pet->accountid, ""); strcpy(pet->accountid, "");
strcpy(pet->gmsenttoo, ""); strcpy(pet->gmsenttoo, "");
pet->quetotal = petition_list.GetTotalPetitions(); pet->quetotal = PetitionList::Instance()->GetTotalPetitions();
strcpy(pet->charname, ""); strcpy(pet->charname, "");
FastQueuePacket(&outapp); FastQueuePacket(&outapp);
if (petition_list.DeletePetition(pet->petnumber) == -1) if (PetitionList::Instance()->DeletePetition(pet->petnumber) == -1)
std::cout << "Something is borked with: " << pet->petnumber << std::endl; std::cout << "Something is borked with: " << pet->petnumber << std::endl;
petition_list.ClearPetitions(); PetitionList::Instance()->ClearPetitions();
petition_list.UpdateGMQueue(); PetitionList::Instance()->UpdateGMQueue();
petition_list.ReadDatabase(); PetitionList::Instance()->ReadDatabase();
petition_list.UpdateZoneListQueue(); PetitionList::Instance()->UpdateZoneListQueue();
return; return;
} }
@@ -11880,12 +11879,12 @@ void Client::Handle_OP_PetitionUnCheckout(const EQApplicationPacket *app)
Message(Chat::Red, "Error: World server disconnected"); Message(Chat::Red, "Error: World server disconnected");
else { else {
uint32 getpetnum = *((uint32*)app->pBuffer); uint32 getpetnum = *((uint32*)app->pBuffer);
Petition* getpet = petition_list.GetPetitionByID(getpetnum); Petition* getpet = PetitionList::Instance()->GetPetitionByID(getpetnum);
if (getpet != 0) { if (getpet != 0) {
getpet->SetCheckedOut(false); getpet->SetCheckedOut(false);
petition_list.UpdatePetition(getpet); PetitionList::Instance()->UpdatePetition(getpet);
petition_list.UpdateGMQueue(); PetitionList::Instance()->UpdateGMQueue();
petition_list.UpdateZoneListQueue(); PetitionList::Instance()->UpdateZoneListQueue();
} }
} }
return; return;
-1
View File
@@ -57,7 +57,6 @@ extern QueryServ* QServ;
extern Zone* zone; extern Zone* zone;
extern volatile bool is_zone_loaded; extern volatile bool is_zone_loaded;
extern WorldServer worldserver; extern WorldServer worldserver;
extern PetitionList petition_list;
extern EntityList entity_list; extern EntityList entity_list;
bool Client::Process() { bool Client::Process() {
-159
View File
@@ -34,7 +34,6 @@
extern QueryServ* QServ; extern QueryServ* QServ;
extern WorldServer worldserver; extern WorldServer worldserver;
extern TaskManager *task_manager;
extern FastMath g_Math; extern FastMath g_Math;
void CatchSignal(int sig_num); void CatchSignal(int sig_num);
@@ -783,161 +782,3 @@ void command_bot(Client *c, const Seperator *sep)
c->Message(Chat::Red, "Bots are disabled on this server."); 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"
+12 -7
View File
@@ -1,5 +1,3 @@
#include <regex>
#include "dialogue_window.h" #include "dialogue_window.h"
void DialogueWindow::Render(Client *c, std::string markdown) void DialogueWindow::Render(Client *c, std::string markdown)
@@ -529,12 +527,19 @@ std::string DialogueWindow::CenterMessage(std::string message)
return std::string(); return std::string();
} }
auto cleaned_message = message; std::string cleaned_message;
cleaned_message.reserve(message.size());
std::regex tags("<[^>]*>"); // Strip HTML-like tags
bool in_tag = false;
if (std::regex_search(cleaned_message, tags)) { for (char c : message) {
std::regex_replace(cleaned_message, tags, cleaned_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(); auto message_len = cleaned_message.length();
+139 -127
View File
@@ -1271,6 +1271,16 @@ void Perl__failtask(int task_id)
quest_manager.failtask(task_id); quest_manager.failtask(task_id);
} }
bool Perl__completetask(int task_id)
{
return quest_manager.completetask(task_id);
}
bool Perl__uncompletetask(int task_id)
{
return quest_manager.uncompletetask(task_id);
}
int Perl__tasktimeleft(int task_id) int Perl__tasktimeleft(int task_id)
{ {
return quest_manager.tasktimeleft(task_id); return quest_manager.tasktimeleft(task_id);
@@ -5115,627 +5125,627 @@ void Perl__send_player_handin_event()
float Perl__GetZoneSafeX(uint32 zone_id) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) void Perl__send_channel_message(uint8 channel_number, uint32 guild_id, uint8 language_id, uint8 language_skill, const char* message)
@@ -5860,12 +5870,12 @@ bool Perl__SetAutoLoginCharacterNameByAccountID(uint32 account_id, std::string c
uint32 Perl__GetZoneIDByLongName(std::string zone_long_name) 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) 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) bool Perl__send_parcel(perl::reference table_ref)
@@ -6628,6 +6638,8 @@ void perl_register_quest()
package.add("faction", (void(*)(int, int, int))&Perl__faction); package.add("faction", (void(*)(int, int, int))&Perl__faction);
package.add("factionvalue", &Perl__FactionValue); package.add("factionvalue", &Perl__FactionValue);
package.add("failtask", &Perl__failtask); package.add("failtask", &Perl__failtask);
package.add("completetask", &Perl__completetask);
package.add("uncompletetask", &Perl__uncompletetask);
package.add("firsttaskinset", &Perl__firsttaskinset); package.add("firsttaskinset", &Perl__firsttaskinset);
package.add("follow", (void(*)(int))&Perl__follow); package.add("follow", (void(*)(int))&Perl__follow);
package.add("follow", (void(*)(int, int))&Perl__follow); package.add("follow", (void(*)(int, int))&Perl__follow);
+1 -1
View File
@@ -138,7 +138,7 @@ void Embperl::DoInit()
LogQuests("Warning [{}]: [{}]", Config->PluginPlFile, e); LogQuests("Warning [{}]: [{}]", Config->PluginPlFile, e);
} }
for (auto & dir : path.GetPluginPaths()) { for (auto & dir : PathManager::Instance()->GetPluginPaths()) {
try { try {
//should probably read the directory in c, instead, so that //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 //I can echo filenames as I do it, but c'mon... I'm lazy and this 1 line reads in all the plugins
+3 -11
View File
@@ -55,7 +55,6 @@ extern Zone *zone;
extern volatile bool is_zone_loaded; extern volatile bool is_zone_loaded;
extern WorldServer worldserver; extern WorldServer worldserver;
extern uint32 numclients; extern uint32 numclients;
extern PetitionList petition_list;
extern char errorname[32]; extern char errorname[32];
@@ -3447,7 +3446,7 @@ void EntityList::SendPetitionToAdmins(Petition *pet)
strcpy(pcus->accountid, pet->GetAccountName()); strcpy(pcus->accountid, pet->GetAccountName());
strcpy(pcus->charname, pet->GetCharName()); strcpy(pcus->charname, pet->GetCharName());
} }
pcus->quetotal = petition_list.GetTotalPetitions(); pcus->quetotal = PetitionList::Instance()->GetTotalPetitions();
auto it = client_list.begin(); auto it = client_list.begin();
while (it != client_list.end()) { while (it != client_list.end()) {
if (it->second->CastToClient()->Admin() >= AccountStatus::QuestTroupe) { if (it->second->CastToClient()->Admin() >= AccountStatus::QuestTroupe) {
@@ -3472,7 +3471,7 @@ void EntityList::ClearClientPetitionQueue()
strcpy(pet->accountid, ""); strcpy(pet->accountid, "");
strcpy(pet->gmsenttoo, ""); strcpy(pet->gmsenttoo, "");
strcpy(pet->charname, ""); strcpy(pet->charname, "");
pet->quetotal = petition_list.GetTotalPetitions(); pet->quetotal = PetitionList::Instance()->GetTotalPetitions();
auto it = client_list.begin(); auto it = client_list.begin();
while (it != client_list.end()) { while (it != client_list.end()) {
if (it->second->CastToClient()->Admin() >= AccountStatus::GMAdmin) { if (it->second->CastToClient()->Admin() >= AccountStatus::GMAdmin) {
@@ -4175,10 +4174,6 @@ void EntityList::ProcessProximitySay(const char *message, Client *c, uint8 langu
void EntityList::SaveAllClientsTaskState() void EntityList::SaveAllClientsTaskState()
{ {
if (!task_manager) {
return;
}
auto it = client_list.begin(); auto it = client_list.begin();
while (it != client_list.end()) { while (it != client_list.end()) {
Client *client = it->second; Client *client = it->second;
@@ -4192,9 +4187,6 @@ void EntityList::SaveAllClientsTaskState()
void EntityList::ReloadAllClientsTaskState(int task_id) void EntityList::ReloadAllClientsTaskState(int task_id)
{ {
if (!task_manager)
return;
auto it = client_list.begin(); auto it = client_list.begin();
while (it != client_list.end()) { while (it != client_list.end()) {
Client *client = it->second; Client *client = it->second;
@@ -4205,7 +4197,7 @@ void EntityList::ReloadAllClientsTaskState(int task_id)
Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] Reloading Task State For Client %s", client->GetName()); Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] Reloading Task State For Client %s", client->GetName());
client->RemoveClientTaskState(); client->RemoveClientTaskState();
client->LoadClientTaskState(); client->LoadClientTaskState();
task_manager->SendActiveTasksToClient(client); TaskManager::Instance()->SendActiveTasksToClient(client);
} }
} }
++it; ++it;
+9 -9
View File
@@ -3,6 +3,15 @@
#include "../dialogue_window.h" #include "../dialogue_window.h"
#include "../../common/repositories/data_buckets_repository.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) void command_databuckets(Client *c, const Seperator *sep)
{ {
const int arguments = sep->argnum; const int arguments = sep->argnum;
@@ -251,12 +260,3 @@ void command_databuckets(Client *c, const Seperator *sep)
c->Message(Chat::White, response.c_str()); 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");
}
+1
View File
@@ -1,3 +1,4 @@
#include "../../object.h"
#include "../../client.h" #include "../../client.h"
void FindObjectType(Client *c, const Seperator *sep) void FindObjectType(Client *c, const Seperator *sep)
+2 -2
View File
@@ -11,7 +11,7 @@ void FindTask(Client *c, const Seperator *sep)
if (sep->IsNumber(2)) { if (sep->IsNumber(2)) {
const auto task_id = Strings::ToUnsignedInt(sep->arg[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()) { if (task_name.empty()) {
c->Message( c->Message(
@@ -41,7 +41,7 @@ void FindTask(Client *c, const Seperator *sep)
auto found_count = 0; 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 = t.second.title;
const auto& task_name_lower = Strings::ToLower(task_name); const auto& task_name_lower = Strings::ToLower(task_name);
if (!Strings::Contains(task_name_lower, search_criteria)) { if (!Strings::Contains(task_name_lower, search_criteria)) {
+16 -16
View File
@@ -8,6 +8,22 @@ extern QueryServ *QServ;
#include "../guild_mgr.h" #include "../guild_mgr.h"
#include "../doors.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) void command_guild(Client* c, const Seperator* sep)
{ {
const auto arguments = sep->argnum; const auto arguments = sep->argnum;
@@ -676,19 +692,3 @@ 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]");
}
+1
View File
@@ -1,3 +1,4 @@
#include "../dialogue_window.h"
#include "../client.h" #include "../client.h"
void command_illusion_block(Client* c, const Seperator* sep) void command_illusion_block(Client* c, const Seperator* sep)
+1
View File
@@ -2,6 +2,7 @@
#include "../corpse.h" #include "../corpse.h"
#include "../object.h" #include "../object.h"
#include "../doors.h" #include "../doors.h"
#include "../command.h"
struct UniqueEntity { struct UniqueEntity {
uint16 entity_id; uint16 entity_id;
+1
View File
@@ -1,4 +1,5 @@
#include "../client.h" #include "../client.h"
#include "../water_map.h"
void command_loc(Client *c, const Seperator *sep) void command_loc(Client *c, const Seperator *sep)
{ {
+58 -58
View File
@@ -1,63 +1,5 @@
#include "../client.h" #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<std::string, std::string> GetModifyNPCStatMap() std::map<std::string, std::string> GetModifyNPCStatMap()
{ {
std::map<std::string, std::string> identifiers_map = { std::map<std::string, std::string> 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()
);
}
+1
View File
@@ -1,3 +1,4 @@
#include "../bot.h"
#include "../client.h" #include "../client.h"
void command_mystats(Client *c, const Seperator *sep) void command_mystats(Client *c, const Seperator *sep)
+109 -109
View File
@@ -3,6 +3,115 @@
#include "../raids.h" #include "../raids.h"
#include "../../common/repositories/npc_types_repository.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) void command_npcedit(Client *c, const Seperator *sep)
{ {
if (!c->GetTarget() || !c->GetTarget()->IsNPC()) { if (!c->GetTarget() || !c->GetTarget()->IsNPC()) {
@@ -1728,112 +1837,3 @@ void command_npcedit(Client *c, const Seperator *sep)
c->Message(Chat::White, d.c_str()); 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");
}
+15 -12
View File
@@ -1,9 +1,23 @@
#include "../client.h" #include "../client.h"
#include "../queryserv.h"
#include "../worldserver.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; 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) void command_parcels(Client *c, const Seperator *sep)
{ {
const auto arguments = sep->argnum; const auto arguments = sep->argnum;
@@ -306,14 +320,3 @@ void command_parcels(Client *c, const Seperator *sep)
} }
} }
} }
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]");
}
+1
View File
@@ -1,3 +1,4 @@
#include "../bot.h"
#include "../client.h" #include "../client.h"
void command_petitems(Client *c, const Seperator *sep) void command_petitems(Client *c, const Seperator *sep)
+1
View File
@@ -1,3 +1,4 @@
#include "../../bot.h"
#include "../../client.h" #include "../../client.h"
void SetHaste(Client *c, const Seperator *sep) void SetHaste(Client *c, const Seperator *sep)
+1 -1
View File
@@ -273,7 +273,7 @@ void SetZoneData(Client *c, const Seperator *sep)
entity_list.QueueClients(c, outapp); entity_list.QueueClients(c, outapp);
safe_delete(outapp); safe_delete(outapp);
zone_store.LoadZones(content_db); ZoneStore::Instance()->LoadZones(content_db);
c->Message( c->Message(
Chat::White, Chat::White,
+16 -16
View File
@@ -1,6 +1,22 @@
#include "../../client.h" #include "../../client.h"
#include "../../object.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) void ShowInventory(Client *c, const Seperator *sep)
{ {
const auto arguments = sep->argnum; const auto arguments = sep->argnum;
@@ -433,19 +449,3 @@ void ShowInventory(Client *c, const Seperator *sep)
c->Message(Chat::White, "No items found."); 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");
}
+10 -19
View File
@@ -176,7 +176,7 @@ void command_task(Client *c, const Seperator *sep)
Chat::White, Chat::White,
fmt::format( fmt::format(
"Assigned {} (ID {}) to {}.", "Assigned {} (ID {}) to {}.",
task_manager->GetTaskName(task_id), TaskManager::Instance()->GetTaskName(task_id),
task_id, task_id,
c->GetTargetDescription(t) c->GetTargetDescription(t)
).c_str() ).c_str()
@@ -197,7 +197,7 @@ void command_task(Client *c, const Seperator *sep)
Chat::White, Chat::White,
fmt::format( fmt::format(
"Successfully completed {} (ID {}) for {}.", "Successfully completed {} (ID {}) for {}.",
task_manager->GetTaskName(task_id), TaskManager::Instance()->GetTaskName(task_id),
task_id, task_id,
c->GetTargetDescription(t) c->GetTargetDescription(t)
).c_str() ).c_str()
@@ -207,7 +207,7 @@ void command_task(Client *c, const Seperator *sep)
Chat::White, Chat::White,
fmt::format( fmt::format(
"Failed to complete {} (ID {}) for {}.", "Failed to complete {} (ID {}) for {}.",
task_manager->GetTaskName(task_id), TaskManager::Instance()->GetTaskName(task_id),
task_id, task_id,
c->GetTargetDescription(t) c->GetTargetDescription(t)
).c_str() ).c_str()
@@ -220,7 +220,7 @@ void command_task(Client *c, const Seperator *sep)
"{} {} not have not {} (ID {}) assigned to them.", "{} {} not have not {} (ID {}) assigned to them.",
c->GetTargetDescription(t, TargetDescriptionType::UCYou), c->GetTargetDescription(t, TargetDescriptionType::UCYou),
c == t ? "do" : "does", c == t ? "do" : "does",
task_manager->GetTaskName(task_id), TaskManager::Instance()->GetTaskName(task_id),
task_id task_id
).c_str() ).c_str()
); );
@@ -256,7 +256,7 @@ void command_task(Client *c, const Seperator *sep)
Chat::White, Chat::White,
fmt::format( fmt::format(
"Attempting to reload {} (ID {}).", "Attempting to reload {} (ID {}).",
task_manager->GetTaskName(task_id), TaskManager::Instance()->GetTaskName(task_id),
task_id task_id
).c_str() ).c_str()
); );
@@ -265,7 +265,7 @@ void command_task(Client *c, const Seperator *sep)
Chat::White, Chat::White,
fmt::format( fmt::format(
"Successfully reloaded {} (ID {}).", "Successfully reloaded {} (ID {}).",
task_manager->GetTaskName(task_id), TaskManager::Instance()->GetTaskName(task_id),
task_id task_id
).c_str() ).c_str()
); );
@@ -304,21 +304,12 @@ void command_task(Client *c, const Seperator *sep)
return; return;
} }
if ( if (t->UncompleteTask(task_id)) {
CompletedTasksRepository::DeleteWhere(
database,
fmt::format(
"charid = {} AND taskid = {}",
t->CharacterID(),
task_id
)
)
) {
c->Message( c->Message(
Chat::White, Chat::White,
fmt::format( fmt::format(
"Successfully uncompleted {} (ID {}) for {}.", "Successfully uncompleted {} (ID {}) for {}.",
task_manager->GetTaskName(task_id), TaskManager::Instance()->GetTaskName(task_id),
task_id, task_id,
c->GetTargetDescription(t) c->GetTargetDescription(t)
).c_str() ).c_str()
@@ -330,7 +321,7 @@ void command_task(Client *c, const Seperator *sep)
"{} {} not completed {} (ID {}).", "{} {} not completed {} (ID {}).",
c->GetTargetDescription(t, TargetDescriptionType::UCYou), c->GetTargetDescription(t, TargetDescriptionType::UCYou),
c == t ? "have" : "has", c == t ? "have" : "has",
task_manager->GetTaskName(task_id), TaskManager::Instance()->GetTaskName(task_id),
task_id task_id
).c_str() ).c_str()
); );
@@ -353,7 +344,7 @@ void command_task(Client *c, const Seperator *sep)
Chat::White, Chat::White,
fmt::format( fmt::format(
"Updating {} (ID {}), activity {} with a count of {} for {}.", "Updating {} (ID {}), activity {} with a count of {} for {}.",
task_manager->GetTaskName(task_id), TaskManager::Instance()->GetTaskName(task_id),
task_id, task_id,
activity_id, activity_id,
count, count,

Some files were not shown because too many files have changed in this diff Show More