Rewrite challenges to use the EntityLoader system

This commit is contained in:
Melledy
2023-10-29 23:39:47 -07:00
parent bb08f7dd05
commit 9246664b4b
4 changed files with 113 additions and 49 deletions

View File

@@ -2,6 +2,8 @@ package emu.lunarcore.data.excel;
import emu.lunarcore.data.GameResource; import emu.lunarcore.data.GameResource;
import emu.lunarcore.data.ResourceType; import emu.lunarcore.data.ResourceType;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@@ -19,14 +21,59 @@ public class ChallengeExcel extends GameResource {
private int[] ConfigList1; private int[] ConfigList1;
private int[] NpcMonsterIDList1; private int[] NpcMonsterIDList1;
private int[] EventIDList1; private int[] EventIDList1;
private int MazeGroupID2; private int MazeGroupID2;
private int[] ConfigList2; private int[] ConfigList2;
private int[] NpcMonsterIDList2; private int[] NpcMonsterIDList2;
private int[] EventIDList2; private int[] EventIDList2;
private transient Int2ObjectMap<ChallengeMonsterInfo> challengeMonsters1;
private transient Int2ObjectMap<ChallengeMonsterInfo> challengeMonsters2;
@Override @Override
public int getId() { public int getId() {
return ID; 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;
}
}
} }

View File

@@ -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<ChallengeMonsterInfo> 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;
}
}

View File

@@ -1,11 +1,9 @@
package emu.lunarcore.game.challenge; package emu.lunarcore.game.challenge;
import dev.morphia.annotations.Entity; import dev.morphia.annotations.Entity;
import emu.lunarcore.data.GameData; 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.ChallengeExcel;
import emu.lunarcore.data.excel.NpcMonsterExcel;
import emu.lunarcore.game.battle.Battle; import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.player.Player; import emu.lunarcore.game.player.Player;
import emu.lunarcore.game.scene.Scene; 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.PacketChallengeLineupNotify;
import emu.lunarcore.server.packet.send.PacketChallengeSettleNotify; import emu.lunarcore.server.packet.send.PacketChallengeSettleNotify;
import emu.lunarcore.util.Position; import emu.lunarcore.util.Position;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -69,54 +68,11 @@ public class ChallengeInstance {
} }
protected void setupStage1() { protected void setupStage1() {
this.setupStage( this.getScene().loadGroup(excel.getMazeGroupID1());
excel.getMazeGroupID1(),
excel.getConfigList1(),
excel.getNpcMonsterIDList1(),
excel.getEventIDList1(),
false
);
} }
protected void setupStage2() { protected void setupStage2() {
this.setupStage( this.getScene().loadGroup(excel.getMazeGroupID2());
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);
}
} }
private int getRoundsElapsed() { private int getRoundsElapsed() {

View File

@@ -1,5 +1,6 @@
package emu.lunarcore.game.enums; package emu.lunarcore.game.enums;
import emu.lunarcore.game.challenge.ChallengeEntityLoader;
import emu.lunarcore.game.rogue.RogueEntityLoader; import emu.lunarcore.game.rogue.RogueEntityLoader;
import emu.lunarcore.game.scene.SceneEntityLoader; import emu.lunarcore.game.scene.SceneEntityLoader;
import lombok.Getter; import lombok.Getter;
@@ -10,7 +11,7 @@ public enum PlaneType {
Town (1), Town (1),
Maze (2), Maze (2),
Train (3), Train (3),
Challenge (4), Challenge (4, new ChallengeEntityLoader()),
Rogue (5, new RogueEntityLoader()), Rogue (5, new RogueEntityLoader()),
Raid (6), Raid (6),
AetherDivide (7), AetherDivide (7),