mirror of
				https://github.com/mcMMO-Dev/mcMMO.git
				synced 2025-11-03 18:43:43 +01:00 
			
		
		
		
	optimizations
This commit is contained in:
		@@ -1,324 +0,0 @@
 | 
			
		||||
package com.gmail.nossr50.commands;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.datatypes.skills.ModConfigType;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.util.Misc;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandExecutor;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
 | 
			
		||||
import java.io.*;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Locale;
 | 
			
		||||
 | 
			
		||||
public class McImportCommand implements CommandExecutor {
 | 
			
		||||
    int fileAmount;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
 | 
			
		||||
        if (args.length == 0) {
 | 
			
		||||
            importModConfig();
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean importModConfig() {
 | 
			
		||||
        String importFilePath = mcMMO.getModDirectory() + File.separator + "import";
 | 
			
		||||
        File importFile = new File(importFilePath, "import.log");
 | 
			
		||||
        mcMMO.p.getLogger().info("Starting import of mod materials...");
 | 
			
		||||
        fileAmount = 0;
 | 
			
		||||
 | 
			
		||||
        HashMap<ModConfigType, ArrayList<String>> materialNames = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
        BufferedReader in = null;
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            // Open the file
 | 
			
		||||
            in = new BufferedReader(new FileReader(importFile));
 | 
			
		||||
 | 
			
		||||
            String line;
 | 
			
		||||
            String materialName;
 | 
			
		||||
            String modName;
 | 
			
		||||
 | 
			
		||||
            // While not at the end of the file
 | 
			
		||||
            while ((line = in.readLine()) != null) {
 | 
			
		||||
                String[] split1 = line.split("material ");
 | 
			
		||||
 | 
			
		||||
                if (split1.length != 2) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                String[] split2 = split1[1].split(" with");
 | 
			
		||||
 | 
			
		||||
                if (split2.length != 2) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                materialName = split2[0];
 | 
			
		||||
 | 
			
		||||
                // Categorise each material under a mod config type
 | 
			
		||||
                ModConfigType type = ModConfigType.getModConfigType(materialName);
 | 
			
		||||
 | 
			
		||||
                if (!materialNames.containsKey(type)) {
 | 
			
		||||
                    materialNames.put(type, new ArrayList<>());
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                materialNames.get(type).add(materialName);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        catch (FileNotFoundException e) {
 | 
			
		||||
            mcMMO.p.getLogger().warning("Could not find " + importFile.getAbsolutePath() + " ! (No such file or directory)");
 | 
			
		||||
            mcMMO.p.getLogger().warning("Copy and paste latest.log to " + importFile.getParentFile().getAbsolutePath() + " and rename it to import.log");
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        finally {
 | 
			
		||||
            tryClose(in);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        createOutput(materialNames);
 | 
			
		||||
 | 
			
		||||
        mcMMO.p.getLogger().info("Import finished! Created " + fileAmount + " files!");
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void createOutput(HashMap<ModConfigType, ArrayList<String>> materialNames) {
 | 
			
		||||
        for (ModConfigType modConfigType : materialNames.keySet()) {
 | 
			
		||||
            HashMap<String, ArrayList<String>> materialNamesType = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
            for (String materialName : materialNames.get(modConfigType)) {
 | 
			
		||||
                String modName = Misc.getModName(materialName);
 | 
			
		||||
 | 
			
		||||
                if (!materialNamesType.containsKey(modName)) {
 | 
			
		||||
                    materialNamesType.put(modName, new ArrayList<>());
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                materialNamesType.get(modName).add(materialName);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            createOutput(modConfigType, materialNamesType);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void tryClose(Closeable c) {
 | 
			
		||||
        if (c == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        try {
 | 
			
		||||
            c.close();
 | 
			
		||||
        }
 | 
			
		||||
        catch (IOException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void createOutput(ModConfigType modConfigType, HashMap<String, ArrayList<String>> materialNames) {
 | 
			
		||||
        File outputFilePath = new File(mcMMO.getModDirectory() + File.separator + "output");
 | 
			
		||||
        if (!outputFilePath.exists() && !outputFilePath.mkdirs()) {
 | 
			
		||||
            mcMMO.p.getLogger().severe("Could not create output directory! " + outputFilePath.getAbsolutePath());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        FileWriter out = null;
 | 
			
		||||
        String type = modConfigType.name().toLowerCase(Locale.ENGLISH);
 | 
			
		||||
 | 
			
		||||
        for (String modName : materialNames.keySet()) {
 | 
			
		||||
            File outputFile = new File(outputFilePath, modName + "." + type + ".yml");
 | 
			
		||||
            mcMMO.p.getLogger().info("Creating " + outputFile.getName());
 | 
			
		||||
            try {
 | 
			
		||||
                if (outputFile.exists() && !outputFile.delete()) {
 | 
			
		||||
                    mcMMO.p.getLogger().severe("Not able to delete old output file! " + outputFile.getAbsolutePath());
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (!outputFile.createNewFile()) {
 | 
			
		||||
                    mcMMO.p.getLogger().severe("Could not create output file! " + outputFile.getAbsolutePath());
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                StringBuilder writer = new StringBuilder();
 | 
			
		||||
                HashMap<String, ArrayList<String>> configSections = getConfigSections(modConfigType, modName, materialNames);
 | 
			
		||||
 | 
			
		||||
                if (configSections == null) {
 | 
			
		||||
                    mcMMO.p.getLogger().severe("Something went wrong!! type is " + type);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Write the file, go through each skill and write all the materials
 | 
			
		||||
                for (String configSection : configSections.keySet()) {
 | 
			
		||||
                    if (configSection.equals("UNIDENTIFIED")) {
 | 
			
		||||
                        writer.append("# This isn't a valid config section and all materials in this category need to be").append("\r\n");
 | 
			
		||||
                        writer.append("# copy and pasted to a valid section of this config file.").append("\r\n");
 | 
			
		||||
                    }
 | 
			
		||||
                    writer.append(configSection).append(":").append("\r\n");
 | 
			
		||||
 | 
			
		||||
                    for (String line : configSections.get(configSection)) {
 | 
			
		||||
                        writer.append(line).append("\r\n");
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    writer.append("\r\n");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                out = new FileWriter(outputFile);
 | 
			
		||||
                out.write(writer.toString());
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
                return;
 | 
			
		||||
            } finally {
 | 
			
		||||
                tryClose(out);
 | 
			
		||||
                fileAmount++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private HashMap<String, ArrayList<String>> getConfigSections(ModConfigType type, String modName, HashMap<String, ArrayList<String>> materialNames) {
 | 
			
		||||
        switch (type) {
 | 
			
		||||
            case BLOCKS:
 | 
			
		||||
                return getConfigSectionsBlocks(modName, materialNames);
 | 
			
		||||
            case TOOLS:
 | 
			
		||||
                return getConfigSectionsTools(modName, materialNames);
 | 
			
		||||
            case ARMOR:
 | 
			
		||||
                return getConfigSectionsArmor(modName, materialNames);
 | 
			
		||||
            case UNKNOWN:
 | 
			
		||||
                return getConfigSectionsUnknown(modName, materialNames);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private HashMap<String, ArrayList<String>> getConfigSectionsBlocks(String modName, HashMap<String, ArrayList<String>> materialNames) {
 | 
			
		||||
        HashMap<String, ArrayList<String>> configSections = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
        // Go through all the materials and categorise them under a skill
 | 
			
		||||
        for (String materialName : materialNames.get(modName)) {
 | 
			
		||||
            String skillName = "UNIDENTIFIED";
 | 
			
		||||
            if (materialName.contains("ORE")) {
 | 
			
		||||
                skillName = "Mining";
 | 
			
		||||
            } else if (materialName.contains("LOG") || materialName.contains("LEAVES")) {
 | 
			
		||||
                skillName = "Woodcutting";
 | 
			
		||||
            } else if (materialName.contains("GRASS") || materialName.contains("SHORT_GRASS") || materialName.contains("FLOWER") || materialName.contains("CROP")) {
 | 
			
		||||
                skillName = "Herbalism";
 | 
			
		||||
            } else if (materialName.contains("DIRT") || materialName.contains("SAND")) {
 | 
			
		||||
                skillName = "Excavation";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!configSections.containsKey(skillName)) {
 | 
			
		||||
                configSections.put(skillName, new ArrayList<>());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ArrayList<String> skillContents = configSections.get(skillName);
 | 
			
		||||
            skillContents.add("    " + materialName + "|0:");
 | 
			
		||||
            skillContents.add("    " + "    " + "XP_Gain: 99");
 | 
			
		||||
            skillContents.add("    " + "    " + "Double_Drops_Enabled: true");
 | 
			
		||||
 | 
			
		||||
            if (skillName.equals("Mining")) {
 | 
			
		||||
                skillContents.add("    " + "    " + "Smelting_XP_Gain: 9");
 | 
			
		||||
            } else if (skillName.equals("Woodcutting")) {
 | 
			
		||||
                skillContents.add("    " + "    " + "Is_Log: " + materialName.contains("LOG"));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return configSections;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private HashMap<String, ArrayList<String>> getConfigSectionsTools(String modName, HashMap<String, ArrayList<String>> materialNames) {
 | 
			
		||||
        HashMap<String, ArrayList<String>> configSections = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
        // Go through all the materials and categorise them under a tool type
 | 
			
		||||
        for (String materialName : materialNames.get(modName)) {
 | 
			
		||||
            String toolType = "UNIDENTIFIED";
 | 
			
		||||
            if (materialName.contains("PICKAXE")) {
 | 
			
		||||
                toolType = "Pickaxes";
 | 
			
		||||
            } else if (materialName.contains("AXE")) {
 | 
			
		||||
                toolType = "Axes";
 | 
			
		||||
            } else if (materialName.contains("BOW")) {
 | 
			
		||||
                toolType = "Bows";
 | 
			
		||||
            } else if (materialName.contains("HOE")) {
 | 
			
		||||
                toolType = "Hoes";
 | 
			
		||||
            } else if (materialName.contains("SHOVEL") || materialName.contains("SPADE")) {
 | 
			
		||||
                toolType = "Shovels";
 | 
			
		||||
            } else if (materialName.contains("SWORD")) {
 | 
			
		||||
                toolType = "Swords";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!configSections.containsKey(toolType)) {
 | 
			
		||||
                configSections.put(toolType, new ArrayList<>());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ArrayList<String> skillContents = configSections.get(toolType);
 | 
			
		||||
            skillContents.add("    " + materialName + ":");
 | 
			
		||||
            skillContents.add("    " + "    " + "XP_Modifier: 1.0");
 | 
			
		||||
            skillContents.add("    " + "    " + "Tier: 1");
 | 
			
		||||
            skillContents.add("    " + "    " + "Ability_Enabled: true");
 | 
			
		||||
            addRepairableLines(materialName, skillContents);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return configSections;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private HashMap<String, ArrayList<String>> getConfigSectionsArmor(String modName, HashMap<String, ArrayList<String>> materialNames) {
 | 
			
		||||
        HashMap<String, ArrayList<String>> configSections = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
        // Go through all the materials and categorise them under an armor type
 | 
			
		||||
        for (String materialName : materialNames.get(modName)) {
 | 
			
		||||
            String toolType = "UNIDENTIFIED";
 | 
			
		||||
            if (materialName.contains("BOOT") || materialName.contains("SHOE")) {
 | 
			
		||||
                toolType = "Boots";
 | 
			
		||||
            } else if (materialName.contains("CHESTPLATE") || materialName.contains("CHEST")) {
 | 
			
		||||
                toolType = "Chestplates";
 | 
			
		||||
            } else if (materialName.contains("HELM") || materialName.contains("HAT")) {
 | 
			
		||||
                toolType = "Helmets";
 | 
			
		||||
            } else if (materialName.contains("LEGGINGS") || materialName.contains("LEGS") || materialName.contains("PANTS")) {
 | 
			
		||||
                toolType = "Leggings";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!configSections.containsKey(toolType)) {
 | 
			
		||||
                configSections.put(toolType, new ArrayList<>());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ArrayList<String> skillContents = configSections.get(toolType);
 | 
			
		||||
            skillContents.add("    " + materialName + ":");
 | 
			
		||||
            addRepairableLines(materialName, skillContents);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return configSections;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void addRepairableLines(String materialName, ArrayList<String> skillContents) {
 | 
			
		||||
        skillContents.add("    " + "    " + "Repairable: true");
 | 
			
		||||
        skillContents.add("    " + "    " + "Repair_Material: REPAIR_MATERIAL_NAME");
 | 
			
		||||
        skillContents.add("    " + "    " + "Repair_Material_Data_Value: 0");
 | 
			
		||||
        skillContents.add("    " + "    " + "Repair_Material_Quantity: 9");
 | 
			
		||||
        skillContents.add("    " + "    " + "Repair_Material_Pretty_Name: Repair Item Name");
 | 
			
		||||
        skillContents.add("    " + "    " + "Repair_MinimumLevel: 0");
 | 
			
		||||
        skillContents.add("    " + "    " + "Repair_XpMultiplier: 1.0");
 | 
			
		||||
 | 
			
		||||
        Material material = Material.matchMaterial(materialName);
 | 
			
		||||
        short durability = (material == null) ? (short) 9999 : material.getMaxDurability();
 | 
			
		||||
        skillContents.add("    " + "    " + "Durability: " + ((durability > 0) ? durability : (short) 9999));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private HashMap<String, ArrayList<String>> getConfigSectionsUnknown(String modName, HashMap<String, ArrayList<String>> materialNames) {
 | 
			
		||||
        HashMap<String, ArrayList<String>> configSections = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
        // Go through all the materials and print them
 | 
			
		||||
        for (String materialName : materialNames.get(modName)) {
 | 
			
		||||
            String configKey = "UNIDENTIFIED";
 | 
			
		||||
 | 
			
		||||
            if (!configSections.containsKey(configKey)) {
 | 
			
		||||
                configSections.put(configKey, new ArrayList<>());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ArrayList<String> skillContents = configSections.get(configKey);
 | 
			
		||||
            skillContents.add("    " + materialName);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return configSections;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -376,6 +376,7 @@ public class ExperienceConfig extends BukkitConfig {
 | 
			
		||||
        return getXp(skill, material) > 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    public boolean doesBlockGiveSkillXP(PrimarySkillType skill, BlockData data) {
 | 
			
		||||
        return getXp(skill, data) > 0;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
package com.gmail.nossr50.config.mods;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.util.ModManager;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
public class ArmorConfigManager {
 | 
			
		||||
    public ArmorConfigManager(mcMMO plugin) {
 | 
			
		||||
        Pattern middlePattern = Pattern.compile("armor\\.(?:.+)\\.yml");
 | 
			
		||||
        Pattern startPattern = Pattern.compile("(?:.+)\\.armor\\.yml");
 | 
			
		||||
        File dataFolder = new File(mcMMO.getModDirectory());
 | 
			
		||||
        File vanilla = new File(dataFolder, "armor.default.yml");
 | 
			
		||||
        ModManager modManager = mcMMO.getModManager();
 | 
			
		||||
 | 
			
		||||
        if (!vanilla.exists()) {
 | 
			
		||||
            plugin.saveResource(vanilla.getParentFile().getName() + File.separator + "armor.default.yml", false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (String fileName : dataFolder.list()) {
 | 
			
		||||
            if (!middlePattern.matcher(fileName).matches() && !startPattern.matcher(fileName).matches()) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            File file = new File(dataFolder, fileName);
 | 
			
		||||
 | 
			
		||||
            if (file.isDirectory()) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            modManager.registerCustomArmor(new CustomArmorLegacyConfig(fileName));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
package com.gmail.nossr50.config.mods;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.util.ModManager;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
public class BlockConfigManager {
 | 
			
		||||
    public BlockConfigManager(mcMMO plugin) {
 | 
			
		||||
        Pattern middlePattern = Pattern.compile("blocks\\.(?:.+)\\.yml");
 | 
			
		||||
        Pattern startPattern = Pattern.compile("(?:.+)\\.blocks\\.yml");
 | 
			
		||||
        File dataFolder = new File(mcMMO.getModDirectory());
 | 
			
		||||
        File vanilla = new File(dataFolder, "blocks.default.yml");
 | 
			
		||||
        ModManager modManager = mcMMO.getModManager();
 | 
			
		||||
 | 
			
		||||
        if (!vanilla.exists()) {
 | 
			
		||||
            plugin.saveResource(vanilla.getParentFile().getName() + File.separator + "blocks.default.yml", false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (String fileName : dataFolder.list()) {
 | 
			
		||||
            if (!middlePattern.matcher(fileName).matches() && !startPattern.matcher(fileName).matches()) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            File file = new File(dataFolder, fileName);
 | 
			
		||||
 | 
			
		||||
            if (file.isDirectory()) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            modManager.registerCustomBlocks(new CustomBlockLegacyConfig(fileName));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,93 +0,0 @@
 | 
			
		||||
package com.gmail.nossr50.config.mods;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.config.LegacyConfigLoader;
 | 
			
		||||
import com.gmail.nossr50.datatypes.skills.ItemType;
 | 
			
		||||
import com.gmail.nossr50.datatypes.skills.MaterialType;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.skills.repair.repairables.Repairable;
 | 
			
		||||
import com.gmail.nossr50.skills.repair.repairables.RepairableFactory;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.configuration.ConfigurationSection;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
public class CustomArmorLegacyConfig extends LegacyConfigLoader {
 | 
			
		||||
    public List<Material> customBoots = new ArrayList<>();
 | 
			
		||||
    public List<Material> customChestplates = new ArrayList<>();
 | 
			
		||||
    public List<Material> customHelmets = new ArrayList<>();
 | 
			
		||||
    public List<Material> customLeggings = new ArrayList<>();
 | 
			
		||||
    public List<Repairable> repairables = new ArrayList<>();
 | 
			
		||||
    private boolean needsUpdate = false;
 | 
			
		||||
 | 
			
		||||
    protected CustomArmorLegacyConfig(String fileName) {
 | 
			
		||||
        super("mods", fileName);
 | 
			
		||||
        loadKeys();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void loadKeys() {
 | 
			
		||||
        loadArmor("Boots", customBoots);
 | 
			
		||||
        loadArmor("Chestplates", customChestplates);
 | 
			
		||||
        loadArmor("Helmets", customHelmets);
 | 
			
		||||
        loadArmor("Leggings", customLeggings);
 | 
			
		||||
 | 
			
		||||
        if (needsUpdate) {
 | 
			
		||||
            needsUpdate = false;
 | 
			
		||||
            backup();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void loadArmor(String armorType, List<Material> materialList) {
 | 
			
		||||
        if (needsUpdate) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ConfigurationSection armorSection = config.getConfigurationSection(armorType);
 | 
			
		||||
 | 
			
		||||
        if (armorSection == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Set<String> armorConfigSet = armorSection.getKeys(false);
 | 
			
		||||
 | 
			
		||||
        for (String armorName : armorConfigSet) {
 | 
			
		||||
            if (config.contains(armorType + "." + armorName + "." + ".ID")) {
 | 
			
		||||
                needsUpdate = true;
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Material armorMaterial = Material.matchMaterial(armorName);
 | 
			
		||||
 | 
			
		||||
            if (armorMaterial == null) {
 | 
			
		||||
                mcMMO.p.getLogger().warning("Invalid material name. This item will be skipped. - " + armorName);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            boolean repairable = config.getBoolean(armorType + "." + armorName + ".Repairable");
 | 
			
		||||
            Material repairMaterial = Material.matchMaterial(config.getString(armorType + "." + armorName + ".Repair_Material", ""));
 | 
			
		||||
 | 
			
		||||
            if (repairable && (repairMaterial == null)) {
 | 
			
		||||
                mcMMO.p.getLogger().warning("Incomplete repair information. This item will be unrepairable. - " + armorName);
 | 
			
		||||
                repairable = false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (repairable) {
 | 
			
		||||
                String repairItemName = config.getString(armorType + "." + armorName + ".Repair_Material_Pretty_Name");
 | 
			
		||||
                int repairMinimumLevel = config.getInt(armorType + "." + armorName + ".Repair_MinimumLevel", 0);
 | 
			
		||||
                double repairXpMultiplier = config.getDouble(armorType + "." + armorName + ".Repair_XpMultiplier", 1);
 | 
			
		||||
 | 
			
		||||
                short durability = armorMaterial.getMaxDurability();
 | 
			
		||||
 | 
			
		||||
                if (durability == 0) {
 | 
			
		||||
                    durability = (short) config.getInt(armorType + "." + armorName + ".Durability", 70);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                repairables.add(RepairableFactory.getRepairable(armorMaterial, repairMaterial, repairItemName, repairMinimumLevel, durability, ItemType.ARMOR, MaterialType.OTHER, repairXpMultiplier));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            materialList.add(armorMaterial);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,98 +0,0 @@
 | 
			
		||||
package com.gmail.nossr50.config.mods;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.config.LegacyConfigLoader;
 | 
			
		||||
import com.gmail.nossr50.datatypes.mods.CustomBlock;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.configuration.ConfigurationSection;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
public class CustomBlockLegacyConfig extends LegacyConfigLoader {
 | 
			
		||||
    public List<Material> customExcavationBlocks = new ArrayList<>();
 | 
			
		||||
    public List<Material> customHerbalismBlocks = new ArrayList<>();
 | 
			
		||||
    public List<Material> customMiningBlocks = new ArrayList<>();
 | 
			
		||||
    public List<Material> customOres = new ArrayList<>();
 | 
			
		||||
    public List<Material> customLogs = new ArrayList<>();
 | 
			
		||||
    public List<Material> customLeaves = new ArrayList<>();
 | 
			
		||||
    public List<Material> customAbilityBlocks = new ArrayList<>();
 | 
			
		||||
    public HashMap<Material, CustomBlock> customBlockMap = new HashMap<>();
 | 
			
		||||
    private boolean needsUpdate = false;
 | 
			
		||||
 | 
			
		||||
    protected CustomBlockLegacyConfig(String fileName) {
 | 
			
		||||
        super("mods", fileName);
 | 
			
		||||
        loadKeys();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void loadKeys() {
 | 
			
		||||
        loadBlocks("Excavation", customExcavationBlocks);
 | 
			
		||||
        loadBlocks("Herbalism", customHerbalismBlocks);
 | 
			
		||||
        loadBlocks("Mining", customMiningBlocks);
 | 
			
		||||
        loadBlocks("Woodcutting", null);
 | 
			
		||||
        loadBlocks("Ability_Blocks", customAbilityBlocks);
 | 
			
		||||
 | 
			
		||||
        if (needsUpdate) {
 | 
			
		||||
            needsUpdate = false;
 | 
			
		||||
            backup();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void loadBlocks(String skillType, List<Material> blockList) {
 | 
			
		||||
        if (needsUpdate) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ConfigurationSection skillSection = config.getConfigurationSection(skillType);
 | 
			
		||||
 | 
			
		||||
        if (skillSection == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Set<String> skillConfigSet = skillSection.getKeys(false);
 | 
			
		||||
 | 
			
		||||
        for (String blockName : skillConfigSet) {
 | 
			
		||||
            if (config.contains(skillType + "." + blockName + ".Drop_Item")) {
 | 
			
		||||
                needsUpdate = true;
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            String[] blockInfo = blockName.split("[|]");
 | 
			
		||||
 | 
			
		||||
            Material blockMaterial = Material.matchMaterial(blockInfo[0]);
 | 
			
		||||
 | 
			
		||||
            if (blockMaterial == null) {
 | 
			
		||||
                mcMMO.p.getLogger().warning("Invalid material name. This item will be skipped. - " + blockInfo[0]);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (blockList != null) {
 | 
			
		||||
                blockList.add(blockMaterial);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (skillType.equals("Ability_Blocks")) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            int xp = config.getInt(skillType + "." + blockName + ".XP_Gain");
 | 
			
		||||
            int smeltingXp = 0;
 | 
			
		||||
 | 
			
		||||
            if (skillType.equals("Mining") && config.getBoolean(skillType + "." + blockName + ".Is_Ore")) {
 | 
			
		||||
                customOres.add(blockMaterial);
 | 
			
		||||
                smeltingXp = config.getInt(skillType + "." + blockName + ".Smelting_XP_Gain", xp / 10);
 | 
			
		||||
            } else if (skillType.equals("Woodcutting")) {
 | 
			
		||||
                if (config.getBoolean(skillType + "." + blockName + ".Is_Log")) {
 | 
			
		||||
                    customLogs.add(blockMaterial);
 | 
			
		||||
                } else {
 | 
			
		||||
                    customLeaves.add(blockMaterial);
 | 
			
		||||
                    xp = 0; // Leaves don't grant XP
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            customBlockMap.put(blockMaterial, new CustomBlock(xp, config.getBoolean(skillType + "." + blockName + ".Double_Drops_Enabled"), smeltingXp));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,60 +0,0 @@
 | 
			
		||||
package com.gmail.nossr50.config.mods;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.config.LegacyConfigLoader;
 | 
			
		||||
import com.gmail.nossr50.datatypes.mods.CustomEntity;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
 | 
			
		||||
public class CustomEntityLegacyConfig extends LegacyConfigLoader {
 | 
			
		||||
    public HashMap<String, CustomEntity> customEntityClassMap = new HashMap<>();
 | 
			
		||||
    public HashMap<String, CustomEntity> customEntityTypeMap = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    protected CustomEntityLegacyConfig(String fileName) {
 | 
			
		||||
        super("mods", fileName);
 | 
			
		||||
        loadKeys();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void loadKeys() {
 | 
			
		||||
        if (config.getConfigurationSection("Hostile") != null) {
 | 
			
		||||
            backup();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (String entityName : config.getKeys(false)) {
 | 
			
		||||
            Class<?> clazz = null;
 | 
			
		||||
            String className = config.getString(entityName + ".Class", "");
 | 
			
		||||
 | 
			
		||||
            try {
 | 
			
		||||
                clazz = Class.forName(className);
 | 
			
		||||
            } catch (ClassNotFoundException e) {
 | 
			
		||||
                mcMMO.p.getLogger().warning("Invalid class (" + className + ") detected for " + entityName + ".");
 | 
			
		||||
                mcMMO.p.getLogger().warning("This custom entity may not function properly.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            String entityTypeName = entityName.replace("_", ".");
 | 
			
		||||
            double xpMultiplier = config.getDouble(entityName + ".XP_Multiplier", 1.0D);
 | 
			
		||||
 | 
			
		||||
            boolean canBeTamed = config.getBoolean(entityName + ".Tameable");
 | 
			
		||||
            int tamingXp = config.getInt(entityName + ".Taming_XP");
 | 
			
		||||
 | 
			
		||||
            boolean canBeSummoned = config.getBoolean(entityName + ".CanBeSummoned");
 | 
			
		||||
            Material callOfTheWildMaterial = Material.matchMaterial(config.getString(entityName + ".COTW_Material", ""));
 | 
			
		||||
            byte callOfTheWildData = (byte) config.getInt(entityName + ".COTW_Material_Data");
 | 
			
		||||
            int callOfTheWildAmount = config.getInt(entityName + ".COTW_Material_Amount");
 | 
			
		||||
 | 
			
		||||
            if (canBeSummoned && (callOfTheWildMaterial == null || callOfTheWildAmount == 0)) {
 | 
			
		||||
                mcMMO.p.getLogger().warning("Incomplete Call of the Wild information. This entity will not be able to be summoned by Call of the Wild.");
 | 
			
		||||
                canBeSummoned = false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            CustomEntity entity = new CustomEntity(xpMultiplier, canBeTamed, tamingXp, canBeSummoned, (canBeSummoned ? new ItemStack(callOfTheWildMaterial) : null), callOfTheWildAmount);
 | 
			
		||||
 | 
			
		||||
            customEntityTypeMap.put(entityTypeName, entity);
 | 
			
		||||
            customEntityClassMap.put(clazz == null ? null : clazz.getName(), entity);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,107 +0,0 @@
 | 
			
		||||
package com.gmail.nossr50.config.mods;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.config.LegacyConfigLoader;
 | 
			
		||||
import com.gmail.nossr50.datatypes.mods.CustomTool;
 | 
			
		||||
import com.gmail.nossr50.datatypes.skills.ItemType;
 | 
			
		||||
import com.gmail.nossr50.datatypes.skills.MaterialType;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.skills.repair.repairables.Repairable;
 | 
			
		||||
import com.gmail.nossr50.skills.repair.repairables.RepairableFactory;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.configuration.ConfigurationSection;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
public class CustomToolLegacyConfig extends LegacyConfigLoader {
 | 
			
		||||
    public List<Material> customAxes = new ArrayList<>();
 | 
			
		||||
    public List<Material> customBows = new ArrayList<>();
 | 
			
		||||
    public List<Material> customHoes = new ArrayList<>();
 | 
			
		||||
    public List<Material> customPickaxes = new ArrayList<>();
 | 
			
		||||
    public List<Material> customShovels = new ArrayList<>();
 | 
			
		||||
    public List<Material> customSwords = new ArrayList<>();
 | 
			
		||||
    public HashMap<Material, CustomTool> customToolMap = new HashMap<>();
 | 
			
		||||
    public List<Repairable> repairables = new ArrayList<>();
 | 
			
		||||
    private boolean needsUpdate = false;
 | 
			
		||||
 | 
			
		||||
    protected CustomToolLegacyConfig(String fileName) {
 | 
			
		||||
        super("mods", fileName);
 | 
			
		||||
        loadKeys();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void loadKeys() {
 | 
			
		||||
        loadTool("Axes", customAxes);
 | 
			
		||||
        loadTool("Bows", customBows);
 | 
			
		||||
        loadTool("Hoes", customHoes);
 | 
			
		||||
        loadTool("Pickaxes", customPickaxes);
 | 
			
		||||
        loadTool("Shovels", customShovels);
 | 
			
		||||
        loadTool("Swords", customSwords);
 | 
			
		||||
 | 
			
		||||
        if (needsUpdate) {
 | 
			
		||||
            needsUpdate = false;
 | 
			
		||||
            backup();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void loadTool(String toolType, List<Material> materialList) {
 | 
			
		||||
        if (needsUpdate) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ConfigurationSection toolSection = config.getConfigurationSection(toolType);
 | 
			
		||||
 | 
			
		||||
        if (toolSection == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Set<String> toolConfigSet = toolSection.getKeys(false);
 | 
			
		||||
 | 
			
		||||
        for (String toolName : toolConfigSet) {
 | 
			
		||||
            if (config.contains(toolType + "." + toolName + "." + ".ID")) {
 | 
			
		||||
                needsUpdate = true;
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Material toolMaterial = Material.matchMaterial(toolName);
 | 
			
		||||
 | 
			
		||||
            if (toolMaterial == null) {
 | 
			
		||||
                mcMMO.p.getLogger().warning("Invalid material name. This item will be skipped. - " + toolName);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            boolean repairable = config.getBoolean(toolType + "." + toolName + ".Repairable");
 | 
			
		||||
            Material repairMaterial = Material.matchMaterial(config.getString(toolType + "." + toolName + ".Repair_Material", ""));
 | 
			
		||||
 | 
			
		||||
            if (repairable && (repairMaterial == null)) {
 | 
			
		||||
                mcMMO.p.getLogger().warning("Incomplete repair information. This item will be unrepairable. - " + toolName);
 | 
			
		||||
                repairable = false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (repairable) {
 | 
			
		||||
                String repairItemName = config.getString(toolType + "." + toolName + ".Repair_Material_Pretty_Name");
 | 
			
		||||
                int repairMinimumLevel = config.getInt(toolType + "." + toolName + ".Repair_MinimumLevel", 0);
 | 
			
		||||
                double repairXpMultiplier = config.getDouble(toolType + "." + toolName + ".Repair_XpMultiplier", 1);
 | 
			
		||||
 | 
			
		||||
                short durability = toolMaterial.getMaxDurability();
 | 
			
		||||
 | 
			
		||||
                if (durability == 0) {
 | 
			
		||||
                    durability = (short) config.getInt(toolType + "." + toolName + ".Durability", 60);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                repairables.add(RepairableFactory.getRepairable(toolMaterial, repairMaterial, repairItemName, repairMinimumLevel, durability, ItemType.TOOL, MaterialType.OTHER, repairXpMultiplier));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            double multiplier = config.getDouble(toolType + "." + toolName + ".XP_Modifier", 1.0);
 | 
			
		||||
            boolean abilityEnabled = config.getBoolean(toolType + "." + toolName + ".Ability_Enabled", true);
 | 
			
		||||
            int tier = config.getInt(toolType + "." + toolName + ".Tier", 1);
 | 
			
		||||
 | 
			
		||||
            CustomTool tool = new CustomTool(tier, abilityEnabled, multiplier);
 | 
			
		||||
 | 
			
		||||
            materialList.add(toolMaterial);
 | 
			
		||||
            customToolMap.put(toolMaterial, tool);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
package com.gmail.nossr50.config.mods;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.util.ModManager;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
public class EntityConfigManager {
 | 
			
		||||
    public EntityConfigManager(mcMMO plugin) {
 | 
			
		||||
        Pattern middlePattern = Pattern.compile("entities\\.(?:.+)\\.yml");
 | 
			
		||||
        Pattern startPattern = Pattern.compile("(?:.+)\\.entities\\.yml");
 | 
			
		||||
        File dataFolder = new File(mcMMO.getModDirectory());
 | 
			
		||||
        File vanilla = new File(dataFolder, "entities.default.yml");
 | 
			
		||||
        ModManager modManager = mcMMO.getModManager();
 | 
			
		||||
 | 
			
		||||
        if (!vanilla.exists()) {
 | 
			
		||||
            plugin.saveResource(vanilla.getParentFile().getName() + File.separator + "entities.default.yml", false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (String fileName : dataFolder.list()) {
 | 
			
		||||
            if (!middlePattern.matcher(fileName).matches() && !startPattern.matcher(fileName).matches()) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            File file = new File(dataFolder, fileName);
 | 
			
		||||
 | 
			
		||||
            if (file.isDirectory()) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            modManager.registerCustomEntities(new CustomEntityLegacyConfig(fileName));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
package com.gmail.nossr50.config.mods;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.util.ModManager;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
public class ToolConfigManager {
 | 
			
		||||
    public ToolConfigManager(mcMMO plugin) {
 | 
			
		||||
        Pattern middlePattern = Pattern.compile("tools\\.(?:.+)\\.yml");
 | 
			
		||||
        Pattern startPattern = Pattern.compile("(?:.+)\\.tools\\.yml");
 | 
			
		||||
        File dataFolder = new File(mcMMO.getModDirectory());
 | 
			
		||||
        File vanilla = new File(dataFolder, "tools.default.yml");
 | 
			
		||||
        ModManager modManager = mcMMO.getModManager();
 | 
			
		||||
 | 
			
		||||
        if (!vanilla.exists()) {
 | 
			
		||||
            plugin.saveResource(vanilla.getParentFile().getName() + File.separator + "tools.default.yml", false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (String fileName : dataFolder.list()) {
 | 
			
		||||
            if (!middlePattern.matcher(fileName).matches() && !startPattern.matcher(fileName).matches()) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            File file = new File(dataFolder, fileName);
 | 
			
		||||
 | 
			
		||||
            if (file.isDirectory()) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            modManager.registerCustomTools(new CustomToolLegacyConfig(fileName));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -10,7 +10,6 @@ import com.gmail.nossr50.datatypes.experience.XPGainReason;
 | 
			
		||||
import com.gmail.nossr50.datatypes.experience.XPGainSource;
 | 
			
		||||
import com.gmail.nossr50.datatypes.interactions.NotificationType;
 | 
			
		||||
import com.gmail.nossr50.datatypes.meta.RuptureTaskMeta;
 | 
			
		||||
import com.gmail.nossr50.datatypes.mods.CustomTool;
 | 
			
		||||
import com.gmail.nossr50.datatypes.party.Party;
 | 
			
		||||
import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
 | 
			
		||||
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 | 
			
		||||
@@ -385,13 +384,14 @@ public class McMMOPlayer implements Identified {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the mode of an ability.
 | 
			
		||||
     * Get the mode of a superAbilityType.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ability The ability to check
 | 
			
		||||
     * @return true if the ability is enabled, false otherwise
 | 
			
		||||
     * @param superAbilityType The superAbilityType to check
 | 
			
		||||
     * @return true if the superAbilityType is enabled, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public boolean getAbilityMode(SuperAbilityType ability) {
 | 
			
		||||
        return abilityMode.get(ability);
 | 
			
		||||
    public boolean getAbilityMode(@NotNull SuperAbilityType superAbilityType) {
 | 
			
		||||
        requireNonNull(superAbilityType, "superAbilityType cannot be null");
 | 
			
		||||
        return abilityMode.get(superAbilityType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -864,14 +864,6 @@ public class McMMOPlayer implements Identified {
 | 
			
		||||
 | 
			
		||||
        xp = (float) ((xp * ExperienceConfig.getInstance().getFormulaSkillModifier(primarySkillType)) * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier());
 | 
			
		||||
 | 
			
		||||
        if (mcMMO.p.getGeneralConfig().getToolModsEnabled()) {
 | 
			
		||||
            CustomTool tool = mcMMO.getModManager().getTool(player.getInventory().getItemInMainHand());
 | 
			
		||||
 | 
			
		||||
            if (tool != null) {
 | 
			
		||||
                xp *= tool.getXpMultiplier();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return PerksUtils.handleXpPerks(player, xp, primarySkillType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -985,10 +977,6 @@ public class McMMOPlayer implements Identified {
 | 
			
		||||
 | 
			
		||||
        ItemStack inHand = player.getInventory().getItemInMainHand();
 | 
			
		||||
 | 
			
		||||
        if (mcMMO.getModManager().isCustomTool(inHand) && !mcMMO.getModManager().getTool(inHand).isAbilityEnabled()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!getAbilityUse()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,9 @@ import com.gmail.nossr50.util.BlockUtils;
 | 
			
		||||
import com.gmail.nossr50.util.Permissions;
 | 
			
		||||
import com.gmail.nossr50.util.text.StringUtils;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.block.BlockState;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
 | 
			
		||||
public enum SuperAbilityType {
 | 
			
		||||
    EXPLOSIVE_SHOT("Archery.Skills.ExplosiveShot.On",
 | 
			
		||||
@@ -218,20 +219,16 @@ public enum SuperAbilityType {
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a block is affected by this ability.
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState the block to check
 | 
			
		||||
     * @return true if the block is affected by this ability, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public boolean blockCheck(BlockState blockState) {
 | 
			
		||||
    public boolean blockCheck(@NotNull Block block) {
 | 
			
		||||
        return switch (this) {
 | 
			
		||||
            case BERSERK ->
 | 
			
		||||
                    (BlockUtils.affectedByGigaDrillBreaker(blockState) || blockState.getType() == Material.SNOW || mcMMO.getMaterialMapStore().isGlass(blockState.getType()));
 | 
			
		||||
            case GIGA_DRILL_BREAKER -> BlockUtils.affectedByGigaDrillBreaker(blockState);
 | 
			
		||||
            case GREEN_TERRA -> BlockUtils.canMakeMossy(blockState);
 | 
			
		||||
            case SUPER_BREAKER -> BlockUtils.affectedBySuperBreaker(blockState);
 | 
			
		||||
            case TREE_FELLER -> BlockUtils.hasWoodcuttingXP(blockState);
 | 
			
		||||
                    (BlockUtils.affectedByGigaDrillBreaker(block)
 | 
			
		||||
                            || block.getType() == Material.SNOW
 | 
			
		||||
                            || mcMMO.getMaterialMapStore().isGlass(block.getType()));
 | 
			
		||||
            case GIGA_DRILL_BREAKER -> BlockUtils.affectedByGigaDrillBreaker(block);
 | 
			
		||||
            case GREEN_TERRA -> BlockUtils.canMakeMossy(block);
 | 
			
		||||
            case SUPER_BREAKER -> BlockUtils.affectedBySuperBreaker(block);
 | 
			
		||||
            case TREE_FELLER -> BlockUtils.hasWoodcuttingXP(block);
 | 
			
		||||
            default -> false;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -58,7 +58,7 @@ public class BlockListener implements Listener {
 | 
			
		||||
        int tileEntityTolerance = 1;
 | 
			
		||||
 | 
			
		||||
        // beetroot hotfix, potentially other plants may need this fix
 | 
			
		||||
        if (event.getBlockState().getType() == Material.BEETROOTS)
 | 
			
		||||
        if (event.getBlock().getType() == Material.BEETROOTS)
 | 
			
		||||
            tileEntityTolerance = 2;
 | 
			
		||||
 | 
			
		||||
        //Track how many "things" are being dropped
 | 
			
		||||
@@ -214,7 +214,9 @@ public class BlockListener implements Listener {
 | 
			
		||||
        if (ExperienceConfig.getInstance().preventStoneLavaFarming()) {
 | 
			
		||||
            BlockState newState = event.getNewState();
 | 
			
		||||
 | 
			
		||||
            if (newState.getType() != Material.OBSIDIAN && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, newState.getBlockData())) {
 | 
			
		||||
            if (newState.getType() != Material.OBSIDIAN
 | 
			
		||||
                    && ExperienceConfig.getInstance().doesBlockGiveSkillXP(
 | 
			
		||||
                            PrimarySkillType.MINING, newState.getType())) {
 | 
			
		||||
                Block block = newState.getBlock();
 | 
			
		||||
                if (BlockUtils.isWithinWorldBounds(block)) {
 | 
			
		||||
                    BlockUtils.setUnnaturalBlock(block);
 | 
			
		||||
@@ -317,7 +319,7 @@ public class BlockListener implements Listener {
 | 
			
		||||
    @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
 | 
			
		||||
    public void onBlockBreak(BlockBreakEvent event) {
 | 
			
		||||
        /* WORLD BLACKLIST CHECK */
 | 
			
		||||
        Block block = event.getBlock();
 | 
			
		||||
        final Block block = event.getBlock();
 | 
			
		||||
 | 
			
		||||
        if (event instanceof FakeBlockBreakEvent) {
 | 
			
		||||
            return;
 | 
			
		||||
@@ -336,16 +338,14 @@ public class BlockListener implements Listener {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        BlockState blockState = block.getState();
 | 
			
		||||
        Location location = blockState.getLocation();
 | 
			
		||||
 | 
			
		||||
//        if (!BlockUtils.shouldBeWatched(blockState)) {
 | 
			
		||||
//            return;
 | 
			
		||||
//        }
 | 
			
		||||
        final Location location = block.getLocation();
 | 
			
		||||
 | 
			
		||||
        /* ALCHEMY - Cancel any brew in progress for that BrewingStand */
 | 
			
		||||
        if (blockState instanceof BrewingStand && Alchemy.brewingStandMap.containsKey(location)) {
 | 
			
		||||
            Alchemy.brewingStandMap.get(location).cancelBrew();
 | 
			
		||||
        if (block.getType() == Material.BREWING_STAND) {
 | 
			
		||||
            final BlockState blockState = block.getState();
 | 
			
		||||
                if (blockState instanceof BrewingStand && Alchemy.brewingStandMap.containsKey(location)) {
 | 
			
		||||
                    Alchemy.brewingStandMap.get(location).cancelBrew();
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Player player = event.getPlayer();
 | 
			
		||||
@@ -368,7 +368,7 @@ public class BlockListener implements Listener {
 | 
			
		||||
        ItemStack heldItem = player.getInventory().getItemInMainHand();
 | 
			
		||||
 | 
			
		||||
        /* HERBALISM */
 | 
			
		||||
        if (BlockUtils.affectedByGreenTerra(blockState)) {
 | 
			
		||||
        if (BlockUtils.affectedByGreenTerra(block)) {
 | 
			
		||||
            HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager();
 | 
			
		||||
 | 
			
		||||
            /* Green Terra */
 | 
			
		||||
@@ -391,39 +391,40 @@ public class BlockListener implements Listener {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* MINING */
 | 
			
		||||
        else if (BlockUtils.affectedBySuperBreaker(blockState)
 | 
			
		||||
        else if (BlockUtils.affectedBySuperBreaker(block)
 | 
			
		||||
                && (ItemUtils.isPickaxe(heldItem) || ItemUtils.isHoe(heldItem))
 | 
			
		||||
                && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.MINING)
 | 
			
		||||
                && !mcMMO.getUserBlockTracker().isIneligible(blockState)) {
 | 
			
		||||
                && !mcMMO.getUserBlockTracker().isIneligible(block)) {
 | 
			
		||||
            MiningManager miningManager = mcMMOPlayer.getMiningManager();
 | 
			
		||||
            miningManager.miningBlockCheck(blockState);
 | 
			
		||||
            miningManager.miningBlockCheck(block);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* WOOD CUTTING */
 | 
			
		||||
        else if (BlockUtils.hasWoodcuttingXP(blockState) && ItemUtils.isAxe(heldItem)
 | 
			
		||||
                && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.WOODCUTTING) && !mcMMO.getUserBlockTracker().isIneligible(blockState)) {
 | 
			
		||||
        else if (BlockUtils.hasWoodcuttingXP(block) && ItemUtils.isAxe(heldItem)
 | 
			
		||||
                && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.WOODCUTTING)
 | 
			
		||||
                && !mcMMO.getUserBlockTracker().isIneligible(block)) {
 | 
			
		||||
            WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager();
 | 
			
		||||
            if (woodcuttingManager.canUseTreeFeller(heldItem)) {
 | 
			
		||||
                woodcuttingManager.processTreeFeller(blockState);
 | 
			
		||||
                woodcuttingManager.processTreeFeller(block);
 | 
			
		||||
            } else {
 | 
			
		||||
                //Check for XP
 | 
			
		||||
                woodcuttingManager.processWoodcuttingBlockXP(blockState);
 | 
			
		||||
                woodcuttingManager.processWoodcuttingBlockXP(block);
 | 
			
		||||
 | 
			
		||||
                //Check for bonus drops
 | 
			
		||||
                woodcuttingManager.processBonusDropCheck(blockState);
 | 
			
		||||
                woodcuttingManager.processBonusDropCheck(block);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* EXCAVATION */
 | 
			
		||||
        else if (BlockUtils.affectedByGigaDrillBreaker(blockState)
 | 
			
		||||
        else if (BlockUtils.affectedByGigaDrillBreaker(block)
 | 
			
		||||
                && ItemUtils.isShovel(heldItem)
 | 
			
		||||
                && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.EXCAVATION)
 | 
			
		||||
                && !mcMMO.getUserBlockTracker().isIneligible(blockState)) {
 | 
			
		||||
            ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager();
 | 
			
		||||
            excavationManager.excavationBlockCheck(blockState);
 | 
			
		||||
                && !mcMMO.getUserBlockTracker().isIneligible(block)) {
 | 
			
		||||
            final ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager();
 | 
			
		||||
            excavationManager.excavationBlockCheck(block);
 | 
			
		||||
 | 
			
		||||
            if (mcMMOPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER)) {
 | 
			
		||||
                excavationManager.gigaDrillBreaker(blockState);
 | 
			
		||||
                excavationManager.gigaDrillBreaker(block);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -498,8 +499,8 @@ public class BlockListener implements Listener {
 | 
			
		||||
     */
 | 
			
		||||
    @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
 | 
			
		||||
    public void onBlockDamage(BlockDamageEvent event) {
 | 
			
		||||
        Player player = event.getPlayer();
 | 
			
		||||
        BlockState blockState = event.getBlock().getState();
 | 
			
		||||
        final Player player = event.getPlayer();
 | 
			
		||||
        final Block block = event.getBlock();
 | 
			
		||||
 | 
			
		||||
        /* WORLD BLACKLIST CHECK */
 | 
			
		||||
        if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
 | 
			
		||||
@@ -530,31 +531,35 @@ public class BlockListener implements Listener {
 | 
			
		||||
         *
 | 
			
		||||
         * We check permissions here before processing activation.
 | 
			
		||||
         */
 | 
			
		||||
        if (BlockUtils.canActivateAbilities(blockState)) {
 | 
			
		||||
        if (BlockUtils.canActivateAbilities(block)) {
 | 
			
		||||
            ItemStack heldItem = player.getInventory().getItemInMainHand();
 | 
			
		||||
 | 
			
		||||
            if (mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && ItemUtils.isHoe(heldItem) && (BlockUtils.affectedByGreenTerra(blockState) || BlockUtils.canMakeMossy(blockState)) && Permissions.greenTerra(player)) {
 | 
			
		||||
            if (mcMMOPlayer.getToolPreparationMode(ToolType.HOE)
 | 
			
		||||
                    && ItemUtils.isHoe(heldItem)
 | 
			
		||||
                    && (BlockUtils.affectedByGreenTerra(block)
 | 
			
		||||
                    || BlockUtils.canMakeMossy(block))
 | 
			
		||||
                    && Permissions.greenTerra(player)) {
 | 
			
		||||
                mcMMOPlayer.checkAbilityActivation(PrimarySkillType.HERBALISM);
 | 
			
		||||
            } else if (mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && ItemUtils.isAxe(heldItem) && BlockUtils.hasWoodcuttingXP(blockState) && Permissions.treeFeller(player)) {
 | 
			
		||||
            } else if (mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && ItemUtils.isAxe(heldItem) && BlockUtils.hasWoodcuttingXP(block) && Permissions.treeFeller(player)) {
 | 
			
		||||
                mcMMOPlayer.checkAbilityActivation(PrimarySkillType.WOODCUTTING);
 | 
			
		||||
            } else if (mcMMOPlayer.getToolPreparationMode(ToolType.PICKAXE) && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) {
 | 
			
		||||
            } else if (mcMMOPlayer.getToolPreparationMode(ToolType.PICKAXE) && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(block) && Permissions.superBreaker(player)) {
 | 
			
		||||
                mcMMOPlayer.checkAbilityActivation(PrimarySkillType.MINING);
 | 
			
		||||
            } else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(blockState) && Permissions.gigaDrillBreaker(player)) {
 | 
			
		||||
            } else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(block) && Permissions.gigaDrillBreaker(player)) {
 | 
			
		||||
                mcMMOPlayer.checkAbilityActivation(PrimarySkillType.EXCAVATION);
 | 
			
		||||
            } else if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && heldItem.getType() == Material.AIR && (BlockUtils.affectedByGigaDrillBreaker(blockState)
 | 
			
		||||
                    || mcMMO.getMaterialMapStore().isGlass(blockState.getType())
 | 
			
		||||
                    || blockState.getType() == Material.SNOW
 | 
			
		||||
                    || BlockUtils.affectedByBlockCracker(blockState) && Permissions.berserk(player))) {
 | 
			
		||||
            } else if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && heldItem.getType() == Material.AIR && (BlockUtils.affectedByGigaDrillBreaker(block)
 | 
			
		||||
                    || mcMMO.getMaterialMapStore().isGlass(block.getType())
 | 
			
		||||
                    || block.getType() == Material.SNOW
 | 
			
		||||
                    || BlockUtils.affectedByBlockCracker(block) && Permissions.berserk(player))) {
 | 
			
		||||
                mcMMOPlayer.checkAbilityActivation(PrimarySkillType.UNARMED);
 | 
			
		||||
 | 
			
		||||
                if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK)) {
 | 
			
		||||
                    if (SuperAbilityType.BERSERK.blockCheck(blockState) && EventUtils.simulateBlockBreak(blockState.getBlock(), player)) {
 | 
			
		||||
                    if (SuperAbilityType.BERSERK.blockCheck(block) && EventUtils.simulateBlockBreak(block, player)) {
 | 
			
		||||
                        event.setInstaBreak(true);
 | 
			
		||||
 | 
			
		||||
                        if (blockState.getType().getKey().getKey().contains("glass")) {
 | 
			
		||||
                            SoundManager.worldSendSound(player.getWorld(), blockState.getLocation(), SoundType.GLASS);
 | 
			
		||||
                        if (block.getType().getKey().getKey().contains("glass")) {
 | 
			
		||||
                            SoundManager.worldSendSound(player.getWorld(), block.getLocation(), SoundType.GLASS);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            SoundManager.sendSound(player, blockState.getLocation(), SoundType.POP);
 | 
			
		||||
                            SoundManager.sendSound(player, block.getLocation(), SoundType.POP);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@@ -566,8 +571,8 @@ public class BlockListener implements Listener {
 | 
			
		||||
         *
 | 
			
		||||
         * We don't need to check permissions here because they've already been checked for the ability to even activate.
 | 
			
		||||
         */
 | 
			
		||||
        if (mcMMOPlayer.getAbilityMode(SuperAbilityType.TREE_FELLER) && BlockUtils.hasWoodcuttingXP(blockState) && mcMMO.p.getGeneralConfig().getTreeFellerSoundsEnabled()) {
 | 
			
		||||
            SoundManager.sendSound(player, blockState.getLocation(), SoundType.FIZZ);
 | 
			
		||||
        if (mcMMOPlayer.getAbilityMode(SuperAbilityType.TREE_FELLER) && BlockUtils.hasWoodcuttingXP(block) && mcMMO.p.getGeneralConfig().getTreeFellerSoundsEnabled()) {
 | 
			
		||||
            SoundManager.sendSound(player, block.getLocation(), SoundType.FIZZ);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -598,41 +603,38 @@ public class BlockListener implements Listener {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 | 
			
		||||
        final McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 | 
			
		||||
 | 
			
		||||
        //Profile not loaded
 | 
			
		||||
        if (UserManager.getPlayer(player) == null) {
 | 
			
		||||
        if (mcMMOPlayer == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ItemStack heldItem = player.getInventory().getItemInMainHand();
 | 
			
		||||
        Block block = event.getBlock();
 | 
			
		||||
        BlockState blockState = block.getState();
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
         * ABILITY TRIGGER CHECKS
 | 
			
		||||
         *
 | 
			
		||||
         * We don't need to check permissions here because they've already been checked for the ability to even activate.
 | 
			
		||||
         */
 | 
			
		||||
        if (mcMMOPlayer.getAbilityMode(SuperAbilityType.GREEN_TERRA) && BlockUtils.canMakeMossy(blockState)) {
 | 
			
		||||
            if (mcMMOPlayer.getHerbalismManager().processGreenTerraBlockConversion(blockState)) {
 | 
			
		||||
                blockState.update(true);
 | 
			
		||||
            }
 | 
			
		||||
        if (mcMMOPlayer.getAbilityMode(SuperAbilityType.GREEN_TERRA) && BlockUtils.canMakeMossy(block)) {
 | 
			
		||||
            mcMMOPlayer.getHerbalismManager().processGreenTerraBlockConversion(block);
 | 
			
		||||
        } else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && (heldItem.getType() == Material.AIR || mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed())) {
 | 
			
		||||
            if (mcMMOPlayer.getUnarmedManager().canUseBlockCracker() && BlockUtils.affectedByBlockCracker(blockState)) {
 | 
			
		||||
                if (EventUtils.simulateBlockBreak(block, player) && mcMMOPlayer.getUnarmedManager().blockCrackerCheck(blockState)) {
 | 
			
		||||
                    blockState.update();
 | 
			
		||||
            if (mcMMOPlayer.getUnarmedManager().canUseBlockCracker() && BlockUtils.affectedByBlockCracker(block)) {
 | 
			
		||||
                if (EventUtils.simulateBlockBreak(block, player)) {
 | 
			
		||||
                    mcMMOPlayer.getUnarmedManager().blockCrackerCheck(block.getState());
 | 
			
		||||
                }
 | 
			
		||||
            } else if (!event.getInstaBreak() && SuperAbilityType.BERSERK.blockCheck(blockState) && EventUtils.simulateBlockBreak(block, player)) {
 | 
			
		||||
            } else if (!event.getInstaBreak() && SuperAbilityType.BERSERK.blockCheck(block)
 | 
			
		||||
                    && EventUtils.simulateBlockBreak(block, player)) {
 | 
			
		||||
                event.setInstaBreak(true);
 | 
			
		||||
 | 
			
		||||
                if (blockState.getType().getKey().getKey().contains("glass")) {
 | 
			
		||||
                if (block.getType().getKey().getKey().contains("glass")) {
 | 
			
		||||
                    SoundManager.worldSendSound(player.getWorld(), block.getLocation(), SoundType.GLASS);
 | 
			
		||||
                } else {
 | 
			
		||||
                    SoundManager.sendSound(player, block.getLocation(), SoundType.POP);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else if (mcMMOPlayer.getWoodcuttingManager().canUseLeafBlower(heldItem) && BlockUtils.isNonWoodPartOfTree(blockState) && EventUtils.simulateBlockBreak(block, player)) {
 | 
			
		||||
        } else if (mcMMOPlayer.getWoodcuttingManager().canUseLeafBlower(heldItem) && BlockUtils.isNonWoodPartOfTree(block) && EventUtils.simulateBlockBreak(block, player)) {
 | 
			
		||||
            event.setInstaBreak(true);
 | 
			
		||||
            SoundManager.sendSound(player, block.getLocation(), SoundType.POP);
 | 
			
		||||
        }
 | 
			
		||||
@@ -648,29 +650,30 @@ public class BlockListener implements Listener {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        BlockState blockState = event.getBlock().getState();
 | 
			
		||||
 | 
			
		||||
        ItemStack heldItem = player.getInventory().getItemInMainHand();
 | 
			
		||||
 | 
			
		||||
        cleanupAbilityTools(player, mcMMOPlayer, blockState, heldItem);
 | 
			
		||||
        cleanupAbilityTools(mcMMOPlayer, event.getBlock(), heldItem);
 | 
			
		||||
 | 
			
		||||
        debugStickDump(player, blockState);
 | 
			
		||||
        debugStickDump(player, event.getBlock());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //TODO: Rewrite this
 | 
			
		||||
    //TODO: Convert into locale strings
 | 
			
		||||
    private void debugStickDump(Player player, BlockState blockState) {
 | 
			
		||||
    private void debugStickDump(Player player, Block block) {
 | 
			
		||||
        //Profile not loaded
 | 
			
		||||
        if (UserManager.getPlayer(player) == null) {
 | 
			
		||||
        final McMMOPlayer mmoPlayer = UserManager.getPlayer(player);
 | 
			
		||||
        if (mmoPlayer == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (UserManager.getPlayer(player).isDebugMode()) {
 | 
			
		||||
        final BlockState blockState = block.getState();
 | 
			
		||||
 | 
			
		||||
        if (mmoPlayer.isDebugMode()) {
 | 
			
		||||
            if (mcMMO.getUserBlockTracker().isIneligible(blockState))
 | 
			
		||||
                player.sendMessage("[mcMMO DEBUG] This block is not natural and does not reward treasures/XP");
 | 
			
		||||
            else {
 | 
			
		||||
                player.sendMessage("[mcMMO DEBUG] This block is considered natural by mcMMO");
 | 
			
		||||
                UserManager.getPlayer(player).getExcavationManager().printExcavationDebug(player, blockState);
 | 
			
		||||
                mmoPlayer.getExcavationManager().printExcavationDebug(player, block);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (WorldGuardUtils.isWorldGuardLoaded()) {
 | 
			
		||||
@@ -704,14 +707,26 @@ public class BlockListener implements Listener {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void cleanupAbilityTools(Player player, McMMOPlayer mcMMOPlayer, BlockState blockState, ItemStack heldItem) {
 | 
			
		||||
    /**
 | 
			
		||||
     * Clean up ability tools after a block break event.
 | 
			
		||||
     * @param mmoPlayer The player
 | 
			
		||||
     * @param block The block
 | 
			
		||||
     * @param heldItem The item in the player's hand
 | 
			
		||||
     */
 | 
			
		||||
    private void cleanupAbilityTools(McMMOPlayer mmoPlayer, Block block, ItemStack heldItem) {
 | 
			
		||||
        if (HiddenConfig.getInstance().useEnchantmentBuffs()) {
 | 
			
		||||
            if ((ItemUtils.isPickaxe(heldItem) && !mcMMOPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER)) || (ItemUtils.isShovel(heldItem) && !mcMMOPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER))) {
 | 
			
		||||
            if ((ItemUtils.isPickaxe(heldItem)
 | 
			
		||||
                    && !mmoPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER))
 | 
			
		||||
                    || (ItemUtils.isShovel(heldItem)
 | 
			
		||||
                    && !mmoPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER))) {
 | 
			
		||||
                SkillUtils.removeAbilityBuff(heldItem);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            if ((mcMMOPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER) && !BlockUtils.affectedBySuperBreaker(blockState)) || (mcMMOPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER) && !BlockUtils.affectedByGigaDrillBreaker(blockState))) {
 | 
			
		||||
                SkillUtils.removeAbilityBoostsFromInventory(player);
 | 
			
		||||
            if ((mmoPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER)
 | 
			
		||||
                    && !BlockUtils.affectedBySuperBreaker(block))
 | 
			
		||||
                    || (mmoPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER)
 | 
			
		||||
                    && !BlockUtils.affectedByGigaDrillBreaker(block))) {
 | 
			
		||||
                SkillUtils.removeAbilityBoostsFromInventory(mmoPlayer.getPlayer());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -4,10 +4,6 @@ import com.gmail.nossr50.chat.ChatManager;
 | 
			
		||||
import com.gmail.nossr50.commands.CommandManager;
 | 
			
		||||
import com.gmail.nossr50.config.*;
 | 
			
		||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
 | 
			
		||||
import com.gmail.nossr50.config.mods.ArmorConfigManager;
 | 
			
		||||
import com.gmail.nossr50.config.mods.BlockConfigManager;
 | 
			
		||||
import com.gmail.nossr50.config.mods.EntityConfigManager;
 | 
			
		||||
import com.gmail.nossr50.config.mods.ToolConfigManager;
 | 
			
		||||
import com.gmail.nossr50.config.party.PartyConfig;
 | 
			
		||||
import com.gmail.nossr50.config.skills.alchemy.PotionConfig;
 | 
			
		||||
import com.gmail.nossr50.config.skills.repair.RepairConfigManager;
 | 
			
		||||
@@ -82,7 +78,6 @@ public class mcMMO extends JavaPlugin {
 | 
			
		||||
    private static ChunkManager chunkManager;
 | 
			
		||||
    private static RepairableManager repairableManager;
 | 
			
		||||
    private static SalvageableManager salvageableManager;
 | 
			
		||||
    private static ModManager modManager;
 | 
			
		||||
    private static DatabaseManager databaseManager;
 | 
			
		||||
    private static FormulaManager formulaManager;
 | 
			
		||||
    private static UpgradeManager upgradeManager;
 | 
			
		||||
@@ -188,8 +183,6 @@ public class mcMMO extends JavaPlugin {
 | 
			
		||||
 | 
			
		||||
            upgradeManager = new UpgradeManager();
 | 
			
		||||
 | 
			
		||||
            modManager = new ModManager();
 | 
			
		||||
 | 
			
		||||
            // Init Material Maps
 | 
			
		||||
            materialMapStore = new MaterialMapStore();
 | 
			
		||||
            // Init compatibility mappers
 | 
			
		||||
@@ -474,10 +467,6 @@ public class mcMMO extends JavaPlugin {
 | 
			
		||||
        return databaseManager;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ModManager getModManager() {
 | 
			
		||||
        return modManager;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static UpgradeManager getUpgradeManager() {
 | 
			
		||||
        return upgradeManager;
 | 
			
		||||
    }
 | 
			
		||||
@@ -576,25 +565,8 @@ public class mcMMO extends JavaPlugin {
 | 
			
		||||
 | 
			
		||||
        List<Repairable> repairables = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        if (generalConfig.getToolModsEnabled()) {
 | 
			
		||||
            new ToolConfigManager(this);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (generalConfig.getArmorModsEnabled()) {
 | 
			
		||||
            new ArmorConfigManager(this);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (generalConfig.getBlockModsEnabled()) {
 | 
			
		||||
            new BlockConfigManager(this);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (generalConfig.getEntityModsEnabled()) {
 | 
			
		||||
            new EntityConfigManager(this);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Load repair configs, make manager, and register them at this time
 | 
			
		||||
        repairables.addAll(new RepairConfigManager(this).getLoadedRepairables());
 | 
			
		||||
        repairables.addAll(modManager.getLoadedRepairables());
 | 
			
		||||
        repairableManager = new SimpleRepairableManager(repairables.size());
 | 
			
		||||
        repairableManager.registerRepairables(repairables);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,8 @@
 | 
			
		||||
package com.gmail.nossr50.skills.excavation;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
 | 
			
		||||
import com.gmail.nossr50.config.treasure.TreasureConfig;
 | 
			
		||||
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 | 
			
		||||
import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import org.bukkit.block.BlockState;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
@@ -16,23 +13,13 @@ public class Excavation {
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the list of possible {@link ExcavationTreasure|ExcavationTreasures} obtained from a given block.
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState The {@link BlockState} of the block to check.
 | 
			
		||||
     * @param block The {@link Block} to check for treasures
 | 
			
		||||
     * @return the list of treasures that could be found
 | 
			
		||||
     */
 | 
			
		||||
    protected static List<ExcavationTreasure> getTreasures(BlockState blockState) {
 | 
			
		||||
        String friendly = getMaterialConfigString(blockState.getBlockData().getMaterial());
 | 
			
		||||
    protected static List<ExcavationTreasure> getTreasures(Block block) {
 | 
			
		||||
        String friendly = getMaterialConfigString(block.getBlockData().getMaterial());
 | 
			
		||||
        if (TreasureConfig.getInstance().excavationMap.containsKey(friendly))
 | 
			
		||||
            return TreasureConfig.getInstance().excavationMap.get(friendly);
 | 
			
		||||
        return new ArrayList<>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static int getBlockXP(BlockState blockState) {
 | 
			
		||||
        int xp = ExperienceConfig.getInstance().getXp(PrimarySkillType.EXCAVATION, blockState.getType());
 | 
			
		||||
 | 
			
		||||
        if (xp == 0 && mcMMO.getModManager().isCustomExcavationBlock(blockState)) {
 | 
			
		||||
            xp = mcMMO.getModManager().getBlock(blockState).getXpGain();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return xp;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package com.gmail.nossr50.skills.excavation;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.api.ItemSpawnReason;
 | 
			
		||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
 | 
			
		||||
import com.gmail.nossr50.datatypes.experience.XPGainReason;
 | 
			
		||||
import com.gmail.nossr50.datatypes.experience.XPGainSource;
 | 
			
		||||
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 | 
			
		||||
@@ -16,6 +17,7 @@ import com.gmail.nossr50.util.random.ProbabilityUtil;
 | 
			
		||||
import com.gmail.nossr50.util.skills.RankUtils;
 | 
			
		||||
import com.gmail.nossr50.util.skills.SkillUtils;
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.block.BlockState;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
@@ -35,21 +37,27 @@ public class ExcavationManager extends SkillManager {
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState The {@link BlockState} to check ability activation for
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    public void excavationBlockCheck(BlockState blockState) {
 | 
			
		||||
        int xp = Excavation.getBlockXP(blockState);
 | 
			
		||||
        requireNonNull(blockState, "excavationBlockCheck: blockState cannot be null");
 | 
			
		||||
        excavationBlockCheck(blockState.getBlock());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public void excavationBlockCheck(Block block) {
 | 
			
		||||
        int xp = ExperienceConfig.getInstance().getXp(PrimarySkillType.EXCAVATION, block.getType());
 | 
			
		||||
        requireNonNull(block, "excavationBlockCheck: block cannot be null");
 | 
			
		||||
        if (Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.EXCAVATION_ARCHAEOLOGY)) {
 | 
			
		||||
            List<ExcavationTreasure> treasures = getTreasures(blockState);
 | 
			
		||||
            List<ExcavationTreasure> treasures = getTreasures(block);
 | 
			
		||||
 | 
			
		||||
            if (!treasures.isEmpty()) {
 | 
			
		||||
                int skillLevel = getSkillLevel();
 | 
			
		||||
                Location location = Misc.getBlockCenter(blockState);
 | 
			
		||||
                Location location = Misc.getBlockCenter(block);
 | 
			
		||||
 | 
			
		||||
                for (ExcavationTreasure treasure : treasures) {
 | 
			
		||||
                    if (skillLevel >= treasure.getDropLevel()
 | 
			
		||||
                            && ProbabilityUtil.isStaticSkillRNGSuccessful(
 | 
			
		||||
                                    PrimarySkillType.EXCAVATION, mmoPlayer, treasure.getDropProbability())) {
 | 
			
		||||
                        processExcavationBonusesOnBlock(blockState, treasure, location);
 | 
			
		||||
                            PrimarySkillType.EXCAVATION, mmoPlayer, treasure.getDropProbability())) {
 | 
			
		||||
                        processExcavationBonusesOnBlock(treasure, location);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -58,14 +66,24 @@ public class ExcavationManager extends SkillManager {
 | 
			
		||||
        applyXpGain(xp, XPGainReason.PVE, XPGainSource.SELF);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @VisibleForTesting
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    public List<ExcavationTreasure> getTreasures(@NotNull BlockState blockState) {
 | 
			
		||||
        requireNonNull(blockState, "blockState cannot be null");
 | 
			
		||||
        return Excavation.getTreasures(blockState);
 | 
			
		||||
        return getTreasures(blockState.getBlock());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<ExcavationTreasure> getTreasures(@NotNull Block block) {
 | 
			
		||||
        requireNonNull(block, "block cannot be null");
 | 
			
		||||
        return Excavation.getTreasures(block);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @VisibleForTesting
 | 
			
		||||
    public void processExcavationBonusesOnBlock(BlockState blockState, ExcavationTreasure treasure, Location location) {
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    public void processExcavationBonusesOnBlock(BlockState ignored, ExcavationTreasure treasure, Location location) {
 | 
			
		||||
        processExcavationBonusesOnBlock(treasure, location);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void processExcavationBonusesOnBlock(ExcavationTreasure treasure, Location location) {
 | 
			
		||||
        //Spawn Vanilla XP orbs if a dice roll succeeds
 | 
			
		||||
        if (ProbabilityUtil.isStaticSkillRNGSuccessful(
 | 
			
		||||
                PrimarySkillType.EXCAVATION, mmoPlayer, getArchaelogyExperienceOrbChance())) {
 | 
			
		||||
@@ -92,9 +110,9 @@ public class ExcavationManager extends SkillManager {
 | 
			
		||||
        return RankUtils.getRank(getPlayer(), SubSkillType.EXCAVATION_ARCHAEOLOGY);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void printExcavationDebug(Player player, BlockState blockState) {
 | 
			
		||||
    public void printExcavationDebug(Player player, Block block) {
 | 
			
		||||
        if (Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.EXCAVATION_ARCHAEOLOGY)) {
 | 
			
		||||
            List<ExcavationTreasure> treasures = Excavation.getTreasures(blockState);
 | 
			
		||||
            List<ExcavationTreasure> treasures = Excavation.getTreasures(block);
 | 
			
		||||
 | 
			
		||||
            if (!treasures.isEmpty()) {
 | 
			
		||||
                for (ExcavationTreasure treasure : treasures) {
 | 
			
		||||
@@ -113,12 +131,12 @@ public class ExcavationManager extends SkillManager {
 | 
			
		||||
    /**
 | 
			
		||||
     * Process the Giga Drill Breaker ability.
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState The {@link BlockState} to check ability activation for
 | 
			
		||||
     * @param block The {@link Block} to check ability activation for
 | 
			
		||||
     */
 | 
			
		||||
    public void gigaDrillBreaker(BlockState blockState) {
 | 
			
		||||
        excavationBlockCheck(blockState);
 | 
			
		||||
        excavationBlockCheck(blockState);
 | 
			
		||||
    public void gigaDrillBreaker(Block block) {
 | 
			
		||||
        excavationBlockCheck(block);
 | 
			
		||||
 | 
			
		||||
        SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), mcMMO.p.getGeneralConfig().getAbilityToolDamage());
 | 
			
		||||
        SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(),
 | 
			
		||||
                mcMMO.p.getGeneralConfig().getAbilityToolDamage());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -184,31 +184,36 @@ public class HerbalismManager extends SkillManager {
 | 
			
		||||
        return SkillUtils.handleFoodSkills(getPlayer(), eventFoodLevel, SubSkillType.HERBALISM_FARMERS_DIET);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Process the Green Terra ability.
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState The {@link BlockState} to check ability activation for
 | 
			
		||||
     * @return true if the ability was successful, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public boolean processGreenTerraBlockConversion(BlockState blockState) {
 | 
			
		||||
        Player player = getPlayer();
 | 
			
		||||
    public void processGreenTerraBlockConversion(BlockState blockState) {
 | 
			
		||||
        final Player player = getPlayer();
 | 
			
		||||
 | 
			
		||||
        if (!Permissions.greenThumbBlock(player, blockState.getType())) {
 | 
			
		||||
            return false;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        PlayerInventory playerInventory = player.getInventory();
 | 
			
		||||
        ItemStack seed = new ItemStack(Material.WHEAT_SEEDS);
 | 
			
		||||
 | 
			
		||||
        if (!playerInventory.containsAtLeast(seed, 1)) {
 | 
			
		||||
            NotificationManager.sendPlayerInformation(player, NotificationType.REQUIREMENTS_NOT_MET, "Herbalism.Ability.GTe.NeedMore");
 | 
			
		||||
            return false;
 | 
			
		||||
            NotificationManager.sendPlayerInformation(player,
 | 
			
		||||
                    NotificationType.REQUIREMENTS_NOT_MET, "Herbalism.Ability.GTe.NeedMore");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        playerInventory.removeItem(seed);
 | 
			
		||||
        player.updateInventory(); // Needed until replacement available
 | 
			
		||||
        // player.updateInventory();
 | 
			
		||||
 | 
			
		||||
        return Herbalism.convertGreenTerraBlocks(blockState);
 | 
			
		||||
        Herbalism.convertGreenTerraBlocks(blockState);
 | 
			
		||||
        blockState.update(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Process the Green Terra ability.
 | 
			
		||||
     *
 | 
			
		||||
     * @param block The {@link Block} to check ability activation for
 | 
			
		||||
     */
 | 
			
		||||
    public void processGreenTerraBlockConversion(Block block) {
 | 
			
		||||
        processGreenTerraBlockConversion(block.getState());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -363,13 +368,13 @@ public class HerbalismManager extends SkillManager {
 | 
			
		||||
                if (plantData instanceof Ageable ageable) {
 | 
			
		||||
 | 
			
		||||
                    if (isAgeableMature(ageable) || isBizarreAgeable(plantData)) {
 | 
			
		||||
                        if (checkDoubleDrop(brokenPlantState)) {
 | 
			
		||||
                            markForBonusDrops(brokenPlantState);
 | 
			
		||||
                        if (checkDoubleDrop(brokenPlant)) {
 | 
			
		||||
                            markForBonusDrops(brokenPlant);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                } else if (checkDoubleDrop(brokenPlantState)) {
 | 
			
		||||
                } else if (checkDoubleDrop(brokenPlant)) {
 | 
			
		||||
                    //Add metadata to mark this block for double or triple drops
 | 
			
		||||
                    markForBonusDrops(brokenPlantState);
 | 
			
		||||
                    markForBonusDrops(brokenPlant);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
 | 
			
		||||
@@ -379,10 +384,10 @@ public class HerbalismManager extends SkillManager {
 | 
			
		||||
                 *
 | 
			
		||||
                 */
 | 
			
		||||
 | 
			
		||||
                //If it's a Crop we need to reward XP when its fully grown
 | 
			
		||||
                //If it's a crop, we need to reward XP when its fully grown
 | 
			
		||||
                if (isAgeableAndFullyMature(plantData) && !isBizarreAgeable(plantData)) {
 | 
			
		||||
                    //Add metadata to mark this block for double or triple drops
 | 
			
		||||
                    markForBonusDrops(brokenPlantState);
 | 
			
		||||
                    markForBonusDrops(brokenPlant);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -405,10 +410,14 @@ public class HerbalismManager extends SkillManager {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void markForBonusDrops(BlockState brokenPlantState) {
 | 
			
		||||
    /**
 | 
			
		||||
     * Mark a block for bonus drops.
 | 
			
		||||
     * @param block the block to mark
 | 
			
		||||
     */
 | 
			
		||||
    public void markForBonusDrops(Block block) {
 | 
			
		||||
        //Add metadata to mark this block for double or triple drops
 | 
			
		||||
        boolean awardTriple = mmoPlayer.getAbilityMode(SuperAbilityType.GREEN_TERRA);
 | 
			
		||||
        BlockUtils.markDropsAsBonus(brokenPlantState, awardTriple);
 | 
			
		||||
        BlockUtils.markDropsAsBonus(block, awardTriple);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -681,12 +690,12 @@ public class HerbalismManager extends SkillManager {
 | 
			
		||||
    /**
 | 
			
		||||
     * Check for success on herbalism double drops
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState target block state
 | 
			
		||||
     * @param block target block state
 | 
			
		||||
     * @return true if the double drop succeeds
 | 
			
		||||
     */
 | 
			
		||||
    private boolean checkDoubleDrop(@NotNull BlockState blockState) {
 | 
			
		||||
        requireNonNull(blockState, "BlockState cannot be null");
 | 
			
		||||
        return BlockUtils.checkDoubleDrops(mmoPlayer, blockState, SubSkillType.HERBALISM_DOUBLE_DROPS);
 | 
			
		||||
    private boolean checkDoubleDrop(@NotNull Block block) {
 | 
			
		||||
        requireNonNull(block, "BlockState cannot be null");
 | 
			
		||||
        return BlockUtils.checkDoubleDrops(mmoPlayer, block, SubSkillType.HERBALISM_DOUBLE_DROPS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +0,0 @@
 | 
			
		||||
package com.gmail.nossr50.skills.mining;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
 | 
			
		||||
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import org.bukkit.block.BlockState;
 | 
			
		||||
 | 
			
		||||
public class Mining {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Calculate XP gain for Mining.
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState The {@link BlockState} to check ability activation for
 | 
			
		||||
     */
 | 
			
		||||
    public static int getBlockXp(BlockState blockState) {
 | 
			
		||||
        int xp = ExperienceConfig.getInstance().getXp(PrimarySkillType.MINING, blockState.getType());
 | 
			
		||||
 | 
			
		||||
        if (xp == 0 && mcMMO.getModManager().isCustomMiningBlock(blockState)) {
 | 
			
		||||
            xp = mcMMO.getModManager().getBlock(blockState).getXpGain();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return xp;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -85,10 +85,15 @@ public class MiningManager extends SkillManager {
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState The {@link BlockState} to check ability activation for
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(since = "2.2.024", forRemoval = true)
 | 
			
		||||
    public void miningBlockCheck(BlockState blockState) {
 | 
			
		||||
        miningBlockCheck(blockState.getBlock());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void miningBlockCheck(Block block) {
 | 
			
		||||
        Player player = getPlayer();
 | 
			
		||||
 | 
			
		||||
        applyXpGain(Mining.getBlockXp(blockState), XPGainReason.PVE);
 | 
			
		||||
        applyXpGain(ExperienceConfig.getInstance().getXp(PrimarySkillType.MINING, block), XPGainReason.PVE);
 | 
			
		||||
 | 
			
		||||
        if (!Permissions.isSubSkillEnabled(player, SubSkillType.MINING_DOUBLE_DROPS)) {
 | 
			
		||||
            return;
 | 
			
		||||
@@ -98,7 +103,7 @@ public class MiningManager extends SkillManager {
 | 
			
		||||
            SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), mcMMO.p.getGeneralConfig().getAbilityToolDamage());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.MINING, blockState.getType()) || !canDoubleDrop())
 | 
			
		||||
        if (!mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.MINING, block.getType()) || !canDoubleDrop())
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        boolean silkTouch = player.getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH);
 | 
			
		||||
@@ -109,30 +114,31 @@ public class MiningManager extends SkillManager {
 | 
			
		||||
        //Mining mastery allows for a chance of triple drops
 | 
			
		||||
        if (canMotherLode()) {
 | 
			
		||||
            //Triple Drops failed so do a normal double drops check
 | 
			
		||||
            if (!processTripleDrops(blockState)) {
 | 
			
		||||
                processDoubleDrops(blockState);
 | 
			
		||||
            if (!processTripleDrops(block)) {
 | 
			
		||||
                processDoubleDrops(block);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            //If the user has no mastery, proceed with normal double drop routine
 | 
			
		||||
            processDoubleDrops(blockState);
 | 
			
		||||
            processDoubleDrops(block);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean processTripleDrops(@NotNull BlockState blockState) {
 | 
			
		||||
    private boolean processTripleDrops(@NotNull Block block) {
 | 
			
		||||
        //TODO: Make this readable
 | 
			
		||||
        if (ProbabilityUtil.isSkillRNGSuccessful(SubSkillType.MINING_MOTHER_LODE, mmoPlayer)) {
 | 
			
		||||
            BlockUtils.markDropsAsBonus(blockState, 2);
 | 
			
		||||
            BlockUtils.markDropsAsBonus(block, 2);
 | 
			
		||||
            return true;
 | 
			
		||||
        } else {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void processDoubleDrops(@NotNull BlockState blockState) {
 | 
			
		||||
    private void processDoubleDrops(@NotNull Block block) {
 | 
			
		||||
        //TODO: Make this readable
 | 
			
		||||
        if (ProbabilityUtil.isSkillRNGSuccessful(SubSkillType.MINING_DOUBLE_DROPS, mmoPlayer)) {
 | 
			
		||||
            boolean useTriple = mmoPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER) && mcMMO.p.getAdvancedConfig().getAllowMiningTripleDrops();
 | 
			
		||||
            BlockUtils.markDropsAsBonus(blockState, useTriple);
 | 
			
		||||
            boolean useTriple = mmoPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER)
 | 
			
		||||
                    && mcMMO.p.getAdvancedConfig().getAllowMiningTripleDrops();
 | 
			
		||||
            BlockUtils.markDropsAsBonus(block, useTriple);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -180,59 +186,58 @@ public class MiningManager extends SkillManager {
 | 
			
		||||
 | 
			
		||||
        var increasedYieldFromBonuses = yield + (yield * getOreBonus());
 | 
			
		||||
        // Strip out only stuff that gives mining XP
 | 
			
		||||
        List<BlockState> ores = new ArrayList<>();
 | 
			
		||||
        List<BlockState> notOres = new ArrayList<>();
 | 
			
		||||
        List<Block> ores = new ArrayList<>();
 | 
			
		||||
        List<Block> notOres = new ArrayList<>();
 | 
			
		||||
        for (Block targetBlock : event.blockList()) {
 | 
			
		||||
            BlockState blockState = targetBlock.getState();
 | 
			
		||||
 | 
			
		||||
            if(mcMMO.getUserBlockTracker().isIneligible(targetBlock))
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            if (ExperienceConfig.getInstance().getXp(PrimarySkillType.MINING, targetBlock) != 0) {
 | 
			
		||||
                if (BlockUtils.isOre(blockState) && !(targetBlock instanceof Container)) {
 | 
			
		||||
                    ores.add(blockState);
 | 
			
		||||
                if (BlockUtils.isOre(targetBlock) && !(targetBlock instanceof Container)) {
 | 
			
		||||
                    ores.add(targetBlock);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                notOres.add(blockState);
 | 
			
		||||
                notOres.add(targetBlock);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        int xp = 0;
 | 
			
		||||
        int dropMultiplier = getDropMultiplier();
 | 
			
		||||
 | 
			
		||||
        for(BlockState blockState : notOres) {
 | 
			
		||||
            if (isDropIllegal(blockState.getType()))
 | 
			
		||||
        for(Block block : notOres) {
 | 
			
		||||
            if (isDropIllegal(block.getType()))
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            if (blockState.getType().isItem() && Probability.ofPercent(50).evaluate()) {
 | 
			
		||||
            if (block.getType().isItem() && Probability.ofPercent(50).evaluate()) {
 | 
			
		||||
                ItemUtils.spawnItem(getPlayer(),
 | 
			
		||||
                        Misc.getBlockCenter(blockState),
 | 
			
		||||
                        new ItemStack(blockState.getType()),
 | 
			
		||||
                        Misc.getBlockCenter(block),
 | 
			
		||||
                        new ItemStack(block.getType()),
 | 
			
		||||
                        ItemSpawnReason.BLAST_MINING_DEBRIS_NON_ORES); // Initial block that would have been dropped
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        for (BlockState blockState : ores) {
 | 
			
		||||
        for (Block block : ores) {
 | 
			
		||||
            // currentOreYield only used for drop calculations for ores
 | 
			
		||||
            float currentOreYield = increasedYieldFromBonuses;
 | 
			
		||||
 | 
			
		||||
            if (isDropIllegal(blockState.getType())) {
 | 
			
		||||
            if (isDropIllegal(block.getType())) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Always give XP for every ore destroyed
 | 
			
		||||
            xp += Mining.getBlockXp(blockState);
 | 
			
		||||
            xp += ExperienceConfig.getInstance().getXp(PrimarySkillType.MINING, block);
 | 
			
		||||
            while(currentOreYield > 0) {
 | 
			
		||||
                if (Probability.ofValue(currentOreYield).evaluate()) {
 | 
			
		||||
                    Collection<ItemStack> oreDrops = isPickaxe(mmoPlayer.getPlayer().getInventory().getItemInMainHand())
 | 
			
		||||
                            ? blockState.getBlock().getDrops(mmoPlayer.getPlayer().getInventory().getItemInMainHand())
 | 
			
		||||
                            : List.of(new ItemStack(blockState.getType()));
 | 
			
		||||
                    ItemUtils.spawnItems(getPlayer(), Misc.getBlockCenter(blockState),
 | 
			
		||||
                            ? block.getDrops(mmoPlayer.getPlayer().getInventory().getItemInMainHand())
 | 
			
		||||
                            : List.of(new ItemStack(block.getType()));
 | 
			
		||||
                    ItemUtils.spawnItems(getPlayer(), Misc.getBlockCenter(block),
 | 
			
		||||
                            oreDrops, BLAST_MINING_BLACKLIST, ItemSpawnReason.BLAST_MINING_ORES);
 | 
			
		||||
 | 
			
		||||
                    if (mcMMO.p.getAdvancedConfig().isBlastMiningBonusDropsEnabled()) {
 | 
			
		||||
                        for (int i = 1; i < dropMultiplier; i++) {
 | 
			
		||||
                            ItemUtils.spawnItems(getPlayer(),
 | 
			
		||||
                                    Misc.getBlockCenter(blockState),
 | 
			
		||||
                                    Misc.getBlockCenter(block),
 | 
			
		||||
                                    oreDrops,
 | 
			
		||||
                                    BLAST_MINING_BLACKLIST,
 | 
			
		||||
                                    ItemSpawnReason.BLAST_MINING_ORES_BONUS_DROP);
 | 
			
		||||
 
 | 
			
		||||
@@ -68,29 +68,29 @@ public class UnarmedManager extends SkillManager {
 | 
			
		||||
        return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_BLOCK_CRACKER);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean blockCrackerCheck(@NotNull BlockState blockState) {
 | 
			
		||||
    public void blockCrackerCheck(@NotNull BlockState blockState) {
 | 
			
		||||
        if (!ProbabilityUtil.isNonRNGSkillActivationSuccessful(SubSkillType.UNARMED_BLOCK_CRACKER, mmoPlayer)) {
 | 
			
		||||
            return false;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (blockState.getType()) {
 | 
			
		||||
            case STONE_BRICKS:
 | 
			
		||||
                if (!Unarmed.blockCrackerSmoothBrick) {
 | 
			
		||||
                    return false;
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                blockState.getBlock().setType(Material.CRACKED_STONE_BRICKS);
 | 
			
		||||
                return true;
 | 
			
		||||
                blockState.update(true);
 | 
			
		||||
                return;
 | 
			
		||||
            case INFESTED_STONE_BRICKS:
 | 
			
		||||
                if (!Unarmed.blockCrackerSmoothBrick) {
 | 
			
		||||
                    return false;
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                blockState.getBlock().setType(Material.INFESTED_CRACKED_STONE_BRICKS);
 | 
			
		||||
                return true;
 | 
			
		||||
 | 
			
		||||
                blockState.update(true);
 | 
			
		||||
                return;
 | 
			
		||||
            default:
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -97,50 +97,60 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState Block being broken
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    public void processBonusDropCheck(@NotNull BlockState blockState) {
 | 
			
		||||
        processBonusDropCheck(blockState.getBlock());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void processBonusDropCheck(@NotNull Block block) {
 | 
			
		||||
        //TODO: Why isn't this using the item drop event? Potentially because of Tree Feller? This should be adjusted either way.
 | 
			
		||||
        if (mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, blockState.getType())) {
 | 
			
		||||
        if (mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, block.getType())) {
 | 
			
		||||
            //Mastery enabled for player
 | 
			
		||||
            if (Permissions.canUseSubSkill(getPlayer(), SubSkillType.WOODCUTTING_CLEAN_CUTS)) {
 | 
			
		||||
                if (checkCleanCutsActivation(blockState.getType())) {
 | 
			
		||||
                if (checkCleanCutsActivation(block.getType())) {
 | 
			
		||||
                    //Triple drops
 | 
			
		||||
                    spawnHarvestLumberBonusDrops(blockState);
 | 
			
		||||
                    spawnHarvestLumberBonusDrops(blockState);
 | 
			
		||||
                    spawnHarvestLumberBonusDrops(block);
 | 
			
		||||
                    spawnHarvestLumberBonusDrops(block);
 | 
			
		||||
                } else {
 | 
			
		||||
                    //Harvest Lumber Check
 | 
			
		||||
                    if (checkHarvestLumberActivation(blockState.getType())) {
 | 
			
		||||
                        spawnHarvestLumberBonusDrops(blockState);
 | 
			
		||||
                    if (checkHarvestLumberActivation(block.getType())) {
 | 
			
		||||
                        spawnHarvestLumberBonusDrops(block);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            //No Mastery (no Clean Cuts)
 | 
			
		||||
                //No Mastery (no Clean Cuts)
 | 
			
		||||
            } else if (Permissions.canUseSubSkill(getPlayer(), SubSkillType.WOODCUTTING_HARVEST_LUMBER)) {
 | 
			
		||||
                if (checkHarvestLumberActivation(blockState.getType())) {
 | 
			
		||||
                    spawnHarvestLumberBonusDrops(blockState);
 | 
			
		||||
                if (checkHarvestLumberActivation(block.getType())) {
 | 
			
		||||
                    spawnHarvestLumberBonusDrops(block);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    public void processWoodcuttingBlockXP(@NotNull BlockState blockState) {
 | 
			
		||||
        if (mcMMO.getUserBlockTracker().isIneligible(blockState))
 | 
			
		||||
        processWoodcuttingBlockXP(blockState.getBlock());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void processWoodcuttingBlockXP(@NotNull Block block) {
 | 
			
		||||
        if (mcMMO.getUserBlockTracker().isIneligible(block))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        int xp = getExperienceFromLog(blockState);
 | 
			
		||||
        applyXpGain(xp, XPGainReason.PVE);
 | 
			
		||||
        int xp = getExperienceFromLog(block);
 | 
			
		||||
        applyXpGain(xp, XPGainReason.PVE, XPGainSource.SELF);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Begins Tree Feller
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState Block being broken
 | 
			
		||||
     * @param startingBlock The first startingBlock broken
 | 
			
		||||
     */
 | 
			
		||||
    public void processTreeFeller(BlockState blockState) {
 | 
			
		||||
        Player player = getPlayer();
 | 
			
		||||
        Set<BlockState> treeFellerBlocks = new HashSet<>();
 | 
			
		||||
    public void processTreeFeller(Block startingBlock) {
 | 
			
		||||
        final Player player = getPlayer();
 | 
			
		||||
        Set<Block> treeFellerBlocks = new HashSet<>();
 | 
			
		||||
 | 
			
		||||
        treeFellerReachedThreshold = false;
 | 
			
		||||
 | 
			
		||||
        processTree(blockState, treeFellerBlocks);
 | 
			
		||||
        processTree(startingBlock, treeFellerBlocks);
 | 
			
		||||
 | 
			
		||||
        // If the tool can't sustain the durability loss
 | 
			
		||||
        if (!handleDurabilityLoss(treeFellerBlocks, player.getInventory().getItemInMainHand(), player)) {
 | 
			
		||||
@@ -160,21 +170,17 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Processes Tree Feller in a recursive manner
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState Block being checked
 | 
			
		||||
     * @param treeFellerBlocks List of blocks to be removed
 | 
			
		||||
     */
 | 
			
		||||
    /*
 | 
			
		||||
     * Process the tree feller ability.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * Algorithm: An int[][] of X/Z directions is created on static class
 | 
			
		||||
     * initialization, representing a cylinder with radius of about 2 - the
 | 
			
		||||
     * (0,0) center and all (+-2, +-2) corners are omitted.
 | 
			
		||||
     *
 | 
			
		||||
     * <p>
 | 
			
		||||
     * processTreeFellerTargetBlock() returns a boolean, which is used for the sole purpose of
 | 
			
		||||
     * switching between these two behaviors:
 | 
			
		||||
     *
 | 
			
		||||
     * <p>
 | 
			
		||||
     * (Call blockState "this log" for the below explanation.)
 | 
			
		||||
     *
 | 
			
		||||
     * <p>
 | 
			
		||||
     *  [A] There is another log above this log (TRUNK)
 | 
			
		||||
     *    Only the flat cylinder in the directions array is searched.
 | 
			
		||||
     *  [B] There is not another log above this log (BRANCH AND TOP)
 | 
			
		||||
@@ -182,19 +188,19 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
     *    block in the Y-axis, and the block below this log is checked as
 | 
			
		||||
     *    well. Due to the fact that the directions array will catch all
 | 
			
		||||
     *    blocks on a red mushroom, the special method for it is eliminated.
 | 
			
		||||
     *
 | 
			
		||||
     * <p>
 | 
			
		||||
     * This algorithm has been shown to achieve a performance of 2-5
 | 
			
		||||
     * milliseconds on regular trees and 10-15 milliseconds on jungle trees
 | 
			
		||||
     * once the JIT has optimized the function (use the ability about 4 times
 | 
			
		||||
     * before taking measurements).
 | 
			
		||||
     */
 | 
			
		||||
    private void processTree(BlockState blockState, Set<BlockState> treeFellerBlocks) {
 | 
			
		||||
        List<BlockState> futureCenterBlocks = new ArrayList<>();
 | 
			
		||||
    private void processTree(Block block, Set<Block> treeFellerBlocks) {
 | 
			
		||||
        List<Block> futureCenterBlocks = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        // Check the block up and take different behavior (smaller search) if it's a log
 | 
			
		||||
        if (processTreeFellerTargetBlock(blockState.getBlock().getRelative(BlockFace.UP).getState(), futureCenterBlocks, treeFellerBlocks)) {
 | 
			
		||||
        if (processTreeFellerTargetBlock(block.getRelative(BlockFace.UP), futureCenterBlocks, treeFellerBlocks)) {
 | 
			
		||||
            for (int[] dir : directions) {
 | 
			
		||||
                processTreeFellerTargetBlock(blockState.getBlock().getRelative(dir[0], 0, dir[1]).getState(), futureCenterBlocks, treeFellerBlocks);
 | 
			
		||||
                processTreeFellerTargetBlock(block.getRelative(dir[0], 0, dir[1]), futureCenterBlocks, treeFellerBlocks);
 | 
			
		||||
 | 
			
		||||
                if (treeFellerReachedThreshold) {
 | 
			
		||||
                    return;
 | 
			
		||||
@@ -202,11 +208,11 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            // Cover DOWN
 | 
			
		||||
            processTreeFellerTargetBlock(blockState.getBlock().getRelative(BlockFace.DOWN).getState(), futureCenterBlocks, treeFellerBlocks);
 | 
			
		||||
            processTreeFellerTargetBlock(block.getRelative(BlockFace.DOWN), futureCenterBlocks, treeFellerBlocks);
 | 
			
		||||
            // Search in a cube
 | 
			
		||||
            for (int y = -1; y <= 1; y++) {
 | 
			
		||||
                for (int[] dir : directions) {
 | 
			
		||||
                    processTreeFellerTargetBlock(blockState.getBlock().getRelative(dir[0], y, dir[1]).getState(), futureCenterBlocks, treeFellerBlocks);
 | 
			
		||||
                    processTreeFellerTargetBlock(block.getRelative(dir[0], y, dir[1]), futureCenterBlocks, treeFellerBlocks);
 | 
			
		||||
 | 
			
		||||
                    if (treeFellerReachedThreshold) {
 | 
			
		||||
                        return;
 | 
			
		||||
@@ -216,7 +222,7 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Recursive call for each log found
 | 
			
		||||
        for (BlockState futureCenterBlock : futureCenterBlocks) {
 | 
			
		||||
        for (Block futureCenterBlock : futureCenterBlocks) {
 | 
			
		||||
            if (treeFellerReachedThreshold) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
@@ -233,7 +239,8 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
     * @param player the player holding the item
 | 
			
		||||
     * @return True if the tool can sustain the durability loss
 | 
			
		||||
     */
 | 
			
		||||
    private static boolean handleDurabilityLoss(@NotNull Set<BlockState> treeFellerBlocks, @NotNull ItemStack inHand, @NotNull Player player) {
 | 
			
		||||
    private static boolean handleDurabilityLoss(@NotNull Set<Block> treeFellerBlocks,
 | 
			
		||||
                                                @NotNull ItemStack inHand, @NotNull Player player) {
 | 
			
		||||
        //Treat the NBT tag for unbreakable and the durability enchant differently
 | 
			
		||||
        ItemMeta meta = inHand.getItemMeta();
 | 
			
		||||
 | 
			
		||||
@@ -244,8 +251,8 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
        int durabilityLoss = 0;
 | 
			
		||||
        Material type = inHand.getType();
 | 
			
		||||
 | 
			
		||||
        for (BlockState blockState : treeFellerBlocks) {
 | 
			
		||||
            if (BlockUtils.hasWoodcuttingXP(blockState)) {
 | 
			
		||||
        for (Block block : treeFellerBlocks) {
 | 
			
		||||
            if (BlockUtils.hasWoodcuttingXP(block)) {
 | 
			
		||||
                durabilityLoss += mcMMO.p.getGeneralConfig().getAbilityToolDamage();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -261,7 +268,9 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
 | 
			
		||||
        SkillUtils.handleDurabilityChange(inHand, durabilityLoss);
 | 
			
		||||
        int durability = meta instanceof Damageable ? ((Damageable) meta).getDamage(): 0;
 | 
			
		||||
        return (durability < (mcMMO.getRepairableManager().isRepairable(type) ? mcMMO.getRepairableManager().getRepairable(type).getMaximumDurability() : type.getMaxDurability()));
 | 
			
		||||
        return (durability < (mcMMO.getRepairableManager().isRepairable(type)
 | 
			
		||||
                ? mcMMO.getRepairableManager().getRepairable(type).getMaximumDurability()
 | 
			
		||||
                : type.getMaxDurability()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -269,15 +278,17 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
     * list of blocks used for future recursive calls of
 | 
			
		||||
     * 'processTree()'
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState Block to be added
 | 
			
		||||
     * @param block Block to be added
 | 
			
		||||
     * @param futureCenterBlocks List of blocks that will be used to call
 | 
			
		||||
     *     'processTree()'
 | 
			
		||||
     * @param treeFellerBlocks List of blocks to be removed
 | 
			
		||||
     * @return true if and only if the given blockState was a Log not already
 | 
			
		||||
     * @return true if and only if the given block was a Log not already
 | 
			
		||||
     *     in treeFellerBlocks.
 | 
			
		||||
     */
 | 
			
		||||
    private boolean processTreeFellerTargetBlock(@NotNull BlockState blockState, @NotNull List<BlockState> futureCenterBlocks, @NotNull Set<BlockState> treeFellerBlocks) {
 | 
			
		||||
        if (treeFellerBlocks.contains(blockState) || mcMMO.getUserBlockTracker().isIneligible(blockState)) {
 | 
			
		||||
    private boolean processTreeFellerTargetBlock(@NotNull Block block,
 | 
			
		||||
                                                 @NotNull List<Block> futureCenterBlocks,
 | 
			
		||||
                                                 @NotNull Set<Block> treeFellerBlocks) {
 | 
			
		||||
        if (treeFellerBlocks.contains(block) || mcMMO.getUserBlockTracker().isIneligible(block)) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -286,12 +297,12 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
            treeFellerReachedThreshold = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (BlockUtils.hasWoodcuttingXP(blockState)) {
 | 
			
		||||
            treeFellerBlocks.add(blockState);
 | 
			
		||||
            futureCenterBlocks.add(blockState);
 | 
			
		||||
        if (BlockUtils.hasWoodcuttingXP(block)) {
 | 
			
		||||
            treeFellerBlocks.add(block);
 | 
			
		||||
            futureCenterBlocks.add(block);
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (BlockUtils.isNonWoodPartOfTree(blockState)) {
 | 
			
		||||
            treeFellerBlocks.add(blockState);
 | 
			
		||||
        } else if (BlockUtils.isNonWoodPartOfTree(block)) {
 | 
			
		||||
            treeFellerBlocks.add(block);
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
@@ -302,15 +313,14 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
     *
 | 
			
		||||
     * @param treeFellerBlocks List of blocks to be dropped
 | 
			
		||||
     */
 | 
			
		||||
    private void dropTreeFellerLootFromBlocks(@NotNull Set<BlockState> treeFellerBlocks) {
 | 
			
		||||
    private void dropTreeFellerLootFromBlocks(@NotNull Set<Block> treeFellerBlocks) {
 | 
			
		||||
        Player player = getPlayer();
 | 
			
		||||
        int xp = 0;
 | 
			
		||||
        int processedLogCount = 0;
 | 
			
		||||
        ItemStack itemStack = player.getInventory().getItemInMainHand();
 | 
			
		||||
 | 
			
		||||
        for (BlockState blockState : treeFellerBlocks) {
 | 
			
		||||
        for (Block block : treeFellerBlocks) {
 | 
			
		||||
            int beforeXP = xp;
 | 
			
		||||
            Block block = blockState.getBlock();
 | 
			
		||||
 | 
			
		||||
            if (!EventUtils.simulateBlockBreak(block, player, FakeBlockBreakEventType.TREE_FELLER)) {
 | 
			
		||||
                continue;
 | 
			
		||||
@@ -320,20 +330,21 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
             * Handle Drops & XP
 | 
			
		||||
             */
 | 
			
		||||
 | 
			
		||||
            if (BlockUtils.hasWoodcuttingXP(blockState)) {
 | 
			
		||||
            if (BlockUtils.hasWoodcuttingXP(block)) {
 | 
			
		||||
                //Add XP
 | 
			
		||||
                xp += processTreeFellerXPGains(blockState, processedLogCount);
 | 
			
		||||
                xp += processTreeFellerXPGains(block, processedLogCount);
 | 
			
		||||
 | 
			
		||||
                //Drop displaced block
 | 
			
		||||
                spawnItemsFromCollection(player, getBlockCenter(blockState), block.getDrops(itemStack), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK);
 | 
			
		||||
                spawnItemsFromCollection(player, getBlockCenter(block),
 | 
			
		||||
                        block.getDrops(itemStack), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK);
 | 
			
		||||
 | 
			
		||||
                //Bonus Drops / Harvest lumber checks
 | 
			
		||||
                processBonusDropCheck(blockState);
 | 
			
		||||
            } else if (BlockUtils.isNonWoodPartOfTree(blockState)) {
 | 
			
		||||
                processBonusDropCheck(block);
 | 
			
		||||
            } else if (BlockUtils.isNonWoodPartOfTree(block)) {
 | 
			
		||||
                // 75% of the time do not drop leaf blocks
 | 
			
		||||
                if (ThreadLocalRandom.current().nextInt(100) > 75) {
 | 
			
		||||
                    spawnItemsFromCollection(player,
 | 
			
		||||
                            getBlockCenter(blockState),
 | 
			
		||||
                            getBlockCenter(block),
 | 
			
		||||
                            block.getDrops(itemStack),
 | 
			
		||||
                            ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK);
 | 
			
		||||
                } else if (hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) {
 | 
			
		||||
@@ -341,7 +352,7 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
                    ItemUtils.spawnItemsConditionally(block.getDrops(itemStack),
 | 
			
		||||
                            IS_SAPLING_OR_PROPAGULE,
 | 
			
		||||
                            ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK,
 | 
			
		||||
                            getBlockCenter(blockState),
 | 
			
		||||
                            getBlockCenter(block),
 | 
			
		||||
                            // only spawn saplings
 | 
			
		||||
                            player
 | 
			
		||||
                    );
 | 
			
		||||
@@ -353,15 +364,14 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
                        if (mcMMO.p.getAdvancedConfig().isKnockOnWoodXPOrbEnabled()) {
 | 
			
		||||
                            if (ProbabilityUtil.isStaticSkillRNGSuccessful(PrimarySkillType.WOODCUTTING, mmoPlayer, 10)) {
 | 
			
		||||
                                int randOrbCount = Math.max(1, Misc.getRandom().nextInt(100));
 | 
			
		||||
                                Misc.spawnExperienceOrb(blockState.getLocation(), randOrbCount);
 | 
			
		||||
                                Misc.spawnExperienceOrb(block.getLocation(), randOrbCount);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            blockState.setType(Material.AIR);
 | 
			
		||||
            blockState.update(true);
 | 
			
		||||
            block.setType(Material.AIR);
 | 
			
		||||
 | 
			
		||||
            //Update only when XP changes
 | 
			
		||||
            processedLogCount = updateProcessedLogCount(xp, processedLogCount, beforeXP);
 | 
			
		||||
@@ -383,15 +393,15 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
     * Experience is only reduced if the config option to reduce Tree Feller XP is set
 | 
			
		||||
     * Experience per log will not fall below 1 unless the experience for that log is set to 0 in the config
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState Log being broken
 | 
			
		||||
     * @param block Log being broken
 | 
			
		||||
     * @param woodCount how many logs have given out XP for this tree feller so far
 | 
			
		||||
     * @return Amount of experience
 | 
			
		||||
     */
 | 
			
		||||
    private static int processTreeFellerXPGains(BlockState blockState, int woodCount) {
 | 
			
		||||
        if (mcMMO.getUserBlockTracker().isIneligible(blockState))
 | 
			
		||||
    private static int processTreeFellerXPGains(Block block, int woodCount) {
 | 
			
		||||
        if (mcMMO.getUserBlockTracker().isIneligible(block))
 | 
			
		||||
            return 0;
 | 
			
		||||
 | 
			
		||||
        int rawXP = ExperienceConfig.getInstance().getXp(PrimarySkillType.WOODCUTTING, blockState.getType());
 | 
			
		||||
        int rawXP = ExperienceConfig.getInstance().getXp(PrimarySkillType.WOODCUTTING, block.getType());
 | 
			
		||||
 | 
			
		||||
        if (rawXP <= 0)
 | 
			
		||||
            return 0;
 | 
			
		||||
@@ -401,7 +411,7 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
            rawXP = Math.max(1, reducedXP);
 | 
			
		||||
            return rawXP;
 | 
			
		||||
        } else {
 | 
			
		||||
            return ExperienceConfig.getInstance().getXp(PrimarySkillType.WOODCUTTING, blockState.getType());
 | 
			
		||||
            return ExperienceConfig.getInstance().getXp(PrimarySkillType.WOODCUTTING, block.getType());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -411,12 +421,19 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
     * @param blockState Log being broken
 | 
			
		||||
     * @return Amount of experience
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    protected static int getExperienceFromLog(BlockState blockState) {
 | 
			
		||||
        if (mcMMO.getModManager().isCustomLog(blockState)) {
 | 
			
		||||
            return mcMMO.getModManager().getBlock(blockState).getXpGain();
 | 
			
		||||
        }
 | 
			
		||||
        return getExperienceFromLog(blockState.getBlock());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        return ExperienceConfig.getInstance().getXp(PrimarySkillType.WOODCUTTING, blockState.getType());
 | 
			
		||||
    /**
 | 
			
		||||
     * Retrieves the experience reward from a log
 | 
			
		||||
     *
 | 
			
		||||
     * @param block Log being broken
 | 
			
		||||
     * @return Amount of experience
 | 
			
		||||
     */
 | 
			
		||||
    protected static int getExperienceFromLog(Block block) {
 | 
			
		||||
        return ExperienceConfig.getInstance().getXp(PrimarySkillType.WOODCUTTING, block.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -424,11 +441,16 @@ public class WoodcuttingManager extends SkillManager {
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState Block being broken
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    void spawnHarvestLumberBonusDrops(@NotNull BlockState blockState) {
 | 
			
		||||
        spawnHarvestLumberBonusDrops(blockState.getBlock());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void spawnHarvestLumberBonusDrops(@NotNull Block block) {
 | 
			
		||||
        spawnItemsFromCollection(
 | 
			
		||||
                getPlayer(),
 | 
			
		||||
                getBlockCenter(blockState),
 | 
			
		||||
                blockState.getBlock().getDrops(getPlayer().getInventory().getItemInMainHand()),
 | 
			
		||||
                getBlockCenter(block),
 | 
			
		||||
                block.getDrops(getPlayer().getInventory().getItemInMainHand()),
 | 
			
		||||
                ItemSpawnReason.BONUS_DROPS);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -38,11 +38,19 @@ public final class BlockUtils {
 | 
			
		||||
     * @param blockState target blockstate
 | 
			
		||||
     * @param triple     marks the block to give triple drops
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    public static void markDropsAsBonus(BlockState blockState, boolean triple) {
 | 
			
		||||
        if (triple)
 | 
			
		||||
            blockState.setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(2, mcMMO.p));
 | 
			
		||||
            blockState.getBlock().setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(2, mcMMO.p));
 | 
			
		||||
        else
 | 
			
		||||
            blockState.setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(1, mcMMO.p));
 | 
			
		||||
            blockState.getBlock().setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(1, mcMMO.p));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void markDropsAsBonus(Block block, boolean triple) {
 | 
			
		||||
        if (triple)
 | 
			
		||||
            block.setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(2, mcMMO.p));
 | 
			
		||||
        else
 | 
			
		||||
            block.setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(1, mcMMO.p));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -90,10 +98,20 @@ public final class BlockUtils {
 | 
			
		||||
     * @param blockState target blockstate
 | 
			
		||||
     * @param amount amount of extra items to drop
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    public static void markDropsAsBonus(BlockState blockState, int amount) {
 | 
			
		||||
            blockState.setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(amount, mcMMO.p));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Marks a block to drop extra copies of items
 | 
			
		||||
     * @param block target block
 | 
			
		||||
     * @param amount the number of extra items to drop
 | 
			
		||||
     */
 | 
			
		||||
    public static void markDropsAsBonus(Block block, int amount) {
 | 
			
		||||
        block.setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(amount, mcMMO.p));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks if a player successfully passed the double drop check
 | 
			
		||||
     *
 | 
			
		||||
@@ -114,6 +132,7 @@ public final class BlockUtils {
 | 
			
		||||
     * @param subSkillType the subskill involved
 | 
			
		||||
     * @return true if the player succeeded in the check
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    public static boolean checkDoubleDrops(@Nullable McMMOPlayer mmoPlayer, @NotNull BlockState blockState,
 | 
			
		||||
                                           @NotNull SubSkillType subSkillType) {
 | 
			
		||||
        requireNonNull(blockState, "blockState cannot be null");
 | 
			
		||||
@@ -126,6 +145,25 @@ public final class BlockUtils {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks if a player successfully passed the double drop check
 | 
			
		||||
     * @param mmoPlayer the player involved in the check
 | 
			
		||||
     * @param block the block
 | 
			
		||||
     * @param subSkillType the subskill involved
 | 
			
		||||
     * @return true if the player succeeded in the check
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean checkDoubleDrops(@Nullable McMMOPlayer mmoPlayer, @NotNull Block block,
 | 
			
		||||
                                           @NotNull SubSkillType subSkillType) {
 | 
			
		||||
        requireNonNull(block, "block cannot be null");
 | 
			
		||||
        requireNonNull(subSkillType, "subSkillType cannot be null");
 | 
			
		||||
        if (mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(subSkillType.getParentSkill(), block.getType())
 | 
			
		||||
                && Permissions.isSubSkillEnabled(mmoPlayer, subSkillType)) {
 | 
			
		||||
            return ProbabilityUtil.isSkillRNGSuccessful(subSkillType, mmoPlayer);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks to see if a given block awards XP.
 | 
			
		||||
     *
 | 
			
		||||
@@ -133,11 +171,18 @@ public final class BlockUtils {
 | 
			
		||||
     * @return true if the block awards XP, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean shouldBeWatched(BlockState blockState) {
 | 
			
		||||
        return affectedByGigaDrillBreaker(blockState) || affectedByGreenTerra(blockState) || affectedBySuperBreaker(blockState) || hasWoodcuttingXP(blockState)
 | 
			
		||||
                || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.MINING, blockState.getType())
 | 
			
		||||
                || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.EXCAVATION, blockState.getType())
 | 
			
		||||
                || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, blockState.getType())
 | 
			
		||||
                || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.SMELTING, blockState.getType());
 | 
			
		||||
        return shouldBeWatched(blockState.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean shouldBeWatched(Material material) {
 | 
			
		||||
        return affectedByGigaDrillBreaker(material)
 | 
			
		||||
                || affectedByGreenTerra(material)
 | 
			
		||||
                || affectedBySuperBreaker(material)
 | 
			
		||||
                || hasWoodcuttingXP(material)
 | 
			
		||||
                || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.MINING, material)
 | 
			
		||||
                || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.EXCAVATION, material)
 | 
			
		||||
                || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, material)
 | 
			
		||||
                || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.SMELTING, material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -147,10 +192,15 @@ public final class BlockUtils {
 | 
			
		||||
     * @return true if the block should allow ability activation, false
 | 
			
		||||
     * otherwise
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(forRemoval = true, since = "2.2.024")
 | 
			
		||||
    public static boolean canActivateAbilities(BlockState blockState) {
 | 
			
		||||
        return !mcMMO.getMaterialMapStore().isAbilityActivationBlackListed(blockState.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean canActivateAbilities(Block block) {
 | 
			
		||||
        return !mcMMO.getMaterialMapStore().isAbilityActivationBlackListed(block.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a given block should allow for the activation of tools
 | 
			
		||||
     * Activating a tool is step 1 of a 2 step process for super ability activation
 | 
			
		||||
@@ -172,7 +222,25 @@ public final class BlockUtils {
 | 
			
		||||
     * @return true if the block is an ore, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isOre(BlockState blockState) {
 | 
			
		||||
        return MaterialUtils.isOre(blockState.getType());
 | 
			
		||||
        return isOre(blockState.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a given block is an ore
 | 
			
		||||
     * @param block The {@link Block} to check
 | 
			
		||||
     * @return true if the block is an ore, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isOre(Block block) {
 | 
			
		||||
        return isOre(block.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a given material is an ore
 | 
			
		||||
     * @param material The {@link Material} to check
 | 
			
		||||
     * @return true if the material is an ore, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isOre(Material material) {
 | 
			
		||||
        return MaterialUtils.isOre(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -181,10 +249,15 @@ public final class BlockUtils {
 | 
			
		||||
     * @param blockState The {@link BlockState} of the block to check
 | 
			
		||||
     * @return true if the block can be made mossy, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated(since = "2.2.024")
 | 
			
		||||
    public static boolean canMakeMossy(BlockState blockState) {
 | 
			
		||||
        return mcMMO.getMaterialMapStore().isMossyWhiteListed(blockState.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean canMakeMossy(Block block) {
 | 
			
		||||
        return mcMMO.getMaterialMapStore().isMossyWhiteListed(block.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Determine if a given block should be affected by Green Terra
 | 
			
		||||
     *
 | 
			
		||||
@@ -192,41 +265,56 @@ public final class BlockUtils {
 | 
			
		||||
     * @return true if the block should affected by Green Terra, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean affectedByGreenTerra(BlockState blockState) {
 | 
			
		||||
        if (ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.HERBALISM, blockState.getBlockData())) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        return affectedByGreenTerra(blockState.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        return mcMMO.getModManager().isCustomHerbalismBlock(blockState);
 | 
			
		||||
    public static boolean affectedByGreenTerra(Block block) {
 | 
			
		||||
        return affectedByGreenTerra(block.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean affectedByGreenTerra(Material material) {
 | 
			
		||||
        return ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.HERBALISM, material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean affectedBySuperBreaker(BlockState blockState) {
 | 
			
		||||
        return affectedBySuperBreaker(blockState.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Determine if a given block should be affected by Super Breaker
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState The {@link BlockState} of the block to check
 | 
			
		||||
     * @param block The {@link Block} to check
 | 
			
		||||
     * @return true if the block should affected by Super Breaker, false
 | 
			
		||||
     * otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean affectedBySuperBreaker(BlockState blockState) {
 | 
			
		||||
        if (mcMMO.getMaterialMapStore().isIntendedToolPickaxe(blockState.getType()))
 | 
			
		||||
    public static boolean affectedBySuperBreaker(Block block) {
 | 
			
		||||
        return affectedBySuperBreaker(block.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean affectedBySuperBreaker(Material material) {
 | 
			
		||||
        if (mcMMO.getMaterialMapStore().isIntendedToolPickaxe(material))
 | 
			
		||||
            return true;
 | 
			
		||||
 | 
			
		||||
        if (ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, blockState.getBlockData()))
 | 
			
		||||
            return true;
 | 
			
		||||
 | 
			
		||||
        return mcMMO.getModManager().isCustomMiningBlock(blockState);
 | 
			
		||||
        return ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Determine if a given block should be affected by Giga Drill Breaker
 | 
			
		||||
     *
 | 
			
		||||
     * @param blockState The {@link BlockState} of the block to check
 | 
			
		||||
     * @return true if the block should affected by Giga Drill Breaker, false
 | 
			
		||||
     * @return true if the block should be affected by Giga Drill Breaker, false
 | 
			
		||||
     * otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean affectedByGigaDrillBreaker(@NotNull BlockState blockState) {
 | 
			
		||||
        if (ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.EXCAVATION, blockState.getBlockData()))
 | 
			
		||||
            return true;
 | 
			
		||||
        return mcMMO.getModManager().isCustomExcavationBlock(blockState);
 | 
			
		||||
        return affectedByGigaDrillBreaker(blockState.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean affectedByGigaDrillBreaker(@NotNull Block block) {
 | 
			
		||||
        return affectedByGigaDrillBreaker(block.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean affectedByGigaDrillBreaker(@NotNull Material material) {
 | 
			
		||||
        return ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.EXCAVATION, material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -236,7 +324,15 @@ public final class BlockUtils {
 | 
			
		||||
     * @return true if the block is a log, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean hasWoodcuttingXP(@NotNull BlockState blockState) {
 | 
			
		||||
        return ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.WOODCUTTING, blockState.getBlockData());
 | 
			
		||||
        return hasWoodcuttingXP(blockState.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean hasWoodcuttingXP(@NotNull Block block) {
 | 
			
		||||
        return hasWoodcuttingXP(block.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean hasWoodcuttingXP(@NotNull Material material) {
 | 
			
		||||
        return ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.WOODCUTTING, material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -246,7 +342,11 @@ public final class BlockUtils {
 | 
			
		||||
     * @return true if the block is a leaf, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isNonWoodPartOfTree(@NotNull BlockState blockState) {
 | 
			
		||||
        return mcMMO.getMaterialMapStore().isTreeFellerDestructible(blockState.getType());
 | 
			
		||||
        return isNonWoodPartOfTree(blockState.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isNonWoodPartOfTree(@NotNull Block block) {
 | 
			
		||||
        return isNonWoodPartOfTree(block.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isNonWoodPartOfTree(@NotNull Material material) {
 | 
			
		||||
@@ -289,7 +389,15 @@ public final class BlockUtils {
 | 
			
		||||
     * otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean affectedByBlockCracker(BlockState blockState) {
 | 
			
		||||
        return mcMMO.getMaterialMapStore().isBlockCrackerWhiteListed(blockState.getType());
 | 
			
		||||
        return affectedByBlockCracker(blockState.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean affectedByBlockCracker(Block block) {
 | 
			
		||||
        return affectedByBlockCracker(block.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean affectedByBlockCracker(Material material) {
 | 
			
		||||
        return mcMMO.getMaterialMapStore().isBlockCrackerWhiteListed(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
 | 
			
		||||
import com.gmail.nossr50.util.player.UserManager;
 | 
			
		||||
import com.google.common.collect.ImmutableSet;
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.block.BlockState;
 | 
			
		||||
import org.bukkit.entity.*;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
@@ -35,7 +36,10 @@ public final class Misc {
 | 
			
		||||
    public static final float LEVELUP_PITCH    = 0.5F;  // Reduced to differentiate between vanilla level-up
 | 
			
		||||
    public static final float LEVELUP_VOLUME   = 0.75F * Config.getInstance().getMasterVolume(); // Use max volume always*/
 | 
			
		||||
 | 
			
		||||
    public static final @NotNull Set<String> modNames = ImmutableSet.of("LOTR", "BUILDCRAFT", "ENDERIO", "ENHANCEDBIOMES", "IC2", "METALLURGY", "FORESTRY", "GALACTICRAFT", "RAILCRAFT", "TWILIGHTFOREST", "THAUMCRAFT", "GRAVESTONEMOD", "GROWTHCRAFT", "ARCTICMOBS", "DEMONMOBS", "INFERNOMOBS", "SWAMPMOBS", "MARICULTURE", "MINESTRAPPOLATION");
 | 
			
		||||
    public static final @NotNull Set<String> modNames = ImmutableSet.of("LOTR", "BUILDCRAFT", "ENDERIO",
 | 
			
		||||
            "ENHANCEDBIOMES", "IC2", "METALLURGY", "FORESTRY", "GALACTICRAFT", "RAILCRAFT", "TWILIGHTFOREST",
 | 
			
		||||
            "THAUMCRAFT", "GRAVESTONEMOD", "GROWTHCRAFT", "ARCTICMOBS", "DEMONMOBS", "INFERNOMOBS", "SWAMPMOBS",
 | 
			
		||||
            "MARICULTURE", "MINESTRAPPOLATION");
 | 
			
		||||
 | 
			
		||||
    private Misc() {}
 | 
			
		||||
 | 
			
		||||
@@ -97,7 +101,15 @@ public final class Misc {
 | 
			
		||||
     * @return A {@link Location} lying at the center of the block
 | 
			
		||||
     */
 | 
			
		||||
    public static Location getBlockCenter(BlockState blockState) {
 | 
			
		||||
        return blockState.getLocation().add(0.5, 0.5, 0.5);
 | 
			
		||||
        return getBlockCenter(blockState.getLocation());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Location getBlockCenter(Block block) {
 | 
			
		||||
        return getBlockCenter(block.getLocation());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Location getBlockCenter(Location location) {
 | 
			
		||||
        return location.add(0.5, 0.5, 0.5);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void profileCleanup(@NotNull String playerName) {
 | 
			
		||||
@@ -111,7 +123,9 @@ public final class Misc {
 | 
			
		||||
 | 
			
		||||
    public static void printProgress(int convertedUsers, int progressInterval, long startMillis) {
 | 
			
		||||
        if ((convertedUsers % progressInterval) == 0) {
 | 
			
		||||
            mcMMO.p.getLogger().info(String.format("Conversion progress: %d users at %.2f users/second", convertedUsers, convertedUsers / (double) ((System.currentTimeMillis() - startMillis) / TIME_CONVERSION_FACTOR)));
 | 
			
		||||
            mcMMO.p.getLogger().info(String.format("Conversion progress: %d users at %.2f users/second",
 | 
			
		||||
                    convertedUsers,
 | 
			
		||||
                    convertedUsers / (double) ((System.currentTimeMillis() - startMillis) / TIME_CONVERSION_FACTOR)));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,275 +1,275 @@
 | 
			
		||||
package com.gmail.nossr50.util;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.config.mods.CustomArmorLegacyConfig;
 | 
			
		||||
import com.gmail.nossr50.config.mods.CustomBlockLegacyConfig;
 | 
			
		||||
import com.gmail.nossr50.config.mods.CustomEntityLegacyConfig;
 | 
			
		||||
import com.gmail.nossr50.config.mods.CustomToolLegacyConfig;
 | 
			
		||||
import com.gmail.nossr50.datatypes.mods.CustomBlock;
 | 
			
		||||
import com.gmail.nossr50.datatypes.mods.CustomEntity;
 | 
			
		||||
import com.gmail.nossr50.datatypes.mods.CustomTool;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.skills.repair.repairables.Repairable;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.block.BlockState;
 | 
			
		||||
import org.bukkit.configuration.file.YamlConfiguration;
 | 
			
		||||
import org.bukkit.entity.Entity;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class ModManager {
 | 
			
		||||
    private final List<Repairable> repairables = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    // Armor Mods
 | 
			
		||||
    private final List<Material> customBoots       = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customChestplates = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customHelmets     = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customLeggings    = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    // Block Mods
 | 
			
		||||
    private final List<Material> customExcavationBlocks  = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customHerbalismBlocks   = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customMiningBlocks      = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customOres              = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customLogs              = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customLeaves            = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customAbilityBlocks     = new ArrayList<>();
 | 
			
		||||
    private final HashMap<Material, CustomBlock> customBlockMap = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    // Entity Mods
 | 
			
		||||
    private final HashMap<String, CustomEntity> customEntityClassMap = new HashMap<>();
 | 
			
		||||
    private final HashMap<String, CustomEntity> customEntityTypeMap  = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    // Tool Mods
 | 
			
		||||
    private final List<Material> customAxes     = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customBows     = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customHoes     = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customPickaxes = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customShovels  = new ArrayList<>();
 | 
			
		||||
    private final List<Material> customSwords   = new ArrayList<>();
 | 
			
		||||
    private final HashMap<Material, CustomTool> customToolMap = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    public void registerCustomArmor(CustomArmorLegacyConfig config) {
 | 
			
		||||
        customBoots.addAll(config.customBoots);
 | 
			
		||||
        customChestplates.addAll(config.customChestplates);
 | 
			
		||||
        customHelmets.addAll(config.customHelmets);
 | 
			
		||||
        customLeggings.addAll(config.customLeggings);
 | 
			
		||||
        repairables.addAll(config.repairables);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void registerCustomBlocks(CustomBlockLegacyConfig config) {
 | 
			
		||||
        customExcavationBlocks.addAll(config.customExcavationBlocks);
 | 
			
		||||
        customHerbalismBlocks.addAll(config.customHerbalismBlocks);
 | 
			
		||||
        customMiningBlocks.addAll(config.customMiningBlocks);
 | 
			
		||||
        customOres.addAll(config.customOres);
 | 
			
		||||
        customLogs.addAll(config.customLogs);
 | 
			
		||||
        customLeaves.addAll(config.customLeaves);
 | 
			
		||||
        customAbilityBlocks.addAll(config.customAbilityBlocks);
 | 
			
		||||
        customBlockMap.putAll(config.customBlockMap);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void registerCustomEntities(CustomEntityLegacyConfig config) {
 | 
			
		||||
        customEntityClassMap.putAll(config.customEntityClassMap);
 | 
			
		||||
        customEntityTypeMap.putAll(config.customEntityTypeMap);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void registerCustomTools(CustomToolLegacyConfig config) {
 | 
			
		||||
        customAxes.addAll(config.customAxes);
 | 
			
		||||
        customBows.addAll(config.customBows);
 | 
			
		||||
        customHoes.addAll(config.customHoes);
 | 
			
		||||
        customPickaxes.addAll(config.customPickaxes);
 | 
			
		||||
        customShovels.addAll(config.customShovels);
 | 
			
		||||
        customSwords.addAll(config.customSwords);
 | 
			
		||||
        customToolMap.putAll(config.customToolMap);
 | 
			
		||||
        repairables.addAll(config.repairables);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomBoots(Material material) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customBoots.contains(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomChestplate(Material material) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customChestplates.contains(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomHelmet(Material material) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customHelmets.contains(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomLeggings(Material material) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customLeggings.contains(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomAxe(Material material) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customAxes.contains(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomBow(Material material) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customBows.contains(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomHoe(Material material) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customHoes.contains(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomPickaxe(Material material) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customPickaxes.contains(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomShovel(Material material) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customShovels.contains(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomSword(Material material) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customSwords.contains(material);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomOre(Material data) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customOres.contains(data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomLog(BlockState state) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customLogs.contains(state.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomAbilityBlock(BlockState state) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customAbilityBlocks.contains(state.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomExcavationBlock(BlockState state) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customExcavationBlocks.contains(state.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomHerbalismBlock(BlockState state) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customHerbalismBlocks.contains(state.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomMiningBlock(BlockState state) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customMiningBlocks.contains(state.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CustomBlock getBlock(BlockState state) {
 | 
			
		||||
        return customBlockMap.get(state.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CustomBlock getBlock(Material data) {
 | 
			
		||||
        return customBlockMap.get(data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks to see if an item is a custom tool.
 | 
			
		||||
     *
 | 
			
		||||
     * @param item Item to check
 | 
			
		||||
     * @return true if the item is a custom tool, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isCustomTool(ItemStack item) {
 | 
			
		||||
        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && item != null && customToolMap.containsKey(item.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the custom tool associated with an item.
 | 
			
		||||
     *
 | 
			
		||||
     * @param item The item to check
 | 
			
		||||
     * @return the tool if it exists, null otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public CustomTool getTool(ItemStack item) {
 | 
			
		||||
        return item == null ? null : customToolMap.get(item.getType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<Repairable> getLoadedRepairables() {
 | 
			
		||||
        return repairables;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCustomEntity(Entity entity) {
 | 
			
		||||
        if (!mcMMO.p.getGeneralConfig().getEntityModsEnabled()) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (customEntityTypeMap.containsKey(entity.getType().toString())) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            return customEntityClassMap.containsKey(((Class<?>) entity.getClass().getDeclaredField("entityClass").get(entity)).getName());
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e) {
 | 
			
		||||
            if (e instanceof NoSuchFieldException || e instanceof IllegalArgumentException || e instanceof IllegalAccessException) {
 | 
			
		||||
                return customEntityClassMap.containsKey(entity.getClass().getName());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CustomEntity getEntity(Entity entity) {
 | 
			
		||||
        CustomEntity customEntity = customEntityTypeMap.get(entity.getType().toString());
 | 
			
		||||
 | 
			
		||||
        if (customEntity == null) {
 | 
			
		||||
            try {
 | 
			
		||||
                customEntity = customEntityClassMap.get(((Class<?>) entity.getClass().getDeclaredField("entityClass").get(entity)).getName());
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e) {
 | 
			
		||||
                if (e instanceof NoSuchFieldException || e instanceof IllegalArgumentException || e instanceof IllegalAccessException) {
 | 
			
		||||
                    customEntity = customEntityClassMap.get(entity.getClass().getName());
 | 
			
		||||
                } else {
 | 
			
		||||
                    e.printStackTrace();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return customEntity;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void addCustomEntity(Entity entity) {
 | 
			
		||||
        if (!mcMMO.p.getGeneralConfig().getEntityModsEnabled()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        File entityFile = new File(mcMMO.p.getDataFolder(), "mods" + File.separator + "entities.default.yml");
 | 
			
		||||
        YamlConfiguration entitiesFile = YamlConfiguration.loadConfiguration(entityFile);
 | 
			
		||||
 | 
			
		||||
        String entityName = entity.getType().toString();
 | 
			
		||||
        String sanitizedEntityName = entityName.replace(".", "_");
 | 
			
		||||
 | 
			
		||||
        if (entitiesFile.getKeys(false).contains(sanitizedEntityName)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        entitiesFile.set(sanitizedEntityName + ".XP_Multiplier", 1.0D);
 | 
			
		||||
        entitiesFile.set(sanitizedEntityName + ".Tameable", false);
 | 
			
		||||
        entitiesFile.set(sanitizedEntityName + ".Taming_XP", 0);
 | 
			
		||||
        entitiesFile.set(sanitizedEntityName + ".CanBeSummoned", false);
 | 
			
		||||
        entitiesFile.set(sanitizedEntityName + ".COTW_Material", "");
 | 
			
		||||
        entitiesFile.set(sanitizedEntityName + ".COTW_Material_Data", 0);
 | 
			
		||||
        entitiesFile.set(sanitizedEntityName + ".COTW_Material_Amount", 0);
 | 
			
		||||
 | 
			
		||||
        String className = "";
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            className = ((Class<?>) entity.getClass().getDeclaredField("entityClass").get(entity)).getName();
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e) {
 | 
			
		||||
            if (e instanceof NoSuchFieldException || e instanceof IllegalArgumentException || e instanceof IllegalAccessException) {
 | 
			
		||||
                className = entity.getClass().getName();
 | 
			
		||||
            } else {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        CustomEntity customEntity = new CustomEntity(1.0D, false, 0, false, null, 0);
 | 
			
		||||
        customEntityTypeMap.put(entityName, customEntity);
 | 
			
		||||
        customEntityClassMap.put(className, customEntity);
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            entitiesFile.save(entityFile);
 | 
			
		||||
            LogUtils.debug(mcMMO.p.getLogger(), entity.getType().toString() + " was added to the custom entities file!");
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//package com.gmail.nossr50.util;
 | 
			
		||||
//
 | 
			
		||||
//import com.gmail.nossr50.config.mods.CustomArmorLegacyConfig;
 | 
			
		||||
//import com.gmail.nossr50.config.mods.CustomBlockLegacyConfig;
 | 
			
		||||
//import com.gmail.nossr50.config.mods.CustomEntityLegacyConfig;
 | 
			
		||||
//import com.gmail.nossr50.config.mods.CustomToolLegacyConfig;
 | 
			
		||||
//import com.gmail.nossr50.datatypes.mods.CustomBlock;
 | 
			
		||||
//import com.gmail.nossr50.datatypes.mods.CustomEntity;
 | 
			
		||||
//import com.gmail.nossr50.datatypes.mods.CustomTool;
 | 
			
		||||
//import com.gmail.nossr50.mcMMO;
 | 
			
		||||
//import com.gmail.nossr50.skills.repair.repairables.Repairable;
 | 
			
		||||
//import org.bukkit.Material;
 | 
			
		||||
//import org.bukkit.block.BlockState;
 | 
			
		||||
//import org.bukkit.configuration.file.YamlConfiguration;
 | 
			
		||||
//import org.bukkit.entity.Entity;
 | 
			
		||||
//import org.bukkit.inventory.ItemStack;
 | 
			
		||||
//
 | 
			
		||||
//import java.io.File;
 | 
			
		||||
//import java.util.ArrayList;
 | 
			
		||||
//import java.util.HashMap;
 | 
			
		||||
//import java.util.List;
 | 
			
		||||
//
 | 
			
		||||
//public class ModManager {
 | 
			
		||||
//    private final List<Repairable> repairables = new ArrayList<>();
 | 
			
		||||
//
 | 
			
		||||
//    // Armor Mods
 | 
			
		||||
//    private final List<Material> customBoots       = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customChestplates = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customHelmets     = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customLeggings    = new ArrayList<>();
 | 
			
		||||
//
 | 
			
		||||
//    // Block Mods
 | 
			
		||||
//    private final List<Material> customExcavationBlocks  = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customHerbalismBlocks   = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customMiningBlocks      = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customOres              = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customLogs              = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customLeaves            = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customAbilityBlocks     = new ArrayList<>();
 | 
			
		||||
//    private final HashMap<Material, CustomBlock> customBlockMap = new HashMap<>();
 | 
			
		||||
//
 | 
			
		||||
//    // Entity Mods
 | 
			
		||||
//    private final HashMap<String, CustomEntity> customEntityClassMap = new HashMap<>();
 | 
			
		||||
//    private final HashMap<String, CustomEntity> customEntityTypeMap  = new HashMap<>();
 | 
			
		||||
//
 | 
			
		||||
//    // Tool Mods
 | 
			
		||||
//    private final List<Material> customAxes     = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customBows     = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customHoes     = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customPickaxes = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customShovels  = new ArrayList<>();
 | 
			
		||||
//    private final List<Material> customSwords   = new ArrayList<>();
 | 
			
		||||
//    private final HashMap<Material, CustomTool> customToolMap = new HashMap<>();
 | 
			
		||||
//
 | 
			
		||||
//    public void registerCustomArmor(CustomArmorLegacyConfig config) {
 | 
			
		||||
//        customBoots.addAll(config.customBoots);
 | 
			
		||||
//        customChestplates.addAll(config.customChestplates);
 | 
			
		||||
//        customHelmets.addAll(config.customHelmets);
 | 
			
		||||
//        customLeggings.addAll(config.customLeggings);
 | 
			
		||||
//        repairables.addAll(config.repairables);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public void registerCustomBlocks(CustomBlockLegacyConfig config) {
 | 
			
		||||
//        customExcavationBlocks.addAll(config.customExcavationBlocks);
 | 
			
		||||
//        customHerbalismBlocks.addAll(config.customHerbalismBlocks);
 | 
			
		||||
//        customMiningBlocks.addAll(config.customMiningBlocks);
 | 
			
		||||
//        customOres.addAll(config.customOres);
 | 
			
		||||
//        customLogs.addAll(config.customLogs);
 | 
			
		||||
//        customLeaves.addAll(config.customLeaves);
 | 
			
		||||
//        customAbilityBlocks.addAll(config.customAbilityBlocks);
 | 
			
		||||
//        customBlockMap.putAll(config.customBlockMap);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public void registerCustomEntities(CustomEntityLegacyConfig config) {
 | 
			
		||||
//        customEntityClassMap.putAll(config.customEntityClassMap);
 | 
			
		||||
//        customEntityTypeMap.putAll(config.customEntityTypeMap);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public void registerCustomTools(CustomToolLegacyConfig config) {
 | 
			
		||||
//        customAxes.addAll(config.customAxes);
 | 
			
		||||
//        customBows.addAll(config.customBows);
 | 
			
		||||
//        customHoes.addAll(config.customHoes);
 | 
			
		||||
//        customPickaxes.addAll(config.customPickaxes);
 | 
			
		||||
//        customShovels.addAll(config.customShovels);
 | 
			
		||||
//        customSwords.addAll(config.customSwords);
 | 
			
		||||
//        customToolMap.putAll(config.customToolMap);
 | 
			
		||||
//        repairables.addAll(config.repairables);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomBoots(Material material) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customBoots.contains(material);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomChestplate(Material material) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customChestplates.contains(material);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomHelmet(Material material) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customHelmets.contains(material);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomLeggings(Material material) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customLeggings.contains(material);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomAxe(Material material) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customAxes.contains(material);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomBow(Material material) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customBows.contains(material);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomHoe(Material material) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customHoes.contains(material);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomPickaxe(Material material) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customPickaxes.contains(material);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomShovel(Material material) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customShovels.contains(material);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomSword(Material material) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customSwords.contains(material);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomOre(Material data) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customOres.contains(data);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomLog(BlockState state) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customLogs.contains(state.getType());
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomAbilityBlock(BlockState state) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customAbilityBlocks.contains(state.getType());
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomExcavationBlock(BlockState state) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customExcavationBlocks.contains(state.getType());
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomHerbalismBlock(BlockState state) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customHerbalismBlocks.contains(state.getType());
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomMiningBlock(BlockState state) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customMiningBlocks.contains(state.getType());
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public CustomBlock getBlock(BlockState state) {
 | 
			
		||||
//        return customBlockMap.get(state.getType());
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public CustomBlock getBlock(Material data) {
 | 
			
		||||
//        return customBlockMap.get(data);
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    /**
 | 
			
		||||
//     * Checks to see if an item is a custom tool.
 | 
			
		||||
//     *
 | 
			
		||||
//     * @param item Item to check
 | 
			
		||||
//     * @return true if the item is a custom tool, false otherwise
 | 
			
		||||
//     */
 | 
			
		||||
//    public boolean isCustomTool(ItemStack item) {
 | 
			
		||||
//        return mcMMO.p.getGeneralConfig().getToolModsEnabled() && item != null && customToolMap.containsKey(item.getType());
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    /**
 | 
			
		||||
//     * Get the custom tool associated with an item.
 | 
			
		||||
//     *
 | 
			
		||||
//     * @param item The item to check
 | 
			
		||||
//     * @return the tool if it exists, null otherwise
 | 
			
		||||
//     */
 | 
			
		||||
//    public CustomTool getTool(ItemStack item) {
 | 
			
		||||
//        return item == null ? null : customToolMap.get(item.getType());
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public List<Repairable> getLoadedRepairables() {
 | 
			
		||||
//        return repairables;
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public boolean isCustomEntity(Entity entity) {
 | 
			
		||||
//        if (!mcMMO.p.getGeneralConfig().getEntityModsEnabled()) {
 | 
			
		||||
//            return false;
 | 
			
		||||
//        }
 | 
			
		||||
//
 | 
			
		||||
//        if (customEntityTypeMap.containsKey(entity.getType().toString())) {
 | 
			
		||||
//            return true;
 | 
			
		||||
//        }
 | 
			
		||||
//
 | 
			
		||||
//        try {
 | 
			
		||||
//            return customEntityClassMap.containsKey(((Class<?>) entity.getClass().getDeclaredField("entityClass").get(entity)).getName());
 | 
			
		||||
//        }
 | 
			
		||||
//        catch (Exception e) {
 | 
			
		||||
//            if (e instanceof NoSuchFieldException || e instanceof IllegalArgumentException || e instanceof IllegalAccessException) {
 | 
			
		||||
//                return customEntityClassMap.containsKey(entity.getClass().getName());
 | 
			
		||||
//            }
 | 
			
		||||
//
 | 
			
		||||
//            e.printStackTrace();
 | 
			
		||||
//            return false;
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public CustomEntity getEntity(Entity entity) {
 | 
			
		||||
//        CustomEntity customEntity = customEntityTypeMap.get(entity.getType().toString());
 | 
			
		||||
//
 | 
			
		||||
//        if (customEntity == null) {
 | 
			
		||||
//            try {
 | 
			
		||||
//                customEntity = customEntityClassMap.get(((Class<?>) entity.getClass().getDeclaredField("entityClass").get(entity)).getName());
 | 
			
		||||
//            }
 | 
			
		||||
//            catch (Exception e) {
 | 
			
		||||
//                if (e instanceof NoSuchFieldException || e instanceof IllegalArgumentException || e instanceof IllegalAccessException) {
 | 
			
		||||
//                    customEntity = customEntityClassMap.get(entity.getClass().getName());
 | 
			
		||||
//                } else {
 | 
			
		||||
//                    e.printStackTrace();
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//        }
 | 
			
		||||
//
 | 
			
		||||
//        return customEntity;
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    public void addCustomEntity(Entity entity) {
 | 
			
		||||
//        if (!mcMMO.p.getGeneralConfig().getEntityModsEnabled()) {
 | 
			
		||||
//            return;
 | 
			
		||||
//        }
 | 
			
		||||
//
 | 
			
		||||
//        File entityFile = new File(mcMMO.p.getDataFolder(), "mods" + File.separator + "entities.default.yml");
 | 
			
		||||
//        YamlConfiguration entitiesFile = YamlConfiguration.loadConfiguration(entityFile);
 | 
			
		||||
//
 | 
			
		||||
//        String entityName = entity.getType().toString();
 | 
			
		||||
//        String sanitizedEntityName = entityName.replace(".", "_");
 | 
			
		||||
//
 | 
			
		||||
//        if (entitiesFile.getKeys(false).contains(sanitizedEntityName)) {
 | 
			
		||||
//            return;
 | 
			
		||||
//        }
 | 
			
		||||
//
 | 
			
		||||
//        entitiesFile.set(sanitizedEntityName + ".XP_Multiplier", 1.0D);
 | 
			
		||||
//        entitiesFile.set(sanitizedEntityName + ".Tameable", false);
 | 
			
		||||
//        entitiesFile.set(sanitizedEntityName + ".Taming_XP", 0);
 | 
			
		||||
//        entitiesFile.set(sanitizedEntityName + ".CanBeSummoned", false);
 | 
			
		||||
//        entitiesFile.set(sanitizedEntityName + ".COTW_Material", "");
 | 
			
		||||
//        entitiesFile.set(sanitizedEntityName + ".COTW_Material_Data", 0);
 | 
			
		||||
//        entitiesFile.set(sanitizedEntityName + ".COTW_Material_Amount", 0);
 | 
			
		||||
//
 | 
			
		||||
//        String className = "";
 | 
			
		||||
//
 | 
			
		||||
//        try {
 | 
			
		||||
//            className = ((Class<?>) entity.getClass().getDeclaredField("entityClass").get(entity)).getName();
 | 
			
		||||
//        }
 | 
			
		||||
//        catch (Exception e) {
 | 
			
		||||
//            if (e instanceof NoSuchFieldException || e instanceof IllegalArgumentException || e instanceof IllegalAccessException) {
 | 
			
		||||
//                className = entity.getClass().getName();
 | 
			
		||||
//            } else {
 | 
			
		||||
//                e.printStackTrace();
 | 
			
		||||
//            }
 | 
			
		||||
//        }
 | 
			
		||||
//
 | 
			
		||||
//        CustomEntity customEntity = new CustomEntity(1.0D, false, 0, false, null, 0);
 | 
			
		||||
//        customEntityTypeMap.put(entityName, customEntity);
 | 
			
		||||
//        customEntityClassMap.put(className, customEntity);
 | 
			
		||||
//
 | 
			
		||||
//        try {
 | 
			
		||||
//            entitiesFile.save(entityFile);
 | 
			
		||||
//            LogUtils.debug(mcMMO.p.getLogger(), entity.getType().toString() + " was added to the custom entities file!");
 | 
			
		||||
//        }
 | 
			
		||||
//        catch (Exception e) {
 | 
			
		||||
//            e.printStackTrace();
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
@@ -313,15 +313,6 @@ public final class CommandRegistrationManager {
 | 
			
		||||
        command.setExecutor(new McscoreboardCommand());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void registerMcImportCommand() {
 | 
			
		||||
        PluginCommand command = mcMMO.p.getCommand("mcimport");
 | 
			
		||||
        command.setDescription("Import mod config files"); //TODO: Localize
 | 
			
		||||
        command.setPermission("mcmmo.commands.mcimport");
 | 
			
		||||
        command.setPermissionMessage(permissionsMessage);
 | 
			
		||||
        command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mcimport"));
 | 
			
		||||
        command.setExecutor(new McImportCommand());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void registerReloadLocaleCommand() {
 | 
			
		||||
        PluginCommand command = mcMMO.p.getCommand("mcmmoreloadlocale");
 | 
			
		||||
        command.setDescription("Reloads locale"); // TODO: Localize
 | 
			
		||||
@@ -351,7 +342,6 @@ public final class CommandRegistrationManager {
 | 
			
		||||
        registerXPBarCommand();
 | 
			
		||||
        registerMmoInfoCommand();
 | 
			
		||||
        registerMmoDebugCommand();
 | 
			
		||||
        registerMcImportCommand();
 | 
			
		||||
        registerMcabilityCommand();
 | 
			
		||||
        registerMcgodCommand();
 | 
			
		||||
        registerMcChatSpyCommand();
 | 
			
		||||
 
 | 
			
		||||
@@ -898,9 +898,7 @@ public final class CombatUtils {
 | 
			
		||||
                baseXP = 20 * ExperienceConfig.getInstance().getPlayerVersusPlayerXP();
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            if (mcMMO.getModManager().isCustomEntity(target)) {
 | 
			
		||||
                baseXP = mcMMO.getModManager().getEntity(target).getXpMultiplier();
 | 
			
		||||
            } else if (target instanceof Animals) {
 | 
			
		||||
            if (target instanceof Animals) {
 | 
			
		||||
                EntityType type = target.getType();
 | 
			
		||||
                baseXP = ExperienceConfig.getInstance().getAnimalsXP(type);
 | 
			
		||||
            } else if (target instanceof Monster) {
 | 
			
		||||
@@ -919,7 +917,6 @@ public final class CombatUtils {
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    baseXP = 1.0;
 | 
			
		||||
                    mcMMO.getModManager().addCustomEntity(target);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -1046,8 +1043,6 @@ public final class CombatUtils {
 | 
			
		||||
            tier = 4;
 | 
			
		||||
        } else if (ItemUtils.isNetheriteTool(inHand)) {
 | 
			
		||||
            tier = 5;
 | 
			
		||||
        } else if (mcMMO.getModManager().isCustomTool(inHand)) {
 | 
			
		||||
            tier = mcMMO.getModManager().getTool(inHand).getTier();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return tier;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
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.entity.EntityType;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
@@ -11,7 +10,6 @@ import java.util.concurrent.ConcurrentHashMap;
 | 
			
		||||
import java.util.function.Function;
 | 
			
		||||
 | 
			
		||||
import static com.gmail.nossr50.util.text.StringUtils.getCapitalized;
 | 
			
		||||
import static java.util.Objects.requireNonNull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Utility class for String operations, including formatting and caching deterministic results to improve performance.
 | 
			
		||||
@@ -22,15 +20,8 @@ public class ConfigStringUtils {
 | 
			
		||||
 | 
			
		||||
    // Using concurrent hash maps to avoid concurrency issues (Folia)
 | 
			
		||||
    private static final Map<EntityType, String> configEntityStrings = new ConcurrentHashMap<>();
 | 
			
		||||
    private static final Map<SuperAbilityType, String> configSuperAbilityStrings = new ConcurrentHashMap<>();
 | 
			
		||||
    private static final Map<Material, String> configMaterialStrings = new ConcurrentHashMap<>();
 | 
			
		||||
    private static final Map<PartyFeature, String> configPartyFeatureStrings = new ConcurrentHashMap<>();
 | 
			
		||||
    
 | 
			
		||||
    public static String getConfigSuperAbilityString(SuperAbilityType superAbilityType) {
 | 
			
		||||
        requireNonNull(superAbilityType, "superAbilityType cannot be null");
 | 
			
		||||
        return configSuperAbilityStrings.computeIfAbsent(superAbilityType,
 | 
			
		||||
                ConfigStringUtils::createConfigFriendlyString);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getMaterialConfigString(Material material) {
 | 
			
		||||
        return configMaterialStrings.computeIfAbsent(material, ConfigStringUtils::createConfigFriendlyString);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user