Core/Scenes: Delay scenes sent when not in world until adding to map
Port From (https://github.com/TrinityCore/TrinityCore/commit/6d93f0a5f79c5465341a850279466ce36232e72e)
This commit is contained in:
@@ -718,21 +718,24 @@ namespace Game.Entities
|
|||||||
|
|
||||||
if (flags.ActivePlayer)
|
if (flags.ActivePlayer)
|
||||||
{
|
{
|
||||||
bool HasSceneInstanceIDs = false;
|
Player player = ToPlayer();
|
||||||
|
|
||||||
|
bool HasSceneInstanceIDs = !player.GetSceneMgr().GetSceneTemplateByInstanceMap().Empty();
|
||||||
bool HasRuneState = ToUnit().GetPowerIndex(PowerType.Runes) != (int)PowerType.Max;
|
bool HasRuneState = ToUnit().GetPowerIndex(PowerType.Runes) != (int)PowerType.Max;
|
||||||
|
|
||||||
data.WriteBit(HasSceneInstanceIDs);
|
data.WriteBit(HasSceneInstanceIDs);
|
||||||
data.WriteBit(HasRuneState);
|
data.WriteBit(HasRuneState);
|
||||||
data.FlushBits();
|
data.FlushBits();
|
||||||
//if (HasSceneInstanceIDs)
|
|
||||||
//{
|
if (HasSceneInstanceIDs)
|
||||||
// *data << uint(SceneInstanceIDs.size());
|
{
|
||||||
// for (std::size_t i = 0; i < SceneInstanceIDs.size(); ++i)
|
data.WriteInt32(player.GetSceneMgr().GetSceneTemplateByInstanceMap().Count);
|
||||||
// *data << uint(SceneInstanceIDs[i]);
|
foreach (var pair in player.GetSceneMgr().GetSceneTemplateByInstanceMap())
|
||||||
//}
|
data.WriteUInt32(pair.Key);
|
||||||
|
}
|
||||||
|
|
||||||
if (HasRuneState)
|
if (HasRuneState)
|
||||||
{
|
{
|
||||||
Player player = ToPlayer();
|
|
||||||
float baseCd = player.GetRuneBaseCooldown();
|
float baseCd = player.GetRuneBaseCooldown();
|
||||||
uint maxRunes = (uint)player.GetMaxPower(PowerType.Runes);
|
uint maxRunes = (uint)player.GetMaxPower(PowerType.Runes);
|
||||||
|
|
||||||
|
|||||||
@@ -5655,6 +5655,8 @@ namespace Game.Entities
|
|||||||
else
|
else
|
||||||
ClearQuestSharingInfo();
|
ClearQuestSharingInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GetSceneMgr().TriggerDelayedScenes();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveSocial()
|
public void RemoveSocial()
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
using Framework.Constants;
|
using Framework.Constants;
|
||||||
using Game.DataStorage;
|
using Game.DataStorage;
|
||||||
|
using Game.Networking;
|
||||||
using Game.Networking.Packets;
|
using Game.Networking.Packets;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -28,6 +29,7 @@ namespace Game.Entities
|
|||||||
Player _player;
|
Player _player;
|
||||||
Dictionary<uint, SceneTemplate> _scenesByInstance = new();
|
Dictionary<uint, SceneTemplate> _scenesByInstance = new();
|
||||||
uint _standaloneSceneInstanceID;
|
uint _standaloneSceneInstanceID;
|
||||||
|
List<ServerPacket> _delayedScenes = new();
|
||||||
bool _isDebuggingScenes;
|
bool _isDebuggingScenes;
|
||||||
|
|
||||||
public SceneMgr(Player player)
|
public SceneMgr(Player player)
|
||||||
@@ -69,8 +71,12 @@ namespace Game.Entities
|
|||||||
playScene.Location = position;
|
playScene.Location = position;
|
||||||
playScene.TransportGUID = GetPlayer().GetTransGUID();
|
playScene.TransportGUID = GetPlayer().GetTransGUID();
|
||||||
playScene.Encrypted = sceneTemplate.Encrypted;
|
playScene.Encrypted = sceneTemplate.Encrypted;
|
||||||
|
playScene.Write();
|
||||||
|
|
||||||
GetPlayer().SendPacket(playScene);
|
if (GetPlayer().IsInWorld)
|
||||||
|
GetPlayer().SendPacket(playScene);
|
||||||
|
else
|
||||||
|
_delayedScenes.Add(playScene);
|
||||||
|
|
||||||
AddInstanceIdToSceneMap(sceneInstanceID, sceneTemplate);
|
AddInstanceIdToSceneMap(sceneInstanceID, sceneTemplate);
|
||||||
|
|
||||||
@@ -230,6 +236,14 @@ namespace Game.Entities
|
|||||||
return activeSceneCount;
|
return activeSceneCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void TriggerDelayedScenes()
|
||||||
|
{
|
||||||
|
foreach (var playScene in _delayedScenes)
|
||||||
|
GetPlayer().SendPacket(playScene);
|
||||||
|
|
||||||
|
_delayedScenes.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
Player GetPlayer() { return _player; }
|
Player GetPlayer() { return _player; }
|
||||||
|
|
||||||
void RecreateScene(uint sceneScriptPackageId, SceneFlags playbackflags = SceneFlags.Unk16, Position position = null)
|
void RecreateScene(uint sceneScriptPackageId, SceneFlags playbackflags = SceneFlags.Unk16, Position position = null)
|
||||||
|
|||||||
Reference in New Issue
Block a user