From 978164afa48b432353e3e3215df659b9f3d9cde4 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Wed, 25 Oct 2023 21:14:16 -0700 Subject: [PATCH] Implement entering rogue portals --- .../EnterRogueMapRoomCsReqOuterClass.java | 341 +++++++++++ .../EnterRogueMapRoomScRspOuterClass.java | 542 ++++++++++++++++++ .../game/rogue/RogueEntityLoader.java | 2 +- .../lunarcore/game/rogue/RogueInstance.java | 57 +- .../lunarcore/game/rogue/RogueManager.java | 30 +- .../recv/HandlerEnterRogueMapRoomCsReq.java | 30 + .../send/PacketEnterRogueMapRoomScRsp.java | 21 + .../send/PacketSyncRogueMapRoomScNotify.java | 14 +- src/main/java/emu/lunarcore/util/Utils.java | 12 + 9 files changed, 1011 insertions(+), 38 deletions(-) create mode 100644 src/generated/main/emu/lunarcore/proto/EnterRogueMapRoomCsReqOuterClass.java create mode 100644 src/generated/main/emu/lunarcore/proto/EnterRogueMapRoomScRspOuterClass.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerEnterRogueMapRoomCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketEnterRogueMapRoomScRsp.java diff --git a/src/generated/main/emu/lunarcore/proto/EnterRogueMapRoomCsReqOuterClass.java b/src/generated/main/emu/lunarcore/proto/EnterRogueMapRoomCsReqOuterClass.java new file mode 100644 index 0000000..1c74791 --- /dev/null +++ b/src/generated/main/emu/lunarcore/proto/EnterRogueMapRoomCsReqOuterClass.java @@ -0,0 +1,341 @@ +// Code generated by protocol buffer compiler. Do not edit! +package emu.lunarcore.proto; + +import java.io.IOException; +import us.hebi.quickbuf.FieldName; +import us.hebi.quickbuf.InvalidProtocolBufferException; +import us.hebi.quickbuf.JsonSink; +import us.hebi.quickbuf.JsonSource; +import us.hebi.quickbuf.MessageFactory; +import us.hebi.quickbuf.ProtoMessage; +import us.hebi.quickbuf.ProtoSink; +import us.hebi.quickbuf.ProtoSource; + +public final class EnterRogueMapRoomCsReqOuterClass { + /** + * Protobuf type {@code EnterRogueMapRoomCsReq} + */ + public static final class EnterRogueMapRoomCsReq extends ProtoMessage implements Cloneable { + private static final long serialVersionUID = 0L; + + /** + * optional uint32 room_id = 7; + */ + private int roomId; + + /** + * optional uint32 site_id = 10; + */ + private int siteId; + + private EnterRogueMapRoomCsReq() { + } + + /** + * @return a new empty instance of {@code EnterRogueMapRoomCsReq} + */ + public static EnterRogueMapRoomCsReq newInstance() { + return new EnterRogueMapRoomCsReq(); + } + + /** + * optional uint32 room_id = 7; + * @return whether the roomId field is set + */ + public boolean hasRoomId() { + return (bitField0_ & 0x00000001) != 0; + } + + /** + * optional uint32 room_id = 7; + * @return this + */ + public EnterRogueMapRoomCsReq clearRoomId() { + bitField0_ &= ~0x00000001; + roomId = 0; + return this; + } + + /** + * optional uint32 room_id = 7; + * @return the roomId + */ + public int getRoomId() { + return roomId; + } + + /** + * optional uint32 room_id = 7; + * @param value the roomId to set + * @return this + */ + public EnterRogueMapRoomCsReq setRoomId(final int value) { + bitField0_ |= 0x00000001; + roomId = value; + return this; + } + + /** + * optional uint32 site_id = 10; + * @return whether the siteId field is set + */ + public boolean hasSiteId() { + return (bitField0_ & 0x00000002) != 0; + } + + /** + * optional uint32 site_id = 10; + * @return this + */ + public EnterRogueMapRoomCsReq clearSiteId() { + bitField0_ &= ~0x00000002; + siteId = 0; + return this; + } + + /** + * optional uint32 site_id = 10; + * @return the siteId + */ + public int getSiteId() { + return siteId; + } + + /** + * optional uint32 site_id = 10; + * @param value the siteId to set + * @return this + */ + public EnterRogueMapRoomCsReq setSiteId(final int value) { + bitField0_ |= 0x00000002; + siteId = value; + return this; + } + + @Override + public EnterRogueMapRoomCsReq copyFrom(final EnterRogueMapRoomCsReq other) { + cachedSize = other.cachedSize; + if ((bitField0_ | other.bitField0_) != 0) { + bitField0_ = other.bitField0_; + roomId = other.roomId; + siteId = other.siteId; + } + return this; + } + + @Override + public EnterRogueMapRoomCsReq mergeFrom(final EnterRogueMapRoomCsReq other) { + if (other.isEmpty()) { + return this; + } + cachedSize = -1; + if (other.hasRoomId()) { + setRoomId(other.roomId); + } + if (other.hasSiteId()) { + setSiteId(other.siteId); + } + return this; + } + + @Override + public EnterRogueMapRoomCsReq clear() { + if (isEmpty()) { + return this; + } + cachedSize = -1; + bitField0_ = 0; + roomId = 0; + siteId = 0; + return this; + } + + @Override + public EnterRogueMapRoomCsReq clearQuick() { + if (isEmpty()) { + return this; + } + cachedSize = -1; + bitField0_ = 0; + return this; + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (!(o instanceof EnterRogueMapRoomCsReq)) { + return false; + } + EnterRogueMapRoomCsReq other = (EnterRogueMapRoomCsReq) o; + return bitField0_ == other.bitField0_ + && (!hasRoomId() || roomId == other.roomId) + && (!hasSiteId() || siteId == other.siteId); + } + + @Override + public void writeTo(final ProtoSink output) throws IOException { + if ((bitField0_ & 0x00000001) != 0) { + output.writeRawByte((byte) 56); + output.writeUInt32NoTag(roomId); + } + if ((bitField0_ & 0x00000002) != 0) { + output.writeRawByte((byte) 80); + output.writeUInt32NoTag(siteId); + } + } + + @Override + protected int computeSerializedSize() { + int size = 0; + if ((bitField0_ & 0x00000001) != 0) { + size += 1 + ProtoSink.computeUInt32SizeNoTag(roomId); + } + if ((bitField0_ & 0x00000002) != 0) { + size += 1 + ProtoSink.computeUInt32SizeNoTag(siteId); + } + return size; + } + + @Override + @SuppressWarnings("fallthrough") + public EnterRogueMapRoomCsReq mergeFrom(final ProtoSource input) throws IOException { + // Enabled Fall-Through Optimization (QuickBuffers) + int tag = input.readTag(); + while (true) { + switch (tag) { + case 56: { + // roomId + roomId = input.readUInt32(); + bitField0_ |= 0x00000001; + tag = input.readTag(); + if (tag != 80) { + break; + } + } + case 80: { + // siteId + siteId = input.readUInt32(); + bitField0_ |= 0x00000002; + tag = input.readTag(); + if (tag != 0) { + break; + } + } + case 0: { + return this; + } + default: { + if (!input.skipField(tag)) { + return this; + } + tag = input.readTag(); + break; + } + } + } + } + + @Override + public void writeTo(final JsonSink output) throws IOException { + output.beginObject(); + if ((bitField0_ & 0x00000001) != 0) { + output.writeUInt32(FieldNames.roomId, roomId); + } + if ((bitField0_ & 0x00000002) != 0) { + output.writeUInt32(FieldNames.siteId, siteId); + } + output.endObject(); + } + + @Override + public EnterRogueMapRoomCsReq mergeFrom(final JsonSource input) throws IOException { + if (!input.beginObject()) { + return this; + } + while (!input.isAtEnd()) { + switch (input.readFieldHash()) { + case -925319338: + case 1379892991: { + if (input.isAtField(FieldNames.roomId)) { + if (!input.trySkipNullValue()) { + roomId = input.readUInt32(); + bitField0_ |= 0x00000001; + } + } else { + input.skipUnknownField(); + } + break; + } + case -902090046: + case 2100001043: { + if (input.isAtField(FieldNames.siteId)) { + if (!input.trySkipNullValue()) { + siteId = input.readUInt32(); + bitField0_ |= 0x00000002; + } + } else { + input.skipUnknownField(); + } + break; + } + default: { + input.skipUnknownField(); + break; + } + } + } + input.endObject(); + return this; + } + + @Override + public EnterRogueMapRoomCsReq clone() { + return new EnterRogueMapRoomCsReq().copyFrom(this); + } + + @Override + public boolean isEmpty() { + return ((bitField0_) == 0); + } + + public static EnterRogueMapRoomCsReq parseFrom(final byte[] data) throws + InvalidProtocolBufferException { + return ProtoMessage.mergeFrom(new EnterRogueMapRoomCsReq(), data).checkInitialized(); + } + + public static EnterRogueMapRoomCsReq parseFrom(final ProtoSource input) throws IOException { + return ProtoMessage.mergeFrom(new EnterRogueMapRoomCsReq(), input).checkInitialized(); + } + + public static EnterRogueMapRoomCsReq parseFrom(final JsonSource input) throws IOException { + return ProtoMessage.mergeFrom(new EnterRogueMapRoomCsReq(), input).checkInitialized(); + } + + /** + * @return factory for creating EnterRogueMapRoomCsReq messages + */ + public static MessageFactory getFactory() { + return EnterRogueMapRoomCsReqFactory.INSTANCE; + } + + private enum EnterRogueMapRoomCsReqFactory implements MessageFactory { + INSTANCE; + + @Override + public EnterRogueMapRoomCsReq create() { + return EnterRogueMapRoomCsReq.newInstance(); + } + } + + /** + * Contains name constants used for serializing JSON + */ + static class FieldNames { + static final FieldName roomId = FieldName.forField("roomId", "room_id"); + + static final FieldName siteId = FieldName.forField("siteId", "site_id"); + } + } +} diff --git a/src/generated/main/emu/lunarcore/proto/EnterRogueMapRoomScRspOuterClass.java b/src/generated/main/emu/lunarcore/proto/EnterRogueMapRoomScRspOuterClass.java new file mode 100644 index 0000000..a864341 --- /dev/null +++ b/src/generated/main/emu/lunarcore/proto/EnterRogueMapRoomScRspOuterClass.java @@ -0,0 +1,542 @@ +// Code generated by protocol buffer compiler. Do not edit! +package emu.lunarcore.proto; + +import java.io.IOException; +import us.hebi.quickbuf.FieldName; +import us.hebi.quickbuf.InvalidProtocolBufferException; +import us.hebi.quickbuf.JsonSink; +import us.hebi.quickbuf.JsonSource; +import us.hebi.quickbuf.MessageFactory; +import us.hebi.quickbuf.ProtoMessage; +import us.hebi.quickbuf.ProtoSink; +import us.hebi.quickbuf.ProtoSource; + +public final class EnterRogueMapRoomScRspOuterClass { + /** + * Protobuf type {@code EnterRogueMapRoomScRsp} + */ + public static final class EnterRogueMapRoomScRsp extends ProtoMessage implements Cloneable { + private static final long serialVersionUID = 0L; + + /** + * optional uint32 retcode = 9; + */ + private int retcode; + + /** + * optional uint32 cur_site_id = 13; + */ + private int curSiteId; + + /** + * optional .LineupInfo lineup = 10; + */ + private final LineupInfoOuterClass.LineupInfo lineup = LineupInfoOuterClass.LineupInfo.newInstance(); + + /** + * optional .SceneInfo scene = 11; + */ + private final SceneInfoOuterClass.SceneInfo scene = SceneInfoOuterClass.SceneInfo.newInstance(); + + private EnterRogueMapRoomScRsp() { + } + + /** + * @return a new empty instance of {@code EnterRogueMapRoomScRsp} + */ + public static EnterRogueMapRoomScRsp newInstance() { + return new EnterRogueMapRoomScRsp(); + } + + /** + * optional uint32 retcode = 9; + * @return whether the retcode field is set + */ + public boolean hasRetcode() { + return (bitField0_ & 0x00000001) != 0; + } + + /** + * optional uint32 retcode = 9; + * @return this + */ + public EnterRogueMapRoomScRsp clearRetcode() { + bitField0_ &= ~0x00000001; + retcode = 0; + return this; + } + + /** + * optional uint32 retcode = 9; + * @return the retcode + */ + public int getRetcode() { + return retcode; + } + + /** + * optional uint32 retcode = 9; + * @param value the retcode to set + * @return this + */ + public EnterRogueMapRoomScRsp setRetcode(final int value) { + bitField0_ |= 0x00000001; + retcode = value; + return this; + } + + /** + * optional uint32 cur_site_id = 13; + * @return whether the curSiteId field is set + */ + public boolean hasCurSiteId() { + return (bitField0_ & 0x00000002) != 0; + } + + /** + * optional uint32 cur_site_id = 13; + * @return this + */ + public EnterRogueMapRoomScRsp clearCurSiteId() { + bitField0_ &= ~0x00000002; + curSiteId = 0; + return this; + } + + /** + * optional uint32 cur_site_id = 13; + * @return the curSiteId + */ + public int getCurSiteId() { + return curSiteId; + } + + /** + * optional uint32 cur_site_id = 13; + * @param value the curSiteId to set + * @return this + */ + public EnterRogueMapRoomScRsp setCurSiteId(final int value) { + bitField0_ |= 0x00000002; + curSiteId = value; + return this; + } + + /** + * optional .LineupInfo lineup = 10; + * @return whether the lineup field is set + */ + public boolean hasLineup() { + return (bitField0_ & 0x00000004) != 0; + } + + /** + * optional .LineupInfo lineup = 10; + * @return this + */ + public EnterRogueMapRoomScRsp clearLineup() { + bitField0_ &= ~0x00000004; + lineup.clear(); + return this; + } + + /** + * optional .LineupInfo lineup = 10; + * + * This method returns the internal storage object without modifying any has state. + * The returned object should not be modified and be treated as read-only. + * + * Use {@link #getMutableLineup()} if you want to modify it. + * + * @return internal storage object for reading + */ + public LineupInfoOuterClass.LineupInfo getLineup() { + return lineup; + } + + /** + * optional .LineupInfo lineup = 10; + * + * This method returns the internal storage object and sets the corresponding + * has state. The returned object will become part of this message and its + * contents may be modified as long as the has state is not cleared. + * + * @return internal storage object for modifications + */ + public LineupInfoOuterClass.LineupInfo getMutableLineup() { + bitField0_ |= 0x00000004; + return lineup; + } + + /** + * optional .LineupInfo lineup = 10; + * @param value the lineup to set + * @return this + */ + public EnterRogueMapRoomScRsp setLineup(final LineupInfoOuterClass.LineupInfo value) { + bitField0_ |= 0x00000004; + lineup.copyFrom(value); + return this; + } + + /** + * optional .SceneInfo scene = 11; + * @return whether the scene field is set + */ + public boolean hasScene() { + return (bitField0_ & 0x00000008) != 0; + } + + /** + * optional .SceneInfo scene = 11; + * @return this + */ + public EnterRogueMapRoomScRsp clearScene() { + bitField0_ &= ~0x00000008; + scene.clear(); + return this; + } + + /** + * optional .SceneInfo scene = 11; + * + * This method returns the internal storage object without modifying any has state. + * The returned object should not be modified and be treated as read-only. + * + * Use {@link #getMutableScene()} if you want to modify it. + * + * @return internal storage object for reading + */ + public SceneInfoOuterClass.SceneInfo getScene() { + return scene; + } + + /** + * optional .SceneInfo scene = 11; + * + * This method returns the internal storage object and sets the corresponding + * has state. The returned object will become part of this message and its + * contents may be modified as long as the has state is not cleared. + * + * @return internal storage object for modifications + */ + public SceneInfoOuterClass.SceneInfo getMutableScene() { + bitField0_ |= 0x00000008; + return scene; + } + + /** + * optional .SceneInfo scene = 11; + * @param value the scene to set + * @return this + */ + public EnterRogueMapRoomScRsp setScene(final SceneInfoOuterClass.SceneInfo value) { + bitField0_ |= 0x00000008; + scene.copyFrom(value); + return this; + } + + @Override + public EnterRogueMapRoomScRsp copyFrom(final EnterRogueMapRoomScRsp other) { + cachedSize = other.cachedSize; + if ((bitField0_ | other.bitField0_) != 0) { + bitField0_ = other.bitField0_; + retcode = other.retcode; + curSiteId = other.curSiteId; + lineup.copyFrom(other.lineup); + scene.copyFrom(other.scene); + } + return this; + } + + @Override + public EnterRogueMapRoomScRsp mergeFrom(final EnterRogueMapRoomScRsp other) { + if (other.isEmpty()) { + return this; + } + cachedSize = -1; + if (other.hasRetcode()) { + setRetcode(other.retcode); + } + if (other.hasCurSiteId()) { + setCurSiteId(other.curSiteId); + } + if (other.hasLineup()) { + getMutableLineup().mergeFrom(other.lineup); + } + if (other.hasScene()) { + getMutableScene().mergeFrom(other.scene); + } + return this; + } + + @Override + public EnterRogueMapRoomScRsp clear() { + if (isEmpty()) { + return this; + } + cachedSize = -1; + bitField0_ = 0; + retcode = 0; + curSiteId = 0; + lineup.clear(); + scene.clear(); + return this; + } + + @Override + public EnterRogueMapRoomScRsp clearQuick() { + if (isEmpty()) { + return this; + } + cachedSize = -1; + bitField0_ = 0; + lineup.clearQuick(); + scene.clearQuick(); + return this; + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (!(o instanceof EnterRogueMapRoomScRsp)) { + return false; + } + EnterRogueMapRoomScRsp other = (EnterRogueMapRoomScRsp) o; + return bitField0_ == other.bitField0_ + && (!hasRetcode() || retcode == other.retcode) + && (!hasCurSiteId() || curSiteId == other.curSiteId) + && (!hasLineup() || lineup.equals(other.lineup)) + && (!hasScene() || scene.equals(other.scene)); + } + + @Override + public void writeTo(final ProtoSink output) throws IOException { + if ((bitField0_ & 0x00000001) != 0) { + output.writeRawByte((byte) 72); + output.writeUInt32NoTag(retcode); + } + if ((bitField0_ & 0x00000002) != 0) { + output.writeRawByte((byte) 104); + output.writeUInt32NoTag(curSiteId); + } + if ((bitField0_ & 0x00000004) != 0) { + output.writeRawByte((byte) 82); + output.writeMessageNoTag(lineup); + } + if ((bitField0_ & 0x00000008) != 0) { + output.writeRawByte((byte) 90); + output.writeMessageNoTag(scene); + } + } + + @Override + protected int computeSerializedSize() { + int size = 0; + if ((bitField0_ & 0x00000001) != 0) { + size += 1 + ProtoSink.computeUInt32SizeNoTag(retcode); + } + if ((bitField0_ & 0x00000002) != 0) { + size += 1 + ProtoSink.computeUInt32SizeNoTag(curSiteId); + } + if ((bitField0_ & 0x00000004) != 0) { + size += 1 + ProtoSink.computeMessageSizeNoTag(lineup); + } + if ((bitField0_ & 0x00000008) != 0) { + size += 1 + ProtoSink.computeMessageSizeNoTag(scene); + } + return size; + } + + @Override + @SuppressWarnings("fallthrough") + public EnterRogueMapRoomScRsp mergeFrom(final ProtoSource input) throws IOException { + // Enabled Fall-Through Optimization (QuickBuffers) + int tag = input.readTag(); + while (true) { + switch (tag) { + case 72: { + // retcode + retcode = input.readUInt32(); + bitField0_ |= 0x00000001; + tag = input.readTag(); + if (tag != 104) { + break; + } + } + case 104: { + // curSiteId + curSiteId = input.readUInt32(); + bitField0_ |= 0x00000002; + tag = input.readTag(); + if (tag != 82) { + break; + } + } + case 82: { + // lineup + input.readMessage(lineup); + bitField0_ |= 0x00000004; + tag = input.readTag(); + if (tag != 90) { + break; + } + } + case 90: { + // scene + input.readMessage(scene); + bitField0_ |= 0x00000008; + tag = input.readTag(); + if (tag != 0) { + break; + } + } + case 0: { + return this; + } + default: { + if (!input.skipField(tag)) { + return this; + } + tag = input.readTag(); + break; + } + } + } + } + + @Override + public void writeTo(final JsonSink output) throws IOException { + output.beginObject(); + if ((bitField0_ & 0x00000001) != 0) { + output.writeUInt32(FieldNames.retcode, retcode); + } + if ((bitField0_ & 0x00000002) != 0) { + output.writeUInt32(FieldNames.curSiteId, curSiteId); + } + if ((bitField0_ & 0x00000004) != 0) { + output.writeMessage(FieldNames.lineup, lineup); + } + if ((bitField0_ & 0x00000008) != 0) { + output.writeMessage(FieldNames.scene, scene); + } + output.endObject(); + } + + @Override + public EnterRogueMapRoomScRsp mergeFrom(final JsonSource input) throws IOException { + if (!input.beginObject()) { + return this; + } + while (!input.isAtEnd()) { + switch (input.readFieldHash()) { + case 1097936398: { + if (input.isAtField(FieldNames.retcode)) { + if (!input.trySkipNullValue()) { + retcode = input.readUInt32(); + bitField0_ |= 0x00000001; + } + } else { + input.skipUnknownField(); + } + break; + } + case -226037470: + case 1245078036: { + if (input.isAtField(FieldNames.curSiteId)) { + if (!input.trySkipNullValue()) { + curSiteId = input.readUInt32(); + bitField0_ |= 0x00000002; + } + } else { + input.skipUnknownField(); + } + break; + } + case -1102671473: { + if (input.isAtField(FieldNames.lineup)) { + if (!input.trySkipNullValue()) { + input.readMessage(lineup); + bitField0_ |= 0x00000004; + } + } else { + input.skipUnknownField(); + } + break; + } + case 109254796: { + if (input.isAtField(FieldNames.scene)) { + if (!input.trySkipNullValue()) { + input.readMessage(scene); + bitField0_ |= 0x00000008; + } + } else { + input.skipUnknownField(); + } + break; + } + default: { + input.skipUnknownField(); + break; + } + } + } + input.endObject(); + return this; + } + + @Override + public EnterRogueMapRoomScRsp clone() { + return new EnterRogueMapRoomScRsp().copyFrom(this); + } + + @Override + public boolean isEmpty() { + return ((bitField0_) == 0); + } + + public static EnterRogueMapRoomScRsp parseFrom(final byte[] data) throws + InvalidProtocolBufferException { + return ProtoMessage.mergeFrom(new EnterRogueMapRoomScRsp(), data).checkInitialized(); + } + + public static EnterRogueMapRoomScRsp parseFrom(final ProtoSource input) throws IOException { + return ProtoMessage.mergeFrom(new EnterRogueMapRoomScRsp(), input).checkInitialized(); + } + + public static EnterRogueMapRoomScRsp parseFrom(final JsonSource input) throws IOException { + return ProtoMessage.mergeFrom(new EnterRogueMapRoomScRsp(), input).checkInitialized(); + } + + /** + * @return factory for creating EnterRogueMapRoomScRsp messages + */ + public static MessageFactory getFactory() { + return EnterRogueMapRoomScRspFactory.INSTANCE; + } + + private enum EnterRogueMapRoomScRspFactory implements MessageFactory { + INSTANCE; + + @Override + public EnterRogueMapRoomScRsp create() { + return EnterRogueMapRoomScRsp.newInstance(); + } + } + + /** + * Contains name constants used for serializing JSON + */ + static class FieldNames { + static final FieldName retcode = FieldName.forField("retcode"); + + static final FieldName curSiteId = FieldName.forField("curSiteId", "cur_site_id"); + + static final FieldName lineup = FieldName.forField("lineup"); + + static final FieldName scene = FieldName.forField("scene"); + } + } +} diff --git a/src/main/java/emu/lunarcore/game/rogue/RogueEntityLoader.java b/src/main/java/emu/lunarcore/game/rogue/RogueEntityLoader.java index 1daee97..b9c961a 100644 --- a/src/main/java/emu/lunarcore/game/rogue/RogueEntityLoader.java +++ b/src/main/java/emu/lunarcore/game/rogue/RogueEntityLoader.java @@ -54,7 +54,7 @@ public class RogueEntityLoader extends SceneEntityLoader { PropRogueData propExtra = null; // Rogue Door id is 1000 - if (propId == 1000) { + if (propId == 1000 || propId == 1021) { // Site index int index = 0; diff --git a/src/main/java/emu/lunarcore/game/rogue/RogueInstance.java b/src/main/java/emu/lunarcore/game/rogue/RogueInstance.java index 4f487cc..621efcd 100644 --- a/src/main/java/emu/lunarcore/game/rogue/RogueInstance.java +++ b/src/main/java/emu/lunarcore/game/rogue/RogueInstance.java @@ -4,12 +4,15 @@ import java.util.HashSet; import java.util.Set; import java.util.TreeMap; +import emu.lunarcore.data.config.AnchorInfo; 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 emu.lunarcore.server.packet.send.PacketSyncRogueMapRoomScNotify; +import emu.lunarcore.util.Utils; import lombok.Getter; @Getter @@ -19,6 +22,7 @@ public class RogueInstance { private int currentRoomProgress; private int currentSiteId; + private int startSiteId; private Set baseAvatarIds; private TreeMap rooms; @@ -45,18 +49,61 @@ public class RogueInstance { this.rooms.put(roomData.getSiteId(), roomData); if (mapExcel.isIsStart()) { - this.setCurrentRoom(roomData); + this.startSiteId = roomData.getSiteId(); } } } - private void setCurrentRoom(RogueRoomData roomData) { - this.currentSiteId = roomData.getSiteId(); - roomData.setStatus(RogueRoomStatus.ROGUE_ROOM_STATUS_PLAY); // TODO reset when changing rooms + private RogueRoomData getRoomBySiteId(int siteId) { + return this.rooms.get(siteId); } public RogueRoomData getCurrentRoom() { - return this.rooms.get(this.getCurrentSiteId()); + return this.getRoomBySiteId(this.getCurrentSiteId()); + } + + public RogueRoomData enterRoom(int siteId) { + // Set status on previous room + RogueRoomData prevRoom = getCurrentRoom(); + if (prevRoom != null) { + // Make sure the site we want to go into is connected to the current room we are in + if (!Utils.arrayContains(prevRoom.getNextSiteIds(), siteId)) { + return null; + } + // Update status + prevRoom.setStatus(RogueRoomStatus.ROGUE_ROOM_STATUS_FINISH); + } + + // Get next room + RogueRoomData nextRoom = this.getRoomBySiteId(siteId); + if (nextRoom == null) return null; + + // Enter room + this.currentSiteId = nextRoom.getSiteId(); + nextRoom.setStatus(RogueRoomStatus.ROGUE_ROOM_STATUS_PLAY); + + // Enter scene + boolean success = getPlayer().enterScene(nextRoom.getRoomExcel().getMapEntrance(), 0, false); + if (!success) return null; + + // Move player to rogue start position + AnchorInfo anchor = getPlayer().getScene().getFloorInfo().getAnchorInfo(nextRoom.getExcel().getGroupID(), 1); + if (anchor != null) { + getPlayer().getPos().set(anchor.getPos()); + getPlayer().getRot().set(anchor.getRot()); + } + + // Load scene groups. THIS NEEDS TO BE LAST + for (int key : nextRoom.getExcel().getGroupWithContent().keySet()) { + getPlayer().getScene().loadGroup(key); + } + + // Send packet if we are not entering the rogue instance for the first time + if (prevRoom != null) { + getPlayer().sendPacket(new PacketSyncRogueMapRoomScNotify(this, nextRoom)); + } + + return nextRoom; } // Serialization diff --git a/src/main/java/emu/lunarcore/game/rogue/RogueManager.java b/src/main/java/emu/lunarcore/game/rogue/RogueManager.java index e104616..4eec8be 100644 --- a/src/main/java/emu/lunarcore/game/rogue/RogueManager.java +++ b/src/main/java/emu/lunarcore/game/rogue/RogueManager.java @@ -6,8 +6,6 @@ import java.util.concurrent.TimeUnit; import emu.lunarcore.GameConstants; 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; @@ -52,11 +50,10 @@ public class RogueManager extends BasePlayerManager { getPlayer().sendPacket(new PacketStartRogueScRsp()); return; } - - // Get entrance id + // Get entrance id RogueInstance data = new RogueInstance(getPlayer(), excel); getPlayer().setRogueInstance(data); - + // Reset hp/sp lineup.forEachAvatar(avatar -> { avatar.setCurrentHp(lineup, 10000); @@ -69,10 +66,10 @@ public class RogueManager extends BasePlayerManager { // Set first lineup before we enter scenes getPlayer().getLineupManager().setCurrentExtraLineup(ExtraLineupType.LINEUP_ROGUE, false); - // Enter scene - int entranceId = data.getCurrentRoom().getRoomExcel().getMapEntrance(); - boolean success = getPlayer().enterScene(entranceId, 0, false); - if (!success) { + // Enter rogue + RogueRoomData room = data.enterRoom(data.getStartSiteId()); + + if (room == null) { // Reset lineup/instance if entering scene failed getPlayer().getLineupManager().setCurrentExtraLineup(0, false); getPlayer().setRogueInstance(null); @@ -80,21 +77,6 @@ public class RogueManager extends BasePlayerManager { getPlayer().sendPacket(new PacketStartRogueScRsp()); return; } - - // Get room excel - RogueRoomExcel roomExcel = data.getCurrentRoom().getExcel(); - - // 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()); - } - - // Load scene groups. THIS NEEDS TO BE LAST - for (int key : roomExcel.getGroupWithContent().keySet()) { - getPlayer().getScene().loadGroup(key); - } // Done getPlayer().sendPacket(new PacketStartRogueScRsp(getPlayer())); diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerEnterRogueMapRoomCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerEnterRogueMapRoomCsReq.java new file mode 100644 index 0000000..94c34b7 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerEnterRogueMapRoomCsReq.java @@ -0,0 +1,30 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.game.rogue.RogueRoomData; +import emu.lunarcore.proto.EnterRogueMapRoomCsReqOuterClass.EnterRogueMapRoomCsReq; +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.PacketEnterRogueMapRoomScRsp; + +@Opcodes(CmdId.EnterRogueMapRoomCsReq) +public class HandlerEnterRogueMapRoomCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = EnterRogueMapRoomCsReq.parseFrom(data); + + RogueRoomData enteredRoom = null; + if (session.getPlayer().getRogueInstance() != null) { + enteredRoom = session.getPlayer().getRogueInstance().enterRoom(req.getSiteId()); + } + + if (enteredRoom != null) { + session.send(new PacketEnterRogueMapRoomScRsp(session.getPlayer(), enteredRoom)); + } else { + session.send(CmdId.EnterRogueMapRoomScRsp); + } + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketEnterRogueMapRoomScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketEnterRogueMapRoomScRsp.java new file mode 100644 index 0000000..8d3339d --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketEnterRogueMapRoomScRsp.java @@ -0,0 +1,21 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.player.Player; +import emu.lunarcore.game.rogue.RogueRoomData; +import emu.lunarcore.proto.EnterRogueMapRoomScRspOuterClass.EnterRogueMapRoomScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketEnterRogueMapRoomScRsp extends BasePacket { + + public PacketEnterRogueMapRoomScRsp(Player player, RogueRoomData room) { + super(CmdId.EnterRogueMapRoomScRsp); + + var data = EnterRogueMapRoomScRsp.newInstance() + .setLineup(player.getCurrentLineup().toProto()) + .setScene(player.getScene().toProto()) + .setCurSiteId(room.getSiteId()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSyncRogueMapRoomScNotify.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSyncRogueMapRoomScNotify.java index eacbac5..fb8c470 100644 --- a/src/main/java/emu/lunarcore/server/packet/send/PacketSyncRogueMapRoomScNotify.java +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSyncRogueMapRoomScNotify.java @@ -1,21 +1,19 @@ package emu.lunarcore.server.packet.send; -import emu.lunarcore.game.player.Player; +import emu.lunarcore.game.rogue.RogueInstance; +import emu.lunarcore.game.rogue.RogueRoomData; 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) { + public PacketSyncRogueMapRoomScNotify(RogueInstance rogue, RogueRoomData room) { super(CmdId.SyncRogueMapRoomScNotify); - var data = SyncRogueMapRoomScNotify.newInstance(); - - if (player.getRogueInstance() != null) { - data.setMapId(player.getRogueInstance().getExcel().getMapId()); - data.setCurRoom(player.getRogueInstance().getCurrentRoom().toProto()); - } + var data = SyncRogueMapRoomScNotify.newInstance() + .setMapId(rogue.getExcel().getMapId()) + .setCurRoom(room.toProto()); this.setData(data); } diff --git a/src/main/java/emu/lunarcore/util/Utils.java b/src/main/java/emu/lunarcore/util/Utils.java index 8136c49..403f047 100644 --- a/src/main/java/emu/lunarcore/util/Utils.java +++ b/src/main/java/emu/lunarcore/util/Utils.java @@ -135,6 +135,18 @@ public class Utils { public static T randomElement(List list) { return list.get(ThreadLocalRandom.current().nextInt(0, list.size())); } + + /** + * Checks if an integer array contains a value + * @param array + * @param value The value to check for + */ + public static boolean arrayContains(int[] array, int value) { + for (int i = 0; i < array.length; i++) { + if (array[i] == value) return true; + } + return false; + } /** * Base64 encodes a given byte array.