From bb6973e4cd284d4ee2e4afcb695c7cf5b0e062d0 Mon Sep 17 00:00:00 2001 From: StopWuyu Date: Fri, 30 May 2025 23:18:11 +0800 Subject: [PATCH] feat: scene component --- .../Scene/Component/BaseSceneComponent.cs | 7 +++ .../Component/EraFlipperSceneComponent.cs | 60 +++++++++++++++++++ .../RotatableRegionSceneComponent.cs | 10 ++++ .../HandlerChangeEraFlipperDataCsReq.cs | 11 +++- .../PacketChangeEraFlipperDataScRsp.cs | 10 ++++ .../PacketEnterEraFlipperRegionScRsp.cs | 10 ++++ .../PacketEraFlipperDataChangeScNotify.cs | 22 +++++++ .../PacketGetEraFlipperDataScRsp.cs | 15 ++++- .../PacketResetEraFlipperDataScRsp.cs | 37 ++++++++++++ 9 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 GameServer/Game/Scene/Component/BaseSceneComponent.cs create mode 100644 GameServer/Game/Scene/Component/EraFlipperSceneComponent.cs create mode 100644 GameServer/Game/Scene/Component/RotatableRegionSceneComponent.cs create mode 100644 GameServer/Server/Packet/Send/EraFlipper/PacketResetEraFlipperDataScRsp.cs diff --git a/GameServer/Game/Scene/Component/BaseSceneComponent.cs b/GameServer/Game/Scene/Component/BaseSceneComponent.cs new file mode 100644 index 00000000..62db8b61 --- /dev/null +++ b/GameServer/Game/Scene/Component/BaseSceneComponent.cs @@ -0,0 +1,7 @@ +namespace EggLink.DanhengServer.GameServer.Game.Scene.Component; + +public abstract class BaseSceneComponent(SceneInstance scene) +{ + public SceneInstance SceneInst { get; } = scene; + public abstract ValueTask Initialize(); +} \ No newline at end of file diff --git a/GameServer/Game/Scene/Component/EraFlipperSceneComponent.cs b/GameServer/Game/Scene/Component/EraFlipperSceneComponent.cs new file mode 100644 index 00000000..7134144d --- /dev/null +++ b/GameServer/Game/Scene/Component/EraFlipperSceneComponent.cs @@ -0,0 +1,60 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Game.Scene.Component; + +public class EraFlipperSceneComponent(SceneInstance scene) : BaseSceneComponent(scene) +{ + public int CurRegionId { get; set; } + public int RegionState { get; set; } + + public override async ValueTask Initialize() + { + CurRegionId = SceneInst.Player.SceneData!.EraFlipperData.CurRegionId; + if (CurRegionId != 0) + { + RegionState = SceneInst.Player.SceneData!.EraFlipperData.RegionState.GetValueOrDefault(CurRegionId, 0); + + await SceneInst.Player.SendPacket( + new PacketEraFlipperDataChangeScNotify(SceneInst.FloorId, CurRegionId, RegionState)); + } + } + + public void EnterEraFlipperRegion(int regionId, int state) + { + CurRegionId = regionId; + RegionState = state; + + SceneInst.Player.SceneData!.EraFlipperData.CurRegionId = regionId; + SceneInst.Player.SceneData!.EraFlipperData.RegionState[CurRegionId] = state; + } + + public void LeaveFlipperRegion() + { + CurRegionId = 0; + RegionState = 0; + + SceneInst.Player.SceneData!.EraFlipperData.CurRegionId = 0; + } + + public void ChangeEraFlipperState(int state) + { + if (CurRegionId == 0) return; + RegionState = state; + + // save + SceneInst.Player.SceneData!.EraFlipperData.RegionState[CurRegionId] = state; + } + + public void ChangeEraFlipperStates(List dataList) + { + foreach (var data in dataList) + { + SceneInst.Player.SceneData!.EraFlipperData.RegionState[(int)data.EraFlipperRegionId] = (int)data.State; + if (data.EraFlipperRegionId == CurRegionId) + { + RegionState = (int)data.State; + } + } + } +} \ No newline at end of file diff --git a/GameServer/Game/Scene/Component/RotatableRegionSceneComponent.cs b/GameServer/Game/Scene/Component/RotatableRegionSceneComponent.cs new file mode 100644 index 00000000..20e40dd7 --- /dev/null +++ b/GameServer/Game/Scene/Component/RotatableRegionSceneComponent.cs @@ -0,0 +1,10 @@ +namespace EggLink.DanhengServer.GameServer.Game.Scene.Component; + +public class RotatableRegionSceneComponent(SceneInstance scene) : BaseSceneComponent(scene) +{ + public override async ValueTask Initialize() + { + // TODO + await ValueTask.CompletedTask; + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/EraFlipper/HandlerChangeEraFlipperDataCsReq.cs b/GameServer/Server/Packet/Recv/EraFlipper/HandlerChangeEraFlipperDataCsReq.cs index 3f318770..9588f2aa 100644 --- a/GameServer/Server/Packet/Recv/EraFlipper/HandlerChangeEraFlipperDataCsReq.cs +++ b/GameServer/Server/Packet/Recv/EraFlipper/HandlerChangeEraFlipperDataCsReq.cs @@ -1,4 +1,5 @@ using EggLink.DanhengServer.Enums.Mission; +using EggLink.DanhengServer.GameServer.Game.Scene.Component; using EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene; using EggLink.DanhengServer.Kcp; @@ -13,9 +14,14 @@ public class HandlerChangeEraFlipperDataCsReq : Handler { var req = ChangeEraFlipperDataCsReq.Parser.ParseFrom(data); - var floorId = connection.Player!.SceneInstance!.FloorId; + var component = connection.Player!.SceneInstance!.GetComponent(); + if (component == null) + { + await connection.SendPacket(new PacketChangeEraFlipperDataScRsp(Retcode.RetAdventureMapNotExist)); + return; + } - if (connection.Player.SceneInstance.FloorInfo?.FloorSavedValue.Find(x => x.Name == "FSV_FlashBackCount") != + if (connection.Player!.SceneInstance!.FloorInfo?.FloorSavedValue.Find(x => x.Name == "FSV_FlashBackCount") != null) { // should save @@ -38,6 +44,7 @@ public class HandlerChangeEraFlipperDataCsReq : Handler connection.Player.MissionManager?.HandleFinishType(MissionFinishTypeEnum.FloorSavedValue); } + component.ChangeEraFlipperStates(req.Data.EraFlipperDataList_.ToList()); await connection.SendPacket(new PacketChangeEraFlipperDataScRsp(req)); //await connection.SendPacket(new PacketEraFlipperDataChangeScNotify(req, floorId)); } diff --git a/GameServer/Server/Packet/Send/EraFlipper/PacketChangeEraFlipperDataScRsp.cs b/GameServer/Server/Packet/Send/EraFlipper/PacketChangeEraFlipperDataScRsp.cs index 6e789f7d..8cb90516 100644 --- a/GameServer/Server/Packet/Send/EraFlipper/PacketChangeEraFlipperDataScRsp.cs +++ b/GameServer/Server/Packet/Send/EraFlipper/PacketChangeEraFlipperDataScRsp.cs @@ -14,4 +14,14 @@ public class PacketChangeEraFlipperDataScRsp : BasePacket SetData(proto); } + + public PacketChangeEraFlipperDataScRsp(Retcode code) : base(CmdIds.ChangeEraFlipperDataScRsp) + { + var proto = new ChangeEraFlipperDataScRsp + { + Retcode = (uint)code + }; + + SetData(proto); + } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/EraFlipper/PacketEnterEraFlipperRegionScRsp.cs b/GameServer/Server/Packet/Send/EraFlipper/PacketEnterEraFlipperRegionScRsp.cs index 7d1aa0c3..9b9a88e5 100644 --- a/GameServer/Server/Packet/Send/EraFlipper/PacketEnterEraFlipperRegionScRsp.cs +++ b/GameServer/Server/Packet/Send/EraFlipper/PacketEnterEraFlipperRegionScRsp.cs @@ -14,4 +14,14 @@ public class PacketEnterEraFlipperRegionScRsp : BasePacket SetData(proto); } + + public PacketEnterEraFlipperRegionScRsp(Retcode code) : base(CmdIds.EnterEraFlipperRegionScRsp) + { + var proto = new EnterEraFlipperRegionScRsp + { + Retcode = (uint)code + }; + + SetData(proto); + } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/EraFlipper/PacketEraFlipperDataChangeScNotify.cs b/GameServer/Server/Packet/Send/EraFlipper/PacketEraFlipperDataChangeScNotify.cs index 23eb7253..d2592984 100644 --- a/GameServer/Server/Packet/Send/EraFlipper/PacketEraFlipperDataChangeScNotify.cs +++ b/GameServer/Server/Packet/Send/EraFlipper/PacketEraFlipperDataChangeScNotify.cs @@ -17,6 +17,28 @@ public class PacketEraFlipperDataChangeScNotify : BasePacket SetData(proto); } + public PacketEraFlipperDataChangeScNotify(int floorId, int regionId, int state) : base( + CmdIds.EraFlipperDataChangeScNotify) + { + var proto = new EraFlipperDataChangeScNotify + { + Data = new EraFlipperDataList + { + EraFlipperDataList_ = + { + new EraFlipperData + { + EraFlipperRegionId = (uint)regionId, + State = (uint)state + } + } + }, + FloorId = (uint)floorId + }; + + SetData(proto); + } + public PacketEraFlipperDataChangeScNotify(int floorId) : base(CmdIds.EraFlipperDataChangeScNotify) { var proto = new EraFlipperDataChangeScNotify diff --git a/GameServer/Server/Packet/Send/EraFlipper/PacketGetEraFlipperDataScRsp.cs b/GameServer/Server/Packet/Send/EraFlipper/PacketGetEraFlipperDataScRsp.cs index 191c868e..102103b6 100644 --- a/GameServer/Server/Packet/Send/EraFlipper/PacketGetEraFlipperDataScRsp.cs +++ b/GameServer/Server/Packet/Send/EraFlipper/PacketGetEraFlipperDataScRsp.cs @@ -8,7 +8,20 @@ public class PacketGetEraFlipperDataScRsp : BasePacket { public PacketGetEraFlipperDataScRsp(PlayerInstance player) : base(CmdIds.GetEraFlipperDataScRsp) { - var proto = new GetEraFlipperDataScRsp(); + var proto = new GetEraFlipperDataScRsp + { + Data = new EraFlipperDataList + { + EraFlipperDataList_ = + { + player.SceneData!.EraFlipperData.RegionState.Select(x => new EraFlipperData + { + EraFlipperRegionId = (uint)x.Key, + State = (uint)x.Value + }) + } + } + }; SetData(proto); } diff --git a/GameServer/Server/Packet/Send/EraFlipper/PacketResetEraFlipperDataScRsp.cs b/GameServer/Server/Packet/Send/EraFlipper/PacketResetEraFlipperDataScRsp.cs new file mode 100644 index 00000000..90a05b1a --- /dev/null +++ b/GameServer/Server/Packet/Send/EraFlipper/PacketResetEraFlipperDataScRsp.cs @@ -0,0 +1,37 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; + +public class PacketResetEraFlipperDataScRsp : BasePacket +{ + public PacketResetEraFlipperDataScRsp(int regionId, int state, bool leave) : base(CmdIds.ResetEraFlipperDataScRsp) + { + var proto = new ResetEraFlipperDataScRsp + { + Data = new EraFlipperDataList + { + EraFlipperDataList_ = + { + new EraFlipperData + { + EraFlipperRegionId = (uint)regionId, + State = (uint)state + } + } + }, + PAHMAGPFDDJ = leave + }; + + SetData(proto); + } + + public PacketResetEraFlipperDataScRsp(Retcode code) : base(CmdIds.ResetEraFlipperDataScRsp) + { + var proto = new ResetEraFlipperDataScRsp + { + Retcode = (uint)code + }; + SetData(proto); + } +} \ No newline at end of file