Плагин Custom Mending Enchantment 1.8.8 не применяетсяJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Плагин Custom Mending Enchantment 1.8.8 не применяется

Сообщение Anonymous »

Я впервые создаю плагин, я хотел создать плагин для 1.8.8, который добавляет исправление с помощью /mending.
У меня проблема в том, что когда я делаю / при починке, например, алмазного меча, он получает зачарованный эффект свечения и тег nbt, но не мое заклинание починки, оно также не исправляет долговечность, когда я получаю опыт, так что да.
Если кто-нибудь может мне помочь, я был бы очень признателен.
У меня 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
}
MendingCommandExecutor

Код: Выделить всё

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;
}
}
}
MendingListener

Код: Выделить всё

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 ошибками, которые мне затем нужно как-то исправить.
Я пробовал спросить несколько ИИ типа чатгпт, но они все тупые, так что да, я тоже в тупике.

Подробнее здесь: https://stackoverflow.com/questions/785 ... t-applying
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»