【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.308743)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by mcgo » 2017年10月05日(木) 17:27

code
コード: 全て選択
public boolean onCommand(CommandSender sender, Command cmd, String s, String[] args) {
        if (cmd.getName().equalsIgnoreCase("playerinfo")) {
            if (!(sender instanceof Player)) {
                if ("reload".equals(args[0])) {
                    処理
                } else {
                    処理
                }
            } else {
                if (sender.isOp()) {
                    getLogger().info("0");
                    if (args.length == 0) {
                       処理
                    } else if ("reload".equals(args[0])) {
                        処理
                    } else if ("help".equals(args[0])) {
                        処理
                    } else if ("show".equals(args[0])) {
                        if (args.length == 1) {
                            処理
                        } else if (getServer().getPlayer(args[1]) == null) {
                            処理
                        } else {
                            処理
                        }
                    } else if ("open".equals(args[0])) {
                        getLogger().info("1");
                        if (args.length == 1) {
                            処理
                        } else if (getServer().getPlayer(args[1]) == null) {
                            処理
                        } else {
                            getLogger().info("2");
                            Player senderP = (Player) sender;
                            getLogger().info("3");
                            int c;
                            getLogger().info("4");
                            Player p = getServer().getPlayer(args[1]);
                            getLogger().info("5");
                            Inventory playerInv = Bukkit.createInventory(null, 9, p.getName() + "'s inventory");
                            getLogger().info("6");
                            for (c = 0; c <= 26; c++) {
                                playerInv.setItem(c, p.getInventory().getItem(c + 9));
                            }
                            getLogger().info("7");
                            for (c = 27; c <= 35; c++) {
                                playerInv.setItem(c, new ItemStack(Material.STAINED_GLASS));
                            }
                            getLogger().info("8");
                            for (c = 36; c <= 44; c++) {
                                playerInv.setItem(c, p.getInventory().getItem(c));
                            }
                            getLogger().info("9");
                            int cc = 45;
                            getLogger().info("10");
                            for (c = 103; c >= 100; c--) {
                                playerInv.setItem(cc, p.getInventory().getItem(c));
                                cc++;
                            }
                            getLogger().info("11");
                            playerInv.setItem(49, new ItemStack(Material.STAINED_GLASS));
                            getLogger().info("12");
                            playerInv.setItem(50, p.getEquipment().getItemInOffHand());
                            getLogger().info("13");
                            for (c = 51; c <= 53; c++) {
                                playerInv.setItem(c, new ItemStack(Material.STAINED_GLASS));
                            }
                            getLogger().info("14");
                            senderP.openInventory(playerInv);
                            getLogger().info("15");
                            return true;
                        }
                    } else {
                        処理
                    }
                } else {
                    処理
                }
                return true;
            }
        }
        return false;
    }


試行錯誤をした結果、引数が無い場合のhelpの表示に成功しました。
上記がそのコードです。
もう一つ、プレイヤーのインベントリ表示についてですが、自分の説明不足でした。すみません。
自分の考えてたことは、指定したプレイヤーのインベントリ、ホットバー、防具、オフハンドのアイテムを
1つのGUIに表示するというものです。
そのためfor文を複数使い新規作成したGUIにプレイヤーのインベントリから取得したアイテムをセットするという
処理を書きました。
しかし、なぜかfor文の手前で処理が例外処理へいってしまい、正常に動作しないという状況なのです。

これに関しては2つ目の引数でプレイヤーのフルネームや、プレイヤーの名前の一部(testというplayerなら引数2にtやteやtes)を
入れて実行するとエラーが発生します。
エラー
コード: 全て選択
[17:24:19 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'playerinfo' in plugin PlayerInfo v1.0
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[patched_1.10.2.jar:git-Paper-916.2]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:151) ~[patched_1.10.2.jar:git-Paper-916.2]
        at org.bukkit.craftbukkit.v1_10_R1.CraftServer.dispatchCommand(CraftServer.java:672) ~[patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.PlayerConnection.handleCommand(PlayerConnection.java:1396) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.PlayerConnection.a(PlayerConnection.java:1201) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.PacketPlayInChat.a(PacketPlayInChat.java:5) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.PlayerConnectionUtils$1.run(SourceFile:13) [patched_1.10.2.jar:git-Paper-916.2]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_112]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_112]
        at net.minecraft.server.v1_10_R1.SystemUtils.a(SourceFile:45) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:808) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:404) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:740) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:639) [patched_1.10.2.jar:git-Paper-916.2]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_112]
Caused by: java.lang.ArrayIndexOutOfBoundsException: 9
        at org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventoryCustom$MinecraftInventory.setItem(CraftInventoryCustom.java:105) ~[patched_1.10.2.jar:git-Paper-916.2]
        at org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory.setItem(CraftInventory.java:88) ~[patched_1.10.2.jar:git-Paper-916.2]
        at mc.gogojp.playerinfo.PlayerInfo.onCommand(PlayerInfo.java:138) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[patched_1.10.2.jar:git-Paper-916.2]
        ... 15 more
サーバー関係の分からないことは英語で検索したら案外出ててくるで!
だってMinecraftって海外生まれやで!
最近はSkriptを使って色々自作してサーバー作ってます。
もしよければSkript作成してもいいゾ(激ムズは拒否するかも・・・)
詳しくはPMで!
【Skript自作コード公開中】
アバター
mcgo
ID:54bef510
石炭掘り
 
記事: 227
登録日時: 2016年11月04日(金) 00:05

  • (PostNo.308746)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by elise_blacklab » 2017年10月05日(木) 17:43

mcgo さんが書きました:試行錯誤をした結果、引数が無い場合のhelpの表示に成功しました。

デバッグしてる間はいいんだろうけどこのままだと,コンソールからコマンド打った時に同じ過ちを繰り返すぞ
コード: 全て選択
        if (cmd.getName().equalsIgnoreCase("playerinfo")) {
            if (!(sender instanceof Player)) {
                if ("reload".equals(args[0])) {//←
                    処理
                } else {
                    処理
                }
            }}

コンソールアプリを作った経験はおありで?引数を使うときは,サイズのチェックは真っ先に(2回目)

mcgo さんが書きました:これに関しては2つ目の引数でプレイヤーのフルネームや、プレイヤーの名前の一部(testというplayerなら引数2にtやteやtes)を
入れて実行するとエラーが発生します。

まずどこでExceptionを吐いているのか認識できているのか怪しいところですが
コード: 全て選択
Caused by: java.lang.ArrayIndexOutOfBoundsException: 9
        at org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventoryCustom$MinecraftInventory.setItem(CraftInventoryCustom.java:105) ~[patched_1.10.2.jar:git-Paper-916.2]
        at org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory.setItem(CraftInventory.java:88) ~[patched_1.10.2.jar:git-Paper-916.2]
        at mc.gogojp.playerinfo.PlayerInfo.onCommand(PlayerInfo.java:138) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[patched_1.10.2.jar:git-Paper-916.2]
        ... 15 more
とある通りsetItemを呼ぶ際に吐いてるんですね
で,「9」でIndexOutOfBoundsを呼ばれているということは,「9」を指定してsetItemを呼んでいそうな箇所って「for文の手前」じゃなくてブロックの中なんですよね

(PlayerInfo.java:138)の部分を見ると,例外を吐いている行数が分かるので,そこ周辺を確かめると良いですよ
大方,範囲外のスロット番号を指定しているとかじゃないですかね
メイドつくってたりします.http://el-blacklab.net/
アバター
elise_blacklab
ID:0f87040f
掘り廃人
 
記事: 2404
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.308751)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by amata1219 » 2017年10月05日(木) 18:33

mcgo さんが書きました:amata1219さんご回答ありがとうございます。
amata1219さんのサンプルコードと全く同じように引数が無い場合のみでif文を書きましたが
やはり例外処理にいってしまいます。
チェックを入れてみたところ、
コード: 全て選択
 public boolean onCommand(CommandSender sender, Command cmd, String s, String[] args) {
        if (cmd.getName().equalsIgnoreCase("playerinfo")) {
            getLogger().info("コマンド実行");
            if ("reload".equals(args[0])) {
                処理
            } else if (!(sender instanceof Player)) {
                処理
            } else {
                getLogger().info("コマンド実行2");
                if (sender.isOp()) {
                    getLogger().info("0");
                    if (args.length == 0) {
                       以下省略: 処理

/playerinfoと実行したときにgetLogger().info("コマンド実行2");が実行されていませんでした。
そのときエラーが以下のようにです。
エラー
コード: 全て選択
[16:20:51 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'playerinfo' in plugin PlayerInfo v1.0
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[patched_1.10.2.jar:git-Paper-916.2]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:151) ~[patched_1.10.2.jar:git-Paper-916.2]
        at org.bukkit.craftbukkit.v1_10_R1.CraftServer.dispatchCommand(CraftServer.java:672) ~[patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.PlayerConnection.handleCommand(PlayerConnection.java:1396) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.PlayerConnection.a(PlayerConnection.java:1201) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.PacketPlayInChat.a(PacketPlayInChat.java:5) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.PlayerConnectionUtils$1.run(SourceFile:13) [patched_1.10.2.jar:git-Paper-916.2]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_112]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_112]
        at net.minecraft.server.v1_10_R1.SystemUtils.a(SourceFile:45) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:808) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:404) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:740) [patched_1.10.2.jar:git-Paper-916.2]
        at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:639) [patched_1.10.2.jar:git-Paper-916.2]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_112]
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
        at mc.gogojp.playerinfo.PlayerInfo.onCommand(PlayerInfo.java:50) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[patched_1.10.2.jar:git-Paper-916.2]
        ... 15 more


もう一つ、プレイヤーのインベントリ表示についてですが、自分の説明不足でした。すみません。
自分の考えてたことは、指定したプレイヤーのインベントリ、ホットバー、防具、オフハンドのアイテムを
1つのGUIに表示するというものです。
そのためfor文を複数使い新規作成したGUIにプレイヤーのインベントリから取得したアイテムをセットするという
処理を書きました。
しかし、なぜかfor文の手前で処理が例外処理へいってしまい、正常に動作しないという状況なのです。
解決策はないでしょうか?


大変分かりづらい説明で申し訳ございません。
elise_blacklabさんの仰る通りで説明に抜けがありまして、自分は"発生したエラー"に対しての説明でなく"エラーを回避するため"の説明をしておりました。
ですが、サンプルコードと同じ記述をしていた場合まず最初に配列の長さの確認が出来ているためエラーは発生しません。
mcgoさんご自身は全く同じ記述をされているおつもりの様ですが、配列の長さを最初に確認出来ていませんのでその問題点を修正して下さい…。

コード: 全て選択
if(args.length == 0){
   //この条件に当てはまる場合は「/playerinfo」のみ入力されています。
}else if(args[0].equalsIgnoreCase("help"){
   //この条件に当てはまる場合は[/playerinfo help」と入力されています。
}
アバター
amata1219
ID:71b855fd
木を殴ってる
 
記事: 23
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.308856)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by mcgo » 2017年10月08日(日) 10:12

amata1219さん、elise_blacklabさんおっしゃる通りです。
for文で発生したエラーは新規作成したスロットの数が9個だったため、確保したスロット以上のスロットに
アイテムをセットしようとしていたことが原因でした。
また、配列の数のチェックに関しては、自分の理解力が無く、間違った認識で書き直したので同じ指摘をさせてしまいました。
今回は大変勉強になりました。
ありがとうございました。
サーバー関係の分からないことは英語で検索したら案外出ててくるで!
だってMinecraftって海外生まれやで!
最近はSkriptを使って色々自作してサーバー作ってます。
もしよければSkript作成してもいいゾ(激ムズは拒否するかも・・・)
詳しくはPMで!
【Skript自作コード公開中】
アバター
mcgo
ID:14e16280
石炭掘り
 
記事: 227
登録日時: 2016年11月04日(金) 00:05

1つ前へ

Return to 質問:開発・制作関連

x