diff --git a/src/main/java/emu/lunarcore/data/GameData.java b/src/main/java/emu/lunarcore/data/GameData.java index de2ca0b..278eed2 100644 --- a/src/main/java/emu/lunarcore/data/GameData.java +++ b/src/main/java/emu/lunarcore/data/GameData.java @@ -32,6 +32,7 @@ public class GameData { private static Int2ObjectMap avatarRankExcelMap = new Int2ObjectOpenHashMap<>(); private static Int2ObjectMap equipmentPromotionExcelMap = new Int2ObjectOpenHashMap<>(); private static Int2ObjectMap mazeBuffExcelMap = new Int2ObjectOpenHashMap<>(); + private static Int2ObjectMap cocoonExcelMap = new Int2ObjectOpenHashMap<>(); private static Int2ObjectMap playerLevelExcelMap = new Int2ObjectOpenHashMap<>(); private static Int2ObjectMap expTypeExcelMap = new Int2ObjectOpenHashMap<>(); @@ -109,4 +110,8 @@ public class GameData { public static MazeBuffExcel getMazeBuffExcel(int buffId, int level) { return mazeBuffExcelMap.get((buffId << 4) + level); } + + public static CocoonExcel getCocoonExcel(int cocoonId, int worldLevel) { + return cocoonExcelMap.get((cocoonId << 8) + worldLevel); + } } diff --git a/src/main/java/emu/lunarcore/data/excel/CocoonExcel.java b/src/main/java/emu/lunarcore/data/excel/CocoonExcel.java new file mode 100644 index 0000000..9209243 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/CocoonExcel.java @@ -0,0 +1,28 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.util.Utils; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import lombok.Getter; + +@Getter +@ResourceType(name = {"CocoonConfig.json"}) +public class CocoonExcel extends GameResource { + private int ID; + private int WorldLevel; + private int PropID; + private int StaminaCost; + private int MaxWave; + private IntArrayList StageIDList; + private IntArrayList DropList; + + @Override + public int getId() { + return (ID << 8) + WorldLevel; + } + + public int getRandomStage() { + return Utils.randomElement(StageIDList); + } +} diff --git a/src/main/java/emu/lunarcore/game/battle/BattleService.java b/src/main/java/emu/lunarcore/game/battle/BattleService.java index a453be1..206fed6 100644 --- a/src/main/java/emu/lunarcore/game/battle/BattleService.java +++ b/src/main/java/emu/lunarcore/game/battle/BattleService.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; 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.player.Player; @@ -16,6 +17,7 @@ import emu.lunarcore.proto.BattleEndStatusOuterClass.BattleEndStatus; import emu.lunarcore.server.game.BaseGameService; import emu.lunarcore.server.game.GameServer; import emu.lunarcore.server.packet.send.PacketSceneCastSkillScRsp; +import emu.lunarcore.server.packet.send.PacketStartCocoonStageScRsp; import emu.lunarcore.server.packet.send.PacketSyncLineupNotify; import us.hebi.quickbuf.RepeatedInt; @@ -27,7 +29,7 @@ public class BattleService extends BaseGameService { super(server); } - public void onBattleStart(Player player, int attackerId, RepeatedInt attackedList) { + public void startBattle(Player player, int attackerId, RepeatedInt attackedList) { // Setup variables List entities = new ArrayList<>(); List monsters = new ArrayList<>(); @@ -44,7 +46,7 @@ public class BattleService extends BaseGameService { entities.add(entity); } } - // + isPlayerCaster = true; } else { // Player is ambushed @@ -108,15 +110,50 @@ public class BattleService extends BaseGameService { } // Set battle and send rsp packet player.setBattle(battle); - player.sendPacket(new PacketSceneCastSkillScRsp(player, battle)); + player.sendPacket(new PacketSceneCastSkillScRsp(battle)); return; } // Send packet player.sendPacket(new PacketSceneCastSkillScRsp(0)); } + + public void startCocoon(Player player, int cocoonId, int worldLevel, int wave) { + // Get cocoon data + CocoonExcel cocoonExcel = GameData.getCocoonExcel(cocoonId, worldLevel); + if (cocoonExcel == null) { + player.sendPacket(new PacketStartCocoonStageScRsp()); + return; + } + + // Get waves + wave = Math.min(Math.max(1, wave), cocoonExcel.getMaxWave()); + + // Get stages from cocoon + List stages = new ArrayList<>(); + + for (int i = 0; i < wave; i++) { + StageExcel stage = GameData.getStageExcelMap().get(cocoonExcel.getRandomStage()); + + if (stage != null) { + stages.add(stage); + } + } + + // Sanity + if (stages.size() <= 0) { + player.sendPacket(new PacketStartCocoonStageScRsp()); + return; + } + + // Build battle from cocoon data + Battle battle = new Battle(player, player.getLineupManager().getCurrentLineup(), stages); + + // Send packet + player.sendPacket(new PacketStartCocoonStageScRsp(battle, cocoonId, wave)); + } - public void onBattleResult(Player player, BattleEndStatus result, RepeatedMessage battleAvatars) { + public void finishBattle(Player player, BattleEndStatus result, RepeatedMessage battleAvatars) { // Sanity if (!player.isInBattle()) { return; @@ -153,5 +190,4 @@ public class BattleService extends BaseGameService { // Done - Clear battle object from player player.setBattle(null); } - } diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPVEBattleResultCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPVEBattleResultCsReq.java index c121a88..1e5b2e4 100644 --- a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPVEBattleResultCsReq.java +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPVEBattleResultCsReq.java @@ -14,7 +14,7 @@ public class HandlerPVEBattleResultCsReq extends PacketHandler { public void handle(GameSession session, byte[] header, byte[] data) throws Exception { var req = PVEBattleResultCsReq.parseFrom(data); - session.getServer().getBattleService().onBattleResult( + session.getServer().getBattleService().finishBattle( session.getPlayer(), req.getEndStatus(), req.getStt().getBattleAvatarList() diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneCastSkillCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneCastSkillCsReq.java index bf97eaa..fc2ec81 100644 --- a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneCastSkillCsReq.java +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneCastSkillCsReq.java @@ -15,7 +15,7 @@ public class HandlerSceneCastSkillCsReq extends PacketHandler { var req = SceneCastSkillCsReq.parseFrom(data); if (req.hasAttackedEntityIdList()) { - session.getServer().getBattleService().onBattleStart(session.getPlayer(), req.getAttackerId(), req.getAttackedEntityIdList()); + session.getServer().getBattleService().startBattle(session.getPlayer(), req.getAttackerId(), req.getAttackedEntityIdList()); } else { session.send(new PacketSceneCastSkillScRsp()); } diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerStartCocoonStageCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerStartCocoonStageCsReq.java new file mode 100644 index 0000000..838efb2 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerStartCocoonStageCsReq.java @@ -0,0 +1,19 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.StartCocoonStageCsReqOuterClass.StartCocoonStageCsReq; +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.StartCocoonStageCsReq) +public class HandlerStartCocoonStageCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = StartCocoonStageCsReq.parseFrom(data); + + session.getServer().getBattleService().startCocoon(session.getPlayer(), req.getCocoonId(), req.getWorldLevel(), req.getWave()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSceneCastSkillScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSceneCastSkillScRsp.java index 812618d..ed59a13 100644 --- a/src/main/java/emu/lunarcore/server/packet/send/PacketSceneCastSkillScRsp.java +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSceneCastSkillScRsp.java @@ -1,17 +1,9 @@ package emu.lunarcore.server.packet.send; -import emu.lunarcore.game.avatar.GameAvatar; import emu.lunarcore.game.battle.Battle; -import emu.lunarcore.game.player.PlayerLineup; -import emu.lunarcore.game.scene.entity.EntityMonster; -import emu.lunarcore.game.player.Player; -import emu.lunarcore.proto.SceneBattleInfoOuterClass.SceneBattleInfo; import emu.lunarcore.proto.SceneCastSkillScRspOuterClass.SceneCastSkillScRsp; -import emu.lunarcore.proto.SceneMonsterOuterClass.SceneMonster; -import emu.lunarcore.proto.SceneMonsterWaveOuterClass.SceneMonsterWave; import emu.lunarcore.server.packet.BasePacket; import emu.lunarcore.server.packet.CmdId; -import emu.lunarcore.util.Utils; public class PacketSceneCastSkillScRsp extends BasePacket { @@ -28,13 +20,11 @@ public class PacketSceneCastSkillScRsp extends BasePacket { this.setData(data); } - // TODO - public PacketSceneCastSkillScRsp(Player player, Battle battle) { + public PacketSceneCastSkillScRsp(Battle battle) { super(CmdId.SceneCastSkillScRsp); // Build data var data = SceneCastSkillScRsp.newInstance() - //.setAttackedGroupId(monster.getGroupId()) .setBattleInfo(battle.toProto()); this.setData(data); diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketStartCocoonStageScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketStartCocoonStageScRsp.java new file mode 100644 index 0000000..3f78362 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketStartCocoonStageScRsp.java @@ -0,0 +1,29 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.battle.Battle; +import emu.lunarcore.proto.StartCocoonStageScRspOuterClass.StartCocoonStageScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketStartCocoonStageScRsp extends BasePacket { + + public PacketStartCocoonStageScRsp() { + super(CmdId.StartCocoonStageScRsp); + + var data = StartCocoonStageScRsp.newInstance() + .setRetcode(1); + + this.setData(data); + } + + public PacketStartCocoonStageScRsp(Battle battle, int cocoonId, int wave) { + super(CmdId.StartCocoonStageScRsp); + + var data = StartCocoonStageScRsp.newInstance() + .setBattleInfo(battle.toProto()) + .setCocoonId(cocoonId) + .setWave(wave); + + this.setData(data); + } +}