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