ChestSort/src/main/java/de/jeff_media/chestsort/listeners/ChestSortListener.java

768 lines
31 KiB
Java
Raw Normal View History

2021-05-30 20:52:40 +02:00
package de.jeff_media.chestsort.listeners;
import de.jeff_media.chestsort.api.ChestSortEvent;
2021-05-30 20:52:40 +02:00
import de.jeff_media.chestsort.config.Messages;
2021-06-21 00:22:47 +02:00
import de.jeff_media.chestsort.enums.Hotkey;
2021-10-16 10:25:07 +02:00
import de.jeff_media.chestsort.events.ChestSortLeftClickHotkeyEvent;
2021-05-30 20:55:43 +02:00
import de.jeff_media.chestsort.handlers.Logger;
2021-05-30 20:52:40 +02:00
import de.jeff_media.chestsort.ChestSortPlugin;
import de.jeff_media.chestsort.api.*;
2021-05-30 20:55:43 +02:00
import de.jeff_media.chestsort.data.PlayerSetting;
2021-05-19 15:16:24 +02:00
import de.jeff_media.chestsort.hooks.*;
import de.jeff_media.chestsort.utils.LlamaUtils;
2021-09-28 14:35:03 +02:00
import de.jeff_media.jefflib.ProtectionUtils;
2021-04-15 19:27:56 +02:00
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
2020-06-02 02:02:24 +02:00
import org.bukkit.Bukkit;
2019-04-25 16:25:57 +02:00
import org.bukkit.GameMode;
2019-07-13 23:27:35 +02:00
import org.bukkit.Material;
2021-04-15 19:27:56 +02:00
import org.bukkit.block.*;
2020-06-13 17:27:40 +02:00
import org.bukkit.entity.ChestedHorse;
2019-04-25 16:25:57 +02:00
import org.bukkit.entity.Player;
2021-10-16 10:25:07 +02:00
import org.bukkit.event.Event;
2019-04-25 16:25:57 +02:00
import org.bukkit.event.EventHandler;
2019-05-02 15:28:39 +02:00
import org.bukkit.event.EventPriority;
2021-04-15 19:27:56 +02:00
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.InventoryClickEvent;
2019-04-25 16:25:57 +02:00
import org.bukkit.event.inventory.InventoryCloseEvent;
2019-05-01 13:23:56 +02:00
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.InventoryType;
2020-06-24 17:50:58 +02:00
import org.bukkit.event.inventory.InventoryType.SlotType;
2021-04-15 19:27:56 +02:00
import org.bukkit.event.player.PlayerInteractEvent;
2019-04-25 16:25:57 +02:00
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
2021-04-15 19:27:56 +02:00
import org.bukkit.inventory.EquipmentSlot;
2019-05-02 15:28:39 +02:00
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
2020-09-13 01:45:27 +02:00
import org.bukkit.inventory.ItemStack;
import java.util.HashMap;
2019-04-25 16:25:57 +02:00
2022-07-19 11:08:08 +02:00
public class ChestSortListener implements org.bukkit.event.Listener {
2019-04-25 16:25:57 +02:00
2020-06-24 20:32:16 +02:00
final ChestSortPlugin plugin;
2021-05-30 20:52:40 +02:00
public final MinepacksHook minepacksHook;
2020-07-12 15:56:49 +02:00
final HeadDatabaseHook headDatabaseHook;
final GoldenCratesHook goldenCratesHook;
2021-09-06 01:37:06 +02:00
final AdvancedChestsHook advancedChestsHook;
2020-06-24 17:50:58 +02:00
2021-10-16 10:25:07 +02:00
private static Event ignoredEvent;
2022-07-19 11:08:08 +02:00
public ChestSortListener(ChestSortPlugin plugin) {
2020-06-24 17:50:58 +02:00
this.plugin = plugin;
this.minepacksHook = new MinepacksHook(plugin);
2020-07-12 15:56:49 +02:00
this.headDatabaseHook = new HeadDatabaseHook(plugin);
this.goldenCratesHook = new GoldenCratesHook(plugin);
2021-09-06 01:37:06 +02:00
this.advancedChestsHook = new AdvancedChestsHook(plugin);
2020-06-24 17:50:58 +02:00
}
2021-04-15 19:27:56 +02:00
@EventHandler
public void onLeftClickChest(PlayerInteractEvent event) {
2021-10-16 10:25:07 +02:00
if(event instanceof ChestSortLeftClickHotkeyEvent) {
return;
}
2021-09-29 15:58:36 +02:00
// checking in lower case for lazy admins
if (plugin.getDisabledWorlds().contains(event.getPlayer().getWorld().getName().toLowerCase())) {
return;
}
2021-04-15 19:27:56 +02:00
if(!event.getPlayer().hasPermission("chestsort.use")) return;
2021-06-24 15:53:58 +02:00
if(!event.getPlayer().hasPermission(Hotkey.getPermission(Hotkey.OUTSIDE))) return;
2021-04-15 19:27:56 +02:00
if(event.getHand() != EquipmentSlot.HAND) return;
if(event.getAction() != Action.LEFT_CLICK_BLOCK) return;
if(!plugin.getConfig().getBoolean("allow-left-click-to-sort")) return;
Block clickedBlock = event.getClickedBlock();
if(!(clickedBlock.getState() instanceof Container)) return;
2021-10-01 15:22:17 +02:00
if(!belongsToChestLikeBlock(((Container)clickedBlock.getState()).getInventory())) return;
2021-09-30 07:12:30 +02:00
if(CrateReloadedHook.isCrate(clickedBlock)) {
return;
}
2021-10-16 10:25:07 +02:00
plugin.registerPlayerIfNeeded(event.getPlayer());
PlayerSetting playerSetting = plugin.getPlayerSetting(event.getPlayer());
if(!playerSetting.leftClickOutside) return;
if(plugin.getConfig().getBoolean("mute-protection-plugins")) {
2021-10-09 19:46:07 +02:00
if (!ProtectionUtils.canInteract(event.getPlayer(), clickedBlock, plugin.getConfig().getBoolean("mute-protection-plugins"))) {
//System.out.println("ChestSort: cannot interact!");
return;
}
2021-10-16 10:25:07 +02:00
} else {
ChestSortLeftClickHotkeyEvent testEvent = new ChestSortLeftClickHotkeyEvent(event.getPlayer(), Action.RIGHT_CLICK_BLOCK, event.getPlayer().getInventory().getItemInMainHand(), clickedBlock, BlockFace.UP, EquipmentSlot.HAND);
Bukkit.getPluginManager().callEvent(testEvent);
if(testEvent.isCancelled() || testEvent.useInteractedBlock() == Event.Result.DENY) {
return;
}
}
2021-10-09 19:46:07 +02:00
2021-04-15 19:27:56 +02:00
Container containerState = (Container) clickedBlock.getState();
Inventory inventory = containerState.getInventory();
2022-07-19 11:08:08 +02:00
try {
if (!advancedChestsHook.handleAChestSortingIfPresent(clickedBlock.getLocation())) {
plugin.getOrganizer().sortInventory(inventory);
}
} catch (Throwable ignored) {
// TODO: Remove when everyone updated AdvancedChests
}
2021-05-30 20:52:40 +02:00
event.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(Messages.MSG_CONTAINER_SORTED));
2021-04-15 19:27:56 +02:00
}
2020-06-24 17:50:58 +02:00
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
2021-05-30 21:00:10 +02:00
plugin.getPermissionsHandler().addPermissions(event.getPlayer());
2020-06-24 17:50:58 +02:00
// Put player into our perPlayerSettings map
plugin.registerPlayerIfNeeded(event.getPlayer());
2021-05-30 21:00:10 +02:00
plugin.getLgr().logPlayerJoin(event.getPlayer());
2020-07-04 15:48:51 +02:00
2020-06-24 17:50:58 +02:00
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
2021-05-30 21:00:10 +02:00
plugin.getPermissionsHandler().removePermissions(event.getPlayer());
2020-06-24 17:50:58 +02:00
plugin.unregisterPlayer(event.getPlayer());
}
@EventHandler
public void onBackPackClose(InventoryCloseEvent event) {
if (plugin.getConfig().getString("sort-time").equalsIgnoreCase("close")
|| plugin.getConfig().getString("sort-time").equalsIgnoreCase("both"))
onBackPackUse(event.getInventory(), (Player) event.getPlayer());
}
@EventHandler
public void onBackPackOpen(InventoryOpenEvent event) {
if (plugin.getConfig().getString("sort-time").equalsIgnoreCase("open")
|| plugin.getConfig().getString("sort-time").equalsIgnoreCase("both"))
onBackPackUse(event.getInventory(), (Player) event.getPlayer());
}
void onBackPackUse(Inventory inv, Player p) {
2020-07-17 22:19:48 +02:00
if(!plugin.getConfig().getBoolean("allow-automatic-sorting")) return; //TODO: Maybe change to allow-automatic-inventory-sorting ?
2020-06-24 17:50:58 +02:00
if (!minepacksHook.isMinepacksBackpack(inv)) return;
if (!p.hasPermission("chestsort.use")) return;
2021-07-19 06:13:06 +02:00
if (!p.hasPermission("chestsort.automatic")) return;
2020-06-24 17:50:58 +02:00
plugin.registerPlayerIfNeeded(p);
2021-05-30 21:00:10 +02:00
PlayerSetting setting = plugin.getPerPlayerSettings().get(p.getUniqueId().toString());
2020-06-24 17:50:58 +02:00
if (!setting.sortingEnabled) return;
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().sortInventory(inv);
2020-06-24 17:50:58 +02:00
}
@EventHandler
public void onPlayerInventoryClose(InventoryCloseEvent event) {
2020-07-17 22:19:48 +02:00
2020-09-29 21:33:40 +02:00
plugin.debug("Attempt to automatically sort a player inventory");
2020-07-17 22:19:48 +02:00
2020-09-29 21:33:40 +02:00
if (event.getInventory().getHolder() == null) {
plugin.debug("Abort: holder == null");
return;
}
2020-06-24 20:53:10 +02:00
// Might be obsolete, because its @NotNull in 1.15, but who knows if thats for 1.8
2020-09-29 21:33:40 +02:00
if (event.getInventory().getType() == null) {
plugin.debug("Abort: type == null");
return;
}
if (event.getInventory().getType() != InventoryType.CRAFTING) {
plugin.debug("Abort: type != CRAFTING, but "+event.getInventory().getType().name());
2020-06-24 17:50:58 +02:00
return; // Weird! Returns CRAFTING instead of PLAYER
2020-09-29 21:33:40 +02:00
}
if (!(event.getInventory().getHolder() instanceof Player)) {
plugin.debug("Abort: holder ! instanceof Player");
return;
}
if(!plugin.getConfig().getBoolean("allow-automatic-inventory-sorting")) {
plugin.debug("allow-automatic-inventory-sorting is false");
return;
}
2020-06-24 17:50:58 +02:00
Player p = (Player) event.getInventory().getHolder();
2021-07-19 06:13:06 +02:00
if (!p.hasPermission("chestsort.use.inventory") || !p.hasPermission("chestsort.automatic")) {
plugin.debug("Missing permission chestsort.use.inventory or chestsort.automatic");
2020-09-29 21:33:40 +02:00
return;
}
2020-06-24 17:50:58 +02:00
plugin.registerPlayerIfNeeded(p);
2021-05-30 21:00:10 +02:00
PlayerSetting setting = plugin.getPerPlayerSettings().get(p.getUniqueId().toString());
2020-09-29 21:33:40 +02:00
if (!setting.invSortingEnabled) {
plugin.debug("auto inv sorting not enabled for player "+p.getName());
return;
}
2020-06-24 17:50:58 +02:00
2021-05-30 21:00:10 +02:00
plugin.getLgr().logSort(p, Logger.SortCause.INV_CLOSE);
2020-07-04 15:48:51 +02:00
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().sortInventory(p.getInventory(), 9, 35);
2020-06-24 17:50:58 +02:00
}
// This event fires when someone closes an inventory
2021-09-06 01:37:06 +02:00
// We check if the closed inventory belongs to a chest, advancedchest, shulkerbox or barrel,
2020-06-24 17:50:58 +02:00
// and then call the Organizer to sort the inventory (if the player has
// the chestsort.use permission and has /chestsort enabled)
@EventHandler
public void onChestClose(InventoryCloseEvent event) {
2020-07-17 22:19:48 +02:00
if(!plugin.getConfig().getBoolean("allow-automatic-sorting")) return;
2020-06-24 17:50:58 +02:00
if (!(plugin.getConfig().getString("sort-time").equalsIgnoreCase("close")
|| plugin.getConfig().getString("sort-time").equalsIgnoreCase("both"))) {
return;
}
// event.getPlayer returns HumanEntity, so it could also be an NPC or something
if (!(event.getPlayer() instanceof Player)) {
return;
}
Player p = (Player) event.getPlayer();
Inventory inventory = event.getInventory();
2021-07-19 06:13:06 +02:00
if(!p.hasPermission("chestsort.automatic")) return;
if (!isAPICall(inventory)
&& !belongsToChestLikeBlock(inventory)
2021-05-30 21:00:10 +02:00
&& !plugin.getEnderContainersHook().isEnderchest(inventory)
&& !LlamaUtils.belongsToLlama(inventory)
2021-09-06 01:37:06 +02:00
&& !advancedChestsHook.isAnAdvancedChest(inventory)
&& !plugin.getOrganizer().isMarkedAsSortable(inventory)) {
2020-06-24 17:50:58 +02:00
return;
}
if (!isReadyToSort(p)) {
return;
}
// Finally call the Organizer to sort the inventory
2021-05-30 21:00:10 +02:00
plugin.getLgr().logSort(p, Logger.SortCause.CONT_CLOSE);
2020-07-04 15:48:51 +02:00
2020-06-24 17:50:58 +02:00
// Llama inventories need special start/end slots
if (LlamaUtils.belongsToLlama(event.getInventory())) {
ChestedHorse llama = (ChestedHorse) event.getInventory().getHolder();
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().sortInventory(event.getInventory(), 2, LlamaUtils.getLlamaChestSize(llama) + 1);
2020-06-24 17:50:58 +02:00
return;
}
2021-09-06 01:37:06 +02:00
// If the involved inventory belongs to an AdvancedChest, sort all the pages.
if(advancedChestsHook.handleAChestSortingIfPresent(event.getInventory()))return;
2020-06-24 17:50:58 +02:00
// Normal container inventories can be sorted completely
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().sortInventory(event.getInventory());
2020-06-24 17:50:58 +02:00
}
@EventHandler(priority = EventPriority.MONITOR)
public void onChestOpen(InventoryOpenEvent event) {
2020-09-29 21:33:40 +02:00
plugin.debug("onChestOpen (InventoryOpenEvent");
2020-07-17 22:19:48 +02:00
if(!plugin.getConfig().getBoolean("allow-automatic-sorting")) return;
2020-06-24 17:50:58 +02:00
if (!(plugin.getConfig().getString("sort-time").equalsIgnoreCase("open")
|| plugin.getConfig().getString("sort-time").equalsIgnoreCase("both"))) {
return;
}
if (event.isCancelled()) {
return;
}
// event.getPlayer returns HumanEntity, so it could also be an NPC or something
if (!(event.getPlayer() instanceof Player)) {
return;
}
Player p = (Player) event.getPlayer();
Inventory inventory = event.getInventory();
2021-07-19 06:13:06 +02:00
if(!p.hasPermission("chestsort.automatic")) return;
if (!isAPICall(inventory)
&& !belongsToChestLikeBlock(inventory)
2021-05-30 21:00:10 +02:00
&& !plugin.getEnderContainersHook().isEnderchest(inventory)
&& !LlamaUtils.belongsToLlama(inventory)
2021-09-06 01:37:06 +02:00
&& !advancedChestsHook.isAnAdvancedChest(inventory)
&& !plugin.getOrganizer().isMarkedAsSortable(inventory)) {
2020-06-24 17:50:58 +02:00
return;
}
if (!isReadyToSort(p)) {
return;
}
// Finally call the Organizer to sort the inventory
2021-05-30 21:00:10 +02:00
plugin.getLgr().logSort(p, Logger.SortCause.CONT_OPEN);
2020-07-04 15:48:51 +02:00
2020-06-24 17:50:58 +02:00
// Llama inventories need special start/end slots
if (LlamaUtils.belongsToLlama(event.getInventory())) {
ChestedHorse llama = (ChestedHorse) event.getInventory().getHolder();
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().sortInventory(event.getInventory(), 2, LlamaUtils.getLlamaChestSize(llama) + 1);
2020-06-24 17:50:58 +02:00
return;
}
2021-09-06 01:37:06 +02:00
// If the involved inventory belongs to an AdvancedChest, sort all the pages.
if(advancedChestsHook.handleAChestSortingIfPresent(event.getInventory()))return;
2020-06-24 17:50:58 +02:00
// Normal container inventories can be sorted completely
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().sortInventory(event.getInventory());
2020-06-24 17:50:58 +02:00
}
private boolean belongsToChestLikeBlock(Inventory inventory) {
// Check by InventoryType
if (inventory.getType() == InventoryType.ENDER_CHEST || inventory.getType().name().equalsIgnoreCase("SHULKER_BOX")) {
return true;
}
2022-07-19 11:08:08 +02:00
if (inventory.getHolder() != null && inventory.getHolder().getClass().getName().toLowerCase().contains("boat")) {
return true;
}
2020-06-24 17:50:58 +02:00
// Possible Fix for https://github.com/JEFF-Media-GbR/Spigot-ChestSort/issues/13
if (inventory.getHolder() == null) {
return false;
}
// Check by InventoryHolder
// Only continue if the inventory belongs to one of the following:
// - a chest,
// - double chest,
// - shulkerbox (MC 1.11) (obsolete, is checked above by InventoryType
// - barrel (MC 1.14)
// - Minecart with Chest (MC 1.0)
// NOTE: Hoppers are NOT included because it may break item sorters like those: https://minecraft.gamepedia.com/Tutorials/Hopper#Item_sorter
// NOTE: We use .getClass().toString() for new items instead of directly
// comparing the ENUM, because we
// want to keep compatability between different minecraft versions (e.g. there
// is no BARREL prior 1.14 and no shulker box prior 1.11)
// WARNING: The names are inconsistent! A chest will return
// org.bukkit.craftbukkit.v1_14_R1.block.CraftChest
// in Spigot 1.14 while a double chest returns org.bukkit.block.DoubleChest
2020-06-24 20:32:16 +02:00
return inventory.getHolder() instanceof Chest || inventory.getHolder() instanceof DoubleChest
|| inventory.getHolder().getClass().toString().endsWith(".CraftMinecartChest")
|| inventory.getHolder().getClass().toString().endsWith(".CraftShulkerBox") //Obsolete, is checked above by InventoryType
|| inventory.getHolder().getClass().toString().endsWith(".CraftBarrel");
2020-06-24 17:50:58 +02:00
}
private boolean isReadyToSort(Player p) {
if (!p.hasPermission("chestsort.use")) {
return false;
}
// checking in lower case for lazy admins
2021-05-30 21:00:10 +02:00
if (plugin.getDisabledWorlds().contains(p.getWorld().getName().toLowerCase())) {
2020-06-24 17:50:58 +02:00
return false;
}
// Don't sort automatically when player is spectator or in adventure mode
// TODO: Make this configurable in config.yml
if (p.getGameMode() == GameMode.SPECTATOR || p.getGameMode() == GameMode.ADVENTURE) {
return false;
}
// Fixes exception when using Spigot's stupid /reload command
plugin.registerPlayerIfNeeded(p);
// Get the current player's settings
// We do not immediately cancel when sorting is disabled because we might want
// to show the hint message
2021-05-30 21:00:10 +02:00
PlayerSetting setting = plugin.getPerPlayerSettings().get(p.getUniqueId().toString());
2020-06-24 17:50:58 +02:00
// Show "how to enable ChestSort" message when ALL of the following criteria are
// met:
// - Player has sorting disabled
// - Player has not seen the message yet (whether or not this resets after a
// logout
// is defined by the config setting "show-message-again-after-logout")
// - "show-message-when-using-chest" is set to true in the config.yml
if (!plugin.isSortingEnabled(p)) {
if (!setting.hasSeenMessage) {
setting.hasSeenMessage = true;
if (plugin.getConfig().getBoolean("show-message-when-using-chest")) {
2021-05-30 20:52:40 +02:00
p.sendMessage(Messages.MSG_COMMANDMESSAGE);
2020-06-24 17:50:58 +02:00
}
}
return false;
}
// Show "how to disable ChestSort" message when ALL of the following criteria
// are met:
// - Player has sorting enabled
// - Player has not seen the message yet (whether or not this resets after a
// logout
// is defined by the config setting "show-message-again-after-logout")
// - "show-message-when-using-chest-and-sorting-is-enabled" is set to true in
// the config.yml
else {
if (!setting.hasSeenMessage) {
setting.hasSeenMessage = true;
if (plugin.getConfig().getBoolean("show-message-when-using-chest-and-sorting-is-enabled")) {
2021-05-30 20:52:40 +02:00
p.sendMessage(Messages.MSG_COMMANDMESSAGE2);
2020-06-24 17:50:58 +02:00
}
}
}
return true;
}
@EventHandler
public void onEnderChestOpen(InventoryOpenEvent event) {
2020-07-17 22:19:48 +02:00
if(!plugin.getConfig().getBoolean("allow-automatic-sorting")) return;
2020-06-24 17:50:58 +02:00
if (!(event.getPlayer() instanceof Player)) {
return;
}
Player p = (Player) event.getPlayer();
2021-07-19 06:13:06 +02:00
if(!p.hasPermission("chestsort.automatic")) return;
2020-06-24 17:50:58 +02:00
// Check if this is an EnderChest (is there a smarter way?)
if (!event.getInventory().equals(p.getEnderChest())) {
return;
}
if (isReadyToSort(p)) {
// Finally call the Organizer to sort the inventory
2020-07-04 15:48:51 +02:00
2021-05-30 21:00:10 +02:00
plugin.getLgr().logSort(p, Logger.SortCause.EC_OPEN);
2020-07-04 15:48:51 +02:00
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().sortInventory(event.getInventory());
2020-06-24 17:50:58 +02:00
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onHotkey(InventoryClickEvent event) {
2021-02-18 16:34:19 +01:00
plugin.debug2("Hotkey?");
2020-06-24 17:50:58 +02:00
if (!(event.getWhoClicked() instanceof Player)) {
2021-02-18 16:34:19 +01:00
plugin.debug2("exit: 0");
2020-06-24 17:50:58 +02:00
return;
}
2021-02-18 16:34:19 +01:00
2020-06-24 17:50:58 +02:00
Player p = (Player) event.getWhoClicked();
plugin.registerPlayerIfNeeded(p);
2020-07-15 20:55:15 +02:00
if (!plugin.getConfig().getBoolean("allow-sorting-hotkeys")) {
2021-02-18 16:34:19 +01:00
plugin.debug2("exit: 1");
2020-06-24 17:50:58 +02:00
return;
}
2021-02-18 16:34:19 +01:00
2020-06-24 17:50:58 +02:00
if (!p.hasPermission("chestsort.use") && !p.hasPermission("chestsort.use.inventory")) {
2021-02-18 16:34:19 +01:00
plugin.debug2("exit: 2");
2020-06-24 17:50:58 +02:00
return;
}
2021-02-18 16:34:19 +01:00
2020-06-24 17:50:58 +02:00
//InventoryHolder holder = event.getInventory().getHolder();
if (event.getClickedInventory() == null) {
2021-02-18 16:34:19 +01:00
plugin.debug2("exit: 3");
2020-06-24 17:50:58 +02:00
return;
}
2020-07-12 02:51:51 +02:00
2021-02-18 16:34:19 +01:00
2020-07-12 02:51:51 +02:00
boolean isAPICall = isAPICall(event.getClickedInventory());
2020-07-15 00:09:59 +02:00
// Detect generic GUIs
if(!isAPICall &&
2021-05-30 21:00:10 +02:00
(plugin.getGenericHook().isPluginGUI(event.getInventory())
|| plugin.getGenericHook().isPluginGUI(event.getInventory()))) {
2021-02-18 16:34:19 +01:00
plugin.debug("Aborting hotkey sorting: no API call & generic GUI detected");
2020-07-15 00:09:59 +02:00
return;
}
2021-02-18 16:34:19 +01:00
2020-06-24 17:50:58 +02:00
// Possible fix for #57
2020-07-12 02:51:51 +02:00
if (!isAPICall && (event.getClickedInventory().getHolder() != null
2020-06-24 17:50:58 +02:00
&& event.getClickedInventory().getHolder() == p
2020-07-12 02:51:51 +02:00
&& event.getClickedInventory() != p.getInventory())) {
return;
}
2021-02-18 16:34:19 +01:00
2020-06-24 17:50:58 +02:00
// End Possible fix for #57
InventoryHolder holder = event.getClickedInventory().getHolder();
boolean sort = false;
2021-05-30 20:55:43 +02:00
Logger.SortCause cause = null;
2020-06-24 17:50:58 +02:00
2021-05-30 21:00:10 +02:00
PlayerSetting setting = plugin.getPerPlayerSettings().get(p.getUniqueId().toString());
2020-06-24 17:50:58 +02:00
// Do not sort the GUI inventory
if (event.getClickedInventory() == setting.guiInventory) {
return;
}
2020-07-12 02:51:51 +02:00
2021-02-18 16:34:19 +01:00
2020-06-24 17:50:58 +02:00
// Prevent player from putting items into GUI inventory
if (event.getInventory() == setting.guiInventory) {
event.setCancelled(true);
return;
}
2020-07-12 02:51:51 +02:00
2020-06-24 17:50:58 +02:00
switch (event.getClick()) {
case MIDDLE:
2021-05-30 20:55:43 +02:00
cause = Logger.SortCause.H_MIDDLE;
2020-06-24 17:50:58 +02:00
//if(plugin.getConfig().getBoolean("hotkeys.middle-click")) {
2021-06-21 00:22:47 +02:00
if (setting.middleClick && p.hasPermission(Hotkey.getPermission(Hotkey.MIDDLE_CLICK))) {
2021-09-05 23:05:11 +02:00
if (event.getWhoClicked().getGameMode() != GameMode.CREATIVE
|| (event.getCurrentItem() == null || event.getCurrentItem().getType() == Material.AIR)) {
2020-06-24 17:50:58 +02:00
sort = true;
}
}
break;
case DOUBLE_CLICK:
2021-02-18 16:34:19 +01:00
if(event.isShiftClick()) return;
2021-05-30 20:55:43 +02:00
cause = Logger.SortCause.H_DOUBLE;
2020-06-24 17:50:58 +02:00
//if(plugin.getConfig().getBoolean("hotkeys.double-click")) {
2021-06-21 00:22:47 +02:00
if (setting.doubleClick && p.hasPermission(Hotkey.getPermission(Hotkey.DOUBLE_CLICK))) {
2020-06-24 17:50:58 +02:00
// We need getCursor() instead of getCurrentItem(), because after picking up the item, it is gone into the cursor
if (event.getCursor() == null || (event.getCursor() != null && event.getCursor().getType() == Material.AIR)) {
sort = true;
}
}
break;
case SHIFT_LEFT:
2021-05-30 20:55:43 +02:00
cause = Logger.SortCause.H_SHIFT;
2020-06-24 17:50:58 +02:00
//if(plugin.getConfig().getBoolean("hotkeys.shift-click")) {
2021-06-21 00:22:47 +02:00
if (setting.shiftClick && p.hasPermission(Hotkey.getPermission(Hotkey.SHIFT_CLICK))) {
2020-06-24 17:50:58 +02:00
if (event.getCurrentItem() == null || (event.getCurrentItem() != null && event.getCurrentItem().getType() == Material.AIR)) {
sort = true;
}
}
break;
case SHIFT_RIGHT:
2021-05-30 20:55:43 +02:00
cause = Logger.SortCause.H_SHIFTRIGHT;
2020-06-24 17:50:58 +02:00
//if(plugin.getConfig().getBoolean("hotkeys.shift-right-click")) {
2021-06-21 00:22:47 +02:00
if (setting.shiftRightClick && p.hasPermission(Hotkey.getPermission(Hotkey.SHIFT_RIGHT_CLICK))) {
2020-06-24 17:50:58 +02:00
if (event.getCurrentItem() == null || (event.getCurrentItem() != null && event.getCurrentItem().getType() == Material.AIR)) {
sort = true;
}
}
break;
default:
break;
}
if (!sort) {
return;
}
2021-08-29 20:57:47 +02:00
event.setCancelled(true);
2021-02-18 16:34:19 +01:00
if(plugin.isInHotkeyCooldown(p.getUniqueId())) {
plugin.debug("Skipping: hotkey cooldown");
return;
}
plugin.debug("Hotkey triggered: " + event.getClick().name());
if (isAPICall
|| belongsToChestLikeBlock(event.getClickedInventory())
2022-10-01 13:03:38 +02:00
|| (event.getClickedInventory() != null && event.getClickedInventory().getType() == InventoryType.HOPPER)
|| plugin.getOrganizer().isMarkedAsSortable(event.getClickedInventory())
2021-02-18 16:34:19 +01:00
|| LlamaUtils.belongsToLlama(event.getClickedInventory())
|| minepacksHook.isMinepacksBackpack(event.getClickedInventory())
2021-05-30 21:00:10 +02:00
|| plugin.getPlayerVaultsHook().isPlayerVault(event.getClickedInventory())
2021-09-06 01:37:06 +02:00
|| plugin.getEnderContainersHook().isEnderchest(event.getClickedInventory())
|| advancedChestsHook.isAnAdvancedChest(event.getClickedInventory())) {
2021-02-18 16:34:19 +01:00
2020-06-24 17:50:58 +02:00
if (!p.hasPermission("chestsort.use")) {
return;
}
2021-09-06 01:37:06 +02:00
plugin.getLgr().logSort(p,cause);
2021-02-18 16:34:19 +01:00
2021-09-06 01:37:06 +02:00
if (LlamaUtils.belongsToLlama(event.getClickedInventory())) {
2020-06-24 17:50:58 +02:00
ChestedHorse llama = (ChestedHorse) event.getInventory().getHolder();
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().sortInventory(event.getClickedInventory(), 2, LlamaUtils.getLlamaChestSize(llama) + 1);
plugin.getOrganizer().updateInventoryView(event);
2020-06-24 17:50:58 +02:00
return;
}
2021-02-18 16:34:19 +01:00
2021-09-06 01:37:06 +02:00
if(advancedChestsHook.handleAChestSortingIfPresent(event.getInventory())){
plugin.getOrganizer().updateInventoryView(event);
return;
}
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().sortInventory(event.getClickedInventory());
plugin.getOrganizer().updateInventoryView(event);
2020-06-24 17:50:58 +02:00
} else if (holder instanceof Player) {
2021-02-18 16:34:19 +01:00
2020-06-24 17:50:58 +02:00
if (!p.hasPermission("chestsort.use.inventory")) {
return;
}
if (event.getSlotType() == SlotType.QUICKBAR) {
2021-05-30 21:00:10 +02:00
plugin.getLgr().logSort(p,cause);
plugin.getOrganizer().sortInventory(p.getInventory(), 0, 8);
plugin.getOrganizer().updateInventoryView(event);
2021-02-18 16:34:19 +01:00
2020-06-24 17:50:58 +02:00
} else if (event.getSlotType() == SlotType.CONTAINER) {
2021-05-30 21:00:10 +02:00
plugin.getLgr().logSort(p,cause);
plugin.getOrganizer().sortInventory(p.getInventory(), 9, 35);
plugin.getOrganizer().updateInventoryView(event);
2021-02-18 16:34:19 +01:00
2020-06-24 17:50:58 +02:00
}
}
}
2020-07-12 02:51:51 +02:00
private boolean isAPICall(Inventory inv) {
2020-07-15 00:09:59 +02:00
if(inv==null) return false;
return inv.getHolder() instanceof ISortable || plugin.getOrganizer().isMarkedAsSortable(inv);
2020-07-12 02:51:51 +02:00
}
2020-06-24 17:50:58 +02:00
@EventHandler
public void onAdditionalHotkeys(InventoryClickEvent e) {
if (LlamaUtils.belongsToLlama(e.getInventory()) || LlamaUtils.belongsToLlama(e.getClickedInventory())) {
return;
}
2020-07-15 20:55:15 +02:00
if (!plugin.getConfig().getBoolean("allow-additional-hotkeys")) {
2020-06-24 17:50:58 +02:00
return;
}
if (!(e.getWhoClicked() instanceof Player)) {
return;
}
Player p = (Player) e.getWhoClicked();
// Only continue if clicked outside of the chest
if (e.getClickedInventory() != null) {
return;
}
// Only continue if hand is empty
if (e.getCursor() != null && e.getCursor().getType() != null && e.getCursor().getType() != Material.AIR) {
return;
}
// Possible fix for #57
2021-11-16 14:55:52 +01:00
if (e.getInventory().getHolder() == null && !e.getView().getTopInventory().equals(p.getEnderChest())) {
return;
}
if (e.getInventory().getHolder() == p && e.getInventory() != p.getInventory()) {
return;
}
2020-06-24 17:50:58 +02:00
// End Possible fix for #57
if (e.getInventory().getType() != InventoryType.CHEST
&& e.getInventory().getType() != InventoryType.DISPENSER
&& e.getInventory().getType() != InventoryType.DROPPER
&& e.getInventory().getType() != InventoryType.ENDER_CHEST
2022-09-24 13:49:27 +02:00
&& e.getInventory().getType() != InventoryType.HOPPER
2020-06-24 17:50:58 +02:00
&& !e.getInventory().getType().name().equalsIgnoreCase("SHULKER_BOX")
2020-07-13 15:35:00 +02:00
&& (e.getInventory().getHolder() == null || !e.getInventory().getHolder().getClass().toString().endsWith(".CraftBarrel"))
2021-11-16 14:55:52 +01:00
&& e.getInventory() != p.getEnderChest()
2020-07-13 15:35:00 +02:00
&& !(e.getInventory().getHolder() instanceof ISortable)) {
2020-06-24 17:50:58 +02:00
return;
}
2020-07-12 12:34:29 +02:00
// HeadDatabase hook
2020-07-12 15:56:49 +02:00
if(headDatabaseHook.isHeadDB(e.getClickedInventory())
|| headDatabaseHook.isHeadDB(e.getInventory())) {
2020-07-12 12:34:29 +02:00
return;
}
// CrateReloaded hook
2021-09-30 07:12:30 +02:00
if(CrateReloadedHook.isCrate(e.getClickedInventory())
|| CrateReloadedHook.isCrate(e.getInventory())) {
2020-07-12 12:34:29 +02:00
//if(plugin.debug) plugin.getLogger().info("Aborting hotkey because this is a CrateReloaded crate");
return;
}
// GoldenCrates hook
if(goldenCratesHook.isCrate(e.getClickedInventory())
|| goldenCratesHook.isCrate(e.getInventory())) {
//if(plugin.debug) plugin.getLogger().info("Aborting hotkey because this is a CrateReloaded crate");
return;
}
2021-09-06 01:37:06 +02:00
// AdvancedChests hook
if(advancedChestsHook.isAnAdvancedChest(e.getClickedInventory())
|| advancedChestsHook.isAnAdvancedChest(e.getInventory())){
return;
}
2020-07-15 00:09:59 +02:00
// Detect generic GUIs
if(!isAPICall(e.getInventory()) && !isAPICall(e.getClickedInventory()) &&
2021-05-30 21:00:10 +02:00
(plugin.getGenericHook().isPluginGUI(e.getInventory())
|| plugin.getGenericHook().isPluginGUI(e.getInventory()))) {
2020-07-15 00:09:59 +02:00
return;
}
2020-06-24 17:50:58 +02:00
// Don't sort inventories belonging to BossShopPro
if (e.getInventory() != null && e.getInventory().getHolder() != null && e.getInventory().getHolder().getClass().getName().equalsIgnoreCase("org.black_ixx.bossshop.core.BSShopHolder")) {
return;
}
2021-08-29 20:57:47 +02:00
// BetterBackpacks
if (e.getInventory() != null && e.getInventory().getHolder() != null && e.getInventory().getHolder().getClass().getName().equals("com.alonsoaliaga.betterbackpacks.others.BackpackHolder")) {
return;
}
2022-01-10 23:52:10 +01:00
// ShulkerPacks
if(ShulkerPacksHook.isOpenShulkerView(e.getView())) return;
2020-06-24 17:50:58 +02:00
if (!p.hasPermission("chestsort.use")) return;
plugin.registerPlayerIfNeeded(p);
2021-05-30 21:00:10 +02:00
PlayerSetting setting = plugin.getPerPlayerSettings().get(p.getUniqueId().toString());
2020-06-24 17:50:58 +02:00
2020-07-12 17:04:28 +02:00
ChestSortEvent chestSortEvent = new ChestSortEvent(e.getInventory());
2021-01-03 19:54:30 +01:00
chestSortEvent.setPlayer(e.getWhoClicked());
2020-07-12 03:58:40 +02:00
chestSortEvent.setLocation(e.getWhoClicked().getLocation());
2020-09-13 01:45:27 +02:00
2021-05-30 20:52:40 +02:00
chestSortEvent.setSortableMaps(new HashMap<>());
2020-09-13 01:45:27 +02:00
for (ItemStack item : e.getInventory().getContents()) {
2021-05-30 21:00:10 +02:00
chestSortEvent.getSortableMaps().put(item, plugin.getOrganizer().getSortableMap(item));
2020-09-13 01:45:27 +02:00
}
2020-06-24 17:50:58 +02:00
Bukkit.getPluginManager().callEvent(chestSortEvent);
if (chestSortEvent.isCancelled()) {
return;
}
2021-06-24 15:53:58 +02:00
if (e.isLeftClick() && setting.leftClick && p.hasPermission(Hotkey.getPermission(Hotkey.LEFT_CLICK))) {
2021-05-30 21:00:10 +02:00
plugin.getLgr().logSort(p, Logger.SortCause.H_LEFT);
2021-05-30 20:55:43 +02:00
if (setting.getCurrentDoubleClick(plugin, PlayerSetting.DoubleClickType.LEFT_CLICK)
== PlayerSetting.DoubleClickType.LEFT_CLICK) {
2020-06-24 17:50:58 +02:00
// Left double click: put everything into destination
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().stuffPlayerInventoryIntoAnother(p.getInventory(), e.getInventory(), false, chestSortEvent);
plugin.getOrganizer().sortInventory(e.getInventory());
2020-06-24 17:50:58 +02:00
} else {
// Left single click: put only matching items into destination
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().stuffPlayerInventoryIntoAnother(p.getInventory(), e.getInventory(), true, chestSortEvent);
2020-06-24 17:50:58 +02:00
}
2020-06-25 01:48:11 +02:00
2021-06-24 15:53:58 +02:00
} else if (e.isRightClick() && setting.rightClick && p.hasPermission(Hotkey.getPermission(Hotkey.RIGHT_CLICK))) {
2021-05-30 21:00:10 +02:00
plugin.getLgr().logSort(p, Logger.SortCause.H_RIGHT);
2021-05-30 20:55:43 +02:00
if (setting.getCurrentDoubleClick(plugin, PlayerSetting.DoubleClickType.RIGHT_CLICK)
== PlayerSetting.DoubleClickType.RIGHT_CLICK) {
2020-06-24 17:50:58 +02:00
// Right double click: put everything into player inventory
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().stuffInventoryIntoAnother(e.getInventory(), p.getInventory(), e.getInventory(), false);
plugin.getOrganizer().sortInventory(p.getInventory(),9,35);
2020-06-24 17:50:58 +02:00
} else {
// Right single click: put only matching items into player inventory
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().stuffInventoryIntoAnother(e.getInventory(), p.getInventory(), e.getInventory(), true);
2020-06-24 17:50:58 +02:00
}
2020-06-25 01:48:11 +02:00
2020-06-24 17:50:58 +02:00
}
//plugin.organizer.sortInventory(e.getInventory());
2021-05-30 21:00:10 +02:00
plugin.getOrganizer().updateInventoryView(e.getInventory());
plugin.getOrganizer().updateInventoryView(p.getInventory());
2022-02-05 10:02:48 +01:00
Bukkit.getPluginManager().callEvent(new ChestSortPostSortEvent(chestSortEvent));
2020-06-24 17:50:58 +02:00
}
2020-05-20 22:08:00 +02:00
2019-04-25 16:25:57 +02:00
}