自定义修补附魔插件 1.8.8 不适用

问题描述 投票:0回答:1

这是我第一次创建插件,我想为 1.8.8 创建一个插件,使用 /mending 添加修复功能。

我遇到的问题是,当我对例如钻石剑进行/修补时,它会获得类似发光效果和NBT标签的附魔,但不是我的修补附魔,当我获得XP时,它也不会修复耐用性,所以是的。

如果有人可以帮助我,我将非常感激。

我上了4节课

主课(修补2)

package me.marmosat.mending2;

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerExpChangeEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

public class Mending2 extends JavaPlugin implements Listener {
    public static final CustomMendingEnchantment mendingEnchant = new CustomMendingEnchantment(240);

    @Override
    public void onLoad() {
        // Register the custom Mending enchantment
        CustomMendingEnchantment.registerEnchantment(this.getLogger());
    }

    @Override
    public void onEnable() {
        // Register events
        getLogger().info("Mending2 plugin has been enabled!");
        getServer().getPluginManager().registerEvents(this, this);

        // Register the /mending command
        getCommand("mending").setExecutor(new MendingCommandExecutor(getLogger()));
    }

    @Override
    public void onDisable() {
        // Plugin shutdown logic
    }

    @EventHandler
    public void onPlayerExpChange(PlayerExpChangeEvent event) {
        // Check if player has Mending enchanted items
        for (ItemStack item : event.getPlayer().getInventory().getContents()) {
            if (item != null && item.containsEnchantment(CustomMendingEnchantment.getCustomMendingEnchantment())) {
                // Calculate repair cost based on damage
                int repairCost = calculateRepairCost(item);

                // Deduct repair cost from player's experience
                if (event.getAmount() >= repairCost) {
                    event.setAmount(event.getAmount() - repairCost);

                    // Repair the item
                    repairItem(item);
                }
            }
        }
    }

    private int calculateRepairCost(ItemStack item) {
        // Calculate repair cost based on damage
        int maxDurability = item.getType().getMaxDurability();
        int durability = maxDurability - item.getDurability();
        double repairCostPercentage = 0.2; // Example: 20% repair cost per durability point
        return (int) Math.ceil(durability * repairCostPercentage);
    }

    private void repairItem(ItemStack item) {
        // Repair the item by setting its durability to its maximum
        item.setDurability((short) 0);
    }
}

自定义修补附魔

package me.marmosat.mending2;

import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentTarget;
import org.bukkit.inventory.ItemStack;
import java.util.logging.Logger;
import java.lang.reflect.Field;

public class CustomMendingEnchantment extends Enchantment {

    private static boolean registered = false;
    private static Logger logger;
    private static CustomMendingEnchantment instance;

    // Constructor
    public CustomMendingEnchantment(int id) {
        super(id);
    }

    // Static method to register the custom enchantment
    public static void registerEnchantment(Logger pluginLogger) {
        logger = pluginLogger;
        instance = new CustomMendingEnchantment(240);
        try {
            Field acceptingNewField = Enchantment.class.getDeclaredField("acceptingNew");
            acceptingNewField.setAccessible(true);
            acceptingNewField.set(null, true); // Allow registering new enchantments

            Enchantment.registerEnchantment(instance);
            logger.info("Custom Mending enchantment registered!");
            registered = true;
        } catch (Exception e) {

            // Failed to register the enchantment
            logger.severe("Failed to register custom Mending enchantment!");
        }
    }

    // Static method to get the custom enchantment instance
    public static CustomMendingEnchantment getCustomMendingEnchantment() {
        if (instance == null) {
            // If the enchantment is not registered, return null
            logger.warning("Custom Mending enchantment has not been registered!");
        }
        return instance;
    }
    // Method to check if the enchantment is registered
    public static boolean isRegistered() {
        return registered;
    }

    // Implementing abstract method getName() from Enchantment
    @Override
    public String getName() {
        return "Mending"; // Set the name of the enchantment
    }

    // Implementing abstract method getMaxLevel() from Enchantment
    @Override
    public int getMaxLevel() {
        return 1; // Set the maximum level of the enchantment
    }

    // Implementing abstract method getStartLevel() from Enchantment
    @Override
    public int getStartLevel() {
        return 1; // Set the starting level of the enchantment
    }

    // Implementing abstract method getItemTarget() from Enchantment
    @Override
    public EnchantmentTarget getItemTarget() {
        return EnchantmentTarget.BREAKABLE; // Specify the item target for the enchantment
    }

    // Implementing abstract method isTreasure() from Enchantment
    @Override
    public boolean isTreasure() {
        return false; // Indicate whether the enchantment is considered a treasure enchantment
    }

    // Implementing abstract method isCursed() from Enchantment
    @Override
    public boolean isCursed() {
        return false; // Indicate whether the enchantment is considered a curse
    }

    // Implementing abstract method conflictsWith(Enchantment) from Enchantment
    @Override
    public boolean conflictsWith(Enchantment other) {
        // Indicate whether this enchantment conflicts with another enchantment
        return false; // Mending does not conflict with other enchantments
    }

    // Implementing abstract method canEnchantItem(ItemStack) from Enchantment
    @Override
    public boolean canEnchantItem(ItemStack item) {
        // Return true if the item can be enchanted with this enchantment
        return true; // Can enchant any item
    }

    // Implementing other Enchantment methods as needed
}

修补命令执行器

package me.marmosat.mending2;

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

import java.util.logging.Logger;

public class MendingCommandExecutor implements CommandExecutor {

    private final Logger logger;

    // Constructor with Logger parameter
    public MendingCommandExecutor(Logger logger) {
        this.logger = logger;
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        // Check if the sender is a player
        if (!(sender instanceof Player)) {
            sender.sendMessage("This command can only be executed by players.");
            return false;
        }

        Player player = (Player) sender;

        // Check if the player has permission to use the command
        if (!player.isOp()) {
            sender.sendMessage("You do not have permission to use this command.");
            return false;
        }

        try {
            // Get the item the player is currently holding in the main hand
            ItemStack heldItem = player.getInventory().getItemInHand(); // Deprecated in newer versions, but still usable in 1.8.8

            // Check if the held item is not air
            if (heldItem != null && heldItem.getType() != Material.AIR) {
                // Apply the Mending enchantment to the held item
                if (CustomMendingEnchantment.isRegistered()) {
                    heldItem.addUnsafeEnchantment(CustomMendingEnchantment.getCustomMendingEnchantment(), 1);
                    player.sendMessage("The item in your hand now has the Mending enchantment.");
                } else {
                    player.sendMessage("An error occurred while executing the command.");
                    logger.severe("Custom Mending enchantment is not registered.");
                }
            } else {
                player.sendMessage("You are not holding any item.");
            }
            return true;
        } catch (Exception e) {
            // Handle any exceptions
            sender.sendMessage("An error occurred while executing the command.");
            logger.severe("Error while executing /mending command: " + e.getMessage());
            return false;
        }
    }
}

修补监听器

package me.marmosat.mending2;

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerExpChangeEvent;
import org.bukkit.inventory.ItemStack;

public class MendingListener implements Listener {

    @EventHandler
    public void onPlayerExpChange(PlayerExpChangeEvent event) {
        // Check if player has Mending enchanted items
        for (ItemStack item : event.getPlayer().getInventory().getContents()) {
            if (item != null && item.containsEnchantment(CustomMendingEnchantment.getCustomMendingEnchantment())) {
                // Calculate repair cost based on damage
                int repairCost = calculateRepairCost(item);
    
                // Deduct repair cost from player's experience
                if (event.getAmount() >= repairCost) {
                    event.setAmount(event.getAmount() - repairCost);
    
                    // Repair the item
                    repairItem(item);
                }
            }
        }
    }
    
    private int calculateRepairCost(ItemStack item) {
        // Calculate repair cost based on damage
        int maxDurability = item.getType().getMaxDurability();
        int durability = maxDurability - item.getDurability();
        double repairCostPercentage = 0.2; // Example: 20% repair cost per durability point
        return (int) Math.ceil(durability * repairCostPercentage);
    }
    
    private void repairItem(ItemStack item) {
        // Repair the item by setting its durability to its maximum
        item.setDurability((short) 0);
    }

}

顺便说一句,聊天 gpt 完成了大部分工作,但它给代码带来了大约 30 个错误,然后我需要以某种方式修复这些错误

我尝试询问多个人工智能,例如chatgpt,但他们都很愚蠢,所以是的,我也傻眼了。

java plugins minecraft bukkit
1个回答
0
投票

你在两个不同的班级听

PlayerExpChangeEvent
有什么原因吗?

为了缩小问题范围:您能否验证是否调用了这些方法(打印行或断点)。

© www.soinside.com 2019 - 2024. All rights reserved.