From 62bbce26074015836cd6f3c9316a40a4092d2f47 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Fri, 29 Sep 2023 00:44:35 -0700 Subject: [PATCH] Battles should have the proper monsters to fight --- .../emu/lunarcore/data/excel/StageExcel.java | 45 +++++++++++++++++- .../emu/lunarcore/game/battle/Battle.java | 46 ++++++++++++------- .../lunarcore/game/battle/BattleService.java | 23 ++++++++-- .../java/emu/lunarcore/game/scene/Scene.java | 5 +- .../game/scene/entity/EntityMonster.java | 9 ++-- 5 files changed, 100 insertions(+), 28 deletions(-) diff --git a/src/main/java/emu/lunarcore/data/excel/StageExcel.java b/src/main/java/emu/lunarcore/data/excel/StageExcel.java index d29acd2..3ab58a2 100644 --- a/src/main/java/emu/lunarcore/data/excel/StageExcel.java +++ b/src/main/java/emu/lunarcore/data/excel/StageExcel.java @@ -1,7 +1,13 @@ package emu.lunarcore.data.excel; +import java.util.ArrayList; +import java.util.List; + import emu.lunarcore.data.GameResource; import emu.lunarcore.data.ResourceType; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; +import lombok.AccessLevel; import lombok.Getter; @Getter @@ -10,6 +16,12 @@ public class StageExcel extends GameResource { private int StageID; private long StageName; private int Level; + + @Getter(AccessLevel.NONE) + private List MonsterList; + + // Cache + private transient List monsterWaves; @Override public int getId() { @@ -18,6 +30,37 @@ public class StageExcel extends GameResource { @Override public void onLoad() { - + // Cache monster list + this.monsterWaves = new ArrayList<>(); + for (StageMonsterWave wave : MonsterList) { + this.monsterWaves.add(wave.toList()); + } + } + + public static class StageMonsterWave { + private int Monster0; + private int Monster1; + private int Monster2; + private int Monster3; + private int Monster4; + + // Sigh... + public IntList toList() { + IntList list = new IntArrayList(5); + + if (this.Monster0 != 0) { + list.add(this.Monster0); + } if (this.Monster1 != 0) { + list.add(this.Monster1); + } if (this.Monster2 != 0) { + list.add(this.Monster2); + } if (this.Monster3 != 0) { + list.add(this.Monster3); + } if (this.Monster4 != 0) { + list.add(this.Monster4); + } + + return list; + } } } diff --git a/src/main/java/emu/lunarcore/game/battle/Battle.java b/src/main/java/emu/lunarcore/game/battle/Battle.java index 7eb7683..eedd86e 100644 --- a/src/main/java/emu/lunarcore/game/battle/Battle.java +++ b/src/main/java/emu/lunarcore/game/battle/Battle.java @@ -1,6 +1,7 @@ package emu.lunarcore.game.battle; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import emu.lunarcore.data.GameData; @@ -14,6 +15,7 @@ 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 @@ -22,14 +24,17 @@ public class Battle { private final PlayerLineup lineup; private final List npcMonsters; private final List buffs; - private StageExcel stage; + private final List stages; - public Battle(Player player, PlayerLineup lineup, StageExcel stage) { + // Constructor params subject to change + public Battle(Player player, PlayerLineup lineup, Collection stages) { this.player = player; this.lineup = lineup; this.npcMonsters = new ArrayList<>(); this.buffs = new ArrayList<>(); - this.stage = stage; + this.stages = new ArrayList<>(); + + this.stages.addAll(stages); } public MazeBuff addBuff(int buffId, int ownerId) { @@ -47,24 +52,31 @@ public class Battle { } public SceneBattleInfo toProto() { - var wave = SceneMonsterWave.newInstance() - .setStageId(stage.getId()); - - int[] monsters = {101203002, 100202003, 100204007, 100205006}; - - for (int i = 0; i < 5; i++) { - var m = SceneMonster.newInstance() - .setMonsterId(Utils.randomElement(monsters)); - - wave.addMonsterList(m); - } - + // Build battle info var proto = SceneBattleInfo.newInstance() - .setStageId(stage.getId()) .setLogicRandomSeed(Utils.randomRange(1, Short.MAX_VALUE)) - .addMonsterWaveList(wave) .setWorldLevel(player.getWorldLevel()); + // Add monster waves from stages + for (StageExcel stage : stages) { + // Build monster waves + for (IntList sceneMonsterWave : stage.getMonsterWaves()) { + var wave = SceneMonsterWave.newInstance().setStageId(stage.getId()); + + for (int monsterId : sceneMonsterWave) { + var monster = SceneMonster.newInstance().setMonsterId(monsterId); + wave.addMonsterList(monster); + } + + proto.addMonsterWaveList(wave); + } + + // Set stage for the battle + if (proto.getStageId() == 0) { + proto.setStageId(stage.getId()); + } + } + // Buffs for (MazeBuff buff : this.getBuffs()) { proto.addBuffList(buff.toProto()); diff --git a/src/main/java/emu/lunarcore/game/battle/BattleService.java b/src/main/java/emu/lunarcore/game/battle/BattleService.java index 3fac317..a453be1 100644 --- a/src/main/java/emu/lunarcore/game/battle/BattleService.java +++ b/src/main/java/emu/lunarcore/game/battle/BattleService.java @@ -1,11 +1,10 @@ package emu.lunarcore.game.battle; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Objects; import emu.lunarcore.data.GameData; +import emu.lunarcore.data.excel.StageExcel; import emu.lunarcore.game.avatar.GameAvatar; import emu.lunarcore.game.player.Player; import emu.lunarcore.game.scene.entity.EntityMonster; @@ -18,6 +17,7 @@ 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.PacketSyncLineupNotify; + import us.hebi.quickbuf.RepeatedInt; import us.hebi.quickbuf.RepeatedMessage; @@ -76,8 +76,25 @@ public class BattleService extends BaseGameService { // Start battle if (monsters.size() > 0) { + // Get stages from monsters + List stages = new ArrayList<>(); + + for (var monster : monsters) { + StageExcel stage = GameData.getStageExcelMap().get(monster.getStageId(player.getWorldLevel())); + + if (stage != null) { + stages.add(stage); + } + } + + if (stages.size() == 0) { + // An error has occurred while trying to get stage data + player.sendPacket(new PacketSceneCastSkillScRsp(1)); + return; + } + // Create battle and add npc monsters to it - Battle battle = new Battle(player, player.getLineupManager().getCurrentLineup(), GameData.getStageExcelMap().get(1)); + Battle battle = new Battle(player, player.getLineupManager().getCurrentLineup(), stages); battle.getNpcMonsters().addAll(monsters); // Add weakness buff to battle if (isPlayerCaster) { diff --git a/src/main/java/emu/lunarcore/game/scene/Scene.java b/src/main/java/emu/lunarcore/game/scene/Scene.java index 560944c..f51012a 100644 --- a/src/main/java/emu/lunarcore/game/scene/Scene.java +++ b/src/main/java/emu/lunarcore/game/scene/Scene.java @@ -80,11 +80,10 @@ public class Scene { for (MonsterInfo monsterInfo : group.getMonsterList()) { // Get excels from game data NpcMonsterExcel npcMonsterExcel = GameData.getNpcMonsterExcelMap().get(monsterInfo.getNPCMonsterID()); - StageExcel stage = GameData.getStageExcelMap().get(1); - if (excel == null || stage == null) continue; + if (excel == null) continue; // Create monster with excels - EntityMonster monster = new EntityMonster(npcMonsterExcel, stage, monsterInfo.clonePos()); + EntityMonster monster = new EntityMonster(npcMonsterExcel, monsterInfo.clonePos()); monster.getRot().setY((int) (monsterInfo.getRotY() * 1000f)); monster.setInstId(monsterInfo.getID()); monster.setEventId(monsterInfo.getEventID()); diff --git a/src/main/java/emu/lunarcore/game/scene/entity/EntityMonster.java b/src/main/java/emu/lunarcore/game/scene/entity/EntityMonster.java index a54cb15..36c84d7 100644 --- a/src/main/java/emu/lunarcore/game/scene/entity/EntityMonster.java +++ b/src/main/java/emu/lunarcore/game/scene/entity/EntityMonster.java @@ -19,16 +19,18 @@ public class EntityMonster implements GameEntity { @Setter private int eventId; private NpcMonsterExcel excel; - private StageExcel stage; private Position pos; private Position rot; - public EntityMonster(NpcMonsterExcel excel, StageExcel stage, Position pos) { + public EntityMonster(NpcMonsterExcel excel, Position pos) { this.excel = excel; - this.stage = stage; this.pos = pos; this.rot = new Position(); } + + public int getStageId(int worldLevel) { + return (this.getEventId() * 10) + worldLevel; + } @Override public SceneEntityInfo toSceneEntityProto() { @@ -46,5 +48,4 @@ public class EntityMonster implements GameEntity { return proto; } - }