Player.SeamlessEnterScene (not working...)

This commit is contained in:
AlessandroCH
2025-07-26 23:13:48 +02:00
parent bb7c9831b4
commit 775baf5c3b
5 changed files with 57 additions and 11 deletions

View File

@@ -13,11 +13,10 @@ namespace Campofinale.Packets.Cs
{
CsSceneLoadFinish req = packet.DecodeBody<CsSceneLoadFinish>();
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;
}
}
}

View File

@@ -10,7 +10,12 @@ namespace Campofinale.Packets.Cs
public static void Handle(Player session, CsMsgId cmdId, Packet packet)
{
CsSceneSetLastSafeZone req = packet.DecodeBody<CsSceneSetLastSafeZone>();
Logger.Print($"Current Scene: {req.SceneNumId}");
//Change seamlessy scene
if (req.SceneNumId != session.curSceneNumId)
{
session.SeamlessEnterScene(req.SceneNumId);
}
}
}

View File

@@ -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 =>
{

View File

@@ -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");
}
}
/// <summary>
/// Seamless Crossing scene is not working, self scene info is not modifying the current scene num id in the client...
/// </summary>
/// <param name="sceneNumId"></param>
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();
}

View File

@@ -67,7 +67,7 @@ namespace Campofinale
public static Dispatch? dispatch;
public static ConfigFile? config;
public static List<CsMsgId> csMessageToHide = new() { CsMsgId.CsMoveObjectMove, CsMsgId.CsBattleOp,CsMsgId.CsPing };
public static List<ScMsgId> scMessageToHide = new() { ScMsgId.ScMoveObjectMove, ScMsgId.ScPing };
public static List<ScMsgId> scMessageToHide = new() { ScMsgId.ScMoveObjectMove, ScMsgId.ScPing,ScMsgId.ScObjectEnterView };
public void Start(ConfigFile config)
{
{