feat: scene component

This commit is contained in:
StopWuyu
2025-05-30 23:18:11 +08:00
parent b02a403e06
commit bb6973e4cd
9 changed files with 179 additions and 3 deletions

View File

@@ -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();
}

View File

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

View File

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

View File

@@ -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<EraFlipperSceneComponent>();
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));
}

View File

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

View File

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

View File

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

View File

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

View File

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