Вопрос Не работает генерация предмета в сундуке

Версия Minecraft
1.17.X

ProGiple

Пользователь
Сообщения
80
Решения
1
Привет, разработчики! В разработке немного, поэтому хочу спросить: "почему не работает генерация новых предметов в сундуках при первом их открытии?"

Код:
package org.satellite.progiple.sateitemgen;

import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.world.LootGenerateEvent;
import org.bukkit.inventory.AnvilInventory;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;

public final class SateItemGen extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        saveDefaultConfig();
        reloadConfig();
        getServer().getPluginManager().registerEvents(this, this);

        if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
            Bukkit.getPluginManager().registerEvents(this, this);
        } else {
            Bukkit.getPluginManager().disablePlugin(this);
        }
        if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { //
            new checkitem().register(); //
        }
    }

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

    @Override
    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
        if (sender.hasPermission("sateitemgen.admin")) {
            if (args[0].equalsIgnoreCase("reload")) {
                sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a Плагин перезагружен!"));
                reloadConfig();
            }
            else if (args[0].equalsIgnoreCase("give")) {
                if (args.length > 2) {
                    Player player = getServer().getPlayer(args[1]);
                    if (player != null) {
                        player.getInventory().addItem(item(args[2]));
                    }
                }
            }
            else if (args[0].equalsIgnoreCase("remove")) {
                if (args.length > 3) {
                    Player player = getServer().getPlayer(args[1]);
                    int amount = Integer.parseInt(args[3]);
                    ItemStack item = item(args[2]);
                    item.setAmount(amount);
                    assert player != null;
                    player.getInventory().remove(item);
                }
            }
        }
        else {
            sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c У вас нет права на использование!"));
        }
        return true;
    }

    @EventHandler
    public void onGenLoot(LootGenerateEvent e) {
        String world = e.getWorld().getName();

        ConfigurationSection section = getConfig().getConfigurationSection("items");
        assert section != null;
        Set<String> set = section.getKeys(false);
        List<String> items = new ArrayList<>(set);

        for (String name : items) {
            ItemStack item = item(name);
            PersistentDataContainer data = item.getItemMeta().getPersistentDataContainer();

            Double chanceInt = data.get(new NamespacedKey(this, "sigchance"), PersistentDataType.DOUBLE);
            double chance = 0.05;
            double random = Math.random();
            if (chanceInt != null) {
                chance = chanceInt / 100;
            }

            if (Objects.requireNonNull(data.get(new NamespacedKey(this, "sigworld"), PersistentDataType.STRING)).equalsIgnoreCase("world")) {
                if (world.equalsIgnoreCase("world")) {
                    if (chance >= random) {
                        e.getLoot().add(item);
                    }
                }
                break;
            }
            else if (Objects.requireNonNull(data.get(new NamespacedKey(this, "sigworld"), PersistentDataType.STRING)).equalsIgnoreCase("nether")) {
                if (world.equalsIgnoreCase("world_nether")) {
                    if (chance >= random) {
                        e.getLoot().add(item);
                    }
                }
                break;
            }
            else if (Objects.requireNonNull(data.get(new NamespacedKey(this, "sigworld"), PersistentDataType.STRING)).equalsIgnoreCase("end")) {
                if (world.equalsIgnoreCase("world_the_end")) {
                    if (chance >= random) {
                        e.getLoot().add(item);
                    }
                }
                break;
            }
            else {
                if (chance >= random) {
                    e.getLoot().add(item);
                }
                break;
            }
        }
    }

    @EventHandler
    public void inInventory(InventoryClickEvent e) {
        ItemStack item = e.getCurrentItem();
        Inventory inv = e.getClickedInventory();
        if (inv instanceof AnvilInventory) {
            assert item != null;
            if (item.getItemMeta().hasCustomModelData() && item.getItemMeta().getCustomModelData() == 980089) {
                e.setCancelled(true);
            }
        }
    }

    @EventHandler
    public void Place(BlockPlaceEvent e) {
        Block block = e.getBlock();
        ItemStack item = e.getItemInHand();
        if (item.getItemMeta().hasCustomModelData() && item.getItemMeta().getCustomModelData() == 980089) {
            if (block.getType() == item.getType()) {
                e.setCancelled(true);
            }
        }
    }

    private ItemStack item(String itemName) {

        String path = "items." + itemName;

        ItemStack item = new ItemStack(Material.valueOf(getConfig().getString(path + ".material")));
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(str(path + ".name"));

        meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
        meta.addItemFlags(ItemFlag.HIDE_DYE);

        ConfigurationSection section = getConfig().getConfigurationSection(path);
        assert section != null;
        List<String> lines = section.getStringList("lore");
        List<String> lore = new ArrayList<>();
        for (String line : lines) {
            lore.add(ChatColor.translateAlternateColorCodes('&', line));
        }
        meta.setCustomModelData(980089);

        String action = str(path + ".dungWorld");
        meta.getPersistentDataContainer().set(new NamespacedKey(this, "sigworld"), PersistentDataType.STRING, action);

        String type = str(path + ".container");
        meta.getPersistentDataContainer().set(new NamespacedKey(this, "sigitemtype"), PersistentDataType.STRING, type);

        double chance = getConfig().getDouble(path + ".chance");
        meta.getPersistentDataContainer().set(new NamespacedKey(this, "sigchance"), PersistentDataType.DOUBLE, chance);

        if (getConfig().getBoolean(path + ".glowing")) {
            item.addUnsafeEnchantment(Enchantment.LURE, 2);
            meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        }

        meta.setLore(lore);
        item.setItemMeta(meta);
        return item;
    }

    private String str(String path) {
        return ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(getConfig().getString(path)));
    }
}
Предмет и плагин работют, всё выдаётся, но при открытии сундука, даже если на предмете шанс 99 или 100%, то это всё равно не работает...
 
Назад
Сверху Снизу