最近,我编写了这个插件,当你点击一个播放器时会打开一个库存,但出于某种原因,库存不会打开。
主:
package me.jacobsscoots.main;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import me.jacobsscoots.listeners.Admin;
public class Main extends JavaPlugin{
Admin admin;
List<String> toggle = new ArrayList<String>();
public void onEnable() {
getLogger().info("Utils is now enabled");
admin = new Admin();
Bukkit.getServer().getPluginManager().registerEvents(admin, this);
}
public void onDisable() {
getLogger().info("Utils is now disabled");
}
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
Player player = (Player) sender;
PlayerInventory pi = player.getInventory();
if(label.equalsIgnoreCase("admin")){
if(!(sender instanceof Player)){
sender.sendMessage(ChatColor.RED + "Staff Mode" + ChatColor.WHITE + " >> " + ChatColor.GRAY + "You muse be a player to use this command!");
return false;
}
if(toggle.contains(player.getName())){
player.sendMessage(ChatColor.RED + "Staff Mode" + ChatColor.WHITE + " >> " + ChatColor.GRAY + "You are no longer in staff mode.");
toggle.remove(player.getName());
pi.clear();
return true;
}
player.sendMessage(ChatColor.RED + "Staff Mode" + ChatColor.WHITE + " >> " + ChatColor.GRAY + "You are now in staff mode.");
toggle.add(player.getName());
ItemStack paper = new ItemStack(Material.PAPER, 1);
ItemMeta meta = paper.getItemMeta();
meta.setDisplayName(ChatColor.RED + "Punish");
paper.setItemMeta(meta);
pi.addItem(paper);
admin.setEnabled(true);
return true;
}
return false;
}
}
听众课程:
package me.jacobsscoots.listeners;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import net.md_5.bungee.api.ChatColor;
public class Admin implements Listener{
private boolean enabled = false;
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onAdminEvent(PlayerInteractEntityEvent e) {
if (!(e.getRightClicked() instanceof Player))
return;
if(enabled == false){
return;
}
Player p = e.getPlayer();
Player target = (Player) e.getRightClicked();
if(p.isOp() && p.getInventory().getItemInMainHand().equals(Material.PAPER) && e.getRightClicked().getType() == EntityType.PLAYER){
openGUI(p, target);
}
}
@EventHandler
public void onInventoryClick(InventoryClickEvent event)
{
if (event.isCancelled())
return;
if (!event.getInventory().getName().contains(" Punishment"))
return;
Player player = (Player) event.getWhoClicked();
Player target = Bukkit.getPlayer(ChatColor.stripColor(event.getClickedInventory().getName().split(" ")[0]));
ItemStack item = event.getCurrentItem();
Integer slot = event.getSlot();
if (item == null || item.getType() == Material.AIR || !item.hasItemMeta())
return;
if (slot == 20){
target.kickPlayer(player.getName() + " Banned you for: " + item.getItemMeta().getDisplayName());
}
event.setCancelled(true);
}
private void openGUI(Player player, Player target) {
Inventory inv = Bukkit.createInventory(null, 54, ChatColor.GRAY + target.getName() + " Punishment");
ItemStack Ban_1 = new ItemStack(Material.IRON_BARDING, 1);
ItemMeta BanMeta_1 = Ban_1.getItemMeta();
BanMeta_1.setDisplayName(ChatColor.RED + "Hacked Clients, Cheats and Exploits");
Ban_1.setItemMeta(BanMeta_1);
ItemStack Ban_2 = new ItemStack(Material.IRON_BARDING, 1);
ItemMeta BanMeta_2 = Ban_2.getItemMeta();
BanMeta_2.setDisplayName(ChatColor.RED + "Spamming/Advertising");
Ban_2.setItemMeta(BanMeta_2);
ItemStack Ban_3 = new ItemStack(Material.IRON_BARDING, 1);
ItemMeta BanMeta_3 = Ban_3.getItemMeta();
BanMeta_3.setDisplayName(ChatColor.RED + "Not Respecting Players or Staff Members");
Ban_3.setItemMeta(BanMeta_3);
ItemStack Ban_4 = new ItemStack(Material.IRON_BARDING, 1);
ItemMeta BanMeta_4 = Ban_4.getItemMeta();
BanMeta_4.setDisplayName(ChatColor.RED + "DDOS/Dox Jokes and Threats");
Ban_4.setItemMeta(BanMeta_4);
ItemStack Ban_5 = new ItemStack(Material.IRON_BARDING, 1);
ItemMeta BanMeta_5 = Ban_5.getItemMeta();
BanMeta_5.setDisplayName(ChatColor.RED + "Mods that provide unfair advantages");
Ban_5.setItemMeta(BanMeta_5);
ItemStack Ban_6 = new ItemStack(Material.IRON_BARDING, 1);
ItemMeta BanMeta_6 = Ban_6.getItemMeta();
BanMeta_6.setDisplayName(ChatColor.RED + "Racism and Sexism");
Ban_6.setItemMeta(BanMeta_6);
ItemStack Ban_7 = new ItemStack(Material.IRON_BARDING, 1);
ItemMeta BanMeta_7 = Ban_7.getItemMeta();
BanMeta_7.setDisplayName(ChatColor.RED + "False Reporting");
Ban_7.setItemMeta(BanMeta_7);
ItemStack Ban_8 = new ItemStack(Material.IRON_BARDING, 1);
ItemMeta BanMeta_8 = Ban_8.getItemMeta();
BanMeta_8.setDisplayName(ChatColor.RED + "Greifing/Block Spam");
Ban_8.setItemMeta(BanMeta_8);
ItemStack Pane_1 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 11);
ItemStack Pane_2 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 14);
ItemMeta PaneMeta_2 = Pane_2.getItemMeta();
PaneMeta_2.setDisplayName(ChatColor.RED + "Kick");
Pane_2.setItemMeta(PaneMeta_2);
ItemStack Pane_3 = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 10);
ItemMeta PaneMeta_3 = Pane_3.getItemMeta();
PaneMeta_3.setDisplayName(ChatColor.GREEN + "Warn");
Pane_3.setItemMeta(PaneMeta_3);
ItemStack Exit = new ItemStack(Material.BARRIER, 1, (short) 10);
ItemMeta ExitMeta = Exit.getItemMeta();
ExitMeta.setDisplayName(ChatColor.RED + "Exit GUI");
Exit.setItemMeta(ExitMeta);
ItemStack skull = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
inv.setItem(0, Pane_1);
inv.setItem(1, Pane_1);
inv.setItem(2, Pane_1);
inv.setItem(3, Pane_2);
inv.setItem(4, skull);
inv.setItem(5, Pane_2);
inv.setItem(6, Pane_1);
inv.setItem(7, Pane_1);
inv.setItem(8, Pane_1);
inv.setItem(20, Ban_1);
inv.setItem(21, Ban_2);
inv.setItem(22, Ban_3);
inv.setItem(23, Ban_4);
inv.setItem(24, Ban_5);
inv.setItem(30, Ban_6);
inv.setItem(31, Ban_7);
inv.setItem(32, Ban_8);
inv.setItem(45, Pane_1);
inv.setItem(46, Pane_1);
inv.setItem(47, Pane_1);
inv.setItem(48, Pane_3);
inv.setItem(49, Exit);
inv.setItem(50, Pane_3);
inv.setItem(51, Pane_1);
inv.setItem(52, Pane_1);
inv.setItem(53, Pane_1);
player.openInventory(inv);
}
public boolean isEnabled(){
return enabled;
}
public void setEnabled(boolean enabled){
this.enabled = enabled;
}
}
Plugin.yml:
name: Utils
version: 1.4.1
description: Staff mode plugin for servers
author: SickNation
main: me.jacobsscoots.main.Main
database: false
commands:
admin:
description: Default toggle command for staff mode.
usage: Syntax error! Simply type /<command> to go into staff mode.
答案 0 :(得分:3)
PlayerInteractEntityEvent
方法的最后一个陈述中的比较:
p.getInventory().getItemInMainHand().equals(Material.PAPER)
始终为false
,因为getItemInMainHand()
返回ItemStack
,Material.PAPER
是枚举数,equals
方法中的ItemStack
方法包含以下行:
if (!(obj instanceof ItemStack)) {
return false;
}
我猜你打算写
getItemInMainHand().getType().equals(Material.PAPER)
...比较两个Material
枚举数。当我测试你的代码并更改了那一行时,GUI就打开了。