mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-11-06 20:07:13 +00:00
fix: write model behaviors only for property and inventory models
The client makes the mutable model component, which reads the behaviors and editing info, only when the object's config has propertyObjectID or inInventory (ObjectLoader2::LoadModelBehaviorsComponent); every other model gets the plain one, which reads only the model block. Writing the behaviors for every model made the client read them as the next component's data. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
55
tests/dGameTests/dComponentsTests/ModelComponentTests.cpp
Normal file
55
tests/dGameTests/dComponentsTests/ModelComponentTests.cpp
Normal file
@@ -0,0 +1,55 @@
|
||||
#include "GameDependencies.h"
|
||||
|
||||
#include "BitStream.h"
|
||||
#include "CDClientManager.h"
|
||||
#include "CDComponentsRegistryTable.h"
|
||||
#include "Entity.h"
|
||||
#include "GameMessages.h"
|
||||
#include "ModelComponent.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
class ModelComponentTests : public GameDependenciesTest {
|
||||
protected:
|
||||
void SetUp() override {
|
||||
SetUpDependencies();
|
||||
CDClientManager::GetEntriesMutable<CDComponentsRegistryTable>().insert_or_assign(static_cast<uint64_t>(info.lot), 0);
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
TearDownDependencies();
|
||||
}
|
||||
|
||||
// The bits a model's serialization writes
|
||||
static uint32_t SerializedBits(Entity& entity) {
|
||||
auto* model = entity.AddComponent<ModelComponent>(-1);
|
||||
RakNet::BitStream bitStream;
|
||||
model->Serialize(bitStream, true);
|
||||
return bitStream.GetNumberOfBitsUsed();
|
||||
}
|
||||
};
|
||||
|
||||
// Item block (1 + 64 + 32 + 1), model block (1 + 1 + 32 + 96 + 128)
|
||||
constexpr uint32_t ModelBlockBits = 98 + 258;
|
||||
// Behavior info: flag, count, paused, and on the initial update the editing info flag
|
||||
constexpr uint32_t BehaviorBits = 1 + 32 + 1 + 1;
|
||||
|
||||
// The client reads the behaviors only for property and inventory models (ObjectLoader2::LoadModelBehaviorsComponent)
|
||||
TEST_F(ModelComponentTests, OtherModelsHaveNoBehaviorInfo) {
|
||||
Entity entity(1, info);
|
||||
EXPECT_EQ(SerializedBits(entity), ModelBlockBits);
|
||||
}
|
||||
|
||||
TEST_F(ModelComponentTests, PropertyModelsHaveBehaviorInfo) {
|
||||
EntityInfo propertyInfo = info;
|
||||
propertyInfo.settings.Insert<bool>(u"propertyObjectID", true);
|
||||
Entity entity(1, propertyInfo);
|
||||
EXPECT_EQ(SerializedBits(entity), ModelBlockBits + BehaviorBits);
|
||||
}
|
||||
|
||||
TEST_F(ModelComponentTests, InventoryModelsHaveBehaviorInfo) {
|
||||
EntityInfo inventoryInfo = info;
|
||||
inventoryInfo.settings.Insert<bool>(u"inInventory", true);
|
||||
Entity entity(1, inventoryInfo);
|
||||
EXPECT_EQ(SerializedBits(entity), ModelBlockBits + BehaviorBits);
|
||||
}
|
||||
Reference in New Issue
Block a user