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.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<ChallengeMonsterInfo> challengeMonsters1;
private transient Int2ObjectMap<ChallengeMonsterInfo> 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;
}
}
}

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;
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() {

View File

@@ -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),