From 9246664b4bf3d3c974f537c487004a69fbf92393 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Sun, 29 Oct 2023 23:39:47 -0700 Subject: [PATCH] Rewrite challenges to use the EntityLoader system --- .../lunarcore/data/excel/ChallengeExcel.java | 47 +++++++++++++++ .../game/challenge/ChallengeEntityLoader.java | 60 +++++++++++++++++++ .../game/challenge/ChallengeInstance.java | 52 ++-------------- .../emu/lunarcore/game/enums/PlaneType.java | 3 +- 4 files changed, 113 insertions(+), 49 deletions(-) create mode 100644 src/main/java/emu/lunarcore/game/challenge/ChallengeEntityLoader.java diff --git a/src/main/java/emu/lunarcore/data/excel/ChallengeExcel.java b/src/main/java/emu/lunarcore/data/excel/ChallengeExcel.java index 57ba3e7..91b96c6 100644 --- a/src/main/java/emu/lunarcore/data/excel/ChallengeExcel.java +++ b/src/main/java/emu/lunarcore/data/excel/ChallengeExcel.java @@ -2,6 +2,8 @@ package emu.lunarcore.data.excel; import emu.lunarcore.data.GameResource; import emu.lunarcore.data.ResourceType; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import lombok.Getter; @Getter @@ -19,14 +21,59 @@ public class ChallengeExcel extends GameResource { private int[] ConfigList1; private int[] NpcMonsterIDList1; private int[] EventIDList1; + private int MazeGroupID2; private int[] ConfigList2; private int[] NpcMonsterIDList2; private int[] EventIDList2; + private transient Int2ObjectMap challengeMonsters1; + private transient Int2ObjectMap challengeMonsters2; + @Override public int getId() { return ID; } + + @Override + public void onLoad() { + // Cache challenge monsters + this.challengeMonsters1 = new Int2ObjectOpenHashMap<>(); + for (int i = 0; i < ConfigList1.length; i++) { + if (ConfigList1[i] == 0) break; + + var monster = new ChallengeMonsterInfo(ConfigList1[i], NpcMonsterIDList1[i], EventIDList1[i]); + this.challengeMonsters1.put(monster.getConfigId(), monster); + } + + this.challengeMonsters2 = new Int2ObjectOpenHashMap<>(); + for (int i = 0; i < ConfigList2.length; i++) { + if (ConfigList2[i] == 0) break; + + var monster = new ChallengeMonsterInfo(ConfigList2[i], NpcMonsterIDList2[i], EventIDList2[i]); + this.challengeMonsters2.put(monster.getConfigId(), monster); + } + + // Clear arrays to save memory + this.ConfigList1 = null; + this.NpcMonsterIDList1 = null; + this.EventIDList1 = null; + this.ConfigList2 = null; + this.NpcMonsterIDList2 = null; + this.EventIDList2 = null; + } + @Getter + public static class ChallengeMonsterInfo { + private int configId; + private int npcMonsterId; + private int eventId; + + public ChallengeMonsterInfo(int configId, int npcMonsterId, int eventId) { + this.configId = configId; + this.npcMonsterId = npcMonsterId; + this.eventId = eventId; + } + + } } diff --git a/src/main/java/emu/lunarcore/game/challenge/ChallengeEntityLoader.java b/src/main/java/emu/lunarcore/game/challenge/ChallengeEntityLoader.java new file mode 100644 index 0000000..2511d69 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/challenge/ChallengeEntityLoader.java @@ -0,0 +1,60 @@ +package emu.lunarcore.game.challenge; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.config.GroupInfo; +import emu.lunarcore.data.config.MonsterInfo; +import emu.lunarcore.data.config.NpcInfo; +import emu.lunarcore.data.config.PropInfo; +import emu.lunarcore.data.excel.NpcMonsterExcel; +import emu.lunarcore.data.excel.ChallengeExcel.ChallengeMonsterInfo; +import emu.lunarcore.game.scene.Scene; +import emu.lunarcore.game.scene.SceneEntityLoader; +import emu.lunarcore.game.scene.entity.EntityMonster; +import emu.lunarcore.game.scene.entity.EntityNpc; +import emu.lunarcore.game.scene.entity.EntityProp; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; + +public class ChallengeEntityLoader extends SceneEntityLoader { + + @Override + public EntityMonster loadMonster(Scene scene, GroupInfo group, MonsterInfo monsterInfo) { + // Get challenge instance + ChallengeInstance instance = scene.getPlayer().getChallengeInstance(); + if (instance == null) return null; + + // Get current stage monster infos + Int2ObjectMap challengeMonsters = null; + if (instance.getExcel().getMazeGroupID1() == group.getId()) { + challengeMonsters = instance.getExcel().getChallengeMonsters1(); + } else if (instance.getExcel().getMazeGroupID2() == group.getId()) { + challengeMonsters = instance.getExcel().getChallengeMonsters2(); + } else { + return null; + } + + // Get challenge monster info + var challengeMonsterInfo = challengeMonsters.get(monsterInfo.getID()); + if (challengeMonsterInfo == null) return null; + + // Get excels from game data + NpcMonsterExcel npcMonsterExcel = GameData.getNpcMonsterExcelMap().get(challengeMonsterInfo.getNpcMonsterId()); + if (npcMonsterExcel == null) return null; + + // Create monster from group monster info + EntityMonster monster = new EntityMonster(scene, npcMonsterExcel, group, monsterInfo); + monster.setEventId(challengeMonsterInfo.getEventId()); + monster.setOverrideStageId(challengeMonsterInfo.getEventId()); + + return monster; + } + + @Override + public EntityProp loadProp(Scene scene, GroupInfo group, PropInfo propInfo) { + return null; + } + + @Override + public EntityNpc loadNpc(Scene scene, GroupInfo group, NpcInfo npcInfo) { + return null; + } +} diff --git a/src/main/java/emu/lunarcore/game/challenge/ChallengeInstance.java b/src/main/java/emu/lunarcore/game/challenge/ChallengeInstance.java index 256f092..7f32141 100644 --- a/src/main/java/emu/lunarcore/game/challenge/ChallengeInstance.java +++ b/src/main/java/emu/lunarcore/game/challenge/ChallengeInstance.java @@ -1,11 +1,9 @@ package emu.lunarcore.game.challenge; import dev.morphia.annotations.Entity; + import emu.lunarcore.data.GameData; -import emu.lunarcore.data.config.GroupInfo; -import emu.lunarcore.data.config.MonsterInfo; import emu.lunarcore.data.excel.ChallengeExcel; -import emu.lunarcore.data.excel.NpcMonsterExcel; import emu.lunarcore.game.battle.Battle; import emu.lunarcore.game.player.Player; import emu.lunarcore.game.scene.Scene; @@ -18,6 +16,7 @@ import emu.lunarcore.proto.ExtraLineupTypeOuterClass.ExtraLineupType; import emu.lunarcore.server.packet.send.PacketChallengeLineupNotify; import emu.lunarcore.server.packet.send.PacketChallengeSettleNotify; import emu.lunarcore.util.Position; + import lombok.Getter; import lombok.Setter; @@ -69,54 +68,11 @@ public class ChallengeInstance { } protected void setupStage1() { - this.setupStage( - excel.getMazeGroupID1(), - excel.getConfigList1(), - excel.getNpcMonsterIDList1(), - excel.getEventIDList1(), - false - ); + this.getScene().loadGroup(excel.getMazeGroupID1()); } protected void setupStage2() { - this.setupStage( - excel.getMazeGroupID2(), - excel.getConfigList2(), - excel.getNpcMonsterIDList2(), - excel.getEventIDList2(), - true - ); - } - - private void setupStage(int groupId, int[] configs, int[] npcMonsters, int[] eventIds, boolean sendPacket) { - // Load group - GroupInfo group = getScene().getFloorInfo().getGroups().get(groupId); - - // Replace monsters in scene - for (int i = 0; i < configs.length; i++) { - // Setup vars - int instId = configs[i]; - int npcMonster = npcMonsters[i]; - int eventId = eventIds[i]; - - // Get monster info - MonsterInfo monsterInfo = group.getMonsterById(instId); - if (monsterInfo == null) continue; - - // Get excels from game data - NpcMonsterExcel npcMonsterExcel = GameData.getNpcMonsterExcelMap().get(npcMonster); - if (npcMonsterExcel == null) continue; - - // Create monster with excels - EntityMonster monster = new EntityMonster(getScene(), npcMonsterExcel, group, monsterInfo); - monster.setInstId(instId); - monster.setEventId(eventId); - monster.setOverrideStageId(eventId); - monster.setWorldLevel(this.getPlayer().getWorldLevel()); - - // Add to scene - getScene().addEntity(monster, sendPacket); - } + this.getScene().loadGroup(excel.getMazeGroupID2()); } private int getRoundsElapsed() { diff --git a/src/main/java/emu/lunarcore/game/enums/PlaneType.java b/src/main/java/emu/lunarcore/game/enums/PlaneType.java index 77891ac..9a5268b 100644 --- a/src/main/java/emu/lunarcore/game/enums/PlaneType.java +++ b/src/main/java/emu/lunarcore/game/enums/PlaneType.java @@ -1,5 +1,6 @@ package emu.lunarcore.game.enums; +import emu.lunarcore.game.challenge.ChallengeEntityLoader; import emu.lunarcore.game.rogue.RogueEntityLoader; import emu.lunarcore.game.scene.SceneEntityLoader; import lombok.Getter; @@ -10,7 +11,7 @@ public enum PlaneType { Town (1), Maze (2), Train (3), - Challenge (4), + Challenge (4, new ChallengeEntityLoader()), Rogue (5, new RogueEntityLoader()), Raid (6), AetherDivide (7),