diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index bc5e3ab51..cd2b27a32 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -718,21 +718,24 @@ namespace Game.Entities if (flags.ActivePlayer) { - bool HasSceneInstanceIDs = false; + Player player = ToPlayer(); + + bool HasSceneInstanceIDs = !player.GetSceneMgr().GetSceneTemplateByInstanceMap().Empty(); bool HasRuneState = ToUnit().GetPowerIndex(PowerType.Runes) != (int)PowerType.Max; data.WriteBit(HasSceneInstanceIDs); data.WriteBit(HasRuneState); data.FlushBits(); - //if (HasSceneInstanceIDs) - //{ - // *data << uint(SceneInstanceIDs.size()); - // for (std::size_t i = 0; i < SceneInstanceIDs.size(); ++i) - // *data << uint(SceneInstanceIDs[i]); - //} + + if (HasSceneInstanceIDs) + { + data.WriteInt32(player.GetSceneMgr().GetSceneTemplateByInstanceMap().Count); + foreach (var pair in player.GetSceneMgr().GetSceneTemplateByInstanceMap()) + data.WriteUInt32(pair.Key); + } + if (HasRuneState) { - Player player = ToPlayer(); float baseCd = player.GetRuneBaseCooldown(); uint maxRunes = (uint)player.GetMaxPower(PowerType.Runes); diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index ae0c0f586..727819b9e 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -5655,6 +5655,8 @@ namespace Game.Entities else ClearQuestSharingInfo(); } + + GetSceneMgr().TriggerDelayedScenes(); } public void RemoveSocial() diff --git a/Source/Game/Entities/Player/SceneMgr.cs b/Source/Game/Entities/Player/SceneMgr.cs index cc272ddcc..b9cbd39be 100644 --- a/Source/Game/Entities/Player/SceneMgr.cs +++ b/Source/Game/Entities/Player/SceneMgr.cs @@ -17,6 +17,7 @@ using Framework.Constants; using Game.DataStorage; +using Game.Networking; using Game.Networking.Packets; using System; using System.Collections.Generic; @@ -28,6 +29,7 @@ namespace Game.Entities Player _player; Dictionary _scenesByInstance = new(); uint _standaloneSceneInstanceID; + List _delayedScenes = new(); bool _isDebuggingScenes; public SceneMgr(Player player) @@ -69,8 +71,12 @@ namespace Game.Entities playScene.Location = position; playScene.TransportGUID = GetPlayer().GetTransGUID(); playScene.Encrypted = sceneTemplate.Encrypted; + playScene.Write(); - GetPlayer().SendPacket(playScene); + if (GetPlayer().IsInWorld) + GetPlayer().SendPacket(playScene); + else + _delayedScenes.Add(playScene); AddInstanceIdToSceneMap(sceneInstanceID, sceneTemplate); @@ -230,6 +236,14 @@ namespace Game.Entities return activeSceneCount; } + public void TriggerDelayedScenes() + { + foreach (var playScene in _delayedScenes) + GetPlayer().SendPacket(playScene); + + _delayedScenes.Clear(); + } + Player GetPlayer() { return _player; } void RecreateScene(uint sceneScriptPackageId, SceneFlags playbackflags = SceneFlags.Unk16, Position position = null)