mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-13 13:54:37 +01:00
Rewrite challenges to use the EntityLoader system
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user