Skip to content

Commit

Permalink
fix laggy property models (and probably more)
Browse files Browse the repository at this point in the history
global fix correcting the initial physics motion state from 0 to 5 (confirm in client).  packet captures from a few worlds (didnt scan more than 5 files) show that the value for simple physics was either 5, or 4 for property models, or 1 for property models with behaviors.

properties with pre-built models no longer lag and values of physics types should be correct across the board
  • Loading branch information
EmosewaMC committed Nov 10, 2024
1 parent de3fe93 commit 1f6a8d1
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 5 deletions.
13 changes: 13 additions & 0 deletions dGame/dComponents/ModelComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "BehaviorStates.h"
#include "ControlBehaviorMsgs.h"
#include "tinyxml2.h"
#include "SimplePhysicsComponent.h"

#include "Database.h"

Expand Down Expand Up @@ -95,12 +96,24 @@ void ModelComponent::AddBehavior(AddMessage& msg) {
for (auto& behavior : m_Behaviors) if (behavior.GetBehaviorId() == msg.GetBehaviorId()) return;
m_Behaviors.insert(m_Behaviors.begin() + msg.GetBehaviorIndex(), PropertyBehavior());
m_Behaviors.at(msg.GetBehaviorIndex()).HandleMsg(msg);
auto* const simplePhysComponent = m_Parent->GetComponent<SimplePhysicsComponent>();
if (simplePhysComponent) {
simplePhysComponent->SetPhysicsMotionState(1);
Game::entityManager->SerializeEntity(m_Parent);
}
}

void ModelComponent::MoveToInventory(MoveToInventoryMessage& msg) {
if (msg.GetBehaviorIndex() >= m_Behaviors.size() || m_Behaviors.at(msg.GetBehaviorIndex()).GetBehaviorId() != msg.GetBehaviorId()) return;
m_Behaviors.erase(m_Behaviors.begin() + msg.GetBehaviorIndex());
// TODO move to the inventory
if (m_Behaviors.empty()) {
auto* const simplePhysComponent = m_Parent->GetComponent<SimplePhysicsComponent>();
if (simplePhysComponent) {
simplePhysComponent->SetPhysicsMotionState(4);
Game::entityManager->SerializeEntity(m_Parent);
}
}
}

std::array<std::pair<int32_t, std::string>, 5> ModelComponent::GetBehaviorsForSave() const {
Expand Down
8 changes: 4 additions & 4 deletions dGame/dComponents/SimplePhysicsComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ SimplePhysicsComponent::SimplePhysicsComponent(Entity* parent, uint32_t componen
} else {
SetClimbableType(eClimbableType::CLIMBABLE_TYPE_NOT);
}
m_PhysicsMotionState = m_Parent->GetVarAs<uint32_t>(u"motionType");
}

SimplePhysicsComponent::~SimplePhysicsComponent() {
Expand All @@ -47,11 +48,9 @@ void SimplePhysicsComponent::Serialize(RakNet::BitStream& outBitStream, bool bIs
}

// Physics motion state
if (m_PhysicsMotionState != 0) {
outBitStream.Write1();
outBitStream.Write(m_DirtyPhysicsMotionState || bIsInitialUpdate);
if (m_DirtyPhysicsMotionState || bIsInitialUpdate) {
outBitStream.Write<uint32_t>(m_PhysicsMotionState);
} else {
outBitStream.Write0();
}
PhysicsComponent::Serialize(outBitStream, bIsInitialUpdate);
}
Expand All @@ -61,5 +60,6 @@ uint32_t SimplePhysicsComponent::GetPhysicsMotionState() const {
}

void SimplePhysicsComponent::SetPhysicsMotionState(uint32_t value) {
m_DirtyPhysicsMotionState = m_PhysicsMotionState != value;
m_PhysicsMotionState = value;
}
4 changes: 3 additions & 1 deletion dGame/dComponents/SimplePhysicsComponent.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,9 @@ class SimplePhysicsComponent : public PhysicsComponent {
/**
* The current physics motion state
*/
uint32_t m_PhysicsMotionState = 0;
uint32_t m_PhysicsMotionState = 5;

bool m_DirtyPhysicsMotionState = true;

/**
* Whether or not the entity is climbable
Expand Down
1 change: 1 addition & 0 deletions dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ void SGCannon::OnStartup(Entity* self) {
if (simplePhysicsComponent != nullptr) {
simplePhysicsComponent->SetPhysicsMotionState(5);
}
Game::entityManager->SerializeEntity(self);
}

void SGCannon::OnPlayerLoaded(Entity* self, Entity* player) {
Expand Down

0 comments on commit 1f6a8d1

Please sign in to comment.