diff --git a/GameServer/Game/Battle/BattleManager.cs b/GameServer/Game/Battle/BattleManager.cs index c5fdc957..600e77a1 100644 --- a/GameServer/Game/Battle/BattleManager.cs +++ b/GameServer/Game/Battle/BattleManager.cs @@ -245,15 +245,14 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) Player.SceneInstance?.ClearSummonUnit(); } - public async ValueTask StartCocoonStage(int cocoonId, int wave, int worldLevel) + public async ValueTask StartCocoonStage(int cocoonId, int wave, int worldLevel) { - if (Player.BattleInstance != null) return; + if (Player.BattleInstance != null) return null; GameData.CocoonConfigData.TryGetValue(cocoonId * 100 + worldLevel, out var config); if (config == null) { - await Player.SendPacket(new PacketStartCocoonStageScRsp()); - return; + return null; } wave = Math.Min(Math.Max(wave, 1), config.MaxWave); @@ -261,8 +260,7 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) var cost = config.StaminaCost * wave; if (Player.Data.Stamina < cost) { - await Player.SendPacket(new PacketStartCocoonStageScRsp()); - return; + return null; } List stageConfigExcels = []; @@ -277,8 +275,7 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) if (stageConfigExcels.Count == 0) { - await Player.SendPacket(new PacketStartCocoonStageScRsp()); - return; + return null; } BattleInstance battleInstance = new(Player, Player.LineupManager!.GetCurLineup()!, stageConfigExcels) @@ -299,9 +296,8 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) Player.QuestManager!.OnBattleStart(battleInstance); InvokeOnPlayerEnterBattle(Player, battleInstance); - - await Player.SendPacket(new PacketStartCocoonStageScRsp(battleInstance, cocoonId, wave)); - Player.SceneInstance?.ClearSummonUnit(); + await ValueTask.CompletedTask; + return battleInstance; } public (Retcode, BattleInstance?) StartBattleCollege(int collegeId) diff --git a/GameServer/Server/Packet/Recv/Adventure/HandlerQuickStartCocoonStageCsReq.cs b/GameServer/Server/Packet/Recv/Adventure/HandlerQuickStartCocoonStageCsReq.cs new file mode 100644 index 00000000..da511118 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Adventure/HandlerQuickStartCocoonStageCsReq.cs @@ -0,0 +1,21 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Adventure; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Adventure; + +[Opcode(CmdIds.QuickStartCocoonStageCsReq)] +public class HandlerQuickStartCocoonStageCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = QuickStartCocoonStageCsReq.Parser.ParseFrom(data); + var battle = await connection.Player!.BattleManager!.StartCocoonStage((int)req.CocoonId, (int)req.Wave, (int)req.WorldLevel); + connection.Player.SceneInstance?.ClearSummonUnit(); + + if (battle != null) + await connection.SendPacket(new PacketQuickStartCocoonStageScRsp(battle, (int)req.CocoonId, (int)req.Wave)); + else + await connection.SendPacket(new PacketQuickStartCocoonStageScRsp()); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Scene/HandlerStartCocoonStageCsReq.cs b/GameServer/Server/Packet/Recv/Scene/HandlerStartCocoonStageCsReq.cs index 18329ab6..efb5dfab 100644 --- a/GameServer/Server/Packet/Recv/Scene/HandlerStartCocoonStageCsReq.cs +++ b/GameServer/Server/Packet/Recv/Scene/HandlerStartCocoonStageCsReq.cs @@ -1,4 +1,5 @@ -using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene; +using EggLink.DanhengServer.Kcp; using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Scene; @@ -9,6 +10,12 @@ public class HandlerStartCocoonStageCsReq : Handler public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { var req = StartCocoonStageCsReq.Parser.ParseFrom(data); - await connection.Player!.BattleManager!.StartCocoonStage((int)req.CocoonId, (int)req.Wave, (int)req.WorldLevel); + var battle = await connection.Player!.BattleManager!.StartCocoonStage((int)req.CocoonId, (int)req.Wave, (int)req.WorldLevel); + connection.Player.SceneInstance?.ClearSummonUnit(); + + if (battle != null) + await connection.SendPacket(new PacketStartCocoonStageScRsp(battle, (int)req.CocoonId, (int)req.Wave)); + else + await connection.SendPacket(new PacketStartCocoonStageScRsp()); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Adventure/PacketQuickStartCocoonStageScRsp.cs b/GameServer/Server/Packet/Send/Adventure/PacketQuickStartCocoonStageScRsp.cs new file mode 100644 index 00000000..efe21241 --- /dev/null +++ b/GameServer/Server/Packet/Send/Adventure/PacketQuickStartCocoonStageScRsp.cs @@ -0,0 +1,31 @@ +using EggLink.DanhengServer.GameServer.Game.Battle; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Adventure; + +public class PacketQuickStartCocoonStageScRsp : BasePacket +{ + public PacketQuickStartCocoonStageScRsp() : base(CmdIds.QuickStartCocoonStageScRsp) + { + var rsp = new QuickStartCocoonStageScRsp + { + Retcode = 1 + }; + + SetData(rsp); + } + + public PacketQuickStartCocoonStageScRsp(BattleInstance battle, int cocoonId, int wave) : base( + CmdIds.QuickStartCocoonStageScRsp) + { + var rsp = new QuickStartCocoonStageScRsp + { + CocoonId = (uint)cocoonId, + Wave = (uint)wave, + BattleInfo = battle.ToProto() + }; + + SetData(rsp); + } +} \ No newline at end of file