好吧,对于我的Bukkit插件,我需要以下java类(NewItem.java)可序列化,但事实并非如此.当我的插件试图保存它时,它给我错误:
16:33:23 [SEVERE] java.io.NotSerializableException: org.bukkit.inventory.ItemSta
ck
16:33:23 [SEVERE] at java.io.ObjectOutputStream.writeObject0(Unknown Sourc
e)
16:33:23 [SEVERE] at java.io.ObjectOutputStream.writeObject(Unknown Source
)
16:33:23 [SEVERE] at java.util.ArrayList.writeObject(Unknown Source)
16:33:23 [SEVERE] at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown
Source)
16:33:23 [SEVERE] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unkno
wn Source)
16:33:23 [SEVERE] at java.lang.reflect.Method.invoke(Unknown Source)
16:33:23 [SEVERE] at java.io.ObjectStreamClass.invokeWriteObject(Unknown S
ource)
16:33:23 [SEVERE] at java.io.ObjectOutputStream.writeSerialData(Unknown So
urce)
16:33:23 [SEVERE] at java.io.ObjectOutputStream.writeOrdinaryObject(Unknow
n Source)
16:33:23 [SEVERE] at java.io.ObjectOutputStream.writeObject0(Unknown Sourc
e)
16:33:23 [SEVERE] at java.io.ObjectOutputStream.writeObject(Unknown Source
)
16:33:23 [SEVERE] at java.util.HashMap.writeObject(Unknown Source)
16:33:23 [SEVERE] at sun.reflect.GeneratedMethodAccessor42.invoke(Unknown
Source)
16:33:23 …Run Code Online (Sandbox Code Playgroud) 我正在开发一个Bukkit插件(错误与bukkit或它的api无关,但我包括了这个事实,我使用它是为了完整性,如果你不知道它是什么/没有听说过你应该仍然能够回答这个问题).我正在处理的插件是一个反聊天垃圾邮件插件.我没有明显的理由得到nullpointerexception.这是一些代码:
public class SpamListener implements Listener{
private HashMap<String, Long> lastMessage;
private HashMap<String, Integer> spamScore;
public void init(){
lastMessage = new HashMap<String, Long>();
spamScore = new HashMap<String, Integer>();
}
@EventHandler
public void playerChatEvent(AsyncPlayerChatEvent e){
if(AntiGrief.instance.config.getBoolean("antispam.enabled") && (!e.getPlayer().hasPermission("antigrief.spam.bypass"))){
Player player = e.getPlayer();
String name = player.getName();
int startingScore = spamScore.get(name); // <-- NullPointerException occurs here
//More spam checking code here
}
}
Run Code Online (Sandbox Code Playgroud)
JavaPlugin类(主类,对于那些不熟悉bukkit的人):
spamListener = new SpamListener();
spamListener.init(); // <-- yes the method is being called, same error occurs if the hashmap …Run Code Online (Sandbox Code Playgroud) 我正在使用Minecraft插件来保护一个区域.我有一个区域类,它是在玩家选择3个区块后创建的,这个区域类有一个名为" tooBig" 的方法,它用于检测区域是否大于" block^3".问题是这个方法总是返回false.
public boolean tooBig(int i) {
boolean bo1, bo2, bo3;
bo1 = Math.abs(b1.getX() - b2.getX()) > i;
bo2 = Math.abs(b1.getZ() - b2.getZ()) > i;
bo3 = Math.abs(b1.getY() - b3.getY()) > i;
return bo1 && bo2 && bo3;
}
Run Code Online (Sandbox Code Playgroud)
b1,b2和b3是Block对象.
最近我一直试图在minecraft服务器(用Java运行)和scratch(用JavaScript运行)之间进行通信.我已经用java编写了代码:
package me.yotam180;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class HttpProcessor {
public MainClass plugin;
public HttpProcessor (MainClass plug) throws IOException {
plugin = plug;
plugin.getLogger().info("CREATED HTTTP PROCESSOR");
HttpServer server = HttpServer.create(new InetSocketAddress(9090), 0);
server.createContext("/pollplayer", new PollPlayerHandler());
server.createContext("/killplayer", new KillPlayerHandler());
plugin.getLogger().info("STARTED HTTTP SERVER");
server.setExecutor(null); // creates a default executor
server.start();
}
static class PollPlayerHandler implements HttpHandler {
@SuppressWarnings("deprecation")
@Override
public void handle(HttpExchange httpExchange) throws IOException {
// …Run Code Online (Sandbox Code Playgroud) 我编写了一个没有错误的Bukkit插件,但在游戏中它有一个问题.
每当使用该命令时,它都不会执行它应该执行的操作.相反,它向我发送了一条大胆的信息,说明我打字的内容/leaving.
这是我的代码:
public class SeeYouSoon extends JavaPlugin{
// Start
@Override
public void onEnable(){
}
@Override
public void onDisable() {
}
//Commands
public boolean onCommand(CommandSender sender, Command cmd, String[] args){
if(cmd.getName().equalsIgnoreCase("leaving")){
Player player = (Player) sender;
Bukkit.broadcastMessage(ChatColor.RED + player.getName() + ChatColor.LIGHT_PURPLE + ChatColor.ITALIC + " is about to leave the server. Please say your goodbyes!");
Bukkit.getScheduler().runTaskLater(this, new Runnable() {
public void run() {
//Run your function or change stuff here.
player.kickPlayer(ChatColor.RED + "Kicked:" + ChatColor.WHITE + " You …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个插件,您可以在其中键入命令/设置并切换布尔值集.如果设置为true,我想要它,所以当玩家加入它时对他们说"嗨",但如果它是'假'则它什么都不做.(顺便说一句,我是唯一可以使用该命令的人).我尝试创建两个类,一个是主要的,第二个是监听器,但我无法从监听器类访问布尔值,所以我尝试在一个类中完成所有操作.使用我提供的代码时,除了PlayerJoinEvent之外,一切都有效.我要么想弄清楚如何从另一个类访问布尔值或如何解决这个问题.
package me.jakegeyer28;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
import net.md_5.bungee.api.ChatColor;
public class Main extends JavaPlugin implements Listener{
public boolean set = true;
@Override
public void onEnable() {
getLogger().info("Done");
}
@Override
public void onDisable() {
getLogger().info("Done");
}
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (cmd.getName().equalsIgnoreCase("settings")) {
Player player = (Player) sender;
if (player.getName().equalsIgnoreCase("jakegeyer27")) {
if(set == true) {
set = false;
player.sendMessage(ChatColor.RED + "Off");
}
else if …Run Code Online (Sandbox Code Playgroud) 通过阅读现有文章,我了解到“断言”不应在生产代码中使用,但是IntelliJ给我的第一个技巧是,当我使用一种我知道不会为NULL的方法时,但在其他方面还是可以为Null的,是要告诉我应该使用“断言”

在上面的代码中,创建新的ItemStack时ItemMeta不会为null,但是如果ItemStack也为null,则可以为null,这就是为什么它没有@NotNull批注的原因。
知道这一点,处理此警告的最正确方法是什么?是因为我知道它永远不会为空而忽略它,还是仍然进行空检查。如果要执行null检查哪种类型,请断言或我已经做过的方式是
if(fillerMeta != null)
Run Code Online (Sandbox Code Playgroud) 好的,我试图在玩家登录时检查他们的库存,它说显示名称
public void onPlayerJoin(PlayerJoinEvent event) {
Player p = event.getPlayer();
for (int i = 0; i < p.getInventory().getSize(); i++) {
if (p.getInventory().getItem(i).getType() != null) {
if (!p.getInventory().getItem(i).getItemMeta().getDisplayName().equals("KITS")){
Bukkit.broadcastMessage(i.getItemMeta().getDisplayName());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它只是导致错误。
错误日志:
public void onPlayerJoin(PlayerJoinEvent event) {
Player p = event.getPlayer();
for (int i = 0; i < p.getInventory().getSize(); i++) {
if (p.getInventory().getItem(i).getType() != null) {
if (!p.getInventory().getItem(i).getItemMeta().getDisplayName().equals("KITS")){
Bukkit.broadcastMessage(i.getItemMeta().getDisplayName());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这是一个 NullPointerException 但我不知道它怎么能这么说。我希望你明白我写的...
我正在开发一个程序,我想使用接口。类似于 Bukkit 在他们的 Player 类中使用的方式,这里。我已经多次观看和阅读有关界面的教程,甚至尝试过自己测试但没有运气。
假设我有一个“用户”界面,带有一个返回字符串的方法占位符。该方法将命名为 getName()。
我想要做
User user = (INSTANTIATE SOMEHOW);
System.out.println(user.getName());
Run Code Online (Sandbox Code Playgroud)
这是在 Bukkit 的实现中以大致相同的方式实现的
Player player = Server.getPlayer("Jimmothy");
System.out.println(player.getName());
Run Code Online (Sandbox Code Playgroud)
我只是不知道如何让这样的事情发挥作用。为了实例化播放器类,您可以使用许多“getPlayer()”方法之一。唯一的问题是包含这些方法的类也是接口,所以我也不知道如何获取接口的实例。搜索代码也无济于事,因为我似乎无法找到这些类中的方法在哪里以及是否实际上是使用 Overrides 或其他东西构建的。(如果这就是覆盖的工作方式)。
谁知道呢,也许我只需要知道如何实例化或获取用户界面的实例,我就准备好了。我知道您不能使用“new ClassName();”创建接口实例。我从来没有真正理解他们,但我真的很想。
这似乎是一个非常愚蠢的问题,我相信答案非常简单,但帮助会很棒!:) 感谢您的阅读。
我希望取消ender胸部打开事件,并在右键单击时显示打开和关闭动画.我目前的代码是:
public void changeChestState(Location loc, boolean open) {
if (open) {
for (Player p : Bukkit.getOnlinePlayers()) {
p.playNote(loc, (byte) 1, (byte) 1);
}
} else {
for (Player p : Bukkit.getOnlinePlayers()) {
p.playNote(loc, (byte) 1, (byte) 0);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我右键单击胸部时,我听到声音,但没有动画发生.感谢您的帮助!
bukkit ×10
java ×9
minecraft ×8
plugins ×3
class ×1
interface ×1
javascript ×1
listeners ×1
mit-scratch ×1
module ×1