diff --git a/CHANGELOG.md b/CHANGELOG.md index 49dfaab47..0bdd01082 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,7 @@ * Fixed #1385 * Fixed #1390 * Fixed #1394 +* Possibly fixed #1313 ## Release Candidate 4 (06 Jan 2020) https://thebusybiscuit.github.io/builds/TheBusyBiscuit/Slimefun4/stable/#4 diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/ItemUseEvent.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/PlayerRightClickEvent.java similarity index 96% rename from src/main/java/io/github/thebusybiscuit/slimefun4/api/events/ItemUseEvent.java rename to src/main/java/io/github/thebusybiscuit/slimefun4/api/events/PlayerRightClickEvent.java index 2a1d0da9f..6a1c3347d 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/ItemUseEvent.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/events/PlayerRightClickEvent.java @@ -16,7 +16,7 @@ import io.github.thebusybiscuit.cscorelib2.data.ComputedOptional; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.BlockStorage; -public class ItemUseEvent extends Event { +public class PlayerRightClickEvent extends Event { private static final HandlerList handlers = new HandlerList(); @@ -35,7 +35,7 @@ public class ItemUseEvent extends Event { private Result itemResult = Result.DEFAULT; private Result blockResult = Result.DEFAULT; - public ItemUseEvent(PlayerInteractEvent e) { + public PlayerRightClickEvent(PlayerInteractEvent e) { event = e; player = e.getPlayer(); clickedBlock = Optional.ofNullable(e.getClickedBlock()); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/TeleporterCommand.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/TeleporterCommand.java index 118d46e1e..3fc25b911 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/TeleporterCommand.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/TeleporterCommand.java @@ -25,6 +25,8 @@ public class TeleporterCommand extends SubCommand { public void onExecute(CommandSender sender, String[] args) { if (args.length == 2) { if (sender.hasPermission("slimefun.command.teleporter") && sender instanceof Player) { + + @SuppressWarnings("deprecation") OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]); if (player.getName() != null) { 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 ea769f3a6..19e27e357 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 @@ -3,6 +3,7 @@ package io.github.thebusybiscuit.slimefun4.implementation.listeners; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -15,12 +16,11 @@ import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; import org.bukkit.entity.Player; +import org.bukkit.event.Event.Result; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.metadata.FixedMetadataValue; @@ -28,8 +28,11 @@ import org.bukkit.util.Vector; import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils; import io.github.thebusybiscuit.cscorelib2.item.CustomItem; +import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent; import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.ancient_altar.AltarRecipe; import me.mrCookieSlime.Slimefun.ancient_altar.Pedestals; import me.mrCookieSlime.Slimefun.ancient_altar.RitualAnimation; import me.mrCookieSlime.Slimefun.api.BlockStorage; @@ -37,12 +40,13 @@ import me.mrCookieSlime.Slimefun.api.Slimefun; public class AncientAltarListener implements Listener { + 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 AncientAltarListener(SlimefunPlugin plugin) { + public void load(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @@ -50,117 +54,124 @@ public class AncientAltarListener implements Listener { return altarsInUse; } - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) - public void onInteract(PlayerInteractEvent e) { - if (e.getAction() != Action.RIGHT_CLICK_BLOCK) return; - Block b = e.getClickedBlock(); - String item = BlockStorage.checkID(b); + @EventHandler + public void onInteract(PlayerRightClickEvent e) { + if (e.useBlock() == Result.DENY) return; + + Optional blockOptional = e.getClickedBlock(); + if (!blockOptional.isPresent()) return; + + Block b = blockOptional.get(); + if (b.getType() != Material.ENCHANTING_TABLE && b.getType() != Material.DISPENSER) return; + + Optional slimefunBlock = e.getSlimefunBlock(); + if (!slimefunBlock.isPresent()) return; + + String id = slimefunBlock.get().getID(); + + if (id.equals("ANCIENT_PEDESTAL")) { + e.cancel(); - if (item != null) { - if (item.equals("ANCIENT_PEDESTAL")) { - e.setCancelled(true); - - if (altarsInUse.contains(b.getLocation())) { - return; - } - - Item stack = findItem(b); - - if (stack == null) { - if (e.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR) return; - - if (b.getRelative(0, 1, 0).getType() != Material.AIR) { - SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.ANCIENT_PEDESTAL.obstructed", true); - return; - } - - insertItem(e.getPlayer(), b); - } - else if (!removedItems.contains(stack.getUniqueId())) { - UUID uuid = stack.getUniqueId(); - removedItems.add(uuid); - - Slimefun.runSync(() -> removedItems.remove(uuid), 30L); - - stack.remove(); - e.getPlayer().getInventory().addItem(fixItemStack(stack.getItemStack(), stack.getCustomName())); - e.getPlayer().playSound(b.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1F, 1F); - } + if (altarsInUse.contains(b.getLocation())) { + return; } - else if (item.equals("ANCIENT_ALTAR")) { - if (!Slimefun.hasUnlocked(e.getPlayer(), SlimefunItems.ANCIENT_ALTAR, true) || altarsInUse.contains(b.getLocation())) { - e.setCancelled(true); + + Item stack = findItem(b); + + if (stack == null) { + if (e.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR) return; + + if (b.getRelative(0, 1, 0).getType() != Material.AIR) { + SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.ANCIENT_PEDESTAL.obstructed", true); return; } - // Make altarinuse simply because that was the last block clicked. - altarsInUse.add(b.getLocation()); - e.setCancelled(true); + insertItem(e.getPlayer(), b); + } + else if (!removedItems.contains(stack.getUniqueId())) { + UUID uuid = stack.getUniqueId(); + removedItems.add(uuid); - ItemStack catalyst = new CustomItem(e.getPlayer().getInventory().getItemInMainHand(), 1); - List pedestals = Pedestals.getPedestals(b); + Slimefun.runSync(() -> removedItems.remove(uuid), 30L); - if (!altars.contains(e.getClickedBlock())) { - altars.add(e.getClickedBlock()); - if (pedestals.size() == 8) { - pedestals.forEach(block -> altarsInUse.add(block.getLocation())); + stack.remove(); + e.getPlayer().getInventory().addItem(fixItemStack(stack.getItemStack(), stack.getCustomName())); + e.getPlayer().playSound(b.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1F, 1F); + } + } + else if (id.equals("ANCIENT_ALTAR")) { + if (!Slimefun.hasUnlocked(e.getPlayer(), SlimefunItems.ANCIENT_ALTAR, true) || altarsInUse.contains(b.getLocation())) { + e.cancel(); + return; + } - if (catalyst.getType() != Material.AIR) { - List input = new ArrayList<>(); - for (Block pedestal : pedestals) { - Item stack = findItem(pedestal); - if (stack != null) input.add(fixItemStack(stack.getItemStack(), stack.getCustomName())); - } + // Make altarinuse simply because that was the last block clicked. + altarsInUse.add(b.getLocation()); + e.cancel(); - ItemStack result = Pedestals.getRecipeOutput(catalyst, input); - if (result != null) { - if (Slimefun.hasUnlocked(e.getPlayer(), result, true)) { - List consumed = new ArrayList<>(); - consumed.add(catalyst); + ItemStack catalyst = new CustomItem(e.getPlayer().getInventory().getItemInMainHand(), 1); + List pedestals = Pedestals.getPedestals(b); - if (e.getPlayer().getGameMode() != GameMode.CREATIVE) { - ItemUtils.consumeItem(e.getPlayer().getInventory().getItemInMainHand(), false); - } + if (!altars.contains(b)) { + altars.add(b); + if (pedestals.size() == 8) { + pedestals.forEach(block -> altarsInUse.add(block.getLocation())); - Slimefun.runSync(new RitualAnimation(this, altars, b, b.getLocation().add(0.5, 1.3, 0.5), result, pedestals, consumed), 10L); + if (catalyst.getType() != Material.AIR) { + List input = new ArrayList<>(); + for (Block pedestal : pedestals) { + Item stack = findItem(pedestal); + if (stack != null) input.add(fixItemStack(stack.getItemStack(), stack.getCustomName())); + } + + ItemStack result = Pedestals.getRecipeOutput(catalyst, input); + if (result != null) { + if (Slimefun.hasUnlocked(e.getPlayer(), result, true)) { + List consumed = new ArrayList<>(); + consumed.add(catalyst); + + if (e.getPlayer().getGameMode() != GameMode.CREATIVE) { + ItemUtils.consumeItem(e.getPlayer().getInventory().getItemInMainHand(), false); } - else { - altars.remove(e.getClickedBlock()); - pedestals.forEach(block -> altarsInUse.remove(block.getLocation())); - - // Item not unlocked, no longer in use. - altarsInUse.remove(b.getLocation()); - } + Slimefun.runSync(new RitualAnimation(altars, b, b.getLocation().add(0.5, 1.3, 0.5), result, pedestals, consumed), 10L); } else { - altars.remove(e.getClickedBlock()); - SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.ANCIENT_ALTAR.unknown-recipe", true); + altars.remove(b); pedestals.forEach(block -> altarsInUse.remove(block.getLocation())); - // Bad recipe, no longer in use. + // Item not unlocked, no longer in use. altarsInUse.remove(b.getLocation()); } } else { - altars.remove(e.getClickedBlock()); - SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.ANCIENT_ALTAR.unknown-catalyst", true); + altars.remove(b); + SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.ANCIENT_ALTAR.unknown-recipe", true); pedestals.forEach(block -> altarsInUse.remove(block.getLocation())); - // Unknown catalyst, no longer in use + // Bad recipe, no longer in use. altarsInUse.remove(b.getLocation()); } } else { - altars.remove(e.getClickedBlock()); - SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.ANCIENT_ALTAR.not-enough-pedestals", true, msg -> msg.replace("%pedestals%", String.valueOf(pedestals.size()))); + altars.remove(b); + SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.ANCIENT_ALTAR.unknown-catalyst", true); - // Not a valid altar so remove from inuse - altarsInUse.remove(b.getLocation()); + pedestals.forEach(block -> altarsInUse.remove(block.getLocation())); + + // Unknown catalyst, no longer in use + altarsInUse.remove(b.getLocation()); } } + else { + altars.remove(b); + SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.ANCIENT_ALTAR.not-enough-pedestals", true, msg -> msg.replace("%pedestals%", String.valueOf(pedestals.size()))); + + // Not a valid altar so remove from inuse + altarsInUse.remove(b.getLocation()); + } } } } @@ -219,4 +230,8 @@ public class AncientAltarListener implements Listener { } } + public Set getRecipes() { + return altarRecipes; + } + } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BackpackListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BackpackListener.java index ea940c323..649a1c34c 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BackpackListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BackpackListener.java @@ -1,6 +1,9 @@ package io.github.thebusybiscuit.slimefun4.implementation.listeners; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.UUID; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -24,30 +27,27 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.Slimefun; -import me.mrCookieSlime.Slimefun.api.inventory.BackpackInventory; public class BackpackListener implements Listener { + private Map backpacks = new HashMap<>(); + public BackpackListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } @EventHandler public void onClose(InventoryCloseEvent e) { - if (SlimefunPlugin.getUtilities().enchanting.containsKey(e.getPlayer().getUniqueId())) { - SlimefunPlugin.getUtilities().enchanting.remove(e.getPlayer().getUniqueId()); - } - - if (SlimefunPlugin.getUtilities().backpack.containsKey(e.getPlayer().getUniqueId())) { + if (backpacks.containsKey(e.getPlayer().getUniqueId())) { ((Player) e.getPlayer()).playSound(e.getPlayer().getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - PlayerProfile.getBackpack(SlimefunPlugin.getUtilities().backpack.get(e.getPlayer().getUniqueId())).markDirty(); - SlimefunPlugin.getUtilities().backpack.remove(e.getPlayer().getUniqueId()); + PlayerProfile.getBackpack(backpacks.get(e.getPlayer().getUniqueId())).markDirty(); + backpacks.remove(e.getPlayer().getUniqueId()); } } @EventHandler public void onItemDrop(PlayerDropItemEvent e) { - if (SlimefunPlugin.getUtilities().backpack.containsKey(e.getPlayer().getUniqueId())){ + if (backpacks.containsKey(e.getPlayer().getUniqueId())){ ItemStack item = e.getItemDrop().getItemStack(); SlimefunItem sfItem = SlimefunItem.getByItem(item); @@ -57,7 +57,7 @@ public class BackpackListener implements Listener { @EventHandler public void onClick(InventoryClickEvent e) { - ItemStack item = SlimefunPlugin.getUtilities().backpack.get(e.getWhoClicked().getUniqueId()); + ItemStack item = backpacks.get(e.getWhoClicked().getUniqueId()); if (item != null) { if (e.getClick() == ClickType.NUMBER_KEY) { @@ -80,7 +80,7 @@ public class BackpackListener implements Listener { } } - public static void openBackpack(Player p, ItemStack item, SlimefunBackpack backpack) { + public void openBackpack(Player p, ItemStack item, SlimefunBackpack backpack) { if (item.getAmount() == 1) { if (Slimefun.hasUnlocked(p, backpack, true)) { if (!PlayerProfile.get(p, profile -> openBackpack(item, profile, backpack.getSize()))) @@ -90,21 +90,19 @@ public class BackpackListener implements Listener { else SlimefunPlugin.getLocal().sendMessage(p, "backpack.no-stack", true); } - private static void openBackpack(ItemStack item, PlayerProfile profile, int size) { + private void openBackpack(ItemStack item, PlayerProfile profile, int size) { Player p = profile.getPlayer(); for (int line = 0; line < item.getItemMeta().getLore().size(); line++) { if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - BackpackInventory backpack = profile.createBackpack(size); - - setBackpackId(p, item, line, backpack.getID()); + setBackpackId(p, item, line, profile.createBackpack(size).getID()); break; } } - if (!SlimefunPlugin.getUtilities().backpack.containsValue(item)) { + if (!backpacks.containsValue(item)) { p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - SlimefunPlugin.getUtilities().backpack.put(p.getUniqueId(), item); + backpacks.put(p.getUniqueId(), item); Slimefun.runSync(() -> PlayerProfile.getBackpack(item).open(p)); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunGuideListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunGuideListener.java index 4c3e55fff..2297ec167 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunGuideListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunGuideListener.java @@ -2,11 +2,12 @@ package io.github.thebusybiscuit.slimefun4.implementation.listeners; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent; import io.github.thebusybiscuit.slimefun4.core.guide.GuideSettings; import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout; import me.mrCookieSlime.Slimefun.SlimefunGuide; @@ -34,20 +35,26 @@ public class SlimefunGuideListener implements Listener { } } - @EventHandler - public void onInteract(PlayerInteractEvent e) { + @EventHandler(priority = EventPriority.LOWEST) + public void onInteract(PlayerRightClickEvent e) { Player p = e.getPlayer(); ItemStack item = e.getItem(); if (SlimefunManager.isItemSimilar(item, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true)) { + e.cancel(); + if (p.isSneaking()) GuideSettings.openSettings(p, item); else SlimefunGuide.openGuide(p, SlimefunGuideLayout.BOOK); } else if (SlimefunManager.isItemSimilar(item, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true)) { + e.cancel(); + if (p.isSneaking()) GuideSettings.openSettings(p, item); else SlimefunGuide.openGuide(p, SlimefunGuideLayout.CHEST); } else if (SlimefunManager.isItemSimilar(item, SlimefunGuide.getItem(SlimefunGuideLayout.CHEAT_SHEET), true)) { + e.cancel(); + if (p.isSneaking()) GuideSettings.openSettings(p, item); else { // We rather just run the command here, diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunItemListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunItemListener.java index c762238de..8612a2f7d 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunItemListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunItemListener.java @@ -1,10 +1,8 @@ package io.github.thebusybiscuit.slimefun4.implementation.listeners; -import java.util.List; import java.util.Optional; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.IronGolem; @@ -25,12 +23,12 @@ import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent; import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent; import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Juice; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.MultiTool; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockUseHandler; import me.mrCookieSlime.Slimefun.Objects.handlers.ItemConsumptionHandler; import me.mrCookieSlime.Slimefun.Objects.handlers.ItemDropHandler; @@ -40,43 +38,77 @@ import me.mrCookieSlime.Slimefun.Objects.handlers.ItemUseHandler; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.Slimefun; -import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu; -import me.mrCookieSlime.Slimefun.utils.Utilities; public class SlimefunItemListener implements Listener { - private final Utilities utilities; - public SlimefunItemListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); - utilities = SlimefunPlugin.getUtilities(); } @EventHandler public void onRightClick(PlayerInteractEvent e) { if (e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK) { - io.github.thebusybiscuit.slimefun4.api.events.ItemUseEvent event = new io.github.thebusybiscuit.slimefun4.api.events.ItemUseEvent(e); + PlayerRightClickEvent event = new PlayerRightClickEvent(e); Bukkit.getPluginManager().callEvent(event); - boolean itemUsed = e.getHand() == EquipmentSlot.HAND; + boolean itemUsed = e.getHand() == EquipmentSlot.OFF_HAND; if (event.useItem() != Result.DENY) { Optional optional = event.getSlimefunItem(); if (optional.isPresent() && Slimefun.hasUnlocked(e.getPlayer(), optional.get(), true)) { - optional.get().callItemHandler(ItemUseHandler.class, handler -> handler.onRightClick(event)); - itemUsed = true; + itemUsed = optional.get().callItemHandler(ItemUseHandler.class, handler -> handler.onRightClick(event)); } } if (!itemUsed && event.useBlock() != Result.DENY) { Optional optional = event.getSlimefunBlock(); - if (optional.isPresent() && Slimefun.hasUnlocked(e.getPlayer(), optional.get(), true)) { - optional.get().callItemHandler(BlockUseHandler.class, handler -> handler.onRightClick(event)); + if (optional.isPresent()) { + if (!Slimefun.hasUnlocked(e.getPlayer(), optional.get(), true)) { + e.setCancelled(true); + return; + } + + boolean interactable = optional.get().callItemHandler(BlockUseHandler.class, handler -> handler.onRightClick(event)); + + if (!interactable) { + String id = optional.get().getID(); + Player p = e.getPlayer(); + ItemStack item = event.getItem(); + + if (BlockMenuPreset.isInventory(id) && !canPlaceCargoNodes(p, item, e.getClickedBlock().getRelative(e.getBlockFace()))) { + e.setCancelled(true); + + if (!p.isSneaking() || item == null) { + if (BlockStorage.hasUniversalInventory(id)) { + UniversalBlockMenu menu = BlockStorage.getUniversalInventory(id); + + if (menu.canOpen(e.getClickedBlock(), p)) { + menu.open(p); + } + else { + SlimefunPlugin.getLocal().sendMessage(p, "inventory.no-access", true); + } + } + else if (BlockStorage.getStorage(e.getClickedBlock().getWorld()).hasInventory(e.getClickedBlock().getLocation())) { + BlockMenu menu = BlockStorage.getInventory(e.getClickedBlock().getLocation()); + + if (menu.canOpen(e.getClickedBlock(), p)) { + menu.open(p); + } + else { + SlimefunPlugin.getLocal().sendMessage(p, "inventory.no-access", true); + } + } + } + + return; + } + } } } @@ -118,36 +150,6 @@ public class SlimefunItemListener implements Listener { } } } - - - if (e.getClickedBlock() != null && BlockStorage.hasBlockInfo(e.getClickedBlock())) { - String id = BlockStorage.checkID(e.getClickedBlock()); - - if (BlockMenuPreset.isInventory(id) && !canPlaceCargoNodes(p, item, e.getClickedBlock().getRelative(e.getParentEvent().getBlockFace())) && (!p.isSneaking() || item == null || item.getType() == Material.AIR)) { - e.setCancelled(true); - - if (BlockStorage.hasUniversalInventory(id)) { - UniversalBlockMenu menu = BlockStorage.getUniversalInventory(id); - - if (menu.canOpen(e.getClickedBlock(), p)) { - menu.open(p); - } - else { - SlimefunPlugin.getLocal().sendMessage(p, "inventory.no-access", true); - } - } - else if (BlockStorage.getStorage(e.getClickedBlock().getWorld()).hasInventory(e.getClickedBlock().getLocation())) { - BlockMenu menu = BlockStorage.getInventory(e.getClickedBlock().getLocation()); - - if (menu.canOpen(e.getClickedBlock(), p)) { - menu.open(p); - } - else { - SlimefunPlugin.getLocal().sendMessage(p, "inventory.no-access", true); - } - } - } - } } private boolean canPlaceCargoNodes(Player p, ItemStack item, Block b) { diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBackpack.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBackpack.java index 4b1649796..0dd203599 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBackpack.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBackpack.java @@ -3,6 +3,7 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.slimefun4.implementation.listeners.BackpackListener; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.handlers.ItemUseHandler; @@ -24,7 +25,13 @@ public class SlimefunBackpack extends SimpleSlimefunItem { @Override public ItemUseHandler getItemHandler() { - return e -> BackpackListener.openBackpack(e.getPlayer(), e.getItem(), this); + return e -> { + BackpackListener listener = SlimefunPlugin.getBackpackListener(); + + if (listener != null) { + listener.openBackpack(e.getPlayer(), e.getItem(), this); + } + }; } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java index 2168d215f..1bcfa7098 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java @@ -247,7 +247,7 @@ public class SlimefunItem implements Placeable { postRegister(); } catch(Exception x) { - Slimefun.getLogger().log(Level.WARNING, "Registering the Item '" + id + "' for Slimefun " + Slimefun.getVersion() + " has failed", x); + Slimefun.getLogger().log(Level.WARNING, "Registering the Item '" + id + "' for Slimefun " + SlimefunPlugin.getVersion() + " has failed", x); } } @@ -582,12 +582,15 @@ public class SlimefunItem implements Placeable { return false; } - public void callItemHandler(Class c, Consumer callable) { + public boolean callItemHandler(Class c, Consumer callable) { Optional handler = itemhandlers.get(c); if (handler.isPresent()) { callable.accept(c.cast(handler.get())); + return true; } + + return false; } public boolean isTicking() { diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoManagerBlock.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoManagerBlock.java index 65f4350a0..2ac748a74 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoManagerBlock.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/cargo/CargoManagerBlock.java @@ -7,7 +7,7 @@ import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.slimefun4.api.events.ItemUseEvent; +import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent; import io.github.thebusybiscuit.slimefun4.utils.holograms.SimpleHologram; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.Slimefun.Lists.RecipeType; @@ -47,7 +47,7 @@ public class CargoManagerBlock extends SlimefunItem { }, new BlockUseHandler() { @Override - public void onRightClick(ItemUseEvent e) { + public void onRightClick(PlayerRightClickEvent e) { Optional block = e.getClickedBlock(); if (block.isPresent()) { Player p = e.getPlayer(); diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/AncientAltar.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/AncientAltar.java new file mode 100644 index 000000000..da4e2d7b4 --- /dev/null +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/AncientAltar.java @@ -0,0 +1,5 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; + +public class AncientAltar { + +} diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/BlockUseHandler.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/BlockUseHandler.java index 494c7f70a..631a01f98 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/BlockUseHandler.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/BlockUseHandler.java @@ -1,11 +1,11 @@ package me.mrCookieSlime.Slimefun.Objects.handlers; -import io.github.thebusybiscuit.slimefun4.api.events.ItemUseEvent; +import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent; @FunctionalInterface public interface BlockUseHandler extends ItemHandler { - void onRightClick(ItemUseEvent e); + void onRightClick(PlayerRightClickEvent e); @Override default Class getIdentifier() { diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/ItemUseHandler.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/ItemUseHandler.java index 35b32f05d..f97b6f67c 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/ItemUseHandler.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/ItemUseHandler.java @@ -1,11 +1,11 @@ package me.mrCookieSlime.Slimefun.Objects.handlers; -import io.github.thebusybiscuit.slimefun4.api.events.ItemUseEvent; +import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent; @FunctionalInterface public interface ItemUseHandler extends ItemHandler { - void onRightClick(ItemUseEvent e); + void onRightClick(PlayerRightClickEvent e); @Override default Class getIdentifier() { diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java b/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java index 23c6a6a1b..06ec26f31 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java @@ -32,7 +32,7 @@ import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils; import io.github.thebusybiscuit.cscorelib2.item.CustomItem; import io.github.thebusybiscuit.cscorelib2.materials.MaterialCollections; import io.github.thebusybiscuit.cscorelib2.skull.SkullItem; -import io.github.thebusybiscuit.slimefun4.api.events.ItemUseEvent; +import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent; import io.github.thebusybiscuit.slimefun4.utils.FireworkUtils; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.Slimefun.SlimefunPlugin; @@ -1533,7 +1533,7 @@ public final class SlimefunSetup { ); @Override - public void onRightClick(ItemUseEvent e) { + public void onRightClick(PlayerRightClickEvent e) { e.cancel(); Player p = e.getPlayer(); @@ -1579,8 +1579,6 @@ public final class SlimefunSetup { new ItemStack[] {null, new ItemStack(Material.ENCHANTING_TABLE), null, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.GOLD_8K, SlimefunItems.MAGIC_LUMP_3, new ItemStack(Material.OBSIDIAN), SlimefunItems.GOLD_8K, new ItemStack(Material.OBSIDIAN)}) .register(true); - // Slimefun 4 - new EnergyRegulator(Categories.ELECTRICITY, (SlimefunItemStack) SlimefunItems.ENERGY_REGULATOR, RecipeType.ENHANCED_CRAFTING_TABLE, new ItemStack[] {SlimefunItems.SILVER_INGOT, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.SILVER_INGOT, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.ELECTRIC_MOTOR, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.SILVER_INGOT, SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.SILVER_INGOT}) .register(true); diff --git a/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java b/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java index d4373798b..aa0eadf88 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java @@ -108,6 +108,9 @@ public final class SlimefunPlugin extends JavaPlugin { // Supported Versions of Minecraft private final String[] supported = {"v1_14_", "v1_15_"}; + + private AncientAltarListener ancientAltarListener; + private BackpackListener backpackListener; @Override public void onEnable() { @@ -237,13 +240,18 @@ public final class SlimefunPlugin extends JavaPlugin { new ExplosionsListener(this); new DebugFishListener(this); new VanillaMachinesListener(this); + + ancientAltarListener = new AncientAltarListener(); // Toggleable Listeners for performance if (config.getBoolean("items.talismans")) new TalismanListener(this); - if (config.getBoolean("items.backpacks")) new BackpackListener(this); if (config.getBoolean("items.coolers")) new CoolerListener(this); if (config.getBoolean("items.soulbound")) new SoulboundListener(this); + if (config.getBoolean("items.backpacks")) { + backpackListener = new BackpackListener(this); + } + // Handle Slimefun Guide being given on Join new SlimefunGuideListener(this, config.getBoolean("options.give-guide-on-first-join")); @@ -263,7 +271,10 @@ public final class SlimefunPlugin extends JavaPlugin { new BlockStorage(world); } - if (SlimefunItem.getByID("ANCIENT_ALTAR") != null) new AncientAltarListener(this); + if (SlimefunItem.getByID("ANCIENT_ALTAR") != null) { + ancientAltarListener.load(this); + } + if (SlimefunItem.getByID("GRAPPLING_HOOK") != null) new GrapplingHookListener(this); if (SlimefunItem.getByID("IGNITION_CHAMBER") != null) new IgnitionChamberListener(this); }, 0); @@ -455,5 +466,13 @@ public final class SlimefunPlugin extends JavaPlugin { public static NetworkManager getNetworkManager() { return instance.networkManager; } + + public static AncientAltarListener getAncientAltarListener() { + return instance.ancientAltarListener; + } + + public static BackpackListener getBackpackListener() { + return instance.backpackListener; + } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/AltarRecipe.java b/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/AltarRecipe.java index 8038b788e..9b979fec4 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/AltarRecipe.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/AltarRecipe.java @@ -29,7 +29,7 @@ public class AltarRecipe { this.output = output; - SlimefunPlugin.getUtilities().altarRecipes.add(this); + SlimefunPlugin.getAncientAltarListener().getRecipes().add(this); } public ItemStack getCatalyst() { diff --git a/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/Pedestals.java b/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/Pedestals.java index 050da1b32..daa448ea2 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/Pedestals.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/Pedestals.java @@ -66,7 +66,7 @@ public final class Pedestals { } private static ItemStack checkRecipe(ItemStack catalyst, List items) { - for (AltarRecipe recipe : SlimefunPlugin.getUtilities().altarRecipes) { + for (AltarRecipe recipe : SlimefunPlugin.getAncientAltarListener().getRecipes()) { if (SlimefunManager.isItemSimilar(catalyst, recipe.getCatalyst(), true)) { for (int i = 0; i < 8; i++) { if (SlimefunManager.isItemSimilar(items.get(i), recipe.getInput().get(0), true)) { diff --git a/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/RitualAnimation.java b/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/RitualAnimation.java index e0392f015..a5ea67ace 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/RitualAnimation.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/ancient_altar/RitualAnimation.java @@ -21,8 +21,6 @@ import me.mrCookieSlime.Slimefun.api.Slimefun; public class RitualAnimation implements Runnable { - private final AncientAltarListener listener; - private final List altars; private final Block altar; @@ -37,9 +35,7 @@ public class RitualAnimation implements Runnable { private boolean running; private int stage; - public RitualAnimation(AncientAltarListener listener, List altars, Block altar, Location drop, ItemStack output, List pedestals, List items) { - this.listener = listener; - + public RitualAnimation(List altars, Block altar, Location drop, ItemStack output, List pedestals, List items) { this.dropLocation = drop; this.altar = altar; this.altars = altars; @@ -121,6 +117,7 @@ public class RitualAnimation implements Runnable { private void abort() { running = false; + AncientAltarListener listener = SlimefunPlugin.getAncientAltarListener(); pedestals.forEach(b -> listener.getAltarsInUse().remove(b.getLocation())); // This should re-enable altar blocks on craft failure. @@ -136,6 +133,7 @@ public class RitualAnimation implements Runnable { dropLocation.getWorld().playEffect(dropLocation, Effect.STEP_SOUND, Material.EMERALD_BLOCK); dropLocation.getWorld().dropItemNaturally(dropLocation.add(0, -0.5, 0), output); + AncientAltarListener listener = SlimefunPlugin.getAncientAltarListener(); pedestals.forEach(b -> listener.getAltarsInUse().remove(b.getLocation())); // This should re-enable altar blocks on craft completion. diff --git a/src/main/java/me/mrCookieSlime/Slimefun/utils/Utilities.java b/src/main/java/me/mrCookieSlime/Slimefun/utils/Utilities.java index 674fd20f4..76c5623fa 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/utils/Utilities.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/utils/Utilities.java @@ -105,11 +105,6 @@ public final class Utilities { public final Set damage = new HashSet<>(); public final Map remove = new HashMap<>(); - public final Map enchanting = new HashMap<>(); - public final Map backpack = new HashMap<>(); - - public final Set altarRecipes = new HashSet<>(); - public final List blocks = new ArrayList<>(); public final List cancelPlace = new ArrayList<>();