Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Помогите пожалуйста ошибка при регистрации зачарования

sodex

Новичок
Баллы
16
Код:
package LIKGER.moreEnhants;

import LIKGER.moreEnhants.Enchats.BurEnchantment;
import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.plugin.java.JavaPlugin;

public final class MoreEnhants extends JavaPlugin {

    private BurEnchantment burEnchantment;

    @Override
    public void onEnable() {
        getLogger().info("Activating MoreEnhants..."); // Отладочное сообщение
        registerEnchantment();
        getCommand("moreenchants").setExecutor(new CommandGive(this));
        getLogger().info("MoreEnhants activated successfully!");
    }

    @Override
    public void onDisable() {
        // Логика завершения работы плагина
    }

    private void registerEnchantment() {
        NamespacedKey key = new NamespacedKey(this, "bur"); // Используем this для получения имени плагина
        burEnchantment = new BurEnchantment(key); // Сохраняем экземпляр в поле класса

        // Регистрация зачарования
        try {
            // Проверка, существует ли уже зачарование
            if (Enchantment.getByKey(key) == null) {
                // Регистрация через рефлексию
                java.lang.reflect.Field byNameField = Enchantment.class.getDeclaredField("byName");
                byNameField.setAccessible(true);
                java.util.Map<String, Enchantment> byNameMap = (java.util.Map<String, Enchantment>) byNameField.get(null);
                byNameMap.put(burEnchantment.getName().toLowerCase(), burEnchantment);

                java.lang.reflect.Field byKeyField = Enchantment.class.getDeclaredField("byKey");
                byKeyField.setAccessible(true);
                java.util.Map<NamespacedKey, Enchantment> byKeyMap = (java.util.Map<NamespacedKey, Enchantment>) byKeyField.get(null);
                byKeyMap.put(key, burEnchantment);
            }
        } catch (Exception ex) {
            ex.printStackTrace(); // Логируем исключение
        }
    }

    public BurEnchantment getBurEnchantment() {
        return burEnchantment;
    }
}
Код:
package LIKGER.moreEnhants;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.*********ventory.ItemStack;
import org.*********ventory.meta.EnchantmentStorageMeta;

public class CommandGive implements CommandExecutor {
    private final MoreEnhants plugin;

    public CommandGive(MoreEnhants plugin) {
        this.plugin = plugin;
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (args.length != 4 || !args[0].equals("give") || !args[2].equals("bur")) {
            sender.sendMessage("Неправильная команда. Используйте /moreenchants give <игрок> bur <уровень>");
            return true;
        }

        Player player = Bukkit.getPlayer(args[1]);
        if (player == null) {
            sender.sendMessage("Игрок не найден");
            return true;
        }

        int level;
        try {
            level = Integer.parseInt(args[3]);
        } catch (NumberFormatException e) {
            sender.sendMessage("Неправильный уровень");
            return true;
        }

        if (level < 1 || level > plugin.getBurEnchantment().getMaxLevel()) {
            sender.sendMessage("Неправильный уровень");
            return true;
        }

        ItemStack book = new ItemStack(org.bukkit.Material.ENCHANTED_BOOK);
        EnchantmentStorageMeta meta = (EnchantmentStorageMeta) book.getItemMeta();
        if (meta != null) {
            // Используем непосредственно burEnchantment
            meta.addStoredEnchant(plugin.getBurEnchantment(), level, true);
            book.setItemMeta(meta);

            player.getInventory().addItem(book);
            sender.sendMessage("Книга с зачарованием выдана игроку " + player.getName());
        } else {
            sender.sendMessage("Ошибка при создании зачарованной книги");
        }

        return true;
    }
}
Код:
package LIKGER.moreEnhants.Enchats;

import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentTarget;
import org.*********ventory.ItemStack;

public class BurEnchantment extends Enchantment {

    private final NamespacedKey key;

    public BurEnchantment(NamespacedKey key) {
        super(key);
        this.key = key; // Сохраняем ключ
    }

    @Override
    public String getName() {
        return "Bur Enchantment"; // Название вашего зачарования
    }

    @Override
    public int getMaxLevel() {
        return 1; // Максимальный уровень
    }

    @Override
    public int getStartLevel() {
        return 1; // Начальный уровень
    }

    @Override
    public EnchantmentTarget getItemTarget() {
        return EnchantmentTarget.ALL; // Целевой предмет
    }

    @Override
    public boolean isTreasure() {
        return false; // Не является сокровищем
    }

    @Override
    public boolean isCursed() {
        return false; // Не является проклятым
    }

    @Override
    public boolean conflictsWith(Enchantment other) {
        return false; // Не конфликтует с другими зачарованиями
    }

    @Override
    public boolean canEnchantItem(ItemStack item) {
        return true; // Может быть наложено на любой предмет
    }

    @Override
    public String getTranslationKey() {
        return "enchantment." + key.getKey(); // Добавляем перевод
    }

    @Override
    public NamespacedKey getKey() {
        return key; // Возвращаем ключ зачарования
    }
}
Код:
package LIKGER.moreEnhants.Enchats;

import org.bukkit.enchantments.Enchantment;

public class BurEnchantmentHandle {

    private final BurEnchantment enchantment;

    public BurEnchantmentHandle(BurEnchantment enchantment) {
        this.enchantment = enchantment;
    }

    public Enchantment getHandle() {
        return enchantment; // Возвращаем сам экземпляр зачарования
    }
}
Код:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>LIKGER</groupId>
    <artifactId>moreenhants</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <name>moreenhants</name>

    <properties>
        <java.version>21</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <defaultGoal>clean package</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.13.0</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.5.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

    <repositories>
        <repository>
            <id>spigotmc-repo</id>
            <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
        </repository>
        <repository>
            <id>sonatype</id>
            <url>https://oss.sonatype.org/content/groups/public/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.spigotmc</groupId>
            <artifactId>spigot-api</artifactId>
            <version>1.21-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
Screenshot_34.png Screenshot_35.png
 
Код:
package LIKGER.moreEnhants;

import LIKGER.moreEnhants.Enchats.BurEnchantment;
import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.plugin.java.JavaPlugin;

public final class MoreEnhants extends JavaPlugin {

    private BurEnchantment burEnchantment;

    @Override
    public void onEnable() {
        getLogger().info("Activating MoreEnhants..."); // Отладочное сообщение
        registerEnchantment();
        getCommand("moreenchants").setExecutor(new CommandGive(this));
        getLogger().info("MoreEnhants activated successfully!");
    }

    @Override
    public void onDisable() {
        // Логика завершения работы плагина
    }

    private void registerEnchantment() {
        NamespacedKey key = new NamespacedKey(this, "bur"); // Используем this для получения имени плагина
        burEnchantment = new BurEnchantment(key); // Сохраняем экземпляр в поле класса

        // Регистрация зачарования
        try {
            // Проверка, существует ли уже зачарование
            if (Enchantment.getByKey(key) == null) {
                // Регистрация через рефлексию
                java.lang.reflect.Field byNameField = Enchantment.class.getDeclaredField("byName");
                byNameField.setAccessible(true);
                java.util.Map<String, Enchantment> byNameMap = (java.util.Map<String, Enchantment>) byNameField.get(null);
                byNameMap.put(burEnchantment.getName().toLowerCase(), burEnchantment);

                java.lang.reflect.Field byKeyField = Enchantment.class.getDeclaredField("byKey");
                byKeyField.setAccessible(true);
                java.util.Map<NamespacedKey, Enchantment> byKeyMap = (java.util.Map<NamespacedKey, Enchantment>) byKeyField.get(null);
                byKeyMap.put(key, burEnchantment);
            }
        } catch (Exception ex) {
            ex.printStackTrace(); // Логируем исключение
        }
    }

    public BurEnchantment getBurEnchantment() {
        return burEnchantment;
    }
}
Код:
package LIKGER.moreEnhants;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.*********ventory.ItemStack;
import org.*********ventory.meta.EnchantmentStorageMeta;

public class CommandGive implements CommandExecutor {
    private final MoreEnhants plugin;

    public CommandGive(MoreEnhants plugin) {
        this.plugin = plugin;
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (args.length != 4 || !args[0].equals("give") || !args[2].equals("bur")) {
            sender.sendMessage("Неправильная команда. Используйте /moreenchants give <игрок> bur <уровень>");
            return true;
        }

        Player player = Bukkit.getPlayer(args[1]);
        if (player == null) {
            sender.sendMessage("Игрок не найден");
            return true;
        }

        int level;
        try {
            level = Integer.parseInt(args[3]);
        } catch (NumberFormatException e) {
            sender.sendMessage("Неправильный уровень");
            return true;
        }

        if (level < 1 || level > plugin.getBurEnchantment().getMaxLevel()) {
            sender.sendMessage("Неправильный уровень");
            return true;
        }

        ItemStack book = new ItemStack(org.bukkit.Material.ENCHANTED_BOOK);
        EnchantmentStorageMeta meta = (EnchantmentStorageMeta) book.getItemMeta();
        if (meta != null) {
            // Используем непосредственно burEnchantment
            meta.addStoredEnchant(plugin.getBurEnchantment(), level, true);
            book.setItemMeta(meta);

            player.getInventory().addItem(book);
            sender.sendMessage("Книга с зачарованием выдана игроку " + player.getName());
        } else {
            sender.sendMessage("Ошибка при создании зачарованной книги");
        }

        return true;
    }
}
Код:
package LIKGER.moreEnhants.Enchats;

import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentTarget;
import org.*********ventory.ItemStack;

public class BurEnchantment extends Enchantment {

    private final NamespacedKey key;

    public BurEnchantment(NamespacedKey key) {
        super(key);
        this.key = key; // Сохраняем ключ
    }

    @Override
    public String getName() {
        return "Bur Enchantment"; // Название вашего зачарования
    }

    @Override
    public int getMaxLevel() {
        return 1; // Максимальный уровень
    }

    @Override
    public int getStartLevel() {
        return 1; // Начальный уровень
    }

    @Override
    public EnchantmentTarget getItemTarget() {
        return EnchantmentTarget.ALL; // Целевой предмет
    }

    @Override
    public boolean isTreasure() {
        return false; // Не является сокровищем
    }

    @Override
    public boolean isCursed() {
        return false; // Не является проклятым
    }

    @Override
    public boolean conflictsWith(Enchantment other) {
        return false; // Не конфликтует с другими зачарованиями
    }

    @Override
    public boolean canEnchantItem(ItemStack item) {
        return true; // Может быть наложено на любой предмет
    }

    @Override
    public String getTranslationKey() {
        return "enchantment." + key.getKey(); // Добавляем перевод
    }

    @Override
    public NamespacedKey getKey() {
        return key; // Возвращаем ключ зачарования
    }
}
Код:
package LIKGER.moreEnhants.Enchats;

import org.bukkit.enchantments.Enchantment;

public class BurEnchantmentHandle {

    private final BurEnchantment enchantment;

    public BurEnchantmentHandle(BurEnchantment enchantment) {
        this.enchantment = enchantment;
    }

    public Enchantment getHandle() {
        return enchantment; // Возвращаем сам экземпляр зачарования
    }
}
Код:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>LIKGER</groupId>
    <artifactId>moreenhants</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <name>moreenhants</name>

    <properties>
        <java.version>21</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <defaultGoal>clean package</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.13.0</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.5.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

    <repositories>
        <repository>
            <id>spigotmc-repo</id>
            <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
        </repository>
        <repository>
            <id>sonatype</id>
            <url>https://oss.sonatype.org/content/groups/public/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.spigotmc</groupId>
            <artifactId>spigot-api</artifactId>
            <version>1.21-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
Посмотреть вложение 68144 Посмотреть вложение 68145
Сам писал? :lol:
 

Поделиться этой страницей

Назад
Верх