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

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

koliab

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
kolia1_1
Мне надо проверить клик игрока если он кликает в кастомное меню а не к себе в инвентарьScreenshot_64.png
 
че за дела почему нету метода (версия 1.12.2)
 

Вложения:

  • Screenshot_65.png
    Screenshot_65.png
    Размер файла
    5,4 КБ
    Просмотров
    25
я менял == != не помогло
 
да нету метода getClickedInv - пропал , и вовсе небыло
 
да нету метода getClickedInv - пропал , и вовсе небыло
Как сказали выше юзай 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);
        }
    }

}

Писал всё на быструю руку, могут быть ошибки.
 
Код:
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;
    }
}

Ивент не работает
 
Последнее редактирование:
Как сказали выше юзай 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);
        }
    }

}

Писал всё на быструю руку, могут быть ошибки.

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

Спасибо
 

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

Назад
Верх