这是我第一次创建插件,我想为 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,但他们都很愚蠢,所以是的,我也傻眼了。
你在两个不同的班级听
PlayerExpChangeEvent
有什么原因吗?
为了缩小问题范围:您能否验证是否调用了这些方法(打印行或断点)。