From 2076efaef2e801cb7e80ea5ce2fb3a2dcdaa0af1 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Sat, 30 Sep 2023 01:35:03 -0700 Subject: [PATCH] Implement rerunning cocoon/boss battles --- .../emu/lunarcore/data/excel/StageExcel.java | 2 + .../emu/lunarcore/game/battle/Battle.java | 31 +++++++++++++-- .../lunarcore/game/battle/BattleService.java | 38 ++++++++++++++++++- .../emu/lunarcore/game/enums/StageType.java | 35 +++++++++++++++++ .../emu/lunarcore/game/player/Player.java | 6 ++- .../HandlerReEnterLastElementStageCsReq.java | 19 ++++++++++ .../PacketReEnterLastElementStageScRsp.java | 28 ++++++++++++++ 7 files changed, 153 insertions(+), 6 deletions(-) create mode 100644 src/main/java/emu/lunarcore/game/enums/StageType.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerReEnterLastElementStageCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketReEnterLastElementStageScRsp.java diff --git a/src/main/java/emu/lunarcore/data/excel/StageExcel.java b/src/main/java/emu/lunarcore/data/excel/StageExcel.java index 3ab58a2..672585c 100644 --- a/src/main/java/emu/lunarcore/data/excel/StageExcel.java +++ b/src/main/java/emu/lunarcore/data/excel/StageExcel.java @@ -5,6 +5,7 @@ import java.util.List; import emu.lunarcore.data.GameResource; import emu.lunarcore.data.ResourceType; +import emu.lunarcore.game.enums.StageType; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import lombok.AccessLevel; @@ -15,6 +16,7 @@ import lombok.Getter; public class StageExcel extends GameResource { private int StageID; private long StageName; + private StageType StageType; private int Level; @Getter(AccessLevel.NONE) diff --git a/src/main/java/emu/lunarcore/game/battle/Battle.java b/src/main/java/emu/lunarcore/game/battle/Battle.java index eedd86e..3cf01c2 100644 --- a/src/main/java/emu/lunarcore/game/battle/Battle.java +++ b/src/main/java/emu/lunarcore/game/battle/Battle.java @@ -15,28 +15,46 @@ import emu.lunarcore.proto.SceneBattleInfoOuterClass.SceneBattleInfo; import emu.lunarcore.proto.SceneMonsterOuterClass.SceneMonster; import emu.lunarcore.proto.SceneMonsterWaveOuterClass.SceneMonsterWave; import emu.lunarcore.util.Utils; + import it.unimi.dsi.fastutil.ints.IntList; import lombok.Getter; @Getter public class Battle { + private final int id; private final Player player; private final PlayerLineup lineup; private final List npcMonsters; private final List buffs; private final List stages; - - // Constructor params subject to change - public Battle(Player player, PlayerLineup lineup, Collection stages) { + + private Battle(Player player, PlayerLineup lineup) { + this.id = player.getNextBattleId(); this.player = player; this.lineup = lineup; this.npcMonsters = new ArrayList<>(); this.buffs = new ArrayList<>(); this.stages = new ArrayList<>(); - + } + + public Battle(Player player, PlayerLineup lineup, StageExcel stage) { + this(player, lineup); + this.stages.add(stage); + } + + public Battle(Player player, PlayerLineup lineup, Collection stages) { + this(player, lineup); this.stages.addAll(stages); } + public int getStageId() { + if (this.getStages().size() > 0) { + return this.getStages().get(0).getId(); + } else { + return 0; + } + } + public MazeBuff addBuff(int buffId, int ownerId) { return addBuff(buffId, ownerId, 0xffffffff); } @@ -51,9 +69,14 @@ public class Battle { return buff; } + public void clearBuffs() { + this.buffs.clear(); + } + public SceneBattleInfo toProto() { // Build battle info var proto = SceneBattleInfo.newInstance() + .setBattleId(this.getId()) .setLogicRandomSeed(Utils.randomRange(1, Short.MAX_VALUE)) .setWorldLevel(player.getWorldLevel()); diff --git a/src/main/java/emu/lunarcore/game/battle/BattleService.java b/src/main/java/emu/lunarcore/game/battle/BattleService.java index f3be006..226eda9 100644 --- a/src/main/java/emu/lunarcore/game/battle/BattleService.java +++ b/src/main/java/emu/lunarcore/game/battle/BattleService.java @@ -7,6 +7,7 @@ import emu.lunarcore.data.GameData; import emu.lunarcore.data.excel.CocoonExcel; import emu.lunarcore.data.excel.StageExcel; import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.game.enums.StageType; import emu.lunarcore.game.player.Player; import emu.lunarcore.game.scene.entity.EntityMonster; import emu.lunarcore.game.scene.entity.EntityProp; @@ -16,6 +17,7 @@ import emu.lunarcore.proto.AvatarPropertyOuterClass.AvatarProperty; import emu.lunarcore.proto.BattleEndStatusOuterClass.BattleEndStatus; import emu.lunarcore.server.game.BaseGameService; import emu.lunarcore.server.game.GameServer; +import emu.lunarcore.server.packet.send.PacketReEnterLastElementStageScRsp; import emu.lunarcore.server.packet.send.PacketSceneCastSkillScRsp; import emu.lunarcore.server.packet.send.PacketStartCocoonStageScRsp; import emu.lunarcore.server.packet.send.PacketSyncLineupNotify; @@ -30,6 +32,11 @@ public class BattleService extends BaseGameService { } public void startBattle(Player player, int attackerId, RepeatedInt attackedList) { + // Sanity check to make sure player isnt in a battle + if (player.isInBattle()) { + return; + } + // Setup variables List entities = new ArrayList<>(); List monsters = new ArrayList<>(); @@ -119,6 +126,11 @@ public class BattleService extends BaseGameService { } public void startCocoon(Player player, int cocoonId, int worldLevel, int wave) { + // Sanity check to make sure player isnt in a battle + if (player.isInBattle()) { + return; + } + // Get cocoon data CocoonExcel cocoonExcel = GameData.getCocoonExcel(cocoonId, worldLevel); if (cocoonExcel == null) { @@ -129,6 +141,8 @@ public class BattleService extends BaseGameService { // Get waves wave = Math.min(Math.max(1, wave), cocoonExcel.getMaxWave()); + // TODO sanity check stamina + // Get stages from cocoon List stages = new ArrayList<>(); @@ -155,7 +169,7 @@ public class BattleService extends BaseGameService { } public void finishBattle(Player player, BattleEndStatus result, RepeatedMessage battleAvatars) { - // Sanity + // Sanity check to make sure player is in a battle if (!player.isInBattle()) { return; } @@ -191,4 +205,26 @@ public class BattleService extends BaseGameService { // Done - Clear battle object from player player.setBattle(null); } + + public void reEnterBattle(Player player, int stageId) { + // Sanity check to make sure player isnt in a battle + if (player.isInBattle()) { + player.sendPacket(new PacketReEnterLastElementStageScRsp()); + return; + } + + // Get stage + StageExcel stage = GameData.getStageExcelMap().get(stageId); + if (stage == null || stage.getStageType() != StageType.FarmElement) { + player.sendPacket(new PacketReEnterLastElementStageScRsp()); + return; + } + + // Create new battle for player + Battle battle = new Battle(player, player.getLineupManager().getCurrentLineup(), stage); + player.setBattle(battle); + + // Send packet + player.sendPacket(new PacketReEnterLastElementStageScRsp(battle)); + } } diff --git a/src/main/java/emu/lunarcore/game/enums/StageType.java b/src/main/java/emu/lunarcore/game/enums/StageType.java new file mode 100644 index 0000000..623b722 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/enums/StageType.java @@ -0,0 +1,35 @@ +package emu.lunarcore.game.enums; + +import lombok.Getter; + +public enum StageType { + Unknown (0), + Mainline (1), + Maze (2), + Adventure (3), + Cocoon (4), + FarmElement (5), + Client (6), + FarmRelic (7), + VerseSimulation (8), + Trial (9), + PunkLord (10), + FightActivity (11), + TrialAdventure (12), + BoxingClub (13), + TrialInBattle (14), + RogueChallengeActivity (15), + TreasureDungeon (16), + AetherDivide (17), + FantasticStory (18), + BattleCollege (19), + Heliobus (20), + RogueEndlessActivity (21); + + @Getter + private final int val; + + private StageType(int value) { + this.val = value; + } +} diff --git a/src/main/java/emu/lunarcore/game/player/Player.java b/src/main/java/emu/lunarcore/game/player/Player.java index b388b60..0c90a3c 100644 --- a/src/main/java/emu/lunarcore/game/player/Player.java +++ b/src/main/java/emu/lunarcore/game/player/Player.java @@ -28,7 +28,6 @@ import emu.lunarcore.server.packet.SessionState; import emu.lunarcore.server.packet.send.PacketEnterSceneByServerScNotify; import emu.lunarcore.server.packet.send.PacketPlayerSyncScNotify; import emu.lunarcore.server.packet.send.PacketRevcMsgScNotify; -import emu.lunarcore.server.packet.send.PacketSetHeroBasicTypeScRsp; import emu.lunarcore.util.Position; import lombok.Getter; @@ -64,6 +63,7 @@ public class Player { // Etc @Setter private transient boolean paused; + private transient int nextBattleId; // Player managers private transient final AvatarStorage avatars; @@ -249,6 +249,10 @@ public class Player { this.curBasicType = heroType; } + public int getNextBattleId() { + return ++nextBattleId; + } + public boolean isInBattle() { return this.battle != null; } diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerReEnterLastElementStageCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerReEnterLastElementStageCsReq.java new file mode 100644 index 0000000..a703404 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerReEnterLastElementStageCsReq.java @@ -0,0 +1,19 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.ReEnterLastElementStageCsReqOuterClass.ReEnterLastElementStageCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.ReEnterLastElementStageCsReq) +public class HandlerReEnterLastElementStageCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = ReEnterLastElementStageCsReq.parseFrom(data); + + session.getServer().getBattleService().reEnterBattle(session.getPlayer(), req.getStageId()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketReEnterLastElementStageScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketReEnterLastElementStageScRsp.java new file mode 100644 index 0000000..2533868 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketReEnterLastElementStageScRsp.java @@ -0,0 +1,28 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.battle.Battle; +import emu.lunarcore.proto.ReEnterLastElementStageScRspOuterClass.ReEnterLastElementStageScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketReEnterLastElementStageScRsp extends BasePacket { + + public PacketReEnterLastElementStageScRsp() { + super(CmdId.ReEnterLastElementStageScRsp); + + var data = ReEnterLastElementStageScRsp.newInstance() + .setRetcode(1); + + this.setData(data); + } + + public PacketReEnterLastElementStageScRsp(Battle battle) { + super(CmdId.ReEnterLastElementStageScRsp); + + var data = ReEnterLastElementStageScRsp.newInstance() + .setStageId(battle.getStageId()) + .setBattleInfo(battle.toProto()); + + this.setData(data); + } +}