diff --git a/MMOItems-Dist/src/main/java/net/Indyuce/mmoitems/MMOItemsBukkit.java b/MMOItems-Dist/src/main/java/net/Indyuce/mmoitems/MMOItemsBukkit.java index da81021a..bd13a321 100644 --- a/MMOItems-Dist/src/main/java/net/Indyuce/mmoitems/MMOItemsBukkit.java +++ b/MMOItems-Dist/src/main/java/net/Indyuce/mmoitems/MMOItemsBukkit.java @@ -28,6 +28,7 @@ public class MMOItemsBukkit { if (plugin.getConfig().getBoolean("dropped-items.tier-glow") || plugin.getConfig().getBoolean("dropped-items.hints")) Bukkit.getPluginManager().registerEvents(new DroppedItems(plugin.getConfig().getConfigurationSection("dropped-items")), plugin); + Bukkit.getPluginManager().registerEvents(new DisabledItemsListener(plugin), plugin); Bukkit.getScheduler().runTaskTimer(plugin, () -> Bukkit.getOnlinePlayers().forEach(player -> PlayerData.get(player).updateStats()), 100, 20); } diff --git a/MMOItems-Dist/src/main/java/net/Indyuce/mmoitems/listener/DisabledItemsListener.java b/MMOItems-Dist/src/main/java/net/Indyuce/mmoitems/listener/DisabledItemsListener.java new file mode 100644 index 00000000..944793d7 --- /dev/null +++ b/MMOItems-Dist/src/main/java/net/Indyuce/mmoitems/listener/DisabledItemsListener.java @@ -0,0 +1,114 @@ +package net.Indyuce.mmoitems.listener; + +import io.lumine.mythic.lib.MythicLib; +import io.lumine.mythic.lib.api.event.PlayerAttackEvent; +import io.lumine.mythic.lib.api.item.NBTItem; +import io.lumine.mythic.lib.damage.MeleeAttackMetadata; +import net.Indyuce.mmoitems.MMOItems; +import net.Indyuce.mmoitems.api.Type; +import org.bukkit.GameMode; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.inventory.ItemStack; + +/** + * mmoitems + * 13/03/2023 + * + * @author Roch Blondiaux (Kiwix). + */ +public class DisabledItemsListener implements Listener { + + private final MMOItems plugin; + + public DisabledItemsListener(MMOItems plugin) { + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void rightClickEffects(PlayerInteractEvent event) { + if (!event.hasItem()) + return; + NBTItem item = MythicLib.plugin.getVersion().getWrapper().getNBTItem(event.getItem()); + if (this.shouldCancel(item)) + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void meleeAttacks(PlayerAttackEvent event) { + if (!(event.getAttack() instanceof MeleeAttackMetadata)) + return; + ItemStack weaponUsed = event.getPlayer().getInventory().getItem(((MeleeAttackMetadata) event.getAttack()).getHand().toBukkit()); + NBTItem item = MythicLib.plugin.getVersion().getWrapper().getNBTItem(weaponUsed); + if (this.shouldCancel(item)) + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void specialToolAbilities(BlockBreakEvent event) { + final Player player = event.getPlayer(); + if (player.getGameMode() == GameMode.CREATIVE) + return; + + final NBTItem item = MythicLib.plugin.getVersion().getWrapper().getNBTItem(player.getInventory().getItemInMainHand()); + if (this.shouldCancel(item)) + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void rightClickWeaponInteractions(PlayerInteractEntityEvent event) { + Player player = event.getPlayer(); + if (!(event.getRightClicked() instanceof LivingEntity)) + return; + + NBTItem item = MythicLib.plugin.getVersion().getWrapper().getNBTItem(player.getInventory().getItemInMainHand()); + if (this.shouldCancel(item)) + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void gemStonesAndItemStacks(InventoryClickEvent event) { + Player player = (Player) event.getWhoClicked(); + if (event.getAction() != InventoryAction.SWAP_WITH_CURSOR) + return; + + NBTItem item = MythicLib.plugin.getVersion().getWrapper().getNBTItem(event.getCursor()); + if (this.shouldCancel(item)) + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void handleCustomBows(EntityShootBowEvent event) { + if (!(event.getProjectile() instanceof Arrow) || !(event.getEntity() instanceof Player)) + return; + + final NBTItem item = NBTItem.get(event.getBow()); + if (shouldCancel(item)) + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void handleVanillaEatenConsumables(PlayerItemConsumeEvent event) { + NBTItem item = MythicLib.plugin.getVersion().getWrapper().getNBTItem(event.getItem()); + if (shouldCancel(item)) + event.setCancelled(true); + } + + private boolean shouldCancel(NBTItem item) { + if (!item.hasType() || !plugin.getConfig().getBoolean("disable-removed-items", true)) + return false; + return !Type.isValid(item.getType()); + } + +} diff --git a/MMOItems-Dist/src/main/resources/config.yml b/MMOItems-Dist/src/main/resources/config.yml index 9ff640c5..cb094211 100644 --- a/MMOItems-Dist/src/main/resources/config.yml +++ b/MMOItems-Dist/src/main/resources/config.yml @@ -1,4 +1,3 @@ - # DO NOT TOUCH config-version: 8 @@ -379,5 +378,9 @@ lootsplosion: # gems' stats will increase as well. gem-upgrade-default: 'NEVER' +# This option allows you to disable the ability to +# use MMOItems that have been removed from your config. +disable-removed-items: true + # When I was a kid, I saw the Mona Lisa in my school art book... # The fist time I saw her, with her hands on her knee... how do I say this... \ No newline at end of file