diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 601c375b..7e2bd4a2 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -821,7 +821,7 @@ public class PlayerInstance(PlayerData data) Data.Pos = pos; Data.Rot = rot; var notSendMove = true; - if (planeId != Data.PlaneId || floorId != Data.FloorId || entryId != Data.EntryId) + if (planeId != Data.PlaneId || floorId != Data.FloorId || entryId != Data.EntryId || !mapTp) { SceneInstance instance = new(this, plane, floorId, entryId); InvokeOnPlayerLoadScene(this, instance); diff --git a/GameServer/Game/Scene/SceneEntityLoader.cs b/GameServer/Game/Scene/SceneEntityLoader.cs index fa5b34cc..ae193fb5 100644 --- a/GameServer/Game/Scene/SceneEntityLoader.cs +++ b/GameServer/Game/Scene/SceneEntityLoader.cs @@ -252,7 +252,7 @@ public class SceneEntityLoader(SceneInstance scene) if (info.IsClientOnly || info.IsDelete || !info.LoadOnInitial) return null; GameData.MazePropData.TryGetValue(info.PropID, out var excel); - if (excel == null) return null; + if (excel == null) return null; var prop = new EntityProp(Scene, excel, group, info); @@ -294,13 +294,15 @@ public class SceneEntityLoader(SceneInstance scene) { if (prop.PropInfo.MappingInfoID != 2220) return prop; await prop.SetState(PropStateEnum.Open); - await Scene.AddEntity(prop, sendPacket); } - else + + if (prop.PropInfo.PropID == 104006) { - await Scene.AddEntity(prop, sendPacket); + await prop.SetState(PropStateEnum.Open); } + await Scene.AddEntity(prop, sendPacket); + return prop; } } \ No newline at end of file diff --git a/GameServer/Game/Scene/SceneInstance.cs b/GameServer/Game/Scene/SceneInstance.cs index cfa23a3d..b935785a 100644 --- a/GameServer/Game/Scene/SceneInstance.cs +++ b/GameServer/Game/Scene/SceneInstance.cs @@ -133,7 +133,7 @@ public class SceneInstance Player.MissionManager!.OnLoadScene(sceneInfo); // unlock section - if (ConfigManager.Config.ServerOption.EnableMission) + if (!ConfigManager.Config.ServerOption.AutoLightSection) { Player.SceneData!.UnlockSectionIdList.TryGetValue(FloorId, out var unlockSectionList); if (unlockSectionList != null) diff --git a/GameServer/Server/Packet/Recv/EraFlipper/HandlerChangeEraFlipperDataCsReq.cs b/GameServer/Server/Packet/Recv/EraFlipper/HandlerChangeEraFlipperDataCsReq.cs index 75db9cc1..8dd34c58 100644 --- a/GameServer/Server/Packet/Recv/EraFlipper/HandlerChangeEraFlipperDataCsReq.cs +++ b/GameServer/Server/Packet/Recv/EraFlipper/HandlerChangeEraFlipperDataCsReq.cs @@ -1,6 +1,13 @@ -using EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; +using EggLink.DanhengServer.Database.Scene; +using EggLink.DanhengServer.Enums.Mission; +using EggLink.DanhengServer.GameServer.Game.Mission; +using EggLink.DanhengServer.GameServer.Game.Scene; +using EggLink.DanhengServer.GameServer.Game.Task; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene; using EggLink.DanhengServer.Kcp; using EggLink.DanhengServer.Proto; +using Microsoft.EntityFrameworkCore.Metadata.Internal; namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.EraFlipper; @@ -12,7 +19,28 @@ public class HandlerChangeEraFlipperDataCsReq : Handler var req = ChangeEraFlipperDataCsReq.Parser.ParseFrom(data); var floorId = connection.Player!.SceneInstance!.FloorId; + + if (connection.Player.SceneInstance.FloorInfo?.FloorSavedValue.Find(x => x.Name == "FSV_FlashBackCount") != null) + { + // should save + var plane = connection.Player.SceneInstance.PlaneId; + var floor = connection.Player.SceneInstance.FloorId; + connection.Player.SceneData!.FloorSavedData.TryGetValue(floor, out var value); + if (value == null) + { + value = []; + connection.Player.SceneData.FloorSavedData[floor] = value; + } + + value["FSV_FlashBackCount"] = 0; + value["FSV_FlashBackCount"] = value.GetValueOrDefault("FSV_FlashBackCount", 0) + 1; // ParamString[2] is the key + await connection.SendPacket(new PacketUpdateFloorSavedValueNotify("FSV_FlashBackCount", value["FSV_FlashBackCount"], connection.Player)); + + connection.Player.TaskManager?.SceneTaskTrigger.TriggerFloor(plane, floor); + connection.Player.MissionManager?.HandleFinishType(MissionFinishTypeEnum.FloorSavedValue); + } + await connection.SendPacket(new PacketChangeEraFlipperDataScRsp(req)); - await connection.SendPacket(new PacketEraFlipperDataChangeScNotify(req, floorId)); + //await connection.SendPacket(new PacketEraFlipperDataChangeScNotify(req, floorId)); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/EraFlipper/HandlerEnterEraFlipperRegionCsReq.cs b/GameServer/Server/Packet/Recv/EraFlipper/HandlerEnterEraFlipperRegionCsReq.cs new file mode 100644 index 00000000..3b67f686 --- /dev/null +++ b/GameServer/Server/Packet/Recv/EraFlipper/HandlerEnterEraFlipperRegionCsReq.cs @@ -0,0 +1,16 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.EraFlipper; + +[Opcode(CmdIds.EnterEraFlipperRegionCsReq)] +public class HandlerEnterEraFlipperRegionCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = EnterEraFlipperRegionCsReq.Parser.ParseFrom(data); + + await connection.SendPacket(new PacketEnterEraFlipperRegionScRsp(req.EraFlipperRegionId)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/EraFlipper/PacketEnterEraFlipperRegionScRsp.cs b/GameServer/Server/Packet/Send/EraFlipper/PacketEnterEraFlipperRegionScRsp.cs new file mode 100644 index 00000000..7d1aa0c3 --- /dev/null +++ b/GameServer/Server/Packet/Send/EraFlipper/PacketEnterEraFlipperRegionScRsp.cs @@ -0,0 +1,17 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; + +public class PacketEnterEraFlipperRegionScRsp : BasePacket +{ + public PacketEnterEraFlipperRegionScRsp(uint regionId) : base(CmdIds.EnterEraFlipperRegionScRsp) + { + var proto = new EnterEraFlipperRegionScRsp + { + EraFlipperRegionId = regionId + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Scene/PacketGetSceneMapInfoScRsp.cs b/GameServer/Server/Packet/Send/Scene/PacketGetSceneMapInfoScRsp.cs index c7eb801d..b71fbbe5 100644 --- a/GameServer/Server/Packet/Send/Scene/PacketGetSceneMapInfoScRsp.cs +++ b/GameServer/Server/Packet/Send/Scene/PacketGetSceneMapInfoScRsp.cs @@ -83,7 +83,7 @@ public class PacketGetSceneMapInfoScRsp : BasePacket mazeMap.MazePropList.Add(mazeProp); } - if (ConfigManager.Config.ServerOption.EnableMission) + if (!ConfigManager.Config.ServerOption.AutoLightSection) { player.SceneData!.UnlockSectionIdList.TryGetValue(mapData.FloorID, out var sections); foreach (var section in sections ?? []) mazeMap.LightenSectionList.Add((uint)section);