1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-19 19:25:48 +00:00

Possibly fixes #1313 + Performance Improvements

This commit is contained in:
TheBusyBiscuit 2020-01-28 23:36:28 +01:00
parent 1f672905d2
commit 2133f528a9
19 changed files with 225 additions and 175 deletions

View File

@ -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

View File

@ -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());

View File

@ -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) {

View File

@ -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<AltarRecipe> altarRecipes = new HashSet<>();
private final Set<Location> altarsInUse = new HashSet<>();
private final List<Block> altars = new ArrayList<>();
private final Set<UUID> 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<Block> blockOptional = e.getClickedBlock();
if (!blockOptional.isPresent()) return;
Block b = blockOptional.get();
if (b.getType() != Material.ENCHANTING_TABLE && b.getType() != Material.DISPENSER) return;
Optional<SlimefunItem> 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<Block> 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<ItemStack> 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<ItemStack> consumed = new ArrayList<>();
consumed.add(catalyst);
ItemStack catalyst = new CustomItem(e.getPlayer().getInventory().getItemInMainHand(), 1);
List<Block> 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<ItemStack> 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<ItemStack> 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<AltarRecipe> getRecipes() {
return altarRecipes;
}
}

View File

@ -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<UUID, ItemStack> 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: <ID>"))) {
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));
}

View File

@ -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,

View File

@ -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<SlimefunItem> 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<SlimefunItem> 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) {

View File

@ -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<ItemUseHandler> {
@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);
}
};
}
}

View File

@ -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 <T extends ItemHandler> void callItemHandler(Class<T> c, Consumer<T> callable) {
public <T extends ItemHandler> boolean callItemHandler(Class<T> c, Consumer<T> callable) {
Optional<ItemHandler> handler = itemhandlers.get(c);
if (handler.isPresent()) {
callable.accept(c.cast(handler.get()));
return true;
}
return false;
}
public boolean isTicking() {

View File

@ -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> block = e.getClickedBlock();
if (block.isPresent()) {
Player p = e.getPlayer();

View File

@ -0,0 +1,5 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks;
public class AncientAltar {
}

View File

@ -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<? extends ItemHandler> getIdentifier() {

View File

@ -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<? extends ItemHandler> getIdentifier() {

View File

@ -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);

View File

@ -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;
}
}

View File

@ -29,7 +29,7 @@ public class AltarRecipe {
this.output = output;
SlimefunPlugin.getUtilities().altarRecipes.add(this);
SlimefunPlugin.getAncientAltarListener().getRecipes().add(this);
}
public ItemStack getCatalyst() {

View File

@ -66,7 +66,7 @@ public final class Pedestals {
}
private static ItemStack checkRecipe(ItemStack catalyst, List<ItemStack> 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)) {

View File

@ -21,8 +21,6 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
public class RitualAnimation implements Runnable {
private final AncientAltarListener listener;
private final List<Block> 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<Block> altars, Block altar, Location drop, ItemStack output, List<Block> pedestals, List<ItemStack> items) {
this.listener = listener;
public RitualAnimation(List<Block> altars, Block altar, Location drop, ItemStack output, List<Block> pedestals, List<ItemStack> 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.

View File

@ -105,11 +105,6 @@ public final class Utilities {
public final Set<UUID> damage = new HashSet<>();
public final Map<UUID, Entity[]> remove = new HashMap<>();
public final Map<UUID, Integer> enchanting = new HashMap<>();
public final Map<UUID, ItemStack> backpack = new HashMap<>();
public final Set<AltarRecipe> altarRecipes = new HashSet<>();
public final List<UUID> blocks = new ArrayList<>();
public final List<UUID> cancelPlace = new ArrayList<>();