2016-04-17 11 views
2

私はbukkit/spigotを初めて使用していて、プラグインを作成していました。サインとサインが木製のブロックに貼り付けられ、プレーヤーの隣に作成されます。記号に「Hello PlayerName」と表示されます。しかし、私はエラー:org.bukkit.command.CommandException: Unhandled exception executing command 'sign' in pluginを得ました。ここで署名を編集できません - Bukkit:org.bukkit.command.CommandException:未処理の例外がプラグインで 'sign'を実行していますX

は、私のコードの一部です:

 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 

答えて

1

あなたはそれがインスタンスではありませんそのサブクラスにBlockBlockStateをキャストした場合は、(あなたのスタックトレースのように)このエラーがありますスロー:org.bukkit.craftbukkit.[version].block.CraftBlockState cannot be cast to org.bukkit.block.[YourState]。つまり、ブロックが実際にSignではないため、コードがBlockStateのようにSignのインスタンスではないため、コードでエラーが発生しています。将来的には、あなたは常に、スーパークラスは、特定のサブクラスにキャストすることができることを確認しinstanceofを使用してチェックすることができます。

if (block.getState() instanceof Sign) { 
    Sign sign = (Sign) block.getState(); 
    // ... Your code 
} 

あなたのブロックは、あなたがMaterial.SIGNにその材料を設定していても兆候ではない理由を、ということです実際には2つ(とMaterial.WALL_SIGN)のの項目のタイプであり、のブロックのタイプではありません。戸惑うことに、Blockのタイプをアイテムタイプのタイプに設定して、代わりにBlockのタイプまたはマテリアルを空に設定すると、Bukkit/Spigotは警告しません(したがってClassCastExceptionがスローされます)。私はあなたがサインのために頑丈なブロックを産んでいるので、おそらく後者の列挙子またはMaterial.WALL_SIGNを望んでいると思います。

また、記号のテキストが表示されるようにするには、(さらにはstate.update(true)を使用して強制的に更新することもできます)を使用してBlockStateを更新する必要があります。

次の行にプレイヤーの名前を作成するには、StringはMinecraftの兆候が処理しない\n改行文字を使用していない、sign.setLine(1, player.getName())を使用して2(インデックス1)行目にすることを追加する必要があります。

最後に、あなたのケースの壁のサインは間違った方向に向いていて、サインの回転を変えることで修正できます。これは木製ブロックがどこに配置されているかによって異なりますので、サインを西に向けるために回転させる必要があります。符号のローテーションを設定するには、Blockに非推奨のsetData(byte data)メソッドを使用することができますが、推奨されない、より読みやすい方法を使用したい場合は、別の小さな問題に対処する必要があります。org.bukkit.block.Signインターフェイスおよびorg.bukkit.material.Signクラスである。上記のSignのすべての用途は、BlockStateのサブタイプであるorg.bukkit.block.Signインターフェイスを参照しています。これは、例えば記号のテキストを設定するために使用されます。 org.bukkit.material.Signは、state.getData()を使用してアクセスできるMaterialDataクラスのサブタイプであり、そのクラスがDirectionalインターフェイス(具体的にはAttachableインターフェイス)を実装しているため、符号の方向を変更するために使用されます。したがって、テキストをに設定するには、符号を回転させて、クラスとインタフェースの両方を使用する必要があります。いくつかのコード例を示します:

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 
} 
関連する問題