mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-11-08 21:07:14 +00:00
fix: split and adjust scene object config as the client does
LwoNameValue::FromString (0x010fa220) splits a config at every comma and line break and leaves out entries without a '='; the world split only at line breaks. Objects and sounds are now split the client's way. ReadLvlObjectData (0x0103ba20) also adjusts an object's config as it loads it, and now so does the world: - before version 47 a respawn time was in milliseconds: a float over 100, or any u32, becomes seconds (a float); - a model spawner (LOT 176 spawning template 14) gets its blueprint from its subkey unless it has one, behaviors off unless it says otherwise, and no render wrapping; - before version 44 an object that overrides its scene goes to layer 0 of the scene it names. Check in game: every world spawns its objects as before; spawner respawn times are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -271,6 +271,32 @@ TEST_F(LevelTests, ReadsEveryPartOfAChunkedFile) {
|
||||
EXPECT_TRUE(level.GetSounds().empty());
|
||||
}
|
||||
|
||||
// LwoNameValue::FromString splits at commas and line breaks and leaves out entries without a '='; ReadLvlObjectData
|
||||
// adjusts some values as it loads the object
|
||||
TEST_F(LevelTests, ObjectConfigIsReadAndAdjustedAsTheClientDoes) {
|
||||
const auto level = Read(WriteChunked(43));
|
||||
ASSERT_EQ(level.GetObjects().size(), 3);
|
||||
|
||||
const auto& spawner = level.GetObjects()[0].settings;
|
||||
ASSERT_NE(spawner.find(u"blueprintid"), spawner.end());
|
||||
EXPECT_EQ(spawner.find(u"blueprintid")->second->GetValueAsString(), "55");
|
||||
EXPECT_EQ(spawner.find(u"DisableModelBehaviors")->second->GetValueAsString(), "1");
|
||||
EXPECT_EQ(spawner.find(u"preventRenderWrapping")->second->GetValueAsString(), "1");
|
||||
// A float respawn over 100 was milliseconds
|
||||
EXPECT_EQ(spawner.find(u"respawn")->second->GetValueType(), LDF_TYPE_FLOAT);
|
||||
EXPECT_FLOAT_EQ(static_cast<const LDFData<float>*>(spawner.find(u"respawn")->second.get())->GetValue(), 250.0f * 0.001f);
|
||||
|
||||
const auto& overridden = level.GetObjects()[2].settings;
|
||||
EXPECT_EQ(overridden.values.size(), 2); // the entry without a '=' is left out
|
||||
ASSERT_NE(overridden.find(u"sceneLayerIDOverride"), overridden.end());
|
||||
EXPECT_EQ(overridden.find(u"sceneLayerIDOverride")->second->GetValueAsString(), "0");
|
||||
|
||||
// From version 47 a respawn is in seconds already, and from 44 the scene override stays
|
||||
const auto newer = Read(WriteChunked(47));
|
||||
EXPECT_FLOAT_EQ(static_cast<const LDFData<float>*>(newer.GetObjects()[0].settings.find(u"respawn")->second.get())->GetValue(), 250.0f);
|
||||
EXPECT_EQ(newer.GetObjects()[2].settings.find(u"sceneLayerIDOverride"), newer.GetObjects()[2].settings.end());
|
||||
}
|
||||
|
||||
TEST_F(LevelTests, ReadsAFileFromBeforeChunks) {
|
||||
const auto level = Read(WriteFlat(40));
|
||||
EXPECT_EQ(level.GetVersion(), 40);
|
||||
@@ -285,6 +311,10 @@ TEST_F(LevelTests, ReadsAFileFromBeforeChunks) {
|
||||
EXPECT_EQ(level.GetEditorColors().size(), 2);
|
||||
|
||||
ASSERT_EQ(level.GetObjects().size(), 1);
|
||||
// Before version 47 a u32 respawn is milliseconds; it becomes seconds
|
||||
const auto& respawn = level.GetObjects()[0].settings.find(u"respawn")->second;
|
||||
EXPECT_EQ(respawn->GetValueType(), LDF_TYPE_FLOAT);
|
||||
EXPECT_FLOAT_EQ(static_cast<const LDFData<float>*>(respawn.get())->GetValue(), 20.0f);
|
||||
|
||||
ASSERT_EQ(level.GetSounds().size(), 2);
|
||||
EXPECT_FLOAT_EQ(level.GetSounds()[1].position.z, 13.0f);
|
||||
|
||||
Reference in New Issue
Block a user