change main scene work now

This commit is contained in:
Naruse
2026-04-26 19:36:11 +08:00
parent c9fad34a61
commit dda5d3d7d7
2 changed files with 46 additions and 5 deletions

View File

@@ -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
}

View File

@@ -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
var req = JsonSerializer.Deserialize<ChangeMainSceneParam>(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; }
}