diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 73e206f..e7cd9d4 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -213,7 +213,7 @@ public class PlayerInstance(PlayerGameData data) Data.ShowItems[index - 1] = itemId; } - private static uint ToPackedAttrKey(uint gid, uint sid) + public uint ToPackedAttrKey(uint gid, uint sid) { if (gid == 0) return sid; @@ -221,7 +221,7 @@ public class PlayerInstance(PlayerGameData data) return (gid * 10000) + sid; } - private static uint ToShiftedAttrKey(uint gid, uint sid) + public uint ToShiftedAttrKey(uint gid, uint sid) { if (gid == 0) return sid; @@ -272,6 +272,9 @@ public class PlayerInstance(PlayerGameData data) yield return (21, levelId, 7); yield return (22, levelId, 1_700_000_000); } + + // Main Scene 0 mean default scene + yield return (132, 1, 0); } #endregion } \ No newline at end of file diff --git a/GameServer/Server/CallGS/Handlers/Scene/ChangeMainScene.cs b/GameServer/Server/CallGS/Handlers/Scene/ChangeMainScene.cs index 874b264..09fd335 100644 --- a/GameServer/Server/CallGS/Handlers/Scene/ChangeMainScene.cs +++ b/GameServer/Server/CallGS/Handlers/Scene/ChangeMainScene.cs @@ -1,13 +1,51 @@ -namespace MikuSB.GameServer.Server.CallGS.Handlers.Scene; +using MikuSB.Database.Player; +using MikuSB.Proto; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace MikuSB.GameServer.Server.CallGS.Handlers.Scene; // Response:{sErr:true or false} [CallGSApi("ChangeMainScene")] public class ChangeMainScene : ICallGSHandler { + private const int MainSceneGID = 132; + private const int MainSceneSID = 1; + public async Task Handle(Connection connection, string param, ushort seqNo) { string rsp = $"{{\"sErr\":false}}"; - // TODO change scene with ExtraSync - await CallGSRouter.SendScript(connection, "ChangeMainScene", rsp); + var req = JsonSerializer.Deserialize(param); + if (req == null) + { + await CallGSRouter.SendScript(connection, "ChangeMainScene", rsp); + return; + } + + var player = connection.Player!; + var mainSceneAttr = player.Data.Attrs + .FirstOrDefault(x => x.Gid == MainSceneGID && x.Sid == MainSceneSID); + + if (mainSceneAttr == null) + { + mainSceneAttr = new PlayerAttr + { + Gid = MainSceneGID, + Sid = MainSceneSID + }; + player.Data.Attrs.Add(mainSceneAttr); + } + var sync = new NtfSyncPlayer(); + mainSceneAttr.Val = req.Id; + + sync.Custom[player.ToPackedAttrKey(MainSceneGID, MainSceneSID)] = mainSceneAttr.Val; + sync.Custom[player.ToShiftedAttrKey(MainSceneGID, MainSceneSID)] = mainSceneAttr.Val; + await CallGSRouter.SendScript(connection, "ChangeMainScene", rsp, sync); } +} + +internal sealed class ChangeMainSceneParam +{ + [JsonPropertyName("nId")] + public uint Id { get; set; } } \ No newline at end of file