mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-16 09:34:08 +00:00
feat: scene ghosting, as the client streams a zone's scenes
The client keeps the scene under the player loaded, the scenes the zone file's transitions connect to it, and the global scene (Zone::StreamScenesAroundPosition 0x0108a3f0, TerrainManager::GetSceneAtPos 0x01069010, the connected scenes at 0x01066500; transitions naming a missing scene dropped as Zone::FixupInvalidTransitions 0x010842e0 does). - ZoneScenes (dCommon): the terrain's scene map lookup and the scene graph, shared by the world server and the dashboard. - Objects remember the scene they were placed in (spawners pass theirs on). - ghosting_scenes=1 (world config, off by default): players get the objects of their loaded scenes instead of the ones within the ghosting distances; objects from no scene go by the scene under them. Zones without a scene map keep distance ghosting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
27
tests/dGameTests/SceneGhostingTests.cpp
Normal file
27
tests/dGameTests/SceneGhostingTests.cpp
Normal file
@@ -0,0 +1,27 @@
|
||||
#include "GameDependencies.h"
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "Entity.h"
|
||||
#include "ZoneScenes.h"
|
||||
|
||||
class SceneGhostingTest : public GameDependenciesTest {
|
||||
protected:
|
||||
void SetUp() override { SetUpDependencies(); }
|
||||
void TearDown() override { TearDownDependencies(); }
|
||||
};
|
||||
|
||||
// Objects keep the scene they were placed in, which scene ghosting goes by; objects from no scene go by their position
|
||||
TEST_F(SceneGhostingTest, EntitiesKeepTheirScene) {
|
||||
EntityInfo placed = info;
|
||||
placed.scene = 12;
|
||||
const auto fromScene = std::make_unique<Entity>(20, placed);
|
||||
EXPECT_EQ(fromScene->GetScene(), 12);
|
||||
const auto spawned = std::make_unique<Entity>(21, info);
|
||||
EXPECT_EQ(spawned->GetScene(), -1);
|
||||
|
||||
// A player standing in scene 3, whose client keeps 0, 3 and 5 loaded
|
||||
const std::set<uint32_t> loaded{ 0, 3, 5 };
|
||||
EXPECT_FALSE(ZoneScenes::InLoadedScene(fromScene->GetScene(), 3, loaded)); // placed in scene 12, though it stands in 3
|
||||
EXPECT_TRUE(ZoneScenes::InLoadedScene(spawned->GetScene(), 5, loaded));
|
||||
EXPECT_FALSE(ZoneScenes::InLoadedScene(spawned->GetScene(), 12, loaded));
|
||||
}
|
||||
Reference in New Issue
Block a user