diff --git a/GameServer/Game/Mission/StoryLineManager.cs b/GameServer/Game/Mission/StoryLineManager.cs index 87646aec..6f20f6d3 100644 --- a/GameServer/Game/Mission/StoryLineManager.cs +++ b/GameServer/Game/Mission/StoryLineManager.cs @@ -64,15 +64,15 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission StoryLineData.CurStoryLineId = storyExcel.StoryLineID; Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!)); Player.SendPacket(new PacketStoryLineInfoScNotify(Player)); - Player.SendPacket(new PacketChangeStoryLineFinishScNotify(storyExcel.StoryLineID)); + Player.SendPacket(new PacketChangeStoryLineFinishScNotify(storyExcel.StoryLineID, ChangeStoryLineAction.FinishAction)); if (entryId > 0) { - Player.EnterMissionScene(entryId, anchorGroupId, anchorId, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline); + Player.EnterMissionScene(entryId, anchorGroupId, anchorId, true, ChangeStoryLineAction.FinishAction); } else { - Player.EnterMissionScene(storyExcel.InitEntranceID, storyExcel.InitGroupID, storyExcel.InitAnchorID, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline); + Player.EnterMissionScene(storyExcel.InitEntranceID, storyExcel.InitGroupID, storyExcel.InitAnchorID, true, ChangeStoryLineAction.FinishAction); } var record = new StoryLineInfo() @@ -89,13 +89,13 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission StoryLineData.RunningStoryLines[storyExcel.StoryLineID] = record; } - public void EnterStoryLine(int storyLineId) + public void EnterStoryLine(int storyLineId, bool tp = true) { if (StoryLineData.CurStoryLineId == storyLineId) return; // already in this story line if (storyLineId == 0) // leave story line { - LeaveStoryLine(true); + LeaveStoryLine(tp); return; } @@ -120,8 +120,12 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission StoryLineData.CurStoryLineId = lineInfo.StoryLineId; Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!)); Player.SendPacket(new PacketStoryLineInfoScNotify(Player)); - Player.SendPacket(new PacketChangeStoryLineFinishScNotify(StoryLineData.CurStoryLineId)); - Player.LoadScene(lineInfo.SavedPlaneId, lineInfo.SavedFloorId, lineInfo.SavedEntryId, lineInfo.SavedPos, lineInfo.SavedRot, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline); + Player.SendPacket(new PacketChangeStoryLineFinishScNotify(StoryLineData.CurStoryLineId, ChangeStoryLineAction.Client)); + + if (tp) + { + Player.LoadScene(lineInfo.SavedPlaneId, lineInfo.SavedFloorId, lineInfo.SavedEntryId, lineInfo.SavedPos, lineInfo.SavedRot, true, ChangeStoryLineAction.Client); + } } public void LeaveStoryLine(bool tp) @@ -151,11 +155,11 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!)); Player.SendPacket(new PacketStoryLineInfoScNotify(Player)); - Player.SendPacket(new PacketChangeStoryLineFinishScNotify(0)); + Player.SendPacket(new PacketChangeStoryLineFinishScNotify(0, ChangeStoryLineAction.None)); if (tp) { - Player.LoadScene(StoryLineData.OldPlaneId, StoryLineData.OldFloorId, StoryLineData.OldEntryId, StoryLineData.OldPos, StoryLineData.OldRot, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline); + Player.LoadScene(StoryLineData.OldPlaneId, StoryLineData.OldFloorId, StoryLineData.OldEntryId, StoryLineData.OldPos, StoryLineData.OldRot, true, ChangeStoryLineAction.None); StoryLineData.OldPlaneId = 0; StoryLineData.OldEntryId = 0; @@ -195,17 +199,17 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!)); Player.SendPacket(new PacketStoryLineInfoScNotify(Player)); - Player.SendPacket(new PacketChangeStoryLineFinishScNotify(0)); + Player.SendPacket(new PacketChangeStoryLineFinishScNotify(0, ChangeStoryLineAction.None)); if (tp) { if (entryId > 0) { - Player.EnterMissionScene(entryId, anchorGroupId, anchorId, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline); + Player.EnterMissionScene(entryId, anchorGroupId, anchorId, true, ChangeStoryLineAction.None); } else { - Player.LoadScene(StoryLineData.OldPlaneId, StoryLineData.OldFloorId, StoryLineData.OldEntryId, StoryLineData.OldPos, StoryLineData.OldRot, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline); + Player.LoadScene(StoryLineData.OldPlaneId, StoryLineData.OldFloorId, StoryLineData.OldEntryId, StoryLineData.OldPos, StoryLineData.OldRot, true, ChangeStoryLineAction.FinishAction); } } } diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 8f8d43e8..87634c56 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -454,18 +454,18 @@ namespace EggLink.DanhengServer.Game.Player return null; } - public void EnterScene(int entryId, int teleportId, bool sendPacket, EnterSceneReasonStatus reason = EnterSceneReasonStatus.EnterSceneReasonNone, int storyLineId = 0) + public bool EnterScene(int entryId, int teleportId, bool sendPacket, ChangeStoryLineAction storyLineAction = ChangeStoryLineAction.None, int storyLineId = 0) { - if (storyLineId != StoryLineManager!.StoryLineData.CurStoryLineId) + if (storyLineId != StoryLineManager?.StoryLineData.CurStoryLineId) { - StoryLineManager!.EnterStoryLine(storyLineId); + StoryLineManager?.EnterStoryLine(storyLineId, entryId == 0); // entryId == 0 -> teleport } GameData.MapEntranceData.TryGetValue(entryId, out var entrance); - if (entrance == null) return; + if (entrance == null) return false; GameData.GetFloorInfo(entrance.PlaneID, entrance.FloorID, out var floorInfo); - if (floorInfo == null) return; + if (floorInfo == null) return false; int StartGroup = entrance.StartGroupID; int StartAnchor = entrance.StartAnchorID; @@ -487,10 +487,16 @@ namespace EggLink.DanhengServer.Game.Player MissionManager?.HandleFinishType(MissionFinishTypeEnum.EnterMapByEntrance, entryId); - LoadScene(entrance.PlaneID, entrance.FloorID, entryId, anchor!.ToPositionProto(), anchor.ToRotationProto(), sendPacket, reason); + var beforeEntryId = Data.EntryId; + + LoadScene(entrance.PlaneID, entrance.FloorID, entryId, anchor!.ToPositionProto(), anchor.ToRotationProto(), sendPacket, storyLineAction); + + var afterEntryId = Data.EntryId; + + return beforeEntryId != afterEntryId; // return true if entryId changed } - public void EnterMissionScene(int entranceId, int anchorGroupId, int anchorId, bool sendPacket, EnterSceneReasonStatus reason = EnterSceneReasonStatus.EnterSceneReasonNone) + public void EnterMissionScene(int entranceId, int anchorGroupId, int anchorId, bool sendPacket, ChangeStoryLineAction storyLineAction = ChangeStoryLineAction.None) { GameData.MapEntranceData.TryGetValue(entranceId, out var entrance); if (entrance == null) return; @@ -508,7 +514,7 @@ namespace EggLink.DanhengServer.Game.Player } AnchorInfo? anchor = floorInfo.GetAnchorInfo(StartGroup, StartAnchor); - LoadScene(entrance.PlaneID, entrance.FloorID, entranceId, anchor!.ToPositionProto(), anchor.ToRotationProto(), sendPacket, reason); + LoadScene(entrance.PlaneID, entrance.FloorID, entranceId, anchor!.ToPositionProto(), anchor.ToRotationProto(), sendPacket, storyLineAction); } public void MoveTo(Position position) @@ -530,7 +536,7 @@ namespace EggLink.DanhengServer.Game.Player SendPacket(new PacketSceneEntityMoveScNotify(this)); } - public void LoadScene(int planeId, int floorId, int entryId, Position pos, Position rot, bool sendPacket, EnterSceneReasonStatus reason = EnterSceneReasonStatus.EnterSceneReasonNone) + public void LoadScene(int planeId, int floorId, int entryId, Position pos, Position rot, bool sendPacket, ChangeStoryLineAction storyLineAction = ChangeStoryLineAction.None) { GameData.MazePlaneData.TryGetValue(planeId, out var plane); if (plane == null) return; @@ -552,7 +558,7 @@ namespace EggLink.DanhengServer.Game.Player // TODO: Sanify check Data.Pos = pos; Data.Rot = rot; - var sendMove = true; + var notSendMove = true; SceneInstance instance = new(this, plane, floorId, entryId); if (planeId != Data.PlaneId || floorId != Data.FloorId || entryId != Data.EntryId) { @@ -560,23 +566,23 @@ namespace EggLink.DanhengServer.Game.Player Data.FloorId = floorId; Data.EntryId = entryId; } - else + else if (StoryLineManager?.StoryLineData.CurStoryLineId == 0) { - sendMove = false; + notSendMove = false; } SceneInstance = instance; MissionManager?.OnPlayerChangeScene(); Connection?.SendPacket(CmdIds.SyncServerSceneChangeNotify); - //if (sendPacket && sendMove) - //{ - SendPacket(new PacketEnterSceneByServerScNotify(instance, reason)); - //} - //else if (!sendMove) - //{ - //SendPacket(new PacketSceneEntityMoveScNotify(this)); - //} + if (sendPacket && notSendMove) + { + SendPacket(new PacketEnterSceneByServerScNotify(instance, storyLineAction)); + } + else if (!notSendMove) + { + SendPacket(new PacketSceneEntityMoveScNotify(this)); + } MissionManager?.HandleFinishType(MissionFinishTypeEnum.EnterFloor); MissionManager?.HandleFinishType(MissionFinishTypeEnum.NotInFloor); diff --git a/GameServer/Server/Packet/Recv/Scene/HandlerEnterSceneCsReq.cs b/GameServer/Server/Packet/Recv/Scene/HandlerEnterSceneCsReq.cs index 6d0d7269..7b09a13b 100644 --- a/GameServer/Server/Packet/Recv/Scene/HandlerEnterSceneCsReq.cs +++ b/GameServer/Server/Packet/Recv/Scene/HandlerEnterSceneCsReq.cs @@ -14,9 +14,9 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Scene public override void OnHandle(Connection connection, byte[] header, byte[] data) { var req = EnterSceneCsReq.Parser.ParseFrom(data); - connection.Player?.EnterScene((int)req.EntryId, (int)req.TeleportId, true, EnterSceneReasonStatus.EnterSceneReasonNone, (int) req.GameStoryLineId); + var overMapTp = connection.Player?.EnterScene((int)req.EntryId, (int)req.TeleportId, true, storyLineId:(int) req.GameStoryLineId); - connection.SendPacket(new PacketEnterSceneScRsp(true, req.MapTp, (int)req.GameStoryLineId)); + connection.SendPacket(new PacketEnterSceneScRsp(overMapTp == true, req.MapTp, (int)req.GameStoryLineId)); } } } diff --git a/GameServer/Server/Packet/Send/Mission/PacketChangeStoryLineFinishScNotify.cs b/GameServer/Server/Packet/Send/Mission/PacketChangeStoryLineFinishScNotify.cs index 02ffda0c..73b9e8bc 100644 --- a/GameServer/Server/Packet/Send/Mission/PacketChangeStoryLineFinishScNotify.cs +++ b/GameServer/Server/Packet/Send/Mission/PacketChangeStoryLineFinishScNotify.cs @@ -10,11 +10,11 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Mission { public class PacketChangeStoryLineFinishScNotify : BasePacket { - public PacketChangeStoryLineFinishScNotify(int curId) : base(CmdIds.ChangeStoryLineFinishScNotify) + public PacketChangeStoryLineFinishScNotify(int curId, ChangeStoryLineAction reason) : base(CmdIds.ChangeStoryLineFinishScNotify) { var proto = new ChangeStoryLineFinishScNotify { - ActionType = ChangeStoryLineAction.Client, + ActionType = reason, CurStoryLineId = (uint)curId, }; diff --git a/GameServer/Server/Packet/Send/Mission/PacketStoryLineInfoScNotify.cs b/GameServer/Server/Packet/Send/Mission/PacketStoryLineInfoScNotify.cs index 7486beab..c31176bf 100644 --- a/GameServer/Server/Packet/Send/Mission/PacketStoryLineInfoScNotify.cs +++ b/GameServer/Server/Packet/Send/Mission/PacketStoryLineInfoScNotify.cs @@ -15,12 +15,12 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Mission { public PacketStoryLineInfoScNotify(PlayerInstance player) : base(CmdIds.StoryLineInfoScNotify) { - var storyLineIdList = player.StoryLineManager!.StoryLineData.RunningStoryLines.Keys.Select(x => (uint)x).ToList(); - storyLineIdList.Insert(0, 0); + var storyLineIdList = player.StoryLineManager?.StoryLineData.RunningStoryLines.Keys.Select(x => (uint)x).ToList(); + storyLineIdList?.Insert(0, 0); var proto = new StoryLineInfoScNotify { - CurStoryLineId = (uint)player.StoryLineManager!.StoryLineData.CurStoryLineId, + CurStoryLineId = (uint)(player.StoryLineManager?.StoryLineData.CurStoryLineId ?? 0), RunningStoryLineIdList = { storyLineIdList }, }; diff --git a/GameServer/Server/Packet/Send/Scene/PacketEnterSceneByServerScNotify.cs b/GameServer/Server/Packet/Send/Scene/PacketEnterSceneByServerScNotify.cs index 811ffca2..5c8bc1c7 100644 --- a/GameServer/Server/Packet/Send/Scene/PacketEnterSceneByServerScNotify.cs +++ b/GameServer/Server/Packet/Send/Scene/PacketEnterSceneByServerScNotify.cs @@ -6,20 +6,16 @@ namespace EggLink.DanhengServer.Server.Packet.Send.Scene { public class PacketEnterSceneByServerScNotify : BasePacket { - public PacketEnterSceneByServerScNotify(SceneInstance scene, EnterSceneReasonStatus reason = EnterSceneReasonStatus.EnterSceneReasonNone) : base(CmdIds.EnterSceneByServerScNotify) + public PacketEnterSceneByServerScNotify(SceneInstance scene, ChangeStoryLineAction storyLineAction = ChangeStoryLineAction.None) : base(CmdIds.EnterSceneByServerScNotify) { var sceneInfo = scene.ToProto(); var notify = new EnterSceneByServerScNotify() { Scene = sceneInfo, - //Reason = reason, Lineup = scene.Player.LineupManager!.GetCurLineup()!.ToProto(), }; - if (reason == EnterSceneReasonStatus.EnterSceneReasonChangeStoryline) - { - notify.Scene.BONACBOIIBE = 0; - } + notify.Scene.BONACBOIIBE = (uint) storyLineAction; SetData(notify); }