diff --git a/CHANGELOG.md b/CHANGELOG.md index 1795ed27d..38e38482d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,6 +83,8 @@ * Fixed #2243 * Fixed #2249 * Fixed #1022 +* Fixed Fluid Pump treating low-level fluids like stationary fluids +* Fixed Fluid Pump not working on Bubble Columns * Fixed #2208 ## Release Candidate 15 (01 Aug 2020) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java index cab5348c2..f2d452ed1 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java @@ -45,6 +45,7 @@ import io.github.thebusybiscuit.slimefun4.core.services.github.GitHubService; import io.github.thebusybiscuit.slimefun4.core.services.plugins.ThirdPartyPluginService; import io.github.thebusybiscuit.slimefun4.core.services.profiler.SlimefunProfiler; import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientAltar; +import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientPedestal; import io.github.thebusybiscuit.slimefun4.implementation.items.backpacks.Cooler; import io.github.thebusybiscuit.slimefun4.implementation.items.electric.reactors.Reactor; import io.github.thebusybiscuit.slimefun4.implementation.items.tools.GrapplingHook; @@ -144,7 +145,6 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { private final Config researches = new Config(this, "Researches.yml"); // Listeners that need to be accessed elsewhere - private final AncientAltarListener ancientAltarListener = new AncientAltarListener(); private final GrapplingHookListener grapplingHookListener = new GrapplingHookListener(); private final BackpackListener backpackListener = new BackpackListener(); private final SlimefunBowListener bowListener = new SlimefunBowListener(); @@ -209,7 +209,7 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { networkManager = new NetworkManager(networkSize); // Setting up bStats - new Thread(metricsService::start).start(); + new Thread(metricsService::start, "Slimefun Metrics").start(); // Starting the Auto-Updater if (config.getBoolean("options.auto-update")) { @@ -459,9 +459,8 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { new VampireBladeListener(this, (VampireBlade) SlimefunItems.BLADE_OF_VAMPIRES.getItem()); new CoolerListener(this, (Cooler) SlimefunItems.COOLER.getItem()); new SeismicAxeListener(this, (SeismicAxe) SlimefunItems.SEISMIC_AXE.getItem()); + new AncientAltarListener(this, (AncientAltar) SlimefunItems.ANCIENT_ALTAR.getItem(), (AncientPedestal) SlimefunItems.ANCIENT_PEDESTAL.getItem()); grapplingHookListener.register(this, (GrapplingHook) SlimefunItems.GRAPPLING_HOOK.getItem()); - ancientAltarListener.register(this, (AncientAltar) SlimefunItems.ANCIENT_ALTAR.getItem()); - bowListener.register(this); // Toggleable Listeners for performance reasons @@ -623,10 +622,6 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { return instance.networkManager; } - public static AncientAltarListener getAncientAltarListener() { - return instance.ancientAltarListener; - } - public static GrapplingHookListener getGrapplingHookListener() { return instance.grapplingHookListener; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/altar/AncientAltar.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/altar/AncientAltar.java index 3b785c678..232d2a215 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/altar/AncientAltar.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/altar/AncientAltar.java @@ -1,5 +1,8 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.altar; +import java.util.ArrayList; +import java.util.List; + import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.slimefun4.api.events.AncientAltarCraftEvent; @@ -26,6 +29,7 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; public class AncientAltar extends SlimefunItem { private final int speed; + private final List recipes = new ArrayList<>(); public AncientAltar(Category category, int speed, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { super(category, item, recipeType, recipe); @@ -48,4 +52,8 @@ public class AncientAltar extends SlimefunItem { return speed; } + public List getRecipes() { + return recipes; + } + } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/altar/AncientPedestal.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/altar/AncientPedestal.java index a57fddafa..c7087b36b 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/altar/AncientPedestal.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/altar/AncientPedestal.java @@ -1,30 +1,131 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.altar; -import org.bukkit.entity.Item; -import org.bukkit.inventory.ItemStack; +import java.util.Optional; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.util.Vector; + +import io.github.thebusybiscuit.cscorelib2.chat.ChatColors; +import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils; +import io.github.thebusybiscuit.cscorelib2.item.CustomItem; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.listeners.AncientAltarListener; +import io.github.thebusybiscuit.slimefun4.implementation.tasks.AncientAltarTask; +import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; +/** + * The {@link AncientPedestal} is a part of the {@link AncientAltar}. + * You can place any {@link ItemStack} onto the {@link AncientPedestal} to provide it to + * the altar as a crafting ingredient. + * + * @author Redemption198 + * @author TheBusyBiscuit + * + * @see AncientAltar + * @see AncientAltarListener + * @see AncientAltarTask + * + */ public class AncientPedestal extends SlimefunItem { + public static final String ITEM_PREFIX = ChatColors.color("&dALTAR &3Probe - &e"); + public AncientPedestal(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { super(category, item, recipeType, recipe, recipeOutput); SlimefunItem.registerBlockHandler(getID(), (p, b, tool, reason) -> { - AncientAltarListener listener = SlimefunPlugin.getAncientAltarListener(); - Item stack = listener.findItem(b); + Optional entity = getPlacedItem(b); - if (stack != null) { - stack.removeMetadata("no_pickup", SlimefunPlugin.instance()); - b.getWorld().dropItem(b.getLocation(), listener.fixItemStack(stack.getItemStack(), stack.getCustomName())); - stack.remove(); + if (entity.isPresent()) { + Item stack = entity.get(); + + if (stack.isValid()) { + stack.removeMetadata("no_pickup", SlimefunPlugin.instance()); + b.getWorld().dropItem(b.getLocation(), getOriginalItemStack(stack)); + stack.remove(); + } } + return true; }); } + + public Optional getPlacedItem(Block pedestal) { + Location l = pedestal.getLocation().add(0.5, 1.2, 0.5); + + for (Entity n : l.getWorld().getNearbyEntities(l, 0.5, 0.5, 0.5, this::testItem)) { + if (n instanceof Item) { + return Optional.of((Item) n); + } + } + + return Optional.empty(); + } + + private boolean testItem(Entity n) { + if (n instanceof Item && n.isValid()) { + Item item = (Item) n; + ItemMeta meta = item.getItemStack().getItemMeta(); + + return meta.hasDisplayName() && meta.getDisplayName().startsWith(ITEM_PREFIX); + } + else { + return false; + } + } + + public ItemStack getOriginalItemStack(Item item) { + ItemStack stack = item.getItemStack().clone(); + String customName = item.getCustomName(); + + if (customName.equals(ItemUtils.getItemName(new ItemStack(stack.getType())))) { + ItemMeta im = stack.getItemMeta(); + im.setDisplayName(null); + stack.setItemMeta(im); + } + else { + ItemMeta im = stack.getItemMeta(); + + if (!customName.startsWith(String.valueOf(ChatColor.COLOR_CHAR))) { + customName = ChatColor.WHITE + customName; + } + + im.setDisplayName(customName); + stack.setItemMeta(im); + } + + return stack; + } + + public void placeItem(Player p, Block b) { + ItemStack hand = p.getInventory().getItemInMainHand(); + ItemStack stack = new CustomItem(hand, ITEM_PREFIX + System.nanoTime()); + stack.setAmount(1); + + if (p.getGameMode() != GameMode.CREATIVE) { + ItemUtils.consumeItem(hand, false); + } + + String nametag = ItemUtils.getItemName(stack); + Item entity = b.getWorld().dropItem(b.getLocation().add(0.5, 1.2, 0.5), stack); + entity.setVelocity(new Vector(0, 0.1, 0)); + SlimefunUtils.markAsNoPickup(entity, "altar_item"); + entity.setCustomNameVisible(true); + entity.setCustomName(nametag); + p.playSound(b.getLocation(), Sound.ENTITY_ITEM_PICKUP, 0.3F, 0.3F); + } + } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/FluidPump.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/FluidPump.java index 97f0a7832..d7c109855 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/FluidPump.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/FluidPump.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Optional; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; @@ -34,7 +35,7 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; /** - * This machine draws liquids from the world and puts them + * This machine collects liquids from the {@link World} and puts them * into buckets provided to the machine by using energy. * * @author TheBusyBiscuit @@ -140,34 +141,47 @@ public class FluidPump extends SimpleSlimefunItem implements Invent } private void consumeFluid(Block fluid) { - if (!fluid.isLiquid()) return; - if (fluid.getType() == Material.WATER) { - fluid.setType(Material.AIR); - return; + if (fluid.isLiquid()) { + if (fluid.getType() == Material.WATER || fluid.getType() == Material.BUBBLE_COLUMN) { + // With water we can be sure to find an infinite source whenever we go + // further than 2 blocks, so we can just remove the water here and save + // outselves all of that computing... + fluid.setType(Material.AIR); + } + else { + List list = Vein.find(fluid, RANGE, block -> isLiquid(block) && block.getType() == fluid.getType()); + list.get(list.size() - 1).setType(Material.AIR); + } } - - List list = Vein.find(fluid, RANGE, block -> isLiquid(block) && block.getType() == fluid.getType()); - list.get(list.size() - 1).setType(Material.AIR); } private Optional getFilledBucket(Block fluid) { if (fluid.getType() == Material.LAVA) { return Optional.of(new ItemStack(Material.LAVA_BUCKET)); } - else if (fluid.getType() == Material.WATER) { + else if (fluid.getType() == Material.WATER || fluid.getType() == Material.BUBBLE_COLUMN) { return Optional.of(new ItemStack(Material.WATER_BUCKET)); } - - return Optional.empty(); - } - - private boolean isLiquid(Block block) { - if (!block.isLiquid()) return false; - BlockData data = block.getBlockData(); - if (data instanceof Levelled) { - return ((Levelled) data).getLevel() == 0; + else { + return Optional.empty(); + } + } + + private boolean isLiquid(Block block) { + if (block.isLiquid()) { + BlockData data = block.getBlockData(); + + if (data instanceof Levelled) { + // Check if this is a full block. + return ((Levelled) data).getLevel() == 0; + } + else { + return false; + } + } + else { + return false; } - return false; } @Override diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/AncientAltarListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/AncientAltarListener.java index 960ca8587..0943816bb 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/AncientAltarListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/AncientAltarListener.java @@ -8,14 +8,12 @@ import java.util.Optional; import java.util.Set; import java.util.UUID; -import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Entity; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.Event.Result; @@ -25,9 +23,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.util.Vector; -import io.github.thebusybiscuit.cscorelib2.chat.ChatColors; import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils; import io.github.thebusybiscuit.cscorelib2.item.CustomItem; import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction; @@ -54,19 +50,19 @@ import me.mrCookieSlime.Slimefun.api.Slimefun; */ public class AncientAltarListener implements Listener { - public static final String ITEM_PREFIX = ChatColors.color("&dALTAR &3Probe - &e"); + private AncientAltar altarItem; + private AncientPedestal pedestalItem; - private AncientAltar altar; - - private final Set altarRecipes = new HashSet<>(); private final Set altarsInUse = new HashSet<>(); private final List altars = new ArrayList<>(); private final Set removedItems = new HashSet<>(); - public void register(SlimefunPlugin plugin, AncientAltar altar) { + public AncientAltarListener(SlimefunPlugin plugin, AncientAltar altar, AncientPedestal pedestal) { plugin.getServer().getPluginManager().registerEvents(this, plugin); - this.altar = altar; + + this.altarItem = altar; + this.pedestalItem = pedestal; } /** @@ -82,13 +78,9 @@ public class AncientAltarListener implements Listener { return altars; } - public Set getRecipes() { - return altarRecipes; - } - @EventHandler public void onInteract(PlayerRightClickEvent e) { - if (altar == null || altar.isDisabled() || e.useBlock() == Result.DENY) { + if (altarItem == null || altarItem.isDisabled() || e.useBlock() == Result.DENY) { return; } @@ -109,12 +101,12 @@ public class AncientAltarListener implements Listener { String id = slimefunBlock.get().getID(); - if (id.equals(SlimefunItems.ANCIENT_PEDESTAL.getItemId())) { + if (id.equals(pedestalItem.getID())) { e.cancel(); usePedestal(b, e.getPlayer()); } - else if (id.equals(SlimefunItems.ANCIENT_ALTAR.getItemId())) { - if (!Slimefun.hasUnlocked(e.getPlayer(), SlimefunItems.ANCIENT_ALTAR.getItem(), true) || altarsInUse.contains(b.getLocation())) { + else if (id.equals(altarItem.getID())) { + if (!Slimefun.hasUnlocked(e.getPlayer(), altarItem, true) || altarsInUse.contains(b.getLocation())) { e.cancel(); return; } @@ -138,9 +130,9 @@ public class AncientAltarListener implements Listener { } // getting the currently placed item - Item stack = findItem(pedestal); + Optional stack = pedestalItem.getPlacedItem(pedestal); - if (stack == null) { + if (!stack.isPresent()) { // Check if the Item in hand is valid if (p.getInventory().getItemInMainHand().getType() != Material.AIR) { // Check for pedestal obstructions @@ -150,17 +142,18 @@ public class AncientAltarListener implements Listener { } // place the item onto the pedestal - insertItem(p, pedestal); + pedestalItem.placeItem(p, pedestal); } } - else if (!removedItems.contains(stack.getUniqueId())) { - UUID uuid = stack.getUniqueId(); + else if (!removedItems.contains(stack.get().getUniqueId())) { + Item entity = stack.get(); + UUID uuid = entity.getUniqueId(); removedItems.add(uuid); Slimefun.runSync(() -> removedItems.remove(uuid), 30L); - stack.remove(); - p.getInventory().addItem(fixItemStack(stack.getItemStack(), stack.getCustomName())); + entity.remove(); + p.getInventory().addItem(pedestalItem.getOriginalItemStack(entity)); p.playSound(pedestal.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1F, 1F); } } @@ -209,10 +202,10 @@ public class AncientAltarListener implements Listener { List input = new ArrayList<>(); for (Block pedestal : pedestals) { - Item stack = findItem(pedestal); + Optional stack = pedestalItem.getPlacedItem(pedestal); - if (stack != null) { - input.add(fixItemStack(stack.getItemStack(), stack.getCustomName())); + if (stack.isPresent()) { + input.add(pedestalItem.getOriginalItemStack(stack.get())); } } @@ -227,7 +220,9 @@ public class AncientAltarListener implements Listener { } b.getWorld().playSound(b.getLocation(), Sound.ENTITY_ILLUSIONER_PREPARE_MIRROR, 1, 1); - Slimefun.runSync(new AncientAltarTask(b, altar.getSpeed(), result.get(), pedestals, consumed, p), 10L); + + AncientAltarTask task = new AncientAltarTask(this, b, altarItem.getSpeed(), result.get(), pedestals, consumed, p); + Slimefun.runSync(task, 10L); } else { altars.remove(b); @@ -255,7 +250,7 @@ public class AncientAltarListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent e) { - if (altar == null || altar.isDisabled()) { + if (altarItem == null || altarItem.isDisabled()) { return; } @@ -264,82 +259,38 @@ public class AncientAltarListener implements Listener { if (pedestal.getType() == Material.DISPENSER) { String id = BlockStorage.checkID(pedestal); - if (id != null && id.equals(SlimefunItems.ANCIENT_PEDESTAL.getItemId())) { + if (id != null && id.equals(pedestalItem.getID())) { SlimefunPlugin.getLocalization().sendMessage(e.getPlayer(), "messages.cannot-place", true); e.setCancelled(true); } } } - public ItemStack fixItemStack(ItemStack itemStack, String customName) { - ItemStack stack = itemStack.clone(); - - if (customName.equals(ItemUtils.getItemName(new ItemStack(itemStack.getType())))) { - ItemMeta im = stack.getItemMeta(); - im.setDisplayName(null); - stack.setItemMeta(im); - } - else { - ItemMeta im = stack.getItemMeta(); - if (!customName.startsWith(String.valueOf(ChatColor.COLOR_CHAR))) customName = ChatColor.RESET + customName; - im.setDisplayName(customName); - stack.setItemMeta(im); - } - return stack; - } - - public Item findItem(Block b) { - for (Entity n : b.getChunk().getEntities()) { - if (n instanceof Item && b.getLocation().add(0.5, 1.2, 0.5).distanceSquared(n.getLocation()) < 0.5D && n.getCustomName() != null) { - return (Item) n; - } - } - return null; - } - - private void insertItem(Player p, Block b) { - ItemStack hand = p.getInventory().getItemInMainHand(); - ItemStack stack = new CustomItem(hand, 1); - - if (p.getGameMode() != GameMode.CREATIVE) { - ItemUtils.consumeItem(hand, false); - } - - String nametag = ItemUtils.getItemName(stack); - Item entity = b.getWorld().dropItem(b.getLocation().add(0.5, 1.2, 0.5), new CustomItem(stack, ITEM_PREFIX + System.nanoTime())); - entity.setVelocity(new Vector(0, 0.1, 0)); - SlimefunUtils.markAsNoPickup(entity, "altar_item"); - entity.setCustomNameVisible(true); - entity.setCustomName(nametag); - p.playSound(b.getLocation(), Sound.ENTITY_ITEM_PICKUP, 0.3F, 0.3F); - } - private List getPedestals(Block altar) { List list = new ArrayList<>(); - String id = SlimefunItems.ANCIENT_PEDESTAL.getItemId(); - if (BlockStorage.check(altar.getRelative(2, 0, -2), id)) { + if (BlockStorage.check(altar.getRelative(2, 0, -2), pedestalItem.getID())) { list.add(altar.getRelative(2, 0, -2)); } - if (BlockStorage.check(altar.getRelative(3, 0, 0), id)) { + if (BlockStorage.check(altar.getRelative(3, 0, 0), pedestalItem.getID())) { list.add(altar.getRelative(3, 0, 0)); } - if (BlockStorage.check(altar.getRelative(2, 0, 2), id)) { + if (BlockStorage.check(altar.getRelative(2, 0, 2), pedestalItem.getID())) { list.add(altar.getRelative(2, 0, 2)); } - if (BlockStorage.check(altar.getRelative(0, 0, 3), id)) { + if (BlockStorage.check(altar.getRelative(0, 0, 3), pedestalItem.getID())) { list.add(altar.getRelative(0, 0, 3)); } - if (BlockStorage.check(altar.getRelative(-2, 0, 2), id)) { + if (BlockStorage.check(altar.getRelative(-2, 0, 2), pedestalItem.getID())) { list.add(altar.getRelative(-2, 0, 2)); } - if (BlockStorage.check(altar.getRelative(-3, 0, 0), id)) { + if (BlockStorage.check(altar.getRelative(-3, 0, 0), pedestalItem.getID())) { list.add(altar.getRelative(-3, 0, 0)); } - if (BlockStorage.check(altar.getRelative(-2, 0, -2), id)) { + if (BlockStorage.check(altar.getRelative(-2, 0, -2), pedestalItem.getID())) { list.add(altar.getRelative(-2, 0, -2)); } - if (BlockStorage.check(altar.getRelative(0, 0, -3), id)) { + if (BlockStorage.check(altar.getRelative(0, 0, -3), pedestalItem.getID())) { list.add(altar.getRelative(0, 0, -3)); } @@ -370,7 +321,7 @@ public class AncientAltarListener implements Listener { } private Optional checkRecipe(ItemStack catalyst, List items) { - for (AltarRecipe recipe : altarRecipes) { + for (AltarRecipe recipe : altarItem.getRecipes()) { if (SlimefunUtils.isItemSimilar(catalyst, recipe.getCatalyst(), true)) { Optional optional = checkPedestals(items, recipe); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ItemPickupListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ItemPickupListener.java index ce734ed8d..bf465bc1a 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ItemPickupListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ItemPickupListener.java @@ -7,6 +7,7 @@ import org.bukkit.event.inventory.InventoryPickupItemEvent; import org.bukkit.inventory.meta.ItemMeta; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; +import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientPedestal; import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; /** @@ -28,7 +29,7 @@ public class ItemPickupListener implements Listener { else if (e.getItem().getItemStack().hasItemMeta()) { ItemMeta meta = e.getItem().getItemStack().getItemMeta(); - if (meta.hasDisplayName() && meta.getDisplayName().startsWith(AncientAltarListener.ITEM_PREFIX)) { + if (meta.hasDisplayName() && meta.getDisplayName().startsWith(AncientPedestal.ITEM_PREFIX)) { e.setCancelled(true); e.getItem().remove(); } @@ -43,7 +44,7 @@ public class ItemPickupListener implements Listener { else if (e.getItem().getItemStack().hasItemMeta()) { ItemMeta meta = e.getItem().getItemStack().getItemMeta(); - if (meta.hasDisplayName() && meta.getDisplayName().startsWith(AncientAltarListener.ITEM_PREFIX)) { + if (meta.hasDisplayName() && meta.getDisplayName().startsWith(AncientPedestal.ITEM_PREFIX)) { e.setCancelled(true); e.getItem().remove(); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/AncientAltarTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/AncientAltarTask.java index 837a34a5f..d0016faf5 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/AncientAltarTask.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/AncientAltarTask.java @@ -5,8 +5,8 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Optional; -import io.github.thebusybiscuit.slimefun4.api.events.AncientAltarCraftEvent; import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.Location; @@ -18,8 +18,11 @@ import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.slimefun4.api.events.AncientAltarCraftEvent; +import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientAltar; +import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientPedestal; import io.github.thebusybiscuit.slimefun4.implementation.listeners.AncientAltarListener; import me.mrCookieSlime.Slimefun.api.Slimefun; @@ -37,7 +40,8 @@ import me.mrCookieSlime.Slimefun.api.Slimefun; */ public class AncientAltarTask implements Runnable { - private final AncientAltarListener listener = SlimefunPlugin.getAncientAltarListener(); + private final AncientAltarListener listener; + private final AncientPedestal pedestalItem = (AncientPedestal) SlimefunItems.ANCIENT_PEDESTAL.getItem(); private final Block altar; private final int speed; @@ -47,13 +51,14 @@ public class AncientAltarTask implements Runnable { private final List items; private final Collection particleLocations = new LinkedList<>(); - private final Map itemLock = new HashMap<>(); + private final Map positionLock = new HashMap<>(); private boolean running; private int stage; private final Player player; - public AncientAltarTask(Block altar, int speed, ItemStack output, List pedestals, List items, Player player) { + public AncientAltarTask(AncientAltarListener listener, Block altar, int speed, ItemStack output, List pedestals, List items, Player player) { + this.listener = listener; this.dropLocation = altar.getLocation().add(0.5, 1.3, 0.5); this.speed = speed; this.altar = altar; @@ -66,8 +71,12 @@ public class AncientAltarTask implements Runnable { this.stage = 0; for (Block pedestal : pedestals) { - Item item = listener.findItem(pedestal); - this.itemLock.put(item, item.getLocation().clone()); + Optional item = pedestalItem.getPlacedItem(pedestal); + + if (item.isPresent()) { + Item entity = item.get(); + positionLock.put(entity, entity.getLocation().clone()); + } } } @@ -94,7 +103,7 @@ public class AncientAltarTask implements Runnable { } private boolean checkLockedItems() { - for (Map.Entry entry : itemLock.entrySet()) { + for (Map.Entry entry : positionLock.entrySet()) { if (entry.getKey().getLocation().distanceSquared(entry.getValue()) > 0.1) { return false; } @@ -114,22 +123,23 @@ public class AncientAltarTask implements Runnable { } private void checkPedestal(Block pedestal) { - Item item = listener.findItem(pedestal); + Optional item = pedestalItem.getPlacedItem(pedestal); - if (item == null || itemLock.remove(item) == null) { + if (!item.isPresent() || positionLock.remove(item.get()) == null) { abort(); } else { + Item entity = item.get(); particleLocations.add(pedestal.getLocation().add(0.5, 1.5, 0.5)); - items.add(listener.fixItemStack(item.getItemStack(), item.getCustomName())); + items.add(pedestalItem.getOriginalItemStack(entity)); pedestal.getWorld().playSound(pedestal.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 1F, 2F); dropLocation.getWorld().spawnParticle(Particle.ENCHANTMENT_TABLE, pedestal.getLocation().add(0.5, 1.5, 0.5), 16, 0.3F, 0.2F, 0.3F); dropLocation.getWorld().spawnParticle(Particle.CRIT_MAGIC, pedestal.getLocation().add(0.5, 1.5, 0.5), 8, 0.3F, 0.2F, 0.3F); - itemLock.remove(item); - item.remove(); - item.removeMetadata("no_pickup", SlimefunPlugin.instance()); + positionLock.remove(entity); + entity.remove(); + entity.removeMetadata("no_pickup", SlimefunPlugin.instance()); } } @@ -143,7 +153,7 @@ public class AncientAltarTask implements Runnable { // This should re-enable altar blocks on craft failure. listener.getAltarsInUse().remove(altar.getLocation()); dropLocation.getWorld().playSound(dropLocation, Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR, 1F, 1F); - itemLock.clear(); + positionLock.clear(); listener.getAltars().remove(altar); } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Lists/RecipeType.java b/src/main/java/me/mrCookieSlime/Slimefun/Lists/RecipeType.java index 8b62a1692..6db3df0fa 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Lists/RecipeType.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Lists/RecipeType.java @@ -24,6 +24,7 @@ import io.github.thebusybiscuit.slimefun4.core.multiblocks.MultiBlockMachine; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AltarRecipe; +import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientAltar; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; @@ -44,7 +45,8 @@ public class RecipeType implements Keyed { public static final RecipeType ANCIENT_ALTAR = new RecipeType(new NamespacedKey(SlimefunPlugin.instance(), "ancient_altar"), SlimefunItems.ANCIENT_ALTAR, (recipe, output) -> { AltarRecipe altarRecipe = new AltarRecipe(Arrays.asList(recipe), output); - SlimefunPlugin.getAncientAltarListener().getRecipes().add(altarRecipe); + AncientAltar altar = ((AncientAltar) SlimefunItems.ANCIENT_ALTAR.getItem()); + altar.getRecipes().add(altarRecipe); }); public static final RecipeType MOB_DROP = new RecipeType(new NamespacedKey(SlimefunPlugin.instance(), "mob_drop"), new CustomItem(Material.IRON_SWORD, "&bMob Drop"), RecipeType::registerMobDrop, "", "&rKill the specified Mob to obtain this Item"); diff --git a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/TestPluginClass.java b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/TestPluginClass.java index b40004742..de00deeb3 100644 --- a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/TestPluginClass.java +++ b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/TestPluginClass.java @@ -61,7 +61,6 @@ public class TestPluginClass { @Test public void testListenersNotNull() { - Assertions.assertNotNull(SlimefunPlugin.getAncientAltarListener()); Assertions.assertNotNull(SlimefunPlugin.getGrapplingHookListener()); Assertions.assertNotNull(SlimefunPlugin.getBackpackListener()); Assertions.assertNotNull(SlimefunPlugin.getBowListener()); diff --git a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/listeners/TestItemPickupListener.java b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/listeners/TestItemPickupListener.java index 081f76a84..1958fe761 100644 --- a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/listeners/TestItemPickupListener.java +++ b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/listeners/TestItemPickupListener.java @@ -21,7 +21,7 @@ import be.seeseemelk.mockbukkit.ServerMock; import be.seeseemelk.mockbukkit.entity.ItemEntityMock; import be.seeseemelk.mockbukkit.inventory.ChestInventoryMock; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; -import io.github.thebusybiscuit.slimefun4.implementation.listeners.AncientAltarListener; +import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientPedestal; import io.github.thebusybiscuit.slimefun4.implementation.listeners.ItemPickupListener; import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; import me.mrCookieSlime.CSCoreLibPlugin.cscorelib2.item.CustomItem; @@ -83,7 +83,7 @@ class TestItemPickupListener { ItemStack stack; if (flag) { - stack = new CustomItem(Material.DIAMOND, AncientAltarListener.ITEM_PREFIX + System.nanoTime()); + stack = new CustomItem(Material.DIAMOND, AncientPedestal.ITEM_PREFIX + System.nanoTime()); } else { stack = new CustomItem(Material.DIAMOND, "&5Just a normal named diamond"); @@ -112,7 +112,7 @@ class TestItemPickupListener { ItemStack stack; if (flag) { - stack = new CustomItem(Material.DIAMOND, AncientAltarListener.ITEM_PREFIX + System.nanoTime()); + stack = new CustomItem(Material.DIAMOND, AncientPedestal.ITEM_PREFIX + System.nanoTime()); } else { stack = new CustomItem(Material.DIAMOND, "&5Just a normal named diamond");