package emu.grasscutter.game.props.ItemUseAction; import emu.grasscutter.data.common.ItemUseData; import emu.grasscutter.game.props.ItemUseOp; public class ItemUseAction { public ItemUseOp getItemUseOp() { return ItemUseOp.ITEM_USE_NONE; } public static ItemUseAction fromItemUseData(ItemUseData data) { var useParam = data.getUseParam(); return switch (data.getUseOp()) { case ITEM_USE_NONE -> null; // Uprade materials - no direct usage case ITEM_USE_ADD_EXP -> new ItemUseAddExp(useParam); case ITEM_USE_ADD_RELIQUARY_EXP -> new ItemUseAddReliquaryExp(useParam); case ITEM_USE_ADD_WEAPON_EXP -> new ItemUseAddWeaponExp(useParam); // Energy pickups case ITEM_USE_ADD_ALL_ENERGY -> new ItemUseAddAllEnergy(useParam); case ITEM_USE_ADD_ELEM_ENERGY -> new ItemUseAddElemEnergy(useParam); // Give items case ITEM_USE_ADD_ITEM -> new ItemUseAddItem(useParam); case ITEM_USE_GAIN_AVATAR -> new ItemUseGainAvatar(useParam); case ITEM_USE_GAIN_COSTUME -> new ItemUseGainCostume(useParam); // TODO - real success/fail case ITEM_USE_GAIN_FLYCLOAK -> new ItemUseGainFlycloak(useParam); // TODO - real success/fail case ITEM_USE_GAIN_NAME_CARD -> new ItemUseGainNameCard(useParam); case ITEM_USE_CHEST_SELECT_ITEM -> new ItemUseChestSelectItem(useParam); case ITEM_USE_ADD_SELECT_ITEM -> new ItemUseAddSelectItem(useParam); case ITEM_USE_GRANT_SELECT_REWARD -> new ItemUseGrantSelectReward(useParam); case ITEM_USE_COMBINE_ITEM -> new ItemUseCombineItem(useParam); case ITEM_USE_OPEN_RANDOM_CHEST -> new ItemUseOpenRandomChest(useParam); // Food effects case ITEM_USE_RELIVE_AVATAR -> new ItemUseReliveAvatar(useParam); // First action for revival food. Should we worry about race conditions in parallel streams? case ITEM_USE_ADD_CUR_HP -> new ItemUseAddCurHp(useParam); case ITEM_USE_ADD_CUR_STAMINA -> new ItemUseAddCurStamina(useParam); case ITEM_USE_ADD_SERVER_BUFF -> new ItemUseAddServerBuff(useParam); case ITEM_USE_MAKE_GADGET -> new ItemUseMakeGadget(useParam); // Unlock recipes - TODO: allow scheduling packets for after recipe is removed case ITEM_USE_UNLOCK_COMBINE -> new ItemUseUnlockCombine(useParam); case ITEM_USE_UNLOCK_CODEX -> new ItemUseUnlockCodex(useParam); // TODO: No backend for this yet case ITEM_USE_UNLOCK_COOK_RECIPE -> new ItemUseUnlockCookRecipe(useParam); case ITEM_USE_UNLOCK_FORGE -> new ItemUseUnlockForge(useParam); case ITEM_USE_UNLOCK_FURNITURE_FORMULA -> new ItemUseUnlockFurnitureFormula(useParam); case ITEM_USE_UNLOCK_FURNITURE_SUITE -> new ItemUseUnlockFurnitureSuite(useParam); case ITEM_USE_UNLOCK_HOME_MODULE -> new ItemUseUnlockHomeModule(useParam); // No backend for this yet case ITEM_USE_UNLOCK_HOME_BGM -> new ItemUseUnlockHomeBgm(useParam); // Account things case ITEM_USE_ACCEPT_QUEST -> new ItemUseAcceptQuest(useParam); case ITEM_USE_GAIN_CARD_PRODUCT -> new ItemUseGainCardProduct(useParam); case ITEM_USE_UNLOCK_PAID_BATTLE_PASS_NORMAL -> new ItemUseUnlockPaidBattlePassNormal(useParam); // TODO: add paid BP // Unused in current resources case ITEM_USE_DEL_SERVER_BUFF -> null; case ITEM_USE_ADD_BIG_TALENT_POINT -> null; case ITEM_USE_GAIN_RESIN_CARD_PRODUCT -> null; case ITEM_USE_TRIGGER_ABILITY -> null; case ITEM_USE_ADD_TREASURE_MAP_BONUS_REGION_FRAGMENT -> null; // Used in current resources but no point yet case ITEM_USE_ADD_PERSIST_STAMINA -> null; // [int amount] one Test item case ITEM_USE_ADD_TEMPORARY_STAMINA -> null; // [int amount] one Test item case ITEM_USE_ADD_DUNGEON_COND_TIME -> null; // [int 1, int 15 or 20] - minigame shards case ITEM_USE_ADD_CHANNELLER_SLAB_BUFF -> null; // [int] minigame buffs case ITEM_USE_ADD_REGIONAL_PLAY_VAR -> null; // [String, int] - coral butterfly effect }; } public boolean useItem(UseItemParams params) { // An item must return true on at least one of its actions to count as successfully used. // If all of the actions return false, the item will not be consumed from inventory. return false; } public boolean postUseItem(UseItemParams params) { // This is run after the item has been consumed from inventory. return false; } }