From 8668d36304234e91d7bf9be749f8e07003706bda Mon Sep 17 00:00:00 2001 From: Auxilor Date: Thu, 26 Oct 2023 18:24:32 +0100 Subject: [PATCH] Fixed GUI lag exploit --- .../com/willfp/eco/core/gui/slot/CustomSlot.java | 5 +++-- .../java/com/willfp/eco/core/gui/slot/Slot.java | 13 +++++++++++++ .../com/willfp/eco/internal/gui/slot/EcoSlot.kt | 2 +- .../willfp/eco/internal/spigot/gui/GUIListener.kt | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/CustomSlot.java b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/CustomSlot.java index db40fa50..89d4dca1 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/CustomSlot.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/CustomSlot.java @@ -2,6 +2,7 @@ package com.willfp.eco.core.gui.slot; import com.willfp.eco.core.gui.menu.Menu; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -77,12 +78,12 @@ public abstract class CustomSlot implements Slot { } @Override - public boolean shouldRenderOnClick() { + public boolean shouldRenderOnClick(@NotNull final ClickType clickType) { if (delegate == null) { throw new IllegalStateException("Custom Slot was not initialized!"); } - return delegate.shouldRenderOnClick(); + return delegate.shouldRenderOnClick(clickType); } @Override diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/Slot.java b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/Slot.java index 03019efb..b3726062 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/Slot.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/Slot.java @@ -7,6 +7,7 @@ import com.willfp.eco.core.gui.slot.functional.SlotProvider; import com.willfp.eco.core.items.TestableItem; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -96,8 +97,20 @@ public interface Slot extends GUIComponent { * If the slot should re-render the menu if clicked. * * @return If the slot should re-render. + * @deprecated Use {@link Slot#shouldRenderOnClick(ClickType)} instead. */ + @Deprecated(since = "6.66.0", forRemoval = true) default boolean shouldRenderOnClick() { + return shouldRenderOnClick(ClickType.LEFT); + } + + /** + * If the slot should re-render the menu if clicked. + * + * @param clickType The click type. + * @return If the slot should re-render. + */ + default boolean shouldRenderOnClick(@NotNull final ClickType clickType) { return true; } diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt index 3080eea2..9f72cbf7 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt @@ -35,5 +35,5 @@ open class EcoSlot( override fun getActionableSlot(player: Player, menu: Menu): EcoSlot = this - override fun shouldRenderOnClick() = handlers.values.any { it.isNotEmpty() } + override fun shouldRenderOnClick(clickType: ClickType) = !handlers[clickType].isNullOrEmpty() } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt index 944e2630..69a39c16 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt @@ -46,7 +46,7 @@ class GUIListener(private val plugin: EcoPlugin) : Listener { if (delegate is EcoSlot) { delegate.handleInventoryClick(event, menu) - if (delegate.shouldRenderOnClick()) { + if (delegate.shouldRenderOnClick(event.click)) { player.renderActiveMenu() } } else if (delegate === this) {