mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-23 10:44:36 +01:00
Implement rogue miracles (They are not scripted yet)
This commit is contained in:
@@ -18,7 +18,8 @@ public class GameDepot {
|
||||
|
||||
// Rogue
|
||||
@Getter private static Int2ObjectMap<int[]> rogueMapGen = new Int2ObjectOpenHashMap<>();
|
||||
@Getter private static List<RogueBuffExcel> rogueBuffsList = new ArrayList<>();
|
||||
@Getter private static List<RogueBuffExcel> rogueRandomBuffList = new ArrayList<>();
|
||||
@Getter private static List<RogueMiracleExcel> rogueRandomMiracleList = new ArrayList<>();
|
||||
private static Int2ObjectMap<List<RogueMapExcel>> rogueMapDepot = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
public static void addRelicMainAffix(RelicMainAffixExcel affix) {
|
||||
|
||||
@@ -23,7 +23,7 @@ public class RogueBuffExcel extends GameResource {
|
||||
@Override
|
||||
public void onLoad() {
|
||||
if (RogueBuffType >= 120 && RogueBuffType <= 126 && RogueBuffRarity >= 1 && RogueBuffRarity <= 3 && MazeBuffLevel == 1 && AeonID == 0) {
|
||||
GameDepot.getRogueBuffsList().add(this);
|
||||
GameDepot.getRogueRandomBuffList().add(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@ResourceType(name = {"RogueMiracle.json"})
|
||||
public class RogueMiracleExcel extends GameResource {
|
||||
private int MiracleID;
|
||||
private boolean IsShow;
|
||||
private int MiracleReward;
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return MiracleID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
if (IsShow && MiracleReward > 0) {
|
||||
GameDepot.getRogueRandomMiracleList().add(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,21 +6,21 @@ import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class RogueBuffData {
|
||||
private int buffId;
|
||||
private int id;
|
||||
private int level;
|
||||
|
||||
public RogueBuffData(int buffId, int level) {
|
||||
this.buffId = buffId;
|
||||
this.id = buffId;
|
||||
this.level = level;
|
||||
}
|
||||
|
||||
public MazeBuff toMazeBuff() {
|
||||
return new MazeBuff(buffId, level, 0, 0xffffffff);
|
||||
return new MazeBuff(id, level, 0, 0xffffffff);
|
||||
}
|
||||
|
||||
public RogueBuff toProto() {
|
||||
var proto = RogueBuff.newInstance()
|
||||
.setBuffId(this.getBuffId())
|
||||
.setBuffId(this.getId())
|
||||
.setLevel(this.getLevel());
|
||||
|
||||
return proto;
|
||||
|
||||
@@ -36,7 +36,7 @@ public class RogueBuffSelectMenu {
|
||||
if (this.randomBuffs == null) {
|
||||
this.randomBuffs = new WeightedList<>();
|
||||
|
||||
for (RogueBuffExcel excel : GameDepot.getRogueBuffsList()) {
|
||||
for (var excel : GameDepot.getRogueRandomBuffList()) {
|
||||
if (rogue.getBuffs().containsKey(excel.getMazeBuffID())) {
|
||||
continue;
|
||||
}
|
||||
@@ -48,7 +48,7 @@ public class RogueBuffSelectMenu {
|
||||
this.getBuffs().clear();
|
||||
|
||||
while (this.getBuffs().size() < this.getMaxBuffs()) {
|
||||
RogueBuffExcel excel = this.randomBuffs.next();
|
||||
var excel = this.randomBuffs.next();
|
||||
this.getBuffs().add(new RogueBuffData(excel.getMazeBuffID(), 1));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,11 +13,11 @@ import emu.lunarcore.proto.RogueBuffInfoOuterClass.RogueBuffInfo;
|
||||
import emu.lunarcore.proto.RogueBuffSourceOuterClass.RogueBuffSource;
|
||||
import emu.lunarcore.proto.RogueCurrentInfoOuterClass.RogueCurrentInfo;
|
||||
import emu.lunarcore.proto.RogueMapInfoOuterClass.RogueMapInfo;
|
||||
import emu.lunarcore.proto.RogueMiracleInfoOuterClass.RogueMiracleInfo;
|
||||
import emu.lunarcore.proto.RogueMiracleSourceOuterClass.RogueMiracleSource;
|
||||
import emu.lunarcore.proto.RogueRoomStatusOuterClass.RogueRoomStatus;
|
||||
import emu.lunarcore.proto.RogueStatusOuterClass.RogueStatus;
|
||||
import emu.lunarcore.server.packet.send.PacketAddRogueBuffScNotify;
|
||||
import emu.lunarcore.server.packet.send.PacketSyncRogueBuffSelectInfoScNotify;
|
||||
import emu.lunarcore.server.packet.send.PacketSyncRogueMapRoomScNotify;
|
||||
import emu.lunarcore.server.packet.send.*;
|
||||
import emu.lunarcore.util.Utils;
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -34,9 +34,12 @@ public class RogueInstance {
|
||||
|
||||
private Set<Integer> baseAvatarIds;
|
||||
private Map<Integer, RogueBuffData> buffs;
|
||||
private Map<Integer, RogueMiracleData> miracles;
|
||||
|
||||
private RogueBuffSelectMenu buffSelect;
|
||||
private int pendingBuffSelects;
|
||||
private RogueBuffSelectMenu buffSelect;
|
||||
private int pendingMiracleSelects;
|
||||
private RogueMiracleSelectMenu miracleSelect;
|
||||
|
||||
@Deprecated // Morphia only!
|
||||
public RogueInstance() {}
|
||||
@@ -48,6 +51,7 @@ public class RogueInstance {
|
||||
this.currentRoomProgress = 0;
|
||||
this.baseAvatarIds = new HashSet<>();
|
||||
this.buffs = new HashMap<>();
|
||||
this.miracles = new HashMap<>();
|
||||
|
||||
this.initRooms();
|
||||
}
|
||||
@@ -103,19 +107,56 @@ public class RogueInstance {
|
||||
|
||||
RogueBuffData buff = this.getBuffSelect().getBuffs()
|
||||
.stream()
|
||||
.filter(b -> b.getBuffId() == buffId)
|
||||
.filter(b -> b.getId() == buffId)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
|
||||
if (buff == null) return null;
|
||||
|
||||
this.buffSelect = null;
|
||||
this.getBuffs().put(buff.getBuffId(), buff);
|
||||
this.getBuffs().put(buff.getId(), buff);
|
||||
getPlayer().sendPacket(new PacketAddRogueBuffScNotify(buff, RogueBuffSource.ROGUE_BUFF_SOURCE_TYPE_SELECT));
|
||||
|
||||
return buff;
|
||||
}
|
||||
|
||||
public synchronized void createMiracleSelect(int amount) {
|
||||
this.pendingMiracleSelects += amount;
|
||||
|
||||
RogueMiracleSelectMenu miracleSelect = this.updateMiracleSelect();
|
||||
if (miracleSelect != null) {
|
||||
getPlayer().sendPacket(new PacketSyncRogueMiracleSelectInfoScNotify(miracleSelect));
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized RogueMiracleSelectMenu updateMiracleSelect() {
|
||||
if (this.pendingMiracleSelects > 0 && this.getMiracleSelect() == null) {
|
||||
this.miracleSelect = new RogueMiracleSelectMenu(this);
|
||||
this.pendingMiracleSelects--;
|
||||
return this.miracleSelect;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public synchronized RogueMiracleData selectMiracle(int miracleId) {
|
||||
if (this.getMiracleSelect() == null) return null;
|
||||
|
||||
RogueMiracleData miracle = this.getMiracleSelect().getMiracles()
|
||||
.stream()
|
||||
.filter(b -> b.getId() == miracleId)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
|
||||
if (miracle == null) return null;
|
||||
|
||||
this.miracleSelect = null;
|
||||
this.getMiracles().put(miracle.getId(), miracle);
|
||||
getPlayer().sendPacket(new PacketAddRogueMiracleScNotify(miracle, RogueMiracleSource.ROGUE_MIRACLE_SOURCE_TYPE_SELECT));
|
||||
|
||||
return miracle;
|
||||
}
|
||||
|
||||
public synchronized RogueRoomData enterRoom(int siteId) {
|
||||
// Set status on previous room
|
||||
RogueRoomData prevRoom = getCurrentRoom();
|
||||
@@ -184,6 +225,9 @@ public class RogueInstance {
|
||||
if (this.getBuffSelect() != null) {
|
||||
this.getBuffSelect().onLoad(this);
|
||||
}
|
||||
if (this.getMiracleSelect() != null) {
|
||||
this.getMiracleSelect().onLoad(this);
|
||||
}
|
||||
}
|
||||
|
||||
// Serialization
|
||||
@@ -191,13 +235,13 @@ public class RogueInstance {
|
||||
public RogueCurrentInfo toProto() {
|
||||
var proto = RogueCurrentInfo.newInstance()
|
||||
.setStatus(this.getStatus())
|
||||
.setRoomMap(this.toMapProto())
|
||||
.setRogueBuffInfo(this.toBuffProto());
|
||||
.setRoomMap(this.toMapInfoProto())
|
||||
.setRogueBuffInfo(this.toBuffInfoProto());
|
||||
|
||||
return proto;
|
||||
}
|
||||
|
||||
public RogueMapInfo toMapProto() {
|
||||
public RogueMapInfo toMapInfoProto() {
|
||||
var room = this.getCurrentRoom();
|
||||
|
||||
var proto = RogueMapInfo.newInstance()
|
||||
@@ -213,7 +257,7 @@ public class RogueInstance {
|
||||
return proto;
|
||||
}
|
||||
|
||||
public RogueBuffInfo toBuffProto() {
|
||||
public RogueBuffInfo toBuffInfoProto() {
|
||||
var proto = RogueBuffInfo.newInstance();
|
||||
|
||||
if (this.getBuffSelect() != null) {
|
||||
@@ -229,4 +273,23 @@ public class RogueInstance {
|
||||
return proto;
|
||||
}
|
||||
|
||||
public RogueMiracleInfo toMiracleInfoProto() {
|
||||
var proto = RogueMiracleInfo.newInstance();
|
||||
|
||||
if (this.getMiracleSelect() != null) {
|
||||
proto.setMiracleSelectInfo(this.getMiracleSelect().toProto());
|
||||
} else {
|
||||
proto.getMutableMiracleSelectInfo();
|
||||
}
|
||||
|
||||
// Set flag for this so it gets serialized
|
||||
proto.getMutableAchivedMiracleInfo();
|
||||
|
||||
for (var miracle : this.getMiracles().values()) {
|
||||
proto.getMutableAchivedMiracleInfo().addRogueMiracleList(miracle.toProto());
|
||||
}
|
||||
|
||||
return proto;
|
||||
}
|
||||
|
||||
}
|
||||
22
src/main/java/emu/lunarcore/game/rogue/RogueMiracleData.java
Normal file
22
src/main/java/emu/lunarcore/game/rogue/RogueMiracleData.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package emu.lunarcore.game.rogue;
|
||||
|
||||
import emu.lunarcore.proto.RogueMiracleOuterClass.RogueMiracle;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class RogueMiracleData {
|
||||
private int id;
|
||||
private boolean active;
|
||||
|
||||
public RogueMiracleData(int miracleId) {
|
||||
this.id = miracleId;
|
||||
this.active = true;
|
||||
}
|
||||
|
||||
public RogueMiracle toProto() {
|
||||
var proto = RogueMiracle.newInstance()
|
||||
.setMiracleId(this.getId());
|
||||
|
||||
return proto;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package emu.lunarcore.game.rogue;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import emu.lunarcore.data.GameDepot;
|
||||
import emu.lunarcore.data.excel.RogueMiracleExcel;
|
||||
import emu.lunarcore.proto.RogueMiracleSelectInfoOuterClass.RogueMiracleSelectInfo;
|
||||
import emu.lunarcore.util.WeightedList;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class RogueMiracleSelectMenu {
|
||||
private transient RogueInstance rogue;
|
||||
|
||||
private int maxMiracles;
|
||||
private List<RogueMiracleData> miracles;
|
||||
|
||||
// Cache
|
||||
private transient WeightedList<RogueMiracleExcel> randomMiracles;
|
||||
|
||||
@Deprecated // Morphia only!
|
||||
public RogueMiracleSelectMenu() {}
|
||||
|
||||
public RogueMiracleSelectMenu(RogueInstance rogue) {
|
||||
this.rogue = rogue;
|
||||
this.maxMiracles = 3;
|
||||
this.miracles = new ArrayList<>();
|
||||
|
||||
this.generateRandomBuffs();
|
||||
}
|
||||
|
||||
public void generateRandomBuffs() {
|
||||
if (this.randomMiracles == null) {
|
||||
this.randomMiracles = new WeightedList<>();
|
||||
|
||||
for (var excel : GameDepot.getRogueRandomMiracleList()) {
|
||||
if (rogue.getBuffs().containsKey(excel.getMiracleID())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
this.randomMiracles.add(1.0, excel);
|
||||
};
|
||||
}
|
||||
|
||||
this.getMiracles().clear();
|
||||
|
||||
while (this.getMiracles().size() < this.getMaxMiracles()) {
|
||||
var excel = this.randomMiracles.next();
|
||||
this.getMiracles().add(new RogueMiracleData(excel.getMiracleID()));
|
||||
}
|
||||
}
|
||||
|
||||
protected void onLoad(RogueInstance rogue) {
|
||||
this.rogue = rogue;
|
||||
}
|
||||
|
||||
public RogueMiracleSelectInfo toProto() {
|
||||
var proto = RogueMiracleSelectInfo.newInstance();
|
||||
|
||||
for (var miracle : this.getMiracles()) {
|
||||
proto.addAllMiracleIdList(miracle.getId());
|
||||
}
|
||||
|
||||
return proto;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package emu.lunarcore.server.packet.recv;
|
||||
|
||||
import emu.lunarcore.game.rogue.RogueMiracleData;
|
||||
import emu.lunarcore.game.rogue.RogueMiracleSelectMenu;
|
||||
import emu.lunarcore.proto.SelectRogueMiracleCsReqOuterClass.SelectRogueMiracleCsReq;
|
||||
import emu.lunarcore.server.game.GameSession;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
import emu.lunarcore.server.packet.Opcodes;
|
||||
import emu.lunarcore.server.packet.PacketHandler;
|
||||
import emu.lunarcore.server.packet.send.PacketSelectRogueMiracleScRsp;
|
||||
|
||||
@Opcodes(CmdId.SelectRogueMiracleCsReq)
|
||||
public class HandlerSelectRogueMiracleCsReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
|
||||
var req = SelectRogueMiracleCsReq.parseFrom(data);
|
||||
|
||||
if (session.getPlayer().getRogueInstance() != null) {
|
||||
RogueMiracleData miracle = session.getPlayer().getRogueInstance().selectMiracle(req.getMiracleId());
|
||||
if (miracle != null) {
|
||||
RogueMiracleSelectMenu miracleSelect = session.getPlayer().getRogueInstance().updateMiracleSelect();
|
||||
session.send(new PacketSelectRogueMiracleScRsp(miracle, miracleSelect));
|
||||
}
|
||||
}
|
||||
|
||||
session.send(CmdId.SelectRogueBuffScRsp);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package emu.lunarcore.server.packet.send;
|
||||
|
||||
import emu.lunarcore.game.rogue.RogueMiracleData;
|
||||
import emu.lunarcore.proto.AddRogueMiracleScNotifyOuterClass.AddRogueMiracleScNotify;
|
||||
import emu.lunarcore.proto.RogueMiracleSourceOuterClass.RogueMiracleSource;
|
||||
import emu.lunarcore.server.packet.BasePacket;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
|
||||
public class PacketAddRogueMiracleScNotify extends BasePacket {
|
||||
|
||||
public PacketAddRogueMiracleScNotify(RogueMiracleData miracle, RogueMiracleSource rogueMiracleSource) {
|
||||
super(CmdId.AddRogueMiracleScNotify);
|
||||
|
||||
var data = AddRogueMiracleScNotify.newInstance()
|
||||
.setRogueMiracle(miracle.toProto())
|
||||
.setSource(rogueMiracleSource);
|
||||
|
||||
this.setData(data);
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ public class PacketSelectRogueBuffScRsp extends BasePacket {
|
||||
super(CmdId.SelectRogueBuffScRsp);
|
||||
|
||||
var data = SelectRogueBuffScRsp.newInstance()
|
||||
.setMazeBuffId(buff.getBuffId())
|
||||
.setMazeBuffId(buff.getId())
|
||||
.setMazeBuffLevel(buff.getLevel());
|
||||
|
||||
if (buffSelect != null) {
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package emu.lunarcore.server.packet.send;
|
||||
|
||||
import emu.lunarcore.game.rogue.RogueMiracleData;
|
||||
import emu.lunarcore.game.rogue.RogueMiracleSelectMenu;
|
||||
import emu.lunarcore.proto.SelectRogueMiracleScRspOuterClass.SelectRogueMiracleScRsp;
|
||||
import emu.lunarcore.server.packet.BasePacket;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
|
||||
public class PacketSelectRogueMiracleScRsp extends BasePacket {
|
||||
|
||||
public PacketSelectRogueMiracleScRsp(RogueMiracleData miracle, RogueMiracleSelectMenu miracleSelect) {
|
||||
super(CmdId.SelectRogueMiracleScRsp);
|
||||
|
||||
var data = SelectRogueMiracleScRsp.newInstance();
|
||||
|
||||
if (miracleSelect != null) {
|
||||
data.setMiracleSelectInfo(miracleSelect.toProto());
|
||||
} else {
|
||||
data.getMutableMiracleSelectInfo();
|
||||
}
|
||||
|
||||
this.setData(data);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package emu.lunarcore.server.packet.send;
|
||||
|
||||
import emu.lunarcore.game.rogue.RogueMiracleSelectMenu;
|
||||
import emu.lunarcore.proto.SyncRogueMiracleSelectInfoScNotifyOuterClass.SyncRogueMiracleSelectInfoScNotify;
|
||||
import emu.lunarcore.server.packet.BasePacket;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
|
||||
public class PacketSyncRogueMiracleSelectInfoScNotify extends BasePacket {
|
||||
|
||||
public PacketSyncRogueMiracleSelectInfoScNotify(RogueMiracleSelectMenu miracleSelect) {
|
||||
super(CmdId.SyncRogueMiracleSelectInfoScNotify);
|
||||
|
||||
var data = SyncRogueMiracleSelectInfoScNotify.newInstance()
|
||||
.setMiracleSelectInfo(miracleSelect.toProto());
|
||||
|
||||
this.setData(data);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user