Implement rogue entry

This commit is contained in:
Melledy
2023-10-22 18:03:15 -07:00
parent fc762e96a4
commit 87c5b678f2
34 changed files with 6866 additions and 195 deletions

View File

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

View File

@@ -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<>());
}
}

View File

@@ -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");
}
}

View File

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

View File

@@ -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());
}
}

View 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);
}
}

View 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;
}
}

View File

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

View 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;
}
}

View File

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

View 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;
}
}

View File

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

View 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;
}
}

View 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;
}
}

View File

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

View File

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

View File

@@ -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();
}
}

View File

@@ -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());
}
}

View File

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

View File

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