New ML cooldown API

This commit is contained in:
Jules 2024-10-22 13:51:25 +02:00
parent 7cabb2398a
commit c03b91a21b
16 changed files with 160 additions and 142 deletions

View File

@ -119,7 +119,7 @@
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.20.6-R0.1-SNAPSHOT</version>
<version>1.21.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<optional>true</optional>

View File

@ -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<Long> timeout;
PlayerActivity(Provider<Long> timeout) {
this.timeout = timeout;
}
public long getTimeOut() {
return Objects.requireNonNull(timeout, "Time out not supported").get();
}
}

View File

@ -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<String, SavedClassInformation> classSlots = new HashMap<>();
private final Map<PlayerActivity, Long> lastActivity = new HashMap<>();
private final CombatHandler combat = new CombatHandler(this);
/**
@ -142,9 +142,10 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
*/
private final Map<String, Integer> 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<FriendRequest> 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() {

View File

@ -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()) {

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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) {

View File

@ -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", "<No Action Bar Format Found>");
@ -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)));

View File

@ -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<EntityDamageEvent.DamageCause> 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");

View File

@ -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<Long> timeout;
private final NamespacedKey nsk;
CooldownType(@NotNull Provider<Long> timeout) {
this.timeout = timeout;
this.nsk = new NamespacedKey(MMOCore.plugin, name());
}
@Override
public NamespacedKey getCooldownKey() {
return nsk;
}
@Override
public long getCooldown() {
return timeout.get();
}
}

View File

@ -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

View File

@ -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();
}
}

View File

@ -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

View File

@ -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