diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index faccaf990..acdbe3c4e 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,7 +1,7 @@
## Description
Please carefully read the [Contributing note](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md) and [Code of conduct](https://github.com/Grasscutters/Grasscutter/blob/development/CODE_OF_CONDUCT.md) before making any pull requests.
-And, **Do not make a pull request to merge into stable unless it is a hotfix. Use the development branch instead.**
+
## Issues fixed by this PR
@@ -19,4 +19,4 @@ And, **Do not make a pull request to merge into stable unless it is a hotfix. Us
- [ ] My code follows the style guidelines of this project
- [ ] My pull request is unique and no other pull requests have been opened for these changes
- [ ] I have read the [Contributing note](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md) and [Code of conduct](https://github.com/Grasscutters/Grasscutter/blob/development/CODE_OF_CONDUCT.md)
-- [ ] I am responsible for any copyright issues with my code if it occurs in the future.
\ No newline at end of file
+- [ ] I am responsible for any copyright issues with my code if it occurs in the future.
diff --git a/src/generated/main/java/emu/grasscutter/net/proto/BuyResinReqOuterClass.java b/src/generated/main/java/emu/grasscutter/net/proto/BuyResinReqOuterClass.java
new file mode 100644
index 000000000..69be718d5
--- /dev/null
+++ b/src/generated/main/java/emu/grasscutter/net/proto/BuyResinReqOuterClass.java
@@ -0,0 +1,475 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: BuyResinReq.proto
+
+package emu.grasscutter.net.proto;
+
+public final class BuyResinReqOuterClass {
+ private BuyResinReqOuterClass() {}
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistryLite registry) {
+ }
+
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistry registry) {
+ registerAllExtensions(
+ (com.google.protobuf.ExtensionRegistryLite) registry);
+ }
+ public interface BuyResinReqOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:BuyResinReq)
+ com.google.protobuf.MessageOrBuilder {
+ }
+ /**
+ *
+ * Name: NIBFJEFHMIM
+ * CmdId: 630
+ *
+ *
+ * Protobuf type {@code BuyResinReq}
+ */
+ public static final class BuyResinReq extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:BuyResinReq)
+ BuyResinReqOrBuilder {
+ private static final long serialVersionUID = 0L;
+ // Use BuyResinReq.newBuilder() to construct.
+ private BuyResinReq(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+ super(builder);
+ }
+ private BuyResinReq() {
+ }
+
+ @java.lang.Override
+ @SuppressWarnings({"unused"})
+ protected java.lang.Object newInstance(
+ UnusedPrivateParameter unused) {
+ return new BuyResinReq();
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private BuyResinReq(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ default: {
+ if (!parseUnknownField(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return emu.grasscutter.net.proto.BuyResinReqOuterClass.internal_static_BuyResinReq_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return emu.grasscutter.net.proto.BuyResinReqOuterClass.internal_static_BuyResinReq_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq.class, emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq.Builder.class);
+ }
+
+ private byte memoizedIsInitialized = -1;
+ @java.lang.Override
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ @java.lang.Override
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ unknownFields.writeTo(output);
+ }
+
+ @java.lang.Override
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq)) {
+ return super.equals(obj);
+ }
+ emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq other = (emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq) obj;
+
+ if (!unknownFields.equals(other.unknownFields)) return false;
+ return true;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ @java.lang.Override
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ @java.lang.Override
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ *
+ * Name: NIBFJEFHMIM
+ * CmdId: 630
+ *
+ *
+ * Protobuf type {@code BuyResinReq}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder implements
+ // @@protoc_insertion_point(builder_implements:BuyResinReq)
+ emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReqOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return emu.grasscutter.net.proto.BuyResinReqOuterClass.internal_static_BuyResinReq_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return emu.grasscutter.net.proto.BuyResinReqOuterClass.internal_static_BuyResinReq_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq.class, emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq.Builder.class);
+ }
+
+ // Construct using emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ }
+ }
+ @java.lang.Override
+ public Builder clear() {
+ super.clear();
+ return this;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return emu.grasscutter.net.proto.BuyResinReqOuterClass.internal_static_BuyResinReq_descriptor;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq getDefaultInstanceForType() {
+ return emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq.getDefaultInstance();
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq build() {
+ emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq buildPartial() {
+ emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq result = new emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq(this);
+ onBuilt();
+ return result;
+ }
+
+ @java.lang.Override
+ public Builder clone() {
+ return super.clone();
+ }
+ @java.lang.Override
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.setField(field, value);
+ }
+ @java.lang.Override
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return super.clearField(field);
+ }
+ @java.lang.Override
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return super.clearOneof(oneof);
+ }
+ @java.lang.Override
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return super.setRepeatedField(field, index, value);
+ }
+ @java.lang.Override
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.addRepeatedField(field, value);
+ }
+ @java.lang.Override
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq) {
+ return mergeFrom((emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq other) {
+ if (other == emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq.getDefaultInstance()) return this;
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ @java.lang.Override
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+ @java.lang.Override
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFields(unknownFields);
+ }
+
+ @java.lang.Override
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:BuyResinReq)
+ }
+
+ // @@protoc_insertion_point(class_scope:BuyResinReq)
+ private static final emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq();
+ }
+
+ public static emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser
+ PARSER = new com.google.protobuf.AbstractParser() {
+ @java.lang.Override
+ public BuyResinReq parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new BuyResinReq(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser getParserForType() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.BuyResinReqOuterClass.BuyResinReq getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+ }
+
+ private static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_BuyResinReq_descriptor;
+ private static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_BuyResinReq_fieldAccessorTable;
+
+ public static com.google.protobuf.Descriptors.FileDescriptor
+ getDescriptor() {
+ return descriptor;
+ }
+ private static com.google.protobuf.Descriptors.FileDescriptor
+ descriptor;
+ static {
+ java.lang.String[] descriptorData = {
+ "\n\021BuyResinReq.proto\"\r\n\013BuyResinReqB\033\n\031em" +
+ "u.grasscutter.net.protob\006proto3"
+ };
+ descriptor = com.google.protobuf.Descriptors.FileDescriptor
+ .internalBuildGeneratedFileFrom(descriptorData,
+ new com.google.protobuf.Descriptors.FileDescriptor[] {
+ });
+ internal_static_BuyResinReq_descriptor =
+ getDescriptor().getMessageTypes().get(0);
+ internal_static_BuyResinReq_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_BuyResinReq_descriptor,
+ new java.lang.String[] { });
+ }
+
+ // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/generated/main/java/emu/grasscutter/net/proto/BuyResinRspOuterClass.java b/src/generated/main/java/emu/grasscutter/net/proto/BuyResinRspOuterClass.java
new file mode 100644
index 000000000..c1f287c2b
--- /dev/null
+++ b/src/generated/main/java/emu/grasscutter/net/proto/BuyResinRspOuterClass.java
@@ -0,0 +1,616 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: BuyResinRsp.proto
+
+package emu.grasscutter.net.proto;
+
+public final class BuyResinRspOuterClass {
+ private BuyResinRspOuterClass() {}
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistryLite registry) {
+ }
+
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistry registry) {
+ registerAllExtensions(
+ (com.google.protobuf.ExtensionRegistryLite) registry);
+ }
+ public interface BuyResinRspOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:BuyResinRsp)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * int32 retcode = 9;
+ * @return The retcode.
+ */
+ int getRetcode();
+
+ /**
+ * uint32 cur_value = 3;
+ * @return The curValue.
+ */
+ int getCurValue();
+ }
+ /**
+ *
+ * Name: PFLBPGOHFKJ
+ * CmdId: 687
+ *
+ *
+ * Protobuf type {@code BuyResinRsp}
+ */
+ public static final class BuyResinRsp extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:BuyResinRsp)
+ BuyResinRspOrBuilder {
+ private static final long serialVersionUID = 0L;
+ // Use BuyResinRsp.newBuilder() to construct.
+ private BuyResinRsp(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+ super(builder);
+ }
+ private BuyResinRsp() {
+ }
+
+ @java.lang.Override
+ @SuppressWarnings({"unused"})
+ protected java.lang.Object newInstance(
+ UnusedPrivateParameter unused) {
+ return new BuyResinRsp();
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private BuyResinRsp(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ case 24: {
+
+ curValue_ = input.readUInt32();
+ break;
+ }
+ case 72: {
+
+ retcode_ = input.readInt32();
+ break;
+ }
+ default: {
+ if (!parseUnknownField(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return emu.grasscutter.net.proto.BuyResinRspOuterClass.internal_static_BuyResinRsp_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return emu.grasscutter.net.proto.BuyResinRspOuterClass.internal_static_BuyResinRsp_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp.class, emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp.Builder.class);
+ }
+
+ public static final int RETCODE_FIELD_NUMBER = 9;
+ private int retcode_;
+ /**
+ * int32 retcode = 9;
+ * @return The retcode.
+ */
+ @java.lang.Override
+ public int getRetcode() {
+ return retcode_;
+ }
+
+ public static final int CUR_VALUE_FIELD_NUMBER = 3;
+ private int curValue_;
+ /**
+ * uint32 cur_value = 3;
+ * @return The curValue.
+ */
+ @java.lang.Override
+ public int getCurValue() {
+ return curValue_;
+ }
+
+ private byte memoizedIsInitialized = -1;
+ @java.lang.Override
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ @java.lang.Override
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (curValue_ != 0) {
+ output.writeUInt32(3, curValue_);
+ }
+ if (retcode_ != 0) {
+ output.writeInt32(9, retcode_);
+ }
+ unknownFields.writeTo(output);
+ }
+
+ @java.lang.Override
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (curValue_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeUInt32Size(3, curValue_);
+ }
+ if (retcode_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32Size(9, retcode_);
+ }
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp)) {
+ return super.equals(obj);
+ }
+ emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp other = (emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp) obj;
+
+ if (getRetcode()
+ != other.getRetcode()) return false;
+ if (getCurValue()
+ != other.getCurValue()) return false;
+ if (!unknownFields.equals(other.unknownFields)) return false;
+ return true;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (37 * hash) + RETCODE_FIELD_NUMBER;
+ hash = (53 * hash) + getRetcode();
+ hash = (37 * hash) + CUR_VALUE_FIELD_NUMBER;
+ hash = (53 * hash) + getCurValue();
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ @java.lang.Override
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ @java.lang.Override
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ *
+ * Name: PFLBPGOHFKJ
+ * CmdId: 687
+ *
+ *
+ * Protobuf type {@code BuyResinRsp}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder implements
+ // @@protoc_insertion_point(builder_implements:BuyResinRsp)
+ emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRspOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return emu.grasscutter.net.proto.BuyResinRspOuterClass.internal_static_BuyResinRsp_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return emu.grasscutter.net.proto.BuyResinRspOuterClass.internal_static_BuyResinRsp_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp.class, emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp.Builder.class);
+ }
+
+ // Construct using emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ }
+ }
+ @java.lang.Override
+ public Builder clear() {
+ super.clear();
+ retcode_ = 0;
+
+ curValue_ = 0;
+
+ return this;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return emu.grasscutter.net.proto.BuyResinRspOuterClass.internal_static_BuyResinRsp_descriptor;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp getDefaultInstanceForType() {
+ return emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp.getDefaultInstance();
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp build() {
+ emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp buildPartial() {
+ emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp result = new emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp(this);
+ result.retcode_ = retcode_;
+ result.curValue_ = curValue_;
+ onBuilt();
+ return result;
+ }
+
+ @java.lang.Override
+ public Builder clone() {
+ return super.clone();
+ }
+ @java.lang.Override
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.setField(field, value);
+ }
+ @java.lang.Override
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return super.clearField(field);
+ }
+ @java.lang.Override
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return super.clearOneof(oneof);
+ }
+ @java.lang.Override
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return super.setRepeatedField(field, index, value);
+ }
+ @java.lang.Override
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.addRepeatedField(field, value);
+ }
+ @java.lang.Override
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp) {
+ return mergeFrom((emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp other) {
+ if (other == emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp.getDefaultInstance()) return this;
+ if (other.getRetcode() != 0) {
+ setRetcode(other.getRetcode());
+ }
+ if (other.getCurValue() != 0) {
+ setCurValue(other.getCurValue());
+ }
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ @java.lang.Override
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+
+ private int retcode_ ;
+ /**
+ * int32 retcode = 9;
+ * @return The retcode.
+ */
+ @java.lang.Override
+ public int getRetcode() {
+ return retcode_;
+ }
+ /**
+ * int32 retcode = 9;
+ * @param value The retcode to set.
+ * @return This builder for chaining.
+ */
+ public Builder setRetcode(int value) {
+
+ retcode_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * int32 retcode = 9;
+ * @return This builder for chaining.
+ */
+ public Builder clearRetcode() {
+
+ retcode_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private int curValue_ ;
+ /**
+ * uint32 cur_value = 3;
+ * @return The curValue.
+ */
+ @java.lang.Override
+ public int getCurValue() {
+ return curValue_;
+ }
+ /**
+ * uint32 cur_value = 3;
+ * @param value The curValue to set.
+ * @return This builder for chaining.
+ */
+ public Builder setCurValue(int value) {
+
+ curValue_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * uint32 cur_value = 3;
+ * @return This builder for chaining.
+ */
+ public Builder clearCurValue() {
+
+ curValue_ = 0;
+ onChanged();
+ return this;
+ }
+ @java.lang.Override
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFields(unknownFields);
+ }
+
+ @java.lang.Override
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:BuyResinRsp)
+ }
+
+ // @@protoc_insertion_point(class_scope:BuyResinRsp)
+ private static final emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp();
+ }
+
+ public static emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser
+ PARSER = new com.google.protobuf.AbstractParser() {
+ @java.lang.Override
+ public BuyResinRsp parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new BuyResinRsp(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser getParserForType() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.BuyResinRspOuterClass.BuyResinRsp getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+ }
+
+ private static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_BuyResinRsp_descriptor;
+ private static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_BuyResinRsp_fieldAccessorTable;
+
+ public static com.google.protobuf.Descriptors.FileDescriptor
+ getDescriptor() {
+ return descriptor;
+ }
+ private static com.google.protobuf.Descriptors.FileDescriptor
+ descriptor;
+ static {
+ java.lang.String[] descriptorData = {
+ "\n\021BuyResinRsp.proto\"1\n\013BuyResinRsp\022\017\n\007re" +
+ "tcode\030\t \001(\005\022\021\n\tcur_value\030\003 \001(\rB\033\n\031emu.gr" +
+ "asscutter.net.protob\006proto3"
+ };
+ descriptor = com.google.protobuf.Descriptors.FileDescriptor
+ .internalBuildGeneratedFileFrom(descriptorData,
+ new com.google.protobuf.Descriptors.FileDescriptor[] {
+ });
+ internal_static_BuyResinRsp_descriptor =
+ getDescriptor().getMessageTypes().get(0);
+ internal_static_BuyResinRsp_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_BuyResinRsp_descriptor,
+ new java.lang.String[] { "Retcode", "CurValue", });
+ }
+
+ // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/generated/main/java/emu/grasscutter/net/proto/ResinChangeNotifyOuterClass.java b/src/generated/main/java/emu/grasscutter/net/proto/ResinChangeNotifyOuterClass.java
index 83ae00ea9..f76117abb 100644
--- a/src/generated/main/java/emu/grasscutter/net/proto/ResinChangeNotifyOuterClass.java
+++ b/src/generated/main/java/emu/grasscutter/net/proto/ResinChangeNotifyOuterClass.java
@@ -1,734 +1,677 @@
-// Generated by the protocol buffer compiler. DO NOT EDIT!
-// source: ResinChangeNotify.proto
-
-package emu.grasscutter.net.proto;
-
-public final class ResinChangeNotifyOuterClass {
- private ResinChangeNotifyOuterClass() {}
-
- public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {}
-
- public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {
- registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
- }
-
- public interface ResinChangeNotifyOrBuilder
- extends
- // @@protoc_insertion_point(interface_extends:ResinChangeNotify)
- com.google.protobuf.MessageOrBuilder {
-
- /**
- * uint32 cur_value = 14;
- *
- * @return The curValue.
- */
- int getCurValue();
-
- /**
- * uint32 curBuyCount = 13;
- *
- * @return The curBuyCount.
- */
- int getCurBuyCount();
-
- /**
- * uint32 nextAddTimestamp = 12;
- *
- * @return The nextAddTimestamp.
- */
- int getNextAddTimestamp();
- }
- /**
- *
- *
- *
- * Name: IBIMGHOHNDK
- * CmdId: 649
- *
- *
- * Protobuf type {@code ResinChangeNotify}
- */
- public static final class ResinChangeNotify extends com.google.protobuf.GeneratedMessageV3
- implements
- // @@protoc_insertion_point(message_implements:ResinChangeNotify)
- ResinChangeNotifyOrBuilder {
- private static final long serialVersionUID = 0L;
- // Use ResinChangeNotify.newBuilder() to construct.
- private ResinChangeNotify(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
- super(builder);
- }
-
- private ResinChangeNotify() {}
-
- @java.lang.Override
- @SuppressWarnings({"unused"})
- protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
- return new ResinChangeNotify();
- }
-
- @java.lang.Override
- public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
- return this.unknownFields;
- }
-
- private ResinChangeNotify(
- com.google.protobuf.CodedInputStream input,
- com.google.protobuf.ExtensionRegistryLite extensionRegistry)
- throws com.google.protobuf.InvalidProtocolBufferException {
- this();
- if (extensionRegistry == null) {
- throw new java.lang.NullPointerException();
- }
- com.google.protobuf.UnknownFieldSet.Builder unknownFields =
- com.google.protobuf.UnknownFieldSet.newBuilder();
- try {
- boolean done = false;
- while (!done) {
- int tag = input.readTag();
- switch (tag) {
- case 0:
- done = true;
- break;
- case 96:
- {
- nextAddTimestamp_ = input.readUInt32();
- break;
- }
- case 104:
- {
- curBuyCount_ = input.readUInt32();
- break;
- }
- case 112:
- {
- curValue_ = input.readUInt32();
- break;
- }
- default:
- {
- if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- done = true;
- }
- break;
- }
- }
- }
- } catch (com.google.protobuf.InvalidProtocolBufferException e) {
- throw e.setUnfinishedMessage(this);
- } catch (java.io.IOException e) {
- throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
- } finally {
- this.unknownFields = unknownFields.build();
- makeExtensionsImmutable();
- }
- }
-
- public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
- return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass
- .internal_static_ResinChangeNotify_descriptor;
- }
-
- @java.lang.Override
- protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
- internalGetFieldAccessorTable() {
- return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass
- .internal_static_ResinChangeNotify_fieldAccessorTable
- .ensureFieldAccessorsInitialized(
- emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.class,
- emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.Builder
- .class);
- }
-
- public static final int CUR_VALUE_FIELD_NUMBER = 14;
- private int curValue_;
- /**
- * uint32 cur_value = 14;
- *
- * @return The curValue.
- */
- @java.lang.Override
- public int getCurValue() {
- return curValue_;
- }
-
- public static final int CURBUYCOUNT_FIELD_NUMBER = 13;
- private int curBuyCount_;
- /**
- * uint32 curBuyCount = 13;
- *
- * @return The curBuyCount.
- */
- @java.lang.Override
- public int getCurBuyCount() {
- return curBuyCount_;
- }
-
- public static final int NEXTADDTIMESTAMP_FIELD_NUMBER = 12;
- private int nextAddTimestamp_;
- /**
- * uint32 nextAddTimestamp = 12;
- *
- * @return The nextAddTimestamp.
- */
- @java.lang.Override
- public int getNextAddTimestamp() {
- return nextAddTimestamp_;
- }
-
- private byte memoizedIsInitialized = -1;
-
- @java.lang.Override
- public final boolean isInitialized() {
- byte isInitialized = memoizedIsInitialized;
- if (isInitialized == 1) return true;
- if (isInitialized == 0) return false;
-
- memoizedIsInitialized = 1;
- return true;
- }
-
- @java.lang.Override
- public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
- if (nextAddTimestamp_ != 0) {
- output.writeUInt32(12, nextAddTimestamp_);
- }
- if (curBuyCount_ != 0) {
- output.writeUInt32(13, curBuyCount_);
- }
- if (curValue_ != 0) {
- output.writeUInt32(14, curValue_);
- }
- unknownFields.writeTo(output);
- }
-
- @java.lang.Override
- public int getSerializedSize() {
- int size = memoizedSize;
- if (size != -1) return size;
-
- size = 0;
- if (nextAddTimestamp_ != 0) {
- size += com.google.protobuf.CodedOutputStream.computeUInt32Size(12, nextAddTimestamp_);
- }
- if (curBuyCount_ != 0) {
- size += com.google.protobuf.CodedOutputStream.computeUInt32Size(13, curBuyCount_);
- }
- if (curValue_ != 0) {
- size += com.google.protobuf.CodedOutputStream.computeUInt32Size(14, curValue_);
- }
- size += unknownFields.getSerializedSize();
- memoizedSize = size;
- return size;
- }
-
- @java.lang.Override
- public boolean equals(final java.lang.Object obj) {
- if (obj == this) {
- return true;
- }
- if (!(obj
- instanceof emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify)) {
- return super.equals(obj);
- }
- emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify other =
- (emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify) obj;
-
- if (getCurValue() != other.getCurValue()) return false;
- if (getCurBuyCount() != other.getCurBuyCount()) return false;
- if (getNextAddTimestamp() != other.getNextAddTimestamp()) return false;
- if (!unknownFields.equals(other.unknownFields)) return false;
- return true;
- }
-
- @java.lang.Override
- public int hashCode() {
- if (memoizedHashCode != 0) {
- return memoizedHashCode;
- }
- int hash = 41;
- hash = (19 * hash) + getDescriptor().hashCode();
- hash = (37 * hash) + CUR_VALUE_FIELD_NUMBER;
- hash = (53 * hash) + getCurValue();
- hash = (37 * hash) + CURBUYCOUNT_FIELD_NUMBER;
- hash = (53 * hash) + getCurBuyCount();
- hash = (37 * hash) + NEXTADDTIMESTAMP_FIELD_NUMBER;
- hash = (53 * hash) + getNextAddTimestamp();
- hash = (29 * hash) + unknownFields.hashCode();
- memoizedHashCode = hash;
- return hash;
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
- java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
- return PARSER.parseFrom(data);
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
- java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
- throws com.google.protobuf.InvalidProtocolBufferException {
- return PARSER.parseFrom(data, extensionRegistry);
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
- com.google.protobuf.ByteString data)
- throws com.google.protobuf.InvalidProtocolBufferException {
- return PARSER.parseFrom(data);
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
- com.google.protobuf.ByteString data,
- com.google.protobuf.ExtensionRegistryLite extensionRegistry)
- throws com.google.protobuf.InvalidProtocolBufferException {
- return PARSER.parseFrom(data, extensionRegistry);
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
- byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
- return PARSER.parseFrom(data);
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
- byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
- throws com.google.protobuf.InvalidProtocolBufferException {
- return PARSER.parseFrom(data, extensionRegistry);
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
- java.io.InputStream input) throws java.io.IOException {
- return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
- java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
- throws java.io.IOException {
- return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
- PARSER, input, extensionRegistry);
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify
- parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
- return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify
- parseDelimitedFrom(
- java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
- throws java.io.IOException {
- return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
- PARSER, input, extensionRegistry);
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
- com.google.protobuf.CodedInputStream input) throws java.io.IOException {
- return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
- com.google.protobuf.CodedInputStream input,
- com.google.protobuf.ExtensionRegistryLite extensionRegistry)
- throws java.io.IOException {
- return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
- PARSER, input, extensionRegistry);
- }
-
- @java.lang.Override
- public Builder newBuilderForType() {
- return newBuilder();
- }
-
- public static Builder newBuilder() {
- return DEFAULT_INSTANCE.toBuilder();
- }
-
- public static Builder newBuilder(
- emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify prototype) {
- return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
- }
-
- @java.lang.Override
- public Builder toBuilder() {
- return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
- }
-
- @java.lang.Override
- protected Builder newBuilderForType(
- com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
- Builder builder = new Builder(parent);
- return builder;
- }
- /**
- *
- *
- *
- * Name: IBIMGHOHNDK
- * CmdId: 649
- *
- *
- * Protobuf type {@code ResinChangeNotify}
- */
- public static final class Builder
- extends com.google.protobuf.GeneratedMessageV3.Builder
- implements
- // @@protoc_insertion_point(builder_implements:ResinChangeNotify)
- emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotifyOrBuilder {
- public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
- return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass
- .internal_static_ResinChangeNotify_descriptor;
- }
-
- @java.lang.Override
- protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
- internalGetFieldAccessorTable() {
- return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass
- .internal_static_ResinChangeNotify_fieldAccessorTable
- .ensureFieldAccessorsInitialized(
- emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.class,
- emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.Builder
- .class);
- }
-
- // Construct using
- // emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.newBuilder()
- private Builder() {
- maybeForceBuilderInitialization();
- }
-
- private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
- super(parent);
- maybeForceBuilderInitialization();
- }
-
- private void maybeForceBuilderInitialization() {
- if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {}
- }
-
- @java.lang.Override
- public Builder clear() {
- super.clear();
- curValue_ = 0;
-
- curBuyCount_ = 0;
-
- nextAddTimestamp_ = 0;
-
- return this;
- }
-
- @java.lang.Override
- public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
- return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass
- .internal_static_ResinChangeNotify_descriptor;
- }
-
- @java.lang.Override
- public emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify
- getDefaultInstanceForType() {
- return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify
- .getDefaultInstance();
- }
-
- @java.lang.Override
- public emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify build() {
- emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify result =
- buildPartial();
- if (!result.isInitialized()) {
- throw newUninitializedMessageException(result);
- }
- return result;
- }
-
- @java.lang.Override
- public emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify
- buildPartial() {
- emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify result =
- new emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify(this);
- result.curValue_ = curValue_;
- result.curBuyCount_ = curBuyCount_;
- result.nextAddTimestamp_ = nextAddTimestamp_;
- onBuilt();
- return result;
- }
-
- @java.lang.Override
- public Builder clone() {
- return super.clone();
- }
-
- @java.lang.Override
- public Builder setField(
- com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
- return super.setField(field, value);
- }
-
- @java.lang.Override
- public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
- return super.clearField(field);
- }
-
- @java.lang.Override
- public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
- return super.clearOneof(oneof);
- }
-
- @java.lang.Override
- public Builder setRepeatedField(
- com.google.protobuf.Descriptors.FieldDescriptor field,
- int index,
- java.lang.Object value) {
- return super.setRepeatedField(field, index, value);
- }
-
- @java.lang.Override
- public Builder addRepeatedField(
- com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
- return super.addRepeatedField(field, value);
- }
-
- @java.lang.Override
- public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other
- instanceof emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify) {
- return mergeFrom(
- (emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify) other);
- } else {
- super.mergeFrom(other);
- return this;
- }
- }
-
- public Builder mergeFrom(
- emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify other) {
- if (other
- == emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify
- .getDefaultInstance()) return this;
- if (other.getCurValue() != 0) {
- setCurValue(other.getCurValue());
- }
- if (other.getCurBuyCount() != 0) {
- setCurBuyCount(other.getCurBuyCount());
- }
- if (other.getNextAddTimestamp() != 0) {
- setNextAddTimestamp(other.getNextAddTimestamp());
- }
- this.mergeUnknownFields(other.unknownFields);
- onChanged();
- return this;
- }
-
- @java.lang.Override
- public final boolean isInitialized() {
- return true;
- }
-
- @java.lang.Override
- public Builder mergeFrom(
- com.google.protobuf.CodedInputStream input,
- com.google.protobuf.ExtensionRegistryLite extensionRegistry)
- throws java.io.IOException {
- emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parsedMessage =
- null;
- try {
- parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
- } catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage =
- (emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify)
- e.getUnfinishedMessage();
- throw e.unwrapIOException();
- } finally {
- if (parsedMessage != null) {
- mergeFrom(parsedMessage);
- }
- }
- return this;
- }
-
- private int curValue_;
- /**
- * uint32 cur_value = 14;
- *
- * @return The curValue.
- */
- @java.lang.Override
- public int getCurValue() {
- return curValue_;
- }
- /**
- * uint32 cur_value = 14;
- *
- * @param value The curValue to set.
- * @return This builder for chaining.
- */
- public Builder setCurValue(int value) {
-
- curValue_ = value;
- onChanged();
- return this;
- }
- /**
- * uint32 cur_value = 14;
- *
- * @return This builder for chaining.
- */
- public Builder clearCurValue() {
-
- curValue_ = 0;
- onChanged();
- return this;
- }
-
- private int curBuyCount_;
- /**
- * uint32 curBuyCount = 13;
- *
- * @return The curBuyCount.
- */
- @java.lang.Override
- public int getCurBuyCount() {
- return curBuyCount_;
- }
- /**
- * uint32 curBuyCount = 13;
- *
- * @param value The curBuyCount to set.
- * @return This builder for chaining.
- */
- public Builder setCurBuyCount(int value) {
-
- curBuyCount_ = value;
- onChanged();
- return this;
- }
- /**
- * uint32 curBuyCount = 13;
- *
- * @return This builder for chaining.
- */
- public Builder clearCurBuyCount() {
-
- curBuyCount_ = 0;
- onChanged();
- return this;
- }
-
- private int nextAddTimestamp_;
- /**
- * uint32 nextAddTimestamp = 12;
- *
- * @return The nextAddTimestamp.
- */
- @java.lang.Override
- public int getNextAddTimestamp() {
- return nextAddTimestamp_;
- }
- /**
- * uint32 nextAddTimestamp = 12;
- *
- * @param value The nextAddTimestamp to set.
- * @return This builder for chaining.
- */
- public Builder setNextAddTimestamp(int value) {
-
- nextAddTimestamp_ = value;
- onChanged();
- return this;
- }
- /**
- * uint32 nextAddTimestamp = 12;
- *
- * @return This builder for chaining.
- */
- public Builder clearNextAddTimestamp() {
-
- nextAddTimestamp_ = 0;
- onChanged();
- return this;
- }
-
- @java.lang.Override
- public final Builder setUnknownFields(
- final com.google.protobuf.UnknownFieldSet unknownFields) {
- return super.setUnknownFields(unknownFields);
- }
-
- @java.lang.Override
- public final Builder mergeUnknownFields(
- final com.google.protobuf.UnknownFieldSet unknownFields) {
- return super.mergeUnknownFields(unknownFields);
- }
-
- // @@protoc_insertion_point(builder_scope:ResinChangeNotify)
- }
-
- // @@protoc_insertion_point(class_scope:ResinChangeNotify)
- private static final emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify
- DEFAULT_INSTANCE;
-
- static {
- DEFAULT_INSTANCE =
- new emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify();
- }
-
- public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify
- getDefaultInstance() {
- return DEFAULT_INSTANCE;
- }
-
- private static final com.google.protobuf.Parser PARSER =
- new com.google.protobuf.AbstractParser() {
- @java.lang.Override
- public ResinChangeNotify parsePartialFrom(
- com.google.protobuf.CodedInputStream input,
- com.google.protobuf.ExtensionRegistryLite extensionRegistry)
- throws com.google.protobuf.InvalidProtocolBufferException {
- return new ResinChangeNotify(input, extensionRegistry);
- }
- };
-
- public static com.google.protobuf.Parser parser() {
- return PARSER;
- }
-
- @java.lang.Override
- public com.google.protobuf.Parser getParserForType() {
- return PARSER;
- }
-
- @java.lang.Override
- public emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify
- getDefaultInstanceForType() {
- return DEFAULT_INSTANCE;
- }
- }
-
- private static final com.google.protobuf.Descriptors.Descriptor
- internal_static_ResinChangeNotify_descriptor;
- private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
- internal_static_ResinChangeNotify_fieldAccessorTable;
-
- public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
- return descriptor;
- }
-
- private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
-
- static {
- java.lang.String[] descriptorData = {
- "\n\027ResinChangeNotify.proto\"U\n\021ResinChange"
- + "Notify\022\021\n\tcur_value\030\016 \001(\r\022\023\n\013curBuyCount"
- + "\030\r \001(\r\022\030\n\020nextAddTimestamp\030\014 \001(\rB\033\n\031emu."
- + "grasscutter.net.protob\006proto3"
- };
- descriptor =
- com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(
- descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {});
- internal_static_ResinChangeNotify_descriptor = getDescriptor().getMessageTypes().get(0);
- internal_static_ResinChangeNotify_fieldAccessorTable =
- new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
- internal_static_ResinChangeNotify_descriptor,
- new java.lang.String[] {
- "CurValue", "CurBuyCount", "NextAddTimestamp",
- });
- }
-
- // @@protoc_insertion_point(outer_class_scope)
-}
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: ResinChangeNotify.proto
+
+package emu.grasscutter.net.proto;
+
+public final class ResinChangeNotifyOuterClass {
+ private ResinChangeNotifyOuterClass() {}
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistryLite registry) {
+ }
+
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistry registry) {
+ registerAllExtensions(
+ (com.google.protobuf.ExtensionRegistryLite) registry);
+ }
+ public interface ResinChangeNotifyOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:ResinChangeNotify)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * uint32 cur_value = 14;
+ * @return The curValue.
+ */
+ int getCurValue();
+
+ /**
+ * uint32 next_add_timestamp = 13;
+ * @return The nextAddTimestamp.
+ */
+ int getNextAddTimestamp();
+
+ /**
+ * uint32 cur_buy_count = 12;
+ * @return The curBuyCount.
+ */
+ int getCurBuyCount();
+ }
+ /**
+ * Protobuf type {@code ResinChangeNotify}
+ */
+ public static final class ResinChangeNotify extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:ResinChangeNotify)
+ ResinChangeNotifyOrBuilder {
+ private static final long serialVersionUID = 0L;
+ // Use ResinChangeNotify.newBuilder() to construct.
+ private ResinChangeNotify(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+ super(builder);
+ }
+ private ResinChangeNotify() {
+ }
+
+ @java.lang.Override
+ @SuppressWarnings({"unused"})
+ protected java.lang.Object newInstance(
+ UnusedPrivateParameter unused) {
+ return new ResinChangeNotify();
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private ResinChangeNotify(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ case 96: {
+
+ curBuyCount_ = input.readUInt32();
+ break;
+ }
+ case 104: {
+
+ nextAddTimestamp_ = input.readUInt32();
+ break;
+ }
+ case 112: {
+
+ curValue_ = input.readUInt32();
+ break;
+ }
+ default: {
+ if (!parseUnknownField(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.internal_static_ResinChangeNotify_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.internal_static_ResinChangeNotify_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.class, emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.Builder.class);
+ }
+
+ public static final int CUR_VALUE_FIELD_NUMBER = 14;
+ private int curValue_;
+ /**
+ * uint32 cur_value = 14;
+ * @return The curValue.
+ */
+ @java.lang.Override
+ public int getCurValue() {
+ return curValue_;
+ }
+
+ public static final int NEXT_ADD_TIMESTAMP_FIELD_NUMBER = 13;
+ private int nextAddTimestamp_;
+ /**
+ * uint32 next_add_timestamp = 13;
+ * @return The nextAddTimestamp.
+ */
+ @java.lang.Override
+ public int getNextAddTimestamp() {
+ return nextAddTimestamp_;
+ }
+
+ public static final int CUR_BUY_COUNT_FIELD_NUMBER = 12;
+ private int curBuyCount_;
+ /**
+ * uint32 cur_buy_count = 12;
+ * @return The curBuyCount.
+ */
+ @java.lang.Override
+ public int getCurBuyCount() {
+ return curBuyCount_;
+ }
+
+ private byte memoizedIsInitialized = -1;
+ @java.lang.Override
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ @java.lang.Override
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (curBuyCount_ != 0) {
+ output.writeUInt32(12, curBuyCount_);
+ }
+ if (nextAddTimestamp_ != 0) {
+ output.writeUInt32(13, nextAddTimestamp_);
+ }
+ if (curValue_ != 0) {
+ output.writeUInt32(14, curValue_);
+ }
+ unknownFields.writeTo(output);
+ }
+
+ @java.lang.Override
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (curBuyCount_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeUInt32Size(12, curBuyCount_);
+ }
+ if (nextAddTimestamp_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeUInt32Size(13, nextAddTimestamp_);
+ }
+ if (curValue_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeUInt32Size(14, curValue_);
+ }
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify)) {
+ return super.equals(obj);
+ }
+ emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify other = (emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify) obj;
+
+ if (getCurValue()
+ != other.getCurValue()) return false;
+ if (getNextAddTimestamp()
+ != other.getNextAddTimestamp()) return false;
+ if (getCurBuyCount()
+ != other.getCurBuyCount()) return false;
+ if (!unknownFields.equals(other.unknownFields)) return false;
+ return true;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (37 * hash) + CUR_VALUE_FIELD_NUMBER;
+ hash = (53 * hash) + getCurValue();
+ hash = (37 * hash) + NEXT_ADD_TIMESTAMP_FIELD_NUMBER;
+ hash = (53 * hash) + getNextAddTimestamp();
+ hash = (37 * hash) + CUR_BUY_COUNT_FIELD_NUMBER;
+ hash = (53 * hash) + getCurBuyCount();
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ @java.lang.Override
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ @java.lang.Override
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * Protobuf type {@code ResinChangeNotify}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder implements
+ // @@protoc_insertion_point(builder_implements:ResinChangeNotify)
+ emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotifyOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.internal_static_ResinChangeNotify_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.internal_static_ResinChangeNotify_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.class, emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.Builder.class);
+ }
+
+ // Construct using emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ }
+ }
+ @java.lang.Override
+ public Builder clear() {
+ super.clear();
+ curValue_ = 0;
+
+ nextAddTimestamp_ = 0;
+
+ curBuyCount_ = 0;
+
+ return this;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.internal_static_ResinChangeNotify_descriptor;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify getDefaultInstanceForType() {
+ return emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.getDefaultInstance();
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify build() {
+ emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify buildPartial() {
+ emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify result = new emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify(this);
+ result.curValue_ = curValue_;
+ result.nextAddTimestamp_ = nextAddTimestamp_;
+ result.curBuyCount_ = curBuyCount_;
+ onBuilt();
+ return result;
+ }
+
+ @java.lang.Override
+ public Builder clone() {
+ return super.clone();
+ }
+ @java.lang.Override
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.setField(field, value);
+ }
+ @java.lang.Override
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return super.clearField(field);
+ }
+ @java.lang.Override
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return super.clearOneof(oneof);
+ }
+ @java.lang.Override
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return super.setRepeatedField(field, index, value);
+ }
+ @java.lang.Override
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.addRepeatedField(field, value);
+ }
+ @java.lang.Override
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify) {
+ return mergeFrom((emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify other) {
+ if (other == emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify.getDefaultInstance()) return this;
+ if (other.getCurValue() != 0) {
+ setCurValue(other.getCurValue());
+ }
+ if (other.getNextAddTimestamp() != 0) {
+ setNextAddTimestamp(other.getNextAddTimestamp());
+ }
+ if (other.getCurBuyCount() != 0) {
+ setCurBuyCount(other.getCurBuyCount());
+ }
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ @java.lang.Override
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+
+ private int curValue_ ;
+ /**
+ * uint32 cur_value = 14;
+ * @return The curValue.
+ */
+ @java.lang.Override
+ public int getCurValue() {
+ return curValue_;
+ }
+ /**
+ * uint32 cur_value = 14;
+ * @param value The curValue to set.
+ * @return This builder for chaining.
+ */
+ public Builder setCurValue(int value) {
+
+ curValue_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * uint32 cur_value = 14;
+ * @return This builder for chaining.
+ */
+ public Builder clearCurValue() {
+
+ curValue_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private int nextAddTimestamp_ ;
+ /**
+ * uint32 next_add_timestamp = 13;
+ * @return The nextAddTimestamp.
+ */
+ @java.lang.Override
+ public int getNextAddTimestamp() {
+ return nextAddTimestamp_;
+ }
+ /**
+ * uint32 next_add_timestamp = 13;
+ * @param value The nextAddTimestamp to set.
+ * @return This builder for chaining.
+ */
+ public Builder setNextAddTimestamp(int value) {
+
+ nextAddTimestamp_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * uint32 next_add_timestamp = 13;
+ * @return This builder for chaining.
+ */
+ public Builder clearNextAddTimestamp() {
+
+ nextAddTimestamp_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private int curBuyCount_ ;
+ /**
+ * uint32 cur_buy_count = 12;
+ * @return The curBuyCount.
+ */
+ @java.lang.Override
+ public int getCurBuyCount() {
+ return curBuyCount_;
+ }
+ /**
+ * uint32 cur_buy_count = 12;
+ * @param value The curBuyCount to set.
+ * @return This builder for chaining.
+ */
+ public Builder setCurBuyCount(int value) {
+
+ curBuyCount_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * uint32 cur_buy_count = 12;
+ * @return This builder for chaining.
+ */
+ public Builder clearCurBuyCount() {
+
+ curBuyCount_ = 0;
+ onChanged();
+ return this;
+ }
+ @java.lang.Override
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFields(unknownFields);
+ }
+
+ @java.lang.Override
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:ResinChangeNotify)
+ }
+
+ // @@protoc_insertion_point(class_scope:ResinChangeNotify)
+ private static final emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify();
+ }
+
+ public static emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser
+ PARSER = new com.google.protobuf.AbstractParser() {
+ @java.lang.Override
+ public ResinChangeNotify parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new ResinChangeNotify(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser getParserForType() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+ }
+
+ private static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_ResinChangeNotify_descriptor;
+ private static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_ResinChangeNotify_fieldAccessorTable;
+
+ public static com.google.protobuf.Descriptors.FileDescriptor
+ getDescriptor() {
+ return descriptor;
+ }
+ private static com.google.protobuf.Descriptors.FileDescriptor
+ descriptor;
+ static {
+ java.lang.String[] descriptorData = {
+ "\n\027ResinChangeNotify.proto\"Y\n\021ResinChange" +
+ "Notify\022\021\n\tcur_value\030\016 \001(\r\022\032\n\022next_add_ti" +
+ "mestamp\030\r \001(\r\022\025\n\rcur_buy_count\030\014 \001(\rB\033\n\031" +
+ "emu.grasscutter.net.protob\006proto3"
+ };
+ descriptor = com.google.protobuf.Descriptors.FileDescriptor
+ .internalBuildGeneratedFileFrom(descriptorData,
+ new com.google.protobuf.Descriptors.FileDescriptor[] {
+ });
+ internal_static_ResinChangeNotify_descriptor =
+ getDescriptor().getMessageTypes().get(0);
+ internal_static_ResinChangeNotify_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_ResinChangeNotify_descriptor,
+ new java.lang.String[] { "CurValue", "NextAddTimestamp", "CurBuyCount", });
+ }
+
+ // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/generated/main/java/emu/grasscutter/net/proto/SceneAudioNotifyOuterClass.java b/src/generated/main/java/emu/grasscutter/net/proto/SceneAudioNotifyOuterClass.java
new file mode 100644
index 000000000..0da6d2407
--- /dev/null
+++ b/src/generated/main/java/emu/grasscutter/net/proto/SceneAudioNotifyOuterClass.java
@@ -0,0 +1,1222 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: SceneAudioNotify.proto
+
+package emu.grasscutter.net.proto;
+
+public final class SceneAudioNotifyOuterClass {
+ private SceneAudioNotifyOuterClass() {}
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistryLite registry) {
+ }
+
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistry registry) {
+ registerAllExtensions(
+ (com.google.protobuf.ExtensionRegistryLite) registry);
+ }
+ public interface SceneAudioNotifyOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:SceneAudioNotify)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * int32 type = 12;
+ * @return The type.
+ */
+ int getType();
+
+ /**
+ * repeated float param2 = 9;
+ * @return A list containing the param2.
+ */
+ java.util.List getParam2List();
+ /**
+ * repeated float param2 = 9;
+ * @return The count of param2.
+ */
+ int getParam2Count();
+ /**
+ * repeated float param2 = 9;
+ * @param index The index of the element to return.
+ * @return The param2 at the given index.
+ */
+ float getParam2(int index);
+
+ /**
+ * uint32 source_uid = 6;
+ * @return The sourceUid.
+ */
+ int getSourceUid();
+
+ /**
+ * repeated string param3 = 8;
+ * @return A list containing the param3.
+ */
+ java.util.List
+ getParam3List();
+ /**
+ * repeated string param3 = 8;
+ * @return The count of param3.
+ */
+ int getParam3Count();
+ /**
+ * repeated string param3 = 8;
+ * @param index The index of the element to return.
+ * @return The param3 at the given index.
+ */
+ java.lang.String getParam3(int index);
+ /**
+ * repeated string param3 = 8;
+ * @param index The index of the value to return.
+ * @return The bytes of the param3 at the given index.
+ */
+ com.google.protobuf.ByteString
+ getParam3Bytes(int index);
+
+ /**
+ * repeated uint32 param1 = 7;
+ * @return A list containing the param1.
+ */
+ java.util.List getParam1List();
+ /**
+ * repeated uint32 param1 = 7;
+ * @return The count of param1.
+ */
+ int getParam1Count();
+ /**
+ * repeated uint32 param1 = 7;
+ * @param index The index of the element to return.
+ * @return The param1 at the given index.
+ */
+ int getParam1(int index);
+ }
+ /**
+ *
+ * Name: BHHLLDGJLGK
+ * CmdId: 3412
+ *
+ *
+ * Protobuf type {@code SceneAudioNotify}
+ */
+ public static final class SceneAudioNotify extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:SceneAudioNotify)
+ SceneAudioNotifyOrBuilder {
+ private static final long serialVersionUID = 0L;
+ // Use SceneAudioNotify.newBuilder() to construct.
+ private SceneAudioNotify(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+ super(builder);
+ }
+ private SceneAudioNotify() {
+ param2_ = emptyFloatList();
+ param3_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+ param1_ = emptyIntList();
+ }
+
+ @java.lang.Override
+ @SuppressWarnings({"unused"})
+ protected java.lang.Object newInstance(
+ UnusedPrivateParameter unused) {
+ return new SceneAudioNotify();
+ }
+
+ @java.lang.Override
+ public final com.google.protobuf.UnknownFieldSet
+ getUnknownFields() {
+ return this.unknownFields;
+ }
+ private SceneAudioNotify(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ this();
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ int mutable_bitField0_ = 0;
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder();
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ case 48: {
+
+ sourceUid_ = input.readUInt32();
+ break;
+ }
+ case 56: {
+ if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+ param1_ = newIntList();
+ mutable_bitField0_ |= 0x00000004;
+ }
+ param1_.addInt(input.readUInt32());
+ break;
+ }
+ case 58: {
+ int length = input.readRawVarint32();
+ int limit = input.pushLimit(length);
+ if (!((mutable_bitField0_ & 0x00000004) != 0) && input.getBytesUntilLimit() > 0) {
+ param1_ = newIntList();
+ mutable_bitField0_ |= 0x00000004;
+ }
+ while (input.getBytesUntilLimit() > 0) {
+ param1_.addInt(input.readUInt32());
+ }
+ input.popLimit(limit);
+ break;
+ }
+ case 66: {
+ java.lang.String s = input.readStringRequireUtf8();
+ if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+ param3_ = new com.google.protobuf.LazyStringArrayList();
+ mutable_bitField0_ |= 0x00000002;
+ }
+ param3_.add(s);
+ break;
+ }
+ case 77: {
+ if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+ param2_ = newFloatList();
+ mutable_bitField0_ |= 0x00000001;
+ }
+ param2_.addFloat(input.readFloat());
+ break;
+ }
+ case 74: {
+ int length = input.readRawVarint32();
+ int limit = input.pushLimit(length);
+ if (!((mutable_bitField0_ & 0x00000001) != 0) && input.getBytesUntilLimit() > 0) {
+ param2_ = newFloatList();
+ mutable_bitField0_ |= 0x00000001;
+ }
+ while (input.getBytesUntilLimit() > 0) {
+ param2_.addFloat(input.readFloat());
+ }
+ input.popLimit(limit);
+ break;
+ }
+ case 96: {
+
+ type_ = input.readInt32();
+ break;
+ }
+ default: {
+ if (!parseUnknownField(
+ input, unknownFields, extensionRegistry, tag)) {
+ done = true;
+ }
+ break;
+ }
+ }
+ }
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(this);
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(
+ e).setUnfinishedMessage(this);
+ } finally {
+ if (((mutable_bitField0_ & 0x00000004) != 0)) {
+ param1_.makeImmutable(); // C
+ }
+ if (((mutable_bitField0_ & 0x00000002) != 0)) {
+ param3_ = param3_.getUnmodifiableView();
+ }
+ if (((mutable_bitField0_ & 0x00000001) != 0)) {
+ param2_.makeImmutable(); // C
+ }
+ this.unknownFields = unknownFields.build();
+ makeExtensionsImmutable();
+ }
+ }
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.internal_static_SceneAudioNotify_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.internal_static_SceneAudioNotify_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify.class, emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify.Builder.class);
+ }
+
+ public static final int TYPE_FIELD_NUMBER = 12;
+ private int type_;
+ /**
+ * int32 type = 12;
+ * @return The type.
+ */
+ @java.lang.Override
+ public int getType() {
+ return type_;
+ }
+
+ public static final int PARAM2_FIELD_NUMBER = 9;
+ private com.google.protobuf.Internal.FloatList param2_;
+ /**
+ * repeated float param2 = 9;
+ * @return A list containing the param2.
+ */
+ @java.lang.Override
+ public java.util.List
+ getParam2List() {
+ return param2_;
+ }
+ /**
+ * repeated float param2 = 9;
+ * @return The count of param2.
+ */
+ public int getParam2Count() {
+ return param2_.size();
+ }
+ /**
+ * repeated float param2 = 9;
+ * @param index The index of the element to return.
+ * @return The param2 at the given index.
+ */
+ public float getParam2(int index) {
+ return param2_.getFloat(index);
+ }
+ private int param2MemoizedSerializedSize = -1;
+
+ public static final int SOURCE_UID_FIELD_NUMBER = 6;
+ private int sourceUid_;
+ /**
+ * uint32 source_uid = 6;
+ * @return The sourceUid.
+ */
+ @java.lang.Override
+ public int getSourceUid() {
+ return sourceUid_;
+ }
+
+ public static final int PARAM3_FIELD_NUMBER = 8;
+ private com.google.protobuf.LazyStringList param3_;
+ /**
+ * repeated string param3 = 8;
+ * @return A list containing the param3.
+ */
+ public com.google.protobuf.ProtocolStringList
+ getParam3List() {
+ return param3_;
+ }
+ /**
+ * repeated string param3 = 8;
+ * @return The count of param3.
+ */
+ public int getParam3Count() {
+ return param3_.size();
+ }
+ /**
+ * repeated string param3 = 8;
+ * @param index The index of the element to return.
+ * @return The param3 at the given index.
+ */
+ public java.lang.String getParam3(int index) {
+ return param3_.get(index);
+ }
+ /**
+ * repeated string param3 = 8;
+ * @param index The index of the value to return.
+ * @return The bytes of the param3 at the given index.
+ */
+ public com.google.protobuf.ByteString
+ getParam3Bytes(int index) {
+ return param3_.getByteString(index);
+ }
+
+ public static final int PARAM1_FIELD_NUMBER = 7;
+ private com.google.protobuf.Internal.IntList param1_;
+ /**
+ * repeated uint32 param1 = 7;
+ * @return A list containing the param1.
+ */
+ @java.lang.Override
+ public java.util.List
+ getParam1List() {
+ return param1_;
+ }
+ /**
+ * repeated uint32 param1 = 7;
+ * @return The count of param1.
+ */
+ public int getParam1Count() {
+ return param1_.size();
+ }
+ /**
+ * repeated uint32 param1 = 7;
+ * @param index The index of the element to return.
+ * @return The param1 at the given index.
+ */
+ public int getParam1(int index) {
+ return param1_.getInt(index);
+ }
+ private int param1MemoizedSerializedSize = -1;
+
+ private byte memoizedIsInitialized = -1;
+ @java.lang.Override
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ @java.lang.Override
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ getSerializedSize();
+ if (sourceUid_ != 0) {
+ output.writeUInt32(6, sourceUid_);
+ }
+ if (getParam1List().size() > 0) {
+ output.writeUInt32NoTag(58);
+ output.writeUInt32NoTag(param1MemoizedSerializedSize);
+ }
+ for (int i = 0; i < param1_.size(); i++) {
+ output.writeUInt32NoTag(param1_.getInt(i));
+ }
+ for (int i = 0; i < param3_.size(); i++) {
+ com.google.protobuf.GeneratedMessageV3.writeString(output, 8, param3_.getRaw(i));
+ }
+ if (getParam2List().size() > 0) {
+ output.writeUInt32NoTag(74);
+ output.writeUInt32NoTag(param2MemoizedSerializedSize);
+ }
+ for (int i = 0; i < param2_.size(); i++) {
+ output.writeFloatNoTag(param2_.getFloat(i));
+ }
+ if (type_ != 0) {
+ output.writeInt32(12, type_);
+ }
+ unknownFields.writeTo(output);
+ }
+
+ @java.lang.Override
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (sourceUid_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeUInt32Size(6, sourceUid_);
+ }
+ {
+ int dataSize = 0;
+ for (int i = 0; i < param1_.size(); i++) {
+ dataSize += com.google.protobuf.CodedOutputStream
+ .computeUInt32SizeNoTag(param1_.getInt(i));
+ }
+ size += dataSize;
+ if (!getParam1List().isEmpty()) {
+ size += 1;
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32SizeNoTag(dataSize);
+ }
+ param1MemoizedSerializedSize = dataSize;
+ }
+ {
+ int dataSize = 0;
+ for (int i = 0; i < param3_.size(); i++) {
+ dataSize += computeStringSizeNoTag(param3_.getRaw(i));
+ }
+ size += dataSize;
+ size += 1 * getParam3List().size();
+ }
+ {
+ int dataSize = 0;
+ dataSize = 4 * getParam2List().size();
+ size += dataSize;
+ if (!getParam2List().isEmpty()) {
+ size += 1;
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32SizeNoTag(dataSize);
+ }
+ param2MemoizedSerializedSize = dataSize;
+ }
+ if (type_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32Size(12, type_);
+ }
+ size += unknownFields.getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify)) {
+ return super.equals(obj);
+ }
+ emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify other = (emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify) obj;
+
+ if (getType()
+ != other.getType()) return false;
+ if (!getParam2List()
+ .equals(other.getParam2List())) return false;
+ if (getSourceUid()
+ != other.getSourceUid()) return false;
+ if (!getParam3List()
+ .equals(other.getParam3List())) return false;
+ if (!getParam1List()
+ .equals(other.getParam1List())) return false;
+ if (!unknownFields.equals(other.unknownFields)) return false;
+ return true;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (37 * hash) + TYPE_FIELD_NUMBER;
+ hash = (53 * hash) + getType();
+ if (getParam2Count() > 0) {
+ hash = (37 * hash) + PARAM2_FIELD_NUMBER;
+ hash = (53 * hash) + getParam2List().hashCode();
+ }
+ hash = (37 * hash) + SOURCE_UID_FIELD_NUMBER;
+ hash = (53 * hash) + getSourceUid();
+ if (getParam3Count() > 0) {
+ hash = (37 * hash) + PARAM3_FIELD_NUMBER;
+ hash = (53 * hash) + getParam3List().hashCode();
+ }
+ if (getParam1Count() > 0) {
+ hash = (37 * hash) + PARAM1_FIELD_NUMBER;
+ hash = (53 * hash) + getParam1List().hashCode();
+ }
+ hash = (29 * hash) + unknownFields.hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ @java.lang.Override
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ @java.lang.Override
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ *
+ * Name: BHHLLDGJLGK
+ * CmdId: 3412
+ *
+ *
+ * Protobuf type {@code SceneAudioNotify}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder implements
+ // @@protoc_insertion_point(builder_implements:SceneAudioNotify)
+ emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotifyOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.internal_static_SceneAudioNotify_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.internal_static_SceneAudioNotify_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify.class, emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify.Builder.class);
+ }
+
+ // Construct using emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ }
+ }
+ @java.lang.Override
+ public Builder clear() {
+ super.clear();
+ type_ = 0;
+
+ param2_ = emptyFloatList();
+ bitField0_ = (bitField0_ & ~0x00000001);
+ sourceUid_ = 0;
+
+ param3_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+ bitField0_ = (bitField0_ & ~0x00000002);
+ param1_ = emptyIntList();
+ bitField0_ = (bitField0_ & ~0x00000004);
+ return this;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.internal_static_SceneAudioNotify_descriptor;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify getDefaultInstanceForType() {
+ return emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify.getDefaultInstance();
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify build() {
+ emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify buildPartial() {
+ emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify result = new emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify(this);
+ int from_bitField0_ = bitField0_;
+ result.type_ = type_;
+ if (((bitField0_ & 0x00000001) != 0)) {
+ param2_.makeImmutable();
+ bitField0_ = (bitField0_ & ~0x00000001);
+ }
+ result.param2_ = param2_;
+ result.sourceUid_ = sourceUid_;
+ if (((bitField0_ & 0x00000002) != 0)) {
+ param3_ = param3_.getUnmodifiableView();
+ bitField0_ = (bitField0_ & ~0x00000002);
+ }
+ result.param3_ = param3_;
+ if (((bitField0_ & 0x00000004) != 0)) {
+ param1_.makeImmutable();
+ bitField0_ = (bitField0_ & ~0x00000004);
+ }
+ result.param1_ = param1_;
+ onBuilt();
+ return result;
+ }
+
+ @java.lang.Override
+ public Builder clone() {
+ return super.clone();
+ }
+ @java.lang.Override
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.setField(field, value);
+ }
+ @java.lang.Override
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return super.clearField(field);
+ }
+ @java.lang.Override
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return super.clearOneof(oneof);
+ }
+ @java.lang.Override
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return super.setRepeatedField(field, index, value);
+ }
+ @java.lang.Override
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.addRepeatedField(field, value);
+ }
+ @java.lang.Override
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify) {
+ return mergeFrom((emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify other) {
+ if (other == emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify.getDefaultInstance()) return this;
+ if (other.getType() != 0) {
+ setType(other.getType());
+ }
+ if (!other.param2_.isEmpty()) {
+ if (param2_.isEmpty()) {
+ param2_ = other.param2_;
+ bitField0_ = (bitField0_ & ~0x00000001);
+ } else {
+ ensureParam2IsMutable();
+ param2_.addAll(other.param2_);
+ }
+ onChanged();
+ }
+ if (other.getSourceUid() != 0) {
+ setSourceUid(other.getSourceUid());
+ }
+ if (!other.param3_.isEmpty()) {
+ if (param3_.isEmpty()) {
+ param3_ = other.param3_;
+ bitField0_ = (bitField0_ & ~0x00000002);
+ } else {
+ ensureParam3IsMutable();
+ param3_.addAll(other.param3_);
+ }
+ onChanged();
+ }
+ if (!other.param1_.isEmpty()) {
+ if (param1_.isEmpty()) {
+ param1_ = other.param1_;
+ bitField0_ = (bitField0_ & ~0x00000004);
+ } else {
+ ensureParam1IsMutable();
+ param1_.addAll(other.param1_);
+ }
+ onChanged();
+ }
+ this.mergeUnknownFields(other.unknownFields);
+ onChanged();
+ return this;
+ }
+
+ @java.lang.Override
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify parsedMessage = null;
+ try {
+ parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ parsedMessage = (emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify) e.getUnfinishedMessage();
+ throw e.unwrapIOException();
+ } finally {
+ if (parsedMessage != null) {
+ mergeFrom(parsedMessage);
+ }
+ }
+ return this;
+ }
+ private int bitField0_;
+
+ private int type_ ;
+ /**
+ * int32 type = 12;
+ * @return The type.
+ */
+ @java.lang.Override
+ public int getType() {
+ return type_;
+ }
+ /**
+ * int32 type = 12;
+ * @param value The type to set.
+ * @return This builder for chaining.
+ */
+ public Builder setType(int value) {
+
+ type_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * int32 type = 12;
+ * @return This builder for chaining.
+ */
+ public Builder clearType() {
+
+ type_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private com.google.protobuf.Internal.FloatList param2_ = emptyFloatList();
+ private void ensureParam2IsMutable() {
+ if (!((bitField0_ & 0x00000001) != 0)) {
+ param2_ = mutableCopy(param2_);
+ bitField0_ |= 0x00000001;
+ }
+ }
+ /**
+ * repeated float param2 = 9;
+ * @return A list containing the param2.
+ */
+ public java.util.List
+ getParam2List() {
+ return ((bitField0_ & 0x00000001) != 0) ?
+ java.util.Collections.unmodifiableList(param2_) : param2_;
+ }
+ /**
+ * repeated float param2 = 9;
+ * @return The count of param2.
+ */
+ public int getParam2Count() {
+ return param2_.size();
+ }
+ /**
+ * repeated float param2 = 9;
+ * @param index The index of the element to return.
+ * @return The param2 at the given index.
+ */
+ public float getParam2(int index) {
+ return param2_.getFloat(index);
+ }
+ /**
+ * repeated float param2 = 9;
+ * @param index The index to set the value at.
+ * @param value The param2 to set.
+ * @return This builder for chaining.
+ */
+ public Builder setParam2(
+ int index, float value) {
+ ensureParam2IsMutable();
+ param2_.setFloat(index, value);
+ onChanged();
+ return this;
+ }
+ /**
+ * repeated float param2 = 9;
+ * @param value The param2 to add.
+ * @return This builder for chaining.
+ */
+ public Builder addParam2(float value) {
+ ensureParam2IsMutable();
+ param2_.addFloat(value);
+ onChanged();
+ return this;
+ }
+ /**
+ * repeated float param2 = 9;
+ * @param values The param2 to add.
+ * @return This builder for chaining.
+ */
+ public Builder addAllParam2(
+ java.lang.Iterable extends java.lang.Float> values) {
+ ensureParam2IsMutable();
+ com.google.protobuf.AbstractMessageLite.Builder.addAll(
+ values, param2_);
+ onChanged();
+ return this;
+ }
+ /**
+ * repeated float param2 = 9;
+ * @return This builder for chaining.
+ */
+ public Builder clearParam2() {
+ param2_ = emptyFloatList();
+ bitField0_ = (bitField0_ & ~0x00000001);
+ onChanged();
+ return this;
+ }
+
+ private int sourceUid_ ;
+ /**
+ * uint32 source_uid = 6;
+ * @return The sourceUid.
+ */
+ @java.lang.Override
+ public int getSourceUid() {
+ return sourceUid_;
+ }
+ /**
+ * uint32 source_uid = 6;
+ * @param value The sourceUid to set.
+ * @return This builder for chaining.
+ */
+ public Builder setSourceUid(int value) {
+
+ sourceUid_ = value;
+ onChanged();
+ return this;
+ }
+ /**
+ * uint32 source_uid = 6;
+ * @return This builder for chaining.
+ */
+ public Builder clearSourceUid() {
+
+ sourceUid_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private com.google.protobuf.LazyStringList param3_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+ private void ensureParam3IsMutable() {
+ if (!((bitField0_ & 0x00000002) != 0)) {
+ param3_ = new com.google.protobuf.LazyStringArrayList(param3_);
+ bitField0_ |= 0x00000002;
+ }
+ }
+ /**
+ * repeated string param3 = 8;
+ * @return A list containing the param3.
+ */
+ public com.google.protobuf.ProtocolStringList
+ getParam3List() {
+ return param3_.getUnmodifiableView();
+ }
+ /**
+ * repeated string param3 = 8;
+ * @return The count of param3.
+ */
+ public int getParam3Count() {
+ return param3_.size();
+ }
+ /**
+ * repeated string param3 = 8;
+ * @param index The index of the element to return.
+ * @return The param3 at the given index.
+ */
+ public java.lang.String getParam3(int index) {
+ return param3_.get(index);
+ }
+ /**
+ * repeated string param3 = 8;
+ * @param index The index of the value to return.
+ * @return The bytes of the param3 at the given index.
+ */
+ public com.google.protobuf.ByteString
+ getParam3Bytes(int index) {
+ return param3_.getByteString(index);
+ }
+ /**
+ * repeated string param3 = 8;
+ * @param index The index to set the value at.
+ * @param value The param3 to set.
+ * @return This builder for chaining.
+ */
+ public Builder setParam3(
+ int index, java.lang.String value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ ensureParam3IsMutable();
+ param3_.set(index, value);
+ onChanged();
+ return this;
+ }
+ /**
+ * repeated string param3 = 8;
+ * @param value The param3 to add.
+ * @return This builder for chaining.
+ */
+ public Builder addParam3(
+ java.lang.String value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ ensureParam3IsMutable();
+ param3_.add(value);
+ onChanged();
+ return this;
+ }
+ /**
+ * repeated string param3 = 8;
+ * @param values The param3 to add.
+ * @return This builder for chaining.
+ */
+ public Builder addAllParam3(
+ java.lang.Iterable values) {
+ ensureParam3IsMutable();
+ com.google.protobuf.AbstractMessageLite.Builder.addAll(
+ values, param3_);
+ onChanged();
+ return this;
+ }
+ /**
+ * repeated string param3 = 8;
+ * @return This builder for chaining.
+ */
+ public Builder clearParam3() {
+ param3_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+ bitField0_ = (bitField0_ & ~0x00000002);
+ onChanged();
+ return this;
+ }
+ /**
+ * repeated string param3 = 8;
+ * @param value The bytes of the param3 to add.
+ * @return This builder for chaining.
+ */
+ public Builder addParam3Bytes(
+ com.google.protobuf.ByteString value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ checkByteStringIsUtf8(value);
+ ensureParam3IsMutable();
+ param3_.add(value);
+ onChanged();
+ return this;
+ }
+
+ private com.google.protobuf.Internal.IntList param1_ = emptyIntList();
+ private void ensureParam1IsMutable() {
+ if (!((bitField0_ & 0x00000004) != 0)) {
+ param1_ = mutableCopy(param1_);
+ bitField0_ |= 0x00000004;
+ }
+ }
+ /**
+ * repeated uint32 param1 = 7;
+ * @return A list containing the param1.
+ */
+ public java.util.List
+ getParam1List() {
+ return ((bitField0_ & 0x00000004) != 0) ?
+ java.util.Collections.unmodifiableList(param1_) : param1_;
+ }
+ /**
+ * repeated uint32 param1 = 7;
+ * @return The count of param1.
+ */
+ public int getParam1Count() {
+ return param1_.size();
+ }
+ /**
+ * repeated uint32 param1 = 7;
+ * @param index The index of the element to return.
+ * @return The param1 at the given index.
+ */
+ public int getParam1(int index) {
+ return param1_.getInt(index);
+ }
+ /**
+ * repeated uint32 param1 = 7;
+ * @param index The index to set the value at.
+ * @param value The param1 to set.
+ * @return This builder for chaining.
+ */
+ public Builder setParam1(
+ int index, int value) {
+ ensureParam1IsMutable();
+ param1_.setInt(index, value);
+ onChanged();
+ return this;
+ }
+ /**
+ * repeated uint32 param1 = 7;
+ * @param value The param1 to add.
+ * @return This builder for chaining.
+ */
+ public Builder addParam1(int value) {
+ ensureParam1IsMutable();
+ param1_.addInt(value);
+ onChanged();
+ return this;
+ }
+ /**
+ * repeated uint32 param1 = 7;
+ * @param values The param1 to add.
+ * @return This builder for chaining.
+ */
+ public Builder addAllParam1(
+ java.lang.Iterable extends java.lang.Integer> values) {
+ ensureParam1IsMutable();
+ com.google.protobuf.AbstractMessageLite.Builder.addAll(
+ values, param1_);
+ onChanged();
+ return this;
+ }
+ /**
+ * repeated uint32 param1 = 7;
+ * @return This builder for chaining.
+ */
+ public Builder clearParam1() {
+ param1_ = emptyIntList();
+ bitField0_ = (bitField0_ & ~0x00000004);
+ onChanged();
+ return this;
+ }
+ @java.lang.Override
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFields(unknownFields);
+ }
+
+ @java.lang.Override
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:SceneAudioNotify)
+ }
+
+ // @@protoc_insertion_point(class_scope:SceneAudioNotify)
+ private static final emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify();
+ }
+
+ public static emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser
+ PARSER = new com.google.protobuf.AbstractParser() {
+ @java.lang.Override
+ public SceneAudioNotify parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return new SceneAudioNotify(input, extensionRegistry);
+ }
+ };
+
+ public static com.google.protobuf.Parser parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser getParserForType() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+ }
+
+ private static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_SceneAudioNotify_descriptor;
+ private static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_SceneAudioNotify_fieldAccessorTable;
+
+ public static com.google.protobuf.Descriptors.FileDescriptor
+ getDescriptor() {
+ return descriptor;
+ }
+ private static com.google.protobuf.Descriptors.FileDescriptor
+ descriptor;
+ static {
+ java.lang.String[] descriptorData = {
+ "\n\026SceneAudioNotify.proto\"d\n\020SceneAudioNo" +
+ "tify\022\014\n\004type\030\014 \001(\005\022\016\n\006param2\030\t \003(\002\022\022\n\nso" +
+ "urce_uid\030\006 \001(\r\022\016\n\006param3\030\010 \003(\t\022\016\n\006param1" +
+ "\030\007 \003(\rB\033\n\031emu.grasscutter.net.protob\006pro" +
+ "to3"
+ };
+ descriptor = com.google.protobuf.Descriptors.FileDescriptor
+ .internalBuildGeneratedFileFrom(descriptorData,
+ new com.google.protobuf.Descriptors.FileDescriptor[] {
+ });
+ internal_static_SceneAudioNotify_descriptor =
+ getDescriptor().getMessageTypes().get(0);
+ internal_static_SceneAudioNotify_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_SceneAudioNotify_descriptor,
+ new java.lang.String[] { "Type", "Param2", "SourceUid", "Param3", "Param1", });
+ }
+
+ // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/main/java/emu/grasscutter/game/managers/ResinManager.java b/src/main/java/emu/grasscutter/game/managers/ResinManager.java
index 2ee0be666..6e865b525 100644
--- a/src/main/java/emu/grasscutter/game/managers/ResinManager.java
+++ b/src/main/java/emu/grasscutter/game/managers/ResinManager.java
@@ -1,154 +1,173 @@
-package emu.grasscutter.game.managers;
-
-import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
-
-import emu.grasscutter.game.player.BasePlayerManager;
-import emu.grasscutter.game.player.Player;
-import emu.grasscutter.game.props.PlayerProperty;
-import emu.grasscutter.game.props.WatcherTriggerType;
-import emu.grasscutter.server.packet.send.PacketResinChangeNotify;
-import emu.grasscutter.utils.Utils;
-
-public class ResinManager extends BasePlayerManager {
-
- public ResinManager(Player player) {
- super(player);
- }
-
- /********************
- * Change resin.
- ********************/
- public synchronized boolean useResin(int amount) {
- // Check if resin enabled.
- if (!GAME_OPTIONS.resinOptions.resinUsage) {
- return true;
- }
-
- int currentResin = this.player.getProperty(PlayerProperty.PROP_PLAYER_RESIN);
-
- // Check if the player has sufficient resin.
- if (currentResin < amount) {
- return false;
- }
-
- // Deduct the resin from the player.
- int newResin = currentResin - amount;
- this.player.setProperty(PlayerProperty.PROP_PLAYER_RESIN, newResin);
-
- // Check if this has taken the player under the recharge cap,
- // starting the recharging process.
- if (this.player.getNextResinRefresh() == 0 && newResin < GAME_OPTIONS.resinOptions.cap) {
- int currentTime = Utils.getCurrentSeconds();
- this.player.setNextResinRefresh(currentTime + GAME_OPTIONS.resinOptions.rechargeTime);
- }
-
- // Send packets.
- this.player.sendPacket(new PacketResinChangeNotify(this.player));
-
- // Battle Pass trigger
- this.player
- .getBattlePassManager()
- .triggerMission(
- WatcherTriggerType.TRIGGER_COST_MATERIAL, 106, amount); // Resin item id = 106
-
- return true;
- }
-
- public synchronized boolean useCondensedResin(int amount) {
- // Don't deduct if resin disabled.
- if (!GAME_OPTIONS.resinOptions.resinUsage) return true;
- return this.player.getInventory().payItem(220007, amount);
- }
-
- public synchronized void addResin(int amount) {
- // Check if resin enabled.
- if (!GAME_OPTIONS.resinOptions.resinUsage) {
- return;
- }
-
- // Add resin.
- int currentResin = this.player.getProperty(PlayerProperty.PROP_PLAYER_RESIN);
- int newResin = currentResin + amount;
- this.player.setProperty(PlayerProperty.PROP_PLAYER_RESIN, newResin);
-
- // Stop recharging if player is now at or over the cap.
- if (newResin >= GAME_OPTIONS.resinOptions.cap) {
- this.player.setNextResinRefresh(0);
- }
-
- // Send packets.
- this.player.sendPacket(new PacketResinChangeNotify(this.player));
- }
-
- /********************
- * Recharge resin.
- ********************/
- public synchronized void rechargeResin() {
- // Check if resin enabled.
- if (!GAME_OPTIONS.resinOptions.resinUsage) {
- return;
- }
-
- int currentResin = this.player.getProperty(PlayerProperty.PROP_PLAYER_RESIN);
- int currentTime = Utils.getCurrentSeconds();
-
- // Make sure we are currently in "recharging mode".
- // This is denoted by Player.nextResinRefresh being greater than 0.
- if (this.player.getNextResinRefresh() <= 0) {
- return;
- }
-
- // Determine if we actually need to recharge yet.
- if (currentTime < this.player.getNextResinRefresh()) {
- return;
- }
-
- // Calculate how much resin we need to refill and update player.
- // Note that this can be more than one in case the player
- // logged off with uncapped resin and is now logging in again.
- int recharge =
- 1
- + ((currentTime - this.player.getNextResinRefresh())
- / GAME_OPTIONS.resinOptions.rechargeTime);
- int newResin = Math.min(GAME_OPTIONS.resinOptions.cap, currentResin + recharge);
- int resinChange = newResin - currentResin;
-
- this.player.setProperty(PlayerProperty.PROP_PLAYER_RESIN, newResin);
-
- // Calculate next recharge time.
- // Set to zero to disable recharge (because on/over cap.)
- if (newResin >= GAME_OPTIONS.resinOptions.cap) {
- this.player.setNextResinRefresh(0);
- } else {
- int nextRecharge =
- this.player.getNextResinRefresh() + resinChange * GAME_OPTIONS.resinOptions.rechargeTime;
- this.player.setNextResinRefresh(nextRecharge);
- }
-
- // Send packets.
- this.player.sendPacket(new PacketResinChangeNotify(this.player));
- }
-
- /********************
- * Player login.
- ********************/
- public synchronized void onPlayerLogin() {
- // If resin usage is disabled, set resin to cap.
- if (!GAME_OPTIONS.resinOptions.resinUsage) {
- this.player.setProperty(PlayerProperty.PROP_PLAYER_RESIN, GAME_OPTIONS.resinOptions.cap);
- this.player.setNextResinRefresh(0);
- }
-
- // In case server administrators change the resin cap while players are capped,
- // we need to restart recharging here.
- int currentResin = this.player.getProperty(PlayerProperty.PROP_PLAYER_RESIN);
- int currentTime = Utils.getCurrentSeconds();
-
- if (currentResin < GAME_OPTIONS.resinOptions.cap && this.player.getNextResinRefresh() == 0) {
- this.player.setNextResinRefresh(currentTime + GAME_OPTIONS.resinOptions.rechargeTime);
- }
-
- // Send initial notifications on logon.
- this.player.sendPacket(new PacketResinChangeNotify(this.player));
- }
-}
+package emu.grasscutter.game.managers;
+
+import emu.grasscutter.game.inventory.GameItem;
+import emu.grasscutter.game.player.BasePlayerManager;
+import emu.grasscutter.game.player.Player;
+import emu.grasscutter.game.props.ActionReason;
+import emu.grasscutter.game.props.PlayerProperty;
+import emu.grasscutter.game.props.WatcherTriggerType;
+import emu.grasscutter.net.proto.RetcodeOuterClass;
+import emu.grasscutter.server.packet.send.PacketItemAddHintNotify;
+import emu.grasscutter.server.packet.send.PacketResinChangeNotify;
+import emu.grasscutter.utils.Utils;
+
+import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
+
+public class ResinManager extends BasePlayerManager {
+ public static final int MAX_RESIN_BUYING_COUNT = 6;
+ public static final int AMOUNT_TO_ADD = 60;
+ public static final int[] HCOIN_NUM_TO_BUY_RESIN = new int[]{50, 100, 100, 150, 200, 200};
+
+ public ResinManager(Player player) {
+ super(player);
+ }
+
+ /********************
+ * Change resin.
+ ********************/
+ public synchronized boolean useResin(int amount) {
+ // Check if resin enabled.
+ if (!GAME_OPTIONS.resinOptions.resinUsage) {
+ return true;
+ }
+
+ int currentResin = this.player.getProperty(PlayerProperty.PROP_PLAYER_RESIN);
+
+ // Check if the player has sufficient resin.
+ if (currentResin < amount) {
+ return false;
+ }
+
+ // Deduct the resin from the player.
+ int newResin = currentResin - amount;
+ this.player.setProperty(PlayerProperty.PROP_PLAYER_RESIN, newResin);
+
+ // Check if this has taken the player under the recharge cap,
+ // starting the recharging process.
+ if (this.player.getNextResinRefresh() == 0 && newResin < GAME_OPTIONS.resinOptions.cap) {
+ int currentTime = Utils.getCurrentSeconds();
+ this.player.setNextResinRefresh(currentTime + GAME_OPTIONS.resinOptions.rechargeTime);
+ }
+
+ // Send packets.
+ this.player.sendPacket(new PacketResinChangeNotify(this.player));
+
+ // Battle Pass trigger
+ this.player.getBattlePassManager().triggerMission(WatcherTriggerType.TRIGGER_COST_MATERIAL, 106, amount); // Resin item id = 106
+
+ return true;
+ }
+
+ public synchronized boolean useCondensedResin(int amount) {
+ // Don't deduct if resin disabled.
+ if (!GAME_OPTIONS.resinOptions.resinUsage) return true;
+ return this.player.getInventory().payItem(220007, amount);
+ }
+
+ public synchronized void addResin(int amount) {
+ // Check if resin enabled.
+ if (!GAME_OPTIONS.resinOptions.resinUsage) {
+ return;
+ }
+
+ // Add resin.
+ int currentResin = this.player.getProperty(PlayerProperty.PROP_PLAYER_RESIN);
+ int newResin = currentResin + amount;
+ this.player.setProperty(PlayerProperty.PROP_PLAYER_RESIN, newResin);
+
+ // Stop recharging if player is now at or over the cap.
+ if (newResin >= GAME_OPTIONS.resinOptions.cap) {
+ this.player.setNextResinRefresh(0);
+ }
+
+ // Send packets.
+ this.player.sendPacket(new PacketResinChangeNotify(this.player));
+ }
+
+ /********************
+ * Recharge resin.
+ ********************/
+ public synchronized void rechargeResin() {
+ // Check if resin enabled.
+ if (!GAME_OPTIONS.resinOptions.resinUsage) {
+ return;
+ }
+
+ int currentResin = this.player.getProperty(PlayerProperty.PROP_PLAYER_RESIN);
+ int currentTime = Utils.getCurrentSeconds();
+
+ // Make sure we are currently in "recharging mode".
+ // This is denoted by Player.nextResinRefresh being greater than 0.
+ if (this.player.getNextResinRefresh() <= 0) {
+ return;
+ }
+
+ // Determine if we actually need to recharge yet.
+ if (currentTime < this.player.getNextResinRefresh()) {
+ return;
+ }
+
+ // Calculate how much resin we need to refill and update player.
+ // Note that this can be more than one in case the player
+ // logged off with uncapped resin and is now logging in again.
+ int recharge = 1 + (int)((currentTime - this.player.getNextResinRefresh()) / GAME_OPTIONS.resinOptions.rechargeTime);
+ int newResin = Math.min(GAME_OPTIONS.resinOptions.cap, currentResin + recharge);
+ int resinChange = newResin - currentResin;
+
+ this.player.setProperty(PlayerProperty.PROP_PLAYER_RESIN, newResin);
+
+ // Calculate next recharge time.
+ // Set to zero to disable recharge (because on/over cap.)
+ if (newResin >= GAME_OPTIONS.resinOptions.cap) {
+ this.player.setNextResinRefresh(0);
+ }
+ else {
+ int nextRecharge = this.player.getNextResinRefresh() + resinChange * GAME_OPTIONS.resinOptions.rechargeTime;
+ this.player.setNextResinRefresh(nextRecharge);
+ }
+
+ // Send packets.
+ this.player.sendPacket(new PacketResinChangeNotify(this.player));
+ }
+
+ /********************
+ * Player login.
+ ********************/
+ public synchronized void onPlayerLogin() {
+ // If resin usage is disabled, set resin to cap.
+ if (!GAME_OPTIONS.resinOptions.resinUsage) {
+ this.player.setProperty(PlayerProperty.PROP_PLAYER_RESIN, GAME_OPTIONS.resinOptions.cap);
+ this.player.setNextResinRefresh(0);
+ }
+
+ // In case server administrators change the resin cap while players are capped,
+ // we need to restart recharging here.
+ int currentResin = this.player.getProperty(PlayerProperty.PROP_PLAYER_RESIN);
+ int currentTime = Utils.getCurrentSeconds();
+
+ if (currentResin < GAME_OPTIONS.resinOptions.cap && this.player.getNextResinRefresh() == 0) {
+ this.player.setNextResinRefresh(currentTime + GAME_OPTIONS.resinOptions.rechargeTime);
+ }
+
+ // Send initial notifications on logon.
+ this.player.sendPacket(new PacketResinChangeNotify(this.player));
+ }
+
+ public int buy() {
+ if (this.player.getResinBuyCount() >= MAX_RESIN_BUYING_COUNT) {
+ return RetcodeOuterClass.Retcode.RET_RESIN_BOUGHT_COUNT_EXCEEDED_VALUE;
+ }
+
+ var res = this.player.getInventory().payItem(201, HCOIN_NUM_TO_BUY_RESIN[this.player.getResinBuyCount()]);
+ if (!res) {
+ return RetcodeOuterClass.Retcode.RET_HCOIN_NOT_ENOUGH_VALUE;
+ }
+
+ this.player.setResinBuyCount(this.player.getResinBuyCount() + 1);
+ this.player.setProperty(PlayerProperty.PROP_PLAYER_WAIT_SUB_HCOIN, 0);
+ this.addResin(AMOUNT_TO_ADD);
+ this.player.sendPacket(new PacketItemAddHintNotify(new GameItem(106, AMOUNT_TO_ADD), ActionReason.BuyResin));
+
+ return 0;
+ }
+}
diff --git a/src/main/java/emu/grasscutter/game/player/Player.java b/src/main/java/emu/grasscutter/game/player/Player.java
index 31cbb72e4..0c7d91815 100644
--- a/src/main/java/emu/grasscutter/game/player/Player.java
+++ b/src/main/java/emu/grasscutter/game/player/Player.java
@@ -5,7 +5,7 @@ import emu.grasscutter.GameConstants;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.PlayerLevelData;
-import emu.grasscutter.data.excels.world.WeatherData;
+import emu.grasscutter.data.excels.WeatherData;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.CoopRequest;
@@ -15,7 +15,6 @@ import emu.grasscutter.game.activity.ActivityManager;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.avatar.AvatarStorage;
import emu.grasscutter.game.battlepass.BattlePassManager;
-import emu.grasscutter.game.entity.EntityAvatar;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.game.expedition.ExpeditionInfo;
import emu.grasscutter.game.friends.FriendsList;
@@ -45,26 +44,27 @@ import emu.grasscutter.game.props.ClimateType;
import emu.grasscutter.game.props.PlayerProperty;
import emu.grasscutter.game.props.WatcherTriggerType;
import emu.grasscutter.game.quest.QuestManager;
-import emu.grasscutter.game.quest.enums.QuestCond;
-import emu.grasscutter.game.quest.enums.QuestContent;
+import emu.grasscutter.game.quest.enums.QuestTrigger;
import emu.grasscutter.game.shop.ShopLimit;
import emu.grasscutter.game.tower.TowerData;
import emu.grasscutter.game.tower.TowerManager;
import emu.grasscutter.game.world.Scene;
import emu.grasscutter.game.world.World;
import emu.grasscutter.net.packet.BasePacket;
-import emu.grasscutter.net.proto.*;
import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry;
import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult;
import emu.grasscutter.net.proto.CombatInvokeEntryOuterClass.CombatInvokeEntry;
import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
import emu.grasscutter.net.proto.MpSettingTypeOuterClass.MpSettingType;
import emu.grasscutter.net.proto.OnlinePlayerInfoOuterClass.OnlinePlayerInfo;
+import emu.grasscutter.net.proto.PlayerApplyEnterMpResultNotifyOuterClass;
import emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo;
+import emu.grasscutter.net.proto.PlayerWorldLocationInfoOuterClass;
import emu.grasscutter.net.proto.ProfilePictureOuterClass.ProfilePicture;
import emu.grasscutter.net.proto.PropChangeReasonOuterClass.PropChangeReason;
+import emu.grasscutter.net.proto.ShowAvatarInfoOuterClass;
import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
-import emu.grasscutter.net.proto.TrialAvatarGrantRecordOuterClass.TrialAvatarGrantRecord.GrantReason;
+import emu.grasscutter.net.proto.SocialShowAvatarInfoOuterClass;
import emu.grasscutter.scripts.data.SceneRegion;
import emu.grasscutter.server.event.player.PlayerJoinEvent;
import emu.grasscutter.server.event.player.PlayerQuitEvent;
@@ -88,7 +88,6 @@ import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.LinkedBlockingQueue;
-import java.util.stream.Stream;
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
@@ -117,13 +116,12 @@ public class Player {
@Getter @Setter private int sceneId;
@Getter @Setter private int regionId;
@Getter private int mainCharacterId;
- @Getter @Setter private boolean inGodMode;
- @Getter @Setter private boolean unlimitedStamina;
+ @Setter private boolean godmode; // Getter is inGodmode
+ private boolean stamina; // Getter is getUnlimitedStamina, Setter is setUnlimitedStamina
@Getter private Set nameCardList;
@Getter private Set flyCloakList;
@Getter private Set costumeList;
- @Getter private Set personalLineList;
@Getter @Setter private Set rewardedLevels;
@Getter @Setter private Set homeRewardedLevels;
@Getter @Setter private Set realmList;
@@ -205,12 +203,9 @@ public class Player {
@Getter @Setter private long springLastUsed;
private HashMap mapMarks; // Getter makes an empty hashmap - maybe do this elsewhere?
@Getter @Setter private int nextResinRefresh;
+ @Getter @Setter private int resinBuyCount;
@Getter @Setter private int lastDailyReset;
- @Getter private transient MpSettingType mpSetting = MpSettingType.MP_SETTING_TYPE_ENTER_AFTER_APPLY;
- @Getter private long playerGameTime = 0;
-
- @Getter private PlayerProgress playerProgress;
- @Getter private Set activeQuestTimers;
+ @Getter private transient MpSettingType mpSetting = MpSettingType.MP_SETTING_TYPE_ENTER_AFTER_APPLY; // TODO
@Deprecated
@SuppressWarnings({"rawtypes", "unchecked"}) // Morphia only!
@@ -247,7 +242,7 @@ public class Player {
this.unlockedCombines = new HashSet<>();
this.unlockedFurniture = new HashSet<>();
this.unlockedFurnitureSuite = new HashSet<>();
- this.activeCookCompounds = new HashMap<>();
+ this.activeCookCompounds=new HashMap<>();
this.activeForges = new ArrayList<>();
this.unlockedRecipies = new HashMap<>();
this.questGlobalVariables = new HashMap<>();
@@ -281,7 +276,7 @@ public class Player {
this.progressManager = new PlayerProgressManager(this);
this.furnitureManager = new FurnitureManager(this);
this.cookingManager = new CookingManager(this);
- this.cookingCompoundManager = new CookingCompoundManager(this);
+ this.cookingCompoundManager=new CookingCompoundManager(this);
this.satiationManager = new SatiationManager(this);
}
@@ -317,22 +312,10 @@ public class Player {
this.progressManager = new PlayerProgressManager(this);
this.furnitureManager = new FurnitureManager(this);
this.cookingManager = new CookingManager(this);
- this.cookingCompoundManager = new CookingCompoundManager(this);
+ this.cookingCompoundManager=new CookingCompoundManager(this);
this.satiationManager = new SatiationManager(this);
}
- /**
- * Updates the player's game time if it has changed.
- *
- * @param gameTime The new game time.
- */
- public void updatePlayerGameTime(long gameTime) {
- if (this.playerGameTime == gameTime) return;
- this.playerGameTime = gameTime;
-
- this.save();
- }
-
public int getUid() {
return id;
}
@@ -473,8 +456,6 @@ public class Player {
// Handle open state unlocks from level-up.
this.getProgressManager().tryUnlockOpenStates();
- this.getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_PLAYER_LEVEL_UP, level);
- this.getQuestManager().queueEvent(QuestCond.QUEST_COND_PLAYER_LEVEL_EQUAL_GREATER, level);
return true;
}
@@ -542,7 +523,6 @@ public class Player {
public boolean setHomeCoin(int coin) {
return this.setProperty(PlayerProperty.PROP_PLAYER_HOME_COIN, coin);
}
-
private int getExpRequired(int level) {
PlayerLevelData levelData = GameData.getPlayerLevelDataMap().get(level);
return levelData != null ? levelData.getExp() : 0;
@@ -584,14 +564,14 @@ public class Player {
int newWorldLevel =
(currentLevel >= 55) ? 8 :
- (currentLevel >= 50) ? 7 :
- (currentLevel >= 45) ? 6 :
- (currentLevel >= 40) ? 5 :
- (currentLevel >= 35) ? 4 :
- (currentLevel >= 30) ? 3 :
- (currentLevel >= 25) ? 2 :
- (currentLevel >= 20) ? 1 :
- 0;
+ (currentLevel >= 50) ? 7 :
+ (currentLevel >= 45) ? 6 :
+ (currentLevel >= 40) ? 5 :
+ (currentLevel >= 35) ? 4 :
+ (currentLevel >= 30) ? 3 :
+ (currentLevel >= 25) ? 2 :
+ (currentLevel >= 20) ? 1 :
+ 0;
if (newWorldLevel != currentWorldLevel) {
this.setWorldLevel(newWorldLevel);
@@ -616,12 +596,11 @@ public class Player {
public void onEnterRegion(SceneRegion region) {
getQuestManager().forEachActiveQuest(quest -> {
- if (quest.getTriggerData() != null && quest.getTriggers().containsKey("ENTER_REGION_"+ region.config_id)) {
+ if (quest.getTriggers().containsKey("ENTER_REGION_"+ region.config_id)) {
// If trigger hasn't been fired yet
- if (!Boolean.TRUE.equals(quest.getTriggers().put("ENTER_REGION_" + region.config_id, true))) {
+ if (!Boolean.TRUE.equals(quest.getTriggers().put("ENTER_REGION_"+ region.config_id, true))) {
//getSession().send(new PacketServerCondMeetQuestListUpdateNotify());
- getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_TRIGGER_FIRE,
- quest.getTriggerData().get("ENTER_REGION_" + region.config_id).getId(), 0);
+ getQuestManager().triggerEvent(QuestTrigger.QUEST_CONTENT_TRIGGER_FIRE, quest.getTriggerData().get("ENTER_REGION_"+ region.config_id).getId(),0);
}
}
});
@@ -630,12 +609,11 @@ public class Player {
public void onLeaveRegion(SceneRegion region) {
getQuestManager().forEachActiveQuest(quest -> {
- if (quest.getTriggers().containsKey("LEAVE_REGION_" + region.config_id)) {
+ if (quest.getTriggers().containsKey("LEAVE_REGION_"+ region.config_id)) {
// If trigger hasn't been fired yet
- if (!Boolean.TRUE.equals(quest.getTriggers().put("LEAVE_REGION_" + region.config_id, true))) {
+ if (!Boolean.TRUE.equals(quest.getTriggers().put("LEAVE_REGION_"+ region.config_id, true))) {
getSession().send(new PacketServerCondMeetQuestListUpdateNotify());
- getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_TRIGGER_FIRE,
- quest.getTriggerData().get("LEAVE_REGION_" + region.config_id).getId(), 0);
+ getQuestManager().triggerEvent(QuestTrigger.QUEST_CONTENT_TRIGGER_FIRE, quest.getTriggerData().get("LEAVE_REGION_"+ region.config_id).getId(),0);
}
}
});
@@ -727,7 +705,9 @@ public class Player {
} else {
moonCardDuration += 30;
}
- moonCardGetTimes.add(moonCardStartTime);
+ if (!moonCardGetTimes.contains(moonCardStartTime)) {
+ moonCardGetTimes.add(moonCardStartTime);
+ }
return true;
}
@@ -796,6 +776,18 @@ public class Player {
this.save();
}
+ public boolean getUnlimitedStamina() {
+ return stamina;
+ }
+
+ public void setUnlimitedStamina(boolean stamina) {
+ this.stamina = stamina;
+ }
+
+ public boolean inGodmode() {
+ return godmode;
+ }
+
public boolean hasSentLoginPackets() {
return hasSentLoginPackets;
}
@@ -827,85 +819,6 @@ public class Player {
addAvatar(avatar, true);
}
- public void addAvatar(int avatarId) {
- // I dont see why we cant do this lolz
- addAvatar(new Avatar(avatarId), true);
- }
-
- public List getTrialAvatarParam (int trialAvatarId) {
- if (GameData.getTrialAvatarCustomData().isEmpty()) { // use default data if custom data not available
- if (GameData.getTrialAvatarDataMap().get(trialAvatarId) == null) return List.of();
-
- return GameData.getTrialAvatarDataMap().get(trialAvatarId)
- .getTrialAvatarParamList();
- }
- // use custom data
- if (GameData.getTrialAvatarCustomData().get(trialAvatarId) == null) return List.of();
-
- var trialCustomParams = GameData.getTrialAvatarCustomData().get(trialAvatarId).getTrialAvatarParamList();
- return trialCustomParams.isEmpty() ? List.of() : Stream.of(trialCustomParams.get(0).split(";")).map(Integer::parseInt).toList();
- }
-
- public boolean addTrialAvatar(int trialAvatarId, GrantReason reason, int questMainId){
- List trialAvatarBasicParam = getTrialAvatarParam(trialAvatarId);
- if (trialAvatarBasicParam.isEmpty()) return false;
-
- Avatar avatar = new Avatar(trialAvatarBasicParam.get(0));
- if (avatar.getAvatarData() == null || !hasSentLoginPackets()) return false;
-
- avatar.setOwner(this);
- // Add trial weapons and relics
- avatar.setTrialAvatarInfo(trialAvatarBasicParam.get(1), trialAvatarId, reason, questMainId);
- avatar.equipTrialItems();
- // Recalc stats
- avatar.recalcStats();
-
- // Packet, mimic official server behaviour, add to player's bag but not saving to db
- sendPacket(new PacketAvatarAddNotify(avatar, false));
- // add to avatar to temporary trial team
- getTeamManager().addAvatarToTrialTeam(avatar);
- return true;
- }
-
- public boolean addTrialAvatarForQuest(int trialAvatarId, int questMainId) {
- // TODO: Find method for 'setupTrialAvatarTeamForQuest'.
- getTeamManager().setupTrialAvatars(true);
- if (!addTrialAvatar(
- trialAvatarId,
- GrantReason.GRANT_REASON_BY_QUEST,
- questMainId)) return false;
- getTeamManager().trialAvatarTeamPostUpdate();
- // Packet, mimic official server behaviour, neccessary to stop player from modifying team
- sendPacket(new PacketAvatarTeamUpdateNotify(this));
- return true;
- }
-
- public void addTrialAvatarsForActivity(List trialAvatarIds) {
- getTeamManager().setupTrialAvatars(false);
- trialAvatarIds.forEach(trialAvatarId -> addTrialAvatar(
- trialAvatarId,
- GrantReason.GRANT_REASON_BY_TRIAL_AVATAR_ACTIVITY,
- 0));
- getTeamManager().trialAvatarTeamPostUpdate(0);
- }
-
- public boolean removeTrialAvatarForQuest(int trialAvatarId) {
- if (!getTeamManager().isUsingTrialTeam()) return false;
-
- sendPacket(new PacketAvatarDelNotify(List.of(getTeamManager().getTrialAvatarGuid(trialAvatarId))));
- getTeamManager().removeTrialAvatarTeam(trialAvatarId);
- sendPacket(new PacketAvatarTeamUpdateNotify());
- return true;
- }
-
- public void removeTrialAvatarForActivity() {
- if (!getTeamManager().isUsingTrialTeam()) return;
-
- sendPacket(new PacketAvatarDelNotify(getTeamManager().getActiveTeam().stream()
- .map(x -> x.getAvatar().getGuid()).toList()));
- getTeamManager().removeTrialAvatarTeam();
- }
-
public void addFlycloak(int flycloakId) {
this.getFlyCloakList().add(flycloakId);
this.sendPacket(new PacketAvatarGainFlycloakNotify(flycloakId));
@@ -916,11 +829,6 @@ public class Player {
this.sendPacket(new PacketAvatarGainCostumeNotify(costumeId));
}
- public void addPersonalLine(int personalLineId) {
- this.getPersonalLineList().add(personalLineId);
- session.getPlayer().getQuestManager().queueEvent(QuestCond.QUEST_COND_PERSONAL_LINE_UNLOCK, personalLineId);
- }
-
public void addNameCard(int nameCardId) {
this.getNameCardList().add(nameCardId);
this.sendPacket(new PacketUnlockNameCardNotify(nameCardId));
@@ -936,11 +844,6 @@ public class Player {
this.sendPacket(new PacketSetNameCardRsp(nameCardId));
}
- /**
- * Sends a message to this player.
- *
- * @param message The message to send.
- */
public void dropMessage(Object message) {
if (this.messageHandler != null) {
this.messageHandler.append(message.toString());
@@ -950,46 +853,6 @@ public class Player {
this.getServer().getChatSystem().sendPrivateMessageFromServer(getUid(), message.toString());
}
- public void setAvatarsAbilityForScene(Scene scene) {
- try {
- var levelEntityConfig = scene.getSceneData().getLevelEntityConfig();
- var config = GameData.getConfigLevelEntityDataMap().get(levelEntityConfig);
- if (config == null){
- return;
- }
-
- List avatarIds = scene.getSceneData().getSpecifiedAvatarList();
- List specifiedAvatarList = getTeamManager().getActiveTeam();
-
- if (avatarIds != null && avatarIds.size() > 0){
- // certain scene could limit specifc avatars' entry
- specifiedAvatarList.clear();
- for (int id : avatarIds){
- var avatar = getAvatars().getAvatarById(id);
- if (avatar == null){
- continue;
- }
- specifiedAvatarList.add(new EntityAvatar(scene, avatar));
- }
- }
-
- for (EntityAvatar entityAvatar : specifiedAvatarList){
- var avatarData = entityAvatar.getAvatar().getAvatarData();
- if (avatarData == null){
- continue;
- }
- avatarData.buildEmbryo();
- if (config.getAvatarAbilities() == null){
- continue; // continue and not break because has to rebuild ability for the next avatar if any
- }
- for (var abilities : config.getAvatarAbilities()){
- avatarData.getAbilities().add(Utils.abilityHash(abilities.getAbilityName()));
- }
- }
- } catch (Exception e){
- Grasscutter.getLogger().error("Error applying level entity config for scene {}", scene.getSceneData().getId(), e);
- }
- }
/**
* Sends a message to another player.
*
@@ -1002,9 +865,7 @@ public class Player {
// ---------------------MAIL------------------------
- public List getAllMail() {
- return this.getMailHandler().getMail();
- }
+ public List getAllMail() { return this.getMailHandler().getMail(); }
public void sendMail(Mail message) {
this.getMailHandler().sendMail(message);
@@ -1014,9 +875,7 @@ public class Player {
return this.getMailHandler().deleteMail(mailId);
}
- public Mail getMail(int index) {
- return this.getMailHandler().getMailById(index);
- }
+ public Mail getMail(int index) { return this.getMailHandler().getMailById(index); }
public int getMailId(Mail message) {
return this.getMailHandler().getMailIndex(message);
@@ -1050,13 +909,13 @@ public class Player {
public OnlinePlayerInfo getOnlinePlayerInfo() {
OnlinePlayerInfo.Builder onlineInfo = OnlinePlayerInfo.newBuilder()
- .setUid(this.getUid())
- .setNickname(this.getNickname())
- .setPlayerLevel(this.getLevel())
- .setMpSettingType(this.getMpSetting())
- .setNameCardId(this.getNameCardId())
- .setSignature(this.getSignature())
- .setProfilePicture(ProfilePicture.newBuilder().setAvatarId(this.getHeadImage()));
+ .setUid(this.getUid())
+ .setNickname(this.getNickname())
+ .setPlayerLevel(this.getLevel())
+ .setMpSettingType(this.getMpSetting())
+ .setNameCardId(this.getNameCardId())
+ .setSignature(this.getSignature())
+ .setProfilePicture(ProfilePicture.newBuilder().setAvatarId(this.getHeadImage()));
if (this.getWorld() != null) {
onlineInfo.setCurPlayerNumInWorld(getWorld().getPlayerCount());
@@ -1082,12 +941,12 @@ public class Player {
if (this.getShowAvatarList() != null) {
for (int avatarId : this.getShowAvatarList()) {
socialShowAvatarInfoList.add(
- socialShowAvatarInfoList.size(),
- SocialShowAvatarInfoOuterClass.SocialShowAvatarInfo.newBuilder()
- .setAvatarId(avatarId)
- .setLevel(getAvatars().getAvatarById(avatarId).getLevel())
- .setCostumeId(getAvatars().getAvatarById(avatarId).getCostume())
- .build()
+ socialShowAvatarInfoList.size(),
+ SocialShowAvatarInfoOuterClass.SocialShowAvatarInfo.newBuilder()
+ .setAvatarId(avatarId)
+ .setLevel(getAvatars().getAvatarById(avatarId).getLevel())
+ .setCostumeId(getAvatars().getAvatarById(avatarId).getCostume())
+ .build()
);
}
}
@@ -1098,31 +957,32 @@ public class Player {
if (showAvatarList != null) {
for (int avatarId : showAvatarList) {
socialShowAvatarInfoList.add(
- socialShowAvatarInfoList.size(),
- SocialShowAvatarInfoOuterClass.SocialShowAvatarInfo.newBuilder()
- .setAvatarId(avatarId)
- .setLevel(avatars.getAvatarById(avatarId).getLevel())
- .setCostumeId(avatars.getAvatarById(avatarId).getCostume())
- .build()
+ socialShowAvatarInfoList.size(),
+ SocialShowAvatarInfoOuterClass.SocialShowAvatarInfo.newBuilder()
+ .setAvatarId(avatarId)
+ .setLevel(avatars.getAvatarById(avatarId).getLevel())
+ .setCostumeId(avatars.getAvatarById(avatarId).getCostume())
+ .build()
);
}
}
}
- return SocialDetail.newBuilder()
- .setUid(this.getUid())
- .setProfilePicture(ProfilePicture.newBuilder().setAvatarId(this.getHeadImage()))
- .setNickname(this.getNickname())
- .setSignature(this.getSignature())
- .setLevel(this.getLevel())
- .setBirthday(this.getBirthday().getFilledProtoWhenNotEmpty())
- .setWorldLevel(this.getWorldLevel())
- .setNameCardId(this.getNameCardId())
- .setIsShowAvatar(this.isShowAvatars())
- .addAllShowAvatarInfoList(socialShowAvatarInfoList)
- .addAllShowNameCardIdList(this.getShowNameCardInfoList())
- .setFinishAchievementNum(this.getFinishedAchievementNum())
- .setFriendEnterHomeOptionValue(this.getHome() == null ? 0 : this.getHome().getEnterHomeOption());
+ SocialDetail.Builder social = SocialDetail.newBuilder()
+ .setUid(this.getUid())
+ .setProfilePicture(ProfilePicture.newBuilder().setAvatarId(this.getHeadImage()))
+ .setNickname(this.getNickname())
+ .setSignature(this.getSignature())
+ .setLevel(this.getLevel())
+ .setBirthday(this.getBirthday().getFilledProtoWhenNotEmpty())
+ .setWorldLevel(this.getWorldLevel())
+ .setNameCardId(this.getNameCardId())
+ .setIsShowAvatar(this.isShowAvatars())
+ .addAllShowAvatarInfoList(socialShowAvatarInfoList)
+ .addAllShowNameCardIdList(this.getShowNameCardInfoList())
+ .setFinishAchievementNum(this.getFinishedAchievementNum())
+ .setFriendEnterHomeOptionValue(this.getHome() == null ? 0 : this.getHome().getEnterHomeOption());
+ return social;
}
public int getFinishedAchievementNum() {
@@ -1165,17 +1025,17 @@ public class Player {
public PlayerWorldLocationInfoOuterClass.PlayerWorldLocationInfo getWorldPlayerLocationInfo() {
return PlayerWorldLocationInfoOuterClass.PlayerWorldLocationInfo.newBuilder()
- .setSceneId(this.getSceneId())
- .setPlayerLoc(this.getPlayerLocationInfo())
- .build();
+ .setSceneId(this.getSceneId())
+ .setPlayerLoc(this.getPlayerLocationInfo())
+ .build();
}
public PlayerLocationInfo getPlayerLocationInfo() {
return PlayerLocationInfo.newBuilder()
- .setUid(this.getUid())
- .setPos(this.getPosition().toProto())
- .setRot(this.getRotation().toProto())
- .build();
+ .setUid(this.getUid())
+ .setPos(this.getPosition().toProto())
+ .setRot(this.getRotation().toProto())
+ .build();
}
public void loadBattlePassManager() {
@@ -1185,7 +1045,7 @@ public class Player {
}
public PlayerCollectionRecords getCollectionRecordStore() {
- if (this.collectionRecordStore == null) {
+ if (this.collectionRecordStore==null) {
this.collectionRecordStore = new PlayerCollectionRecords();
}
return collectionRecordStore;
@@ -1261,8 +1121,6 @@ public class Player {
// Home resources
this.getHome().updateHourlyResources(this);
-
- this.getQuestManager().onTick();
}
private synchronized void doDailyReset() {
@@ -1292,6 +1150,9 @@ public class Player {
this.getBattlePassManager().resetWeeklyMissions();
}
+ // Reset resin-buying count.
+ this.setResinBuyCount(0);
+
// Done. Update last reset time.
this.setLastDailyReset(currentTime);
}
@@ -1328,17 +1189,12 @@ public class Player {
this.achievements = Achievements.getByPlayer(this);
this.getAvatars().loadFromDatabase();
this.getInventory().loadFromDatabase();
+ this.loadBattlePassManager(); // Call before avatar postLoad to avoid null pointer
+ this.getAvatars().postLoad(); // Needs to be called after inventory is handled
this.getFriendsList().loadFromDatabase();
this.getMailHandler().loadFromDatabase();
this.getQuestManager().loadFromDatabase();
-
- this.loadBattlePassManager();
- this.getAvatars().postLoad(); // Needs to be called after inventory is handled
- }
-
- public void onPlayerBorn() {
- getQuestManager().onPlayerBorn();
}
public void onLogin() {
@@ -1418,8 +1274,7 @@ public class Player {
session.setState(SessionState.ACTIVE);
// Call join event.
- PlayerJoinEvent event = new PlayerJoinEvent(this);
- event.call();
+ PlayerJoinEvent event = new PlayerJoinEvent(this); event.call();
if (event.isCanceled()) { // If event is not cancelled, continue.
session.close();
return;
@@ -1458,12 +1313,11 @@ public class Player {
this.getFriendsList().save();
// Call quit event.
- PlayerQuitEvent event = new PlayerQuitEvent(this);
- event.call();
- } catch (Throwable e) {
+ PlayerQuitEvent event = new PlayerQuitEvent(this); event.call();
+ }catch (Throwable e) {
e.printStackTrace();
Grasscutter.getLogger().warn("Player (UID {}) save failure", getUid());
- } finally {
+ }finally {
removeFromServer();
}
}
@@ -1478,15 +1332,23 @@ public class Player {
public int getLegendaryKey() {
return this.getProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY);
}
-
public synchronized void addLegendaryKey(int count) {
this.setProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY, getLegendaryKey() + count);
}
-
public synchronized void useLegendaryKey(int count) {
this.setProperty(PlayerProperty.PROP_PLAYER_LEGENDARY_KEY, getLegendaryKey() - count);
}
+ public enum SceneLoadState {
+ NONE(0), LOADING(1), INIT(2), LOADED(3);
+
+ @Getter private final int value;
+
+ SceneLoadState(int value) {
+ this.value = value;
+ }
+ }
+
public int getPropertyMin(PlayerProperty prop) {
if (prop.isDynamicRange()) {
return 0;
@@ -1529,15 +1391,4 @@ public class Player {
}
}
- public enum SceneLoadState {
- NONE(0), LOADING(1), INIT(2), LOADED(3);
-
- @Getter
- private final int value;
-
- SceneLoadState(int value) {
- this.value = value;
- }
- }
-
}
diff --git a/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseAddItem.java b/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseAddItem.java
index 6820c94b1..0d36d486f 100644
--- a/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseAddItem.java
+++ b/src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseAddItem.java
@@ -1,25 +1,25 @@
-package emu.grasscutter.game.props.ItemUseAction;
-
-import emu.grasscutter.game.props.ItemUseOp;
-
-public class ItemUseAddItem extends ItemUseInt {
- private int count = 0;
-
- public ItemUseAddItem(String[] useParam) {
- super(useParam);
- try {
- this.count = Integer.parseInt(useParam[1]);
- } catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {
- }
- }
-
- @Override
- public ItemUseOp getItemUseOp() {
- return ItemUseOp.ITEM_USE_ADD_ITEM;
- }
-
- @Override
- public boolean useItem(UseItemParams params) {
- return params.player.getInventory().addItem(this.i, this.count * params.count);
- }
-}
+package emu.grasscutter.game.props.ItemUseAction;
+
+import emu.grasscutter.game.props.ActionReason;
+import emu.grasscutter.game.props.ItemUseOp;
+
+public class ItemUseAddItem extends ItemUseInt {
+ private int count = 0;
+
+ @Override
+ public ItemUseOp getItemUseOp() {
+ return ItemUseOp.ITEM_USE_ADD_ITEM;
+ }
+
+ public ItemUseAddItem(String[] useParam) {
+ super(useParam);
+ try {
+ this.count = Integer.parseInt(useParam[1]);
+ } catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {}
+ }
+
+ @Override
+ public boolean useItem(UseItemParams params) {
+ return params.player.getInventory().addItem(this.i, this.count * params.count, ActionReason.PlayerUseItem);
+ }
+}
diff --git a/src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java b/src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java
index 87e81e60d..60517aded 100644
--- a/src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java
+++ b/src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java
@@ -1,330 +1,301 @@
-package emu.grasscutter.server.http.dispatch;
-
-import static emu.grasscutter.config.Configuration.*;
-
-import com.google.protobuf.ByteString;
-import emu.grasscutter.Grasscutter;
-import emu.grasscutter.Grasscutter.ServerRunMode;
-import emu.grasscutter.net.proto.QueryCurrRegionHttpRspOuterClass.QueryCurrRegionHttpRsp;
-import emu.grasscutter.net.proto.QueryRegionListHttpRspOuterClass.QueryRegionListHttpRsp;
-import emu.grasscutter.net.proto.RegionInfoOuterClass.RegionInfo;
-import emu.grasscutter.net.proto.RegionSimpleInfoOuterClass.RegionSimpleInfo;
-import emu.grasscutter.server.event.dispatch.QueryAllRegionsEvent;
-import emu.grasscutter.server.event.dispatch.QueryCurrentRegionEvent;
-import emu.grasscutter.server.http.Router;
-import emu.grasscutter.server.http.objects.QueryCurRegionRspJson;
-import emu.grasscutter.utils.Crypto;
-import emu.grasscutter.utils.Utils;
-import io.javalin.Javalin;
-import io.javalin.http.Context;
-import java.io.ByteArrayOutputStream;
-import java.security.Signature;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.regex.Pattern;
-import javax.crypto.Cipher;
-import org.slf4j.Logger;
-
-/** Handles requests related to region queries. */
-public final class RegionHandler implements Router {
- private static final Map regions = new ConcurrentHashMap<>();
- private static String regionListResponse;
- private static String regionListResponsecn;
-
- public RegionHandler() {
- try { // Read & initialize region data.
- this.initialize();
- } catch (Exception exception) {
- Grasscutter.getLogger().error("Failed to initialize region data.", exception);
- }
- }
-
- /**
- * Handle query region list request.
- *
- * @param ctx The context object for handling the request.
- * @route /query_region_list
- */
- private static void queryRegionList(Context ctx) {
- // Get logger and query parameters.
- Logger logger = Grasscutter.getLogger();
- if (ctx.queryParamMap().containsKey("version") && ctx.queryParamMap().containsKey("platform")) {
- String versionName = ctx.queryParam("version");
- String versionCode = versionName.replaceAll("[/.0-9]*", "");
- String platformName = ctx.queryParam("platform");
-
- // Determine the region list to use based on the version and platform.
- if ("CNRELiOS".equals(versionCode)
- || "CNRELWin".equals(versionCode)
- || "CNRELAndroid".equals(versionCode)) {
- // Use the CN region list.
- QueryAllRegionsEvent event = new QueryAllRegionsEvent(regionListResponsecn);
- event.call();
- logger.debug("Connect to Chinese version");
-
- // Respond with the event result.
- ctx.result(event.getRegionList());
- } else if ("OSRELiOS".equals(versionCode)
- || "OSRELWin".equals(versionCode)
- || "OSRELAndroid".equals(versionCode)) {
- // Use the OS region list.
- QueryAllRegionsEvent event = new QueryAllRegionsEvent(regionListResponse);
- event.call();
- logger.debug("Connect to global version");
-
- // Respond with the event result.
- ctx.result(event.getRegionList());
- } else {
- /*
- * String regionListResponse = "CP///////////wE=";
- * QueryAllRegionsEvent event = new QueryAllRegionsEvent(regionListResponse);
- * event.call();
- * ctx.result(event.getRegionList());
- * return;
- */
- // Use the default region list.
- QueryAllRegionsEvent event = new QueryAllRegionsEvent(regionListResponse);
- event.call();
- logger.debug("Connect to global version");
-
- // Respond with the event result.
- ctx.result(event.getRegionList());
- }
- } else {
- // Use the default region list.
- QueryAllRegionsEvent event = new QueryAllRegionsEvent(regionListResponse);
- event.call();
- logger.debug("Connect to global version");
-
- // Respond with the event result.
- ctx.result(event.getRegionList());
- }
- // Log the request to the console.
- Grasscutter.getLogger()
- .info(String.format("[Dispatch] Client %s request: query_region_list", ctx.ip()));
- }
-
- /**
- * @route /query_cur_region/{region}
- */
- private static void queryCurrentRegion(Context ctx) {
- // Get region to query.
- String regionName = ctx.pathParam("region");
- String versionName = ctx.queryParam("version");
- var region = regions.get(regionName);
-
- // Get region data.
- String regionData = "CAESGE5vdCBGb3VuZCB2ZXJzaW9uIGNvbmZpZw==";
- if (ctx.queryParamMap().values().size() > 0) {
- if (region != null) regionData = region.getBase64();
- }
-
- String[] versionCode =
- versionName.replaceAll(Pattern.compile("[a-zA-Z]").pattern(), "").split("\\.");
- int versionMajor = Integer.parseInt(versionCode[0]);
- int versionMinor = Integer.parseInt(versionCode[1]);
- int versionFix = Integer.parseInt(versionCode[2]);
-
- if (versionMajor >= 3
- || (versionMajor == 2 && versionMinor == 7 && versionFix >= 50)
- || (versionMajor == 2 && versionMinor == 8)) {
- try {
- QueryCurrentRegionEvent event = new QueryCurrentRegionEvent(regionData);
- event.call();
-
- if (ctx.queryParam("dispatchSeed") == null) {
- // More love for UA Patch players
- var rsp = new QueryCurRegionRspJson();
-
- rsp.content = event.getRegionInfo();
- rsp.sign = "TW9yZSBsb3ZlIGZvciBVQSBQYXRjaCBwbGF5ZXJz";
-
- ctx.json(rsp);
- return;
- }
-
- String key_id = ctx.queryParam("key_id");
-
- if (key_id == null) throw new Exception("Key ID was not set");
-
- Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
- cipher.init(Cipher.ENCRYPT_MODE, Crypto.EncryptionKeys.get(Integer.valueOf(key_id)));
- var regionInfo = Utils.base64Decode(event.getRegionInfo());
-
- // Encrypt regionInfo in chunks
- ByteArrayOutputStream encryptedRegionInfoStream = new ByteArrayOutputStream();
-
- // Thank you so much GH Copilot
- int chunkSize = 256 - 11;
- int regionInfoLength = regionInfo.length;
- int numChunks = (int) Math.ceil(regionInfoLength / (double) chunkSize);
-
- for (int i = 0; i < numChunks; i++) {
- byte[] chunk =
- Arrays.copyOfRange(
- regionInfo, i * chunkSize, Math.min((i + 1) * chunkSize, regionInfoLength));
- byte[] encryptedChunk = cipher.doFinal(chunk);
- encryptedRegionInfoStream.write(encryptedChunk);
- }
-
- Signature privateSignature = Signature.getInstance("SHA256withRSA");
- privateSignature.initSign(Crypto.CUR_SIGNING_KEY);
- privateSignature.update(regionInfo);
-
- var rsp = new QueryCurRegionRspJson();
-
- rsp.content = Utils.base64Encode(encryptedRegionInfoStream.toByteArray());
- rsp.sign = Utils.base64Encode(privateSignature.sign());
-
- ctx.json(rsp);
- } catch (Exception e) {
- Grasscutter.getLogger().error("An error occurred while handling query_cur_region.", e);
- }
- } else {
- // Invoke event.
- QueryCurrentRegionEvent event = new QueryCurrentRegionEvent(regionData);
- event.call();
- // Respond with event result.
- ctx.result(event.getRegionInfo());
- }
- // Log to console.
- Grasscutter.getLogger()
- .info(String.format("Client %s request: query_cur_region/%s", ctx.ip(), regionName));
- }
-
- /**
- * Gets the current region query.
- *
- * @return A {@link QueryCurrRegionHttpRsp} object.
- */
- public static QueryCurrRegionHttpRsp getCurrentRegion() {
- return SERVER.runMode == ServerRunMode.HYBRID ? regions.get("os_usa").getRegionQuery() : null;
- }
-
- /** Configures region data according to configuration. */
- private void initialize() {
- String dispatchDomain =
- "http"
- + (HTTP_ENCRYPTION.useInRouting ? "s" : "")
- + "://"
- + lr(HTTP_INFO.accessAddress, HTTP_INFO.bindAddress)
- + ":"
- + lr(HTTP_INFO.accessPort, HTTP_INFO.bindPort);
-
- // Create regions.
- List servers = new ArrayList<>();
- List usedNames = new ArrayList<>(); // List to check for potential naming conflicts.
-
- var configuredRegions = new ArrayList<>(List.of(DISPATCH_INFO.regions));
- if (SERVER.runMode != ServerRunMode.HYBRID && configuredRegions.size() == 0) {
- Grasscutter.getLogger()
- .error(
- "[Dispatch] There are no game servers available. Exiting due to unplayable state.");
- System.exit(1);
- } else if (configuredRegions.size() == 0)
- configuredRegions.add(
- new Region(
- "os_usa",
- DISPATCH_INFO.defaultName,
- lr(GAME_INFO.accessAddress, GAME_INFO.bindAddress),
- lr(GAME_INFO.accessPort, GAME_INFO.bindPort)));
-
- configuredRegions.forEach(
- region -> {
- if (usedNames.contains(region.Name)) {
- Grasscutter.getLogger().error("Region name already in use.");
- return;
- }
-
- // Create a region identifier.
- var identifier =
- RegionSimpleInfo.newBuilder()
- .setName(region.Name)
- .setTitle(region.Title)
- .setType("DEV_PUBLIC")
- .setDispatchUrl(dispatchDomain + "/query_cur_region/" + region.Name)
- .build();
- usedNames.add(region.Name);
- servers.add(identifier);
-
- // Create a region info object.
- var regionInfo =
- RegionInfo.newBuilder()
- .setGateserverIp(region.Ip)
- .setGateserverPort(region.Port)
- .setSecretKey(ByteString.copyFrom(Crypto.DISPATCH_SEED))
- .build();
- // Create an updated region query.
- var updatedQuery = QueryCurrRegionHttpRsp.newBuilder().setRegionInfo(regionInfo).build();
- regions.put(
- region.Name,
- new RegionData(
- updatedQuery, Utils.base64Encode(updatedQuery.toByteString().toByteArray())));
- });
-
- // Create a config object.
- byte[] customConfig =
- "{\"sdkenv\":\"2\",\"checkdevice\":\"false\",\"loadPatch\":\"false\",\"showexception\":\"false\",\"regionConfig\":\"pm|fk|add\",\"downloadMode\":\"0\"}"
- .getBytes();
- Crypto.xor(customConfig, Crypto.DISPATCH_KEY); // XOR the config with the key.
-
- // Create an updated region list.
- QueryRegionListHttpRsp updatedRegionList =
- QueryRegionListHttpRsp.newBuilder()
- .addAllRegionList(servers)
- .setClientSecretKey(ByteString.copyFrom(Crypto.DISPATCH_SEED))
- .setClientCustomConfigEncrypted(ByteString.copyFrom(customConfig))
- .setEnableLoginPc(true)
- .build();
-
- // Set the region list response.
- regionListResponse = Utils.base64Encode(updatedRegionList.toByteString().toByteArray());
-
- // CN
- // Create a config object.
- byte[] customConfigcn =
- "{\"sdkenv\":\"0\",\"checkdevice\":\"true\",\"loadPatch\":\"false\",\"showexception\":\"false\",\"regionConfig\":\"pm|fk|add\",\"downloadMode\":\"0\"}"
- .getBytes();
- Crypto.xor(customConfigcn, Crypto.DISPATCH_KEY); // XOR the config with the key.
-
- // Create an updated region list.
- QueryRegionListHttpRsp updatedRegionListcn =
- QueryRegionListHttpRsp.newBuilder()
- .addAllRegionList(servers)
- .setClientSecretKey(ByteString.copyFrom(Crypto.DISPATCH_SEED))
- .setClientCustomConfigEncrypted(ByteString.copyFrom(customConfigcn))
- .setEnableLoginPc(true)
- .build();
-
- // Set the region list response.
- regionListResponsecn = Utils.base64Encode(updatedRegionListcn.toByteString().toByteArray());
- }
-
- @Override
- public void applyRoutes(Javalin javalin) {
- javalin.get("/query_region_list", RegionHandler::queryRegionList);
- javalin.get("/query_cur_region/{region}", RegionHandler::queryCurrentRegion);
- }
-
- /** Region data container. */
- public static class RegionData {
- private final QueryCurrRegionHttpRsp regionQuery;
- private final String base64;
-
- public RegionData(QueryCurrRegionHttpRsp prq, String b64) {
- this.regionQuery = prq;
- this.base64 = b64;
- }
-
- public QueryCurrRegionHttpRsp getRegionQuery() {
- return this.regionQuery;
- }
-
- public String getBase64() {
- return this.base64;
- }
- }
-}
+package emu.grasscutter.server.http.dispatch;
+
+import com.google.protobuf.ByteString;
+import emu.grasscutter.GameConstants;
+import emu.grasscutter.Grasscutter;
+import emu.grasscutter.Grasscutter.ServerRunMode;
+import emu.grasscutter.net.proto.QueryRegionListHttpRspOuterClass.QueryRegionListHttpRsp;
+import emu.grasscutter.net.proto.QueryCurrRegionHttpRspOuterClass.QueryCurrRegionHttpRsp;
+import emu.grasscutter.net.proto.RegionSimpleInfoOuterClass.RegionSimpleInfo;
+import emu.grasscutter.net.proto.RegionInfoOuterClass.RegionInfo;
+import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
+import emu.grasscutter.net.proto.StopServerInfoOuterClass.StopServerInfo;
+import emu.grasscutter.server.event.dispatch.QueryAllRegionsEvent;
+import emu.grasscutter.server.event.dispatch.QueryCurrentRegionEvent;
+import emu.grasscutter.server.http.Router;
+import emu.grasscutter.server.http.objects.QueryCurRegionRspJson;
+import emu.grasscutter.utils.Crypto;
+import emu.grasscutter.utils.Utils;
+import io.javalin.Javalin;
+import io.javalin.http.Context;
+
+import java.time.Instant;
+import javax.crypto.Cipher;
+import java.io.ByteArrayOutputStream;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.security.Signature;
+import java.util.regex.Pattern;
+
+import org.slf4j.Logger;
+
+import static emu.grasscutter.config.Configuration.*;
+import static emu.grasscutter.utils.Language.translate;
+
+/**
+ * Handles requests related to region queries.
+ */
+public final class RegionHandler implements Router {
+ private static final Map regions = new ConcurrentHashMap<>();
+ private static String regionListResponse;
+ private static String regionListResponsecn;
+
+ public RegionHandler() {
+ try { // Read & initialize region data.
+ this.initialize();
+ } catch (Exception exception) {
+ Grasscutter.getLogger().error("Failed to initialize region data.", exception);
+ }
+ }
+
+ /**
+ * Configures region data according to configuration.
+ */
+ private void initialize() {
+ String dispatchDomain = "http" + (HTTP_ENCRYPTION.useInRouting ? "s" : "") + "://"
+ + lr(HTTP_INFO.accessAddress, HTTP_INFO.bindAddress) + ":"
+ + lr(HTTP_INFO.accessPort, HTTP_INFO.bindPort);
+
+ // Create regions.
+ List servers = new ArrayList<>();
+ List usedNames = new ArrayList<>(); // List to check for potential naming conflicts.
+
+ var configuredRegions = new ArrayList<>(List.of(DISPATCH_INFO.regions));
+ if (SERVER.runMode != ServerRunMode.HYBRID && configuredRegions.size() == 0) {
+ Grasscutter.getLogger().error("[Dispatch] There are no game servers available. Exiting due to unplayable state.");
+ System.exit(1);
+ } else if (configuredRegions.size() == 0)
+ configuredRegions.add(new Region("os_usa", DISPATCH_INFO.defaultName,
+ lr(GAME_INFO.accessAddress, GAME_INFO.bindAddress),
+ lr(GAME_INFO.accessPort, GAME_INFO.bindPort)));
+
+ configuredRegions.forEach(region -> {
+ if (usedNames.contains(region.Name)) {
+ Grasscutter.getLogger().error("Region name already in use.");
+ return;
+ }
+
+ // Create a region identifier.
+ var identifier = RegionSimpleInfo.newBuilder()
+ .setName(region.Name).setTitle(region.Title).setType("DEV_PUBLIC")
+ .setDispatchUrl(dispatchDomain + "/query_cur_region/" + region.Name)
+ .build();
+ usedNames.add(region.Name); servers.add(identifier);
+
+ // Create a region info object.
+ var regionInfo = RegionInfo.newBuilder()
+ .setGateserverIp(region.Ip).setGateserverPort(region.Port)
+ .setSecretKey(ByteString.copyFrom(Crypto.DISPATCH_SEED))
+ .build();
+ // Create an updated region query.
+ var updatedQuery = QueryCurrRegionHttpRsp.newBuilder().setRegionInfo(regionInfo).build();
+ regions.put(region.Name, new RegionData(updatedQuery, Utils.base64Encode(updatedQuery.toByteString().toByteArray())));
+ });
+
+ // Create a config object.
+ byte[] customConfig = "{\"sdkenv\":\"2\",\"checkdevice\":\"false\",\"loadPatch\":\"false\",\"showexception\":\"false\",\"regionConfig\":\"pm|fk|add\",\"downloadMode\":\"0\"}".getBytes();
+ Crypto.xor(customConfig, Crypto.DISPATCH_KEY); // XOR the config with the key.
+
+ // Create an updated region list.
+ QueryRegionListHttpRsp updatedRegionList = QueryRegionListHttpRsp.newBuilder()
+ .addAllRegionList(servers)
+ .setClientSecretKey(ByteString.copyFrom(Crypto.DISPATCH_SEED))
+ .setClientCustomConfigEncrypted(ByteString.copyFrom(customConfig))
+ .setEnableLoginPc(true).build();
+
+ // Set the region list response.
+ regionListResponse = Utils.base64Encode(updatedRegionList.toByteString().toByteArray());
+
+ // CN
+ // Create a config object.
+ byte[] customConfigcn = "{\"sdkenv\":\"0\",\"checkdevice\":\"true\",\"loadPatch\":\"false\",\"showexception\":\"false\",\"regionConfig\":\"pm|fk|add\",\"downloadMode\":\"0\"}".getBytes();
+ Crypto.xor(customConfigcn, Crypto.DISPATCH_KEY); // XOR the config with the key.
+
+ // Create an updated region list.
+ QueryRegionListHttpRsp updatedRegionListcn = QueryRegionListHttpRsp.newBuilder()
+ .addAllRegionList(servers)
+ .setClientSecretKey(ByteString.copyFrom(Crypto.DISPATCH_SEED))
+ .setClientCustomConfigEncrypted(ByteString.copyFrom(customConfigcn))
+ .setEnableLoginPc(true).build();
+
+ // Set the region list response.
+ regionListResponsecn = Utils.base64Encode(updatedRegionListcn.toByteString().toByteArray());
+ }
+
+ @Override
+ public void applyRoutes(Javalin javalin) {
+ javalin.get("/query_region_list", RegionHandler::queryRegionList);
+ javalin.get("/query_cur_region/{region}", RegionHandler::queryCurrentRegion);
+ }
+
+ /**
+ * Handle query region list request.
+ *
+ * @param ctx The context object for handling the request.
+ * @route /query_region_list
+ */
+ private static void queryRegionList(Context ctx) {
+ // Get logger and query parameters.
+ Logger logger = Grasscutter.getLogger();
+ if (ctx.queryParamMap().containsKey("version") && ctx.queryParamMap().containsKey("platform")) {
+ String versionName = ctx.queryParam("version");
+ String versionCode = versionName.replaceAll("[/.0-9]*", "");
+ String platformName = ctx.queryParam("platform");
+
+ // Determine the region list to use based on the version and platform.
+ if ("CNRELiOS".equals(versionCode) || "CNRELWin".equals(versionCode)
+ || "CNRELAndroid".equals(versionCode)) {
+ // Use the CN region list.
+ QueryAllRegionsEvent event = new QueryAllRegionsEvent(regionListResponsecn);
+ event.call();
+ logger.debug("Connect to Chinese version");
+
+ // Respond with the event result.
+ ctx.result(event.getRegionList());
+ } else if ("OSRELiOS".equals(versionCode) || "OSRELWin".equals(versionCode)
+ || "OSRELAndroid".equals(versionCode)) {
+ // Use the OS region list.
+ QueryAllRegionsEvent event = new QueryAllRegionsEvent(regionListResponse);
+ event.call();
+ logger.debug("Connect to global version");
+
+ // Respond with the event result.
+ ctx.result(event.getRegionList());
+ } else {
+ /*
+ * String regionListResponse = "CP///////////wE=";
+ * QueryAllRegionsEvent event = new QueryAllRegionsEvent(regionListResponse);
+ * event.call();
+ * ctx.result(event.getRegionList());
+ * return;
+ */
+ // Use the default region list.
+ QueryAllRegionsEvent event = new QueryAllRegionsEvent(regionListResponse);
+ event.call();
+ logger.debug("Connect to global version");
+
+ // Respond with the event result.
+ ctx.result(event.getRegionList());
+ }
+ } else {
+ // Use the default region list.
+ QueryAllRegionsEvent event = new QueryAllRegionsEvent(regionListResponse);
+ event.call();
+ logger.debug("Connect to global version");
+
+ // Respond with the event result.
+ ctx.result(event.getRegionList());
+ }
+ // Log the request to the console.
+ Grasscutter.getLogger().info(String.format("[Dispatch] Client %s request: query_region_list", ctx.ip()));
+ }
+
+ /**
+ * @route /query_cur_region/{region}
+ */
+ private static void queryCurrentRegion(Context ctx) {
+ // Get region to query.
+ String regionName = ctx.pathParam("region");
+ String versionName = ctx.queryParam("version");
+ var region = regions.get(regionName);
+
+ // Get region data.
+ String regionData = "CAESGE5vdCBGb3VuZCB2ZXJzaW9uIGNvbmZpZw==";
+ if (ctx.queryParamMap().values().size() > 0) {
+ if (region != null)
+ regionData = region.getBase64();
+ }
+
+ String clientVersion = versionName.replaceAll(Pattern.compile("[a-zA-Z]").pattern(), "");
+ String[] versionCode = clientVersion.split("\\.");
+ int versionMajor = Integer.parseInt(versionCode[0]);
+ int versionMinor = Integer.parseInt(versionCode[1]);
+ int versionFix = Integer.parseInt(versionCode[2]);
+
+ if (versionMajor >= 3 || (versionMajor == 2 && versionMinor == 7 && versionFix >= 50) || (versionMajor == 2 && versionMinor == 8)) {
+ try {
+ QueryCurrentRegionEvent event = new QueryCurrentRegionEvent(regionData); event.call();
+
+ String key_id = ctx.queryParam("key_id");
+
+ if (!clientVersion.equals(GameConstants.VERSION)) { // Reject clients when there is a version mismatch
+
+ boolean updateClient = GameConstants.VERSION.compareTo(clientVersion) > 0;
+
+ QueryCurrRegionHttpRsp rsp = QueryCurrRegionHttpRsp.newBuilder()
+ .setRetcode(Retcode.RET_STOP_SERVER_VALUE)
+ .setMsg("Connection Failed!")
+ .setRegionInfo(RegionInfo.newBuilder())
+ .setStopServer(StopServerInfo.newBuilder()
+ .setUrl("https://discord.gg/grasscutters")
+ .setStopBeginTime((int) Instant.now().getEpochSecond())
+ .setStopEndTime((int) Instant.now().getEpochSecond()*2)
+ .setContentMsg(updateClient ? "\nVersion mismatch outdated client! \n\nServer version: %s\nClient version: %s".formatted(GameConstants.VERSION, clientVersion) : "\nVersion mismatch outdated server! \n\nServer version: %s\nClient version: %s".formatted(GameConstants.VERSION, clientVersion))
+ .build())
+ .buildPartial();
+
+ Grasscutter.getLogger().info(String.format("Connection denied for %s due to %s", ctx.ip(), updateClient ? "outdated client!" : "outdated server!"));
+
+ ctx.json(Crypto.encryptAndSignRegionData(rsp.toByteArray(), key_id));
+ return;
+ }
+
+ if (ctx.queryParam("dispatchSeed") == null) {
+ // More love for UA Patch players
+ var rsp = new QueryCurRegionRspJson();
+
+ rsp.content = event.getRegionInfo();
+ rsp.sign = "TW9yZSBsb3ZlIGZvciBVQSBQYXRjaCBwbGF5ZXJz";
+
+ ctx.json(rsp);
+ return;
+ }
+
+
+ var regionInfo = Utils.base64Decode(event.getRegionInfo());
+
+ ctx.json(Crypto.encryptAndSignRegionData(regionInfo, key_id));
+ }
+ catch (Exception e) {
+ Grasscutter.getLogger().error("An error occurred while handling query_cur_region.", e);
+ }
+ }
+ else {
+ // Invoke event.
+ QueryCurrentRegionEvent event = new QueryCurrentRegionEvent(regionData); event.call();
+ // Respond with event result.
+ ctx.result(event.getRegionInfo());
+ }
+ // Log to console.
+ Grasscutter.getLogger().info(String.format("Client %s request: query_cur_region/%s", ctx.ip(), regionName));
+ }
+
+ /**
+ * Region data container.
+ */
+ public static class RegionData {
+ private final QueryCurrRegionHttpRsp regionQuery;
+ private final String base64;
+
+ public RegionData(QueryCurrRegionHttpRsp prq, String b64) {
+ this.regionQuery = prq;
+ this.base64 = b64;
+ }
+
+ public QueryCurrRegionHttpRsp getRegionQuery() {
+ return this.regionQuery;
+ }
+
+ public String getBase64() {
+ return this.base64;
+ }
+ }
+
+ /**
+ * Gets the current region query.
+ * @return A {@link QueryCurrRegionHttpRsp} object.
+ */
+ public static QueryCurrRegionHttpRsp getCurrentRegion() {
+ return SERVER.runMode == ServerRunMode.HYBRID ? regions.get("os_usa").getRegionQuery() : null;
+ }
+}
diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerBuyResinReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerBuyResinReq.java
new file mode 100644
index 000000000..13ada5de7
--- /dev/null
+++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerBuyResinReq.java
@@ -0,0 +1,16 @@
+package emu.grasscutter.server.packet.recv;
+
+import emu.grasscutter.net.packet.Opcodes;
+import emu.grasscutter.net.packet.PacketHandler;
+import emu.grasscutter.net.packet.PacketOpcodes;
+import emu.grasscutter.server.game.GameSession;
+import emu.grasscutter.server.packet.send.PacketBuyResinRsp;
+
+@Opcodes(PacketOpcodes.BuyResinReq)
+public class HandlerBuyResinReq extends PacketHandler {
+ @Override
+ public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
+ var player = session.getPlayer();
+ session.send(new PacketBuyResinRsp(player, player.getResinManager().buy()));
+ }
+}
diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneAudioNotify.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneAudioNotify.java
new file mode 100644
index 000000000..0bfeddc16
--- /dev/null
+++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneAudioNotify.java
@@ -0,0 +1,31 @@
+
+package emu.grasscutter.server.packet.recv;
+
+import javax.lang.model.type.TypeMirror;
+
+import emu.grasscutter.net.packet.Opcodes;
+import emu.grasscutter.net.packet.PacketHandler;
+import emu.grasscutter.net.packet.PacketOpcodes;
+import emu.grasscutter.net.proto.SceneAudioNotifyOuterClass.SceneAudioNotify;
+import emu.grasscutter.server.game.GameSession;
+import emu.grasscutter.server.packet.send.PacketSceneAudioNotify;
+import java.util.List;
+
+@Opcodes(PacketOpcodes.SceneAudioNotify)
+public class HandlerSceneAudioNotify extends PacketHandler {
+
+ @Override
+ public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
+ SceneAudioNotify notify = SceneAudioNotify.parseFrom(payload);
+
+ int sourceUid = notify.getSourceUid();
+ List param2 = notify.getParam2List();
+ List param3 = notify.getParam3List();
+ int type = notify.getType();
+ List param1 = notify.getParam1List();
+
+ session.getPlayer().getScene().broadcastPacket(new PacketSceneAudioNotify(sourceUid, param2, param3, type, param1));
+ }
+
+}
+
diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketBuyResinRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketBuyResinRsp.java
new file mode 100644
index 000000000..07f8bba01
--- /dev/null
+++ b/src/main/java/emu/grasscutter/server/packet/send/PacketBuyResinRsp.java
@@ -0,0 +1,18 @@
+package emu.grasscutter.server.packet.send;
+
+import emu.grasscutter.game.player.Player;
+import emu.grasscutter.game.props.PlayerProperty;
+import emu.grasscutter.net.packet.BasePacket;
+import emu.grasscutter.net.packet.PacketOpcodes;
+import emu.grasscutter.net.proto.BuyResinRspOuterClass;
+
+public class PacketBuyResinRsp extends BasePacket {
+ public PacketBuyResinRsp(Player player, int ret) {
+ super(PacketOpcodes.BuyResinRsp);
+
+ this.setData(BuyResinRspOuterClass.BuyResinRsp.newBuilder()
+ .setCurValue(player.getProperty(PlayerProperty.PROP_PLAYER_RESIN))
+ .setRetcode(ret)
+ .build());
+ }
+}
diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketResinChangeNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketResinChangeNotify.java
index e58371f80..5f9b8bd92 100644
--- a/src/main/java/emu/grasscutter/server/packet/send/PacketResinChangeNotify.java
+++ b/src/main/java/emu/grasscutter/server/packet/send/PacketResinChangeNotify.java
@@ -1,24 +1,22 @@
-package emu.grasscutter.server.packet.send;
-
-import emu.grasscutter.game.player.Player;
-import emu.grasscutter.game.props.PlayerProperty;
-import emu.grasscutter.net.packet.BasePacket;
-import emu.grasscutter.net.packet.PacketOpcodes;
-import emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify;
-
-public class PacketResinChangeNotify extends BasePacket {
-
- public PacketResinChangeNotify(Player player) {
- super(PacketOpcodes.ResinChangeNotify);
-
- ResinChangeNotify proto =
- ResinChangeNotify.newBuilder()
- .setCurValue(player.getProperty(PlayerProperty.PROP_PLAYER_RESIN))
- .setNextAddTimestamp(player.getNextResinRefresh())
- .build();
-
- // ToDo: Add ability to buy resin with primogems, has to be included here.
-
- this.setData(proto);
- }
-}
+package emu.grasscutter.server.packet.send;
+
+import emu.grasscutter.game.player.Player;
+import emu.grasscutter.game.props.PlayerProperty;
+import emu.grasscutter.net.packet.BasePacket;
+import emu.grasscutter.net.packet.PacketOpcodes;
+import emu.grasscutter.net.proto.ResinChangeNotifyOuterClass.ResinChangeNotify;
+
+public class PacketResinChangeNotify extends BasePacket {
+
+ public PacketResinChangeNotify(Player player) {
+ super(PacketOpcodes.ResinChangeNotify);
+
+ ResinChangeNotify proto = ResinChangeNotify.newBuilder()
+ .setCurValue(player.getProperty(PlayerProperty.PROP_PLAYER_RESIN))
+ .setNextAddTimestamp(player.getNextResinRefresh())
+ .setCurBuyCount(player.getResinBuyCount())
+ .build();
+
+ this.setData(proto);
+ }
+}
diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneAudioNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneAudioNotify.java
new file mode 100644
index 000000000..227e2d2b1
--- /dev/null
+++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneAudioNotify.java
@@ -0,0 +1,23 @@
+package emu.grasscutter.server.packet.send;
+
+import emu.grasscutter.net.packet.BasePacket;
+import emu.grasscutter.net.packet.PacketOpcodes;
+import emu.grasscutter.net.proto.SceneAudioNotifyOuterClass;
+import java.util.List;
+
+public class PacketSceneAudioNotify extends BasePacket {
+
+ public PacketSceneAudioNotify(int sourceUid, List param2, List param3, int type, List param1) {
+ super(PacketOpcodes.SceneAudioNotify);
+
+ SceneAudioNotifyOuterClass.SceneAudioNotify proto = SceneAudioNotifyOuterClass.SceneAudioNotify.newBuilder()
+ .setSourceUid(sourceUid)
+ .addAllParam2(param2)
+ .addAllParam3(param3)
+ .setType(type)
+ .addAllParam1(param1)
+ .build();
+
+ this.setData(proto);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/emu/grasscutter/utils/Crypto.java b/src/main/java/emu/grasscutter/utils/Crypto.java
index d57f78433..da25073ad 100644
--- a/src/main/java/emu/grasscutter/utils/Crypto.java
+++ b/src/main/java/emu/grasscutter/utils/Crypto.java
@@ -1,77 +1,116 @@
-package emu.grasscutter.utils;
-
-import emu.grasscutter.Grasscutter;
-import java.nio.file.Path;
-import java.security.KeyFactory;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.SecureRandom;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.X509EncodedKeySpec;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-public final class Crypto {
- private static final SecureRandom secureRandom = new SecureRandom();
-
- public static byte[] DISPATCH_KEY;
- public static byte[] DISPATCH_SEED;
-
- public static byte[] ENCRYPT_KEY;
- public static long ENCRYPT_SEED = Long.parseUnsignedLong("11468049314633205968");
- public static byte[] ENCRYPT_SEED_BUFFER = new byte[0];
-
- public static PrivateKey CUR_SIGNING_KEY;
-
- public static Map EncryptionKeys = new HashMap<>();
-
- public static void loadKeys() {
- DISPATCH_KEY = FileUtils.readResource("/keys/dispatchKey.bin");
- DISPATCH_SEED = FileUtils.readResource("/keys/dispatchSeed.bin");
-
- ENCRYPT_KEY = FileUtils.readResource("/keys/secretKey.bin");
- ENCRYPT_SEED_BUFFER = FileUtils.readResource("/keys/secretKeyBuffer.bin");
-
- try {
- CUR_SIGNING_KEY =
- KeyFactory.getInstance("RSA")
- .generatePrivate(
- new PKCS8EncodedKeySpec(FileUtils.readResource("/keys/SigningKey.der")));
-
- Pattern pattern = Pattern.compile("([0-9]*)_Pub\\.der");
- for (Path path : FileUtils.getPathsFromResource("/keys/game_keys")) {
- if (path.toString().endsWith("_Pub.der")) {
-
- var m = pattern.matcher(path.getFileName().toString());
-
- if (m.matches()) {
- var key =
- KeyFactory.getInstance("RSA")
- .generatePublic(new X509EncodedKeySpec(FileUtils.read(path)));
-
- EncryptionKeys.put(Integer.valueOf(m.group(1)), key);
- }
- }
- }
- } catch (Exception e) {
- Grasscutter.getLogger().error("An error occurred while loading keys.", e);
- }
- }
-
- public static void xor(byte[] packet, byte[] key) {
- try {
- for (int i = 0; i < packet.length; i++) {
- packet[i] ^= key[i % key.length];
- }
- } catch (Exception e) {
- Grasscutter.getLogger().error("Crypto error.", e);
- }
- }
-
- public static byte[] createSessionKey(int length) {
- byte[] bytes = new byte[length];
- secureRandom.nextBytes(bytes);
- return bytes;
- }
-}
+package emu.grasscutter.utils;
+
+import emu.grasscutter.server.http.objects.QueryCurRegionRspJson;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.nio.file.Path;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.security.Signature;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.regex.Pattern;
+
+import emu.grasscutter.Grasscutter;
+import javax.crypto.Cipher;
+
+public final class Crypto {
+
+ private static final SecureRandom secureRandom = new SecureRandom();
+
+ public static byte[] DISPATCH_KEY;
+ public static byte[] DISPATCH_SEED;
+
+ public static byte[] ENCRYPT_KEY;
+ public static long ENCRYPT_SEED = Long.parseUnsignedLong("11468049314633205968");
+ public static byte[] ENCRYPT_SEED_BUFFER = new byte[0];
+
+ public static PrivateKey CUR_SIGNING_KEY;
+
+ public static Map EncryptionKeys = new HashMap<>();
+
+ public static void loadKeys() {
+ DISPATCH_KEY = FileUtils.readResource("/keys/dispatchKey.bin");
+ DISPATCH_SEED = FileUtils.readResource("/keys/dispatchSeed.bin");
+
+ ENCRYPT_KEY = FileUtils.readResource("/keys/secretKey.bin");
+ ENCRYPT_SEED_BUFFER = FileUtils.readResource("/keys/secretKeyBuffer.bin");
+
+ try {
+ CUR_SIGNING_KEY = KeyFactory.getInstance("RSA")
+ .generatePrivate(new PKCS8EncodedKeySpec(FileUtils.readResource("/keys/SigningKey.der")));
+
+ Pattern pattern = Pattern.compile("([0-9]*)_Pub\\.der");
+ for (Path path : FileUtils.getPathsFromResource("/keys/game_keys")) {
+ if (path.toString().endsWith("_Pub.der")) {
+
+ var m = pattern.matcher(path.getFileName().toString());
+
+ if (m.matches()) {
+ var key = KeyFactory.getInstance("RSA")
+ .generatePublic(new X509EncodedKeySpec(FileUtils.read(path)));
+
+ EncryptionKeys.put(Integer.valueOf(m.group(1)), key);
+ }
+ }
+ }
+ } catch (Exception e) {
+ Grasscutter.getLogger().error("An error occurred while loading keys.", e);
+ }
+ }
+
+ public static void xor(byte[] packet, byte[] key) {
+ try {
+ for (int i = 0; i < packet.length; i++) {
+ packet[i] ^= key[i % key.length];
+ }
+ } catch (Exception e) {
+ Grasscutter.getLogger().error("Crypto error.", e);
+ }
+ }
+
+ public static byte[] createSessionKey(int length) {
+ byte[] bytes = new byte[length];
+ secureRandom.nextBytes(bytes);
+ return bytes;
+ }
+
+ public static QueryCurRegionRspJson encryptAndSignRegionData(byte[] regionInfo, String key_id) throws Exception {
+ if (key_id == null) {
+ throw new Exception("Key ID was not set");
+ }
+
+ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+ cipher.init(Cipher.ENCRYPT_MODE, EncryptionKeys.get(Integer.valueOf(key_id)));
+
+ //Encrypt regionInfo in chunks
+ ByteArrayOutputStream encryptedRegionInfoStream = new ByteArrayOutputStream();
+
+ //Thank you so much GH Copilot
+ int chunkSize = 256 - 11;
+ int regionInfoLength = regionInfo.length;
+ int numChunks = (int) Math.ceil(regionInfoLength / (double) chunkSize);
+
+ for (int i = 0; i < numChunks; i++) {
+ byte[] chunk = Arrays.copyOfRange(regionInfo, i * chunkSize,
+ Math.min((i + 1) * chunkSize, regionInfoLength));
+ byte[] encryptedChunk = cipher.doFinal(chunk);
+ encryptedRegionInfoStream.write(encryptedChunk);
+ }
+
+ Signature privateSignature = Signature.getInstance("SHA256withRSA");
+ privateSignature.initSign(CUR_SIGNING_KEY);
+ privateSignature.update(regionInfo);
+
+ var rsp = new QueryCurRegionRspJson();
+
+ rsp.content = Utils.base64Encode(encryptedRegionInfoStream.toByteArray());
+ rsp.sign = Utils.base64Encode(privateSignature.sign());
+ return rsp;
+ }
+}