From b432a3f5dae1c8c0e4aef76f8ae05c5d7fd69b78 Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Mon, 20 Mar 2023 06:10:52 -0700 Subject: [PATCH 01/33] Remove inlines Clean up macros more tomorrow Cleanup and optimize CDActivities table Remove unused include Further work on CDActivityRewards Update MasterServer.cpp Further animations work Activities still needs work for a better PK. fix type All of these replacements worked Create internal interface for animations Allows for user to just call GetAnimationTIme or PlayAnimation rather than passing in arbitrary true false statements --- dCommon/DluAssert.h | 14 ++ dCommon/Metrics.cpp | 1 + dCommon/Metrics.hpp | 1 + dDatabase/CDClientDatabase.h | 3 - dDatabase/CDClientManager.cpp | 2 +- dDatabase/CDClientManager.h | 2 + dDatabase/Tables/CDActivitiesTable.cpp | 54 +++----- dDatabase/Tables/CDActivitiesTable.h | 45 ++++--- dDatabase/Tables/CDActivityRewardsTable.h | 14 +- dDatabase/Tables/CDAnimationsTable.cpp | 108 ++++++++++------ dDatabase/Tables/CDAnimationsTable.h | 28 ++-- .../Tables/CDComponentsRegistryTable.cpp | 94 +++----------- dDatabase/Tables/CDComponentsRegistryTable.h | 14 +- dDatabase/Tables/CDItemComponentTable.cpp | 26 ++-- dDatabase/Tables/CDItemComponentTable.h | 58 ++++----- dDatabase/Tables/CDLootMatrixTable.cpp | 2 +- dDatabase/Tables/CDLootMatrixTable.h | 2 +- dDatabase/Tables/CDMissionTasksTable.cpp | 12 +- dDatabase/Tables/CDMissionTasksTable.h | 12 +- dDatabase/Tables/CDMissionsTable.cpp | 6 +- dDatabase/Tables/CDMissionsTable.h | 6 +- dDatabase/Tables/CDObjectsTable.cpp | 20 +-- dDatabase/Tables/CDObjectsTable.h | 20 +-- dDatabase/Tables/CDPhysicsComponentTable.cpp | 16 +-- dDatabase/Tables/CDPhysicsComponentTable.h | 16 +-- dDatabase/Tables/CDSkillBehaviorTable.cpp | 28 ++-- dDatabase/Tables/CDSkillBehaviorTable.h | 28 ++-- dDatabase/Tables/CDTable.h | 16 +++ dDatabase/Tables/CDZoneTableTable.cpp | 18 +-- dDatabase/Tables/CDZoneTableTable.h | 18 +-- dGame/Entity.cpp | 5 +- dGame/LeaderboardManager.cpp | 10 +- dGame/dComponents/PetComponent.cpp | 4 +- dGame/dComponents/RailActivatorComponent.cpp | 25 +--- dGame/dComponents/RebuildComponent.cpp | 5 +- dGame/dComponents/RenderComponent.cpp | 122 +++++++++--------- dGame/dComponents/RenderComponent.h | 17 ++- .../dComponents/ScriptedActivityComponent.cpp | 34 ++--- dGame/dComponents/ScriptedActivityComponent.h | 16 ++- dGame/dComponents/SwitchComponent.cpp | 3 +- dGame/dGameMessages/GameMessages.cpp | 3 +- dGame/dUtilities/Loot.cpp | 1 + dGame/dUtilities/SlashCommandHandler.cpp | 7 +- dMasterServer/MasterServer.cpp | 5 +- dScripts/02_server/DLU/DLUVanityNPC.cpp | 3 +- .../Enemy/AG/BossSpiderQueenEnemyServer.cpp | 5 +- .../02_server/Enemy/AM/AmDarklingDragon.cpp | 11 +- .../02_server/Enemy/FV/FvMaelstromDragon.cpp | 13 +- .../02_server/Enemy/General/BaseEnemyApe.cpp | 3 +- .../Enemy/General/GfApeSmashingQB.cpp | 4 +- .../Equipment/MaestromExtracticatorServer.cpp | 25 ++-- .../Equipment/MaestromExtracticatorServer.h | 3 +- dScripts/02_server/Map/AG/AgMonumentBirds.cpp | 5 +- dScripts/02_server/Map/AM/AmSkullkinDrill.cpp | 11 +- .../02_server/Map/AM/AmSkullkinDrillStand.cpp | 4 +- dScripts/02_server/Map/AM/AmSkullkinTower.cpp | 7 +- .../02_server/Map/GF/GfCaptainsCannon.cpp | 5 +- dScripts/02_server/Map/GF/GfTikiTorch.cpp | 5 +- dScripts/02_server/Map/GF/MastTeleport.cpp | 8 +- .../02_server/Map/General/ExplodingAsset.cpp | 22 +--- .../General/Ninjago/NjIceRailActivator.cpp | 4 +- .../02_server/Map/NT/NtAssemblyTubeServer.cpp | 5 +- .../02_server/Map/NT/NtParadoxPanelServer.cpp | 7 +- .../02_server/Map/NT/NtParadoxTeleServer.cpp | 5 +- dScripts/02_server/Map/NT/NtSleepingGuard.cpp | 3 +- .../Map/NT/NtVentureCannonServer.cpp | 7 +- .../Map/njhub/CatapultBaseServer.cpp | 8 +- .../02_server/Map/njhub/CavePrisonCage.cpp | 11 +- .../boss_instance/NjMonastryBossInstance.cpp | 11 +- dScripts/BaseConsoleTeleportServer.cpp | 9 +- dScripts/ai/AG/AgFans.cpp | 10 +- dScripts/ai/AG/AgJetEffectServer.cpp | 3 +- dScripts/ai/AG/AgSalutingNpcs.cpp | 5 +- dScripts/ai/AG/AgShipPlayerShockServer.cpp | 4 +- dScripts/ai/AG/AgSpaceStuff.cpp | 12 +- dScripts/ai/FV/FvDragonSmashingGolemQb.cpp | 4 +- dScripts/ai/FV/FvFlyingCreviceDragon.cpp | 7 +- dScripts/ai/FV/FvNinjaGuard.cpp | 10 +- dScripts/ai/GENERAL/LegoDieRoll.cpp | 13 +- dScripts/ai/GF/GfOrgan.cpp | 4 +- .../ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp | 7 +- dScripts/ai/NS/NsConcertInstrument.cpp | 5 +- dScripts/ai/NS/WhFans.cpp | 6 +- dScripts/ai/WILD/WildAmbients.cpp | 3 +- 84 files changed, 631 insertions(+), 607 deletions(-) create mode 100644 dCommon/DluAssert.h diff --git a/dCommon/DluAssert.h b/dCommon/DluAssert.h new file mode 100644 index 00000000..ce971122 --- /dev/null +++ b/dCommon/DluAssert.h @@ -0,0 +1,14 @@ +#ifndef __DLUASSERT__H__ +#define __DLUASSERT__H__ + +#include + +#define _DEBUG + +#ifdef _DEBUG +# define DluAssert(expression) assert(expression) +#else +# define DluAssert(expression) +#endif + +#endif //!__DLUASSERT__H__ diff --git a/dCommon/Metrics.cpp b/dCommon/Metrics.cpp index b97b5435..3a3b7d78 100644 --- a/dCommon/Metrics.cpp +++ b/dCommon/Metrics.cpp @@ -14,6 +14,7 @@ std::vector Metrics::m_Variables = { MetricVariable::CPUTime, MetricVariable::Sleep, MetricVariable::Frame, + MetricVariable::Database, }; void Metrics::AddMeasurement(MetricVariable variable, int64_t value) { diff --git a/dCommon/Metrics.hpp b/dCommon/Metrics.hpp index c03c914f..b7ac748f 100644 --- a/dCommon/Metrics.hpp +++ b/dCommon/Metrics.hpp @@ -20,6 +20,7 @@ enum class MetricVariable : int32_t CPUTime, Sleep, Frame, + Database, }; struct Metric diff --git a/dDatabase/CDClientDatabase.h b/dDatabase/CDClientDatabase.h index 96f67d64..59f69b7d 100644 --- a/dDatabase/CDClientDatabase.h +++ b/dDatabase/CDClientDatabase.h @@ -16,9 +16,6 @@ // Enable this to cache all entries in each table for fast access, comes with more memory cost //#define CDCLIENT_CACHE_ALL - // Enable this to skip some unused columns in some tables -#define UNUSED(v) - /*! \file CDClientDatabase.hpp \brief An interface between the CDClient.sqlite file and the server diff --git a/dDatabase/CDClientManager.cpp b/dDatabase/CDClientManager.cpp index eeea686f..9df6ff31 100644 --- a/dDatabase/CDClientManager.cpp +++ b/dDatabase/CDClientManager.cpp @@ -40,7 +40,7 @@ CDClientManager::CDClientManager() { CDActivityRewardsTable::Instance(); - UNUSED(CDAnimationsTable::Instance()); + CDAnimationsTable::Instance(); CDBehaviorParameterTable::Instance(); CDBehaviorTemplateTable::Instance(); CDComponentsRegistryTable::Instance(); diff --git a/dDatabase/CDClientManager.h b/dDatabase/CDClientManager.h index 1754fe99..74069ff4 100644 --- a/dDatabase/CDClientManager.h +++ b/dDatabase/CDClientManager.h @@ -4,6 +4,8 @@ #include "Singleton.h" +#define UNUSED_TABLE(v) + /** * Initialize the CDClient tables so they are all loaded into memory. */ diff --git a/dDatabase/Tables/CDActivitiesTable.cpp b/dDatabase/Tables/CDActivitiesTable.cpp index e1660d66..2c2da31e 100644 --- a/dDatabase/Tables/CDActivitiesTable.cpp +++ b/dDatabase/Tables/CDActivitiesTable.cpp @@ -1,27 +1,11 @@ #include "CDActivitiesTable.h" -CDActivitiesTable::CDActivitiesTable(void) { - - // First, get the size of the table - unsigned int size = 0; - auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM Activities"); - while (!tableSize.eof()) { - size = tableSize.getIntField(0, 0); - - tableSize.nextRow(); - } - - tableSize.finalize(); - - // Reserve the size - this->entries.reserve(size); - - // Now get the data +CDActivitiesTable::CDActivitiesTable() { auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Activities"); while (!tableData.eof()) { CDActivities entry; - entry.ActivityID = tableData.getIntField("ActivityID", -1); - entry.locStatus = tableData.getIntField("locStatus", -1); + ActivityID activityId = tableData.getIntField("ActivityID", -1); + UNUSED_COLUMN(entry.locStatus = tableData.getIntField("locStatus", -1)); entry.instanceMapID = tableData.getIntField("instanceMapID", -1); entry.minTeams = tableData.getIntField("minTeams", -1); entry.maxTeams = tableData.getIntField("maxTeams", -1); @@ -29,34 +13,26 @@ CDActivitiesTable::CDActivitiesTable(void) { entry.maxTeamSize = tableData.getIntField("maxTeamSize", -1); entry.waitTime = tableData.getIntField("waitTime", -1); entry.startDelay = tableData.getIntField("startDelay", -1); - entry.requiresUniqueData = tableData.getIntField("requiresUniqueData", -1); + UNUSED_COLUMN(entry.requiresUniqueData = tableData.getIntField("requiresUniqueData", -1)); entry.leaderboardType = tableData.getIntField("leaderboardType", -1); - entry.localize = tableData.getIntField("localize", -1); + UNUSED_COLUMN(entry.localize = tableData.getIntField("localize", -1)); entry.optionalCostLOT = tableData.getIntField("optionalCostLOT", -1); entry.optionalCostCount = tableData.getIntField("optionalCostCount", -1); - entry.showUIRewards = tableData.getIntField("showUIRewards", -1); - entry.CommunityActivityFlagID = tableData.getIntField("CommunityActivityFlagID", -1); - entry.gate_version = tableData.getStringField("gate_version", ""); + UNUSED_COLUMN(entry.showUIRewards = tableData.getIntField("showUIRewards", -1)); + UNUSED_COLUMN(entry.CommunityActivityFlagID = tableData.getIntField("CommunityActivityFlagID", -1)); + UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); entry.noTeamLootOnDeath = tableData.getIntField("noTeamLootOnDeath", -1); - entry.optionalPercentage = tableData.getFloatField("optionalPercentage", -1.0f); + UNUSED_COLUMN(entry.optionalPercentage = tableData.getFloatField("optionalPercentage", -1.0f)); + + auto insertedElement = this->entries.insert_or_assign(activityId, entry); + DluAssert(insertedElement.second == true); - this->entries.push_back(entry); tableData.nextRow(); } - tableData.finalize(); } -std::vector CDActivitiesTable::Query(std::function predicate) { - - std::vector data = cpplinq::from(this->entries) - >> cpplinq::where(predicate) - >> cpplinq::to_vector(); - - return data; +CDActivitiesResult CDActivitiesTable::GetActivity(ActivityID id) { + const auto foundElement = this->entries.find(id); + return foundElement != this->entries.end() ? CDActivitiesResult(foundElement->second) : CDActivitiesResult(); } - -std::vector CDActivitiesTable::GetEntries(void) const { - return this->entries; -} - diff --git a/dDatabase/Tables/CDActivitiesTable.h b/dDatabase/Tables/CDActivitiesTable.h index 4b60afbd..ed454b6e 100644 --- a/dDatabase/Tables/CDActivitiesTable.h +++ b/dDatabase/Tables/CDActivitiesTable.h @@ -1,38 +1,37 @@ #pragma once -// Custom Classes #include "CDTable.h" +typedef uint32_t ActivityID; + struct CDActivities { - unsigned int ActivityID; - unsigned int locStatus; - unsigned int instanceMapID; - unsigned int minTeams; - unsigned int maxTeams; - unsigned int minTeamSize; - unsigned int maxTeamSize; - unsigned int waitTime; - unsigned int startDelay; - bool requiresUniqueData; - unsigned int leaderboardType; - bool localize; - int optionalCostLOT; - int optionalCostCount; - bool showUIRewards; - unsigned int CommunityActivityFlagID; - std::string gate_version; + UNUSED_COLUMN(uint32_t locStatus); + uint32_t instanceMapID; + uint32_t minTeams; + uint32_t maxTeams; + uint32_t minTeamSize; + uint32_t maxTeamSize; + uint32_t waitTime; + uint32_t startDelay; + UNUSED_COLUMN(bool requiresUniqueData); + uint32_t leaderboardType; + UNUSED_COLUMN(bool localize); + int32_t optionalCostLOT; + int32_t optionalCostCount; + UNUSED_COLUMN(bool showUIRewards); + UNUSED_COLUMN(uint32_t CommunityActivityFlagID); + UNUSED_COLUMN(std::string gate_version); bool noTeamLootOnDeath; - float optionalPercentage; + UNUSED_COLUMN(float optionalPercentage); }; +typedef LookupResult CDActivitiesResult; class CDActivitiesTable : public CDTable { private: - std::vector entries; + std::map entries; public: CDActivitiesTable(); // Queries the table with a custom "where" clause - std::vector Query(std::function predicate); - - std::vector GetEntries(void) const; + CDActivitiesResult GetActivity(ActivityID predicate); }; diff --git a/dDatabase/Tables/CDActivityRewardsTable.h b/dDatabase/Tables/CDActivityRewardsTable.h index b5503fb6..9a4a4ce8 100644 --- a/dDatabase/Tables/CDActivityRewardsTable.h +++ b/dDatabase/Tables/CDActivityRewardsTable.h @@ -4,13 +4,13 @@ #include "CDTable.h" struct CDActivityRewards { - unsigned int objectTemplate; //!< The object template (?) - unsigned int ActivityRewardIndex; //!< The activity reward index - int activityRating; //!< The activity rating - unsigned int LootMatrixIndex; //!< The loot matrix index - unsigned int CurrencyIndex; //!< The currency index - unsigned int ChallengeRating; //!< The challenge rating - std::string description; //!< The description + unsigned int objectTemplate; + unsigned int ActivityRewardIndex; + int activityRating; + unsigned int LootMatrixIndex; + unsigned int CurrencyIndex; + unsigned int ChallengeRating; + std::string description; }; class CDActivityRewardsTable : public CDTable { diff --git a/dDatabase/Tables/CDAnimationsTable.cpp b/dDatabase/Tables/CDAnimationsTable.cpp index e1227f39..4f4730de 100644 --- a/dDatabase/Tables/CDAnimationsTable.cpp +++ b/dDatabase/Tables/CDAnimationsTable.cpp @@ -1,56 +1,84 @@ #include "CDAnimationsTable.h" +#include "GeneralUtils.h" +#include "Game.h" -CDAnimationsTable::CDAnimationsTable(void) { +bool CDAnimationsTable::CacheData(CppSQLite3Statement queryToCache) { + auto tableData = queryToCache.execQuery(); + // If we received a bad lookup, cache it anyways so we do not run the query again. + if (tableData.eof()) return false; - // First, get the size of the table - unsigned int size = 0; - auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM Animations"); - while (!tableSize.eof()) { - size = tableSize.getIntField(0, 0); + do { + std::string animation_type = tableData.getStringField("animation_type", ""); + DluAssert(!animation_type.empty()); + AnimationGroupID animationGroupID = tableData.getIntField("animationGroupID", -1); + DluAssert(animationGroupID != -1); - tableSize.nextRow(); - } - - tableSize.finalize(); - - // Reserve the size - this->entries.reserve(size); - - // Now get the data - auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Animations"); - while (!tableData.eof()) { - CDAnimations entry; - entry.animationGroupID = tableData.getIntField("animationGroupID", -1); - entry.animation_type = tableData.getStringField("animation_type", ""); + CDAnimation entry; entry.animation_name = tableData.getStringField("animation_name", ""); - entry.chance_to_play = tableData.getFloatField("chance_to_play", -1.0f); - entry.min_loops = tableData.getIntField("min_loops", -1); - entry.max_loops = tableData.getIntField("max_loops", -1); - entry.animation_length = tableData.getFloatField("animation_length", -1.0f); - entry.hideEquip = tableData.getIntField("hideEquip", -1) == 1 ? true : false; - entry.ignoreUpperBody = tableData.getIntField("ignoreUpperBody", -1) == 1 ? true : false; - entry.restartable = tableData.getIntField("restartable", -1) == 1 ? true : false; + entry.chance_to_play = tableData.getFloatField("chance_to_play", 1.0f); + entry.min_loops = tableData.getIntField("min_loops", 0); + entry.max_loops = tableData.getIntField("max_loops", 0); + entry.animation_length = tableData.getFloatField("animation_length", 0.0f); + entry.hideEquip = tableData.getIntField("hideEquip", 0) == 1; + entry.ignoreUpperBody = tableData.getIntField("ignoreUpperBody", 0) == 1; + entry.restartable = tableData.getIntField("restartable", 0) == 1; entry.face_animation_name = tableData.getStringField("face_animation_name", ""); - entry.priority = tableData.getFloatField("priority", -1.0f); - entry.blendTime = tableData.getFloatField("blendTime", -1.0f); + entry.priority = tableData.getFloatField("priority", 0.0f); + entry.blendTime = tableData.getFloatField("blendTime", 0.0f); - this->entries.push_back(entry); + this->animations[CDAnimationKey(animation_type, animationGroupID)].push_back(entry); tableData.nextRow(); - } + } while (!tableData.eof()); tableData.finalize(); + + return true; } -std::vector CDAnimationsTable::Query(std::function predicate) { - - std::vector data = cpplinq::from(this->entries) - >> cpplinq::where(predicate) - >> cpplinq::to_vector(); - - return data; +void CDAnimationsTable::CacheAnimations(const CDAnimationKey animationKey) { + auto query = CDClientDatabase::CreatePreppedStmt("SELECT * FROM Animations WHERE animationGroupID = ? and animation_type = ?"); + query.bind(1, static_cast(animationKey.second)); + query.bind(2, animationKey.first.c_str()); + // If we received a bad lookup, cache it anyways so we do not run the query again. + if (!CacheData(query)) { + this->animations[animationKey]; + } } -std::vector CDAnimationsTable::GetEntries(void) const { - return this->entries; +void CDAnimationsTable::CacheAnimationGroup(AnimationGroupID animationGroupID) { + auto animationEntryCached = this->animations.find(CDAnimationKey("", animationGroupID)); + if (animationEntryCached != this->animations.end()) { + return; + } + + auto query = CDClientDatabase::CreatePreppedStmt("SELECT * FROM Animations WHERE animationGroupID = ?"); + query.bind(1, static_cast(animationGroupID)); + + // Cache the query so we don't run the query again. + CacheData(query); + this->animations[CDAnimationKey("", animationGroupID)]; } +CDAnimationLookupResult CDAnimationsTable::GetAnimation(const AnimationID& animationType, const std::string& previousAnimationName, const AnimationGroupID animationGroupID) { + CDAnimationKey animationKey(animationType, animationGroupID); + auto randomAnimation = GeneralUtils::GenerateRandomNumber(0, 1); + auto animationEntryCached = this->animations.find(animationKey); + if (animationEntryCached == this->animations.end()) { + this->CacheAnimations(animationKey); + } + + auto animationEntry = this->animations.find(animationKey); + + // If we have only one animation, return it regardless of the chance to play. + if (animationEntry->second.size() == 1) { + return CDAnimationLookupResult(animationEntry->second.front()); + } + + for (auto& animationEntry : animationEntry->second) { + randomAnimation -= animationEntry.chance_to_play; + // This is how the client gets the random animation. + if (animationEntry.animation_name != previousAnimationName && randomAnimation <= 0.0f) return CDAnimationLookupResult(animationEntry); + } + + return CDAnimationLookupResult(); +} diff --git a/dDatabase/Tables/CDAnimationsTable.h b/dDatabase/Tables/CDAnimationsTable.h index 43400abf..b92e37cc 100644 --- a/dDatabase/Tables/CDAnimationsTable.h +++ b/dDatabase/Tables/CDAnimationsTable.h @@ -3,9 +3,10 @@ // Custom Classes #include "CDTable.h" -struct CDAnimations { - unsigned int animationGroupID; //!< The animation group ID - std::string animation_type; //!< The animation type +struct CDAnimation { + // unsigned int animationGroupID; + // std::string animation_type; + // The above two are a pair to represent a primary key in the map. std::string animation_name; //!< The animation name float chance_to_play; //!< The chance to play the animation unsigned int min_loops; //!< The minimum number of loops @@ -19,15 +20,20 @@ struct CDAnimations { float blendTime; //!< The blend time }; +typedef LookupResult CDAnimationLookupResult; class CDAnimationsTable : public CDTable { -private: - std::vector entries; - + typedef int32_t AnimationGroupID; + typedef std::string AnimationID; + typedef std::pair CDAnimationKey; public: - CDAnimationsTable(); - // Queries the table with a custom "where" clause - std::vector Query(std::function predicate); - - std::vector GetEntries(void) const; + CDAnimationLookupResult GetAnimation(const AnimationID& animationType, const std::string& previousAnimationName, const AnimationGroupID animationGroupID); + void CacheAnimationGroup(AnimationGroupID animationGroupID); +private: + void CacheAnimations(const CDAnimationKey animationKey); + bool CacheData(CppSQLite3Statement queryToCache); + /** + * Each animation type has a vector of animations. This is because there can be animations have a percent chance to play so one is selected at random. + */ + std::map> animations; }; diff --git a/dDatabase/Tables/CDComponentsRegistryTable.cpp b/dDatabase/Tables/CDComponentsRegistryTable.cpp index 32012f6c..f553e23c 100644 --- a/dDatabase/Tables/CDComponentsRegistryTable.cpp +++ b/dDatabase/Tables/CDComponentsRegistryTable.cpp @@ -1,93 +1,31 @@ #include "CDComponentsRegistryTable.h" #include "eReplicaComponentType.h" +#include "dLogger.h" +#include "Game.h" -#define CDCLIENT_CACHE_ALL +uint64_t CalculateId(uint64_t lhs, uint64_t rhs) { + return (lhs << 32) | rhs; +} -CDComponentsRegistryTable::CDComponentsRegistryTable(void) { +void CDComponentsRegistryTable::ReadRow(CppSQLite3Query& rowData) { + uint32_t id = rowData.getIntField("id", -1); + eReplicaComponentType component_type = static_cast(rowData.getIntField("component_type", 0)); + uint32_t component_id = rowData.getIntField("component_id", -1); -#ifdef CDCLIENT_CACHE_ALL - // First, get the size of the table - unsigned int size = 0; - auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ComponentsRegistry"); - while (!tableSize.eof()) { - size = tableSize.getIntField(0, 0); + auto insertedEntry = this->mappedEntries.insert_or_assign(CalculateId(id, static_cast(component_type)), component_id); + DluAssert(insertedEntry.second == true); +} - tableSize.nextRow(); - } - - tableSize.finalize(); - - // Reserve the size - //this->entries.reserve(size); - - // Now get the data +CDComponentsRegistryTable::CDComponentsRegistryTable() { auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ComponentsRegistry"); while (!tableData.eof()) { - CDComponentsRegistry entry; - entry.id = tableData.getIntField("id", -1); - entry.component_type = static_cast(tableData.getIntField("component_type", 0)); - entry.component_id = tableData.getIntField("component_id", -1); - - this->mappedEntries.insert_or_assign(((uint64_t)entry.component_type) << 32 | ((uint64_t)entry.id), entry.component_id); - + ReadRow(tableData); tableData.nextRow(); } - tableData.finalize(); -#endif } int32_t CDComponentsRegistryTable::GetByIDAndType(uint32_t id, eReplicaComponentType componentType, int32_t defaultValue) { - const auto& iter = this->mappedEntries.find(((uint64_t)componentType) << 32 | ((uint64_t)id)); - - if (iter == this->mappedEntries.end()) { - return defaultValue; - } - - return iter->second; - -#ifndef CDCLIENT_CACHE_ALL - // Now get the data - std::stringstream query; - - query << "SELECT * FROM ComponentsRegistry WHERE id = " << std::to_string(id); - - auto tableData = CDClientDatabase::ExecuteQuery(query.str()); - while (!tableData.eof()) { - CDComponentsRegistry entry; - entry.id = tableData.getIntField("id", -1); - entry.component_type = tableData.getIntField("component_type", -1); - entry.component_id = tableData.getIntField("component_id", -1); - - //this->entries.push_back(entry); - - //Darwin's stuff: - const auto& it = this->mappedEntries.find(entry.id); - if (it != mappedEntries.end()) { - const auto& iter = it->second.find(entry.component_type); - if (iter == it->second.end()) { - it->second.insert(std::make_pair(entry.component_type, entry.component_id)); - } - } else { - std::map map; - map.insert(std::make_pair(entry.component_type, entry.component_id)); - this->mappedEntries.insert(std::make_pair(entry.id, map)); - } - - tableData.nextRow(); - } - - tableData.finalize(); - - const auto& it2 = this->mappedEntries.find(id); - if (it2 != mappedEntries.end()) { - const auto& iter = it2->second.find(componentType); - if (iter != it2->second.end()) { - return iter->second; - } - } - - return defaultValue; -#endif + const auto iter = this->mappedEntries.find(CalculateId(id, static_cast(componentType))); + return iter != this->mappedEntries.end() ? iter->second : defaultValue; } - diff --git a/dDatabase/Tables/CDComponentsRegistryTable.h b/dDatabase/Tables/CDComponentsRegistryTable.h index 990072c9..2e45f293 100644 --- a/dDatabase/Tables/CDComponentsRegistryTable.h +++ b/dDatabase/Tables/CDComponentsRegistryTable.h @@ -1,21 +1,15 @@ #pragma once -// Custom Classes #include "CDTable.h" enum class eReplicaComponentType : uint32_t; -struct CDComponentsRegistry { - unsigned int id; //!< The LOT is used as the ID - eReplicaComponentType component_type; //!< See ComponentTypes enum for values - unsigned int component_id; //!< The ID used within the component's table (0 may either mean it's non-networked, or that the ID is actually 0 -}; - class CDComponentsRegistryTable : public CDTable { -private: - std::map mappedEntries; //id, component_type, component_id - public: CDComponentsRegistryTable(); int32_t GetByIDAndType(uint32_t id, eReplicaComponentType componentType, int32_t defaultValue = 0); +private: + void ReadRow(CppSQLite3Query& rowData); +private: + std::unordered_map mappedEntries; }; diff --git a/dDatabase/Tables/CDItemComponentTable.cpp b/dDatabase/Tables/CDItemComponentTable.cpp index 54afc417..d53269c2 100644 --- a/dDatabase/Tables/CDItemComponentTable.cpp +++ b/dDatabase/Tables/CDItemComponentTable.cpp @@ -3,8 +3,7 @@ CDItemComponent CDItemComponentTable::Default = {}; -//! Constructor -CDItemComponentTable::CDItemComponentTable(void) { +CDItemComponentTable::CDItemComponentTable() { Default = CDItemComponent(); #ifdef CDCLIENT_CACHE_ALL @@ -55,13 +54,13 @@ CDItemComponentTable::CDItemComponentTable(void) { entry.currencyLOT = tableData.getIntField("currencyLOT", -1); entry.altCurrencyCost = tableData.getIntField("altCurrencyCost", -1); entry.subItems = tableData.getStringField("subItems", ""); - entry.audioEventUse = tableData.getStringField("audioEventUse", ""); + UNUSED_COLUMN(entry.audioEventUse = tableData.getStringField("audioEventUse", "");) entry.noEquipAnimation = tableData.getIntField("noEquipAnimation", -1) == 1 ? true : false; entry.commendationLOT = tableData.getIntField("commendationLOT", -1); entry.commendationCost = tableData.getIntField("commendationCost", -1); - entry.audioEquipMetaEventSet = tableData.getStringField("audioEquipMetaEventSet", ""); + UNUSED_COLUMN(entry.audioEquipMetaEventSet = tableData.getStringField("audioEquipMetaEventSet", "");) entry.currencyCosts = tableData.getStringField("currencyCosts", ""); - entry.ingredientInfo = tableData.getStringField("ingredientInfo", ""); + UNUSED_COLUMN(entry.ingredientInfo = tableData.getStringField("ingredientInfo", "");) entry.locStatus = tableData.getIntField("locStatus", -1); entry.forgeType = tableData.getIntField("forgeType", -1); entry.SellMultiplier = tableData.getFloatField("SellMultiplier", -1.0f); @@ -74,8 +73,8 @@ CDItemComponentTable::CDItemComponentTable(void) { #endif } -const CDItemComponent& CDItemComponentTable::GetItemComponentByID(unsigned int skillID) { - const auto& it = this->entries.find(skillID); +const CDItemComponent& CDItemComponentTable::GetItemComponentByID(unsigned int id) { + const auto& it = this->entries.find(id); if (it != this->entries.end()) { return it->second; } @@ -83,11 +82,11 @@ const CDItemComponent& CDItemComponentTable::GetItemComponentByID(unsigned int s #ifndef CDCLIENT_CACHE_ALL std::stringstream query; - query << "SELECT * FROM ItemComponent WHERE id = " << std::to_string(skillID); + query << "SELECT * FROM ItemComponent WHERE id = " << std::to_string(id); auto tableData = CDClientDatabase::ExecuteQuery(query.str()); if (tableData.eof()) { - entries.insert(std::make_pair(skillID, Default)); + entries.insert(std::make_pair(id, Default)); return Default; } @@ -125,13 +124,13 @@ const CDItemComponent& CDItemComponentTable::GetItemComponentByID(unsigned int s entry.currencyLOT = tableData.getIntField("currencyLOT", -1); entry.altCurrencyCost = tableData.getIntField("altCurrencyCost", -1); entry.subItems = tableData.getStringField("subItems", ""); - UNUSED(entry.audioEventUse = tableData.getStringField("audioEventUse", "")); + UNUSED_COLUMN(entry.audioEventUse = tableData.getStringField("audioEventUse", "")); entry.noEquipAnimation = tableData.getIntField("noEquipAnimation", -1) == 1 ? true : false; entry.commendationLOT = tableData.getIntField("commendationLOT", -1); entry.commendationCost = tableData.getIntField("commendationCost", -1); - UNUSED(entry.audioEquipMetaEventSet = tableData.getStringField("audioEquipMetaEventSet", "")); + UNUSED_COLUMN(entry.audioEquipMetaEventSet = tableData.getStringField("audioEquipMetaEventSet", "")); entry.currencyCosts = tableData.getStringField("currencyCosts", ""); - UNUSED(entry.ingredientInfo = tableData.getStringField("ingredientInfo", "")); + UNUSED_COLUMN(entry.ingredientInfo = tableData.getStringField("ingredientInfo", "")); entry.locStatus = tableData.getIntField("locStatus", -1); entry.forgeType = tableData.getIntField("forgeType", -1); entry.SellMultiplier = tableData.getFloatField("SellMultiplier", -1.0f); @@ -140,7 +139,7 @@ const CDItemComponent& CDItemComponentTable::GetItemComponentByID(unsigned int s tableData.nextRow(); } - const auto& it2 = this->entries.find(skillID); + const auto& it2 = this->entries.find(id); if (it2 != this->entries.end()) { return it2->second; } @@ -169,4 +168,3 @@ std::map CDItemComponentTable::ParseCraftingCurrencies(const CDIt return currencies; } - diff --git a/dDatabase/Tables/CDItemComponentTable.h b/dDatabase/Tables/CDItemComponentTable.h index 11c34dd6..1cc46b4a 100644 --- a/dDatabase/Tables/CDItemComponentTable.h +++ b/dDatabase/Tables/CDItemComponentTable.h @@ -5,60 +5,60 @@ #include "dCommonVars.h" struct CDItemComponent { - unsigned int id; //!< The Component ID + uint32_t id; //!< The Component ID std::string equipLocation; //!< The equip location - unsigned int baseValue; //!< The monetary base value of the item + uint32_t baseValue; //!< The monetary base value of the item bool isKitPiece; //!< Whether or not the item belongs to a kit - unsigned int rarity; //!< The rarity of the item - unsigned int itemType; //!< The item type + uint32_t rarity; //!< The rarity of the item + uint32_t itemType; //!< The item type int64_t itemInfo; //!< The item info bool inLootTable; //!< Whether or not the item is in a loot table bool inVendor; //!< Whether or not the item is in a vendor inventory bool isUnique; //!< ??? bool isBOP; //!< ??? bool isBOE; //!< ??? - unsigned int reqFlagID; //!< User must have completed this flag to get the item - unsigned int reqSpecialtyID; //!< ??? - unsigned int reqSpecRank; //!< ??? - unsigned int reqAchievementID; //!< The required achievement must be completed - unsigned int stackSize; //!< The stack size of the item - unsigned int color1; //!< Something to do with item color... - unsigned int decal; //!< The decal of the item - unsigned int offsetGroupID; //!< Something to do with group IDs - unsigned int buildTypes; //!< Something to do with building + uint32_t reqFlagID; //!< User must have completed this flag to get the item + uint32_t reqSpecialtyID; //!< ??? + uint32_t reqSpecRank; //!< ??? + uint32_t reqAchievementID; //!< The required achievement must be completed + uint32_t stackSize; //!< The stack size of the item + uint32_t color1; //!< Something to do with item color... + uint32_t decal; //!< The decal of the item + uint32_t offsetGroupID; //!< Something to do with group IDs + uint32_t buildTypes; //!< Something to do with building std::string reqPrecondition; //!< The required precondition - unsigned int animationFlag; //!< The Animation Flag - unsigned int equipEffects; //!< The effect played when the item is equipped + uint32_t animationFlag; //!< The Animation Flag + uint32_t equipEffects; //!< The effect played when the item is equipped bool readyForQA; //!< ??? - unsigned int itemRating; //!< ??? + uint32_t itemRating; //!< ??? bool isTwoHanded; //!< Whether or not the item is double handed - unsigned int minNumRequired; //!< Maybe the minimum number required for a mission, or to own this object? - unsigned int delResIndex; //!< ??? - unsigned int currencyLOT; //!< ??? - unsigned int altCurrencyCost; //!< ??? + uint32_t minNumRequired; //!< Maybe the minimum number required for a mission, or to own this object? + uint32_t delResIndex; //!< ??? + uint32_t currencyLOT; //!< ??? + uint32_t altCurrencyCost; //!< ??? std::string subItems; //!< A comma seperate string of sub items (maybe for multi-itemed things like faction test gear set) - UNUSED(std::string audioEventUse); //!< ??? + UNUSED_COLUMN(std::string audioEventUse); //!< ??? bool noEquipAnimation; //!< Whether or not there is an equip animation - unsigned int commendationLOT; //!< The commendation LOT - unsigned int commendationCost; //!< The commendation cost - UNUSED(std::string audioEquipMetaEventSet); //!< ??? + uint32_t commendationLOT; //!< The commendation LOT + uint32_t commendationCost; //!< The commendation cost + UNUSED_COLUMN(std::string audioEquipMetaEventSet); //!< ??? std::string currencyCosts; //!< Used for crafting - UNUSED(std::string ingredientInfo); //!< Unused - unsigned int locStatus; //!< ??? - unsigned int forgeType; //!< Forge Type + UNUSED_COLUMN(std::string ingredientInfo); //!< Unused + uint32_t locStatus; //!< ??? + uint32_t forgeType; //!< Forge Type float SellMultiplier; //!< Something to do with early vendors perhaps (but replaced) }; class CDItemComponentTable : public CDTable { private: - std::map entries; + std::map entries; public: CDItemComponentTable(); static std::map ParseCraftingCurrencies(const CDItemComponent& itemComponent); // Gets an entry by ID - const CDItemComponent& GetItemComponentByID(unsigned int skillID); + const CDItemComponent& GetItemComponentByID(uint32_t id); static CDItemComponent Default; }; diff --git a/dDatabase/Tables/CDLootMatrixTable.cpp b/dDatabase/Tables/CDLootMatrixTable.cpp index 8f25e8a3..c6c5cd8e 100644 --- a/dDatabase/Tables/CDLootMatrixTable.cpp +++ b/dDatabase/Tables/CDLootMatrixTable.cpp @@ -29,7 +29,7 @@ CDLootMatrixTable::CDLootMatrixTable(void) { entry.maxToDrop = tableData.getIntField("maxToDrop", -1); entry.id = tableData.getIntField("id", -1); entry.flagID = tableData.getIntField("flagID", -1); - UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); this->entries.push_back(entry); tableData.nextRow(); diff --git a/dDatabase/Tables/CDLootMatrixTable.h b/dDatabase/Tables/CDLootMatrixTable.h index c6035841..c56be7a8 100644 --- a/dDatabase/Tables/CDLootMatrixTable.h +++ b/dDatabase/Tables/CDLootMatrixTable.h @@ -12,7 +12,7 @@ struct CDLootMatrix { unsigned int maxToDrop; //!< The maximum amount of loot from this matrix to drop unsigned int id; //!< The ID of the Loot Matrix unsigned int flagID; //!< ??? - UNUSED(std::string gate_version); //!< The Gate Version + UNUSED_COLUMN(std::string gate_version); //!< The Gate Version }; class CDLootMatrixTable : public CDTable { diff --git a/dDatabase/Tables/CDMissionTasksTable.cpp b/dDatabase/Tables/CDMissionTasksTable.cpp index f32dca1b..ca65c85f 100644 --- a/dDatabase/Tables/CDMissionTasksTable.cpp +++ b/dDatabase/Tables/CDMissionTasksTable.cpp @@ -22,18 +22,18 @@ CDMissionTasksTable::CDMissionTasksTable(void) { while (!tableData.eof()) { CDMissionTasks entry; entry.id = tableData.getIntField("id", -1); - UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1)); + UNUSED_COLUMN(entry.locStatus = tableData.getIntField("locStatus", -1)); entry.taskType = tableData.getIntField("taskType", -1); entry.target = tableData.getIntField("target", -1); entry.targetGroup = tableData.getStringField("targetGroup", ""); entry.targetValue = tableData.getIntField("targetValue", -1); entry.taskParam1 = tableData.getStringField("taskParam1", ""); - UNUSED(entry.largeTaskIcon = tableData.getStringField("largeTaskIcon", "")); - UNUSED(entry.IconID = tableData.getIntField("IconID", -1)); + UNUSED_COLUMN(entry.largeTaskIcon = tableData.getStringField("largeTaskIcon", "")); + UNUSED_COLUMN(entry.IconID = tableData.getIntField("IconID", -1)); entry.uid = tableData.getIntField("uid", -1); - UNUSED(entry.largeTaskIconID = tableData.getIntField("largeTaskIconID", -1)); - UNUSED(entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false); - UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED_COLUMN(entry.largeTaskIconID = tableData.getIntField("largeTaskIconID", -1)); + UNUSED_COLUMN(entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false); + UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); this->entries.push_back(entry); tableData.nextRow(); diff --git a/dDatabase/Tables/CDMissionTasksTable.h b/dDatabase/Tables/CDMissionTasksTable.h index fa213faf..f5e780f5 100644 --- a/dDatabase/Tables/CDMissionTasksTable.h +++ b/dDatabase/Tables/CDMissionTasksTable.h @@ -5,18 +5,18 @@ struct CDMissionTasks { unsigned int id; //!< The Mission ID that the task belongs to - UNUSED(unsigned int locStatus); //!< ??? + UNUSED_COLUMN(unsigned int locStatus); //!< ??? unsigned int taskType; //!< The task type unsigned int target; //!< The mission target std::string targetGroup; //!< The mission target group int targetValue; //!< The target value std::string taskParam1; //!< The task param 1 - UNUSED(std::string largeTaskIcon); //!< ??? - UNUSED(unsigned int IconID); //!< ??? + UNUSED_COLUMN(std::string largeTaskIcon); //!< ??? + UNUSED_COLUMN(unsigned int IconID); //!< ??? unsigned int uid; //!< ??? - UNUSED(unsigned int largeTaskIconID); //!< ??? - UNUSED(bool localize); //!< Whether or not the task should be localized - UNUSED(std::string gate_version); //!< ??? + UNUSED_COLUMN(unsigned int largeTaskIconID); //!< ??? + UNUSED_COLUMN(bool localize); //!< Whether or not the task should be localized + UNUSED_COLUMN(std::string gate_version); //!< ??? }; class CDMissionTasksTable : public CDTable { diff --git a/dDatabase/Tables/CDMissionsTable.cpp b/dDatabase/Tables/CDMissionsTable.cpp index d4ee40ae..53137560 100644 --- a/dDatabase/Tables/CDMissionsTable.cpp +++ b/dDatabase/Tables/CDMissionsTable.cpp @@ -71,9 +71,9 @@ CDMissionsTable::CDMissionsTable(void) { entry.isRandom = tableData.getIntField("isRandom", -1) == 1 ? true : false; entry.randomPool = tableData.getStringField("randomPool", ""); entry.UIPrereqID = tableData.getIntField("UIPrereqID", -1); - UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); - UNUSED(entry.HUDStates = tableData.getStringField("HUDStates", "")); - UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1)); + UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED_COLUMN(entry.HUDStates = tableData.getStringField("HUDStates", "")); + UNUSED_COLUMN(entry.locStatus = tableData.getIntField("locStatus", -1)); entry.reward_bankinventory = tableData.getIntField("reward_bankinventory", -1); this->entries.push_back(entry); diff --git a/dDatabase/Tables/CDMissionsTable.h b/dDatabase/Tables/CDMissionsTable.h index e6a44b02..8e3f2039 100644 --- a/dDatabase/Tables/CDMissionsTable.h +++ b/dDatabase/Tables/CDMissionsTable.h @@ -54,9 +54,9 @@ struct CDMissions { bool isRandom; //!< ??? std::string randomPool; //!< ??? int UIPrereqID; //!< ??? - UNUSED(std::string gate_version); //!< The gate version - UNUSED(std::string HUDStates); //!< ??? - UNUSED(int locStatus); //!< ??? + UNUSED_COLUMN(std::string gate_version); //!< The gate version + UNUSED_COLUMN(std::string HUDStates); //!< ??? + UNUSED_COLUMN(int locStatus); //!< ??? int reward_bankinventory; //!< The amount of bank space this mission rewards }; diff --git a/dDatabase/Tables/CDObjectsTable.cpp b/dDatabase/Tables/CDObjectsTable.cpp index c68c3e6a..e28fb100 100644 --- a/dDatabase/Tables/CDObjectsTable.cpp +++ b/dDatabase/Tables/CDObjectsTable.cpp @@ -65,18 +65,18 @@ const CDObjects& CDObjectsTable::GetByID(unsigned int LOT) { CDObjects entry; entry.id = tableData.getIntField("id", -1); entry.name = tableData.getStringField("name", ""); - UNUSED(entry.placeable = tableData.getIntField("placeable", -1)); + UNUSED_COLUMN(entry.placeable = tableData.getIntField("placeable", -1)); entry.type = tableData.getStringField("type", ""); - UNUSED(ntry.description = tableData.getStringField(4, "")); - UNUSED(entry.localize = tableData.getIntField("localize", -1)); - UNUSED(entry.npcTemplateID = tableData.getIntField("npcTemplateID", -1)); - UNUSED(entry.displayName = tableData.getStringField("displayName", "")); + UNUSED_COLUMN(ntry.description = tableData.getStringField(4, "")); + UNUSED_COLUMN(entry.localize = tableData.getIntField("localize", -1)); + UNUSED_COLUMN(entry.npcTemplateID = tableData.getIntField("npcTemplateID", -1)); + UNUSED_COLUMN(entry.displayName = tableData.getStringField("displayName", "")); entry.interactionDistance = tableData.getFloatField("interactionDistance", -1.0f); - UNUSED(entry.nametag = tableData.getIntField("nametag", -1)); - UNUSED(entry._internalNotes = tableData.getStringField("_internalNotes", "")); - UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1)); - UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); - UNUSED(entry.HQ_valid = tableData.getIntField("HQ_valid", -1)); + UNUSED_COLUMN(entry.nametag = tableData.getIntField("nametag", -1)); + UNUSED_COLUMN(entry._internalNotes = tableData.getStringField("_internalNotes", "")); + UNUSED_COLUMN(entry.locStatus = tableData.getIntField("locStatus", -1)); + UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED_COLUMN(entry.HQ_valid = tableData.getIntField("HQ_valid", -1)); this->entries.insert(std::make_pair(entry.id, entry)); tableData.nextRow(); diff --git a/dDatabase/Tables/CDObjectsTable.h b/dDatabase/Tables/CDObjectsTable.h index 171eddef..dc6cc884 100644 --- a/dDatabase/Tables/CDObjectsTable.h +++ b/dDatabase/Tables/CDObjectsTable.h @@ -6,18 +6,18 @@ struct CDObjects { unsigned int id; //!< The LOT of the object std::string name; //!< The internal name of the object - UNUSED(unsigned int placeable); //!< Whether or not the object is placable + UNUSED_COLUMN(unsigned int placeable); //!< Whether or not the object is placable std::string type; //!< The object type - UNUSED(std::string description); //!< An internal description of the object - UNUSED(unsigned int localize); //!< Whether or not the object should localize - UNUSED(unsigned int npcTemplateID); //!< Something related to NPCs... - UNUSED(std::string displayName); //!< The display name of the object + UNUSED_COLUMN(std::string description); //!< An internal description of the object + UNUSED_COLUMN(unsigned int localize); //!< Whether or not the object should localize + UNUSED_COLUMN(unsigned int npcTemplateID); //!< Something related to NPCs... + UNUSED_COLUMN(std::string displayName); //!< The display name of the object float interactionDistance; //!< The interaction distance of the object - UNUSED(unsigned int nametag); //!< ??? - UNUSED(std::string _internalNotes); //!< Some internal notes (rarely used) - UNUSED(unsigned int locStatus); //!< ??? - UNUSED(std::string gate_version); //!< The gate version for the object - UNUSED(unsigned int HQ_valid); //!< Probably used for the Nexus HQ database on LEGOUniverse.com + UNUSED_COLUMN(unsigned int nametag); //!< ??? + UNUSED_COLUMN(std::string _internalNotes); //!< Some internal notes (rarely used) + UNUSED_COLUMN(unsigned int locStatus); //!< ??? + UNUSED_COLUMN(std::string gate_version); //!< The gate version for the object + UNUSED_COLUMN(unsigned int HQ_valid); //!< Probably used for the Nexus HQ database on LEGOUniverse.com }; class CDObjectsTable : public CDTable { diff --git a/dDatabase/Tables/CDPhysicsComponentTable.cpp b/dDatabase/Tables/CDPhysicsComponentTable.cpp index bb21ed7f..8c705f5b 100644 --- a/dDatabase/Tables/CDPhysicsComponentTable.cpp +++ b/dDatabase/Tables/CDPhysicsComponentTable.cpp @@ -7,19 +7,19 @@ CDPhysicsComponentTable::CDPhysicsComponentTable(void) { entry->id = tableData.getIntField("id", -1); entry->bStatic = tableData.getIntField("static", -1) != 0; entry->physicsAsset = tableData.getStringField("physics_asset", ""); - UNUSED(entry->jump = tableData.getIntField("jump", -1) != 0); - UNUSED(entry->doublejump = tableData.getIntField("doublejump", -1) != 0); + UNUSED_COLUMN(entry->jump = tableData.getIntField("jump", -1) != 0); + UNUSED_COLUMN(entry->doublejump = tableData.getIntField("doublejump", -1) != 0); entry->speed = tableData.getFloatField("speed", -1); - UNUSED(entry->rotSpeed = tableData.getFloatField("rotSpeed", -1)); + UNUSED_COLUMN(entry->rotSpeed = tableData.getFloatField("rotSpeed", -1)); entry->playerHeight = tableData.getFloatField("playerHeight"); entry->playerRadius = tableData.getFloatField("playerRadius"); entry->pcShapeType = tableData.getIntField("pcShapeType"); entry->collisionGroup = tableData.getIntField("collisionGroup"); - UNUSED(entry->airSpeed = tableData.getFloatField("airSpeed")); - UNUSED(entry->boundaryAsset = tableData.getStringField("boundaryAsset")); - UNUSED(entry->jumpAirSpeed = tableData.getFloatField("jumpAirSpeed")); - UNUSED(entry->friction = tableData.getFloatField("friction")); - UNUSED(entry->gravityVolumeAsset = tableData.getStringField("gravityVolumeAsset")); + UNUSED_COLUMN(entry->airSpeed = tableData.getFloatField("airSpeed")); + UNUSED_COLUMN(entry->boundaryAsset = tableData.getStringField("boundaryAsset")); + UNUSED_COLUMN(entry->jumpAirSpeed = tableData.getFloatField("jumpAirSpeed")); + UNUSED_COLUMN(entry->friction = tableData.getFloatField("friction")); + UNUSED_COLUMN(entry->gravityVolumeAsset = tableData.getStringField("gravityVolumeAsset")); m_entries.insert(std::make_pair(entry->id, entry)); tableData.nextRow(); diff --git a/dDatabase/Tables/CDPhysicsComponentTable.h b/dDatabase/Tables/CDPhysicsComponentTable.h index e63d337d..ee4dddc1 100644 --- a/dDatabase/Tables/CDPhysicsComponentTable.h +++ b/dDatabase/Tables/CDPhysicsComponentTable.h @@ -6,19 +6,19 @@ struct CDPhysicsComponent { int id; bool bStatic; std::string physicsAsset; - UNUSED(bool jump); - UNUSED(bool doublejump); + UNUSED_COLUMN(bool jump); + UNUSED_COLUMN(bool doublejump); float speed; - UNUSED(float rotSpeed); + UNUSED_COLUMN(float rotSpeed); float playerHeight; float playerRadius; int pcShapeType; int collisionGroup; - UNUSED(float airSpeed); - UNUSED(std::string boundaryAsset); - UNUSED(float jumpAirSpeed); - UNUSED(float friction); - UNUSED(std::string gravityVolumeAsset); + UNUSED_COLUMN(float airSpeed); + UNUSED_COLUMN(std::string boundaryAsset); + UNUSED_COLUMN(float jumpAirSpeed); + UNUSED_COLUMN(float friction); + UNUSED_COLUMN(std::string gravityVolumeAsset); }; class CDPhysicsComponentTable : public CDTable { diff --git a/dDatabase/Tables/CDSkillBehaviorTable.cpp b/dDatabase/Tables/CDSkillBehaviorTable.cpp index c5df78ef..8420a8c6 100644 --- a/dDatabase/Tables/CDSkillBehaviorTable.cpp +++ b/dDatabase/Tables/CDSkillBehaviorTable.cpp @@ -24,24 +24,24 @@ CDSkillBehaviorTable::CDSkillBehaviorTable(void) { while (!tableData.eof()) { CDSkillBehavior entry; entry.skillID = tableData.getIntField("skillID", -1); - UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1)); + UNUSED_COLUMN(entry.locStatus = tableData.getIntField("locStatus", -1)); entry.behaviorID = tableData.getIntField("behaviorID", -1); entry.imaginationcost = tableData.getIntField("imaginationcost", -1); entry.cooldowngroup = tableData.getIntField("cooldowngroup", -1); entry.cooldown = tableData.getFloatField("cooldown", -1.0f); - UNUSED(entry.isNpcEditor = tableData.getIntField("isNpcEditor", -1) == 1 ? true : false); - UNUSED(entry.skillIcon = tableData.getIntField("skillIcon", -1)); - UNUSED(entry.oomSkillID = tableData.getStringField("oomSkillID", "")); - UNUSED(entry.oomBehaviorEffectID = tableData.getIntField("oomBehaviorEffectID", -1)); - UNUSED(entry.castTypeDesc = tableData.getIntField("castTypeDesc", -1)); - UNUSED(entry.imBonusUI = tableData.getIntField("imBonusUI", -1)); - UNUSED(entry.lifeBonusUI = tableData.getIntField("lifeBonusUI", -1)); - UNUSED(entry.armorBonusUI = tableData.getIntField("armorBonusUI", -1)); - UNUSED(entry.damageUI = tableData.getIntField("damageUI", -1)); - UNUSED(entry.hideIcon = tableData.getIntField("hideIcon", -1) == 1 ? true : false); - UNUSED(entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false); - UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); - UNUSED(entry.cancelType = tableData.getIntField("cancelType", -1)); + UNUSED_COLUMN(entry.isNpcEditor = tableData.getIntField("isNpcEditor", -1) == 1 ? true : false); + UNUSED_COLUMN(entry.skillIcon = tableData.getIntField("skillIcon", -1)); + UNUSED_COLUMN(entry.oomSkillID = tableData.getStringField("oomSkillID", "")); + UNUSED_COLUMN(entry.oomBehaviorEffectID = tableData.getIntField("oomBehaviorEffectID", -1)); + UNUSED_COLUMN(entry.castTypeDesc = tableData.getIntField("castTypeDesc", -1)); + UNUSED_COLUMN(entry.imBonusUI = tableData.getIntField("imBonusUI", -1)); + UNUSED_COLUMN(entry.lifeBonusUI = tableData.getIntField("lifeBonusUI", -1)); + UNUSED_COLUMN(entry.armorBonusUI = tableData.getIntField("armorBonusUI", -1)); + UNUSED_COLUMN(entry.damageUI = tableData.getIntField("damageUI", -1)); + UNUSED_COLUMN(entry.hideIcon = tableData.getIntField("hideIcon", -1) == 1 ? true : false); + UNUSED_COLUMN(entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false); + UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED_COLUMN(entry.cancelType = tableData.getIntField("cancelType", -1)); this->entries.insert(std::make_pair(entry.skillID, entry)); //this->entries.push_back(entry); diff --git a/dDatabase/Tables/CDSkillBehaviorTable.h b/dDatabase/Tables/CDSkillBehaviorTable.h index eb3094e0..4e6bddb9 100644 --- a/dDatabase/Tables/CDSkillBehaviorTable.h +++ b/dDatabase/Tables/CDSkillBehaviorTable.h @@ -5,24 +5,24 @@ struct CDSkillBehavior { unsigned int skillID; //!< The Skill ID of the skill - UNUSED(unsigned int locStatus); //!< ?? + UNUSED_COLUMN(unsigned int locStatus); //!< ?? unsigned int behaviorID; //!< The Behavior ID of the skill unsigned int imaginationcost; //!< The imagination cost of the skill unsigned int cooldowngroup; //!< The cooldown group ID of the skill float cooldown; //!< The cooldown time of the skill - UNUSED(bool isNpcEditor); //!< ??? - UNUSED(unsigned int skillIcon); //!< The Skill Icon ID - UNUSED(std::string oomSkillID); //!< ??? - UNUSED(unsigned int oomBehaviorEffectID); //!< ??? - UNUSED(unsigned int castTypeDesc); //!< The cast type description(?) - UNUSED(unsigned int imBonusUI); //!< The imagination bonus of the skill - UNUSED(nsigned int lifeBonusUI); //!< The life bonus of the skill - UNUSED(unsigned int armorBonusUI); //!< The armor bonus of the skill - UNUSED(unsigned int damageUI); //!< ??? - UNUSED(bool hideIcon); //!< Whether or not to show the icon - UNUSED(bool localize); //!< ??? - UNUSED(std::string gate_version); //!< ??? - UNUSED(unsigned int cancelType); //!< The cancel type (?) + UNUSED_COLUMN(bool isNpcEditor); //!< ??? + UNUSED_COLUMN(unsigned int skillIcon); //!< The Skill Icon ID + UNUSED_COLUMN(std::string oomSkillID); //!< ??? + UNUSED_COLUMN(unsigned int oomBehaviorEffectID); //!< ??? + UNUSED_COLUMN(unsigned int castTypeDesc); //!< The cast type description(?) + UNUSED_COLUMN(unsigned int imBonusUI); //!< The imagination bonus of the skill + UNUSED_COLUMN(nsigned int lifeBonusUI); //!< The life bonus of the skill + UNUSED_COLUMN(unsigned int armorBonusUI); //!< The armor bonus of the skill + UNUSED_COLUMN(unsigned int damageUI); //!< ??? + UNUSED_COLUMN(bool hideIcon); //!< Whether or not to show the icon + UNUSED_COLUMN(bool localize); //!< ??? + UNUSED_COLUMN(std::string gate_version); //!< ??? + UNUSED_COLUMN(unsigned int cancelType); //!< The cancel type (?) }; class CDSkillBehaviorTable : public CDTable { diff --git a/dDatabase/Tables/CDTable.h b/dDatabase/Tables/CDTable.h index fca16eb8..45c67b0d 100644 --- a/dDatabase/Tables/CDTable.h +++ b/dDatabase/Tables/CDTable.h @@ -2,6 +2,7 @@ #include "CDClientDatabase.h" #include "Singleton.h" +#include "DluAssert.h" #include #include @@ -15,6 +16,9 @@ #endif #include "cpplinq.hpp" +// Enable this to skip some unused columns in some tables +#define UNUSED_COLUMN(v) + #pragma warning (disable : 4244) //Disable double to float conversion warnings #pragma warning (disable : 4715) //Disable "not all control paths return a value" @@ -23,3 +27,15 @@ class CDTable : public Singleton { protected: virtual ~CDTable() = default; }; + +template +class LookupResult { + typedef std::pair DataType; +public: + LookupResult() { m_data.first = T(); m_data.second = false; }; + LookupResult(T& data) { m_data.first = data; m_data.second = true; }; + inline const T& Data() { return m_data.first; }; + inline const bool& FoundData() { return m_data.second; }; +private: + DataType m_data; +}; diff --git a/dDatabase/Tables/CDZoneTableTable.cpp b/dDatabase/Tables/CDZoneTableTable.cpp index bafbf8fe..89158dd7 100644 --- a/dDatabase/Tables/CDZoneTableTable.cpp +++ b/dDatabase/Tables/CDZoneTableTable.cpp @@ -26,25 +26,25 @@ CDZoneTableTable::CDZoneTableTable(void) { entry.ghostdistance = tableData.getFloatField("ghostdistance", -1.0f); entry.population_soft_cap = tableData.getIntField("population_soft_cap", -1); entry.population_hard_cap = tableData.getIntField("population_hard_cap", -1); - UNUSED(entry.DisplayDescription = tableData.getStringField("DisplayDescription", "")); - UNUSED(entry.mapFolder = tableData.getStringField("mapFolder", "")); + UNUSED_COLUMN(entry.DisplayDescription = tableData.getStringField("DisplayDescription", "")); + UNUSED_COLUMN(entry.mapFolder = tableData.getStringField("mapFolder", "")); entry.smashableMinDistance = tableData.getFloatField("smashableMinDistance", -1.0f); entry.smashableMaxDistance = tableData.getFloatField("smashableMaxDistance", -1.0f); - UNUSED(entry.mixerProgram = tableData.getStringField("mixerProgram", "")); - UNUSED(entry.clientPhysicsFramerate = tableData.getStringField("clientPhysicsFramerate", "")); - UNUSED(entry.serverPhysicsFramerate = tableData.getStringField("serverPhysicsFramerate", "")); + UNUSED_COLUMN(entry.mixerProgram = tableData.getStringField("mixerProgram", "")); + UNUSED_COLUMN(entry.clientPhysicsFramerate = tableData.getStringField("clientPhysicsFramerate", "")); + UNUSED_COLUMN(entry.serverPhysicsFramerate = tableData.getStringField("serverPhysicsFramerate", "")); entry.zoneControlTemplate = tableData.getIntField("zoneControlTemplate", -1); entry.widthInChunks = tableData.getIntField("widthInChunks", -1); entry.heightInChunks = tableData.getIntField("heightInChunks", -1); entry.petsAllowed = tableData.getIntField("petsAllowed", -1) == 1 ? true : false; entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false; entry.fZoneWeight = tableData.getFloatField("fZoneWeight", -1.0f); - UNUSED(entry.thumbnail = tableData.getStringField("thumbnail", "")); + UNUSED_COLUMN(entry.thumbnail = tableData.getStringField("thumbnail", "")); entry.PlayerLoseCoinsOnDeath = tableData.getIntField("PlayerLoseCoinsOnDeath", -1) == 1 ? true : false; - UNUSED(entry.disableSaveLoc = tableData.getIntField("disableSaveLoc", -1) == 1 ? true : false); + UNUSED_COLUMN(entry.disableSaveLoc = tableData.getIntField("disableSaveLoc", -1) == 1 ? true : false); entry.teamRadius = tableData.getFloatField("teamRadius", -1.0f); - UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); - UNUSED(entry.mountsAllowed = tableData.getIntField("mountsAllowed", -1) == 1 ? true : false); + UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED_COLUMN(entry.mountsAllowed = tableData.getIntField("mountsAllowed", -1) == 1 ? true : false); this->m_Entries.insert(std::make_pair(entry.zoneID, entry)); tableData.nextRow(); diff --git a/dDatabase/Tables/CDZoneTableTable.h b/dDatabase/Tables/CDZoneTableTable.h index f844fd25..e46a87ee 100644 --- a/dDatabase/Tables/CDZoneTableTable.h +++ b/dDatabase/Tables/CDZoneTableTable.h @@ -12,25 +12,25 @@ struct CDZoneTable { float ghostdistance; //!< The ghosting distance unsigned int population_soft_cap; //!< The "soft cap" on the world population unsigned int population_hard_cap; //!< The "hard cap" on the world population - UNUSED(std::string DisplayDescription); //!< The display description of the world - UNUSED(std::string mapFolder); //!< ??? + UNUSED_COLUMN(std::string DisplayDescription); //!< The display description of the world + UNUSED_COLUMN(std::string mapFolder); //!< ??? float smashableMinDistance; //!< The minimum smashable distance? float smashableMaxDistance; //!< The maximum smashable distance? - UNUSED(std::string mixerProgram); //!< ??? - UNUSED(std::string clientPhysicsFramerate); //!< The client physics framerate - UNUSED(std::string serverPhysicsFramerate); //!< The server physics framerate + UNUSED_COLUMN(std::string mixerProgram); //!< ??? + UNUSED_COLUMN(std::string clientPhysicsFramerate); //!< The client physics framerate + UNUSED_COLUMN(std::string serverPhysicsFramerate); //!< The server physics framerate unsigned int zoneControlTemplate; //!< The Zone Control template unsigned int widthInChunks; //!< The width of the world in chunks unsigned int heightInChunks; //!< The height of the world in chunks bool petsAllowed; //!< Whether or not pets are allowed in the world bool localize; //!< Whether or not the world should be localized float fZoneWeight; //!< ??? - UNUSED(std::string thumbnail); //!< The thumbnail of the world + UNUSED_COLUMN(std::string thumbnail); //!< The thumbnail of the world bool PlayerLoseCoinsOnDeath; //!< Whether or not the user loses coins on death - UNUSED(bool disableSaveLoc); //!< Disables the saving location? + UNUSED_COLUMN(bool disableSaveLoc); //!< Disables the saving location? float teamRadius; //!< ??? - UNUSED(std::string gate_version); //!< The gate version - UNUSED(bool mountsAllowed); //!< Whether or not mounts are allowed + UNUSED_COLUMN(std::string gate_version); //!< The gate version + UNUSED_COLUMN(bool mountsAllowed); //!< Whether or not mounts are allowed }; class CDZoneTableTable : public CDTable { diff --git a/dGame/Entity.cpp b/dGame/Entity.cpp index 13507527..290f4f7e 100644 --- a/dGame/Entity.cpp +++ b/dGame/Entity.cpp @@ -592,8 +592,9 @@ void Entity::Initialize() { m_Components.insert(std::make_pair(eReplicaComponentType::BOUNCER, comp)); } - if ((compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::RENDER) > 0 && m_TemplateID != 2365) || m_Character) { - RenderComponent* render = new RenderComponent(this); + int32_t renderaComponentId = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::RENDER); + if ((renderaComponentId > 0 && m_TemplateID != 2365) || m_Character) { + RenderComponent* render = new RenderComponent(this, renderaComponentId); m_Components.insert(std::make_pair(eReplicaComponentType::RENDER, render)); } diff --git a/dGame/LeaderboardManager.cpp b/dGame/LeaderboardManager.cpp index d85a95d4..5a4754b9 100644 --- a/dGame/LeaderboardManager.cpp +++ b/dGame/LeaderboardManager.cpp @@ -277,13 +277,11 @@ void LeaderboardManager::SendLeaderboard(uint32_t gameID, InfoType infoType, boo } LeaderboardType LeaderboardManager::GetLeaderboardType(uint32_t gameID) { - auto* activitiesTable = CDClientManager::Instance().GetTable(); - std::vector activities = activitiesTable->Query([=](const CDActivities& entry) { - return (entry.ActivityID == gameID); - }); + CDActivitiesTable* activitiesTable = CDClientManager::Instance().GetTable(); + auto activityResult = activitiesTable->GetActivity(gameID); - for (const auto& activity : activities) { - return static_cast(activity.leaderboardType); + if (activityResult.FoundData()) { + return static_cast(activityResult.Data().leaderboardType); } return LeaderboardType::None; diff --git a/dGame/dComponents/PetComponent.cpp b/dGame/dComponents/PetComponent.cpp index 5549f952..f5b7a1a7 100644 --- a/dGame/dComponents/PetComponent.cpp +++ b/dGame/dComponents/PetComponent.cpp @@ -22,7 +22,7 @@ #include "Database.h" #include "EntityInfo.h" #include "eMissionTaskType.h" - +#include "RenderComponent.h" std::unordered_map PetComponent::buildCache{}; std::unordered_map PetComponent::currentActivities{}; @@ -525,7 +525,7 @@ void PetComponent::NotifyTamingBuildSuccess(NiPoint3 position) { } GameMessages::SendPlayFXEffect(tamer, -1, u"petceleb", "", LWOOBJID_EMPTY, 1, 1, true); - GameMessages::SendPlayAnimation(tamer, u"rebuild-celebrate"); + RenderComponent::PlayAnimation(tamer, u"rebuild-celebrate"); EntityInfo info{}; info.lot = cached->second.puzzleModelLot; diff --git a/dGame/dComponents/RailActivatorComponent.cpp b/dGame/dComponents/RailActivatorComponent.cpp index 49fc105d..2a12caf8 100644 --- a/dGame/dComponents/RailActivatorComponent.cpp +++ b/dGame/dComponents/RailActivatorComponent.cpp @@ -7,6 +7,8 @@ #include "RebuildComponent.h" #include "Game.h" #include "dLogger.h" +#include "RenderComponent.h" +#include "EntityManager.h" RailActivatorComponent::RailActivatorComponent(Entity* parent, int32_t componentID) : Component(parent) { m_ComponentID = componentID; @@ -56,23 +58,10 @@ void RailActivatorComponent::OnUse(Entity* originator) { GameMessages::SendPlayFXEffect(originator->GetObjectID(), m_StartEffect.first, m_StartEffect.second, std::to_string(m_StartEffect.first)); } - + + float animationLength = 0.5f; if (!m_StartAnimation.empty()) { - GameMessages::SendPlayAnimation(originator, m_StartAnimation); - } - - float animationLength; - - if (m_StartAnimation == u"whirlwind-rail-up-earth") { - animationLength = 1.5f; - } else if (m_StartAnimation == u"whirlwind-rail-up-lightning") { - animationLength = 0.5f; - } else if (m_StartAnimation == u"whirlwind-rail-up-ice") { - animationLength = 0.5f; - } else if (m_StartAnimation == u"whirlwind-rail-up-fire") { - animationLength = 0.5f; - } else { - animationLength = 0.5f; + animationLength = RenderComponent::PlayAnimation(originator, m_StartAnimation); } const auto originatorID = originator->GetObjectID(); @@ -111,7 +100,7 @@ void RailActivatorComponent::OnRailMovementReady(Entity* originator) const { } if (!m_LoopAnimation.empty()) { - GameMessages::SendPlayAnimation(originator, m_LoopAnimation); + RenderComponent::PlayAnimation(originator, m_LoopAnimation); } GameMessages::SendSetRailMovement(originator->GetObjectID(), m_PathDirection, m_Path, m_PathStart, @@ -146,7 +135,7 @@ void RailActivatorComponent::OnCancelRailMovement(Entity* originator) { } if (!m_StopAnimation.empty()) { - GameMessages::SendPlayAnimation(originator, m_StopAnimation); + RenderComponent::PlayAnimation(originator, m_StopAnimation); } // Remove the player after they've signalled they're done railing diff --git a/dGame/dComponents/RebuildComponent.cpp b/dGame/dComponents/RebuildComponent.cpp index abd21873..f0b39346 100644 --- a/dGame/dComponents/RebuildComponent.cpp +++ b/dGame/dComponents/RebuildComponent.cpp @@ -16,6 +16,7 @@ #include "Preconditions.h" #include "Loot.h" #include "TeamManager.h" +#include "RenderComponent.h" #include "CppScripts.h" @@ -510,7 +511,7 @@ void RebuildComponent::CompleteRebuild(Entity* user) { character->SetPlayerFlag(flagNumber, true); } } - GameMessages::SendPlayAnimation(user, u"rebuild-celebrate", 1.09f); + RenderComponent::PlayAnimation(user, u"rebuild-celebrate", 1.09f); } void RebuildComponent::ResetRebuild(bool failed) { @@ -520,7 +521,7 @@ void RebuildComponent::ResetRebuild(bool failed) { GameMessages::SendEnableRebuild(m_Parent, false, false, failed, eFailReason::REASON_NOT_GIVEN, m_ResetTime, builder->GetObjectID()); if (failed) { - GameMessages::SendPlayAnimation(builder, u"rebuild-fail"); + RenderComponent::PlayAnimation(builder, u"rebuild-fail"); } } diff --git a/dGame/dComponents/RenderComponent.cpp b/dGame/dComponents/RenderComponent.cpp index ee42acba..bccd6207 100644 --- a/dGame/dComponents/RenderComponent.cpp +++ b/dGame/dComponents/RenderComponent.cpp @@ -11,72 +11,34 @@ #include "GameMessages.h" #include "Game.h" #include "dLogger.h" +#include "CDAnimationsTable.h" std::unordered_map RenderComponent::m_DurationCache{}; -RenderComponent::RenderComponent(Entity* parent) : Component(parent) { +RenderComponent::RenderComponent(Entity* parent, int32_t componentId): Component(parent) { m_Effects = std::vector(); + m_LastAnimationName = ""; + auto query = CDClientDatabase::CreatePreppedStmt("SELECT * FROM RenderComponent WHERE id = ?;"); + query.bind(1, componentId); + auto result = query.execQuery(); - return; - - /* - auto* table = CDClientManager::Instance().GetTable(); - - const auto entry = table->GetByIDAndType(parent->GetLOT(), eReplicaComponentType::RENDER); - - std::stringstream query; - - query << "SELECT effect1, effect2, effect3, effect4, effect5, effect6 FROM RenderComponent WHERE id = " << std::to_string(entry) << ";"; - - auto result = CDClientDatabase::ExecuteQuery(query.str()); - - if (result.eof()) - { - return; - } - - for (auto i = 0; i < 6; ++i) - { - if (result.fieldIsNull(i)) - { - continue; - } - - const auto id = result.getIntField(i); - - if (id <= 0) - { - continue; - } - - query.clear(); - - query << "SELECT effectType, effectName FROM BehaviorEffect WHERE effectID = " << std::to_string(id) << ";"; - - auto effectResult = CDClientDatabase::ExecuteQuery(query.str()); - - while (!effectResult.eof()) - { - const auto type = effectResult.fieldIsNull(0) ? "" : std::string(effectResult.getStringField(0)); - - const auto name = effectResult.fieldIsNull(1) ? "" : std::string(effectResult.getStringField(1)); - - auto* effect = new Effect(); - - effect->name = name; - effect->type = GeneralUtils::ASCIIToUTF16(type); - effect->scale = 1; - effect->effectID = id; - effect->secondary = LWOOBJID_EMPTY; - - m_Effects.push_back(effect); - - effectResult.nextRow(); + if (!result.eof()) { + auto animationGroupIDs = std::string(result.getStringField("animationGroupIDs", "")); + if (!animationGroupIDs.empty()) { + auto* animationsTable = CDClientManager::Instance().GetTable(); + auto groupIdsSplit = GeneralUtils::SplitString(animationGroupIDs, ','); + for (auto& groupId : groupIdsSplit) { + int32_t groupIdInt; + if (!GeneralUtils::TryParse(groupId, groupIdInt)) { + Game::logger->Log("RenderComponent", "bad animation group Id %s", groupId.c_str()); + continue; + } + m_animationGroupIds.push_back(groupIdInt); + animationsTable->CacheAnimationGroup(groupIdInt); + } } } - result.finalize(); - */ } RenderComponent::~RenderComponent() { @@ -224,3 +186,47 @@ void RenderComponent::StopEffect(const std::string& name, const bool killImmedia std::vector& RenderComponent::GetEffects() { return m_Effects; } + + +float RenderComponent::PlayAnimation(Entity* self, const std::u16string& animation, float priority, float scale) { + if (!self) return 0.0f; + return RenderComponent::PlayAnimation(self, GeneralUtils::UTF16ToWTF8(animation), priority, scale); +} + +float RenderComponent::PlayAnimation(Entity* self, const std::string& animation, float priority, float scale) { + if (!self) return 0.0f; + return RenderComponent::DoAnimation(self, animation, true, priority, scale); +} + +float RenderComponent::GetAnimationTime(Entity* self, const std::u16string& animation) { + if (!self) return 0.0f; + return RenderComponent::GetAnimationTime(self, GeneralUtils::UTF16ToWTF8(animation)); +} + +float RenderComponent::GetAnimationTime(Entity* self, const std::string& animation) { + if (!self) return 0.0f; + return RenderComponent::DoAnimation(self, animation, false); +} + + +float RenderComponent::DoAnimation(Entity* self, const std::string& animation, bool sendAnimation, float priority, float scale) { + if (!self) return 0.0f; + auto* renderComponent = self->GetComponent(); + if (!renderComponent) return 0.0f; + + Game::logger->Log("RenderComponent", "looking up animation %s playing anim %i priority %f scale %f", animation.c_str(), sendAnimation, priority, scale); + auto* animationsTable = CDClientManager::Instance().GetTable(); + for (auto& groupId : renderComponent->m_animationGroupIds) { + Game::logger->Log("RenderComponent", "checking id %i with previous being %s", groupId, renderComponent->GetLastAnimationName().c_str()); + auto animationGroup = animationsTable->GetAnimation(animation, renderComponent->GetLastAnimationName(), groupId); + if (animationGroup.FoundData()) { + auto data = animationGroup.Data(); + Game::logger->Log("RenderComponent", "animation %s priority %f length %f", data.animation_name.c_str(), data.priority, data.animation_length); + if (sendAnimation) GameMessages::SendPlayAnimation(self, GeneralUtils::ASCIIToUTF16(animation), priority, scale); + renderComponent->SetLastAnimationName(data.animation_name); + return data.animation_length; + } + } + Game::logger->Log("RenderComponent", "unable to find animation %s for lot %i", animation.c_str(), self->GetLOT()); + return 0.0f; +} diff --git a/dGame/dComponents/RenderComponent.h b/dGame/dComponents/RenderComponent.h index de8b2907..ef916396 100644 --- a/dGame/dComponents/RenderComponent.h +++ b/dGame/dComponents/RenderComponent.h @@ -58,7 +58,7 @@ class RenderComponent : public Component { public: static const eReplicaComponentType ComponentType = eReplicaComponentType::RENDER; - RenderComponent(Entity* entity); + RenderComponent(Entity* entity, int32_t componentId = -1); ~RenderComponent() override; void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags); @@ -104,6 +104,16 @@ public: */ std::vector& GetEffects(); + static float DoAnimation(Entity* self, const std::string& animation, bool sendAnimation, float priority = 0.0f, float scale = 1.0f); + + static float PlayAnimation(Entity* self, const std::u16string& animation, float priority = 0.0f, float scale = 1.0f); + static float PlayAnimation(Entity* self, const std::string& animation, float priority = 0.0f, float scale = 1.0f); + static float GetAnimationTime(Entity* self, const std::string& animation); + static float GetAnimationTime(Entity* self, const std::u16string& animation); + + const std::string& GetLastAnimationName() const { return m_LastAnimationName; }; + void SetLastAnimationName(const std::string& name) { m_LastAnimationName = name; }; + private: /** @@ -111,6 +121,11 @@ private: */ std::vector m_Effects; + std::vector m_animationGroupIds; + + // The last animationName that was played + std::string m_LastAnimationName; + /** * Cache of queries that look for the length of each effect, indexed by effect ID */ diff --git a/dGame/dComponents/ScriptedActivityComponent.cpp b/dGame/dComponents/ScriptedActivityComponent.cpp index bafa1faa..d6700ab2 100644 --- a/dGame/dComponents/ScriptedActivityComponent.cpp +++ b/dGame/dComponents/ScriptedActivityComponent.cpp @@ -26,13 +26,13 @@ #include "CDActivityRewardsTable.h" #include "CDActivitiesTable.h" -ScriptedActivityComponent::ScriptedActivityComponent(Entity* parent, int activityID) : Component(parent) { +ScriptedActivityComponent::ScriptedActivityComponent(Entity* parent, int activityID): Component(parent) { m_ActivityID = activityID; CDActivitiesTable* activitiesTable = CDClientManager::Instance().GetTable(); - std::vector activities = activitiesTable->Query([=](CDActivities entry) {return (entry.ActivityID == m_ActivityID); }); + auto activityResult = activitiesTable->GetActivity(m_ActivityID); - for (CDActivities activity : activities) { - m_ActivityInfo = activity; + if (activityResult.FoundData()) { + m_ActivityInfo = activityResult.Data(); const auto mapID = m_ActivityInfo.instanceMapID; @@ -57,6 +57,7 @@ ScriptedActivityComponent::ScriptedActivityComponent(Entity* parent, int activit if (destroyableComponent) { // check for LMIs and set the loot LMIs + Game::logger->Log("ScriptedActivityComponent", "i am %i with lmi %i", m_Parent->GetLOT(), destroyableComponent->GetLootMatrixID()); CDActivityRewardsTable* activityRewardsTable = CDClientManager::Instance().GetTable(); std::vector activityRewards = activityRewardsTable->Query([=](CDActivityRewards entry) {return (entry.LootMatrixIndex == destroyableComponent->GetLootMatrixID()); }); @@ -64,13 +65,13 @@ ScriptedActivityComponent::ScriptedActivityComponent(Entity* parent, int activit if (activityRewards.size() > 0) { startingLMI = activityRewards[0].LootMatrixIndex; + Game::logger->Log("ScriptedActivityComponent", "index 0 is %i %i", activityRewards[0].LootMatrixIndex, activityRewards[0].objectTemplate); } if (startingLMI > 0) { - // now time for bodge :) - std::vector objectTemplateActivities = activityRewardsTable->Query([=](CDActivityRewards entry) {return (activityRewards[0].objectTemplate == entry.objectTemplate); }); for (const auto& item : objectTemplateActivities) { + Game::logger->Log("ScriptedActivityComponent", "%i added loot matrix with rating %i index %i objectTemplate %i", m_Parent->GetLOT(), item.activityRating, item.LootMatrixIndex, item.objectTemplate); if (item.activityRating > 0 && item.activityRating < 5) { m_ActivityLootMatrices.insert({ item.activityRating, item.LootMatrixIndex }); } @@ -99,21 +100,22 @@ void ScriptedActivityComponent::Serialize(RakNet::BitStream* outBitStream, bool void ScriptedActivityComponent::ReloadConfig() { CDActivitiesTable* activitiesTable = CDClientManager::Instance().GetTable(); - std::vector activities = activitiesTable->Query([=](CDActivities entry) {return (entry.ActivityID == m_ActivityID); }); - for (auto activity : activities) { - auto mapID = m_ActivityInfo.instanceMapID; + auto activityResult = activitiesTable->GetActivity(m_ActivityID); + if (activityResult.FoundData()) { + auto data = activityResult.Data(); + auto mapID = data.instanceMapID; if ((mapID == 1203 || mapID == 1261 || mapID == 1303 || mapID == 1403) && Game::config->GetValue("solo_racing") == "1") { m_ActivityInfo.minTeamSize = 1; m_ActivityInfo.minTeams = 1; } else { - m_ActivityInfo.minTeamSize = activity.minTeamSize; - m_ActivityInfo.minTeams = activity.minTeams; + m_ActivityInfo.minTeamSize = data.minTeamSize; + m_ActivityInfo.minTeams = data.minTeams; } } } void ScriptedActivityComponent::HandleMessageBoxResponse(Entity* player, const std::string& id) { - if (m_ActivityInfo.ActivityID == 103) { + if (m_ActivityID == 103) { return; } @@ -125,7 +127,7 @@ void ScriptedActivityComponent::HandleMessageBoxResponse(Entity* player, const s } void ScriptedActivityComponent::PlayerJoin(Entity* player) { - if (m_ActivityInfo.ActivityID == 103 || PlayerIsInQueue(player) || !IsValidActivity(player)) { + if (m_ActivityID == 103 || PlayerIsInQueue(player) || !IsValidActivity(player)) { return; } @@ -390,7 +392,7 @@ void ScriptedActivityComponent::PlayerReady(Entity* player, bool bReady) { } ActivityInstance* ScriptedActivityComponent::NewInstance() { - auto* instance = new ActivityInstance(m_Parent, m_ActivityInfo); + auto* instance = new ActivityInstance(m_Parent, this, m_ActivityInfo); m_Instances.push_back(instance); return instance; } @@ -557,12 +559,12 @@ void ActivityInstance::StartZone() { void ActivityInstance::RewardParticipant(Entity* participant) { auto* missionComponent = participant->GetComponent(); if (missionComponent) { - missionComponent->Progress(eMissionTaskType::ACTIVITY, m_ActivityInfo.ActivityID); + missionComponent->Progress(eMissionTaskType::ACTIVITY, m_OwningComponent->GetActivityID()); } // First, get the activity data auto* activityRewardsTable = CDClientManager::Instance().GetTable(); - std::vector activityRewards = activityRewardsTable->Query([=](CDActivityRewards entry) { return (entry.objectTemplate == m_ActivityInfo.ActivityID); }); + std::vector activityRewards = activityRewardsTable->Query([=](CDActivityRewards entry) { return (entry.objectTemplate == m_OwningComponent->GetActivityID()); }); if (!activityRewards.empty()) { uint32_t minCoins = 0; diff --git a/dGame/dComponents/ScriptedActivityComponent.h b/dGame/dComponents/ScriptedActivityComponent.h index 1d49a62d..84ac0bc2 100644 --- a/dGame/dComponents/ScriptedActivityComponent.h +++ b/dGame/dComponents/ScriptedActivityComponent.h @@ -15,13 +15,18 @@ #include "CDActivitiesTable.h" +class ScriptedActivityComponent; + /** * Represents an instance of an activity, having participants and score */ class ActivityInstance { public: - ActivityInstance(Entity* parent, CDActivities activityInfo) { m_Parent = parent; m_ActivityInfo = activityInfo; }; - //~ActivityInstance(); + ActivityInstance(Entity* parent, ScriptedActivityComponent* parentComponent, CDActivities activityInfo) { + m_Parent = parent; + m_OwningComponent = parentComponent; + m_ActivityInfo = activityInfo; + }; /** * Adds an entity to this activity @@ -88,6 +93,11 @@ private: */ Entity* m_Parent; + /** + * The component that owns this activity (the ScriptedActivityComponent) + */ + ScriptedActivityComponent* m_OwningComponent; + /** * All the participants of this activity */ @@ -212,7 +222,7 @@ public: * Returns the ID of this activity * @return the ID of this activity */ - int GetActivityID() { return m_ActivityInfo.ActivityID; } + int GetActivityID() { return m_ActivityID; } /** * Returns if this activity has a lobby, e.g. if it needs to instance players to some other map diff --git a/dGame/dComponents/SwitchComponent.cpp b/dGame/dComponents/SwitchComponent.cpp index dbdf37a9..d2c1dd50 100644 --- a/dGame/dComponents/SwitchComponent.cpp +++ b/dGame/dComponents/SwitchComponent.cpp @@ -1,6 +1,7 @@ #include "SwitchComponent.h" #include "EntityManager.h" #include "eTriggerEventType.h" +#include "RenderComponent.h" std::vector SwitchComponent::petSwitches; @@ -59,7 +60,7 @@ void SwitchComponent::EntityEnter(Entity* entity) { if (m_PetBouncer != nullptr) { GameMessages::SendPlayFXEffect(m_Parent->GetObjectID(), 2602, u"pettriggeractive", "BounceEffect", LWOOBJID_EMPTY, 1, 1, true); - GameMessages::SendPlayAnimation(m_Parent, u"engaged", 0, 1); + RenderComponent::PlayAnimation(m_Parent, u"engaged"); m_PetBouncer->SetPetBouncerEnabled(true); } else { EntityManager::Instance()->SerializeEntity(m_Parent); diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index 33a7f104..062fece7 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -34,6 +34,7 @@ #include "eRacingTaskParam.h" #include "eMissionTaskType.h" #include "eMissionState.h" +#include "RenderComponent.h" #include #include @@ -5110,7 +5111,7 @@ void GameMessages::HandlePlayEmote(RakNet::BitStream* inStream, Entity* entity) if (emote) sAnimationName = emote->animationName; } - GameMessages::SendPlayAnimation(entity, GeneralUtils::ASCIIToUTF16(sAnimationName)); + RenderComponent::PlayAnimation(entity, sAnimationName); } void GameMessages::HandleModularBuildConvertModel(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr) { diff --git a/dGame/dUtilities/Loot.cpp b/dGame/dUtilities/Loot.cpp index da0f2487..d1f30e41 100644 --- a/dGame/dUtilities/Loot.cpp +++ b/dGame/dUtilities/Loot.cpp @@ -17,6 +17,7 @@ #include "MissionComponent.h" #include "eMissionState.h" #include "eReplicaComponentType.h" +#include "Metrics.hpp" LootGenerator::LootGenerator() { CDLootTableTable* lootTableTable = CDClientManager::Instance().GetTable(); diff --git a/dGame/dUtilities/SlashCommandHandler.cpp b/dGame/dUtilities/SlashCommandHandler.cpp index 0278136b..d426ac12 100644 --- a/dGame/dUtilities/SlashCommandHandler.cpp +++ b/dGame/dUtilities/SlashCommandHandler.cpp @@ -76,6 +76,7 @@ #include "TriggerComponent.h" #include "eServerDisconnectIdentifiers.h" #include "eReplicaComponentType.h" +#include "RenderComponent.h" #include "CDObjectsTable.h" #include "CDZoneTableTable.h" @@ -418,11 +419,11 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit if ((chatCommand == "playanimation" || chatCommand == "playanim") && args.size() == 1 && entity->GetGMLevel() >= GAME_MASTER_LEVEL_DEVELOPER) { std::u16string anim = GeneralUtils::ASCIIToUTF16(args[0], args[0].size()); - GameMessages::SendPlayAnimation(entity, anim); + RenderComponent::PlayAnimation(entity, anim); auto* possessorComponent = entity->GetComponent(); if (possessorComponent) { auto* possessedComponent = EntityManager::Instance()->GetEntity(possessorComponent->GetPossessable()); - if (possessedComponent) GameMessages::SendPlayAnimation(possessedComponent, anim); + if (possessedComponent) RenderComponent::PlayAnimation(possessedComponent, anim); } } @@ -1955,7 +1956,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit EntityManager::Instance()->SerializeEntity(closest); } else if (args[1] == "-a" && args.size() >= 3) { - GameMessages::SendPlayAnimation(closest, GeneralUtils::UTF8ToUTF16(args[2])); + RenderComponent::PlayAnimation(closest, args.at(2)); } else if (args[1] == "-s") { for (auto* entry : closest->GetSettings()) { ChatPackets::SendSystemMessage(sysAddr, GeneralUtils::UTF8ToUTF16(entry->GetString())); diff --git a/dMasterServer/MasterServer.cpp b/dMasterServer/MasterServer.cpp index cc2bdd90..7bb70391 100644 --- a/dMasterServer/MasterServer.cpp +++ b/dMasterServer/MasterServer.cpp @@ -49,6 +49,7 @@ namespace Game { dConfig* config = nullptr; AssetManager* assetManager = nullptr; bool shouldShutdown = false; + std::mt19937 randomEngine; } //namespace Game bool shutdownSequenceStarted = false; @@ -290,6 +291,7 @@ int main(int argc, char** argv) { return EXIT_SUCCESS; } + Game::randomEngine = std::mt19937(time(0)); uint32_t maxClients = 999; uint32_t ourPort = 1000; if (Game::config->GetValue("max_clients") != "") maxClients = std::stoi(Game::config->GetValue("max_clients")); @@ -332,8 +334,7 @@ int main(int argc, char** argv) { if (Game::config->GetValue("prestart_servers") != "" && Game::config->GetValue("prestart_servers") == "1") { StartChatServer(); - Game::im->GetInstance(0, false, 0); - Game::im->GetInstance(1000, false, 0); + Game::im->GetInstance(1800, false, 0); StartAuthServer(); } diff --git a/dScripts/02_server/DLU/DLUVanityNPC.cpp b/dScripts/02_server/DLU/DLUVanityNPC.cpp index e3db2353..ba2c6604 100644 --- a/dScripts/02_server/DLU/DLUVanityNPC.cpp +++ b/dScripts/02_server/DLU/DLUVanityNPC.cpp @@ -2,6 +2,7 @@ #include "GameMessages.h" #include "dServer.h" #include "VanityUtilities.h" +#include "RenderComponent.h" void DLUVanityNPC::OnStartup(Entity* self) { m_NPC = VanityUtilities::GetNPC("averysumner - Destroyer of Worlds"); @@ -17,7 +18,7 @@ void DLUVanityNPC::OnStartup(Entity* self) { void DLUVanityNPC::OnTimerDone(Entity* self, std::string timerName) { if (timerName == "setupTeleport") { - GameMessages::SendPlayAnimation(self, u"interact"); + RenderComponent::PlayAnimation(self, u"interact"); GameMessages::SendPlayFXEffect(self->GetObjectID(), 6478, u"teleportBeam", "teleportBeam"); GameMessages::SendPlayFXEffect(self->GetObjectID(), 6478, u"teleportRings", "teleportRings"); diff --git a/dScripts/02_server/Enemy/AG/BossSpiderQueenEnemyServer.cpp b/dScripts/02_server/Enemy/AG/BossSpiderQueenEnemyServer.cpp index c584f05b..aa04f571 100644 --- a/dScripts/02_server/Enemy/AG/BossSpiderQueenEnemyServer.cpp +++ b/dScripts/02_server/Enemy/AG/BossSpiderQueenEnemyServer.cpp @@ -14,6 +14,7 @@ #include "GameMessages.h" #include "SkillComponent.h" #include "eReplicaComponentType.h" +#include "RenderComponent.h" #include @@ -695,11 +696,11 @@ float BossSpiderQueenEnemyServer::PlayAnimAndReturnTime(Entity* self, const std: //TODO: Get the actual animation time // Get the anim time - float animTimer = defaultAnimPause; //self:GetAnimationTime{animationID = animID}.time + float animTimer = RenderComponent::GetAnimationTime(self, animID); // If we have an animation play it if (animTimer > 0) { - GameMessages::SendPlayAnimation(self, animID); + animTimer = RenderComponent::PlayAnimation(self, animID); } // If the anim time is less than the the default time use default diff --git a/dScripts/02_server/Enemy/AM/AmDarklingDragon.cpp b/dScripts/02_server/Enemy/AM/AmDarklingDragon.cpp index 28ba0044..0ee5431b 100644 --- a/dScripts/02_server/Enemy/AM/AmDarklingDragon.cpp +++ b/dScripts/02_server/Enemy/AM/AmDarklingDragon.cpp @@ -7,6 +7,7 @@ #include "BaseCombatAIComponent.h" #include "EntityInfo.h" #include "eAninmationFlags.h" +#include "RenderComponent.h" void AmDarklingDragon::OnStartup(Entity* self) { self->SetVar(u"weakspot", 0); @@ -70,9 +71,9 @@ void AmDarklingDragon::OnHitOrHealResult(Entity* self, Entity* attacker, int32_t self->SetVar(u"weakpoint", 2); GameMessages::SendChangeIdleFlags(self->GetObjectID(), eAnimationFlags::IDLE_NONE, eAnimationFlags::IDLE_COMBAT, UNASSIGNED_SYSTEM_ADDRESS); - GameMessages::SendPlayAnimation(self, u"stunstart", 1.7f); + float animationTime = RenderComponent::PlayAnimation(self, u"stunstart", 1.7f); - self->AddTimer("timeToStunLoop", 1); + self->AddTimer("timeToStunLoop", animationTime); auto position = self->GetPosition(); auto forward = self->GetRotation().GetForwardVector(); @@ -121,9 +122,9 @@ void AmDarklingDragon::OnTimerDone(Entity* self, std::string timerName) { } else if (timerName == "ExposeWeakSpotTimer") { self->SetVar(u"weakspot", 1); } else if (timerName == "timeToStunLoop") { - GameMessages::SendPlayAnimation(self, u"stunloop", 1.8f); + RenderComponent::PlayAnimation(self, u"stunloop", 1.8f); } else if (timerName == "ReviveTimer") { - GameMessages::SendPlayAnimation(self, u"stunend", 2.0f); + RenderComponent::PlayAnimation(self, u"stunend", 2.0f); self->AddTimer("backToAttack", 1); } else if (timerName == "backToAttack") { auto* baseCombatAIComponent = self->GetComponent(); @@ -153,5 +154,5 @@ void AmDarklingDragon::OnFireEventServerSide(Entity* self, Entity* sender, std:: self->SetVar(u"Golem", sender->GetObjectID()); - GameMessages::SendPlayAnimation(self, u"quickbuildhold", 1.9f); + RenderComponent::PlayAnimation(self, u"quickbuildhold", 1.9f); } diff --git a/dScripts/02_server/Enemy/FV/FvMaelstromDragon.cpp b/dScripts/02_server/Enemy/FV/FvMaelstromDragon.cpp index e78f537f..664d8b67 100644 --- a/dScripts/02_server/Enemy/FV/FvMaelstromDragon.cpp +++ b/dScripts/02_server/Enemy/FV/FvMaelstromDragon.cpp @@ -5,6 +5,7 @@ #include "DestroyableComponent.h" #include "eAninmationFlags.h" #include "EntityInfo.h" +#include "RenderComponent.h" void FvMaelstromDragon::OnStartup(Entity* self) { self->SetVar(u"weakspot", 0); @@ -86,9 +87,9 @@ void FvMaelstromDragon::OnHitOrHealResult(Entity* self, Entity* attacker, int32_ self->SetVar(u"weakpoint", 2); GameMessages::SendChangeIdleFlags(self->GetObjectID(), eAnimationFlags::IDLE_NONE, eAnimationFlags::IDLE_COMBAT, UNASSIGNED_SYSTEM_ADDRESS); - GameMessages::SendPlayAnimation(self, u"stunstart", 1.7f); + RenderComponent::PlayAnimation(self, u"stunstart", 1.7f); - self->AddTimer("timeToStunLoop", 1); + self->AddTimer("timeToStunLoop", 1.0f); auto position = self->GetPosition(); auto forward = self->GetRotation().GetForwardVector(); @@ -137,10 +138,10 @@ void FvMaelstromDragon::OnTimerDone(Entity* self, std::string timerName) { } else if (timerName == "ExposeWeakSpotTimer") { self->SetVar(u"weakspot", 1); } else if (timerName == "timeToStunLoop") { - GameMessages::SendPlayAnimation(self, u"stunloop", 1.8f); + RenderComponent::PlayAnimation(self, u"stunloop", 1.8f); } else if (timerName == "ReviveTimer") { - GameMessages::SendPlayAnimation(self, u"stunend", 2.0f); - self->AddTimer("backToAttack", 1); + RenderComponent::PlayAnimation(self, u"stunend", 2.0f); + self->AddTimer("backToAttack", 1.0f); } else if (timerName == "backToAttack") { auto* baseCombatAIComponent = self->GetComponent(); auto* skillComponent = self->GetComponent(); @@ -174,5 +175,5 @@ FvMaelstromDragon::OnFireEventServerSide(Entity* self, Entity* sender, std::stri self->SetVar(u"Golem", sender->GetObjectID()); - GameMessages::SendPlayAnimation(self, u"quickbuildhold", 1.9f); + RenderComponent::PlayAnimation(self, u"quickbuildhold", 1.9f); } diff --git a/dScripts/02_server/Enemy/General/BaseEnemyApe.cpp b/dScripts/02_server/Enemy/General/BaseEnemyApe.cpp index ea3ce9b8..50108ffb 100644 --- a/dScripts/02_server/Enemy/General/BaseEnemyApe.cpp +++ b/dScripts/02_server/Enemy/General/BaseEnemyApe.cpp @@ -6,6 +6,7 @@ #include "EntityInfo.h" #include "SkillComponent.h" #include "eAninmationFlags.h" +#include "RenderComponent.h" void BaseEnemyApe::OnStartup(Entity* self) { self->SetVar(u"timesStunned", 2); @@ -37,7 +38,7 @@ void BaseEnemyApe::OnHit(Entity* self, Entity* attacker) { if (skillComponent) { skillComponent->Reset(); } - GameMessages::SendPlayAnimation(self, u"disable", 1.7f); + RenderComponent::PlayAnimation(self, u"disable", 1.7f); GameMessages::SendChangeIdleFlags(self->GetObjectID(), eAnimationFlags::IDLE_NONE, eAnimationFlags::IDLE_COMBAT, UNASSIGNED_SYSTEM_ADDRESS); const auto reviveTime = self->GetVar(u"reviveTime") != 0.0f ? self->GetVar(u"reviveTime") : 12.0f; diff --git a/dScripts/02_server/Enemy/General/GfApeSmashingQB.cpp b/dScripts/02_server/Enemy/General/GfApeSmashingQB.cpp index 5bba6450..40cc88f4 100644 --- a/dScripts/02_server/Enemy/General/GfApeSmashingQB.cpp +++ b/dScripts/02_server/Enemy/General/GfApeSmashingQB.cpp @@ -1,6 +1,8 @@ #include "GfApeSmashingQB.h" #include "EntityManager.h" #include "GameMessages.h" +#include "Entity.h" +#include "RenderComponent.h" void GfApeSmashingQB::OnStartup(Entity* self) { self->SetNetworkVar(u"lootTagOwner", self->GetVar(u"lootTagOwner")); @@ -16,7 +18,7 @@ void GfApeSmashingQB::OnRebuildComplete(Entity* self, Entity* target) { auto* ape = EntityManager::Instance()->GetEntity(self->GetVar(u"ape")); if (ape != nullptr) { ape->OnFireEventServerSide(target, "rebuildDone"); - GameMessages::SendPlayAnimation(self, u"smash", 1.7f); + RenderComponent::PlayAnimation(self, u"smash", 1.7f); self->AddTimer("anchorBreakTime", 1.0f); } } diff --git a/dScripts/02_server/Equipment/MaestromExtracticatorServer.cpp b/dScripts/02_server/Equipment/MaestromExtracticatorServer.cpp index c01d2362..f02c0568 100644 --- a/dScripts/02_server/Equipment/MaestromExtracticatorServer.cpp +++ b/dScripts/02_server/Equipment/MaestromExtracticatorServer.cpp @@ -4,19 +4,15 @@ #include "EntityManager.h" #include "MissionComponent.h" #include "eMissionTaskType.h" +#include "RenderComponent.h" void MaestromExtracticatorServer::OnStartup(Entity* self) { - //self:SetNetworkVar("current_anim", failAnim) - GameMessages::SendPlayAnimation(self, GeneralUtils::ASCIIToUTF16(failAnim)); - - self->AddTimer("PlayFail", defaultTime); + self->AddTimer("PlayFail", RenderComponent::PlayAnimation(self, failAnim)); self->AddTimer("RemoveSample", destroyAfterNoSampleTime); } -void MaestromExtracticatorServer::OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, - int32_t param2, int32_t param3) { - if (sender == nullptr) - return; +void MaestromExtracticatorServer::OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, int32_t param2, int32_t param3) { + if (sender == nullptr) return; if (args == "attemptCollection") { Entity* player = EntityManager::Instance()->GetEntity(self->GetSpawnerID()); @@ -32,20 +28,17 @@ void MaestromExtracticatorServer::OnFireEventServerSide(Entity* self, Entity* se } void MaestromExtracticatorServer::CollectSample(Entity* self, LWOOBJID sampleObj) { - PlayAnimAndReturnTime(self, collectAnim); - self->AddTimer("RemoveSample", defaultTime); + self->AddTimer("RemoveSample", PlayAnimAndReturnTime(self, collectAnim)); } -void MaestromExtracticatorServer::PlayAnimAndReturnTime(Entity* self, std::string animID) { - GameMessages::SendPlayAnimation(self, GeneralUtils::ASCIIToUTF16(animID)); +float MaestromExtracticatorServer::PlayAnimAndReturnTime(Entity* self, std::string animID) { + return RenderComponent::PlayAnimation(self, animID); } void MaestromExtracticatorServer::OnTimerDone(Entity* self, std::string timerName) { if (timerName == "RemoveSample") { self->ScheduleKillAfterUpdate(); - } - - if (timerName == "PlayFail") { - GameMessages::SendPlayAnimation(self, GeneralUtils::ASCIIToUTF16(failAnim)); + } else if (timerName == "PlayFail") { + RenderComponent::PlayAnimation(self, failAnim); } } diff --git a/dScripts/02_server/Equipment/MaestromExtracticatorServer.h b/dScripts/02_server/Equipment/MaestromExtracticatorServer.h index c4adb51e..c93a1cde 100644 --- a/dScripts/02_server/Equipment/MaestromExtracticatorServer.h +++ b/dScripts/02_server/Equipment/MaestromExtracticatorServer.h @@ -7,12 +7,11 @@ public: void OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, int32_t param2, int32_t param3); void CollectSample(Entity* self, LWOOBJID sampleObj); - void PlayAnimAndReturnTime(Entity* self, std::string animID); + float PlayAnimAndReturnTime(Entity* self, std::string animID); void OnTimerDone(Entity* self, std::string timerName); private: const std::string failAnim = "idle_maelstrom"; const std::string collectAnim = "collect_maelstrom"; - const float defaultTime = 4.0f; const float destroyAfterNoSampleTime = 8.0f; }; diff --git a/dScripts/02_server/Map/AG/AgMonumentBirds.cpp b/dScripts/02_server/Map/AG/AgMonumentBirds.cpp index ad3417a4..9d4a3349 100644 --- a/dScripts/02_server/Map/AG/AgMonumentBirds.cpp +++ b/dScripts/02_server/Map/AG/AgMonumentBirds.cpp @@ -1,5 +1,8 @@ #include "AgMonumentBirds.h" #include "GameMessages.h" +#include "Entity.h" +#include "RenderComponent.h" +#include "EntityManager.h" //-------------------------------------------------------------- //Makes the ag birds fly away when you get close and smashes them. @@ -16,7 +19,7 @@ void AgMonumentBirds::OnProximityUpdate(Entity* self, Entity* entering, std::str if (name == "MonumentBirds" && status == "ENTER") { self->AddTimer("killBird", 1.0f); - GameMessages::SendPlayAnimation(self, sOnProximityAnim); + RenderComponent::PlayAnimation(self, sOnProximityAnim); self->SetVar(u"IsFlying", true); self->SetVar(u"PlayerID", entering->GetObjectID()); } diff --git a/dScripts/02_server/Map/AM/AmSkullkinDrill.cpp b/dScripts/02_server/Map/AM/AmSkullkinDrill.cpp index da1954d6..4bdf6492 100644 --- a/dScripts/02_server/Map/AM/AmSkullkinDrill.cpp +++ b/dScripts/02_server/Map/AM/AmSkullkinDrill.cpp @@ -5,6 +5,7 @@ #include "ProximityMonitorComponent.h" #include "MissionComponent.h" #include "EntityInfo.h" +#include "RenderComponent.h" void AmSkullkinDrill::OnStartup(Entity* self) { self->SetNetworkVar(u"bIsInUse", false); @@ -70,7 +71,7 @@ void AmSkullkinDrill::OnSkillEventFired(Entity* self, Entity* caster, const std: } void AmSkullkinDrill::TriggerDrill(Entity* self) { - GameMessages::SendPlayAnimation(self, u"slowdown"); + RenderComponent::PlayAnimation(self, u"slowdown"); self->AddTimer("killDrill", 10.0f); @@ -170,7 +171,7 @@ void AmSkullkinDrill::OnArrived(Entity* self, uint32_t waypointIndex) { auto* standObj = GetStandObj(self); if (waypointIndex == 1) { - GameMessages::SendPlayAnimation(self, u"no-spin"); + RenderComponent::PlayAnimation(self, u"no-spin"); GameMessages::SendStopFXEffect(self, true, "active"); GameMessages::SendPlayFXEffect(self->GetObjectID(), -1, u"indicator", "indicator"); @@ -190,7 +191,7 @@ void AmSkullkinDrill::OnArrived(Entity* self, uint32_t waypointIndex) { return; } else { - GameMessages::SendPlayAnimation(self, u"idle"); + RenderComponent::PlayAnimation(self, u"idle"); GameMessages::SendPlayFXEffect(self->GetObjectID(), -1, u"spin", "active"); GameMessages::SendStopFXEffect(self, true, "indicator"); } @@ -215,7 +216,7 @@ void AmSkullkinDrill::PlayCinematic(Entity* self) { void AmSkullkinDrill::PlayAnim(Entity* self, Entity* player, const std::string& animName) { const auto animTime = animName == "spinjitzu-staff-end" ? 0.5f : 1.0f; - GameMessages::SendPlayAnimation(player, GeneralUtils::ASCIIToUTF16(animName)); + RenderComponent::PlayAnimation(player, animName); self->AddTimer("AnimDone_" + animName, animTime); } @@ -308,7 +309,7 @@ void AmSkullkinDrill::OnTimerDone(Entity* self, std::string timerName) { if (animName == "spinjitzu-staff-windup") { TriggerDrill(self); - GameMessages::SendPlayAnimation(player, u"spinjitzu-staff-loop"); + RenderComponent::PlayAnimation(player, u"spinjitzu-staff-loop"); } else if (animName == "spinjitzu-staff-end") { FreezePlayer(self, player, false); diff --git a/dScripts/02_server/Map/AM/AmSkullkinDrillStand.cpp b/dScripts/02_server/Map/AM/AmSkullkinDrillStand.cpp index 628d616a..5493dc24 100644 --- a/dScripts/02_server/Map/AM/AmSkullkinDrillStand.cpp +++ b/dScripts/02_server/Map/AM/AmSkullkinDrillStand.cpp @@ -1,6 +1,8 @@ #include "AmSkullkinDrillStand.h" #include "GameMessages.h" #include "dpEntity.h" +#include "Entity.h" +#include "RenderComponent.h" void AmSkullkinDrillStand::OnStartup(Entity* self) { self->SetVar(u"bActive", true); @@ -31,5 +33,5 @@ void AmSkullkinDrillStand::OnProximityUpdate(Entity* self, Entity* entering, std GameMessages::SendPlayFXEffect(entering->GetObjectID(), 1378, u"create", "pushBack"); - GameMessages::SendPlayAnimation(entering, u"knockback-recovery"); + RenderComponent::PlayAnimation(entering, u"knockback-recovery"); } diff --git a/dScripts/02_server/Map/AM/AmSkullkinTower.cpp b/dScripts/02_server/Map/AM/AmSkullkinTower.cpp index 01acdeaf..f7825f8f 100644 --- a/dScripts/02_server/Map/AM/AmSkullkinTower.cpp +++ b/dScripts/02_server/Map/AM/AmSkullkinTower.cpp @@ -5,6 +5,7 @@ #include "EntityInfo.h" #include "GameMessages.h" #include "MissionComponent.h" +#include "RenderComponent.h" void AmSkullkinTower::OnStartup(Entity* self) { self->SetProximityRadius(20, "Tower"); @@ -117,13 +118,13 @@ void AmSkullkinTower::OnChildRemoved(Entity* self, Entity* child) { self->SetVar(u"legTable", legTable); if (legTable.size() == 2) { - GameMessages::SendPlayAnimation(self, u"wobble-1"); + RenderComponent::PlayAnimation(self, u"wobble-1"); } else if (legTable.size() == 1) { - GameMessages::SendPlayAnimation(self, u"wobble-2"); + RenderComponent::PlayAnimation(self, u"wobble-2"); } else if (legTable.empty()) { const auto animTime = 2.5f; - GameMessages::SendPlayAnimation(self, u"fall"); + RenderComponent::PlayAnimation(self, u"fall"); self->AddTimer("spawnGuys", animTime - 0.2f); diff --git a/dScripts/02_server/Map/GF/GfCaptainsCannon.cpp b/dScripts/02_server/Map/GF/GfCaptainsCannon.cpp index eeabeef6..2b40db3c 100644 --- a/dScripts/02_server/Map/GF/GfCaptainsCannon.cpp +++ b/dScripts/02_server/Map/GF/GfCaptainsCannon.cpp @@ -2,6 +2,7 @@ #include "GameMessages.h" #include "EntityManager.h" #include "MissionComponent.h" +#include "RenderComponent.h" void GfCaptainsCannon::OnUse(Entity* self, Entity* user) { if (self->GetVar(u"bIsInUse")) { @@ -27,7 +28,7 @@ void GfCaptainsCannon::OnUse(Entity* self, Entity* user) { GameMessages::SendTeleport(user->GetObjectID(), position, rotation, user->GetSystemAddress()); - GameMessages::SendPlayAnimation(user, u"cannon-strike-no-equip"); + RenderComponent::PlayAnimation(user, u"cannon-strike-no-equip"); GameMessages::SendPlayFXEffect(user->GetObjectID(), 6039, u"hook", "hook", LWOOBJID_EMPTY, 1, 1, true); @@ -58,7 +59,7 @@ void GfCaptainsCannon::OnTimerDone(Entity* self, std::string timerName) { for (auto* shark : sharkObjects) { if (shark->GetLOT() != m_SharkItemID) continue; - GameMessages::SendPlayAnimation(shark, u"cannon"); + RenderComponent::PlayAnimation(shark, u"cannon"); } GameMessages::SendPlay2DAmbientSound(player, "{7457d85c-4537-4317-ac9d-2f549219ea87}"); diff --git a/dScripts/02_server/Map/GF/GfTikiTorch.cpp b/dScripts/02_server/Map/GF/GfTikiTorch.cpp index 22420679..a4f36da2 100644 --- a/dScripts/02_server/Map/GF/GfTikiTorch.cpp +++ b/dScripts/02_server/Map/GF/GfTikiTorch.cpp @@ -5,6 +5,7 @@ #include "RenderComponent.h" #include "eMissionTaskType.h" #include "eReplicaComponentType.h" +#include "RenderComponent.h" void GfTikiTorch::OnStartup(Entity* self) { LightTorch(self); @@ -16,7 +17,7 @@ void GfTikiTorch::OnUse(Entity* self, Entity* killer) { return; } - GameMessages::SendPlayAnimation(self, u"interact"); + RenderComponent::PlayAnimation(self, u"interact"); self->SetI64(u"userID", killer->GetObjectID()); for (int i = 0; i < m_numspawn; i++) { @@ -55,7 +56,7 @@ void GfTikiTorch::LightTorch(Entity* self) { void GfTikiTorch::OnSkillEventFired(Entity* self, Entity* caster, const std::string& message) { if (self->GetBoolean(u"isBurning") && message == "waterspray") { - GameMessages::SendPlayAnimation(self, u"water"); + RenderComponent::PlayAnimation(self, u"water"); auto* renderComponent = self->GetComponent(); if (renderComponent != nullptr) { diff --git a/dScripts/02_server/Map/GF/MastTeleport.cpp b/dScripts/02_server/Map/GF/MastTeleport.cpp index 6e50c6ec..fd2fe96d 100644 --- a/dScripts/02_server/Map/GF/MastTeleport.cpp +++ b/dScripts/02_server/Map/GF/MastTeleport.cpp @@ -8,6 +8,7 @@ #define _USE_MATH_DEFINES #include #endif +#include "RenderComponent.h" void MastTeleport::OnStartup(Entity* self) { self->SetNetworkVar(u"hookPreconditions", "154;44", UNASSIGNED_SYSTEM_ADDRESS); @@ -58,11 +59,12 @@ void MastTeleport::OnTimerDone(Entity* self, std::string timerName) { GameMessages::SendPlayFXEffect(playerId, 6039, u"hook", "hook", LWOOBJID_EMPTY, 1, 1, true); - GameMessages::SendPlayAnimation(player, u"crow-swing-no-equip", 4.0f); + float animationTime = 6.25f; + animationTime = RenderComponent::PlayAnimation(player, "crow-swing-no-equip", 4.0f); - GameMessages::SendPlayAnimation(self, u"swing"); + RenderComponent::PlayAnimation(self, u"swing"); - self->AddTimer("PlayerAnimDone", 6.25f); + self->AddTimer("PlayerAnimDone", animationTime); } else if (timerName == "PlayerAnimDone") { GameMessages::SendStopFXEffect(player, true, "hook"); diff --git a/dScripts/02_server/Map/General/ExplodingAsset.cpp b/dScripts/02_server/Map/General/ExplodingAsset.cpp index 16340ee6..ee8f8e68 100644 --- a/dScripts/02_server/Map/General/ExplodingAsset.cpp +++ b/dScripts/02_server/Map/General/ExplodingAsset.cpp @@ -4,6 +4,7 @@ #include "MissionComponent.h" #include "SkillComponent.h" #include "eMissionTaskType.h" +#include "RenderComponent.h" //TODO: this has to be updated so that you only get killed if you're in a certain radius. //And so that all entities in a certain radius are killed, not just the attacker. @@ -69,23 +70,6 @@ void ExplodingAsset::OnHit(Entity* self, Entity* attacker) { } void ExplodingAsset::OnProximityUpdate(Entity* self, Entity* entering, std::string name, std::string status) { - /* - if msg.objId:BelongsToFaction{factionID = 1}.bIsInFaction then - if (msg.status == "ENTER") then - self:PlayAnimation{ animationID = "bounce" } - self:PlayFXEffect{ name = "bouncin", effectType = "anim" } - self:SetVar("playersNearChest", (self:GetVar("playersNearChest") + 1 )) - elseif (msg.status == "LEAVE") then - self:SetVar("playersNearChest", (self:GetVar("playersNearChest") - 1 )) - if self:GetVar("playersNearChest") < 1 then - self:PlayAnimation{ animationID = "idle" } - self:StopFXEffect{ name = "bouncin" } - self:SetVar("playersNearChest", 0) - end - end - end - */ - auto* destuctableComponent = entering->GetComponent(); if (destuctableComponent == nullptr) return; @@ -95,14 +79,14 @@ void ExplodingAsset::OnProximityUpdate(Entity* self, Entity* entering, std::stri if (!std::count(factions.begin(), factions.end(), 1)) return; if (status == "ENTER") { - GameMessages::SendPlayAnimation(self, u"bounce"); + RenderComponent::PlayAnimation(self, u"bounce"); GameMessages::SendPlayFXEffect(self, -1, u"anim", "bouncin", LWOOBJID_EMPTY, 1, 1, true); self->SetVar(u"playersNearChest", self->GetVar(u"playersNearChest") + 1); } else if (status == "LEAVE") { self->SetVar(u"playersNearChest", self->GetVar(u"playersNearChest") - 1); if (self->GetVar(u"playersNearChest") < 1) { - GameMessages::SendPlayAnimation(self, u"idle"); + RenderComponent::PlayAnimation(self, u"idle"); GameMessages::SendStopFXEffect(self, true, "bouncin"); self->SetVar(u"playersNearChest", 0); } diff --git a/dScripts/02_server/Map/General/Ninjago/NjIceRailActivator.cpp b/dScripts/02_server/Map/General/Ninjago/NjIceRailActivator.cpp index 2549cd0f..8a9230d9 100644 --- a/dScripts/02_server/Map/General/Ninjago/NjIceRailActivator.cpp +++ b/dScripts/02_server/Map/General/Ninjago/NjIceRailActivator.cpp @@ -1,6 +1,8 @@ #include "NjIceRailActivator.h" #include "EntityManager.h" #include "GameMessages.h" +#include "Entity.h" +#include "RenderComponent.h" void NjIceRailActivator::OnPlayerRailArrived(Entity* self, Entity* sender, const std::u16string& pathName, int32_t waypoint) { @@ -9,7 +11,7 @@ void NjIceRailActivator::OnPlayerRailArrived(Entity* self, Entity* sender, const const auto& blockGroup = self->GetVar(BlockGroupVariable); for (auto* block : EntityManager::Instance()->GetEntitiesInGroup(GeneralUtils::UTF16ToWTF8(blockGroup))) { - GameMessages::SendPlayAnimation(block, u"explode"); + RenderComponent::PlayAnimation(block, u"explode"); const auto blockID = block->GetObjectID(); diff --git a/dScripts/02_server/Map/NT/NtAssemblyTubeServer.cpp b/dScripts/02_server/Map/NT/NtAssemblyTubeServer.cpp index b4d75296..26da3aca 100644 --- a/dScripts/02_server/Map/NT/NtAssemblyTubeServer.cpp +++ b/dScripts/02_server/Map/NT/NtAssemblyTubeServer.cpp @@ -4,6 +4,7 @@ #include "MissionComponent.h" #include "eMissionTaskType.h" #include "eMissionState.h" +#include "RenderComponent.h" void NtAssemblyTubeServer::OnStartup(Entity* self) { self->SetProximityRadius(5, "teleport"); @@ -49,7 +50,7 @@ void NtAssemblyTubeServer::RunAssemblyTube(Entity* self, Entity* player) { ); } - GameMessages::SendPlayAnimation(player, u"tube-sucker", 4.0f); + RenderComponent::PlayAnimation(player, u"tube-sucker", 4.0f); const auto animTime = 3; @@ -82,7 +83,7 @@ void NtAssemblyTubeServer::TeleportPlayer(Entity* self, Entity* player) { GameMessages::SendTeleport(player->GetObjectID(), destPosition, destRotation, player->GetSystemAddress(), true); - GameMessages::SendPlayAnimation(player, u"tube-resurrect", 4.0f); + RenderComponent::PlayAnimation(player, u"tube-resurrect", 4.0f); const auto animTime = 2; diff --git a/dScripts/02_server/Map/NT/NtParadoxPanelServer.cpp b/dScripts/02_server/Map/NT/NtParadoxPanelServer.cpp index 0cb0bec4..f7e27711 100644 --- a/dScripts/02_server/Map/NT/NtParadoxPanelServer.cpp +++ b/dScripts/02_server/Map/NT/NtParadoxPanelServer.cpp @@ -4,6 +4,7 @@ #include "EntityManager.h" #include "Character.h" #include "eMissionState.h" +#include "RenderComponent.h" void NtParadoxPanelServer::OnUse(Entity* self, Entity* user) { GameMessages::SendNotifyClientObject(self->GetObjectID(), u"bActive", 1, 0, user->GetObjectID(), "", user->GetSystemAddress()); @@ -32,18 +33,18 @@ void NtParadoxPanelServer::OnUse(Entity* self, Entity* user) { player->GetCharacter()->SetPlayerFlag(flag, true); - GameMessages::SendPlayAnimation(player, u"rebuild-celebrate"); + RenderComponent::PlayAnimation(player, u"rebuild-celebrate"); GameMessages::SendNotifyClientObject(self->GetObjectID(), u"SparkStop", 0, 0, player->GetObjectID(), "", player->GetSystemAddress()); GameMessages::SendSetStunned(player->GetObjectID(), eStateChangeType::POP, player->GetSystemAddress(), LWOOBJID_EMPTY, false, false, true, false, true, true, false, false, true); self->SetVar(u"bActive", false); }); - GameMessages::SendPlayAnimation(user, u"nexus-powerpanel", 6.0f); + RenderComponent::PlayAnimation(user, u"nexus-powerpanel", 6.0f); GameMessages::SendSetStunned(user->GetObjectID(), eStateChangeType::PUSH, user->GetSystemAddress(), LWOOBJID_EMPTY, false, false, true, false, true, true, false, false, true); return; } - GameMessages::SendPlayAnimation(user, shockAnim); + RenderComponent::PlayAnimation(user, shockAnim); const auto dir = self->GetRotation().GetRightVector(); diff --git a/dScripts/02_server/Map/NT/NtParadoxTeleServer.cpp b/dScripts/02_server/Map/NT/NtParadoxTeleServer.cpp index 8b4f19fe..e3ec8d7d 100644 --- a/dScripts/02_server/Map/NT/NtParadoxTeleServer.cpp +++ b/dScripts/02_server/Map/NT/NtParadoxTeleServer.cpp @@ -3,6 +3,7 @@ #include "EntityManager.h" #include "MissionComponent.h" #include "eMissionTaskType.h" +#include "RenderComponent.h" void NtParadoxTeleServer::OnStartup(Entity* self) { self->SetProximityRadius(5, "teleport"); @@ -27,7 +28,7 @@ void NtParadoxTeleServer::OnProximityUpdate(Entity* self, Entity* entering, std: true, true, true, true, true, true, true ); - GameMessages::SendPlayAnimation(player, u"teledeath", 4.0f); + RenderComponent::PlayAnimation(player, u"teledeath", 4.0f); const auto animTime = 2; @@ -73,7 +74,7 @@ void NtParadoxTeleServer::TeleportPlayer(Entity* self, Entity* player) { GameMessages::SendTeleport(player->GetObjectID(), destPosition, destRotation, player->GetSystemAddress(), true); - GameMessages::SendPlayAnimation(player, u"paradox-teleport-in", 4.0f); + RenderComponent::PlayAnimation(player, u"paradox-teleport-in", 4.0f); const auto animTime = 2; diff --git a/dScripts/02_server/Map/NT/NtSleepingGuard.cpp b/dScripts/02_server/Map/NT/NtSleepingGuard.cpp index 145df6c8..92a80582 100644 --- a/dScripts/02_server/Map/NT/NtSleepingGuard.cpp +++ b/dScripts/02_server/Map/NT/NtSleepingGuard.cpp @@ -1,6 +1,7 @@ #include "NtSleepingGuard.h" #include "GameMessages.h" #include "MissionComponent.h" +#include "RenderComponent.h" void NtSleepingGuard::OnStartup(Entity* self) { self->SetNetworkVar(u"asleep", true); @@ -17,7 +18,7 @@ void NtSleepingGuard::OnEmoteReceived(Entity* self, const int32_t emote, Entity* // Set asleep to false self->SetNetworkVar(u"asleep", false); - GameMessages::SendPlayAnimation(self, u"greet"); + RenderComponent::PlayAnimation(self, u"greet"); auto* missionComponent = target->GetComponent(); diff --git a/dScripts/02_server/Map/NT/NtVentureCannonServer.cpp b/dScripts/02_server/Map/NT/NtVentureCannonServer.cpp index e6cd2df6..c1f07bbd 100644 --- a/dScripts/02_server/Map/NT/NtVentureCannonServer.cpp +++ b/dScripts/02_server/Map/NT/NtVentureCannonServer.cpp @@ -1,6 +1,9 @@ #include "NtVentureCannonServer.h" #include "GameMessages.h" #include "EntityManager.h" +#include "Entity.h" +#include "GeneralUtils.h" +#include "RenderComponent.h" void NtVentureCannonServer::OnUse(Entity* self, Entity* user) { auto* player = user; @@ -26,7 +29,7 @@ void NtVentureCannonServer::OnUse(Entity* self, Entity* user) { GameMessages::SendTeleport(playerID, destPosition, destRotation, player->GetSystemAddress(), true); - GameMessages::SendPlayAnimation(player, u"scale-down", 4.0f); + RenderComponent::PlayAnimation(player, u"scale-down", 4.0f); const auto enterCinematicUname = enterCinematic; GameMessages::SendPlayCinematic(player->GetObjectID(), enterCinematicUname, player->GetSystemAddress()); @@ -118,5 +121,5 @@ void NtVentureCannonServer::FirePlayer(Entity* self, Entity* player) { GameMessages::SendTeleport(player->GetObjectID(), destPosition, destRotation, player->GetSystemAddress(), true); - GameMessages::SendPlayAnimation(player, u"venture-cannon-out", 4.0f); + RenderComponent::PlayAnimation(player, u"venture-cannon-out", 4.0f); } diff --git a/dScripts/02_server/Map/njhub/CatapultBaseServer.cpp b/dScripts/02_server/Map/njhub/CatapultBaseServer.cpp index fda103b0..55935c62 100644 --- a/dScripts/02_server/Map/njhub/CatapultBaseServer.cpp +++ b/dScripts/02_server/Map/njhub/CatapultBaseServer.cpp @@ -1,6 +1,8 @@ #include "CatapultBaseServer.h" #include "GameMessages.h" #include "EntityManager.h" +#include "Entity.h" +#include "RenderComponent.h" void CatapultBaseServer::OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1, int32_t param2) { if (name == "BouncerBuilt") { @@ -21,7 +23,7 @@ void CatapultBaseServer::OnTimerDone(Entity* self, std::string timerName) { // tell the arm to the play the platform animation, which is just the arm laying there but with bouncer for (auto* obj : arm) { - GameMessages::SendPlayAnimation(obj, u"idle-platform"); + RenderComponent::PlayAnimation(obj, u"idle-platform"); GameMessages::SendPlayNDAudioEmitter(obj, UNASSIGNED_SYSTEM_ADDRESS, "{8cccf912-69e3-4041-a20b-63e4afafc993}"); // set the art so we can use it again self->SetVar(u"Arm", obj->GetObjectID()); @@ -38,7 +40,7 @@ void CatapultBaseServer::OnTimerDone(Entity* self, std::string timerName) { // tell the arm to player the launcher animation auto animTime = 1; self->AddTimer("resetArm", animTime); - GameMessages::SendPlayAnimation(arm, u"launch"); + RenderComponent::PlayAnimation(arm, u"launch"); } else if (timerName == "bounce") { auto* bouncer = EntityManager::Instance()->GetEntity(self->GetVar(u"Bouncer")); if (bouncer == nullptr) return; @@ -52,7 +54,7 @@ void CatapultBaseServer::OnTimerDone(Entity* self, std::string timerName) { if (arm == nullptr) return; // set the arm back to natural state - GameMessages::SendPlayAnimation(arm, u"idle"); + RenderComponent::PlayAnimation(arm, u"idle"); auto* bouncer = EntityManager::Instance()->GetEntity(self->GetVar(u"Bouncer")); if (bouncer == nullptr) return; diff --git a/dScripts/02_server/Map/njhub/CavePrisonCage.cpp b/dScripts/02_server/Map/njhub/CavePrisonCage.cpp index 0df91884..14cf6719 100644 --- a/dScripts/02_server/Map/njhub/CavePrisonCage.cpp +++ b/dScripts/02_server/Map/njhub/CavePrisonCage.cpp @@ -4,6 +4,7 @@ #include "GameMessages.h" #include "Character.h" #include "dZoneManager.h" +#include "RenderComponent.h" void CavePrisonCage::OnStartup(Entity* self) { const auto& myNum = self->GetVar(u"myNumber"); @@ -101,7 +102,7 @@ void CavePrisonCage::SpawnCounterweight(Entity* self, Spawner* spawner) { } // Play the 'down' animation on the button - GameMessages::SendPlayAnimation(button, u"down"); + RenderComponent::PlayAnimation(button, u"down"); // Setup a timer named 'buttonGoingDown' to be triggered in 5 seconds self->AddTimer("buttonGoingDown", 5.0f); @@ -136,13 +137,13 @@ void CavePrisonCage::OnTimerDone(Entity* self, std::string timerName) { // the anim of the button down is over if (timerName == "buttonGoingDown") { // Play the 'up' animation - GameMessages::SendPlayAnimation(self, u"up"); + RenderComponent::PlayAnimation(self, u"up"); // Setup a timer named 'CageOpen' to be triggered in 1 second self->AddTimer("CageOpen", 1.0f); } else if (timerName == "CageOpen") { // play the idle open anim - GameMessages::SendPlayAnimation(self, u"idle-up"); + RenderComponent::PlayAnimation(self, u"idle-up"); // Get the villeger auto* villager = EntityManager::Instance()->GetEntity(self->GetVar(u"villager")); @@ -199,13 +200,13 @@ void CavePrisonCage::OnTimerDone(Entity* self, std::string timerName) { } // Play the 'up' animation on the button - GameMessages::SendPlayAnimation(button, u"up"); + RenderComponent::PlayAnimation(button, u"up"); // Setup a timer named 'CageClosed' to be triggered in 1 second self->AddTimer("CageClosed", 1.0f); } else if (timerName == "CageClosed") { // play the idle closed anim - GameMessages::SendPlayAnimation(self, u"idle"); + RenderComponent::PlayAnimation(self, u"idle"); // Setup a timer named 'ResetPrison' to be triggered in 10 seconds self->AddTimer("ResetPrison", 10.0f); diff --git a/dScripts/02_server/Map/njhub/boss_instance/NjMonastryBossInstance.cpp b/dScripts/02_server/Map/njhub/boss_instance/NjMonastryBossInstance.cpp index dbab7365..d5880029 100644 --- a/dScripts/02_server/Map/njhub/boss_instance/NjMonastryBossInstance.cpp +++ b/dScripts/02_server/Map/njhub/boss_instance/NjMonastryBossInstance.cpp @@ -9,6 +9,7 @@ #include "SkillComponent.h" #include "TeamManager.h" #include +#include "RenderComponent.h" // // // // // // // // Event handling // @@ -261,7 +262,7 @@ void NjMonastryBossInstance::HandleCounterWeightSpawned(Entity* self, Entity* co skillComponent->CalculateBehavior(1635, 39097, frakjaw->GetObjectID(), true, false); } - GameMessages::SendPlayAnimation(frakjaw, StunnedAnimation); + RenderComponent::PlayAnimation(frakjaw, StunnedAnimation); GameMessages::SendPlayNDAudioEmitter(frakjaw, UNASSIGNED_SYSTEM_ADDRESS, CounterSmashAudio); // Before wave 4 we should lower frakjaw from the ledge @@ -281,7 +282,7 @@ void NjMonastryBossInstance::HandleCounterWeightSpawned(Entity* self, Entity* co } void NjMonastryBossInstance::HandleLowerFrakjawSpawned(Entity* self, Entity* lowerFrakjaw) { - GameMessages::SendPlayAnimation(lowerFrakjaw, TeleportInAnimation); + RenderComponent::PlayAnimation(lowerFrakjaw, TeleportInAnimation); self->SetVar(LowerFrakjawVariable, lowerFrakjaw->GetObjectID()); auto* combatAI = lowerFrakjaw->GetComponent(); @@ -401,7 +402,7 @@ void NjMonastryBossInstance::TeleportPlayer(Entity* player, uint32_t position) { void NjMonastryBossInstance::SummonWave(Entity* self, Entity* frakjaw) { GameMessages::SendNotifyClientObject(self->GetObjectID(), PlayCinematicNotification, 0, 0, LWOOBJID_EMPTY, LedgeFrakSummon, UNASSIGNED_SYSTEM_ADDRESS); - GameMessages::SendPlayAnimation(frakjaw, SummonAnimation); + RenderComponent::PlayAnimation(frakjaw, SummonAnimation); // Stop the music for the first, fourth and fifth wave const auto wave = self->GetVar(WaveNumberVariable); @@ -425,7 +426,7 @@ void NjMonastryBossInstance::LowerFrakjawSummon(Entity* self, Entity* frakjaw) { GameMessages::SendNotifyClientObject(self->GetObjectID(), PlayCinematicNotification, 0, 0, LWOOBJID_EMPTY, BottomFrakSummon, UNASSIGNED_SYSTEM_ADDRESS); ActivityTimerStart(self, SpawnWaveTimer, 2.0f, 2.0f); - GameMessages::SendPlayAnimation(frakjaw, SummonAnimation); + RenderComponent::PlayAnimation(frakjaw, SummonAnimation); } void NjMonastryBossInstance::RemovePoison(Entity* self) { @@ -444,7 +445,7 @@ void NjMonastryBossInstance::RemovePoison(Entity* self) { } void NjMonastryBossInstance::LowerFrakjaw(Entity* self, Entity* frakjaw) { - GameMessages::SendPlayAnimation(frakjaw, TeleportOutAnimation); + RenderComponent::PlayAnimation(frakjaw, TeleportOutAnimation); ActivityTimerStart(self, LowerFrakjawCamTimer, 2.0f, 2.0f); GameMessages::SendNotifyClientObject(frakjaw->GetObjectID(), StopMusicNotification, 0, 0, diff --git a/dScripts/BaseConsoleTeleportServer.cpp b/dScripts/BaseConsoleTeleportServer.cpp index d0162e9c..073b7826 100644 --- a/dScripts/BaseConsoleTeleportServer.cpp +++ b/dScripts/BaseConsoleTeleportServer.cpp @@ -1,6 +1,8 @@ #include "BaseConsoleTeleportServer.h" #include "GameMessages.h" #include "Player.h" +#include "RenderComponent.h" +#include "EntityManager.h" void BaseConsoleTeleportServer::BaseOnUse(Entity* self, Entity* user) { auto* player = user; @@ -31,13 +33,12 @@ void BaseConsoleTeleportServer::BaseOnMessageBoxResponse(Entity* self, Entity* s } const auto& teleIntroAnim = self->GetVar(u"teleportAnim"); - + Game::logger->Log("BaseConsoleTeleportServer", "%s",GeneralUtils::UTF16ToWTF8(teleIntroAnim).c_str()); + auto animTime = 3.32999992370605f; if (!teleIntroAnim.empty()) { - GameMessages::SendPlayAnimation(player, teleIntroAnim); + animTime = RenderComponent::PlayAnimation(player, teleIntroAnim); } - const auto animTime = 3.32999992370605f; - UpdatePlayerTable(self, player, true); const auto playerID = player->GetObjectID(); diff --git a/dScripts/ai/AG/AgFans.cpp b/dScripts/ai/AG/AgFans.cpp index e05fe68d..aaff9c0d 100644 --- a/dScripts/ai/AG/AgFans.cpp +++ b/dScripts/ai/AG/AgFans.cpp @@ -5,6 +5,8 @@ #include "PhantomPhysicsComponent.h" #include "RenderComponent.h" #include "eReplicaComponentType.h" +#include "RenderComponent.h" +#include "Entity.h" void AgFans::OnStartup(Entity* self) { self->SetVar(u"alive", true); @@ -34,7 +36,7 @@ void AgFans::ToggleFX(Entity* self, bool hit) { if (fanVolumes.size() == 0 || !self->GetVar(u"alive")) return; if (self->GetVar(u"on")) { - GameMessages::SendPlayAnimation(self, u"fan-off"); + RenderComponent::PlayAnimation(self, u"fan-off"); renderComponent->StopEffect("fanOn"); self->SetVar(u"on", false); @@ -46,11 +48,11 @@ void AgFans::ToggleFX(Entity* self, bool hit) { EntityManager::Instance()->SerializeEntity(volume); if (!hit) { Entity* fxObj = EntityManager::Instance()->GetEntitiesInGroup(fanGroup + "fx")[0]; - GameMessages::SendPlayAnimation(fxObj, u"trigger"); + RenderComponent::PlayAnimation(fxObj, u"trigger"); } } } else if (!self->GetVar(u"on") && self->GetVar(u"alive")) { - GameMessages::SendPlayAnimation(self, u"fan-on"); + RenderComponent::PlayAnimation(self, u"fan-on"); renderComponent->PlayEffect(495, u"fanOn", "fanOn"); self->SetVar(u"on", true); @@ -62,7 +64,7 @@ void AgFans::ToggleFX(Entity* self, bool hit) { EntityManager::Instance()->SerializeEntity(volume); if (!hit) { Entity* fxObj = EntityManager::Instance()->GetEntitiesInGroup(fanGroup + "fx")[0]; - GameMessages::SendPlayAnimation(fxObj, u"idle"); + RenderComponent::PlayAnimation(fxObj, u"idle"); } } } diff --git a/dScripts/ai/AG/AgJetEffectServer.cpp b/dScripts/ai/AG/AgJetEffectServer.cpp index 9546bc4d..37e2e573 100644 --- a/dScripts/ai/AG/AgJetEffectServer.cpp +++ b/dScripts/ai/AG/AgJetEffectServer.cpp @@ -3,6 +3,7 @@ #include "EntityManager.h" #include "SkillComponent.h" #include "eReplicaComponentType.h" +#include "RenderComponent.h" void AgJetEffectServer::OnUse(Entity* self, Entity* user) { if (inUse) { @@ -54,7 +55,7 @@ void AgJetEffectServer::OnRebuildComplete(Entity* self, Entity* target) { const auto group = groups[0]; - GameMessages::SendPlayAnimation(effect, u"jetFX"); + RenderComponent::PlayAnimation(effect, u"jetFX"); self->AddTimer("PlayEffect", 2.5f); diff --git a/dScripts/ai/AG/AgSalutingNpcs.cpp b/dScripts/ai/AG/AgSalutingNpcs.cpp index 4e4d8b2c..d3bbe9ab 100644 --- a/dScripts/ai/AG/AgSalutingNpcs.cpp +++ b/dScripts/ai/AG/AgSalutingNpcs.cpp @@ -1,11 +1,10 @@ #include "AgSalutingNpcs.h" -#include "GameMessages.h" - +#include "RenderComponent.h" void AgSalutingNpcs::OnEmoteReceived(Entity* self, const int32_t emote, Entity* target) { if (emote != 356) { return; } - GameMessages::SendPlayAnimation(self, u"salutePlayer"); + RenderComponent::PlayAnimation(self, u"salutePlayer"); } diff --git a/dScripts/ai/AG/AgShipPlayerShockServer.cpp b/dScripts/ai/AG/AgShipPlayerShockServer.cpp index 2bed8152..0eb1d9c8 100644 --- a/dScripts/ai/AG/AgShipPlayerShockServer.cpp +++ b/dScripts/ai/AG/AgShipPlayerShockServer.cpp @@ -1,5 +1,7 @@ #include "AgShipPlayerShockServer.h" #include "GameMessages.h" +#include "RenderComponent.h" +#include "Entity.h" void AgShipPlayerShockServer::OnUse(Entity* self, Entity* user) { GameMessages::SendTerminateInteraction(user->GetObjectID(), eTerminateType::FROM_INTERACTION, self->GetObjectID()); @@ -7,7 +9,7 @@ void AgShipPlayerShockServer::OnUse(Entity* self, Entity* user) { return; } active = true; - GameMessages::SendPlayAnimation(user, shockAnim); + RenderComponent::PlayAnimation(user, shockAnim); GameMessages::SendKnockback(user->GetObjectID(), self->GetObjectID(), self->GetObjectID(), 0, NiPoint3(-20, 10, -20)); GameMessages::SendPlayFXEffect(self, 1430, u"create", "console_sparks", LWOOBJID_EMPTY, 1.0, 1.0, true); diff --git a/dScripts/ai/AG/AgSpaceStuff.cpp b/dScripts/ai/AG/AgSpaceStuff.cpp index 30929ebf..0887608e 100644 --- a/dScripts/ai/AG/AgSpaceStuff.cpp +++ b/dScripts/ai/AG/AgSpaceStuff.cpp @@ -3,6 +3,8 @@ #include "GeneralUtils.h" #include "GameMessages.h" #include "EntityManager.h" +#include "RenderComponent.h" +#include "Entity.h" void AgSpaceStuff::OnStartup(Entity* self) { self->AddTimer("FloaterScale", 5.0f); @@ -27,13 +29,13 @@ void AgSpaceStuff::OnTimerDone(Entity* self, std::string timerName) { if (timerName == "FloaterScale") { int scaleType = GeneralUtils::GenerateRandomNumber(1, 5); - GameMessages::SendPlayAnimation(self, u"scale_0" + GeneralUtils::to_u16string(scaleType)); + RenderComponent::PlayAnimation(self, u"scale_0" + GeneralUtils::to_u16string(scaleType)); self->AddTimer("FloaterPath", 0.4); } else if (timerName == "FloaterPath") { int pathType = GeneralUtils::GenerateRandomNumber(1, 4); int randTime = GeneralUtils::GenerateRandomNumber(20, 25); - GameMessages::SendPlayAnimation(self, u"path_0" + (GeneralUtils::to_u16string(pathType))); + RenderComponent::PlayAnimation(self, u"path_0" + (GeneralUtils::to_u16string(pathType))); self->AddTimer("FloaterScale", randTime); } else if (timerName == "ShipShakeExplode") { DoShake(self, true); @@ -76,16 +78,16 @@ void AgSpaceStuff::DoShake(Entity* self, bool explodeIdle) { auto* shipFxObject2 = GetEntityInGroup(ShipFX2); if (shipFxObject2) - GameMessages::SendPlayAnimation(shipFxObject2, u"explosion"); + RenderComponent::PlayAnimation(shipFxObject2, u"explosion"); } else { auto* shipFxObject = GetEntityInGroup(ShipFX); auto* shipFxObject2 = GetEntityInGroup(ShipFX2); if (shipFxObject) - GameMessages::SendPlayAnimation(shipFxObject, u"idle"); + RenderComponent::PlayAnimation(shipFxObject, u"idle"); if (shipFxObject2) - GameMessages::SendPlayAnimation(shipFxObject2, u"idle"); + RenderComponent::PlayAnimation(shipFxObject2, u"idle"); } } diff --git a/dScripts/ai/FV/FvDragonSmashingGolemQb.cpp b/dScripts/ai/FV/FvDragonSmashingGolemQb.cpp index a9d38aa5..d46173fd 100644 --- a/dScripts/ai/FV/FvDragonSmashingGolemQb.cpp +++ b/dScripts/ai/FV/FvDragonSmashingGolemQb.cpp @@ -1,6 +1,8 @@ #include "FvDragonSmashingGolemQb.h" #include "GameMessages.h" #include "EntityManager.h" +#include "RenderComponent.h" +#include "Entity.h" void FvDragonSmashingGolemQb::OnStartup(Entity* self) { self->AddTimer("GolemBreakTimer", 10.5f); @@ -14,7 +16,7 @@ void FvDragonSmashingGolemQb::OnTimerDone(Entity* self, std::string timerName) { void FvDragonSmashingGolemQb::OnRebuildNotifyState(Entity* self, eRebuildState state) { if (state == eRebuildState::REBUILD_COMPLETED) { - GameMessages::SendPlayAnimation(self, u"dragonsmash"); + RenderComponent::PlayAnimation(self, u"dragonsmash"); const auto dragonId = self->GetVar(u"Dragon"); diff --git a/dScripts/ai/FV/FvFlyingCreviceDragon.cpp b/dScripts/ai/FV/FvFlyingCreviceDragon.cpp index 16eda512..cb0fe3d0 100644 --- a/dScripts/ai/FV/FvFlyingCreviceDragon.cpp +++ b/dScripts/ai/FV/FvFlyingCreviceDragon.cpp @@ -3,6 +3,7 @@ #include "EntityManager.h" #include "SkillComponent.h" #include "GeneralUtils.h" +#include "RenderComponent.h" void FvFlyingCreviceDragon::OnStartup(Entity* self) { self->AddTimer("waypoint", 5); @@ -67,10 +68,10 @@ void FvFlyingCreviceDragon::OnArrived(Entity* self) { auto point = self->GetVar(u"waypoint"); if (point == 4) { - GameMessages::SendPlayAnimation(self, u"attack1", 2); + RenderComponent::PlayAnimation(self, u"attack1", 2.0f); self->AddTimer("platform1attack", 1.75f); } else if (point == 12) { - GameMessages::SendPlayAnimation(self, u"attack2", 2); + RenderComponent::PlayAnimation(self, u"attack2", 2.0f); const auto& group2 = EntityManager::Instance()->GetEntitiesInGroup("dragonFireballs2"); @@ -101,7 +102,7 @@ void FvFlyingCreviceDragon::OnArrived(Entity* self) { } } } else if (point == 16) { - GameMessages::SendPlayAnimation(self, u"attack3", 2); + RenderComponent::PlayAnimation(self, u"attack3", 2.0f); self->AddTimer("platform3attack", 0.5f); } } diff --git a/dScripts/ai/FV/FvNinjaGuard.cpp b/dScripts/ai/FV/FvNinjaGuard.cpp index 58267999..c487f5cc 100644 --- a/dScripts/ai/FV/FvNinjaGuard.cpp +++ b/dScripts/ai/FV/FvNinjaGuard.cpp @@ -1,6 +1,8 @@ #include "FvNinjaGuard.h" #include "GameMessages.h" #include "MissionComponent.h" +#include "RenderComponent.h" +#include "EntityManager.h" void FvNinjaGuard::OnStartup(Entity* self) { if (self->GetLOT() == 7412) { @@ -12,24 +14,24 @@ void FvNinjaGuard::OnStartup(Entity* self) { void FvNinjaGuard::OnEmoteReceived(Entity* self, const int32_t emote, Entity* target) { if (emote != 392) { - GameMessages::SendPlayAnimation(self, u"no"); + RenderComponent::PlayAnimation(self, u"no"); return; } - GameMessages::SendPlayAnimation(self, u"scared"); + RenderComponent::PlayAnimation(self, u"scared"); if (self->GetLOT() == 7412) { auto* rightGuard = EntityManager::Instance()->GetEntity(m_RightGuard); if (rightGuard != nullptr) { - GameMessages::SendPlayAnimation(rightGuard, u"laugh_rt"); + RenderComponent::PlayAnimation(rightGuard, u"laugh_rt"); } } else if (self->GetLOT() == 11128) { auto* leftGuard = EntityManager::Instance()->GetEntity(m_LeftGuard); if (leftGuard != nullptr) { - GameMessages::SendPlayAnimation(leftGuard, u"laugh_lt"); + RenderComponent::PlayAnimation(leftGuard, u"laugh_lt"); } } } diff --git a/dScripts/ai/GENERAL/LegoDieRoll.cpp b/dScripts/ai/GENERAL/LegoDieRoll.cpp index 89819271..add3cd06 100644 --- a/dScripts/ai/GENERAL/LegoDieRoll.cpp +++ b/dScripts/ai/GENERAL/LegoDieRoll.cpp @@ -2,6 +2,7 @@ #include "Entity.h" #include "GameMessages.h" #include "MissionComponent.h" +#include "RenderComponent.h" #include "eMissionState.h" void LegoDieRoll::OnStartup(Entity* self) { @@ -17,23 +18,23 @@ void LegoDieRoll::OnTimerDone(Entity* self, std::string timerName) { switch (dieRoll) { case 1: - GameMessages::SendPlayAnimation(self, u"roll-die-1"); + RenderComponent::PlayAnimation(self, u"roll-die-1"); break; case 2: - GameMessages::SendPlayAnimation(self, u"roll-die-2"); + RenderComponent::PlayAnimation(self, u"roll-die-2"); break; case 3: - GameMessages::SendPlayAnimation(self, u"roll-die-3"); + RenderComponent::PlayAnimation(self, u"roll-die-3"); break; case 4: - GameMessages::SendPlayAnimation(self, u"roll-die-4"); + RenderComponent::PlayAnimation(self, u"roll-die-4"); break; case 5: - GameMessages::SendPlayAnimation(self, u"roll-die-5"); + RenderComponent::PlayAnimation(self, u"roll-die-5"); break; case 6: { - GameMessages::SendPlayAnimation(self, u"roll-die-6"); + RenderComponent::PlayAnimation(self, u"roll-die-6"); // tracking the It's Truly Random Achievement auto* owner = self->GetOwner(); auto* missionComponent = owner->GetComponent(); diff --git a/dScripts/ai/GF/GfOrgan.cpp b/dScripts/ai/GF/GfOrgan.cpp index 372ed3a2..3184aa82 100644 --- a/dScripts/ai/GF/GfOrgan.cpp +++ b/dScripts/ai/GF/GfOrgan.cpp @@ -1,5 +1,7 @@ #include "GfOrgan.h" #include "GameMessages.h" +#include "Entity.h" +#include "RenderComponent.h" void GfOrgan::OnUse(Entity* self, Entity* user) { if (self->GetBoolean(u"bIsInUse")) { @@ -11,7 +13,7 @@ void GfOrgan::OnUse(Entity* self, Entity* user) { self->SetBoolean(u"bIsInUse", true); self->AddTimer("reset", 5.0f); - GameMessages::SendPlayAnimation(user, u"jig"); + RenderComponent::PlayAnimation(user, u"jig"); } void GfOrgan::OnTimerDone(Entity* self, std::string timerName) { diff --git a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp index 703c6bbd..a62f6ee5 100644 --- a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp +++ b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp @@ -15,6 +15,7 @@ #include "InventoryComponent.h" #include "eMissionTaskType.h" #include "eReplicaComponentType.h" +#include "RenderComponent.h" void SGCannon::OnStartup(Entity* self) { Game::logger->Log("SGCannon", "OnStartup"); @@ -508,17 +509,17 @@ void SGCannon::RecordPlayerScore(Entity* self) { void SGCannon::PlaySceneAnimation(Entity* self, const std::u16string& animationName, bool onCannon, bool onPlayer, float_t priority) { for (auto* cannon : EntityManager::Instance()->GetEntitiesInGroup("cannongroup")) { - GameMessages::SendPlayAnimation(cannon, animationName, priority); + RenderComponent::PlayAnimation(cannon, animationName, priority); } if (onCannon) { - GameMessages::SendPlayAnimation(self, animationName, priority); + RenderComponent::PlayAnimation(self, animationName, priority); } if (onPlayer) { auto* player = EntityManager::Instance()->GetEntity(self->GetVar(PlayerIDVariable)); if (player != nullptr) { - GameMessages::SendPlayAnimation(player, animationName, priority); + RenderComponent::PlayAnimation(player, animationName, priority); } } } diff --git a/dScripts/ai/NS/NsConcertInstrument.cpp b/dScripts/ai/NS/NsConcertInstrument.cpp index c7478a05..08464e5a 100644 --- a/dScripts/ai/NS/NsConcertInstrument.cpp +++ b/dScripts/ai/NS/NsConcertInstrument.cpp @@ -9,6 +9,7 @@ #include "MissionComponent.h" #include "eMissionState.h" #include "eMissionTaskType.h" +#include "RenderComponent.h" // Constants are at the bottom @@ -122,7 +123,7 @@ void NsConcertInstrument::StartPlayingInstrument(Entity* self, Entity* player) { player->GetObjectID(), "", UNASSIGNED_SYSTEM_ADDRESS); GameMessages::SendPlayCinematic(player->GetObjectID(), cinematics.at(instrumentLot), UNASSIGNED_SYSTEM_ADDRESS); self->AddCallbackTimer(1.0f, [player, instrumentLot]() { - GameMessages::SendPlayAnimation(player, animations.at(instrumentLot), 2.0f); + RenderComponent::PlayAnimation(player, animations.at(instrumentLot), 2.0f); }); for (auto* soundBox : EntityManager::Instance()->GetEntitiesInGroup("Audio-Concert")) { @@ -153,7 +154,7 @@ void NsConcertInstrument::StopPlayingInstrument(Entity* self, Entity* player) { } GameMessages::SendEndCinematic(player->GetObjectID(), cinematics.at(instrumentLot), UNASSIGNED_SYSTEM_ADDRESS, 1.0f); - GameMessages::SendPlayAnimation(player, smashAnimations.at(instrumentLot), 2.0f); + RenderComponent::PlayAnimation(player, smashAnimations.at(instrumentLot), 2.0f); GameMessages::SendNotifyClientObject(self->GetObjectID(), u"stopCheckingMovement", 0, 0, player->GetObjectID(), "", UNASSIGNED_SYSTEM_ADDRESS); } diff --git a/dScripts/ai/NS/WhFans.cpp b/dScripts/ai/NS/WhFans.cpp index 44354127..8500e824 100644 --- a/dScripts/ai/NS/WhFans.cpp +++ b/dScripts/ai/NS/WhFans.cpp @@ -4,6 +4,8 @@ #include "GameMessages.h" #include "EntityManager.h" #include "PhantomPhysicsComponent.h" +#include "RenderComponent.h" +#include "Entity.h" void WhFans::OnStartup(Entity* self) { self->SetVar(u"alive", true); @@ -30,7 +32,7 @@ void WhFans::ToggleFX(Entity* self, bool hit) { if (fanVolumes.size() == 0 || !self->GetVar(u"alive")) return; if (self->GetVar(u"on")) { - GameMessages::SendPlayAnimation(self, u"fan-off"); + RenderComponent::PlayAnimation(self, u"fan-off"); renderComponent->StopEffect("fanOn"); self->SetVar(u"on", false); @@ -42,7 +44,7 @@ void WhFans::ToggleFX(Entity* self, bool hit) { EntityManager::Instance()->SerializeEntity(volume); } } else if (!self->GetVar(u"on") && self->GetVar(u"alive")) { - GameMessages::SendPlayAnimation(self, u"fan-on"); + RenderComponent::PlayAnimation(self, u"fan-on"); self->SetVar(u"on", true); diff --git a/dScripts/ai/WILD/WildAmbients.cpp b/dScripts/ai/WILD/WildAmbients.cpp index 16dfa043..c21b6d76 100644 --- a/dScripts/ai/WILD/WildAmbients.cpp +++ b/dScripts/ai/WILD/WildAmbients.cpp @@ -1,6 +1,7 @@ #include "WildAmbients.h" #include "GameMessages.h" +#include "RenderComponent.h" void WildAmbients::OnUse(Entity* self, Entity* user) { - GameMessages::SendPlayAnimation(self, u"interact"); + RenderComponent::PlayAnimation(self, u"interact"); } From 426bc963fe54376b421089d8de9cadd1a13a73fc Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Sun, 26 Mar 2023 03:09:04 -0700 Subject: [PATCH 02/33] Add Animation Table logic --- dCommon/DluAssert.h | 2 - dCommon/Metrics.cpp | 1 - dCommon/Metrics.hpp | 1 - dDatabase/Tables/CDActivitiesTable.cpp | 54 ++++++++--- dDatabase/Tables/CDActivitiesTable.h | 45 ++++----- dDatabase/Tables/CDActivityRewardsTable.h | 14 +-- dDatabase/Tables/CDAnimationsTable.cpp | 21 ++--- dDatabase/Tables/CDAnimationsTable.h | 55 ++++++++--- .../Tables/CDComponentsRegistryTable.cpp | 94 +++++++++++++++---- dDatabase/Tables/CDComponentsRegistryTable.h | 14 ++- dDatabase/Tables/CDItemComponentTable.cpp | 26 ++--- dDatabase/Tables/CDItemComponentTable.h | 58 ++++++------ dDatabase/Tables/CDLootMatrixTable.cpp | 2 +- dDatabase/Tables/CDLootMatrixTable.h | 2 +- dDatabase/Tables/CDMissionTasksTable.cpp | 12 +-- dDatabase/Tables/CDMissionTasksTable.h | 12 +-- dDatabase/Tables/CDMissionsTable.cpp | 6 +- dDatabase/Tables/CDMissionsTable.h | 6 +- dDatabase/Tables/CDObjectsTable.cpp | 20 ++-- dDatabase/Tables/CDObjectsTable.h | 20 ++-- dDatabase/Tables/CDPhysicsComponentTable.cpp | 16 ++-- dDatabase/Tables/CDPhysicsComponentTable.h | 16 ++-- dDatabase/Tables/CDSkillBehaviorTable.cpp | 28 +++--- dDatabase/Tables/CDSkillBehaviorTable.h | 28 +++--- dDatabase/Tables/CDTable.h | 3 + dDatabase/Tables/CDZoneTableTable.cpp | 18 ++-- dDatabase/Tables/CDZoneTableTable.h | 18 ++-- dGame/Entity.cpp | 6 +- dGame/LeaderboardManager.cpp | 10 +- dGame/dComponents/RenderComponent.cpp | 18 ++-- dGame/dComponents/RenderComponent.h | 16 ++++ .../dComponents/ScriptedActivityComponent.cpp | 34 ++++--- dGame/dComponents/ScriptedActivityComponent.h | 16 +--- dGame/dUtilities/Loot.cpp | 1 - dMasterServer/MasterServer.cpp | 3 +- .../02_server/Enemy/AM/AmDarklingDragon.cpp | 2 +- .../Equipment/MaestromExtracticatorServer.cpp | 5 +- .../Equipment/MaestromExtracticatorServer.h | 1 + .../02_server/Map/NT/NtParadoxTeleServer.cpp | 5 +- dScripts/BaseConsoleTeleportServer.cpp | 1 - 40 files changed, 419 insertions(+), 291 deletions(-) diff --git a/dCommon/DluAssert.h b/dCommon/DluAssert.h index ce971122..c54dd54e 100644 --- a/dCommon/DluAssert.h +++ b/dCommon/DluAssert.h @@ -3,8 +3,6 @@ #include -#define _DEBUG - #ifdef _DEBUG # define DluAssert(expression) assert(expression) #else diff --git a/dCommon/Metrics.cpp b/dCommon/Metrics.cpp index 3a3b7d78..b97b5435 100644 --- a/dCommon/Metrics.cpp +++ b/dCommon/Metrics.cpp @@ -14,7 +14,6 @@ std::vector Metrics::m_Variables = { MetricVariable::CPUTime, MetricVariable::Sleep, MetricVariable::Frame, - MetricVariable::Database, }; void Metrics::AddMeasurement(MetricVariable variable, int64_t value) { diff --git a/dCommon/Metrics.hpp b/dCommon/Metrics.hpp index b7ac748f..c03c914f 100644 --- a/dCommon/Metrics.hpp +++ b/dCommon/Metrics.hpp @@ -20,7 +20,6 @@ enum class MetricVariable : int32_t CPUTime, Sleep, Frame, - Database, }; struct Metric diff --git a/dDatabase/Tables/CDActivitiesTable.cpp b/dDatabase/Tables/CDActivitiesTable.cpp index 2c2da31e..e1660d66 100644 --- a/dDatabase/Tables/CDActivitiesTable.cpp +++ b/dDatabase/Tables/CDActivitiesTable.cpp @@ -1,11 +1,27 @@ #include "CDActivitiesTable.h" -CDActivitiesTable::CDActivitiesTable() { +CDActivitiesTable::CDActivitiesTable(void) { + + // First, get the size of the table + unsigned int size = 0; + auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM Activities"); + while (!tableSize.eof()) { + size = tableSize.getIntField(0, 0); + + tableSize.nextRow(); + } + + tableSize.finalize(); + + // Reserve the size + this->entries.reserve(size); + + // Now get the data auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Activities"); while (!tableData.eof()) { CDActivities entry; - ActivityID activityId = tableData.getIntField("ActivityID", -1); - UNUSED_COLUMN(entry.locStatus = tableData.getIntField("locStatus", -1)); + entry.ActivityID = tableData.getIntField("ActivityID", -1); + entry.locStatus = tableData.getIntField("locStatus", -1); entry.instanceMapID = tableData.getIntField("instanceMapID", -1); entry.minTeams = tableData.getIntField("minTeams", -1); entry.maxTeams = tableData.getIntField("maxTeams", -1); @@ -13,26 +29,34 @@ CDActivitiesTable::CDActivitiesTable() { entry.maxTeamSize = tableData.getIntField("maxTeamSize", -1); entry.waitTime = tableData.getIntField("waitTime", -1); entry.startDelay = tableData.getIntField("startDelay", -1); - UNUSED_COLUMN(entry.requiresUniqueData = tableData.getIntField("requiresUniqueData", -1)); + entry.requiresUniqueData = tableData.getIntField("requiresUniqueData", -1); entry.leaderboardType = tableData.getIntField("leaderboardType", -1); - UNUSED_COLUMN(entry.localize = tableData.getIntField("localize", -1)); + entry.localize = tableData.getIntField("localize", -1); entry.optionalCostLOT = tableData.getIntField("optionalCostLOT", -1); entry.optionalCostCount = tableData.getIntField("optionalCostCount", -1); - UNUSED_COLUMN(entry.showUIRewards = tableData.getIntField("showUIRewards", -1)); - UNUSED_COLUMN(entry.CommunityActivityFlagID = tableData.getIntField("CommunityActivityFlagID", -1)); - UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); + entry.showUIRewards = tableData.getIntField("showUIRewards", -1); + entry.CommunityActivityFlagID = tableData.getIntField("CommunityActivityFlagID", -1); + entry.gate_version = tableData.getStringField("gate_version", ""); entry.noTeamLootOnDeath = tableData.getIntField("noTeamLootOnDeath", -1); - UNUSED_COLUMN(entry.optionalPercentage = tableData.getFloatField("optionalPercentage", -1.0f)); - - auto insertedElement = this->entries.insert_or_assign(activityId, entry); - DluAssert(insertedElement.second == true); + entry.optionalPercentage = tableData.getFloatField("optionalPercentage", -1.0f); + this->entries.push_back(entry); tableData.nextRow(); } + tableData.finalize(); } -CDActivitiesResult CDActivitiesTable::GetActivity(ActivityID id) { - const auto foundElement = this->entries.find(id); - return foundElement != this->entries.end() ? CDActivitiesResult(foundElement->second) : CDActivitiesResult(); +std::vector CDActivitiesTable::Query(std::function predicate) { + + std::vector data = cpplinq::from(this->entries) + >> cpplinq::where(predicate) + >> cpplinq::to_vector(); + + return data; } + +std::vector CDActivitiesTable::GetEntries(void) const { + return this->entries; +} + diff --git a/dDatabase/Tables/CDActivitiesTable.h b/dDatabase/Tables/CDActivitiesTable.h index ed454b6e..4b60afbd 100644 --- a/dDatabase/Tables/CDActivitiesTable.h +++ b/dDatabase/Tables/CDActivitiesTable.h @@ -1,37 +1,38 @@ #pragma once +// Custom Classes #include "CDTable.h" -typedef uint32_t ActivityID; - struct CDActivities { - UNUSED_COLUMN(uint32_t locStatus); - uint32_t instanceMapID; - uint32_t minTeams; - uint32_t maxTeams; - uint32_t minTeamSize; - uint32_t maxTeamSize; - uint32_t waitTime; - uint32_t startDelay; - UNUSED_COLUMN(bool requiresUniqueData); - uint32_t leaderboardType; - UNUSED_COLUMN(bool localize); - int32_t optionalCostLOT; - int32_t optionalCostCount; - UNUSED_COLUMN(bool showUIRewards); - UNUSED_COLUMN(uint32_t CommunityActivityFlagID); - UNUSED_COLUMN(std::string gate_version); + unsigned int ActivityID; + unsigned int locStatus; + unsigned int instanceMapID; + unsigned int minTeams; + unsigned int maxTeams; + unsigned int minTeamSize; + unsigned int maxTeamSize; + unsigned int waitTime; + unsigned int startDelay; + bool requiresUniqueData; + unsigned int leaderboardType; + bool localize; + int optionalCostLOT; + int optionalCostCount; + bool showUIRewards; + unsigned int CommunityActivityFlagID; + std::string gate_version; bool noTeamLootOnDeath; - UNUSED_COLUMN(float optionalPercentage); + float optionalPercentage; }; -typedef LookupResult CDActivitiesResult; class CDActivitiesTable : public CDTable { private: - std::map entries; + std::vector entries; public: CDActivitiesTable(); // Queries the table with a custom "where" clause - CDActivitiesResult GetActivity(ActivityID predicate); + std::vector Query(std::function predicate); + + std::vector GetEntries(void) const; }; diff --git a/dDatabase/Tables/CDActivityRewardsTable.h b/dDatabase/Tables/CDActivityRewardsTable.h index 9a4a4ce8..b5503fb6 100644 --- a/dDatabase/Tables/CDActivityRewardsTable.h +++ b/dDatabase/Tables/CDActivityRewardsTable.h @@ -4,13 +4,13 @@ #include "CDTable.h" struct CDActivityRewards { - unsigned int objectTemplate; - unsigned int ActivityRewardIndex; - int activityRating; - unsigned int LootMatrixIndex; - unsigned int CurrencyIndex; - unsigned int ChallengeRating; - std::string description; + unsigned int objectTemplate; //!< The object template (?) + unsigned int ActivityRewardIndex; //!< The activity reward index + int activityRating; //!< The activity rating + unsigned int LootMatrixIndex; //!< The loot matrix index + unsigned int CurrencyIndex; //!< The currency index + unsigned int ChallengeRating; //!< The challenge rating + std::string description; //!< The description }; class CDActivityRewardsTable : public CDTable { diff --git a/dDatabase/Tables/CDAnimationsTable.cpp b/dDatabase/Tables/CDAnimationsTable.cpp index 4f4730de..76ce0e5a 100644 --- a/dDatabase/Tables/CDAnimationsTable.cpp +++ b/dDatabase/Tables/CDAnimationsTable.cpp @@ -2,7 +2,7 @@ #include "GeneralUtils.h" #include "Game.h" -bool CDAnimationsTable::CacheData(CppSQLite3Statement queryToCache) { +bool CDAnimationsTable::CacheData(CppSQLite3Statement& queryToCache) { auto tableData = queryToCache.execQuery(); // If we received a bad lookup, cache it anyways so we do not run the query again. if (tableData.eof()) return false; @@ -16,15 +16,15 @@ bool CDAnimationsTable::CacheData(CppSQLite3Statement queryToCache) { CDAnimation entry; entry.animation_name = tableData.getStringField("animation_name", ""); entry.chance_to_play = tableData.getFloatField("chance_to_play", 1.0f); - entry.min_loops = tableData.getIntField("min_loops", 0); - entry.max_loops = tableData.getIntField("max_loops", 0); + UNUSED_COLUMN(entry.min_loops = tableData.getIntField("min_loops", 0);) + UNUSED_COLUMN(entry.max_loops = tableData.getIntField("max_loops", 0);) entry.animation_length = tableData.getFloatField("animation_length", 0.0f); - entry.hideEquip = tableData.getIntField("hideEquip", 0) == 1; - entry.ignoreUpperBody = tableData.getIntField("ignoreUpperBody", 0) == 1; - entry.restartable = tableData.getIntField("restartable", 0) == 1; - entry.face_animation_name = tableData.getStringField("face_animation_name", ""); - entry.priority = tableData.getFloatField("priority", 0.0f); - entry.blendTime = tableData.getFloatField("blendTime", 0.0f); + UNUSED_COLUMN(entry.hideEquip = tableData.getIntField("hideEquip", 0) == 1;) + UNUSED_COLUMN(entry.ignoreUpperBody = tableData.getIntField("ignoreUpperBody", 0) == 1;) + UNUSED_COLUMN(entry.restartable = tableData.getIntField("restartable", 0) == 1;) + UNUSED_COLUMN(entry.face_animation_name = tableData.getStringField("face_animation_name", "");) + UNUSED_COLUMN(entry.priority = tableData.getFloatField("priority", 0.0f);) + UNUSED_COLUMN(entry.blendTime = tableData.getFloatField("blendTime", 0.0f);) this->animations[CDAnimationKey(animation_type, animationGroupID)].push_back(entry); tableData.nextRow(); @@ -61,18 +61,17 @@ void CDAnimationsTable::CacheAnimationGroup(AnimationGroupID animationGroupID) { CDAnimationLookupResult CDAnimationsTable::GetAnimation(const AnimationID& animationType, const std::string& previousAnimationName, const AnimationGroupID animationGroupID) { CDAnimationKey animationKey(animationType, animationGroupID); - auto randomAnimation = GeneralUtils::GenerateRandomNumber(0, 1); auto animationEntryCached = this->animations.find(animationKey); if (animationEntryCached == this->animations.end()) { this->CacheAnimations(animationKey); } auto animationEntry = this->animations.find(animationKey); - // If we have only one animation, return it regardless of the chance to play. if (animationEntry->second.size() == 1) { return CDAnimationLookupResult(animationEntry->second.front()); } + auto randomAnimation = GeneralUtils::GenerateRandomNumber(0, 1); for (auto& animationEntry : animationEntry->second) { randomAnimation -= animationEntry.chance_to_play; diff --git a/dDatabase/Tables/CDAnimationsTable.h b/dDatabase/Tables/CDAnimationsTable.h index b92e37cc..65f54d98 100644 --- a/dDatabase/Tables/CDAnimationsTable.h +++ b/dDatabase/Tables/CDAnimationsTable.h @@ -1,7 +1,7 @@ #pragma once -// Custom Classes #include "CDTable.h" +#include struct CDAnimation { // unsigned int animationGroupID; @@ -9,15 +9,15 @@ struct CDAnimation { // The above two are a pair to represent a primary key in the map. std::string animation_name; //!< The animation name float chance_to_play; //!< The chance to play the animation - unsigned int min_loops; //!< The minimum number of loops - unsigned int max_loops; //!< The maximum number of loops + UNUSED_COLUMN(unsigned int min_loops;) //!< The minimum number of loops + UNUSED_COLUMN(unsigned int max_loops;) //!< The maximum number of loops float animation_length; //!< The animation length - bool hideEquip; //!< Whether or not to hide the equip - bool ignoreUpperBody; //!< Whether or not to ignore the upper body - bool restartable; //!< Whether or not the animation is restartable - std::string face_animation_name; //!< The face animation name - float priority; //!< The priority - float blendTime; //!< The blend time + UNUSED_COLUMN(bool hideEquip;) //!< Whether or not to hide the equip + UNUSED_COLUMN(bool ignoreUpperBody;) //!< Whether or not to ignore the upper body + UNUSED_COLUMN(bool restartable;) //!< Whether or not the animation is restartable + UNUSED_COLUMN(std::string face_animation_name;) //!< The face animation name + UNUSED_COLUMN(float priority;) //!< The priority + UNUSED_COLUMN(float blendTime;) //!< The blend time }; typedef LookupResult CDAnimationLookupResult; @@ -27,13 +27,40 @@ class CDAnimationsTable : public CDTable { typedef std::string AnimationID; typedef std::pair CDAnimationKey; public: - CDAnimationLookupResult GetAnimation(const AnimationID& animationType, const std::string& previousAnimationName, const AnimationGroupID animationGroupID); + /** + * Given an animationType and the previousAnimationName played, return the next animationType to play. + * If there are more than 1 animationTypes that can be played, one is selected at random but also does not allow + * the previousAnimationName to be played twice. + * + * @param animationType The animationID to lookup + * @param previousAnimationName The previously played animation + * @param animationGroupID The animationGroupID to lookup + * @return CDAnimationLookupResult + */ + [[nodiscard]] CDAnimationLookupResult GetAnimation(const AnimationID& animationType, const std::string& previousAnimationName, const AnimationGroupID animationGroupID); + + /** + * Cache a full AnimationGroup by its ID. + */ void CacheAnimationGroup(AnimationGroupID animationGroupID); private: - void CacheAnimations(const CDAnimationKey animationKey); - bool CacheData(CppSQLite3Statement queryToCache); + /** - * Each animation type has a vector of animations. This is because there can be animations have a percent chance to play so one is selected at random. + * Cache all animations given a premade key */ - std::map> animations; + void CacheAnimations(const CDAnimationKey animationKey); + + /** + * Run the query responsible for caching the data. + * @param queryToCache + * @return true + * @return false + */ + bool CacheData(CppSQLite3Statement& queryToCache); + + /** + * Each animation is key'd by its animationName and its animationGroupID. Each + * animation has a possible list of animations. This is because there can be animations have a percent chance to play so one is selected at random. + */ + std::map> animations; }; diff --git a/dDatabase/Tables/CDComponentsRegistryTable.cpp b/dDatabase/Tables/CDComponentsRegistryTable.cpp index f553e23c..32012f6c 100644 --- a/dDatabase/Tables/CDComponentsRegistryTable.cpp +++ b/dDatabase/Tables/CDComponentsRegistryTable.cpp @@ -1,31 +1,93 @@ #include "CDComponentsRegistryTable.h" #include "eReplicaComponentType.h" -#include "dLogger.h" -#include "Game.h" -uint64_t CalculateId(uint64_t lhs, uint64_t rhs) { - return (lhs << 32) | rhs; -} +#define CDCLIENT_CACHE_ALL -void CDComponentsRegistryTable::ReadRow(CppSQLite3Query& rowData) { - uint32_t id = rowData.getIntField("id", -1); - eReplicaComponentType component_type = static_cast(rowData.getIntField("component_type", 0)); - uint32_t component_id = rowData.getIntField("component_id", -1); +CDComponentsRegistryTable::CDComponentsRegistryTable(void) { - auto insertedEntry = this->mappedEntries.insert_or_assign(CalculateId(id, static_cast(component_type)), component_id); - DluAssert(insertedEntry.second == true); -} +#ifdef CDCLIENT_CACHE_ALL + // First, get the size of the table + unsigned int size = 0; + auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ComponentsRegistry"); + while (!tableSize.eof()) { + size = tableSize.getIntField(0, 0); -CDComponentsRegistryTable::CDComponentsRegistryTable() { + tableSize.nextRow(); + } + + tableSize.finalize(); + + // Reserve the size + //this->entries.reserve(size); + + // Now get the data auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ComponentsRegistry"); while (!tableData.eof()) { - ReadRow(tableData); + CDComponentsRegistry entry; + entry.id = tableData.getIntField("id", -1); + entry.component_type = static_cast(tableData.getIntField("component_type", 0)); + entry.component_id = tableData.getIntField("component_id", -1); + + this->mappedEntries.insert_or_assign(((uint64_t)entry.component_type) << 32 | ((uint64_t)entry.id), entry.component_id); + tableData.nextRow(); } + tableData.finalize(); +#endif } int32_t CDComponentsRegistryTable::GetByIDAndType(uint32_t id, eReplicaComponentType componentType, int32_t defaultValue) { - const auto iter = this->mappedEntries.find(CalculateId(id, static_cast(componentType))); - return iter != this->mappedEntries.end() ? iter->second : defaultValue; + const auto& iter = this->mappedEntries.find(((uint64_t)componentType) << 32 | ((uint64_t)id)); + + if (iter == this->mappedEntries.end()) { + return defaultValue; + } + + return iter->second; + +#ifndef CDCLIENT_CACHE_ALL + // Now get the data + std::stringstream query; + + query << "SELECT * FROM ComponentsRegistry WHERE id = " << std::to_string(id); + + auto tableData = CDClientDatabase::ExecuteQuery(query.str()); + while (!tableData.eof()) { + CDComponentsRegistry entry; + entry.id = tableData.getIntField("id", -1); + entry.component_type = tableData.getIntField("component_type", -1); + entry.component_id = tableData.getIntField("component_id", -1); + + //this->entries.push_back(entry); + + //Darwin's stuff: + const auto& it = this->mappedEntries.find(entry.id); + if (it != mappedEntries.end()) { + const auto& iter = it->second.find(entry.component_type); + if (iter == it->second.end()) { + it->second.insert(std::make_pair(entry.component_type, entry.component_id)); + } + } else { + std::map map; + map.insert(std::make_pair(entry.component_type, entry.component_id)); + this->mappedEntries.insert(std::make_pair(entry.id, map)); + } + + tableData.nextRow(); + } + + tableData.finalize(); + + const auto& it2 = this->mappedEntries.find(id); + if (it2 != mappedEntries.end()) { + const auto& iter = it2->second.find(componentType); + if (iter != it2->second.end()) { + return iter->second; + } + } + + return defaultValue; +#endif } + diff --git a/dDatabase/Tables/CDComponentsRegistryTable.h b/dDatabase/Tables/CDComponentsRegistryTable.h index 2e45f293..990072c9 100644 --- a/dDatabase/Tables/CDComponentsRegistryTable.h +++ b/dDatabase/Tables/CDComponentsRegistryTable.h @@ -1,15 +1,21 @@ #pragma once +// Custom Classes #include "CDTable.h" enum class eReplicaComponentType : uint32_t; +struct CDComponentsRegistry { + unsigned int id; //!< The LOT is used as the ID + eReplicaComponentType component_type; //!< See ComponentTypes enum for values + unsigned int component_id; //!< The ID used within the component's table (0 may either mean it's non-networked, or that the ID is actually 0 +}; + class CDComponentsRegistryTable : public CDTable { +private: + std::map mappedEntries; //id, component_type, component_id + public: CDComponentsRegistryTable(); int32_t GetByIDAndType(uint32_t id, eReplicaComponentType componentType, int32_t defaultValue = 0); -private: - void ReadRow(CppSQLite3Query& rowData); -private: - std::unordered_map mappedEntries; }; diff --git a/dDatabase/Tables/CDItemComponentTable.cpp b/dDatabase/Tables/CDItemComponentTable.cpp index d53269c2..54afc417 100644 --- a/dDatabase/Tables/CDItemComponentTable.cpp +++ b/dDatabase/Tables/CDItemComponentTable.cpp @@ -3,7 +3,8 @@ CDItemComponent CDItemComponentTable::Default = {}; -CDItemComponentTable::CDItemComponentTable() { +//! Constructor +CDItemComponentTable::CDItemComponentTable(void) { Default = CDItemComponent(); #ifdef CDCLIENT_CACHE_ALL @@ -54,13 +55,13 @@ CDItemComponentTable::CDItemComponentTable() { entry.currencyLOT = tableData.getIntField("currencyLOT", -1); entry.altCurrencyCost = tableData.getIntField("altCurrencyCost", -1); entry.subItems = tableData.getStringField("subItems", ""); - UNUSED_COLUMN(entry.audioEventUse = tableData.getStringField("audioEventUse", "");) + entry.audioEventUse = tableData.getStringField("audioEventUse", ""); entry.noEquipAnimation = tableData.getIntField("noEquipAnimation", -1) == 1 ? true : false; entry.commendationLOT = tableData.getIntField("commendationLOT", -1); entry.commendationCost = tableData.getIntField("commendationCost", -1); - UNUSED_COLUMN(entry.audioEquipMetaEventSet = tableData.getStringField("audioEquipMetaEventSet", "");) + entry.audioEquipMetaEventSet = tableData.getStringField("audioEquipMetaEventSet", ""); entry.currencyCosts = tableData.getStringField("currencyCosts", ""); - UNUSED_COLUMN(entry.ingredientInfo = tableData.getStringField("ingredientInfo", "");) + entry.ingredientInfo = tableData.getStringField("ingredientInfo", ""); entry.locStatus = tableData.getIntField("locStatus", -1); entry.forgeType = tableData.getIntField("forgeType", -1); entry.SellMultiplier = tableData.getFloatField("SellMultiplier", -1.0f); @@ -73,8 +74,8 @@ CDItemComponentTable::CDItemComponentTable() { #endif } -const CDItemComponent& CDItemComponentTable::GetItemComponentByID(unsigned int id) { - const auto& it = this->entries.find(id); +const CDItemComponent& CDItemComponentTable::GetItemComponentByID(unsigned int skillID) { + const auto& it = this->entries.find(skillID); if (it != this->entries.end()) { return it->second; } @@ -82,11 +83,11 @@ const CDItemComponent& CDItemComponentTable::GetItemComponentByID(unsigned int i #ifndef CDCLIENT_CACHE_ALL std::stringstream query; - query << "SELECT * FROM ItemComponent WHERE id = " << std::to_string(id); + query << "SELECT * FROM ItemComponent WHERE id = " << std::to_string(skillID); auto tableData = CDClientDatabase::ExecuteQuery(query.str()); if (tableData.eof()) { - entries.insert(std::make_pair(id, Default)); + entries.insert(std::make_pair(skillID, Default)); return Default; } @@ -124,13 +125,13 @@ const CDItemComponent& CDItemComponentTable::GetItemComponentByID(unsigned int i entry.currencyLOT = tableData.getIntField("currencyLOT", -1); entry.altCurrencyCost = tableData.getIntField("altCurrencyCost", -1); entry.subItems = tableData.getStringField("subItems", ""); - UNUSED_COLUMN(entry.audioEventUse = tableData.getStringField("audioEventUse", "")); + UNUSED(entry.audioEventUse = tableData.getStringField("audioEventUse", "")); entry.noEquipAnimation = tableData.getIntField("noEquipAnimation", -1) == 1 ? true : false; entry.commendationLOT = tableData.getIntField("commendationLOT", -1); entry.commendationCost = tableData.getIntField("commendationCost", -1); - UNUSED_COLUMN(entry.audioEquipMetaEventSet = tableData.getStringField("audioEquipMetaEventSet", "")); + UNUSED(entry.audioEquipMetaEventSet = tableData.getStringField("audioEquipMetaEventSet", "")); entry.currencyCosts = tableData.getStringField("currencyCosts", ""); - UNUSED_COLUMN(entry.ingredientInfo = tableData.getStringField("ingredientInfo", "")); + UNUSED(entry.ingredientInfo = tableData.getStringField("ingredientInfo", "")); entry.locStatus = tableData.getIntField("locStatus", -1); entry.forgeType = tableData.getIntField("forgeType", -1); entry.SellMultiplier = tableData.getFloatField("SellMultiplier", -1.0f); @@ -139,7 +140,7 @@ const CDItemComponent& CDItemComponentTable::GetItemComponentByID(unsigned int i tableData.nextRow(); } - const auto& it2 = this->entries.find(id); + const auto& it2 = this->entries.find(skillID); if (it2 != this->entries.end()) { return it2->second; } @@ -168,3 +169,4 @@ std::map CDItemComponentTable::ParseCraftingCurrencies(const CDIt return currencies; } + diff --git a/dDatabase/Tables/CDItemComponentTable.h b/dDatabase/Tables/CDItemComponentTable.h index 1cc46b4a..11c34dd6 100644 --- a/dDatabase/Tables/CDItemComponentTable.h +++ b/dDatabase/Tables/CDItemComponentTable.h @@ -5,60 +5,60 @@ #include "dCommonVars.h" struct CDItemComponent { - uint32_t id; //!< The Component ID + unsigned int id; //!< The Component ID std::string equipLocation; //!< The equip location - uint32_t baseValue; //!< The monetary base value of the item + unsigned int baseValue; //!< The monetary base value of the item bool isKitPiece; //!< Whether or not the item belongs to a kit - uint32_t rarity; //!< The rarity of the item - uint32_t itemType; //!< The item type + unsigned int rarity; //!< The rarity of the item + unsigned int itemType; //!< The item type int64_t itemInfo; //!< The item info bool inLootTable; //!< Whether or not the item is in a loot table bool inVendor; //!< Whether or not the item is in a vendor inventory bool isUnique; //!< ??? bool isBOP; //!< ??? bool isBOE; //!< ??? - uint32_t reqFlagID; //!< User must have completed this flag to get the item - uint32_t reqSpecialtyID; //!< ??? - uint32_t reqSpecRank; //!< ??? - uint32_t reqAchievementID; //!< The required achievement must be completed - uint32_t stackSize; //!< The stack size of the item - uint32_t color1; //!< Something to do with item color... - uint32_t decal; //!< The decal of the item - uint32_t offsetGroupID; //!< Something to do with group IDs - uint32_t buildTypes; //!< Something to do with building + unsigned int reqFlagID; //!< User must have completed this flag to get the item + unsigned int reqSpecialtyID; //!< ??? + unsigned int reqSpecRank; //!< ??? + unsigned int reqAchievementID; //!< The required achievement must be completed + unsigned int stackSize; //!< The stack size of the item + unsigned int color1; //!< Something to do with item color... + unsigned int decal; //!< The decal of the item + unsigned int offsetGroupID; //!< Something to do with group IDs + unsigned int buildTypes; //!< Something to do with building std::string reqPrecondition; //!< The required precondition - uint32_t animationFlag; //!< The Animation Flag - uint32_t equipEffects; //!< The effect played when the item is equipped + unsigned int animationFlag; //!< The Animation Flag + unsigned int equipEffects; //!< The effect played when the item is equipped bool readyForQA; //!< ??? - uint32_t itemRating; //!< ??? + unsigned int itemRating; //!< ??? bool isTwoHanded; //!< Whether or not the item is double handed - uint32_t minNumRequired; //!< Maybe the minimum number required for a mission, or to own this object? - uint32_t delResIndex; //!< ??? - uint32_t currencyLOT; //!< ??? - uint32_t altCurrencyCost; //!< ??? + unsigned int minNumRequired; //!< Maybe the minimum number required for a mission, or to own this object? + unsigned int delResIndex; //!< ??? + unsigned int currencyLOT; //!< ??? + unsigned int altCurrencyCost; //!< ??? std::string subItems; //!< A comma seperate string of sub items (maybe for multi-itemed things like faction test gear set) - UNUSED_COLUMN(std::string audioEventUse); //!< ??? + UNUSED(std::string audioEventUse); //!< ??? bool noEquipAnimation; //!< Whether or not there is an equip animation - uint32_t commendationLOT; //!< The commendation LOT - uint32_t commendationCost; //!< The commendation cost - UNUSED_COLUMN(std::string audioEquipMetaEventSet); //!< ??? + unsigned int commendationLOT; //!< The commendation LOT + unsigned int commendationCost; //!< The commendation cost + UNUSED(std::string audioEquipMetaEventSet); //!< ??? std::string currencyCosts; //!< Used for crafting - UNUSED_COLUMN(std::string ingredientInfo); //!< Unused - uint32_t locStatus; //!< ??? - uint32_t forgeType; //!< Forge Type + UNUSED(std::string ingredientInfo); //!< Unused + unsigned int locStatus; //!< ??? + unsigned int forgeType; //!< Forge Type float SellMultiplier; //!< Something to do with early vendors perhaps (but replaced) }; class CDItemComponentTable : public CDTable { private: - std::map entries; + std::map entries; public: CDItemComponentTable(); static std::map ParseCraftingCurrencies(const CDItemComponent& itemComponent); // Gets an entry by ID - const CDItemComponent& GetItemComponentByID(uint32_t id); + const CDItemComponent& GetItemComponentByID(unsigned int skillID); static CDItemComponent Default; }; diff --git a/dDatabase/Tables/CDLootMatrixTable.cpp b/dDatabase/Tables/CDLootMatrixTable.cpp index c6c5cd8e..8f25e8a3 100644 --- a/dDatabase/Tables/CDLootMatrixTable.cpp +++ b/dDatabase/Tables/CDLootMatrixTable.cpp @@ -29,7 +29,7 @@ CDLootMatrixTable::CDLootMatrixTable(void) { entry.maxToDrop = tableData.getIntField("maxToDrop", -1); entry.id = tableData.getIntField("id", -1); entry.flagID = tableData.getIntField("flagID", -1); - UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); this->entries.push_back(entry); tableData.nextRow(); diff --git a/dDatabase/Tables/CDLootMatrixTable.h b/dDatabase/Tables/CDLootMatrixTable.h index c56be7a8..c6035841 100644 --- a/dDatabase/Tables/CDLootMatrixTable.h +++ b/dDatabase/Tables/CDLootMatrixTable.h @@ -12,7 +12,7 @@ struct CDLootMatrix { unsigned int maxToDrop; //!< The maximum amount of loot from this matrix to drop unsigned int id; //!< The ID of the Loot Matrix unsigned int flagID; //!< ??? - UNUSED_COLUMN(std::string gate_version); //!< The Gate Version + UNUSED(std::string gate_version); //!< The Gate Version }; class CDLootMatrixTable : public CDTable { diff --git a/dDatabase/Tables/CDMissionTasksTable.cpp b/dDatabase/Tables/CDMissionTasksTable.cpp index ca65c85f..f32dca1b 100644 --- a/dDatabase/Tables/CDMissionTasksTable.cpp +++ b/dDatabase/Tables/CDMissionTasksTable.cpp @@ -22,18 +22,18 @@ CDMissionTasksTable::CDMissionTasksTable(void) { while (!tableData.eof()) { CDMissionTasks entry; entry.id = tableData.getIntField("id", -1); - UNUSED_COLUMN(entry.locStatus = tableData.getIntField("locStatus", -1)); + UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1)); entry.taskType = tableData.getIntField("taskType", -1); entry.target = tableData.getIntField("target", -1); entry.targetGroup = tableData.getStringField("targetGroup", ""); entry.targetValue = tableData.getIntField("targetValue", -1); entry.taskParam1 = tableData.getStringField("taskParam1", ""); - UNUSED_COLUMN(entry.largeTaskIcon = tableData.getStringField("largeTaskIcon", "")); - UNUSED_COLUMN(entry.IconID = tableData.getIntField("IconID", -1)); + UNUSED(entry.largeTaskIcon = tableData.getStringField("largeTaskIcon", "")); + UNUSED(entry.IconID = tableData.getIntField("IconID", -1)); entry.uid = tableData.getIntField("uid", -1); - UNUSED_COLUMN(entry.largeTaskIconID = tableData.getIntField("largeTaskIconID", -1)); - UNUSED_COLUMN(entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false); - UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED(entry.largeTaskIconID = tableData.getIntField("largeTaskIconID", -1)); + UNUSED(entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false); + UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); this->entries.push_back(entry); tableData.nextRow(); diff --git a/dDatabase/Tables/CDMissionTasksTable.h b/dDatabase/Tables/CDMissionTasksTable.h index f5e780f5..fa213faf 100644 --- a/dDatabase/Tables/CDMissionTasksTable.h +++ b/dDatabase/Tables/CDMissionTasksTable.h @@ -5,18 +5,18 @@ struct CDMissionTasks { unsigned int id; //!< The Mission ID that the task belongs to - UNUSED_COLUMN(unsigned int locStatus); //!< ??? + UNUSED(unsigned int locStatus); //!< ??? unsigned int taskType; //!< The task type unsigned int target; //!< The mission target std::string targetGroup; //!< The mission target group int targetValue; //!< The target value std::string taskParam1; //!< The task param 1 - UNUSED_COLUMN(std::string largeTaskIcon); //!< ??? - UNUSED_COLUMN(unsigned int IconID); //!< ??? + UNUSED(std::string largeTaskIcon); //!< ??? + UNUSED(unsigned int IconID); //!< ??? unsigned int uid; //!< ??? - UNUSED_COLUMN(unsigned int largeTaskIconID); //!< ??? - UNUSED_COLUMN(bool localize); //!< Whether or not the task should be localized - UNUSED_COLUMN(std::string gate_version); //!< ??? + UNUSED(unsigned int largeTaskIconID); //!< ??? + UNUSED(bool localize); //!< Whether or not the task should be localized + UNUSED(std::string gate_version); //!< ??? }; class CDMissionTasksTable : public CDTable { diff --git a/dDatabase/Tables/CDMissionsTable.cpp b/dDatabase/Tables/CDMissionsTable.cpp index 53137560..d4ee40ae 100644 --- a/dDatabase/Tables/CDMissionsTable.cpp +++ b/dDatabase/Tables/CDMissionsTable.cpp @@ -71,9 +71,9 @@ CDMissionsTable::CDMissionsTable(void) { entry.isRandom = tableData.getIntField("isRandom", -1) == 1 ? true : false; entry.randomPool = tableData.getStringField("randomPool", ""); entry.UIPrereqID = tableData.getIntField("UIPrereqID", -1); - UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); - UNUSED_COLUMN(entry.HUDStates = tableData.getStringField("HUDStates", "")); - UNUSED_COLUMN(entry.locStatus = tableData.getIntField("locStatus", -1)); + UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED(entry.HUDStates = tableData.getStringField("HUDStates", "")); + UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1)); entry.reward_bankinventory = tableData.getIntField("reward_bankinventory", -1); this->entries.push_back(entry); diff --git a/dDatabase/Tables/CDMissionsTable.h b/dDatabase/Tables/CDMissionsTable.h index 8e3f2039..e6a44b02 100644 --- a/dDatabase/Tables/CDMissionsTable.h +++ b/dDatabase/Tables/CDMissionsTable.h @@ -54,9 +54,9 @@ struct CDMissions { bool isRandom; //!< ??? std::string randomPool; //!< ??? int UIPrereqID; //!< ??? - UNUSED_COLUMN(std::string gate_version); //!< The gate version - UNUSED_COLUMN(std::string HUDStates); //!< ??? - UNUSED_COLUMN(int locStatus); //!< ??? + UNUSED(std::string gate_version); //!< The gate version + UNUSED(std::string HUDStates); //!< ??? + UNUSED(int locStatus); //!< ??? int reward_bankinventory; //!< The amount of bank space this mission rewards }; diff --git a/dDatabase/Tables/CDObjectsTable.cpp b/dDatabase/Tables/CDObjectsTable.cpp index e28fb100..c68c3e6a 100644 --- a/dDatabase/Tables/CDObjectsTable.cpp +++ b/dDatabase/Tables/CDObjectsTable.cpp @@ -65,18 +65,18 @@ const CDObjects& CDObjectsTable::GetByID(unsigned int LOT) { CDObjects entry; entry.id = tableData.getIntField("id", -1); entry.name = tableData.getStringField("name", ""); - UNUSED_COLUMN(entry.placeable = tableData.getIntField("placeable", -1)); + UNUSED(entry.placeable = tableData.getIntField("placeable", -1)); entry.type = tableData.getStringField("type", ""); - UNUSED_COLUMN(ntry.description = tableData.getStringField(4, "")); - UNUSED_COLUMN(entry.localize = tableData.getIntField("localize", -1)); - UNUSED_COLUMN(entry.npcTemplateID = tableData.getIntField("npcTemplateID", -1)); - UNUSED_COLUMN(entry.displayName = tableData.getStringField("displayName", "")); + UNUSED(ntry.description = tableData.getStringField(4, "")); + UNUSED(entry.localize = tableData.getIntField("localize", -1)); + UNUSED(entry.npcTemplateID = tableData.getIntField("npcTemplateID", -1)); + UNUSED(entry.displayName = tableData.getStringField("displayName", "")); entry.interactionDistance = tableData.getFloatField("interactionDistance", -1.0f); - UNUSED_COLUMN(entry.nametag = tableData.getIntField("nametag", -1)); - UNUSED_COLUMN(entry._internalNotes = tableData.getStringField("_internalNotes", "")); - UNUSED_COLUMN(entry.locStatus = tableData.getIntField("locStatus", -1)); - UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); - UNUSED_COLUMN(entry.HQ_valid = tableData.getIntField("HQ_valid", -1)); + UNUSED(entry.nametag = tableData.getIntField("nametag", -1)); + UNUSED(entry._internalNotes = tableData.getStringField("_internalNotes", "")); + UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1)); + UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED(entry.HQ_valid = tableData.getIntField("HQ_valid", -1)); this->entries.insert(std::make_pair(entry.id, entry)); tableData.nextRow(); diff --git a/dDatabase/Tables/CDObjectsTable.h b/dDatabase/Tables/CDObjectsTable.h index dc6cc884..171eddef 100644 --- a/dDatabase/Tables/CDObjectsTable.h +++ b/dDatabase/Tables/CDObjectsTable.h @@ -6,18 +6,18 @@ struct CDObjects { unsigned int id; //!< The LOT of the object std::string name; //!< The internal name of the object - UNUSED_COLUMN(unsigned int placeable); //!< Whether or not the object is placable + UNUSED(unsigned int placeable); //!< Whether or not the object is placable std::string type; //!< The object type - UNUSED_COLUMN(std::string description); //!< An internal description of the object - UNUSED_COLUMN(unsigned int localize); //!< Whether or not the object should localize - UNUSED_COLUMN(unsigned int npcTemplateID); //!< Something related to NPCs... - UNUSED_COLUMN(std::string displayName); //!< The display name of the object + UNUSED(std::string description); //!< An internal description of the object + UNUSED(unsigned int localize); //!< Whether or not the object should localize + UNUSED(unsigned int npcTemplateID); //!< Something related to NPCs... + UNUSED(std::string displayName); //!< The display name of the object float interactionDistance; //!< The interaction distance of the object - UNUSED_COLUMN(unsigned int nametag); //!< ??? - UNUSED_COLUMN(std::string _internalNotes); //!< Some internal notes (rarely used) - UNUSED_COLUMN(unsigned int locStatus); //!< ??? - UNUSED_COLUMN(std::string gate_version); //!< The gate version for the object - UNUSED_COLUMN(unsigned int HQ_valid); //!< Probably used for the Nexus HQ database on LEGOUniverse.com + UNUSED(unsigned int nametag); //!< ??? + UNUSED(std::string _internalNotes); //!< Some internal notes (rarely used) + UNUSED(unsigned int locStatus); //!< ??? + UNUSED(std::string gate_version); //!< The gate version for the object + UNUSED(unsigned int HQ_valid); //!< Probably used for the Nexus HQ database on LEGOUniverse.com }; class CDObjectsTable : public CDTable { diff --git a/dDatabase/Tables/CDPhysicsComponentTable.cpp b/dDatabase/Tables/CDPhysicsComponentTable.cpp index 8c705f5b..bb21ed7f 100644 --- a/dDatabase/Tables/CDPhysicsComponentTable.cpp +++ b/dDatabase/Tables/CDPhysicsComponentTable.cpp @@ -7,19 +7,19 @@ CDPhysicsComponentTable::CDPhysicsComponentTable(void) { entry->id = tableData.getIntField("id", -1); entry->bStatic = tableData.getIntField("static", -1) != 0; entry->physicsAsset = tableData.getStringField("physics_asset", ""); - UNUSED_COLUMN(entry->jump = tableData.getIntField("jump", -1) != 0); - UNUSED_COLUMN(entry->doublejump = tableData.getIntField("doublejump", -1) != 0); + UNUSED(entry->jump = tableData.getIntField("jump", -1) != 0); + UNUSED(entry->doublejump = tableData.getIntField("doublejump", -1) != 0); entry->speed = tableData.getFloatField("speed", -1); - UNUSED_COLUMN(entry->rotSpeed = tableData.getFloatField("rotSpeed", -1)); + UNUSED(entry->rotSpeed = tableData.getFloatField("rotSpeed", -1)); entry->playerHeight = tableData.getFloatField("playerHeight"); entry->playerRadius = tableData.getFloatField("playerRadius"); entry->pcShapeType = tableData.getIntField("pcShapeType"); entry->collisionGroup = tableData.getIntField("collisionGroup"); - UNUSED_COLUMN(entry->airSpeed = tableData.getFloatField("airSpeed")); - UNUSED_COLUMN(entry->boundaryAsset = tableData.getStringField("boundaryAsset")); - UNUSED_COLUMN(entry->jumpAirSpeed = tableData.getFloatField("jumpAirSpeed")); - UNUSED_COLUMN(entry->friction = tableData.getFloatField("friction")); - UNUSED_COLUMN(entry->gravityVolumeAsset = tableData.getStringField("gravityVolumeAsset")); + UNUSED(entry->airSpeed = tableData.getFloatField("airSpeed")); + UNUSED(entry->boundaryAsset = tableData.getStringField("boundaryAsset")); + UNUSED(entry->jumpAirSpeed = tableData.getFloatField("jumpAirSpeed")); + UNUSED(entry->friction = tableData.getFloatField("friction")); + UNUSED(entry->gravityVolumeAsset = tableData.getStringField("gravityVolumeAsset")); m_entries.insert(std::make_pair(entry->id, entry)); tableData.nextRow(); diff --git a/dDatabase/Tables/CDPhysicsComponentTable.h b/dDatabase/Tables/CDPhysicsComponentTable.h index ee4dddc1..e63d337d 100644 --- a/dDatabase/Tables/CDPhysicsComponentTable.h +++ b/dDatabase/Tables/CDPhysicsComponentTable.h @@ -6,19 +6,19 @@ struct CDPhysicsComponent { int id; bool bStatic; std::string physicsAsset; - UNUSED_COLUMN(bool jump); - UNUSED_COLUMN(bool doublejump); + UNUSED(bool jump); + UNUSED(bool doublejump); float speed; - UNUSED_COLUMN(float rotSpeed); + UNUSED(float rotSpeed); float playerHeight; float playerRadius; int pcShapeType; int collisionGroup; - UNUSED_COLUMN(float airSpeed); - UNUSED_COLUMN(std::string boundaryAsset); - UNUSED_COLUMN(float jumpAirSpeed); - UNUSED_COLUMN(float friction); - UNUSED_COLUMN(std::string gravityVolumeAsset); + UNUSED(float airSpeed); + UNUSED(std::string boundaryAsset); + UNUSED(float jumpAirSpeed); + UNUSED(float friction); + UNUSED(std::string gravityVolumeAsset); }; class CDPhysicsComponentTable : public CDTable { diff --git a/dDatabase/Tables/CDSkillBehaviorTable.cpp b/dDatabase/Tables/CDSkillBehaviorTable.cpp index 8420a8c6..c5df78ef 100644 --- a/dDatabase/Tables/CDSkillBehaviorTable.cpp +++ b/dDatabase/Tables/CDSkillBehaviorTable.cpp @@ -24,24 +24,24 @@ CDSkillBehaviorTable::CDSkillBehaviorTable(void) { while (!tableData.eof()) { CDSkillBehavior entry; entry.skillID = tableData.getIntField("skillID", -1); - UNUSED_COLUMN(entry.locStatus = tableData.getIntField("locStatus", -1)); + UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1)); entry.behaviorID = tableData.getIntField("behaviorID", -1); entry.imaginationcost = tableData.getIntField("imaginationcost", -1); entry.cooldowngroup = tableData.getIntField("cooldowngroup", -1); entry.cooldown = tableData.getFloatField("cooldown", -1.0f); - UNUSED_COLUMN(entry.isNpcEditor = tableData.getIntField("isNpcEditor", -1) == 1 ? true : false); - UNUSED_COLUMN(entry.skillIcon = tableData.getIntField("skillIcon", -1)); - UNUSED_COLUMN(entry.oomSkillID = tableData.getStringField("oomSkillID", "")); - UNUSED_COLUMN(entry.oomBehaviorEffectID = tableData.getIntField("oomBehaviorEffectID", -1)); - UNUSED_COLUMN(entry.castTypeDesc = tableData.getIntField("castTypeDesc", -1)); - UNUSED_COLUMN(entry.imBonusUI = tableData.getIntField("imBonusUI", -1)); - UNUSED_COLUMN(entry.lifeBonusUI = tableData.getIntField("lifeBonusUI", -1)); - UNUSED_COLUMN(entry.armorBonusUI = tableData.getIntField("armorBonusUI", -1)); - UNUSED_COLUMN(entry.damageUI = tableData.getIntField("damageUI", -1)); - UNUSED_COLUMN(entry.hideIcon = tableData.getIntField("hideIcon", -1) == 1 ? true : false); - UNUSED_COLUMN(entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false); - UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); - UNUSED_COLUMN(entry.cancelType = tableData.getIntField("cancelType", -1)); + UNUSED(entry.isNpcEditor = tableData.getIntField("isNpcEditor", -1) == 1 ? true : false); + UNUSED(entry.skillIcon = tableData.getIntField("skillIcon", -1)); + UNUSED(entry.oomSkillID = tableData.getStringField("oomSkillID", "")); + UNUSED(entry.oomBehaviorEffectID = tableData.getIntField("oomBehaviorEffectID", -1)); + UNUSED(entry.castTypeDesc = tableData.getIntField("castTypeDesc", -1)); + UNUSED(entry.imBonusUI = tableData.getIntField("imBonusUI", -1)); + UNUSED(entry.lifeBonusUI = tableData.getIntField("lifeBonusUI", -1)); + UNUSED(entry.armorBonusUI = tableData.getIntField("armorBonusUI", -1)); + UNUSED(entry.damageUI = tableData.getIntField("damageUI", -1)); + UNUSED(entry.hideIcon = tableData.getIntField("hideIcon", -1) == 1 ? true : false); + UNUSED(entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false); + UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED(entry.cancelType = tableData.getIntField("cancelType", -1)); this->entries.insert(std::make_pair(entry.skillID, entry)); //this->entries.push_back(entry); diff --git a/dDatabase/Tables/CDSkillBehaviorTable.h b/dDatabase/Tables/CDSkillBehaviorTable.h index 4e6bddb9..eb3094e0 100644 --- a/dDatabase/Tables/CDSkillBehaviorTable.h +++ b/dDatabase/Tables/CDSkillBehaviorTable.h @@ -5,24 +5,24 @@ struct CDSkillBehavior { unsigned int skillID; //!< The Skill ID of the skill - UNUSED_COLUMN(unsigned int locStatus); //!< ?? + UNUSED(unsigned int locStatus); //!< ?? unsigned int behaviorID; //!< The Behavior ID of the skill unsigned int imaginationcost; //!< The imagination cost of the skill unsigned int cooldowngroup; //!< The cooldown group ID of the skill float cooldown; //!< The cooldown time of the skill - UNUSED_COLUMN(bool isNpcEditor); //!< ??? - UNUSED_COLUMN(unsigned int skillIcon); //!< The Skill Icon ID - UNUSED_COLUMN(std::string oomSkillID); //!< ??? - UNUSED_COLUMN(unsigned int oomBehaviorEffectID); //!< ??? - UNUSED_COLUMN(unsigned int castTypeDesc); //!< The cast type description(?) - UNUSED_COLUMN(unsigned int imBonusUI); //!< The imagination bonus of the skill - UNUSED_COLUMN(nsigned int lifeBonusUI); //!< The life bonus of the skill - UNUSED_COLUMN(unsigned int armorBonusUI); //!< The armor bonus of the skill - UNUSED_COLUMN(unsigned int damageUI); //!< ??? - UNUSED_COLUMN(bool hideIcon); //!< Whether or not to show the icon - UNUSED_COLUMN(bool localize); //!< ??? - UNUSED_COLUMN(std::string gate_version); //!< ??? - UNUSED_COLUMN(unsigned int cancelType); //!< The cancel type (?) + UNUSED(bool isNpcEditor); //!< ??? + UNUSED(unsigned int skillIcon); //!< The Skill Icon ID + UNUSED(std::string oomSkillID); //!< ??? + UNUSED(unsigned int oomBehaviorEffectID); //!< ??? + UNUSED(unsigned int castTypeDesc); //!< The cast type description(?) + UNUSED(unsigned int imBonusUI); //!< The imagination bonus of the skill + UNUSED(nsigned int lifeBonusUI); //!< The life bonus of the skill + UNUSED(unsigned int armorBonusUI); //!< The armor bonus of the skill + UNUSED(unsigned int damageUI); //!< ??? + UNUSED(bool hideIcon); //!< Whether or not to show the icon + UNUSED(bool localize); //!< ??? + UNUSED(std::string gate_version); //!< ??? + UNUSED(unsigned int cancelType); //!< The cancel type (?) }; class CDSkillBehaviorTable : public CDTable { diff --git a/dDatabase/Tables/CDTable.h b/dDatabase/Tables/CDTable.h index 45c67b0d..e4c11fb9 100644 --- a/dDatabase/Tables/CDTable.h +++ b/dDatabase/Tables/CDTable.h @@ -16,6 +16,9 @@ #endif #include "cpplinq.hpp" +// Used for legacy +#define UNUSED(x) + // Enable this to skip some unused columns in some tables #define UNUSED_COLUMN(v) diff --git a/dDatabase/Tables/CDZoneTableTable.cpp b/dDatabase/Tables/CDZoneTableTable.cpp index 89158dd7..bafbf8fe 100644 --- a/dDatabase/Tables/CDZoneTableTable.cpp +++ b/dDatabase/Tables/CDZoneTableTable.cpp @@ -26,25 +26,25 @@ CDZoneTableTable::CDZoneTableTable(void) { entry.ghostdistance = tableData.getFloatField("ghostdistance", -1.0f); entry.population_soft_cap = tableData.getIntField("population_soft_cap", -1); entry.population_hard_cap = tableData.getIntField("population_hard_cap", -1); - UNUSED_COLUMN(entry.DisplayDescription = tableData.getStringField("DisplayDescription", "")); - UNUSED_COLUMN(entry.mapFolder = tableData.getStringField("mapFolder", "")); + UNUSED(entry.DisplayDescription = tableData.getStringField("DisplayDescription", "")); + UNUSED(entry.mapFolder = tableData.getStringField("mapFolder", "")); entry.smashableMinDistance = tableData.getFloatField("smashableMinDistance", -1.0f); entry.smashableMaxDistance = tableData.getFloatField("smashableMaxDistance", -1.0f); - UNUSED_COLUMN(entry.mixerProgram = tableData.getStringField("mixerProgram", "")); - UNUSED_COLUMN(entry.clientPhysicsFramerate = tableData.getStringField("clientPhysicsFramerate", "")); - UNUSED_COLUMN(entry.serverPhysicsFramerate = tableData.getStringField("serverPhysicsFramerate", "")); + UNUSED(entry.mixerProgram = tableData.getStringField("mixerProgram", "")); + UNUSED(entry.clientPhysicsFramerate = tableData.getStringField("clientPhysicsFramerate", "")); + UNUSED(entry.serverPhysicsFramerate = tableData.getStringField("serverPhysicsFramerate", "")); entry.zoneControlTemplate = tableData.getIntField("zoneControlTemplate", -1); entry.widthInChunks = tableData.getIntField("widthInChunks", -1); entry.heightInChunks = tableData.getIntField("heightInChunks", -1); entry.petsAllowed = tableData.getIntField("petsAllowed", -1) == 1 ? true : false; entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false; entry.fZoneWeight = tableData.getFloatField("fZoneWeight", -1.0f); - UNUSED_COLUMN(entry.thumbnail = tableData.getStringField("thumbnail", "")); + UNUSED(entry.thumbnail = tableData.getStringField("thumbnail", "")); entry.PlayerLoseCoinsOnDeath = tableData.getIntField("PlayerLoseCoinsOnDeath", -1) == 1 ? true : false; - UNUSED_COLUMN(entry.disableSaveLoc = tableData.getIntField("disableSaveLoc", -1) == 1 ? true : false); + UNUSED(entry.disableSaveLoc = tableData.getIntField("disableSaveLoc", -1) == 1 ? true : false); entry.teamRadius = tableData.getFloatField("teamRadius", -1.0f); - UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "")); - UNUSED_COLUMN(entry.mountsAllowed = tableData.getIntField("mountsAllowed", -1) == 1 ? true : false); + UNUSED(entry.gate_version = tableData.getStringField("gate_version", "")); + UNUSED(entry.mountsAllowed = tableData.getIntField("mountsAllowed", -1) == 1 ? true : false); this->m_Entries.insert(std::make_pair(entry.zoneID, entry)); tableData.nextRow(); diff --git a/dDatabase/Tables/CDZoneTableTable.h b/dDatabase/Tables/CDZoneTableTable.h index e46a87ee..f844fd25 100644 --- a/dDatabase/Tables/CDZoneTableTable.h +++ b/dDatabase/Tables/CDZoneTableTable.h @@ -12,25 +12,25 @@ struct CDZoneTable { float ghostdistance; //!< The ghosting distance unsigned int population_soft_cap; //!< The "soft cap" on the world population unsigned int population_hard_cap; //!< The "hard cap" on the world population - UNUSED_COLUMN(std::string DisplayDescription); //!< The display description of the world - UNUSED_COLUMN(std::string mapFolder); //!< ??? + UNUSED(std::string DisplayDescription); //!< The display description of the world + UNUSED(std::string mapFolder); //!< ??? float smashableMinDistance; //!< The minimum smashable distance? float smashableMaxDistance; //!< The maximum smashable distance? - UNUSED_COLUMN(std::string mixerProgram); //!< ??? - UNUSED_COLUMN(std::string clientPhysicsFramerate); //!< The client physics framerate - UNUSED_COLUMN(std::string serverPhysicsFramerate); //!< The server physics framerate + UNUSED(std::string mixerProgram); //!< ??? + UNUSED(std::string clientPhysicsFramerate); //!< The client physics framerate + UNUSED(std::string serverPhysicsFramerate); //!< The server physics framerate unsigned int zoneControlTemplate; //!< The Zone Control template unsigned int widthInChunks; //!< The width of the world in chunks unsigned int heightInChunks; //!< The height of the world in chunks bool petsAllowed; //!< Whether or not pets are allowed in the world bool localize; //!< Whether or not the world should be localized float fZoneWeight; //!< ??? - UNUSED_COLUMN(std::string thumbnail); //!< The thumbnail of the world + UNUSED(std::string thumbnail); //!< The thumbnail of the world bool PlayerLoseCoinsOnDeath; //!< Whether or not the user loses coins on death - UNUSED_COLUMN(bool disableSaveLoc); //!< Disables the saving location? + UNUSED(bool disableSaveLoc); //!< Disables the saving location? float teamRadius; //!< ??? - UNUSED_COLUMN(std::string gate_version); //!< The gate version - UNUSED_COLUMN(bool mountsAllowed); //!< Whether or not mounts are allowed + UNUSED(std::string gate_version); //!< The gate version + UNUSED(bool mountsAllowed); //!< Whether or not mounts are allowed }; class CDZoneTableTable : public CDTable { diff --git a/dGame/Entity.cpp b/dGame/Entity.cpp index 4b0e1506..1e03f108 100644 --- a/dGame/Entity.cpp +++ b/dGame/Entity.cpp @@ -593,9 +593,9 @@ void Entity::Initialize() { m_Components.insert(std::make_pair(eReplicaComponentType::BOUNCER, comp)); } - int32_t renderaComponentId = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::RENDER); - if ((renderaComponentId > 0 && m_TemplateID != 2365) || m_Character) { - RenderComponent* render = new RenderComponent(this, renderaComponentId); + int32_t renderComponentId = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::RENDER); + if ((renderComponentId > 0 && m_TemplateID != 2365) || m_Character) { + RenderComponent* render = new RenderComponent(this, renderComponentId); m_Components.insert(std::make_pair(eReplicaComponentType::RENDER, render)); } diff --git a/dGame/LeaderboardManager.cpp b/dGame/LeaderboardManager.cpp index 5a4754b9..d85a95d4 100644 --- a/dGame/LeaderboardManager.cpp +++ b/dGame/LeaderboardManager.cpp @@ -277,11 +277,13 @@ void LeaderboardManager::SendLeaderboard(uint32_t gameID, InfoType infoType, boo } LeaderboardType LeaderboardManager::GetLeaderboardType(uint32_t gameID) { - CDActivitiesTable* activitiesTable = CDClientManager::Instance().GetTable(); - auto activityResult = activitiesTable->GetActivity(gameID); + auto* activitiesTable = CDClientManager::Instance().GetTable(); + std::vector activities = activitiesTable->Query([=](const CDActivities& entry) { + return (entry.ActivityID == gameID); + }); - if (activityResult.FoundData()) { - return static_cast(activityResult.Data().leaderboardType); + for (const auto& activity : activities) { + return static_cast(activity.leaderboardType); } return LeaderboardType::None; diff --git a/dGame/dComponents/RenderComponent.cpp b/dGame/dComponents/RenderComponent.cpp index bccd6207..94f5fb5d 100644 --- a/dGame/dComponents/RenderComponent.cpp +++ b/dGame/dComponents/RenderComponent.cpp @@ -18,6 +18,8 @@ std::unordered_map RenderComponent::m_DurationCache{}; RenderComponent::RenderComponent(Entity* parent, int32_t componentId): Component(parent) { m_Effects = std::vector(); m_LastAnimationName = ""; + if (componentId == -1) return; + auto query = CDClientDatabase::CreatePreppedStmt("SELECT * FROM RenderComponent WHERE id = ?;"); query.bind(1, componentId); auto result = query.execQuery(); @@ -210,23 +212,21 @@ float RenderComponent::GetAnimationTime(Entity* self, const std::string& animati float RenderComponent::DoAnimation(Entity* self, const std::string& animation, bool sendAnimation, float priority, float scale) { - if (!self) return 0.0f; + float returnlength = 0.0f; + if (!self) return returnlength; auto* renderComponent = self->GetComponent(); - if (!renderComponent) return 0.0f; + if (!renderComponent) return returnlength; - Game::logger->Log("RenderComponent", "looking up animation %s playing anim %i priority %f scale %f", animation.c_str(), sendAnimation, priority, scale); auto* animationsTable = CDClientManager::Instance().GetTable(); for (auto& groupId : renderComponent->m_animationGroupIds) { - Game::logger->Log("RenderComponent", "checking id %i with previous being %s", groupId, renderComponent->GetLastAnimationName().c_str()); auto animationGroup = animationsTable->GetAnimation(animation, renderComponent->GetLastAnimationName(), groupId); if (animationGroup.FoundData()) { auto data = animationGroup.Data(); - Game::logger->Log("RenderComponent", "animation %s priority %f length %f", data.animation_name.c_str(), data.priority, data.animation_length); - if (sendAnimation) GameMessages::SendPlayAnimation(self, GeneralUtils::ASCIIToUTF16(animation), priority, scale); renderComponent->SetLastAnimationName(data.animation_name); - return data.animation_length; + returnlength = data.animation_length; } } - Game::logger->Log("RenderComponent", "unable to find animation %s for lot %i", animation.c_str(), self->GetLOT()); - return 0.0f; + if (sendAnimation) GameMessages::SendPlayAnimation(self, GeneralUtils::ASCIIToUTF16(animation), priority, scale); + if (returnlength == 0.0f) Game::logger->Log("RenderComponent", "WARNING: Unable to find animation %s for lot %i in any group.", animation.c_str(), self->GetLOT()); + return returnlength; } diff --git a/dGame/dComponents/RenderComponent.h b/dGame/dComponents/RenderComponent.h index ef916396..a0b21919 100644 --- a/dGame/dComponents/RenderComponent.h +++ b/dGame/dComponents/RenderComponent.h @@ -104,6 +104,22 @@ public: */ std::vector& GetEffects(); + /** + * Verifies that an animation can be played on this entity by checking + * if it has the animation assigned to its group. If it does, the animation is echo'd + * down to all clients to be played and the duration of the played animation is returned. + * If the animation did not exist or the function was called in an invalid state, 0 is returned. + * + * The logic here matches the exact client logic. + * + * @param self The entity that wants to play an animation + * @param animation The animation_type (animationID in the client) to be played. + * @param sendAnimation Whether or not to echo the animation down to all clients. + * @param priority The priority of the animation. Only used if sendAnimation is true. + * @param scale The scale of the animation. Only used if sendAnimation is true. + * + * @return The duration of the animation that was played. + */ static float DoAnimation(Entity* self, const std::string& animation, bool sendAnimation, float priority = 0.0f, float scale = 1.0f); static float PlayAnimation(Entity* self, const std::u16string& animation, float priority = 0.0f, float scale = 1.0f); diff --git a/dGame/dComponents/ScriptedActivityComponent.cpp b/dGame/dComponents/ScriptedActivityComponent.cpp index 4f1e15d8..1bc8c01f 100644 --- a/dGame/dComponents/ScriptedActivityComponent.cpp +++ b/dGame/dComponents/ScriptedActivityComponent.cpp @@ -26,13 +26,13 @@ #include "CDActivityRewardsTable.h" #include "CDActivitiesTable.h" -ScriptedActivityComponent::ScriptedActivityComponent(Entity* parent, int activityID): Component(parent) { +ScriptedActivityComponent::ScriptedActivityComponent(Entity* parent, int activityID) : Component(parent) { m_ActivityID = activityID; CDActivitiesTable* activitiesTable = CDClientManager::Instance().GetTable(); - auto activityResult = activitiesTable->GetActivity(m_ActivityID); + std::vector activities = activitiesTable->Query([=](CDActivities entry) {return (entry.ActivityID == m_ActivityID); }); - if (activityResult.FoundData()) { - m_ActivityInfo = activityResult.Data(); + for (CDActivities activity : activities) { + m_ActivityInfo = activity; const auto mapID = m_ActivityInfo.instanceMapID; @@ -57,7 +57,6 @@ ScriptedActivityComponent::ScriptedActivityComponent(Entity* parent, int activit if (destroyableComponent) { // check for LMIs and set the loot LMIs - Game::logger->Log("ScriptedActivityComponent", "i am %i with lmi %i", m_Parent->GetLOT(), destroyableComponent->GetLootMatrixID()); CDActivityRewardsTable* activityRewardsTable = CDClientManager::Instance().GetTable(); std::vector activityRewards = activityRewardsTable->Query([=](CDActivityRewards entry) {return (entry.LootMatrixIndex == destroyableComponent->GetLootMatrixID()); }); @@ -65,13 +64,13 @@ ScriptedActivityComponent::ScriptedActivityComponent(Entity* parent, int activit if (activityRewards.size() > 0) { startingLMI = activityRewards[0].LootMatrixIndex; - Game::logger->Log("ScriptedActivityComponent", "index 0 is %i %i", activityRewards[0].LootMatrixIndex, activityRewards[0].objectTemplate); } if (startingLMI > 0) { + // now time for bodge :) + std::vector objectTemplateActivities = activityRewardsTable->Query([=](CDActivityRewards entry) {return (activityRewards[0].objectTemplate == entry.objectTemplate); }); for (const auto& item : objectTemplateActivities) { - Game::logger->Log("ScriptedActivityComponent", "%i added loot matrix with rating %i index %i objectTemplate %i", m_Parent->GetLOT(), item.activityRating, item.LootMatrixIndex, item.objectTemplate); if (item.activityRating > 0 && item.activityRating < 5) { m_ActivityLootMatrices.insert({ item.activityRating, item.LootMatrixIndex }); } @@ -100,22 +99,21 @@ void ScriptedActivityComponent::Serialize(RakNet::BitStream* outBitStream, bool void ScriptedActivityComponent::ReloadConfig() { CDActivitiesTable* activitiesTable = CDClientManager::Instance().GetTable(); - auto activityResult = activitiesTable->GetActivity(m_ActivityID); - if (activityResult.FoundData()) { - auto data = activityResult.Data(); - auto mapID = data.instanceMapID; + std::vector activities = activitiesTable->Query([=](CDActivities entry) {return (entry.ActivityID == m_ActivityID); }); + for (auto activity : activities) { + auto mapID = m_ActivityInfo.instanceMapID; if ((mapID == 1203 || mapID == 1261 || mapID == 1303 || mapID == 1403) && Game::config->GetValue("solo_racing") == "1") { m_ActivityInfo.minTeamSize = 1; m_ActivityInfo.minTeams = 1; } else { - m_ActivityInfo.minTeamSize = data.minTeamSize; - m_ActivityInfo.minTeams = data.minTeams; + m_ActivityInfo.minTeamSize = activity.minTeamSize; + m_ActivityInfo.minTeams = activity.minTeams; } } } void ScriptedActivityComponent::HandleMessageBoxResponse(Entity* player, const std::string& id) { - if (m_ActivityID == 103) { + if (m_ActivityInfo.ActivityID == 103) { return; } @@ -127,7 +125,7 @@ void ScriptedActivityComponent::HandleMessageBoxResponse(Entity* player, const s } void ScriptedActivityComponent::PlayerJoin(Entity* player) { - if (m_ActivityID == 103 || PlayerIsInQueue(player) || !IsValidActivity(player)) { + if (m_ActivityInfo.ActivityID == 103 || PlayerIsInQueue(player) || !IsValidActivity(player)) { return; } @@ -392,7 +390,7 @@ void ScriptedActivityComponent::PlayerReady(Entity* player, bool bReady) { } ActivityInstance* ScriptedActivityComponent::NewInstance() { - auto* instance = new ActivityInstance(m_Parent, this, m_ActivityInfo); + auto* instance = new ActivityInstance(m_Parent, m_ActivityInfo); m_Instances.push_back(instance); return instance; } @@ -559,12 +557,12 @@ void ActivityInstance::StartZone() { void ActivityInstance::RewardParticipant(Entity* participant) { auto* missionComponent = participant->GetComponent(); if (missionComponent) { - missionComponent->Progress(eMissionTaskType::ACTIVITY, m_OwningComponent->GetActivityID()); + missionComponent->Progress(eMissionTaskType::ACTIVITY, m_ActivityInfo.ActivityID); } // First, get the activity data auto* activityRewardsTable = CDClientManager::Instance().GetTable(); - std::vector activityRewards = activityRewardsTable->Query([=](CDActivityRewards entry) { return (entry.objectTemplate == m_OwningComponent->GetActivityID()); }); + std::vector activityRewards = activityRewardsTable->Query([=](CDActivityRewards entry) { return (entry.objectTemplate == m_ActivityInfo.ActivityID); }); if (!activityRewards.empty()) { uint32_t minCoins = 0; diff --git a/dGame/dComponents/ScriptedActivityComponent.h b/dGame/dComponents/ScriptedActivityComponent.h index 84ac0bc2..1d49a62d 100644 --- a/dGame/dComponents/ScriptedActivityComponent.h +++ b/dGame/dComponents/ScriptedActivityComponent.h @@ -15,18 +15,13 @@ #include "CDActivitiesTable.h" -class ScriptedActivityComponent; - /** * Represents an instance of an activity, having participants and score */ class ActivityInstance { public: - ActivityInstance(Entity* parent, ScriptedActivityComponent* parentComponent, CDActivities activityInfo) { - m_Parent = parent; - m_OwningComponent = parentComponent; - m_ActivityInfo = activityInfo; - }; + ActivityInstance(Entity* parent, CDActivities activityInfo) { m_Parent = parent; m_ActivityInfo = activityInfo; }; + //~ActivityInstance(); /** * Adds an entity to this activity @@ -93,11 +88,6 @@ private: */ Entity* m_Parent; - /** - * The component that owns this activity (the ScriptedActivityComponent) - */ - ScriptedActivityComponent* m_OwningComponent; - /** * All the participants of this activity */ @@ -222,7 +212,7 @@ public: * Returns the ID of this activity * @return the ID of this activity */ - int GetActivityID() { return m_ActivityID; } + int GetActivityID() { return m_ActivityInfo.ActivityID; } /** * Returns if this activity has a lobby, e.g. if it needs to instance players to some other map diff --git a/dGame/dUtilities/Loot.cpp b/dGame/dUtilities/Loot.cpp index d1f30e41..da0f2487 100644 --- a/dGame/dUtilities/Loot.cpp +++ b/dGame/dUtilities/Loot.cpp @@ -17,7 +17,6 @@ #include "MissionComponent.h" #include "eMissionState.h" #include "eReplicaComponentType.h" -#include "Metrics.hpp" LootGenerator::LootGenerator() { CDLootTableTable* lootTableTable = CDClientManager::Instance().GetTable(); diff --git a/dMasterServer/MasterServer.cpp b/dMasterServer/MasterServer.cpp index 7bb70391..78c93328 100644 --- a/dMasterServer/MasterServer.cpp +++ b/dMasterServer/MasterServer.cpp @@ -334,7 +334,8 @@ int main(int argc, char** argv) { if (Game::config->GetValue("prestart_servers") != "" && Game::config->GetValue("prestart_servers") == "1") { StartChatServer(); - Game::im->GetInstance(1800, false, 0); + Game::im->GetInstance(0, false, 0); + Game::im->GetInstance(1000, false, 0); StartAuthServer(); } diff --git a/dScripts/02_server/Enemy/AM/AmDarklingDragon.cpp b/dScripts/02_server/Enemy/AM/AmDarklingDragon.cpp index 0ee5431b..ff30f8e8 100644 --- a/dScripts/02_server/Enemy/AM/AmDarklingDragon.cpp +++ b/dScripts/02_server/Enemy/AM/AmDarklingDragon.cpp @@ -73,7 +73,7 @@ void AmDarklingDragon::OnHitOrHealResult(Entity* self, Entity* attacker, int32_t GameMessages::SendChangeIdleFlags(self->GetObjectID(), eAnimationFlags::IDLE_NONE, eAnimationFlags::IDLE_COMBAT, UNASSIGNED_SYSTEM_ADDRESS); float animationTime = RenderComponent::PlayAnimation(self, u"stunstart", 1.7f); - self->AddTimer("timeToStunLoop", animationTime); + self->AddTimer("timeToStunLoop", 1.0f); auto position = self->GetPosition(); auto forward = self->GetRotation().GetForwardVector(); diff --git a/dScripts/02_server/Equipment/MaestromExtracticatorServer.cpp b/dScripts/02_server/Equipment/MaestromExtracticatorServer.cpp index f02c0568..4de8a998 100644 --- a/dScripts/02_server/Equipment/MaestromExtracticatorServer.cpp +++ b/dScripts/02_server/Equipment/MaestromExtracticatorServer.cpp @@ -7,7 +7,10 @@ #include "RenderComponent.h" void MaestromExtracticatorServer::OnStartup(Entity* self) { - self->AddTimer("PlayFail", RenderComponent::PlayAnimation(self, failAnim)); + float animTime = RenderComponent::PlayAnimation(self, failAnim); + if (animTime == 0.0f) animTime = defaultTime; + + self->AddTimer("PlayFail", animTime); self->AddTimer("RemoveSample", destroyAfterNoSampleTime); } diff --git a/dScripts/02_server/Equipment/MaestromExtracticatorServer.h b/dScripts/02_server/Equipment/MaestromExtracticatorServer.h index c93a1cde..f0e976f3 100644 --- a/dScripts/02_server/Equipment/MaestromExtracticatorServer.h +++ b/dScripts/02_server/Equipment/MaestromExtracticatorServer.h @@ -13,5 +13,6 @@ public: private: const std::string failAnim = "idle_maelstrom"; const std::string collectAnim = "collect_maelstrom"; + const float defaultTime = 4.0f; const float destroyAfterNoSampleTime = 8.0f; }; diff --git a/dScripts/02_server/Map/NT/NtParadoxTeleServer.cpp b/dScripts/02_server/Map/NT/NtParadoxTeleServer.cpp index e3ec8d7d..dc8a195f 100644 --- a/dScripts/02_server/Map/NT/NtParadoxTeleServer.cpp +++ b/dScripts/02_server/Map/NT/NtParadoxTeleServer.cpp @@ -28,9 +28,8 @@ void NtParadoxTeleServer::OnProximityUpdate(Entity* self, Entity* entering, std: true, true, true, true, true, true, true ); - RenderComponent::PlayAnimation(player, u"teledeath", 4.0f); - - const auto animTime = 2; + auto animTime = RenderComponent::PlayAnimation(player, u"teledeath", 4.0f); + if (animTime == 0.0f) animTime = 2.0f; self->AddCallbackTimer(animTime, [this, self, playerID]() { auto* player = EntityManager::Instance()->GetEntity(playerID); diff --git a/dScripts/BaseConsoleTeleportServer.cpp b/dScripts/BaseConsoleTeleportServer.cpp index 073b7826..41dde4c4 100644 --- a/dScripts/BaseConsoleTeleportServer.cpp +++ b/dScripts/BaseConsoleTeleportServer.cpp @@ -33,7 +33,6 @@ void BaseConsoleTeleportServer::BaseOnMessageBoxResponse(Entity* self, Entity* s } const auto& teleIntroAnim = self->GetVar(u"teleportAnim"); - Game::logger->Log("BaseConsoleTeleportServer", "%s",GeneralUtils::UTF16ToWTF8(teleIntroAnim).c_str()); auto animTime = 3.32999992370605f; if (!teleIntroAnim.empty()) { animTime = RenderComponent::PlayAnimation(player, teleIntroAnim); From 47445ada54570d6599af1b1b79550b9fd3ff2b4f Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Mon, 27 Mar 2023 01:13:34 -0700 Subject: [PATCH 03/33] Fix Wingreaper birds not moving Fix an issue where the Wingreaper birds no longer moved. The client seems to do the following: Default speed set to 10.0f Check the PhysicsComponent table for the column speed and if it exists set speed to that value and if the value was null set it to the default again. --- dGame/dComponents/MovementAIComponent.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/dGame/dComponents/MovementAIComponent.cpp b/dGame/dComponents/MovementAIComponent.cpp index 278e9106..3db76bee 100644 --- a/dGame/dComponents/MovementAIComponent.cpp +++ b/dGame/dComponents/MovementAIComponent.cpp @@ -307,13 +307,12 @@ float MovementAIComponent::GetBaseSpeed(LOT lot) { foundComponent: - float speed; + // Client defaults speed to 10 and if the speed is also null in the table, it defaults to 10. + float speed = 10.0f; - if (physicsComponent == nullptr) { - speed = 8; - } else { - speed = physicsComponent->speed; - } + if (physicsComponent) speed = physicsComponent->speed; + + if (speed == -1.0f) speed = 10.0f; m_PhysicsSpeedCache[lot] = speed; From 308d56968a767cbe64be7bea093b4ba0c791b276 Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Tue, 11 Apr 2023 22:25:02 -0700 Subject: [PATCH 04/33] Use epsilon comparison --- dGame/dComponents/MovementAIComponent.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dGame/dComponents/MovementAIComponent.cpp b/dGame/dComponents/MovementAIComponent.cpp index 3db76bee..7acec5f7 100644 --- a/dGame/dComponents/MovementAIComponent.cpp +++ b/dGame/dComponents/MovementAIComponent.cpp @@ -312,7 +312,9 @@ foundComponent: if (physicsComponent) speed = physicsComponent->speed; - if (speed == -1.0f) speed = 10.0f; + float delta = fabs(speed) - 1.0f; + + if (delta <= std::numeric_limits::epsilon()) speed = 10.0f; m_PhysicsSpeedCache[lot] = speed; From c17b5fa5862dd0ae29749e690bf7edaba23b19ab Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Wed, 3 May 2023 01:31:50 -0500 Subject: [PATCH 05/33] prevent ressurecting with more than max stats (#1064) for health and imagination --- dGame/dGameMessages/GameMessages.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index 4d5a378c..3475c471 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -937,8 +937,13 @@ void GameMessages::SendResurrect(Entity* entity) { if (destroyableComponent != nullptr && entity->GetLOT() == 1) { auto* levelComponent = entity->GetComponent(); if (levelComponent) { - destroyableComponent->SetHealth(levelComponent->GetLevel() >= 45 ? 8 : 4); - destroyableComponent->SetImagination(levelComponent->GetLevel() >= 45 ? 20 : 6); + int32_t healthToRestore = levelComponent->GetLevel() >= 45 ? 8 : 4; + if (healthToRestore > destroyableComponent->GetMaxHealth()) healthToRestore = destroyableComponent->GetMaxHealth(); + destroyableComponent->SetHealth(healthToRestore); + + int32_t imaginationToRestore = levelComponent->GetLevel() >= 45 ? 20 : 6; + if (imaginationToRestore > destroyableComponent->GetMaxImagination()) imaginationToRestore = destroyableComponent->GetMaxImagination(); + destroyableComponent->SetImagination(imaginationToRestore); } } }); From e297aacc68d8b1a03bf69911debad052fa658d5b Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Wed, 3 May 2023 16:38:32 -0500 Subject: [PATCH 06/33] Breakout message identifiers (#1065) and make them scope enums --- dAuthServer/AuthServer.cpp | 13 +- dChatServer/ChatPacketHandler.cpp | 66 +- dChatServer/ChatServer.cpp | 62 +- dChatServer/PlayerContainer.cpp | 7 +- dCommon/dEnums/dCommonVars.h | 4 +- dCommon/dEnums/dMessageIdentifiers.h | 564 ------------------ dCommon/dEnums/eAuthMessageType.h | 15 + dCommon/dEnums/eChatInternalMessageType.h | 31 + dCommon/dEnums/eChatMessageType.h | 78 +++ dCommon/dEnums/eClientMessageType.h | 76 +++ dCommon/dEnums/eConnectionType.h | 14 + dCommon/dEnums/eGameMessageType.h | 303 ++++++++++ dCommon/dEnums/eMasterMessageType.h | 36 ++ dCommon/dEnums/eServerMessageType.h | 12 + dCommon/dEnums/eWorldMessageType.h | 42 ++ dGame/UserManager.cpp | 5 +- dGame/dBehaviors/BehaviorContext.cpp | 4 +- dGame/dComponents/ModuleAssemblyComponent.h | 2 +- .../RocketLaunchpadControlComponent.cpp | 5 +- .../dComponents/ScriptedActivityComponent.cpp | 5 +- dGame/dComponents/SkillComponent.cpp | 8 +- .../dGameMessages/DoClientProjectileImpact.h | 5 +- dGame/dGameMessages/EchoStartSkill.h | 6 +- dGame/dGameMessages/EchoSyncSkill.h | 6 +- dGame/dGameMessages/GameMessageHandler.cpp | 219 +++---- dGame/dGameMessages/GameMessageHandler.h | 5 +- dGame/dGameMessages/GameMessages.cpp | 325 +++++----- .../RequestServerProjectileImpact.h | 6 +- dGame/dGameMessages/StartSkill.h | 6 +- dGame/dGameMessages/SyncSkill.h | 5 +- dGame/dUtilities/Mail.cpp | 14 +- dGame/dUtilities/SlashCommandHandler.cpp | 10 +- dMasterServer/InstanceManager.cpp | 7 +- dMasterServer/MasterServer.cpp | 41 +- dNet/AuthPackets.cpp | 10 +- dNet/ChatPackets.cpp | 9 +- dNet/ClientPackets.cpp | 1 - dNet/MasterPackets.cpp | 19 +- dNet/PacketUtils.cpp | 8 - dNet/PacketUtils.h | 11 +- dNet/WorldPackets.cpp | 22 +- dNet/dServer.cpp | 14 +- dWorldServer/WorldServer.cpp | 96 +-- 43 files changed, 1131 insertions(+), 1066 deletions(-) delete mode 100644 dCommon/dEnums/dMessageIdentifiers.h create mode 100644 dCommon/dEnums/eAuthMessageType.h create mode 100644 dCommon/dEnums/eChatInternalMessageType.h create mode 100644 dCommon/dEnums/eChatMessageType.h create mode 100644 dCommon/dEnums/eClientMessageType.h create mode 100644 dCommon/dEnums/eConnectionType.h create mode 100644 dCommon/dEnums/eGameMessageType.h create mode 100644 dCommon/dEnums/eMasterMessageType.h create mode 100644 dCommon/dEnums/eServerMessageType.h create mode 100644 dCommon/dEnums/eWorldMessageType.h diff --git a/dAuthServer/AuthServer.cpp b/dAuthServer/AuthServer.cpp index f5090495..ddec32db 100644 --- a/dAuthServer/AuthServer.cpp +++ b/dAuthServer/AuthServer.cpp @@ -15,10 +15,13 @@ //RakNet includes: #include "RakNetDefines.h" +#include //Auth includes: #include "AuthPackets.h" -#include "dMessageIdentifiers.h" +#include "eConnectionType.h" +#include "eServerMessageType.h" +#include "eAuthMessageType.h" #include "Game.h" namespace Game { @@ -169,12 +172,12 @@ dLogger* SetupLogger() { void HandlePacket(Packet* packet) { if (packet->data[0] == ID_USER_PACKET_ENUM) { - if (packet->data[1] == SERVER) { - if (packet->data[3] == MSG_SERVER_VERSION_CONFIRM) { + if (static_cast(packet->data[1]) == eConnectionType::SERVER) { + if (static_cast(packet->data[3]) == eServerMessageType::VERSION_CONFIRM) { AuthPackets::HandleHandshake(Game::server, packet); } - } else if (packet->data[1] == AUTH) { - if (packet->data[3] == MSG_AUTH_LOGIN_REQUEST) { + } else if (static_cast(packet->data[1]) == eConnectionType::AUTH) { + if (static_cast(packet->data[3]) == eAuthMessageType::LOGIN_REQUEST) { AuthPackets::HandleLoginRequest(Game::server, packet); } } diff --git a/dChatServer/ChatPacketHandler.cpp b/dChatServer/ChatPacketHandler.cpp index a0d508cb..9b5ca761 100644 --- a/dChatServer/ChatPacketHandler.cpp +++ b/dChatServer/ChatPacketHandler.cpp @@ -3,7 +3,6 @@ #include "Database.h" #include #include "PacketUtils.h" -#include "dMessageIdentifiers.h" #include "Game.h" #include "dServer.h" #include "GeneralUtils.h" @@ -13,6 +12,11 @@ #include "RakString.h" #include "dConfig.h" #include "eObjectBits.h" +#include "eConnectionType.h" +#include "eChatMessageType.h" +#include "eChatInternalMessageType.h" +#include "eClientMessageType.h" +#include "eGameMessageType.h" extern PlayerContainer playerContainer; @@ -72,11 +76,11 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) { //Now, we need to send the friendlist to the server they came from: CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(playerID); //portion that will get routed: - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_GET_FRIENDS_LIST_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::GET_FRIENDS_LIST_RESPONSE); bitStream.Write(0); bitStream.Write(1); //Length of packet -- just writing one as it doesn't matter, client skips it. bitStream.Write((uint16_t)friends.size()); @@ -413,10 +417,10 @@ void ChatPacketHandler::HandleChatMessage(Packet* packet) { const auto otherName = std::string(otherMember->playerName.c_str()); CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(otherMember->playerID); - PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_PRIVATE_CHAT_MESSAGE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::PRIVATE_CHAT_MESSAGE); bitStream.Write(otherMember->playerID); bitStream.Write(8); bitStream.Write(69); @@ -452,10 +456,10 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) { //To the sender: { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(goonA->playerID); - PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_PRIVATE_CHAT_MESSAGE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::PRIVATE_CHAT_MESSAGE); bitStream.Write(goonA->playerID); bitStream.Write(7); bitStream.Write(69); @@ -475,10 +479,10 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) { //To the receiver: { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(goonB->playerID); - PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_PRIVATE_CHAT_MESSAGE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::PRIVATE_CHAT_MESSAGE); bitStream.Write(goonA->playerID); bitStream.Write(7); bitStream.Write(69); @@ -717,11 +721,11 @@ void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) { void ChatPacketHandler::SendTeamInvite(PlayerData* receiver, PlayerData* sender) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(receiver->playerID); //portion that will get routed: - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_TEAM_INVITE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::TEAM_INVITE); PacketUtils::WritePacketWString(sender->playerName.c_str(), 33, &bitStream); bitStream.Write(sender->playerID); @@ -732,14 +736,14 @@ void ChatPacketHandler::SendTeamInvite(PlayerData* receiver, PlayerData* sender) void ChatPacketHandler::SendTeamInviteConfirm(PlayerData* receiver, bool bLeaderIsFreeTrial, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, uint8_t ucResponseCode, std::u16string wsLeaderName) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(receiver->playerID); //portion that will get routed: CMSGHEADER; bitStream.Write(receiver->playerID); - bitStream.Write(GAME_MSG::GAME_MSG_TEAM_INVITE_CONFIRM); + bitStream.Write(eGameMessageType::TEAM_INVITE_CONFIRM); bitStream.Write(bLeaderIsFreeTrial); bitStream.Write(i64LeaderID); @@ -759,14 +763,14 @@ void ChatPacketHandler::SendTeamInviteConfirm(PlayerData* receiver, bool bLeader void ChatPacketHandler::SendTeamStatus(PlayerData* receiver, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, std::u16string wsLeaderName) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(receiver->playerID); //portion that will get routed: CMSGHEADER; bitStream.Write(receiver->playerID); - bitStream.Write(GAME_MSG::GAME_MSG_TEAM_GET_STATUS_RESPONSE); + bitStream.Write(eGameMessageType::TEAM_GET_STATUS_RESPONSE); bitStream.Write(i64LeaderID); bitStream.Write(i64LeaderZoneID); @@ -784,14 +788,14 @@ void ChatPacketHandler::SendTeamStatus(PlayerData* receiver, LWOOBJID i64LeaderI void ChatPacketHandler::SendTeamSetLeader(PlayerData* receiver, LWOOBJID i64PlayerID) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(receiver->playerID); //portion that will get routed: CMSGHEADER; bitStream.Write(receiver->playerID); - bitStream.Write(GAME_MSG::GAME_MSG_TEAM_SET_LEADER); + bitStream.Write(eGameMessageType::TEAM_SET_LEADER); bitStream.Write(i64PlayerID); @@ -801,14 +805,14 @@ void ChatPacketHandler::SendTeamSetLeader(PlayerData* receiver, LWOOBJID i64Play void ChatPacketHandler::SendTeamAddPlayer(PlayerData* receiver, bool bIsFreeTrial, bool bLocal, bool bNoLootOnDeath, LWOOBJID i64PlayerID, std::u16string wsPlayerName, LWOZONEID zoneID) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(receiver->playerID); //portion that will get routed: CMSGHEADER; bitStream.Write(receiver->playerID); - bitStream.Write(GAME_MSG::GAME_MSG_TEAM_ADD_PLAYER); + bitStream.Write(eGameMessageType::TEAM_ADD_PLAYER); bitStream.Write(bIsFreeTrial); bitStream.Write(bLocal); @@ -830,14 +834,14 @@ void ChatPacketHandler::SendTeamAddPlayer(PlayerData* receiver, bool bIsFreeTria void ChatPacketHandler::SendTeamRemovePlayer(PlayerData* receiver, bool bDisband, bool bIsKicked, bool bIsLeaving, bool bLocal, LWOOBJID i64LeaderID, LWOOBJID i64PlayerID, std::u16string wsPlayerName) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(receiver->playerID); //portion that will get routed: CMSGHEADER; bitStream.Write(receiver->playerID); - bitStream.Write(GAME_MSG::GAME_MSG_TEAM_REMOVE_PLAYER); + bitStream.Write(eGameMessageType::TEAM_REMOVE_PLAYER); bitStream.Write(bDisband); bitStream.Write(bIsKicked); @@ -856,14 +860,14 @@ void ChatPacketHandler::SendTeamRemovePlayer(PlayerData* receiver, bool bDisband void ChatPacketHandler::SendTeamSetOffWorldFlag(PlayerData* receiver, LWOOBJID i64PlayerID, LWOZONEID zoneID) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(receiver->playerID); //portion that will get routed: CMSGHEADER; bitStream.Write(receiver->playerID); - bitStream.Write(GAME_MSG::GAME_MSG_TEAM_SET_OFF_WORLD_FLAG); + bitStream.Write(eGameMessageType::TEAM_SET_OFF_WORLD_FLAG); bitStream.Write(i64PlayerID); if (receiver->zoneID.GetCloneID() == zoneID.GetCloneID()) { @@ -890,11 +894,11 @@ void ChatPacketHandler::SendFriendUpdate(PlayerData* friendData, PlayerData* pla [bool] - is FTP*/ CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(friendData->playerID); //portion that will get routed: - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_UPDATE_FRIEND_NOTIFY); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::UPDATE_FRIEND_NOTIFY); bitStream.Write(notifyType); std::string playerName = playerData->playerName.c_str(); @@ -929,11 +933,11 @@ void ChatPacketHandler::SendFriendRequest(PlayerData* receiver, PlayerData* send } CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(receiver->playerID); //portion that will get routed: - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_ADD_FRIEND_REQUEST); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::ADD_FRIEND_REQUEST); PacketUtils::WritePacketWString(sender->playerName.c_str(), 33, &bitStream); bitStream.Write(0); // This is a BFF flag however this is unused in live and does not have an implementation client side. @@ -945,11 +949,11 @@ void ChatPacketHandler::SendFriendResponse(PlayerData* receiver, PlayerData* sen if (!receiver || !sender) return; CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(receiver->playerID); // Portion that will get routed: - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_ADD_FRIEND_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::ADD_FRIEND_RESPONSE); bitStream.Write(responseCode); // For all requests besides accepted, write a flag that says whether or not we are already best friends with the receiver. bitStream.Write(responseCode != eAddFriendResponseType::ACCEPTED ? isBestFriendsAlready : sender->sysAddr != UNASSIGNED_SYSTEM_ADDRESS); @@ -970,11 +974,11 @@ void ChatPacketHandler::SendRemoveFriend(PlayerData* receiver, std::string& pers if (!receiver) return; CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER); bitStream.Write(receiver->playerID); //portion that will get routed: - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_REMOVE_FRIEND_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::REMOVE_FRIEND_RESPONSE); bitStream.Write(isSuccessful); //isOnline PacketUtils::WritePacketWString(personToRemove, 33, &bitStream); diff --git a/dChatServer/ChatServer.cpp b/dChatServer/ChatServer.cpp index a75c4d51..3e3ddfd3 100644 --- a/dChatServer/ChatServer.cpp +++ b/dChatServer/ChatServer.cpp @@ -9,19 +9,23 @@ #include "dLogger.h" #include "Database.h" #include "dConfig.h" -#include "dMessageIdentifiers.h" #include "dChatFilter.h" #include "Diagnostics.h" #include "AssetManager.h" #include "BinaryPathFinder.h" - +#include "eConnectionType.h" #include "PlayerContainer.h" #include "ChatPacketHandler.h" +#include "eChatMessageType.h" +#include "eChatInternalMessageType.h" +#include "eWorldMessageType.h" #include "Game.h" //RakNet includes: #include "RakNetDefines.h" +#include + namespace Game { dLogger* logger = nullptr; dServer* server = nullptr; @@ -68,7 +72,7 @@ int main(int argc, char** argv) { Game::assetManager = new AssetManager(clientPath); } catch (std::runtime_error& ex) { Game::logger->Log("ChatServer", "Got an error while setting up assets: %s", ex.what()); - + return EXIT_FAILURE; } @@ -199,25 +203,25 @@ void HandlePacket(Packet* packet) { Game::logger->Log("ChatServer", "A server is connecting, awaiting user list."); } - if (packet->data[1] == CHAT_INTERNAL) { - switch (packet->data[3]) { - case MSG_CHAT_INTERNAL_PLAYER_ADDED_NOTIFICATION: + if (static_cast(packet->data[1]) == eConnectionType::CHAT_INTERNAL) { + switch (static_cast(packet->data[3])) { + case eChatInternalMessageType::PLAYER_ADDED_NOTIFICATION: playerContainer.InsertPlayer(packet); break; - case MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION: + case eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION: playerContainer.RemovePlayer(packet); break; - case MSG_CHAT_INTERNAL_MUTE_UPDATE: + case eChatInternalMessageType::MUTE_UPDATE: playerContainer.MuteUpdate(packet); break; - case MSG_CHAT_INTERNAL_CREATE_TEAM: + case eChatInternalMessageType::CREATE_TEAM: playerContainer.CreateTeamServer(packet); break; - case MSG_CHAT_INTERNAL_ANNOUNCEMENT: { + case eChatInternalMessageType::ANNOUNCEMENT: { //we just forward this packet to every connected server CINSTREAM; Game::server->Send(&inStream, packet->systemAddress, true); //send to everyone except origin @@ -229,67 +233,67 @@ void HandlePacket(Packet* packet) { } } - if (packet->data[1] == CHAT) { - switch (packet->data[3]) { - case MSG_CHAT_GET_FRIENDS_LIST: + if (static_cast(packet->data[1]) == eConnectionType::CHAT) { + switch (static_cast(packet->data[3])) { + case eChatMessageType::GET_FRIENDS_LIST: ChatPacketHandler::HandleFriendlistRequest(packet); break; - case MSG_CHAT_GET_IGNORE_LIST: + case eChatMessageType::GET_IGNORE_LIST: Game::logger->Log("ChatServer", "Asked for ignore list, but is unimplemented right now."); break; - case MSG_CHAT_TEAM_GET_STATUS: + case eChatMessageType::TEAM_GET_STATUS: ChatPacketHandler::HandleTeamStatusRequest(packet); break; - case MSG_CHAT_ADD_FRIEND_REQUEST: + case eChatMessageType::ADD_FRIEND_REQUEST: //this involves someone sending the initial request, the response is below, response as in from the other player. //We basically just check to see if this player is online or not and route the packet. ChatPacketHandler::HandleFriendRequest(packet); break; - case MSG_CHAT_ADD_FRIEND_RESPONSE: + case eChatMessageType::ADD_FRIEND_RESPONSE: //This isn't the response a server sent, rather it is a player's response to a received request. //Here, we'll actually have to add them to eachother's friend lists depending on the response code. ChatPacketHandler::HandleFriendResponse(packet); break; - case MSG_CHAT_REMOVE_FRIEND: + case eChatMessageType::REMOVE_FRIEND: ChatPacketHandler::HandleRemoveFriend(packet); break; - case MSG_CHAT_GENERAL_CHAT_MESSAGE: + case eChatMessageType::GENERAL_CHAT_MESSAGE: ChatPacketHandler::HandleChatMessage(packet); break; - case MSG_CHAT_PRIVATE_CHAT_MESSAGE: + case eChatMessageType::PRIVATE_CHAT_MESSAGE: //This message is supposed to be echo'd to both the sender and the receiver //BUT: they have to have different responseCodes, so we'll do some of the ol hacky wacky to fix that right up. ChatPacketHandler::HandlePrivateChatMessage(packet); break; - case MSG_CHAT_TEAM_INVITE: + case eChatMessageType::TEAM_INVITE: ChatPacketHandler::HandleTeamInvite(packet); break; - case MSG_CHAT_TEAM_INVITE_RESPONSE: + case eChatMessageType::TEAM_INVITE_RESPONSE: ChatPacketHandler::HandleTeamInviteResponse(packet); break; - case MSG_CHAT_TEAM_LEAVE: + case eChatMessageType::TEAM_LEAVE: ChatPacketHandler::HandleTeamLeave(packet); break; - case MSG_CHAT_TEAM_SET_LEADER: + case eChatMessageType::TEAM_SET_LEADER: ChatPacketHandler::HandleTeamPromote(packet); break; - case MSG_CHAT_TEAM_KICK: + case eChatMessageType::TEAM_KICK: ChatPacketHandler::HandleTeamKick(packet); break; - case MSG_CHAT_TEAM_SET_LOOT: + case eChatMessageType::TEAM_SET_LOOT: ChatPacketHandler::HandleTeamLootOption(packet); break; @@ -298,9 +302,9 @@ void HandlePacket(Packet* packet) { } } - if (packet->data[1] == WORLD) { - switch (packet->data[3]) { - case MSG_WORLD_CLIENT_ROUTE_PACKET: { + if (static_cast(packet->data[1]) == eConnectionType::WORLD) { + switch (static_cast(packet->data[3])) { + case eWorldMessageType::ROUTE_PACKET: { Game::logger->Log("ChatServer", "Routing packet from world"); break; } diff --git a/dChatServer/PlayerContainer.cpp b/dChatServer/PlayerContainer.cpp index 6bf3ccd1..dcc9ebb9 100644 --- a/dChatServer/PlayerContainer.cpp +++ b/dChatServer/PlayerContainer.cpp @@ -6,9 +6,10 @@ #include "dLogger.h" #include "ChatPacketHandler.h" #include "GeneralUtils.h" -#include "dMessageIdentifiers.h" #include "PacketUtils.h" #include "Database.h" +#include "eConnectionType.h" +#include "eChatInternalMessageType.h" PlayerContainer::PlayerContainer() { } @@ -149,7 +150,7 @@ void PlayerContainer::CreateTeamServer(Packet* packet) { void PlayerContainer::BroadcastMuteUpdate(LWOOBJID player, time_t time) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_MUTE_UPDATE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::MUTE_UPDATE); bitStream.Write(player); bitStream.Write(time); @@ -348,7 +349,7 @@ void PlayerContainer::TeamStatusUpdate(TeamData* team) { void PlayerContainer::UpdateTeamsOnWorld(TeamData* team, bool deleteTeam) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_TEAM_UPDATE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::TEAM_UPDATE); bitStream.Write(team->teamID); bitStream.Write(deleteTeam); diff --git a/dCommon/dEnums/dCommonVars.h b/dCommon/dEnums/dCommonVars.h index 26201c3d..e11866f1 100644 --- a/dCommon/dEnums/dCommonVars.h +++ b/dCommon/dEnums/dCommonVars.h @@ -7,6 +7,8 @@ #include #include #include "BitStream.h" +#include "eConnectionType.h" +#include "eClientMessageType.h" #pragma warning (disable:4251) //Disables SQL warnings @@ -28,7 +30,7 @@ constexpr uint32_t lowFrameDelta = FRAMES_TO_MS(lowFramerate); #define CBITSTREAM RakNet::BitStream bitStream; #define CINSTREAM RakNet::BitStream inStream(packet->data, packet->length, false); -#define CMSGHEADER PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_GAME_MSG); +#define CMSGHEADER PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::GAME_MSG); #define SEND_PACKET Game::server->Send(&bitStream, sysAddr, false); #define SEND_PACKET_BROADCAST Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true); diff --git a/dCommon/dEnums/dMessageIdentifiers.h b/dCommon/dEnums/dMessageIdentifiers.h deleted file mode 100644 index 7c810a2d..00000000 --- a/dCommon/dEnums/dMessageIdentifiers.h +++ /dev/null @@ -1,564 +0,0 @@ -#pragma once -#include "MessageIdentifiers.h" - -enum CONNECTION_TYPE { - SERVER = 0, //!< Means it is used throughout all servers - AUTH, //!< Means it is sent from the client authentication - CHAT, //!< Means it is sent from and to the chat server - CHAT_INTERNAL, //!< Unused - We can potentially use this in the future for various things - WORLD, //!< Means it is sent from the client world - CLIENT, //!< Means it is sent to the client from the world server - MASTER //!< Means it is sent to and from the master server -}; - -//! The Internal Server Packet Identifiers -enum SERVER { - MSG_SERVER_VERSION_CONFIRM = 0, /*!< Sent during a handshake to confirm the server/client version */ - MSG_SERVER_DISCONNECT_NOTIFY, /*!< Sent when a user disconnected */ - MSG_SERVER_GENERAL_NOTIFY /*!< A general notification */ -}; - -//! The Internal Authentication Packet Identifiers -enum AUTH { - MSG_AUTH_LOGIN_REQUEST = 0, /*!< Sent from the client when a user logs in */ - MSG_AUTH_LOGOUT_REQUEST, /*!< Sent from the client when a user logs out */ - MSG_AUTH_CREATE_NEW_ACCOUNT_REQUEST, /*!< Sent from the client when a user creates a new account */ - MSG_AUTH_LEGOINTERFACE_AUTH_RESPONSE, /*!< Unknown */ - MSG_AUTH_SESSIONKEY_RECEIVED_CONFIRM, /*!< Sent when the server recieved the session key (?) */ - MSG_AUTH_RUNTIME_CONFIG /*!< Unknown */ -}; - -//! The Internal Chat Packet Identifiers -enum CHAT { - MSG_CHAT_LOGIN_SESSION_NOTIFY = 0, /*!< When a user logs in */ - MSG_CHAT_GENERAL_CHAT_MESSAGE, /*!< Used for global chat messages */ - MSG_CHAT_PRIVATE_CHAT_MESSAGE, /*!< Used for private chat messages */ - MSG_CHAT_USER_CHANNEL_CHAT_MESSAGE, /*!< Unknown */ - MSG_CHAT_WORLD_DISCONNECT_REQUEST, /*!< Unknown */ - MSG_CHAT_WORLD_PROXIMITY_RESPONSE, /*!< Unknown */ - MSG_CHAT_WORLD_PARCEL_RESPONSE, /*!< Unknown */ - MSG_CHAT_ADD_FRIEND_REQUEST, /*!< When the client requests to add a friend */ - MSG_CHAT_ADD_FRIEND_RESPONSE, /*!< Sent from the server when the client adds a friend */ - MSG_CHAT_REMOVE_FRIEND, /*!< When the client removes a friend */ - MSG_CHAT_GET_FRIENDS_LIST, /*!< Sent when the client requests a user's friends list */ - MSG_CHAT_ADD_IGNORE, /*!< Sent when the client adds a friend to the "ignore" list */ - MSG_CHAT_REMOVE_IGNORE, /*!< Sent when the client removes a friend from the "ignore" list */ - MSG_CHAT_GET_IGNORE_LIST, /*!< Sent when the client requests a user's ignored list */ - MSG_CHAT_TEAM_MISSED_INVITE_CHECK, /*!< Unknown (Something with an unresponded-to friend request probably) */ - MSG_CHAT_TEAM_INVITE, /*!< When the client invites a user to a team */ - MSG_CHAT_TEAM_INVITE_RESPONSE, /*!< Sent from the server when the client invites someone to the team */ - MSG_CHAT_TEAM_KICK, /*!< Sent when the client kicks a member from a team */ - MSG_CHAT_TEAM_LEAVE, /*!< Sent when the client leaves a team */ - MSG_CHAT_TEAM_SET_LOOT, /*!< Unknown (Something to do with team loot) */ - MSG_CHAT_TEAM_SET_LEADER, /*!< Unknown (Probably sets the team leader or something) */ - MSG_CHAT_TEAM_GET_STATUS, /*!< Check to see if we are in a team or not, sent on world join */ - MSG_CHAT_GUILD_CREATE, /*!< Guild Creation */ - MSG_CHAT_GUILD_INVITE, /*!< Guild Invitation */ - MSG_CHAT_GUILD_INVITE_RESPONSE, /*!< Guild Invite Response */ - MSG_CHAT_GUILD_LEAVE, /*!< Guild Leave */ - MSG_CHAT_GUILD_KICK, /*!< Guild Kick */ - MSG_CHAT_GUILD_GET_STATUS, /*!< Guild Get Status */ - MSG_CHAT_GUILD_GET_ALL, /*!< Guild Get All */ - MSG_CHAT_SHOW_ALL, - MSG_CHAT_BLUEPRINT_MODERATED, - MSG_CHAT_BLUEPRINT_MODEL_READY, - MSG_CHAT_PROPERTY_READY_FOR_APPROVAL, - MSG_CHAT_PROPERTY_MODERATION_CHANGED, - MSG_CHAT_PROPERTY_BUILDMODE_CHANGED, - MSG_CHAT_PROPERTY_BUILDMODE_CHANGED_REPORT, - MSG_CHAT_MAIL, - MSG_CHAT_WORLD_INSTANCE_LOCATION_REQUEST, - MSG_CHAT_REPUTATION_UPDATE, - MSG_CHAT_SEND_CANNED_TEXT, - MSG_CHAT_GMLEVEL_UPDATE, - MSG_CHAT_CHARACTER_NAME_CHANGE_REQUEST, - MSG_CHAT_CSR_REQUEST, - MSG_CHAT_CSR_REPLY, - MSG_CHAT_GM_KICK, - MSG_CHAT_GM_ANNOUNCE, - MSG_CHAT_GM_MUTE, - MSG_CHAT_ACTIVITY_UPDATE, - MSG_CHAT_WORLD_ROUTE_PACKET, - MSG_CHAT_GET_ZONE_POPULATIONS, - MSG_CHAT_REQUEST_MINIMUM_CHAT_MODE, - MSG_CHAT_REQUEST_MINIMUM_CHAT_MODE_PRIVATE, - MSG_CHAT_MATCH_REQUEST, - MSG_CHAT_UGCMANIFEST_REPORT_MISSING_FILE, - MSG_CHAT_UGCMANIFEST_REPORT_DONE_FILE, - MSG_CHAT_UGCMANIFEST_REPORT_DONE_BLUEPRINT, - MSG_CHAT_UGCC_REQUEST, - MSG_CHAT_WHO, - MSG_CHAT_WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE, - MSG_CHAT_ACHIEVEMENT_NOTIFY, - MSG_CHAT_GM_CLOSE_PRIVATE_CHAT_WINDOW, - MSG_CHAT_UNEXPECTED_DISCONNECT, - MSG_CHAT_PLAYER_READY, - MSG_CHAT_GET_DONATION_TOTAL, - MSG_CHAT_UPDATE_DONATION, - MSG_CHAT_PRG_CSR_COMMAND, - MSG_CHAT_HEARTBEAT_REQUEST_FROM_WORLD, - MSG_CHAT_UPDATE_FREE_TRIAL_STATUS -}; - -//! Used for packets related to chatting -enum CHAT_INTERNAL { - MSG_CHAT_INTERNAL_PLAYER_ADDED_NOTIFICATION = 0, - MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION, - MSG_CHAT_INTERNAL_ADD_FRIEND, - MSG_CHAT_INTERNAL_ADD_BEST_FRIEND, - MSG_CHAT_INTERNAL_ADD_TO_TEAM, - MSG_CHAT_INTERNAL_ADD_BLOCK, - MSG_CHAT_INTERNAL_REMOVE_FRIEND, - MSG_CHAT_INTERNAL_REMOVE_BLOCK, - MSG_CHAT_INTERNAL_REMOVE_FROM_TEAM, - MSG_CHAT_INTERNAL_DELETE_TEAM, - MSG_CHAT_INTERNAL_REPORT, - MSG_CHAT_INTERNAL_PRIVATE_CHAT, - MSG_CHAT_INTERNAL_PRIVATE_CHAT_RESPONSE, - MSG_CHAT_INTERNAL_ANNOUNCEMENT, - MSG_CHAT_INTERNAL_MAIL_COUNT_UPDATE, - MSG_CHAT_INTERNAL_MAIL_SEND_NOTIFY, - MSG_CHAT_INTERNAL_REQUEST_USER_LIST, - MSG_CHAT_INTERNAL_FRIEND_LIST, - MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER, - MSG_CHAT_INTERNAL_TEAM_UPDATE, - MSG_CHAT_INTERNAL_MUTE_UPDATE, - MSG_CHAT_INTERNAL_CREATE_TEAM, -}; - -//! Used for packets send to the world -enum WORLD { - MSG_WORLD_CLIENT_VALIDATION = 1, // Session info - MSG_WORLD_CLIENT_CHARACTER_LIST_REQUEST, - MSG_WORLD_CLIENT_CHARACTER_CREATE_REQUEST, - MSG_WORLD_CLIENT_LOGIN_REQUEST, // Character selected - MSG_WORLD_CLIENT_GAME_MSG, - MSG_WORLD_CLIENT_CHARACTER_DELETE_REQUEST, - MSG_WORLD_CLIENT_CHARACTER_RENAME_REQUEST, - MSG_WORLD_CLIENT_HAPPY_FLOWER_MODE_NOTIFY, - MSG_WORLD_CLIENT_SLASH_RELOAD_MAP, // Reload map cmp - MSG_WORLD_CLIENT_SLASH_PUSH_MAP_REQUEST, // Push map req cmd - MSG_WORLD_CLIENT_SLASH_PUSH_MAP, // Push map cmd - MSG_WORLD_CLIENT_SLASH_PULL_MAP, // Pull map cmd - MSG_WORLD_CLIENT_LOCK_MAP_REQUEST, - MSG_WORLD_CLIENT_GENERAL_CHAT_MESSAGE, // General chat message - MSG_WORLD_CLIENT_HTTP_MONITOR_INFO_REQUEST, - MSG_WORLD_CLIENT_SLASH_DEBUG_SCRIPTS, // Debug scripts cmd - MSG_WORLD_CLIENT_MODELS_CLEAR, - MSG_WORLD_CLIENT_EXHIBIT_INSERT_MODEL, - MSG_WORLD_CLIENT_LEVEL_LOAD_COMPLETE, // Character data request - MSG_WORLD_CLIENT_TMP_GUILD_CREATE, - MSG_WORLD_CLIENT_ROUTE_PACKET, // Social? - MSG_WORLD_CLIENT_POSITION_UPDATE, - MSG_WORLD_CLIENT_MAIL, - MSG_WORLD_CLIENT_WORD_CHECK, // Whitelist word check - MSG_WORLD_CLIENT_STRING_CHECK, // Whitelist string check - MSG_WORLD_CLIENT_GET_PLAYERS_IN_ZONE, - MSG_WORLD_CLIENT_REQUEST_UGC_MANIFEST_INFO, - MSG_WORLD_CLIENT_BLUEPRINT_GET_ALL_DATA_REQUEST, - MSG_WORLD_CLIENT_CANCEL_MAP_QUEUE, - MSG_WORLD_CLIENT_HANDLE_FUNNESS, - MSG_WORLD_CLIENT_FAKE_PRG_CSR_MESSAGE, - MSG_WORLD_CLIENT_REQUEST_FREE_TRIAL_REFRESH, - MSG_WORLD_CLIENT_GM_SET_FREE_TRIAL_STATUS -}; - -//! An enum for packets sent to the client -enum CLIENT { - MSG_CLIENT_LOGIN_RESPONSE = 0, - MSG_CLIENT_LOGOUT_RESPONSE, - MSG_CLIENT_LOAD_STATIC_ZONE, - MSG_CLIENT_CREATE_OBJECT, - MSG_CLIENT_CREATE_CHARACTER, - MSG_CLIENT_CREATE_CHARACTER_EXTENDED, - MSG_CLIENT_CHARACTER_LIST_RESPONSE, - MSG_CLIENT_CHARACTER_CREATE_RESPONSE, - MSG_CLIENT_CHARACTER_RENAME_RESPONSE, - MSG_CLIENT_CHAT_CONNECT_RESPONSE, - MSG_CLIENT_AUTH_ACCOUNT_CREATE_RESPONSE, - MSG_CLIENT_DELETE_CHARACTER_RESPONSE, - MSG_CLIENT_GAME_MSG, - MSG_CLIENT_CONNECT_CHAT, - MSG_CLIENT_TRANSFER_TO_WORLD, - MSG_CLIENT_IMPENDING_RELOAD_NOTIFY, - MSG_CLIENT_MAKE_GM_RESPONSE, - MSG_CLIENT_HTTP_MONITOR_INFO_RESPONSE, - MSG_CLIENT_SLASH_PUSH_MAP_RESPONSE, - MSG_CLIENT_SLASH_PULL_MAP_RESPONSE, - MSG_CLIENT_SLASH_LOCK_MAP_RESPONSE, - MSG_CLIENT_BLUEPRINT_SAVE_RESPONSE, - MSG_CLIENT_BLUEPRINT_LUP_SAVE_RESPONSE, - MSG_CLIENT_BLUEPRINT_LOAD_RESPONSE_ITEMID, - MSG_CLIENT_BLUEPRINT_GET_ALL_DATA_RESPONSE, - MSG_CLIENT_MODEL_INSTANTIATE_RESPONSE, - MSG_CLIENT_DEBUG_OUTPUT, - MSG_CLIENT_ADD_FRIEND_REQUEST, - MSG_CLIENT_ADD_FRIEND_RESPONSE, - MSG_CLIENT_REMOVE_FRIEND_RESPONSE, - MSG_CLIENT_GET_FRIENDS_LIST_RESPONSE, - MSG_CLIENT_UPDATE_FRIEND_NOTIFY, - MSG_CLIENT_ADD_IGNORE_RESPONSE, - MSG_CLIENT_REMOVE_IGNORE_RESPONSE, - MSG_CLIENT_GET_IGNORE_LIST_RESPONSE, - MSG_CLIENT_TEAM_INVITE, - MSG_CLIENT_TEAM_INVITE_INITIAL_RESPONSE, - MSG_CLIENT_GUILD_CREATE_RESPONSE, - MSG_CLIENT_GUILD_GET_STATUS_RESPONSE, - MSG_CLIENT_GUILD_INVITE, - MSG_CLIENT_GUILD_INVITE_INITIAL_RESPONSE, - MSG_CLIENT_GUILD_INVITE_FINAL_RESPONSE, - MSG_CLIENT_GUILD_INVITE_CONFIRM, - MSG_CLIENT_GUILD_ADD_PLAYER, - MSG_CLIENT_GUILD_REMOVE_PLAYER, - MSG_CLIENT_GUILD_LOGIN_LOGOUT, - MSG_CLIENT_GUILD_RANK_CHANGE, - MSG_CLIENT_GUILD_DATA, - MSG_CLIENT_GUILD_STATUS, - MSG_CLIENT_MAIL, - MSG_CLIENT_DB_PROXY_RESULT, - MSG_CLIENT_SHOW_ALL_RESPONSE, - MSG_CLIENT_WHO_RESPONSE, - MSG_CLIENT_SEND_CANNED_TEXT, - MSG_CLIENT_UPDATE_CHARACTER_NAME, - MSG_CLIENT_SET_NETWORK_SIMULATOR, - MSG_CLIENT_INVALID_CHAT_MESSAGE, - MSG_CLIENT_MINIMUM_CHAT_MODE_RESPONSE, - MSG_CLIENT_MINIMUM_CHAT_MODE_RESPONSE_PRIVATE, - MSG_CLIENT_CHAT_MODERATION_STRING, - MSG_CLIENT_UGC_MANIFEST_RESPONSE, - MSG_CLIENT_IN_LOGIN_QUEUE, - MSG_CLIENT_SERVER_STATES, - MSG_CLIENT_GM_CLOSE_TARGET_CHAT_WINDOW, - MSG_CLIENT_GENERAL_TEXT_FOR_LOCALIZATION, - MSG_CLIENT_UPDATE_FREE_TRIAL_STATUS, - MSG_CLIENT_UGC_DOWNLOAD_FAILED = 120 -}; - -//! Used for packets sent to the master server -enum MASTER { - MSG_MASTER_REQUEST_PERSISTENT_ID = 1, - MSG_MASTER_REQUEST_PERSISTENT_ID_RESPONSE, - MSG_MASTER_REQUEST_ZONE_TRANSFER, - MSG_MASTER_REQUEST_ZONE_TRANSFER_RESPONSE, - MSG_MASTER_SERVER_INFO, - MSG_MASTER_REQUEST_SESSION_KEY, - MSG_MASTER_SET_SESSION_KEY, - MSG_MASTER_SESSION_KEY_RESPONSE, - MSG_MASTER_PLAYER_ADDED, - MSG_MASTER_PLAYER_REMOVED, - - MSG_MASTER_CREATE_PRIVATE_ZONE, - MSG_MASTER_REQUEST_PRIVATE_ZONE, - - MSG_MASTER_WORLD_READY, - MSG_MASTER_PREP_ZONE, - - MSG_MASTER_SHUTDOWN, - MSG_MASTER_SHUTDOWN_RESPONSE, - MSG_MASTER_SHUTDOWN_IMMEDIATE, - - MSG_MASTER_SHUTDOWN_UNIVERSE, - - MSG_MASTER_AFFIRM_TRANSFER_REQUEST, - MSG_MASTER_AFFIRM_TRANSFER_RESPONSE, - - MSG_MASTER_NEW_SESSION_ALERT -}; - -//! The Game messages -enum GAME_MSG : unsigned short { - GAME_MSG_TELEPORT = 19, - GAME_MSG_SET_PLAYER_CONTROL_SCHEME = 26, - GAME_MSG_DROP_CLIENT_LOOT = 30, - GAME_MSG_DIE = 37, - GAME_MSG_REQUEST_DIE = 38, - GAME_MSG_PLAY_EMOTE = 41, - GAME_MSG_PLAY_ANIMATION = 43, - GAME_MSG_CONTROL_BEHAVIOR = 48, - GAME_MSG_SET_NAME = 72, - GAME_MSG_ECHO_START_SKILL = 118, - GAME_MSG_START_SKILL = 119, - GAME_MSG_VERIFY_ACK = 121, - GAME_MSG_ADD_SKILL = 127, - GAME_MSG_REMOVE_SKILL = 128, - GAME_MSG_SET_CURRENCY = 133, - GAME_MSG_PICKUP_CURRENCY = 137, - GAME_MSG_PICKUP_ITEM = 139, - GAME_MSG_TEAM_PICKUP_ITEM = 140, - GAME_MSG_PLAY_FX_EFFECT = 154, - GAME_MSG_STOP_FX_EFFECT = 155, - GAME_MSG_REQUEST_RESURRECT = 159, - GAME_MSG_RESURRECT = 160, - GAME_MSG_PUSH_EQUIPPED_ITEMS_STATE = 191, - GAME_MSG_POP_EQUIPPED_ITEMS_STATE = 192, - GAME_MSG_SET_GM_LEVEL = 193, - GAME_MSG_SET_STUNNED = 198, - GAME_MSG_SET_STUN_IMMUNITY = 200, - GAME_MSG_KNOCKBACK = 202, - GAME_MSG_REBUILD_CANCEL = 209, - GAME_MSG_ENABLE_REBUILD = 213, - GAME_MSG_MOVE_ITEM_IN_INVENTORY = 224, - GAME_MSG_ADD_ITEM_TO_INVENTORY_CLIENT_SYNC = 227, - GAME_MSG_REMOVE_ITEM_FROM_INVENTORY = 230, - GAME_MSG_EQUIP_ITEM = 231, - GAME_MSG_UN_EQUIP_ITEM = 233, - GAME_MSG_OFFER_MISSION = 248, - GAME_MSG_RESPOND_TO_MISSION = 249, - GAME_MSG_NOTIFY_MISSION = 254, - GAME_MSG_NOTIFY_MISSION_TASK = 255, - GAME_MSG_REBUILD_NOTIFY_STATE = 336, - GAME_MSG_TERMINATE_INTERACTION = 357, - GAME_MSG_SERVER_TERMINATE_INTERACTION = 358, - GAME_MSG_REQUEST_USE = 364, - GAME_MSG_VENDOR_OPEN_WINDOW = 369, - GAME_MSG_BUY_FROM_VENDOR = 373, - GAME_MSG_SELL_TO_VENDOR = 374, - GAME_MSG_TEAM_SET_OFF_WORLD_FLAG = 383, - GAME_MSG_SET_INVENTORY_SIZE = 389, - GAME_MSG_ACKNOWLEDGE_POSSESSION = 391, - GAME_MSG_SET_SHOOTING_GALLERY_PARAMS = 400, - GAME_MSG_REQUEST_ACTIVITY_START_STOP = 402, - GAME_MSG_REQUEST_ACTIVITY_ENTER = 403, - GAME_MSG_REQUEST_ACTIVITY_EXIT = 404, - GAME_MSG_ACTIVITY_ENTER = 405, - GAME_MSG_ACTIVITY_EXIT = 406, - GAME_MSG_ACTIVITY_START = 407, - GAME_MSG_ACTIVITY_STOP = 408, - GAME_MSG_SHOOTING_GALLERY_CLIENT_AIM_UPDATE = 409, - GAME_MSG_SHOOTING_GALLERY_FIRE = 411, - GAME_MSG_REQUEST_VENDOR_STATUS_UPDATE = 416, - GAME_MSG_VENDOR_STATUS_UPDATE = 417, - GAME_MSG_NOTIFY_CLIENT_SHOOTING_GALLERY_SCORE = 425, - GAME_MSG_CONSUME_CLIENT_ITEM = 427, - GAME_MSG_CLIENT_ITEM_CONSUMED = 428, - GAME_MSG_UPDATE_SHOOTING_GALLERY_ROTATION = 448, - GAME_MSG_SET_FLAG = 471, - GAME_MSG_NOTIFY_CLIENT_FLAG_CHANGE = 472, - GAME_MSG_VENDOR_TRANSACTION_RESULT = 476, - GAME_MSG_HAS_BEEN_COLLECTED = 486, - GAME_MSG_DISPLAY_CHAT_BUBBLE = 495, - GAME_MSG_SPAWN_PET = 498, - GAME_MSG_DESPAWN_PET = 499, - GAME_MSG_PLAYER_LOADED = 505, - GAME_MSG_PLAYER_READY = 509, - GAME_MSG_REQUEST_LINKED_MISSION = 515, - GAME_MSG_INVALID_ZONE_TRANSFER_LIST = 519, - GAME_MSG_MISSION_DIALOGUE_OK = 520, - GAME_MSG_DISPLAY_MESSAGE_BOX = 529, - GAME_MSG_MESSAGE_BOX_RESPOND = 530, - GAME_MSG_CHOICE_BOX_RESPOND = 531, - GAME_MSG_SMASH = 537, - GAME_MSG_UNSMASH = 538, - GAME_MSG_SET_SHOOTING_GALLERY_RETICULE_EFFECT = 548, - GAME_MSG_PLACE_MODEL_RESPONSE = 0x223, - GAME_MSG_SET_JET_PACK_MODE = 561, - GAME_MSG_REGISTER_PET_ID = 565, - GAME_MSG_REGISTER_PET_DBID = 566, - GAME_MSG_SHOW_ACTIVITY_COUNTDOWN = 568, - GAME_MSG_START_ACTIVITY_TIME = 576, - GAME_MSG_ACTIVITY_PAUSE = 602, - GAME_MSG_USE_NON_EQUIPMENT_ITEM = 603, - GAME_MSG_USE_ITEM_RESULT = 607, - GAME_MSG_COMMAND_PET = 640, - GAME_MSG_PET_RESPONSE = 641, - GAME_MSG_REQUEST_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 648, - GAME_MSG_SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 649, - GAME_MSG_NOTIFY_OBJECT = 656, - GAME_MSG_CLIENT_NOTIFY_PET = 659, - GAME_MSG_NOTIFY_PET = 660, - GAME_MSG_NOTIFY_PET_TAMING_MINIGAME = 661, - GAME_MSG_START_SERVER_PET_MINIGAME_TIMER = 662, - GAME_MSG_CLIENT_EXIT_TAMING_MINIGAME = 663, - GAME_MSG_PET_NAME_CHANGED = 686, - GAME_MSG_PET_TAMING_MINIGAME_RESULT = 667, - GAME_MSG_PET_TAMING_TRY_BUILD_RESULT = 668, - GAME_MSG_NOTIFY_TAMING_BUILD_SUCCESS = 673, - GAME_MSG_NOTIFY_TAMING_MODEL_LOADED_ON_SERVER = 674, - GAME_MSG_ACTIVATE_BUBBLE_BUFF = 678, - GAME_MSG_DEACTIVATE_BUBBLE_BUFF = 679, - GAME_MSG_ADD_PET_TO_PLAYER = 681, - GAME_MSG_REQUEST_SET_PET_NAME = 683, - GAME_MSG_SET_PET_NAME = 684, - GAME_MSG_NOTIFY_PET_TAMING_PUZZLE_SELECTED = 675, - GAME_MSG_SHOW_PET_ACTION_BUTTON = 692, - GAME_MSG_SET_EMOTE_LOCK_STATE = 693, - GAME_MSG_USE_ITEM_REQUIREMENTS_RESPONSE = 703, - GAME_MSG_PLAY_EMBEDDED_EFFECT_ON_ALL_CLIENTS_NEAR_OBJECT = 713, - GAME_MSG_DOWNLOAD_PROPERTY_DATA = 716, - GAME_MSG_QUERY_PROPERTY_DATA = 717, - GAME_MSG_PROPERTY_EDITOR_BEGIN = 724, - GAME_MSG_PROPERTY_EDITOR_END = 725, - GAME_MSG_IS_MINIFIG_IN_A_BUBBLE = 729, - GAME_MSG_START_PATHING = 733, - GAME_MSG_ACTIVATE_BUBBLE_BUFF_FROM_SERVER = 734, - GAME_MSG_DEACTIVATE_BUBBLE_BUFF_FROM_SERVER = 735, - GAME_MSG_NOTIFY_CLIENT_ZONE_OBJECT = 737, - GAME_MSG_UPDATE_REPUTATION = 746, - GAME_MSG_PROPERTY_RENTAL_RESPONSE = 750, - GAME_MSG_REQUEST_PLATFORM_RESYNC = 760, - GAME_MSG_PLATFORM_RESYNC = 761, - GAME_MSG_PLAY_CINEMATIC = 762, - GAME_MSG_END_CINEMATIC = 763, - GAME_MSG_CINEMATIC_UPDATE = 764, - GAME_MSG_TOGGLE_GHOST_REFERENCE_OVERRIDE = 767, - GAME_MSG_SET_GHOST_REFERENCE_POSITION = 768, - GAME_MSG_FIRE_EVENT_SERVER_SIDE = 770, - GAME_MSG_SET_NETWORK_SCRIPT_VAR = 781, - GAME_MSG_UPDATE_MODEL_FROM_CLIENT = 793, - GAME_MSG_DELETE_MODEL_FROM_CLIENT = 794, - GAME_MSG_PLAY_ND_AUDIO_EMITTER = 821, - GAME_MSG_PLAY2_DAMBIENT_SOUND = 831, - GAME_MSG_ENTER_PROPERTY1 = 840, - GAME_MSG_ENTER_PROPERTY2 = 841, - GAME_MSG_PROPERTY_ENTRANCE_SYNC = 842, - GAME_MSG_PROPERTY_SELECT_QUERY = 845, - GAME_MSG_PARSE_CHAT_MESSAGE = 850, - GAME_MSG_BROADCAST_TEXT_TO_CHATBOX = 858, - GAME_MSG_OPEN_PROPERTY_MANAGEMENT = 860, - GAME_MSG_OPEN_PROPERTY_VENDOR = 861, - GAME_MSG_UPDATE_PROPERTY_OR_MODEL_FOR_FILTER_CHECK = 863, - GAME_MSG_CLIENT_TRADE_REQUEST = 868, - GAME_MSG_SERVER_TRADE_REQUEST = 869, - GAME_MSG_SERVER_TRADE_INVITE = 870, - GAME_MSG_CLIENT_TRADE_REPLY = 871, - GAME_MSG_SERVER_TRADE_REPLY = 872, - GAME_MSG_SERVER_TRADE_INITIAL_REPLY = 873, - GAME_MSG_SERVER_TRADE_FINAL_REPLY = 874, - GAME_MSG_CLIENT_TRADE_UPDATE = 875, - GAME_MSG_SERVER_SIDE_TRADE_UPDATE = 876, - GAME_MSG_SERVER_TRADE_UPDATE = 877, - GAME_MSG_CLIENT_TRADE_CANCEL = 878, - GAME_MSG_CLIENT_SIDE_TRADE_CANCEL = 879, - GAME_MSG_CLIENT_TRADE_ACCEPT = 880, - GAME_MSG_SERVER_SIDE_TRADE_ACCEPT = 881, - GAME_MSG_SERVER_SIDE_TRADE_CANCEL = 882, - GAME_MSG_SERVER_TRADE_CANCEL = 883, - GAME_MSG_SERVER_TRADE_ACCEPT = 884, - GAME_MSG_READY_FOR_UPDATES = 888, - GAME_MSG_ORIENT_TO_OBJECT = 905, - GAME_MSG_ORIENT_TO_POSITION = 906, - GAME_MSG_ORIENT_TO_ANGLE = 907, - GAME_MSG_BOUNCER_ACTIVE_STATUS = 942, - GAME_MSG_UN_USE_BBB_MODEL = 999, - GAME_MSG_BBB_LOAD_ITEM_REQUEST = 1000, - GAME_MSG_BBB_SAVE_REQUEST = 1001, - GAME_MSG_BBB_SAVE_RESPONSE = 1006, - GAME_MSG_NOTIFY_CLIENT_OBJECT = 1042, - GAME_MSG_DISPLAY_ZONE_SUMMARY = 1043, - GAME_MSG_ZONE_SUMMARY_DISMISSED = 1044, - GAME_MSG_ACTIVITY_STATE_CHANGE_REQUEST = 1053, - GAME_MSG_MODIFY_PLAYER_ZONE_STATISTIC = 1046, - GAME_MSG_START_BUILDING_WITH_ITEM = 1057, - GAME_MSG_START_ARRANGING_WITH_ITEM = 1061, - GAME_MSG_FINISH_ARRANGING_WITH_ITEM = 1062, - GAME_MSG_DONE_ARRANGING_WITH_ITEM = 1063, - GAME_MSG_SET_BUILD_MODE = 1068, - GAME_MSG_BUILD_MODE_SET = 1069, - GAME_MSG_SET_BUILD_MODE_CONFIRMED = 1073, - GAME_MSG_NOTIFY_CLIENT_FAILED_PRECONDITION = 1081, - GAME_MSG_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1093, - GAME_MSG_MODULAR_BUILD_BEGIN = 1094, - GAME_MSG_MODULAR_BUILD_END = 1095, - GAME_MSG_MODULAR_BUILD_MOVE_AND_EQUIP = 1096, - GAME_MSG_MODULAR_BUILD_FINISH = 1097, - GAME_MSG_REPORT_BUG = 1198, - GAME_MSG_MISSION_DIALOGUE_CANCELLED = 1129, - GAME_MSG_ECHO_SYNC_SKILL = 1144, - GAME_MSG_SYNC_SKILL = 1145, - GAME_MSG_REQUEST_SERVER_PROJECTILE_IMPACT = 1148, - GAME_MSG_DO_CLIENT_PROJECTILE_IMPACT = 1151, - GAME_MSG_MODULAR_BUILD_CONVERT_MODEL = 1155, - GAME_MSG_SET_PLAYER_ALLOWED_RESPAWN = 1165, - GAME_MSG_UI_MESSAGE_SERVER_TO_SINGLE_CLIENT = 1184, - GAME_MSG_UI_MESSAGE_SERVER_TO_ALL_CLIENTS = 1185, - GAME_MSG_PET_TAMING_TRY_BUILD = 1197, - GAME_MSG_REQUEST_SMASH_PLAYER = 1202, - GAME_MSG_FIRE_EVENT_CLIENT_SIDE = 1213, - GAME_MSG_TOGGLE_GM_INVIS = 1218, - GAME_MSG_CHANGE_OBJECT_WORLD_STATE = 1223, - GAME_MSG_VEHICLE_LOCK_INPUT = 1230, - GAME_MSG_VEHICLE_UNLOCK_INPUT = 1231, - GAME_MSG_RACING_RESET_PLAYER_TO_LAST_RESET = 1252, - GAME_MSG_RACING_SERVER_SET_PLAYER_LAP_AND_PLANE = 1253, - GAME_MSG_RACING_SET_PLAYER_RESET_INFO = 1254, - GAME_MSG_RACING_PLAYER_INFO_RESET_FINISHED = 1255, - GAME_MSG_LOCK_NODE_ROTATION = 1260, - GAME_MSG_VEHICLE_SET_WHEEL_LOCK_STATE = 1273, - GAME_MSG_NOTIFY_VEHICLE_OF_RACING_OBJECT = 1276, - GAME_MSG_SET_NAME_BILLBOARD_STATE = 1284, - GAME_MSG_PLAYER_REACHED_RESPAWN_CHECKPOINT = 1296, - GAME_MSG_HANDLE_UGC_EQUIP_POST_DELETE_BASED_ON_EDIT_MODE = 1300, - GAME_MSG_HANDLE_UGC_EQUIP_PRE_CREATE_BASED_ON_EDIT_MODE = 1301, - GAME_MSG_PROPERTY_CONTENTS_FROM_CLIENT = 1305, - GAME_MSG_GET_MODELS_ON_PROPERTY = 1306, - GAME_MSG_MATCH_REQUEST = 1308, - GAME_MSG_MATCH_RESPONSE = 1309, - GAME_MSG_MATCH_UPDATE = 1310, - GAME_MSG_MODULE_ASSEMBLY_DB_DATA_FOR_CLIENT = 1131, - GAME_MSG_MODULE_ASSEMBLY_QUERY_DATA = 1132, - GAME_MSG_SHOW_BILLBOARD_INTERACT_ICON = 1337, - GAME_MSG_CHANGE_IDLE_FLAGS = 1338, - GAME_MSG_VEHICLE_ADD_PASSIVE_BOOST_ACTION = 1340, - GAME_MSG_VEHICLE_REMOVE_PASSIVE_BOOST_ACTION = 1341, - GAME_MSG_VEHICLE_NOTIFY_SERVER_ADD_PASSIVE_BOOST_ACTION = 1342, - GAME_MSG_VEHICLE_NOTIFY_SERVER_REMOVE_PASSIVE_BOOST_ACTION = 1343, - GAME_MSG_VEHICLE_ADD_SLOWDOWN_ACTION = 1344, - GAME_MSG_VEHICLE_REMOVE_SLOWDOWN_ACTION = 1345, - GAME_MSG_VEHICLE_NOTIFY_SERVER_ADD_SLOWDOWN_ACTION = 1346, - GAME_MSG_VEHICLE_NOTIFY_SERVER_REMOVE_SLOWDOWN_ACTION = 1347, - GAME_MSG_BUYBACK_FROM_VENDOR = 1350, - GAME_MSG_SET_PROPERTY_ACCESS = 1366, - GAME_MSG_ZONE_PROPERTY_MODEL_PLACED = 1369, - GAME_MSG_ZONE_PROPERTY_MODEL_ROTATED = 1370, - GAME_MSG_ZONE_PROPERTY_MODEL_REMOVED_WHILE_EQUIPPED = 1371, - GAME_MSG_ZONE_PROPERTY_MODEL_EQUIPPED = 1372, - GAME_MSG_ZONE_PROPERTY_MODEL_PICKED_UP = 1373, - GAME_MSG_ZONE_PROPERTY_MODEL_REMOVED = 1374, - GAME_MSG_NOTIFY_RACING_CLIENT = 1390, - GAME_MSG_RACING_PLAYER_HACK_CAR = 1391, - GAME_MSG_RACING_PLAYER_LOADED = 1392, - GAME_MSG_RACING_CLIENT_READY = 1393, - GAME_MSG_UPDATE_CHAT_MODE = 1395, - GAME_MSG_VEHICLE_NOTIFY_FINISHED_RACE = 1396, - GAME_MSG_SET_CONSUMABLE_ITEM = 1409, - GAME_MSG_SET_STATUS_IMMUNITY = 1435, - GAME_MSG_SET_PET_NAME_MODERATED = 1448, - GAME_MSG_MODIFY_LEGO_SCORE = 1459, - GAME_MSG_RESTORE_TO_POST_LOAD_STATS = 1468, - GAME_MSG_SET_RAIL_MOVEMENT = 1471, - GAME_MSG_START_RAIL_MOVEMENT = 1472, - GAME_MSG_CANCEL_RAIL_MOVEMENT = 1474, - GAME_MSG_CLIENT_RAIL_MOVEMENT_READY = 1476, - GAME_MSG_PLAYER_RAIL_ARRIVED_NOTIFICATION = 1477, - GAME_MSG_UPDATE_PLAYER_STATISTIC = 1481, - GAME_MSG_MODULAR_ASSEMBLY_NIF_COMPLETED = 1498, - GAME_MSG_NOTIFY_NOT_ENOUGH_INV_SPACE = 1516, - GAME_MSG_TEAM_SET_LEADER = 0x0615, - GAME_MSG_TEAM_INVITE_CONFIRM = 0x0616, - GAME_MSG_TEAM_GET_STATUS_RESPONSE = 0x0617, - GAME_MSG_TEAM_ADD_PLAYER = 0x061a, - GAME_MSG_TEAM_REMOVE_PLAYER = 0x061b, - GAME_MSG_START_CELEBRATION_EFFECT = 1618, - GAME_MSG_ADD_BUFF = 1647, - GAME_MSG_SERVER_DONE_LOADING_ALL_OBJECTS = 1642, - GAME_MSG_PLACE_PROPERTY_MODEL = 1170, - GAME_MSG_VEHICLE_NOTIFY_HIT_IMAGINATION_SERVER = 1606, - GAME_MSG_ADD_RUN_SPEED_MODIFIER = 1505, - GAME_MSG_HANDLE_HOT_PROPERTY_DATA = 1511, - GAME_MSG_SEND_HOT_PROPERTY_DATA = 1510, - GAME_MSG_REMOVE_RUN_SPEED_MODIFIER = 1506, - GAME_MSG_UPDATE_PROPERTY_PERFORMANCE_COST = 1547, - GAME_MSG_PROPERTY_ENTRANCE_BEGIN = 1553, - GAME_MSG_SET_RESURRECT_RESTORE_VALUES = 1591, - GAME_MSG_VEHICLE_STOP_BOOST = 1617, - GAME_MSG_REMOVE_BUFF = 1648, - GAME_MSG_REQUEST_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1666, - GAME_MSG_RESPONSE_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1667, - GAME_MSG_PLAYER_SET_CAMERA_CYCLING_MODE = 1676, - GAME_MSG_SET_MOUNT_INVENTORY_ID = 1726, - GAME_MSG_NOTIFY_SERVER_LEVEL_PROCESSING_COMPLETE = 1734, - GAME_MSG_NOTIFY_LEVEL_REWARDS = 1735, - GAME_MSG_DISMOUNT_COMPLETE = 1756, - GAME_MSG_MARK_INVENTORY_ITEM_AS_ACTIVE = 1767, - END -}; diff --git a/dCommon/dEnums/eAuthMessageType.h b/dCommon/dEnums/eAuthMessageType.h new file mode 100644 index 00000000..ecc17a37 --- /dev/null +++ b/dCommon/dEnums/eAuthMessageType.h @@ -0,0 +1,15 @@ +#ifndef __EAUTHMESSAGETYPE__H__ +#define __EAUTHMESSAGETYPE__H__ + +#include + +enum class eAuthMessageType : uint32_t { + LOGIN_REQUEST = 0, + LOGOUT_REQUEST, + CREATE_NEW_ACCOUNT_REQUEST, + LEGOINTERFACE_AUTH_RESPONSE, + SESSIONKEY_RECEIVED_CONFIRM, + RUNTIME_CONFIG +}; + +#endif //!__EAUTHMESSAGETYPE__H__ diff --git a/dCommon/dEnums/eChatInternalMessageType.h b/dCommon/dEnums/eChatInternalMessageType.h new file mode 100644 index 00000000..d3b7020b --- /dev/null +++ b/dCommon/dEnums/eChatInternalMessageType.h @@ -0,0 +1,31 @@ +#ifndef __ECHATINTERNALMESSAGETYPE__H__ +#define __ECHATINTERNALMESSAGETYPE__H__ + +#include + +enum eChatInternalMessageType : uint32_t { + PLAYER_ADDED_NOTIFICATION = 0, + PLAYER_REMOVED_NOTIFICATION, + ADD_FRIEND, + ADD_BEST_FRIEND, + ADD_TO_TEAM, + ADD_BLOCK, + REMOVE_FRIEND, + REMOVE_BLOCK, + REMOVE_FROM_TEAM, + DELETE_TEAM, + REPORT, + PRIVATE_CHAT, + PRIVATE_CHAT_RESPONSE, + ANNOUNCEMENT, + MAIL_COUNT_UPDATE, + MAIL_SEND_NOTIFY, + REQUEST_USER_LIST, + FRIEND_LIST, + ROUTE_TO_PLAYER, + TEAM_UPDATE, + MUTE_UPDATE, + CREATE_TEAM, +}; + +#endif //!__ECHATINTERNALMESSAGETYPE__H__ diff --git a/dCommon/dEnums/eChatMessageType.h b/dCommon/dEnums/eChatMessageType.h new file mode 100644 index 00000000..52895ba3 --- /dev/null +++ b/dCommon/dEnums/eChatMessageType.h @@ -0,0 +1,78 @@ +#ifndef __ECHATMESSAGETYPE__H__ +#define __ECHATMESSAGETYPE__H__ + +#include + +//! The Internal Chat Packet Identifiers +enum class eChatMessageType :uint32_t { + LOGIN_SESSION_NOTIFY = 0, + GENERAL_CHAT_MESSAGE, + PRIVATE_CHAT_MESSAGE, + USER_CHANNEL_CHAT_MESSAGE, + WORLD_DISCONNECT_REQUEST, + WORLD_PROXIMITY_RESPONSE, + WORLD_PARCEL_RESPONSE, + ADD_FRIEND_REQUEST, + ADD_FRIEND_RESPONSE, + REMOVE_FRIEND, + GET_FRIENDS_LIST, + ADD_IGNORE, + REMOVE_IGNORE, + GET_IGNORE_LIST, + TEAM_MISSED_INVITE_CHECK, + TEAM_INVITE, + TEAM_INVITE_RESPONSE, + TEAM_KICK, + TEAM_LEAVE, + TEAM_SET_LOOT, + TEAM_SET_LEADER, + TEAM_GET_STATUS, + GUILD_CREATE, + GUILD_INVITE, + GUILD_INVITE_RESPONSE, + GUILD_LEAVE, + GUILD_KICK, + GUILD_GET_STATUS, + GUILD_GET_ALL, + SHOW_ALL, + BLUEPRINT_MODERATED, + BLUEPRINT_MODEL_READY, + PROPERTY_READY_FOR_APPROVAL, + PROPERTY_MODERATION_CHANGED, + PROPERTY_BUILDMODE_CHANGED, + PROPERTY_BUILDMODE_CHANGED_REPORT, + MAIL, + WORLD_INSTANCE_LOCATION_REQUEST, + REPUTATION_UPDATE, + SEND_CANNED_TEXT, + GMLEVEL_UPDATE, + CHARACTER_NAME_CHANGE_REQUEST, + CSR_REQUEST, + CSR_REPLY, + GM_KICK, + GM_ANNOUNCE, + GM_MUTE, + ACTIVITY_UPDATE, + WORLD_ROUTE_PACKET, + GET_ZONE_POPULATIONS, + REQUEST_MINIMUM_CHAT_MODE, + REQUEST_MINIMUM_CHAT_MODE_PRIVATE, + MATCH_REQUEST, + UGCMANIFEST_REPORT_MISSING_FILE, + UGCMANIFEST_REPORT_DONE_FILE, + UGCMANIFEST_REPORT_DONE_BLUEPRINT, + UGCC_REQUEST, + WHO, + WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE, + ACHIEVEMENT_NOTIFY, + GM_CLOSE_PRIVATE_CHAT_WINDOW, + UNEXPECTED_DISCONNECT, + PLAYER_READY, + GET_DONATION_TOTAL, + UPDATE_DONATION, + PRG_CSR_COMMAND, + HEARTBEAT_REQUEST_FROM_WORLD, + UPDATE_FREE_TRIAL_STATUS +}; + +#endif //!__ECHATMESSAGETYPE__H__ diff --git a/dCommon/dEnums/eClientMessageType.h b/dCommon/dEnums/eClientMessageType.h new file mode 100644 index 00000000..aafccc36 --- /dev/null +++ b/dCommon/dEnums/eClientMessageType.h @@ -0,0 +1,76 @@ +#ifndef __ECLIENTMESSAGETYPE__H__ +#define __ECLIENTMESSAGETYPE__H__ + +#include + +enum class eClientMessageType : uint32_t { + LOGIN_RESPONSE = 0, + LOGOUT_RESPONSE, + LOAD_STATIC_ZONE, + CREATE_OBJECT, + CREATE_CHARACTER, + CREATE_CHARACTER_EXTENDED, + CHARACTER_LIST_RESPONSE, + CHARACTER_CREATE_RESPONSE, + CHARACTER_RENAME_RESPONSE, + CHAT_CONNECT_RESPONSE, + AUTH_ACCOUNT_CREATE_RESPONSE, + DELETE_CHARACTER_RESPONSE, + GAME_MSG, + CONNECT_CHAT, + TRANSFER_TO_WORLD, + IMPENDING_RELOAD_NOTIFY, + MAKE_GM_RESPONSE, + HTTP_MONITOR_INFO_RESPONSE, + SLASH_PUSH_MAP_RESPONSE, + SLASH_PULL_MAP_RESPONSE, + SLASH_LOCK_MAP_RESPONSE, + BLUEPRINT_SAVE_RESPONSE, + BLUEPRINT_LUP_SAVE_RESPONSE, + BLUEPRINT_LOAD_RESPONSE_ITEMID, + BLUEPRINT_GET_ALL_DATA_RESPONSE, + MODEL_INSTANTIATE_RESPONSE, + DEBUG_OUTPUT, + ADD_FRIEND_REQUEST, + ADD_FRIEND_RESPONSE, + REMOVE_FRIEND_RESPONSE, + GET_FRIENDS_LIST_RESPONSE, + UPDATE_FRIEND_NOTIFY, + ADD_IGNORE_RESPONSE, + REMOVE_IGNORE_RESPONSE, + GET_IGNORE_LIST_RESPONSE, + TEAM_INVITE, + TEAM_INVITE_INITIAL_RESPONSE, + GUILD_CREATE_RESPONSE, + GUILD_GET_STATUS_RESPONSE, + GUILD_INVITE, + GUILD_INVITE_INITIAL_RESPONSE, + GUILD_INVITE_FINAL_RESPONSE, + GUILD_INVITE_CONFIRM, + GUILD_ADD_PLAYER, + GUILD_REMOVE_PLAYER, + GUILD_LOGIN_LOGOUT, + GUILD_RANK_CHANGE, + GUILD_DATA, + GUILD_STATUS, + MAIL, + DB_PROXY_RESULT, + SHOW_ALL_RESPONSE, + WHO_RESPONSE, + SEND_CANNED_TEXT, + UPDATE_CHARACTER_NAME, + SET_NETWORK_SIMULATOR, + INVALID_CHAT_MESSAGE, + MINIMUM_CHAT_MODE_RESPONSE, + MINIMUM_CHAT_MODE_RESPONSE_PRIVATE, + CHAT_MODERATION_STRING, + UGC_MANIFEST_RESPONSE, + IN_LOGIN_QUEUE, + SERVER_STATES, + GM_CLOSE_TARGET_CHAT_WINDOW, + GENERAL_TEXT_FOR_LOCALIZATION, + UPDATE_FREE_TRIAL_STATUS, + UGC_DOWNLOAD_FAILED = 120 +}; + +#endif //!__ECLIENTMESSAGETYPE__H__ diff --git a/dCommon/dEnums/eConnectionType.h b/dCommon/dEnums/eConnectionType.h new file mode 100644 index 00000000..ce1ff90c --- /dev/null +++ b/dCommon/dEnums/eConnectionType.h @@ -0,0 +1,14 @@ +#ifndef __ECONNECTIONTYPE__H__ +#define __ECONNECTIONTYPE__H__ + +enum class eConnectionType : uint16_t { + SERVER = 0, + AUTH, + CHAT, + CHAT_INTERNAL, + WORLD, + CLIENT, + MASTER +}; + +#endif //!__ECONNECTIONTYPE__H__ diff --git a/dCommon/dEnums/eGameMessageType.h b/dCommon/dEnums/eGameMessageType.h new file mode 100644 index 00000000..247ee5e2 --- /dev/null +++ b/dCommon/dEnums/eGameMessageType.h @@ -0,0 +1,303 @@ +#ifndef __EGAMEMESSAGETYPE__H__ +#define __EGAMEMESSAGETYPE__H__ + +#include + +enum class eGameMessageType : uint16_t { + TELEPORT = 19, + SET_PLAYER_CONTROL_SCHEME = 26, + DROP_CLIENT_LOOT = 30, + DIE = 37, + REQUEST_DIE = 38, + PLAY_EMOTE = 41, + PLAY_ANIMATION = 43, + CONTROL_BEHAVIOR = 48, + SET_NAME = 72, + ECHO_START_SKILL = 118, + START_SKILL = 119, + VERIFY_ACK = 121, + ADD_SKILL = 127, + REMOVE_SKILL = 128, + SET_CURRENCY = 133, + PICKUP_CURRENCY = 137, + PICKUP_ITEM = 139, + TEAM_PICKUP_ITEM = 140, + PLAY_FX_EFFECT = 154, + STOP_FX_EFFECT = 155, + REQUEST_RESURRECT = 159, + RESURRECT = 160, + PUSH_EQUIPPED_ITEMS_STATE = 191, + POP_EQUIPPED_ITEMS_STATE = 192, + SET_GM_LEVEL = 193, + SET_STUNNED = 198, + SET_STUN_IMMUNITY = 200, + KNOCKBACK = 202, + REBUILD_CANCEL = 209, + ENABLE_REBUILD = 213, + MOVE_ITEM_IN_INVENTORY = 224, + ADD_ITEM_TO_INVENTORY_CLIENT_SYNC = 227, + REMOVE_ITEM_FROM_INVENTORY = 230, + EQUIP_ITEM = 231, + UN_EQUIP_ITEM = 233, + OFFER_MISSION = 248, + RESPOND_TO_MISSION = 249, + NOTIFY_MISSION = 254, + NOTIFY_MISSION_TASK = 255, + REBUILD_NOTIFY_STATE = 336, + TERMINATE_INTERACTION = 357, + SERVER_TERMINATE_INTERACTION = 358, + REQUEST_USE = 364, + VENDOR_OPEN_WINDOW = 369, + BUY_FROM_VENDOR = 373, + SELL_TO_VENDOR = 374, + TEAM_SET_OFF_WORLD_FLAG = 383, + SET_INVENTORY_SIZE = 389, + ACKNOWLEDGE_POSSESSION = 391, + SET_SHOOTING_GALLERY_PARAMS = 400, + REQUEST_ACTIVITY_START_STOP = 402, + REQUEST_ACTIVITY_ENTER = 403, + REQUEST_ACTIVITY_EXIT = 404, + ACTIVITY_ENTER = 405, + ACTIVITY_EXIT = 406, + ACTIVITY_START = 407, + ACTIVITY_STOP = 408, + SHOOTING_GALLERY_CLIENT_AIM_UPDATE = 409, + SHOOTING_GALLERY_FIRE = 411, + REQUEST_VENDOR_STATUS_UPDATE = 416, + VENDOR_STATUS_UPDATE = 417, + NOTIFY_CLIENT_SHOOTING_GALLERY_SCORE = 425, + CONSUME_CLIENT_ITEM = 427, + CLIENT_ITEM_CONSUMED = 428, + UPDATE_SHOOTING_GALLERY_ROTATION = 448, + SET_FLAG = 471, + NOTIFY_CLIENT_FLAG_CHANGE = 472, + VENDOR_TRANSACTION_RESULT = 476, + HAS_BEEN_COLLECTED = 486, + DISPLAY_CHAT_BUBBLE = 495, + SPAWN_PET = 498, + DESPAWN_PET = 499, + PLAYER_LOADED = 505, + PLAYER_READY = 509, + REQUEST_LINKED_MISSION = 515, + INVALID_ZONE_TRANSFER_LIST = 519, + MISSION_DIALOGUE_OK = 520, + DISPLAY_MESSAGE_BOX = 529, + MESSAGE_BOX_RESPOND = 530, + CHOICE_BOX_RESPOND = 531, + SMASH = 537, + UNSMASH = 538, + PLACE_MODEL_RESPONSE = 547, + SET_SHOOTING_GALLERY_RETICULE_EFFECT = 548, + SET_JET_PACK_MODE = 561, + REGISTER_PET_ID = 565, + REGISTER_PET_DBID = 566, + SHOW_ACTIVITY_COUNTDOWN = 568, + START_ACTIVITY_TIME = 576, + ACTIVITY_PAUSE = 602, + USE_NON_EQUIPMENT_ITEM = 603, + USE_ITEM_RESULT = 607, + COMMAND_PET = 640, + PET_RESPONSE = 641, + REQUEST_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 648, + SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 649, + NOTIFY_OBJECT = 656, + CLIENT_NOTIFY_PET = 659, + NOTIFY_PET = 660, + NOTIFY_PET_TAMING_MINIGAME = 661, + START_SERVER_PET_MINIGAME_TIMER = 662, + CLIENT_EXIT_TAMING_MINIGAME = 663, + PET_NAME_CHANGED = 686, + PET_TAMING_MINIGAME_RESULT = 667, + PET_TAMING_TRY_BUILD_RESULT = 668, + NOTIFY_TAMING_BUILD_SUCCESS = 673, + NOTIFY_TAMING_MODEL_LOADED_ON_SERVER = 674, + ACTIVATE_BUBBLE_BUFF = 678, + DEACTIVATE_BUBBLE_BUFF = 679, + ADD_PET_TO_PLAYER = 681, + REQUEST_SET_PET_NAME = 683, + SET_PET_NAME = 684, + NOTIFY_PET_TAMING_PUZZLE_SELECTED = 675, + SHOW_PET_ACTION_BUTTON = 692, + SET_EMOTE_LOCK_STATE = 693, + USE_ITEM_REQUIREMENTS_RESPONSE = 703, + PLAY_EMBEDDED_EFFECT_ON_ALL_CLIENTS_NEAR_OBJECT = 713, + DOWNLOAD_PROPERTY_DATA = 716, + QUERY_PROPERTY_DATA = 717, + PROPERTY_EDITOR_BEGIN = 724, + PROPERTY_EDITOR_END = 725, + IS_MINIFIG_IN_A_BUBBLE = 729, + START_PATHING = 733, + ACTIVATE_BUBBLE_BUFF_FROM_SERVER = 734, + DEACTIVATE_BUBBLE_BUFF_FROM_SERVER = 735, + NOTIFY_CLIENT_ZONE_OBJECT = 737, + UPDATE_REPUTATION = 746, + PROPERTY_RENTAL_RESPONSE = 750, + REQUEST_PLATFORM_RESYNC = 760, + PLATFORM_RESYNC = 761, + PLAY_CINEMATIC = 762, + END_CINEMATIC = 763, + CINEMATIC_UPDATE = 764, + TOGGLE_GHOST_REFERENCE_OVERRIDE = 767, + SET_GHOST_REFERENCE_POSITION = 768, + FIRE_EVENT_SERVER_SIDE = 770, + SET_NETWORK_SCRIPT_VAR = 781, + UPDATE_MODEL_FROM_CLIENT = 793, + DELETE_MODEL_FROM_CLIENT = 794, + PLAY_ND_AUDIO_EMITTER = 821, + PLAY2_DAMBIENT_SOUND = 831, + ENTER_PROPERTY1 = 840, + ENTER_PROPERTY2 = 841, + PROPERTY_ENTRANCE_SYNC = 842, + PROPERTY_SELECT_QUERY = 845, + PARSE_CHAT_MESSAGE = 850, + BROADCAST_TEXT_TO_CHATBOX = 858, + OPEN_PROPERTY_MANAGEMENT = 860, + OPEN_PROPERTY_VENDOR = 861, + UPDATE_PROPERTY_OR_MODEL_FOR_FILTER_CHECK = 863, + CLIENT_TRADE_REQUEST = 868, + SERVER_TRADE_REQUEST = 869, + SERVER_TRADE_INVITE = 870, + CLIENT_TRADE_REPLY = 871, + SERVER_TRADE_REPLY = 872, + SERVER_TRADE_INITIAL_REPLY = 873, + SERVER_TRADE_FINAL_REPLY = 874, + CLIENT_TRADE_UPDATE = 875, + SERVER_SIDE_TRADE_UPDATE = 876, + SERVER_TRADE_UPDATE = 877, + CLIENT_TRADE_CANCEL = 878, + CLIENT_SIDE_TRADE_CANCEL = 879, + CLIENT_TRADE_ACCEPT = 880, + SERVER_SIDE_TRADE_ACCEPT = 881, + SERVER_SIDE_TRADE_CANCEL = 882, + SERVER_TRADE_CANCEL = 883, + SERVER_TRADE_ACCEPT = 884, + READY_FOR_UPDATES = 888, + ORIENT_TO_OBJECT = 905, + ORIENT_TO_POSITION = 906, + ORIENT_TO_ANGLE = 907, + BOUNCER_ACTIVE_STATUS = 942, + UN_USE_BBB_MODEL = 999, + BBB_LOAD_ITEM_REQUEST = 1000, + BBB_SAVE_REQUEST = 1001, + BBB_SAVE_RESPONSE = 1006, + NOTIFY_CLIENT_OBJECT = 1042, + DISPLAY_ZONE_SUMMARY = 1043, + ZONE_SUMMARY_DISMISSED = 1044, + ACTIVITY_STATE_CHANGE_REQUEST = 1053, + MODIFY_PLAYER_ZONE_STATISTIC = 1046, + START_BUILDING_WITH_ITEM = 1057, + START_ARRANGING_WITH_ITEM = 1061, + FINISH_ARRANGING_WITH_ITEM = 1062, + DONE_ARRANGING_WITH_ITEM = 1063, + SET_BUILD_MODE = 1068, + BUILD_MODE_SET = 1069, + SET_BUILD_MODE_CONFIRMED = 1073, + NOTIFY_CLIENT_FAILED_PRECONDITION = 1081, + MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1093, + MODULAR_BUILD_BEGIN = 1094, + MODULAR_BUILD_END = 1095, + MODULAR_BUILD_MOVE_AND_EQUIP = 1096, + MODULAR_BUILD_FINISH = 1097, + REPORT_BUG = 1198, + MISSION_DIALOGUE_CANCELLED = 1129, + ECHO_SYNC_SKILL = 1144, + SYNC_SKILL = 1145, + REQUEST_SERVER_PROJECTILE_IMPACT = 1148, + DO_CLIENT_PROJECTILE_IMPACT = 1151, + MODULAR_BUILD_CONVERT_MODEL = 1155, + SET_PLAYER_ALLOWED_RESPAWN = 1165, + UI_MESSAGE_SERVER_TO_SINGLE_CLIENT = 1184, + UI_MESSAGE_SERVER_TO_ALL_CLIENTS = 1185, + PET_TAMING_TRY_BUILD = 1197, + REQUEST_SMASH_PLAYER = 1202, + FIRE_EVENT_CLIENT_SIDE = 1213, + TOGGLE_GM_INVIS = 1218, + CHANGE_OBJECT_WORLD_STATE = 1223, + VEHICLE_LOCK_INPUT = 1230, + VEHICLE_UNLOCK_INPUT = 1231, + RACING_RESET_PLAYER_TO_LAST_RESET = 1252, + RACING_SERVER_SET_PLAYER_LAP_AND_PLANE = 1253, + RACING_SET_PLAYER_RESET_INFO = 1254, + RACING_PLAYER_INFO_RESET_FINISHED = 1255, + LOCK_NODE_ROTATION = 1260, + VEHICLE_SET_WHEEL_LOCK_STATE = 1273, + NOTIFY_VEHICLE_OF_RACING_OBJECT = 1276, + SET_NAME_BILLBOARD_STATE = 1284, + PLAYER_REACHED_RESPAWN_CHECKPOINT = 1296, + HANDLE_UGC_EQUIP_POST_DELETE_BASED_ON_EDIT_MODE = 1300, + HANDLE_UGC_EQUIP_PRE_CREATE_BASED_ON_EDIT_MODE = 1301, + PROPERTY_CONTENTS_FROM_CLIENT = 1305, + GET_MODELS_ON_PROPERTY = 1306, + MATCH_REQUEST = 1308, + MATCH_RESPONSE = 1309, + MATCH_UPDATE = 1310, + MODULE_ASSEMBLY_DB_DATA_FOR_CLIENT = 1131, + MODULE_ASSEMBLY_QUERY_DATA = 1132, + SHOW_BILLBOARD_INTERACT_ICON = 1337, + CHANGE_IDLE_FLAGS = 1338, + VEHICLE_ADD_PASSIVE_BOOST_ACTION = 1340, + VEHICLE_REMOVE_PASSIVE_BOOST_ACTION = 1341, + VEHICLE_NOTIFY_SERVER_ADD_PASSIVE_BOOST_ACTION = 1342, + VEHICLE_NOTIFY_SERVER_REMOVE_PASSIVE_BOOST_ACTION = 1343, + VEHICLE_ADD_SLOWDOWN_ACTION = 1344, + VEHICLE_REMOVE_SLOWDOWN_ACTION = 1345, + VEHICLE_NOTIFY_SERVER_ADD_SLOWDOWN_ACTION = 1346, + VEHICLE_NOTIFY_SERVER_REMOVE_SLOWDOWN_ACTION = 1347, + BUYBACK_FROM_VENDOR = 1350, + SET_PROPERTY_ACCESS = 1366, + ZONE_PROPERTY_MODEL_PLACED = 1369, + ZONE_PROPERTY_MODEL_ROTATED = 1370, + ZONE_PROPERTY_MODEL_REMOVED_WHILE_EQUIPPED = 1371, + ZONE_PROPERTY_MODEL_EQUIPPED = 1372, + ZONE_PROPERTY_MODEL_PICKED_UP = 1373, + ZONE_PROPERTY_MODEL_REMOVED = 1374, + NOTIFY_RACING_CLIENT = 1390, + RACING_PLAYER_HACK_CAR = 1391, + RACING_PLAYER_LOADED = 1392, + RACING_CLIENT_READY = 1393, + UPDATE_CHAT_MODE = 1395, + VEHICLE_NOTIFY_FINISHED_RACE = 1396, + SET_CONSUMABLE_ITEM = 1409, + SET_STATUS_IMMUNITY = 1435, + SET_PET_NAME_MODERATED = 1448, + MODIFY_LEGO_SCORE = 1459, + RESTORE_TO_POST_LOAD_STATS = 1468, + SET_RAIL_MOVEMENT = 1471, + START_RAIL_MOVEMENT = 1472, + CANCEL_RAIL_MOVEMENT = 1474, + CLIENT_RAIL_MOVEMENT_READY = 1476, + PLAYER_RAIL_ARRIVED_NOTIFICATION = 1477, + UPDATE_PLAYER_STATISTIC = 1481, + MODULAR_ASSEMBLY_NIF_COMPLETED = 1498, + NOTIFY_NOT_ENOUGH_INV_SPACE = 1516, + TEAM_SET_LEADER = 1557, + TEAM_INVITE_CONFIRM = 1558, + TEAM_GET_STATUS_RESPONSE = 1559, + TEAM_ADD_PLAYER = 1526, + TEAM_REMOVE_PLAYER = 1563, + START_CELEBRATION_EFFECT = 1618, + ADD_BUFF = 1647, + SERVER_DONE_LOADING_ALL_OBJECTS = 1642, + PLACE_PROPERTY_MODEL = 1170, + VEHICLE_NOTIFY_HIT_IMAGINATION_SERVER = 1606, + ADD_RUN_SPEED_MODIFIER = 1505, + HANDLE_HOT_PROPERTY_DATA = 1511, + SEND_HOT_PROPERTY_DATA = 1510, + REMOVE_RUN_SPEED_MODIFIER = 1506, + UPDATE_PROPERTY_PERFORMANCE_COST = 1547, + PROPERTY_ENTRANCE_BEGIN = 1553, + SET_RESURRECT_RESTORE_VALUES = 1591, + VEHICLE_STOP_BOOST = 1617, + REMOVE_BUFF = 1648, + REQUEST_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1666, + RESPONSE_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1667, + PLAYER_SET_CAMERA_CYCLING_MODE = 1676, + SET_MOUNT_INVENTORY_ID = 1726, + NOTIFY_SERVER_LEVEL_PROCESSING_COMPLETE = 1734, + NOTIFY_LEVEL_REWARDS = 1735, + DISMOUNT_COMPLETE = 1756, + MARK_INVENTORY_ITEM_AS_ACTIVE = 1767, + END +}; + +#endif //!__EGAMEMESSAGETYPE__H__ diff --git a/dCommon/dEnums/eMasterMessageType.h b/dCommon/dEnums/eMasterMessageType.h new file mode 100644 index 00000000..5c867d70 --- /dev/null +++ b/dCommon/dEnums/eMasterMessageType.h @@ -0,0 +1,36 @@ +#ifndef __EMASTERMESSAGETYPE__H__ +#define __EMASTERMESSAGETYPE__H__ + +#include + +enum class eMasterMessageType : uint32_t { + REQUEST_PERSISTENT_ID = 1, + REQUEST_PERSISTENT_ID_RESPONSE, + REQUEST_ZONE_TRANSFER, + REQUEST_ZONE_TRANSFER_RESPONSE, + SERVER_INFO, + REQUEST_SESSION_KEY, + SET_SESSION_KEY, + SESSION_KEY_RESPONSE, + PLAYER_ADDED, + PLAYER_REMOVED, + + CREATE_PRIVATE_ZONE, + REQUEST_PRIVATE_ZONE, + + WORLD_READY, + PREP_ZONE, + + SHUTDOWN, + SHUTDOWN_RESPONSE, + SHUTDOWN_IMMEDIATE, + + SHUTDOWN_UNIVERSE, + + AFFIRM_TRANSFER_REQUEST, + AFFIRM_TRANSFER_RESPONSE, + + NEW_SESSION_ALERT +}; + +#endif //!__EMASTERMESSAGETYPE__H__ diff --git a/dCommon/dEnums/eServerMessageType.h b/dCommon/dEnums/eServerMessageType.h new file mode 100644 index 00000000..7f211ffb --- /dev/null +++ b/dCommon/dEnums/eServerMessageType.h @@ -0,0 +1,12 @@ +#ifndef __ESERVERMESSAGETYPE__H__ +#define __ESERVERMESSAGETYPE__H__ + +#include +//! The Internal Server Packet Identifiers +enum class eServerMessageType : uint32_t { + VERSION_CONFIRM = 0, + DISCONNECT_NOTIFY, + GENERAL_NOTIFY +}; + +#endif //!__ESERVERMESSAGETYPE__H__ diff --git a/dCommon/dEnums/eWorldMessageType.h b/dCommon/dEnums/eWorldMessageType.h new file mode 100644 index 00000000..2a65fd98 --- /dev/null +++ b/dCommon/dEnums/eWorldMessageType.h @@ -0,0 +1,42 @@ +#ifndef __EWORLDMESSAGETYPE__H__ +#define __EWORLDMESSAGETYPE__H__ + +#include + +enum class eWorldMessageType : uint32_t { + VALIDATION = 1, // Session info + CHARACTER_LIST_REQUEST, + CHARACTER_CREATE_REQUEST, + LOGIN_REQUEST, // Character selected + GAME_MSG, + CHARACTER_DELETE_REQUEST, + CHARACTER_RENAME_REQUEST, + HAPPY_FLOWER_MODE_NOTIFY, + SLASH_RELOAD_MAP, // Reload map cmp + SLASH_PUSH_MAP_REQUEST, // Push map req cmd + SLASH_PUSH_MAP, // Push map cmd + SLASH_PULL_MAP, // Pull map cmd + LOCK_MAP_REQUEST, + GENERAL_CHAT_MESSAGE, // General chat message + HTTP_MONITOR_INFO_REQUEST, + SLASH_DEBUG_SCRIPTS, // Debug scripts cmd + MODELS_CLEAR, + EXHIBIT_INSERT_MODEL, + LEVEL_LOAD_COMPLETE, // Character data request + TMP_GUILD_CREATE, + ROUTE_PACKET, // Social? + POSITION_UPDATE, + MAIL, + WORD_CHECK, // Whitelist word check + STRING_CHECK, // Whitelist string check + GET_PLAYERS_IN_ZONE, + REQUEST_UGC_MANIFEST_INFO, + BLUEPRINT_GET_ALL_DATA_REQUEST, + CANCEL_MAP_QUEUE, + HANDLE_FUNNESS, + FAKE_PRG_CSR_MESSAGE, + REQUEST_FREE_TRIAL_REFRESH, + GM_SET_FREE_TRIAL_STATUS +}; + +#endif //!__EWORLDMESSAGETYPE__H__ diff --git a/dGame/UserManager.cpp b/dGame/UserManager.cpp index d57caa67..0161395c 100644 --- a/dGame/UserManager.cpp +++ b/dGame/UserManager.cpp @@ -22,11 +22,12 @@ #include "SkillComponent.h" #include "AssetManager.h" #include "CDClientDatabase.h" -#include "dMessageIdentifiers.h" #include "eObjectBits.h" #include "eGameMasterLevel.h" #include "eCharacterCreationResponse.h" #include "eRenameResponse.h" +#include "eConnectionType.h" +#include "eChatInternalMessageType.h" UserManager* UserManager::m_Address = nullptr; @@ -422,7 +423,7 @@ void UserManager::DeleteCharacter(const SystemAddress& sysAddr, Packet* packet) stmt->execute(); delete stmt; CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION); bitStream.Write(objectID); Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false); } diff --git a/dGame/dBehaviors/BehaviorContext.cpp b/dGame/dBehaviors/BehaviorContext.cpp index d0cb68e4..c7db4208 100644 --- a/dGame/dBehaviors/BehaviorContext.cpp +++ b/dGame/dBehaviors/BehaviorContext.cpp @@ -10,12 +10,12 @@ #include -#include "dMessageIdentifiers.h" #include "DestroyableComponent.h" #include "EchoSyncSkill.h" #include "PhantomPhysicsComponent.h" #include "RebuildComponent.h" #include "eReplicaComponentType.h" +#include "eConnectionType.h" BehaviorSyncEntry::BehaviorSyncEntry() { } @@ -253,7 +253,7 @@ bool BehaviorContext::CalculateUpdate(const float deltaTime) { // Write message RakNet::BitStream message; - PacketUtils::WriteHeader(message, CLIENT, MSG_CLIENT_GAME_MSG); + PacketUtils::WriteHeader(message, eConnectionType::CLIENT, eClientMessageType::GAME_MSG); message.Write(this->originator); echo.Serialize(&message); diff --git a/dGame/dComponents/ModuleAssemblyComponent.h b/dGame/dComponents/ModuleAssemblyComponent.h index c6e217ed..39670c9a 100644 --- a/dGame/dComponents/ModuleAssemblyComponent.h +++ b/dGame/dComponents/ModuleAssemblyComponent.h @@ -14,7 +14,7 @@ class ModuleAssemblyComponent : public Component { public: static const eReplicaComponentType ComponentType = eReplicaComponentType::MODULE_ASSEMBLY; - ModuleAssemblyComponent(Entity* MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION); + ModuleAssemblyComponent(Entity* parent); ~ModuleAssemblyComponent() override; void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags); diff --git a/dGame/dComponents/RocketLaunchpadControlComponent.cpp b/dGame/dComponents/RocketLaunchpadControlComponent.cpp index 6cc5e2bc..3cac9e42 100644 --- a/dGame/dComponents/RocketLaunchpadControlComponent.cpp +++ b/dGame/dComponents/RocketLaunchpadControlComponent.cpp @@ -15,9 +15,10 @@ #include "PropertyEntranceComponent.h" #include "RocketLaunchLupComponent.h" #include "dServer.h" -#include "dMessageIdentifiers.h" #include "PacketUtils.h" #include "eObjectWorldState.h" +#include "eConnectionType.h" +#include "eMasterMessageType.h" RocketLaunchpadControlComponent::RocketLaunchpadControlComponent(Entity* parent, int rocketId) : Component(parent) { auto query = CDClientDatabase::CreatePreppedStmt( @@ -136,7 +137,7 @@ LWOCLONEID RocketLaunchpadControlComponent::GetSelectedCloneId(LWOOBJID player) void RocketLaunchpadControlComponent::TellMasterToPrepZone(int zoneID) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_PREP_ZONE); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::PREP_ZONE); bitStream.Write(zoneID); Game::server->SendToMaster(&bitStream); } diff --git a/dGame/dComponents/ScriptedActivityComponent.cpp b/dGame/dComponents/ScriptedActivityComponent.cpp index f998d686..eb4ab761 100644 --- a/dGame/dComponents/ScriptedActivityComponent.cpp +++ b/dGame/dComponents/ScriptedActivityComponent.cpp @@ -18,10 +18,11 @@ #include "dConfig.h" #include "InventoryComponent.h" #include "DestroyableComponent.h" -#include "dMessageIdentifiers.h" #include "Loot.h" #include "eMissionTaskType.h" #include "eMatchUpdate.h" +#include "eConnectionType.h" +#include "eChatInternalMessageType.h" #include "CDCurrencyTableTable.h" #include "CDActivityRewardsTable.h" @@ -517,7 +518,7 @@ void ActivityInstance::StartZone() { // only make a team if we have more than one participant if (participants.size() > 1) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_CREATE_TEAM); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::CREATE_TEAM); bitStream.Write(leader->GetObjectID()); bitStream.Write(m_Participants.size()); diff --git a/dGame/dComponents/SkillComponent.cpp b/dGame/dComponents/SkillComponent.cpp index dc7c16bd..c2f07425 100644 --- a/dGame/dComponents/SkillComponent.cpp +++ b/dGame/dComponents/SkillComponent.cpp @@ -20,11 +20,11 @@ #include "ScriptComponent.h" #include "BuffComponent.h" #include "EchoStartSkill.h" -#include "dMessageIdentifiers.h" #include "DoClientProjectileImpact.h" #include "CDClientManager.h" - #include "CDSkillBehaviorTable.h" +#include "eConnectionType.h" +#include "eClientMessageType.h" ProjectileSyncEntry::ProjectileSyncEntry() { } @@ -304,7 +304,7 @@ SkillExecutionResult SkillComponent::CalculateBehavior(const uint32_t skillId, c // Write message RakNet::BitStream message; - PacketUtils::WriteHeader(message, CLIENT, MSG_CLIENT_GAME_MSG); + PacketUtils::WriteHeader(message, eConnectionType::CLIENT, eClientMessageType::GAME_MSG); message.Write(this->m_Parent->GetObjectID()); start.Serialize(&message); @@ -437,7 +437,7 @@ void SkillComponent::SyncProjectileCalculation(const ProjectileSyncEntry& entry) RakNet::BitStream message; - PacketUtils::WriteHeader(message, CLIENT, MSG_CLIENT_GAME_MSG); + PacketUtils::WriteHeader(message, eConnectionType::CLIENT, eClientMessageType::GAME_MSG); message.Write(this->m_Parent->GetObjectID()); projectileImpact.Serialize(&message); diff --git a/dGame/dGameMessages/DoClientProjectileImpact.h b/dGame/dGameMessages/DoClientProjectileImpact.h index 436e3dd2..6b381aa5 100644 --- a/dGame/dGameMessages/DoClientProjectileImpact.h +++ b/dGame/dGameMessages/DoClientProjectileImpact.h @@ -1,13 +1,10 @@ #ifndef __DOCLIENTPROJECTILEIMPACT__H__ #define __DOCLIENTPROJECTILEIMPACT__H__ -#include "dMessageIdentifiers.h" #include "dCommonVars.h" /* Tell a client local projectile to impact */ class DoClientProjectileImpact { - static const GAME_MSG MsgID = GAME_MSG_DO_CLIENT_PROJECTILE_IMPACT; - public: DoClientProjectileImpact() { i64OrgID = LWOOBJID_EMPTY; @@ -30,7 +27,7 @@ public: } void Serialize(RakNet::BitStream* stream) { - stream->Write(MsgID); + stream->Write(eGameMessageType::DO_CLIENT_PROJECTILE_IMPACT); stream->Write(i64OrgID != LWOOBJID_EMPTY); if (i64OrgID != LWOOBJID_EMPTY) stream->Write(i64OrgID); diff --git a/dGame/dGameMessages/EchoStartSkill.h b/dGame/dGameMessages/EchoStartSkill.h index 6d912798..f5dee816 100644 --- a/dGame/dGameMessages/EchoStartSkill.h +++ b/dGame/dGameMessages/EchoStartSkill.h @@ -2,14 +2,12 @@ #define __ECHOSTARTSKILL__H__ #include "dCommonVars.h" -#include "dMessageIdentifiers.h" #include "NiPoint3.h" #include "NiQuaternion.h" +#include "eGameMessageType.h" /* Same as start skill but with different network options. An echo down to other clients that need to play the skill. */ class EchoStartSkill { - static const GAME_MSG MsgID = GAME_MSG_ECHO_START_SKILL; - public: EchoStartSkill() { bUsedMouse = false; @@ -42,7 +40,7 @@ public: } void Serialize(RakNet::BitStream* stream) { - stream->Write(MsgID); + stream->Write(eGameMessageType::ECHO_START_SKILL); stream->Write(bUsedMouse); diff --git a/dGame/dGameMessages/EchoSyncSkill.h b/dGame/dGameMessages/EchoSyncSkill.h index b56beae8..ab5a3f2b 100644 --- a/dGame/dGameMessages/EchoSyncSkill.h +++ b/dGame/dGameMessages/EchoSyncSkill.h @@ -4,13 +4,11 @@ #include #include "BitStream.h" +#include "eGameMessageType.h" -#include "dMessageIdentifiers.h" /* Message to synchronize a skill cast */ class EchoSyncSkill { - static const GAME_MSG MsgID = GAME_MSG_ECHO_SYNC_SKILL; - public: EchoSyncSkill() { bDone = false; @@ -31,7 +29,7 @@ public: } void Serialize(RakNet::BitStream* stream) { - stream->Write(MsgID); + stream->Write(eGameMessageType::ECHO_SYNC_SKILL); stream->Write(bDone); uint32_t sBitStreamLength = sBitStream.length(); diff --git a/dGame/dGameMessages/GameMessageHandler.cpp b/dGame/dGameMessages/GameMessageHandler.cpp index c0893a09..50c7876b 100644 --- a/dGame/dGameMessages/GameMessageHandler.cpp +++ b/dGame/dGameMessages/GameMessageHandler.cpp @@ -33,10 +33,11 @@ #include "EchoSyncSkill.h" #include "eMissionTaskType.h" #include "eReplicaComponentType.h" +#include "eConnectionType.h" using namespace std; -void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const SystemAddress& sysAddr, LWOOBJID objectID, GAME_MSG messageID) { +void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const SystemAddress& sysAddr, LWOOBJID objectID, eGameMessageType messageID) { CBITSTREAM; @@ -53,54 +54,54 @@ void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const System switch (messageID) { - case GAME_MSG_UN_USE_BBB_MODEL: { + case eGameMessageType::UN_USE_BBB_MODEL: { GameMessages::HandleUnUseModel(inStream, entity, sysAddr); break; } - case GAME_MSG_PLAY_EMOTE: { + case eGameMessageType::PLAY_EMOTE: { GameMessages::HandlePlayEmote(inStream, entity); break; } - case GAME_MSG_MOVE_ITEM_IN_INVENTORY: { + case eGameMessageType::MOVE_ITEM_IN_INVENTORY: { GameMessages::HandleMoveItemInInventory(inStream, entity); break; } - case GAME_MSG_REMOVE_ITEM_FROM_INVENTORY: { + case eGameMessageType::REMOVE_ITEM_FROM_INVENTORY: { GameMessages::HandleRemoveItemFromInventory(inStream, entity, sysAddr); break; } - case GAME_MSG_EQUIP_ITEM: + case eGameMessageType::EQUIP_ITEM: GameMessages::HandleEquipItem(inStream, entity); break; - case GAME_MSG_UN_EQUIP_ITEM: + case eGameMessageType::UN_EQUIP_ITEM: GameMessages::HandleUnequipItem(inStream, entity); break; - case GAME_MSG_RESPOND_TO_MISSION: { + case eGameMessageType::RESPOND_TO_MISSION: { GameMessages::HandleRespondToMission(inStream, entity); break; } - case GAME_MSG_REQUEST_USE: { + case eGameMessageType::REQUEST_USE: { GameMessages::HandleRequestUse(inStream, entity, sysAddr); break; } - case GAME_MSG_SET_FLAG: { + case eGameMessageType::SET_FLAG: { GameMessages::HandleSetFlag(inStream, entity); break; } - case GAME_MSG_HAS_BEEN_COLLECTED: { + case eGameMessageType::HAS_BEEN_COLLECTED: { GameMessages::HandleHasBeenCollected(inStream, entity); break; } - case GAME_MSG_PLAYER_LOADED: { + case eGameMessageType::PLAYER_LOADED: { GameMessages::SendRestoreToPostLoadStats(entity, sysAddr); entity->SetPlayerReadyForUpdates(); @@ -174,73 +175,73 @@ void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const System break; } - case GAME_MSG_REQUEST_LINKED_MISSION: { + case eGameMessageType::REQUEST_LINKED_MISSION: { GameMessages::HandleRequestLinkedMission(inStream, entity); break; } - case GAME_MSG_MISSION_DIALOGUE_OK: { + case eGameMessageType::MISSION_DIALOGUE_OK: { GameMessages::HandleMissionDialogOK(inStream, entity); break; } - case GAME_MSG_MISSION_DIALOGUE_CANCELLED: { + case eGameMessageType::MISSION_DIALOGUE_CANCELLED: { //This message is pointless for our implementation, as the client just carries on after //rejecting a mission offer. We dont need to do anything. This is just here to remove a warning in our logs :) break; } - case GAME_MSG_REQUEST_PLATFORM_RESYNC: { + case eGameMessageType::REQUEST_PLATFORM_RESYNC: { GameMessages::HandleRequestPlatformResync(inStream, entity, sysAddr); break; } - case GAME_MSG_FIRE_EVENT_SERVER_SIDE: { + case eGameMessageType::FIRE_EVENT_SERVER_SIDE: { GameMessages::HandleFireEventServerSide(inStream, entity, sysAddr); break; } - case GAME_MSG_SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA: { + case eGameMessageType::SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA: { GameMessages::HandleActivitySummaryLeaderboardData(inStream, entity, sysAddr); break; } - case GAME_MSG_REQUEST_ACTIVITY_SUMMARY_LEADERBOARD_DATA: { + case eGameMessageType::REQUEST_ACTIVITY_SUMMARY_LEADERBOARD_DATA: { GameMessages::HandleRequestActivitySummaryLeaderboardData(inStream, entity, sysAddr); break; } - case GAME_MSG_ACTIVITY_STATE_CHANGE_REQUEST: { + case eGameMessageType::ACTIVITY_STATE_CHANGE_REQUEST: { GameMessages::HandleActivityStateChangeRequest(inStream, entity); break; } - case GAME_MSG_PARSE_CHAT_MESSAGE: { + case eGameMessageType::PARSE_CHAT_MESSAGE: { GameMessages::HandleParseChatMessage(inStream, entity, sysAddr); break; } - case GAME_MSG_NOTIFY_SERVER_LEVEL_PROCESSING_COMPLETE: { + case eGameMessageType::NOTIFY_SERVER_LEVEL_PROCESSING_COMPLETE: { GameMessages::HandleNotifyServerLevelProcessingComplete(inStream, entity); break; } - case GAME_MSG_PICKUP_CURRENCY: { + case eGameMessageType::PICKUP_CURRENCY: { GameMessages::HandlePickupCurrency(inStream, entity); break; } - case GAME_MSG_PICKUP_ITEM: { + case eGameMessageType::PICKUP_ITEM: { GameMessages::HandlePickupItem(inStream, entity); break; } - case GAME_MSG_RESURRECT: { + case eGameMessageType::RESURRECT: { GameMessages::HandleResurrect(inStream, entity); break; } - case GAME_MSG_REQUEST_RESURRECT: { + case eGameMessageType::REQUEST_RESURRECT: { GameMessages::SendResurrect(entity); /*auto* dest = static_cast(entity->GetComponent(eReplicaComponentType::DESTROYABLE)); if (dest) { @@ -251,12 +252,12 @@ void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const System }*/ break; } - case GAME_MSG_HANDLE_HOT_PROPERTY_DATA: { + case eGameMessageType::HANDLE_HOT_PROPERTY_DATA: { GameMessages::HandleGetHotPropertyData(inStream, entity, sysAddr); break; } - case GAME_MSG_REQUEST_SERVER_PROJECTILE_IMPACT: + case eGameMessageType::REQUEST_SERVER_PROJECTILE_IMPACT: { auto message = RequestServerProjectileImpact(); @@ -275,7 +276,7 @@ void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const System break; } - case GAME_MSG_START_SKILL: { + case eGameMessageType::START_SKILL: { StartSkill startSkill = StartSkill(); startSkill.Deserialize(inStream); // inStream replaces &bitStream @@ -313,7 +314,7 @@ void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const System if (success) { //Broadcast our startSkill: RakNet::BitStream bitStreamLocal; - PacketUtils::WriteHeader(bitStreamLocal, CLIENT, MSG_CLIENT_GAME_MSG); + PacketUtils::WriteHeader(bitStreamLocal, eConnectionType::CLIENT, eClientMessageType::GAME_MSG); bitStreamLocal.Write(entity->GetObjectID()); EchoStartSkill echoStartSkill; @@ -333,11 +334,11 @@ void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const System } } break; - case GAME_MSG_SYNC_SKILL: { + case eGameMessageType::SYNC_SKILL: { RakNet::BitStream bitStreamLocal; - PacketUtils::WriteHeader(bitStreamLocal, CLIENT, MSG_CLIENT_GAME_MSG); + PacketUtils::WriteHeader(bitStreamLocal, eConnectionType::CLIENT, eClientMessageType::GAME_MSG); bitStreamLocal.Write(entity->GetObjectID()); - //bitStreamLocal.Write((unsigned short)GAME_MSG_ECHO_SYNC_SKILL); + //bitStreamLocal.Write((unsigned short)eGameMessageType::ECHO_SYNC_SKILL); //bitStreamLocal.Write(inStream); SyncSkill sync = SyncSkill(inStream); // inStream replaced &bitStream @@ -374,306 +375,306 @@ void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const System Game::server->Send(&bitStreamLocal, sysAddr, true); } break; - case GAME_MSG_REQUEST_SMASH_PLAYER: + case eGameMessageType::REQUEST_SMASH_PLAYER: entity->Smash(entity->GetObjectID()); break; - case GAME_MSG_MOVE_ITEM_BETWEEN_INVENTORY_TYPES: + case eGameMessageType::MOVE_ITEM_BETWEEN_INVENTORY_TYPES: GameMessages::HandleMoveItemBetweenInventoryTypes(inStream, entity, sysAddr); break; - case GAME_MSG_MODULAR_BUILD_FINISH: + case eGameMessageType::MODULAR_BUILD_FINISH: GameMessages::HandleModularBuildFinish(inStream, entity, sysAddr); break; - case GAME_MSG_PUSH_EQUIPPED_ITEMS_STATE: + case eGameMessageType::PUSH_EQUIPPED_ITEMS_STATE: GameMessages::HandlePushEquippedItemsState(inStream, entity); break; - case GAME_MSG_POP_EQUIPPED_ITEMS_STATE: + case eGameMessageType::POP_EQUIPPED_ITEMS_STATE: GameMessages::HandlePopEquippedItemsState(inStream, entity); break; - case GAME_MSG_BUY_FROM_VENDOR: + case eGameMessageType::BUY_FROM_VENDOR: GameMessages::HandleBuyFromVendor(inStream, entity, sysAddr); break; - case GAME_MSG_SELL_TO_VENDOR: + case eGameMessageType::SELL_TO_VENDOR: GameMessages::HandleSellToVendor(inStream, entity, sysAddr); break; - case GAME_MSG_BUYBACK_FROM_VENDOR: + case eGameMessageType::BUYBACK_FROM_VENDOR: GameMessages::HandleBuybackFromVendor(inStream, entity, sysAddr); break; - case GAME_MSG_MODULAR_BUILD_MOVE_AND_EQUIP: + case eGameMessageType::MODULAR_BUILD_MOVE_AND_EQUIP: GameMessages::HandleModularBuildMoveAndEquip(inStream, entity, sysAddr); break; - case GAME_MSG_DONE_ARRANGING_WITH_ITEM: + case eGameMessageType::DONE_ARRANGING_WITH_ITEM: GameMessages::HandleDoneArrangingWithItem(inStream, entity, sysAddr); break; - case GAME_MSG_MODULAR_BUILD_CONVERT_MODEL: + case eGameMessageType::MODULAR_BUILD_CONVERT_MODEL: GameMessages::HandleModularBuildConvertModel(inStream, entity, sysAddr); break; - case GAME_MSG_BUILD_MODE_SET: + case eGameMessageType::BUILD_MODE_SET: GameMessages::HandleBuildModeSet(inStream, entity); break; - case GAME_MSG_REBUILD_CANCEL: + case eGameMessageType::REBUILD_CANCEL: GameMessages::HandleRebuildCancel(inStream, entity); break; - case GAME_MSG_MATCH_REQUEST: + case eGameMessageType::MATCH_REQUEST: GameMessages::HandleMatchRequest(inStream, entity); break; - case GAME_MSG_USE_NON_EQUIPMENT_ITEM: + case eGameMessageType::USE_NON_EQUIPMENT_ITEM: GameMessages::HandleUseNonEquipmentItem(inStream, entity); break; - case GAME_MSG_CLIENT_ITEM_CONSUMED: + case eGameMessageType::CLIENT_ITEM_CONSUMED: GameMessages::HandleClientItemConsumed(inStream, entity); break; - case GAME_MSG_SET_CONSUMABLE_ITEM: + case eGameMessageType::SET_CONSUMABLE_ITEM: GameMessages::HandleSetConsumableItem(inStream, entity, sysAddr); break; - case GAME_MSG_VERIFY_ACK: + case eGameMessageType::VERIFY_ACK: GameMessages::HandleVerifyAck(inStream, entity, sysAddr); break; // Trading - case GAME_MSG_CLIENT_TRADE_REQUEST: + case eGameMessageType::CLIENT_TRADE_REQUEST: GameMessages::HandleClientTradeRequest(inStream, entity, sysAddr); break; - case GAME_MSG_CLIENT_TRADE_CANCEL: + case eGameMessageType::CLIENT_TRADE_CANCEL: GameMessages::HandleClientTradeCancel(inStream, entity, sysAddr); break; - case GAME_MSG_CLIENT_TRADE_ACCEPT: + case eGameMessageType::CLIENT_TRADE_ACCEPT: GameMessages::HandleClientTradeAccept(inStream, entity, sysAddr); break; - case GAME_MSG_CLIENT_TRADE_UPDATE: + case eGameMessageType::CLIENT_TRADE_UPDATE: GameMessages::HandleClientTradeUpdate(inStream, entity, sysAddr); break; // Pets - case GAME_MSG_PET_TAMING_TRY_BUILD: + case eGameMessageType::PET_TAMING_TRY_BUILD: GameMessages::HandlePetTamingTryBuild(inStream, entity, sysAddr); break; - case GAME_MSG_NOTIFY_TAMING_BUILD_SUCCESS: + case eGameMessageType::NOTIFY_TAMING_BUILD_SUCCESS: GameMessages::HandleNotifyTamingBuildSuccess(inStream, entity, sysAddr); break; - case GAME_MSG_REQUEST_SET_PET_NAME: + case eGameMessageType::REQUEST_SET_PET_NAME: GameMessages::HandleRequestSetPetName(inStream, entity, sysAddr); break; - case GAME_MSG_START_SERVER_PET_MINIGAME_TIMER: + case eGameMessageType::START_SERVER_PET_MINIGAME_TIMER: GameMessages::HandleStartServerPetMinigameTimer(inStream, entity, sysAddr); break; - case GAME_MSG_CLIENT_EXIT_TAMING_MINIGAME: + case eGameMessageType::CLIENT_EXIT_TAMING_MINIGAME: GameMessages::HandleClientExitTamingMinigame(inStream, entity, sysAddr); break; - case GAME_MSG_COMMAND_PET: + case eGameMessageType::COMMAND_PET: GameMessages::HandleCommandPet(inStream, entity, sysAddr); break; - case GAME_MSG_DESPAWN_PET: + case eGameMessageType::DESPAWN_PET: GameMessages::HandleDespawnPet(inStream, entity, sysAddr); break; - case GAME_MSG_MESSAGE_BOX_RESPOND: + case eGameMessageType::MESSAGE_BOX_RESPOND: GameMessages::HandleMessageBoxResponse(inStream, entity, sysAddr); break; - case GAME_MSG_CHOICE_BOX_RESPOND: + case eGameMessageType::CHOICE_BOX_RESPOND: GameMessages::HandleChoiceBoxRespond(inStream, entity, sysAddr); break; // Property - case GAME_MSG_QUERY_PROPERTY_DATA: + case eGameMessageType::QUERY_PROPERTY_DATA: GameMessages::HandleQueryPropertyData(inStream, entity, sysAddr); break; - case GAME_MSG_START_BUILDING_WITH_ITEM: + case eGameMessageType::START_BUILDING_WITH_ITEM: GameMessages::HandleStartBuildingWithItem(inStream, entity, sysAddr); break; - case GAME_MSG_SET_BUILD_MODE: + case eGameMessageType::SET_BUILD_MODE: GameMessages::HandleSetBuildMode(inStream, entity, sysAddr); break; - case GAME_MSG_PROPERTY_EDITOR_BEGIN: + case eGameMessageType::PROPERTY_EDITOR_BEGIN: GameMessages::HandlePropertyEditorBegin(inStream, entity, sysAddr); break; - case GAME_MSG_PROPERTY_EDITOR_END: + case eGameMessageType::PROPERTY_EDITOR_END: GameMessages::HandlePropertyEditorEnd(inStream, entity, sysAddr); break; - case GAME_MSG_PROPERTY_CONTENTS_FROM_CLIENT: + case eGameMessageType::PROPERTY_CONTENTS_FROM_CLIENT: GameMessages::HandlePropertyContentsFromClient(inStream, entity, sysAddr); break; - case GAME_MSG_ZONE_PROPERTY_MODEL_EQUIPPED: + case eGameMessageType::ZONE_PROPERTY_MODEL_EQUIPPED: GameMessages::HandlePropertyModelEquipped(inStream, entity, sysAddr); break; - case GAME_MSG_PLACE_PROPERTY_MODEL: + case eGameMessageType::PLACE_PROPERTY_MODEL: GameMessages::HandlePlacePropertyModel(inStream, entity, sysAddr); break; - case GAME_MSG_UPDATE_MODEL_FROM_CLIENT: + case eGameMessageType::UPDATE_MODEL_FROM_CLIENT: GameMessages::HandleUpdatePropertyModel(inStream, entity, sysAddr); break; - case GAME_MSG_DELETE_MODEL_FROM_CLIENT: + case eGameMessageType::DELETE_MODEL_FROM_CLIENT: GameMessages::HandleDeletePropertyModel(inStream, entity, sysAddr); break; - case GAME_MSG_BBB_LOAD_ITEM_REQUEST: + case eGameMessageType::BBB_LOAD_ITEM_REQUEST: GameMessages::HandleBBBLoadItemRequest(inStream, entity, sysAddr); break; - case GAME_MSG_BBB_SAVE_REQUEST: + case eGameMessageType::BBB_SAVE_REQUEST: GameMessages::HandleBBBSaveRequest(inStream, entity, sysAddr); break; - case GAME_MSG_CONTROL_BEHAVIOR: + case eGameMessageType::CONTROL_BEHAVIOR: GameMessages::HandleControlBehaviors(inStream, entity, sysAddr); break; - case GAME_MSG_PROPERTY_ENTRANCE_SYNC: + case eGameMessageType::PROPERTY_ENTRANCE_SYNC: GameMessages::HandlePropertyEntranceSync(inStream, entity, sysAddr); break; - case GAME_MSG_ENTER_PROPERTY1: + case eGameMessageType::ENTER_PROPERTY1: GameMessages::HandleEnterProperty(inStream, entity, sysAddr); break; - case GAME_MSG_ZONE_PROPERTY_MODEL_ROTATED: + case eGameMessageType::ZONE_PROPERTY_MODEL_ROTATED: EntityManager::Instance()->GetZoneControlEntity()->OnZonePropertyModelRotated(usr->GetLastUsedChar()->GetEntity()); break; - case GAME_MSG_UPDATE_PROPERTY_OR_MODEL_FOR_FILTER_CHECK: + case eGameMessageType::UPDATE_PROPERTY_OR_MODEL_FOR_FILTER_CHECK: GameMessages::HandleUpdatePropertyOrModelForFilterCheck(inStream, entity, sysAddr); break; - case GAME_MSG_SET_PROPERTY_ACCESS: + case eGameMessageType::SET_PROPERTY_ACCESS: GameMessages::HandleSetPropertyAccess(inStream, entity, sysAddr); break; // Racing - case GAME_MSG_MODULE_ASSEMBLY_QUERY_DATA: + case eGameMessageType::MODULE_ASSEMBLY_QUERY_DATA: GameMessages::HandleModuleAssemblyQueryData(inStream, entity, sysAddr); break; - case GAME_MSG_ACKNOWLEDGE_POSSESSION: + case eGameMessageType::ACKNOWLEDGE_POSSESSION: GameMessages::HandleAcknowledgePossession(inStream, entity, sysAddr); break; - case GAME_MSG_VEHICLE_SET_WHEEL_LOCK_STATE: + case eGameMessageType::VEHICLE_SET_WHEEL_LOCK_STATE: GameMessages::HandleVehicleSetWheelLockState(inStream, entity, sysAddr); break; - case GAME_MSG_MODULAR_ASSEMBLY_NIF_COMPLETED: + case eGameMessageType::MODULAR_ASSEMBLY_NIF_COMPLETED: GameMessages::HandleModularAssemblyNIFCompleted(inStream, entity, sysAddr); break; - case GAME_MSG_RACING_CLIENT_READY: + case eGameMessageType::RACING_CLIENT_READY: GameMessages::HandleRacingClientReady(inStream, entity, sysAddr); break; - case GAME_MSG_REQUEST_DIE: + case eGameMessageType::REQUEST_DIE: GameMessages::HandleRequestDie(inStream, entity, sysAddr); break; - case GAME_MSG_VEHICLE_NOTIFY_SERVER_ADD_PASSIVE_BOOST_ACTION: + case eGameMessageType::VEHICLE_NOTIFY_SERVER_ADD_PASSIVE_BOOST_ACTION: GameMessages::HandleVehicleNotifyServerAddPassiveBoostAction(inStream, entity, sysAddr); break; - case GAME_MSG_VEHICLE_NOTIFY_SERVER_REMOVE_PASSIVE_BOOST_ACTION: + case eGameMessageType::VEHICLE_NOTIFY_SERVER_REMOVE_PASSIVE_BOOST_ACTION: GameMessages::HandleVehicleNotifyServerRemovePassiveBoostAction(inStream, entity, sysAddr); break; - case GAME_MSG_RACING_PLAYER_INFO_RESET_FINISHED: + case eGameMessageType::RACING_PLAYER_INFO_RESET_FINISHED: GameMessages::HandleRacingPlayerInfoResetFinished(inStream, entity, sysAddr); break; - case GAME_MSG_VEHICLE_NOTIFY_HIT_IMAGINATION_SERVER: + case eGameMessageType::VEHICLE_NOTIFY_HIT_IMAGINATION_SERVER: GameMessages::HandleVehicleNotifyHitImaginationServer(inStream, entity, sysAddr); break; - case GAME_MSG_UPDATE_PROPERTY_PERFORMANCE_COST: + case eGameMessageType::UPDATE_PROPERTY_PERFORMANCE_COST: GameMessages::HandleUpdatePropertyPerformanceCost(inStream, entity, sysAddr); break; // SG - case GAME_MSG_UPDATE_SHOOTING_GALLERY_ROTATION: + case eGameMessageType::UPDATE_SHOOTING_GALLERY_ROTATION: GameMessages::HandleUpdateShootingGalleryRotation(inStream, entity, sysAddr); break; // NT - case GAME_MSG_REQUEST_MOVE_ITEM_BETWEEN_INVENTORY_TYPES: + case eGameMessageType::REQUEST_MOVE_ITEM_BETWEEN_INVENTORY_TYPES: GameMessages::HandleRequestMoveItemBetweenInventoryTypes(inStream, entity, sysAddr); break; - case GAME_MSG_TOGGLE_GHOST_REFERENCE_OVERRIDE: + case eGameMessageType::TOGGLE_GHOST_REFERENCE_OVERRIDE: GameMessages::HandleToggleGhostReferenceOverride(inStream, entity, sysAddr); break; - case GAME_MSG_SET_GHOST_REFERENCE_POSITION: + case eGameMessageType::SET_GHOST_REFERENCE_POSITION: GameMessages::HandleSetGhostReferencePosition(inStream, entity, sysAddr); break; - case GAME_MSG_READY_FOR_UPDATES: + case eGameMessageType::READY_FOR_UPDATES: //We don't really care about this message, as it's simply here to inform us that the client is done loading an object. //In the event we _do_ send an update to an object that hasn't finished loading, the client will handle it anyway. break; - case GAME_MSG_REPORT_BUG: + case eGameMessageType::REPORT_BUG: GameMessages::HandleReportBug(inStream, entity); break; - case GAME_MSG_CLIENT_RAIL_MOVEMENT_READY: + case eGameMessageType::CLIENT_RAIL_MOVEMENT_READY: GameMessages::HandleClientRailMovementReady(inStream, entity, sysAddr); break; - case GAME_MSG_CANCEL_RAIL_MOVEMENT: + case eGameMessageType::CANCEL_RAIL_MOVEMENT: GameMessages::HandleCancelRailMovement(inStream, entity, sysAddr); break; - case GAME_MSG_PLAYER_RAIL_ARRIVED_NOTIFICATION: + case eGameMessageType::PLAYER_RAIL_ARRIVED_NOTIFICATION: GameMessages::HandlePlayerRailArrivedNotification(inStream, entity, sysAddr); break; - case GAME_MSG_CINEMATIC_UPDATE: + case eGameMessageType::CINEMATIC_UPDATE: GameMessages::HandleCinematicUpdate(inStream, entity, sysAddr); break; - case GAME_MSG_MODIFY_PLAYER_ZONE_STATISTIC: + case eGameMessageType::MODIFY_PLAYER_ZONE_STATISTIC: GameMessages::HandleModifyPlayerZoneStatistic(inStream, entity); break; - case GAME_MSG_UPDATE_PLAYER_STATISTIC: + case eGameMessageType::UPDATE_PLAYER_STATISTIC: GameMessages::HandleUpdatePlayerStatistic(inStream, entity); break; - case GAME_MSG_DISMOUNT_COMPLETE: + case eGameMessageType::DISMOUNT_COMPLETE: GameMessages::HandleDismountComplete(inStream, entity, sysAddr); break; - case GAME_MSG_DEACTIVATE_BUBBLE_BUFF: + case eGameMessageType::DEACTIVATE_BUBBLE_BUFF: GameMessages::HandleDeactivateBubbleBuff(inStream, entity); break; - case GAME_MSG_ACTIVATE_BUBBLE_BUFF: + case eGameMessageType::ACTIVATE_BUBBLE_BUFF: GameMessages::HandleActivateBubbleBuff(inStream, entity); break; - case GAME_MSG_ZONE_SUMMARY_DISMISSED: + case eGameMessageType::ZONE_SUMMARY_DISMISSED: GameMessages::HandleZoneSummaryDismissed(inStream, entity); break; default: diff --git a/dGame/dGameMessages/GameMessageHandler.h b/dGame/dGameMessages/GameMessageHandler.h index 063e97f6..8b6685cb 100644 --- a/dGame/dGameMessages/GameMessageHandler.h +++ b/dGame/dGameMessages/GameMessageHandler.h @@ -7,7 +7,6 @@ #define GAMEMESSAGEHANDLER_H #include "RakNetTypes.h" -#include "dMessageIdentifiers.h" #include "dCommonVars.h" #include #include @@ -21,8 +20,10 @@ #include "GameMessages.h" #include "../dDatabase/CDClientDatabase.h" +enum class eGameMessageType : uint16_t; + namespace GameMessageHandler { - void HandleMessage(RakNet::BitStream* inStream, const SystemAddress& sysAddr, LWOOBJID objectID, GAME_MSG messageID); + void HandleMessage(RakNet::BitStream* inStream, const SystemAddress& sysAddr, LWOOBJID objectID, eGameMessageType messageID); }; #endif // GAMEMESSAGEHANDLER_H diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index 3475c471..caab6459 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -4,7 +4,6 @@ #include "PacketUtils.h" #include "BitStream.h" #include "Game.h" -#include "dMessageIdentifiers.h" #include "SlashCommandHandler.h" #include "NiPoint3.h" #include "NiQuaternion.h" @@ -42,6 +41,7 @@ #include "eQuickBuildFailReason.h" #include "eControlScheme.h" #include "eStateChangeType.h" +#include "eConnectionType.h" #include #include @@ -89,6 +89,8 @@ #include "eAninmationFlags.h" #include "AMFFormat_BitStream.h" #include "eReplicaComponentType.h" +#include "eClientMessageType.h" +#include "eGameMessageType.h" #include "CDComponentsRegistryTable.h" #include "CDObjectsTable.h" @@ -98,7 +100,7 @@ void GameMessages::SendFireEventClientSide(const LWOOBJID& objectID, const Syste CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG::GAME_MSG_FIRE_EVENT_CLIENT_SIDE); + bitStream.Write(eGameMessageType::FIRE_EVENT_CLIENT_SIDE); //bitStream.Write(args); uint32_t argSize = args.size(); @@ -120,7 +122,7 @@ void GameMessages::SendTeleport(const LWOOBJID& objectID, const NiPoint3& pos, c CBITSTREAM; CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG::GAME_MSG_TELEPORT); + bitStream.Write(eGameMessageType::TELEPORT); bool bIgnoreY = (pos.y == 0.0f); bool bUseNavmesh = false; @@ -158,7 +160,6 @@ void GameMessages::SendPlayAnimation(Entity* entity, const std::u16string& anima //Stolen from the old DLU codebase as the new one's autogenerated code doesn't work properly for animationIDs longer than 6 characters. CBITSTREAM; CMSGHEADER; - uint16_t gameMsgID = GAME_MSG_PLAY_ANIMATION; std::string sAnimationID = GeneralUtils::UTF16ToWTF8(animationName); uint32_t animationIDLength = sAnimationID.size(); @@ -167,7 +168,7 @@ void GameMessages::SendPlayAnimation(Entity* entity, const std::u16string& anima bool bTriggerOnCompleteMsg = false; bitStream.Write(entity->GetObjectID()); - bitStream.Write(gameMsgID); + bitStream.Write(eGameMessageType::PLAY_ANIMATION); bitStream.Write(animationIDLength); PacketUtils::WriteWString(bitStream, animationName, animationIDLength); @@ -191,7 +192,7 @@ void GameMessages::SendPlayerReady(Entity* entity, const SystemAddress& sysAddr) CBITSTREAM; CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_PLAYER_READY); + bitStream.Write(eGameMessageType::PLAYER_READY); SEND_PACKET; } @@ -200,7 +201,7 @@ void GameMessages::SendPlayerAllowedRespawn(LWOOBJID entityID, bool doNotPromptR CMSGHEADER; bitStream.Write(entityID); - bitStream.Write(GAME_MSG::GAME_MSG_SET_PLAYER_ALLOWED_RESPAWN); + bitStream.Write(eGameMessageType::SET_PLAYER_ALLOWED_RESPAWN); bitStream.Write(doNotPromptRespawn); SEND_PACKET; @@ -211,7 +212,7 @@ void GameMessages::SendInvalidZoneTransferList(Entity* entity, const SystemAddre CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_INVALID_ZONE_TRANSFER_LIST); + bitStream.Write(eGameMessageType::INVALID_ZONE_TRANSFER_LIST); uint32_t CustomerFeedbackURLLength = feedbackURL.size(); bitStream.Write(CustomerFeedbackURLLength); @@ -236,7 +237,7 @@ void GameMessages::SendKnockback(const LWOOBJID& objectID, const LWOOBJID& caste CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG_KNOCKBACK); + bitStream.Write(eGameMessageType::KNOCKBACK); bool casterFlag = caster != LWOOBJID_EMPTY; bool originatorFlag = originator != LWOOBJID_EMPTY; @@ -272,7 +273,7 @@ void GameMessages::SendStartArrangingWithItem( CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_START_ARRANGING_WITH_ITEM); + bitStream.Write(eGameMessageType::START_ARRANGING_WITH_ITEM); bitStream.Write(bFirstTime); bitStream.Write(buildAreaID != LWOOBJID_EMPTY); @@ -296,7 +297,7 @@ void GameMessages::SendPlayerSetCameraCyclingMode(const LWOOBJID& objectID, cons CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG_PLAYER_SET_CAMERA_CYCLING_MODE); + bitStream.Write(eGameMessageType::PLAYER_SET_CAMERA_CYCLING_MODE); bitStream.Write(bAllowCyclingWhileDeadOnly); @@ -313,7 +314,7 @@ void GameMessages::SendPlayNDAudioEmitter(Entity* entity, const SystemAddress& s CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_PLAY_ND_AUDIO_EMITTER); + bitStream.Write((uint16_t)eGameMessageType::PLAY_ND_AUDIO_EMITTER); bitStream.Write0(); bitStream.Write0(); @@ -342,7 +343,7 @@ void GameMessages::SendStartPathing(Entity* entity) { CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG_START_PATHING); + bitStream.Write(eGameMessageType::START_PATHING); SEND_PACKET_BROADCAST; } @@ -364,7 +365,7 @@ void GameMessages::SendPlatformResync(Entity* entity, const SystemAddress& sysAd } bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_PLATFORM_RESYNC); + bitStream.Write((uint16_t)eGameMessageType::PLATFORM_RESYNC); bool bReverse = false; int eCommand = 0; @@ -405,7 +406,7 @@ void GameMessages::SendRestoreToPostLoadStats(Entity* entity, const SystemAddres CBITSTREAM; CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_RESTORE_TO_POST_LOAD_STATS); + bitStream.Write(eGameMessageType::RESTORE_TO_POST_LOAD_STATS); SEND_PACKET; } @@ -413,7 +414,7 @@ void GameMessages::SendServerDoneLoadingAllObjects(Entity* entity, const SystemA CBITSTREAM; CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_SERVER_DONE_LOADING_ALL_OBJECTS); + bitStream.Write(eGameMessageType::SERVER_DONE_LOADING_ALL_OBJECTS); SEND_PACKET; } @@ -421,7 +422,7 @@ void GameMessages::SendChatModeUpdate(const LWOOBJID& objectID, eGameMasterLevel CBITSTREAM; CMSGHEADER; bitStream.Write(objectID); - bitStream.Write((uint16_t)GAME_MSG_UPDATE_CHAT_MODE); + bitStream.Write((uint16_t)eGameMessageType::UPDATE_CHAT_MODE); bitStream.Write(level); SEND_PACKET_BROADCAST; } @@ -430,7 +431,7 @@ void GameMessages::SendGMLevelBroadcast(const LWOOBJID& objectID, eGameMasterLev CBITSTREAM; CMSGHEADER; bitStream.Write(objectID); - bitStream.Write((uint16_t)GAME_MSG_SET_GM_LEVEL); + bitStream.Write((uint16_t)eGameMessageType::SET_GM_LEVEL); bitStream.Write1(); bitStream.Write(level); SEND_PACKET_BROADCAST; @@ -441,7 +442,7 @@ void GameMessages::SendAddItemToInventoryClientSync(Entity* entity, const System CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(static_cast(GAME_MSG_ADD_ITEM_TO_INVENTORY_CLIENT_SYNC)); + bitStream.Write(eGameMessageType::ADD_ITEM_TO_INVENTORY_CLIENT_SYNC); bitStream.Write(item->GetBound()); bitStream.Write(item->GetInfo().isBOE); bitStream.Write(item->GetInfo().isBOP); @@ -500,7 +501,7 @@ void GameMessages::SendNotifyClientFlagChange(const LWOOBJID& objectID, uint32_t CMSGHEADER; bitStream.Write(objectID); - bitStream.Write((uint16_t)GAME_MSG_NOTIFY_CLIENT_FLAG_CHANGE); + bitStream.Write((uint16_t)eGameMessageType::NOTIFY_CLIENT_FLAG_CHANGE); bitStream.Write(bFlag); bitStream.Write(iFlagID); @@ -512,7 +513,7 @@ void GameMessages::SendChangeObjectWorldState(const LWOOBJID& objectID, eObjectW CMSGHEADER; bitStream.Write(objectID); - bitStream.Write((uint16_t)GAME_MSG_CHANGE_OBJECT_WORLD_STATE); + bitStream.Write((uint16_t)eGameMessageType::CHANGE_OBJECT_WORLD_STATE); bitStream.Write(state); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST @@ -530,7 +531,7 @@ void GameMessages::SendOfferMission(const LWOOBJID& entity, const SystemAddress& CMSGHEADER; bitStream.Write(offererID); - bitStream.Write(uint16_t(GAME_MSG_OFFER_MISSION)); + bitStream.Write(eGameMessageType::OFFER_MISSION); bitStream.Write(missionID); bitStream.Write(offererID); @@ -541,7 +542,7 @@ void GameMessages::SendOfferMission(const LWOOBJID& entity, const SystemAddress& CMSGHEADER; bitStream.Write(entity); - bitStream.Write(uint16_t(GAME_MSG_OFFER_MISSION)); + bitStream.Write(eGameMessageType::OFFER_MISSION); bitStream.Write(missionID); bitStream.Write(offererID); @@ -554,7 +555,7 @@ void GameMessages::SendNotifyMission(Entity* entity, const SystemAddress& sysAdd CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(uint16_t(GAME_MSG_NOTIFY_MISSION)); + bitStream.Write(eGameMessageType::NOTIFY_MISSION); bitStream.Write(missionID); bitStream.Write(missionState); bitStream.Write(sendingRewards); @@ -567,7 +568,7 @@ void GameMessages::SendNotifyMissionTask(Entity* entity, const SystemAddress& sy CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_NOTIFY_MISSION_TASK); + bitStream.Write((uint16_t)eGameMessageType::NOTIFY_MISSION_TASK); bitStream.Write(missionID); bitStream.Write(taskMask); @@ -585,7 +586,7 @@ void GameMessages::SendModifyLEGOScore(Entity* entity, const SystemAddress& sysA CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_MODIFY_LEGO_SCORE); + bitStream.Write((uint16_t)eGameMessageType::MODIFY_LEGO_SCORE); bitStream.Write(score); bitStream.Write(sourceType != eLootSourceType::NONE); @@ -599,7 +600,7 @@ void GameMessages::SendUIMessageServerToSingleClient(Entity* entity, const Syste CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_UI_MESSAGE_SERVER_TO_SINGLE_CLIENT); + bitStream.Write((uint16_t)eGameMessageType::UI_MESSAGE_SERVER_TO_SINGLE_CLIENT); bitStream.Write(args); uint32_t strMessageNameLength = message.size(); @@ -618,7 +619,7 @@ void GameMessages::SendUIMessageServerToAllClients(const std::string& message, A LWOOBJID empty = 0; bitStream.Write(empty); - bitStream.Write((uint16_t)GAME_MSG_UI_MESSAGE_SERVER_TO_ALL_CLIENTS); + bitStream.Write((uint16_t)eGameMessageType::UI_MESSAGE_SERVER_TO_ALL_CLIENTS); bitStream.Write(args); uint32_t strMessageNameLength = message.size(); @@ -636,7 +637,7 @@ void GameMessages::SendPlayEmbeddedEffectOnAllClientsNearObject(Entity* entity, CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_PLAY_EMBEDDED_EFFECT_ON_ALL_CLIENTS_NEAR_OBJECT); + bitStream.Write((uint16_t)eGameMessageType::PLAY_EMBEDDED_EFFECT_ON_ALL_CLIENTS_NEAR_OBJECT); bitStream.Write(static_cast(effectName.length())); for (uint32_t k = 0; k < effectName.length(); k++) { @@ -657,7 +658,7 @@ void GameMessages::SendPlayFXEffect(const LWOOBJID& entity, int32_t effectID, co CMSGHEADER; bitStream.Write(entity); - bitStream.Write((uint16_t)GAME_MSG::GAME_MSG_PLAY_FX_EFFECT); + bitStream.Write((uint16_t)eGameMessageType::PLAY_FX_EFFECT); bitStream.Write(effectID != -1); if (effectID != -1) bitStream.Write(effectID); @@ -691,7 +692,7 @@ void GameMessages::SendStopFXEffect(Entity* entity, bool killImmediate, std::str CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_STOP_FX_EFFECT); + bitStream.Write(eGameMessageType::STOP_FX_EFFECT); bitStream.Write(killImmediate); bitStream.Write(name.size()); @@ -705,7 +706,7 @@ void GameMessages::SendBroadcastTextToChatbox(Entity* entity, const SystemAddres CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG::GAME_MSG_BROADCAST_TEXT_TO_CHATBOX); + bitStream.Write((uint16_t)eGameMessageType::BROADCAST_TEXT_TO_CHATBOX); LWONameValue attribs; attribs.name = attrs; @@ -731,7 +732,7 @@ void GameMessages::SendSetCurrency(Entity* entity, int64_t currency, int lootTyp CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(uint16_t(GAME_MSG_SET_CURRENCY)); + bitStream.Write(eGameMessageType::SET_CURRENCY); bitStream.Write(currency); @@ -761,7 +762,7 @@ void GameMessages::SendRebuildNotifyState(Entity* entity, eRebuildState prevStat CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_REBUILD_NOTIFY_STATE); + bitStream.Write((uint16_t)eGameMessageType::REBUILD_NOTIFY_STATE); bitStream.Write(prevState); bitStream.Write(state); @@ -775,7 +776,7 @@ void GameMessages::SendEnableRebuild(Entity* entity, bool enable, bool fail, boo CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_ENABLE_REBUILD); + bitStream.Write((uint16_t)eGameMessageType::ENABLE_REBUILD); bitStream.Write(enable); bitStream.Write(fail); @@ -795,7 +796,7 @@ void GameMessages::SendTerminateInteraction(const LWOOBJID& objectID, eTerminate CMSGHEADER; bitStream.Write(objectID); - bitStream.Write((uint16_t)GAME_MSG_TERMINATE_INTERACTION); + bitStream.Write((uint16_t)eGameMessageType::TERMINATE_INTERACTION); bitStream.Write(terminator); bitStream.Write(type); @@ -808,7 +809,7 @@ void GameMessages::SendDieNoImplCode(Entity* entity, const LWOOBJID& killerID, c CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(uint16_t(GAME_MSG_DIE)); + bitStream.Write(eGameMessageType::DIE); bitStream.Write(bClientDeath); bitStream.Write(bSpawnLoot); bitStream.Write(deathType); @@ -831,7 +832,7 @@ void GameMessages::SendDie(Entity* entity, const LWOOBJID& killerID, const LWOOB bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_DIE); + bitStream.Write((uint16_t)eGameMessageType::DIE); bitStream.Write(bClientDeath); bitStream.Write(bSpawnLoot); @@ -867,7 +868,7 @@ void GameMessages::SendSetInventorySize(Entity* entity, int invType, int size) { CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(uint16_t(GAME_MSG_SET_INVENTORY_SIZE)); + bitStream.Write(eGameMessageType::SET_INVENTORY_SIZE); bitStream.Write(invType); bitStream.Write(size); @@ -880,7 +881,7 @@ void GameMessages::SendSetEmoteLockState(Entity* entity, bool bLock, int emoteID CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(uint16_t(GAME_MSG_SET_EMOTE_LOCK_STATE)); + bitStream.Write(eGameMessageType::SET_EMOTE_LOCK_STATE); bitStream.Write(bLock); bitStream.Write(emoteID); @@ -901,7 +902,7 @@ void GameMessages::SendSetJetPackMode(Entity* entity, bool use, bool bypassCheck CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(uint16_t(GAME_MSG_SET_JET_PACK_MODE)); + bitStream.Write(eGameMessageType::SET_JET_PACK_MODE); bitStream.Write(bypassChecks); bitStream.Write(doHover); @@ -961,7 +962,7 @@ void GameMessages::SendResurrect(Entity* entity) { bool bRezImmediately = false; bitStream.Write(entity->GetObjectID()); - bitStream.Write(uint16_t(GAME_MSG_RESURRECT)); + bitStream.Write(eGameMessageType::RESURRECT); bitStream.Write(bRezImmediately); SEND_PACKET_BROADCAST; @@ -972,7 +973,7 @@ void GameMessages::SendStop2DAmbientSound(Entity* entity, bool force, std::strin CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_PLAY2_DAMBIENT_SOUND); + bitStream.Write((uint16_t)eGameMessageType::PLAY2_DAMBIENT_SOUND); uint32_t audioGUIDSize = audioGUID.size(); @@ -995,7 +996,7 @@ void GameMessages::SendPlay2DAmbientSound(Entity* entity, std::string audioGUID, CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_PLAY2_DAMBIENT_SOUND); + bitStream.Write((uint16_t)eGameMessageType::PLAY2_DAMBIENT_SOUND); uint32_t audioGUIDSize = audioGUID.size(); @@ -1014,7 +1015,7 @@ void GameMessages::SendSetNetworkScriptVar(Entity* entity, const SystemAddress& CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_SET_NETWORK_SCRIPT_VAR); + bitStream.Write((uint16_t)eGameMessageType::SET_NETWORK_SCRIPT_VAR); // FIXME: this is a bad place to need to do a conversion because we have no clue whether data is utf8 or plain ascii // an this has performance implications @@ -1073,7 +1074,7 @@ void GameMessages::SendDropClientLoot(Entity* entity, const LWOOBJID& sourceID, CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(uint16_t(GAME_MSG_DROP_CLIENT_LOOT)); + bitStream.Write(eGameMessageType::DROP_CLIENT_LOOT); bitStream.Write(bUsePosition); @@ -1123,7 +1124,7 @@ void GameMessages::SendSetPlayerControlScheme(Entity* entity, eControlScheme con bool bSwitchCam = true; bitStream.Write(entity->GetObjectID()); - bitStream.Write(uint16_t(GAME_MSG_SET_PLAYER_CONTROL_SCHEME)); + bitStream.Write(eGameMessageType::SET_PLAYER_CONTROL_SCHEME); bitStream.Write(bDelayCamSwitchIfInCinematic); bitStream.Write(bSwitchCam); @@ -1140,7 +1141,7 @@ void GameMessages::SendPlayerReachedRespawnCheckpoint(Entity* entity, const NiPo CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_PLAYER_REACHED_RESPAWN_CHECKPOINT); + bitStream.Write((uint16_t)eGameMessageType::PLAYER_REACHED_RESPAWN_CHECKPOINT); bitStream.Write(position.x); bitStream.Write(position.y); @@ -1174,7 +1175,7 @@ void GameMessages::SendAddSkill(Entity* entity, TSkillID skillID, int slotID) { CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write((uint16_t)GAME_MSG_ADD_SKILL); + bitStream.Write((uint16_t)eGameMessageType::ADD_SKILL); bitStream.Write(AICombatWeight != 0); if (AICombatWeight != 0) bitStream.Write(AICombatWeight); @@ -1206,7 +1207,7 @@ void GameMessages::SendRemoveSkill(Entity* entity, TSkillID skillID) { CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG_REMOVE_SKILL); + bitStream.Write(eGameMessageType::REMOVE_SKILL); bitStream.Write(false); bitStream.Write(skillID); @@ -1235,7 +1236,7 @@ void GameMessages::SendFinishArrangingWithItem(Entity* entity, const LWOOBJID& b bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_FINISH_ARRANGING_WITH_ITEM); + bitStream.Write(eGameMessageType::FINISH_ARRANGING_WITH_ITEM); bitStream.Write(buildAreaID != LWOOBJID_EMPTY); if (buildAreaID != LWOOBJID_EMPTY) bitStream.Write(buildAreaID); @@ -1261,7 +1262,7 @@ void GameMessages::SendModularBuildEnd(Entity* entity) { CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_MODULAR_BUILD_END); + bitStream.Write(eGameMessageType::MODULAR_BUILD_END); SystemAddress sysAddr = entity->GetSystemAddress(); SEND_PACKET; @@ -1272,7 +1273,7 @@ void GameMessages::SendVendorOpenWindow(Entity* entity, const SystemAddress& sys CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_VENDOR_OPEN_WINDOW); + bitStream.Write(eGameMessageType::VENDOR_OPEN_WINDOW); SEND_PACKET; } @@ -1287,7 +1288,7 @@ void GameMessages::SendVendorStatusUpdate(Entity* entity, const SystemAddress& s std::map vendorItems = vendor->GetInventory(); bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_VENDOR_STATUS_UPDATE); + bitStream.Write(eGameMessageType::VENDOR_STATUS_UPDATE); bitStream.Write(bUpdateOnly); bitStream.Write(static_cast(vendorItems.size())); @@ -1308,7 +1309,7 @@ void GameMessages::SendVendorTransactionResult(Entity* entity, const SystemAddre int iResult = 0x02; // success, seems to be the only relevant one bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_VENDOR_TRANSACTION_RESULT); + bitStream.Write(eGameMessageType::VENDOR_TRANSACTION_RESULT); bitStream.Write(iResult); SEND_PACKET; @@ -1334,7 +1335,7 @@ void GameMessages::SendRemoveItemFromInventory(Entity* entity, const SystemAddre LWOOBJID iTradeID = LWOOBJID_EMPTY; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_REMOVE_ITEM_FROM_INVENTORY); + bitStream.Write(eGameMessageType::REMOVE_ITEM_FROM_INVENTORY); bitStream.Write(bConfirmed); bitStream.Write(bDeleteItem); bitStream.Write(bOutSuccess); @@ -1366,7 +1367,7 @@ void GameMessages::SendConsumeClientItem(Entity* entity, bool bSuccess, LWOOBJID CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG_CONSUME_CLIENT_ITEM); + bitStream.Write(eGameMessageType::CONSUME_CLIENT_ITEM); bitStream.Write(bSuccess); bitStream.Write(item); @@ -1379,7 +1380,7 @@ void GameMessages::SendUseItemResult(Entity* entity, LOT templateID, bool useIte CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG_USE_ITEM_RESULT); + bitStream.Write(eGameMessageType::USE_ITEM_RESULT); bitStream.Write(templateID); bitStream.Write(useItemResult); @@ -1392,7 +1393,7 @@ void GameMessages::SendUseItemRequirementsResponse(LWOOBJID objectID, const Syst CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG::GAME_MSG_USE_ITEM_REQUIREMENTS_RESPONSE); + bitStream.Write(eGameMessageType::USE_ITEM_REQUIREMENTS_RESPONSE); bitStream.Write(itemResponse); @@ -1454,7 +1455,7 @@ void GameMessages::SendMatchResponse(Entity* entity, const SystemAddress& sysAdd CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_MATCH_RESPONSE); + bitStream.Write(eGameMessageType::MATCH_RESPONSE); bitStream.Write(response); SEND_PACKET; @@ -1465,7 +1466,7 @@ void GameMessages::SendMatchUpdate(Entity* entity, const SystemAddress& sysAddr, CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_MATCH_UPDATE); + bitStream.Write(eGameMessageType::MATCH_UPDATE); bitStream.Write(uint32_t(data.size())); for (char character : data) { bitStream.Write(uint16_t(character)); @@ -1484,7 +1485,7 @@ void GameMessages::SendRequestActivitySummaryLeaderboardData(const LWOOBJID& obj CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG::GAME_MSG_REQUEST_ACTIVITY_SUMMARY_LEADERBOARD_DATA); + bitStream.Write(eGameMessageType::REQUEST_ACTIVITY_SUMMARY_LEADERBOARD_DATA); bitStream.Write(gameID != 0); if (gameID != 0) { @@ -1517,7 +1518,7 @@ void GameMessages::SendActivityPause(LWOOBJID objectId, bool pause, const System CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_ACTIVITY_PAUSE); + bitStream.Write(eGameMessageType::ACTIVITY_PAUSE); bitStream.Write(pause); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; @@ -1529,7 +1530,7 @@ void GameMessages::SendStartActivityTime(LWOOBJID objectId, float_t startTime, c CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_START_ACTIVITY_TIME); + bitStream.Write(eGameMessageType::START_ACTIVITY_TIME); bitStream.Write(startTime); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; @@ -1541,7 +1542,7 @@ void GameMessages::SendRequestActivityEnter(LWOOBJID objectId, const SystemAddre CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_REQUEST_ACTIVITY_ENTER); + bitStream.Write(eGameMessageType::REQUEST_ACTIVITY_ENTER); bitStream.Write(bStart); bitStream.Write(userID); @@ -1554,7 +1555,7 @@ void GameMessages::NotifyLevelRewards(LWOOBJID objectID, const SystemAddress& sy CMSGHEADER; bitStream.Write(objectID); - bitStream.Write((uint16_t)GAME_MSG::GAME_MSG_NOTIFY_LEVEL_REWARDS); + bitStream.Write((uint16_t)eGameMessageType::NOTIFY_LEVEL_REWARDS); bitStream.Write(level); bitStream.Write(sending_rewards); @@ -1575,7 +1576,7 @@ void GameMessages::SendSetShootingGalleryParams(LWOOBJID objectId, const SystemA CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SET_SHOOTING_GALLERY_PARAMS); + bitStream.Write(eGameMessageType::SET_SHOOTING_GALLERY_PARAMS); /* bitStream.Write(cameraFOV); bitStream.Write(cooldown); @@ -1610,7 +1611,7 @@ void GameMessages::SendNotifyClientShootingGalleryScore(LWOOBJID objectId, const CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_NOTIFY_CLIENT_SHOOTING_GALLERY_SCORE); + bitStream.Write(eGameMessageType::NOTIFY_CLIENT_SHOOTING_GALLERY_SCORE); bitStream.Write(addTime); bitStream.Write(score); bitStream.Write(target); @@ -1641,7 +1642,7 @@ void GameMessages::SendActivitySummaryLeaderboardData(const LWOOBJID& objectID, CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG::GAME_MSG_SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA); + bitStream.Write(eGameMessageType::SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA); bitStream.Write(leaderboard->GetGameID()); bitStream.Write(leaderboard->GetInfoType()); @@ -1720,7 +1721,7 @@ void GameMessages::SendStartCelebrationEffect(Entity* entity, const SystemAddres CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_START_CELEBRATION_EFFECT); + bitStream.Write(eGameMessageType::START_CELEBRATION_EFFECT); bitStream.Write(0); //animation bitStream.Write0(); //No custom bg obj @@ -1751,7 +1752,7 @@ void GameMessages::SendSetRailMovement(const LWOOBJID& objectID, bool pathGoForw CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG::GAME_MSG_SET_RAIL_MOVEMENT); + bitStream.Write(eGameMessageType::SET_RAIL_MOVEMENT); bitStream.Write(pathGoForward); @@ -1785,7 +1786,7 @@ void GameMessages::SendStartRailMovement(const LWOOBJID& objectID, std::u16strin CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG::GAME_MSG_START_RAIL_MOVEMENT); + bitStream.Write(eGameMessageType::START_RAIL_MOVEMENT); bitStream.Write(damageImmune); bitStream.Write(noAggro); @@ -1845,7 +1846,7 @@ void GameMessages::SendNotifyClientObject(const LWOOBJID& objectID, std::u16stri CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG::GAME_MSG_NOTIFY_CLIENT_OBJECT); + bitStream.Write(eGameMessageType::NOTIFY_CLIENT_OBJECT); bitStream.Write(uint32_t(name.size())); for (auto character : name) { @@ -1874,7 +1875,7 @@ void GameMessages::SendNotifyClientZoneObject(const LWOOBJID& objectID, const st CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG::GAME_MSG_NOTIFY_CLIENT_ZONE_OBJECT); + bitStream.Write(eGameMessageType::NOTIFY_CLIENT_ZONE_OBJECT); bitStream.Write(uint32_t(name.size())); for (const auto& character : name) { @@ -1900,7 +1901,7 @@ void GameMessages::SendNotifyClientFailedPrecondition(LWOOBJID objectId, const S CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_NOTIFY_CLIENT_FAILED_PRECONDITION); + bitStream.Write(eGameMessageType::NOTIFY_CLIENT_FAILED_PRECONDITION); bitStream.Write(uint32_t(failedReason.size())); for (uint16_t character : failedReason) { @@ -1918,7 +1919,7 @@ void GameMessages::SendToggleGMInvis(LWOOBJID objectId, bool enabled, const Syst CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_TOGGLE_GM_INVIS); + bitStream.Write(eGameMessageType::TOGGLE_GM_INVIS); bitStream.Write(enabled); // does not matter? if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; @@ -1930,7 +1931,7 @@ void GameMessages::SendSetName(LWOOBJID objectID, std::u16string name, const Sys CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG::GAME_MSG_SET_NAME); + bitStream.Write(eGameMessageType::SET_NAME); bitStream.Write(name.size()); @@ -1946,7 +1947,7 @@ void GameMessages::SendBBBSaveResponse(const LWOOBJID& objectId, const LWOOBJID& CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_BBB_SAVE_RESPONSE); + bitStream.Write(eGameMessageType::BBB_SAVE_RESPONSE); bitStream.Write(localID); @@ -1963,7 +1964,7 @@ void GameMessages::SendBBBSaveResponse(const LWOOBJID& objectId, const LWOOBJID& bitStream.Write(buffer[i]); SEND_PACKET; - PacketUtils::SavePacket("GAME_MSG_BBB_SAVE_RESPONSE.bin", (char*)bitStream.GetData(), bitStream.GetNumberOfBytesUsed()); + PacketUtils::SavePacket("eGameMessageType::BBB_SAVE_RESPONSE.bin", (char*)bitStream.GetData(), bitStream.GetNumberOfBytesUsed()); } // Property @@ -1973,7 +1974,7 @@ void GameMessages::SendOpenPropertyVendor(const LWOOBJID objectId, const SystemA CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_OPEN_PROPERTY_VENDOR); + bitStream.Write(eGameMessageType::OPEN_PROPERTY_VENDOR); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -1984,7 +1985,7 @@ void GameMessages::SendOpenPropertyManagment(const LWOOBJID objectId, const Syst CMSGHEADER; bitStream.Write(PropertyManagementComponent::Instance()->GetParent()->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_OPEN_PROPERTY_MANAGEMENT); + bitStream.Write(eGameMessageType::OPEN_PROPERTY_MANAGEMENT); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -1995,7 +1996,7 @@ void GameMessages::SendDownloadPropertyData(const LWOOBJID objectId, const Prope CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_DOWNLOAD_PROPERTY_DATA); + bitStream.Write(eGameMessageType::DOWNLOAD_PROPERTY_DATA); data.Serialize(bitStream); @@ -2010,7 +2011,7 @@ void GameMessages::SendPropertyRentalResponse(const LWOOBJID objectId, const LWO CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_PROPERTY_RENTAL_RESPONSE); + bitStream.Write(eGameMessageType::PROPERTY_RENTAL_RESPONSE); bitStream.Write(cloneId); bitStream.Write(code); @@ -2026,7 +2027,7 @@ void GameMessages::SendLockNodeRotation(Entity* entity, std::string nodeName) { CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_LOCK_NODE_ROTATION); + bitStream.Write(eGameMessageType::LOCK_NODE_ROTATION); bitStream.Write(uint32_t(nodeName.size())); for (char character : nodeName) { @@ -2041,7 +2042,7 @@ void GameMessages::SendSetBuildModeConfirmed(LWOOBJID objectId, const SystemAddr CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SET_BUILD_MODE_CONFIRMED); + bitStream.Write(eGameMessageType::SET_BUILD_MODE_CONFIRMED); bitStream.Write(start); bitStream.Write(warnVisitors); @@ -2061,7 +2062,7 @@ void GameMessages::SendGetModelsOnProperty(LWOOBJID objectId, std::map(models.size())); @@ -2081,7 +2082,7 @@ void GameMessages::SendZonePropertyModelEquipped(LWOOBJID objectId, LWOOBJID pla CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_ZONE_PROPERTY_MODEL_EQUIPPED); + bitStream.Write(eGameMessageType::ZONE_PROPERTY_MODEL_EQUIPPED); bitStream.Write(playerId); bitStream.Write(propertyId); @@ -2096,7 +2097,7 @@ void GameMessages::SendPlaceModelResponse(LWOOBJID objectId, const SystemAddress CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_PLACE_MODEL_RESPONSE); + bitStream.Write(eGameMessageType::PLACE_MODEL_RESPONSE); bitStream.Write(position != NiPoint3::ZERO); if (position != NiPoint3::ZERO) { @@ -2128,7 +2129,7 @@ void GameMessages::SendUGCEquipPreCreateBasedOnEditMode(LWOOBJID objectId, const CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_HANDLE_UGC_EQUIP_PRE_CREATE_BASED_ON_EDIT_MODE); + bitStream.Write(eGameMessageType::HANDLE_UGC_EQUIP_PRE_CREATE_BASED_ON_EDIT_MODE); bitStream.Write(modelCount); bitStream.Write(model); @@ -2142,7 +2143,7 @@ void GameMessages::SendUGCEquipPostDeleteBasedOnEditMode(LWOOBJID objectId, cons CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_HANDLE_UGC_EQUIP_POST_DELETE_BASED_ON_EDIT_MODE); + bitStream.Write(eGameMessageType::HANDLE_UGC_EQUIP_POST_DELETE_BASED_ON_EDIT_MODE); bitStream.Write(inventoryItem); @@ -2192,7 +2193,7 @@ void GameMessages::HandleUnUseModel(RakNet::BitStream* inStream, Entity* entity, if (unknown) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_BLUEPRINT_SAVE_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::BLUEPRINT_SAVE_RESPONSE); bitStream.Write(LWOOBJID_EMPTY); //always zero so that a check on the client passes bitStream.Write(eBlueprintSaveResponseType::PlacementFailed); // Sending a non-zero error code here prevents the client from deleting its in progress build for some reason? bitStream.Write(0); @@ -2444,7 +2445,7 @@ void GameMessages::HandleBBBLoadItemRequest(RakNet::BitStream* inStream, Entity* void GameMessages::SendBlueprintLoadItemResponse(const SystemAddress& sysAddr, bool success, LWOOBJID oldItemId, LWOOBJID newItemId) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_BLUEPRINT_LOAD_RESPONSE_ITEMID); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::BLUEPRINT_LOAD_RESPONSE_ITEMID); bitStream.Write(static_cast(success)); bitStream.Write(oldItemId); bitStream.Write(newItemId); @@ -2456,7 +2457,7 @@ void GameMessages::SendSmash(Entity* entity, float force, float ghostOpacity, LW CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_SMASH); + bitStream.Write(eGameMessageType::SMASH); bitStream.Write(ignoreObjectVisibility); bitStream.Write(force); @@ -2471,7 +2472,7 @@ void GameMessages::SendUnSmash(Entity* entity, LWOOBJID builderID, float duratio CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_UNSMASH); + bitStream.Write(eGameMessageType::UNSMASH); bitStream.Write(builderID != LWOOBJID_EMPTY); if (builderID != LWOOBJID_EMPTY) bitStream.Write(builderID); @@ -2692,7 +2693,7 @@ void GameMessages::HandleBBBSaveRequest(RakNet::BitStream* inStream, Entity* ent //Tell the client their model is saved: (this causes us to actually pop out of our current state): CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CLIENT, CLIENT::MSG_CLIENT_BLUEPRINT_SAVE_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::BLUEPRINT_SAVE_RESPONSE); bitStream.Write(localId); bitStream.Write(eBlueprintSaveResponseType::EverythingWorked); bitStream.Write(1); @@ -2832,7 +2833,7 @@ void GameMessages::SendPlayCinematic(LWOOBJID objectId, std::u16string pathName, CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_PLAY_CINEMATIC); + bitStream.Write(eGameMessageType::PLAY_CINEMATIC); bitStream.Write(allowGhostUpdates); bitStream.Write(bCloseMultiInteract); @@ -2871,7 +2872,7 @@ void GameMessages::SendEndCinematic(LWOOBJID objectId, std::u16string pathName, CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_END_CINEMATIC); + bitStream.Write(eGameMessageType::END_CINEMATIC); bitStream.Write(leadOut != -1); if (leadOut != -1) bitStream.Write(leadOut); @@ -2944,7 +2945,7 @@ void GameMessages::SendSetStunned(LWOOBJID objectId, eStateChangeType stateChang CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SET_STUNNED); + bitStream.Write(eGameMessageType::SET_STUNNED); bitStream.Write(originator != LWOOBJID_EMPTY); if (originator != LWOOBJID_EMPTY) bitStream.Write(originator); @@ -2993,7 +2994,7 @@ void GameMessages::SendSetStunImmunity(LWOOBJID target, eStateChangeType state, CMSGHEADER; bitStream.Write(target); - bitStream.Write(GAME_MSG::GAME_MSG_SET_STUN_IMMUNITY); + bitStream.Write(eGameMessageType::SET_STUN_IMMUNITY); bitStream.Write(originator != LWOOBJID_EMPTY); if (originator != LWOOBJID_EMPTY) bitStream.Write(originator); @@ -3026,7 +3027,7 @@ void GameMessages::SendSetStatusImmunity(LWOOBJID objectId, eStateChangeType sta CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SET_STATUS_IMMUNITY); + bitStream.Write(eGameMessageType::SET_STATUS_IMMUNITY); bitStream.Write(state); @@ -3049,7 +3050,7 @@ void GameMessages::SendOrientToAngle(LWOOBJID objectId, bool bRelativeToCurrent, CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_ORIENT_TO_ANGLE); + bitStream.Write(eGameMessageType::ORIENT_TO_ANGLE); bitStream.Write(bRelativeToCurrent); bitStream.Write(fAngle); @@ -3064,7 +3065,7 @@ void GameMessages::SendAddRunSpeedModifier(LWOOBJID objectId, LWOOBJID caster, u CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_ADD_RUN_SPEED_MODIFIER); + bitStream.Write(eGameMessageType::ADD_RUN_SPEED_MODIFIER); bitStream.Write(caster != LWOOBJID_EMPTY); if (caster != LWOOBJID_EMPTY) bitStream.Write(caster); @@ -3081,7 +3082,7 @@ void GameMessages::SendRemoveRunSpeedModifier(LWOOBJID objectId, uint32_t modifi CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_REMOVE_RUN_SPEED_MODIFIER); + bitStream.Write(eGameMessageType::REMOVE_RUN_SPEED_MODIFIER); bitStream.Write(modifier != 500); if (modifier != 500) bitStream.Write(modifier); @@ -3095,7 +3096,7 @@ void GameMessages::SendPropertyEntranceBegin(LWOOBJID objectId, const SystemAddr CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_PROPERTY_ENTRANCE_BEGIN); + bitStream.Write(eGameMessageType::PROPERTY_ENTRANCE_BEGIN); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -3106,7 +3107,7 @@ void GameMessages::SendPropertySelectQuery(LWOOBJID objectId, int32_t navOffset, CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_PROPERTY_SELECT_QUERY); + bitStream.Write(eGameMessageType::PROPERTY_SELECT_QUERY); bitStream.Write(navOffset); bitStream.Write(thereAreMore); @@ -3129,7 +3130,7 @@ void GameMessages::SendNotifyObject(LWOOBJID objectId, LWOOBJID objIDSender, std CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_NOTIFY_OBJECT); + bitStream.Write(eGameMessageType::NOTIFY_OBJECT); bitStream.Write(objIDSender); bitStream.Write(static_cast(name.size())); @@ -3169,7 +3170,7 @@ void GameMessages::SendTeamPickupItem(LWOOBJID objectId, LWOOBJID lootID, LWOOBJ CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_TEAM_PICKUP_ITEM); + bitStream.Write(eGameMessageType::TEAM_PICKUP_ITEM); bitStream.Write(lootID); bitStream.Write(lootOwnerID); @@ -3185,7 +3186,7 @@ void GameMessages::SendServerTradeInvite(LWOOBJID objectId, bool bNeedInvitePopU CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SERVER_TRADE_INVITE); + bitStream.Write(eGameMessageType::SERVER_TRADE_INVITE); bitStream.Write(bNeedInvitePopUp); bitStream.Write(i64Requestor); @@ -3203,7 +3204,7 @@ void GameMessages::SendServerTradeInitialReply(LWOOBJID objectId, LWOOBJID i64In CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SERVER_TRADE_INITIAL_REPLY); + bitStream.Write(eGameMessageType::SERVER_TRADE_INITIAL_REPLY); bitStream.Write(i64Invitee); bitStream.Write(resultType); @@ -3221,7 +3222,7 @@ void GameMessages::SendServerTradeFinalReply(LWOOBJID objectId, bool bResult, LW CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SERVER_TRADE_FINAL_REPLY); + bitStream.Write(eGameMessageType::SERVER_TRADE_FINAL_REPLY); bitStream.Write(bResult); bitStream.Write(i64Invitee); @@ -3239,7 +3240,7 @@ void GameMessages::SendServerTradeAccept(LWOOBJID objectId, bool bFirst, const S CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SERVER_TRADE_ACCEPT); + bitStream.Write(eGameMessageType::SERVER_TRADE_ACCEPT); bitStream.Write(bFirst); @@ -3252,7 +3253,7 @@ void GameMessages::SendServerTradeCancel(LWOOBJID objectId, const SystemAddress& CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SERVER_TRADE_CANCEL); + bitStream.Write(eGameMessageType::SERVER_TRADE_CANCEL); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -3263,7 +3264,7 @@ void GameMessages::SendServerTradeUpdate(LWOOBJID objectId, uint64_t coins, cons CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SERVER_TRADE_UPDATE); + bitStream.Write(eGameMessageType::SERVER_TRADE_UPDATE); bitStream.Write(false); bitStream.Write(coins); @@ -3441,7 +3442,7 @@ void GameMessages::SendNotifyPetTamingMinigame(LWOOBJID objectId, LWOOBJID petId CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_NOTIFY_PET_TAMING_MINIGAME); + bitStream.Write(eGameMessageType::NOTIFY_PET_TAMING_MINIGAME); bitStream.Write(petId); bitStream.Write(playerTamingId); @@ -3463,7 +3464,7 @@ void GameMessages::SendNotifyTamingModelLoadedOnServer(LWOOBJID objectId, const CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_NOTIFY_TAMING_MODEL_LOADED_ON_SERVER); + bitStream.Write(eGameMessageType::NOTIFY_TAMING_MODEL_LOADED_ON_SERVER); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -3474,7 +3475,7 @@ void GameMessages::SendNotifyPetTamingPuzzleSelected(LWOOBJID objectId, std::vec CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_NOTIFY_PET_TAMING_PUZZLE_SELECTED); + bitStream.Write(eGameMessageType::NOTIFY_PET_TAMING_PUZZLE_SELECTED); bitStream.Write(static_cast(bricks.size())); for (const auto& brick : bricks) { @@ -3491,7 +3492,7 @@ void GameMessages::SendPetTamingTryBuildResult(LWOOBJID objectId, bool bSuccess, CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_PET_TAMING_TRY_BUILD_RESULT); + bitStream.Write(eGameMessageType::PET_TAMING_TRY_BUILD_RESULT); bitStream.Write(bSuccess); bitStream.Write(iNumCorrect != 0); @@ -3506,7 +3507,7 @@ void GameMessages::SendPetResponse(LWOOBJID objectId, LWOOBJID objIDPet, int32_t CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_PET_RESPONSE); + bitStream.Write(eGameMessageType::PET_RESPONSE); bitStream.Write(objIDPet); bitStream.Write(iPetCommandType); @@ -3522,7 +3523,7 @@ void GameMessages::SendAddPetToPlayer(LWOOBJID objectId, int32_t iElementalType, CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_ADD_PET_TO_PLAYER); + bitStream.Write(eGameMessageType::ADD_PET_TO_PLAYER); bitStream.Write(iElementalType); bitStream.Write(static_cast(name.size())); @@ -3542,7 +3543,7 @@ void GameMessages::SendRegisterPetID(LWOOBJID objectId, LWOOBJID objID, const Sy CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_REGISTER_PET_ID); + bitStream.Write(eGameMessageType::REGISTER_PET_ID); bitStream.Write(objID); @@ -3555,7 +3556,7 @@ void GameMessages::SendRegisterPetDBID(LWOOBJID objectId, LWOOBJID petDBID, cons CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_REGISTER_PET_DBID); + bitStream.Write(eGameMessageType::REGISTER_PET_DBID); bitStream.Write(petDBID); @@ -3568,7 +3569,7 @@ void GameMessages::SendMarkInventoryItemAsActive(LWOOBJID objectId, bool bActive CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_MARK_INVENTORY_ITEM_AS_ACTIVE); + bitStream.Write(eGameMessageType::MARK_INVENTORY_ITEM_AS_ACTIVE); bitStream.Write(bActive); @@ -3587,7 +3588,7 @@ void GameMessages::SendClientExitTamingMinigame(LWOOBJID objectId, bool bVolunta CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_CLIENT_EXIT_TAMING_MINIGAME); + bitStream.Write(eGameMessageType::CLIENT_EXIT_TAMING_MINIGAME); bitStream.Write(bVoluntaryExit); @@ -3600,7 +3601,7 @@ void GameMessages::SendShowPetActionButton(LWOOBJID objectId, int32_t buttonLabe CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SHOW_PET_ACTION_BUTTON); + bitStream.Write(eGameMessageType::SHOW_PET_ACTION_BUTTON); bitStream.Write(buttonLabel); bitStream.Write(bShow); @@ -3614,7 +3615,7 @@ void GameMessages::SendPlayEmote(LWOOBJID objectId, int32_t emoteID, LWOOBJID ta CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_PLAY_EMOTE); + bitStream.Write(eGameMessageType::PLAY_EMOTE); bitStream.Write(emoteID); bitStream.Write(target); @@ -3628,7 +3629,7 @@ void GameMessages::SendRemoveBuff(Entity* entity, bool fromUnEquip, bool removeI CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_REMOVE_BUFF); + bitStream.Write(eGameMessageType::REMOVE_BUFF); bitStream.Write(false); // bFromRemoveBehavior but setting this to true makes the GM not do anything on the client? bitStream.Write(fromUnEquip); @@ -3643,7 +3644,7 @@ void GameMessages::SendBouncerActiveStatus(LWOOBJID objectId, bool bActive, cons CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_BOUNCER_ACTIVE_STATUS); + bitStream.Write(eGameMessageType::BOUNCER_ACTIVE_STATUS); bitStream.Write(bActive); @@ -3657,7 +3658,7 @@ void GameMessages::SendSetPetName(LWOOBJID objectId, std::u16string name, LWOOBJ CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SET_PET_NAME); + bitStream.Write(eGameMessageType::SET_PET_NAME); bitStream.Write(static_cast(name.size())); for (const auto character : name) { @@ -3677,7 +3678,7 @@ void GameMessages::SendSetPetNameModerated(LWOOBJID objectId, LWOOBJID petDBID, CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SET_PET_NAME_MODERATED); + bitStream.Write(eGameMessageType::SET_PET_NAME_MODERATED); bitStream.Write(petDBID != LWOOBJID_EMPTY); if (petDBID != LWOOBJID_EMPTY) bitStream.Write(petDBID); @@ -3694,7 +3695,7 @@ void GameMessages::SendPetNameChanged(LWOOBJID objectId, int32_t moderationStatu CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_PET_NAME_CHANGED); + bitStream.Write(eGameMessageType::PET_NAME_CHANGED); bitStream.Write(moderationStatus); @@ -3943,7 +3944,7 @@ void GameMessages::SendDisplayZoneSummary(LWOOBJID objectId, const SystemAddress CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_DISPLAY_ZONE_SUMMARY); + bitStream.Write(eGameMessageType::DISPLAY_ZONE_SUMMARY); bitStream.Write(isPropertyMap); bitStream.Write(isZoneStart); @@ -3961,7 +3962,7 @@ void GameMessages::SendNotifyNotEnoughInvSpace(LWOOBJID objectId, uint32_t freeS CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_VEHICLE_NOTIFY_FINISHED_RACE); + bitStream.Write(eGameMessageType::VEHICLE_NOTIFY_FINISHED_RACE); bitStream.Write(freeSlotsNeeded); bitStream.Write(inventoryType != 0); @@ -3976,7 +3977,7 @@ void GameMessages::SendDisplayMessageBox(LWOOBJID objectId, bool bShow, LWOOBJID CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_DISPLAY_MESSAGE_BOX); + bitStream.Write(eGameMessageType::DISPLAY_MESSAGE_BOX); bitStream.Write(bShow); bitStream.Write(callbackClient); @@ -4003,12 +4004,12 @@ void GameMessages::SendDisplayMessageBox(LWOOBJID objectId, bool bShow, LWOOBJID } void GameMessages::SendDisplayChatBubble(LWOOBJID objectId, const std::u16string& text, const SystemAddress& sysAddr) { - // GAME_MSG_DISPLAY_CHAT_BUBBLE + // eGameMessageType::DISPLAY_CHAT_BUBBLE CBITSTREAM; CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_DISPLAY_CHAT_BUBBLE); + bitStream.Write(eGameMessageType::DISPLAY_CHAT_BUBBLE); bitStream.Write(static_cast(text.size())); for (const auto character : text) { @@ -4025,7 +4026,7 @@ void GameMessages::SendChangeIdleFlags(LWOOBJID objectId, eAnimationFlags flagsO CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_CHANGE_IDLE_FLAGS); + bitStream.Write(eGameMessageType::CHANGE_IDLE_FLAGS); bitStream.Write(flagsOff != eAnimationFlags::IDLE_NONE); if (flagsOff != eAnimationFlags::IDLE_NONE) bitStream.Write(flagsOff); bitStream.Write(flagsOn != eAnimationFlags::IDLE_NONE); @@ -4039,7 +4040,7 @@ void GameMessages::SendSetMountInventoryID(Entity* entity, const LWOOBJID& objec CBITSTREAM; CMSGHEADER; bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_SET_MOUNT_INVENTORY_ID); + bitStream.Write(eGameMessageType::SET_MOUNT_INVENTORY_ID); bitStream.Write(objectID); SEND_PACKET_BROADCAST; @@ -4242,7 +4243,7 @@ void GameMessages::SendUpdateReputation(const LWOOBJID objectId, const int64_t r CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_UPDATE_REPUTATION); + bitStream.Write(eGameMessageType::UPDATE_REPUTATION); bitStream.Write(reputation); @@ -4316,7 +4317,7 @@ void GameMessages::SendModuleAssemblyDBDataForClient(LWOOBJID objectId, LWOOBJID CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_MODULE_ASSEMBLY_DB_DATA_FOR_CLIENT); + bitStream.Write(eGameMessageType::MODULE_ASSEMBLY_DB_DATA_FOR_CLIENT); bitStream.Write(assemblyID); @@ -4335,7 +4336,7 @@ void GameMessages::SendNotifyVehicleOfRacingObject(LWOOBJID objectId, LWOOBJID r CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_NOTIFY_VEHICLE_OF_RACING_OBJECT); + bitStream.Write(eGameMessageType::NOTIFY_VEHICLE_OF_RACING_OBJECT); bitStream.Write(racingObjectID != LWOOBJID_EMPTY); if (racingObjectID != LWOOBJID_EMPTY) bitStream.Write(racingObjectID); @@ -4350,7 +4351,7 @@ void GameMessages::SendRacingPlayerLoaded(LWOOBJID objectId, LWOOBJID playerID, CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_RACING_PLAYER_LOADED); + bitStream.Write(eGameMessageType::RACING_PLAYER_LOADED); bitStream.Write(playerID); bitStream.Write(vehicleID); @@ -4365,7 +4366,7 @@ void GameMessages::SendVehicleUnlockInput(LWOOBJID objectId, bool bLockWheels, c CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_VEHICLE_UNLOCK_INPUT); + bitStream.Write(eGameMessageType::VEHICLE_UNLOCK_INPUT); bitStream.Write(bLockWheels); @@ -4379,7 +4380,7 @@ void GameMessages::SendVehicleSetWheelLockState(LWOOBJID objectId, bool bExtraFr CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_VEHICLE_SET_WHEEL_LOCK_STATE); + bitStream.Write(eGameMessageType::VEHICLE_SET_WHEEL_LOCK_STATE); bitStream.Write(bExtraFriction); bitStream.Write(bLocked); @@ -4394,7 +4395,7 @@ void GameMessages::SendRacingSetPlayerResetInfo(LWOOBJID objectId, int32_t curre CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_RACING_SET_PLAYER_RESET_INFO); + bitStream.Write(eGameMessageType::RACING_SET_PLAYER_RESET_INFO); bitStream.Write(currentLap); bitStream.Write(furthestResetPlane); @@ -4412,7 +4413,7 @@ void GameMessages::SendRacingResetPlayerToLastReset(LWOOBJID objectId, LWOOBJID CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_RACING_RESET_PLAYER_TO_LAST_RESET); + bitStream.Write(eGameMessageType::RACING_RESET_PLAYER_TO_LAST_RESET); bitStream.Write(playerID); @@ -4425,7 +4426,7 @@ void GameMessages::SendVehicleStopBoost(Entity* targetEntity, const SystemAddres CMSGHEADER; bitStream.Write(targetEntity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_VEHICLE_STOP_BOOST); + bitStream.Write(eGameMessageType::VEHICLE_STOP_BOOST); bitStream.Write(affectPassive); @@ -4437,7 +4438,7 @@ void GameMessages::SendSetResurrectRestoreValues(Entity* targetEntity, int32_t a CMSGHEADER; bitStream.Write(targetEntity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_SET_RESURRECT_RESTORE_VALUES); + bitStream.Write(eGameMessageType::SET_RESURRECT_RESTORE_VALUES); bitStream.Write(armorRestore != -1); if (armorRestore != -1) bitStream.Write(armorRestore); @@ -4456,7 +4457,7 @@ void GameMessages::SendNotifyRacingClient(LWOOBJID objectId, int32_t eventType, CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_NOTIFY_RACING_CLIENT); + bitStream.Write(eGameMessageType::NOTIFY_RACING_CLIENT); bitStream.Write(eventType != 0); if (eventType != 0) bitStream.Write(eventType); @@ -4482,7 +4483,7 @@ void GameMessages::SendActivityEnter(LWOOBJID objectId, const SystemAddress& sys CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_ACTIVITY_ENTER); + bitStream.Write(eGameMessageType::ACTIVITY_ENTER); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -4494,7 +4495,7 @@ void GameMessages::SendActivityStart(LWOOBJID objectId, const SystemAddress& sys CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_ACTIVITY_START); + bitStream.Write(eGameMessageType::ACTIVITY_START); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -4506,7 +4507,7 @@ void GameMessages::SendActivityExit(LWOOBJID objectId, const SystemAddress& sysA CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_ACTIVITY_EXIT); + bitStream.Write(eGameMessageType::ACTIVITY_EXIT); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -4518,7 +4519,7 @@ void GameMessages::SendActivityStop(LWOOBJID objectId, bool bExit, bool bUserCan CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_ACTIVITY_STOP); + bitStream.Write(eGameMessageType::ACTIVITY_STOP); bitStream.Write(bExit); bitStream.Write(bUserCancel); @@ -4533,7 +4534,7 @@ void GameMessages::SendVehicleAddPassiveBoostAction(LWOOBJID objectId, const Sys CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_VEHICLE_ADD_PASSIVE_BOOST_ACTION); + bitStream.Write(eGameMessageType::VEHICLE_ADD_PASSIVE_BOOST_ACTION); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -4545,7 +4546,7 @@ void GameMessages::SendVehicleRemovePassiveBoostAction(LWOOBJID objectId, const CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_VEHICLE_REMOVE_PASSIVE_BOOST_ACTION); + bitStream.Write(eGameMessageType::VEHICLE_REMOVE_PASSIVE_BOOST_ACTION); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -4557,7 +4558,7 @@ void GameMessages::SendVehicleNotifyFinishedRace(LWOOBJID objectId, const System CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_VEHICLE_NOTIFY_FINISHED_RACE); + bitStream.Write(eGameMessageType::VEHICLE_NOTIFY_FINISHED_RACE); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -4571,7 +4572,7 @@ void GameMessages::SendAddBuff(LWOOBJID& objectID, const LWOOBJID& casterID, uin CMSGHEADER; bitStream.Write(objectID); - bitStream.Write(GAME_MSG::GAME_MSG_ADD_BUFF); + bitStream.Write(eGameMessageType::ADD_BUFF); bitStream.Write(false); // Added by teammate bitStream.Write(false); // Apply on teammates @@ -4652,7 +4653,7 @@ void GameMessages::SendShowActivityCountdown(LWOOBJID objectId, bool bPlayAdditi CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SHOW_ACTIVITY_COUNTDOWN); + bitStream.Write(eGameMessageType::SHOW_ACTIVITY_COUNTDOWN); bitStream.Write(bPlayAdditionalSound); @@ -5957,7 +5958,7 @@ void GameMessages::SendGetHotPropertyData(RakNet::BitStream* inStream, Entity* e // TODO This needs to be implemented when reputation is implemented for getting hot properties. /** bitStream.Write(entity->GetObjectID()); - bitStream.Write(GAME_MSG::GAME_MSG_SEND_HOT_PROPERTY_DATA); + bitStream.Write(eGameMessageType::SEND_HOT_PROPERTY_DATA); std::vector t = {25166, 25188, 25191, 25194}; bitStream.Write(4); for (uint8_t i = 0; i < 4; i++) { @@ -6151,7 +6152,7 @@ void GameMessages::SendActivateBubbleBuffFromServer(LWOOBJID objectId, const Sys CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_ACTIVATE_BUBBLE_BUFF_FROM_SERVER); + bitStream.Write(eGameMessageType::ACTIVATE_BUBBLE_BUFF_FROM_SERVER); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -6162,7 +6163,7 @@ void GameMessages::SendDeactivateBubbleBuffFromServer(LWOOBJID objectId, const S CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_DEACTIVATE_BUBBLE_BUFF_FROM_SERVER); + bitStream.Write(eGameMessageType::DEACTIVATE_BUBBLE_BUFF_FROM_SERVER); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST; SEND_PACKET; @@ -6180,7 +6181,7 @@ void GameMessages::SendSetNamebillboardState(const SystemAddress& sysAddr, LWOOB CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SET_NAME_BILLBOARD_STATE); + bitStream.Write(eGameMessageType::SET_NAME_BILLBOARD_STATE); // Technically these bits would be written, however the client does not // contain a deserialize method to actually deserialize, so we are leaving it out. @@ -6198,7 +6199,7 @@ void GameMessages::SendShowBillboardInteractIcon(const SystemAddress& sysAddr, L CMSGHEADER; bitStream.Write(objectId); - bitStream.Write(GAME_MSG::GAME_MSG_SHOW_BILLBOARD_INTERACT_ICON); + bitStream.Write(eGameMessageType::SHOW_BILLBOARD_INTERACT_ICON); if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST else SEND_PACKET diff --git a/dGame/dGameMessages/RequestServerProjectileImpact.h b/dGame/dGameMessages/RequestServerProjectileImpact.h index 01426361..090d8274 100644 --- a/dGame/dGameMessages/RequestServerProjectileImpact.h +++ b/dGame/dGameMessages/RequestServerProjectileImpact.h @@ -2,13 +2,11 @@ #define __REQUESTSERVERPROJECTILEIMPACT__H__ #include "dCommonVars.h" -#include "dMessageIdentifiers.h" +#include "eGameMessageType.h" /* Notifying the server that a locally owned projectile impacted. Sent to the caster of the projectile should always be the local char. */ class RequestServerProjectileImpact { - static const GAME_MSG MsgID = GAME_MSG_REQUEST_SERVER_PROJECTILE_IMPACT; - public: RequestServerProjectileImpact() { i64LocalID = LWOOBJID_EMPTY; @@ -29,7 +27,7 @@ public: } void Serialize(RakNet::BitStream* stream) { - stream->Write(MsgID); + stream->Write(eGameMessageType::REQUEST_SERVER_PROJECTILE_IMPACT); stream->Write(i64LocalID != LWOOBJID_EMPTY); if (i64LocalID != LWOOBJID_EMPTY) stream->Write(i64LocalID); diff --git a/dGame/dGameMessages/StartSkill.h b/dGame/dGameMessages/StartSkill.h index af82a9b4..40bc210f 100644 --- a/dGame/dGameMessages/StartSkill.h +++ b/dGame/dGameMessages/StartSkill.h @@ -2,16 +2,14 @@ #define __STARTSKILL__H__ #include "dCommonVars.h" -#include "dMessageIdentifiers.h" #include "NiPoint3.h" #include "NiQuaternion.h" +#include "eGameMessageType.h" /** * Same as sync skill but with different network options. An echo down to other clients that need to play the skill. */ class StartSkill { - static const GAME_MSG MsgID = GAME_MSG_START_SKILL; - public: StartSkill() { bUsedMouse = false; @@ -46,7 +44,7 @@ public: } void Serialize(RakNet::BitStream* stream) { - stream->Write(MsgID); + stream->Write(eGameMessageType::START_SKILL); stream->Write(bUsedMouse); diff --git a/dGame/dGameMessages/SyncSkill.h b/dGame/dGameMessages/SyncSkill.h index 72a88839..6485199e 100644 --- a/dGame/dGameMessages/SyncSkill.h +++ b/dGame/dGameMessages/SyncSkill.h @@ -5,11 +5,10 @@ #include #include "BitStream.h" +#include "eGameMessageType.h" /* Message to synchronize a skill cast */ class SyncSkill { - static const GAME_MSG MsgID = GAME_MSG_SYNC_SKILL; - public: SyncSkill() { bDone = false; @@ -30,7 +29,7 @@ public: } void Serialize(RakNet::BitStream* stream) { - stream->Write(MsgID); + stream->Write(eGameMessageType::SYNC_SKILL); stream->Write(bDone); uint32_t sBitStreamLength = sBitStream.length(); diff --git a/dGame/dUtilities/Mail.cpp b/dGame/dUtilities/Mail.cpp index 1d3e0f60..5dc55765 100644 --- a/dGame/dUtilities/Mail.cpp +++ b/dGame/dUtilities/Mail.cpp @@ -13,7 +13,6 @@ #include "Entity.h" #include "Character.h" #include "PacketUtils.h" -#include "dMessageIdentifiers.h" #include "dLogger.h" #include "EntityManager.h" #include "InventoryComponent.h" @@ -26,6 +25,7 @@ #include "WorldConfig.h" #include "eMissionTaskType.h" #include "eReplicaComponentType.h" +#include "eConnectionType.h" void Mail::SendMail(const Entity* recipient, const std::string& subject, const std::string& body, const LOT attachment, const uint16_t attachmentCount) { @@ -283,7 +283,7 @@ void Mail::HandleDataRequest(RakNet::BitStream* packet, const SystemAddress& sys sql::ResultSet* res = stmt->executeQuery(); RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_MAIL); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::MAIL); bitStream.Write(int(MailMessageID::MailData)); bitStream.Write(int(0)); @@ -406,7 +406,7 @@ void Mail::HandleNotificationRequest(const SystemAddress& sysAddr, uint32_t obje void Mail::SendSendResponse(const SystemAddress& sysAddr, MailSendResponse response) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_MAIL); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::MAIL); bitStream.Write(int(MailMessageID::SendResponse)); bitStream.Write(int(response)); Game::server->Send(&bitStream, sysAddr, false); @@ -414,7 +414,7 @@ void Mail::SendSendResponse(const SystemAddress& sysAddr, MailSendResponse respo void Mail::SendNotification(const SystemAddress& sysAddr, int mailCount) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_MAIL); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::MAIL); uint64_t messageType = 2; uint64_t s1 = 0; uint64_t s2 = 0; @@ -433,7 +433,7 @@ void Mail::SendNotification(const SystemAddress& sysAddr, int mailCount) { void Mail::SendAttachmentRemoveConfirm(const SystemAddress& sysAddr, uint64_t mailID) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_MAIL); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::MAIL); bitStream.Write(int(MailMessageID::AttachmentCollectConfirm)); bitStream.Write(int(0)); //unknown bitStream.Write(mailID); @@ -442,7 +442,7 @@ void Mail::SendAttachmentRemoveConfirm(const SystemAddress& sysAddr, uint64_t ma void Mail::SendDeleteConfirm(const SystemAddress& sysAddr, uint64_t mailID, LWOOBJID playerID) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_MAIL); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::MAIL); bitStream.Write(int(MailMessageID::MailDeleteConfirm)); bitStream.Write(int(0)); //unknown bitStream.Write(mailID); @@ -456,7 +456,7 @@ void Mail::SendDeleteConfirm(const SystemAddress& sysAddr, uint64_t mailID, LWOO void Mail::SendReadConfirm(const SystemAddress& sysAddr, uint64_t mailID) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_MAIL); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::MAIL); bitStream.Write(int(MailMessageID::MailReadConfirm)); bitStream.Write(int(0)); //unknown bitStream.Write(mailID); diff --git a/dGame/dUtilities/SlashCommandHandler.cpp b/dGame/dUtilities/SlashCommandHandler.cpp index 66e9bc9b..07950d7a 100644 --- a/dGame/dUtilities/SlashCommandHandler.cpp +++ b/dGame/dUtilities/SlashCommandHandler.cpp @@ -71,7 +71,6 @@ #include "eBubbleType.h" #include "AMFFormat.h" #include "MovingPlatformComponent.h" -#include "dMessageIdentifiers.h" #include "eMissionState.h" #include "TriggerComponent.h" #include "eServerDisconnectIdentifiers.h" @@ -79,6 +78,9 @@ #include "eGameMasterLevel.h" #include "eReplicaComponentType.h" #include "eControlScheme.h" +#include "eConnectionType.h" +#include "eChatInternalMessageType.h" +#include "eMasterMessageType.h" #include "CDObjectsTable.h" #include "CDZoneTableTable.h" @@ -765,7 +767,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit if (chatCommand == "shutdownuniverse" && entity->GetGMLevel() == eGameMasterLevel::OPERATOR) { //Tell the master server that we're going to be shutting down whole "universe": CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_SHUTDOWN_UNIVERSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::SHUTDOWN_UNIVERSE); Game::server->SendToMaster(&bitStream); ChatPackets::SendSystemMessage(sysAddr, u"Sent universe shutdown notification to master."); @@ -1096,7 +1098,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit //Notify chat about it CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_MUTE_UPDATE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::MUTE_UPDATE); bitStream.Write(characterId); bitStream.Write(expire); @@ -2044,7 +2046,7 @@ void SlashCommandHandler::SendAnnouncement(const std::string& title, const std:: //Notify chat about it CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ANNOUNCEMENT); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ANNOUNCEMENT); bitStream.Write(title.size()); for (auto character : title) { diff --git a/dMasterServer/InstanceManager.cpp b/dMasterServer/InstanceManager.cpp index fe62a5e5..50f55b72 100644 --- a/dMasterServer/InstanceManager.cpp +++ b/dMasterServer/InstanceManager.cpp @@ -7,10 +7,11 @@ #include "CDClientDatabase.h" #include "CDClientManager.h" #include "CDZoneTableTable.h" -#include "dMessageIdentifiers.h" #include "MasterPackets.h" #include "PacketUtils.h" #include "BinaryPathFinder.h" +#include "eConnectionType.h" +#include "eMasterMessageType.h" InstanceManager::InstanceManager(dLogger* logger, const std::string& externalIP) { mLogger = logger; @@ -201,7 +202,7 @@ void InstanceManager::RequestAffirmation(Instance* instance, const PendingInstan CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_AFFIRM_TRANSFER_REQUEST); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::AFFIRM_TRANSFER_REQUEST); bitStream.Write(request.id); @@ -405,7 +406,7 @@ bool Instance::GetShutdownComplete() const { void Instance::Shutdown() { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_SHUTDOWN); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::SHUTDOWN); Game::server->Send(&bitStream, this->m_SysAddr, false); diff --git a/dMasterServer/MasterServer.cpp b/dMasterServer/MasterServer.cpp index cc2bdd90..4b524d8d 100644 --- a/dMasterServer/MasterServer.cpp +++ b/dMasterServer/MasterServer.cpp @@ -27,6 +27,8 @@ #include "dServer.h" #include "AssetManager.h" #include "BinaryPathFinder.h" +#include "eConnectionType.h" +#include "eMasterMessageType.h" //RakNet includes: #include "RakNetDefines.h" @@ -39,7 +41,6 @@ #include "MasterPackets.h" #include "ObjectIDManager.h" #include "PacketUtils.h" -#include "dMessageIdentifiers.h" #include "FdbToSqlite.h" namespace Game { @@ -494,9 +495,9 @@ void HandlePacket(Packet* packet) { } } - if (packet->data[1] == MASTER) { - switch (packet->data[3]) { - case MSG_MASTER_REQUEST_PERSISTENT_ID: { + if (static_cast(packet->data[1]) == eConnectionType::MASTER) { + switch (static_cast(packet->data[3])) { + case eMasterMessageType::REQUEST_PERSISTENT_ID: { Game::logger->Log("MasterServer", "A persistent ID req"); RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -508,7 +509,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_REQUEST_ZONE_TRANSFER: { + case eMasterMessageType::REQUEST_ZONE_TRANSFER: { Game::logger->Log("MasterServer", "Received zone transfer req"); RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -544,7 +545,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_SERVER_INFO: { + case eMasterMessageType::SERVER_INFO: { //MasterPackets::HandleServerInfo(packet); //This is here because otherwise we'd have to include IM in @@ -603,7 +604,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_SET_SESSION_KEY: { + case eMasterMessageType::SET_SESSION_KEY: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); uint32_t sessionKey = 0; @@ -617,7 +618,7 @@ void HandlePacket(Packet* packet) { activeSessions.erase(it.first); CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_NEW_SESSION_ALERT); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::NEW_SESSION_ALERT); bitStream.Write(sessionKey); bitStream.Write(username.size()); for (auto character : username) { @@ -634,7 +635,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_REQUEST_SESSION_KEY: { + case eMasterMessageType::REQUEST_SESSION_KEY: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); std::string username = PacketUtils::ReadString(8, packet, false); @@ -642,7 +643,7 @@ void HandlePacket(Packet* packet) { for (auto key : activeSessions) { if (key.second == username) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_SESSION_KEY_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::SESSION_KEY_RESPONSE); bitStream.Write(key.first); PacketUtils::WriteString(bitStream, key.second, 64); Game::server->Send(&bitStream, packet->systemAddress, false); @@ -652,7 +653,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_PLAYER_ADDED: { + case eMasterMessageType::PLAYER_ADDED: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -672,7 +673,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_PLAYER_REMOVED: { + case eMasterMessageType::PLAYER_REMOVED: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -690,7 +691,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_CREATE_PRIVATE_ZONE: { + case eMasterMessageType::CREATE_PRIVATE_ZONE: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -714,7 +715,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_REQUEST_PRIVATE_ZONE: { + case eMasterMessageType::REQUEST_PRIVATE_ZONE: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -749,7 +750,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_WORLD_READY: { + case eMasterMessageType::WORLD_READY: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -773,7 +774,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_PREP_ZONE: { + case eMasterMessageType::PREP_ZONE: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -789,7 +790,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_AFFIRM_TRANSFER_RESPONSE: { + case eMasterMessageType::AFFIRM_TRANSFER_RESPONSE: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -809,7 +810,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_SHUTDOWN_RESPONSE: { + case eMasterMessageType::SHUTDOWN_RESPONSE: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -824,7 +825,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_SHUTDOWN_UNIVERSE: { + case eMasterMessageType::SHUTDOWN_UNIVERSE: { Game::logger->Log("MasterServer", "Received shutdown universe command, shutting down in 10 minutes."); Game::shouldShutdown = true; break; @@ -888,7 +889,7 @@ void ShutdownSequence(int32_t signal) { { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_SHUTDOWN); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::SHUTDOWN); Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true); Game::logger->Log("MasterServer", "Triggered master shutdown"); } diff --git a/dNet/AuthPackets.cpp b/dNet/AuthPackets.cpp index eae23394..4bbb0576 100644 --- a/dNet/AuthPackets.cpp +++ b/dNet/AuthPackets.cpp @@ -1,6 +1,5 @@ #include "AuthPackets.h" #include "PacketUtils.h" -#include "dMessageIdentifiers.h" #include "dNetCommon.h" #include "dServer.h" @@ -23,6 +22,9 @@ #include "dConfig.h" #include "eServerDisconnectIdentifiers.h" #include "eLoginResponse.h" +#include "eConnectionType.h" +#include "eServerMessageType.h" +#include "eMasterMessageType.h" void AuthPackets::HandleHandshake(dServer* server, Packet* packet) { RakNet::BitStream inStream(packet->data, packet->length, false); @@ -36,7 +38,7 @@ void AuthPackets::HandleHandshake(dServer* server, Packet* packet) { void AuthPackets::SendHandshake(dServer* server, const SystemAddress& sysAddr, const std::string& nextServerIP, uint16_t nextServerPort, const ServerType serverType) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, SERVER, MSG_SERVER_VERSION_CONFIRM); + PacketUtils::WriteHeader(bitStream, eConnectionType::SERVER, eServerMessageType::VERSION_CONFIRM); bitStream.Write(NET_VERSION); bitStream.Write(uint32_t(0x93)); @@ -189,7 +191,7 @@ void AuthPackets::HandleLoginRequest(dServer* server, Packet* packet) { void AuthPackets::SendLoginResponse(dServer* server, const SystemAddress& sysAddr, eLoginResponse responseCode, const std::string& errorMsg, const std::string& wServerIP, uint16_t wServerPort, std::string username) { RakNet::BitStream packet; - PacketUtils::WriteHeader(packet, CLIENT, MSG_CLIENT_LOGIN_RESPONSE); + PacketUtils::WriteHeader(packet, eConnectionType::CLIENT, eClientMessageType::LOGIN_RESPONSE); packet.Write(static_cast(responseCode)); @@ -255,7 +257,7 @@ void AuthPackets::SendLoginResponse(dServer* server, const SystemAddress& sysAdd //Inform the master server that we've created a session for this user: { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_SET_SESSION_KEY); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::SET_SESSION_KEY); bitStream.Write(sessionKey); PacketUtils::WriteString(bitStream, username, 66); server->SendToMaster(&bitStream); diff --git a/dNet/ChatPackets.cpp b/dNet/ChatPackets.cpp index 2d592c9b..41661523 100644 --- a/dNet/ChatPackets.cpp +++ b/dNet/ChatPackets.cpp @@ -8,12 +8,13 @@ #include "BitStream.h" #include "Game.h" #include "PacketUtils.h" -#include "dMessageIdentifiers.h" #include "dServer.h" +#include "eConnectionType.h" +#include "eChatMessageType.h" void ChatPackets::SendChatMessage(const SystemAddress& sysAddr, char chatChannel, const std::string& senderName, LWOOBJID playerObjectID, bool senderMythran, const std::u16string& message) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_GENERAL_CHAT_MESSAGE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::GENERAL_CHAT_MESSAGE); bitStream.Write(static_cast(0)); bitStream.Write(chatChannel); @@ -35,7 +36,7 @@ void ChatPackets::SendChatMessage(const SystemAddress& sysAddr, char chatChannel void ChatPackets::SendSystemMessage(const SystemAddress& sysAddr, const std::u16string& message, const bool broadcast) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_GENERAL_CHAT_MESSAGE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::GENERAL_CHAT_MESSAGE); bitStream.Write(static_cast(0)); bitStream.Write(static_cast(4)); @@ -67,7 +68,7 @@ void ChatPackets::SendMessageFail(const SystemAddress& sysAddr) { //0x01 - "Upgrade to a full LEGO Universe Membership to chat with other players." CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_SEND_CANNED_TEXT); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::SEND_CANNED_TEXT); bitStream.Write(0); //response type, options above ^ //docs say there's a wstring here-- no idea what it's for, or if it's even needed so leaving it as is for now. SEND_PACKET; diff --git a/dNet/ClientPackets.cpp b/dNet/ClientPackets.cpp index a1c08938..4ccbb609 100644 --- a/dNet/ClientPackets.cpp +++ b/dNet/ClientPackets.cpp @@ -31,7 +31,6 @@ #include "dConfig.h" #include "CharacterComponent.h" #include "Database.h" -#include "dMessageIdentifiers.h" #include "eGameMasterLevel.h" #include "eReplicaComponentType.h" diff --git a/dNet/MasterPackets.cpp b/dNet/MasterPackets.cpp index e5b80e05..4233a37d 100644 --- a/dNet/MasterPackets.cpp +++ b/dNet/MasterPackets.cpp @@ -1,22 +1,23 @@ #include "MasterPackets.h" #include "BitStream.h" #include "PacketUtils.h" -#include "dMessageIdentifiers.h" #include "dCommonVars.h" #include "dServer.h" +#include "eConnectionType.h" +#include "eMasterMessageType.h" #include void MasterPackets::SendPersistentIDRequest(dServer* server, uint64_t requestID) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_REQUEST_PERSISTENT_ID); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::REQUEST_PERSISTENT_ID); bitStream.Write(requestID); server->SendToMaster(&bitStream); } void MasterPackets::SendPersistentIDResponse(dServer* server, const SystemAddress& sysAddr, uint64_t requestID, uint32_t objID) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_REQUEST_PERSISTENT_ID_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::REQUEST_PERSISTENT_ID_RESPONSE); bitStream.Write(requestID); bitStream.Write(objID); @@ -26,7 +27,7 @@ void MasterPackets::SendPersistentIDResponse(dServer* server, const SystemAddres void MasterPackets::SendZoneTransferRequest(dServer* server, uint64_t requestID, bool mythranShift, uint32_t zoneID, uint32_t cloneID) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_REQUEST_ZONE_TRANSFER); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::REQUEST_ZONE_TRANSFER); bitStream.Write(requestID); bitStream.Write(static_cast(mythranShift)); @@ -38,7 +39,7 @@ void MasterPackets::SendZoneTransferRequest(dServer* server, uint64_t requestID, void MasterPackets::SendZoneCreatePrivate(dServer* server, uint32_t zoneID, uint32_t cloneID, const std::string& password) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_CREATE_PRIVATE_ZONE); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::CREATE_PRIVATE_ZONE); bitStream.Write(zoneID); bitStream.Write(cloneID); @@ -53,7 +54,7 @@ void MasterPackets::SendZoneCreatePrivate(dServer* server, uint32_t zoneID, uint void MasterPackets::SendZoneRequestPrivate(dServer* server, uint64_t requestID, bool mythranShift, const std::string& password) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_REQUEST_PRIVATE_ZONE); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::REQUEST_PRIVATE_ZONE); bitStream.Write(requestID); bitStream.Write(static_cast(mythranShift)); @@ -68,7 +69,7 @@ void MasterPackets::SendZoneRequestPrivate(dServer* server, uint64_t requestID, void MasterPackets::SendWorldReady(dServer* server, LWOMAPID zoneId, LWOINSTANCEID instanceId) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_WORLD_READY); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::WORLD_READY); bitStream.Write(zoneId); bitStream.Write(instanceId); @@ -78,7 +79,7 @@ void MasterPackets::SendWorldReady(dServer* server, LWOMAPID zoneId, LWOINSTANCE void MasterPackets::SendZoneTransferResponse(dServer* server, const SystemAddress& sysAddr, uint64_t requestID, bool mythranShift, uint32_t zoneID, uint32_t zoneInstance, uint32_t zoneClone, const std::string& serverIP, uint32_t serverPort) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_REQUEST_ZONE_TRANSFER_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::REQUEST_ZONE_TRANSFER_RESPONSE); bitStream.Write(requestID); bitStream.Write(static_cast(mythranShift)); @@ -110,7 +111,7 @@ void MasterPackets::HandleServerInfo(Packet* packet) { void MasterPackets::SendServerInfo(dServer* server, Packet* packet) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_SERVER_INFO); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::SERVER_INFO); bitStream.Write(server->GetPort()); bitStream.Write(server->GetZoneID()); diff --git a/dNet/PacketUtils.cpp b/dNet/PacketUtils.cpp index 307ff633..77b314d6 100644 --- a/dNet/PacketUtils.cpp +++ b/dNet/PacketUtils.cpp @@ -1,17 +1,9 @@ #include "PacketUtils.h" -#include #include #include #include "dLogger.h" #include "Game.h" -void PacketUtils::WriteHeader(RakNet::BitStream& bitStream, uint16_t connectionType, uint32_t internalPacketID) { - bitStream.Write(MessageID(ID_USER_PACKET_ENUM)); - bitStream.Write(connectionType); - bitStream.Write(internalPacketID); - bitStream.Write(uint8_t(0)); -} - uint16_t PacketUtils::ReadPacketU16(uint32_t startLoc, Packet* packet) { if (startLoc + 2 > packet->length) return 0; diff --git a/dNet/PacketUtils.h b/dNet/PacketUtils.h index fbbd1839..7c917f2e 100644 --- a/dNet/PacketUtils.h +++ b/dNet/PacketUtils.h @@ -1,11 +1,20 @@ #ifndef PACKETUTILS_H #define PACKETUTILS_H +#include #include #include +enum class eConnectionType : uint16_t; + namespace PacketUtils { - void WriteHeader(RakNet::BitStream& bitStream, uint16_t connectionType, uint32_t internalPacketID); + template + void WriteHeader(RakNet::BitStream& bitStream, eConnectionType connectionType, T internalPacketID) { + bitStream.Write(MessageID(ID_USER_PACKET_ENUM)); + bitStream.Write(connectionType); + bitStream.Write(internalPacketID); + bitStream.Write(uint8_t(0)); + } uint16_t ReadPacketU16(uint32_t startLoc, Packet* packet); uint32_t ReadPacketU32(uint32_t startLoc, Packet* packet); diff --git a/dNet/WorldPackets.cpp b/dNet/WorldPackets.cpp index 3be4fb4d..5fce14d3 100644 --- a/dNet/WorldPackets.cpp +++ b/dNet/WorldPackets.cpp @@ -1,7 +1,6 @@ #include "dCommonVars.h" #include "WorldPackets.h" #include "BitStream.h" -#include "dMessageIdentifiers.h" #include "PacketUtils.h" #include "GeneralUtils.h" #include "User.h" @@ -14,10 +13,11 @@ #include "dZoneManager.h" #include "CharacterComponent.h" #include "ZCompression.h" +#include "eConnectionType.h" void WorldPackets::SendLoadStaticZone(const SystemAddress& sysAddr, float x, float y, float z, uint32_t checksum) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_LOAD_STATIC_ZONE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::LOAD_STATIC_ZONE); auto zone = dZoneManager::Instance()->GetZone()->GetZoneID(); bitStream.Write(static_cast(zone.GetMapID())); @@ -41,7 +41,7 @@ void WorldPackets::SendCharacterList(const SystemAddress& sysAddr, User* user) { if (!user) return; RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_CHARACTER_LIST_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::CHARACTER_LIST_RESPONSE); std::vector characters = user->GetCharacters(); bitStream.Write(static_cast(characters.size())); @@ -90,28 +90,28 @@ void WorldPackets::SendCharacterList(const SystemAddress& sysAddr, User* user) { void WorldPackets::SendCharacterCreationResponse(const SystemAddress& sysAddr, eCharacterCreationResponse response) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_CHARACTER_CREATE_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::CHARACTER_CREATE_RESPONSE); bitStream.Write(response); SEND_PACKET; } void WorldPackets::SendCharacterRenameResponse(const SystemAddress& sysAddr, eRenameResponse response) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_CHARACTER_RENAME_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::CHARACTER_RENAME_RESPONSE); bitStream.Write(response); SEND_PACKET; } void WorldPackets::SendCharacterDeleteResponse(const SystemAddress& sysAddr, bool response) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_DELETE_CHARACTER_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::DELETE_CHARACTER_RESPONSE); bitStream.Write(static_cast(response)); SEND_PACKET; } void WorldPackets::SendTransferToWorld(const SystemAddress& sysAddr, const std::string& serverIP, uint32_t serverPort, bool mythranShift) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_TRANSFER_TO_WORLD); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::TRANSFER_TO_WORLD); PacketUtils::WriteString(bitStream, serverIP, 33); bitStream.Write(static_cast(serverPort)); @@ -122,14 +122,14 @@ void WorldPackets::SendTransferToWorld(const SystemAddress& sysAddr, const std:: void WorldPackets::SendServerState(const SystemAddress& sysAddr) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_SERVER_STATES); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::SERVER_STATES); bitStream.Write(static_cast(1)); //If the server is receiving this request, it probably is ready anyway. SEND_PACKET; } void WorldPackets::SendCreateCharacter(const SystemAddress& sysAddr, Entity* entity, const std::string& xmlData, const std::u16string& username, eGameMasterLevel gm) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_CREATE_CHARACTER); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::CREATE_CHARACTER); RakNet::BitStream data; data.Write(7); //LDF key count @@ -198,7 +198,7 @@ void WorldPackets::SendCreateCharacter(const SystemAddress& sysAddr, Entity* ent void WorldPackets::SendChatModerationResponse(const SystemAddress& sysAddr, bool requestAccepted, uint32_t requestID, const std::string& receiver, std::vector> unacceptedItems) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_CHAT_MODERATION_STRING); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::CHAT_MODERATION_STRING); bitStream.Write(unacceptedItems.empty()); // Is sentence ok? bitStream.Write(0x16); // Source ID, unknown @@ -222,7 +222,7 @@ void WorldPackets::SendChatModerationResponse(const SystemAddress& sysAddr, bool void WorldPackets::SendGMLevelChange(const SystemAddress& sysAddr, bool success, eGameMasterLevel highestLevel, eGameMasterLevel prevLevel, eGameMasterLevel newLevel) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_MAKE_GM_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::MAKE_GM_RESPONSE); bitStream.Write(success); bitStream.Write(static_cast(highestLevel)); diff --git a/dNet/dServer.cpp b/dNet/dServer.cpp index c91c7508..610f06a5 100644 --- a/dNet/dServer.cpp +++ b/dNet/dServer.cpp @@ -6,9 +6,11 @@ #include "RakNetworkFactory.h" #include "MessageIdentifiers.h" +#include "eConnectionType.h" +#include "eServerMessageType.h" +#include "eMasterMessageType.h" #include "PacketUtils.h" -#include "dMessageIdentifiers.h" #include "MasterPackets.h" #include "ZoneInstanceManager.h" @@ -118,14 +120,14 @@ Packet* dServer::ReceiveFromMaster() { } if (packet->data[0] == ID_USER_PACKET_ENUM) { - if (packet->data[1] == MASTER) { - switch (packet->data[3]) { - case MSG_MASTER_REQUEST_ZONE_TRANSFER_RESPONSE: { + if (static_cast(packet->data[1]) == eConnectionType::MASTER) { + switch (static_cast(packet->data[3])) { + case eMasterMessageType::REQUEST_ZONE_TRANSFER_RESPONSE: { uint64_t requestID = PacketUtils::ReadPacketU64(8, packet); ZoneInstanceManager::Instance()->HandleRequestZoneTransferResponse(requestID, packet); break; } - case MSG_MASTER_SHUTDOWN: + case eMasterMessageType::SHUTDOWN: *mShouldShutdown = true; break; @@ -166,7 +168,7 @@ void dServer::SendToMaster(RakNet::BitStream* bitStream) { void dServer::Disconnect(const SystemAddress& sysAddr, eServerDisconnectIdentifiers disconNotifyID) { RakNet::BitStream bitStream; - PacketUtils::WriteHeader(bitStream, SERVER, MSG_SERVER_DISCONNECT_NOTIFY); + PacketUtils::WriteHeader(bitStream, eConnectionType::SERVER, eServerMessageType::DISCONNECT_NOTIFY); bitStream.Write(disconNotifyID); mPeer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE_ORDERED, 0, sysAddr, false); diff --git a/dWorldServer/WorldServer.cpp b/dWorldServer/WorldServer.cpp index 71384207..4eca86f2 100644 --- a/dWorldServer/WorldServer.cpp +++ b/dWorldServer/WorldServer.cpp @@ -31,7 +31,6 @@ #include "PacketUtils.h" #include "WorldPackets.h" #include "UserManager.h" -#include "dMessageIdentifiers.h" #include "CDClientManager.h" #include "CDClientDatabase.h" #include "GeneralUtils.h" @@ -65,7 +64,12 @@ #include "NiPoint3.h" #include "eServerDisconnectIdentifiers.h" #include "eObjectBits.h" - +#include "eConnectionType.h" +#include "eServerMessageType.h" +#include "eChatInternalMessageType.h" +#include "eWorldMessageType.h" +#include "eMasterMessageType.h" +#include "eGameMessageType.h" #include "ZCompression.h" namespace Game { @@ -547,9 +551,9 @@ void HandlePacketChat(Packet* packet) { } if (packet->data[0] == ID_USER_PACKET_ENUM) { - if (packet->data[1] == CHAT_INTERNAL) { - switch (packet->data[3]) { - case MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER: { + if (static_cast(packet->data[1]) == eConnectionType::CHAT_INTERNAL) { + switch (static_cast(packet->data[3])) { + case eChatInternalMessageType::ROUTE_TO_PLAYER: { CINSTREAM; LWOOBJID playerID; inStream.Read(playerID); @@ -571,7 +575,7 @@ void HandlePacketChat(Packet* packet) { break; } - case MSG_CHAT_INTERNAL_ANNOUNCEMENT: { + case eChatInternalMessageType::ANNOUNCEMENT: { CINSTREAM; LWOOBJID header; inStream.Read(header); @@ -610,7 +614,7 @@ void HandlePacketChat(Packet* packet) { break; } - case MSG_CHAT_INTERNAL_MUTE_UPDATE: { + case eChatInternalMessageType::MUTE_UPDATE: { CINSTREAM; LWOOBJID playerId; time_t expire = 0; @@ -629,7 +633,7 @@ void HandlePacketChat(Packet* packet) { break; } - case MSG_CHAT_INTERNAL_TEAM_UPDATE: { + case eChatInternalMessageType::TEAM_UPDATE: { CINSTREAM; LWOOBJID header; inStream.Read(header); @@ -706,7 +710,7 @@ void HandlePacket(Packet* packet) { { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION); bitStream.Write(user->GetLoggedInChar()); Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false); } @@ -718,35 +722,35 @@ void HandlePacket(Packet* packet) { } CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_PLAYER_REMOVED); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::PLAYER_REMOVED); bitStream.Write((LWOMAPID)Game::server->GetZoneID()); bitStream.Write((LWOINSTANCEID)instanceID); Game::server->SendToMaster(&bitStream); } if (packet->data[0] != ID_USER_PACKET_ENUM) return; - if (packet->data[1] == SERVER) { - if (packet->data[3] == MSG_SERVER_VERSION_CONFIRM) { + if (static_cast(packet->data[1]) == eConnectionType::SERVER) { + if (static_cast(packet->data[3]) == eServerMessageType::VERSION_CONFIRM) { AuthPackets::HandleHandshake(Game::server, packet); } } - if (packet->data[1] == MASTER) { - switch (packet->data[3]) { - case MSG_MASTER_REQUEST_PERSISTENT_ID_RESPONSE: { + if (static_cast(packet->data[1]) == eConnectionType::MASTER) { + switch (static_cast(packet->data[3])) { + case eMasterMessageType::REQUEST_PERSISTENT_ID_RESPONSE: { uint64_t requestID = PacketUtils::ReadPacketU64(8, packet); uint32_t objectID = PacketUtils::ReadPacketU32(16, packet); ObjectIDManager::Instance()->HandleRequestPersistentIDResponse(requestID, objectID); break; } - case MSG_MASTER_REQUEST_ZONE_TRANSFER_RESPONSE: { + case eMasterMessageType::REQUEST_ZONE_TRANSFER_RESPONSE: { uint64_t requestID = PacketUtils::ReadPacketU64(8, packet); ZoneInstanceManager::Instance()->HandleRequestZoneTransferResponse(requestID, packet); break; } - case MSG_MASTER_SESSION_KEY_RESPONSE: { + case eMasterMessageType::SESSION_KEY_RESPONSE: { //Read our session key and to which user it belongs: RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -803,7 +807,7 @@ void HandlePacket(Packet* packet) { //Notify master: { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_PLAYER_ADDED); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::PLAYER_ADDED); bitStream.Write((LWOMAPID)Game::server->GetZoneID()); bitStream.Write((LWOINSTANCEID)instanceID); Game::server->SendToMaster(&bitStream); @@ -812,27 +816,27 @@ void HandlePacket(Packet* packet) { break; } - case MSG_MASTER_AFFIRM_TRANSFER_REQUEST: { + case eMasterMessageType::AFFIRM_TRANSFER_REQUEST: { const uint64_t requestID = PacketUtils::ReadPacketU64(8, packet); Game::logger->Log("MasterServer", "Got affirmation request of transfer %llu", requestID); CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_AFFIRM_TRANSFER_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::AFFIRM_TRANSFER_RESPONSE); bitStream.Write(requestID); Game::server->SendToMaster(&bitStream); break; } - case MSG_MASTER_SHUTDOWN: { + case eMasterMessageType::SHUTDOWN: { Game::shouldShutdown = true; Game::logger->Log("WorldServer", "Got shutdown request from master, zone (%i), instance (%i)", Game::server->GetZoneID(), Game::server->GetInstanceID()); break; } - case MSG_MASTER_NEW_SESSION_ALERT: { + case eMasterMessageType::NEW_SESSION_ALERT: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); uint32_t sessionKey = inStream.Read(sessionKey); @@ -870,10 +874,10 @@ void HandlePacket(Packet* packet) { return; } - if (packet->data[1] != WORLD) return; + if (static_cast(packet->data[1]) != eConnectionType::WORLD) return; - switch (packet->data[3]) { - case MSG_WORLD_CLIENT_VALIDATION: { + switch (static_cast(packet->data[3])) { + case eWorldMessageType::VALIDATION: { std::string username = PacketUtils::ReadString(0x08, packet, true); std::string sessionKey = PacketUtils::ReadString(74, packet, true); std::string clientDatabaseChecksum = PacketUtils::ReadString(packet->length - 33, packet, false); @@ -905,7 +909,7 @@ void HandlePacket(Packet* packet) { //Request the session info from Master: CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_REQUEST_SESSION_KEY); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::REQUEST_SESSION_KEY); PacketUtils::WriteString(bitStream, username, 64); Game::server->SendToMaster(&bitStream); @@ -918,7 +922,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_WORLD_CLIENT_CHARACTER_LIST_REQUEST: { + case eWorldMessageType::CHARACTER_LIST_REQUEST: { //We need to delete the entity first, otherwise the char list could delete it while it exists in the world! if (Game::server->GetZoneID() != 0) { auto user = UserManager::Instance()->GetUser(packet->systemAddress); @@ -940,12 +944,12 @@ void HandlePacket(Packet* packet) { break; } - case MSG_WORLD_CLIENT_GAME_MSG: { + case eWorldMessageType::GAME_MSG: { RakNet::BitStream bitStream(packet->data, packet->length, false); uint64_t header; LWOOBJID objectID; - uint16_t messageID; + eGameMessageType messageID; bitStream.Read(header); bitStream.Read(objectID); @@ -954,16 +958,16 @@ void HandlePacket(Packet* packet) { RakNet::BitStream dataStream; bitStream.Read(dataStream, bitStream.GetNumberOfUnreadBits()); - GameMessageHandler::HandleMessage(&dataStream, packet->systemAddress, objectID, GAME_MSG(messageID)); + GameMessageHandler::HandleMessage(&dataStream, packet->systemAddress, objectID, messageID); break; } - case MSG_WORLD_CLIENT_CHARACTER_CREATE_REQUEST: { + case eWorldMessageType::CHARACTER_CREATE_REQUEST: { UserManager::Instance()->CreateCharacter(packet->systemAddress, packet); break; } - case MSG_WORLD_CLIENT_LOGIN_REQUEST: { + case eWorldMessageType::LOGIN_REQUEST: { RakNet::BitStream inStream(packet->data, packet->length, false); uint64_t header = inStream.Read(header); @@ -979,7 +983,7 @@ void HandlePacket(Packet* packet) { // This means we swapped characters and we need to remove the previous player from the container. if (static_cast(lastCharacter) != playerID) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION); bitStream.Write(lastCharacter); Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false); } @@ -989,18 +993,18 @@ void HandlePacket(Packet* packet) { break; } - case MSG_WORLD_CLIENT_CHARACTER_DELETE_REQUEST: { + case eWorldMessageType::CHARACTER_DELETE_REQUEST: { UserManager::Instance()->DeleteCharacter(packet->systemAddress, packet); UserManager::Instance()->RequestCharacterList(packet->systemAddress); break; } - case MSG_WORLD_CLIENT_CHARACTER_RENAME_REQUEST: { + case eWorldMessageType::CHARACTER_RENAME_REQUEST: { UserManager::Instance()->RenameCharacter(packet->systemAddress, packet); break; } - case MSG_WORLD_CLIENT_LEVEL_LOAD_COMPLETE: { + case eWorldMessageType::LEVEL_LOAD_COMPLETE: { Game::logger->Log("WorldServer", "Received level load complete from user."); User* user = UserManager::Instance()->GetUser(packet->systemAddress); if (user) { @@ -1128,7 +1132,7 @@ void HandlePacket(Packet* packet) { GeneralUtils::SetBit(blueprintID, eObjectBits::PERSISTENT); CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_BLUEPRINT_SAVE_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::BLUEPRINT_SAVE_RESPONSE); bitStream.Write(LWOOBJID_EMPTY); //always zero so that a check on the client passes bitStream.Write(eBlueprintSaveResponseType::EverythingWorked); bitStream.Write(1); @@ -1169,7 +1173,7 @@ void HandlePacket(Packet* packet) { //RakNet::RakString playerName(player->GetCharacter()->GetName().c_str()); CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_PLAYER_ADDED_NOTIFICATION); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::PLAYER_ADDED_NOTIFICATION); bitStream.Write(player->GetObjectID()); bitStream.Write(playerName.size()); for (size_t i = 0; i < playerName.size(); i++) { @@ -1194,12 +1198,12 @@ void HandlePacket(Packet* packet) { break; } - case MSG_WORLD_CLIENT_POSITION_UPDATE: { + case eWorldMessageType::POSITION_UPDATE: { ClientPackets::HandleClientPositionUpdate(packet->systemAddress, packet); break; } - case MSG_WORLD_CLIENT_MAIL: { + case eWorldMessageType::MAIL: { RakNet::BitStream bitStream(packet->data, packet->length, false); LWOOBJID space; bitStream.Read(space); @@ -1207,7 +1211,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_WORLD_CLIENT_ROUTE_PACKET: { + case eWorldMessageType::ROUTE_PACKET: { //Yeet to chat CINSTREAM; uint64_t header = 0; @@ -1222,7 +1226,7 @@ void HandlePacket(Packet* packet) { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, CHAT, packet->data[14]); + PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, packet->data[14]); //We need to insert the player's objectID so the chat server can find who originated this request: LWOOBJID objectID = 0; @@ -1243,12 +1247,12 @@ void HandlePacket(Packet* packet) { break; } - case MSG_WORLD_CLIENT_STRING_CHECK: { + case eWorldMessageType::STRING_CHECK: { ClientPackets::HandleChatModerationRequest(packet->systemAddress, packet); break; } - case MSG_WORLD_CLIENT_GENERAL_CHAT_MESSAGE: { + case eWorldMessageType::GENERAL_CHAT_MESSAGE: { if (chatDisabled) { ChatPackets::SendMessageFail(packet->systemAddress); } else { @@ -1258,7 +1262,7 @@ void HandlePacket(Packet* packet) { break; } - case MSG_WORLD_CLIENT_HANDLE_FUNNESS: { + case eWorldMessageType::HANDLE_FUNNESS: { //This means the client is running slower or faster than it should. //Could be insane lag, but I'mma just YEET them as it's usually speedhacking. //This is updated to now count the amount of times we've been caught "speedhacking" to kick with a delay @@ -1346,6 +1350,6 @@ void FinalizeShutdown() { void SendShutdownMessageToMaster() { CBITSTREAM; - PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_SHUTDOWN_RESPONSE); + PacketUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::SHUTDOWN_RESPONSE); Game::server->SendToMaster(&bitStream); } From df3265c82e7ea712a892e5e7974e79044c6981ef Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Fri, 5 May 2023 23:31:30 -0700 Subject: [PATCH 07/33] Add more null checks and split out code Makes crash logs more apparent for what stage they crashed in for the engine updating. --- dGame/EntityManager.cpp | 69 +++++++++++-------- dGame/EntityManager.h | 4 ++ .../ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp | 45 ++++++------ 3 files changed, 67 insertions(+), 51 deletions(-) diff --git a/dGame/EntityManager.cpp b/dGame/EntityManager.cpp index 1a77d365..0fc859bd 100644 --- a/dGame/EntityManager.cpp +++ b/dGame/EntityManager.cpp @@ -161,9 +161,7 @@ void EntityManager::DestroyEntity(const LWOOBJID& objectID) { } void EntityManager::DestroyEntity(Entity* entity) { - if (entity == nullptr) { - return; - } + if (!entity) return; entity->TriggerEvent(eTriggerEventType::DESTROY, entity); @@ -182,15 +180,11 @@ void EntityManager::DestroyEntity(Entity* entity) { ScheduleForDeletion(id); } -void EntityManager::UpdateEntities(const float deltaTime) { - for (const auto& e : m_Entities) { - e.second->Update(deltaTime); - } - +void EntityManager::SerializeEntities() { for (auto entry = m_EntitiesToSerialize.begin(); entry != m_EntitiesToSerialize.end(); entry++) { auto* entity = GetEntity(*entry); - if (entity == nullptr) continue; + if (!entity) continue; m_SerializationCounter++; @@ -212,11 +206,16 @@ void EntityManager::UpdateEntities(const float deltaTime) { } } m_EntitiesToSerialize.clear(); +} +void EntityManager::KillEntities() { for (auto entry = m_EntitiesToKill.begin(); entry != m_EntitiesToKill.end(); entry++) { auto* entity = GetEntity(*entry); - if (!entity) continue; + if (!entity) { + Game::logger->Log("EntityManager", "Attempting to kill null entity %llu", *entry); + continue; + } if (entity->GetScheduledKiller()) { entity->Smash(entity->GetScheduledKiller()->GetObjectID(), eKillType::SILENT); @@ -225,32 +224,41 @@ void EntityManager::UpdateEntities(const float deltaTime) { } } m_EntitiesToKill.clear(); +} +void EntityManager::DeleteEntities() { for (auto entry = m_EntitiesToDelete.begin(); entry != m_EntitiesToDelete.end(); entry++) { - - // Get all this info first before we delete the player. auto entityToDelete = GetEntity(*entry); - auto networkIdToErase = entityToDelete->GetNetworkId(); - const auto& ghostingToDelete = std::find(m_EntitiesToGhost.begin(), m_EntitiesToGhost.end(), entityToDelete); - if (entityToDelete) { - // If we are a player run through the player destructor. - if (entityToDelete->IsPlayer()) { - delete dynamic_cast(entityToDelete); - } else { - delete entityToDelete; - } + // Get all this info first before we delete the player. + auto networkIdToErase = entityToDelete->GetNetworkId(); + const auto& ghostingToDelete = std::find(m_EntitiesToGhost.begin(), m_EntitiesToGhost.end(), entityToDelete); + + delete entityToDelete; + entityToDelete = nullptr; + if (networkIdToErase != 0) m_LostNetworkIds.push(networkIdToErase); + + if (ghostingToDelete != m_EntitiesToGhost.end()) m_EntitiesToGhost.erase(ghostingToDelete); + } else { + Game::logger->Log("EntityManager", "Attempted to delete non-existent entity %llu", *entry); } - - if (ghostingToDelete != m_EntitiesToGhost.end()) m_EntitiesToGhost.erase(ghostingToDelete); - m_Entities.erase(*entry); } m_EntitiesToDelete.clear(); } +void EntityManager::UpdateEntities(const float deltaTime) { + for (const auto& e : m_Entities) { + e.second->Update(deltaTime); + } + + SerializeEntities(); + KillEntities(); + DeleteEntities(); +} + Entity* EntityManager::GetEntity(const LWOOBJID& objectId) const { const auto& index = m_Entities.find(objectId); @@ -316,6 +324,11 @@ const std::unordered_map& EntityManager::GetSpawnPointEnt } void EntityManager::ConstructEntity(Entity* entity, const SystemAddress& sysAddr, const bool skipChecks) { + if (!entity) { + Game::logger->Log("EntityManager", "Attempted to construct null entity"); + return; + } + if (entity->GetNetworkId() == 0) { uint16_t networkId; @@ -395,9 +408,7 @@ void EntityManager::ConstructAllEntities(const SystemAddress& sysAddr) { } void EntityManager::DestructEntity(Entity* entity, const SystemAddress& sysAddr) { - if (entity->GetNetworkId() == 0) { - return; - } + if (!entity || entity->GetNetworkId() == 0) return; RakNet::BitStream stream; @@ -414,9 +425,7 @@ void EntityManager::DestructEntity(Entity* entity, const SystemAddress& sysAddr) } void EntityManager::SerializeEntity(Entity* entity) { - if (entity->GetNetworkId() == 0) { - return; - } + if (!entity || entity->GetNetworkId() == 0) return; if (std::find(m_EntitiesToSerialize.begin(), m_EntitiesToSerialize.end(), entity->GetObjectID()) == m_EntitiesToSerialize.end()) { m_EntitiesToSerialize.push_back(entity->GetObjectID()); diff --git a/dGame/EntityManager.h b/dGame/EntityManager.h index 0314cc09..b524344c 100644 --- a/dGame/EntityManager.h +++ b/dGame/EntityManager.h @@ -85,6 +85,10 @@ public: const uint32_t GetHardcoreUscoreEnemiesMultiplier() { return m_HardcoreUscoreEnemiesMultiplier; }; private: + void SerializeEntities(); + void KillEntities(); + void DeleteEntities(); + static EntityManager* m_Address; //For singleton method static std::vector m_GhostingExcludedZones; static std::vector m_GhostingExcludedLOTs; diff --git a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp index bdd7a506..50cd229a 100644 --- a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp +++ b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp @@ -275,6 +275,11 @@ void SGCannon::OnActivityTimerDone(Entity* self, const std::string& name) { toSpawn.spawnPaths.at(pathIndex) ); + if (!path) { + Game::logger->Log("SGCannon", "Path %s at index %i is null", toSpawn.spawnPaths.at(pathIndex).c_str(), pathIndex); + return; + } + auto info = EntityInfo{}; info.lot = toSpawn.lot; info.spawnerID = self->GetObjectID(); @@ -294,32 +299,30 @@ void SGCannon::OnActivityTimerDone(Entity* self, const std::string& name) { auto* enemy = EntityManager::Instance()->CreateEntity(info, nullptr, self); EntityManager::Instance()->ConstructEntity(enemy); - if (true) { - auto* movementAI = new MovementAIComponent(enemy, {}); + auto* movementAI = new MovementAIComponent(enemy, {}); - enemy->AddComponent(eReplicaComponentType::MOVEMENT_AI, movementAI); + enemy->AddComponent(eReplicaComponentType::MOVEMENT_AI, movementAI); - movementAI->SetSpeed(toSpawn.initialSpeed); - movementAI->SetCurrentSpeed(toSpawn.initialSpeed); - movementAI->SetHaltDistance(0.0f); + movementAI->SetSpeed(toSpawn.initialSpeed); + movementAI->SetCurrentSpeed(toSpawn.initialSpeed); + movementAI->SetHaltDistance(0.0f); - std::vector pathWaypoints; + std::vector pathWaypoints; - for (const auto& waypoint : path->pathWaypoints) { - pathWaypoints.push_back(waypoint.position); - } - - if (GeneralUtils::GenerateRandomNumber(0, 1) < 0.5f) { - std::reverse(pathWaypoints.begin(), pathWaypoints.end()); - } - - movementAI->SetPath(pathWaypoints); - - enemy->AddDieCallback([this, self, enemy, name]() { - RegisterHit(self, enemy, name); - }); + for (const auto& waypoint : path->pathWaypoints) { + pathWaypoints.push_back(waypoint.position); } + if (GeneralUtils::GenerateRandomNumber(0, 1) < 0.5f) { + std::reverse(pathWaypoints.begin(), pathWaypoints.end()); + } + + movementAI->SetPath(pathWaypoints); + + enemy->AddDieCallback([this, self, enemy, name]() { + RegisterHit(self, enemy, name); + }); + // Save the enemy and tell it to start pathing if (enemy != nullptr) { const_cast&>(self->GetVar>(SpawnedObjects)).push_back(enemy->GetObjectID()); @@ -577,7 +580,7 @@ void SGCannon::StopGame(Entity* self, bool cancel) { self->SetNetworkVar(u"UI_Rewards", GeneralUtils::to_u16string(self->GetVar(TotalScoreVariable)) + u"_0_0_0_0_0_0" - ); + ); GameMessages::SendRequestActivitySummaryLeaderboardData( player->GetObjectID(), From 5479cf44287a0f8c542252a5ee7f7a54045473ea Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Sat, 6 May 2023 13:32:26 -0500 Subject: [PATCH 08/33] Fix typing of some player flag variables (#1067) Mainly on properties Tested that the spider queen mission can now be progressed --- dScripts/02_server/Map/AG_Spider_Queen/ZoneAgSpiderQueen.cpp | 4 ++-- dScripts/02_server/Map/Property/AG_Med/ZoneAgMedProperty.cpp | 4 ++-- dScripts/02_server/Map/Property/AG_Small/ZoneAgProperty.cpp | 4 ++-- dScripts/BasePropertyServer.cpp | 4 ++-- dScripts/ai/PROPERTY/AgPropguards.cpp | 2 +- dScripts/ai/PROPERTY/AgPropguards.h | 2 +- dScripts/zone/PROPERTY/FV/ZoneFvProperty.cpp | 4 ++-- dScripts/zone/PROPERTY/GF/ZoneGfProperty.cpp | 4 ++-- dScripts/zone/PROPERTY/NS/ZoneNsProperty.cpp | 4 ++-- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/dScripts/02_server/Map/AG_Spider_Queen/ZoneAgSpiderQueen.cpp b/dScripts/02_server/Map/AG_Spider_Queen/ZoneAgSpiderQueen.cpp index 5996548f..2711b179 100644 --- a/dScripts/02_server/Map/AG_Spider_Queen/ZoneAgSpiderQueen.cpp +++ b/dScripts/02_server/Map/AG_Spider_Queen/ZoneAgSpiderQueen.cpp @@ -9,8 +9,8 @@ void ZoneAgSpiderQueen::SetGameVariables(Entity* self) { ZoneAgProperty::SetGameVariables(self); // Disable property flags - self->SetVar(defeatedProperyFlag, 0); - self->SetVar(placedModelFlag, 0); + self->SetVar(defeatedProperyFlag, 0); + self->SetVar(placedModelFlag, 0); self->SetVar(guardFirstMissionFlag, 0); self->SetVar(guardMissionFlag, 0); self->SetVar(brickLinkMissionIDFlag, 0); diff --git a/dScripts/02_server/Map/Property/AG_Med/ZoneAgMedProperty.cpp b/dScripts/02_server/Map/Property/AG_Med/ZoneAgMedProperty.cpp index db1c4c4b..46ec7bbd 100644 --- a/dScripts/02_server/Map/Property/AG_Med/ZoneAgMedProperty.cpp +++ b/dScripts/02_server/Map/Property/AG_Med/ZoneAgMedProperty.cpp @@ -31,8 +31,8 @@ void ZoneAgMedProperty::SetGameVariables(Entity* self) { self->SetVar>(AmbientFXSpawner, { "BirdFX", "SunBeam" }); self->SetVar>(BehaviorObjsSpawner, {}); - self->SetVar(defeatedProperyFlag, 118); - self->SetVar(placedModelFlag, 119); + self->SetVar(defeatedProperyFlag, 118); + self->SetVar(placedModelFlag, 119); self->SetVar(guardMissionFlag, 1293); self->SetVar(brickLinkMissionIDFlag, 1294); self->SetVar(passwordFlag, "s3kratK1ttN"); diff --git a/dScripts/02_server/Map/Property/AG_Small/ZoneAgProperty.cpp b/dScripts/02_server/Map/Property/AG_Small/ZoneAgProperty.cpp index 635eb8b3..6bf91768 100644 --- a/dScripts/02_server/Map/Property/AG_Small/ZoneAgProperty.cpp +++ b/dScripts/02_server/Map/Property/AG_Small/ZoneAgProperty.cpp @@ -39,8 +39,8 @@ void ZoneAgProperty::SetGameVariables(Entity* self) { self->SetVar(LauncherSpawner, "Launcher"); self->SetVar(InstancerSpawner, "Instancer"); - self->SetVar(defeatedProperyFlag, 71); - self->SetVar(placedModelFlag, 73); + self->SetVar(defeatedProperyFlag, 71); + self->SetVar(placedModelFlag, 73); self->SetVar(guardFirstMissionFlag, 891); self->SetVar(guardMissionFlag, 320); self->SetVar(brickLinkMissionIDFlag, 951); diff --git a/dScripts/BasePropertyServer.cpp b/dScripts/BasePropertyServer.cpp index 1522ef26..72cce09f 100644 --- a/dScripts/BasePropertyServer.cpp +++ b/dScripts/BasePropertyServer.cpp @@ -38,8 +38,8 @@ void BasePropertyServer::SetGameVariables(Entity* self) { self->SetVar>(AmbientFXSpawner, {}); self->SetVar>(BehaviorObjsSpawner, {}); - self->SetVar(defeatedProperyFlag, 0); - self->SetVar(placedModelFlag, 0); + self->SetVar(defeatedProperyFlag, 0); + self->SetVar(placedModelFlag, 0); self->SetVar(guardMissionFlag, 0); self->SetVar(brickLinkMissionIDFlag, 0); self->SetVar(passwordFlag, "s3kratK1ttN"); diff --git a/dScripts/ai/PROPERTY/AgPropguards.cpp b/dScripts/ai/PROPERTY/AgPropguards.cpp index 9fc6010a..7e8e2fd1 100644 --- a/dScripts/ai/PROPERTY/AgPropguards.cpp +++ b/dScripts/ai/PROPERTY/AgPropguards.cpp @@ -39,7 +39,7 @@ void AgPropguards::OnMissionDialogueOK(Entity* self, Entity* target, int mission } } -uint32_t AgPropguards::GetFlagForMission(uint32_t missionID) { +int32_t AgPropguards::GetFlagForMission(uint32_t missionID) { switch (missionID) { case 872: return 97; diff --git a/dScripts/ai/PROPERTY/AgPropguards.h b/dScripts/ai/PROPERTY/AgPropguards.h index 25701f86..ed2e3cb0 100644 --- a/dScripts/ai/PROPERTY/AgPropguards.h +++ b/dScripts/ai/PROPERTY/AgPropguards.h @@ -4,5 +4,5 @@ class AgPropguards : public CppScripts::Script { void OnMissionDialogueOK(Entity* self, Entity* target, int missionID, eMissionState missionState) override; private: - static uint32_t GetFlagForMission(uint32_t missionID); + static int32_t GetFlagForMission(uint32_t missionID); }; diff --git a/dScripts/zone/PROPERTY/FV/ZoneFvProperty.cpp b/dScripts/zone/PROPERTY/FV/ZoneFvProperty.cpp index 67ada039..8b8072ad 100644 --- a/dScripts/zone/PROPERTY/FV/ZoneFvProperty.cpp +++ b/dScripts/zone/PROPERTY/FV/ZoneFvProperty.cpp @@ -29,8 +29,8 @@ void ZoneFvProperty::SetGameVariables(Entity* self) { self->SetVar>(AmbientFXSpawner, { "Ash", "FX", "Fog" }); self->SetVar>(BehaviorObjsSpawner, {}); - self->SetVar(defeatedProperyFlag, 99); - self->SetVar(placedModelFlag, 107); + self->SetVar(defeatedProperyFlag, 99); + self->SetVar(placedModelFlag, 107); self->SetVar(guardMissionFlag, 874); self->SetVar(brickLinkMissionIDFlag, 950); self->SetVar(passwordFlag, "s3kratK1ttN"); diff --git a/dScripts/zone/PROPERTY/GF/ZoneGfProperty.cpp b/dScripts/zone/PROPERTY/GF/ZoneGfProperty.cpp index 565d8cd6..87b2345d 100644 --- a/dScripts/zone/PROPERTY/GF/ZoneGfProperty.cpp +++ b/dScripts/zone/PROPERTY/GF/ZoneGfProperty.cpp @@ -29,8 +29,8 @@ void ZoneGfProperty::SetGameVariables(Entity* self) { self->SetVar>(AmbientFXSpawner, { "Birds", "Falls", "Sunbeam" }); self->SetVar>(BehaviorObjsSpawner, { "TrappedPlatform", "IceBarrier", "FireBeast" }); - self->SetVar(defeatedProperyFlag, 98); - self->SetVar(placedModelFlag, 106); + self->SetVar(defeatedProperyFlag, 98); + self->SetVar(placedModelFlag, 106); self->SetVar(guardMissionFlag, 873); self->SetVar(brickLinkMissionIDFlag, 949); self->SetVar(passwordFlag, "s3kratK1ttN"); diff --git a/dScripts/zone/PROPERTY/NS/ZoneNsProperty.cpp b/dScripts/zone/PROPERTY/NS/ZoneNsProperty.cpp index 49364ee8..52bb02e2 100644 --- a/dScripts/zone/PROPERTY/NS/ZoneNsProperty.cpp +++ b/dScripts/zone/PROPERTY/NS/ZoneNsProperty.cpp @@ -30,8 +30,8 @@ void ZoneNsProperty::SetGameVariables(Entity* self) { self->SetVar>(AmbientFXSpawner, { "Rockets" }); self->SetVar>(BehaviorObjsSpawner, { "Cage", "Platform", "Door" }); - self->SetVar(defeatedProperyFlag, 97); - self->SetVar(placedModelFlag, 105); + self->SetVar(defeatedProperyFlag, 97); + self->SetVar(placedModelFlag, 105); self->SetVar(guardMissionFlag, 872); self->SetVar(brickLinkMissionIDFlag, 948); self->SetVar(passwordFlag, "s3kratK1ttN"); From cffb1449d86193e408ca0565eccab780907db915 Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Sat, 6 May 2023 11:32:38 -0700 Subject: [PATCH 09/33] Add better logs to saving (#1068) * Fix overread in projectile behavior * Fix stuns * Correctly read in bitStream * Fix projectile behavior * Address movement type issues * Update shutdown time to be accurate * Fix small issues * Fix missing template * Add note for compile jobs * Add bounds check for speed division * Add better logs --- dGame/Character.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dGame/Character.cpp b/dGame/Character.cpp index e565ed4f..319b9376 100644 --- a/dGame/Character.cpp +++ b/dGame/Character.cpp @@ -373,7 +373,7 @@ void Character::SaveXMLToDatabase() { //Call upon the entity to update our xmlDoc: if (!m_OurEntity) { - Game::logger->Log("Character", "We didn't have an entity set while saving! CHARACTER WILL NOT BE SAVED!"); + Game::logger->Log("Character", "%i:%s didn't have an entity set while saving! CHARACTER WILL NOT BE SAVED!", this->GetID(), this->GetName().c_str()); return; } @@ -384,7 +384,7 @@ void Character::SaveXMLToDatabase() { //For metrics, log the time it took to save: auto end = std::chrono::system_clock::now(); std::chrono::duration elapsed = end - start; - Game::logger->Log("Character", "Saved character to Database in: %fs", elapsed.count()); + Game::logger->Log("Character", "%i:%s Saved character to Database in: %fs", this->GetID(), this->GetName().c_str(), elapsed.count()); } void Character::SetIsNewLogin() { @@ -396,7 +396,7 @@ void Character::SetIsNewLogin() { while (currentChild) { if (currentChild->Attribute("si")) { flags->DeleteChild(currentChild); - Game::logger->Log("Character", "Removed isLoggedIn flag from character %i, saving character to database", GetID()); + Game::logger->Log("Character", "Removed isLoggedIn flag from character %i:%s, saving character to database", GetID(), GetName().c_str()); WriteToDatabase(); } currentChild = currentChild->NextSiblingElement(); From 7949907517411da0aeeb508676c15745280c5a03 Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Sat, 6 May 2023 11:32:46 -0700 Subject: [PATCH 10/33] Fix bounds check (#1070) --- dPhysics/dpGrid.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dPhysics/dpGrid.cpp b/dPhysics/dpGrid.cpp index b4fe385e..1631c91a 100644 --- a/dPhysics/dpGrid.cpp +++ b/dPhysics/dpGrid.cpp @@ -63,13 +63,13 @@ void dpGrid::Move(dpEntity* entity, float x, float z) { if (cellX < 0) cellX = 0; if (cellZ < 0) cellZ = 0; - if (cellX > NUM_CELLS) cellX = NUM_CELLS; - if (cellZ > NUM_CELLS) cellZ = NUM_CELLS; + if (cellX >= NUM_CELLS) cellX = NUM_CELLS - 1; + if (cellZ >= NUM_CELLS) cellZ = NUM_CELLS - 1; if (oldCellX < 0) oldCellX = 0; if (oldCellZ < 0) oldCellZ = 0; - if (oldCellX > NUM_CELLS) oldCellX = NUM_CELLS; - if (oldCellZ > NUM_CELLS) oldCellZ = NUM_CELLS; + if (oldCellX >= NUM_CELLS) oldCellX = NUM_CELLS - 1; + if (oldCellZ >= NUM_CELLS) oldCellZ = NUM_CELLS - 1; if (oldCellX == cellX && oldCellZ == cellZ) return; From 33c12f3bc5998d7af601571aed01a13df99c34f4 Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Sat, 6 May 2023 11:32:53 -0700 Subject: [PATCH 11/33] Fix bounds check (#1071) Fix Chat Crash Update CMakeVariables.txt Add checks for all servers --- dAuthServer/AuthServer.cpp | 2 ++ dChatServer/ChatServer.cpp | 2 ++ dMasterServer/MasterServer.cpp | 2 ++ dWorldServer/WorldServer.cpp | 2 +- 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dAuthServer/AuthServer.cpp b/dAuthServer/AuthServer.cpp index ddec32db..262886d7 100644 --- a/dAuthServer/AuthServer.cpp +++ b/dAuthServer/AuthServer.cpp @@ -171,6 +171,8 @@ dLogger* SetupLogger() { } void HandlePacket(Packet* packet) { + if (packet->length < 4) return; + if (packet->data[0] == ID_USER_PACKET_ENUM) { if (static_cast(packet->data[1]) == eConnectionType::SERVER) { if (static_cast(packet->data[3]) == eServerMessageType::VERSION_CONFIRM) { diff --git a/dChatServer/ChatServer.cpp b/dChatServer/ChatServer.cpp index 3e3ddfd3..b9fb8556 100644 --- a/dChatServer/ChatServer.cpp +++ b/dChatServer/ChatServer.cpp @@ -203,6 +203,8 @@ void HandlePacket(Packet* packet) { Game::logger->Log("ChatServer", "A server is connecting, awaiting user list."); } + if (packet->length < 4) return; // Nothing left to process. Need 4 bytes to continue. + if (static_cast(packet->data[1]) == eConnectionType::CHAT_INTERNAL) { switch (static_cast(packet->data[3])) { case eChatInternalMessageType::PLAYER_ADDED_NOTIFICATION: diff --git a/dMasterServer/MasterServer.cpp b/dMasterServer/MasterServer.cpp index 4b524d8d..bc0937c2 100644 --- a/dMasterServer/MasterServer.cpp +++ b/dMasterServer/MasterServer.cpp @@ -495,6 +495,8 @@ void HandlePacket(Packet* packet) { } } + if (packet->length < 4) return; + if (static_cast(packet->data[1]) == eConnectionType::MASTER) { switch (static_cast(packet->data[3])) { case eMasterMessageType::REQUEST_PERSISTENT_ID: { diff --git a/dWorldServer/WorldServer.cpp b/dWorldServer/WorldServer.cpp index 4eca86f2..26cbe7ba 100644 --- a/dWorldServer/WorldServer.cpp +++ b/dWorldServer/WorldServer.cpp @@ -728,7 +728,7 @@ void HandlePacket(Packet* packet) { Game::server->SendToMaster(&bitStream); } - if (packet->data[0] != ID_USER_PACKET_ENUM) return; + if (packet->data[0] != ID_USER_PACKET_ENUM || packet->length < 4) return; if (static_cast(packet->data[1]) == eConnectionType::SERVER) { if (static_cast(packet->data[3]) == eServerMessageType::VERSION_CONFIRM) { AuthPackets::HandleHandshake(Game::server, packet); From 7e616385957ec683b48067e9c5960f17a270c7aa Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Sat, 6 May 2023 23:45:07 -0700 Subject: [PATCH 12/33] Reinforce PacketUtils writing (#1073) Ensure the correct size is written to the bitstream. It is always supposed to write 64 bits. --- dNet/PacketUtils.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dNet/PacketUtils.h b/dNet/PacketUtils.h index 7c917f2e..d07759a0 100644 --- a/dNet/PacketUtils.h +++ b/dNet/PacketUtils.h @@ -10,10 +10,10 @@ enum class eConnectionType : uint16_t; namespace PacketUtils { template void WriteHeader(RakNet::BitStream& bitStream, eConnectionType connectionType, T internalPacketID) { - bitStream.Write(MessageID(ID_USER_PACKET_ENUM)); - bitStream.Write(connectionType); - bitStream.Write(internalPacketID); - bitStream.Write(uint8_t(0)); + bitStream.Write(MessageID(ID_USER_PACKET_ENUM)); + bitStream.Write(connectionType); + bitStream.Write(static_cast(internalPacketID)); + bitStream.Write(0); } uint16_t ReadPacketU16(uint32_t startLoc, Packet* packet); From 8ceabadcded407f424c65c7cacc825c761840daf Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Mon, 8 May 2023 04:38:08 -0500 Subject: [PATCH 13/33] Removed some hardcoded logic for racing (#1075) Including return world and what activity ID to use for rewards --- dGame/dComponents/RacingControlComponent.cpp | 36 +++++-------------- .../dComponents/ScriptedActivityComponent.cpp | 6 ++-- dGame/dUtilities/SlashCommandHandler.cpp | 17 ++------- dGame/dUtilities/SlashCommandHandler.h | 2 -- dZoneManager/dZoneManager.cpp | 13 +++++++ dZoneManager/dZoneManager.h | 1 + 6 files changed, 27 insertions(+), 48 deletions(-) diff --git a/dGame/dComponents/RacingControlComponent.cpp b/dGame/dComponents/RacingControlComponent.cpp index 703ec7f3..3134d5fe 100644 --- a/dGame/dComponents/RacingControlComponent.cpp +++ b/dGame/dComponents/RacingControlComponent.cpp @@ -23,6 +23,8 @@ #include "dConfig.h" #include "Loot.h" #include "eMissionTaskType.h" +#include "dZoneManager.h" +#include "CDActivitiesTable.h" #ifndef M_PI #define M_PI 3.14159265358979323846264338327950288 @@ -45,36 +47,14 @@ RacingControlComponent::RacingControlComponent(Entity* parent) m_EmptyTimer = 0; m_SoloRacing = Game::config->GetValue("solo_racing") == "1"; - // Select the main world ID as fallback when a player fails to load. - + m_MainWorld = 1200; const auto worldID = Game::server->GetZoneID(); + if (dZoneManager::Instance()->CheckIfAccessibleZone((worldID/10)*10)) m_MainWorld = (worldID/10)*10; - switch (worldID) { - case 1203: - m_ActivityID = 42; - m_MainWorld = 1200; - break; - - case 1261: - m_ActivityID = 60; - m_MainWorld = 1260; - break; - - case 1303: - m_ActivityID = 39; - m_MainWorld = 1300; - break; - - case 1403: - m_ActivityID = 54; - m_MainWorld = 1400; - break; - - default: - m_ActivityID = 42; - m_MainWorld = 1200; - break; - } + m_ActivityID = 42; + CDActivitiesTable* activitiesTable = CDClientManager::Instance().GetTable(); + std::vector activities = activitiesTable->Query([=](CDActivities entry) {return (entry.instanceMapID == worldID); }); + for (CDActivities activity : activities) m_ActivityID = activity.ActivityID; } RacingControlComponent::~RacingControlComponent() {} diff --git a/dGame/dComponents/ScriptedActivityComponent.cpp b/dGame/dComponents/ScriptedActivityComponent.cpp index eb4ab761..555332f4 100644 --- a/dGame/dComponents/ScriptedActivityComponent.cpp +++ b/dGame/dComponents/ScriptedActivityComponent.cpp @@ -27,6 +27,7 @@ #include "CDCurrencyTableTable.h" #include "CDActivityRewardsTable.h" #include "CDActivitiesTable.h" +#include "LeaderboardManager.h" ScriptedActivityComponent::ScriptedActivityComponent(Entity* parent, int activityID) : Component(parent) { m_ActivityID = activityID; @@ -35,10 +36,7 @@ ScriptedActivityComponent::ScriptedActivityComponent(Entity* parent, int activit for (CDActivities activity : activities) { m_ActivityInfo = activity; - - const auto mapID = m_ActivityInfo.instanceMapID; - - if ((mapID == 1203 || mapID == 1261 || mapID == 1303 || mapID == 1403) && Game::config->GetValue("solo_racing") == "1") { + if (static_cast(activity.leaderboardType) == LeaderboardType::Racing && Game::config->GetValue("solo_racing") == "1") { m_ActivityInfo.minTeamSize = 1; m_ActivityInfo.minTeams = 1; } diff --git a/dGame/dUtilities/SlashCommandHandler.cpp b/dGame/dUtilities/SlashCommandHandler.cpp index 07950d7a..16db62a6 100644 --- a/dGame/dUtilities/SlashCommandHandler.cpp +++ b/dGame/dUtilities/SlashCommandHandler.cpp @@ -279,7 +279,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit if (chatCommand == "leave-zone") { const auto currentZone = dZoneManager::Instance()->GetZone()->GetZoneID().GetMapID(); - auto newZone = 0; + LWOMAPID newZone = 0; if (currentZone % 100 == 0) { ChatPackets::SendSystemMessage(sysAddr, u"You are not in an instanced zone."); return; @@ -287,7 +287,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit newZone = (currentZone / 100) * 100; } // If new zone would be inaccessible, then default to Avant Gardens. - if (!CheckIfAccessibleZone(newZone)) newZone = 1100; + if (!dZoneManager::Instance()->CheckIfAccessibleZone(newZone)) newZone = 1100; ChatPackets::SendSystemMessage(sysAddr, u"Leaving zone..."); @@ -1559,7 +1559,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit const auto objid = entity->GetObjectID(); - if (force || CheckIfAccessibleZone(reqZone)) { // to prevent tomfoolery + if (force || dZoneManager::Instance()->CheckIfAccessibleZone(reqZone)) { // to prevent tomfoolery ZoneInstanceManager::Instance()->RequestZoneTransfer(Game::server, reqZone, cloneId, false, [objid](bool mythranShift, uint32_t zoneID, uint32_t zoneInstance, uint32_t zoneClone, std::string serverIP, uint16_t serverPort) { @@ -2021,17 +2021,6 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit } } -bool SlashCommandHandler::CheckIfAccessibleZone(const unsigned int zoneID) { - //We're gonna go ahead and presume we've got the db loaded already: - CDZoneTableTable* zoneTable = CDClientManager::Instance().GetTable(); - const CDZoneTable* zone = zoneTable->Query(zoneID); - if (zone != nullptr) { - return Game::assetManager->HasFile(("maps/" + zone->zoneName).c_str()); - } else { - return false; - } -} - void SlashCommandHandler::SendAnnouncement(const std::string& title, const std::string& message) { AMFArrayValue args; auto* titleValue = new AMFStringValue(); diff --git a/dGame/dUtilities/SlashCommandHandler.h b/dGame/dUtilities/SlashCommandHandler.h index 9ef09a2f..85b7c697 100644 --- a/dGame/dUtilities/SlashCommandHandler.h +++ b/dGame/dUtilities/SlashCommandHandler.h @@ -13,8 +13,6 @@ class Entity; namespace SlashCommandHandler { void HandleChatCommand(const std::u16string& command, Entity* entity, const SystemAddress& sysAddr); - bool CheckIfAccessibleZone(const unsigned int zoneID); - void SendAnnouncement(const std::string& title, const std::string& message); }; diff --git a/dZoneManager/dZoneManager.cpp b/dZoneManager/dZoneManager.cpp index 1a40748d..a26e912f 100644 --- a/dZoneManager/dZoneManager.cpp +++ b/dZoneManager/dZoneManager.cpp @@ -12,6 +12,8 @@ #include "CDZoneTableTable.h" #include #include "eObjectBits.h" +#include "CDZoneTableTable.h" +#include "AssetManager.h" #include "../dWorldServer/ObjectIDManager.h" @@ -227,6 +229,17 @@ uint32_t dZoneManager::GetUniqueMissionIdStartingValue() { return m_UniqueMissionIdStart; } +bool dZoneManager::CheckIfAccessibleZone(LWOMAPID zoneID) { + //We're gonna go ahead and presume we've got the db loaded already: + CDZoneTableTable* zoneTable = CDClientManager::Instance().GetTable(); + const CDZoneTable* zone = zoneTable->Query(zoneID); + if (zone != nullptr) { + return Game::assetManager->HasFile(("maps/" + zone->zoneName).c_str()); + } else { + return false; + } +} + void dZoneManager::LoadWorldConfig() { Game::logger->Log("dZoneManager", "Loading WorldConfig into memory"); diff --git a/dZoneManager/dZoneManager.h b/dZoneManager/dZoneManager.h index c1776e79..3086e6d7 100644 --- a/dZoneManager/dZoneManager.h +++ b/dZoneManager/dZoneManager.h @@ -50,6 +50,7 @@ public: Entity* GetZoneControlObject() { return m_ZoneControlObject; } bool GetPlayerLoseCoinOnDeath() { return m_PlayerLoseCoinsOnDeath; } uint32_t GetUniqueMissionIdStartingValue(); + bool CheckIfAccessibleZone(LWOMAPID zoneID); // The world config should not be modified by a caller. const WorldConfig* GetWorldConfig() { From 7aad6e4bc2b399b26ca732a25ac9204f4bdbf6d6 Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Mon, 8 May 2023 04:31:10 -0700 Subject: [PATCH 14/33] Make header skips more obvious (#1074) * Make header skips more obvious seeing inStream.Read(LWOOBJID) is much less clear than a macro which very clearly skips the header. * Formatting pass --- dChatServer/ChatPacketHandler.cpp | 36 +++++++++----------------- dChatServer/PlayerContainer.cpp | 12 +++------ dCommon/dEnums/dCommonVars.h | 2 ++ dNet/ClientPackets.cpp | 8 ++---- dWorldServer/WorldServer.cpp | 18 ++++--------- tests/dCommonTests/CMakeLists.txt | 1 + tests/dCommonTests/HeaderSkipTest.cpp | 37 +++++++++++++++++++++++++++ 7 files changed, 63 insertions(+), 51 deletions(-) create mode 100644 tests/dCommonTests/HeaderSkipTest.cpp diff --git a/dChatServer/ChatPacketHandler.cpp b/dChatServer/ChatPacketHandler.cpp index 9b5ca761..878cc71c 100644 --- a/dChatServer/ChatPacketHandler.cpp +++ b/dChatServer/ChatPacketHandler.cpp @@ -22,10 +22,9 @@ extern PlayerContainer playerContainer; void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) { //Get from the packet which player we want to do something with: - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID = 0; inStream.Read(playerID); - inStream.Read(playerID); auto player = playerContainer.GetPlayerData(playerID); if (!player) return; @@ -99,10 +98,9 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) { auto maxNumberOfBestFriendsAsString = Game::config->GetValue("max_number_of_best_friends"); // If this config option doesn't exist, default to 5 which is what live used. auto maxNumberOfBestFriends = maxNumberOfBestFriendsAsString != "" ? std::stoi(maxNumberOfBestFriendsAsString) : 5U; - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID requestorPlayerID; inStream.Read(requestorPlayerID); - inStream.Read(requestorPlayerID); uint32_t spacing{}; inStream.Read(spacing); std::string playerName = ""; @@ -247,10 +245,9 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) { } void ChatPacketHandler::HandleFriendResponse(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID; inStream.Read(playerID); - inStream.Read(playerID); eAddFriendResponseCode clientResponseCode = static_cast(packet->data[0x14]); std::string friendName = PacketUtils::ReadString(0x15, packet, true); @@ -323,10 +320,9 @@ void ChatPacketHandler::HandleFriendResponse(Packet* packet) { } void ChatPacketHandler::HandleRemoveFriend(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID; inStream.Read(playerID); - inStream.Read(playerID); std::string friendName = PacketUtils::ReadString(0x14, packet, true); //we'll have to query the db here to find the user, since you can delete them while they're offline. @@ -381,10 +377,9 @@ void ChatPacketHandler::HandleRemoveFriend(Packet* packet) { } void ChatPacketHandler::HandleChatMessage(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID = LWOOBJID_EMPTY; inStream.Read(playerID); - inStream.Read(playerID); auto* sender = playerContainer.GetPlayerData(playerID); @@ -501,10 +496,9 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) { } void ChatPacketHandler::HandleTeamInvite(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID; inStream.Read(playerID); - inStream.Read(playerID); std::string invitedPlayer = PacketUtils::ReadString(0x14, packet, true); auto* player = playerContainer.GetPlayerData(playerID); @@ -542,10 +536,9 @@ void ChatPacketHandler::HandleTeamInvite(Packet* packet) { } void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID = LWOOBJID_EMPTY; inStream.Read(playerID); - inStream.Read(playerID); uint32_t size = 0; inStream.Read(size); char declined = 0; @@ -576,10 +569,9 @@ void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) { } void ChatPacketHandler::HandleTeamLeave(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID = LWOOBJID_EMPTY; inStream.Read(playerID); - inStream.Read(playerID); uint32_t size = 0; inStream.Read(size); @@ -593,10 +585,9 @@ void ChatPacketHandler::HandleTeamLeave(Packet* packet) { } void ChatPacketHandler::HandleTeamKick(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID = LWOOBJID_EMPTY; inStream.Read(playerID); - inStream.Read(playerID); std::string kickedPlayer = PacketUtils::ReadString(0x14, packet, true); @@ -624,10 +615,9 @@ void ChatPacketHandler::HandleTeamKick(Packet* packet) { } void ChatPacketHandler::HandleTeamPromote(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID = LWOOBJID_EMPTY; inStream.Read(playerID); - inStream.Read(playerID); std::string promotedPlayer = PacketUtils::ReadString(0x14, packet, true); @@ -647,10 +637,9 @@ void ChatPacketHandler::HandleTeamPromote(Packet* packet) { } void ChatPacketHandler::HandleTeamLootOption(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID = LWOOBJID_EMPTY; inStream.Read(playerID); - inStream.Read(playerID); uint32_t size = 0; inStream.Read(size); @@ -671,10 +660,9 @@ void ChatPacketHandler::HandleTeamLootOption(Packet* packet) { } void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID = LWOOBJID_EMPTY; inStream.Read(playerID); - inStream.Read(playerID); auto* team = playerContainer.GetTeam(playerID); auto* data = playerContainer.GetPlayerData(playerID); diff --git a/dChatServer/PlayerContainer.cpp b/dChatServer/PlayerContainer.cpp index dcc9ebb9..689ffd77 100644 --- a/dChatServer/PlayerContainer.cpp +++ b/dChatServer/PlayerContainer.cpp @@ -19,9 +19,8 @@ PlayerContainer::~PlayerContainer() { } void PlayerContainer::InsertPlayer(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; PlayerData* data = new PlayerData(); - inStream.SetReadOffset(inStream.GetReadOffset() + 64); inStream.Read(data->playerID); uint32_t len; @@ -52,9 +51,8 @@ void PlayerContainer::InsertPlayer(Packet* packet) { } void PlayerContainer::RemovePlayer(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID; - inStream.Read(playerID); //skip header inStream.Read(playerID); //Before they get kicked, we need to also send a message to their friends saying that they disconnected. @@ -97,9 +95,8 @@ void PlayerContainer::RemovePlayer(Packet* packet) { } void PlayerContainer::MuteUpdate(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID; - inStream.Read(playerID); //skip header inStream.Read(playerID); time_t expire = 0; inStream.Read(expire); @@ -118,9 +115,8 @@ void PlayerContainer::MuteUpdate(Packet* packet) { } void PlayerContainer::CreateTeamServer(Packet* packet) { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID; - inStream.Read(playerID); //skip header inStream.Read(playerID); size_t membersSize = 0; inStream.Read(membersSize); diff --git a/dCommon/dEnums/dCommonVars.h b/dCommon/dEnums/dCommonVars.h index e11866f1..f67145da 100644 --- a/dCommon/dEnums/dCommonVars.h +++ b/dCommon/dEnums/dCommonVars.h @@ -28,8 +28,10 @@ constexpr uint32_t lowFrameDelta = FRAMES_TO_MS(lowFramerate); //========== MACROS =========== +#define HEADER_SIZE 8 #define CBITSTREAM RakNet::BitStream bitStream; #define CINSTREAM RakNet::BitStream inStream(packet->data, packet->length, false); +#define CINSTREAM_SKIP_HEADER CINSTREAM if (inStream.GetNumberOfUnreadBits() >= BYTES_TO_BITS(HEADER_SIZE)) inStream.IgnoreBytes(HEADER_SIZE); else inStream.IgnoreBits(inStream.GetNumberOfUnreadBits()); #define CMSGHEADER PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::GAME_MSG); #define SEND_PACKET Game::server->Send(&bitStream, sysAddr, false); #define SEND_PACKET_BROADCAST Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true); diff --git a/dNet/ClientPackets.cpp b/dNet/ClientPackets.cpp index 4ccbb609..1c22bdcd 100644 --- a/dNet/ClientPackets.cpp +++ b/dNet/ClientPackets.cpp @@ -46,9 +46,7 @@ void ClientPackets::HandleChatMessage(const SystemAddress& sysAddr, Packet* pack return; } - CINSTREAM; - uint64_t header; - inStream.Read(header); + CINSTREAM_SKIP_HEADER; char chatChannel; uint16_t unknown; @@ -82,9 +80,7 @@ void ClientPackets::HandleClientPositionUpdate(const SystemAddress& sysAddr, Pac return; } - CINSTREAM; - uint64_t header; - inStream.Read(header); + CINSTREAM_SKIP_HEADER; Entity* entity = EntityManager::Instance()->GetEntity(user->GetLastUsedChar()->GetObjectID()); if (!entity) return; diff --git a/dWorldServer/WorldServer.cpp b/dWorldServer/WorldServer.cpp index 26cbe7ba..5dabce1c 100644 --- a/dWorldServer/WorldServer.cpp +++ b/dWorldServer/WorldServer.cpp @@ -554,10 +554,9 @@ void HandlePacketChat(Packet* packet) { if (static_cast(packet->data[1]) == eConnectionType::CHAT_INTERNAL) { switch (static_cast(packet->data[3])) { case eChatInternalMessageType::ROUTE_TO_PLAYER: { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerID; inStream.Read(playerID); - inStream.Read(playerID); auto player = EntityManager::Instance()->GetEntity(playerID); if (!player) return; @@ -576,9 +575,7 @@ void HandlePacketChat(Packet* packet) { } case eChatInternalMessageType::ANNOUNCEMENT: { - CINSTREAM; - LWOOBJID header; - inStream.Read(header); + CINSTREAM_SKIP_HEADER; std::string title; std::string msg; @@ -615,11 +612,10 @@ void HandlePacketChat(Packet* packet) { } case eChatInternalMessageType::MUTE_UPDATE: { - CINSTREAM; + CINSTREAM_SKIP_HEADER; LWOOBJID playerId; time_t expire = 0; inStream.Read(playerId); - inStream.Read(playerId); inStream.Read(expire); auto* entity = EntityManager::Instance()->GetEntity(playerId); @@ -634,9 +630,7 @@ void HandlePacketChat(Packet* packet) { } case eChatInternalMessageType::TEAM_UPDATE: { - CINSTREAM; - LWOOBJID header; - inStream.Read(header); + CINSTREAM_SKIP_HEADER; LWOOBJID teamID = 0; char lootOption = 0; @@ -1213,10 +1207,8 @@ void HandlePacket(Packet* packet) { case eWorldMessageType::ROUTE_PACKET: { //Yeet to chat - CINSTREAM; - uint64_t header = 0; + CINSTREAM_SKIP_HEADER; uint32_t size = 0; - inStream.Read(header); inStream.Read(size); if (size > 20000) { diff --git a/tests/dCommonTests/CMakeLists.txt b/tests/dCommonTests/CMakeLists.txt index dd282cb5..444afbdd 100644 --- a/tests/dCommonTests/CMakeLists.txt +++ b/tests/dCommonTests/CMakeLists.txt @@ -1,5 +1,6 @@ set(DCOMMONTEST_SOURCES "AMFDeserializeTests.cpp" + "HeaderSkipTest.cpp" "TestLDFFormat.cpp" "TestNiPoint3.cpp" "TestEncoding.cpp" diff --git a/tests/dCommonTests/HeaderSkipTest.cpp b/tests/dCommonTests/HeaderSkipTest.cpp new file mode 100644 index 00000000..a8f78078 --- /dev/null +++ b/tests/dCommonTests/HeaderSkipTest.cpp @@ -0,0 +1,37 @@ +#include + +#include "dCommonDependencies.h" +#include "dCommonVars.h" +#include "BitStream.h" + +#define PacketUniquePtr std::unique_ptr + +TEST(dCommonTests, HeaderSkipExcessTest) { + PacketUniquePtr packet = std::make_unique(); + unsigned char headerAndData[] = { 0x53, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 }; // positive + packet->data = headerAndData; + packet->length = sizeof(headerAndData); + CINSTREAM_SKIP_HEADER; + ASSERT_EQ(inStream.GetNumberOfUnreadBits(), 64); + ASSERT_EQ(inStream.GetNumberOfBitsAllocated(), 128); +} + +TEST(dCommonTests, HeaderSkipExactDataTest) { + PacketUniquePtr packet = std::make_unique(); + unsigned char header[] = { 0x53, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00 }; // positive + packet->data = header; + packet->length = sizeof(header); + CINSTREAM_SKIP_HEADER; + ASSERT_EQ(inStream.GetNumberOfUnreadBits(), 0); + ASSERT_EQ(inStream.GetNumberOfBitsAllocated(), 64); +} + +TEST(dCommonTests, HeaderSkipNotEnoughDataTest) { + PacketUniquePtr packet = std::make_unique(); + unsigned char notEnoughData[] = { 0x53, 0x02, 0x00, 0x07, 0x00, 0x00 }; // negative + packet->data = notEnoughData; + packet->length = sizeof(notEnoughData); + CINSTREAM_SKIP_HEADER; + ASSERT_EQ(inStream.GetNumberOfUnreadBits(), 0); + ASSERT_EQ(inStream.GetNumberOfBitsAllocated(), 48); +} From ce931c2cfe2c1e8a6f80953d290b19010bd00a8b Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Mon, 8 May 2023 22:39:43 -0700 Subject: [PATCH 15/33] Fix erroneous GM message ID (#1076) --- dCommon/dEnums/eGameMessageType.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dCommon/dEnums/eGameMessageType.h b/dCommon/dEnums/eGameMessageType.h index 247ee5e2..051a5ae8 100644 --- a/dCommon/dEnums/eGameMessageType.h +++ b/dCommon/dEnums/eGameMessageType.h @@ -273,7 +273,7 @@ enum class eGameMessageType : uint16_t { TEAM_SET_LEADER = 1557, TEAM_INVITE_CONFIRM = 1558, TEAM_GET_STATUS_RESPONSE = 1559, - TEAM_ADD_PLAYER = 1526, + TEAM_ADD_PLAYER = 1562, TEAM_REMOVE_PLAYER = 1563, START_CELEBRATION_EFFECT = 1618, ADD_BUFF = 1647, From 4ff5afd9f7ea5d4df732256351ca01b45fdaa3c7 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Tue, 9 May 2023 00:40:00 -0500 Subject: [PATCH 16/33] Fix race exit dialogue always exiting (#1077) Fixes #1048 Tested that closing the dialog via esc, the x in the top right, or the big red x doesn't exit the race Tested that the green check button does exit the race --- dGame/dComponents/RacingControlComponent.cpp | 5 ++--- dGame/dComponents/RacingControlComponent.h | 7 ++++++- dGame/dGameMessages/GameMessages.cpp | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/dGame/dComponents/RacingControlComponent.cpp b/dGame/dComponents/RacingControlComponent.cpp index 3134d5fe..44c9de36 100644 --- a/dGame/dComponents/RacingControlComponent.cpp +++ b/dGame/dComponents/RacingControlComponent.cpp @@ -362,8 +362,7 @@ void RacingControlComponent::OnRacingPlayerInfoResetFinished(Entity* player) { } } -void RacingControlComponent::HandleMessageBoxResponse(Entity* player, - const std::string& id) { +void RacingControlComponent::HandleMessageBoxResponse(Entity* player, int32_t button, const std::string& id) { auto* data = GetPlayerData(player->GetObjectID()); if (data == nullptr) { @@ -405,7 +404,7 @@ void RacingControlComponent::HandleMessageBoxResponse(Entity* player, missionComponent->Progress(eMissionTaskType::RACING, dZoneManager::Instance()->GetZone()->GetWorldID(), (LWOOBJID)eRacingTaskParam::LAST_PLACE_FINISH); // Finished first place in specific world. } } - } else if (id == "ACT_RACE_EXIT_THE_RACE?" || id == "Exit") { + } else if (id == "ACT_RACE_EXIT_THE_RACE?" && button == m_ActivityExitConfirm) { auto* vehicle = EntityManager::Instance()->GetEntity(data->vehicleID); if (vehicle == nullptr) { diff --git a/dGame/dComponents/RacingControlComponent.h b/dGame/dComponents/RacingControlComponent.h index 91ab2fd4..a81121e1 100644 --- a/dGame/dComponents/RacingControlComponent.h +++ b/dGame/dComponents/RacingControlComponent.h @@ -144,7 +144,7 @@ public: /** * Invoked when the player responds to the GUI. */ - void HandleMessageBoxResponse(Entity* player, const std::string& id); + void HandleMessageBoxResponse(Entity* player, int32_t button, const std::string& id); /** * Get the racing data from a player's LWOOBJID. @@ -246,4 +246,9 @@ private: float m_EmptyTimer; bool m_SoloRacing; + + /** + * Value for message box response to know if we are exiting the race via the activity dialogue + */ + const int32_t m_ActivityExitConfirm = 1; }; diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index caab6459..99b1c67f 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -3891,7 +3891,7 @@ void GameMessages::HandleMessageBoxResponse(RakNet::BitStream* inStream, Entity* auto* racingControlComponent = entity->GetComponent(); if (racingControlComponent != nullptr) { - racingControlComponent->HandleMessageBoxResponse(userEntity, GeneralUtils::UTF16ToWTF8(identifier)); + racingControlComponent->HandleMessageBoxResponse(userEntity, iButton, GeneralUtils::UTF16ToWTF8(identifier)); } for (auto* shootingGallery : EntityManager::Instance()->GetEntitiesByComponent(eReplicaComponentType::SHOOTING_GALLERY)) { From b1cd2776fa2528adb4ba8e300ce03798dd6e6fd6 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Wed, 10 May 2023 04:05:56 -0500 Subject: [PATCH 17/33] fix: make exiting the race work (#1082) --- dGame/dComponents/RacingControlComponent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dGame/dComponents/RacingControlComponent.cpp b/dGame/dComponents/RacingControlComponent.cpp index 44c9de36..4a4ead59 100644 --- a/dGame/dComponents/RacingControlComponent.cpp +++ b/dGame/dComponents/RacingControlComponent.cpp @@ -404,7 +404,7 @@ void RacingControlComponent::HandleMessageBoxResponse(Entity* player, int32_t bu missionComponent->Progress(eMissionTaskType::RACING, dZoneManager::Instance()->GetZone()->GetWorldID(), (LWOOBJID)eRacingTaskParam::LAST_PLACE_FINISH); // Finished first place in specific world. } } - } else if (id == "ACT_RACE_EXIT_THE_RACE?" && button == m_ActivityExitConfirm) { + } else if ((id == "ACT_RACE_EXIT_THE_RACE?" || id == "Exit") && button == m_ActivityExitConfirm) { auto* vehicle = EntityManager::Instance()->GetEntity(data->vehicleID); if (vehicle == nullptr) { From bf0ae6f181399620cd1e2f266f7092ae29375d9c Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Wed, 10 May 2023 07:44:21 -0500 Subject: [PATCH 18/33] fix: add check for arg nums on handlepushobject (#1081) --- dGame/dComponents/TriggerComponent.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dGame/dComponents/TriggerComponent.cpp b/dGame/dComponents/TriggerComponent.cpp index 3f05d805..7adf47a8 100644 --- a/dGame/dComponents/TriggerComponent.cpp +++ b/dGame/dComponents/TriggerComponent.cpp @@ -235,6 +235,8 @@ void TriggerComponent::HandleRotateObject(Entity* targetEntity, std::vector argArray){ + if (argArray.size() < 3) return; + auto* phantomPhysicsComponent = m_Parent->GetComponent(); if (!phantomPhysicsComponent) { Game::logger->LogDebug("TriggerComponent::HandlePushObject", "Phantom Physics component not found!"); From 5af5b0f1c13942a59d0ec3f93f74345bc3be03f6 Mon Sep 17 00:00:00 2001 From: Aaron Kimbre Date: Wed, 10 May 2023 19:26:04 -0500 Subject: [PATCH 19/33] fix: not exiting shooting gallery when clicking activity close button Fixes #436 Fixes crash when replaying as well --- dGame/Entity.cpp | 6 ++ dGame/Entity.h | 1 + dGame/dGameMessages/GameMessageHandler.cpp | 3 + dGame/dGameMessages/GameMessages.cpp | 16 +++++ dGame/dGameMessages/GameMessages.h | 1 + dScripts/CppScripts.h | 9 +++ .../ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp | 66 +++++++++---------- dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.h | 7 +- 8 files changed, 70 insertions(+), 39 deletions(-) diff --git a/dGame/Entity.cpp b/dGame/Entity.cpp index b9fc79fb..0cc2f070 100644 --- a/dGame/Entity.cpp +++ b/dGame/Entity.cpp @@ -1485,6 +1485,12 @@ void Entity::OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16s } } +void Entity::RequestActivityExit(Entity* sender, LWOOBJID player, bool canceled) { + for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) { + script->OnRequestActivityExit(sender, player, canceled); + } +} + void Entity::Smash(const LWOOBJID source, const eKillType killType, const std::u16string& deathType) { if (!m_PlayerIsReadyForUpdates) return; diff --git a/dGame/Entity.h b/dGame/Entity.h index b980b179..90f2a34f 100644 --- a/dGame/Entity.h +++ b/dGame/Entity.h @@ -207,6 +207,7 @@ public: void OnMessageBoxResponse(Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData); void OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16string& buttonIdentifier, const std::u16string& identifier); + void RequestActivityExit(Entity* sender, LWOOBJID player, bool canceled); void Smash(const LWOOBJID source = LWOOBJID_EMPTY, const eKillType killType = eKillType::VIOLENT, const std::u16string& deathType = u""); void Kill(Entity* murderer = nullptr); diff --git a/dGame/dGameMessages/GameMessageHandler.cpp b/dGame/dGameMessages/GameMessageHandler.cpp index 50c7876b..be751598 100644 --- a/dGame/dGameMessages/GameMessageHandler.cpp +++ b/dGame/dGameMessages/GameMessageHandler.cpp @@ -677,6 +677,9 @@ void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const System case eGameMessageType::ZONE_SUMMARY_DISMISSED: GameMessages::HandleZoneSummaryDismissed(inStream, entity); break; + case eGameMessageType::REQUEST_ACTIVITY_EXIT: + GameMessages::HandleRequestActivityExit(inStream, entity); + break; default: // Game::logger->Log("GameMessageHandler", "Unknown game message ID: %i", messageID); break; diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index 99b1c67f..7ebbf761 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -91,6 +91,7 @@ #include "eReplicaComponentType.h" #include "eClientMessageType.h" #include "eGameMessageType.h" +#include "ActivityManager.h" #include "CDComponentsRegistryTable.h" #include "CDObjectsTable.h" @@ -6204,3 +6205,18 @@ void GameMessages::SendShowBillboardInteractIcon(const SystemAddress& sysAddr, L if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST else SEND_PACKET } + +void GameMessages::HandleRequestActivityExit(RakNet::BitStream* inStream, Entity* entity) { + bool canceled = false; + inStream->Read(canceled); + if (!canceled) return; + + LWOOBJID player_id = LWOOBJID_EMPTY; + inStream->Read(player_id); + auto player = EntityManager::Instance()->GetEntity(player_id); + if (!entity || !player) return; + + for (auto* shootingGallery : EntityManager::Instance()->GetEntitiesByComponent(eReplicaComponentType::SHOOTING_GALLERY)) { + shootingGallery->RequestActivityExit(entity, player_id, true); + } +} diff --git a/dGame/dGameMessages/GameMessages.h b/dGame/dGameMessages/GameMessages.h index ce24a105..94b24b65 100644 --- a/dGame/dGameMessages/GameMessages.h +++ b/dGame/dGameMessages/GameMessages.h @@ -648,6 +648,7 @@ namespace GameMessages { void SendDeactivateBubbleBuffFromServer(LWOOBJID objectId, const SystemAddress& sysAddr); void HandleZoneSummaryDismissed(RakNet::BitStream* inStream, Entity* entity); + void HandleRequestActivityExit(RakNet::BitStream* inStream, Entity* entity); }; #endif // GAMEMESSAGES_H diff --git a/dScripts/CppScripts.h b/dScripts/CppScripts.h index 4bf3720f..1b9d0591 100644 --- a/dScripts/CppScripts.h +++ b/dScripts/CppScripts.h @@ -349,6 +349,15 @@ namespace CppScripts { * @param itemObjId The items Object ID */ virtual void OnFactionTriggerItemUnequipped(Entity* itemOwner, LWOOBJID itemObjId) {}; + + /** + * Handles exiting a scripted activity + * + * @param sender + * @param player the player to remove + * @param canceled if it was done via the cancel button + */ + virtual void OnRequestActivityExit(Entity* sender, LWOOBJID player, bool canceled){}; }; Script* GetScript(Entity* parent, const std::string& scriptName); diff --git a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp index 50cd229a..c3274da1 100644 --- a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp +++ b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp @@ -135,38 +135,26 @@ void SGCannon::OnActivityStateChangeRequest(Entity* self, LWOOBJID senderID, int } } -void SGCannon::OnMessageBoxResponse(Entity* self, Entity* sender, int32_t button, const std::u16string& identifier, - const std::u16string& userData) { +void SGCannon::OnMessageBoxResponse(Entity* self, Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData) { auto* player = EntityManager::Instance()->GetEntity(self->GetVar(PlayerIDVariable)); - if (player != nullptr) { - if (button == 1 && identifier == u"Shooting_Gallery_Stop") { + if (!player) return; + + if (identifier == u"Scoreboardinfo") { + GameMessages::SendDisplayMessageBox(player->GetObjectID(), true, + dZoneManager::Instance()->GetZoneControlObject()->GetObjectID(), + u"Shooting_Gallery_Retry", 2, u"Retry?", + u"", player->GetSystemAddress()); + } else { + if ((button == 1 && (identifier == u"Shooting_Gallery_Retry" || identifier == u"RePlay")) || identifier == u"SG1" || button == 0) { + if (IsPlayerInActivity(self, player->GetObjectID())) return; + self->SetNetworkVar(ClearVariable, true); + StartGame(self); + } else if (button == 0 && ((identifier == u"Shooting_Gallery_Retry" || identifier == u"RePlay"))){ + RemovePlayer(player->GetObjectID()); + UpdatePlayer(self, player->GetObjectID(), true); + } else if (button == 1 && identifier == u"Shooting_Gallery_Exit") { UpdatePlayer(self, player->GetObjectID(), true); RemovePlayer(player->GetObjectID()); - StopGame(self, true); - return; - } - - if (identifier == u"Scoreboardinfo") { - GameMessages::SendDisplayMessageBox(player->GetObjectID(), true, - dZoneManager::Instance()->GetZoneControlObject()->GetObjectID(), - u"Shooting_Gallery_Retry?", 2, u"Retry?", - u"", player->GetSystemAddress()); - } else { - if ((button == 1 && (identifier == u"Shooting_Gallery_Retry" || identifier == u"RePlay")) - || identifier == u"SG1" || button == 0) { - - if (identifier == u"RePlay") { - static_cast(player)->SendToZone(1300); - - return; - } - - self->SetNetworkVar(ClearVariable, true); - StartGame(self); - } else if (button == 1 && identifier == u"Shooting_Gallery_Exit") { - UpdatePlayer(self, player->GetObjectID(), true); - RemovePlayer(player->GetObjectID()); - } } } } @@ -267,14 +255,13 @@ void SGCannon::OnActivityTimerDone(Entity* self, const std::string& name) { if (self->GetVar(GameStartedVariable)) { const auto spawnNumber = (uint32_t)std::stoi(name.substr(7)); const auto& activeSpawns = self->GetVar>(ActiveSpawnsVariable); + if (activeSpawns.size() < spawnNumber) { + Game::logger->Log("SGCannon", "Trying to spawn %i when spawns size is only %i", spawnNumber, activeSpawns.size()); + return; + } const auto& toSpawn = activeSpawns.at(spawnNumber); - const auto pathIndex = GeneralUtils::GenerateRandomNumber(0, toSpawn.spawnPaths.size() - 1); - - const auto* path = dZoneManager::Instance()->GetZone()->GetPath( - toSpawn.spawnPaths.at(pathIndex) - ); - + const auto* path = dZoneManager::Instance()->GetZone()->GetPath(toSpawn.spawnPaths.at(pathIndex)); if (!path) { Game::logger->Log("SGCannon", "Path %s at index %i is null", toSpawn.spawnPaths.at(pathIndex).c_str(), pathIndex); return; @@ -341,6 +328,7 @@ SGCannon::OnActivityTimerUpdate(Entity* self, const std::string& name, float_t t } void SGCannon::StartGame(Entity* self) { + if (self->GetVar(GameStartedVariable)) return; self->SetNetworkVar(TimeLimitVariable, self->GetVar(TimeLimitVariable)); self->SetNetworkVar(AudioStartIntroVariable, true); self->SetVar(CurrentRewardVariable, LOT_NULL); @@ -447,6 +435,14 @@ void SGCannon::RemovePlayer(LWOOBJID playerID) { } } +void SGCannon::OnRequestActivityExit(Entity* self, LWOOBJID player, bool canceled){ + if (canceled){ + StopGame(self, canceled); + RemovePlayer(player); + } +} + + void SGCannon::StartChargedCannon(Entity* self, uint32_t optionalTime) { optionalTime = optionalTime == 0 ? constants.chargedTime : optionalTime; self->SetVar(SuperChargePausedVariable, false); diff --git a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.h b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.h index df9831ad..f4202773 100644 --- a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.h +++ b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.h @@ -63,12 +63,11 @@ public: void OnStartup(Entity* self) override; void OnPlayerLoaded(Entity* self, Entity* player) override; void OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, int32_t param2, int32_t param3) override; - void OnActivityStateChangeRequest(Entity* self, LWOOBJID senderID, int32_t value1, - int32_t value2, const std::u16string& stringValue) override; - void OnMessageBoxResponse(Entity* self, Entity* sender, int32_t button, const std::u16string& identifier, - const std::u16string& userData) override; + void OnActivityStateChangeRequest(Entity* self, LWOOBJID senderID, int32_t value1, int32_t value2, const std::u16string& stringValue) override; + void OnMessageBoxResponse(Entity* self, Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData) override; void OnActivityTimerDone(Entity* self, const std::string& name) override; void OnActivityTimerUpdate(Entity* self, const std::string& name, float_t timeRemaining, float_t elapsedTime) override; + void OnRequestActivityExit(Entity* self, LWOOBJID player, bool canceled); private: static std::vector> GetWaves(); static SGConstants GetConstants(); From 6e6a05fc1d71d2292af6953366850bfd3815c031 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Thu, 11 May 2023 06:37:02 -0500 Subject: [PATCH 20/33] fix: prevent negative imagination (#1083) * fix: prevent negative imagination And fail switch if we don't have enough imagination * Make better --- dGame/dBehaviors/SwitchBehavior.cpp | 2 +- dGame/dComponents/RebuildComponent.cpp | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dGame/dBehaviors/SwitchBehavior.cpp b/dGame/dBehaviors/SwitchBehavior.cpp index c010f31b..bd261906 100644 --- a/dGame/dBehaviors/SwitchBehavior.cpp +++ b/dGame/dBehaviors/SwitchBehavior.cpp @@ -30,7 +30,7 @@ void SwitchBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStre Game::logger->LogDebug("SwitchBehavior", "[%i] State: (%d), imagination: (%i) / (%f)", entity->GetLOT(), state, destroyableComponent->GetImagination(), destroyableComponent->GetMaxImagination()); - if (state || (entity->GetLOT() == 8092 && destroyableComponent->GetImagination() >= m_imagination)) { + if (state) { this->m_actionTrue->Handle(context, bitStream, branch); } else { this->m_actionFalse->Handle(context, bitStream, branch); diff --git a/dGame/dComponents/RebuildComponent.cpp b/dGame/dComponents/RebuildComponent.cpp index fcf2738c..acd84a64 100644 --- a/dGame/dComponents/RebuildComponent.cpp +++ b/dGame/dComponents/RebuildComponent.cpp @@ -196,18 +196,18 @@ void RebuildComponent::Update(float deltaTime) { DestroyableComponent* destComp = builder->GetComponent(); if (!destComp) break; - int newImagination = destComp->GetImagination() - 1; + int newImagination = destComp->GetImagination(); + if (newImagination <= 0) { + CancelRebuild(builder, eQuickBuildFailReason::OUT_OF_IMAGINATION, true); + break; + } + ++m_DrainedImagination; + --newImagination; destComp->SetImagination(newImagination); EntityManager::Instance()->SerializeEntity(builder); - ++m_DrainedImagination; - if (newImagination == 0 && m_DrainedImagination < m_TakeImagination) { - CancelRebuild(builder, eQuickBuildFailReason::OUT_OF_IMAGINATION, true); - - break; - } } if (m_Timer >= m_CompleteTime && m_DrainedImagination >= m_TakeImagination) { From 0e01948414071993c7924e9b78ab225050ced2f1 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Thu, 11 May 2023 06:54:41 -0500 Subject: [PATCH 21/33] Define comp 103 as Gate Rush Control comp (#1078) Fix typo in 115 --- dCommon/dEnums/eReplicaComponentType.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dCommon/dEnums/eReplicaComponentType.h b/dCommon/dEnums/eReplicaComponentType.h index 3eee16f3..2d24c19e 100644 --- a/dCommon/dEnums/eReplicaComponentType.h +++ b/dCommon/dEnums/eReplicaComponentType.h @@ -107,7 +107,7 @@ enum class eReplicaComponentType : uint32_t { DONATION_VENDOR, COMBAT_MEDIATOR, COMMENDATION_VENDOR, - UNKNOWN_103, + GATE_RUSH_CONTROL, RAIL_ACTIVATOR, ROLLER, PLAYER_FORCED_MOVEMENT, @@ -119,7 +119,7 @@ enum class eReplicaComponentType : uint32_t { UNKNOWN_112, PROPERTY_PLAQUE, BUILD_BORDER, - UNKOWN_115, + UNKNOWN_115, CULLING_PLANE, DESTROYABLE = 1000 // Actually 7 }; From a809f36548526ece966a0a3069b04b2c913c99a6 Mon Sep 17 00:00:00 2001 From: Aaron Kimbre Date: Thu, 11 May 2023 09:23:48 -0500 Subject: [PATCH 22/33] Address feedback --- dGame/dGameMessages/GameMessages.cpp | 5 +---- dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.h | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index 7ebbf761..165876ff 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -6215,8 +6215,5 @@ void GameMessages::HandleRequestActivityExit(RakNet::BitStream* inStream, Entity inStream->Read(player_id); auto player = EntityManager::Instance()->GetEntity(player_id); if (!entity || !player) return; - - for (auto* shootingGallery : EntityManager::Instance()->GetEntitiesByComponent(eReplicaComponentType::SHOOTING_GALLERY)) { - shootingGallery->RequestActivityExit(entity, player_id, true); - } + entity->RequestActivityExit(entity, player_id, canceled); } diff --git a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.h b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.h index f4202773..b20fae6d 100644 --- a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.h +++ b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.h @@ -67,7 +67,7 @@ public: void OnMessageBoxResponse(Entity* self, Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData) override; void OnActivityTimerDone(Entity* self, const std::string& name) override; void OnActivityTimerUpdate(Entity* self, const std::string& name, float_t timeRemaining, float_t elapsedTime) override; - void OnRequestActivityExit(Entity* self, LWOOBJID player, bool canceled); + void OnRequestActivityExit(Entity* self, LWOOBJID player, bool canceled) override; private: static std::vector> GetWaves(); static SGConstants GetConstants(); From c5afd7d4a34b09c1e18524d24dfcf229a2609aa6 Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Sat, 13 May 2023 03:55:12 -0700 Subject: [PATCH 23/33] Fix deserialization errors for MovingPlatforms - Fixes deserialization errors for MovingPlatforms that did not have an attached_path, but had a MovingPlatform component >= id 0. --- dGame/Entity.cpp | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/dGame/Entity.cpp b/dGame/Entity.cpp index b9fc79fb..fdd7ce6f 100644 --- a/dGame/Entity.cpp +++ b/dGame/Entity.cpp @@ -690,23 +690,11 @@ void Entity::Initialize() { } std::string pathName = GetVarAsString(u"attached_path"); - const Path* path = dZoneManager::Instance()->GetZone()->GetPath(pathName); - //Check to see if we have an attached path and add the appropiate component to handle it: - if (path){ - // if we have a moving platform path, then we need a moving platform component - if (path->pathType == PathType::MovingPlatform) { - MovingPlatformComponent* plat = new MovingPlatformComponent(this, pathName); - m_Components.insert(std::make_pair(eReplicaComponentType::MOVING_PLATFORM, plat)); - // else if we are a movement path - } /*else if (path->pathType == PathType::Movement) { - auto movementAIcomp = GetComponent(); - if (movementAIcomp){ - // TODO: set path in existing movementAIComp - } else { - // TODO: create movementAIcomp and set path - } - }*/ + int32_t movingPlatformComponentId = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::MOVING_PLATFORM, -1); + if (movingPlatformComponentId >= 0 || !pathName.empty()) { + MovingPlatformComponent* plat = new MovingPlatformComponent(this, pathName); + m_Components.insert(std::make_pair(eReplicaComponentType::MOVING_PLATFORM, plat)); } int proximityMonitorID = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::PROXIMITY_MONITOR); From 739eae52447811c7eddd26b82dc09a858f571c29 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Sat, 13 May 2023 09:30:59 -0500 Subject: [PATCH 24/33] feature: Implement FallSpeedBehavior (#1084) * Hacky FallSpeedBehavior * Fixup * Make it more robust like speedboost add check for default Fix error in GetActiveSpeedboosts * simplify and address feedback --- dGame/dBehaviors/Behavior.cpp | 5 +- dGame/dBehaviors/CMakeLists.txt | 1 + dGame/dBehaviors/FallSpeedBehavior.cpp | 50 +++++++++++++++++++ dGame/dBehaviors/FallSpeedBehavior.h | 18 +++++++ .../ControllablePhysicsComponent.cpp | 2 +- .../ControllablePhysicsComponent.h | 2 +- 6 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 dGame/dBehaviors/FallSpeedBehavior.cpp create mode 100644 dGame/dBehaviors/FallSpeedBehavior.h diff --git a/dGame/dBehaviors/Behavior.cpp b/dGame/dBehaviors/Behavior.cpp index 2a269ddc..8b34507a 100644 --- a/dGame/dBehaviors/Behavior.cpp +++ b/dGame/dBehaviors/Behavior.cpp @@ -61,6 +61,7 @@ #include "SpeedBehavior.h" #include "DamageReductionBehavior.h" #include "JetPackBehavior.h" +#include "FallSpeedBehavior.h" #include "ChangeIdleFlagsBehavior.h" #include "DarkInspirationBehavior.h" @@ -164,7 +165,9 @@ Behavior* Behavior::CreateBehavior(const uint32_t behaviorId) { case BehaviorTemplates::BEHAVIOR_CAR_BOOST: behavior = new CarBoostBehavior(behaviorId); break; - case BehaviorTemplates::BEHAVIOR_FALL_SPEED: break; + case BehaviorTemplates::BEHAVIOR_FALL_SPEED: + behavior = new FallSpeedBehavior(behaviorId); + break; case BehaviorTemplates::BEHAVIOR_SHIELD: break; case BehaviorTemplates::BEHAVIOR_REPAIR_ARMOR: behavior = new RepairBehavior(behaviorId); diff --git a/dGame/dBehaviors/CMakeLists.txt b/dGame/dBehaviors/CMakeLists.txt index 7b331fe0..8a9368b9 100644 --- a/dGame/dBehaviors/CMakeLists.txt +++ b/dGame/dBehaviors/CMakeLists.txt @@ -22,6 +22,7 @@ set(DGAME_DBEHAVIORS_SOURCES "AirMovementBehavior.cpp" "DurationBehavior.cpp" "EmptyBehavior.cpp" "EndBehavior.cpp" + "FallSpeedBehavior.cpp" "ForceMovementBehavior.cpp" "HealBehavior.cpp" "ImaginationBehavior.cpp" diff --git a/dGame/dBehaviors/FallSpeedBehavior.cpp b/dGame/dBehaviors/FallSpeedBehavior.cpp new file mode 100644 index 00000000..158c87f6 --- /dev/null +++ b/dGame/dBehaviors/FallSpeedBehavior.cpp @@ -0,0 +1,50 @@ +#include "FallSpeedBehavior.h" + +#include "ControllablePhysicsComponent.h" +#include "BehaviorContext.h" +#include "BehaviorBranchContext.h" + + +void FallSpeedBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) { + // make sure required parameter has non-default value + if (m_PercentSlowed == 0.0f) return; + auto* target = EntityManager::Instance()->GetEntity(branch.target); + if (!target) return; + + auto* controllablePhysicsComponent = target->GetComponent(); + if (!controllablePhysicsComponent) return; + controllablePhysicsComponent->SetGravityScale(m_PercentSlowed); + EntityManager::Instance()->SerializeEntity(target); + + if (branch.duration > 0.0f) { + context->RegisterTimerBehavior(this, branch); + } else if (branch.start > 0) { + context->RegisterEndBehavior(this, branch); + } +} + +void FallSpeedBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) { + Handle(context, bitStream, branch); +} + +void FallSpeedBehavior::Timer(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) { + End(context, branch, second); +} + +void FallSpeedBehavior::UnCast(BehaviorContext* context, BehaviorBranchContext branch) { + End(context, branch, LWOOBJID_EMPTY); +} + +void FallSpeedBehavior::End(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) { + auto* target = EntityManager::Instance()->GetEntity(branch.target); + if (!target) return; + + auto* controllablePhysicsComponent = target->GetComponent(); + if (!controllablePhysicsComponent) return; + controllablePhysicsComponent->SetGravityScale(1); + EntityManager::Instance()->SerializeEntity(target); +} + +void FallSpeedBehavior::Load(){ + m_PercentSlowed = GetFloat("percent_slowed"); +} diff --git a/dGame/dBehaviors/FallSpeedBehavior.h b/dGame/dBehaviors/FallSpeedBehavior.h new file mode 100644 index 00000000..01f0143f --- /dev/null +++ b/dGame/dBehaviors/FallSpeedBehavior.h @@ -0,0 +1,18 @@ +#pragma once +#include "Behavior.h" + +class FallSpeedBehavior final : public Behavior +{ +public: + explicit FallSpeedBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {} + + void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override; + void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override; + void Timer(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) override; + void End(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) override; + void UnCast(BehaviorContext* context, BehaviorBranchContext branch) override; + void Load() override; + +private: + float m_PercentSlowed; +}; diff --git a/dGame/dComponents/ControllablePhysicsComponent.cpp b/dGame/dComponents/ControllablePhysicsComponent.cpp index 1b8627a7..d1b44200 100644 --- a/dGame/dComponents/ControllablePhysicsComponent.cpp +++ b/dGame/dComponents/ControllablePhysicsComponent.cpp @@ -320,7 +320,7 @@ void ControllablePhysicsComponent::RemoveSpeedboost(float value) { // Recalculate speedboost since we removed one m_SpeedBoost = 0.0f; - if (m_ActiveSpeedBoosts.size() == 0) { // no active speed boosts left, so return to base speed + if (m_ActiveSpeedBoosts.empty()) { // no active speed boosts left, so return to base speed auto* levelProgressionComponent = m_Parent->GetComponent(); if (levelProgressionComponent) m_SpeedBoost = levelProgressionComponent->GetSpeedBase(); } else { // Used the last applied speedboost diff --git a/dGame/dComponents/ControllablePhysicsComponent.h b/dGame/dComponents/ControllablePhysicsComponent.h index d6088718..470a7af4 100644 --- a/dGame/dComponents/ControllablePhysicsComponent.h +++ b/dGame/dComponents/ControllablePhysicsComponent.h @@ -276,7 +276,7 @@ public: * The speed boosts of this component. * @return All active Speed boosts for this component. */ - std::vector GetActiveSpeedboosts() { return m_ActivePickupRadiusScales; }; + std::vector GetActiveSpeedboosts() { return m_ActiveSpeedBoosts; }; /** * Activates the Bubble Buff From 1af70161eb70ad5b00dba6f586e4447f3e1ac552 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Sat, 13 May 2023 09:31:13 -0500 Subject: [PATCH 25/33] fix: orient player correctly when using pirate mast in FV (#1087) * fix: frient player correctly when using pirate mast in FV * only get mast name once --- dScripts/02_server/Map/GF/MastTeleport.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dScripts/02_server/Map/GF/MastTeleport.cpp b/dScripts/02_server/Map/GF/MastTeleport.cpp index 97b126b4..1447a6a0 100644 --- a/dScripts/02_server/Map/GF/MastTeleport.cpp +++ b/dScripts/02_server/Map/GF/MastTeleport.cpp @@ -43,10 +43,13 @@ void MastTeleport::OnTimerDone(Entity* self, std::string timerName) { GameMessages::SendTeleport(playerId, position, rotation, player->GetSystemAddress(), true); // Hacky fix for odd rotations - if (self->GetVar(u"MastName") != u"Jail") { + auto mastName = self->GetVar(u"MastName"); + if (mastName == u"Elephant") { GameMessages::SendOrientToAngle(playerId, true, (M_PI / 180) * 140.0f, player->GetSystemAddress()); - } else { + } else if (mastName == u"Jail") { GameMessages::SendOrientToAngle(playerId, true, (M_PI / 180) * 100.0f, player->GetSystemAddress()); + } else if (mastName == u""){ + GameMessages::SendOrientToAngle(playerId, true, (M_PI / 180) * 203.0f, player->GetSystemAddress()); } const auto cinematic = GeneralUtils::UTF16ToWTF8(self->GetVar(u"Cinematic")); From 9d105a287d28916a3e5c6f1eac65bebbb9eb901e Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Sat, 13 May 2023 15:47:28 -0500 Subject: [PATCH 26/33] fix: not everything attached to a path is a moving platform (#1090) --- dGame/Entity.cpp | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/dGame/Entity.cpp b/dGame/Entity.cpp index 4345d2db..68ab0c7a 100644 --- a/dGame/Entity.cpp +++ b/dGame/Entity.cpp @@ -690,11 +690,30 @@ void Entity::Initialize() { } std::string pathName = GetVarAsString(u"attached_path"); + const Path* path = dZoneManager::Instance()->GetZone()->GetPath(pathName); - int32_t movingPlatformComponentId = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::MOVING_PLATFORM, -1); - if (movingPlatformComponentId >= 0 || !pathName.empty()) { - MovingPlatformComponent* plat = new MovingPlatformComponent(this, pathName); - m_Components.insert(std::make_pair(eReplicaComponentType::MOVING_PLATFORM, plat)); + //Check to see if we have an attached path and add the appropiate component to handle it: + if (path){ + // if we have a moving platform path, then we need a moving platform component + if (path->pathType == PathType::MovingPlatform) { + MovingPlatformComponent* plat = new MovingPlatformComponent(this, pathName); + m_Components.insert(std::make_pair(eReplicaComponentType::MOVING_PLATFORM, plat)); + // else if we are a movement path + } /*else if (path->pathType == PathType::Movement) { + auto movementAIcomp = GetComponent(); + if (movementAIcomp){ + // TODO: set path in existing movementAIComp + } else { + // TODO: create movementAIcomp and set path + } + }*/ + } else { + // else we still need to setup moving platform if it has a moving platform comp but no path + int32_t movingPlatformComponentId = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::MOVING_PLATFORM, -1); + if (movingPlatformComponentId >= 0) { + MovingPlatformComponent* plat = new MovingPlatformComponent(this, pathName); + m_Components.insert(std::make_pair(eReplicaComponentType::MOVING_PLATFORM, plat)); + } } int proximityMonitorID = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::PROXIMITY_MONITOR); From 4fe335cc66a26ddcddca85a86cfe77d241b70638 Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Sat, 13 May 2023 15:22:00 -0700 Subject: [PATCH 27/33] Refactor: Amf3 implementation (#998) * Update AMFDeserializeTests.cpp Redo Amf3 functionality Overhaul the whole thing due to it being outdated and clunky to use Sometimes you want to keep the value Update AMFDeserializeTests.cpp * Fix enum and constructors Correct enum to a class and simplify names. Add a proper default constructor * Update MasterServer.cpp * Fix bugs and add more tests * Refactor: AMF with templates in mind - Remove hard coded bodge - Use templates and generics to allow for much looser typing and strengthened implementation - Move code into header only implementation for portability Refactor: Convert AMF implementation to templates - Rip out previous implementation - Remove all extraneous terminology - Add proper overloads for all types of inserts - Fix up tests and codebase * Fix compiler errors * Check for null first * Add specialization for const char* * Update tests for new template specialization * Switch BitStream to use references * Rename files * Check enum bounds on deserialize I did this on a phone --- dCommon/AMFDeserialize.cpp | 99 ++--- dCommon/AMFDeserialize.h | 15 +- dCommon/AMFFormat.cpp | 156 ------- dCommon/AMFFormat.h | 413 ------------------ dCommon/AMFFormat_BitStream.cpp | 259 ----------- dCommon/AMFFormat_BitStream.h | 92 ---- dCommon/Amf3.h | 368 ++++++++++++++++ dCommon/AmfSerialize.cpp | 184 ++++++++ dCommon/AmfSerialize.h | 50 +++ dCommon/CMakeLists.txt | 4 +- dGame/dComponents/CharacterComponent.cpp | 6 +- dGame/dComponents/DestroyableComponent.cpp | 34 +- dGame/dComponents/MissionComponent.cpp | 2 +- .../dComponents/PropertyEntranceComponent.cpp | 9 +- dGame/dComponents/RenderComponent.h | 2 +- dGame/dGameMessages/GameMessages.cpp | 16 +- dGame/dGameMessages/GameMessages.h | 6 +- .../ControlBehaviorMessages/Action.cpp | 14 +- .../ControlBehaviorMessages/ActionContext.cpp | 10 +- .../AddActionMessage.cpp | 2 +- .../ControlBehaviorMessages/AddMessage.cpp | 4 +- .../AddStripMessage.cpp | 9 +- .../BehaviorMessageBase.cpp | 14 +- .../BehaviorMessageBase.h | 2 +- .../MoveToInventoryMessage.cpp | 4 +- .../ControlBehaviorMessages/RenameMessage.cpp | 4 +- .../StripUiPosition.cpp | 12 +- .../UpdateActionMessage.cpp | 2 +- dGame/dPropertyBehaviors/ControlBehaviors.cpp | 44 +- dGame/dUtilities/SlashCommandHandler.cpp | 47 +- dMasterServer/MasterServer.cpp | 1 - .../Map/AM/AmConsoleTeleportServer.cpp | 2 +- .../Map/General/BankInteractServer.cpp | 14 +- .../02_server/Map/General/MailBoxServer.cpp | 15 +- .../Map/General/StoryBoxInteractServer.cpp | 19 +- dScripts/02_server/Map/NS/NsLegoClubDoor.cpp | 118 ++--- dScripts/02_server/Map/NS/NsLegoClubDoor.h | 2 +- dScripts/02_server/Map/NS/NsLupTeleport.cpp | 68 +-- dScripts/02_server/Map/NS/NsLupTeleport.h | 2 +- .../Map/NT/NtConsoleTeleportServer.cpp | 2 +- .../Map/Property/PropertyBankInteract.cpp | 15 +- dWorldServer/WorldServer.cpp | 12 +- tests/dCommonTests/AMFDeserializeTests.cpp | 225 +++++----- tests/dCommonTests/Amf3Tests.cpp | 116 +++++ tests/dCommonTests/CMakeLists.txt | 1 + .../dGameMessagesTests/GameMessageTests.cpp | 6 +- 46 files changed, 1081 insertions(+), 1420 deletions(-) delete mode 100644 dCommon/AMFFormat.cpp delete mode 100644 dCommon/AMFFormat.h delete mode 100644 dCommon/AMFFormat_BitStream.cpp delete mode 100644 dCommon/AMFFormat_BitStream.h create mode 100644 dCommon/Amf3.h create mode 100644 dCommon/AmfSerialize.cpp create mode 100644 dCommon/AmfSerialize.h create mode 100644 tests/dCommonTests/Amf3Tests.cpp diff --git a/dCommon/AMFDeserialize.cpp b/dCommon/AMFDeserialize.cpp index df4a7cb6..9eee1f12 100644 --- a/dCommon/AMFDeserialize.cpp +++ b/dCommon/AMFDeserialize.cpp @@ -1,77 +1,81 @@ #include "AMFDeserialize.h" -#include "AMFFormat.h" +#include + +#include "Amf3.h" /** * AMF3 Reference document https://rtmp.veriskope.com/pdf/amf3-file-format-spec.pdf * AMF3 Deserializer written by EmosewaMC */ -AMFValue* AMFDeserialize::Read(RakNet::BitStream* inStream) { +AMFBaseValue* AMFDeserialize::Read(RakNet::BitStream* inStream) { if (!inStream) return nullptr; - AMFValue* returnValue = nullptr; + AMFBaseValue* returnValue = nullptr; // Read in the value type from the bitStream - int8_t marker; - inStream->Read(marker); + uint8_t i; + inStream->Read(i); + if (i > static_cast(eAmf::Dictionary)) return nullptr; + eAmf marker = static_cast(i); // Based on the typing, create the value associated with that and return the base value class switch (marker) { - case AMFValueType::AMFUndefined: { - returnValue = new AMFUndefinedValue(); + case eAmf::Undefined: { + returnValue = new AMFBaseValue(); break; } - case AMFValueType::AMFNull: { + case eAmf::Null: { returnValue = new AMFNullValue(); break; } - case AMFValueType::AMFFalse: { - returnValue = new AMFFalseValue(); + case eAmf::False: { + returnValue = new AMFBoolValue(false); break; } - case AMFValueType::AMFTrue: { - returnValue = new AMFTrueValue(); + case eAmf::True: { + returnValue = new AMFBoolValue(true); break; } - case AMFValueType::AMFInteger: { + case eAmf::Integer: { returnValue = ReadAmfInteger(inStream); break; } - case AMFValueType::AMFDouble: { + case eAmf::Double: { returnValue = ReadAmfDouble(inStream); break; } - case AMFValueType::AMFString: { + case eAmf::String: { returnValue = ReadAmfString(inStream); break; } - case AMFValueType::AMFArray: { + case eAmf::Array: { returnValue = ReadAmfArray(inStream); break; } - // TODO We do not need these values, but if someone wants to implement them - // then please do so and add the corresponding unit tests. - case AMFValueType::AMFXMLDoc: - case AMFValueType::AMFDate: - case AMFValueType::AMFObject: - case AMFValueType::AMFXML: - case AMFValueType::AMFByteArray: - case AMFValueType::AMFVectorInt: - case AMFValueType::AMFVectorUInt: - case AMFValueType::AMFVectorDouble: - case AMFValueType::AMFVectorObject: - case AMFValueType::AMFDictionary: { - throw static_cast(marker); + // These values are unimplemented in the live client and will remain unimplemented + // unless someone modifies the client to allow serializing of these values. + case eAmf::XMLDoc: + case eAmf::Date: + case eAmf::Object: + case eAmf::XML: + case eAmf::ByteArray: + case eAmf::VectorInt: + case eAmf::VectorUInt: + case eAmf::VectorDouble: + case eAmf::VectorObject: + case eAmf::Dictionary: { + throw marker; break; } default: - throw static_cast(marker); + throw std::invalid_argument("Invalid AMF3 marker" + std::to_string(static_cast(marker))); break; } return returnValue; @@ -99,7 +103,7 @@ uint32_t AMFDeserialize::ReadU29(RakNet::BitStream* inStream) { return actualNumber; } -std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) { +const std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) { auto length = ReadU29(inStream); // Check if this is a reference bool isReference = length % 2 == 1; @@ -113,48 +117,39 @@ std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) { return value; } else { // Length is a reference to a previous index - use that as the read in value - return accessedElements[length]; + return accessedElements.at(length); } } -AMFValue* AMFDeserialize::ReadAmfDouble(RakNet::BitStream* inStream) { - auto doubleValue = new AMFDoubleValue(); +AMFBaseValue* AMFDeserialize::ReadAmfDouble(RakNet::BitStream* inStream) { double value; inStream->Read(value); - doubleValue->SetDoubleValue(value); - return doubleValue; + return new AMFDoubleValue(value); } -AMFValue* AMFDeserialize::ReadAmfArray(RakNet::BitStream* inStream) { +AMFBaseValue* AMFDeserialize::ReadAmfArray(RakNet::BitStream* inStream) { auto arrayValue = new AMFArrayValue(); // Read size of dense array auto sizeOfDenseArray = (ReadU29(inStream) >> 1); - - // Then read Key'd portion + // Then read associative portion while (true) { auto key = ReadString(inStream); - // No more values when we encounter an empty string + // No more associative values when we encounter an empty string key if (key.size() == 0) break; - arrayValue->InsertValue(key, Read(inStream)); + arrayValue->Insert(key, Read(inStream)); } - // Finally read dense portion for (uint32_t i = 0; i < sizeOfDenseArray; i++) { - arrayValue->PushBackValue(Read(inStream)); + arrayValue->Insert(i, Read(inStream)); } - return arrayValue; } -AMFValue* AMFDeserialize::ReadAmfString(RakNet::BitStream* inStream) { - auto stringValue = new AMFStringValue(); - stringValue->SetStringValue(ReadString(inStream)); - return stringValue; +AMFBaseValue* AMFDeserialize::ReadAmfString(RakNet::BitStream* inStream) { + return new AMFStringValue(ReadString(inStream)); } -AMFValue* AMFDeserialize::ReadAmfInteger(RakNet::BitStream* inStream) { - auto integerValue = new AMFIntegerValue(); - integerValue->SetIntegerValue(ReadU29(inStream)); - return integerValue; +AMFBaseValue* AMFDeserialize::ReadAmfInteger(RakNet::BitStream* inStream) { + return new AMFIntValue(ReadU29(inStream)); } diff --git a/dCommon/AMFDeserialize.h b/dCommon/AMFDeserialize.h index a49cdcd2..5e2729eb 100644 --- a/dCommon/AMFDeserialize.h +++ b/dCommon/AMFDeserialize.h @@ -5,7 +5,8 @@ #include #include -class AMFValue; +class AMFBaseValue; + class AMFDeserialize { public: /** @@ -14,7 +15,7 @@ public: * @param inStream inStream to read value from. * @return Returns an AMFValue with all the information from the bitStream in it. */ - AMFValue* Read(RakNet::BitStream* inStream); + AMFBaseValue* Read(RakNet::BitStream* inStream); private: /** * @brief Private method to read a U29 integer from a bitstream @@ -30,7 +31,7 @@ private: * @param inStream bitStream to read data from * @return The read string */ - std::string ReadString(RakNet::BitStream* inStream); + const std::string ReadString(RakNet::BitStream* inStream); /** * @brief Read an AMFDouble value from a bitStream @@ -38,7 +39,7 @@ private: * @param inStream bitStream to read data from * @return Double value represented as an AMFValue */ - AMFValue* ReadAmfDouble(RakNet::BitStream* inStream); + AMFBaseValue* ReadAmfDouble(RakNet::BitStream* inStream); /** * @brief Read an AMFArray from a bitStream @@ -46,7 +47,7 @@ private: * @param inStream bitStream to read data from * @return Array value represented as an AMFValue */ - AMFValue* ReadAmfArray(RakNet::BitStream* inStream); + AMFBaseValue* ReadAmfArray(RakNet::BitStream* inStream); /** * @brief Read an AMFString from a bitStream @@ -54,7 +55,7 @@ private: * @param inStream bitStream to read data from * @return String value represented as an AMFValue */ - AMFValue* ReadAmfString(RakNet::BitStream* inStream); + AMFBaseValue* ReadAmfString(RakNet::BitStream* inStream); /** * @brief Read an AMFInteger from a bitStream @@ -62,7 +63,7 @@ private: * @param inStream bitStream to read data from * @return Integer value represented as an AMFValue */ - AMFValue* ReadAmfInteger(RakNet::BitStream* inStream); + AMFBaseValue* ReadAmfInteger(RakNet::BitStream* inStream); /** * List of strings read so far saved to be read by reference. diff --git a/dCommon/AMFFormat.cpp b/dCommon/AMFFormat.cpp deleted file mode 100644 index 4407b29c..00000000 --- a/dCommon/AMFFormat.cpp +++ /dev/null @@ -1,156 +0,0 @@ -#include "AMFFormat.h" - -// AMFInteger -void AMFIntegerValue::SetIntegerValue(uint32_t value) { - this->value = value; -} - -uint32_t AMFIntegerValue::GetIntegerValue() { - return this->value; -} - -// AMFDouble -void AMFDoubleValue::SetDoubleValue(double value) { - this->value = value; -} - -double AMFDoubleValue::GetDoubleValue() { - return this->value; -} - -// AMFString -void AMFStringValue::SetStringValue(const std::string& value) { - this->value = value; -} - -std::string AMFStringValue::GetStringValue() { - return this->value; -} - -// AMFXMLDoc -void AMFXMLDocValue::SetXMLDocValue(const std::string& value) { - this->xmlData = value; -} - -std::string AMFXMLDocValue::GetXMLDocValue() { - return this->xmlData; -} - -// AMFDate -void AMFDateValue::SetDateValue(uint64_t value) { - this->millisecondTimestamp = value; -} - -uint64_t AMFDateValue::GetDateValue() { - return this->millisecondTimestamp; -} - -// AMFArray Insert Value -void AMFArrayValue::InsertValue(const std::string& key, AMFValue* value) { - this->associative.insert(std::make_pair(key, value)); -} - -// AMFArray Remove Value -void AMFArrayValue::RemoveValue(const std::string& key) { - _AMFArrayMap_::iterator it = this->associative.find(key); - if (it != this->associative.end()) { - this->associative.erase(it); - } -} - -// AMFArray Get Associative Iterator Begin -_AMFArrayMap_::iterator AMFArrayValue::GetAssociativeIteratorValueBegin() { - return this->associative.begin(); -} - -// AMFArray Get Associative Iterator End -_AMFArrayMap_::iterator AMFArrayValue::GetAssociativeIteratorValueEnd() { - return this->associative.end(); -} - -// AMFArray Push Back Value -void AMFArrayValue::PushBackValue(AMFValue* value) { - this->dense.push_back(value); -} - -// AMFArray Pop Back Value -void AMFArrayValue::PopBackValue() { - this->dense.pop_back(); -} - -// AMFArray Get Dense List Size -uint32_t AMFArrayValue::GetDenseValueSize() { - return (uint32_t)this->dense.size(); -} - -// AMFArray Get Dense Iterator Begin -_AMFArrayList_::iterator AMFArrayValue::GetDenseIteratorBegin() { - return this->dense.begin(); -} - -// AMFArray Get Dense Iterator End -_AMFArrayList_::iterator AMFArrayValue::GetDenseIteratorEnd() { - return this->dense.end(); -} - -AMFArrayValue::~AMFArrayValue() { - for (auto valueToDelete : GetDenseArray()) { - if (valueToDelete) delete valueToDelete; - } - for (auto valueToDelete : GetAssociativeMap()) { - if (valueToDelete.second) delete valueToDelete.second; - } -} - -// AMFObject Constructor -AMFObjectValue::AMFObjectValue(std::vector> traits) { - this->traits.reserve(traits.size()); - std::vector>::iterator it = traits.begin(); - while (it != traits.end()) { - this->traits.insert(std::make_pair(it->first, std::make_pair(it->second, new AMFNullValue()))); - it++; - } -} - -// AMFObject Set Value -void AMFObjectValue::SetTraitValue(const std::string& trait, AMFValue* value) { - if (value) { - _AMFObjectTraits_::iterator it = this->traits.find(trait); - if (it != this->traits.end()) { - if (it->second.first == value->GetValueType()) { - it->second.second = value; - } - } - } -} - -// AMFObject Get Value -AMFValue* AMFObjectValue::GetTraitValue(const std::string& trait) { - _AMFObjectTraits_::iterator it = this->traits.find(trait); - if (it != this->traits.end()) { - return it->second.second; - } - - return nullptr; -} - -// AMFObject Get Trait Iterator Begin -_AMFObjectTraits_::iterator AMFObjectValue::GetTraitsIteratorBegin() { - return this->traits.begin(); -} - -// AMFObject Get Trait Iterator End -_AMFObjectTraits_::iterator AMFObjectValue::GetTraitsIteratorEnd() { - return this->traits.end(); -} - -// AMFObject Get Trait Size -uint32_t AMFObjectValue::GetTraitArrayCount() { - return (uint32_t)this->traits.size(); -} - -AMFObjectValue::~AMFObjectValue() { - for (auto valueToDelete = GetTraitsIteratorBegin(); valueToDelete != GetTraitsIteratorEnd(); valueToDelete++) { - if (valueToDelete->second.second) delete valueToDelete->second.second; - } -} diff --git a/dCommon/AMFFormat.h b/dCommon/AMFFormat.h deleted file mode 100644 index 6e479ef6..00000000 --- a/dCommon/AMFFormat.h +++ /dev/null @@ -1,413 +0,0 @@ -#pragma once - -// Custom Classes -#include "dCommonVars.h" - -// C++ -#include -#include - -/*! - \file AMFFormat.hpp - \brief A class for managing AMF values - */ - -class AMFValue; // Forward declaration - -// Definitions -#define _AMFArrayMap_ std::unordered_map -#define _AMFArrayList_ std::vector - -#define _AMFObjectTraits_ std::unordered_map> -#define _AMFObjectDynamicTraits_ std::unordered_map - -//! An enum for each AMF value type -enum AMFValueType : unsigned char { - AMFUndefined = 0x00, //!< An undefined AMF Value - AMFNull = 0x01, //!< A null AMF value - AMFFalse = 0x02, //!< A false AMF value - AMFTrue = 0x03, //!< A true AMF value - AMFInteger = 0x04, //!< An integer AMF value - AMFDouble = 0x05, //!< A double AMF value - AMFString = 0x06, //!< A string AMF value - AMFXMLDoc = 0x07, //!< An XML Doc AMF value - AMFDate = 0x08, //!< A date AMF value - AMFArray = 0x09, //!< An array AMF value - AMFObject = 0x0A, //!< An object AMF value - AMFXML = 0x0B, //!< An XML AMF value - AMFByteArray = 0x0C, //!< A byte array AMF value - AMFVectorInt = 0x0D, //!< An integer vector AMF value - AMFVectorUInt = 0x0E, //!< An unsigned integer AMF value - AMFVectorDouble = 0x0F, //!< A double vector AMF value - AMFVectorObject = 0x10, //!< An object vector AMF value - AMFDictionary = 0x11 //!< A dictionary AMF value -}; - -//! An enum for the object value types -enum AMFObjectValueType : unsigned char { - AMFObjectAnonymous = 0x01, - AMFObjectTyped = 0x02, - AMFObjectDynamic = 0x03, - AMFObjectExternalizable = 0x04 -}; - -//! The base AMF value class -class AMFValue { -public: - //! Returns the AMF value type - /*! - \return The AMF value type - */ - virtual AMFValueType GetValueType() = 0; - virtual ~AMFValue() {}; -}; - -//! A typedef for a pointer to an AMF value -typedef AMFValue* NDGFxValue; - - -// The various AMF value types - -//! The undefined value AMF type -class AMFUndefinedValue : public AMFValue { -private: - //! Returns the AMF value type - /*! - \return The AMF value type - */ - AMFValueType GetValueType() { return ValueType; } -public: - static const AMFValueType ValueType = AMFUndefined; -}; - -//! The null value AMF type -class AMFNullValue : public AMFValue { -private: - //! Returns the AMF value type - /*! - \return The AMF value type - */ - AMFValueType GetValueType() { return ValueType; } -public: - static const AMFValueType ValueType = AMFNull; -}; - -//! The false value AMF type -class AMFFalseValue : public AMFValue { -private: - //! Returns the AMF value type - /*! - \return The AMF value type - */ - AMFValueType GetValueType() { return ValueType; } -public: - static const AMFValueType ValueType = AMFFalse; -}; - -//! The true value AMF type -class AMFTrueValue : public AMFValue { -private: - //! Returns the AMF value type - /*! - \return The AMF value type - */ - AMFValueType GetValueType() { return ValueType; } -public: - static const AMFValueType ValueType = AMFTrue; -}; - -//! The integer value AMF type -class AMFIntegerValue : public AMFValue { -private: - uint32_t value; //!< The value of the AMF type - - //! Returns the AMF value type - /*! - \return The AMF value type - */ - AMFValueType GetValueType() { return ValueType; } - -public: - static const AMFValueType ValueType = AMFInteger; - //! Sets the integer value - /*! - \param value The value to set - */ - void SetIntegerValue(uint32_t value); - - //! Gets the integer value - /*! - \return The integer value - */ - uint32_t GetIntegerValue(); -}; - -//! The double value AMF type -class AMFDoubleValue : public AMFValue { -private: - double value; //!< The value of the AMF type - - //! Returns the AMF value type - /*! - \return The AMF value type - */ - AMFValueType GetValueType() { return ValueType; } - -public: - static const AMFValueType ValueType = AMFDouble; - //! Sets the double value - /*! - \param value The value to set to - */ - void SetDoubleValue(double value); - - //! Gets the double value - /*! - \return The double value - */ - double GetDoubleValue(); -}; - -//! The string value AMF type -class AMFStringValue : public AMFValue { -private: - std::string value; //!< The value of the AMF type - - //! Returns the AMF value type - /*! - \return The AMF value type - */ - AMFValueType GetValueType() { return ValueType; } - -public: - static const AMFValueType ValueType = AMFString; - //! Sets the string value - /*! - \param value The string value to set to - */ - void SetStringValue(const std::string& value); - - //! Gets the string value - /*! - \return The string value - */ - std::string GetStringValue(); -}; - -//! The XML doc value AMF type -class AMFXMLDocValue : public AMFValue { -private: - std::string xmlData; //!< The value of the AMF type - - //! Returns the AMF value type - /*! - \return The AMF value type - */ - AMFValueType GetValueType() { return ValueType; } - -public: - static const AMFValueType ValueType = AMFXMLDoc; - //! Sets the XML Doc value - /*! - \param value The value to set to - */ - void SetXMLDocValue(const std::string& value); - - //! Gets the XML Doc value - /*! - \return The XML Doc value - */ - std::string GetXMLDocValue(); -}; - -//! The date value AMF type -class AMFDateValue : public AMFValue { -private: - uint64_t millisecondTimestamp; //!< The time in milliseconds since the ephoch - - //! Returns the AMF value type - /*! - \return The AMF value type - */ - AMFValueType GetValueType() { return ValueType; } - -public: - static const AMFValueType ValueType = AMFDate; - //! Sets the date time - /*! - \param value The value to set to - */ - void SetDateValue(uint64_t value); - - //! Gets the date value - /*! - \return The date value in milliseconds since the epoch - */ - uint64_t GetDateValue(); -}; - -//! The array value AMF type -// This object will manage it's own memory map and list. Do not delete its values. -class AMFArrayValue : public AMFValue { -private: - _AMFArrayMap_ associative; //!< The array map (associative part) - _AMFArrayList_ dense; //!< The array list (dense part) - - //! Returns the AMF value type - /*! - \return The AMF value type - */ - AMFValueType GetValueType() override { return ValueType; } - -public: - static const AMFValueType ValueType = AMFArray; - - ~AMFArrayValue() override; - //! Inserts an item into the array map for a specific key - /*! - \param key The key to set - \param value The value to add - */ - void InsertValue(const std::string& key, AMFValue* value); - - //! Removes an item for a specific key - /*! - \param key The key to remove - */ - void RemoveValue(const std::string& key); - - //! Finds an AMF value - /*! - \return The AMF value if found, nullptr otherwise - */ - template - T* FindValue(const std::string& key) const { - _AMFArrayMap_::const_iterator it = this->associative.find(key); - if (it != this->associative.end() && T::ValueType == it->second->GetValueType()) { - return dynamic_cast(it->second); - } - - return nullptr; - }; - - //! Returns where the associative iterator begins - /*! - \return Where the array map iterator begins - */ - _AMFArrayMap_::iterator GetAssociativeIteratorValueBegin(); - - //! Returns where the associative iterator ends - /*! - \return Where the array map iterator ends - */ - _AMFArrayMap_::iterator GetAssociativeIteratorValueEnd(); - - //! Pushes back a value into the array list - /*! - \param value The value to push back - */ - void PushBackValue(AMFValue* value); - - //! Pops back the last value in the array list - void PopBackValue(); - - //! Gets the count of the dense list - /*! - \return The dense list size - */ - uint32_t GetDenseValueSize(); - - //! Gets a specific value from the list for the specified index - /*! - \param index The index to get - */ - template - T* GetValueAt(uint32_t index) { - if (index >= this->dense.size()) return nullptr; - AMFValue* foundValue = this->dense.at(index); - return T::ValueType == foundValue->GetValueType() ? dynamic_cast(foundValue) : nullptr; - }; - - //! Returns where the dense iterator begins - /*! - \return Where the iterator begins - */ - _AMFArrayList_::iterator GetDenseIteratorBegin(); - - //! Returns where the dense iterator ends - /*! - \return Where the iterator ends - */ - _AMFArrayList_::iterator GetDenseIteratorEnd(); - - //! Returns the associative map - /*! - \return The associative map - */ - _AMFArrayMap_ GetAssociativeMap() { return this->associative; }; - - //! Returns the dense array - /*! - \return The dense array - */ - _AMFArrayList_ GetDenseArray() { return this->dense; }; -}; - -//! The anonymous object value AMF type -class AMFObjectValue : public AMFValue { -private: - _AMFObjectTraits_ traits; //!< The object traits - - //! Returns the AMF value type - /*! - \return The AMF value type - */ - AMFValueType GetValueType() override { return ValueType; } - ~AMFObjectValue() override; - -public: - static const AMFValueType ValueType = AMFObject; - //! Constructor - /*! - \param traits The traits to set - */ - AMFObjectValue(std::vector> traits); - - //! Gets the object value type - /*! - \return The object value type - */ - virtual AMFObjectValueType GetObjectValueType() { return AMFObjectAnonymous; } - - //! Sets the value of a trait - /*! - \param trait The trait to set the value for - \param value The AMF value to set - */ - void SetTraitValue(const std::string& trait, AMFValue* value); - - //! Gets a trait value - /*! - \param trait The trait to get the value for - \return The trait value - */ - AMFValue* GetTraitValue(const std::string& trait); - - //! Gets the beginning of the object traits iterator - /*! - \return The AMF trait array iterator begin - */ - _AMFObjectTraits_::iterator GetTraitsIteratorBegin(); - - //! Gets the end of the object traits iterator - /*! - \return The AMF trait array iterator begin - */ - _AMFObjectTraits_::iterator GetTraitsIteratorEnd(); - - //! Gets the amount of traits - /*! - \return The amount of traits - */ - uint32_t GetTraitArrayCount(); -}; diff --git a/dCommon/AMFFormat_BitStream.cpp b/dCommon/AMFFormat_BitStream.cpp deleted file mode 100644 index dcb9197d..00000000 --- a/dCommon/AMFFormat_BitStream.cpp +++ /dev/null @@ -1,259 +0,0 @@ -#include "AMFFormat_BitStream.h" - -// Writes an AMFValue pointer to a RakNet::BitStream -template<> -void RakNet::BitStream::Write(AMFValue* value) { - if (value != nullptr) { - AMFValueType type = value->GetValueType(); - - switch (type) { - case AMFUndefined: { - AMFUndefinedValue* v = (AMFUndefinedValue*)value; - this->Write(*v); - break; - } - - case AMFNull: { - AMFNullValue* v = (AMFNullValue*)value; - this->Write(*v); - break; - } - - case AMFFalse: { - AMFFalseValue* v = (AMFFalseValue*)value; - this->Write(*v); - break; - } - - case AMFTrue: { - AMFTrueValue* v = (AMFTrueValue*)value; - this->Write(*v); - break; - } - - case AMFInteger: { - AMFIntegerValue* v = (AMFIntegerValue*)value; - this->Write(*v); - break; - } - - case AMFDouble: { - AMFDoubleValue* v = (AMFDoubleValue*)value; - this->Write(*v); - break; - } - - case AMFString: { - AMFStringValue* v = (AMFStringValue*)value; - this->Write(*v); - break; - } - - case AMFXMLDoc: { - AMFXMLDocValue* v = (AMFXMLDocValue*)value; - this->Write(*v); - break; - } - - case AMFDate: { - AMFDateValue* v = (AMFDateValue*)value; - this->Write(*v); - break; - } - - case AMFArray: { - this->Write((AMFArrayValue*)value); - break; - } - case AMFObject: - case AMFXML: - case AMFByteArray: - case AMFVectorInt: - case AMFVectorUInt: - case AMFVectorDouble: - case AMFVectorObject: - case AMFDictionary: - break; - } - } -} - -/** - * A private function to write an value to a RakNet::BitStream - * RakNet writes in the correct byte order - do not reverse this. - */ -void WriteUInt29(RakNet::BitStream* bs, uint32_t v) { - unsigned char b4 = (unsigned char)v; - if (v < 0x00200000) { - b4 = b4 & 0x7F; - if (v > 0x7F) { - unsigned char b3; - v = v >> 7; - b3 = ((unsigned char)(v)) | 0x80; - if (v > 0x7F) { - unsigned char b2; - v = v >> 7; - b2 = ((unsigned char)(v)) | 0x80; - bs->Write(b2); - } - - bs->Write(b3); - } - } else { - unsigned char b1; - unsigned char b2; - unsigned char b3; - - v = v >> 8; - b3 = ((unsigned char)(v)) | 0x80; - v = v >> 7; - b2 = ((unsigned char)(v)) | 0x80; - v = v >> 7; - b1 = ((unsigned char)(v)) | 0x80; - - bs->Write(b1); - bs->Write(b2); - bs->Write(b3); - } - - bs->Write(b4); -} - -/** - * Writes a flag number to a RakNet::BitStream - * RakNet writes in the correct byte order - do not reverse this. - */ -void WriteFlagNumber(RakNet::BitStream* bs, uint32_t v) { - v = (v << 1) | 0x01; - WriteUInt29(bs, v); -} - -/** - * Writes an AMFString to a RakNet::BitStream - * - * RakNet writes in the correct byte order - do not reverse this. - */ -void WriteAMFString(RakNet::BitStream* bs, const std::string& str) { - WriteFlagNumber(bs, (uint32_t)str.size()); - bs->Write(str.c_str(), (uint32_t)str.size()); -} - -/** - * Writes an U16 to a bitstream - * - * RakNet writes in the correct byte order - do not reverse this. - */ -void WriteAMFU16(RakNet::BitStream* bs, uint16_t value) { - bs->Write(value); -} - -/** - * Writes an U32 to a bitstream - * - * RakNet writes in the correct byte order - do not reverse this. - */ -void WriteAMFU32(RakNet::BitStream* bs, uint32_t value) { - bs->Write(value); -} - -/** - * Writes an U64 to a bitstream - * - * RakNet writes in the correct byte order - do not reverse this. - */ -void WriteAMFU64(RakNet::BitStream* bs, uint64_t value) { - bs->Write(value); -} - - -// Writes an AMFUndefinedValue to BitStream -template<> -void RakNet::BitStream::Write(AMFUndefinedValue value) { - this->Write(AMFUndefined); -} - -// Writes an AMFNullValue to BitStream -template<> -void RakNet::BitStream::Write(AMFNullValue value) { - this->Write(AMFNull); -} - -// Writes an AMFFalseValue to BitStream -template<> -void RakNet::BitStream::Write(AMFFalseValue value) { - this->Write(AMFFalse); -} - -// Writes an AMFTrueValue to BitStream -template<> -void RakNet::BitStream::Write(AMFTrueValue value) { - this->Write(AMFTrue); -} - -// Writes an AMFIntegerValue to BitStream -template<> -void RakNet::BitStream::Write(AMFIntegerValue value) { - this->Write(AMFInteger); - WriteUInt29(this, value.GetIntegerValue()); -} - -// Writes an AMFDoubleValue to BitStream -template<> -void RakNet::BitStream::Write(AMFDoubleValue value) { - this->Write(AMFDouble); - double d = value.GetDoubleValue(); - WriteAMFU64(this, *((unsigned long long*) & d)); -} - -// Writes an AMFStringValue to BitStream -template<> -void RakNet::BitStream::Write(AMFStringValue value) { - this->Write(AMFString); - std::string v = value.GetStringValue(); - WriteAMFString(this, v); -} - -// Writes an AMFXMLDocValue to BitStream -template<> -void RakNet::BitStream::Write(AMFXMLDocValue value) { - this->Write(AMFXMLDoc); - std::string v = value.GetXMLDocValue(); - WriteAMFString(this, v); -} - -// Writes an AMFDateValue to BitStream -template<> -void RakNet::BitStream::Write(AMFDateValue value) { - this->Write(AMFDate); - uint64_t date = value.GetDateValue(); - WriteAMFU64(this, date); -} - -// Writes an AMFArrayValue to BitStream -template<> -void RakNet::BitStream::Write(AMFArrayValue* value) { - this->Write(AMFArray); - uint32_t denseSize = value->GetDenseValueSize(); - WriteFlagNumber(this, denseSize); - - _AMFArrayMap_::iterator it = value->GetAssociativeIteratorValueBegin(); - _AMFArrayMap_::iterator end = value->GetAssociativeIteratorValueEnd(); - - while (it != end) { - WriteAMFString(this, it->first); - this->Write(it->second); - it++; - } - - this->Write(AMFNull); - - if (denseSize > 0) { - _AMFArrayList_::iterator it2 = value->GetDenseIteratorBegin(); - _AMFArrayList_::iterator end2 = value->GetDenseIteratorEnd(); - - while (it2 != end2) { - this->Write(*it2); - it2++; - } - } -} diff --git a/dCommon/AMFFormat_BitStream.h b/dCommon/AMFFormat_BitStream.h deleted file mode 100644 index caa49337..00000000 --- a/dCommon/AMFFormat_BitStream.h +++ /dev/null @@ -1,92 +0,0 @@ -#pragma once - -// Custom Classes -#include "AMFFormat.h" - -// RakNet -#include - -/*! - \file AMFFormat_BitStream.h - \brief A class that implements native writing of AMF values to RakNet::BitStream - */ - - // We are using the RakNet namespace -namespace RakNet { - //! Writes an AMFValue pointer to a RakNet::BitStream - /*! - \param value The value to write - */ - template <> - void RakNet::BitStream::Write(AMFValue* value); - - //! Writes an AMFUndefinedValue to a RakNet::BitStream - /*! - \param value The value to write - */ - template <> - void RakNet::BitStream::Write(AMFUndefinedValue value); - - //! Writes an AMFNullValue to a RakNet::BitStream - /*! - \param value The value to write - */ - template <> - void RakNet::BitStream::Write(AMFNullValue value); - - //! Writes an AMFFalseValue to a RakNet::BitStream - /*! - \param value The value to write - */ - template <> - void RakNet::BitStream::Write(AMFFalseValue value); - - //! Writes an AMFTrueValue to a RakNet::BitStream - /*! - \param value The value to write - */ - template <> - void RakNet::BitStream::Write(AMFTrueValue value); - - //! Writes an AMFIntegerValue to a RakNet::BitStream - /*! - \param value The value to write - */ - template <> - void RakNet::BitStream::Write(AMFIntegerValue value); - - //! Writes an AMFDoubleValue to a RakNet::BitStream - /*! - \param value The value to write - */ - template <> - void RakNet::BitStream::Write(AMFDoubleValue value); - - //! Writes an AMFStringValue to a RakNet::BitStream - /*! - \param value The value to write - */ - template <> - void RakNet::BitStream::Write(AMFStringValue value); - - //! Writes an AMFXMLDocValue to a RakNet::BitStream - /*! - \param value The value to write - */ - template <> - void RakNet::BitStream::Write(AMFXMLDocValue value); - - //! Writes an AMFDateValue to a RakNet::BitStream - /*! - \param value The value to write - */ - template <> - void RakNet::BitStream::Write(AMFDateValue value); - - //! Writes an AMFArrayValue to a RakNet::BitStream - /*! - \param value The value to write - */ - template <> - void RakNet::BitStream::Write(AMFArrayValue* value); -} // namespace RakNet diff --git a/dCommon/Amf3.h b/dCommon/Amf3.h new file mode 100644 index 00000000..4dba039f --- /dev/null +++ b/dCommon/Amf3.h @@ -0,0 +1,368 @@ +#ifndef __AMF3__H__ +#define __AMF3__H__ + +#include "dCommonVars.h" +#include "dLogger.h" +#include "Game.h" + +#include +#include + +enum class eAmf : uint8_t { + Undefined = 0x00, // An undefined AMF Value + Null = 0x01, // A null AMF value + False = 0x02, // A false AMF value + True = 0x03, // A true AMF value + Integer = 0x04, // An integer AMF value + Double = 0x05, // A double AMF value + String = 0x06, // A string AMF value + XMLDoc = 0x07, // Unused in the live client and cannot be serialized without modification. An XML Doc AMF value + Date = 0x08, // Unused in the live client and cannot be serialized without modification. A date AMF value + Array = 0x09, // An array AMF value + Object = 0x0A, // Unused in the live client and cannot be serialized without modification. An object AMF value + XML = 0x0B, // Unused in the live client and cannot be serialized without modification. An XML AMF value + ByteArray = 0x0C, // Unused in the live client and cannot be serialized without modification. A byte array AMF value + VectorInt = 0x0D, // Unused in the live client and cannot be serialized without modification. An integer vector AMF value + VectorUInt = 0x0E, // Unused in the live client and cannot be serialized without modification. An unsigned integer AMF value + VectorDouble = 0x0F, // Unused in the live client and cannot be serialized without modification. A double vector AMF value + VectorObject = 0x10, // Unused in the live client and cannot be serialized without modification. An object vector AMF value + Dictionary = 0x11 // Unused in the live client and cannot be serialized without modification. A dictionary AMF value +}; + +class AMFBaseValue { +public: + virtual eAmf GetValueType() { return eAmf::Undefined; }; + AMFBaseValue() {}; + virtual ~AMFBaseValue() {}; +}; + +template +class AMFValue : public AMFBaseValue { +public: + AMFValue() {}; + AMFValue(ValueType value) { SetValue(value); }; + virtual ~AMFValue() override {}; + + eAmf GetValueType() override { return eAmf::Undefined; }; + + const ValueType& GetValue() { return data; }; + void SetValue(ValueType value) { data = value; }; +protected: + ValueType data; +}; + +// As a string this is much easier to write and read from a BitStream. +template<> +class AMFValue : public AMFBaseValue { +public: + AMFValue() {}; + AMFValue(const char* value) { SetValue(std::string(value)); }; + virtual ~AMFValue() override {}; + + eAmf GetValueType() override { return eAmf::String; }; + + const std::string& GetValue() { return data; }; + void SetValue(std::string value) { data = value; }; +protected: + std::string data; +}; + +typedef AMFValue AMFNullValue; +typedef AMFValue AMFBoolValue; +typedef AMFValue AMFIntValue; +typedef AMFValue AMFStringValue; +typedef AMFValue AMFDoubleValue; + +template<> inline eAmf AMFValue::GetValueType() { return eAmf::Null; }; +template<> inline eAmf AMFValue::GetValueType() { return this->data ? eAmf::True : eAmf::False; }; +template<> inline eAmf AMFValue::GetValueType() { return eAmf::Integer; }; +template<> inline eAmf AMFValue::GetValueType() { return eAmf::Integer; }; +template<> inline eAmf AMFValue::GetValueType() { return eAmf::String; }; +template<> inline eAmf AMFValue::GetValueType() { return eAmf::Double; }; + +/** + * The AMFArrayValue object holds 2 types of lists: + * An associative list where a key maps to a value + * A Dense list where elements are stored back to back + * + * Objects that are Registered are owned by this object + * and are not to be deleted by a caller. + */ +class AMFArrayValue : public AMFBaseValue { + + typedef std::unordered_map AMFAssociative; + typedef std::vector AMFDense; + +public: + eAmf GetValueType() override { return eAmf::Array; }; + + ~AMFArrayValue() override { + for (auto valueToDelete : GetDense()) { + if (valueToDelete) { + delete valueToDelete; + valueToDelete = nullptr; + } + } + for (auto valueToDelete : GetAssociative()) { + if (valueToDelete.second) { + delete valueToDelete.second; + valueToDelete.second = nullptr; + } + } + }; + + /** + * Returns the Associative portion of the object + */ + inline AMFAssociative& GetAssociative() { return this->associative; }; + + /** + * Returns the dense portion of the object + */ + inline AMFDense& GetDense() { return this->dense; }; + + /** + * Inserts an AMFValue into the associative portion with the given key. + * If a duplicate is attempted to be inserted, it is ignored and the + * first value with that key is kept in the map. + * + * These objects are not to be deleted by the caller as they are owned by + * the AMFArray object which manages its own memory. + * + * @param key The key to associate with the value + * @param value The value to insert + * + * @return The inserted element if the type matched, + * or nullptr if a key existed and was not the same type + */ + template + std::pair*, bool> Insert(const std::string& key, ValueType value) { + auto element = associative.find(key); + AMFValue* val = nullptr; + bool found = true; + if (element == associative.end()) { + val = new AMFValue(value); + associative.insert(std::make_pair(key, val)); + } else { + val = dynamic_cast*>(element->second); + found = false; + } + return std::make_pair(val, found); + }; + + // Associates an array with a string key + std::pair Insert(const std::string& key) { + auto element = associative.find(key); + AMFArrayValue* val = nullptr; + bool found = true; + if (element == associative.end()) { + val = new AMFArrayValue(); + associative.insert(std::make_pair(key, val)); + } else { + val = dynamic_cast(element->second); + found = false; + } + return std::make_pair(val, found); + }; + + // Associates an array with an integer key + std::pair Insert(const uint32_t& index) { + AMFArrayValue* val = nullptr; + bool inserted = false; + if (index >= dense.size()) { + dense.resize(index + 1); + val = new AMFArrayValue(); + dense.at(index) = val; + inserted = true; + } + return std::make_pair(dynamic_cast(dense.at(index)), inserted); + }; + + /** + * @brief Inserts an AMFValue into the AMFArray key'd by index. + * Attempting to insert the same key to the same value twice overwrites + * the previous value with the new one. + * + * @param index The index to associate with the value + * @param value The value to insert + * @return The inserted element, or nullptr if the type did not match + * what was at the index. + */ + template + std::pair*, bool> Insert(const uint32_t& index, ValueType value) { + AMFValue* val = nullptr; + bool inserted = false; + if (index >= this->dense.size()) { + this->dense.resize(index + 1); + val = new AMFValue(value); + this->dense.at(index) = val; + inserted = true; + } + return std::make_pair(dynamic_cast*>(this->dense.at(index)), inserted); + }; + + /** + * Inserts an AMFValue into the associative portion with the given key. + * If a duplicate is attempted to be inserted, it replaces the original + * + * The inserted element is now owned by this object and is not to be deleted + * + * @param key The key to associate with the value + * @param value The value to insert + */ + void Insert(const std::string& key, AMFBaseValue* value) { + auto element = associative.find(key); + if (element != associative.end() && element->second) { + delete element->second; + element->second = value; + } else { + associative.insert(std::make_pair(key, value)); + } + }; + + /** + * Inserts an AMFValue into the associative portion with the given index. + * If a duplicate is attempted to be inserted, it replaces the original + * + * The inserted element is now owned by this object and is not to be deleted + * + * @param key The key to associate with the value + * @param value The value to insert + */ + void Insert(const uint32_t index, AMFBaseValue* value) { + if (index < dense.size()) { + AMFDense::iterator itr = dense.begin() + index; + if (*itr) delete dense.at(index); + } else { + dense.resize(index + 1); + } + dense.at(index) = value; + }; + + /** + * Pushes an AMFValue into the back of the dense portion. + * + * These objects are not to be deleted by the caller as they are owned by + * the AMFArray object which manages its own memory. + * + * @param value The value to insert + * + * @return The inserted pointer, or nullptr should the key already be in use. + */ + template + inline AMFValue* Push(ValueType value) { + return Insert(this->dense.size(), value).first; + }; + + /** + * Removes the key from the associative portion + * + * The pointer removed is now no longer managed by this container + * + * @param key The key to remove from the associative portion + */ + void Remove(const std::string& key, bool deleteValue = true) { + AMFAssociative::iterator it = this->associative.find(key); + if (it != this->associative.end()) { + if (deleteValue) delete it->second; + this->associative.erase(it); + } + } + + /** + * Pops the last element in the dense portion, deleting it in the process. + */ + void Remove(const uint32_t index) { + if (!this->dense.empty() && index < this->dense.size()) { + auto itr = this->dense.begin() + index; + if (*itr) delete (*itr); + this->dense.erase(itr); + } + } + + void Pop() { + if (!this->dense.empty()) Remove(this->dense.size() - 1); + } + + AMFArrayValue* GetArray(const std::string& key) { + AMFAssociative::const_iterator it = this->associative.find(key); + if (it != this->associative.end()) { + return dynamic_cast(it->second); + } + return nullptr; + }; + + AMFArrayValue* GetArray(const uint32_t index) { + return index >= this->dense.size() ? nullptr : dynamic_cast(this->dense.at(index)); + }; + + inline AMFArrayValue* InsertArray(const std::string& key) { + return static_cast(Insert(key).first); + }; + + inline AMFArrayValue* InsertArray(const uint32_t index) { + return static_cast(Insert(index).first); + }; + + inline AMFArrayValue* PushArray() { + return static_cast(Insert(this->dense.size()).first); + }; + + /** + * Gets an AMFValue by the key from the associative portion and converts it + * to the AmfValue template type. If the key did not exist, it is inserted. + * + * @tparam The target object type + * @param key The key to lookup + * + * @return The AMFValue + */ + template + AMFValue* Get(const std::string& key) const { + AMFAssociative::const_iterator it = this->associative.find(key); + return it != this->associative.end() ? + dynamic_cast*>(it->second) : + nullptr; + }; + + // Get from the array but dont cast it + AMFBaseValue* Get(const std::string& key) const { + AMFAssociative::const_iterator it = this->associative.find(key); + return it != this->associative.end() ? it->second : nullptr; + }; + + /** + * @brief Get an AMFValue object at a position in the dense portion. + * Gets an AMFValue by the index from the dense portion and converts it + * to the AmfValue template type. If the index did not exist, it is inserted. + * + * @tparam The target object type + * @param index The index to get + * @return The casted object, or nullptr. + */ + template + AMFValue* Get(uint32_t index) const { + std::cout << (index < this->dense.size()) << std::endl; + return index < this->dense.size() ? + dynamic_cast*>(this->dense.at(index)) : + nullptr; + }; + + // Get from the dense but dont cast it + AMFBaseValue* Get(const uint32_t index) const { + return index < this->dense.size() ? this->dense.at(index) : nullptr; + }; +private: + /** + * The associative portion. These values are key'd with strings to an AMFValue. + */ + AMFAssociative associative; + + /** + * The dense portion. These AMFValue's are stored one after + * another with the most recent addition being at the back. + */ + AMFDense dense; +}; + +#endif //!__AMF3__H__ diff --git a/dCommon/AmfSerialize.cpp b/dCommon/AmfSerialize.cpp new file mode 100644 index 00000000..79ba5e2d --- /dev/null +++ b/dCommon/AmfSerialize.cpp @@ -0,0 +1,184 @@ +#include "AmfSerialize.h" + +#include "Game.h" +#include "dLogger.h" + +// Writes an AMFValue pointer to a RakNet::BitStream +template<> +void RakNet::BitStream::Write(AMFBaseValue& value) { + eAmf type = value.GetValueType(); + this->Write(type); + switch (type) { + case eAmf::Integer: { + this->Write(*static_cast(&value)); + break; + } + + case eAmf::Double: { + this->Write(*static_cast(&value)); + break; + } + + case eAmf::String: { + this->Write(*static_cast(&value)); + break; + } + + case eAmf::Array: { + this->Write(*static_cast(&value)); + break; + } + default: { + Game::logger->Log("AmfSerialize", "Encountered unwritable AMFType %i!", type); + } + case eAmf::Undefined: + case eAmf::Null: + case eAmf::False: + case eAmf::True: + case eAmf::Date: + case eAmf::Object: + case eAmf::XML: + case eAmf::XMLDoc: + case eAmf::ByteArray: + case eAmf::VectorInt: + case eAmf::VectorUInt: + case eAmf::VectorDouble: + case eAmf::VectorObject: + case eAmf::Dictionary: + break; + } +} + +/** + * A private function to write an value to a RakNet::BitStream + * RakNet writes in the correct byte order - do not reverse this. + */ +void WriteUInt29(RakNet::BitStream* bs, uint32_t v) { + unsigned char b4 = (unsigned char)v; + if (v < 0x00200000) { + b4 = b4 & 0x7F; + if (v > 0x7F) { + unsigned char b3; + v = v >> 7; + b3 = ((unsigned char)(v)) | 0x80; + if (v > 0x7F) { + unsigned char b2; + v = v >> 7; + b2 = ((unsigned char)(v)) | 0x80; + bs->Write(b2); + } + + bs->Write(b3); + } + } else { + unsigned char b1; + unsigned char b2; + unsigned char b3; + + v = v >> 8; + b3 = ((unsigned char)(v)) | 0x80; + v = v >> 7; + b2 = ((unsigned char)(v)) | 0x80; + v = v >> 7; + b1 = ((unsigned char)(v)) | 0x80; + + bs->Write(b1); + bs->Write(b2); + bs->Write(b3); + } + + bs->Write(b4); +} + +/** + * Writes a flag number to a RakNet::BitStream + * RakNet writes in the correct byte order - do not reverse this. + */ +void WriteFlagNumber(RakNet::BitStream* bs, uint32_t v) { + v = (v << 1) | 0x01; + WriteUInt29(bs, v); +} + +/** + * Writes an AMFString to a RakNet::BitStream + * + * RakNet writes in the correct byte order - do not reverse this. + */ +void WriteAMFString(RakNet::BitStream* bs, const std::string& str) { + WriteFlagNumber(bs, (uint32_t)str.size()); + bs->Write(str.c_str(), (uint32_t)str.size()); +} + +/** + * Writes an U16 to a bitstream + * + * RakNet writes in the correct byte order - do not reverse this. + */ +void WriteAMFU16(RakNet::BitStream* bs, uint16_t value) { + bs->Write(value); +} + +/** + * Writes an U32 to a bitstream + * + * RakNet writes in the correct byte order - do not reverse this. + */ +void WriteAMFU32(RakNet::BitStream* bs, uint32_t value) { + bs->Write(value); +} + +/** + * Writes an U64 to a bitstream + * + * RakNet writes in the correct byte order - do not reverse this. + */ +void WriteAMFU64(RakNet::BitStream* bs, uint64_t value) { + bs->Write(value); +} + +// Writes an AMFIntegerValue to BitStream +template<> +void RakNet::BitStream::Write(AMFIntValue& value) { + WriteUInt29(this, value.GetValue()); +} + +// Writes an AMFDoubleValue to BitStream +template<> +void RakNet::BitStream::Write(AMFDoubleValue& value) { + double d = value.GetValue(); + WriteAMFU64(this, *reinterpret_cast(&d)); +} + +// Writes an AMFStringValue to BitStream +template<> +void RakNet::BitStream::Write(AMFStringValue& value) { + WriteAMFString(this, value.GetValue()); +} + +// Writes an AMFArrayValue to BitStream +template<> +void RakNet::BitStream::Write(AMFArrayValue& value) { + uint32_t denseSize = value.GetDense().size(); + WriteFlagNumber(this, denseSize); + + auto it = value.GetAssociative().begin(); + auto end = value.GetAssociative().end(); + + while (it != end) { + WriteAMFString(this, it->first); + this->Write(*it->second); + it++; + } + + this->Write(eAmf::Null); + + if (denseSize > 0) { + auto it2 = value.GetDense().begin(); + auto end2 = value.GetDense().end(); + + while (it2 != end2) { + this->Write(**it2); + it2++; + } + } +} diff --git a/dCommon/AmfSerialize.h b/dCommon/AmfSerialize.h new file mode 100644 index 00000000..9a6f56f2 --- /dev/null +++ b/dCommon/AmfSerialize.h @@ -0,0 +1,50 @@ +#pragma once + +// Custom Classes +#include "Amf3.h" + +// RakNet +#include + +/*! + \file AmfSerialize.h + \brief A class that implements native writing of AMF values to RakNet::BitStream + */ + + // We are using the RakNet namespace +namespace RakNet { + //! Writes an AMFValue pointer to a RakNet::BitStream + /*! + \param value The value to write + */ + template <> + void RakNet::BitStream::Write(AMFBaseValue& value); + + //! Writes an AMFIntegerValue to a RakNet::BitStream + /*! + \param value The value to write + */ + template <> + void RakNet::BitStream::Write(AMFIntValue& value); + + //! Writes an AMFDoubleValue to a RakNet::BitStream + /*! + \param value The value to write + */ + template <> + void RakNet::BitStream::Write(AMFDoubleValue& value); + + //! Writes an AMFStringValue to a RakNet::BitStream + /*! + \param value The value to write + */ + template <> + void RakNet::BitStream::Write(AMFStringValue& value); + + //! Writes an AMFArrayValue to a RakNet::BitStream + /*! + \param value The value to write + */ + template <> + void RakNet::BitStream::Write(AMFArrayValue& value); +} // namespace RakNet diff --git a/dCommon/CMakeLists.txt b/dCommon/CMakeLists.txt index 549acfb2..2517c048 100644 --- a/dCommon/CMakeLists.txt +++ b/dCommon/CMakeLists.txt @@ -1,6 +1,6 @@ -set(DCOMMON_SOURCES "AMFFormat.cpp" +set(DCOMMON_SOURCES "AMFDeserialize.cpp" - "AMFFormat_BitStream.cpp" + "AmfSerialize.cpp" "BinaryIO.cpp" "dConfig.cpp" "Diagnostics.cpp" diff --git a/dGame/dComponents/CharacterComponent.cpp b/dGame/dComponents/CharacterComponent.cpp index 82ad5507..32fe564c 100644 --- a/dGame/dComponents/CharacterComponent.cpp +++ b/dGame/dComponents/CharacterComponent.cpp @@ -13,7 +13,7 @@ #include "VehiclePhysicsComponent.h" #include "GameMessages.h" #include "Item.h" -#include "AMFFormat.h" +#include "Amf3.h" #include "eGameMasterLevel.h" #include "eGameActivity.h" @@ -734,6 +734,6 @@ void CharacterComponent::RemoveVentureVisionEffect(std::string ventureVisionType void CharacterComponent::UpdateClientMinimap(bool showFaction, std::string ventureVisionType) const { if (!m_Parent) return; AMFArrayValue arrayToSend; - arrayToSend.InsertValue(ventureVisionType, showFaction ? static_cast(new AMFTrueValue()) : static_cast(new AMFFalseValue())); - GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent ? m_Parent->GetSystemAddress() : UNASSIGNED_SYSTEM_ADDRESS, "SetFactionVisibility", &arrayToSend); + arrayToSend.Insert(ventureVisionType, showFaction); + GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent ? m_Parent->GetSystemAddress() : UNASSIGNED_SYSTEM_ADDRESS, "SetFactionVisibility", arrayToSend); } diff --git a/dGame/dComponents/DestroyableComponent.cpp b/dGame/dComponents/DestroyableComponent.cpp index 7e7d44aa..01ebf5c1 100644 --- a/dGame/dComponents/DestroyableComponent.cpp +++ b/dGame/dComponents/DestroyableComponent.cpp @@ -4,8 +4,8 @@ #include "Game.h" #include "dConfig.h" -#include "AMFFormat.h" -#include "AMFFormat_BitStream.h" +#include "Amf3.h" +#include "AmfSerialize.h" #include "GameMessages.h" #include "User.h" #include "CDClientManager.h" @@ -245,16 +245,12 @@ void DestroyableComponent::SetMaxHealth(float value, bool playAnim) { if (playAnim) { // Now update the player bar if (!m_Parent->GetParentUser()) return; - AMFStringValue* amount = new AMFStringValue(); - amount->SetStringValue(std::to_string(difference)); - AMFStringValue* type = new AMFStringValue(); - type->SetStringValue("health"); AMFArrayValue args; - args.InsertValue("amount", amount); - args.InsertValue("type", type); + args.Insert("amount", std::to_string(difference)); + args.Insert("type", "health"); - GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", &args); + GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", args); } EntityManager::Instance()->SerializeEntity(m_Parent); @@ -290,16 +286,12 @@ void DestroyableComponent::SetMaxArmor(float value, bool playAnim) { if (playAnim) { // Now update the player bar if (!m_Parent->GetParentUser()) return; - AMFStringValue* amount = new AMFStringValue(); - amount->SetStringValue(std::to_string(value)); - AMFStringValue* type = new AMFStringValue(); - type->SetStringValue("armor"); AMFArrayValue args; - args.InsertValue("amount", amount); - args.InsertValue("type", type); + args.Insert("amount", std::to_string(value)); + args.Insert("type", "armor"); - GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", &args); + GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", args); } EntityManager::Instance()->SerializeEntity(m_Parent); @@ -334,16 +326,12 @@ void DestroyableComponent::SetMaxImagination(float value, bool playAnim) { if (playAnim) { // Now update the player bar if (!m_Parent->GetParentUser()) return; - AMFStringValue* amount = new AMFStringValue(); - amount->SetStringValue(std::to_string(difference)); - AMFStringValue* type = new AMFStringValue(); - type->SetStringValue("imagination"); AMFArrayValue args; - args.InsertValue("amount", amount); - args.InsertValue("type", type); + args.Insert("amount", std::to_string(difference)); + args.Insert("type", "imagination"); - GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", &args); + GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", args); } EntityManager::Instance()->SerializeEntity(m_Parent); } diff --git a/dGame/dComponents/MissionComponent.cpp b/dGame/dComponents/MissionComponent.cpp index 0ae0f07e..8f61c1aa 100644 --- a/dGame/dComponents/MissionComponent.cpp +++ b/dGame/dComponents/MissionComponent.cpp @@ -13,7 +13,7 @@ #include "InventoryComponent.h" #include "GameMessages.h" #include "Game.h" -#include "AMFFormat.h" +#include "Amf3.h" #include "dZoneManager.h" #include "Mail.h" #include "MissionPrerequisites.h" diff --git a/dGame/dComponents/PropertyEntranceComponent.cpp b/dGame/dComponents/PropertyEntranceComponent.cpp index 5da9a3c4..bff917d8 100644 --- a/dGame/dComponents/PropertyEntranceComponent.cpp +++ b/dGame/dComponents/PropertyEntranceComponent.cpp @@ -11,7 +11,7 @@ #include "CharacterComponent.h" #include "UserManager.h" #include "dLogger.h" -#include "AMFFormat.h" +#include "Amf3.h" #include "eObjectBits.h" #include "eGameMasterLevel.h" @@ -36,12 +36,9 @@ void PropertyEntranceComponent::OnUse(Entity* entity) { AMFArrayValue args; - auto* state = new AMFStringValue(); - state->SetStringValue("property_menu"); + args.Insert("state", "property_menu"); - args.InsertValue("state", state); - - GameMessages::SendUIMessageServerToSingleClient(entity, entity->GetSystemAddress(), "pushGameState", &args); + GameMessages::SendUIMessageServerToSingleClient(entity, entity->GetSystemAddress(), "pushGameState", args); } void PropertyEntranceComponent::OnEnterProperty(Entity* entity, uint32_t index, bool returnToZone, const SystemAddress& sysAddr) { diff --git a/dGame/dComponents/RenderComponent.h b/dGame/dComponents/RenderComponent.h index de8b2907..e09ec22d 100644 --- a/dGame/dComponents/RenderComponent.h +++ b/dGame/dComponents/RenderComponent.h @@ -6,7 +6,7 @@ #include #include -#include "AMFFormat.h" +#include "Amf3.h" #include "Component.h" #include "eReplicaComponentType.h" diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index 165876ff..be57bce3 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -28,7 +28,7 @@ #include "eUnequippableActiveType.h" #include "eMovementPlatformState.h" #include "LeaderboardManager.h" -#include "AMFFormat.h" +#include "Amf3.h" #include "Loot.h" #include "eRacingTaskParam.h" #include "eMissionTaskType.h" @@ -87,7 +87,7 @@ #include "AMFDeserialize.h" #include "eBlueprintSaveResponseType.h" #include "eAninmationFlags.h" -#include "AMFFormat_BitStream.h" +#include "AmfSerialize.h" #include "eReplicaComponentType.h" #include "eClientMessageType.h" #include "eGameMessageType.h" @@ -596,14 +596,14 @@ void GameMessages::SendModifyLEGOScore(Entity* entity, const SystemAddress& sysA SEND_PACKET; } -void GameMessages::SendUIMessageServerToSingleClient(Entity* entity, const SystemAddress& sysAddr, const std::string& message, AMFValue* args) { +void GameMessages::SendUIMessageServerToSingleClient(Entity* entity, const SystemAddress& sysAddr, const std::string& message, AMFBaseValue& args) { CBITSTREAM; CMSGHEADER; bitStream.Write(entity->GetObjectID()); bitStream.Write((uint16_t)eGameMessageType::UI_MESSAGE_SERVER_TO_SINGLE_CLIENT); - bitStream.Write(args); + bitStream.Write(args); uint32_t strMessageNameLength = message.size(); bitStream.Write(strMessageNameLength); @@ -614,7 +614,7 @@ void GameMessages::SendUIMessageServerToSingleClient(Entity* entity, const Syste SEND_PACKET; } -void GameMessages::SendUIMessageServerToAllClients(const std::string& message, AMFValue* args) { +void GameMessages::SendUIMessageServerToAllClients(const std::string& message, AMFBaseValue& args) { CBITSTREAM; CMSGHEADER; @@ -622,7 +622,7 @@ void GameMessages::SendUIMessageServerToAllClients(const std::string& message, A bitStream.Write(empty); bitStream.Write((uint16_t)eGameMessageType::UI_MESSAGE_SERVER_TO_ALL_CLIENTS); - bitStream.Write(args); + bitStream.Write(args); uint32_t strMessageNameLength = message.size(); bitStream.Write(strMessageNameLength); @@ -2486,8 +2486,8 @@ void GameMessages::SendUnSmash(Entity* entity, LWOOBJID builderID, float duratio void GameMessages::HandleControlBehaviors(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr) { AMFDeserialize reader; - std::unique_ptr amfArguments(reader.Read(inStream)); - if (amfArguments->GetValueType() != AMFValueType::AMFArray) return; + std::unique_ptr amfArguments(reader.Read(inStream)); + if (amfArguments->GetValueType() != eAmf::Array) return; uint32_t commandLength{}; inStream->Read(commandLength); diff --git a/dGame/dGameMessages/GameMessages.h b/dGame/dGameMessages/GameMessages.h index 94b24b65..7e7a8f70 100644 --- a/dGame/dGameMessages/GameMessages.h +++ b/dGame/dGameMessages/GameMessages.h @@ -12,7 +12,7 @@ #include "eLootSourceType.h" #include "Brick.h" -class AMFValue; +class AMFBaseValue; class Entity; class Item; class NiQuaternion; @@ -88,8 +88,8 @@ namespace GameMessages { void NotifyLevelRewards(LWOOBJID objectID, const SystemAddress& sysAddr, int level, bool sending_rewards); void SendModifyLEGOScore(Entity* entity, const SystemAddress& sysAddr, int64_t score, eLootSourceType sourceType); - void SendUIMessageServerToSingleClient(Entity* entity, const SystemAddress& sysAddr, const std::string& message, AMFValue* args); - void SendUIMessageServerToAllClients(const std::string& message, AMFValue* args); + void SendUIMessageServerToSingleClient(Entity* entity, const SystemAddress& sysAddr, const std::string& message, AMFBaseValue& args); + void SendUIMessageServerToAllClients(const std::string& message, AMFBaseValue& args); void SendPlayEmbeddedEffectOnAllClientsNearObject(Entity* entity, std::u16string effectName, const LWOOBJID& fromObjectID, float radius); void SendPlayFXEffect(Entity* entity, int32_t effectID, const std::u16string& effectType, const std::string& name, LWOOBJID secondary, float priority = 1, float scale = 1, bool serialize = true); diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.cpp b/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.cpp index 7da286b0..eabe76b7 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.cpp @@ -12,19 +12,19 @@ Action::Action(AMFArrayValue* arguments) { valueParameterName = ""; valueParameterString = ""; valueParameterDouble = 0.0; - for (auto& typeValueMap : arguments->GetAssociativeMap()) { + for (auto& typeValueMap : arguments->GetAssociative()) { if (typeValueMap.first == "Type") { - if (typeValueMap.second->GetValueType() != AMFValueType::AMFString) continue; - type = static_cast(typeValueMap.second)->GetStringValue(); + if (typeValueMap.second->GetValueType() != eAmf::String) continue; + type = static_cast(typeValueMap.second)->GetValue(); } else { valueParameterName = typeValueMap.first; // Message is the only known string parameter if (valueParameterName == "Message") { - if (typeValueMap.second->GetValueType() != AMFValueType::AMFString) continue; - valueParameterString = static_cast(typeValueMap.second)->GetStringValue(); + if (typeValueMap.second->GetValueType() != eAmf::String) continue; + valueParameterString = static_cast(typeValueMap.second)->GetValue(); } else { - if (typeValueMap.second->GetValueType() != AMFValueType::AMFDouble) continue; - valueParameterDouble = static_cast(typeValueMap.second)->GetDoubleValue(); + if (typeValueMap.second->GetValueType() != eAmf::Double) continue; + valueParameterDouble = static_cast(typeValueMap.second)->GetValue(); } } } diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/ActionContext.cpp b/dGame/dPropertyBehaviors/ControlBehaviorMessages/ActionContext.cpp index 480eef45..c2ba2eeb 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/ActionContext.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/ActionContext.cpp @@ -2,7 +2,7 @@ #include -#include "AMFFormat.h" +#include "Amf3.h" ActionContext::ActionContext() { stripId = 0; @@ -17,15 +17,15 @@ ActionContext::ActionContext(AMFArrayValue* arguments, std::string customStateKe } BehaviorState ActionContext::GetBehaviorStateFromArgument(AMFArrayValue* arguments, const std::string& key) { - auto* stateIDValue = arguments->FindValue(key); + auto* stateIDValue = arguments->Get(key); if (!stateIDValue) throw std::invalid_argument("Unable to find behavior state from argument \"" + key + "\""); - return static_cast(stateIDValue->GetDoubleValue()); + return static_cast(stateIDValue->GetValue()); } StripId ActionContext::GetStripIdFromArgument(AMFArrayValue* arguments, const std::string& key) { - auto* stripIdValue = arguments->FindValue(key); + auto* stripIdValue = arguments->Get(key); if (!stripIdValue) throw std::invalid_argument("Unable to find strip ID from argument \"" + key + "\""); - return static_cast(stripIdValue->GetDoubleValue()); + return static_cast(stripIdValue->GetValue()); } diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddActionMessage.cpp b/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddActionMessage.cpp index 4fc7f82b..98672909 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddActionMessage.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddActionMessage.cpp @@ -4,7 +4,7 @@ AddActionMessage::AddActionMessage(AMFArrayValue* arguments) : BehaviorMessageBa actionContext = ActionContext(arguments); actionIndex = GetActionIndexFromArgument(arguments); - auto* actionValue = arguments->FindValue("action"); + auto* actionValue = arguments->GetArray("action"); if (!actionValue) return; action = Action(actionValue); diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddMessage.cpp b/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddMessage.cpp index 4f2123b4..badee2c2 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddMessage.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddMessage.cpp @@ -2,10 +2,10 @@ AddMessage::AddMessage(AMFArrayValue* arguments) : BehaviorMessageBase(arguments) { behaviorIndex = 0; - auto* behaviorIndexValue = arguments->FindValue("BehaviorIndex"); + auto* behaviorIndexValue = arguments->Get("BehaviorIndex"); if (!behaviorIndexValue) return; - behaviorIndex = static_cast(behaviorIndexValue->GetDoubleValue()); + behaviorIndex = static_cast(behaviorIndexValue->GetValue()); Game::logger->LogDebug("AddMessage", "behaviorId %i index %i", behaviorId, behaviorIndex); } diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddStripMessage.cpp b/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddStripMessage.cpp index c4729c57..261b3462 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddStripMessage.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/AddStripMessage.cpp @@ -4,17 +4,16 @@ AddStripMessage::AddStripMessage(AMFArrayValue* arguments) : BehaviorMessageBase(arguments) { actionContext = ActionContext(arguments); - position = StripUiPosition(arguments); - auto* strip = arguments->FindValue("strip"); + auto* strip = arguments->GetArray("strip"); if (!strip) return; - auto* actions = strip->FindValue("actions"); + auto* actions = strip->GetArray("actions"); if (!actions) return; - for (uint32_t actionNumber = 0; actionNumber < actions->GetDenseValueSize(); actionNumber++) { - auto* actionValue = actions->GetValueAt(actionNumber); + for (uint32_t actionNumber = 0; actionNumber < actions->GetDense().size(); actionNumber++) { + auto* actionValue = actions->GetArray(actionNumber); if (!actionValue) continue; actionsToAdd.push_back(Action(actionValue)); diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/BehaviorMessageBase.cpp b/dGame/dPropertyBehaviors/ControlBehaviorMessages/BehaviorMessageBase.cpp index b3d98d51..3286504a 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/BehaviorMessageBase.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/BehaviorMessageBase.cpp @@ -1,6 +1,6 @@ #include "BehaviorMessageBase.h" -#include "AMFFormat.h" +#include "Amf3.h" #include "BehaviorStates.h" #include "dCommonVars.h" @@ -11,12 +11,12 @@ BehaviorMessageBase::BehaviorMessageBase(AMFArrayValue* arguments) { int32_t BehaviorMessageBase::GetBehaviorIdFromArgument(AMFArrayValue* arguments) { const auto* key = "BehaviorID"; - auto* behaviorIDValue = arguments->FindValue(key); + auto* behaviorIDValue = arguments->Get(key); int32_t behaviorID = -1; - if (behaviorIDValue) { - behaviorID = std::stoul(behaviorIDValue->GetStringValue()); - } else if (!arguments->FindValue(key)) { + if (behaviorIDValue && behaviorIDValue->GetValueType() == eAmf::String) { + behaviorID = std::stoul(behaviorIDValue->GetValue()); + } else if (arguments->Get(key)->GetValueType() != eAmf::Undefined) { throw std::invalid_argument("Unable to find behavior ID"); } @@ -24,10 +24,10 @@ int32_t BehaviorMessageBase::GetBehaviorIdFromArgument(AMFArrayValue* arguments) } uint32_t BehaviorMessageBase::GetActionIndexFromArgument(AMFArrayValue* arguments, const std::string& keyName) { - auto* actionIndexAmf = arguments->FindValue(keyName); + auto* actionIndexAmf = arguments->Get(keyName); if (!actionIndexAmf) { throw std::invalid_argument("Unable to find actionIndex"); } - return static_cast(actionIndexAmf->GetDoubleValue()); + return static_cast(actionIndexAmf->GetValue()); } diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/BehaviorMessageBase.h b/dGame/dPropertyBehaviors/ControlBehaviorMessages/BehaviorMessageBase.h index 13b00a35..8771286c 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/BehaviorMessageBase.h +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/BehaviorMessageBase.h @@ -4,7 +4,7 @@ #include #include -#include "AMFFormat.h" +#include "Amf3.h" #include "dCommonVars.h" #include "Game.h" diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/MoveToInventoryMessage.cpp b/dGame/dPropertyBehaviors/ControlBehaviorMessages/MoveToInventoryMessage.cpp index 92700076..5b61ee32 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/MoveToInventoryMessage.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/MoveToInventoryMessage.cpp @@ -1,9 +1,9 @@ #include "MoveToInventoryMessage.h" MoveToInventoryMessage::MoveToInventoryMessage(AMFArrayValue* arguments) : BehaviorMessageBase(arguments) { - auto* behaviorIndexValue = arguments->FindValue("BehaviorIndex"); + auto* behaviorIndexValue = arguments->Get("BehaviorIndex"); if (!behaviorIndexValue) return; - behaviorIndex = static_cast(behaviorIndexValue->GetDoubleValue()); + behaviorIndex = static_cast(behaviorIndexValue->GetValue()); Game::logger->LogDebug("MoveToInventoryMessage", "behaviorId %i behaviorIndex %i", behaviorId, behaviorIndex); } diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/RenameMessage.cpp b/dGame/dPropertyBehaviors/ControlBehaviorMessages/RenameMessage.cpp index 0ea3b6d6..a1c2abbc 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/RenameMessage.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/RenameMessage.cpp @@ -1,9 +1,9 @@ #include "RenameMessage.h" RenameMessage::RenameMessage(AMFArrayValue* arguments) : BehaviorMessageBase(arguments) { - auto* nameAmf = arguments->FindValue("Name"); + auto* nameAmf = arguments->Get("Name"); if (!nameAmf) return; - name = nameAmf->GetStringValue(); + name = nameAmf->GetValue(); Game::logger->LogDebug("RenameMessage", "behaviorId %i n %s", behaviorId, name.c_str()); } diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/StripUiPosition.cpp b/dGame/dPropertyBehaviors/ControlBehaviorMessages/StripUiPosition.cpp index 4ddccc55..de612b45 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/StripUiPosition.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/StripUiPosition.cpp @@ -1,6 +1,6 @@ #include "StripUiPosition.h" -#include "AMFFormat.h" +#include "Amf3.h" StripUiPosition::StripUiPosition() { xPosition = 0.0; @@ -10,13 +10,13 @@ StripUiPosition::StripUiPosition() { StripUiPosition::StripUiPosition(AMFArrayValue* arguments, std::string uiKeyName) { xPosition = 0.0; yPosition = 0.0; - auto* uiArray = arguments->FindValue(uiKeyName); + auto* uiArray = arguments->GetArray(uiKeyName); if (!uiArray) return; - auto* xPositionValue = uiArray->FindValue("x"); - auto* yPositionValue = uiArray->FindValue("y"); + auto* xPositionValue = uiArray->Get("x"); + auto* yPositionValue = uiArray->Get("y"); if (!xPositionValue || !yPositionValue) return; - yPosition = yPositionValue->GetDoubleValue(); - xPosition = xPositionValue->GetDoubleValue(); + yPosition = yPositionValue->GetValue(); + xPosition = xPositionValue->GetValue(); } diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/UpdateActionMessage.cpp b/dGame/dPropertyBehaviors/ControlBehaviorMessages/UpdateActionMessage.cpp index 53e2d570..23a0050d 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/UpdateActionMessage.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/UpdateActionMessage.cpp @@ -5,7 +5,7 @@ UpdateActionMessage::UpdateActionMessage(AMFArrayValue* arguments) : BehaviorMessageBase(arguments) { actionContext = ActionContext(arguments); - auto* actionValue = arguments->FindValue("action"); + auto* actionValue = arguments->GetArray("action"); if (!actionValue) return; action = Action(actionValue); diff --git a/dGame/dPropertyBehaviors/ControlBehaviors.cpp b/dGame/dPropertyBehaviors/ControlBehaviors.cpp index dfb22b59..d8a062ca 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviors.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviors.cpp @@ -1,6 +1,6 @@ #include "ControlBehaviors.h" -#include "AMFFormat.h" +#include "Amf3.h" #include "Entity.h" #include "Game.h" #include "GameMessages.h" @@ -43,11 +43,11 @@ void ControlBehaviors::RequestUpdatedID(int32_t behaviorID, ModelComponent* mode // AMFArrayValue args; // AMFStringValue* behaviorIDString = new AMFStringValue(); - // behaviorIDString->SetStringValue(std::to_string(persistentId)); + // behaviorIDString->SetValue(std::to_string(persistentId)); // args.InsertValue("behaviorID", behaviorIDString); // AMFStringValue* objectIDAsString = new AMFStringValue(); - // objectIDAsString->SetStringValue(std::to_string(modelComponent->GetParent()->GetObjectID())); + // objectIDAsString->SetValue(std::to_string(modelComponent->GetParent()->GetObjectID())); // args.InsertValue("objectID", objectIDAsString); // GameMessages::SendUIMessageServerToSingleClient(modelOwner, sysAddr, "UpdateBehaviorID", &args); @@ -63,8 +63,6 @@ void ControlBehaviors::SendBehaviorListToClient(Entity* modelEntity, const Syste AMFArrayValue behaviorsToSerialize; - AMFArrayValue* behaviors = new AMFArrayValue(); // Empty for now - /** * The behaviors AMFArray will have up to 5 elements in the dense portion. * Each element in the dense portion will be made up of another AMFArray @@ -75,20 +73,17 @@ void ControlBehaviors::SendBehaviorListToClient(Entity* modelEntity, const Syste * "name": The name of the behavior formatted as an AMFString */ - behaviorsToSerialize.InsertValue("behaviors", behaviors); + behaviorsToSerialize.Insert("behaviors"); + behaviorsToSerialize.Insert("objectID", std::to_string(modelComponent->GetParent()->GetObjectID())); - AMFStringValue* amfStringValueForObjectID = new AMFStringValue(); - amfStringValueForObjectID->SetStringValue(std::to_string(modelComponent->GetParent()->GetObjectID())); - - behaviorsToSerialize.InsertValue("objectID", amfStringValueForObjectID); - GameMessages::SendUIMessageServerToSingleClient(modelOwner, sysAddr, "UpdateBehaviorList", &behaviorsToSerialize); + GameMessages::SendUIMessageServerToSingleClient(modelOwner, sysAddr, "UpdateBehaviorList", behaviorsToSerialize); } void ControlBehaviors::ModelTypeChanged(AMFArrayValue* arguments, ModelComponent* ModelComponent) { - auto* modelTypeAmf = arguments->FindValue("ModelType"); + auto* modelTypeAmf = arguments->Get("ModelType"); if (!modelTypeAmf) return; - uint32_t modelType = static_cast(modelTypeAmf->GetDoubleValue()); + uint32_t modelType = static_cast(modelTypeAmf->GetValue()); //TODO Update the model type here } @@ -179,7 +174,7 @@ void ControlBehaviors::SendBehaviorBlocksToClient(ModelComponent* modelComponent // AMFArrayValue* state = new AMFArrayValue(); // AMFDoubleValue* stateAsDouble = new AMFDoubleValue(); - // stateAsDouble->SetDoubleValue(it->first); + // stateAsDouble->SetValue(it->first); // state->InsertValue("id", stateAsDouble); // AMFArrayValue* strips = new AMFArrayValue(); @@ -189,16 +184,16 @@ void ControlBehaviors::SendBehaviorBlocksToClient(ModelComponent* modelComponent // AMFArrayValue* thisStrip = new AMFArrayValue(); // AMFDoubleValue* stripID = new AMFDoubleValue(); - // stripID->SetDoubleValue(strip->first); + // stripID->SetValue(strip->first); // thisStrip->InsertValue("id", stripID); // AMFArrayValue* uiArray = new AMFArrayValue(); // AMFDoubleValue* yPosition = new AMFDoubleValue(); - // yPosition->SetDoubleValue(strip->second->GetYPosition()); + // yPosition->SetValue(strip->second->GetYPosition()); // uiArray->InsertValue("y", yPosition); // AMFDoubleValue* xPosition = new AMFDoubleValue(); - // xPosition->SetDoubleValue(strip->second->GetXPosition()); + // xPosition->SetValue(strip->second->GetXPosition()); // uiArray->InsertValue("x", xPosition); // thisStrip->InsertValue("ui", uiArray); @@ -211,19 +206,19 @@ void ControlBehaviors::SendBehaviorBlocksToClient(ModelComponent* modelComponent // AMFArrayValue* thisAction = new AMFArrayValue(); // AMFStringValue* actionName = new AMFStringValue(); - // actionName->SetStringValue(behaviorAction->actionName); + // actionName->SetValue(behaviorAction->actionName); // thisAction->InsertValue("Type", actionName); // if (behaviorAction->parameterValueString != "") // { // AMFStringValue* valueAsString = new AMFStringValue(); - // valueAsString->SetStringValue(behaviorAction->parameterValueString); + // valueAsString->SetValue(behaviorAction->parameterValueString); // thisAction->InsertValue(behaviorAction->parameterName, valueAsString); // } // else if (behaviorAction->parameterValueDouble != 0.0) // { // AMFDoubleValue* valueAsDouble = new AMFDoubleValue(); - // valueAsDouble->SetDoubleValue(behaviorAction->parameterValueDouble); + // valueAsDouble->SetValue(behaviorAction->parameterValueDouble); // thisAction->InsertValue(behaviorAction->parameterName, valueAsDouble); // } // stripSerialize->PushBackValue(thisAction); @@ -237,11 +232,11 @@ void ControlBehaviors::SendBehaviorBlocksToClient(ModelComponent* modelComponent // behaviorInfo.InsertValue("states", stateSerialize); // AMFStringValue* objectidAsString = new AMFStringValue(); - // objectidAsString->SetStringValue(std::to_string(targetObjectID)); + // objectidAsString->SetValue(std::to_string(targetObjectID)); // behaviorInfo.InsertValue("objectID", objectidAsString); // AMFStringValue* behaviorIDAsString = new AMFStringValue(); - // behaviorIDAsString->SetStringValue(std::to_string(behaviorID)); + // behaviorIDAsString->SetValue(std::to_string(behaviorID)); // behaviorInfo.InsertValue("BehaviorID", behaviorIDAsString); // GameMessages::SendUIMessageServerToSingleClient(modelOwner, sysAddr, "UpdateBehaviorBlocks", &behaviorInfo); @@ -275,10 +270,9 @@ void ControlBehaviors::MoveToInventory(ModelComponent* modelComponent, const Sys // This closes the UI menu should it be open while the player is removing behaviors AMFArrayValue args; - AMFFalseValue* stateToPop = new AMFFalseValue(); - args.InsertValue("visible", stateToPop); + args.Insert("visible", false); - GameMessages::SendUIMessageServerToSingleClient(modelOwner, modelOwner->GetParentUser()->GetSystemAddress(), "ToggleBehaviorEditor", &args); + GameMessages::SendUIMessageServerToSingleClient(modelOwner, modelOwner->GetParentUser()->GetSystemAddress(), "ToggleBehaviorEditor", args); MoveToInventoryMessage moveToInventoryMessage(arguments); diff --git a/dGame/dUtilities/SlashCommandHandler.cpp b/dGame/dUtilities/SlashCommandHandler.cpp index 16db62a6..e8915d27 100644 --- a/dGame/dUtilities/SlashCommandHandler.cpp +++ b/dGame/dUtilities/SlashCommandHandler.cpp @@ -69,7 +69,7 @@ #include "BinaryPathFinder.h" #include "dConfig.h" #include "eBubbleType.h" -#include "AMFFormat.h" +#include "Amf3.h" #include "MovingPlatformComponent.h" #include "eMissionState.h" #include "TriggerComponent.h" @@ -251,26 +251,20 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit { AMFArrayValue args; - auto* state = new AMFStringValue(); - state->SetStringValue("Story"); + args.Insert("state", "Story"); - args.InsertValue("state", state); - - GameMessages::SendUIMessageServerToSingleClient(entity, entity->GetSystemAddress(), "pushGameState", &args); + GameMessages::SendUIMessageServerToSingleClient(entity, entity->GetSystemAddress(), "pushGameState", args); } entity->AddCallbackTimer(0.5f, [customText, entity]() { AMFArrayValue args; - auto* text = new AMFStringValue(); - text->SetStringValue(customText); - - args.InsertValue("visible", new AMFTrueValue()); - args.InsertValue("text", text); + args.Insert("visible", true); + args.Insert("text", customText); Game::logger->Log("SlashCommandHandler", "Sending %s", customText.c_str()); - GameMessages::SendUIMessageServerToSingleClient(entity, entity->GetSystemAddress(), "ToggleStoryBox", &args); + GameMessages::SendUIMessageServerToSingleClient(entity, entity->GetSystemAddress(), "ToggleStoryBox", args); }); return; @@ -530,12 +524,11 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit } if (chatCommand == "setuistate" && args.size() == 1 && entity->GetGMLevel() >= eGameMasterLevel::DEVELOPER) { - AMFStringValue* value = new AMFStringValue(); - value->SetStringValue(args[0]); + AMFArrayValue uiState; - AMFArrayValue args; - args.InsertValue("state", value); - GameMessages::SendUIMessageServerToSingleClient(entity, sysAddr, "pushGameState", &args); + uiState.Insert("state", args.at(0)); + + GameMessages::SendUIMessageServerToSingleClient(entity, sysAddr, "pushGameState", uiState); ChatPackets::SendSystemMessage(sysAddr, u"Switched UI state."); @@ -543,11 +536,11 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit } if (chatCommand == "toggle" && args.size() == 1 && entity->GetGMLevel() >= eGameMasterLevel::DEVELOPER) { - AMFTrueValue* value = new AMFTrueValue(); - AMFArrayValue amfArgs; - amfArgs.InsertValue("visible", value); - GameMessages::SendUIMessageServerToSingleClient(entity, sysAddr, args[0], &amfArgs); + + amfArgs.Insert("visible", true); + + GameMessages::SendUIMessageServerToSingleClient(entity, sysAddr, args[0], amfArgs); ChatPackets::SendSystemMessage(sysAddr, u"Toggled UI state."); @@ -1617,7 +1610,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit if ((chatCommand == "debugui") && entity->GetGMLevel() >= eGameMasterLevel::DEVELOPER) { ChatPackets::SendSystemMessage(sysAddr, u"Opening UIDebugger..."); AMFArrayValue args; - GameMessages::SendUIMessageServerToSingleClient(entity, sysAddr, "ToggleUIDebugger;", nullptr); + GameMessages::SendUIMessageServerToSingleClient(entity, sysAddr, "ToggleUIDebugger;", args); } if ((chatCommand == "boost") && entity->GetGMLevel() >= eGameMasterLevel::DEVELOPER) { @@ -2023,15 +2016,11 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit void SlashCommandHandler::SendAnnouncement(const std::string& title, const std::string& message) { AMFArrayValue args; - auto* titleValue = new AMFStringValue(); - titleValue->SetStringValue(title); - auto* messageValue = new AMFStringValue(); - messageValue->SetStringValue(message); - args.InsertValue("title", titleValue); - args.InsertValue("message", messageValue); + args.Insert("title", title); + args.Insert("message", message); - GameMessages::SendUIMessageServerToAllClients("ToggleAnnounce", &args); + GameMessages::SendUIMessageServerToAllClients("ToggleAnnounce", args); //Notify chat about it CBITSTREAM; diff --git a/dMasterServer/MasterServer.cpp b/dMasterServer/MasterServer.cpp index bc0937c2..7af235a4 100644 --- a/dMasterServer/MasterServer.cpp +++ b/dMasterServer/MasterServer.cpp @@ -335,7 +335,6 @@ int main(int argc, char** argv) { Game::im->GetInstance(0, false, 0); Game::im->GetInstance(1000, false, 0); - StartAuthServer(); } diff --git a/dScripts/02_server/Map/AM/AmConsoleTeleportServer.cpp b/dScripts/02_server/Map/AM/AmConsoleTeleportServer.cpp index f3931e0d..0627b27a 100644 --- a/dScripts/02_server/Map/AM/AmConsoleTeleportServer.cpp +++ b/dScripts/02_server/Map/AM/AmConsoleTeleportServer.cpp @@ -1,6 +1,6 @@ #include "AmConsoleTeleportServer.h" #include "ChooseYourDestinationNsToNt.h" -#include "AMFFormat.h" +#include "Amf3.h" void AmConsoleTeleportServer::OnStartup(Entity* self) { self->SetVar(u"teleportAnim", m_TeleportAnim); diff --git a/dScripts/02_server/Map/General/BankInteractServer.cpp b/dScripts/02_server/Map/General/BankInteractServer.cpp index b96187cf..9b563491 100644 --- a/dScripts/02_server/Map/General/BankInteractServer.cpp +++ b/dScripts/02_server/Map/General/BankInteractServer.cpp @@ -1,24 +1,24 @@ #include "BankInteractServer.h" #include "GameMessages.h" #include "Entity.h" -#include "AMFFormat.h" +#include "Amf3.h" void BankInteractServer::OnUse(Entity* self, Entity* user) { AMFArrayValue args; - AMFStringValue* bank = new AMFStringValue(); - bank->SetStringValue("bank"); - args.InsertValue("state", bank); - GameMessages::SendUIMessageServerToSingleClient(user, user->GetSystemAddress(), "pushGameState", &args); + args.Insert("state", "bank"); + + GameMessages::SendUIMessageServerToSingleClient(user, user->GetSystemAddress(), "pushGameState", args); } void BankInteractServer::OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, int32_t param2, int32_t param3) { if (args == "ToggleBank") { AMFArrayValue args; - args.InsertValue("visible", new AMFFalseValue()); - GameMessages::SendUIMessageServerToSingleClient(sender, sender->GetSystemAddress(), "ToggleBank", &args); + args.Insert("visible", false); + + GameMessages::SendUIMessageServerToSingleClient(sender, sender->GetSystemAddress(), "ToggleBank", args); GameMessages::SendNotifyClientObject(self->GetObjectID(), u"CloseBank", 0, 0, LWOOBJID_EMPTY, "", sender->GetSystemAddress()); } diff --git a/dScripts/02_server/Map/General/MailBoxServer.cpp b/dScripts/02_server/Map/General/MailBoxServer.cpp index c2534f3e..53f3b3a2 100644 --- a/dScripts/02_server/Map/General/MailBoxServer.cpp +++ b/dScripts/02_server/Map/General/MailBoxServer.cpp @@ -1,19 +1,20 @@ #include "MailBoxServer.h" -#include "AMFFormat.h" +#include "Amf3.h" #include "GameMessages.h" +#include "Entity.h" void MailBoxServer::OnUse(Entity* self, Entity* user) { - AMFStringValue* value = new AMFStringValue(); - value->SetStringValue("Mail"); AMFArrayValue args; - args.InsertValue("state", value); - GameMessages::SendUIMessageServerToSingleClient(user, user->GetSystemAddress(), "pushGameState", &args); + + args.Insert("state", "Mail"); + + GameMessages::SendUIMessageServerToSingleClient(user, user->GetSystemAddress(), "pushGameState", args); } void MailBoxServer::OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, int32_t param2, int32_t param3) { if (args == "toggleMail") { AMFArrayValue args; - args.InsertValue("visible", new AMFFalseValue()); - GameMessages::SendUIMessageServerToSingleClient(sender, sender->GetSystemAddress(), "ToggleMail", &args); + args.Insert("visible", false); + GameMessages::SendUIMessageServerToSingleClient(sender, sender->GetSystemAddress(), "ToggleMail", args); } } diff --git a/dScripts/02_server/Map/General/StoryBoxInteractServer.cpp b/dScripts/02_server/Map/General/StoryBoxInteractServer.cpp index 2683ddd4..9a1a4908 100644 --- a/dScripts/02_server/Map/General/StoryBoxInteractServer.cpp +++ b/dScripts/02_server/Map/General/StoryBoxInteractServer.cpp @@ -2,7 +2,8 @@ #include "Character.h" #include "GameMessages.h" #include "dServer.h" -#include "AMFFormat.h" +#include "Amf3.h" +#include "Entity.h" void StoryBoxInteractServer::OnUse(Entity* self, Entity* user) { if (self->GetVar(u"hasCustomText")) { @@ -11,24 +12,18 @@ void StoryBoxInteractServer::OnUse(Entity* self, Entity* user) { { AMFArrayValue args; - auto* state = new AMFStringValue(); - state->SetStringValue("Story"); + args.Insert("state", "Story"); - args.InsertValue("state", state); - - GameMessages::SendUIMessageServerToSingleClient(user, user->GetSystemAddress(), "pushGameState", &args); + GameMessages::SendUIMessageServerToSingleClient(user, user->GetSystemAddress(), "pushGameState", args); } user->AddCallbackTimer(0.1f, [user, customText]() { AMFArrayValue args; - auto* text = new AMFStringValue(); - text->SetStringValue(customText); + args.Insert("visible", true); + args.Insert("text", customText); - args.InsertValue("visible", new AMFTrueValue()); - args.InsertValue("text", text); - - GameMessages::SendUIMessageServerToSingleClient(user, user->GetSystemAddress(), "ToggleStoryBox", &args); + GameMessages::SendUIMessageServerToSingleClient(user, user->GetSystemAddress(), "ToggleStoryBox", args); }); return; diff --git a/dScripts/02_server/Map/NS/NsLegoClubDoor.cpp b/dScripts/02_server/Map/NS/NsLegoClubDoor.cpp index 56a213b8..d7ee5fed 100644 --- a/dScripts/02_server/Map/NS/NsLegoClubDoor.cpp +++ b/dScripts/02_server/Map/NS/NsLegoClubDoor.cpp @@ -1,7 +1,7 @@ #include "NsLegoClubDoor.h" #include "dZoneManager.h" #include "GameMessages.h" -#include "AMFFormat.h" +#include "Amf3.h" void NsLegoClubDoor::OnStartup(Entity* self) { self->SetVar(u"currentZone", (int32_t)dZoneManager::Instance()->GetZoneID().GetMapID()); @@ -12,116 +12,56 @@ void NsLegoClubDoor::OnStartup(Entity* self) { args = {}; - AMFStringValue* callbackClient = new AMFStringValue(); - callbackClient->SetStringValue(std::to_string(self->GetObjectID())); - args.InsertValue("callbackClient", callbackClient); + args.Insert("callbackClient", std::to_string(self->GetObjectID())); + args.Insert("strIdentifier", "choiceDoor"); + args.Insert("title", "%[UI_CHOICE_DESTINATION]"); - AMFStringValue* strIdentifier = new AMFStringValue(); - strIdentifier->SetStringValue("choiceDoor"); - args.InsertValue("strIdentifier", strIdentifier); - - AMFStringValue* title = new AMFStringValue(); - title->SetStringValue("%[UI_CHOICE_DESTINATION]"); - args.InsertValue("title", title); - - AMFArrayValue* choiceOptions = new AMFArrayValue(); + AMFArrayValue* choiceOptions = args.InsertArray("options"); { - AMFArrayValue* nsArgs = new AMFArrayValue(); + AMFArrayValue* nsArgs = choiceOptions->PushArray(); - AMFStringValue* image = new AMFStringValue(); - image->SetStringValue("textures/ui/zone_thumnails/Nimbus_Station.dds"); - nsArgs->InsertValue("image", image); - - AMFStringValue* caption = new AMFStringValue(); - caption->SetStringValue("%[UI_CHOICE_NS]"); - nsArgs->InsertValue("caption", caption); - - AMFStringValue* identifier = new AMFStringValue(); - identifier->SetStringValue("zoneID_1200"); - nsArgs->InsertValue("identifier", identifier); - - AMFStringValue* tooltipText = new AMFStringValue(); - tooltipText->SetStringValue("%[UI_CHOICE_NS_HOVER]"); - nsArgs->InsertValue("tooltipText", tooltipText); - - choiceOptions->PushBackValue(nsArgs); + nsArgs->Insert("image", "textures/ui/zone_thumnails/Nimbus_Station.dds"); + nsArgs->Insert("caption", "%[UI_CHOICE_NS]"); + nsArgs->Insert("identifier", "zoneID_1200"); + nsArgs->Insert("tooltipText", "%[UI_CHOICE_NS_HOVER]"); } { - AMFArrayValue* ntArgs = new AMFArrayValue(); + AMFArrayValue* ntArgs = choiceOptions->PushArray(); - AMFStringValue* image = new AMFStringValue(); - image->SetStringValue("textures/ui/zone_thumnails/Nexus_Tower.dds"); - ntArgs->InsertValue("image", image); - - AMFStringValue* caption = new AMFStringValue(); - caption->SetStringValue("%[UI_CHOICE_NT]"); - ntArgs->InsertValue("caption", caption); - - AMFStringValue* identifier = new AMFStringValue(); - identifier->SetStringValue("zoneID_1900"); - ntArgs->InsertValue("identifier", identifier); - - AMFStringValue* tooltipText = new AMFStringValue(); - tooltipText->SetStringValue("%[UI_CHOICE_NT_HOVER]"); - ntArgs->InsertValue("tooltipText", tooltipText); - - choiceOptions->PushBackValue(ntArgs); + ntArgs->Insert("image", "textures/ui/zone_thumnails/Nexus_Tower.dds"); + ntArgs->Insert("caption", "%[UI_CHOICE_NT]"); + ntArgs->Insert("identifier", "zoneID_1900"); + ntArgs->Insert("tooltipText", "%[UI_CHOICE_NT_HOVER]"); } options = choiceOptions; - - args.InsertValue("options", choiceOptions); } void NsLegoClubDoor::OnUse(Entity* self, Entity* user) { auto* player = user; if (CheckChoice(self, player)) { - AMFArrayValue* multiArgs = new AMFArrayValue(); + AMFArrayValue multiArgs; - AMFStringValue* callbackClient = new AMFStringValue(); - callbackClient->SetStringValue(std::to_string(self->GetObjectID())); - multiArgs->InsertValue("callbackClient", callbackClient); - - AMFStringValue* strIdentifier = new AMFStringValue(); - strIdentifier->SetStringValue("choiceDoor"); - multiArgs->InsertValue("strIdentifier", strIdentifier); - - AMFStringValue* title = new AMFStringValue(); - title->SetStringValue("%[UI_CHOICE_DESTINATION]"); - multiArgs->InsertValue("title", title); - - multiArgs->InsertValue("options", options); + multiArgs.Insert("callbackClient", std::to_string(self->GetObjectID())); + multiArgs.Insert("strIdentifier", "choiceDoor"); + multiArgs.Insert("title", "%[UI_CHOICE_DESTINATION]"); + multiArgs.Insert("options", static_cast(options)); GameMessages::SendUIMessageServerToSingleClient(player, player->GetSystemAddress(), "QueueChoiceBox", multiArgs); + + multiArgs.Remove("options", false); // We do not want the local amf to delete the options! } else if (self->GetVar(u"currentZone") != m_ChoiceZoneID) { - AMFArrayValue* multiArgs = new AMFArrayValue(); + AMFArrayValue multiArgs; + multiArgs.Insert("state", "Lobby"); - AMFStringValue* state = new AMFStringValue(); - state->SetStringValue("Lobby"); - multiArgs->InsertValue("state", state); - - AMFArrayValue* context = new AMFArrayValue(); - - AMFStringValue* user = new AMFStringValue(); - user->SetStringValue(std::to_string(player->GetObjectID())); - context->InsertValue("user", user); - - AMFStringValue* callbackObj = new AMFStringValue(); - callbackObj->SetStringValue(std::to_string(self->GetObjectID())); - context->InsertValue("callbackObj", callbackObj); - - AMFStringValue* helpVisible = new AMFStringValue(); - helpVisible->SetStringValue("show"); - context->InsertValue("HelpVisible", helpVisible); - - AMFStringValue* type = new AMFStringValue(); - type->SetStringValue("Lego_Club_Valid"); - context->InsertValue("type", type); - - multiArgs->InsertValue("context", context); + AMFArrayValue* context = multiArgs.InsertArray("context"); + context->Insert("user", std::to_string(player->GetObjectID())); + context->Insert("callbackObj", std::to_string(self->GetObjectID())); + context->Insert("HelpVisible", "show"); + context->Insert("type", "Lego_Club_Valid"); GameMessages::SendUIMessageServerToSingleClient(player, player->GetSystemAddress(), "pushGameState", multiArgs); } else { diff --git a/dScripts/02_server/Map/NS/NsLegoClubDoor.h b/dScripts/02_server/Map/NS/NsLegoClubDoor.h index db1dcae4..5b25ba6d 100644 --- a/dScripts/02_server/Map/NS/NsLegoClubDoor.h +++ b/dScripts/02_server/Map/NS/NsLegoClubDoor.h @@ -2,7 +2,7 @@ #include "CppScripts.h" #include "ChooseYourDestinationNsToNt.h" #include "BaseConsoleTeleportServer.h" -#include "AMFFormat.h" +#include "Amf3.h" class NsLegoClubDoor : public CppScripts::Script, ChooseYourDestinationNsToNt, BaseConsoleTeleportServer { diff --git a/dScripts/02_server/Map/NS/NsLupTeleport.cpp b/dScripts/02_server/Map/NS/NsLupTeleport.cpp index 9cd4359b..74f8ace1 100644 --- a/dScripts/02_server/Map/NS/NsLupTeleport.cpp +++ b/dScripts/02_server/Map/NS/NsLupTeleport.cpp @@ -1,7 +1,7 @@ #include "NsLupTeleport.h" #include "dZoneManager.h" #include "GameMessages.h" -#include "AMFFormat.h" +#include "Amf3.h" void NsLupTeleport::OnStartup(Entity* self) { self->SetVar(u"currentZone", (int32_t)dZoneManager::Instance()->GetZoneID().GetMapID()); @@ -12,72 +12,36 @@ void NsLupTeleport::OnStartup(Entity* self) { args = {}; - AMFStringValue* callbackClient = new AMFStringValue(); - callbackClient->SetStringValue(std::to_string(self->GetObjectID())); - args.InsertValue("callbackClient", callbackClient); + args.Insert("callbackClient", std::to_string(self->GetObjectID())); + args.Insert("strIdentifier", "choiceDoor"); + args.Insert("title", "%[UI_CHOICE_DESTINATION]"); - AMFStringValue* strIdentifier = new AMFStringValue(); - strIdentifier->SetStringValue("choiceDoor"); - args.InsertValue("strIdentifier", strIdentifier); - - AMFStringValue* title = new AMFStringValue(); - title->SetStringValue("%[UI_CHOICE_DESTINATION]"); - args.InsertValue("title", title); - - AMFArrayValue* choiceOptions = new AMFArrayValue(); + AMFArrayValue* choiceOptions = args.InsertArray("options"); { - AMFArrayValue* nsArgs = new AMFArrayValue(); + AMFArrayValue* nsArgs = choiceOptions->PushArray(); - AMFStringValue* image = new AMFStringValue(); - image->SetStringValue("textures/ui/zone_thumnails/Nimbus_Station.dds"); - nsArgs->InsertValue("image", image); - - AMFStringValue* caption = new AMFStringValue(); - caption->SetStringValue("%[UI_CHOICE_NS]"); - nsArgs->InsertValue("caption", caption); - - AMFStringValue* identifier = new AMFStringValue(); - identifier->SetStringValue("zoneID_1200"); - nsArgs->InsertValue("identifier", identifier); - - AMFStringValue* tooltipText = new AMFStringValue(); - tooltipText->SetStringValue("%[UI_CHOICE_NS_HOVER]"); - nsArgs->InsertValue("tooltipText", tooltipText); - - choiceOptions->PushBackValue(nsArgs); + nsArgs->Insert("image", "textures/ui/zone_thumnails/Nimbus_Station.dds"); + nsArgs->Insert("caption", "%[UI_CHOICE_NS]"); + nsArgs->Insert("identifier", "zoneID_1200"); + nsArgs->Insert("tooltipText", "%[UI_CHOICE_NS_HOVER]"); } { - AMFArrayValue* ntArgs = new AMFArrayValue(); + AMFArrayValue* ntArgs = choiceOptions->PushArray(); - AMFStringValue* image = new AMFStringValue(); - image->SetStringValue("textures/ui/zone_thumnails/Nexus_Tower.dds"); - ntArgs->InsertValue("image", image); - - AMFStringValue* caption = new AMFStringValue(); - caption->SetStringValue("%[UI_CHOICE_NT]"); - ntArgs->InsertValue("caption", caption); - - AMFStringValue* identifier = new AMFStringValue(); - identifier->SetStringValue("zoneID_1900"); - ntArgs->InsertValue("identifier", identifier); - - AMFStringValue* tooltipText = new AMFStringValue(); - tooltipText->SetStringValue("%[UI_CHOICE_NT_HOVER]"); - ntArgs->InsertValue("tooltipText", tooltipText); - - choiceOptions->PushBackValue(ntArgs); + ntArgs->Insert("image", "textures/ui/zone_thumnails/Nexus_Tower.dds"); + ntArgs->Insert("caption", "%[UI_CHOICE_NT]"); + ntArgs->Insert("identifier", "zoneID_1900"); + ntArgs->Insert("tooltipText", "%[UI_CHOICE_NT_HOVER]"); } - - args.InsertValue("options", choiceOptions); } void NsLupTeleport::OnUse(Entity* self, Entity* user) { auto* player = user; if (CheckChoice(self, player)) { - GameMessages::SendUIMessageServerToSingleClient(player, player->GetSystemAddress(), "QueueChoiceBox", &args); + GameMessages::SendUIMessageServerToSingleClient(player, player->GetSystemAddress(), "QueueChoiceBox", args); } else { BaseOnUse(self, player); } diff --git a/dScripts/02_server/Map/NS/NsLupTeleport.h b/dScripts/02_server/Map/NS/NsLupTeleport.h index 28bab016..385e92c7 100644 --- a/dScripts/02_server/Map/NS/NsLupTeleport.h +++ b/dScripts/02_server/Map/NS/NsLupTeleport.h @@ -2,7 +2,7 @@ #include "CppScripts.h" #include "ChooseYourDestinationNsToNt.h" #include "BaseConsoleTeleportServer.h" -#include "AMFFormat.h" +#include "Amf3.h" class NsLupTeleport : public CppScripts::Script, ChooseYourDestinationNsToNt, BaseConsoleTeleportServer { diff --git a/dScripts/02_server/Map/NT/NtConsoleTeleportServer.cpp b/dScripts/02_server/Map/NT/NtConsoleTeleportServer.cpp index 324a2fc0..8ba697ce 100644 --- a/dScripts/02_server/Map/NT/NtConsoleTeleportServer.cpp +++ b/dScripts/02_server/Map/NT/NtConsoleTeleportServer.cpp @@ -1,6 +1,6 @@ #include "NtConsoleTeleportServer.h" #include "Entity.h" -#include "AMFFormat.h" +#include "Amf3.h" void NtConsoleTeleportServer::OnStartup(Entity* self) { self->SetVar(u"teleportAnim", m_TeleportAnim); diff --git a/dScripts/02_server/Map/Property/PropertyBankInteract.cpp b/dScripts/02_server/Map/Property/PropertyBankInteract.cpp index 9e727f39..282dce6c 100644 --- a/dScripts/02_server/Map/Property/PropertyBankInteract.cpp +++ b/dScripts/02_server/Map/Property/PropertyBankInteract.cpp @@ -1,7 +1,8 @@ #include "PropertyBankInteract.h" #include "EntityManager.h" #include "GameMessages.h" -#include "AMFFormat.h" +#include "Amf3.h" +#include "Entity.h" void PropertyBankInteract::OnStartup(Entity* self) { auto* zoneControl = EntityManager::Instance()->GetZoneControlEntity(); @@ -20,11 +21,10 @@ void PropertyBankInteract::OnPlayerLoaded(Entity* self, Entity* player) { void PropertyBankInteract::OnUse(Entity* self, Entity* user) { AMFArrayValue args; - auto* value = new AMFStringValue(); - value->SetStringValue("bank"); - args.InsertValue("state", value); - GameMessages::SendUIMessageServerToSingleClient(user, user->GetSystemAddress(), "pushGameState", &args); + args.Insert("state", "bank"); + + GameMessages::SendUIMessageServerToSingleClient(user, user->GetSystemAddress(), "pushGameState", args); GameMessages::SendNotifyClientObject(self->GetObjectID(), u"OpenBank", 0, 0, LWOOBJID_EMPTY, "", user->GetSystemAddress()); @@ -34,9 +34,10 @@ void PropertyBankInteract::OnFireEventServerSide(Entity* self, Entity* sender, s int32_t param2, int32_t param3) { if (args == "ToggleBank") { AMFArrayValue amfArgs; - amfArgs.InsertValue("visible", new AMFFalseValue()); - GameMessages::SendUIMessageServerToSingleClient(sender, sender->GetSystemAddress(), "ToggleBank", &amfArgs); + amfArgs.Insert("visible", false); + + GameMessages::SendUIMessageServerToSingleClient(sender, sender->GetSystemAddress(), "ToggleBank", amfArgs); GameMessages::SendNotifyClientObject(self->GetObjectID(), u"CloseBank", 0, 0, LWOOBJID_EMPTY, "", sender->GetSystemAddress()); diff --git a/dWorldServer/WorldServer.cpp b/dWorldServer/WorldServer.cpp index 5dabce1c..18625960 100644 --- a/dWorldServer/WorldServer.cpp +++ b/dWorldServer/WorldServer.cpp @@ -60,7 +60,7 @@ #include "AssetManager.h" #include "LevelProgressionComponent.h" #include "eBlueprintSaveResponseType.h" -#include "AMFFormat.h" +#include "Amf3.h" #include "NiPoint3.h" #include "eServerDisconnectIdentifiers.h" #include "eObjectBits.h" @@ -598,15 +598,11 @@ void HandlePacketChat(Packet* packet) { //Send to our clients: AMFArrayValue args; - auto* titleValue = new AMFStringValue(); - titleValue->SetStringValue(title.c_str()); - auto* messageValue = new AMFStringValue(); - messageValue->SetStringValue(msg.c_str()); - args.InsertValue("title", titleValue); - args.InsertValue("message", messageValue); + args.Insert("title", title); + args.Insert("message", msg); - GameMessages::SendUIMessageServerToAllClients("ToggleAnnounce", &args); + GameMessages::SendUIMessageServerToAllClients("ToggleAnnounce", args); break; } diff --git a/tests/dCommonTests/AMFDeserializeTests.cpp b/tests/dCommonTests/AMFDeserializeTests.cpp index b679ea78..5a9d91e6 100644 --- a/tests/dCommonTests/AMFDeserializeTests.cpp +++ b/tests/dCommonTests/AMFDeserializeTests.cpp @@ -3,14 +3,17 @@ #include #include "AMFDeserialize.h" -#include "AMFFormat.h" +#include "Amf3.h" + +#include "Game.h" +#include "dLogger.h" /** * Helper method that all tests use to get their respective AMF. */ -std::unique_ptr ReadFromBitStream(RakNet::BitStream* bitStream) { +AMFBaseValue* ReadFromBitStream(RakNet::BitStream* bitStream) { AMFDeserialize deserializer; - std::unique_ptr returnValue(deserializer.Read(bitStream)); + AMFBaseValue* returnValue(deserializer.Read(bitStream)); return returnValue; } @@ -18,10 +21,10 @@ std::unique_ptr ReadFromBitStream(RakNet::BitStream* bitStream) { * @brief Test reading an AMFUndefined value from a BitStream. */ TEST(dCommonTests, AMFDeserializeAMFUndefinedTest) { - CBITSTREAM + CBITSTREAM; bitStream.Write(0x00); - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFUndefined); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::Undefined); } /** @@ -29,54 +32,54 @@ TEST(dCommonTests, AMFDeserializeAMFUndefinedTest) { * */ TEST(dCommonTests, AMFDeserializeAMFNullTest) { - CBITSTREAM + CBITSTREAM; bitStream.Write(0x01); - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFNull); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::Null); } /** * @brief Test reading an AMFFalse value from a BitStream. */ TEST(dCommonTests, AMFDeserializeAMFFalseTest) { - CBITSTREAM + CBITSTREAM; bitStream.Write(0x02); - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFFalse); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::False); } /** * @brief Test reading an AMFTrue value from a BitStream. */ TEST(dCommonTests, AMFDeserializeAMFTrueTest) { - CBITSTREAM + CBITSTREAM; bitStream.Write(0x03); - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFTrue); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::True); } /** * @brief Test reading an AMFInteger value from a BitStream. */ TEST(dCommonTests, AMFDeserializeAMFIntegerTest) { - CBITSTREAM + CBITSTREAM; { bitStream.Write(0x04); // 127 == 01111111 bitStream.Write(127); - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFInteger); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::Integer); // Check that the max value of a byte can be read correctly - ASSERT_EQ(static_cast(res.get())->GetIntegerValue(), 127); + ASSERT_EQ(static_cast(res.get())->GetValue(), 127); } bitStream.Reset(); { bitStream.Write(0x04); bitStream.Write(UINT32_MAX); - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFInteger); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::Integer); // Check that we can read the maximum value correctly - ASSERT_EQ(static_cast(res.get())->GetIntegerValue(), 536870911); + ASSERT_EQ(static_cast(res.get())->GetValue(), 536870911); } bitStream.Reset(); { @@ -87,10 +90,10 @@ TEST(dCommonTests, AMFDeserializeAMFIntegerTest) { bitStream.Write(255); // 127 == 01111111 bitStream.Write(127); - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFInteger); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::Integer); // Check that short max can be read correctly - ASSERT_EQ(static_cast(res.get())->GetIntegerValue(), UINT16_MAX); + ASSERT_EQ(static_cast(res.get())->GetValue(), UINT16_MAX); } bitStream.Reset(); { @@ -99,10 +102,10 @@ TEST(dCommonTests, AMFDeserializeAMFIntegerTest) { bitStream.Write(255); // 127 == 01111111 bitStream.Write(127); - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFInteger); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::Integer); // Check that 2 byte max can be read correctly - ASSERT_EQ(static_cast(res.get())->GetIntegerValue(), 16383); + ASSERT_EQ(static_cast(res.get())->GetValue(), 16383); } } @@ -110,42 +113,42 @@ TEST(dCommonTests, AMFDeserializeAMFIntegerTest) { * @brief Test reading an AMFDouble value from a BitStream. */ TEST(dCommonTests, AMFDeserializeAMFDoubleTest) { - CBITSTREAM + CBITSTREAM; bitStream.Write(0x05); bitStream.Write(25346.4f); - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFDouble); - ASSERT_EQ(static_cast(res.get())->GetDoubleValue(), 25346.4f); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::Double); + ASSERT_EQ(static_cast(res.get())->GetValue(), 25346.4f); } /** * @brief Test reading an AMFString value from a BitStream. */ TEST(dCommonTests, AMFDeserializeAMFStringTest) { - CBITSTREAM + CBITSTREAM; bitStream.Write(0x06); bitStream.Write(0x0F); std::string toWrite = "stateID"; for (auto e : toWrite) bitStream.Write(e); - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFString); - ASSERT_EQ(static_cast(res.get())->GetStringValue(), "stateID"); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::String); + ASSERT_EQ(static_cast(res.get())->GetValue(), "stateID"); } /** * @brief Test reading an AMFArray value from a BitStream. */ TEST(dCommonTests, AMFDeserializeAMFArrayTest) { - CBITSTREAM + CBITSTREAM; // Test empty AMFArray bitStream.Write(0x09); bitStream.Write(0x01); bitStream.Write(0x01); { - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFArray); - ASSERT_EQ(static_cast(res.get())->GetAssociativeMap().size(), 0); - ASSERT_EQ(static_cast(res.get())->GetDenseArray().size(), 0); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::Array); + ASSERT_EQ(static_cast(res.get())->GetAssociative().size(), 0); + ASSERT_EQ(static_cast(res.get())->GetDense().size(), 0); } bitStream.Reset(); // Test a key'd value and dense value @@ -161,32 +164,32 @@ TEST(dCommonTests, AMFDeserializeAMFArrayTest) { bitStream.Write(0x0B); for (auto e : "10447") if (e != '\0') bitStream.Write(e); { - std::unique_ptr res(ReadFromBitStream(&bitStream)); - ASSERT_EQ(res->GetValueType(), AMFValueType::AMFArray); - ASSERT_EQ(static_cast(res.get())->GetAssociativeMap().size(), 1); - ASSERT_EQ(static_cast(res.get())->GetDenseArray().size(), 1); - ASSERT_EQ(static_cast(res.get())->FindValue("BehaviorID")->GetStringValue(), "10447"); - ASSERT_EQ(static_cast(res.get())->GetValueAt(0)->GetStringValue(), "10447"); + std::unique_ptr res(ReadFromBitStream(&bitStream)); + ASSERT_EQ(res->GetValueType(), eAmf::Array); + ASSERT_EQ(static_cast(res.get())->GetAssociative().size(), 1); + ASSERT_EQ(static_cast(res.get())->GetDense().size(), 1); + ASSERT_EQ(static_cast(res.get())->Get("BehaviorID")->GetValue(), "10447"); + ASSERT_EQ(static_cast(res.get())->Get(0)->GetValue(), "10447"); } } /** - * @brief This test checks that if we recieve an unimplemented AMFValueType + * @brief This test checks that if we recieve an unimplemented eAmf * we correctly throw an error and can actch it. * Yes this leaks memory. */ TEST(dCommonTests, AMFDeserializeUnimplementedValuesTest) { - std::vector unimplementedValues = { - AMFValueType::AMFXMLDoc, - AMFValueType::AMFDate, - AMFValueType::AMFObject, - AMFValueType::AMFXML, - AMFValueType::AMFByteArray, - AMFValueType::AMFVectorInt, - AMFValueType::AMFVectorUInt, - AMFValueType::AMFVectorDouble, - AMFValueType::AMFVectorObject, - AMFValueType::AMFDictionary + std::vector unimplementedValues = { + eAmf::XMLDoc, + eAmf::Date, + eAmf::Object, + eAmf::XML, + eAmf::ByteArray, + eAmf::VectorInt, + eAmf::VectorUInt, + eAmf::VectorDouble, + eAmf::VectorObject, + eAmf::Dictionary }; // Run unimplemented tests to check that errors are thrown if // unimplemented AMF values are attempted to be parsed. @@ -202,16 +205,16 @@ TEST(dCommonTests, AMFDeserializeUnimplementedValuesTest) { fileStream.close(); - for (auto amfValueType : unimplementedValues) { + for (auto value : unimplementedValues) { RakNet::BitStream testBitStream; for (auto element : baseBitStream) { testBitStream.Write(element); } - testBitStream.Write(amfValueType); + testBitStream.Write(value); bool caughtException = false; try { ReadFromBitStream(&testBitStream); - } catch (AMFValueType unimplementedValueType) { + } catch (eAmf unimplementedValueType) { caughtException = true; } @@ -235,116 +238,116 @@ TEST(dCommonTests, AMFDeserializeLivePacketTest) { testFileStream.close(); - auto resultFromFn = ReadFromBitStream(&testBitStream); + std::unique_ptr resultFromFn(ReadFromBitStream(&testBitStream)); auto result = static_cast(resultFromFn.get()); // Test the outermost array - ASSERT_EQ(result->FindValue("BehaviorID")->GetStringValue(), "10447"); - ASSERT_EQ(result->FindValue("objectID")->GetStringValue(), "288300744895913279"); + ASSERT_EQ(result->Get("BehaviorID")->GetValue(), "10447"); + ASSERT_EQ(result->Get("objectID")->GetValue(), "288300744895913279"); // Test the execution state array - auto executionState = result->FindValue("executionState"); + auto executionState = result->GetArray("executionState"); ASSERT_NE(executionState, nullptr); - auto strips = executionState->FindValue("strips")->GetDenseArray(); + auto strips = executionState->GetArray("strips")->GetDense(); ASSERT_EQ(strips.size(), 1); auto stripsPosition0 = dynamic_cast(strips[0]); - auto actionIndex = stripsPosition0->FindValue("actionIndex"); + auto actionIndex = stripsPosition0->Get("actionIndex"); - ASSERT_EQ(actionIndex->GetDoubleValue(), 0.0f); + ASSERT_EQ(actionIndex->GetValue(), 0.0f); - auto stripIdExecution = stripsPosition0->FindValue("id"); + auto stripIdExecution = stripsPosition0->Get("id"); - ASSERT_EQ(stripIdExecution->GetDoubleValue(), 0.0f); + ASSERT_EQ(stripIdExecution->GetValue(), 0.0f); - auto stateIDExecution = executionState->FindValue("stateID"); + auto stateIdExecution = executionState->Get("stateID"); - ASSERT_EQ(stateIDExecution->GetDoubleValue(), 0.0f); + ASSERT_EQ(stateIdExecution->GetValue(), 0.0f); - auto states = result->FindValue("states")->GetDenseArray(); + auto states = result->GetArray("states")->GetDense(); ASSERT_EQ(states.size(), 1); auto firstState = dynamic_cast(states[0]); - auto stateID = firstState->FindValue("id"); + auto stateID = firstState->Get("id"); - ASSERT_EQ(stateID->GetDoubleValue(), 0.0f); + ASSERT_EQ(stateID->GetValue(), 0.0f); - auto stripsInState = firstState->FindValue("strips")->GetDenseArray(); + auto stripsInState = firstState->GetArray("strips")->GetDense(); ASSERT_EQ(stripsInState.size(), 1); auto firstStrip = dynamic_cast(stripsInState[0]); - auto actionsInFirstStrip = firstStrip->FindValue("actions")->GetDenseArray(); + auto actionsInFirstStrip = firstStrip->GetArray("actions")->GetDense(); ASSERT_EQ(actionsInFirstStrip.size(), 3); - auto actionID = firstStrip->FindValue("id"); + auto actionID = firstStrip->Get("id"); - ASSERT_EQ(actionID->GetDoubleValue(), 0.0f); + ASSERT_EQ(actionID->GetValue(), 0.0f); - auto uiArray = firstStrip->FindValue("ui"); + auto uiArray = firstStrip->GetArray("ui"); - auto xPos = uiArray->FindValue("x"); - auto yPos = uiArray->FindValue("y"); + auto xPos = uiArray->Get("x"); + auto yPos = uiArray->Get("y"); - ASSERT_EQ(xPos->GetDoubleValue(), 103.0f); - ASSERT_EQ(yPos->GetDoubleValue(), 82.0f); + ASSERT_EQ(xPos->GetValue(), 103.0f); + ASSERT_EQ(yPos->GetValue(), 82.0f); - auto stripId = firstStrip->FindValue("id"); + auto stripId = firstStrip->Get("id"); - ASSERT_EQ(stripId->GetDoubleValue(), 0.0f); + ASSERT_EQ(stripId->GetValue(), 0.0f); auto firstAction = dynamic_cast(actionsInFirstStrip[0]); - auto firstType = firstAction->FindValue("Type"); + auto firstType = firstAction->Get("Type"); - ASSERT_EQ(firstType->GetStringValue(), "OnInteract"); + ASSERT_EQ(firstType->GetValue(), "OnInteract"); - auto firstCallback = firstAction->FindValue("__callbackID__"); + auto firstCallback = firstAction->Get("__callbackID__"); - ASSERT_EQ(firstCallback->GetStringValue(), ""); + ASSERT_EQ(firstCallback->GetValue(), ""); auto secondAction = dynamic_cast(actionsInFirstStrip[1]); - auto secondType = secondAction->FindValue("Type"); + auto secondType = secondAction->Get("Type"); - ASSERT_EQ(secondType->GetStringValue(), "FlyUp"); + ASSERT_EQ(secondType->GetValue(), "FlyUp"); - auto secondCallback = secondAction->FindValue("__callbackID__"); + auto secondCallback = secondAction->Get("__callbackID__"); - ASSERT_EQ(secondCallback->GetStringValue(), ""); + ASSERT_EQ(secondCallback->GetValue(), ""); - auto secondDistance = secondAction->FindValue("Distance"); + auto secondDistance = secondAction->Get("Distance"); - ASSERT_EQ(secondDistance->GetDoubleValue(), 25.0f); + ASSERT_EQ(secondDistance->GetValue(), 25.0f); auto thirdAction = dynamic_cast(actionsInFirstStrip[2]); - auto thirdType = thirdAction->FindValue("Type"); + auto thirdType = thirdAction->Get("Type"); - ASSERT_EQ(thirdType->GetStringValue(), "FlyDown"); + ASSERT_EQ(thirdType->GetValue(), "FlyDown"); - auto thirdCallback = thirdAction->FindValue("__callbackID__"); + auto thirdCallback = thirdAction->Get("__callbackID__"); - ASSERT_EQ(thirdCallback->GetStringValue(), ""); + ASSERT_EQ(thirdCallback->GetValue(), ""); - auto thirdDistance = thirdAction->FindValue("Distance"); + auto thirdDistance = thirdAction->Get("Distance"); - ASSERT_EQ(thirdDistance->GetDoubleValue(), 25.0f); + ASSERT_EQ(thirdDistance->GetValue(), 25.0f); } /** * @brief Tests that having no BitStream returns a nullptr. */ TEST(dCommonTests, AMFDeserializeNullTest) { - auto result = ReadFromBitStream(nullptr); + std::unique_ptr result(ReadFromBitStream(nullptr)); ASSERT_EQ(result.get(), nullptr); } @@ -361,25 +364,25 @@ TEST(dCommonTests, AMFBadConversionTest) { testFileStream.close(); - auto resultFromFn = ReadFromBitStream(&testBitStream); + std::unique_ptr resultFromFn(ReadFromBitStream(&testBitStream)); auto result = static_cast(resultFromFn.get()); // Actually a string value. - ASSERT_EQ(result->FindValue("BehaviorID"), nullptr); + ASSERT_EQ(result->Get("BehaviorID"), nullptr); // Does not exist in the associative portion - ASSERT_EQ(result->FindValue("DOES_NOT_EXIST"), nullptr); + ASSERT_EQ(result->Get("DOES_NOT_EXIST"), nullptr); - result->PushBackValue(new AMFTrueValue()); + result->Push(true); // Exists and is correct type - ASSERT_NE(result->GetValueAt(0), nullptr); + ASSERT_NE(result->Get(0), nullptr); // Value exists but is wrong typing - ASSERT_EQ(result->GetValueAt(0), nullptr); + ASSERT_EQ(result->Get(0), nullptr); // Value is out of bounds - ASSERT_EQ(result->GetValueAt(1), nullptr); + ASSERT_EQ(result->Get(1), nullptr); } /** diff --git a/tests/dCommonTests/Amf3Tests.cpp b/tests/dCommonTests/Amf3Tests.cpp new file mode 100644 index 00000000..a51fe4ba --- /dev/null +++ b/tests/dCommonTests/Amf3Tests.cpp @@ -0,0 +1,116 @@ +#include + +#include + +#include "Amf3.h" + +TEST(dCommonTests, AMF3AssociativeArrayTest) { + + AMFArrayValue array; + array.Insert("true", true); + array.Insert("false", false); + + // test associative can insert values + ASSERT_EQ(array.GetAssociative().size(), 2); + ASSERT_EQ(array.Get("true")->GetValueType(), eAmf::True); + ASSERT_EQ(array.Get("false")->GetValueType(), eAmf::False); + + // Test associative can remove values + array.Remove("true"); + ASSERT_EQ(array.GetAssociative().size(), 1); + ASSERT_EQ(array.Get("true"), nullptr); + ASSERT_EQ(array.Get("false")->GetValueType(), eAmf::False); + + array.Remove("false"); + ASSERT_EQ(array.GetAssociative().size(), 0); + ASSERT_EQ(array.Get("true"), nullptr); + ASSERT_EQ(array.Get("false"), nullptr); + + // Test that multiple of the same key respect only the first element of that key + array.Insert("true", true); + array.Insert("true", false); + ASSERT_EQ(array.GetAssociative().size(), 1); + ASSERT_EQ(array.Get("true")->GetValueType(), eAmf::True); + array.Remove("true"); + + // Now test the dense portion + // Get some out of bounds values and cast to incorrect template types + array.Push(true); + array.Push(false); + + ASSERT_EQ(array.GetDense().size(), 2); + ASSERT_EQ(array.Get(0)->GetValueType(), eAmf::True); + ASSERT_EQ(array.Get(0), nullptr); + ASSERT_EQ(array.Get(1)->GetValueType(), eAmf::False); + ASSERT_EQ(array.Get(155), nullptr); + + array.Pop(); + + ASSERT_EQ(array.GetDense().size(), 1); + ASSERT_EQ(array.Get(0)->GetValueType(), eAmf::True); + ASSERT_EQ(array.Get(0), nullptr); + ASSERT_EQ(array.Get(1), nullptr); + + array.Pop(); + + ASSERT_EQ(array.GetDense().size(), 0); + ASSERT_EQ(array.Get(0), nullptr); + ASSERT_EQ(array.Get(0), nullptr); + ASSERT_EQ(array.Get(1), nullptr); +} + +TEST(dCommonTests, AMF3InsertionAssociativeTest) { + AMFArrayValue array; + array.Insert("CString", "string"); + array.Insert("String", std::string("string")); + array.Insert("False", false); + array.Insert("True", true); + array.Insert("Integer", 42U); + array.Insert("Double", 42.0); + array.InsertArray("Array"); + array.Insert>("Undefined", {}); + array.Insert("Null", nullptr); + + std::cout << "test" << std::endl; + ASSERT_EQ(array.Get("CString")->GetValueType(), eAmf::String); + std::cout << "test" << std::endl; + ASSERT_EQ(array.Get("String")->GetValueType(), eAmf::String); + std::cout << "test" << std::endl; + ASSERT_EQ(array.Get("False")->GetValueType(), eAmf::False); + std::cout << "test" << std::endl; + ASSERT_EQ(array.Get("True")->GetValueType(), eAmf::True); + std::cout << "test" << std::endl; + ASSERT_EQ(array.Get("Integer")->GetValueType(), eAmf::Integer); + std::cout << "test" << std::endl; + ASSERT_EQ(array.Get("Double")->GetValueType(), eAmf::Double); + std::cout << "test" << std::endl; + ASSERT_EQ(array.GetArray("Array")->GetValueType(), eAmf::Array); + std::cout << "test" << std::endl; + ASSERT_EQ(array.Get("Null")->GetValueType(), eAmf::Null); + std::cout << "test" << std::endl; + ASSERT_EQ(array.Get>("Undefined")->GetValueType(), eAmf::Undefined); + std::cout << "test" << std::endl; +} + +TEST(dCommonTests, AMF3InsertionDenseTest) { + AMFArrayValue array; + array.Push("string"); + array.Push("CString"); + array.Push(false); + array.Push(true); + array.Push(42U); + array.Push(42.0); + array.PushArray(); + array.Push(nullptr); + array.Push>({}); + + ASSERT_EQ(array.Get(0)->GetValueType(), eAmf::String); + ASSERT_EQ(array.Get(1)->GetValueType(), eAmf::String); + ASSERT_EQ(array.Get(2)->GetValueType(), eAmf::False); + ASSERT_EQ(array.Get(3)->GetValueType(), eAmf::True); + ASSERT_EQ(array.Get(4)->GetValueType(), eAmf::Integer); + ASSERT_EQ(array.Get(5)->GetValueType(), eAmf::Double); + ASSERT_EQ(array.GetArray(6)->GetValueType(), eAmf::Array); + ASSERT_EQ(array.Get(7)->GetValueType(), eAmf::Null); + ASSERT_EQ(array.Get>(8)->GetValueType(), eAmf::Undefined); +} diff --git a/tests/dCommonTests/CMakeLists.txt b/tests/dCommonTests/CMakeLists.txt index 444afbdd..a345863d 100644 --- a/tests/dCommonTests/CMakeLists.txt +++ b/tests/dCommonTests/CMakeLists.txt @@ -1,5 +1,6 @@ set(DCOMMONTEST_SOURCES "AMFDeserializeTests.cpp" + "Amf3Tests.cpp" "HeaderSkipTest.cpp" "TestLDFFormat.cpp" "TestNiPoint3.cpp" diff --git a/tests/dGameTests/dGameMessagesTests/GameMessageTests.cpp b/tests/dGameTests/dGameMessagesTests/GameMessageTests.cpp index 631f0d2d..047f56d6 100644 --- a/tests/dGameTests/dGameMessagesTests/GameMessageTests.cpp +++ b/tests/dGameTests/dGameMessagesTests/GameMessageTests.cpp @@ -1,5 +1,5 @@ #include "Action.h" -#include "AMFFormat.h" +#include "Amf3.h" #include "AMFDeserialize.h" #include "GameMessages.h" #include "GameDependencies.h" @@ -40,8 +40,8 @@ protected: } AMFArrayValue* ReadArrayFromBitStream(RakNet::BitStream* inStream) { AMFDeserialize des; - AMFValue* readArray = des.Read(inStream); - EXPECT_EQ(readArray->GetValueType(), AMFValueType::AMFArray); + AMFBaseValue* readArray = des.Read(inStream); + EXPECT_EQ(readArray->GetValueType(), eAmf::Array); return static_cast(readArray); } }; From 2117a18d62bd4f7e7757b65f118b886a57ec06cc Mon Sep 17 00:00:00 2001 From: Jett <55758076+Jettford@users.noreply.github.com> Date: Sat, 13 May 2023 23:23:09 +0100 Subject: [PATCH 28/33] Enable artifact uploading and replace upload parameters (#1091) --- .github/workflows/build-and-test.yml | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index ab3917c1..8a81def7 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -36,22 +36,16 @@ jobs: testPreset: "ci-${{matrix.os}}" - name: artifacts uses: actions/upload-artifact@v3 - if: ${{ github.ref == 'ref/head/main' }} with: name: build-${{matrix.os}} path: | - build - !build/tests - !build/Testing - !build/CMakeFiles - !build/DartConfiguration.tcl - !build/CTestTestfile.cmake - !build/CMakeCache.txt - !build/build.ninja - !build/_deps - !build/cmake_install.cmake - !build/*.a - !build/*.lib - !build/*.dir - !build/*.vcxproj - !build/*.vcxproj.filters + build/*Server* + build/*.ini + build/*.so + build/*.dll + build/vanity/ + build/navmeshes/ + build/migrations/ + build/*.dcf + !build/*.pdb + !build/d*/ From 9708ea28dce2b659ecbae855ed62d6b9b0c4f6fc Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Sat, 13 May 2023 18:21:17 -0500 Subject: [PATCH 29/33] refactor: removed hardcoded ag laser logic (#1079) * Removed hardcoded laser logic * Address feedback --- .../02_server/Map/AG/AgLaserSensorServer.cpp | 61 +++++-------------- .../02_server/Map/AG/AgLaserSensorServer.h | 3 +- .../Map/AG/AgMonumentLaserServer.cpp | 25 ++++---- .../02_server/Map/AG/AgMonumentLaserServer.h | 6 +- 4 files changed, 30 insertions(+), 65 deletions(-) diff --git a/dScripts/02_server/Map/AG/AgLaserSensorServer.cpp b/dScripts/02_server/Map/AG/AgLaserSensorServer.cpp index 703625d2..7fcea9fa 100644 --- a/dScripts/02_server/Map/AG/AgLaserSensorServer.cpp +++ b/dScripts/02_server/Map/AG/AgLaserSensorServer.cpp @@ -2,56 +2,27 @@ #include "PhantomPhysicsComponent.h" #include "SkillComponent.h" -#include "EntityManager.h" -#include "AgMonumentLaserServer.h" -#include "EntityManager.h" #include "ePhysicsEffectType.h" -#include "eReplicaComponentType.h" void AgLaserSensorServer::OnStartup(Entity* self) { - - PhantomPhysicsComponent* physComp = static_cast(self->GetComponent(eReplicaComponentType::PHANTOM_PHYSICS)); - physComp->SetPhysicsEffectActive(true); - physComp->SetEffectType(ePhysicsEffectType::REPULSE); - physComp->SetDirectionalMultiplier(static_cast(m_RepelForce)); - physComp->SetDirection(NiPoint3::UNIT_Y); - - m_Skill = self->GetComponent(); + self->SetBoolean(u"active", true); + auto repelForce = self->GetVarAs(u"repelForce"); + if (!repelForce) repelForce = m_RepelForce; + auto* phantomPhysicsComponent = self->GetComponent(); + if (!phantomPhysicsComponent) return; + phantomPhysicsComponent->SetPhysicsEffectActive(true); + phantomPhysicsComponent->SetEffectType(ePhysicsEffectType::REPULSE); + phantomPhysicsComponent->SetDirectionalMultiplier(repelForce); + phantomPhysicsComponent->SetDirection(NiPoint3::UNIT_Y); } void AgLaserSensorServer::OnCollisionPhantom(Entity* self, Entity* target) { - - if (!m_Skill) return; - - - Entity* laser = nullptr; - - for (auto script : EntityManager::Instance()->GetEntitiesByComponent(eReplicaComponentType::SCRIPT)) { - - AgMonumentLaserServer* hasLaser = (AgMonumentLaserServer*)script; - - if (hasLaser) { - const auto source = script->GetPosition(); - const auto obj = self->GetObjectID(); - - if (obj == 76690936093053 && Vector3::DistanceSquared(source, NiPoint3(149.007f, 417.083f, 218.346f)) <= 1.0f) { - laser = script; - break; - } else if (obj == 75866302318824 && Vector3::DistanceSquared(source, NiPoint3(48.6403f, 403.803f, 196.711f)) <= 1.0f) { - laser = script; - break; - } else if (obj == 75866302318822 && Vector3::DistanceSquared(source, NiPoint3(19.2155f, 420.083f, 249.226f)) <= 1.0f) { - laser = script; - break; - } else if (obj == 75866302318823 && Vector3::DistanceSquared(source, NiPoint3(-6.61596f, 404.633f, 274.323f)) <= 1.0f) { - laser = script; - break; - } - } - } - - if (laser != nullptr) { - m_Skill->CalculateBehavior(m_SkillCastID, 15714, target->GetObjectID()); - } + auto active = self->GetVar(u"active"); + if (!active) return; + auto skillCastID = self->GetVarAs(u"skillCastID"); + if (skillCastID == 0) skillCastID = m_SkillCastID; + auto* skillComponent = self->GetComponent(); + if (!skillComponent) return; + skillComponent->CastSkill(m_SkillCastID, target->GetObjectID()); } diff --git a/dScripts/02_server/Map/AG/AgLaserSensorServer.h b/dScripts/02_server/Map/AG/AgLaserSensorServer.h index 72e09dd8..ee7fb6ec 100644 --- a/dScripts/02_server/Map/AG/AgLaserSensorServer.h +++ b/dScripts/02_server/Map/AG/AgLaserSensorServer.h @@ -8,8 +8,7 @@ public: void OnStartup(Entity* self); void OnCollisionPhantom(Entity* self, Entity* target); private: - SkillComponent* m_Skill; - int m_RepelForce = -25; + float m_RepelForce = -25.0f; int m_SkillCastID = 163; }; diff --git a/dScripts/02_server/Map/AG/AgMonumentLaserServer.cpp b/dScripts/02_server/Map/AG/AgMonumentLaserServer.cpp index 6efda89e..b2062935 100644 --- a/dScripts/02_server/Map/AG/AgMonumentLaserServer.cpp +++ b/dScripts/02_server/Map/AG/AgMonumentLaserServer.cpp @@ -1,20 +1,17 @@ #include "AgMonumentLaserServer.h" +#include "EntityManager.h" void AgMonumentLaserServer::OnStartup(Entity* self) { - /* - self->SetProximityRadius(m_Radius, "MonumentLaser"); - - std::cout << "Monument Laser " << self->GetObjectID() << " is at " << self->GetPosition().GetX() - << ","<< self->GetPosition().GetY() << "," << self->GetPosition().GetZ() << std::endl; - */ -} - -void AgMonumentLaserServer::OnProximityUpdate(Entity* self, Entity* entering, std::string name, std::string status) { - /* - if (status == "ENTER") { - - std::cout << "Monument laser ID: " << self->GetObjectID() << std::endl; + auto lasers = EntityManager::Instance()->GetEntitiesInGroup(self->GetVarAsString(u"volGroup")); + for (auto laser : lasers) { + if (laser) laser->SetBoolean(u"active", true); + } +} + +void AgMonumentLaserServer::OnDie(Entity* self, Entity* killer) { + auto lasers = EntityManager::Instance()->GetEntitiesInGroup(self->GetVarAsString(u"volGroup")); + for (auto laser : lasers) { + if (laser) laser->SetBoolean(u"active", false); } - */ } diff --git a/dScripts/02_server/Map/AG/AgMonumentLaserServer.h b/dScripts/02_server/Map/AG/AgMonumentLaserServer.h index 56979c55..8163948b 100644 --- a/dScripts/02_server/Map/AG/AgMonumentLaserServer.h +++ b/dScripts/02_server/Map/AG/AgMonumentLaserServer.h @@ -3,8 +3,6 @@ class AgMonumentLaserServer : public CppScripts::Script { public: - void OnStartup(Entity* self); - void OnProximityUpdate(Entity* self, Entity* entering, std::string name, std::string status); -private: - float m_Radius = 25.0f; + void OnStartup(Entity* self) override; + void OnDie(Entity* self, Entity* killer) override; }; From 1f3df0873055eeca0468a566292f7890a85d23fa Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Sat, 13 May 2023 16:22:13 -0700 Subject: [PATCH 30/33] Update GameMessages.cpp --- dGame/dGameMessages/GameMessages.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index f7bd3b7d..c178f6c7 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -70,6 +70,7 @@ #include "PetComponent.h" #include "ModuleAssemblyComponent.h" #include "VehiclePhysicsComponent.h" +#include "RenderComponent.h" #include "PossessableComponent.h" #include "PossessorComponent.h" #include "RacingControlComponent.h" From 59387e5fe3c4a37d294d573c20624e300cc98252 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Wed, 17 May 2023 13:17:34 -0500 Subject: [PATCH 31/33] fix: update type in am blue x script (#1095) Fixes #1094 --- dScripts/02_server/Map/AM/AmBlueX.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dScripts/02_server/Map/AM/AmBlueX.cpp b/dScripts/02_server/Map/AM/AmBlueX.cpp index 312cdc47..8e32694c 100644 --- a/dScripts/02_server/Map/AM/AmBlueX.cpp +++ b/dScripts/02_server/Map/AM/AmBlueX.cpp @@ -18,7 +18,7 @@ void AmBlueX::OnSkillEventFired(Entity* self, Entity* caster, const std::string& auto* character = caster->GetCharacter(); if (character != nullptr) { - character->SetPlayerFlag(self->GetVar(m_FlagVariable), true); + character->SetPlayerFlag(self->GetVar(m_FlagVariable), true); } EntityInfo info{}; From 238751f14ee1bcbb95643e0781e45e137c466475 Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Thu, 25 May 2023 13:29:46 -0700 Subject: [PATCH 32/33] Remove extra cout (#1101) --- dCommon/Amf3.h | 1 - 1 file changed, 1 deletion(-) diff --git a/dCommon/Amf3.h b/dCommon/Amf3.h index 4dba039f..4c649524 100644 --- a/dCommon/Amf3.h +++ b/dCommon/Amf3.h @@ -342,7 +342,6 @@ public: */ template AMFValue* Get(uint32_t index) const { - std::cout << (index < this->dense.size()) << std::endl; return index < this->dense.size() ? dynamic_cast*>(this->dense.at(index)) : nullptr; From e47169fec580a6d4a7b00711f3067eed34c95a0f Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Fri, 26 May 2023 21:22:31 -0700 Subject: [PATCH 33/33] Fix: Some platforms not using the same RNG for every roll (#1103) * Test changes * Update ObjectIDManager.h * Revert "Update ObjectIDManager.h" This reverts commit 3e4d169718d0bc64b61fb5feaf39437ca4284294. * Revert "Test changes" This reverts commit 8e16573f937473785f91e04a13b177084fee3ed0. * Use random engine --- dWorldServer/ObjectIDManager.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/dWorldServer/ObjectIDManager.cpp b/dWorldServer/ObjectIDManager.cpp index ef5fb9a5..9490c0a7 100644 --- a/dWorldServer/ObjectIDManager.cpp +++ b/dWorldServer/ObjectIDManager.cpp @@ -1,8 +1,5 @@ #include "ObjectIDManager.h" -// Std -#include - // Custom Classes #include "MasterPackets.h" #include "Database.h" @@ -48,11 +45,7 @@ void ObjectIDManager::HandleRequestPersistentIDResponse(uint64_t requestID, uint //! Handles cases where we have to get a unique object ID synchronously uint32_t ObjectIDManager::GenerateRandomObjectID() { - std::random_device rd; - - std::mt19937 rng(rd()); - - return uni(rng); + return uni(Game::randomEngine); }