mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-14 16:04:40 +01:00
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>
This commit is contained in:
committed by
GitHub
parent
070edd263a
commit
21ff749dca
@@ -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<>();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
|
||||
107
src/main/java/emu/grasscutter/game/shop/ShopType.java
Normal file
107
src/main/java/emu/grasscutter/game/shop/ShopType.java
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user