From f8df9b3e6a0d7617110020314ccb37acd5a3767c Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Mon, 23 Oct 2023 09:09:22 -0700 Subject: [PATCH] Implement compose items --- .../proto/ComposeItemCsReqOuterClass.java | 442 +++++++++++++++ .../proto/ComposeItemScRspOuterClass.java | 522 ++++++++++++++++++ .../java/emu/lunarcore/data/GameData.java | 1 + .../data/excel/ItemComposeExcel.java | 31 ++ .../game/service/InventoryService.java | 39 ++ .../packet/recv/HandlerComposeItemCsReq.java | 29 + .../packet/send/PacketComposeItemScRsp.java | 29 + 7 files changed, 1093 insertions(+) create mode 100644 src/generated/main/emu/lunarcore/proto/ComposeItemCsReqOuterClass.java create mode 100644 src/generated/main/emu/lunarcore/proto/ComposeItemScRspOuterClass.java create mode 100644 src/main/java/emu/lunarcore/data/excel/ItemComposeExcel.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerComposeItemCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketComposeItemScRsp.java diff --git a/src/generated/main/emu/lunarcore/proto/ComposeItemCsReqOuterClass.java b/src/generated/main/emu/lunarcore/proto/ComposeItemCsReqOuterClass.java new file mode 100644 index 0000000..fd968c2 --- /dev/null +++ b/src/generated/main/emu/lunarcore/proto/ComposeItemCsReqOuterClass.java @@ -0,0 +1,442 @@ +// 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 ComposeItemCsReqOuterClass { + /** + * Protobuf type {@code ComposeItemCsReq} + */ + public static final class ComposeItemCsReq extends ProtoMessage implements Cloneable { + private static final long serialVersionUID = 0L; + + /** + * optional uint32 count = 12; + */ + private int count; + + /** + * optional uint32 compose_id = 14; + */ + private int composeId; + + /** + * optional .ItemCostList compose_item_list = 6; + */ + private final ItemCostListOuterClass.ItemCostList composeItemList = ItemCostListOuterClass.ItemCostList.newInstance(); + + private ComposeItemCsReq() { + } + + /** + * @return a new empty instance of {@code ComposeItemCsReq} + */ + public static ComposeItemCsReq newInstance() { + return new ComposeItemCsReq(); + } + + /** + * optional uint32 count = 12; + * @return whether the count field is set + */ + public boolean hasCount() { + return (bitField0_ & 0x00000001) != 0; + } + + /** + * optional uint32 count = 12; + * @return this + */ + public ComposeItemCsReq clearCount() { + bitField0_ &= ~0x00000001; + count = 0; + return this; + } + + /** + * optional uint32 count = 12; + * @return the count + */ + public int getCount() { + return count; + } + + /** + * optional uint32 count = 12; + * @param value the count to set + * @return this + */ + public ComposeItemCsReq setCount(final int value) { + bitField0_ |= 0x00000001; + count = value; + return this; + } + + /** + * optional uint32 compose_id = 14; + * @return whether the composeId field is set + */ + public boolean hasComposeId() { + return (bitField0_ & 0x00000002) != 0; + } + + /** + * optional uint32 compose_id = 14; + * @return this + */ + public ComposeItemCsReq clearComposeId() { + bitField0_ &= ~0x00000002; + composeId = 0; + return this; + } + + /** + * optional uint32 compose_id = 14; + * @return the composeId + */ + public int getComposeId() { + return composeId; + } + + /** + * optional uint32 compose_id = 14; + * @param value the composeId to set + * @return this + */ + public ComposeItemCsReq setComposeId(final int value) { + bitField0_ |= 0x00000002; + composeId = value; + return this; + } + + /** + * optional .ItemCostList compose_item_list = 6; + * @return whether the composeItemList field is set + */ + public boolean hasComposeItemList() { + return (bitField0_ & 0x00000004) != 0; + } + + /** + * optional .ItemCostList compose_item_list = 6; + * @return this + */ + public ComposeItemCsReq clearComposeItemList() { + bitField0_ &= ~0x00000004; + composeItemList.clear(); + return this; + } + + /** + * optional .ItemCostList compose_item_list = 6; + * + * 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 #getMutableComposeItemList()} if you want to modify it. + * + * @return internal storage object for reading + */ + public ItemCostListOuterClass.ItemCostList getComposeItemList() { + return composeItemList; + } + + /** + * optional .ItemCostList compose_item_list = 6; + * + * 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 ItemCostListOuterClass.ItemCostList getMutableComposeItemList() { + bitField0_ |= 0x00000004; + return composeItemList; + } + + /** + * optional .ItemCostList compose_item_list = 6; + * @param value the composeItemList to set + * @return this + */ + public ComposeItemCsReq setComposeItemList(final ItemCostListOuterClass.ItemCostList value) { + bitField0_ |= 0x00000004; + composeItemList.copyFrom(value); + return this; + } + + @Override + public ComposeItemCsReq copyFrom(final ComposeItemCsReq other) { + cachedSize = other.cachedSize; + if ((bitField0_ | other.bitField0_) != 0) { + bitField0_ = other.bitField0_; + count = other.count; + composeId = other.composeId; + composeItemList.copyFrom(other.composeItemList); + } + return this; + } + + @Override + public ComposeItemCsReq mergeFrom(final ComposeItemCsReq other) { + if (other.isEmpty()) { + return this; + } + cachedSize = -1; + if (other.hasCount()) { + setCount(other.count); + } + if (other.hasComposeId()) { + setComposeId(other.composeId); + } + if (other.hasComposeItemList()) { + getMutableComposeItemList().mergeFrom(other.composeItemList); + } + return this; + } + + @Override + public ComposeItemCsReq clear() { + if (isEmpty()) { + return this; + } + cachedSize = -1; + bitField0_ = 0; + count = 0; + composeId = 0; + composeItemList.clear(); + return this; + } + + @Override + public ComposeItemCsReq clearQuick() { + if (isEmpty()) { + return this; + } + cachedSize = -1; + bitField0_ = 0; + composeItemList.clearQuick(); + return this; + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (!(o instanceof ComposeItemCsReq)) { + return false; + } + ComposeItemCsReq other = (ComposeItemCsReq) o; + return bitField0_ == other.bitField0_ + && (!hasCount() || count == other.count) + && (!hasComposeId() || composeId == other.composeId) + && (!hasComposeItemList() || composeItemList.equals(other.composeItemList)); + } + + @Override + public void writeTo(final ProtoSink output) throws IOException { + if ((bitField0_ & 0x00000001) != 0) { + output.writeRawByte((byte) 96); + output.writeUInt32NoTag(count); + } + if ((bitField0_ & 0x00000002) != 0) { + output.writeRawByte((byte) 112); + output.writeUInt32NoTag(composeId); + } + if ((bitField0_ & 0x00000004) != 0) { + output.writeRawByte((byte) 50); + output.writeMessageNoTag(composeItemList); + } + } + + @Override + protected int computeSerializedSize() { + int size = 0; + if ((bitField0_ & 0x00000001) != 0) { + size += 1 + ProtoSink.computeUInt32SizeNoTag(count); + } + if ((bitField0_ & 0x00000002) != 0) { + size += 1 + ProtoSink.computeUInt32SizeNoTag(composeId); + } + if ((bitField0_ & 0x00000004) != 0) { + size += 1 + ProtoSink.computeMessageSizeNoTag(composeItemList); + } + return size; + } + + @Override + @SuppressWarnings("fallthrough") + public ComposeItemCsReq mergeFrom(final ProtoSource input) throws IOException { + // Enabled Fall-Through Optimization (QuickBuffers) + int tag = input.readTag(); + while (true) { + switch (tag) { + case 96: { + // count + count = input.readUInt32(); + bitField0_ |= 0x00000001; + tag = input.readTag(); + if (tag != 112) { + break; + } + } + case 112: { + // composeId + composeId = input.readUInt32(); + bitField0_ |= 0x00000002; + tag = input.readTag(); + if (tag != 50) { + break; + } + } + case 50: { + // composeItemList + input.readMessage(composeItemList); + bitField0_ |= 0x00000004; + 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.count, count); + } + if ((bitField0_ & 0x00000002) != 0) { + output.writeUInt32(FieldNames.composeId, composeId); + } + if ((bitField0_ & 0x00000004) != 0) { + output.writeMessage(FieldNames.composeItemList, composeItemList); + } + output.endObject(); + } + + @Override + public ComposeItemCsReq mergeFrom(final JsonSource input) throws IOException { + if (!input.beginObject()) { + return this; + } + while (!input.isAtEnd()) { + switch (input.readFieldHash()) { + case 94851343: { + if (input.isAtField(FieldNames.count)) { + if (!input.trySkipNullValue()) { + count = input.readUInt32(); + bitField0_ |= 0x00000001; + } + } else { + input.skipUnknownField(); + } + break; + } + case -1399759283: + case -442843416: { + if (input.isAtField(FieldNames.composeId)) { + if (!input.trySkipNullValue()) { + composeId = input.readUInt32(); + bitField0_ |= 0x00000002; + } + } else { + input.skipUnknownField(); + } + break; + } + case -1347157501: + case -656801827: { + if (input.isAtField(FieldNames.composeItemList)) { + if (!input.trySkipNullValue()) { + input.readMessage(composeItemList); + bitField0_ |= 0x00000004; + } + } else { + input.skipUnknownField(); + } + break; + } + default: { + input.skipUnknownField(); + break; + } + } + } + input.endObject(); + return this; + } + + @Override + public ComposeItemCsReq clone() { + return new ComposeItemCsReq().copyFrom(this); + } + + @Override + public boolean isEmpty() { + return ((bitField0_) == 0); + } + + public static ComposeItemCsReq parseFrom(final byte[] data) throws + InvalidProtocolBufferException { + return ProtoMessage.mergeFrom(new ComposeItemCsReq(), data).checkInitialized(); + } + + public static ComposeItemCsReq parseFrom(final ProtoSource input) throws IOException { + return ProtoMessage.mergeFrom(new ComposeItemCsReq(), input).checkInitialized(); + } + + public static ComposeItemCsReq parseFrom(final JsonSource input) throws IOException { + return ProtoMessage.mergeFrom(new ComposeItemCsReq(), input).checkInitialized(); + } + + /** + * @return factory for creating ComposeItemCsReq messages + */ + public static MessageFactory getFactory() { + return ComposeItemCsReqFactory.INSTANCE; + } + + private enum ComposeItemCsReqFactory implements MessageFactory { + INSTANCE; + + @Override + public ComposeItemCsReq create() { + return ComposeItemCsReq.newInstance(); + } + } + + /** + * Contains name constants used for serializing JSON + */ + static class FieldNames { + static final FieldName count = FieldName.forField("count"); + + static final FieldName composeId = FieldName.forField("composeId", "compose_id"); + + static final FieldName composeItemList = FieldName.forField("composeItemList", "compose_item_list"); + } + } +} diff --git a/src/generated/main/emu/lunarcore/proto/ComposeItemScRspOuterClass.java b/src/generated/main/emu/lunarcore/proto/ComposeItemScRspOuterClass.java new file mode 100644 index 0000000..ea4fa3e --- /dev/null +++ b/src/generated/main/emu/lunarcore/proto/ComposeItemScRspOuterClass.java @@ -0,0 +1,522 @@ +// 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 ComposeItemScRspOuterClass { + /** + * Protobuf type {@code ComposeItemScRsp} + */ + public static final class ComposeItemScRsp extends ProtoMessage implements Cloneable { + private static final long serialVersionUID = 0L; + + /** + * optional uint32 count = 2; + */ + private int count; + + /** + * optional uint32 compose_id = 4; + */ + private int composeId; + + /** + * optional uint32 retcode = 6; + */ + private int retcode; + + /** + * optional .ItemList return_item_list = 10; + */ + private final ItemListOuterClass.ItemList returnItemList = ItemListOuterClass.ItemList.newInstance(); + + private ComposeItemScRsp() { + } + + /** + * @return a new empty instance of {@code ComposeItemScRsp} + */ + public static ComposeItemScRsp newInstance() { + return new ComposeItemScRsp(); + } + + /** + * optional uint32 count = 2; + * @return whether the count field is set + */ + public boolean hasCount() { + return (bitField0_ & 0x00000001) != 0; + } + + /** + * optional uint32 count = 2; + * @return this + */ + public ComposeItemScRsp clearCount() { + bitField0_ &= ~0x00000001; + count = 0; + return this; + } + + /** + * optional uint32 count = 2; + * @return the count + */ + public int getCount() { + return count; + } + + /** + * optional uint32 count = 2; + * @param value the count to set + * @return this + */ + public ComposeItemScRsp setCount(final int value) { + bitField0_ |= 0x00000001; + count = value; + return this; + } + + /** + * optional uint32 compose_id = 4; + * @return whether the composeId field is set + */ + public boolean hasComposeId() { + return (bitField0_ & 0x00000002) != 0; + } + + /** + * optional uint32 compose_id = 4; + * @return this + */ + public ComposeItemScRsp clearComposeId() { + bitField0_ &= ~0x00000002; + composeId = 0; + return this; + } + + /** + * optional uint32 compose_id = 4; + * @return the composeId + */ + public int getComposeId() { + return composeId; + } + + /** + * optional uint32 compose_id = 4; + * @param value the composeId to set + * @return this + */ + public ComposeItemScRsp setComposeId(final int value) { + bitField0_ |= 0x00000002; + composeId = value; + return this; + } + + /** + * optional uint32 retcode = 6; + * @return whether the retcode field is set + */ + public boolean hasRetcode() { + return (bitField0_ & 0x00000004) != 0; + } + + /** + * optional uint32 retcode = 6; + * @return this + */ + public ComposeItemScRsp clearRetcode() { + bitField0_ &= ~0x00000004; + retcode = 0; + return this; + } + + /** + * optional uint32 retcode = 6; + * @return the retcode + */ + public int getRetcode() { + return retcode; + } + + /** + * optional uint32 retcode = 6; + * @param value the retcode to set + * @return this + */ + public ComposeItemScRsp setRetcode(final int value) { + bitField0_ |= 0x00000004; + retcode = value; + return this; + } + + /** + * optional .ItemList return_item_list = 10; + * @return whether the returnItemList field is set + */ + public boolean hasReturnItemList() { + return (bitField0_ & 0x00000008) != 0; + } + + /** + * optional .ItemList return_item_list = 10; + * @return this + */ + public ComposeItemScRsp clearReturnItemList() { + bitField0_ &= ~0x00000008; + returnItemList.clear(); + return this; + } + + /** + * optional .ItemList return_item_list = 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 #getMutableReturnItemList()} if you want to modify it. + * + * @return internal storage object for reading + */ + public ItemListOuterClass.ItemList getReturnItemList() { + return returnItemList; + } + + /** + * optional .ItemList return_item_list = 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 ItemListOuterClass.ItemList getMutableReturnItemList() { + bitField0_ |= 0x00000008; + return returnItemList; + } + + /** + * optional .ItemList return_item_list = 10; + * @param value the returnItemList to set + * @return this + */ + public ComposeItemScRsp setReturnItemList(final ItemListOuterClass.ItemList value) { + bitField0_ |= 0x00000008; + returnItemList.copyFrom(value); + return this; + } + + @Override + public ComposeItemScRsp copyFrom(final ComposeItemScRsp other) { + cachedSize = other.cachedSize; + if ((bitField0_ | other.bitField0_) != 0) { + bitField0_ = other.bitField0_; + count = other.count; + composeId = other.composeId; + retcode = other.retcode; + returnItemList.copyFrom(other.returnItemList); + } + return this; + } + + @Override + public ComposeItemScRsp mergeFrom(final ComposeItemScRsp other) { + if (other.isEmpty()) { + return this; + } + cachedSize = -1; + if (other.hasCount()) { + setCount(other.count); + } + if (other.hasComposeId()) { + setComposeId(other.composeId); + } + if (other.hasRetcode()) { + setRetcode(other.retcode); + } + if (other.hasReturnItemList()) { + getMutableReturnItemList().mergeFrom(other.returnItemList); + } + return this; + } + + @Override + public ComposeItemScRsp clear() { + if (isEmpty()) { + return this; + } + cachedSize = -1; + bitField0_ = 0; + count = 0; + composeId = 0; + retcode = 0; + returnItemList.clear(); + return this; + } + + @Override + public ComposeItemScRsp clearQuick() { + if (isEmpty()) { + return this; + } + cachedSize = -1; + bitField0_ = 0; + returnItemList.clearQuick(); + return this; + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (!(o instanceof ComposeItemScRsp)) { + return false; + } + ComposeItemScRsp other = (ComposeItemScRsp) o; + return bitField0_ == other.bitField0_ + && (!hasCount() || count == other.count) + && (!hasComposeId() || composeId == other.composeId) + && (!hasRetcode() || retcode == other.retcode) + && (!hasReturnItemList() || returnItemList.equals(other.returnItemList)); + } + + @Override + public void writeTo(final ProtoSink output) throws IOException { + if ((bitField0_ & 0x00000001) != 0) { + output.writeRawByte((byte) 16); + output.writeUInt32NoTag(count); + } + if ((bitField0_ & 0x00000002) != 0) { + output.writeRawByte((byte) 32); + output.writeUInt32NoTag(composeId); + } + if ((bitField0_ & 0x00000004) != 0) { + output.writeRawByte((byte) 48); + output.writeUInt32NoTag(retcode); + } + if ((bitField0_ & 0x00000008) != 0) { + output.writeRawByte((byte) 82); + output.writeMessageNoTag(returnItemList); + } + } + + @Override + protected int computeSerializedSize() { + int size = 0; + if ((bitField0_ & 0x00000001) != 0) { + size += 1 + ProtoSink.computeUInt32SizeNoTag(count); + } + if ((bitField0_ & 0x00000002) != 0) { + size += 1 + ProtoSink.computeUInt32SizeNoTag(composeId); + } + if ((bitField0_ & 0x00000004) != 0) { + size += 1 + ProtoSink.computeUInt32SizeNoTag(retcode); + } + if ((bitField0_ & 0x00000008) != 0) { + size += 1 + ProtoSink.computeMessageSizeNoTag(returnItemList); + } + return size; + } + + @Override + @SuppressWarnings("fallthrough") + public ComposeItemScRsp mergeFrom(final ProtoSource input) throws IOException { + // Enabled Fall-Through Optimization (QuickBuffers) + int tag = input.readTag(); + while (true) { + switch (tag) { + case 16: { + // count + count = input.readUInt32(); + bitField0_ |= 0x00000001; + tag = input.readTag(); + if (tag != 32) { + break; + } + } + case 32: { + // composeId + composeId = input.readUInt32(); + bitField0_ |= 0x00000002; + tag = input.readTag(); + if (tag != 48) { + break; + } + } + case 48: { + // retcode + retcode = input.readUInt32(); + bitField0_ |= 0x00000004; + tag = input.readTag(); + if (tag != 82) { + break; + } + } + case 82: { + // returnItemList + input.readMessage(returnItemList); + 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.count, count); + } + if ((bitField0_ & 0x00000002) != 0) { + output.writeUInt32(FieldNames.composeId, composeId); + } + if ((bitField0_ & 0x00000004) != 0) { + output.writeUInt32(FieldNames.retcode, retcode); + } + if ((bitField0_ & 0x00000008) != 0) { + output.writeMessage(FieldNames.returnItemList, returnItemList); + } + output.endObject(); + } + + @Override + public ComposeItemScRsp mergeFrom(final JsonSource input) throws IOException { + if (!input.beginObject()) { + return this; + } + while (!input.isAtEnd()) { + switch (input.readFieldHash()) { + case 94851343: { + if (input.isAtField(FieldNames.count)) { + if (!input.trySkipNullValue()) { + count = input.readUInt32(); + bitField0_ |= 0x00000001; + } + } else { + input.skipUnknownField(); + } + break; + } + case -1399759283: + case -442843416: { + if (input.isAtField(FieldNames.composeId)) { + if (!input.trySkipNullValue()) { + composeId = input.readUInt32(); + bitField0_ |= 0x00000002; + } + } else { + input.skipUnknownField(); + } + break; + } + case 1097936398: { + if (input.isAtField(FieldNames.retcode)) { + if (!input.trySkipNullValue()) { + retcode = input.readUInt32(); + bitField0_ |= 0x00000004; + } + } else { + input.skipUnknownField(); + } + break; + } + case -6533215: + case -807051781: { + if (input.isAtField(FieldNames.returnItemList)) { + if (!input.trySkipNullValue()) { + input.readMessage(returnItemList); + bitField0_ |= 0x00000008; + } + } else { + input.skipUnknownField(); + } + break; + } + default: { + input.skipUnknownField(); + break; + } + } + } + input.endObject(); + return this; + } + + @Override + public ComposeItemScRsp clone() { + return new ComposeItemScRsp().copyFrom(this); + } + + @Override + public boolean isEmpty() { + return ((bitField0_) == 0); + } + + public static ComposeItemScRsp parseFrom(final byte[] data) throws + InvalidProtocolBufferException { + return ProtoMessage.mergeFrom(new ComposeItemScRsp(), data).checkInitialized(); + } + + public static ComposeItemScRsp parseFrom(final ProtoSource input) throws IOException { + return ProtoMessage.mergeFrom(new ComposeItemScRsp(), input).checkInitialized(); + } + + public static ComposeItemScRsp parseFrom(final JsonSource input) throws IOException { + return ProtoMessage.mergeFrom(new ComposeItemScRsp(), input).checkInitialized(); + } + + /** + * @return factory for creating ComposeItemScRsp messages + */ + public static MessageFactory getFactory() { + return ComposeItemScRspFactory.INSTANCE; + } + + private enum ComposeItemScRspFactory implements MessageFactory { + INSTANCE; + + @Override + public ComposeItemScRsp create() { + return ComposeItemScRsp.newInstance(); + } + } + + /** + * Contains name constants used for serializing JSON + */ + static class FieldNames { + static final FieldName count = FieldName.forField("count"); + + static final FieldName composeId = FieldName.forField("composeId", "compose_id"); + + static final FieldName retcode = FieldName.forField("retcode"); + + static final FieldName returnItemList = FieldName.forField("returnItemList", "return_item_list"); + } + } +} diff --git a/src/main/java/emu/lunarcore/data/GameData.java b/src/main/java/emu/lunarcore/data/GameData.java index b0ed80d..ec25b8f 100644 --- a/src/main/java/emu/lunarcore/data/GameData.java +++ b/src/main/java/emu/lunarcore/data/GameData.java @@ -29,6 +29,7 @@ public class GameData { @Getter private static Int2ObjectMap mapEntranceExcelMap = new Int2ObjectOpenHashMap<>(); @Getter private static Int2ObjectMap heroExcelMap = new Int2ObjectOpenHashMap<>(); @Getter private static Int2ObjectMap shopExcelMap = new Int2ObjectOpenHashMap<>(); + @Getter private static Int2ObjectMap itemComposeExcelMap = new Int2ObjectOpenHashMap<>(); @Getter private static Int2ObjectMap challengeExcelMap = new Int2ObjectOpenHashMap<>(); @Getter private static Int2ObjectMap challengeTargetExcelMap = new Int2ObjectOpenHashMap<>(); diff --git a/src/main/java/emu/lunarcore/data/excel/ItemComposeExcel.java b/src/main/java/emu/lunarcore/data/excel/ItemComposeExcel.java new file mode 100644 index 0000000..28cc7cc --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/ItemComposeExcel.java @@ -0,0 +1,31 @@ +package emu.lunarcore.data.excel; + +import java.util.List; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.common.ItemParam; + +import lombok.Getter; + +@Getter +@ResourceType(name = {"ItemComposeConfig.json"}) +public class ItemComposeExcel extends GameResource { + private int ID; + private int ItemID; + private FormulaType FormulaType; + private List MaterialCost; + private int[] SpecialMaterialCost; + private int CoinCost; + private int WorldLevelRequire; + private int[] RelicList; + + @Override + public int getId() { + return ID; + } + + public enum FormulaType { + Unknown, Normal, Sepcial, SelectedRelic; + } +} diff --git a/src/main/java/emu/lunarcore/game/service/InventoryService.java b/src/main/java/emu/lunarcore/game/service/InventoryService.java index 4a8b7a9..45e7154 100644 --- a/src/main/java/emu/lunarcore/game/service/InventoryService.java +++ b/src/main/java/emu/lunarcore/game/service/InventoryService.java @@ -7,6 +7,7 @@ import java.util.List; import emu.lunarcore.data.GameData; import emu.lunarcore.data.common.ItemParam; import emu.lunarcore.data.excel.*; +import emu.lunarcore.data.excel.ItemComposeExcel.FormulaType; import emu.lunarcore.game.avatar.GameAvatar; import emu.lunarcore.game.inventory.GameItem; import emu.lunarcore.game.player.Player; @@ -585,4 +586,42 @@ public class InventoryService extends BaseGameService { return items; } + + public List composeItem(Player player, int composeId, int count) { + // Sanity check + if (count <= 0) return null; + + // Get item compose excel data + ItemComposeExcel excel = GameData.getItemComposeExcelMap().get(composeId); + if (excel == null || excel.getFormulaType() != FormulaType.Normal) { + return null; + } + + // Verify items + for (ItemParam param : excel.getMaterialCost()) { + GameItem item = player.getInventory().getItemByParam(param); + if (item == null || item.getCount() < param.getCount() * count) { + return null; + } + } + + // Verify credits + if (player.getScoin() < excel.getCoinCost() * count) { + return null; + } + + // Pay items + player.getInventory().removeItemsByParams(excel.getMaterialCost(), count); + player.addSCoin(-excel.getCoinCost() * count); + + // Compose item + List items = new ArrayList<>(); + GameItem item = new GameItem(excel.getItemID(), count); + items.add(item); + + // Add items to inventory + player.getInventory().addItems(items); + + return items; + } } diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerComposeItemCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerComposeItemCsReq.java new file mode 100644 index 0000000..2a7c678 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerComposeItemCsReq.java @@ -0,0 +1,29 @@ +package emu.lunarcore.server.packet.recv; + +import java.util.List; + +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.proto.ComposeItemCsReqOuterClass.ComposeItemCsReq; +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.PacketComposeItemScRsp; + +@Opcodes(CmdId.ComposeItemCsReq) +public class HandlerComposeItemCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = ComposeItemCsReq.parseFrom(data); + + List returnList = session.getServer().getInventoryService().composeItem( + session.getPlayer(), + req.getComposeId(), + req.getCount() + ); + + session.send(new PacketComposeItemScRsp(req.getComposeId(), req.getCount(), returnList)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketComposeItemScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketComposeItemScRsp.java new file mode 100644 index 0000000..b3fa6db --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketComposeItemScRsp.java @@ -0,0 +1,29 @@ +package emu.lunarcore.server.packet.send; + +import java.util.Collection; + +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.proto.ComposeItemScRspOuterClass.ComposeItemScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketComposeItemScRsp extends BasePacket { + + public PacketComposeItemScRsp(int composeId, int count, Collection returnList) { + super(CmdId.ComposeItemScRsp); + + var data = ComposeItemScRsp.newInstance() + .setComposeId(composeId) + .setCount(count); + + if (returnList != null) { + for (var item : returnList) { + data.getMutableReturnItemList().addItemList(item.toProto()); + } + } else { + data.getMutableReturnItemList(); + } + + this.setData(data); + } +}