Merge pull request #534 Quickbuilds jumping again

Addresses quickbuilds not jumping anymore.
This commit is contained in:
David Markowitz 2022-05-03 12:18:26 -07:00 committed by GitHub
commit a1a345326a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 9 deletions

View File

@ -45,7 +45,14 @@ void RebuildComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitia
outBitStream->Write(false); outBitStream->Write(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 == REBUILD_COMPLETED) {
outBitStream->Write0();
outBitStream->Write0();
return;
}
// BEGIN Scripted Activity // BEGIN Scripted Activity
outBitStream->Write1(); outBitStream->Write1();
@ -79,6 +86,7 @@ void RebuildComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitia
outBitStream->Write(m_ActivatorPosition); outBitStream->Write(m_ActivatorPosition);
outBitStream->Write(m_RepositionPlayer); outBitStream->Write(m_RepositionPlayer);
} }
m_StateDirty = false;
} }
void RebuildComponent::Update(float deltaTime) { void RebuildComponent::Update(float deltaTime) {
@ -139,7 +147,6 @@ void RebuildComponent::Update(float deltaTime) {
} }
if (m_Timer >= m_ResetTime) { if (m_Timer >= m_ResetTime) {
m_Builder = LWOOBJID_EMPTY;
GameMessages::SendDieNoImplCode(m_Parent, LWOOBJID_EMPTY, LWOOBJID_EMPTY, eKillType::VIOLENT, u"", 0.0f, 0.0f, 0.0f, false, true); GameMessages::SendDieNoImplCode(m_Parent, LWOOBJID_EMPTY, LWOOBJID_EMPTY, eKillType::VIOLENT, u"", 0.0f, 0.0f, 0.0f, false, true);
@ -384,7 +391,7 @@ void RebuildComponent::StartRebuild(Entity* user) {
GameMessages::SendEnableRebuild(m_Parent, true, false, false, eFailReason::REASON_NOT_GIVEN, 0.0f, user->GetObjectID()); GameMessages::SendEnableRebuild(m_Parent, true, false, false, eFailReason::REASON_NOT_GIVEN, 0.0f, user->GetObjectID());
m_State = eRebuildState::REBUILD_BUILDING; m_State = eRebuildState::REBUILD_BUILDING;
m_StateDirty = true;
EntityManager::Instance()->SerializeEntity(m_Parent); EntityManager::Instance()->SerializeEntity(m_Parent);
auto* movingPlatform = m_Parent->GetComponent<MovingPlatformComponent>(); auto* movingPlatform = m_Parent->GetComponent<MovingPlatformComponent>();
@ -427,6 +434,7 @@ void RebuildComponent::CompleteRebuild(Entity* user) {
m_State = eRebuildState::REBUILD_COMPLETED; m_State = eRebuildState::REBUILD_COMPLETED;
m_StateDirty = true;
m_Timer = 0.0f; m_Timer = 0.0f;
m_DrainedImagination = 0; m_DrainedImagination = 0;
@ -455,8 +463,6 @@ void RebuildComponent::CompleteRebuild(Entity* user) {
LootGenerator::Instance().DropActivityLoot(builder, m_Parent, m_ActivityId, 1); LootGenerator::Instance().DropActivityLoot(builder, m_Parent, m_ActivityId, 1);
} }
m_Builder = LWOOBJID_EMPTY;
// Notify scripts // Notify scripts
for (auto* script : CppScripts::GetEntityScripts(m_Parent)) { for (auto* script : CppScripts::GetEntityScripts(m_Parent)) {
script->OnRebuildComplete(m_Parent, user); script->OnRebuildComplete(m_Parent, user);
@ -501,12 +507,11 @@ void RebuildComponent::ResetRebuild(bool failed) {
GameMessages::SendRebuildNotifyState(m_Parent, m_State, eRebuildState::REBUILD_RESETTING, LWOOBJID_EMPTY); GameMessages::SendRebuildNotifyState(m_Parent, m_State, eRebuildState::REBUILD_RESETTING, LWOOBJID_EMPTY);
m_State = eRebuildState::REBUILD_RESETTING; m_State = eRebuildState::REBUILD_RESETTING;
m_StateDirty = true;
m_Timer = 0.0f; m_Timer = 0.0f;
m_TimerIncomplete = 0.0f; m_TimerIncomplete = 0.0f;
m_ShowResetEffect = false; m_ShowResetEffect = false;
m_DrainedImagination = 0; m_DrainedImagination = 0;
m_Builder = LWOOBJID_EMPTY;
EntityManager::Instance()->SerializeEntity(m_Parent); EntityManager::Instance()->SerializeEntity(m_Parent);
@ -541,6 +546,7 @@ void RebuildComponent::CancelRebuild(Entity* entity, eFailReason failReason, boo
// Now update the component itself // Now update the component itself
m_State = eRebuildState::REBUILD_INCOMPLETE; m_State = eRebuildState::REBUILD_INCOMPLETE;
m_StateDirty = true;
// Notify scripts and possible subscribers // Notify scripts and possible subscribers
for (auto* script : CppScripts::GetEntityScripts(m_Parent)) for (auto* script : CppScripts::GetEntityScripts(m_Parent))

View File

@ -216,7 +216,11 @@ public:
*/ */
void CancelRebuild(Entity* builder, eFailReason failReason, bool skipChecks = false); void CancelRebuild(Entity* builder, eFailReason failReason, bool skipChecks = false);
private: private:
/**
* Whether or not the quickbuild state has been changed since we last serialized it.
*/
bool m_StateDirty = true;
/** /**
* The state the rebuild is currently in * The state the rebuild is currently in
*/ */
@ -235,7 +239,7 @@ private:
/** /**
* The position that the rebuild activator is spawned at * The position that the rebuild activator is spawned at
*/ */
NiPoint3 m_ActivatorPosition {}; NiPoint3 m_ActivatorPosition = NiPoint3::ZERO;
/** /**
* The entity that represents the rebuild activator * The entity that represents the rebuild activator