diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java index c47a986b..16df17ea 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java @@ -1,12 +1,10 @@ package com.hibiscusmc.hmccosmetics.config; import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; -import com.hibiscusmc.hmccosmetics.util.HMCCInventoryUtils; import com.hibiscusmc.hmccosmetics.util.MessagesUtil; import lombok.Getter; import lombok.Setter; import me.lojosho.shaded.configurate.ConfigurationNode; -import org.apache.commons.lang3.EnumUtils; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.util.Vector; @@ -54,6 +52,8 @@ public class Settings { private static final String COSMETIC_DESTROY_LOOSE_COSMETIC_PATH = "destroy-loose-cosmetics"; private static final String COSMETIC_BALLOON_HEAD_FORWARD_PATH = "balloon-head-forward"; private static final String MENU_SETTINGS_PATH = "menu-settings"; + private static final String MENU_CLICK_COOLDOWN_PATH = "click-cooldown"; + private static final String MENU_CLICK_COOLDOWN_TIME_PATH = "time"; private static final String COSMETIC_TYPE_SETTINGS_PATH = "cosmetic-type"; private static final String EQUIP_CLICK_TYPE = "equip-click"; private static final String UNEQUIP_CLICK_TYPE = "unequip-click"; @@ -121,6 +121,10 @@ public class Settings { @Getter private static int packetEntityTeleportCooldown; @Getter + private static Long defaultMenuCooldown; + @Getter + private static boolean menuClickCooldown; + @Getter private static double emoteDistance; @Getter private static Vector balloonOffset; @@ -213,6 +217,10 @@ public class Settings { ConfigurationNode menuSettings = source.node(MENU_SETTINGS_PATH); + ConfigurationNode clickCooldownSettings = menuSettings.node(MENU_CLICK_COOLDOWN_PATH); + menuClickCooldown = clickCooldownSettings.node(ENABLED_PATH).getBoolean(true); + defaultMenuCooldown = clickCooldownSettings.node(MENU_CLICK_COOLDOWN_TIME_PATH).getLong(1000L); + ConfigurationNode shadingSettings = menuSettings.node(SHADING_PATH); defaultShading = shadingSettings.node(ENABLED_PATH).getBoolean(); firstRowShift = shadingSettings.node(FIRST_ROW_SHIFT_PATH).getString(); diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/Menu.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/Menu.java index e1b9e63b..4da56520 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/Menu.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/Menu.java @@ -40,6 +40,8 @@ public class Menu { @Getter private final int rows; @Getter + private final Long cooldown; + @Getter private final ConfigurationNode config; @Getter private final String permissionNode; @@ -55,6 +57,7 @@ public class Menu { title = config.node("title").getString("chest"); rows = config.node("rows").getInt(1); + cooldown = config.node("click-cooldown").getLong(Settings.getDefaultMenuCooldown()); permissionNode = config.node("permission").getString(""); refreshRate = config.node("refresh-rate").getInt(-1); shading = config.node("shading").getBoolean(Settings.isDefaultShading()); @@ -90,7 +93,8 @@ public class Menu { try { item = ItemSerializer.INSTANCE.deserialize(ItemStack.class, config.node("item")); } catch (SerializationException e) { - throw new RuntimeException(e); + MessagesUtil.sendDebugMessages("Unable to get valid item for " + config.key().toString() + " " + e.getMessage()); + continue; } if (item == null) { @@ -244,7 +248,18 @@ public class Menu { if (modifiedItem.getType().isAir()) continue; GuiItem guiItem = ItemBuilder.from(modifiedItem).asGuiItem(); guiItem.setAction(event -> { - MessagesUtil.sendDebugMessages("Selected slot " + slot); + UUID uuid = user.getUniqueId(); + if (Settings.isMenuClickCooldown()) { + Long userCooldown = Menus.getCooldown(uuid); + if (userCooldown != 0 && (System.currentTimeMillis() - Menus.getCooldown(uuid) <= getCooldown())) { + MessagesUtil.sendDebugMessages("Cooldown for " + user.getUniqueId() + " System time: " + System.currentTimeMillis() + " Cooldown: " + Menus.getCooldown(user.getUniqueId()) + " Difference: " + (System.currentTimeMillis() - Menus.getCooldown(user.getUniqueId()))); + MessagesUtil.sendMessage(user.getPlayer(), "on-click-cooldown"); + return; + } else { + Menus.addCooldown(user.getUniqueId(), System.currentTimeMillis()); + } + } + MessagesUtil.sendDebugMessages("Updated Menu Item in slot number " + slot); final ClickType clickType = event.getClick(); if (type != null) type.run(user, item.itemConfig(), clickType); updateMenu(user, gui); diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/Menus.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/Menus.java index b9306f03..4d9fd543 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/Menus.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/Menus.java @@ -13,16 +13,14 @@ import org.jetbrains.annotations.NotNull; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; +import java.util.*; import java.util.logging.Level; import java.util.stream.Stream; public class Menus { private static final HashMap MENUS = new HashMap<>(); + private static final HashMap COOLDOWNS = new HashMap<>(); public static void addMenu(Menu menu) { MENUS.put(menu.getId().toUpperCase(), menu); @@ -63,8 +61,21 @@ public class Menus { return MENUS.values(); } + public static void addCooldown(UUID uuid, long time) { + COOLDOWNS.put(uuid, time); + } + + public static Long getCooldown(UUID uuid) { + return COOLDOWNS.getOrDefault(uuid, 0L); + } + + public static void removeCooldown(UUID uuid) { + COOLDOWNS.remove(uuid); + } + public static void setup() { MENUS.clear(); + COOLDOWNS.clear(); File cosmeticFolder = new File(HMCCosmeticsPlugin.getInstance().getDataFolder() + "/menus"); if (!cosmeticFolder.exists()) cosmeticFolder.mkdir(); diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java index 886d6b48..f3081b62 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java @@ -4,6 +4,7 @@ import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; import com.hibiscusmc.hmccosmetics.config.DatabaseSettings; import com.hibiscusmc.hmccosmetics.config.Settings; import com.hibiscusmc.hmccosmetics.database.Database; +import com.hibiscusmc.hmccosmetics.gui.Menus; import com.hibiscusmc.hmccosmetics.user.CosmeticUser; import com.hibiscusmc.hmccosmetics.user.CosmeticUsers; import com.hibiscusmc.hmccosmetics.user.manager.UserEmoteManager; @@ -65,6 +66,7 @@ public class PlayerConnectionListener implements Listener { user.getUserEmoteManager().stopEmote(UserEmoteManager.StopEmoteReason.CONNECTION); event.getPlayer().setInvisible(false); } + Menus.removeCooldown(event.getPlayer().getUniqueId()); // Removes any menu cooldowns a player might have Database.save(user); user.destroy(); CosmeticUsers.removeUser(user.getUniqueId()); diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index 07b7576f..bba8a182 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -89,6 +89,11 @@ cosmetic-settings: y: 3 z: 0.5 menu-settings: + click-cooldown: + enabled: true + # This is the cooldown in miliseconds for the menu. This is useful for servers that have a lot of players. + # (So if a user clicks the menu, it won't spam the server with requesting it to refresh itself) + time: 1000 shading: # Below is the shading mechanism behind cosmetic items. This is a bit complicated, but it allows for a lot of customization. # The shading is done through the title and by shifting textures around. This is done by offsets. diff --git a/common/src/main/resources/messages.yml b/common/src/main/resources/messages.yml index bb292dca..9f1aaeb6 100644 --- a/common/src/main/resources/messages.yml +++ b/common/src/main/resources/messages.yml @@ -9,6 +9,7 @@ not-enough-args: "%prefix% Improper amount of arguments" no-permission: "%prefix% No Permission!" no-cosmetic-permission: "%prefix% You do not have permission for this cosmetic!" no-cosmetic-slot: "%prefix% There are no cosmetics in that slot!" +on-click-cooldown: "%prefix% You are on cooldown!" opened-wardrobe: "%prefix% Opened wardrobe!" closed-wardrobe: "%prefix% Closed wardrobe!"