diff --git a/dGame/Entity.cpp b/dGame/Entity.cpp index fce2aefe..4e74b837 100644 --- a/dGame/Entity.cpp +++ b/dGame/Entity.cpp @@ -521,52 +521,7 @@ void Entity::Initialize() { } if (int componentID = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::QUICK_BUILD) > 0) { - auto* quickBuildComponent = AddComponent(); - - CDRebuildComponentTable* rebCompTable = CDClientManager::Instance().GetTable(); - std::vector rebCompData = rebCompTable->Query([=](CDRebuildComponent entry) { return (entry.id == quickBuildComponentID); }); - - if (rebCompData.size() > 0) { - quickBuildComponent->SetResetTime(rebCompData[0].reset_time); - quickBuildComponent->SetCompleteTime(rebCompData[0].complete_time); - quickBuildComponent->SetTakeImagination(rebCompData[0].take_imagination); - quickBuildComponent->SetInterruptible(rebCompData[0].interruptible); - quickBuildComponent->SetSelfActivator(rebCompData[0].self_activator); - quickBuildComponent->SetActivityId(rebCompData[0].activityID); - quickBuildComponent->SetPostImaginationCost(rebCompData[0].post_imagination_cost); - quickBuildComponent->SetTimeBeforeSmash(rebCompData[0].time_before_smash); - - const auto rebuildResetTime = GetVar(u"rebuild_reset_time"); - - if (rebuildResetTime != 0.0f) { - quickBuildComponent->SetResetTime(rebuildResetTime); - - // Known bug with moving platform in FV that casues it to build at the end instead of the start. - // This extends the smash time so players can ride up the lift. - if (m_TemplateID == 9483) { - quickBuildComponent->SetResetTime(quickBuildComponent->GetResetTime() + 25); - } - } - - const auto activityID = GetVar(u"activityID"); - - if (activityID > 0) { - quickBuildComponent->SetActivityId(activityID); - Loot::CacheMatrix(activityID); - } - - const auto timeBeforeSmash = GetVar(u"tmeSmsh"); - - if (timeBeforeSmash > 0) { - quickBuildComponent->SetTimeBeforeSmash(timeBeforeSmash); - } - - const auto compTime = GetVar(u"compTime"); - - if (compTime > 0) { - quickBuildComponent->SetCompleteTime(compTime); - } - } + auto* quickBuildComponent = AddComponent(componentID); } if (compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::SWITCH, -1) != -1) { @@ -2023,6 +1978,10 @@ LDFBaseData* Entity::GetVarData(const std::u16string& name) const { return nullptr; } +bool Entity::CheckIfVarExists(const std::u16string& name) const { + return GetVarData(name) != nullptr; +} + std::string Entity::GetVarAsString(const std::u16string& name) const { auto* data = GetVarData(name); diff --git a/dGame/Entity.h b/dGame/Entity.h index 77d77b16..0444e301 100644 --- a/dGame/Entity.h +++ b/dGame/Entity.h @@ -282,6 +282,12 @@ public: */ LDFBaseData* GetVarData(const std::u16string& name) const; + /** + * Returns if a var exists + */ + bool CheckIfVarExists(const std::u16string& name) const; + + /** * Get the LDF value and convert it to a string. */ diff --git a/dGame/dBehaviors/AreaOfEffectBehavior.cpp b/dGame/dBehaviors/AreaOfEffectBehavior.cpp index 2a7e9754..7fd2fbfc 100644 --- a/dGame/dBehaviors/AreaOfEffectBehavior.cpp +++ b/dGame/dBehaviors/AreaOfEffectBehavior.cpp @@ -7,7 +7,6 @@ #include "Logger.h" #include "BehaviorBranchContext.h" #include "BehaviorContext.h" -#include "QuickBuildComponent.h" #include "DestroyableComponent.h" #include "Game.h" #include "Logger.h" diff --git a/dGame/dBehaviors/TacArcBehavior.cpp b/dGame/dBehaviors/TacArcBehavior.cpp index 0cea8213..eeb197b5 100644 --- a/dGame/dBehaviors/TacArcBehavior.cpp +++ b/dGame/dBehaviors/TacArcBehavior.cpp @@ -6,7 +6,6 @@ #include "BehaviorContext.h" #include "BaseCombatAIComponent.h" #include "EntityManager.h" -#include "QuickBuildComponent.h" #include "DestroyableComponent.h" #include diff --git a/dGame/dComponents/ActivityComponent.cpp b/dGame/dComponents/ActivityComponent.cpp index 59637d59..094520b3 100644 --- a/dGame/dComponents/ActivityComponent.cpp +++ b/dGame/dComponents/ActivityComponent.cpp @@ -30,8 +30,14 @@ #include "LeaderboardManager.h" ActivityComponent::ActivityComponent(Entity* parent, int32_t activityID) : Component(parent) { + m_Parent = parent; + if (activityID == -1) return; + SetupActivity(activityID); +} + +void ActivityComponent::SetupActivity(int32_t activityID){ if (activityID > 0) m_ActivityID = activityID; - else m_ActivityID = parent->GetVar(u"activityID"); + else m_ActivityID = m_Parent->GetVar(u"activityID"); CDActivitiesTable* activitiesTable = CDClientManager::Instance().GetTable(); std::vector activities = activitiesTable->Query([=](CDActivities entry) {return (entry.ActivityID == m_ActivityID); }); @@ -42,7 +48,7 @@ ActivityComponent::ActivityComponent(Entity* parent, int32_t activityID) : Compo m_ActivityInfo.minTeams = 1; } if (m_ActivityInfo.instanceMapID == -1) { - const auto& transferOverride = parent->GetVarAsString(u"transferZoneID"); + const auto& transferOverride = m_Parent->GetVarAsString(u"transferZoneID"); if (!transferOverride.empty()) { GeneralUtils::TryParse(transferOverride, m_ActivityInfo.instanceMapID); } diff --git a/dGame/dComponents/ActivityComponent.h b/dGame/dComponents/ActivityComponent.h index 96dbd5fb..895dc066 100644 --- a/dGame/dComponents/ActivityComponent.h +++ b/dGame/dComponents/ActivityComponent.h @@ -150,7 +150,7 @@ struct ActivityPlayer { */ class ActivityComponent : public Component { public: - ActivityComponent(Entity* parent, int32_t activityID); + ActivityComponent(Entity* parent, int32_t activityID = -1); void Update(float deltaTime) override; void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate) override; @@ -205,6 +205,12 @@ public: */ int GetActivityID() { return m_ActivityInfo.ActivityID; } + /** + * Sets the ID of this activity + */ + void SetActivityID(int32_t activityID) { m_ActivityID = activityID; } + + /** * Returns if this activity has a lobby, e.g. if it needs to instance players to some other map * @return true if this activity has a lobby, false otherwise @@ -280,7 +286,7 @@ public: * Returns all the score for the players that are currently playing this activity * @return */ - std::vector GetActivityPlayers() { return m_ActivityPlayers; }; + std::vector GetActivityPlayers() const { return m_ActivityPlayers; }; /** * Returns activity data for a specific entity (e.g. score and such). @@ -330,6 +336,13 @@ public: * @return the LMI that this activity points to for a team size */ uint32_t GetLootMatrixForTeamSize(uint32_t teamSize) { return m_ActivityLootMatrices[teamSize]; } + + /** + * Sets up the activity data for a gievn activity + */ + void SetupActivity(int32_t activityID); + + void ClearActivityPlayerData() { m_ActivityPlayers.clear(); m_DirtyActivityInfo = true;}; private: /** diff --git a/dGame/dComponents/QuickBuildComponent.cpp b/dGame/dComponents/QuickBuildComponent.cpp index 16263d81..03f6bd2e 100644 --- a/dGame/dComponents/QuickBuildComponent.cpp +++ b/dGame/dComponents/QuickBuildComponent.cpp @@ -21,16 +21,46 @@ #include "Loot.h" #include "TeamManager.h" #include "RenderComponent.h" +#include "CDRebuildComponentTable.h" #include "CppScripts.h" -QuickBuildComponent::QuickBuildComponent(Entity* entity) : Component(entity) { - std::u16string checkPreconditions = entity->GetVar(u"CheckPrecondition"); +QuickBuildComponent::QuickBuildComponent(Entity* parent, uint32_t id) : ActivityComponent(parent) { + m_Parent = parent; + + CDRebuildComponentTable* rebCompTable = CDClientManager::Instance().GetTable(); + std::vector rebCompData = rebCompTable->Query([=](CDRebuildComponent entry) { return (entry.id == id); }); + + if (rebCompData.size() > 0) { + SetResetTime(rebCompData[0].reset_time); + SetCompleteTime(rebCompData[0].complete_time); + SetTakeImagination(rebCompData[0].take_imagination); + SetActivityID(rebCompData[0].activityID); + SetInterruptible(rebCompData[0].interruptible); + SetSelfActivator(rebCompData[0].self_activator); + SetPostImaginationCost(rebCompData[0].post_imagination_cost); + SetTimeBeforeSmash(rebCompData[0].time_before_smash); + const auto compTime = m_Parent->GetVar(u"compTime"); + if (compTime > 0) SetCompleteTime(compTime); + } + std::u16string checkPreconditions = m_Parent->GetVar(u"CheckPrecondition"); if (!checkPreconditions.empty()) { m_Precondition = new PreconditionExpression(GeneralUtils::UTF16ToWTF8(checkPreconditions)); } + const auto activityID = m_Parent->GetVar(u"activityID"); + if (activityID > 0) SetActivityID(activityID); + SetupActivity(GetActivityID()); + + const auto rebuildResetTime = m_Parent->GetVar(u"rebuild_reset_time"); + if (rebuildResetTime != 0.0f) { + SetResetTime(rebuildResetTime); + // Known bug with moving platform in FV that casues it to build at the end instead of the start. + // This extends the smash time so players can ride up the lift. + if (m_Parent->GetLOT() == 9483) SetResetTime(GetResetTime() + 25); + } + // Should a setting that has the build activator position exist, fetch that setting here and parse it for position. // It is assumed that the user who sets this setting uses the correct character delimiter (character 31 or in hex 0x1F) auto positionAsVector = GeneralUtils::SplitString(m_Parent->GetVarAsString(u"rebuild_activators"), 0x1F); @@ -38,11 +68,22 @@ QuickBuildComponent::QuickBuildComponent(Entity* entity) : Component(entity) { GeneralUtils::TryParse(positionAsVector[0], m_ActivatorPosition.x) && GeneralUtils::TryParse(positionAsVector[1], m_ActivatorPosition.y) && GeneralUtils::TryParse(positionAsVector[2], m_ActivatorPosition.z)) { + } else if ( + m_Parent->CheckIfVarExists(u"position.x") && + m_Parent->CheckIfVarExists(u"position.y") && + m_Parent->CheckIfVarExists(u"position.z")) { + m_ActivatorPosition.x = m_Parent->GetVar(u"position.x"); + m_ActivatorPosition.y = m_Parent->GetVar(u"position.y"); + m_ActivatorPosition.x = m_Parent->GetVar(u"position.z"); } else { - LOG("Failed to find activator position for lot %i. Defaulting to parents position.", m_Parent->GetLOT()); m_ActivatorPosition = m_Parent->GetPosition(); } + + const auto timeBeforeSmash = m_Parent->GetVar(u"tmeSmsh"); + if (timeBeforeSmash > 0) SetTimeBeforeSmash(timeBeforeSmash); + m_IsChoiceBuild = m_Parent->GetBoolean(u"is_ChoiceBuild"); + SpawnActivator(); } @@ -58,71 +99,27 @@ QuickBuildComponent::~QuickBuildComponent() { } void QuickBuildComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate) { - if (m_Parent->GetComponent(eReplicaComponentType::DESTROYABLE) == nullptr) { + ActivityComponent::Serialize(outBitStream, bIsInitialUpdate); + outBitStream->Write(m_StateDirty); + if (m_StateDirty) { + outBitStream->Write(m_State); + outBitStream->Write(m_ShowResetEffect); + outBitStream->Write(m_Activator != nullptr); + outBitStream->Write(m_Timer); + outBitStream->Write(m_TimerIncomplete); if (bIsInitialUpdate) { - outBitStream->Write(false); + outBitStream->Write(m_IsChoiceBuild); + if (m_IsChoiceBuild) outBitStream->Write(m_ResetTime); + outBitStream->Write(m_ActivatorPosition); + outBitStream->Write(m_RepositionPlayer); } - - outBitStream->Write(false); - - outBitStream->Write(false); + if (!bIsInitialUpdate) m_StateDirty = false; } - // If build state is completed and we've already serialized once in the completed state, - // don't serializing this component anymore as this will cause the build to jump again. - // If state changes, serialization will begin again. - if (!m_StateDirty && m_State == eQuickBuildState::COMPLETED) { - outBitStream->Write0(); - outBitStream->Write0(); - return; - } - // BEGIN Scripted Activity - outBitStream->Write1(); - - Entity* builder = GetBuilder(); - - if (builder) { - outBitStream->Write(1); - outBitStream->Write(builder->GetObjectID()); - - for (int i = 0; i < 10; i++) { - outBitStream->Write(0.0f); - } - } else { - outBitStream->Write(0); - } - // END Scripted Activity - - outBitStream->Write1(); - - outBitStream->Write(m_State); - - outBitStream->Write(m_ShowResetEffect); - outBitStream->Write(m_Activator != nullptr); - - outBitStream->Write(m_Timer); - outBitStream->Write(m_TimerIncomplete); - - if (bIsInitialUpdate) { - outBitStream->Write(false); - outBitStream->Write(m_ActivatorPosition); - outBitStream->Write(m_RepositionPlayer); - } - m_StateDirty = false; } void QuickBuildComponent::Update(float deltaTime) { m_Activator = GetActivator(); - // Serialize the quickbuild every so often, fixes the odd bug where the quickbuild is not buildable - /*if (m_SoftTimer > 0.0f) { - m_SoftTimer -= deltaTime; - } - else { - m_SoftTimer = 5.0f; - - Game::entityManager->SerializeEntity(m_Parent); - }*/ - switch (m_State) { case eQuickBuildState::OPEN: { SpawnActivator(); @@ -138,14 +135,14 @@ void QuickBuildComponent::Update(float deltaTime) { if (m_TimeBeforeSmash > 0) { if (m_TimerIncomplete >= m_TimeBeforeSmash - 4.0f) { m_ShowResetEffect = true; - + m_StateDirty = true; Game::entityManager->SerializeEntity(m_Parent); } if (m_TimerIncomplete >= m_TimeBeforeSmash) { - m_Builder = LWOOBJID_EMPTY; + ClearActivityPlayerData(); - GameMessages::SendDieNoImplCode(m_Parent, LWOOBJID_EMPTY, LWOOBJID_EMPTY, eKillType::VIOLENT, u"", 0.0f, 0.0f, 0.0f, false, true); + GameMessages::SendDie(m_Parent, LWOOBJID_EMPTY, LWOOBJID_EMPTY, true, eKillType::VIOLENT, u"", 0.0f, 0.0f, 0.0f, false, true); ResetQuickBuild(false); } @@ -162,14 +159,14 @@ void QuickBuildComponent::Update(float deltaTime) { if (m_Timer >= m_ResetTime - 4.0f) { if (!m_ShowResetEffect) { m_ShowResetEffect = true; - + m_StateDirty = true; Game::entityManager->SerializeEntity(m_Parent); } } if (m_Timer >= m_ResetTime) { - GameMessages::SendDieNoImplCode(m_Parent, LWOOBJID_EMPTY, LWOOBJID_EMPTY, eKillType::VIOLENT, u"", 0.0f, 0.0f, 0.0f, false, true); + GameMessages::SendDie(m_Parent, LWOOBJID_EMPTY, LWOOBJID_EMPTY, true, eKillType::VIOLENT, u"", 0.0f, 0.0f, 0.0f, false, true); ResetQuickBuild(false); } @@ -190,7 +187,7 @@ void QuickBuildComponent::Update(float deltaTime) { m_Timer += deltaTime; m_TimerIncomplete = 0; m_ShowResetEffect = false; - + m_StateDirty = true; if (m_TimeBeforeDrain <= 0.0f) { m_TimeBeforeDrain = m_CompleteTime / static_cast(m_TakeImagination); @@ -223,14 +220,14 @@ void QuickBuildComponent::Update(float deltaTime) { if (m_TimeBeforeSmash > 0) { if (m_TimerIncomplete >= m_TimeBeforeSmash - 4.0f) { m_ShowResetEffect = true; - + m_StateDirty = true; Game::entityManager->SerializeEntity(m_Parent); } if (m_TimerIncomplete >= m_TimeBeforeSmash) { - m_Builder = LWOOBJID_EMPTY; + ClearActivityPlayerData(); - GameMessages::SendDieNoImplCode(m_Parent, LWOOBJID_EMPTY, LWOOBJID_EMPTY, eKillType::VIOLENT, u"", 0.0f, 0.0f, 0.0f, false, true); + GameMessages::SendDie(m_Parent, LWOOBJID_EMPTY, LWOOBJID_EMPTY, true, eKillType::VIOLENT, u"", 0.0f, 0.0f, 0.0f, false, true); ResetQuickBuild(false); } @@ -317,10 +314,6 @@ std::vector QuickBuildComponent::GetCustomModules() { return m_CustomModules; } -int QuickBuildComponent::GetActivityId() { - return m_ActivityId; -} - int QuickBuildComponent::GetPostImaginationCost() { return m_PostImaginationCost; } @@ -334,7 +327,9 @@ eQuickBuildState QuickBuildComponent::GetState() { } Entity* QuickBuildComponent::GetBuilder() const { - auto* builder = Game::entityManager->GetEntity(m_Builder); + const auto players = GetActivityPlayers(); + if (players.empty()) return nullptr; + auto* builder = Game::entityManager->GetEntity(players[0]->playerID); return builder; } @@ -348,15 +343,13 @@ void QuickBuildComponent::SetActivatorPosition(NiPoint3 value) { } void QuickBuildComponent::SetResetTime(float value) { - m_ResetTime = value; + if (value < 0) m_ResetTime = 20.0f; + else m_ResetTime = value; } void QuickBuildComponent::SetCompleteTime(float value) { - if (value < 0) { - m_CompleteTime = 4.5f; - } else { - m_CompleteTime = value; - } + if (value < 0) m_CompleteTime = 4.5f; + else m_CompleteTime = value; } void QuickBuildComponent::SetTakeImagination(int value) { @@ -375,20 +368,13 @@ void QuickBuildComponent::SetCustomModules(std::vector value) { m_CustomModules = value; } -void QuickBuildComponent::SetActivityId(int value) { - m_ActivityId = value; -} - void QuickBuildComponent::SetPostImaginationCost(int value) { m_PostImaginationCost = value; } void QuickBuildComponent::SetTimeBeforeSmash(float value) { - if (value < 0) { - m_TimeBeforeSmash = 10.0f; - } else { - m_TimeBeforeSmash = value; - } + if (value < 0) m_TimeBeforeSmash = 10.0f; + else m_TimeBeforeSmash = value; } void QuickBuildComponent::SetRepositionPlayer(bool value) { @@ -397,7 +383,8 @@ void QuickBuildComponent::SetRepositionPlayer(bool value) { void QuickBuildComponent::StartQuickBuild(Entity* user) { if (m_State == eQuickBuildState::OPEN || m_State == eQuickBuildState::COMPLETED || m_State == eQuickBuildState::INCOMPLETE) { - m_Builder = user->GetObjectID(); + // user->GetObjectID(); + AddActivityPlayerData(user->GetObjectID()); auto* character = user->GetComponent(); character->SetCurrentActivity(eGameActivity::QUICKBUILDING); @@ -478,14 +465,14 @@ void QuickBuildComponent::CompleteQuickBuild(Entity* user) { auto* member = Game::entityManager->GetEntity(memberId); if (member) { auto* missionComponent = member->GetComponent(); - if (missionComponent) missionComponent->Progress(eMissionTaskType::ACTIVITY, m_ActivityId); + if (missionComponent) missionComponent->Progress(eMissionTaskType::ACTIVITY, GetActivityID()); } } } else { auto* missionComponent = builder->GetComponent(); - if (missionComponent) missionComponent->Progress(eMissionTaskType::ACTIVITY, m_ActivityId); + if (missionComponent) missionComponent->Progress(eMissionTaskType::ACTIVITY, GetActivityID()); } - Loot::DropActivityLoot(builder, m_Parent, m_ActivityId, 1); + Loot::DropActivityLoot(builder, m_Parent, GetActivityID(), 1); } // Notify scripts @@ -557,8 +544,7 @@ void QuickBuildComponent::ResetQuickBuild(bool failed) { void QuickBuildComponent::CancelQuickBuild(Entity* entity, eQuickBuildFailReason failReason, bool skipChecks) { if (m_State != eQuickBuildState::COMPLETED || skipChecks) { - - m_Builder = LWOOBJID_EMPTY; + RemoveActivityPlayerData(entity->GetObjectID()); const auto entityID = entity != nullptr ? entity->GetObjectID() : LWOOBJID_EMPTY; diff --git a/dGame/dComponents/QuickBuildComponent.h b/dGame/dComponents/QuickBuildComponent.h index feef1f74..50e28850 100644 --- a/dGame/dComponents/QuickBuildComponent.h +++ b/dGame/dComponents/QuickBuildComponent.h @@ -8,7 +8,7 @@ #include "NiPoint3.h" #include "ScriptedActivityComponent.h" #include "Preconditions.h" -#include "Component.h" +#include "ActivityComponent.h" #include "eReplicaComponentType.h" #include "eQuickBuildState.h" @@ -20,11 +20,11 @@ enum class eQuickBuildFailReason : uint32_t; * consists of an activator that shows a popup and then the actual entity that the bricks are built into. Note * that quick builds are also scripted activities so this shared some logic with the ScriptedActivityComponent. */ -class QuickBuildComponent : public Component { +class QuickBuildComponent : public ActivityComponent { public: inline static const eReplicaComponentType ComponentType = eReplicaComponentType::QUICK_BUILD; - QuickBuildComponent(Entity* entity); + QuickBuildComponent(Entity* parent, uint32_t id); ~QuickBuildComponent() override; void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate) override; @@ -213,11 +213,11 @@ public: /** * Cancels the quickbuild if it wasn't completed - * @param builder the player that's currently building + * @param entity the player that's currently building * @param failReason the reason the quickbuild was cancelled * @param skipChecks whether or not to skip the check for the quickbuild not being completed */ - void CancelQuickBuild(Entity* builder, eQuickBuildFailReason failReason, bool skipChecks = false); + void CancelQuickBuild(Entity* entity, eQuickBuildFailReason failReason, bool skipChecks = false); private: /** * Whether or not the quickbuild state has been changed since we last serialized it. @@ -304,11 +304,6 @@ private: */ std::vector m_CustomModules{}; - /** - * The activity ID that players partake in when doing this quickbuild - */ - int m_ActivityId = 0; - /** * Currently unused */ @@ -339,11 +334,6 @@ private: */ float m_SoftTimer = 0; - /** - * The ID of the entity that's currently building the quickbuild - */ - LWOOBJID m_Builder = LWOOBJID_EMPTY; - /** * Preconditions to be met before being able to start the quickbuild */ @@ -360,6 +350,11 @@ private: * @param user the entity that completed the quickbuild */ void CompleteQuickBuild(Entity* user); + + /** + * Is this quickbuild from a choicebuild + */ + bool m_IsChoiceBuild = false; }; #endif // QUICKBUILDCOMPONENT_H diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index 5d3384cc..973467d0 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -814,28 +814,6 @@ void GameMessages::SendTerminateInteraction(const LWOOBJID& objectID, eTerminate SEND_PACKET_BROADCAST; } -void GameMessages::SendDieNoImplCode(Entity* entity, const LWOOBJID& killerID, const LWOOBJID& lootOwnerID, eKillType killType, std::u16string deathType, float directionRelative_AngleY, float directionRelative_AngleXZ, float directionRelative_Force, bool bClientDeath, bool bSpawnLoot) { - CBITSTREAM; - CMSGHEADER; - - bitStream.Write(entity->GetObjectID()); - bitStream.Write(eGameMessageType::DIE); - bitStream.Write(bClientDeath); - bitStream.Write(bSpawnLoot); - bitStream.Write(deathType); - bitStream.Write(directionRelative_AngleXZ); - bitStream.Write(directionRelative_AngleY); - bitStream.Write(directionRelative_Force); - - bitStream.Write(killType != eKillType::VIOLENT); - if (killType != eKillType::VIOLENT) bitStream.Write(killType); - - bitStream.Write(killerID); - bitStream.Write(lootOwnerID); - - SEND_PACKET_BROADCAST; -} - void GameMessages::SendDie(Entity* entity, const LWOOBJID& killerID, const LWOOBJID& lootOwnerID, bool bDieAccepted, eKillType killType, std::u16string deathType, float directionRelative_AngleY, float directionRelative_AngleXZ, float directionRelative_Force, bool bClientDeath, bool bSpawnLoot, float coinSpawnTime) { CBITSTREAM; CMSGHEADER; @@ -4953,7 +4931,7 @@ void GameMessages::HandleQuickBuildCancel(RakNet::BitStream* inStream, Entity* e inStream->Read(bEarlyRelease); inStream->Read(userID); - auto* quickBuildComponent = static_cast(entity->GetComponent(eReplicaComponentType::QUICK_BUILD));; + auto* quickBuildComponent = entity->GetComponent(); if (!quickBuildComponent) return; quickBuildComponent->CancelQuickBuild(Game::entityManager->GetEntity(userID), eQuickBuildFailReason::CANCELED_EARLY); diff --git a/dGame/dGameMessages/GameMessages.h b/dGame/dGameMessages/GameMessages.h index 6d29a394..08c90bc3 100644 --- a/dGame/dGameMessages/GameMessages.h +++ b/dGame/dGameMessages/GameMessages.h @@ -105,7 +105,6 @@ namespace GameMessages { void AddActivityOwner(Entity* entity, LWOOBJID& ownerID); void SendTerminateInteraction(const LWOOBJID& objectID, eTerminateType type, const LWOOBJID& terminator); - void SendDieNoImplCode(Entity* entity, const LWOOBJID& killerID, const LWOOBJID& lootOwnerID, eKillType killType, std::u16string deathType, float directionRelative_AngleY, float directionRelative_AngleXZ, float directionRelative_Force, bool bClientDeath, bool bSpawnLoot); void SendDie(Entity* entity, const LWOOBJID& killerID, const LWOOBJID& lootOwnerID, bool bDieAccepted, eKillType killType, std::u16string deathType, float directionRelative_AngleY, float directionRelative_AngleXZ, float directionRelative_Force, bool bClientDeath, bool bSpawnLoot, float coinSpawnTime); void SendSetInventorySize(Entity* entity, int invType, int size);