From fadde20595bea0a17da374db897d239971c943dc Mon Sep 17 00:00:00 2001 From: Somebody Date: Tue, 9 Jul 2024 14:57:03 +0800 Subject: [PATCH] Fix A Bug - fix when entering a story line and re login, player will get 1001_1 --- Common/Data/Excel/StoryLineExcel.cs | 1 + GameServer/Game/Lineup/LineupManager.cs | 50 +++++++++++++++++---- GameServer/Game/Mission/MissionManager.cs | 1 + GameServer/Game/Mission/StoryLineManager.cs | 41 +++++++++++++---- GameServer/Game/Player/PlayerInstance.cs | 21 ++++++++- 5 files changed, 97 insertions(+), 17 deletions(-) diff --git a/Common/Data/Excel/StoryLineExcel.cs b/Common/Data/Excel/StoryLineExcel.cs index f9bf11b5..5eb6cf20 100644 --- a/Common/Data/Excel/StoryLineExcel.cs +++ b/Common/Data/Excel/StoryLineExcel.cs @@ -13,6 +13,7 @@ namespace EggLink.DanhengServer.Data.Excel public class StoryLineExcel : ExcelResource { public int StoryLineID { get; set; } + public StoryLineCondition BeginCondition { get; set; } = new(); public StoryLineCondition EndCondition { get; set; } = new(); public int InitEntranceID { get; set; } public int InitGroupID { get; set; } diff --git a/GameServer/Game/Lineup/LineupManager.cs b/GameServer/Game/Lineup/LineupManager.cs index 5781591a..fc2e6b4a 100644 --- a/GameServer/Game/Lineup/LineupManager.cs +++ b/GameServer/Game/Lineup/LineupManager.cs @@ -55,19 +55,19 @@ namespace EggLink.DanhengServer.Game.Lineup var avatarList = new List(); foreach (var avatar in lineup.BaseAvatars!) { - Proto.AvatarType avatarType = Proto.AvatarType.AvatarFormalType; + AvatarType avatarType = AvatarType.AvatarFormalType; Database.Avatar.AvatarInfo? avatarInfo = null; if (avatar.SpecialAvatarId > 0) { GameData.SpecialAvatarData.TryGetValue(avatar.SpecialAvatarId, out var specialAvatar); if (specialAvatar == null) continue; - avatarType = Proto.AvatarType.AvatarTrialType; + avatarType = AvatarType.AvatarTrialType; avatarInfo = specialAvatar.ToAvatarData(Player.Uid); } else if (avatar.AssistUid > 0) { var avatarStorage = DatabaseHelper.Instance?.GetInstance(avatar.AssistUid); - avatarType = Proto.AvatarType.AvatarAssistType; + avatarType = AvatarType.AvatarAssistType; if (avatarStorage == null) continue; foreach (var avatarData in avatarStorage.Avatars!) { @@ -191,13 +191,30 @@ namespace EggLink.DanhengServer.Game.Lineup return; } LineupData.Lineups.TryGetValue(lineupIndex, out LineupInfo? lineup); + if (lineup == null) { + var baseAvatarId = avatarId; + var specialAvatarId = avatarId * 10 + Player.Data.WorldLevel; + GameData.SpecialAvatarData.TryGetValue(specialAvatarId, out var specialAvatar); + if (specialAvatar != null) + { + baseAvatarId = specialAvatar.AvatarID; + } + else + { + specialAvatarId = 0; + if (baseAvatarId > 8000) + { + baseAvatarId = 8001; + } + } + lineup = new() { Name = "", LineupType = 0, - BaseAvatars = [new() { BaseAvatarId = avatarId }], + BaseAvatars = [new() { BaseAvatarId = baseAvatarId, SpecialAvatarId = specialAvatarId }], LineupData = LineupData, AvatarData = Player.AvatarManager!.AvatarData, }; @@ -208,10 +225,27 @@ namespace EggLink.DanhengServer.Game.Lineup { return; } - lineup.BaseAvatars?.Add(new() { BaseAvatarId = avatarId }); + + var baseAvatarId = avatarId; + var specialAvatarId = avatarId * 10 + Player.Data.WorldLevel; + GameData.SpecialAvatarData.TryGetValue(specialAvatarId, out var specialAvatar); + if (specialAvatar != null) + { + baseAvatarId = specialAvatar.AvatarID; + } + else + { + specialAvatarId = 0; + if (baseAvatarId > 8000) + { + baseAvatarId = 8001; + } + } + + lineup.BaseAvatars?.Add(new() { BaseAvatarId = baseAvatarId, SpecialAvatarId = specialAvatarId }); LineupData.Lineups[lineupIndex] = lineup; } - DatabaseHelper.Instance?.UpdateInstance(LineupData); + if (sendPacket) { if (lineupIndex == LineupData.GetCurLineupIndex()) @@ -333,7 +367,7 @@ namespace EggLink.DanhengServer.Game.Lineup { AddAvatar(index, avatar, false); } - DatabaseHelper.Instance?.UpdateInstance(LineupData); + if (index == LineupData.GetCurLineupIndex()) { Player.SceneInstance?.SyncLineup(); @@ -369,7 +403,7 @@ namespace EggLink.DanhengServer.Game.Lineup { AddAvatar(index, (int)avatar.Id, false); } - DatabaseHelper.Instance?.UpdateInstance(LineupData); + if (index == LineupData.GetCurLineupIndex()) { Player.SceneInstance?.SyncLineup(); diff --git a/GameServer/Game/Mission/MissionManager.cs b/GameServer/Game/Mission/MissionManager.cs index 2669a4fa..d1fd72ac 100644 --- a/GameServer/Game/Mission/MissionManager.cs +++ b/GameServer/Game/Mission/MissionManager.cs @@ -361,6 +361,7 @@ namespace EggLink.DanhengServer.Game.Mission // handle reward HandleSubMissionReward(missionId); + Player.StoryLineManager!.CheckIfEnterStoryLine(); //Player.StoryLineManager!.CheckIfFinishStoryLine(); PluginEvent.InvokeOnPlayerFinishSubMission(Player, missionId); diff --git a/GameServer/Game/Mission/StoryLineManager.cs b/GameServer/Game/Mission/StoryLineManager.cs index afe51828..20cdcc2a 100644 --- a/GameServer/Game/Mission/StoryLineManager.cs +++ b/GameServer/Game/Mission/StoryLineManager.cs @@ -20,11 +20,28 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission public StoryLineManager(PlayerInstance player) : base(player) { StoryLineData = DatabaseHelper.Instance!.GetInstanceOrCreateNew(player.Uid); - OnLogin(); + } + + public void CheckIfEnterStoryLine() + { + if (StoryLineData.CurStoryLineId != 0) return; + + foreach (var storyLine in GameData.StoryLineData.Values) + { + if (Player.MissionManager!.GetSubMissionStatus(storyLine.BeginCondition.Param) == Enums.MissionPhaseEnum.Finish) + { + InitStoryLine(storyLine.StoryLineID); + return; + } + } } public void InitStoryLine(int storyLineId, int entryId = 0, int anchorGroupId = 0, int anchorId = 0) { + if (StoryLineData.CurStoryLineId != 0) + { + FinishStoryLine(entryId, anchorGroupId, anchorId, false); + } GameData.StoryLineData.TryGetValue(storyLineId, out var storyExcel); GameData.StroyLineTrialAvatarDataData.TryGetValue(storyLineId, out var storyAvatarExcel); if (storyExcel == null || storyAvatarExcel == null) return; @@ -58,6 +75,7 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission StoryLineData.RunningStoryLines[storyExcel.StoryLineID] = record; StoryLineData.CurStoryLineId = storyExcel.StoryLineID; Player.SendPacket(new PacketStoryLineInfoScNotify(Player)); + Player.SendPacket(new PacketChangeStoryLineFinishScNotify(storyExcel.StoryLineID)); } public void EnterStoryLine(int storyLineId) @@ -78,6 +96,7 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission StoryLineData.CurStoryLineId = lineInfo.StoryLineId; Player.SendPacket(new PacketStoryLineInfoScNotify(Player)); + Player.SendPacket(new PacketChangeStoryLineFinishScNotify(StoryLineData.CurStoryLineId)); } public void LeaveStoryLine() @@ -113,6 +132,7 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission StoryLineData.OldRot = new(); Player.SendPacket(new PacketStoryLineInfoScNotify(Player)); + Player.SendPacket(new PacketChangeStoryLineFinishScNotify(0)); } public void CheckIfFinishStoryLine() // seems like a story line end with another ChangeStoryLine finish action that Params[0] = 0 @@ -127,16 +147,19 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission } } - public void FinishStoryLine(int entryId = 0, int anchorGroupId = 0, int anchorId = 0) + public void FinishStoryLine(int entryId = 0, int anchorGroupId = 0, int anchorId = 0, bool tp = true) { if (StoryLineData.CurStoryLineId == 0) return; - if (entryId > 0) + if (tp) { - Player.EnterMissionScene(entryId, anchorGroupId, anchorId, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline); - } - else - { - Player.LoadScene(StoryLineData.OldPlaneId, StoryLineData.OldFloorId, StoryLineData.OldEntryId, StoryLineData.OldPos, StoryLineData.OldRot, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline); + if (entryId > 0) + { + Player.EnterMissionScene(entryId, anchorGroupId, anchorId, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline); + } + else + { + Player.LoadScene(StoryLineData.OldPlaneId, StoryLineData.OldFloorId, StoryLineData.OldEntryId, StoryLineData.OldPos, StoryLineData.OldRot, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline); + } } // delete old & reset @@ -150,6 +173,7 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission StoryLineData.OldRot = new(); Player.SendPacket(new PacketStoryLineInfoScNotify(Player)); + Player.SendPacket(new PacketChangeStoryLineFinishScNotify(0)); } public void OnLogin() @@ -157,6 +181,7 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission if (StoryLineData.CurStoryLineId == 0) return; Player.SendPacket(new PacketStoryLineInfoScNotify(Player)); + Player.SendPacket(new PacketChangeStoryLineFinishScNotify(StoryLineData.CurStoryLineId)); } } } diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 998a59aa..b2403bdf 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -148,6 +148,7 @@ namespace EggLink.DanhengServer.Game.Player DatabaseHelper.Instance?.UpdateInstance(Data); ChallengeManager.ResurrectInstance(); + StoryLineManager.OnLogin(); LoadScene(Data.PlaneId, Data.FloorId, Data.EntryId, Data.Pos!, Data.Rot!, false); if (SceneInstance == null) { @@ -183,6 +184,15 @@ namespace EggLink.DanhengServer.Game.Player { avatar.SpecialAvatarId = special.GetId(); avatar.BaseAvatarId = special.AvatarID; + } + else + { + GameData.SpecialAvatarData.TryGetValue(avatar.BaseAvatarId * 10 + Data.WorldLevel, out special); + if (special != null) + { + avatar.SpecialAvatarId = special.GetId(); + avatar.BaseAvatarId = special.AvatarID; + } } } } @@ -535,6 +545,7 @@ namespace EggLink.DanhengServer.Game.Player // TODO: Sanify check Data.Pos = pos; Data.Rot = rot; + var sendMove = true; SceneInstance instance = new(this, plane, floorId, entryId); if (planeId != Data.PlaneId || floorId != Data.FloorId || entryId != Data.EntryId) { @@ -542,15 +553,23 @@ namespace EggLink.DanhengServer.Game.Player Data.FloorId = floorId; Data.EntryId = entryId; } + else + { + sendMove = false; + } SceneInstance = instance; MissionManager?.OnPlayerChangeScene(); Connection?.SendPacket(CmdIds.SyncServerSceneChangeNotify); - if (sendPacket) + if (sendPacket && sendMove) { SendPacket(new PacketEnterSceneByServerScNotify(instance, reason)); } + else if (!sendMove) + { + SendPacket(new PacketSceneEntityMoveScNotify(this)); + } MissionManager?.HandleFinishType(MissionFinishTypeEnum.EnterFloor); MissionManager?.HandleFinishType(MissionFinishTypeEnum.NotInFloor);