From 487ad7c8b752f3bf576206edc82309548ba34f4b Mon Sep 17 00:00:00 2001 From: WatchAndyTW Date: Wed, 22 May 2024 18:50:49 +0800 Subject: [PATCH] Fix: Proper challenge monster spawn --- Common/Util/GameConstants.cs | 1 + .../Game/Challenge/ChallengeEntityLoader.cs | 102 ++++++++++++++++++ .../Game/Challenge/ChallengeInstance.cs | 2 +- GameServer/Game/Challenge/ChallengeManager.cs | 1 - GameServer/Game/Scene/SceneInstance.cs | 6 ++ .../Challenge/HandlerLeaveChallengeCsReq.cs | 5 +- 6 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 GameServer/Game/Challenge/ChallengeEntityLoader.cs diff --git a/Common/Util/GameConstants.cs b/Common/Util/GameConstants.cs index 70f3ef4c..242ff38a 100644 --- a/Common/Util/GameConstants.cs +++ b/Common/Util/GameConstants.cs @@ -23,5 +23,6 @@ public const int STAMINA_RESERVE_RECOVERY_TIME = 1080; // 18 minutes public const int CHALLENGE_ENTRANCE = 100000103; + public const int CHALLENGE_STORY_ENTRANCE = 102020107; } } diff --git a/GameServer/Game/Challenge/ChallengeEntityLoader.cs b/GameServer/Game/Challenge/ChallengeEntityLoader.cs new file mode 100644 index 00000000..ec5a4088 --- /dev/null +++ b/GameServer/Game/Challenge/ChallengeEntityLoader.cs @@ -0,0 +1,102 @@ +using EggLink.DanhengServer.Data; +using EggLink.DanhengServer.Data.Config; +using EggLink.DanhengServer.Data.Excel; +using EggLink.DanhengServer.Game.Player; +using EggLink.DanhengServer.Game.Scene; +using EggLink.DanhengServer.Game.Scene.Entity; +using EggLink.DanhengServer.Util; + +namespace EggLink.DanhengServer.Game.Challenge +{ + public class ChallengeEntityLoader(SceneInstance scene, PlayerInstance player) : SceneEntityLoader(scene) + { + public PlayerInstance Player = player; + + public override void LoadEntity() + { + if (Scene.IsLoaded) return; + + // Get challenge instance + if (Player.ChallengeInstance == null) return; + ChallengeInstance instance = Player.ChallengeInstance; + + // Setup first stage + var excel = instance.Excel; + Scene.FloorInfo!.Groups.TryGetValue(excel.MazeGroupID1, out var groupData); + if (groupData != null) + { + LoadGroup(groupData); + }; + + // Set leave entry + Scene.LeaveEntityId = instance.IsStory() ? GameConstants.CHALLENGE_STORY_ENTRANCE : GameConstants.CHALLENGE_ENTRANCE; + + foreach (var group in Scene.FloorInfo.Groups.Values) + { + // Skip non-server groups + if (group.LoadSide != Enums.Scene.GroupLoadSideEnum.Server) continue; + + // Dont load the groups that have monsters in them + if (group.PropList.Count > 0 && group.MonsterList.Count > 0) + { + LoadGroup(group); + } + } + + Scene.IsLoaded = true; + } + + public override EntityMonster? LoadMonster(MonsterInfo info, GroupInfo group, bool sendPacket = false) + { + if (info.IsClientOnly || info.IsDelete) + { + return null; + } + Console.WriteLine(0); + + // Get challenge instance + if (Player.ChallengeInstance == null) return null; + ChallengeInstance instance = Player.ChallengeInstance; + Console.WriteLine(1); + + // Get current stage monster infos + Dictionary challengeMonsters; + if (instance.Excel.MazeGroupID1 == group.Id) + { + challengeMonsters = instance.Excel.ChallengeMonsters1; + } + else if (instance.Excel.MazeGroupID2 == group.Id) + { + challengeMonsters = instance.Excel.ChallengeMonsters2; + } + else + { + return null; + } + Console.WriteLine(2); + + // Get challenge monster info + if (!challengeMonsters.ContainsKey(info.ID)) return null; + var challengeMonsterInfo = challengeMonsters[info.ID]; + Console.WriteLine(3); + + // Get excels from game data + if (!GameData.NpcMonsterDataData.ContainsKey(challengeMonsterInfo.NpcMonsterId)) return null; + NPCMonsterDataExcel npcMonsterExcel = GameData.NpcMonsterDataData[challengeMonsterInfo.NpcMonsterId]; + Console.WriteLine(4); + + // Create monster from group monster info + EntityMonster entity = new EntityMonster(scene, info.ToPositionProto(), info.ToRotationProto(), group.Id, info.ID, npcMonsterExcel, info); + entity.EventID = challengeMonsterInfo.EventId; + entity.CustomStageID = challengeMonsterInfo.EventId; + Scene.AddEntity(entity, sendPacket); + + return entity; + } + + public override EntityNpc? LoadNpc(NpcInfo info, GroupInfo group, bool sendPacket = false) + { + return null; + } + } +} diff --git a/GameServer/Game/Challenge/ChallengeInstance.cs b/GameServer/Game/Challenge/ChallengeInstance.cs index 033d9a50..fd25ca2e 100644 --- a/GameServer/Game/Challenge/ChallengeInstance.cs +++ b/GameServer/Game/Challenge/ChallengeInstance.cs @@ -140,7 +140,7 @@ namespace EggLink.DanhengServer.Game.Challenge foreach (var id in Excel.StoryExcel.BattleTargetID!) { - battle.AddBattleTarget(1, id, GetTotalScore(), 0); + battle.AddBattleTarget(5, id, GetTotalScore(), 0); } } } diff --git a/GameServer/Game/Challenge/ChallengeManager.cs b/GameServer/Game/Challenge/ChallengeManager.cs index c10fa7b3..739b6364 100644 --- a/GameServer/Game/Challenge/ChallengeManager.cs +++ b/GameServer/Game/Challenge/ChallengeManager.cs @@ -76,7 +76,6 @@ namespace EggLink.DanhengServer.Game.Challenge Player.ChallengeInstance = instance; // Set first lineup before we enter scenes - instance.SetCurrentExtraLineup(ExtraLineupType.LineupChallenge); Player.LineupManager!.SetCurLineup(instance.CurrentExtraLineup); // Enter scene diff --git a/GameServer/Game/Scene/SceneInstance.cs b/GameServer/Game/Scene/SceneInstance.cs index a2aab324..c8dd2a89 100644 --- a/GameServer/Game/Scene/SceneInstance.cs +++ b/GameServer/Game/Scene/SceneInstance.cs @@ -4,6 +4,7 @@ using EggLink.DanhengServer.Data.Excel; using EggLink.DanhengServer.Database; using EggLink.DanhengServer.Database.Avatar; using EggLink.DanhengServer.Game.Battle; +using EggLink.DanhengServer.Game.Challenge; using EggLink.DanhengServer.Game.ChessRogue.Cell; using EggLink.DanhengServer.Game.Player; using EggLink.DanhengServer.Game.Rogue.Scene; @@ -27,6 +28,7 @@ namespace EggLink.DanhengServer.Game.Scene public int PlaneId; public int EntryId; + public int LeaveEntityId; public int LastEntityId; public bool IsLoaded = false; @@ -46,6 +48,7 @@ namespace EggLink.DanhengServer.Game.Scene PlaneId = excel.PlaneID; FloorId = floorId; EntryId = entryId; + LeaveEntityId = 0; SyncLineup(true, true); @@ -64,6 +67,9 @@ namespace EggLink.DanhengServer.Game.Scene EntityLoader = new RogueEntityLoader(this, Player); } break; + case Enums.Scene.PlaneTypeEnum.Challenge: + EntityLoader = new ChallengeEntityLoader(this, Player); + break; default: EntityLoader = new(this); break; diff --git a/GameServer/Server/Packet/Recv/Challenge/HandlerLeaveChallengeCsReq.cs b/GameServer/Server/Packet/Recv/Challenge/HandlerLeaveChallengeCsReq.cs index 5d8e0d3a..75ee0537 100644 --- a/GameServer/Server/Packet/Recv/Challenge/HandlerLeaveChallengeCsReq.cs +++ b/GameServer/Server/Packet/Recv/Challenge/HandlerLeaveChallengeCsReq.cs @@ -24,7 +24,10 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Challenge // Leave scene player.LineupManager.SetCurLineup(0); - player.EnterScene(GameConstants.CHALLENGE_ENTRANCE, 0, true); + + int leaveEntryId = GameConstants.CHALLENGE_ENTRANCE; + if (player.SceneInstance.LeaveEntityId != 0) leaveEntryId = player.SceneInstance.LeaveEntityId; + player.EnterScene(leaveEntryId, 0, true); } connection.SendPacket(CmdIds.LeaveChallengeScRsp);