mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-23 18:54:37 +01:00
Implement rogue entry
This commit is contained in:
@@ -28,11 +28,14 @@ public class GameData {
|
||||
@Getter private static Int2ObjectMap<MazePlaneExcel> mazePlaneExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
@Getter private static Int2ObjectMap<MapEntranceExcel> mapEntranceExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
@Getter private static Int2ObjectMap<HeroExcel> heroExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
@Getter private static Int2ObjectMap<ShopExcel> shopExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
@Getter private static Int2ObjectMap<ChallengeExcel> challengeExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
@Getter private static Int2ObjectMap<ChallengeTargetExcel> challengeTargetExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
@Getter private static Int2ObjectMap<RogueAreaExcel> rogueAreaExcelMap = new Int2ObjectLinkedOpenHashMap<>();
|
||||
@Getter private static Int2ObjectMap<RogueScheduleExcel> rogueScheduleExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
@Getter private static Int2ObjectMap<ShopExcel> shopExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
@Getter private static Int2ObjectMap<RogueRoomExcel> rogueRoomExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
private static Int2ObjectMap<AvatarPromotionExcel> avatarPromotionExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
private static Int2ObjectMap<AvatarSkillTreeExcel> avatarSkillTreeExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
@@ -5,16 +5,22 @@ import java.util.List;
|
||||
|
||||
import emu.lunarcore.data.excel.RelicMainAffixExcel;
|
||||
import emu.lunarcore.data.excel.RelicSubAffixExcel;
|
||||
import emu.lunarcore.data.excel.RogueMapExcel;
|
||||
import emu.lunarcore.data.excel.RogueScheduleExcel;
|
||||
import emu.lunarcore.util.Utils;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import lombok.Getter;
|
||||
|
||||
// Game data that is parsed by the server goes here
|
||||
public class GameDepot {
|
||||
private static Int2ObjectMap<List<RelicMainAffixExcel>> relicMainAffixDepot = new Int2ObjectOpenHashMap<>();
|
||||
private static Int2ObjectMap<List<RelicSubAffixExcel>> relicSubAffixDepot = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
@Getter
|
||||
private static Int2ObjectMap<int[]> rogueMapGen = new Int2ObjectOpenHashMap<>();
|
||||
private static Int2ObjectMap<List<RogueMapExcel>> rogueMapDepot = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
public static void addRelicMainAffix(RelicMainAffixExcel affix) {
|
||||
List<RelicMainAffixExcel> list = relicMainAffixDepot.computeIfAbsent(affix.getGroupID(), k -> new ArrayList<>());
|
||||
list.add(affix);
|
||||
@@ -48,4 +54,9 @@ public class GameDepot {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static List<RogueMapExcel> getRogueMapsById(int mapId) {
|
||||
return rogueMapDepot.computeIfAbsent(mapId, id -> new ArrayList<>());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -45,6 +45,8 @@ public class ResourceLoader {
|
||||
loadFloorInfos();
|
||||
// Load maze abilities
|
||||
loadMazeAbilities();
|
||||
// Load rogue maps
|
||||
loadRogueMapGen();
|
||||
|
||||
// Done
|
||||
loaded = true;
|
||||
@@ -235,4 +237,22 @@ public class ResourceLoader {
|
||||
// Done
|
||||
LunarRail.getLogger().info("Loaded " + count + " maze abilities for avatars.");
|
||||
}
|
||||
|
||||
private static void loadRogueMapGen() {
|
||||
File file = new File(LunarRail.getConfig().getDataDir() + "/RogueMapGen.json");
|
||||
if (!file.exists()) return;
|
||||
|
||||
try (FileReader reader = new FileReader(file)) {
|
||||
Map<Integer, int[]> rogue = gson.fromJson(reader, TypeToken.getParameterized(Map.class, Integer.class, int[].class).getType());
|
||||
|
||||
for (var entry : rogue.entrySet()) {
|
||||
GameDepot.getRogueMapGen().put(entry.getKey().intValue(), entry.getValue());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// Done
|
||||
LunarRail.getLogger().info("Loaded rogue maps");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
package emu.lunarcore.data.excel;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
import emu.lunarcore.data.GameResource;
|
||||
import emu.lunarcore.data.ResourceType;
|
||||
import emu.lunarcore.game.enums.GameModeType;
|
||||
import emu.lunarcore.game.enums.PlaneType;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@@ -10,7 +12,9 @@ import lombok.Getter;
|
||||
public class MazePlaneExcel extends GameResource {
|
||||
private int PlaneID;
|
||||
private int WorldID;
|
||||
private GameModeType PlaneType = GameModeType.Unknown;
|
||||
|
||||
@SerializedName(value = "PlaneType")
|
||||
private PlaneType planeType = PlaneType.Unknown;
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
|
||||
@@ -1,19 +1,35 @@
|
||||
package emu.lunarcore.data.excel;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import emu.lunarcore.data.GameDepot;
|
||||
import emu.lunarcore.data.GameResource;
|
||||
import emu.lunarcore.data.ResourceType;
|
||||
import emu.lunarcore.data.ResourceType.LoadPriority;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@ResourceType(name = {"RogueAreaConfig.json"})
|
||||
@ResourceType(name = {"RogueAreaConfig.json"}, loadPriority = LoadPriority.LOW)
|
||||
public class RogueAreaExcel extends GameResource {
|
||||
private int RogueAreaID;
|
||||
private int AreaProgress;
|
||||
private int Difficulty;
|
||||
|
||||
private transient int mapId;
|
||||
private transient List<RogueMapExcel> sites;
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return RogueAreaID;
|
||||
}
|
||||
|
||||
public boolean isValid() {
|
||||
return this.sites != null && this.sites.size() > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
this.mapId = (this.AreaProgress * 100) + this.Difficulty;
|
||||
this.sites = GameDepot.getRogueMapsById(this.getMapId());
|
||||
}
|
||||
}
|
||||
|
||||
27
src/main/java/emu/lunarcore/data/excel/RogueMapExcel.java
Normal file
27
src/main/java/emu/lunarcore/data/excel/RogueMapExcel.java
Normal file
@@ -0,0 +1,27 @@
|
||||
package emu.lunarcore.data.excel;
|
||||
|
||||
import emu.lunarcore.data.GameDepot;
|
||||
import emu.lunarcore.data.GameResource;
|
||||
import emu.lunarcore.data.ResourceType;
|
||||
import emu.lunarcore.data.ResourceType.LoadPriority;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@ResourceType(name = {"RogueMap.json"}, loadPriority = LoadPriority.HIGH)
|
||||
public class RogueMapExcel extends GameResource {
|
||||
private int RogueMapID;
|
||||
private int SiteID;
|
||||
private boolean IsStart;
|
||||
private int[] NextSiteIDList;
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return (RogueMapID << 8) + SiteID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
GameDepot.getRogueMapsById(this.getRogueMapID()).add(this);
|
||||
}
|
||||
|
||||
}
|
||||
24
src/main/java/emu/lunarcore/data/excel/RogueRoomExcel.java
Normal file
24
src/main/java/emu/lunarcore/data/excel/RogueRoomExcel.java
Normal file
@@ -0,0 +1,24 @@
|
||||
package emu.lunarcore.data.excel;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import emu.lunarcore.data.GameResource;
|
||||
import emu.lunarcore.data.ResourceType;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@ResourceType(name = {"RogueRoom.json"})
|
||||
public class RogueRoomExcel extends GameResource {
|
||||
private int RogueRoomID;
|
||||
private int RogueRoomType;
|
||||
private int MapEntrance;
|
||||
private int GroupID;
|
||||
private Map<Integer, Integer> GroupWithContent;
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return RogueRoomID;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package emu.lunarcore.game.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum GameModeType {
|
||||
Unknown (0),
|
||||
Town (1),
|
||||
Maze (2),
|
||||
Train (3),
|
||||
Challenge (4),
|
||||
RogueExplore (5),
|
||||
RogueChallenge (6),
|
||||
TownRoom (7),
|
||||
Raid (8),
|
||||
FarmRelic (9),
|
||||
Client (10),
|
||||
ChallengeActivity (11),
|
||||
ActivityPunkLord (12),
|
||||
RogueAeonRoom (13),
|
||||
TrialActivity (14),
|
||||
AetherDivide (15),
|
||||
ChessRogue (16);
|
||||
|
||||
private final int val;
|
||||
|
||||
private GameModeType(int value) {
|
||||
this.val = value;
|
||||
}
|
||||
}
|
||||
22
src/main/java/emu/lunarcore/game/enums/PlaneType.java
Normal file
22
src/main/java/emu/lunarcore/game/enums/PlaneType.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package emu.lunarcore.game.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum PlaneType {
|
||||
Unknown (0),
|
||||
Town (1),
|
||||
Maze (2),
|
||||
Train (3),
|
||||
Challenge (4),
|
||||
Rogue (5),
|
||||
Raid (6),
|
||||
AetherDivide (7),
|
||||
TrialActivity (8);
|
||||
|
||||
private final int val;
|
||||
|
||||
private PlaneType(int value) {
|
||||
this.val = value;
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,7 @@ import emu.lunarcore.game.enums.PropState;
|
||||
import emu.lunarcore.game.gacha.PlayerGachaInfo;
|
||||
import emu.lunarcore.game.inventory.Inventory;
|
||||
import emu.lunarcore.game.mail.Mailbox;
|
||||
import emu.lunarcore.game.rogue.RogueData;
|
||||
import emu.lunarcore.game.rogue.RogueManager;
|
||||
import emu.lunarcore.game.scene.Scene;
|
||||
import emu.lunarcore.game.scene.entity.EntityProp;
|
||||
@@ -97,6 +98,7 @@ public class Player {
|
||||
|
||||
@Setter private transient boolean paused;
|
||||
@Setter private transient ChallengeData challengeData;
|
||||
@Setter private transient RogueData rogueData;
|
||||
|
||||
@Deprecated // Morphia only
|
||||
public Player() {
|
||||
|
||||
86
src/main/java/emu/lunarcore/game/rogue/RogueData.java
Normal file
86
src/main/java/emu/lunarcore/game/rogue/RogueData.java
Normal file
@@ -0,0 +1,86 @@
|
||||
package emu.lunarcore.game.rogue;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import emu.lunarcore.data.excel.RogueAreaExcel;
|
||||
import emu.lunarcore.game.player.Player;
|
||||
import emu.lunarcore.proto.RogueCurrentInfoOuterClass.RogueCurrentInfo;
|
||||
import emu.lunarcore.proto.RogueMapInfoOuterClass.RogueMapInfo;
|
||||
import emu.lunarcore.proto.RogueRoomStatusOuterClass.RogueRoomStatus;
|
||||
import emu.lunarcore.proto.RogueStatusOuterClass.RogueStatus;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class RogueData {
|
||||
private transient Player player;
|
||||
private transient RogueAreaExcel excel;
|
||||
|
||||
private int currentRoomProgress;
|
||||
private int currentSiteId;
|
||||
private Set<Integer> baseAvatarIds;
|
||||
private TreeMap<Integer, RogueRoomData> rooms;
|
||||
|
||||
public RogueData(Player player, RogueAreaExcel excel) {
|
||||
this.player = player;
|
||||
this.excel = excel;
|
||||
this.currentRoomProgress = 1;
|
||||
this.baseAvatarIds = new HashSet<>();
|
||||
|
||||
this.initRooms();
|
||||
}
|
||||
|
||||
public RogueStatus getStatus() {
|
||||
return RogueStatus.ROGUE_STATUS_DOING;
|
||||
}
|
||||
|
||||
private void initRooms() {
|
||||
if (this.rooms != null) return;
|
||||
|
||||
this.rooms = new TreeMap<>();
|
||||
|
||||
for (var mapExcel : this.getExcel().getSites()) {
|
||||
var roomData = new RogueRoomData(mapExcel);
|
||||
this.rooms.put(roomData.getSiteId(), roomData);
|
||||
|
||||
if (mapExcel.isIsStart()) {
|
||||
this.setCurrentRoom(roomData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void setCurrentRoom(RogueRoomData roomData) {
|
||||
this.currentSiteId = roomData.getSiteId();
|
||||
roomData.setStatus(RogueRoomStatus.ROGUE_ROOM_STATUS_PLAY); // TODO reset when changing rooms
|
||||
}
|
||||
|
||||
public RogueRoomData getCurrentRoom() {
|
||||
return this.rooms.get(this.getCurrentSiteId());
|
||||
}
|
||||
|
||||
public RogueCurrentInfo toProto() {
|
||||
var proto = RogueCurrentInfo.newInstance()
|
||||
.setStatus(this.getStatus())
|
||||
.setRoomMap(this.toMapProto());
|
||||
|
||||
return proto;
|
||||
}
|
||||
|
||||
public RogueMapInfo toMapProto() {
|
||||
var room = this.getCurrentRoom();
|
||||
|
||||
var proto = RogueMapInfo.newInstance()
|
||||
.setAreaId(this.getExcel().getId())
|
||||
.setMapId(this.getExcel().getMapId())
|
||||
.setCurSiteId(room.getSiteId())
|
||||
.setCurRoomId(room.getRoomId());
|
||||
|
||||
for (var roomData : this.getRooms().values()) {
|
||||
proto.addRoomList(roomData.toProto());
|
||||
}
|
||||
|
||||
return proto;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,23 +1,105 @@
|
||||
package emu.lunarcore.game.rogue;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import emu.lunarcore.data.GameData;
|
||||
import emu.lunarcore.data.GameDepot;
|
||||
import emu.lunarcore.data.config.AnchorInfo;
|
||||
import emu.lunarcore.data.excel.RogueRoomExcel;
|
||||
import emu.lunarcore.game.player.BasePlayerManager;
|
||||
import emu.lunarcore.game.player.Player;
|
||||
import emu.lunarcore.game.player.PlayerLineup;
|
||||
import emu.lunarcore.proto.ExtraLineupTypeOuterClass.ExtraLineupType;
|
||||
import emu.lunarcore.proto.RogueAreaOuterClass.RogueArea;
|
||||
import emu.lunarcore.proto.RogueAreaStatusOuterClass.RogueAreaStatus;
|
||||
import emu.lunarcore.proto.RogueInfoDataOuterClass.RogueInfoData;
|
||||
import emu.lunarcore.proto.RogueInfoOuterClass.RogueInfo;
|
||||
import emu.lunarcore.proto.RogueScoreRewardInfoOuterClass.RogueScoreRewardInfo;
|
||||
import emu.lunarcore.proto.RogueSeasonInfoOuterClass.RogueSeasonInfo;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
import emu.lunarcore.server.packet.send.PacketStartRogueScRsp;
|
||||
|
||||
import us.hebi.quickbuf.RepeatedInt;
|
||||
|
||||
public class RogueManager extends BasePlayerManager {
|
||||
|
||||
public RogueManager(Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
public void startRogue(int areaId, RepeatedInt avatarIdList) {
|
||||
// Get excel
|
||||
var excel = GameData.getRogueAreaExcelMap().get(areaId);
|
||||
if (excel == null || !excel.isValid()) {
|
||||
getPlayer().sendPacket(new PacketStartRogueScRsp());
|
||||
return;
|
||||
}
|
||||
|
||||
// Replace lineup
|
||||
getPlayer().getLineupManager().replaceLineup(0, ExtraLineupType.LINEUP_ROGUE_VALUE, Arrays.stream(avatarIdList.array()).boxed().toList());
|
||||
// Get lineup
|
||||
PlayerLineup lineup = getPlayer().getLineupManager().getLineupByIndex(0, ExtraLineupType.LINEUP_ROGUE_VALUE);
|
||||
// Make sure this lineup has avatars set
|
||||
if (lineup.getAvatars().size() == 0) {
|
||||
getPlayer().sendPacket(new PacketStartRogueScRsp());
|
||||
return;
|
||||
}
|
||||
|
||||
// Get entrance id
|
||||
RogueData data = new RogueData(getPlayer(), excel);
|
||||
int entranceId = data.getCurrentRoom().getRoomExcel().getMapEntrance();
|
||||
|
||||
// Reset hp/sp
|
||||
lineup.forEachAvatar(avatar -> {
|
||||
avatar.setCurrentHp(10000);
|
||||
avatar.setCurrentSp(avatar.getMaxSp());
|
||||
|
||||
data.getBaseAvatarIds().add(avatar.getAvatarId());
|
||||
});
|
||||
lineup.setMp(5); // Set technique points
|
||||
|
||||
// Set first lineup before we enter scenes
|
||||
getPlayer().getLineupManager().setCurrentExtraLineup(ExtraLineupType.LINEUP_ROGUE, false);
|
||||
|
||||
// Enter scene
|
||||
boolean success = getPlayer().enterScene(entranceId, 0, false);
|
||||
if (!success) {
|
||||
// Clear extra lineup if entering scene failed
|
||||
getPlayer().getLineupManager().setCurrentExtraLineup(0, false);
|
||||
// Send error packet
|
||||
getPlayer().sendPacket(new PacketStartRogueScRsp());
|
||||
return;
|
||||
}
|
||||
|
||||
// Load scene groups
|
||||
RogueRoomExcel roomExcel = data.getCurrentRoom().getExcel();
|
||||
for (var entry : roomExcel.getGroupWithContent().entrySet()) {
|
||||
getPlayer().getScene().loadGroup(entry.getKey());
|
||||
}
|
||||
|
||||
// Move player to rogue start position
|
||||
AnchorInfo anchor = getPlayer().getScene().getFloorInfo().getAnchorInfo(roomExcel.getGroupID(), 1);
|
||||
if (anchor != null) {
|
||||
getPlayer().getPos().set(anchor.getPos());
|
||||
getPlayer().getRot().set(anchor.getRot());
|
||||
}
|
||||
|
||||
// Set rogue data and send packet
|
||||
getPlayer().setRogueData(data);
|
||||
getPlayer().sendPacket(new PacketStartRogueScRsp(getPlayer()));
|
||||
}
|
||||
|
||||
public void quitRogue() {
|
||||
if (getPlayer().getRogueData() == null) {
|
||||
getPlayer().getSession().send(CmdId.QuitRogueScRsp);
|
||||
return;
|
||||
}
|
||||
|
||||
getPlayer().setRogueData(null);
|
||||
getPlayer().enterScene(8011201, 0, true); // Test
|
||||
getPlayer().getSession().send(CmdId.QuitRogueScRsp);
|
||||
}
|
||||
|
||||
public RogueInfo toProto() {
|
||||
var schedule = GameDepot.getCurrentRogueSchedule();
|
||||
@@ -27,7 +109,7 @@ public class RogueManager extends BasePlayerManager {
|
||||
long endTime = beginTime + TimeUnit.DAYS.toSeconds(8);
|
||||
|
||||
if (schedule != null) {
|
||||
seasonId = schedule.getId() % 100000;
|
||||
seasonId = 68; //schedule.getId() % 100000;
|
||||
}
|
||||
|
||||
var score = RogueScoreRewardInfo.newInstance()
|
||||
@@ -37,7 +119,7 @@ public class RogueManager extends BasePlayerManager {
|
||||
|
||||
var season = RogueSeasonInfo.newInstance()
|
||||
.setBeginTime(beginTime)
|
||||
.setRogueSeasonId(seasonId)
|
||||
.setSeasonId(seasonId)
|
||||
.setEndTime(endTime);
|
||||
|
||||
var data = RogueInfoData.newInstance()
|
||||
@@ -47,18 +129,37 @@ public class RogueManager extends BasePlayerManager {
|
||||
var proto = RogueInfo.newInstance()
|
||||
.setRogueScoreInfo(score)
|
||||
.setRogueData(data)
|
||||
.setRogueSeasonId(seasonId)
|
||||
.setSeasonId(seasonId)
|
||||
.setBeginTime(beginTime)
|
||||
.setEndTime(endTime);
|
||||
|
||||
// Rogue data
|
||||
RogueData curRogue = this.getPlayer().getRogueData();
|
||||
if (curRogue != null) {
|
||||
proto.setStatus(curRogue.getStatus());
|
||||
proto.setRogueProgress(this.getPlayer().getRogueData().toProto());
|
||||
proto.setRoomMap(proto.getRogueProgress().getRoomMap());
|
||||
|
||||
for (int id : curRogue.getBaseAvatarIds()) {
|
||||
proto.addBaseAvatarIdList(id);
|
||||
}
|
||||
}
|
||||
|
||||
// Add areas
|
||||
for (var excel : GameData.getRogueAreaExcelMap().values()) {
|
||||
var area = RogueArea.newInstance()
|
||||
.setAreaId(excel.getRogueAreaID())
|
||||
.setRogueAreaStatus(RogueAreaStatus.ROGUE_AREA_STATUS_FIRST_PASS);
|
||||
|
||||
if (curRogue != null && excel == curRogue.getExcel()) {
|
||||
area.setMapId(curRogue.getExcel().getMapId());
|
||||
area.setCurReachRoomNum(curRogue.getCurrentRoomProgress());
|
||||
area.setRogueStatus(curRogue.getStatus());
|
||||
}
|
||||
|
||||
proto.addRogueAreaList(area);
|
||||
}
|
||||
|
||||
return proto;
|
||||
}
|
||||
}
|
||||
}
|
||||
50
src/main/java/emu/lunarcore/game/rogue/RogueRoomData.java
Normal file
50
src/main/java/emu/lunarcore/game/rogue/RogueRoomData.java
Normal file
@@ -0,0 +1,50 @@
|
||||
package emu.lunarcore.game.rogue;
|
||||
|
||||
import emu.lunarcore.data.GameData;
|
||||
import emu.lunarcore.data.GameDepot;
|
||||
import emu.lunarcore.data.excel.RogueMapExcel;
|
||||
import emu.lunarcore.data.excel.RogueRoomExcel;
|
||||
import emu.lunarcore.proto.RogueRoomOuterClass.RogueRoom;
|
||||
import emu.lunarcore.proto.RogueRoomStatusOuterClass.RogueRoomStatus;
|
||||
import emu.lunarcore.util.Utils;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class RogueRoomData {
|
||||
private int roomId;
|
||||
private int siteId;
|
||||
private int status;
|
||||
private int[] nextSiteIds;
|
||||
|
||||
private transient RogueRoomExcel excel;
|
||||
|
||||
public RogueRoomData(RogueMapExcel mapExcel) {
|
||||
this.siteId = mapExcel.getSiteID();
|
||||
this.nextSiteIds = mapExcel.getNextSiteIDList();
|
||||
|
||||
int[] rooms = GameDepot.getRogueMapGen().get(this.siteId);
|
||||
if (rooms != null) {
|
||||
this.roomId = Utils.randomElement(rooms);
|
||||
}
|
||||
}
|
||||
|
||||
public void setStatus(RogueRoomStatus status) {
|
||||
this.status = status.getNumber();
|
||||
}
|
||||
|
||||
public RogueRoomExcel getRoomExcel() {
|
||||
if (excel == null) {
|
||||
excel = GameData.getRogueRoomExcelMap().get(this.getRoomId());
|
||||
}
|
||||
return excel;
|
||||
}
|
||||
|
||||
public RogueRoom toProto() {
|
||||
var proto = RogueRoom.newInstance()
|
||||
.setRoomId(this.getRoomId())
|
||||
.setSiteId(this.getSiteId())
|
||||
.setRoomStatusValue(this.getStatus());
|
||||
|
||||
return proto;
|
||||
}
|
||||
}
|
||||
23
src/main/java/emu/lunarcore/game/rogue/RogueRoomType.java
Normal file
23
src/main/java/emu/lunarcore/game/rogue/RogueRoomType.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package emu.lunarcore.game.rogue;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
public enum RogueRoomType {
|
||||
UNKNOWN (0),
|
||||
COMBAT_1 (1),
|
||||
COMBAT_2 (2),
|
||||
OCCURRENCE (3),
|
||||
ENCOUNTER (4),
|
||||
RESPITE (5),
|
||||
ELITE (6),
|
||||
BOSS (7),
|
||||
TRANSACTION (8),
|
||||
ADVENTURE (9);
|
||||
|
||||
@Getter
|
||||
private final int val;
|
||||
|
||||
private RogueRoomType(int value) {
|
||||
this.val = value;
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@ import emu.lunarcore.data.excel.MazePlaneExcel;
|
||||
import emu.lunarcore.data.excel.NpcMonsterExcel;
|
||||
import emu.lunarcore.data.excel.PropExcel;
|
||||
import emu.lunarcore.game.avatar.GameAvatar;
|
||||
import emu.lunarcore.game.enums.GameModeType;
|
||||
import emu.lunarcore.game.enums.PlaneType;
|
||||
import emu.lunarcore.game.enums.PropState;
|
||||
import emu.lunarcore.game.enums.PropType;
|
||||
import emu.lunarcore.game.player.PlayerLineup;
|
||||
@@ -19,14 +19,11 @@ import emu.lunarcore.game.scene.triggers.PropTrigger;
|
||||
import emu.lunarcore.game.scene.triggers.PropTriggerType;
|
||||
import emu.lunarcore.game.player.Player;
|
||||
import emu.lunarcore.proto.SceneEntityGroupInfoOuterClass.SceneEntityGroupInfo;
|
||||
import emu.lunarcore.proto.SceneGroupStateOuterClass.SceneGroupState;
|
||||
import emu.lunarcore.proto.SceneInfoOuterClass.SceneInfo;
|
||||
import emu.lunarcore.server.packet.send.PacketActivateFarmElementScRsp;
|
||||
import emu.lunarcore.server.packet.send.PacketSceneGroupRefreshScNotify;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
|
||||
import it.unimi.dsi.fastutil.ints.IntSet;
|
||||
import it.unimi.dsi.fastutil.ints.*;
|
||||
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -43,11 +40,12 @@ public class Scene {
|
||||
private boolean loaded = false;
|
||||
|
||||
// Avatar entites
|
||||
private IntSet avatarEntityIds;
|
||||
private Int2ObjectMap<GameAvatar> avatars;
|
||||
private final IntSet avatarEntityIds;
|
||||
private final Int2ObjectMap<GameAvatar> avatars;
|
||||
|
||||
// Other entities
|
||||
private Int2ObjectMap<GameEntity> entities;
|
||||
private final Int2ObjectMap<GameEntity> entities;
|
||||
private final Int2IntMap groupStates;
|
||||
|
||||
// Cache
|
||||
private List<PropTrigger> triggers;
|
||||
@@ -63,6 +61,8 @@ public class Scene {
|
||||
this.avatarEntityIds = new IntOpenHashSet();
|
||||
this.avatars = new Int2ObjectOpenHashMap<>();
|
||||
this.entities = new Int2ObjectOpenHashMap<>();
|
||||
this.groupStates = new Int2IntOpenHashMap();
|
||||
|
||||
this.healingSprings = new ObjectArrayList<>();
|
||||
this.triggers = new ObjectArrayList<>();
|
||||
|
||||
@@ -84,7 +84,7 @@ public class Scene {
|
||||
if (floorInfo == null) return;
|
||||
|
||||
// Spawn from groups
|
||||
if (this.getExcel().getPlaneType() != GameModeType.Challenge) {
|
||||
if (getExcel().getPlaneType() != PlaneType.Challenge && getExcel().getPlaneType() != PlaneType.Rogue) {
|
||||
this.initSpawns();
|
||||
}
|
||||
|
||||
@@ -104,6 +104,13 @@ public class Scene {
|
||||
}
|
||||
}
|
||||
|
||||
public void loadGroup(int groupId) {
|
||||
GroupInfo group = getFloorInfo().getGroups().get(groupId);
|
||||
if (group != null) {
|
||||
this.loadGroup(group);
|
||||
}
|
||||
}
|
||||
|
||||
private void loadGroup(GroupInfo group) {
|
||||
// Add monsters
|
||||
if (group.getMonsterList() != null && group.getMonsterList().size() > 0) {
|
||||
@@ -384,6 +391,17 @@ public class Scene {
|
||||
for (var group : groups.values()) {
|
||||
proto.addEntityGroupList(group);
|
||||
}
|
||||
|
||||
// Add group states
|
||||
for (var entry : this.getGroupStates().int2IntEntrySet()) {
|
||||
var state = SceneGroupState.newInstance()
|
||||
.setGroupId(entry.getIntKey())
|
||||
.setState(entry.getIntValue())
|
||||
.setIsDefault(true);
|
||||
|
||||
proto.addGroupStateList(state);
|
||||
proto.addJBDDBBAMMNH(entry.getIntKey());
|
||||
}
|
||||
|
||||
// Done
|
||||
return proto;
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package emu.lunarcore.server.packet.recv;
|
||||
|
||||
import emu.lunarcore.server.game.GameSession;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
import emu.lunarcore.server.packet.Opcodes;
|
||||
import emu.lunarcore.server.packet.PacketHandler;
|
||||
|
||||
@Opcodes(CmdId.LeaveRogueCsReq)
|
||||
public class HandlerLeaveRogueCsReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
|
||||
session.send(CmdId.LeaveRogueScRsp);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package emu.lunarcore.server.packet.recv;
|
||||
|
||||
import emu.lunarcore.server.game.GameSession;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
import emu.lunarcore.server.packet.Opcodes;
|
||||
import emu.lunarcore.server.packet.PacketHandler;
|
||||
|
||||
@Opcodes(CmdId.QuitRogueCsReq)
|
||||
public class HandlerQuitRogueCsReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
|
||||
session.getPlayer().getRogueManager().quitRogue();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package emu.lunarcore.server.packet.recv;
|
||||
|
||||
import emu.lunarcore.proto.StartRogueCsReqOuterClass.StartRogueCsReq;
|
||||
import emu.lunarcore.server.game.GameSession;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
import emu.lunarcore.server.packet.Opcodes;
|
||||
@@ -10,7 +11,9 @@ public class HandlerStartRogueCsReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
|
||||
session.send(CmdId.StartRogueScRsp);
|
||||
var req = StartRogueCsReq.parseFrom(data);
|
||||
|
||||
session.getPlayer().getRogueManager().startRogue(req.getAreaId(), req.getBaseAvatarIdList());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package emu.lunarcore.server.packet.send;
|
||||
|
||||
import emu.lunarcore.game.player.Player;
|
||||
import emu.lunarcore.proto.StartRogueScRspOuterClass.StartRogueScRsp;
|
||||
import emu.lunarcore.server.packet.BasePacket;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
import lombok.SneakyThrows;
|
||||
|
||||
public class PacketStartRogueScRsp extends BasePacket {
|
||||
|
||||
public PacketStartRogueScRsp() {
|
||||
super(CmdId.StartRogueScRsp);
|
||||
|
||||
var data = StartRogueScRsp.newInstance()
|
||||
.setRetcode(1);
|
||||
|
||||
this.setData(data);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public PacketStartRogueScRsp(Player player) {
|
||||
super(CmdId.StartRogueScRsp);
|
||||
|
||||
var data = StartRogueScRsp.newInstance()
|
||||
.setRogueInfo(player.getRogueManager().toProto())
|
||||
.setLineup(player.getCurrentLineup().toProto())
|
||||
.setScene(player.getScene().toProto());
|
||||
|
||||
this.setData(data);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package emu.lunarcore.server.packet.send;
|
||||
|
||||
import emu.lunarcore.game.player.Player;
|
||||
import emu.lunarcore.proto.SyncRogueMapRoomScNotifyOuterClass.SyncRogueMapRoomScNotify;
|
||||
import emu.lunarcore.server.packet.BasePacket;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
|
||||
public class PacketSyncRogueMapRoomScNotify extends BasePacket {
|
||||
|
||||
public PacketSyncRogueMapRoomScNotify(Player player) {
|
||||
super(CmdId.SyncRogueMapRoomScNotify);
|
||||
|
||||
var data = SyncRogueMapRoomScNotify.newInstance();
|
||||
|
||||
if (player.getRogueData() != null) {
|
||||
data.setMapId(player.getRogueData().getExcel().getMapId());
|
||||
data.setCurRoom(player.getRogueData().getCurrentRoom().toProto());
|
||||
}
|
||||
|
||||
this.setData(data);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user