From 21ff749dcaf36f92ab4a39dcc59398c83245c8c9 Mon Sep 17 00:00:00 2001
From: Alexander Hartmann <hartmannaf@googlemail.com>
Date: Wed, 14 Sep 2022 12:27:16 +0200
Subject: [PATCH] Add support for propperly showing activity shops (#1774)

* Add support for propperly showing activity shops

* Update src/main/java/emu/grasscutter/data/excels/ActivityShopData.java

Co-authored-by: hartie95 <mail@hartie95.de>
---
 .../ActivityShopSheetInfoOuterClass.java      | 677 ++++++++++++
 ...GetActivityShopSheetInfoReqOuterClass.java | 537 ++++++++++
 ...GetActivityShopSheetInfoRspOuterClass.java | 986 ++++++++++++++++++
 .../java/emu/grasscutter/data/GameData.java   |   1 +
 .../data/excels/ActivityShopData.java         |  30 +
 .../data/excels/ShopGoodsData.java            |   4 +-
 .../game/activity/ActivityManager.java        |   3 +
 .../emu/grasscutter/game/shop/ShopType.java   | 107 ++
 .../HandlerGetActivityShopSheetInfoReq.java   |  19 +
 .../PacketGetActivityShopSheetInfoRsp.java    |  50 +
 10 files changed, 2413 insertions(+), 1 deletion(-)
 create mode 100644 src/generated/main/java/emu/grasscutter/net/proto/ActivityShopSheetInfoOuterClass.java
 create mode 100644 src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoReqOuterClass.java
 create mode 100644 src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoRspOuterClass.java
 create mode 100644 src/main/java/emu/grasscutter/data/excels/ActivityShopData.java
 create mode 100644 src/main/java/emu/grasscutter/game/shop/ShopType.java
 create mode 100644 src/main/java/emu/grasscutter/server/packet/recv/HandlerGetActivityShopSheetInfoReq.java
 create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketGetActivityShopSheetInfoRsp.java

diff --git a/src/generated/main/java/emu/grasscutter/net/proto/ActivityShopSheetInfoOuterClass.java b/src/generated/main/java/emu/grasscutter/net/proto/ActivityShopSheetInfoOuterClass.java
new file mode 100644
index 00000000..8e7ecc90
--- /dev/null
+++ b/src/generated/main/java/emu/grasscutter/net/proto/ActivityShopSheetInfoOuterClass.java
@@ -0,0 +1,677 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: ActivityShopSheetInfo.proto
+
+package emu.grasscutter.net.proto;
+
+public final class ActivityShopSheetInfoOuterClass {
+  private ActivityShopSheetInfoOuterClass() {}
+  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 ActivityShopSheetInfoOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:ActivityShopSheetInfo)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>uint32 end_time = 1;</code>
+     * @return The endTime.
+     */
+    int getEndTime();
+
+    /**
+     * <code>uint32 begin_time = 12;</code>
+     * @return The beginTime.
+     */
+    int getBeginTime();
+
+    /**
+     * <code>uint32 sheet_id = 2;</code>
+     * @return The sheetId.
+     */
+    int getSheetId();
+  }
+  /**
+   * Protobuf type {@code ActivityShopSheetInfo}
+   */
+  public static final class ActivityShopSheetInfo extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:ActivityShopSheetInfo)
+      ActivityShopSheetInfoOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use ActivityShopSheetInfo.newBuilder() to construct.
+    private ActivityShopSheetInfo(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private ActivityShopSheetInfo() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ActivityShopSheetInfo();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private ActivityShopSheetInfo(
+        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 8: {
+
+              endTime_ = input.readUInt32();
+              break;
+            }
+            case 16: {
+
+              sheetId_ = input.readUInt32();
+              break;
+            }
+            case 96: {
+
+              beginTime_ = 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.ActivityShopSheetInfoOuterClass.internal_static_ActivityShopSheetInfo_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.internal_static_ActivityShopSheetInfo_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.class, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder.class);
+    }
+
+    public static final int END_TIME_FIELD_NUMBER = 1;
+    private int endTime_;
+    /**
+     * <code>uint32 end_time = 1;</code>
+     * @return The endTime.
+     */
+    @java.lang.Override
+    public int getEndTime() {
+      return endTime_;
+    }
+
+    public static final int BEGIN_TIME_FIELD_NUMBER = 12;
+    private int beginTime_;
+    /**
+     * <code>uint32 begin_time = 12;</code>
+     * @return The beginTime.
+     */
+    @java.lang.Override
+    public int getBeginTime() {
+      return beginTime_;
+    }
+
+    public static final int SHEET_ID_FIELD_NUMBER = 2;
+    private int sheetId_;
+    /**
+     * <code>uint32 sheet_id = 2;</code>
+     * @return The sheetId.
+     */
+    @java.lang.Override
+    public int getSheetId() {
+      return sheetId_;
+    }
+
+    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 (endTime_ != 0) {
+        output.writeUInt32(1, endTime_);
+      }
+      if (sheetId_ != 0) {
+        output.writeUInt32(2, sheetId_);
+      }
+      if (beginTime_ != 0) {
+        output.writeUInt32(12, beginTime_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (endTime_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(1, endTime_);
+      }
+      if (sheetId_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(2, sheetId_);
+      }
+      if (beginTime_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(12, beginTime_);
+      }
+      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.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo)) {
+        return super.equals(obj);
+      }
+      emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo other = (emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo) obj;
+
+      if (getEndTime()
+          != other.getEndTime()) return false;
+      if (getBeginTime()
+          != other.getBeginTime()) return false;
+      if (getSheetId()
+          != other.getSheetId()) 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) + END_TIME_FIELD_NUMBER;
+      hash = (53 * hash) + getEndTime();
+      hash = (37 * hash) + BEGIN_TIME_FIELD_NUMBER;
+      hash = (53 * hash) + getBeginTime();
+      hash = (37 * hash) + SHEET_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getSheetId();
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo 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.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo 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.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo 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.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo 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.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo 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.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo 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 ActivityShopSheetInfo}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:ActivityShopSheetInfo)
+        emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfoOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.internal_static_ActivityShopSheetInfo_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.internal_static_ActivityShopSheetInfo_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.class, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder.class);
+      }
+
+      // Construct using emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.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();
+        endTime_ = 0;
+
+        beginTime_ = 0;
+
+        sheetId_ = 0;
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.internal_static_ActivityShopSheetInfo_descriptor;
+      }
+
+      @java.lang.Override
+      public emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo getDefaultInstanceForType() {
+        return emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo build() {
+        emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo buildPartial() {
+        emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo result = new emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo(this);
+        result.endTime_ = endTime_;
+        result.beginTime_ = beginTime_;
+        result.sheetId_ = sheetId_;
+        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.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo) {
+          return mergeFrom((emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo other) {
+        if (other == emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.getDefaultInstance()) return this;
+        if (other.getEndTime() != 0) {
+          setEndTime(other.getEndTime());
+        }
+        if (other.getBeginTime() != 0) {
+          setBeginTime(other.getBeginTime());
+        }
+        if (other.getSheetId() != 0) {
+          setSheetId(other.getSheetId());
+        }
+        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.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private int endTime_ ;
+      /**
+       * <code>uint32 end_time = 1;</code>
+       * @return The endTime.
+       */
+      @java.lang.Override
+      public int getEndTime() {
+        return endTime_;
+      }
+      /**
+       * <code>uint32 end_time = 1;</code>
+       * @param value The endTime to set.
+       * @return This builder for chaining.
+       */
+      public Builder setEndTime(int value) {
+        
+        endTime_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>uint32 end_time = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearEndTime() {
+        
+        endTime_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private int beginTime_ ;
+      /**
+       * <code>uint32 begin_time = 12;</code>
+       * @return The beginTime.
+       */
+      @java.lang.Override
+      public int getBeginTime() {
+        return beginTime_;
+      }
+      /**
+       * <code>uint32 begin_time = 12;</code>
+       * @param value The beginTime to set.
+       * @return This builder for chaining.
+       */
+      public Builder setBeginTime(int value) {
+        
+        beginTime_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>uint32 begin_time = 12;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearBeginTime() {
+        
+        beginTime_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private int sheetId_ ;
+      /**
+       * <code>uint32 sheet_id = 2;</code>
+       * @return The sheetId.
+       */
+      @java.lang.Override
+      public int getSheetId() {
+        return sheetId_;
+      }
+      /**
+       * <code>uint32 sheet_id = 2;</code>
+       * @param value The sheetId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setSheetId(int value) {
+        
+        sheetId_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>uint32 sheet_id = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearSheetId() {
+        
+        sheetId_ = 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:ActivityShopSheetInfo)
+    }
+
+    // @@protoc_insertion_point(class_scope:ActivityShopSheetInfo)
+    private static final emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo();
+    }
+
+    public static emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ActivityShopSheetInfo>
+        PARSER = new com.google.protobuf.AbstractParser<ActivityShopSheetInfo>() {
+      @java.lang.Override
+      public ActivityShopSheetInfo parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new ActivityShopSheetInfo(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<ActivityShopSheetInfo> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ActivityShopSheetInfo> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_ActivityShopSheetInfo_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_ActivityShopSheetInfo_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\033ActivityShopSheetInfo.proto\"O\n\025Activit" +
+      "yShopSheetInfo\022\020\n\010end_time\030\001 \001(\r\022\022\n\nbegi" +
+      "n_time\030\014 \001(\r\022\020\n\010sheet_id\030\002 \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_ActivityShopSheetInfo_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_ActivityShopSheetInfo_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_ActivityShopSheetInfo_descriptor,
+        new java.lang.String[] { "EndTime", "BeginTime", "SheetId", });
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoReqOuterClass.java b/src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoReqOuterClass.java
new file mode 100644
index 00000000..01f82578
--- /dev/null
+++ b/src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoReqOuterClass.java
@@ -0,0 +1,537 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: GetActivityShopSheetInfoReq.proto
+
+package emu.grasscutter.net.proto;
+
+public final class GetActivityShopSheetInfoReqOuterClass {
+  private GetActivityShopSheetInfoReqOuterClass() {}
+  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 GetActivityShopSheetInfoReqOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:GetActivityShopSheetInfoReq)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>uint32 shop_type = 7;</code>
+     * @return The shopType.
+     */
+    int getShopType();
+  }
+  /**
+   * Protobuf type {@code GetActivityShopSheetInfoReq}
+   */
+  public static final class GetActivityShopSheetInfoReq extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:GetActivityShopSheetInfoReq)
+      GetActivityShopSheetInfoReqOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use GetActivityShopSheetInfoReq.newBuilder() to construct.
+    private GetActivityShopSheetInfoReq(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private GetActivityShopSheetInfoReq() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new GetActivityShopSheetInfoReq();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private GetActivityShopSheetInfoReq(
+        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 56: {
+
+              shopType_ = 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.GetActivityShopSheetInfoReqOuterClass.internal_static_GetActivityShopSheetInfoReq_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.internal_static_GetActivityShopSheetInfoReq_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq.class, emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq.Builder.class);
+    }
+
+    public static final int SHOP_TYPE_FIELD_NUMBER = 7;
+    private int shopType_;
+    /**
+     * <code>uint32 shop_type = 7;</code>
+     * @return The shopType.
+     */
+    @java.lang.Override
+    public int getShopType() {
+      return shopType_;
+    }
+
+    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 (shopType_ != 0) {
+        output.writeUInt32(7, shopType_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (shopType_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(7, shopType_);
+      }
+      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.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq)) {
+        return super.equals(obj);
+      }
+      emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq other = (emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq) obj;
+
+      if (getShopType()
+          != other.getShopType()) 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) + SHOP_TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + getShopType();
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq 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.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq 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.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq 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.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq 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.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq 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.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq 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 GetActivityShopSheetInfoReq}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:GetActivityShopSheetInfoReq)
+        emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReqOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.internal_static_GetActivityShopSheetInfoReq_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.internal_static_GetActivityShopSheetInfoReq_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq.class, emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq.Builder.class);
+      }
+
+      // Construct using emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq.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();
+        shopType_ = 0;
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.internal_static_GetActivityShopSheetInfoReq_descriptor;
+      }
+
+      @java.lang.Override
+      public emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq getDefaultInstanceForType() {
+        return emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq build() {
+        emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq buildPartial() {
+        emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq result = new emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq(this);
+        result.shopType_ = shopType_;
+        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.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq) {
+          return mergeFrom((emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq other) {
+        if (other == emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq.getDefaultInstance()) return this;
+        if (other.getShopType() != 0) {
+          setShopType(other.getShopType());
+        }
+        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.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private int shopType_ ;
+      /**
+       * <code>uint32 shop_type = 7;</code>
+       * @return The shopType.
+       */
+      @java.lang.Override
+      public int getShopType() {
+        return shopType_;
+      }
+      /**
+       * <code>uint32 shop_type = 7;</code>
+       * @param value The shopType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setShopType(int value) {
+        
+        shopType_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>uint32 shop_type = 7;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearShopType() {
+        
+        shopType_ = 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:GetActivityShopSheetInfoReq)
+    }
+
+    // @@protoc_insertion_point(class_scope:GetActivityShopSheetInfoReq)
+    private static final emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq();
+    }
+
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<GetActivityShopSheetInfoReq>
+        PARSER = new com.google.protobuf.AbstractParser<GetActivityShopSheetInfoReq>() {
+      @java.lang.Override
+      public GetActivityShopSheetInfoReq parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new GetActivityShopSheetInfoReq(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<GetActivityShopSheetInfoReq> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<GetActivityShopSheetInfoReq> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public emu.grasscutter.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetActivityShopSheetInfoReq_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetActivityShopSheetInfoReq_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!GetActivityShopSheetInfoReq.proto\"0\n\033G" +
+      "etActivityShopSheetInfoReq\022\021\n\tshop_type\030" +
+      "\007 \001(\rB\033\n\031emu.grasscutter.net.protob\006prot" +
+      "o3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        });
+    internal_static_GetActivityShopSheetInfoReq_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_GetActivityShopSheetInfoReq_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetActivityShopSheetInfoReq_descriptor,
+        new java.lang.String[] { "ShopType", });
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoRspOuterClass.java b/src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoRspOuterClass.java
new file mode 100644
index 00000000..99553c99
--- /dev/null
+++ b/src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoRspOuterClass.java
@@ -0,0 +1,986 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: GetActivityShopSheetInfoRsp.proto
+
+package emu.grasscutter.net.proto;
+
+public final class GetActivityShopSheetInfoRspOuterClass {
+  private GetActivityShopSheetInfoRspOuterClass() {}
+  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 GetActivityShopSheetInfoRspOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:GetActivityShopSheetInfoRsp)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+     */
+    java.util.List<emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo> 
+        getSheetInfoListList();
+    /**
+     * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+     */
+    emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo getSheetInfoList(int index);
+    /**
+     * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+     */
+    int getSheetInfoListCount();
+    /**
+     * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+     */
+    java.util.List<? extends emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfoOrBuilder> 
+        getSheetInfoListOrBuilderList();
+    /**
+     * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+     */
+    emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfoOrBuilder getSheetInfoListOrBuilder(
+        int index);
+
+    /**
+     * <code>uint32 shop_type = 8;</code>
+     * @return The shopType.
+     */
+    int getShopType();
+
+    /**
+     * <code>int32 retcode = 13;</code>
+     * @return The retcode.
+     */
+    int getRetcode();
+  }
+  /**
+   * Protobuf type {@code GetActivityShopSheetInfoRsp}
+   */
+  public static final class GetActivityShopSheetInfoRsp extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:GetActivityShopSheetInfoRsp)
+      GetActivityShopSheetInfoRspOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use GetActivityShopSheetInfoRsp.newBuilder() to construct.
+    private GetActivityShopSheetInfoRsp(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private GetActivityShopSheetInfoRsp() {
+      sheetInfoList_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new GetActivityShopSheetInfoRsp();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private GetActivityShopSheetInfoRsp(
+        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 50: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                sheetInfoList_ = new java.util.ArrayList<emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              sheetInfoList_.add(
+                  input.readMessage(emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.parser(), extensionRegistry));
+              break;
+            }
+            case 64: {
+
+              shopType_ = input.readUInt32();
+              break;
+            }
+            case 104: {
+
+              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 {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          sheetInfoList_ = java.util.Collections.unmodifiableList(sheetInfoList_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.internal_static_GetActivityShopSheetInfoRsp_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.internal_static_GetActivityShopSheetInfoRsp_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp.class, emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp.Builder.class);
+    }
+
+    public static final int SHEET_INFO_LIST_FIELD_NUMBER = 6;
+    private java.util.List<emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo> sheetInfoList_;
+    /**
+     * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+     */
+    @java.lang.Override
+    public java.util.List<emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo> getSheetInfoListList() {
+      return sheetInfoList_;
+    }
+    /**
+     * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfoOrBuilder> 
+        getSheetInfoListOrBuilderList() {
+      return sheetInfoList_;
+    }
+    /**
+     * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+     */
+    @java.lang.Override
+    public int getSheetInfoListCount() {
+      return sheetInfoList_.size();
+    }
+    /**
+     * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+     */
+    @java.lang.Override
+    public emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo getSheetInfoList(int index) {
+      return sheetInfoList_.get(index);
+    }
+    /**
+     * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+     */
+    @java.lang.Override
+    public emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfoOrBuilder getSheetInfoListOrBuilder(
+        int index) {
+      return sheetInfoList_.get(index);
+    }
+
+    public static final int SHOP_TYPE_FIELD_NUMBER = 8;
+    private int shopType_;
+    /**
+     * <code>uint32 shop_type = 8;</code>
+     * @return The shopType.
+     */
+    @java.lang.Override
+    public int getShopType() {
+      return shopType_;
+    }
+
+    public static final int RETCODE_FIELD_NUMBER = 13;
+    private int retcode_;
+    /**
+     * <code>int32 retcode = 13;</code>
+     * @return The retcode.
+     */
+    @java.lang.Override
+    public int getRetcode() {
+      return retcode_;
+    }
+
+    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 {
+      for (int i = 0; i < sheetInfoList_.size(); i++) {
+        output.writeMessage(6, sheetInfoList_.get(i));
+      }
+      if (shopType_ != 0) {
+        output.writeUInt32(8, shopType_);
+      }
+      if (retcode_ != 0) {
+        output.writeInt32(13, retcode_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < sheetInfoList_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(6, sheetInfoList_.get(i));
+      }
+      if (shopType_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(8, shopType_);
+      }
+      if (retcode_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(13, 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.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp)) {
+        return super.equals(obj);
+      }
+      emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp other = (emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp) obj;
+
+      if (!getSheetInfoListList()
+          .equals(other.getSheetInfoListList())) return false;
+      if (getShopType()
+          != other.getShopType()) return false;
+      if (getRetcode()
+          != other.getRetcode()) 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();
+      if (getSheetInfoListCount() > 0) {
+        hash = (37 * hash) + SHEET_INFO_LIST_FIELD_NUMBER;
+        hash = (53 * hash) + getSheetInfoListList().hashCode();
+      }
+      hash = (37 * hash) + SHOP_TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + getShopType();
+      hash = (37 * hash) + RETCODE_FIELD_NUMBER;
+      hash = (53 * hash) + getRetcode();
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp 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.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp 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.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp 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.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp 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.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp 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.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp 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 GetActivityShopSheetInfoRsp}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:GetActivityShopSheetInfoRsp)
+        emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRspOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.internal_static_GetActivityShopSheetInfoRsp_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.internal_static_GetActivityShopSheetInfoRsp_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp.class, emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp.Builder.class);
+      }
+
+      // Construct using emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getSheetInfoListFieldBuilder();
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (sheetInfoListBuilder_ == null) {
+          sheetInfoList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          sheetInfoListBuilder_.clear();
+        }
+        shopType_ = 0;
+
+        retcode_ = 0;
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.internal_static_GetActivityShopSheetInfoRsp_descriptor;
+      }
+
+      @java.lang.Override
+      public emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp getDefaultInstanceForType() {
+        return emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp build() {
+        emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp buildPartial() {
+        emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp result = new emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp(this);
+        int from_bitField0_ = bitField0_;
+        if (sheetInfoListBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            sheetInfoList_ = java.util.Collections.unmodifiableList(sheetInfoList_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.sheetInfoList_ = sheetInfoList_;
+        } else {
+          result.sheetInfoList_ = sheetInfoListBuilder_.build();
+        }
+        result.shopType_ = shopType_;
+        result.retcode_ = retcode_;
+        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.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp) {
+          return mergeFrom((emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp other) {
+        if (other == emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp.getDefaultInstance()) return this;
+        if (sheetInfoListBuilder_ == null) {
+          if (!other.sheetInfoList_.isEmpty()) {
+            if (sheetInfoList_.isEmpty()) {
+              sheetInfoList_ = other.sheetInfoList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureSheetInfoListIsMutable();
+              sheetInfoList_.addAll(other.sheetInfoList_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.sheetInfoList_.isEmpty()) {
+            if (sheetInfoListBuilder_.isEmpty()) {
+              sheetInfoListBuilder_.dispose();
+              sheetInfoListBuilder_ = null;
+              sheetInfoList_ = other.sheetInfoList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              sheetInfoListBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getSheetInfoListFieldBuilder() : null;
+            } else {
+              sheetInfoListBuilder_.addAllMessages(other.sheetInfoList_);
+            }
+          }
+        }
+        if (other.getShopType() != 0) {
+          setShopType(other.getShopType());
+        }
+        if (other.getRetcode() != 0) {
+          setRetcode(other.getRetcode());
+        }
+        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.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private java.util.List<emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo> sheetInfoList_ =
+        java.util.Collections.emptyList();
+      private void ensureSheetInfoListIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          sheetInfoList_ = new java.util.ArrayList<emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo>(sheetInfoList_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfoOrBuilder> sheetInfoListBuilder_;
+
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public java.util.List<emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo> getSheetInfoListList() {
+        if (sheetInfoListBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(sheetInfoList_);
+        } else {
+          return sheetInfoListBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public int getSheetInfoListCount() {
+        if (sheetInfoListBuilder_ == null) {
+          return sheetInfoList_.size();
+        } else {
+          return sheetInfoListBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo getSheetInfoList(int index) {
+        if (sheetInfoListBuilder_ == null) {
+          return sheetInfoList_.get(index);
+        } else {
+          return sheetInfoListBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public Builder setSheetInfoList(
+          int index, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo value) {
+        if (sheetInfoListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSheetInfoListIsMutable();
+          sheetInfoList_.set(index, value);
+          onChanged();
+        } else {
+          sheetInfoListBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public Builder setSheetInfoList(
+          int index, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder builderForValue) {
+        if (sheetInfoListBuilder_ == null) {
+          ensureSheetInfoListIsMutable();
+          sheetInfoList_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          sheetInfoListBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public Builder addSheetInfoList(emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo value) {
+        if (sheetInfoListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSheetInfoListIsMutable();
+          sheetInfoList_.add(value);
+          onChanged();
+        } else {
+          sheetInfoListBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public Builder addSheetInfoList(
+          int index, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo value) {
+        if (sheetInfoListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSheetInfoListIsMutable();
+          sheetInfoList_.add(index, value);
+          onChanged();
+        } else {
+          sheetInfoListBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public Builder addSheetInfoList(
+          emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder builderForValue) {
+        if (sheetInfoListBuilder_ == null) {
+          ensureSheetInfoListIsMutable();
+          sheetInfoList_.add(builderForValue.build());
+          onChanged();
+        } else {
+          sheetInfoListBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public Builder addSheetInfoList(
+          int index, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder builderForValue) {
+        if (sheetInfoListBuilder_ == null) {
+          ensureSheetInfoListIsMutable();
+          sheetInfoList_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          sheetInfoListBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public Builder addAllSheetInfoList(
+          java.lang.Iterable<? extends emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo> values) {
+        if (sheetInfoListBuilder_ == null) {
+          ensureSheetInfoListIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, sheetInfoList_);
+          onChanged();
+        } else {
+          sheetInfoListBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public Builder clearSheetInfoList() {
+        if (sheetInfoListBuilder_ == null) {
+          sheetInfoList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          sheetInfoListBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public Builder removeSheetInfoList(int index) {
+        if (sheetInfoListBuilder_ == null) {
+          ensureSheetInfoListIsMutable();
+          sheetInfoList_.remove(index);
+          onChanged();
+        } else {
+          sheetInfoListBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder getSheetInfoListBuilder(
+          int index) {
+        return getSheetInfoListFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfoOrBuilder getSheetInfoListOrBuilder(
+          int index) {
+        if (sheetInfoListBuilder_ == null) {
+          return sheetInfoList_.get(index);  } else {
+          return sheetInfoListBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public java.util.List<? extends emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfoOrBuilder> 
+           getSheetInfoListOrBuilderList() {
+        if (sheetInfoListBuilder_ != null) {
+          return sheetInfoListBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(sheetInfoList_);
+        }
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder addSheetInfoListBuilder() {
+        return getSheetInfoListFieldBuilder().addBuilder(
+            emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder addSheetInfoListBuilder(
+          int index) {
+        return getSheetInfoListFieldBuilder().addBuilder(
+            index, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .ActivityShopSheetInfo sheet_info_list = 6;</code>
+       */
+      public java.util.List<emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder> 
+           getSheetInfoListBuilderList() {
+        return getSheetInfoListFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfoOrBuilder> 
+          getSheetInfoListFieldBuilder() {
+        if (sheetInfoListBuilder_ == null) {
+          sheetInfoListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo.Builder, emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfoOrBuilder>(
+                  sheetInfoList_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          sheetInfoList_ = null;
+        }
+        return sheetInfoListBuilder_;
+      }
+
+      private int shopType_ ;
+      /**
+       * <code>uint32 shop_type = 8;</code>
+       * @return The shopType.
+       */
+      @java.lang.Override
+      public int getShopType() {
+        return shopType_;
+      }
+      /**
+       * <code>uint32 shop_type = 8;</code>
+       * @param value The shopType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setShopType(int value) {
+        
+        shopType_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>uint32 shop_type = 8;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearShopType() {
+        
+        shopType_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private int retcode_ ;
+      /**
+       * <code>int32 retcode = 13;</code>
+       * @return The retcode.
+       */
+      @java.lang.Override
+      public int getRetcode() {
+        return retcode_;
+      }
+      /**
+       * <code>int32 retcode = 13;</code>
+       * @param value The retcode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setRetcode(int value) {
+        
+        retcode_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>int32 retcode = 13;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearRetcode() {
+        
+        retcode_ = 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:GetActivityShopSheetInfoRsp)
+    }
+
+    // @@protoc_insertion_point(class_scope:GetActivityShopSheetInfoRsp)
+    private static final emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp();
+    }
+
+    public static emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<GetActivityShopSheetInfoRsp>
+        PARSER = new com.google.protobuf.AbstractParser<GetActivityShopSheetInfoRsp>() {
+      @java.lang.Override
+      public GetActivityShopSheetInfoRsp parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new GetActivityShopSheetInfoRsp(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<GetActivityShopSheetInfoRsp> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<GetActivityShopSheetInfoRsp> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetActivityShopSheetInfoRsp_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetActivityShopSheetInfoRsp_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!GetActivityShopSheetInfoRsp.proto\032\033Act" +
+      "ivityShopSheetInfo.proto\"r\n\033GetActivityS" +
+      "hopSheetInfoRsp\022/\n\017sheet_info_list\030\006 \003(\013" +
+      "2\026.ActivityShopSheetInfo\022\021\n\tshop_type\030\010 " +
+      "\001(\r\022\017\n\007retcode\030\r \001(\005B\033\n\031emu.grasscutter." +
+      "net.protob\006proto3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+          emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.getDescriptor(),
+        });
+    internal_static_GetActivityShopSheetInfoRsp_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_GetActivityShopSheetInfoRsp_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetActivityShopSheetInfoRsp_descriptor,
+        new java.lang.String[] { "SheetInfoList", "ShopType", "Retcode", });
+    emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.getDescriptor();
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/main/java/emu/grasscutter/data/GameData.java b/src/main/java/emu/grasscutter/data/GameData.java
index 26140884..67b688e2 100644
--- a/src/main/java/emu/grasscutter/data/GameData.java
+++ b/src/main/java/emu/grasscutter/data/GameData.java
@@ -106,6 +106,7 @@ public class GameData {
     private static final Int2ObjectMap<CookBonusData> cookBonusDataMap = new Int2ObjectOpenHashMap<>();
 
     @Getter private static final Int2ObjectMap<ActivityData> activityDataMap = new Int2ObjectOpenHashMap<>();
+    @Getter private static final Int2ObjectMap<ActivityShopData> activityShopDataMap = new Int2ObjectOpenHashMap<>();
     @Getter private static final Int2ObjectMap<ActivityWatcherData> activityWatcherDataMap = new Int2ObjectOpenHashMap<>();
     @Getter private static final Int2ObjectMap<MusicGameBasicData> musicGameBasicDataMap = new Int2ObjectOpenHashMap<>();
     @Getter private static final Int2ObjectMap<PersonalLineData> personalLineDataMap = new Int2ObjectOpenHashMap<>();
diff --git a/src/main/java/emu/grasscutter/data/excels/ActivityShopData.java b/src/main/java/emu/grasscutter/data/excels/ActivityShopData.java
new file mode 100644
index 00000000..bf0f3db3
--- /dev/null
+++ b/src/main/java/emu/grasscutter/data/excels/ActivityShopData.java
@@ -0,0 +1,30 @@
+package emu.grasscutter.data.excels;
+
+import emu.grasscutter.data.GameResource;
+import emu.grasscutter.data.ResourceType;
+import emu.grasscutter.game.shop.ShopType;
+import lombok.Getter;
+
+import java.util.List;
+
+@ResourceType(name = "ActivityShopOverallExcelConfigData.json")
+public class ActivityShopData extends GameResource {
+    @Getter
+    private int scheduleId;
+    @Getter
+    private ShopType shopType;
+    @Getter
+    private List<Integer> sheetList;
+
+
+    @Override
+    public int getId() {
+        return getShopTypeId();
+    }
+
+    public int getShopTypeId() {
+        if (this.shopType == null)
+            this.shopType = ShopType.SHOP_TYPE_NONE;
+        return shopType.shopTypeId;
+    }
+}
diff --git a/src/main/java/emu/grasscutter/data/excels/ShopGoodsData.java b/src/main/java/emu/grasscutter/data/excels/ShopGoodsData.java
index 4c0a14b5..0bb17141 100644
--- a/src/main/java/emu/grasscutter/data/excels/ShopGoodsData.java
+++ b/src/main/java/emu/grasscutter/data/excels/ShopGoodsData.java
@@ -1,5 +1,6 @@
 package emu.grasscutter.data.excels;
 
+import com.google.gson.annotations.SerializedName;
 import emu.grasscutter.data.GameResource;
 import emu.grasscutter.data.ResourceType;
 import emu.grasscutter.data.common.ItemParamData;
@@ -24,11 +25,12 @@ public class ShopGoodsData extends GameResource {
     private int maxPlayerLevel;
 
     private int buyLimit;
+    @SerializedName(value="subTabId", alternate={"secondarySheetId"})
     private int subTabId;
 
     private String refreshType;
     private transient ShopInfo.ShopRefreshType refreshTypeEnum;
-    
+
     private int refreshParam;
 
     @Override
diff --git a/src/main/java/emu/grasscutter/game/activity/ActivityManager.java b/src/main/java/emu/grasscutter/game/activity/ActivityManager.java
index a859d848..0e680be2 100644
--- a/src/main/java/emu/grasscutter/game/activity/ActivityManager.java
+++ b/src/main/java/emu/grasscutter/game/activity/ActivityManager.java
@@ -19,10 +19,12 @@ import java.util.concurrent.ConcurrentHashMap;
 @Getter
 public class ActivityManager extends BasePlayerManager {
     private static final Map<Integer, ActivityConfigItem> activityConfigItemMap;
+    @Getter private static final Map<Integer, ActivityConfigItem> scheduleActivityConfigMap;
     private final Map<Integer, PlayerActivityData> playerActivityDataMap;
 
     static {
         activityConfigItemMap = new HashMap<>();
+        scheduleActivityConfigMap = new HashMap<>();
         loadActivityConfigData();
     }
 
@@ -61,6 +63,7 @@ public class ActivityManager extends BasePlayerManager {
                 item.setActivityHandler(activityHandler);
 
                 activityConfigItemMap.putIfAbsent(item.getActivityId(), item);
+                scheduleActivityConfigMap.putIfAbsent(item.getScheduleId(), item);
             });
 
             Grasscutter.getLogger().info("Enable {} activities.", activityConfigItemMap.size());
diff --git a/src/main/java/emu/grasscutter/game/shop/ShopType.java b/src/main/java/emu/grasscutter/game/shop/ShopType.java
new file mode 100644
index 00000000..7a314d4d
--- /dev/null
+++ b/src/main/java/emu/grasscutter/game/shop/ShopType.java
@@ -0,0 +1,107 @@
+package emu.grasscutter.game.shop;
+
+/**
+ * ShopTypes 0-1010 based on `ActivityShopOverallExcelConfigData.json`
+ * ShopTypes for activities are partially guessed on the version, and partially tested
+ * ShopTypes 1011-1070 are mostly based of `BinOutput/InterAction/Shop`
+ */
+public enum ShopType {
+    SHOP_TYPE_NONE(0),
+    SHOP_TYPE_PAIMON(900),
+    SHOP_TYPE_PACKAGE(902),
+    SHOP_TYPE_MCOIN(903),
+    SHOP_TYPE_RECOMMEND(1001),
+    SHOP_TYPE_CITY(1002),
+    SHOP_TYPE_BLACKSMITH(1003),
+    SHOP_TYPE_GROCERY(1004),
+    SHOP_TYPE_FOOD(1005),
+    SHOP_TYPE_SEA_LAMP(1006),
+    SHOP_TYPE_VIRTUAL_SHOP(1007),
+    SHOP_TYPE_LIYUE_GROCERY(1008),
+    SHOP_TYPE_LIYUE_SOUVENIR(1009),
+    SHOP_TYPE_LIYUE_RESTAURANT(1010),
+    SHOP_TYPE_NPC_Flora(1011),
+    SHOP_TYPE_NPC_Charles(1012),
+    SHOP_TYPE_NPC_Shiliu(1013),
+    SHOP_TYPE_NPC_Schulz(1014),
+    SHOP_TYPE_NPC_Brook(1015),
+    SHOP_TYPE_NPC_Hopkins(1016),
+    SHOP_TYPE_NPC_Draff(1017),
+    SHOP_TYPE_NPC_Chloris(1018),
+    SHOP_TYPE_NPC_Licai(1019),
+    SHOP_TYPE_NPC_Yueshu(1020),
+    SHOP_TYPE_NPC_Gui(1021),
+    SHOP_TYPE_NPC_Gao(1022),
+    SHOP_TYPE_NPC_Sun(1023),
+    SHOP_TYPE_NPC_Qiming(1024),
+    SHOP_TYPE_NPC_Zhangshun(1025),
+    SHOP_TYPE_NPC_Chen(1026),
+    SHOP_TYPE_NPC_ErNiang(1027),
+    SHOP_TYPE_NPC_Shitou(1028),
+    SHOP_TYPE_NPC_Jifang(1029),
+    SHOP_TYPE_NPC_Zhu(1030),
+    SHOP_TYPE_NPC_Bai(1031),
+    SHOP_TYPE_NPC_Kai(1032),
+    SHOP_TYPE_NPC_Linglang(1033),
+    SHOP_TYPE_NPC_VerrGoldet(1034),
+    SHOP_TYPE_NPC_Zhou(1035),
+    SHOP_TYPE_TASK_Ekaterina(1036),
+    SHOP_TYPE_ACTIVITY_ASTER(1037),
+    SHOP_TYPE_TASK_Tartaglia(1038),
+    SHOP_TYPE_NPC_Harris(1039),
+    SHOP_TYPE_ACTIVITY_DRAGON_SPINE(1040),
+    SHOP_TYPE_ACTIVITY_TREASURE_MAP(1041),
+    SHOP_TYPE_NPC_Yinian(1042),
+    SHOP_TYPE_ACTIVITY_SEA_LAMP(1043), //event guess
+    SHOP_TYPE_ACTIVITY_FLEUR_FAIR(1044),
+    SHOP_TYPE_NPC_Changshun(1045),
+    SHOP_TYPE_NPC_Bolai(1046),
+    SHOP_TYPE_NPC_Ashanpo(1047),
+    SHOP_TYPE_HOME(1048),
+    SHOP_TYPE_HOME_LIMIT(1049),
+    SHOP_TYPE_NPC_MasterLu(1050),
+    SHOP_TYPE_NPC_Goth(1051),
+    SHOP_TYPE_COSTUME(1052),
+    SHOP_TYPE_NPC_Obata(1053),
+    SHOP_TYPE_NPC_Qiuyue(1054),
+    SHOP_TYPE_NPC_Ryouko(1055),
+    SHOP_TYPE_INAZUMA_GROCERY(1056),
+    SHOP_TYPE_INAZUMA_SOUVENIR(1057),
+    SHOP_TYPE_INAZUMA_RESTAURANT(1058),
+    SHOP_TYPE_NPC_Kuroda(1059),
+    SHOP_TYPE_NPC_KiminamiAnna(1060),
+    SHOP_TYPE_NPC_Tomoki(1061),
+    SHOP_TYPE_NPC_Karpillia(1062),
+    SHOP_TYPE_BLACKSMITH_INAZUMA(1063),
+    SHOP_TYPE_FISH(1064),
+    SHOP_TYPE_FISH_LIYUE(1065),
+    SHOP_TYPE_FISH_INAZUMA(1066),
+    SHOP_TYPE_NPC_Kiyoko(1067),
+    SHOP_TYPE_EXPIRED_WIDGET_MENGDE(1068),
+    SHOP_TYPE_CAPTURE_ANIMAL_SHOP(1069),
+    SHOP_TYPE_NPC_YamashiroKenta(1070),
+    SHOP_TYPE_ACTIVITY_CHANNELLER_SLAB(15001), //prob
+    SHOP_TYPE_ACTIVITY_SUMMER_TIME(16001),
+    SHOP_TYPE_ACTIVITY_BOUNCE_CONJURING(16002),
+    SHOP_TYPE_ACTIVITY_BLITZ_RUSH(20001),// guess
+    SHOP_TYPE_ACTIVITY_CHESS(20002),// guess
+    SHOP_TYPE_ACTIVITY_WINTER_CAMP(20004),
+    SHOP_TYPE_ACTIVITY_LANTERN_RITE(20005),// guess
+    SHOP_TYPE_ACTIVITY_ROGUELIKE_DUNGEON(22001),// guess
+    SHOP_TYPE_ACTIVITY_ROGUE_DIARY(27001),// guess
+    SHOP_TYPE_ACTIVITY_SUMMER_TIME_V2(28001), // guess
+    SHOP_TYPE_ACTIVITY_GRAVEN_INNOCENCE(30001); // guess
+
+    public final int shopTypeId;
+
+    ShopType(int shopTypeId) {
+        this.shopTypeId = shopTypeId;
+    }
+
+    public static ShopType getById(int shopTypeId) {
+        for (ShopType type : ShopType.values()) {
+            if (type.shopTypeId == shopTypeId) return type;
+        }
+        return SHOP_TYPE_NONE;
+    }
+}
diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetActivityShopSheetInfoReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetActivityShopSheetInfoReq.java
new file mode 100644
index 00000000..858660fd
--- /dev/null
+++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetActivityShopSheetInfoReq.java
@@ -0,0 +1,19 @@
+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.net.proto.GetActivityShopSheetInfoReqOuterClass.GetActivityShopSheetInfoReq;
+import emu.grasscutter.server.game.GameSession;
+import emu.grasscutter.server.packet.send.PacketGetActivityShopSheetInfoRsp;
+
+@Opcodes(PacketOpcodes.GetActivityShopSheetInfoReq)
+public class HandlerGetActivityShopSheetInfoReq extends PacketHandler {
+
+    @Override
+    public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
+        GetActivityShopSheetInfoReq req = GetActivityShopSheetInfoReq.parseFrom(payload);
+        session.getPlayer().sendPacket(new PacketGetActivityShopSheetInfoRsp(req.getShopType()));
+    }
+
+}
diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketGetActivityShopSheetInfoRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketGetActivityShopSheetInfoRsp.java
new file mode 100644
index 00000000..e4c67a07
--- /dev/null
+++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetActivityShopSheetInfoRsp.java
@@ -0,0 +1,50 @@
+package emu.grasscutter.server.packet.send;
+
+import emu.grasscutter.data.GameData;
+import emu.grasscutter.game.activity.ActivityConfigItem;
+import emu.grasscutter.game.activity.ActivityManager;
+import emu.grasscutter.net.packet.BasePacket;
+import emu.grasscutter.net.packet.PacketOpcodes;
+import emu.grasscutter.net.proto.ActivityShopSheetInfoOuterClass.ActivityShopSheetInfo;
+import emu.grasscutter.net.proto.GetActivityShopSheetInfoRspOuterClass.GetActivityShopSheetInfoRsp;
+import emu.grasscutter.net.proto.RetcodeOuterClass;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PacketGetActivityShopSheetInfoRsp extends BasePacket {
+
+
+    public PacketGetActivityShopSheetInfoRsp(int shopType) {
+        super(PacketOpcodes.GetActivityShopSheetInfoRsp);
+
+        var sheetInfo = GameData.getActivityShopDataMap().get(shopType);
+        ActivityConfigItem activityConfigItem = null;
+
+        if (sheetInfo != null) {
+            activityConfigItem = ActivityManager.getScheduleActivityConfigMap().get(sheetInfo.getScheduleId());
+        }
+
+        if (sheetInfo == null || activityConfigItem == null) {
+            setData(GetActivityShopSheetInfoRsp.newBuilder()
+                .setShopType(shopType)
+                .setRetcode(RetcodeOuterClass.Retcode.RET_SHOP_NOT_OPEN_VALUE)
+                .build());
+            return;
+        }
+
+        List<ActivityShopSheetInfo> sheetInfos = new ArrayList<>(sheetInfo.getSheetList().size());
+        for (int id : sheetInfo.getSheetList()) {
+            sheetInfos.add(ActivityShopSheetInfo.newBuilder()
+                .setSheetId(id)
+                .setBeginTime((int) activityConfigItem.getBeginTime().getTime())
+                .setEndTime((int) activityConfigItem.getEndTime().getTime())
+                .build());
+        }
+
+        setData(GetActivityShopSheetInfoRsp.newBuilder()
+            .setShopType(shopType)
+            .addAllSheetInfoList(sheetInfos)
+            .build());
+    }
+}
-- 
GitLab