diff --git a/Campofinale/Packets/Cs/HandleCsSceneLoadFinish.cs b/Campofinale/Packets/Cs/HandleCsSceneLoadFinish.cs index c392d95..2b3da13 100644 --- a/Campofinale/Packets/Cs/HandleCsSceneLoadFinish.cs +++ b/Campofinale/Packets/Cs/HandleCsSceneLoadFinish.cs @@ -13,11 +13,10 @@ namespace Campofinale.Packets.Cs { CsSceneLoadFinish req = packet.DecodeBody(); - + session.curSceneNumId=req.SceneNumId; session.Send(new PacketScSelfSceneInfo(session, SelfInfoReasonType.SlrEnterScene)); session.sceneManager.LoadCurrentTeamEntities(); session.sceneManager.LoadCurrent(); - session.LoadFinish = true; if (session.curSceneNumId == 98) { @@ -37,7 +36,7 @@ namespace Campofinale.Packets.Cs } } - session.LoadFinish = true; + session.sceneLoadState = Player.SceneLoadState.OK; } } } diff --git a/Campofinale/Packets/Cs/HandleCsSceneSetLastSafeZone.cs b/Campofinale/Packets/Cs/HandleCsSceneSetLastSafeZone.cs index 30c39d0..e6844db 100644 --- a/Campofinale/Packets/Cs/HandleCsSceneSetLastSafeZone.cs +++ b/Campofinale/Packets/Cs/HandleCsSceneSetLastSafeZone.cs @@ -10,7 +10,12 @@ namespace Campofinale.Packets.Cs public static void Handle(Player session, CsMsgId cmdId, Packet packet) { CsSceneSetLastSafeZone req = packet.DecodeBody(); - + Logger.Print($"Current Scene: {req.SceneNumId}"); + //Change seamlessy scene + if (req.SceneNumId != session.curSceneNumId) + { + session.SeamlessEnterScene(req.SceneNumId); + } } } diff --git a/Campofinale/Packets/Sc/PacketScSelfSceneInfo.cs b/Campofinale/Packets/Sc/PacketScSelfSceneInfo.cs index a07c902..fbb5069 100644 --- a/Campofinale/Packets/Sc/PacketScSelfSceneInfo.cs +++ b/Campofinale/Packets/Sc/PacketScSelfSceneInfo.cs @@ -59,7 +59,10 @@ namespace Campofinale.Packets.Sc sceneInfo.Detail.CharList.Add(session.chars.Find(c => c.guid == m).ToSceneProto()); }); - //Levelscripts here? + if (infoReason == SelfInfoReasonType.SlrSeamlesslyEnterScene) + { + sceneInfo.TeamInfo = null; + } if(infoReason!= SelfInfoReasonType.SlrChangeTeam) ResourceManager.GetLevelData(session.curSceneNumId).levelData.levelScripts.ForEach(l => { diff --git a/Campofinale/Player.cs b/Campofinale/Player.cs index 1511124..f8fb8a6 100644 --- a/Campofinale/Player.cs +++ b/Campofinale/Player.cs @@ -17,6 +17,7 @@ using Campofinale.Game.MissionSys; using Pastel; using System.Drawing; using Campofinale.Game.Adventure; +using static Campofinale.Player; namespace Campofinale @@ -349,7 +350,7 @@ namespace Campofinale { //sceneManager.UnloadCurrent(false); //sceneManager.LoadCurrent(); - LoadFinish = false; + sceneLoadState = SceneLoadState.Loading; Send(new PacketScEnterSceneNotify(this, curSceneNumId)); } if (savedSaveZone == null || savedSaveZone.sceneNumId == 0) @@ -362,7 +363,14 @@ namespace Campofinale }; } } - public bool LoadFinish = true; + public enum SceneLoadState + { + OK=0, + Loading=1, + + } + public SceneLoadState sceneLoadState=0; + // public bool LoadFinish = true; public void EnterScene(int sceneNumId, Vector3f pos, Vector3f rot, PassThroughData passThroughData = null) { // if (!LoadFinish) return; @@ -381,7 +389,7 @@ namespace Campofinale curSceneNumId = sceneNumId; position = pos; rotation = rot; - LoadFinish = false; + sceneLoadState = SceneLoadState.Loading; Send(new PacketScEnterSceneNotify(this, sceneNumId, pos, passThroughData)); //sceneManager.LoadCurrent(); } @@ -390,6 +398,37 @@ namespace Campofinale Logger.PrintError($"Scene {sceneNumId} not found"); } } + /// + /// Seamless Crossing scene is not working, self scene info is not modifying the current scene num id in the client... + /// + /// + public void SeamlessEnterScene(int sceneNumId) + { + if(curSceneNumId != sceneNumId && sceneLoadState == SceneLoadState.OK) + { + sceneLoadState=SceneLoadState.Loading; + curSceneNumId = sceneNumId; + Send(new PacketScSelfSceneInfo(this, SelfInfoReasonType.SlrSeamlesslyEnterScene)); + ScFactoryModifyChapterScene modify = new() + { + ChapterId=GetCurrentChapter(), + SceneId=sceneNumId, + Tms=DateTime.UtcNow.ToUnixTimestampMilliseconds() + }; + Send(ScMsgId.ScFactoryModifyChapterScene, modify); + ScSceneCrossSceneStatus cross = new() + { + ObjId = teams[teamIndex].leader, + SceneNumId = curSceneNumId + }; + Send(ScMsgId.ScSceneCrossSceneStatus, cross); + + + sceneManager.LoadCurrentTeamEntities(); + sceneManager.LoadCurrent(); + sceneLoadState = SceneLoadState.OK; + } + } public void EnterScene(int sceneNumId) { if(GetLevelData(sceneNumId) != null) @@ -410,7 +449,7 @@ namespace Campofinale position = GetLevelData(sceneNumId).playerInitPos; rotation = GetLevelData(sceneNumId).playerInitRot; // sceneManager.LoadCurrent(); - LoadFinish = false; + sceneLoadState = SceneLoadState.Loading; Send(new PacketScEnterSceneNotify(this, sceneNumId)); } @@ -609,7 +648,7 @@ namespace Campofinale if (Initialized) this.Send(new PacketScAdventureBookSync(this)); } - if(LoadFinish) + if(sceneLoadState==0) sceneManager.Update(); factoryManager.Update(); } diff --git a/Campofinale/Server.cs b/Campofinale/Server.cs index 94ea2f4..2daf8a4 100644 --- a/Campofinale/Server.cs +++ b/Campofinale/Server.cs @@ -67,7 +67,7 @@ namespace Campofinale public static Dispatch? dispatch; public static ConfigFile? config; public static List csMessageToHide = new() { CsMsgId.CsMoveObjectMove, CsMsgId.CsBattleOp,CsMsgId.CsPing }; - public static List scMessageToHide = new() { ScMsgId.ScMoveObjectMove, ScMsgId.ScPing }; + public static List scMessageToHide = new() { ScMsgId.ScMoveObjectMove, ScMsgId.ScPing,ScMsgId.ScObjectEnterView }; public void Start(ConfigFile config) { {