From 35fa13227d599f7b9debeeb70c82f4661ee320fe Mon Sep 17 00:00:00 2001 From: LSDog <2509863159@qq.com> Date: Sun, 22 May 2022 18:36:38 +0800 Subject: [PATCH 1/3] add CoolDown, update config.yml --- .../eu/asangarin/mythickeys/CoolDown.java | 49 +++++++++++++++++++ .../eu/asangarin/mythickeys/MKListener.java | 10 ++++ .../mythickeys/config/MythicKeyInfo.java | 37 ++++++++++++-- src/main/resources/config.yml | 9 +++- 4 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 src/main/java/eu/asangarin/mythickeys/CoolDown.java diff --git a/src/main/java/eu/asangarin/mythickeys/CoolDown.java b/src/main/java/eu/asangarin/mythickeys/CoolDown.java new file mode 100644 index 0000000..6f05292 --- /dev/null +++ b/src/main/java/eu/asangarin/mythickeys/CoolDown.java @@ -0,0 +1,49 @@ +package eu.asangarin.mythickeys; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class CoolDown { + + /** + * ConcurrentHashMap(UUID, Map()): UUID is player's uuid, Map↓
+ * Map(String, Long): String is KeyID, Long is whenever the cooldown ends. + */ + private static final ConcurrentHashMap> cdMap = new ConcurrentHashMap<>(); + + public static boolean isCooling(UUID playerUUID, String keyID) { + return getKeyMap(playerUUID).getOrDefault(keyID, 0L) > now(); + } + + public static Long getCdLeft(UUID playerUUID, String keyID) { + return getCdEnd(playerUUID, keyID) - now(); + } + + /** + * @return The end time of cd in ms + */ + public static Long getCdEnd(UUID playerUUID, String keyID) { + return getKeyMap(playerUUID).getOrDefault(keyID, 0L); + } + + public static void setCdToMsLater(UUID playerUUID, String keyID, Long msLater) { + setCdToTimestamp(playerUUID, keyID, now() + msLater); + } + + public static void setCdToTimestamp(UUID playerUUID, String keyID, Long msTimestamp) { + Map keyMap = getKeyMap(playerUUID); + keyMap.put(keyID, msTimestamp); + cdMap.put(playerUUID, keyMap); + } + + private static Map getKeyMap(UUID playerUUID) { + return cdMap.computeIfAbsent(playerUUID, k -> new HashMap<>()); + } + + private static long now() { + return System.currentTimeMillis(); + } + +} diff --git a/src/main/java/eu/asangarin/mythickeys/MKListener.java b/src/main/java/eu/asangarin/mythickeys/MKListener.java index 11a1f3f..d7400ef 100644 --- a/src/main/java/eu/asangarin/mythickeys/MKListener.java +++ b/src/main/java/eu/asangarin/mythickeys/MKListener.java @@ -33,6 +33,16 @@ public void receiveKeyPress(Player player, DataInputStream buf) { if (MythicKeysPlugin.get().getConf().getKeyInfoList().containsKey(id)) { MythicKeyInfo info = MythicKeysPlugin.get().getConf().getKeyInfoList().get(id); + + if (info.hasCd() && CoolDown.isCooling(player.getUniqueId(), key)) { + if (info.hasCdCmd()) { + info.runCdCmd(player, key); + } + return; + } else { + CoolDown.setCdToMsLater(player.getUniqueId(), key, info.getCd()); + } + boolean eventCmd = MythicKeysPlugin.get().getConf().isEventOnCommand(); if (firstPress) { diff --git a/src/main/java/eu/asangarin/mythickeys/config/MythicKeyInfo.java b/src/main/java/eu/asangarin/mythickeys/config/MythicKeyInfo.java index 106e14c..7789f32 100644 --- a/src/main/java/eu/asangarin/mythickeys/config/MythicKeyInfo.java +++ b/src/main/java/eu/asangarin/mythickeys/config/MythicKeyInfo.java @@ -1,5 +1,6 @@ package eu.asangarin.mythickeys.config; +import eu.asangarin.mythickeys.CoolDown; import eu.asangarin.mythickeys.MythicKeysPlugin; import eu.asangarin.mythickeys.compat.MythicMobsCompat; import lombok.Getter; @@ -12,19 +13,22 @@ @Getter public class MythicKeyInfo { - private MythicKeyInfo(NamespacedKey id, String name, String category, int def, String command, String mythicPress, String mythicRelease) { + private MythicKeyInfo(NamespacedKey id, String name, String category, int def, String command, long cd, String cdCmd, String mythicPress, String mythicRelease) { this.id = id; this.name = name; this.category = category; this.def = def; this.command = command; + this.cd = cd; + this.cdCmd = cdCmd; this.mythicPress = mythicPress; this.mythicRelease = mythicRelease; } private final NamespacedKey id; - private final String name, category, command, mythicPress, mythicRelease; + private final String name, category, command, cdCmd, mythicPress, mythicRelease; private final int def; + private final long cd; // Using a static method to insert KeyInfo verification code. public static @Nullable MythicKeyInfo from(ConfigurationSection config) { @@ -33,11 +37,38 @@ private MythicKeyInfo(NamespacedKey id, String name, String category, int def, S if (key == null) return null; return new MythicKeyInfo(key, config.getString("Name"), config.getString("Category"), config.getInt("DefaultKey"), - config.getString("RunCommand", ""), config.getString("SkillPress", ""), config.getString("SkillRelease", "")); + config.getString("RunCommand", ""), config.getLong("CD"), config.getString("CdCommand"), config.getString("SkillPress", ""), config.getString("SkillRelease", "")); } return null; } + public boolean hasCd() { + return cd > 0; + } + + public boolean hasCdCmd() { + return cdCmd != null && !cdCmd.isEmpty(); + } + + public void runCdCmd(Player player, String key) { + if (!hasCdCmd()) return; + + final boolean isAdmin = cdCmd.startsWith("!"); + String cmd = (isAdmin ? cdCmd.substring(1) : cdCmd).replace("%player%", player.getName()); + if (cmd.contains("%s%")) { + Long cdLeft = CoolDown.getCdLeft(player.getUniqueId(), key); + cmd = cmd.replaceAll("%s%", String.valueOf(cdLeft/1000)); + } + if (cmd.contains("%ms%")) { + Long cdLeft = CoolDown.getCdLeft(player.getUniqueId(), key); + cmd = cmd.replaceAll("%ms%", String.valueOf(cdLeft)); + } + if (MythicKeysPlugin.get().papi) cmd = PlaceholderAPI.setPlaceholders(player, cmd); + + if (isAdmin) Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd); + else Bukkit.dispatchCommand(player, cmd); + } + public boolean runCommand(Player player) { if (command == null || command.isEmpty()) return false; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index fa75434..01f521f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,7 +1,7 @@ # MythicKeysPlugin # Made by Aria Sangarin -# Config Version 4 +# Config Version 5 # Whether or not the event should be fired # if a command was configured for the key ID. @@ -20,6 +20,13 @@ Keys: # There is also support for all PAPI placeholders. # If you don't want the key to run a command (for external plugin support), just leave it empty. + # You can remove [CD] and [CdCommand] if you don't want it + CD: 500 + # The Cooldown of this key + CdCommand: "!msg %player% Cooling! (%s%)" + # If it is cooling, then send this. + # %s% for second, %ms% for millisecond + #SkillPress: "RunWhenKeyPressed" #SkillRelease: "RunWhenKeyReleased" # If you have MythicMobs installed, you can specify an MM skill to be ran when a key is pressed or released. From ad8cbdb5c28b09adfd03aebe7d5f1bef9ce25a5a Mon Sep 17 00:00:00 2001 From: LSDog <2509863159@qq.com> Date: Mon, 23 May 2022 13:00:08 +0800 Subject: [PATCH 2/3] fix*1 --- .../java/eu/asangarin/mythickeys/CoolDown.java | 2 +- .../eu/asangarin/mythickeys/MKListener.java | 17 ++++++++--------- .../mythickeys/config/MythicKeyInfo.java | 14 +++++++++++--- src/main/resources/config.yml | 2 +- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main/java/eu/asangarin/mythickeys/CoolDown.java b/src/main/java/eu/asangarin/mythickeys/CoolDown.java index 6f05292..cea3d7d 100644 --- a/src/main/java/eu/asangarin/mythickeys/CoolDown.java +++ b/src/main/java/eu/asangarin/mythickeys/CoolDown.java @@ -14,7 +14,7 @@ public class CoolDown { private static final ConcurrentHashMap> cdMap = new ConcurrentHashMap<>(); public static boolean isCooling(UUID playerUUID, String keyID) { - return getKeyMap(playerUUID).getOrDefault(keyID, 0L) > now(); + return getKeyMap(playerUUID).getOrDefault(keyID, 0L) >= now(); } public static Long getCdLeft(UUID playerUUID, String keyID) { diff --git a/src/main/java/eu/asangarin/mythickeys/MKListener.java b/src/main/java/eu/asangarin/mythickeys/MKListener.java index d7400ef..52072c1 100644 --- a/src/main/java/eu/asangarin/mythickeys/MKListener.java +++ b/src/main/java/eu/asangarin/mythickeys/MKListener.java @@ -34,18 +34,17 @@ public void receiveKeyPress(Player player, DataInputStream buf) { if (MythicKeysPlugin.get().getConf().getKeyInfoList().containsKey(id)) { MythicKeyInfo info = MythicKeysPlugin.get().getConf().getKeyInfoList().get(id); - if (info.hasCd() && CoolDown.isCooling(player.getUniqueId(), key)) { - if (info.hasCdCmd()) { - info.runCdCmd(player, key); - } - return; - } else { - CoolDown.setCdToMsLater(player.getUniqueId(), key, info.getCd()); - } - boolean eventCmd = MythicKeysPlugin.get().getConf().isEventOnCommand(); if (firstPress) { + if (info.hasCd() && info.isCooling(player)) { + if (info.hasCdCmd()) { + info.runCdCmd(player); + } + return; + } else { + info.setCd(player); + } if (!info.runCommand(player) || eventCmd) Bukkit.getPluginManager().callEvent(new MythicKeyPressEvent(player, id, true)); info.mmSkill(player, true); return; diff --git a/src/main/java/eu/asangarin/mythickeys/config/MythicKeyInfo.java b/src/main/java/eu/asangarin/mythickeys/config/MythicKeyInfo.java index 7789f32..c7acebf 100644 --- a/src/main/java/eu/asangarin/mythickeys/config/MythicKeyInfo.java +++ b/src/main/java/eu/asangarin/mythickeys/config/MythicKeyInfo.java @@ -46,21 +46,29 @@ public boolean hasCd() { return cd > 0; } + public boolean isCooling(Player player) { + return CoolDown.isCooling(player.getUniqueId(), id.getKey()); + } + + public void setCd(Player player) { + CoolDown.setCdToMsLater(player.getUniqueId(), id.getKey(), cd); + } + public boolean hasCdCmd() { return cdCmd != null && !cdCmd.isEmpty(); } - public void runCdCmd(Player player, String key) { + public void runCdCmd(Player player) { if (!hasCdCmd()) return; final boolean isAdmin = cdCmd.startsWith("!"); String cmd = (isAdmin ? cdCmd.substring(1) : cdCmd).replace("%player%", player.getName()); if (cmd.contains("%s%")) { - Long cdLeft = CoolDown.getCdLeft(player.getUniqueId(), key); + Long cdLeft = CoolDown.getCdLeft(player.getUniqueId(), id.getKey()); cmd = cmd.replaceAll("%s%", String.valueOf(cdLeft/1000)); } if (cmd.contains("%ms%")) { - Long cdLeft = CoolDown.getCdLeft(player.getUniqueId(), key); + Long cdLeft = CoolDown.getCdLeft(player.getUniqueId(), id.getKey()); cmd = cmd.replaceAll("%ms%", String.valueOf(cdLeft)); } if (MythicKeysPlugin.get().papi) cmd = PlaceholderAPI.setPlaceholders(player, cmd); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 01f521f..9bf8a72 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -22,7 +22,7 @@ Keys: # You can remove [CD] and [CdCommand] if you don't want it CD: 500 - # The Cooldown of this key + # The Cooldown of this key (Millisecond) CdCommand: "!msg %player% Cooling! (%s%)" # If it is cooling, then send this. # %s% for second, %ms% for millisecond From 30834893cf8a3bf0b2762f2d85f2d660f5245432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AC=91=E5=A4=A9=E7=8A=AC?= <61925478+LSDogX@users.noreply.github.com> Date: Sun, 5 Jun 2022 09:06:58 +0800 Subject: [PATCH 3/3] Create README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..1b0fed2 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# MythicKeysPlugin +> Its just MythicKeysPlugin + Cool down + +Actually I'm a bit confusing about the code, but whatever it works! + +#### New Feature: You can set cool down for each key, and the command send to the player if it is cooling (also for each key)