Java 无法编辑符号-Bukkit:org.Bukkit.command.CommandException:未处理的异常正在执行命令';标志';在插件X中
我是bukkit/spiget的新手,我正在制作一个插件,玩家可以在其中键入命令“/sign”,并在玩家旁边创建一个附在木块上的标志。该标志将显示“你好,玩家名称”。但是,我得到了错误:Java 无法编辑符号-Bukkit:org.Bukkit.command.CommandException:未处理的异常正在执行命令';标志';在插件X中,java,minecraft,bukkit,Java,Minecraft,Bukkit,我是bukkit/spiget的新手,我正在制作一个插件,玩家可以在其中键入命令“/sign”,并在玩家旁边创建一个附在木块上的标志。该标志将显示“你好,玩家名称”。但是,我得到了错误:org.bukkit.command.CommandException:在插件中执行命令“登录”时出现未处理的异常 以下是我代码的一部分: if (cmd.getName().equalsIgnoreCase("sign") && sender instanceof Player)
org.bukkit.command.CommandException:在插件中执行命令“登录”时出现未处理的异常
以下是我代码的一部分:
if (cmd.getName().equalsIgnoreCase("sign") && sender instanceof Player){
Player player = (Player) sender;
Location location = player.getLocation();
World someWorld = Bukkit.getServer().getWorld("world");
double playerx = location.getX();
double playery = location.getY();
double playerz = location.getZ();
int px = (int)playerx;
int py = (int)playery;
int pz = (int)playerz;
Location nLoc = new Location(someWorld, px+2, py+1, pz);
Location sLoc = new Location(someWorld, px+1, py+1, pz);
Block block = someWorld.getBlockAt(nLoc);
block.setType(Material.WOOD);
Block block1 = someWorld.getBlockAt(sLoc);
block1.setType(Material.SIGN);
Sign sign = (Sign) block1.getState();
sign.setLine(0, "Hello\n"+player.getName());
}
如何修复此错误
我在控制台上遇到的完整错误是:
[17:46:00 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'sign' in plugin FirstPlugin v1.0
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at org.bukkit.craftbukkit.v1_9_R1.CraftServer.dispatchCommand(CraftServer.java:645) ~[spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at net.minecraft.server.v1_9_R1.PlayerConnection.handleCommand(PlayerConnection.java:1350) [spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at net.minecraft.server.v1_9_R1.PlayerConnection.a(PlayerConnection.java:1185) [spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at net.minecraft.server.v1_9_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_71]
at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_71]
at net.minecraft.server.v1_9_R1.SystemUtils.a(SourceFile:45) [spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at net.minecraft.server.v1_9_R1.MinecraftServer.D(MinecraftServer.java:721) [spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at net.minecraft.server.v1_9_R1.DedicatedServer.D(DedicatedServer.java:400) [spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at net.minecraft.server.v1_9_R1.MinecraftServer.C(MinecraftServer.java:660) [spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at net.minecraft.server.v1_9_R1.MinecraftServer.run(MinecraftServer.java:559) [spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_71]
Caused by: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_9_R1.block.CraftBlockState cannot be cast to org.bukkit.block.Sign
at zak.firstplugin.FirstPlugin.onCommand(FirstPlugin.java:58) ~[?:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot-1.9.jar:git-Spigot-d20369f-7fc5cd8]
... 15 more
如果将
块的BlockState
强制转换为它不是实例的子类,则会引发此错误(就像在堆栈跟踪中一样):org.bukkit.craftbukkit.[version]。Block.CraftBlockState无法强制转换为org.bukkit.Block。[YourState]
。换句话说,代码抛出该错误是因为块实际上不是符号
,因为它的块状态
不是符号
的实例。将来,您可以始终使用instanceof
进行检查,以确保可以将超类强制转换为特定的子类:
if (block.getState() instanceof Sign) {
Sign sign = (Sign) block.getState();
// ... Your code
}
即使将块的材质设置为material.sign
,块也不是符号的原因是material.sign
枚举器实际上指的是符号项类型,而不是块类型,其中实际上有两种(material.sign\u POST
和material.WALL\u sign
)。令人困惑的是,当您将块的类型设置为项目类型时,Bukkit/spiget不会警告您,而是将块的类型或材质设置为air(从而引发类castexception
)。我猜,由于您正在生成符号的实心块,您可能需要后一个枚举器或Material.WALL\u sign
此外,为了确保标志上的文本出现,您需要使用state.update()
(甚至可能使用state.update(true)
)强制更新BlockState)
要在下一行写下玩家的名字,您需要使用sign.setLine(1,player.getName())
将字符串添加到第2行(索引1),而不是使用\n
换行符,Minecraft符号不处理该字符
最后但并非最不重要的一点是,您案例中的墙标志将朝向错误的方向,可以通过更改标志的旋转来固定。当然,这取决于木块相对于标志的放置位置,因此在您的情况下,标志需要朝西旋转。要设置符号的旋转,我们可以使用setData(byte data)
方法来设置Block
s,但是如果您想使用非弃用的、更容易阅读的方式,我们必须处理另一个小问题:有一个org.bukkit.Block.sign
接口和一个org.bukkit.material.sign
类。上述Sign
的所有用法均参考org.bukkit.block.Sign
界面,该界面是BlockState
的子类型。例如,这用于设置符号的文本org.bukkit.material.Sign
是MaterialData
类的一个子类型,我们可以使用state.getData()
访问该类,并用于更改符号的方向,因为该类实现了定向
接口(特别是可附加
接口)。因此,要设置文本并旋转符号,我们必须同时使用类和接口。下面是一些示例代码:
Block sign = world.getBlockAt(signLoc); // Get the block
sign.setType(Material.WALL_SIGN); // Set the type to "WALL_SIGN", now it's BlockState is an instance of "Sign"
BlockState signState = sign.getState(); // Get the general state
if (signState instanceof org.bukkit.block.Sign) { // Make sure the sign block really does have the "Sign" BlockState (this isn't really necessary, more of a double check)
org.bukkit.block.Sign signBlock = (org.bukkit.block.Sign) signState; // Note that this is the org.bukkit.block.Sign interface
signBlock.setLine(0, "Hello"); // Set the first line
signBlock.setLine(1, player.getName()); // Set the second line
if (signState.getData() instanceof org.bukkit.material.Sign) { // Now get the "MaterialData" from the BlockState...
org.bukkit.material.Sign signMaterialData = (org.bukkit.material.Sign) signState.getData(); // And cast it to org.bukkit.material.Sign
signMaterialData.setFacingDirection(BlockFace.WEST); // Use this to change the direction of the sign, in this case WEST (sign is placed + X direction of player)
}
signBlock.update(); // Update the sign's state
}