1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите InventoryClickEvent (detect)

Тема в разделе "Разработка плагинов для новичков", создана пользователем koliab, 16 июл 2018.

  1. Автор темы
    koliab

    koliab Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    kolia1_1
    Мне надо проверить клик игрока если он кликает в кастомное меню а не к себе в инвентарь Screenshot_64.png
     
  2. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
  3. Автор темы
    koliab

    koliab Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    kolia1_1
    че за дела почему нету метода (версия 1.12.2)
     

    Вложения:

  4. Автор темы
    koliab

    koliab Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    kolia1_1
    не работает код работает на всех слотах
     
  5. Автор темы
    koliab

    koliab Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    kolia1_1
  6. Автор темы
    koliab

    koliab Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    kolia1_1
    я менял == != не помогло
     
  7. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    getClickedInventory().getHolder()
     
  8. Автор темы
    koliab

    koliab Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    kolia1_1
    да нету метода getClickedInv - пропал , и вовсе небыло
     
  9. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
  10. Akultist

    Akultist Активный участник Пользователь

    Баллы:
    46
    Как сказали выше юзай InventoryHolder.

    P.S - создаешь отдельный класс для инвенторя. Делаешь ему implements InventoryHolder.
    Переопределяешь метод getInventory(); P.S#2 - создавать инвентарь там надо так: Inventory inv = Bukkit.createInventory(this (Обязательно!), ну а дальше параметры инвентаря);

    Так же можешь в этом классе сделать сразу метод который будет обрабатывать клики. А потом в отдельном слушателе ивентов можешь сделать ивент который слушает клики. И проверять если e.getClickedInventory().getHolder() instanceof ClassInventory то тогда делать новый объект того класса где делал реализацию. И просто вызывать этот метод.

    Открываешь игроку инвентарь очень просто:
    p.openInventory(new TestInventory().getInventory());

    P.S#3 -

    Класс InventoryHolder -
    Код:
    package com.statspl.inventorys;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.inventory.InventoryClickEvent;
    import org.*********ventory.Inventory;
    import org.*********ventory.InventoryHolder;
    import org.*********ventory.ItemStack;
    import org.*********ventory.meta.ItemMeta;
    
    public class TestInventory implements InventoryHolder {
    
        @Override
        public Inventory getInventory() {
            Inventory inv = Bukkit.createInventory(this, 27, "Name");
    
            ItemStack stack = new ItemStack(Material.BEDROCK, 3);
            ItemMeta meta = stack.getItemMeta();
            meta.setDisplayName("Тест блок");
            stack.setItemMeta(meta);
    
            inv.setItem(0, stack);
            return inv;
        }
    
        public void onInventoryClick(InventoryClickEvent e) {
            final Player p = (Player) e.getWhoClicked();
            final ItemStack currItem = e.getCurrentItem();
    
            if (e.getCurrentItem().getType() == Material.BEDROCK) {
                p.sendMessage("Вы кликнули по бэдроку! Слот: §c" + e.getSlot());
                p.closeInventory();
                return;
            }
        }
    
    }
    
    Класс слушателя ивентов -
    Код:
    package com.statspl.listeners;
    
    import com.statspl.inventorys.TestInventory;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryClickEvent;
    
    public class ClickEvents implements Listener {
    
        @EventHandler
        public void onInventoryClick(InventoryClickEvent e) {
            if (e.getWhoClicked() instanceof Player) {
                if (e.getClickedInventory() instanceof TestInventory)
                    new TestInventory().onInventoryClick(e);
            }
        }
    
    }
    
    Писал всё на быструю руку, могут быть ошибки.
     
  11. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Зачем новый объект если можно кастануть кликнутый инвентарь?
     
  12. UnknKriod

    UnknKriod Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    UnknKriod
    Код:
    package me.unknkriod.adm911plug;
    
    import me.unknkriod.adm911plug.Managers.CallsGUI;
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryClickEvent;
    import org.*********ventory.ItemStack;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class onInventoryClick implements Listener {
        private CallsGUI callsGUI;
        public onInventoryClick() {
            this.callsGUI = new CallsGUI();
        }
        [USER=74023]@EventHandler[/USER]
        public void onClick(InventoryClickEvent event) {
            if (event.getClickedInventory() != null && event.getClickedInventory() instanceof CallsGUI) {
                event.setCancelled(true);  // Отменяем событие, чтобы предотвратить перемещение предметов
    
                ItemStack clickedItem = event.getCurrentItem();
                if (clickedItem != null && clickedItem.getType() == Material.PLAYER_HEAD) {
                    // Получаем номер вызова из головы
                    int callNumber = callsGUI.getCallNumberFromItem(clickedItem);
                    Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "911 accept " + callNumber);
                }
            }
        }
    }
    
    Код:
    package me.unknkriod.adm911plug.Managers;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.configuration.file.YamlConfiguration;
    import org.*********ventory.Inventory;
    import org.*********ventory.ItemStack;
    import org.*********ventory.meta.ItemMeta;
    import org.*********ventory.meta.SkullMeta;
    
    import java.io.File;
    import java.util.Arrays;
    import java.util.Set;
    import java.util.UUID;
    import com.mojang.authlib.GameProfile;
    import com.mojang.authlib.properties.Property;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class CallsGUI {
        private static final String INVENTORY_TITLE = "Вызовы 911";
        //private static final String CALLS_CONFIG_PATH = "calls";
        private static final String HEADS_API_URL = "https://mc-heads.net/head/";
        public Inventory createGUI(File datafolder) {
            File callsFile = new File(datafolder, "calls.yml");
            FileConfiguration callsConfig = YamlConfiguration.loadConfiguration(callsFile);
            if (!callsConfig.isConfigurationSection("calls")) {
                // Если раздел "calls" не существует, возвращаем пустой инвентарь
                return Bukkit.createInventory(null, 9, INVENTORY_TITLE);
            }
    
            Set<String> callNumbers = callsConfig.getConfigurationSection("calls").getKeys(false);
            int rows = (int) Math.ceil(callNumbers.size() / 9.0) * 9; // Округляем количество строк вверх до ближайшего множителя 9
            Inventory inventory = Bukkit.createInventory(null, rows, INVENTORY_TITLE);
    
            for (String callNumber : callNumbers) {
                String description = callsConfig.getString("calls." + callNumber + ".description");
                String coordinates = callsConfig.getString("calls." + callNumber + ".coordinates");
                String nickname = callsConfig.getString("calls." + callNumber + ".nickname");
                String uuid = callsConfig.getString("calls." + callNumber + ".uuid");
                ItemStack headItem = createHeadItem(callNumber, description, coordinates, nickname, uuid);
                inventory.addItem(headItem);
            }
    
            return inventory;
        }
    
        public int getCallNumberFromItem(ItemStack item) {
            ItemMeta meta = item.getItemMeta();
            if (meta != null && meta.hasDisplayName()) {
                String displayName = meta.getDisplayName();
                // Извлекаем номер вызова из имени
                return Integer.parseInt(displayName.split(":")[1].trim());
            }
            return 0;
        }
    
        private ItemStack createHeadItem(String callNumber, String description, String coordinates, String nickname, String uuid) {
            ItemStack headItem = new ItemStack(Material.PLAYER_HEAD);
            SkullMeta skullMeta = (SkullMeta) headItem.getItemMeta();
    
            // Формируем информацию о вызове для отображения в элементе инвентаря
            String displayName = "Вызов: " + callNumber;
            String lore = "Игрок: " + ((nickname != null && !nickname.isEmpty()) ? nickname : "Unknown") + "\n" +
                    "UUID: " + uuid + "\n" +
                    "§cПроблема: §b" + description + "\n" +
                    "§6Координаты: " + coordinates;
            skullMeta.setOwningPlayer(Bukkit.getOfflinePlayer(!nickname.isEmpty() ? nickname : "Unknown"));
    
            skullMeta.setDisplayName(displayName);
            skullMeta.setLore(Arrays.asList(lore.split("\n")));
    
            headItem.setItemMeta(skullMeta);
    
            return headItem;
        }
        private String getSkinTexture(String playerName) {
            try {
                URL url = new URL(HEADS_API_URL + playerName);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    
                if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream());
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                    StringBuilder response = new StringBuilder();
    
                    String line;
                    while ((line = bufferedReader.readLine()) != null) {
                        response.append(line);
                    }
    
                    bufferedReader.close();
    
                    // Извлекаем текстуру из JSON-ответа
                    String texture = response.toString();
                    int index = texture.indexOf("\"value\":\"") + 9;
                    int endIndex = texture.indexOf("\"", index);
                    return texture.substring(index, endIndex);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    }
    
    Ивент не работает
     
    Последнее редактирование: 21 ноя 2023
  13. UnknKriod

    UnknKriod Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    UnknKriod
    Я в твоём коде запутался. Можешь посмотреть мой код?
     
  14. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Теме 3 года, к кому ты обращаешься?
    1) Самая распространённая проблема у новичков - не зарегистрировал слушатель
    Bukkit.getPluginManager.registerEvents(new onInventoryClick(), this);
    2) Ты проверяешь event.getInventory() instanceof ..., но класс инвентаря тебе даёт ведро через Bukkit.createInventory(). Проверять надо холдер -
    if (event.getClickedInventory() != null && event.getClickedInventory().getHolder() instanceof YourHolderClass)
    Ну и класс с большой буквы переназови
     
  15. UnknKriod

    UnknKriod Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    UnknKriod
    Спасибо
     

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