mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-14 06:14:45 +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.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
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() {
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
Reference in New Issue
Block a user