mirror of
				https://github.com/mcMMO-Dev/mcMMO.git
				synced 2025-11-04 11:03:43 +01:00 
			
		
		
		
	major optimizations to getting xp values for specific blocks
This commit is contained in:
		@@ -1,4 +1,5 @@
 | 
			
		||||
Version 2.2.024
 | 
			
		||||
    Significant optimizations to the way mcMMO handles grabbing XP values for blocks
 | 
			
		||||
 | 
			
		||||
Version 2.2.023
 | 
			
		||||
    Compatibility with Minecraft 1.21.3
 | 
			
		||||
 
 | 
			
		||||
@@ -1154,15 +1154,19 @@ public final class ExperienceAPI {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Will add the appropriate type of XP from the block to the player based on the material of the blocks given if it matches the given skillType
 | 
			
		||||
     * Will add the appropriate type of XP from the block to the player based on the material of the blocks given
 | 
			
		||||
     * if it matches the given skillType
 | 
			
		||||
     * @param blockStates the blocks to reward XP for
 | 
			
		||||
     * @param mcMMOPlayer the target player
 | 
			
		||||
     * @param skillType target primary skill
 | 
			
		||||
     */
 | 
			
		||||
    public static void addXpFromBlocksBySkill(ArrayList<BlockState> blockStates, McMMOPlayer mcMMOPlayer, PrimarySkillType skillType) {
 | 
			
		||||
    public static void addXpFromBlocksBySkill(ArrayList<BlockState> blockStates, McMMOPlayer mcMMOPlayer,
 | 
			
		||||
                                              PrimarySkillType skillType) {
 | 
			
		||||
        for(BlockState bs : blockStates) {
 | 
			
		||||
            if (ExperienceConfig.getInstance().getXp(skillType, bs.getType()) > 0) {
 | 
			
		||||
                mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, bs.getType()), XPGainReason.PVE, XPGainSource.SELF);
 | 
			
		||||
                mcMMOPlayer.applyXpGain(skillType,
 | 
			
		||||
                        ExperienceConfig.getInstance().getXp(skillType, bs.getType()),
 | 
			
		||||
                        XPGainReason.PVE, XPGainSource.SELF);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -1175,7 +1179,8 @@ public final class ExperienceAPI {
 | 
			
		||||
    public static void addXpFromBlock(BlockState blockState, McMMOPlayer mcMMOPlayer) {
 | 
			
		||||
        for(PrimarySkillType skillType : PrimarySkillType.values()) {
 | 
			
		||||
            if (ExperienceConfig.getInstance().getXp(skillType, blockState.getType()) > 0) {
 | 
			
		||||
                mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, blockState.getType()), XPGainReason.PVE, XPGainSource.SELF);
 | 
			
		||||
                mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(
 | 
			
		||||
                        skillType, blockState.getType()), XPGainReason.PVE, XPGainSource.SELF);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -1188,7 +1193,8 @@ public final class ExperienceAPI {
 | 
			
		||||
     */
 | 
			
		||||
    public static void addXpFromBlockBySkill(BlockState blockState, McMMOPlayer mcMMOPlayer, PrimarySkillType skillType) {
 | 
			
		||||
        if (ExperienceConfig.getInstance().getXp(skillType, blockState.getType()) > 0) {
 | 
			
		||||
            mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, blockState.getType()), XPGainReason.PVE, XPGainSource.SELF);
 | 
			
		||||
            mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, blockState.getType()),
 | 
			
		||||
                    XPGainReason.PVE, XPGainSource.SELF);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,6 @@ import com.gmail.nossr50.util.Misc;
 | 
			
		||||
import com.gmail.nossr50.util.Permissions;
 | 
			
		||||
import com.gmail.nossr50.util.text.StringUtils;
 | 
			
		||||
import net.kyori.adventure.audience.Audience;
 | 
			
		||||
import net.kyori.adventure.chat.SignedMessage;
 | 
			
		||||
import net.kyori.adventure.text.TextComponent;
 | 
			
		||||
import org.bukkit.command.ConsoleCommandSender;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ import com.gmail.nossr50.util.skills.CombatUtils;
 | 
			
		||||
import com.gmail.nossr50.util.skills.RankUtils;
 | 
			
		||||
import com.gmail.nossr50.util.text.TextComponentFactory;
 | 
			
		||||
import net.kyori.adventure.text.Component;
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@ import com.gmail.nossr50.util.skills.RankUtils;
 | 
			
		||||
import com.gmail.nossr50.util.skills.SkillUtils;
 | 
			
		||||
import com.gmail.nossr50.util.text.TextComponentFactory;
 | 
			
		||||
import net.kyori.adventure.text.Component;
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ import com.gmail.nossr50.util.skills.CombatUtils;
 | 
			
		||||
import com.gmail.nossr50.util.skills.SkillUtils;
 | 
			
		||||
import com.gmail.nossr50.util.text.TextComponentFactory;
 | 
			
		||||
import net.kyori.adventure.text.Component;
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 
 | 
			
		||||
@@ -711,7 +711,7 @@ public class GeneralConfig extends BukkitConfig {
 | 
			
		||||
        if (material.toString().equalsIgnoreCase("LILY_PAD"))
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        return config.getBoolean("Bonus_Drops." + StringUtils.getCapitalized(skill.toString()) + "." + StringUtils.getPrettyItemString(material).replace(" ", "_"));
 | 
			
		||||
        return config.getBoolean("Bonus_Drops." + StringUtils.getCapitalized(skill.toString()) + "." + StringUtils.getFormattedMaterialString(material).replace(" ", "_"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean getDoubleDropsDisabled(PrimarySkillType skill) {
 | 
			
		||||
@@ -890,8 +890,9 @@ public class GeneralConfig extends BukkitConfig {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Woodcutting */
 | 
			
		||||
    public boolean getWoodcuttingDoubleDropsEnabled(BlockData material) {
 | 
			
		||||
        return config.getBoolean("Bonus_Drops.Woodcutting." + StringUtils.getFriendlyConfigBlockDataString(material));
 | 
			
		||||
    public boolean getWoodcuttingDoubleDropsEnabled(BlockData blockData) {
 | 
			
		||||
        return config.getBoolean("Bonus_Drops.Woodcutting."
 | 
			
		||||
                + StringUtils.getFormattedMaterialString(blockData.getMaterial()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean getTreeFellerSoundsEnabled() {
 | 
			
		||||
 
 | 
			
		||||
@@ -15,10 +15,15 @@ import org.bukkit.boss.BarStyle;
 | 
			
		||||
import org.bukkit.entity.EntityType;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import static com.gmail.nossr50.util.skills.SkillTools.isChildSkill;
 | 
			
		||||
 | 
			
		||||
public class ExperienceConfig extends BukkitConfig {
 | 
			
		||||
    private static ExperienceConfig instance;
 | 
			
		||||
    final private Map<PrimarySkillType, Map<Material, Integer>> blockExperienceMap = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    private ExperienceConfig() {
 | 
			
		||||
        super("experience.yml");
 | 
			
		||||
@@ -30,6 +35,23 @@ public class ExperienceConfig extends BukkitConfig {
 | 
			
		||||
            instance = new ExperienceConfig();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (PrimarySkillType skill : PrimarySkillType.values()) {
 | 
			
		||||
            // Skip child skills
 | 
			
		||||
            if (isChildSkill(skill)) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            final Map<Material, Integer> experienceMap = new HashMap<>();
 | 
			
		||||
            for (Material material : Material.values()) {
 | 
			
		||||
                int xp = instance.getConfigXp(skill, material);
 | 
			
		||||
 | 
			
		||||
                if (xp > 0) {
 | 
			
		||||
                    experienceMap.put(material, xp);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            instance.blockExperienceMap.put(skill, experienceMap);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return instance;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -321,15 +343,22 @@ public class ExperienceConfig extends BukkitConfig {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Materials  */
 | 
			
		||||
    private int getConfigXp(PrimarySkillType skill, Material material) {
 | 
			
		||||
        // prevents exploit
 | 
			
		||||
        if (material == Material.LILY_PAD)
 | 
			
		||||
            return 0;
 | 
			
		||||
 | 
			
		||||
        final String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + ".";
 | 
			
		||||
        final String configPath = baseString + StringUtils.getFormattedMaterialString(material);
 | 
			
		||||
        return config.getInt(configPath, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getXp(PrimarySkillType skill, Material material) {
 | 
			
		||||
        return getXpHelper(skill, StringUtils.getExplicitConfigMaterialString(material),
 | 
			
		||||
                StringUtils.getFriendlyConfigMaterialString(material),
 | 
			
		||||
                StringUtils.getWildcardConfigMaterialString(material));
 | 
			
		||||
        return blockExperienceMap.get(skill).getOrDefault(material, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getXp(PrimarySkillType skill, BlockState blockState) {
 | 
			
		||||
        Material material = blockState.getType();
 | 
			
		||||
        return getXp(skill, material);
 | 
			
		||||
        return getXp(skill, blockState.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getXp(PrimarySkillType skill, Block block) {
 | 
			
		||||
@@ -338,57 +367,17 @@ public class ExperienceConfig extends BukkitConfig {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getXp(PrimarySkillType skill, BlockData data) {
 | 
			
		||||
        return getXpHelper(skill, StringUtils.getExplicitConfigBlockDataString(data),
 | 
			
		||||
                StringUtils.getFriendlyConfigBlockDataString(data),
 | 
			
		||||
                StringUtils.getWildcardConfigBlockDataString(data));
 | 
			
		||||
        return getXp(skill, data.getMaterial());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int getXpHelper(PrimarySkillType skill, String explicitString, String friendlyString, String wildcardString) {
 | 
			
		||||
        if (explicitString.equalsIgnoreCase("LILY_PAD")) {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + ".";
 | 
			
		||||
        String[] configStrings = {explicitString, friendlyString, wildcardString};
 | 
			
		||||
 | 
			
		||||
        for (String configString : configStrings) {
 | 
			
		||||
            String fullPath = baseString + configString;
 | 
			
		||||
            if (config.contains(fullPath)) {
 | 
			
		||||
                return config.getInt(fullPath);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public boolean doesBlockGiveSkillXP(PrimarySkillType skill, Material material) {
 | 
			
		||||
        return doesBlockGiveSkillXPHelper(skill, StringUtils.getExplicitConfigMaterialString(material),
 | 
			
		||||
                StringUtils.getFriendlyConfigMaterialString(material),
 | 
			
		||||
                StringUtils.getWildcardConfigMaterialString(material));
 | 
			
		||||
        return getXp(skill, material) > 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean doesBlockGiveSkillXP(PrimarySkillType skill, BlockData data) {
 | 
			
		||||
        return doesBlockGiveSkillXPHelper(skill, StringUtils.getExplicitConfigBlockDataString(data),
 | 
			
		||||
                StringUtils.getFriendlyConfigBlockDataString(data),
 | 
			
		||||
                StringUtils.getWildcardConfigBlockDataString(data));
 | 
			
		||||
        return getXp(skill, data) > 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean doesBlockGiveSkillXPHelper(PrimarySkillType skill, String explicitString, String friendlyString, String wildcardString) {
 | 
			
		||||
        String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + ".";
 | 
			
		||||
        String[] configStrings = {explicitString, friendlyString, wildcardString};
 | 
			
		||||
 | 
			
		||||
        for (String configString : configStrings) {
 | 
			
		||||
            String fullPath = baseString + configString;
 | 
			
		||||
            if (config.contains(fullPath)) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Experience Bar Stuff
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ public class ItemWeightConfig extends BukkitConfig {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getItemWeight(Material material) {
 | 
			
		||||
        return config.getInt("Item_Weights." + StringUtils.getPrettyItemString(material).replace(" ", "_"), config.getInt("Item_Weights.Default"));
 | 
			
		||||
        return config.getInt("Item_Weights." + StringUtils.getFormattedMaterialString(material).replace(" ", "_"), config.getInt("Item_Weights.Default"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public HashSet<Material> getMiscItems() {
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,6 @@ import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import static com.gmail.nossr50.util.ItemUtils.setItemName;
 | 
			
		||||
import static com.gmail.nossr50.util.PotionUtil.*;
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@ import com.gmail.nossr50.skills.salvage.salvageables.Salvageable;
 | 
			
		||||
import com.gmail.nossr50.skills.salvage.salvageables.SalvageableFactory;
 | 
			
		||||
import com.gmail.nossr50.util.ItemUtils;
 | 
			
		||||
import com.gmail.nossr50.util.LogUtils;
 | 
			
		||||
import com.gmail.nossr50.util.skills.SkillUtils;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.configuration.ConfigurationSection;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
 
 | 
			
		||||
@@ -239,29 +239,29 @@ public class TreasureConfig extends BukkitConfig {
 | 
			
		||||
 | 
			
		||||
                    for (String dropper : dropList) {
 | 
			
		||||
                        if (dropper.equals("Bushes")) {
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.FERN), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(BlockUtils.getShortGrass()), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(Material.FERN), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(BlockUtils.getShortGrass()), hylianTreasure);
 | 
			
		||||
                            for (Material species : Tag.SAPLINGS.getValues())
 | 
			
		||||
                                AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(species), hylianTreasure);
 | 
			
		||||
                                AddHylianTreasure(StringUtils.getFormattedMaterialString(species), hylianTreasure);
 | 
			
		||||
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.DEAD_BUSH), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(Material.DEAD_BUSH), hylianTreasure);
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                        if (dropper.equals("Flowers")) {
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.POPPY), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.DANDELION), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.BLUE_ORCHID), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.ALLIUM), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.AZURE_BLUET), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.ORANGE_TULIP), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.PINK_TULIP), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.RED_TULIP), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.WHITE_TULIP), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(Material.POPPY), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(Material.DANDELION), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(Material.BLUE_ORCHID), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(Material.ALLIUM), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(Material.AZURE_BLUET), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(Material.ORANGE_TULIP), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(Material.PINK_TULIP), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(Material.RED_TULIP), hylianTreasure);
 | 
			
		||||
                            AddHylianTreasure(StringUtils.getFormattedMaterialString(Material.WHITE_TULIP), hylianTreasure);
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                        if (dropper.equals("Pots")) {
 | 
			
		||||
                            for (Material species : Tag.FLOWER_POTS.getValues())
 | 
			
		||||
                                AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(species), hylianTreasure);
 | 
			
		||||
                                AddHylianTreasure(StringUtils.getFormattedMaterialString(species), hylianTreasure);
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                        AddHylianTreasure(dropper, hylianTreasure);
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ package com.gmail.nossr50.datatypes.player;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.api.exceptions.InvalidSkillException;
 | 
			
		||||
import com.gmail.nossr50.chat.author.PlayerAuthor;
 | 
			
		||||
import com.gmail.nossr50.config.AdvancedConfig;
 | 
			
		||||
import com.gmail.nossr50.config.ChatConfig;
 | 
			
		||||
import com.gmail.nossr50.config.WorldBlacklist;
 | 
			
		||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
 | 
			
		||||
 
 | 
			
		||||
@@ -167,7 +167,7 @@ public enum SuperAbilityType {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getName() {
 | 
			
		||||
        return StringUtils.getPrettyAbilityString(this);
 | 
			
		||||
        return StringUtils.getPrettySuperAbilityString(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getLocalizedName() {
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,6 @@ import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.NamespacedKey;
 | 
			
		||||
import org.bukkit.OfflinePlayer;
 | 
			
		||||
import org.bukkit.attribute.Attribute;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.enchantments.Enchantment;
 | 
			
		||||
import org.bukkit.entity.*;
 | 
			
		||||
@@ -45,8 +44,6 @@ import org.bukkit.potion.PotionEffect;
 | 
			
		||||
import org.bukkit.potion.PotionEffectType;
 | 
			
		||||
import org.bukkit.projectiles.ProjectileSource;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import static com.gmail.nossr50.util.AttributeMapper.MAPPED_MAX_HEALTH;
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ public class AlchemyManager extends SkillManager {
 | 
			
		||||
        StringBuilder list = new StringBuilder();
 | 
			
		||||
 | 
			
		||||
        for (ItemStack ingredient : getIngredients()) {
 | 
			
		||||
            String string = StringUtils.getPrettyItemString(ingredient.getType());
 | 
			
		||||
            String string = StringUtils.getFormattedMaterialString(ingredient.getType());
 | 
			
		||||
 | 
			
		||||
            list.append(", ").append(string);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@ import com.gmail.nossr50.util.random.ProbabilityUtil;
 | 
			
		||||
import com.gmail.nossr50.util.skills.CombatUtils;
 | 
			
		||||
import com.gmail.nossr50.util.skills.ParticleEffectUtils;
 | 
			
		||||
import com.gmail.nossr50.util.skills.RankUtils;
 | 
			
		||||
import com.gmail.nossr50.util.skills.SkillUtils;
 | 
			
		||||
import org.bukkit.entity.LivingEntity;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.EntityEquipment;
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ public class Excavation {
 | 
			
		||||
     * @return the list of treasures that could be found
 | 
			
		||||
     */
 | 
			
		||||
    protected static List<ExcavationTreasure> getTreasures(BlockState blockState) {
 | 
			
		||||
        String friendly = StringUtils.getFriendlyConfigBlockDataString(blockState.getBlockData());
 | 
			
		||||
        String friendly = StringUtils.getFormattedMaterialString(blockState.getBlockData().getMaterial());
 | 
			
		||||
        if (TreasureConfig.getInstance().excavationMap.containsKey(friendly))
 | 
			
		||||
            return TreasureConfig.getInstance().excavationMap.get(friendly);
 | 
			
		||||
        return new ArrayList<>();
 | 
			
		||||
 
 | 
			
		||||
@@ -113,7 +113,8 @@ public class HerbalismManager extends SkillManager {
 | 
			
		||||
                    mmoPlayer.getPlayer().sendMessage("Bush Reward Multiplier: " + rewardByAge);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                int xpReward = ExperienceConfig.getInstance().getXp(PrimarySkillType.HERBALISM, blockState) * rewardByAge;
 | 
			
		||||
                int xpReward = ExperienceConfig.getInstance().getXp(PrimarySkillType.HERBALISM, blockState.getType())
 | 
			
		||||
                        * rewardByAge;
 | 
			
		||||
 | 
			
		||||
                if (mmoPlayer.isDebugMode()) {
 | 
			
		||||
                    mmoPlayer.getPlayer().sendMessage("Bush XP: " + xpReward);
 | 
			
		||||
@@ -713,12 +714,11 @@ public class HerbalismManager extends SkillManager {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        String friendly = StringUtils.getFriendlyConfigBlockDataString(blockState.getBlockData());
 | 
			
		||||
        final String friendly = StringUtils.getFormattedMaterialString(blockState.getBlockData().getMaterial());
 | 
			
		||||
        if (!TreasureConfig.getInstance().hylianMap.containsKey(friendly))
 | 
			
		||||
            return false;
 | 
			
		||||
        List<HylianTreasure> treasures = TreasureConfig.getInstance().hylianMap.get(friendly);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if (treasures.isEmpty()) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
@@ -750,12 +750,12 @@ public class HerbalismManager extends SkillManager {
 | 
			
		||||
        PlayerInventory playerInventory = getPlayer().getInventory();
 | 
			
		||||
        
 | 
			
		||||
        if (!playerInventory.contains(Material.BROWN_MUSHROOM, 1)) {
 | 
			
		||||
            NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.REQUIREMENTS_NOT_MET, "Skills.NeedMore", StringUtils.getPrettyItemString(Material.BROWN_MUSHROOM));
 | 
			
		||||
            NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.REQUIREMENTS_NOT_MET, "Skills.NeedMore", StringUtils.getFormattedMaterialString(Material.BROWN_MUSHROOM));
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!playerInventory.contains(Material.RED_MUSHROOM, 1)) {
 | 
			
		||||
            NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.REQUIREMENTS_NOT_MET, "Skills.NeedMore", StringUtils.getPrettyItemString(Material.RED_MUSHROOM));
 | 
			
		||||
            NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.REQUIREMENTS_NOT_MET, "Skills.NeedMore", StringUtils.getFormattedMaterialString(Material.RED_MUSHROOM));
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -96,7 +96,7 @@ public class RepairManager extends SkillManager {
 | 
			
		||||
 | 
			
		||||
        // Level check
 | 
			
		||||
        if (skillLevel < minimumRepairableLevel) {
 | 
			
		||||
            NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Repair.Skills.Adept", String.valueOf(minimumRepairableLevel), StringUtils.getPrettyItemString(item.getType()));
 | 
			
		||||
            NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Repair.Skills.Adept", String.valueOf(minimumRepairableLevel), StringUtils.getFormattedMaterialString(item.getType()));
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -115,7 +115,7 @@ public class RepairManager extends SkillManager {
 | 
			
		||||
 | 
			
		||||
        // Check if they have the proper material to repair with
 | 
			
		||||
        if (!inventory.contains(repairMaterial)) {
 | 
			
		||||
            String prettyName = repairable.getRepairMaterialPrettyName() == null ? StringUtils.getPrettyItemString(repairMaterial) : repairable.getRepairMaterialPrettyName();
 | 
			
		||||
            String prettyName = repairable.getRepairMaterialPrettyName() == null ? StringUtils.getFormattedMaterialString(repairMaterial) : repairable.getRepairMaterialPrettyName();
 | 
			
		||||
 | 
			
		||||
            String materialsNeeded = "";
 | 
			
		||||
 | 
			
		||||
@@ -156,7 +156,7 @@ public class RepairManager extends SkillManager {
 | 
			
		||||
 | 
			
		||||
                // Fail out with "you need material" if we don't find a suitable alternative.
 | 
			
		||||
                if (possibleMaterial.isEmpty()) {
 | 
			
		||||
                    String prettyName = repairable.getRepairMaterialPrettyName() == null ? StringUtils.getPrettyItemString(repairMaterial) : repairable.getRepairMaterialPrettyName();
 | 
			
		||||
                    String prettyName = repairable.getRepairMaterialPrettyName() == null ? StringUtils.getFormattedMaterialString(repairMaterial) : repairable.getRepairMaterialPrettyName();
 | 
			
		||||
 | 
			
		||||
                    String materialsNeeded = "";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -96,7 +96,7 @@ public class SalvageManager extends SkillManager {
 | 
			
		||||
        if (getSkillLevel() < minimumSalvageableLevel) {
 | 
			
		||||
            NotificationManager.sendPlayerInformation(player, NotificationType.REQUIREMENTS_NOT_MET,
 | 
			
		||||
                    "Salvage.Skills.Adept.Level",
 | 
			
		||||
                    String.valueOf(minimumSalvageableLevel), StringUtils.getPrettyItemString(item.getType()));
 | 
			
		||||
                    String.valueOf(minimumSalvageableLevel), StringUtils.getFormattedMaterialString(item.getType()));
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -143,11 +143,11 @@ public class SalvageManager extends SkillManager {
 | 
			
		||||
 | 
			
		||||
        // We only send a confirmation message after processing the event (fixes #4694)
 | 
			
		||||
        if (lotteryResults == potentialSalvageYield && potentialSalvageYield != 1 && RankUtils.isPlayerMaxRankInSubSkill(player, SubSkillType.SALVAGE_ARCANE_SALVAGE)) {
 | 
			
		||||
            NotificationManager.sendPlayerInformationChatOnly(player, "Salvage.Skills.Lottery.Perfect", String.valueOf(lotteryResults), StringUtils.getPrettyItemString(item.getType()));
 | 
			
		||||
            NotificationManager.sendPlayerInformationChatOnly(player, "Salvage.Skills.Lottery.Perfect", String.valueOf(lotteryResults), StringUtils.getFormattedMaterialString(item.getType()));
 | 
			
		||||
        } else if (salvageable.getMaximumQuantity() == 1 || getSalvageLimit() >= salvageable.getMaximumQuantity()) {
 | 
			
		||||
            NotificationManager.sendPlayerInformationChatOnly(player,  "Salvage.Skills.Lottery.Normal", String.valueOf(lotteryResults), StringUtils.getPrettyItemString(item.getType()));
 | 
			
		||||
            NotificationManager.sendPlayerInformationChatOnly(player,  "Salvage.Skills.Lottery.Normal", String.valueOf(lotteryResults), StringUtils.getFormattedMaterialString(item.getType()));
 | 
			
		||||
        } else {
 | 
			
		||||
            NotificationManager.sendPlayerInformationChatOnly(player,  "Salvage.Skills.Lottery.Untrained", String.valueOf(lotteryResults), StringUtils.getPrettyItemString(item.getType()));
 | 
			
		||||
            NotificationManager.sendPlayerInformationChatOnly(player,  "Salvage.Skills.Lottery.Untrained", String.valueOf(lotteryResults), StringUtils.getFormattedMaterialString(item.getType()));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        player.getInventory().setItemInMainHand(new ItemStack(Material.AIR));
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@ import com.gmail.nossr50.util.sounds.SoundType;
 | 
			
		||||
import com.gmail.nossr50.util.text.StringUtils;
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.attribute.Attribute;
 | 
			
		||||
import org.bukkit.attribute.AttributeInstance;
 | 
			
		||||
import org.bukkit.entity.*;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
@@ -371,7 +370,7 @@ public class TamingManager extends SkillManager {
 | 
			
		||||
            } else {
 | 
			
		||||
                //Player did not have enough of the item in their main hand
 | 
			
		||||
                int difference = tamingSummon.getItemAmountRequired() - itemInMainHand.getAmount();
 | 
			
		||||
                NotificationManager.sendPlayerInformationChatOnly(player, "Taming.Summon.COTW.NeedMoreItems", String.valueOf(difference), StringUtils.getPrettyItemString(itemInMainHand.getType()));
 | 
			
		||||
                NotificationManager.sendPlayerInformationChatOnly(player, "Taming.Summon.COTW.NeedMoreItems", String.valueOf(difference), StringUtils.getFormattedMaterialString(itemInMainHand.getType()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
package com.gmail.nossr50.util;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import org.bukkit.Registry;
 | 
			
		||||
import org.bukkit.attribute.Attribute;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
 
 | 
			
		||||
@@ -21,10 +21,8 @@ import com.gmail.nossr50.skills.unarmed.UnarmedManager;
 | 
			
		||||
import com.gmail.nossr50.util.*;
 | 
			
		||||
import com.gmail.nossr50.util.player.NotificationManager;
 | 
			
		||||
import com.gmail.nossr50.util.player.UserManager;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.GameMode;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.attribute.Attribute;
 | 
			
		||||
import org.bukkit.attribute.AttributeInstance;
 | 
			
		||||
import org.bukkit.entity.*;
 | 
			
		||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
 | 
			
		||||
 
 | 
			
		||||
@@ -387,26 +387,6 @@ public class SkillTools {
 | 
			
		||||
        return pluginRef.getGeneralConfig().getMaxLength(superAbilityType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getSuperAbilityOnLocaleKey(SuperAbilityType superAbilityType) {
 | 
			
		||||
        return "SuperAbility." + StringUtils.getPrettyCamelCaseName(superAbilityType) + ".On";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getSuperAbilityOffLocaleKey(SuperAbilityType superAbilityType) {
 | 
			
		||||
        return "SuperAbility." + StringUtils.getPrettyCamelCaseName(superAbilityType) + ".Off";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getSuperAbilityOtherPlayerActivationLocaleKey(SuperAbilityType superAbilityType) {
 | 
			
		||||
        return "SuperAbility." + StringUtils.getPrettyCamelCaseName(superAbilityType) + ".Other.On";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getSuperAbilityOtherPlayerDeactivationLocaleKey(SuperAbilityType superAbilityType) {
 | 
			
		||||
        return "SuperAbility." + StringUtils.getPrettyCamelCaseName(superAbilityType) + "Other.Off";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getSuperAbilityRefreshedLocaleKey(SuperAbilityType superAbilityType) {
 | 
			
		||||
        return "SuperAbility." + StringUtils.getPrettyCamelCaseName(superAbilityType) + ".Refresh";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getLevelCap(@NotNull PrimarySkillType primarySkillType) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getLevelCap(primarySkillType);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -9,14 +9,7 @@ import org.bukkit.World;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
 | 
			
		||||
public class SoundManager {
 | 
			
		||||
    public static Sound CRIPPLE_SOUND;
 | 
			
		||||
    static {
 | 
			
		||||
        try {
 | 
			
		||||
            CRIPPLE_SOUND = Sound.valueOf("ITEM_MACE_SMASH_GROUND");
 | 
			
		||||
        } catch (IllegalArgumentException e) {
 | 
			
		||||
            CRIPPLE_SOUND = Sound.BLOCK_ANVIL_PLACE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    private static Sound CRIPPLE_SOUND;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sends a sound to the player
 | 
			
		||||
@@ -107,10 +100,24 @@ public class SoundManager {
 | 
			
		||||
            case DEFLECT_ARROWS, BLEED -> Sound.ENTITY_ENDER_EYE_DEATH;
 | 
			
		||||
            case GLASS -> Sound.BLOCK_GLASS_BREAK;
 | 
			
		||||
            case ITEM_CONSUMED -> Sound.ITEM_BOTTLE_EMPTY;
 | 
			
		||||
            case CRIPPLE -> CRIPPLE_SOUND;
 | 
			
		||||
            case CRIPPLE -> getCrippleSound();
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static Sound getCrippleSound() {
 | 
			
		||||
        if (CRIPPLE_SOUND != null) {
 | 
			
		||||
            return CRIPPLE_SOUND;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            CRIPPLE_SOUND = Sound.valueOf("ITEM_MACE_SMASH_GROUND");
 | 
			
		||||
            return CRIPPLE_SOUND;
 | 
			
		||||
        } catch (IllegalArgumentException e) {
 | 
			
		||||
            CRIPPLE_SOUND = Sound.BLOCK_ANVIL_PLACE;
 | 
			
		||||
            return CRIPPLE_SOUND;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static float getFizzPitch() {
 | 
			
		||||
        return 2.6F + (Misc.getRandom().nextFloat() - Misc.getRandom().nextFloat()) * 0.8F;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -3,192 +3,217 @@ package com.gmail.nossr50.util.text;
 | 
			
		||||
import com.gmail.nossr50.datatypes.party.PartyFeature;
 | 
			
		||||
import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.block.data.Ageable;
 | 
			
		||||
import org.bukkit.block.data.BlockData;
 | 
			
		||||
import org.bukkit.entity.EntityType;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
 | 
			
		||||
import java.text.DecimalFormat;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Locale;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.function.Function;
 | 
			
		||||
 | 
			
		||||
import static java.util.Objects.requireNonNull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Utility class for String operations, including formatting and caching deterministic results to improve performance.
 | 
			
		||||
 */
 | 
			
		||||
public class StringUtils {
 | 
			
		||||
 | 
			
		||||
    protected static DecimalFormat percent = new DecimalFormat("##0.00%");
 | 
			
		||||
    protected static DecimalFormat shortDecimal = new DecimalFormat("##0.0");
 | 
			
		||||
    protected static final DecimalFormat percent = new DecimalFormat("##0.00%");
 | 
			
		||||
    protected static final DecimalFormat shortDecimal = new DecimalFormat("##0.0");
 | 
			
		||||
 | 
			
		||||
    // Using concurrent hash maps to avoid concurrency issues (Folia)
 | 
			
		||||
    private static final Map<EntityType, String> formattedEntityStrings = new HashMap<>();
 | 
			
		||||
    private static final Map<SuperAbilityType, String> formattedSuperAbilityStrings = new HashMap<>();
 | 
			
		||||
    private static final Map<Material, String> formattedMaterialStrings = new HashMap<>();
 | 
			
		||||
    private static final Map<PartyFeature, String> prettyPartyFeatureStringCache = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a capitalized version of the target string.
 | 
			
		||||
     * Results are cached to improve performance.
 | 
			
		||||
     *
 | 
			
		||||
     * @param target
 | 
			
		||||
     *            String to capitalize
 | 
			
		||||
     * @param target String to capitalize
 | 
			
		||||
     * @return the capitalized string
 | 
			
		||||
     */
 | 
			
		||||
    public static String getCapitalized(String target) {
 | 
			
		||||
        return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase(Locale.ENGLISH);
 | 
			
		||||
        if (target == null || target.isEmpty()) {
 | 
			
		||||
            return target;
 | 
			
		||||
        }
 | 
			
		||||
        return target.substring(0, 1).toUpperCase(Locale.ENGLISH) + target.substring(1).toLowerCase(Locale.ENGLISH);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Converts ticks to seconds, formatted to one decimal place.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ticks Number of ticks
 | 
			
		||||
     * @return String representation of seconds
 | 
			
		||||
     */
 | 
			
		||||
    public static String ticksToSeconds(double ticks) {
 | 
			
		||||
        return shortDecimal.format(ticks / 20);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String convertToCamelCaseString(String baseString, String splitBy) {
 | 
			
		||||
        String[] substrings = baseString.split(splitBy);
 | 
			
		||||
        String prettyString = "";
 | 
			
		||||
        int size = 1;
 | 
			
		||||
 | 
			
		||||
        for (String string : substrings) {
 | 
			
		||||
            prettyString = prettyString.concat(getCapitalized(string));
 | 
			
		||||
 | 
			
		||||
            if (size < substrings.length) {
 | 
			
		||||
                prettyString = prettyString.concat("");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            size++;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return prettyString;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getPrettyCamelCaseName(Object o) {
 | 
			
		||||
        return StringUtils.convertToCamelCaseString(o.toString(), "_");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getPrettySuperAbilityName(SuperAbilityType superAbilityType) {
 | 
			
		||||
        return StringUtils.getPrettySuperAbilityString(superAbilityType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getPrettySuperAbilityString(SuperAbilityType ability) {
 | 
			
		||||
        return createPrettyString(ability.toString());
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a pretty string representation of a SuperAbilityType.
 | 
			
		||||
     * Results are cached to improve performance.
 | 
			
		||||
     *
 | 
			
		||||
     * @param superAbilityType SuperAbilityType to convert
 | 
			
		||||
     * @return Pretty string representation of the SuperAbilityType
 | 
			
		||||
     */
 | 
			
		||||
    public static String getPrettySuperAbilityString(SuperAbilityType superAbilityType) {
 | 
			
		||||
        requireNonNull(superAbilityType, "superAbilityType cannot be null");
 | 
			
		||||
        return formattedSuperAbilityStrings.computeIfAbsent(superAbilityType, StringUtils::createPrettyString);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a string from an array skipping the first n elements
 | 
			
		||||
     * @param args the array to iterate over when forming the string
 | 
			
		||||
     * @param index the amount of elements to skip over
 | 
			
		||||
     * @return the "trimmed" string
 | 
			
		||||
     * Creates a string from an array skipping the first n elements.
 | 
			
		||||
     *
 | 
			
		||||
     * @param args  The array to iterate over when forming the string
 | 
			
		||||
     * @param index The number of elements to skip over
 | 
			
		||||
     * @return The "trimmed" string
 | 
			
		||||
     */
 | 
			
		||||
    public static String buildStringAfterNthElement(@NotNull String @NotNull []args, int index) {
 | 
			
		||||
    public static String buildStringAfterNthElement(@NotNull String @NotNull [] args, int index) {
 | 
			
		||||
        StringBuilder trimMessage = new StringBuilder();
 | 
			
		||||
 | 
			
		||||
        for (int i = index; i < args.length; i++) {
 | 
			
		||||
            if (i + 1 >= args.length)
 | 
			
		||||
                trimMessage.append(args[i]);
 | 
			
		||||
            else
 | 
			
		||||
                trimMessage.append(args[i]).append(" ");
 | 
			
		||||
            if (i > index) {
 | 
			
		||||
                trimMessage.append(' ');
 | 
			
		||||
            }
 | 
			
		||||
            trimMessage.append(args[i]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return trimMessage.toString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getPrettyItemString(Material material) {
 | 
			
		||||
        return createPrettyString(material.toString());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getPrettyEntityTypeString(EntityType entity) {
 | 
			
		||||
        return createPrettyString(entity.toString());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getPrettyAbilityString(SuperAbilityType ability) {
 | 
			
		||||
        return createPrettyString(ability.toString());
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public static String getWildcardConfigBlockDataString(BlockData data) {
 | 
			
		||||
        return getWildcardConfigMaterialString(data.getMaterial());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getWildcardConfigMaterialString(Material data) {
 | 
			
		||||
        return StringUtils.getPrettyItemString(data).replace(" ", "_") + "|*";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getFriendlyConfigBlockDataString(BlockData data) {
 | 
			
		||||
        switch(data.getMaterial()){
 | 
			
		||||
            case CHORUS_FLOWER:
 | 
			
		||||
            case COCOA:
 | 
			
		||||
            case WHEAT:
 | 
			
		||||
            case BEETROOTS:
 | 
			
		||||
            case CARROTS:
 | 
			
		||||
            case POTATOES:
 | 
			
		||||
            case NETHER_WART: {
 | 
			
		||||
                if (data instanceof Ageable ageData) {
 | 
			
		||||
                    if (ageData.getAge() == ageData.getMaximumAge()) {
 | 
			
		||||
                        return getPrettyItemString(data.getMaterial()).replace(" ", "_") + "_Ripe";
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                return getPrettyItemString(data.getMaterial()).replace(" ", "_") + "_Ungrown";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return getPrettyItemString(data.getMaterial()).replace(" ", "_");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getFriendlyConfigMaterialString(Material data) {
 | 
			
		||||
        return getPrettyItemString(data).replace(" ", "_");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getExplicitConfigBlockDataString(BlockData data) {
 | 
			
		||||
        return getExplicitConfigMaterialString(data.getMaterial());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getExplicitConfigMaterialString(Material data) {
 | 
			
		||||
        return StringUtils.getPrettyItemString(data).replace(" ", "_");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getPrettyPartyFeatureString(PartyFeature partyFeature) {
 | 
			
		||||
        return createPrettyString(partyFeature.toString());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static String createPrettyString(String baseString) {
 | 
			
		||||
        String[] substrings = baseString.split("_");
 | 
			
		||||
        String prettyString = "";
 | 
			
		||||
        int size = 1;
 | 
			
		||||
 | 
			
		||||
        for (String string : substrings) {
 | 
			
		||||
            prettyString = prettyString.concat(getCapitalized(string));
 | 
			
		||||
 | 
			
		||||
            if (size < substrings.length) {
 | 
			
		||||
                prettyString = prettyString.concat(" ");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            size++;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return prettyString;
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a pretty string representation of a Material.
 | 
			
		||||
     * Results are cached to improve performance.
 | 
			
		||||
     *
 | 
			
		||||
     * @param material Material to convert
 | 
			
		||||
     * @return Pretty string representation of the Material
 | 
			
		||||
     */
 | 
			
		||||
    public static String getFormattedMaterialString(Material material) {
 | 
			
		||||
        return formattedMaterialStrings.computeIfAbsent(material, StringUtils::createPrettyString);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Determine if a string represents an Integer
 | 
			
		||||
     * Gets a pretty string representation of an EntityType.
 | 
			
		||||
     * Results are cached to improve performance.
 | 
			
		||||
     *
 | 
			
		||||
     * @param string
 | 
			
		||||
     *            String to check
 | 
			
		||||
     * @param entityType EntityType to convert
 | 
			
		||||
     * @return Pretty string representation of the EntityType
 | 
			
		||||
     */
 | 
			
		||||
    public static String getPrettyEntityTypeString(EntityType entityType) {
 | 
			
		||||
        return formattedEntityStrings.computeIfAbsent(entityType, StringUtils::createPrettyString);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a wildcard configuration string for BlockData.
 | 
			
		||||
     * Results are cached to improve performance.
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockData BlockData to convert
 | 
			
		||||
     * @return Wildcard configuration string
 | 
			
		||||
     */
 | 
			
		||||
    public static String getWildcardConfigBlockDataString(BlockData blockData) {
 | 
			
		||||
        return getFormattedMaterialString(blockData.getMaterial());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets an explicit configuration string for BlockData.
 | 
			
		||||
     * Results are cached to improve performance.
 | 
			
		||||
     *
 | 
			
		||||
     * @param data BlockData to convert
 | 
			
		||||
     * @return Explicit configuration string
 | 
			
		||||
     */
 | 
			
		||||
    public static String getExplicitConfigBlockDataString(BlockData data) {
 | 
			
		||||
        return getFormattedMaterialString(data.getMaterial());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a pretty string representation of a PartyFeature.
 | 
			
		||||
     * Results are cached to improve performance.
 | 
			
		||||
     *
 | 
			
		||||
     * @param partyFeature PartyFeature to convert
 | 
			
		||||
     * @return Pretty string representation
 | 
			
		||||
     */
 | 
			
		||||
    public static String getPrettyPartyFeatureString(PartyFeature partyFeature) {
 | 
			
		||||
        return prettyPartyFeatureStringCache.computeIfAbsent(partyFeature, StringUtils::createPrettyString);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a pretty string from a base string by splitting underscores and capitalizing words.
 | 
			
		||||
     *
 | 
			
		||||
     * @param baseString String to convert
 | 
			
		||||
     * @return Pretty string
 | 
			
		||||
     */
 | 
			
		||||
    private static String createPrettyString(String baseString) {
 | 
			
		||||
        return PRETTY_STRING_FUNC.apply(baseString);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Function to create a pretty string from a base string.
 | 
			
		||||
     */
 | 
			
		||||
    private static final Function<String, String> PRETTY_STRING_FUNC = baseString -> {
 | 
			
		||||
        if (baseString.contains("_") && !baseString.contains(" ")) {
 | 
			
		||||
            return prettify(baseString.split("_"));
 | 
			
		||||
        } else {
 | 
			
		||||
            if(baseString.contains(" ")) {
 | 
			
		||||
                return prettify(baseString.split(" "));
 | 
			
		||||
            } else{
 | 
			
		||||
                return getCapitalized(baseString);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private static @NotNull String prettify(String[] substrings) {
 | 
			
		||||
        final StringBuilder prettyString = new StringBuilder();
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < substrings.length; i++) {
 | 
			
		||||
            prettyString.append(getCapitalized(substrings[i]));
 | 
			
		||||
            if (i < substrings.length - 1) {
 | 
			
		||||
                prettyString.append(' ');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return prettyString.toString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a pretty string from an object.
 | 
			
		||||
     * @param object Object to convert
 | 
			
		||||
     * @return Pretty string representation of the object
 | 
			
		||||
     */
 | 
			
		||||
    private static String createPrettyString(Object object) {
 | 
			
		||||
        return createPrettyString(object.toString());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Determine if a string represents an Integer.
 | 
			
		||||
     *
 | 
			
		||||
     * @param string String to check
 | 
			
		||||
     * @return true if the string is an Integer, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isInt(String string) {
 | 
			
		||||
        try {
 | 
			
		||||
            Integer.parseInt(string);
 | 
			
		||||
            return true;
 | 
			
		||||
        } catch (NumberFormatException nFE) {
 | 
			
		||||
        } catch (NumberFormatException ignored) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Determine if a string represents a Double
 | 
			
		||||
     * Determine if a string represents a Double.
 | 
			
		||||
     *
 | 
			
		||||
     * @param string
 | 
			
		||||
     *            String to check
 | 
			
		||||
     * @param string String to check
 | 
			
		||||
     * @return true if the string is a Double, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isDouble(String string) {
 | 
			
		||||
        try {
 | 
			
		||||
            Double.parseDouble(string);
 | 
			
		||||
            return true;
 | 
			
		||||
        } catch (NumberFormatException nFE) {
 | 
			
		||||
        } catch (NumberFormatException ignored) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String convertKeyToName(@NotNull String key) {
 | 
			
		||||
        // used when no display name is given for a potion
 | 
			
		||||
        final String noUnderscores = key.replace("_", " ").toLowerCase(Locale.ENGLISH);
 | 
			
		||||
        return org.codehaus.plexus.util.StringUtils.capitalise(noUnderscores);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,6 @@ import com.gmail.nossr50.util.skills.RankUtils;
 | 
			
		||||
import com.gmail.nossr50.util.skills.SkillTools;
 | 
			
		||||
import com.gmail.nossr50.util.sounds.SoundManager;
 | 
			
		||||
import org.bukkit.*;
 | 
			
		||||
import org.bukkit.attribute.Attribute;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.event.Event;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user