From bd1b40f1da801e1cf99202c9b198cab15c602b0f Mon Sep 17 00:00:00 2001 From: Indyuce Date: Wed, 17 Aug 2022 13:24:35 +0200 Subject: [PATCH 01/17] New debug log to prevent startup issues --- .../java/net/Indyuce/mmocore/manager/SoundManager.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SoundManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SoundManager.java index cd488546..1e8eb13f 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SoundManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SoundManager.java @@ -1,5 +1,6 @@ package net.Indyuce.mmocore.manager; +import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.api.SoundEvent; import net.Indyuce.mmocore.api.SoundObject; @@ -9,6 +10,7 @@ import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import java.util.logging.Level; public class SoundManager implements MMOCoreManager { private final Map sounds = new HashMap<>(); @@ -25,6 +27,10 @@ public class SoundManager implements MMOCoreManager { FileConfiguration config = new ConfigFile("sounds").getConfig(); for (SoundEvent sound : SoundEvent.values()) - sounds.put(sound, new SoundObject(config.getString(sound.name().replace("_", "-").toLowerCase()))); + try { + sounds.put(sound, new SoundObject(config.getString(sound.name().replace("_", "-").toLowerCase()))); + } catch (RuntimeException exception) { + MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load sound for '" + sound.name() + "': " + exception.getMessage()); + } } } From 95ea032dfa51239053ce3cabbcb6b3320199951f Mon Sep 17 00:00:00 2001 From: Indyuce Date: Wed, 17 Aug 2022 13:24:52 +0200 Subject: [PATCH 02/17] New disp name option for killmob exp source --- .../source/KillMobExperienceSource.java | 18 +++++++++++++----- .../source/type/SpecificExperienceSource.java | 8 ++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java index 388a5b2c..70b29076 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java @@ -1,12 +1,13 @@ package net.Indyuce.mmocore.experience.source; +import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.event.PlayerKillEntityEvent; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; +import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; @@ -16,23 +17,30 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.persistence.PersistentDataType; +import javax.annotation.Nullable; + public class KillMobExperienceSource extends SpecificExperienceSource { - public final EntityType type; + private final EntityType type; + + @Nullable + private final String displayName; public KillMobExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) { super(dispenser, config); - config.validate("type"); + config.validateKeys("type"); + displayName = config.contains("name") ? MythicLib.plugin.parseColors(config.getString("name")) : null; type = EntityType.valueOf(config.getString("type").toUpperCase().replace("-", "_").replace(" ", "_")); } @Override public ExperienceSourceManager newManager() { return new ExperienceSourceManager() { + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void a(PlayerKillEntityEvent event) { Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> { - if (event.getTarget().isDead() && !event.getTarget().getPersistentDataContainer().has(new NamespacedKey(MMOCore.plugin,"spawner_spawned"),PersistentDataType.STRING)) { + if (event.getTarget().isDead() && !event.getTarget().getPersistentDataContainer().has(new NamespacedKey(MMOCore.plugin, "spawner_spawned"), PersistentDataType.STRING)) { PlayerData data = PlayerData.get(event.getPlayer()); for (KillMobExperienceSource source : getSources()) @@ -46,6 +54,6 @@ public class KillMobExperienceSource extends SpecificExperienceSource { @Override public boolean matchesParameter(PlayerData player, Entity obj) { - return obj.getType() == type; + return obj.getType() == type && (displayName == null || displayName.equals(obj.getCustomName())); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java index d284bd36..2f725651 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java @@ -10,7 +10,6 @@ import org.jetbrains.annotations.Nullable; public abstract class SpecificExperienceSource extends ExperienceSource { private final RandomAmount amount; - double counter = 0; /** * Used to register experience sources with SPECIFIC experience outputs. @@ -20,20 +19,21 @@ public abstract class SpecificExperienceSource extends ExperienceSource { public SpecificExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) { super(dispenser); - config.validate("amount"); + config.validateKeys("amount"); amount = new RandomAmount(config.getString("amount")); } /** * Used for FromExperienceSource + * * @param dispenser */ public SpecificExperienceSource(ExperienceDispenser dispenser) { super(dispenser); - amount=new RandomAmount(0,0); - } + amount = new RandomAmount(0, 0); + } public RandomAmount getAmount() { return amount; From 056d1f57ecf5f0d23df6aaa6b8f7ea6b46115220 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Wed, 17 Aug 2022 13:25:02 +0200 Subject: [PATCH 03/17] Cleanup i guess --- .../manager/data/mysql/MySQLDataProvider.java | 12 ++- .../manager/data/mysql/MySQLTableEditor.java | 77 +++++++++---------- 2 files changed, 49 insertions(+), 40 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java index bf14f75e..8684251f 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java @@ -24,12 +24,22 @@ public class MySQLDataProvider extends MMODataSource implements DataProvider { executeUpdateAsync( "CREATE TABLE IF NOT EXISTS mmocore_playerdata(uuid VARCHAR(36),class_points " + "INT(11) DEFAULT 0,skill_points INT(11) DEFAULT 0,attribute_points INT(11) " - + "DEFAULT 0,attribute_realloc_points INT(11) DEFAULT 0,level INT(11) DEFAULT 1," + + "DEFAULT 0,attribute_realloc_points INT(11) DEFAULT 0,skill_reallocation_points INT(11) DEFAULT 0,level INT(11) DEFAULT 1," + "experience INT(11) DEFAULT 0,class VARCHAR(20),guild VARCHAR(20),last_login LONG," + "attributes LONGTEXT,professions LONGTEXT,times_claimed LONGTEXT,quests LONGTEXT," + "waypoints LONGTEXT,friends LONGTEXT,skills LONGTEXT,bound_skills LONGTEXT," + "class_info LONGTEXT, is_saved TINYINT, PRIMARY KEY (uuid));"); + // Add 'skill_reallocation_points' if it doesn't exist + getResultAsync("SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME = 'mmocore_playerdata' AND COLUMN_NAME = 'skill_reallocation_points'", result -> { + try { + if (!result.next()) + executeUpdateAsync("ALTER TABLE mmocore_playerdata ADD COLUMN skill_reallocation_points INT(11) DEFAULT 0"); + } catch (SQLException exception) { + exception.printStackTrace(); + } + }); + // Add 'times_claimed' if it doesn't exist getResultAsync("SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME = 'mmocore_playerdata' AND COLUMN_NAME = 'times_claimed'", result -> { try { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java index dca9a1fb..5e5766b4 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java @@ -1,56 +1,55 @@ package net.Indyuce.mmocore.manager.data.mysql; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + import java.util.Collection; import java.util.Map.Entry; import java.util.Set; import java.util.UUID; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; - public class MySQLTableEditor { - private final Table table; - private final UUID uuid; + private final Table table; + private final UUID uuid; + private final MySQLDataProvider provider; - private final MySQLDataProvider provider; + public MySQLTableEditor(Table table, UUID uuid, MySQLDataProvider provider) { + this.table = table; + this.uuid = uuid; + this.provider = provider; + } - public MySQLTableEditor(Table table, UUID uuid,MySQLDataProvider provider) { - this.table = table; - this.uuid = uuid; - this.provider=provider; - } + public void updateData(String key, Object value) { + provider.executeUpdate("INSERT INTO " + table + "(uuid, " + key + + ") VALUES('" + uuid + "', '" + value + "') ON DUPLICATE KEY UPDATE " + key + "='" + value + "';"); + } - public void updateData(String key, Object value) { - provider.executeUpdate("INSERT INTO " + table + "(uuid, " + key - + ") VALUES('" + uuid + "', '" + value + "') ON DUPLICATE KEY UPDATE " + key + "='" + value + "';"); - } + public void updateJSONArray(String key, Collection collection) { + JsonArray json = new JsonArray(); + for (String s : collection) + json.add(s); + updateData(key, json.toString()); + } - public void updateJSONArray(String key, Collection collection) { - JsonArray json = new JsonArray(); - for (String s : collection) - json.add(s); - updateData(key, json.toString()); - } + public void updateJSONObject(String key, Set> collection) { + JsonObject json = new JsonObject(); + for (Entry entry : collection) + json.addProperty(entry.getKey(), entry.getValue()); + updateData(key, json.toString()); + } - public void updateJSONObject(String key, Set> collection) { - JsonObject json = new JsonObject(); - for (Entry entry : collection) - json.addProperty(entry.getKey(), entry.getValue()); - updateData(key, json.toString()); - } + public enum Table { + PLAYERDATA("mmocore_playerdata"), GUILDDATA("mmocore_guilddata"); - public enum Table { - PLAYERDATA("mmocore_playerdata"), GUILDDATA("mmocore_guilddata"); + final String tableName; - final String tableName; + Table(String tN) { + tableName = tN; + } - Table(String tN) { - tableName = tN; - } - - @Override - public String toString() { - return tableName; - } - } + @Override + public String toString() { + return tableName; + } + } } From 4e7296732143bfdb2593996c9670352b1dc8d36a Mon Sep 17 00:00:00 2001 From: Indyuce Date: Wed, 17 Aug 2022 18:57:04 +0200 Subject: [PATCH 04/17] Fixed exp bar frozen when reloading MMOCore --- .../java/net/Indyuce/mmocore/MMOCore.java | 4 +-- .../mmocore/api/player/PlayerData.java | 11 ++++---- .../mmocore/manager/ConfigManager.java | 25 ++++++++----------- .../net/Indyuce/mmocore/MMOCoreBukkit.java | 2 +- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java index b68d49eb..7a613398 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -111,11 +111,11 @@ public class MMOCore extends JavaPlugin { MythicLib.plugin.getEntities().registerRestriction(new MMOCoreTargetRestriction()); MythicLib.plugin.getModifiers().registerModifierType("attribute", configObject -> new AttributeModifier(configObject)); - // Skill creation + // Custom scripts MythicLib.plugin.getSkills().registerMechanic("mana", config -> new ManaMechanic(config)); MythicLib.plugin.getSkills().registerMechanic("stamina", config -> new StaminaMechanic(config)); MythicLib.plugin.getSkills().registerMechanic("stellium", config -> new StelliumMechanic(config)); - MythicLib.plugin.getSkills().registerMechanic("experience", config -> new ExperienceMechanic(config)); + MythicLib.plugin.getSkills().registerMechanic("mmocore_experience", config -> new ExperienceMechanic(config)); // Register extra objective, drop items... if (Bukkit.getPluginManager().getPlugin("WorldGuard") != null) 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 14bac559..7c05011a 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 @@ -4,7 +4,6 @@ import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.api.player.MMOPlayerData; import io.lumine.mythic.lib.player.cooldown.CooldownMap; import io.lumine.mythic.lib.player.modifier.PlayerModifier; -import net.Indyuce.mmocore.party.provided.Party; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; @@ -32,6 +31,7 @@ import net.Indyuce.mmocore.experience.droptable.ExperienceTable; import net.Indyuce.mmocore.guild.provided.Guild; import net.Indyuce.mmocore.loot.chest.particle.SmallParticleEffect; import net.Indyuce.mmocore.party.AbstractParty; +import net.Indyuce.mmocore.party.provided.Party; import net.Indyuce.mmocore.player.Unlockable; import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.RegisteredSkill; @@ -416,14 +416,14 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc } public void giveSkillReallocationPoints(int value) { - skillReallocationPoints+=value; + skillReallocationPoints += value; } public int countSkillPointsWhenReallocate() { int sum = 0; - for(ClassSkill skill:getProfess().getSkills()) { + for (ClassSkill skill : getProfess().getSkills()) { //0 if the skill is level 1(just unlocked) or 0 locked. - sum+=Math.max(0,getSkillLevel(skill.getSkill())-1); + sum += Math.max(0, getSkillLevel(skill.getSkill()) - 1); } return sum; } @@ -526,7 +526,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc if (!MMOCore.plugin.configManager.overrideVanillaExp) return; - getPlayer().sendExperienceChange(0.01f); getPlayer().setLevel(getLevel()); getPlayer().setExp(Math.max(0, Math.min(1, (float) experience / (float) getLevelUpExperience()))); } @@ -1081,7 +1080,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc * 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/manager/ConfigManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java index af710d93..163e9a32 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 @@ -2,8 +2,8 @@ package net.Indyuce.mmocore.manager; import io.lumine.mythic.lib.MythicLib; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.ConfigFile; +import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.input.ChatInput; import net.Indyuce.mmocore.api.util.input.PlayerInput; import net.Indyuce.mmocore.api.util.input.PlayerInput.InputType; @@ -21,21 +21,14 @@ import java.util.logging.Level; public class ConfigManager { public final CommandVerbose commandVerbose = new CommandVerbose(); - - public boolean overrideVanillaExp, canCreativeCast, cobbleGeneratorXP, saveDefaultClassInfo, attributesAsClassInfo, splitProfessionExp, questBossBar; - public String partyChatPrefix, noSkillBoundPlaceholder; - public ChatColor staminaFull, staminaHalf, staminaEmpty; - public long combatLogTimer, lootChestExpireTime, lootChestPlayerCooldown, globalSkillCooldown; - public double lootChestsChanceWeight, fishingDropsChanceWeight; - public int maxPartyLevelDifference,maxBoundSkills; - + public final boolean overrideVanillaExp, canCreativeCast, cobbleGeneratorXP, saveDefaultClassInfo, splitProfessionExp, questBossBar; + public final String partyChatPrefix, noSkillBoundPlaceholder; + public final ChatColor staminaFull, staminaHalf, staminaEmpty; + public final long combatLogTimer, lootChestExpireTime, lootChestPlayerCooldown, globalSkillCooldown; + public final double lootChestsChanceWeight, fishingDropsChanceWeight; + public final int maxPartyLevelDifference, maxBoundSkills; private final FileConfiguration messages; - /* - * the instance must be created after the other managers since all it does - * is to update them based on the config except for the classes which are - * already loaded based on the config - */ public ConfigManager() { // loadDefaultFile("recipes", "brewing.yml"); // loadDefaultFile("recipes", "furnace.yml"); @@ -74,6 +67,7 @@ public class ConfigManager { loadDefaultFile("expcurves", "levels.txt"); loadDefaultFile("expcurves", "mining.txt"); } + if(!new File(MMOCore.plugin.getDataFolder()+"/skilltree").exists()) { loadDefaultFile("skilltree","combat.yml"); } @@ -115,7 +109,8 @@ public class ConfigManager { canCreativeCast = MMOCore.plugin.getConfig().getBoolean("can-creative-cast"); cobbleGeneratorXP = MMOCore.plugin.getConfig().getBoolean("should-cobblestone-generators-give-exp"); saveDefaultClassInfo = MMOCore.plugin.getConfig().getBoolean("save-default-class-info"); - maxBoundSkills= MMOCore.plugin.getConfig().getInt("max-bound-skills",6); + maxBoundSkills = MMOCore.plugin.getConfig().getInt("max-bound-skills",6); + overrideVanillaExp = MMOCore.plugin.getConfig().getBoolean("override-vanilla-exp"); } private ChatColor getColorOrDefault(String key, ChatColor defaultColor) { diff --git a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java index 8efba457..160c0922 100644 --- a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java +++ b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/MMOCoreBukkit.java @@ -16,7 +16,7 @@ public class MMOCoreBukkit { * all the listeners required for MMOCore to run */ public MMOCoreBukkit(MMOCore plugin) { - if (plugin.configManager.overrideVanillaExp = plugin.getConfig().getBoolean("override-vanilla-exp")) + if (plugin.configManager.overrideVanillaExp) Bukkit.getPluginManager().registerEvents(new VanillaExperienceOverride(), plugin); if (plugin.getConfig().getBoolean("hotbar-swapping.enabled")) From ab5635432c1cd5bfcd2069fe314f18f1b5baffd3 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Thu, 18 Aug 2022 13:01:23 +0200 Subject: [PATCH 05/17] Added warpTime option for any waypoint --- .../mmocore/api/player/PlayerData.java | 22 ++++++++++--------- .../mmocore/manager/ConfigManager.java | 13 ++++++----- .../Indyuce/mmocore/waypoint/Waypoint.java | 9 ++++++++ 3 files changed, 28 insertions(+), 16 deletions(-) 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 67b28116..ea5bd4fd 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 @@ -683,12 +683,12 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc final int x = getPlayer().getLocation().getBlockX(); final int y = getPlayer().getLocation().getBlockY(); final int z = getPlayer().getLocation().getBlockZ(); + final double warpTime = target.getWarpTime(); int t; public void run() { - if (!isOnline()) - return; - if (getPlayer().getLocation().getBlockX() != x || getPlayer().getLocation().getBlockY() != y + if (!isOnline() || getPlayer().getLocation().getBlockX() != x + || getPlayer().getLocation().getBlockY() != y || getPlayer().getLocation().getBlockZ() != z) { MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_CANCELLED).playTo(getPlayer()); MMOCore.plugin.configManager.getSimpleMessage("warping-canceled").send(getPlayer()); @@ -697,8 +697,8 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return; } - MMOCore.plugin.configManager.getSimpleMessage("warping-comencing", "left", "" + ((MMOCore.plugin.configManager.waypointWarpTime+20 - t) / 20)).send(getPlayer()); - if (t++ >= MMOCore.plugin.configManager.waypointWarpTime) { + MMOCore.plugin.configManager.getSimpleMessage("warping-comencing", "left", String.valueOf((warpTime + 20 - t) / 20)).send(getPlayer()); + if (t++ >= warpTime) { getPlayer().teleport(target.getLocation()); getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20, 1, false, false)); MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_TELEPORT).playTo(getPlayer()); @@ -706,12 +706,14 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return; } - MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_CHARGE).playTo(getPlayer(), 1, (float) (t / Math.PI * 1.5/MMOCore.plugin.configManager.waypointWarpTime + .5)); - double r = Math.sin((double) t / MMOCore.plugin.configManager.waypointWarpTime * Math.PI); + MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_CHARGE).playTo(getPlayer(), 1, (float) (.5 + t / warpTime * 1.5)); + final double r = Math.sin((double) t / warpTime * Math.PI); for (double j = 0; j < Math.PI * 2; j += Math.PI / 4) - getPlayer().getLocation().getWorld().spawnParticle(Particle.REDSTONE, - getPlayer().getLocation().add(Math.cos((double) 5*t /MMOCore.plugin.configManager.waypointWarpTime + j) * r, (double) 2*t / MMOCore.plugin.configManager.waypointWarpTime, Math.sin((double) 5*t / MMOCore.plugin.configManager.waypointWarpTime + j) * r), 1, - new Particle.DustOptions(Color.PURPLE, 1.25f)); + getPlayer().getLocation().getWorld().spawnParticle(Particle.REDSTONE, getPlayer().getLocation().add( + Math.cos((double) 5 * t / warpTime + j) * r, + (double) 2 * t / warpTime, + Math.sin((double) 5 * t / warpTime + j) * r), + 1, new Particle.DustOptions(Color.PURPLE, 1.25f)); } }.runTaskTimer(MMOCore.plugin, 0, 1); } 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 639110a9..47928da7 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 @@ -2,8 +2,8 @@ package net.Indyuce.mmocore.manager; import io.lumine.mythic.lib.MythicLib; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.ConfigFile; +import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.input.ChatInput; import net.Indyuce.mmocore.api.util.input.PlayerInput; import net.Indyuce.mmocore.api.util.input.PlayerInput.InputType; @@ -68,9 +68,9 @@ public class ConfigManager { loadDefaultFile("expcurves", "levels.txt"); loadDefaultFile("expcurves", "mining.txt"); } - if(!new File(MMOCore.plugin.getDataFolder()+"/skilltree").exists()) { - loadDefaultFile("skilltree","combat.yml"); - } + + if (!new File(MMOCore.plugin.getDataFolder() + "/skilltree").exists()) + loadDefaultFile("skilltree", "combat.yml"); loadDefaultFile("attributes.yml"); loadDefaultFile("items.yml"); @@ -109,7 +109,8 @@ public class ConfigManager { canCreativeCast = MMOCore.plugin.getConfig().getBoolean("can-creative-cast"); cobbleGeneratorXP = MMOCore.plugin.getConfig().getBoolean("should-cobblestone-generators-give-exp"); saveDefaultClassInfo = MMOCore.plugin.getConfig().getBoolean("save-default-class-info"); - maxBoundSkills= MMOCore.plugin.getConfig().getInt("max-bound-skills",6); + maxBoundSkills = MMOCore.plugin.getConfig().getInt("max-bound-skills", 6); + overrideVanillaExp = MMOCore.plugin.getConfig().getBoolean("override-vanilla-exp"); } private ChatColor getColorOrDefault(String key, ChatColor defaultColor) { @@ -123,7 +124,7 @@ public class ConfigManager { @Deprecated public PlayerInput newPlayerInput(Player player, InputType type, Consumer output) { - return new ChatInput(player, type, output) ; + return new ChatInput(player, type, output); } public void loadDefaultFile(String name) { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java index 93bee8ae..b5f3d643 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java @@ -23,6 +23,7 @@ public class Waypoint extends PostLoadObject implements Unlockable { private final Location loc; private final List lore; private final double radiusSquared; + private final int warpTime; /** * Set that saves all the waypoints accessible when in this waypoint. @@ -48,6 +49,7 @@ public class Waypoint extends PostLoadObject implements Unlockable { loc = readLocation(Objects.requireNonNull(config.getString("location"), "Could not read location")); radiusSquared = Math.pow(config.getDouble("radius"), 2); + warpTime = config.getInt("warp-time", 100); dynamicCost = config.getDouble("cost.dynamic-use"); normalCost = config.getDouble("cost.normal-use"); @@ -95,10 +97,17 @@ public class Waypoint extends PostLoadObject implements Unlockable { return loc; } + public int getWarpTime() { + return warpTime; + } + public double getDynamicCost() { return dynamicCost; } + /** + * @deprecated Not implemented yet + */ @Deprecated public double getSetSpawnCost() { return setSpawnCost; From f25cb1d069901d07bed5b3f93e6016014158429b Mon Sep 17 00:00:00 2001 From: Indyuce Date: Thu, 18 Aug 2022 13:05:09 +0200 Subject: [PATCH 06/17] Fixed waypoint message --- .../java/net/Indyuce/mmocore/api/player/PlayerData.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 ea5bd4fd..d5edcba0 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 @@ -683,7 +683,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc final int x = getPlayer().getLocation().getBlockX(); final int y = getPlayer().getLocation().getBlockY(); final int z = getPlayer().getLocation().getBlockZ(); - final double warpTime = target.getWarpTime(); + final int warpTime = target.getWarpTime(); int t; public void run() { @@ -697,7 +697,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return; } - MMOCore.plugin.configManager.getSimpleMessage("warping-comencing", "left", String.valueOf((warpTime + 20 - t) / 20)).send(getPlayer()); + MMOCore.plugin.configManager.getSimpleMessage("warping-comencing", "left", String.valueOf((warpTime - t) / 20)).send(getPlayer()); if (t++ >= warpTime) { getPlayer().teleport(target.getLocation()); getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20, 1, false, false)); @@ -706,7 +706,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return; } - MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_CHARGE).playTo(getPlayer(), 1, (float) (.5 + t / warpTime * 1.5)); + MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_CHARGE).playTo(getPlayer(), 1, (float) (.5 + t * 1.5 / warpTime)); final double r = Math.sin((double) t / warpTime * Math.PI); for (double j = 0; j < Math.PI * 2; j += Math.PI / 4) getPlayer().getLocation().getWorld().spawnParticle(Particle.REDSTONE, getPlayer().getLocation().add( From 908db88dae5a91e611ff6b1353064ba46bac226c Mon Sep 17 00:00:00 2001 From: Indyuce Date: Thu, 18 Aug 2022 13:26:35 +0200 Subject: [PATCH 07/17] Removed PHE again --- .../net/Indyuce/mmocore/gui/api/item/Placeholders.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java index 9be73a67..7ea643bd 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java @@ -23,11 +23,15 @@ public class Placeholders { while (str.contains("{") && str.substring(str.indexOf("{")).contains("}")) { String holder = str.substring(str.indexOf("{") + 1, str.indexOf("}")); @Nullable String found = placeholders.get(holder); + + /* + * Do NOT replace the placeholder unless a corresponding value has + * been found. This simple workaround fixes an issue with PAPI + * math expansions which interferes with MMOCore placeholders since + * it uses {....} as well. + */ if (found != null) str = str.replace("{" + holder + "}", found); - else - str = str.replace("{" + holder + "}", "PHE"); - } // External placeholders From 174898ba7242883f6e4b8c5422e7955d705d1387 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Thu, 18 Aug 2022 13:31:14 +0200 Subject: [PATCH 08/17] Initializer key cleanup --- .../skill/cast/listener/KeyCombos.java | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java index ecb16a98..8a8562f8 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java @@ -1,6 +1,5 @@ package net.Indyuce.mmocore.skill.cast.listener; -import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.event.skill.PlayerCastSkillEvent; import io.lumine.mythic.lib.api.player.EquipmentSlot; @@ -8,15 +7,14 @@ import io.lumine.mythic.lib.player.PlayerMetadata; import io.lumine.mythic.lib.skill.trigger.TriggerMetadata; import io.lumine.mythic.lib.skill.trigger.TriggerType; import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.SoundObject; import net.Indyuce.mmocore.api.event.PlayerKeyPressEvent; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.gui.api.item.Placeholders; -import net.Indyuce.mmocore.skill.cast.PlayerKey; -import net.Indyuce.mmocore.api.SoundObject; import net.Indyuce.mmocore.skill.cast.KeyCombo; +import net.Indyuce.mmocore.skill.cast.PlayerKey; import net.Indyuce.mmocore.skill.cast.SkillCastingHandler; import org.apache.commons.lang.Validate; -import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -34,15 +32,18 @@ public class KeyCombos implements Listener { * hash code method */ private final Map combos = new HashMap<>(); + /** * All the keys that are at the start of a combo. */ private final Set firstComboKeys = new HashSet<>(); /** - * Key players need to press to start a combo + * Key players need to press to start a combo. If it's set to + * null then the player can press any key which starts a combo. + * These "starting keys" are saved in {@link #firstComboKeys} */ - private final boolean needsInitializerKey; + @Nullable private final PlayerKey initializerKey; private final int longestCombo; @@ -58,9 +59,8 @@ public class KeyCombos implements Listener { public KeyCombos(ConfigurationSection config) { - int longestCombo = 0; - // Load different combos + int currentLongestCombo = 0; for (String key : config.getConfigurationSection("combos").getKeys(false)) try { int spellSlot = Integer.valueOf(key); @@ -72,12 +72,12 @@ public class KeyCombos implements Listener { combos.put(combo, spellSlot); firstComboKeys.add(combo.getAt(0)); - longestCombo = Math.max(longestCombo, combo.countKeys()); + currentLongestCombo = Math.max(currentLongestCombo, combo.countKeys()); } catch (RuntimeException exception) { MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load key combo '" + key + "': " + exception.getMessage()); } - this.longestCombo = longestCombo; + this.longestCombo = currentLongestCombo; // Load player key names actionBarOptions = config.contains("action-bar") ? new ActionBarOptions(config.getConfigurationSection("action-bar")) : null; @@ -87,13 +87,9 @@ public class KeyCombos implements Listener { comboClickSound = config.contains("sound.combo-key") ? new SoundObject(config.getConfigurationSection("sound.combo-key")) : null; failComboSound = config.contains("sound.fail-combo") ? new SoundObject(config.getConfigurationSection("sound.fail-combo")) : null; - needsInitializerKey = config.getBoolean("needs-initializer-key", true); - - // Find initializer key - initializerKey = needsInitializerKey ? PlayerKey.valueOf(UtilityMethods.enumName(Objects.requireNonNull( + initializerKey = config.contains("initializer-key") ? PlayerKey.valueOf(UtilityMethods.enumName(Objects.requireNonNull( config.getString("initializer-key"), "Could not find initializer key"))) : null; - } @EventHandler @@ -102,7 +98,7 @@ public class KeyCombos implements Listener { Player player = playerData.getPlayer(); if (!event.getData().isCasting()) { - if (needsInitializerKey) { + if (initializerKey != null) { if (event.getPressed() == initializerKey) { // Always cancel event @@ -122,7 +118,7 @@ public class KeyCombos implements Listener { event.setCancelled(true); // Start combo - CustomSkillCastingHandler casting =new CustomSkillCastingHandler(playerData); + CustomSkillCastingHandler casting = new CustomSkillCastingHandler(playerData); playerData.setSkillCasting(casting); casting.current.registerKey(event.getPressed()); if (beginComboSound != null) @@ -132,7 +128,6 @@ public class KeyCombos implements Listener { } } - // Adding pressed key CustomSkillCastingHandler casting = (CustomSkillCastingHandler) playerData.getSkillCasting(); casting.current.registerKey(event.getPressed()); From a299325b39638e63274ac833ee161f6e7d978c67 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Thu, 18 Aug 2022 14:04:10 +0200 Subject: [PATCH 09/17] Removed %player%, use player expansion instead --- .../placeholder/PlaceholderAPIParser.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/PlaceholderAPIParser.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/PlaceholderAPIParser.java index 4776fdf4..a4d5de97 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/PlaceholderAPIParser.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/PlaceholderAPIParser.java @@ -1,17 +1,16 @@ package net.Indyuce.mmocore.comp.placeholder; +import io.lumine.mythic.lib.MythicLib; +import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.OfflinePlayer; -import me.clip.placeholderapi.PlaceholderAPI; -import io.lumine.mythic.lib.MythicLib; - public class PlaceholderAPIParser implements PlaceholderParser { - public PlaceholderAPIParser() { - new RPGPlaceholders().register(); - } + public PlaceholderAPIParser() { + new RPGPlaceholders().register(); + } - @Override - public String parse(OfflinePlayer player, String string) { - return MythicLib.plugin.parseColors(PlaceholderAPI.setPlaceholders(player, string.replace("%player%", player.getName()))); - } + @Override + public String parse(OfflinePlayer player, String string) { + return MythicLib.plugin.parseColors(PlaceholderAPI.setPlaceholders(player, string)); + } } From 632ee8abb154ba3cbb7033cdb69ea3feb498125e Mon Sep 17 00:00:00 2001 From: Indyuce Date: Thu, 18 Aug 2022 14:06:04 +0200 Subject: [PATCH 10/17] Fixed placeholders looping --- .../mmocore/gui/api/item/Placeholders.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java index 7ea643bd..06d497fb 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java @@ -19,9 +19,17 @@ public class Placeholders { // Remove conditions first str = removeCondition(str); + /* + * For MMOCore not to loop on unparsable placeholders, it keeps + * track of the "last placeholder" parsed. The 'explored' string + * has NO parsed placeholder. + */ + String explored = str; + // Internal placeholders - while (str.contains("{") && str.substring(str.indexOf("{")).contains("}")) { - String holder = str.substring(str.indexOf("{") + 1, str.indexOf("}")); + while (explored.contains("{") && explored.substring(explored.indexOf("{")).contains("}")) { + final int begin = explored.indexOf("{"), end = explored.indexOf("}"); + final String holder = explored.substring(begin + 1, end); @Nullable String found = placeholders.get(holder); /* @@ -32,6 +40,9 @@ public class Placeholders { */ if (found != null) str = str.replace("{" + holder + "}", found); + + // Increase counter + explored = explored.substring(end + 1); } // External placeholders From 57e7e52f8495e5a190848524fcf0bf760a76d7f1 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Thu, 18 Aug 2022 17:43:18 +0200 Subject: [PATCH 11/17] Update ver nb --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8c1c3432..12594de3 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ Offer your players a brand new RPG experience!! - 1.9.5-SNAPSHOT + 1.10-SNAPSHOT false false UTF-8 From 7f670df8c5d11bfcc721e59a4f58a36cb01bffa5 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Thu, 18 Aug 2022 23:38:13 +0200 Subject: [PATCH 12/17] Debug logs to prevent server crash --- .../net/Indyuce/mmocore/manager/SkillManager.java | 12 ++++++++---- pom.xml | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java index 19b1d5ac..df79de35 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java @@ -3,12 +3,12 @@ package net.Indyuce.mmocore.manager; import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.skill.handler.SkillHandler; import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.skill.RegisteredSkill; -import net.Indyuce.mmocore.skill.list.Sneaky_Picky; -import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.skill.list.Ambers; import net.Indyuce.mmocore.skill.list.Neptune_Gift; +import net.Indyuce.mmocore.skill.list.Sneaky_Picky; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -83,8 +83,12 @@ public class SkillManager implements MMOCoreManager { config.save(); } - RegisteredSkill skill = new RegisteredSkill(handler, config.getConfig()); - this.skills.put(handler.getId(), skill); + try { + final RegisteredSkill skill = new RegisteredSkill(handler, config.getConfig()); + this.skills.put(handler.getId(), skill); + } catch (RuntimeException exception) { + MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load skill '" + handler.getId() + "': " + exception.getMessage()); + } } } } diff --git a/pom.xml b/pom.xml index 12594de3..867ca9e9 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ Offer your players a brand new RPG experience!! - 1.10-SNAPSHOT + 1.10.1-SNAPSHOT false false UTF-8 From 3a2f6e20ed4c881ea112900f5b7e64a09c7ae04d Mon Sep 17 00:00:00 2001 From: Indyuce Date: Thu, 18 Aug 2022 23:42:02 +0200 Subject: [PATCH 13/17] Removed default file loading --- .../main/java/net/Indyuce/mmocore/manager/ConfigManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 47928da7..a7f371a2 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 @@ -69,8 +69,8 @@ public class ConfigManager { loadDefaultFile("expcurves", "mining.txt"); } - if (!new File(MMOCore.plugin.getDataFolder() + "/skilltree").exists()) - loadDefaultFile("skilltree", "combat.yml"); +/* if (!new File(MMOCore.plugin.getDataFolder() + "/skilltree").exists()) + loadDefaultFile("skilltree", "combat.yml");*/ loadDefaultFile("attributes.yml"); loadDefaultFile("items.yml"); From e326bad6b3d1737c245e5ec3da8d958d5ce95874 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Fri, 19 Aug 2022 10:46:59 +0200 Subject: [PATCH 14/17] Small action bar changes --- .../java/net/Indyuce/mmocore/MMOCore.java | 4 +- .../Indyuce/mmocore/api/PlayerActionBar.java | 81 ------------------- .../mmocore/manager/ActionBarManager.java | 68 ++++++++++++++++ .../skill/cast/listener/KeyCombos.java | 2 +- MMOCore-Dist/src/main/resources/config.yml | 7 +- 5 files changed, 73 insertions(+), 89 deletions(-) delete mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/api/PlayerActionBar.java create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ActionBarManager.java diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java index 7a613398..ea6dc7b2 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -6,7 +6,7 @@ import io.lumine.mythic.lib.version.SpigotPlugin; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.manager.social.PartyManager; import net.Indyuce.mmocore.api.ConfigFile; -import net.Indyuce.mmocore.api.PlayerActionBar; +import net.Indyuce.mmocore.manager.ActionBarManager; import net.Indyuce.mmocore.api.player.attribute.AttributeModifier; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.command.*; @@ -64,7 +64,7 @@ public class MMOCore extends JavaPlugin { public final SoundManager soundManager = new SoundManager(); public final RequestManager requestManager = new RequestManager(); public final ConfigItemManager configItems = new ConfigItemManager(); - public final PlayerActionBar actionBarManager = new PlayerActionBar(); + public final ActionBarManager actionBarManager = new ActionBarManager(); public final SkillManager skillManager = new SkillManager(); public final ClassManager classManager = new ClassManager(); public final DropTableManager dropTableManager = new DropTableManager(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/PlayerActionBar.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/PlayerActionBar.java deleted file mode 100644 index ad7fd332..00000000 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/PlayerActionBar.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.Indyuce.mmocore.api; - -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.api.player.PlayerData; -import net.Indyuce.mmocore.gui.api.item.Placeholders; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.attribute.Attribute; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.scheduler.BukkitRunnable; - -import java.text.DecimalFormat; - -public class PlayerActionBar extends BukkitRunnable { - boolean initialized = false; - - private ActionBarConfig config; - private DecimalFormat digit; - - public void reload(ConfigurationSection cfg) { - config = new ActionBarConfig(cfg); - digit = MythicLib.plugin.getMMOConfig().newDecimalFormat(config.digit); - - if (!initialized && config.enabled) { - runTaskTimer(MMOCore.plugin, 0, config.ticks); - initialized = true; - } - } - - public long getTimeOut() { - return config.timeout; - } - - @Override - public void run() { - for (PlayerData data : PlayerData.getAll()) - if (data.isOnline() && !data.getPlayer().isDead() && !data.isCasting() && data.getActivityTimeOut(PlayerActivity.ACTION_BAR_MESSAGE) == 0) { - Placeholders holders=getActionBarPlaceholder(data); - data.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText( - holders.apply(data.getPlayer(), data.getProfess().hasActionBar() ? data.getProfess().getActionBar() : config.format))); - - } - } - - public Placeholders getActionBarPlaceholder(PlayerData data) { - Placeholders holders= new Placeholders(); - holders.register("health", digit.format(data.getPlayer().getHealth())); - holders.register("max_health", StatManager.format("MAX_HEALTH", data.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); - holders.register("mana_icon", data.getProfess().getManaDisplay().getIcon()); - holders.register("mana", digit.format(data.getMana())); - holders.register("max_mana", StatManager.format("MAX_MANA", data.getStats().getStat("MAX_MANA"))); - holders.register("stamina", digit.format(data.getStamina())); - holders.register("max_stamina", StatManager.format("MAX_STAMINA", data.getStats().getStat("MAX_STAMINA"))); - holders.register("stellium", digit.format(data.getStellium())); - holders.register("max_stellium", StatManager.format("MAX_STELLIUM", data.getStats().getStat("MAX_STELLIUM"))); - holders.register("class", data.getProfess().getName()); - holders.register("xp", MythicLib.plugin.getMMOConfig().decimal.format(data.getExperience())); - holders.register("armor", StatManager.format("ARMOR", data.getPlayer().getAttribute(Attribute.GENERIC_ARMOR).getValue())); - holders.register("level", "" + data.getLevel()); - holders.register("name", data.getPlayer().getDisplayName()); - return holders; - } - - - private static class ActionBarConfig { - private final boolean enabled; - private final int ticks, timeout; - private final String digit, format; - - private ActionBarConfig(ConfigurationSection config) { - enabled = config.getBoolean("enabled", false); - timeout = config.getInt("", 60); - digit = config.getString("decimal", "0.#"); - ticks = config.getInt("ticks-to-update", 5); - format = config.getString("format", "please format me :c"); - } - } -} 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 new file mode 100644 index 00000000..93fa969c --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ActionBarManager.java @@ -0,0 +1,68 @@ +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.api.player.PlayerData; +import net.Indyuce.mmocore.gui.api.item.Placeholders; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.attribute.Attribute; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.scheduler.BukkitRunnable; + +public class ActionBarManager extends BukkitRunnable { + private int updateTicks, timeOut; + private String barFormat; + private boolean enabled, scheduled; + + public void reload(ConfigurationSection config) { + enabled = config.getBoolean("enabled", false); + timeOut = config.getInt("", 60); + updateTicks = config.getInt("ticks-to-update", 5); + barFormat = config.getString("format", ""); + + if (!scheduled && enabled) { + runTaskTimer(MMOCore.plugin, 0, updateTicks); + scheduled = true; + } else if (scheduled && !enabled) { + cancel(); + scheduled = false; + } + } + + public long getTimeOut() { + return timeOut; + } + + @Override + public void run() { + for (PlayerData data : PlayerData.getAll()) + if (data.isOnline() && !data.getPlayer().isDead() && !data.isCasting() && data.getActivityTimeOut(PlayerActivity.ACTION_BAR_MESSAGE) == 0) { + Placeholders holders = getActionBarPlaceholders(data); + data.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText( + holders.apply(data.getPlayer(), data.getProfess().hasActionBar() ? data.getProfess().getActionBar() : barFormat))); + + } + } + + public Placeholders getActionBarPlaceholders(PlayerData data) { + Placeholders holders = new Placeholders(); + holders.register("health", StatManager.format("MAX_HEALTH", data.getPlayer().getHealth())); + holders.register("max_health", StatManager.format("MAX_HEALTH", data.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); + holders.register("mana_icon", data.getProfess().getManaDisplay().getIcon()); + holders.register("mana", StatManager.format("MAX_MANA", data.getMana())); + holders.register("max_mana", StatManager.format("MAX_MANA", data.getStats().getStat("MAX_MANA"))); + holders.register("stamina", StatManager.format("MAX_STAMINA", data.getStamina())); + holders.register("max_stamina", StatManager.format("MAX_STAMINA", data.getStats().getStat("MAX_STAMINA"))); + holders.register("stellium", StatManager.format("MAX_STELLIUM", data.getStellium())); + holders.register("max_stellium", StatManager.format("MAX_STELLIUM", data.getStats().getStat("MAX_STELLIUM"))); + holders.register("class", data.getProfess().getName()); + holders.register("xp", MythicLib.plugin.getMMOConfig().decimal.format(data.getExperience())); + holders.register("armor", StatManager.format("ARMOR", data.getPlayer().getAttribute(Attribute.GENERIC_ARMOR).getValue())); + holders.register("level", String.valueOf(data.getLevel())); + holders.register("name", data.getPlayer().getDisplayName()); + return holders; + } +} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java index 8a8562f8..10d26842 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java @@ -238,7 +238,7 @@ public class KeyCombos implements Listener { public String format(CustomSkillCastingHandler casting) { StringBuilder builder = new StringBuilder(); - Placeholders holders = MMOCore.plugin.actionBarManager.getActionBarPlaceholder(casting.getCaster()); + Placeholders holders = MMOCore.plugin.actionBarManager.getActionBarPlaceholders(casting.getCaster()); builder.append(prefix); // Join all keys with separator diff --git a/MMOCore-Dist/src/main/resources/config.yml b/MMOCore-Dist/src/main/resources/config.yml index 84dc994b..cb4e59a4 100644 --- a/MMOCore-Dist/src/main/resources/config.yml +++ b/MMOCore-Dist/src/main/resources/config.yml @@ -114,11 +114,8 @@ action-bar: # (This doesn't change any other action bars provided by MMOCore.) enabled: true - # The decimal format for stats (not including stat formats in stats.yml) - decimal: "0.#" - - # The amount of miliseconds the bar will be faded - #out when displaying other action bars. + # The amount of milliseconds the bar will be + # faded out when displaying other action bars. time-out: 60 # The amount of ticks before updating the info From 95c355eeedc1da7693f1aa00f0802fa823b36d08 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Fri, 19 Aug 2022 14:44:55 +0200 Subject: [PATCH 15/17] Additional 'attribute' stats --- .../api/player/attribute/PlayerAttributes.java | 12 +++++++++--- .../Indyuce/mmocore/manager/AttributeManager.java | 4 ++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/attribute/PlayerAttributes.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/attribute/PlayerAttributes.java index 255d65ee..88674958 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/attribute/PlayerAttributes.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/attribute/PlayerAttributes.java @@ -3,6 +3,7 @@ package net.Indyuce.mmocore.api.player.attribute; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.player.modifier.Closeable; import io.lumine.mythic.lib.player.modifier.ModifierSource; @@ -110,11 +111,12 @@ public class PlayerAttributes { public class AttributeInstance { private int spent; - private final String id; + private final String id, enumName; private final Map map = new HashMap<>(); - public AttributeInstance(String attribute) { - id = attribute; + public AttributeInstance(String id) { + this.id = id; + this.enumName = UtilityMethods.enumName(this.id); } public int getBase() { @@ -146,10 +148,14 @@ public class PlayerAttributes { if (attr.getType() == ModifierType.FLAT) d += attr.getValue(); + d += data.getMMOPlayerData().getStatMap().getStat("ADDITIONAL_" + enumName); + for (AttributeModifier attr : map.values()) if (attr.getType() == ModifierType.RELATIVE) d *= attr.getValue(); + d *= 1 + data.getMMOPlayerData().getStatMap().getStat("ADDITIONAL_" + enumName + "_PERCENT") / 100; + // cast to int at the last moment return (int) d; } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/AttributeManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/AttributeManager.java index fc1a50b9..0aef0d2f 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/AttributeManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/AttributeManager.java @@ -8,10 +8,13 @@ import java.util.logging.Level; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; import net.Indyuce.mmocore.api.ConfigFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class AttributeManager implements MMOCoreManager { private final Map map = new HashMap<>(); + @Nullable public PlayerAttribute get(String id) { return map.get(id); } @@ -20,6 +23,7 @@ public class AttributeManager implements MMOCoreManager { return map.containsKey(id); } + @NotNull public Collection getAll() { return map.values(); } From a498c43bf4baf9f45754ccccb9ef9a8cbc909b00 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Fri, 19 Aug 2022 14:59:03 +0200 Subject: [PATCH 16/17] Weird method name --- .../mmocore/api/player/attribute/PlayerAttributes.java | 5 +++++ .../src/main/java/net/Indyuce/mmocore/gui/AttributeView.java | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/attribute/PlayerAttributes.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/attribute/PlayerAttributes.java index 88674958..6c26cf9c 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/attribute/PlayerAttributes.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/attribute/PlayerAttributes.java @@ -101,7 +101,12 @@ public class PlayerAttributes { return getInstance(attribute.getId()); } + @Deprecated public int countSkillPoints() { + return countPoints(); + } + + public int countPoints() { int n = 0; for (AttributeInstance ins : instances.values()) n += ins.getBase(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java index 77a03ba8..b6e6439a 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java @@ -31,7 +31,7 @@ public class AttributeView extends EditableInventory { Placeholders holders = new Placeholders(); holders.register("attribute_points", inv.getPlayerData().getAttributePoints()); holders.register("points", inv.getPlayerData().getAttributeReallocationPoints()); - holders.register("total", inv.getPlayerData().getAttributes().countSkillPoints()); + holders.register("total", inv.getPlayerData().getAttributes().countPoints()); return holders; } }; @@ -93,7 +93,7 @@ public class AttributeView extends EditableInventory { public void whenClicked(InventoryClickContext context, InventoryItem item) { if (item.getFunction().equalsIgnoreCase("reallocation")) { - int spent = playerData.getAttributes().countSkillPoints(); + int spent = playerData.getAttributes().countPoints(); if (spent < 1) { MMOCore.plugin.configManager.getSimpleMessage("no-attribute-points-spent").send(player); MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); From 9eb9abc6e4059f4667ed32b38c3d962c5bc1fcdf Mon Sep 17 00:00:00 2001 From: Indyuce Date: Fri, 19 Aug 2022 16:02:50 +0200 Subject: [PATCH 17/17] Better format for profession exp placeholder --- .../net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java index 0ec5f9fe..c2cb987f 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java @@ -109,7 +109,7 @@ public class RPGPlaceholders extends PlaceholderExpansion { } else if (identifier.startsWith("profession_experience_")) - return String.valueOf( + return MythicLib.plugin.getMMOConfig().decimal.format( playerData.getCollectionSkills().getExperience(identifier.substring(22).replace(" ", "-").replace("_", "-").toLowerCase())); else if (identifier.startsWith("profession_next_level_"))