123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- package com.gmail.nossr50.skills.alchemy;
- import com.gmail.nossr50.config.skills.alchemy.PotionConfig;
- import com.gmail.nossr50.datatypes.skills.SubSkillType;
- import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion;
- import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage;
- import com.gmail.nossr50.events.fake.FakeBrewEvent;
- import com.gmail.nossr50.mcMMO;
- import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask;
- import com.gmail.nossr50.runnables.skills.AlchemyBrewCheckTask;
- import com.gmail.nossr50.util.Permissions;
- import com.gmail.nossr50.util.player.UserManager;
- import org.bukkit.Material;
- import org.bukkit.block.BlockState;
- import org.bukkit.block.BrewingStand;
- import org.bukkit.entity.HumanEntity;
- import org.bukkit.entity.Player;
- import org.bukkit.event.inventory.ClickType;
- import org.bukkit.inventory.BrewerInventory;
- import org.bukkit.inventory.Inventory;
- import org.bukkit.inventory.InventoryView;
- import org.bukkit.inventory.ItemStack;
- import java.util.ArrayList;
- import java.util.List;
- public final class AlchemyPotionBrewer {
- public static boolean isValidBrew(Player player, ItemStack[] contents) {
- if (!isValidIngredient(player, contents[Alchemy.INGREDIENT_SLOT])) {
- return false;
- }
- for (int i = 0; i < 3; i++) {
- if (contents[i] == null || contents[i].getType() != Material.POTION && contents[i].getType() != Material.SPLASH_POTION && contents[i].getType() != Material.LINGERING_POTION) {
- continue;
- }
- if (getChildPotion(PotionConfig.getInstance().getPotion(contents[i]), contents[Alchemy.INGREDIENT_SLOT]) != null) {
- return true;
- }
- }
- return false;
- }
- private static AlchemyPotion getChildPotion(AlchemyPotion potion, ItemStack ingredient) {
- if (potion != null) {
- return potion.getChild(ingredient);
- }
- return null;
- }
- public static boolean isEmpty(ItemStack item) {
- return item == null || item.getType() == Material.AIR || item.getAmount() == 0;
- }
- private static void removeIngredient(BrewerInventory inventory, Player player) {
- if(inventory.getIngredient() == null)
- return;
- ItemStack ingredient = inventory.getIngredient().clone();
- if (!isEmpty(ingredient) && isValidIngredient(player, ingredient)) {
- if (ingredient.getAmount() <= 1) {
- inventory.setIngredient(null);
- }
- else {
- ingredient.setAmount(ingredient.getAmount() - 1);
- inventory.setIngredient(ingredient);
- }
- }
- }
- private static boolean hasIngredient(BrewerInventory inventory, Player player) {
- ItemStack ingredient = inventory.getIngredient() == null ? null : inventory.getIngredient().clone();
- return !isEmpty(ingredient) && isValidIngredient(player, ingredient);
- }
- public static boolean isValidIngredient(Player player, ItemStack item) {
- if (isEmpty(item)) {
- return false;
- }
- for (ItemStack ingredient : getValidIngredients(player)) {
- if (item.isSimilar(ingredient)) {
- return true;
- }
- }
- return false;
- }
- private static List<ItemStack> getValidIngredients(Player player) {
- if(player == null || UserManager.getPlayer(player) == null)
- {
- return PotionConfig.getInstance().getIngredients(1);
- }
- return PotionConfig.getInstance().getIngredients(!Permissions.isSubSkillEnabled(player, SubSkillType.ALCHEMY_CONCOCTIONS) ? 1 : UserManager.getPlayer(player).getAlchemyManager().getTier());
- }
- public static void finishBrewing(BlockState brewingStand, Player player, boolean forced) {
- if (!(brewingStand instanceof BrewingStand)) {
- return;
- }
- BrewerInventory inventory = ((BrewingStand) brewingStand).getInventory();
- ItemStack ingredient = inventory.getIngredient() == null ? null : inventory.getIngredient().clone();
- if (!hasIngredient(inventory, player)) {
- return;
- }
- List<AlchemyPotion> inputList = new ArrayList<>();
- var outputList = new ArrayList<ItemStack>();
- for (int i = 0; i < 3; i++) {
- ItemStack item = inventory.getItem(i);
- if (isEmpty(item) || item.getType() == Material.GLASS_BOTTLE || !PotionConfig.getInstance().isValidPotion(item)) {
- continue;
- }
- AlchemyPotion input = PotionConfig.getInstance().getPotion(item);
- AlchemyPotion output = input.getChild(ingredient);
- inputList.add(input);
- if (output != null) {
- outputList.set(i, output.toItemStack(item.getAmount()).clone());
- }
- }
- FakeBrewEvent event = new FakeBrewEvent(brewingStand.getBlock(), inventory, outputList, ((BrewingStand) brewingStand).getFuelLevel());
- mcMMO.p.getServer().getPluginManager().callEvent(event);
- if (event.isCancelled() || inputList.isEmpty()) {
- return;
- }
- for (int i = 0; i < 3; i++) {
- if(outputList.get(i) != null) {
- inventory.setItem(i, outputList.get(i));
- }
- }
- removeIngredient(inventory, player);
- for (AlchemyPotion input : inputList) {
- AlchemyPotion output = input.getChild(ingredient);
- if (output != null && player != null) {
- PotionStage potionStage = PotionStage.getPotionStage(input, output);
- //TODO: hmm
- if (UserManager.hasPlayerDataKey(player)) {
- UserManager.getPlayer(player).getAlchemyManager().handlePotionBrewSuccesses(potionStage, 1);
- }
- }
- }
- if (!forced) {
- scheduleUpdate(inventory);
- }
- }
- public static boolean transferItems(InventoryView view, int fromSlot, ClickType click) {
- boolean success = false;
- if (click.isLeftClick()) {
- success = transferItems(view, fromSlot);
- }
- else if (click.isRightClick()) {
- success = transferOneItem(view, fromSlot);
- }
- return success;
- }
- private static boolean transferOneItem(InventoryView view, int fromSlot) {
- ItemStack from = view.getItem(fromSlot).clone();
- ItemStack to = view.getItem(Alchemy.INGREDIENT_SLOT).clone();
- if (isEmpty(from)) {
- return false;
- }
- boolean emptyTo = isEmpty(to);
- int fromAmount = from.getAmount();
- if (!emptyTo && fromAmount >= from.getType().getMaxStackSize()) {
- return false;
- }
- else if (emptyTo || from.isSimilar(to)) {
- if (emptyTo) {
- to = from.clone();
- to.setAmount(1);
- }
- else {
- to.setAmount(to.getAmount() + 1);
- }
- from.setAmount(fromAmount - 1);
- view.setItem(Alchemy.INGREDIENT_SLOT, to);
- view.setItem(fromSlot, from);
- return true;
- }
- return false;
- }
- /**
- * Transfer items between two ItemStacks, returning the leftover status
- */
- private static boolean transferItems(InventoryView view, int fromSlot) {
- ItemStack from = view.getItem(fromSlot).clone();
- ItemStack to = view.getItem(Alchemy.INGREDIENT_SLOT).clone();
- if (isEmpty(from)) {
- return false;
- }
- else if (isEmpty(to)) {
- view.setItem(Alchemy.INGREDIENT_SLOT, from);
- view.setItem(fromSlot, null);
- return true;
- }
- else if (from.isSimilar(to)) {
- int fromAmount = from.getAmount();
- int toAmount = to.getAmount();
- int maxSize = to.getType().getMaxStackSize();
- if (fromAmount + toAmount > maxSize) {
- int left = fromAmount + toAmount - maxSize;
- to.setAmount(maxSize);
- view.setItem(Alchemy.INGREDIENT_SLOT, to);
- from.setAmount(left);
- view.setItem(fromSlot, from);
- return true;
- }
- to.setAmount(fromAmount + toAmount);
- view.setItem(fromSlot, null);
- view.setItem(Alchemy.INGREDIENT_SLOT, to);
- return true;
- }
- return false;
- }
- public static void scheduleCheck(Player player, BrewingStand brewingStand) {
- new AlchemyBrewCheckTask(player, brewingStand).runTask(mcMMO.p);
- }
- public static void scheduleUpdate(Inventory inventory) {
- for (HumanEntity humanEntity : inventory.getViewers()) {
- if (humanEntity instanceof Player) {
- new PlayerUpdateInventoryTask((Player) humanEntity).runTask(mcMMO.p);
- }
- }
- }
- }
|