Java 无法编辑符号-Bukkit:org.Bukkit.command.CommandException:未处理的异常正在执行命令';标志';在插件X中

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)

我是bukkit/spiget的新手,我正在制作一个插件,玩家可以在其中键入命令“/sign”,并在玩家旁边创建一个附在木块上的标志。该标志将显示“你好,玩家名称”。但是,我得到了错误:
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
}