- Баллы
- 76
- Имя в Minecraft
- kolia1_1
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
не работает код работает на всех слотахevent.getInventory().getType() != InventoryType.PLAYER
Типы здесь.
Как сказали выше юзай InventoryHolder.да нету метода getClickedInv - пропал , и вовсе небыло
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);
}
}
}
Зачем новый объект если можно кастануть кликнутый инвентарь?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 года, к кому ты обращаешься?Я в твоём коде запутался. Можешь посмотреть мой код?
Теме 3 года, к кому ты обращаешься?
1) Самая распространённая проблема у новичков - не зарегистрировал слушатель
Bukkit.getPluginManager.registerEvents(new onInventoryClick(), this);
2) Ты проверяешь event.getInventory() instanceof ..., но класс инвентаря тебе даёт ведро через Bukkit.createInventory(). Проверять надо холдер -
if (event.getClickedInventory() != null && event.getClickedInventory().getHolder() instanceof YourHolderClass)
Ну и класс с большой буквы переназови