From c03b91a21be045ef28168893ad92761b81a34d99 Mon Sep 17 00:00:00 2001 From: Jules Date: Tue, 22 Oct 2024 13:51:25 +0200 Subject: [PATCH] New ML cooldown API --- MMOCore-API/pom.xml | 2 +- .../mmocore/api/player/PlayerActivity.java | 37 -------------- .../mmocore/api/player/PlayerData.java | 41 +++++---------- .../api/player/social/FriendRequest.java | 4 +- .../api/util/math/format/DelayFormat.java | 42 ++++++++------- .../admin/HideActionBarCommandTreeNode.java | 51 +++++++++---------- .../Indyuce/mmocore/gui/WaypointViewer.java | 5 +- .../gui/social/friend/EditableFriendList.java | 4 +- .../mmocore/loot/chest/LootChestRegion.java | 8 +-- .../mmocore/manager/ActionBarManager.java | 9 ++-- .../mmocore/manager/ConfigManager.java | 18 ++++--- .../Indyuce/mmocore/player/CooldownType.java | 45 ++++++++++++++++ .../Indyuce/mmocore/skill/CastableSkill.java | 7 ++- .../net/Indyuce/mmocore/skill/ClassSkill.java | 9 ++-- .../mmocore/skill/cast/handler/SkillBar.java | 3 +- MMOCore-Dist/src/main/resources/config.yml | 17 ++++++- 16 files changed, 160 insertions(+), 142 deletions(-) delete mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerActivity.java create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/player/CooldownType.java diff --git a/MMOCore-API/pom.xml b/MMOCore-API/pom.xml index 90b17b9d..1a07966b 100644 --- a/MMOCore-API/pom.xml +++ b/MMOCore-API/pom.xml @@ -119,7 +119,7 @@ io.papermc.paper paper-api - 1.20.6-R0.1-SNAPSHOT + 1.21.1-R0.1-SNAPSHOT provided true diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerActivity.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerActivity.java deleted file mode 100644 index 65f523c9..00000000 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerActivity.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.Indyuce.mmocore.api.player; - -import net.Indyuce.mmocore.MMOCore; - -import javax.inject.Provider; -import java.util.Objects; - -/** - * Used by MMOCore when it has to store the last time a player - * did some action. This also features a time out function which - * can be used for cooldowns. - * - * @deprecated Merge with {@link io.lumine.mythic.lib.player.cooldown.CooldownMap} - */ -public enum PlayerActivity { - USE_WAYPOINT(() -> 5 * 1000L), - - FRIEND_REQUEST(() -> 1000 * 60 * 2L), - - ACTION_BAR_MESSAGE(() -> MMOCore.plugin.actionBarManager.getTimeOut() * 50), - - LOOT_CHEST_SPAWN(() -> MMOCore.plugin.configManager.lootChestPlayerCooldown), - - CAST_SKILL(() -> MMOCore.plugin.configManager.globalSkillCooldown), - - ; - - private final Provider timeout; - - PlayerActivity(Provider timeout) { - this.timeout = timeout; - } - - public long getTimeOut() { - return Objects.requireNonNull(timeout, "Time out not supported").get(); - } -} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index 4a6cda98..a4501e62 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -39,6 +39,7 @@ import net.Indyuce.mmocore.party.provided.MMOCorePartyModule; import net.Indyuce.mmocore.party.provided.Party; import net.Indyuce.mmocore.player.ClassDataContainer; import net.Indyuce.mmocore.player.CombatHandler; +import net.Indyuce.mmocore.player.CooldownType; import net.Indyuce.mmocore.player.Unlockable; import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.RegisteredSkill; @@ -106,7 +107,6 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD private final PlayerProfessions collectSkills = new PlayerProfessions(this); private final PlayerAttributes attributes = new PlayerAttributes(this); private final Map classSlots = new HashMap<>(); - private final Map lastActivity = new HashMap<>(); private final CombatHandler combat = new CombatHandler(this); /** @@ -142,9 +142,10 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD */ private final Map tableItemClaims = new HashMap<>(); - // NON-FINAL player data stuff made public to facilitate field change + // NON-FINAL player data stuff made public to facilitate field access public boolean noCooldown; public long lastDropEvent; + //public List activeFriendRequests = new ArrayList<>(); public PlayerData(MMOPlayerData mmoData) { super(MMOCore.plugin, mmoData); @@ -446,7 +447,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD /** * @return If the item is unlocked by the player - * This is used for skills that can be locked & unlocked. + * This is used for skills that can be locked & unlocked. */ public boolean hasUnlocked(Unlockable unlockable) { return unlockable.isUnlockedByDefault() || unlockedItems.contains(unlockable.getUnlockNamespacedKey()); @@ -534,22 +535,6 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD return questData; } - public long getLastActivity(PlayerActivity activity) { - return this.lastActivity.getOrDefault(activity, 0l); - } - - public long getActivityTimeOut(PlayerActivity activity) { - return Math.max(0, getLastActivity(activity) + activity.getTimeOut() - System.currentTimeMillis()); - } - - public void setLastActivity(PlayerActivity activity) { - setLastActivity(activity, System.currentTimeMillis()); - } - - public void setLastActivity(PlayerActivity activity, long timestamp) { - this.lastActivity.put(activity, timestamp); - } - @Override public long getLastLogin() { return getMMOPlayerData().getLastLogActivity(); @@ -625,7 +610,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD /** * @param key The identifier of an exp table item. * @return Amount of times an item has been claimed - * inside an experience table. + * inside an experience table. */ public int getClaims(@NotNull String key) { return tableItemClaims.getOrDefault(key, 0); @@ -829,7 +814,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD public void sendFriendRequest(PlayerData target) { if (!isOnline() || !target.isOnline()) return; - setLastActivity(PlayerActivity.FRIEND_REQUEST); + getCooldownMap().applyCooldown(CooldownType.FRIEND_REQUEST); FriendRequest request = new FriendRequest(this, target); ConfigMessage.fromKey("friend-request").addPlaceholders("player", getPlayer().getName(), "uuid", request.getUniqueId().toString()).send(target.getPlayer()); MMOCore.plugin.requestManager.registerRequest(request); @@ -848,7 +833,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD * spamming waypoints. There is no need to reset it when resetting the * player waypoints data */ - setLastActivity(PlayerActivity.USE_WAYPOINT); + getCooldownMap().applyCooldown(CooldownType.USE_WAYPOINT); giveStellium(-cost, PlayerResourceUpdateEvent.UpdateReason.USE_WAYPOINT); new BukkitRunnable() { @@ -1128,7 +1113,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD /** * @return If the PlayerEnterCastingModeEvent successfully put the player - * into casting mode, otherwise if the event is cancelled, returns false. + * into casting mode, otherwise if the event is cancelled, returns false. */ public boolean setSkillCasting() { Validate.isTrue(!isCasting(), "Player already in casting mode"); @@ -1147,7 +1132,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD /** * @return If player successfully left skill casting i.e the Bukkit - * event has not been cancelled + * event has not been cancelled */ public boolean leaveSkillCasting() { return leaveSkillCasting(false); @@ -1156,7 +1141,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD /** * @param skipEvent Skip firing the exit event * @return If player successfully left skill casting i.e the Bukkit - * event has not been cancelled + * event has not been cancelled */ public boolean leaveSkillCasting(boolean skipEvent) { Validate.isTrue(isCasting(), "Player not in casting mode"); @@ -1169,7 +1154,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD skillCasting.close(); this.skillCasting = null; - setLastActivity(PlayerActivity.ACTION_BAR_MESSAGE, 0); // Reset action bar + getCooldownMap().resetCooldown(CooldownType.ACTION_BAR_MESSAGE); // Reset action bar return true; } @@ -1182,7 +1167,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD // TODO add an option to disable action-bar properly in all casting modes if (ChatColor.stripColor(message).isEmpty()) return; - setLastActivity(PlayerActivity.ACTION_BAR_MESSAGE); + getCooldownMap().applyCooldown(CooldownType.ACTION_BAR_MESSAGE); if (raw) MythicLib.plugin.getVersion().getWrapper().sendActionBarRaw(getPlayer(), message); else getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(message)); } @@ -1358,7 +1343,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD * checks if they could potentially upgrade to one of these * * @return If the player can change its current class to - * a subclass + * a subclass */ @Deprecated public boolean canChooseSubclass() { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/social/FriendRequest.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/social/FriendRequest.java index 2f75ee5a..91d77dec 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/social/FriendRequest.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/social/FriendRequest.java @@ -1,7 +1,7 @@ package net.Indyuce.mmocore.api.player.social; import net.Indyuce.mmocore.api.ConfigMessage; -import net.Indyuce.mmocore.api.player.PlayerActivity; +import net.Indyuce.mmocore.player.CooldownType; import net.Indyuce.mmocore.api.player.PlayerData; import org.bukkit.Sound; @@ -17,7 +17,7 @@ public class FriendRequest extends Request { @Override public void whenAccepted() { - getCreator().setLastActivity(PlayerActivity.FRIEND_REQUEST, 0); + getCreator().getCooldownMap().resetCooldown(CooldownType.FRIEND_REQUEST); getCreator().addFriend(getTarget().getUniqueId()); getTarget().addFriend(getCreator().getUniqueId()); if (getCreator().isOnline()) { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/math/format/DelayFormat.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/math/format/DelayFormat.java index 86ffe97b..25f56b23 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/math/format/DelayFormat.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/math/format/DelayFormat.java @@ -1,29 +1,33 @@ package net.Indyuce.mmocore.api.util.math.format; public class DelayFormat { - private int display; + private int display; - private static final long[] millisArray = {31557081600L, 2629756800L, 86400000L, 3600000L, 60000L, 1000L}; - private static final String[] charArray = { "y", "M", "d", "h", "m", "s" }; + private static final long[] millisArray = {31557081600L, 2629756800L, 86400000L, 3600000L, 60000L, 1000L}; + private static final String[] charArray = {"y", "M", "d", "h", "m", "s"}; - public DelayFormat() { - this(charArray.length); - } + public DelayFormat() { + this(charArray.length); + } - public DelayFormat(int display) { - this.display = Math.min(display, charArray.length); - } + public DelayFormat(int display) { + this.display = Math.min(display, charArray.length); + } - public String format(long ms) { - StringBuilder format = new StringBuilder(); + public String format(double ms) { + return format(1000L * (long) ms); + } - for (int j = 0; j < charArray.length && display > 0; j++) - if (ms > millisArray[j]) { - format.append(ms / millisArray[j]).append(charArray[j]).append(" "); - ms = ms % millisArray[j]; - display--; - } + public String format(long ms) { + StringBuilder format = new StringBuilder(); - return format.toString().equals("") ? "Now!" : format.substring(0, format.length() - 1); - } + for (int j = 0; j < charArray.length && display > 0; j++) + if (ms > millisArray[j]) { + format.append(ms / millisArray[j]).append(charArray[j]).append(" "); + ms = ms % millisArray[j]; + display--; + } + + return format.toString().equals("") ? "Now!" : format.substring(0, format.length() - 1); + } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/HideActionBarCommandTreeNode.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/HideActionBarCommandTreeNode.java index cd7d0993..aa0762d1 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/HideActionBarCommandTreeNode.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/HideActionBarCommandTreeNode.java @@ -2,42 +2,41 @@ package net.Indyuce.mmocore.command.rpg.admin; import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.Parameter; -import net.Indyuce.mmocore.api.player.PlayerActivity; import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.player.CooldownType; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; public class HideActionBarCommandTreeNode extends CommandTreeNode { - public HideActionBarCommandTreeNode(CommandTreeNode parent) { - super(parent, "hideab"); + public HideActionBarCommandTreeNode(CommandTreeNode parent) { + super(parent, "hideab"); - addParameter(Parameter.PLAYER); - addParameter(Parameter.AMOUNT); - } + addParameter(Parameter.PLAYER); + addParameter(Parameter.AMOUNT); + } - @Override - public CommandResult execute(CommandSender sender, String[] args) { - if (args.length < 4) - return CommandResult.THROW_USAGE; + @Override + public CommandResult execute(CommandSender sender, String[] args) { + if (args.length < 4) + return CommandResult.THROW_USAGE; - Player player = Bukkit.getPlayer(args[2]); - if (player == null) { - sender.sendMessage(ChatColor.RED + "Could not find the player called " + args[2] + "."); - return CommandResult.FAILURE; - } + Player player = Bukkit.getPlayer(args[2]); + if (player == null) { + sender.sendMessage(ChatColor.RED + "Could not find the player called " + args[2] + "."); + return CommandResult.FAILURE; + } - int amount; - try { - amount = Integer.parseInt(args[3]); - } catch (Exception e) { - sender.sendMessage(ChatColor.RED + args[3] + " is not a valid number."); - return CommandResult.FAILURE; - } + int amount; + try { + amount = Integer.parseInt(args[3]); + } catch (Exception e) { + sender.sendMessage(ChatColor.RED + args[3] + " is not a valid number."); + return CommandResult.FAILURE; + } - final long lastUsed = System.currentTimeMillis() - PlayerActivity.ACTION_BAR_MESSAGE.getTimeOut() + amount * 50; - PlayerData.get(player).setLastActivity(PlayerActivity.ACTION_BAR_MESSAGE, lastUsed); - return CommandResult.SUCCESS; - } + PlayerData.get(player).getCooldownMap().applyCooldown(CooldownType.ACTION_BAR_MESSAGE, (double) amount / 20d); + return CommandResult.SUCCESS; + } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java index 489015c0..5e4a5898 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java @@ -2,7 +2,7 @@ package net.Indyuce.mmocore.gui; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; -import net.Indyuce.mmocore.api.player.PlayerActivity; +import net.Indyuce.mmocore.player.CooldownType; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.gui.api.EditableInventory; @@ -269,8 +269,7 @@ public class WaypointViewer extends EditableInventory { return; } - if (playerData.getActivityTimeOut(PlayerActivity.USE_WAYPOINT) > 0) - return; + if (playerData.getCooldownMap().isOnCooldown(CooldownType.USE_WAYPOINT)) return; player.closeInventory(); playerData.warp(waypoint, withdraw); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java index 67886b05..1f7132c8 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java @@ -2,7 +2,7 @@ package net.Indyuce.mmocore.gui.social.friend; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; -import net.Indyuce.mmocore.api.player.PlayerActivity; +import net.Indyuce.mmocore.player.CooldownType; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.input.ChatInput; @@ -201,7 +201,7 @@ public class EditableFriendList extends EditableInventory { if (item.getFunction().equals("request")) { - long remaining = playerData.getActivityTimeOut(PlayerActivity.FRIEND_REQUEST); + double remaining = playerData.getCooldownMap().getCooldown(CooldownType.FRIEND_REQUEST); if (remaining > 0) { ConfigMessage.fromKey("friend-request-cooldown", "cooldown", new DelayFormat().format(remaining)) .send(player); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/loot/chest/LootChestRegion.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/loot/chest/LootChestRegion.java index 8cd14171..29c86d70 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/loot/chest/LootChestRegion.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/loot/chest/LootChestRegion.java @@ -1,7 +1,7 @@ package net.Indyuce.mmocore.loot.chest; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.player.PlayerActivity; +import net.Indyuce.mmocore.player.CooldownType; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.loot.RandomWeightedRoll; import net.Indyuce.mmocore.api.event.LootChestSpawnEvent; @@ -30,7 +30,7 @@ public class LootChestRegion { @Override public void run() { - getBounds().getPlayers().filter(player -> player.getActivityTimeOut(PlayerActivity.LOOT_CHEST_SPAWN) == 0) + getBounds().getPlayers().filter(player -> !player.getCooldownMap().isOnCooldown(CooldownType.LOOT_CHEST_SPAWN)) .findAny().ifPresent(player -> spawnChest(player)); } }; @@ -84,7 +84,7 @@ public class LootChestRegion { public void spawnChest(PlayerData player) { // Apply chest cooldown - player.setLastActivity(PlayerActivity.LOOT_CHEST_SPAWN); + player.getCooldownMap().applyCooldown(CooldownType.LOOT_CHEST_SPAWN); // First randomly determine the chest tier ChestTier tier = rollTier(player); @@ -121,7 +121,7 @@ public class LootChestRegion { /** * @param player Player rolling the tier * @return A randomly picked tiers taking into account tier spawn rates - * and the player Chance attribute + * and the player Chance attribute */ @NotNull public ChestTier rollTier(PlayerData player) { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ActionBarManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ActionBarManager.java index 86fccb43..fee842a5 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ActionBarManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ActionBarManager.java @@ -3,7 +3,7 @@ package net.Indyuce.mmocore.manager; import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.manager.StatManager; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.player.PlayerActivity; +import net.Indyuce.mmocore.player.CooldownType; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.gui.api.item.Placeholders; import net.md_5.bungee.api.ChatMessageType; @@ -19,7 +19,7 @@ public class ActionBarManager extends BukkitRunnable { public void reload(ConfigurationSection config) { enabled = config.getBoolean("enabled", false); - timeOut = config.getInt("time-out", 60); + timeOut = config.getInt("time-out", 60) * 50; updateTicks = config.getInt("ticks-to-update", 5); barFormat = config.getString("format", ""); @@ -39,7 +39,10 @@ public class ActionBarManager extends BukkitRunnable { @Override public void run() { for (PlayerData data : PlayerData.getAll()) - if (data.isOnline() && !data.getPlayer().isDead() && !data.isCasting() && data.getActivityTimeOut(PlayerActivity.ACTION_BAR_MESSAGE) == 0) { + if (data.isOnline() + && !data.getPlayer().isDead() + && !data.isCasting() + && !data.getCooldownMap().isOnCooldown(CooldownType.ACTION_BAR_MESSAGE)) { Placeholders holders = getActionBarPlaceholders(data); data.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText( holders.apply(data.getPlayer(), data.getProfess().hasActionBar() ? data.getProfess().getActionBar() : barFormat))); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java index 01bbab60..da76edf3 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java @@ -25,14 +25,17 @@ import java.util.logging.Level; public class ConfigManager { public final CommandVerbose commandVerbose = new CommandVerbose(); - public boolean overrideVanillaExp, canCreativeCast, passiveSkillsNeedBinding, cobbleGeneratorXP, saveDefaultClassInfo, splitMainExp, splitProfessionExp, disableQuestBossBar, - pvpModeEnabled, pvpModeInvulnerabilityCanDamage, forceClassSelection, enableGlobalSkillTreeGUI, enableSpecificSkillTreeGUI, waypointAutoPathCalculation, waypointLinkReciprocity; + public boolean overrideVanillaExp, canCreativeCast, passiveSkillsNeedBinding, cobbleGeneratorXP, saveDefaultClassInfo, + splitMainExp, splitProfessionExp, disableQuestBossBar, pvpModeEnabled, pvpModeInvulnerabilityCanDamage, + forceClassSelection, enableGlobalSkillTreeGUI, enableSpecificSkillTreeGUI, waypointAutoPathCalculation, waypointLinkReciprocity; public String partyChatPrefix, noSkillBoundPlaceholder; public ChatColor staminaFull, staminaHalf, staminaEmpty; - public long combatLogTimer, lootChestExpireTime, lootChestPlayerCooldown, globalSkillCooldown; - public double lootChestsChanceWeight, dropItemsChanceWeight, fishingDropsChanceWeight, partyMaxExpSplitRange, pvpModeToggleOnCooldown, pvpModeToggleOffCooldown, pvpModeCombatCooldown, - pvpModeCombatTimeout, pvpModeInvulnerabilityTimeRegionChange, pvpModeInvulnerabilityTimeCommand, pvpModeRegionEnterCooldown, pvpModeRegionLeaveCooldown; - public int maxPartyLevelDifference, maxPartyPlayers, minCombatLevel, maxCombatLevelDifference, skillTreeScrollStepX, skillTreeScrollStepY, waypointWarpTime; + public long combatLogTimer, lootChestExpireTime, lootChestPlayerCooldown, globalSkillCooldown, waypointUseCooldown, friendRequestTimeout; + public double lootChestsChanceWeight, dropItemsChanceWeight, fishingDropsChanceWeight, partyMaxExpSplitRange, pvpModeToggleOnCooldown, + pvpModeToggleOffCooldown, pvpModeCombatCooldown, pvpModeCombatTimeout, pvpModeInvulnerabilityTimeRegionChange, + pvpModeInvulnerabilityTimeCommand, pvpModeRegionEnterCooldown, pvpModeRegionLeaveCooldown; + public int maxPartyLevelDifference, maxPartyPlayers, minCombatLevel, maxCombatLevelDifference, skillTreeScrollStepX, skillTreeScrollStepY, + waypointWarpTime, maxfriendRequests; public final List combatLogDamageCauses = new ArrayList<>(); private final FileConfiguration messages; @@ -153,6 +156,9 @@ public class ConfigManager { waypointWarpTime = MMOCore.plugin.getConfig().getInt("waypoints.default-warp-time"); waypointAutoPathCalculation = MMOCore.plugin.getConfig().getBoolean("waypoints.auto_path_calculation"); waypointLinkReciprocity = MMOCore.plugin.getConfig().getBoolean("waypoints.link_reciprocity"); + waypointUseCooldown = MMOCore.plugin.getConfig().getLong("waypoints.use_cooldown") * 50; + friendRequestTimeout = MMOCore.plugin.getConfig().getLong("friends.requests.time_out") * 1000; + maxfriendRequests = MMOCore.plugin.getConfig().getInt("friends.requests.max_simultaneously"); // Combat pvpModeEnabled = config.getBoolean("pvp_mode.enabled"); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/CooldownType.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/CooldownType.java new file mode 100644 index 00000000..e4c343f4 --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/player/CooldownType.java @@ -0,0 +1,45 @@ +package net.Indyuce.mmocore.player; + +import io.lumine.mythic.lib.player.cooldown.CooldownProvider; +import net.Indyuce.mmocore.MMOCore; +import org.bukkit.NamespacedKey; +import org.jetbrains.annotations.NotNull; + +import javax.inject.Provider; + +/** + * Used by MMOCore when it has to store the last time a player + * did some action. This also features a timeout function which + * can be used for cooldowns. + */ +public enum CooldownType implements CooldownProvider { + USE_WAYPOINT(() -> MMOCore.plugin.configManager.waypointUseCooldown), + + FRIEND_REQUEST(() -> MMOCore.plugin.configManager.friendRequestTimeout), + + ACTION_BAR_MESSAGE(() -> MMOCore.plugin.actionBarManager.getTimeOut()), + + LOOT_CHEST_SPAWN(() -> MMOCore.plugin.configManager.lootChestPlayerCooldown), + + CAST_SKILL(() -> MMOCore.plugin.configManager.globalSkillCooldown), + + ; + + private final Provider timeout; + private final NamespacedKey nsk; + + CooldownType(@NotNull Provider timeout) { + this.timeout = timeout; + this.nsk = new NamespacedKey(MMOCore.plugin, name()); + } + + @Override + public NamespacedKey getCooldownKey() { + return nsk; + } + + @Override + public long getCooldown() { + return timeout.get(); + } +} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/CastableSkill.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/CastableSkill.java index c8854e65..5bacfcf5 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/CastableSkill.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/CastableSkill.java @@ -6,9 +6,8 @@ import io.lumine.mythic.lib.player.cooldown.CooldownInfo; import io.lumine.mythic.lib.skill.Skill; import io.lumine.mythic.lib.skill.SkillMetadata; import io.lumine.mythic.lib.skill.handler.SkillHandler; -import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; -import net.Indyuce.mmocore.api.player.PlayerActivity; +import net.Indyuce.mmocore.player.CooldownType; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent; @@ -54,7 +53,7 @@ public class CastableSkill extends Skill { } // Global cooldown check - if (!getTrigger().isPassive() && playerData.getActivityTimeOut(PlayerActivity.CAST_SKILL) > 0) + if (!getTrigger().isPassive() && playerData.getCooldownMap().isOnCooldown(CooldownType.CAST_SKILL)) return false; // Cooldown check @@ -103,7 +102,7 @@ public class CastableSkill extends Skill { } if (!getTrigger().isPassive()) - casterData.setLastActivity(PlayerActivity.CAST_SKILL); + casterData.getCooldownMap().applyCooldown(CooldownType.CAST_SKILL); } @Override diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java index 92cb808e..d7f08e2b 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java @@ -1,7 +1,7 @@ package net.Indyuce.mmocore.skill; import io.lumine.mythic.lib.api.player.EquipmentSlot; -import io.lumine.mythic.lib.player.cooldown.CooldownObject; +import io.lumine.mythic.lib.player.cooldown.CooldownReference; import io.lumine.mythic.lib.player.modifier.ModifierSource; import io.lumine.mythic.lib.player.skill.PassiveSkill; import net.Indyuce.mmocore.MMOCore; @@ -11,12 +11,13 @@ import net.Indyuce.mmocore.api.util.math.formula.LinearValue; import net.Indyuce.mmocore.gui.api.item.Placeholders; import net.Indyuce.mmocore.player.Unlockable; import org.apache.commons.lang.Validate; +import org.bukkit.NamespacedKey; import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; import java.util.*; -public class ClassSkill implements CooldownObject, Unlockable { +public class ClassSkill implements CooldownReference, Unlockable { private final RegisteredSkill skill; private final int unlockLevel, maxSkillLevel; private final boolean unlockedByDefault, permanent, upgradable; @@ -206,7 +207,7 @@ public class ClassSkill implements CooldownObject, Unlockable { } @Override - public String getCooldownPath() { - return "skill_" + skill.getHandler().getId(); + public NamespacedKey getCooldownKey() { + return skill.getHandler().getCooldownKey(); } } \ No newline at end of file diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/SkillBar.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/SkillBar.java index 7195076e..28529ad2 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/SkillBar.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/SkillBar.java @@ -26,13 +26,14 @@ import java.util.Objects; public class SkillBar extends SkillCastingHandler { private final PlayerKey mainKey; - private final boolean disableSneak; + private final boolean disableSneak, useLowestSlots; public SkillBar(@NotNull ConfigurationSection config) { super(config); mainKey = PlayerKey.valueOf(UtilityMethods.enumName(Objects.requireNonNull(config.getString("open"), "Could not find open key"))); disableSneak = config.getBoolean("disable-sneak"); + useLowestSlots = config.getBoolean("use-lowest-indices"); } @Override diff --git a/MMOCore-Dist/src/main/resources/config.yml b/MMOCore-Dist/src/main/resources/config.yml index 8dad0204..f381ec33 100644 --- a/MMOCore-Dist/src/main/resources/config.yml +++ b/MMOCore-Dist/src/main/resources/config.yml @@ -79,6 +79,15 @@ party-plugin: mmocore # - ultimate_clans guild-plugin: mmocore +friends: + + requests: + # Maximum number of requests sent simultaneously + # Not implemented yet + max_simultaneously: 3 + # Time during which the friend request is valid in seconds + time_out: 120 + # MythicLib introduces a CHANCE stat that is used in # several different systems in MMOCore. By changing these # weights you can define how much the Chance stat impacts @@ -100,12 +109,13 @@ skill-tree-scroll-step-y: 1 # provide the player with experience points or not should-cobblestone-generators-give-exp: false -# Edit how to cast skills here. This part of the config is -# pretty tricky so it's best to read the wiki page before editing anything +# Edit how to cast skills here. To customize skill casting, +# please refer to the "Skill Casting" wiki page. skill-casting: mode: SKILL_BAR open: SWAP_HANDS disable-sneak: false + use-lowest-indices: true loot-chests: @@ -274,6 +284,9 @@ waypoints: # takes to use the waypoint and teleport to target location. default-warp-time: 100 + # Cooldown for using two consecutive waypoints, in ticks + use_cooldown: 120 + link_reciprocity: false # By default, MMOCore runs path calculation to enable players