Unverified Commit 21ff749d authored by Alexander Hartmann's avatar Alexander Hartmann Committed by GitHub
Browse files

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: default avatarhartie95 <mail@hartie95.de>
parent 070edd26
......@@ -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<>();
......
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;
}
}
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());
......
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;
}
}
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()));
}
}
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());
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment