HimaJyun他のネタが山ほどあるので少し間が空いてしまいましたね、他のネタが沢山あったから間が空いただけで飽きた訳ではありませんよ。前回はメインクラスの作成とビルドを行いました、どの様な順番で進むのが一番理解しやすいかチュートリアルなどを参考に考えているのですが、とりあえず今回は「動いた」と言う実感を感じてもらうためにコマンドに応答してみようと思います。前回の記事は「[Bukkitプラグイン制作講座-其之二]メインクラスの作成、ビルド迄」です。自作のプラグインがコマンドに応答する様にするためにはplugin.ymlを編集する必要があります。僕の手元の(今までの記事通り進んだ)plugin.ymlは以下のようになっています。${project.version}検索で訪れた(前回の記事をご覧では無い)方のために軽く説明しておくと、project.artifactIdやproject.versionはMavenのマクロです。そこに以下の様な物を追記します。&lt;コマンドの説明&gt;今回は「sample」と言うコマンドを使用出来る様にしてみようと思うので、以下のように設定してみました。command.「description」の部分は色々設定出来るのですが、大抵の場合は他の方法でやった方が楽なので今回はdescriptionだけ設定します(場合によってはaliasを設定しておくといいかもしれません)とりあえずこれで「sample」と言うコマンドにプラグインが応答する準備は整いました、次へ進みましょう。Tips:複数のコマンド今回は基本的に「sample」コマンドに応答する事を目的として説明しますが、あなたは「example」コマンドも使用出来る様にしたいと思い立ちました。その場合は以下の様にすれば良いのです。command.注意点として、タブ文字は使用できないと言う事です、ymlファイル内でTabキーは押さない様に意識した方が良いです。(うっかり押してしまうとエディタの自動インデント機能でタブが紛れ込んでしまいます。)ymlに慣れてくるとその内意味が分かるでしょう、今は深く考えない方が良いかと思います。コマンドに反応してみるそこそこ並大抵の規模のプラグインであればコマンドはクラスを分割した方が良いのですが、と、この一言で既にチンプンカンプンでしょうから、今回はクラス分割については説明しません。JavaPlugin」を記載したファイル)を開きましょう、今までの制作講座通りに進んでいると仮定して、以下のようになっているとします。world!");」はもう必要ないので消してしまっても構わないでしょう。ここに以下の様に追記します。false;}すなわち、以下のようになる訳ですね。false;}}これでもうあなたのプラグインはコマンドに応答しているのです、なにもしていないだけで......何かやってみる何か......そうですねぇ......???、とりあえず「メッセージを送ってみる」としましょうか。world!");」と記載してみて下さい。world!」とメッセージが表示されるかと思います。senderはメソッドの引数として渡されたCommandSender型の云々、とにかく「sender.sendMessage("");」はとても良く使うので覚えておきましょう。Tips:複数のコマンドさきほど、plugin.ymlで「sample」と「example」コマンドの2つが使える様にする方法をチラッとご紹介しました。world!」と表示されます。これでは2つのコマンドが使える様にした意味がないため、処理を分岐する必要がありますね。分岐は普通にifです(switchでも一応出来ますけど)、問題は条件式です。ユーザが使用したコマンドは「cmd」変数に送られてきます、「cmd.getName()」とするとユーザが使用したコマンドが文字列として取得出来ます。文字列の比較は「equals()」ですね、ただしこれは大文字小文字を区別するため「equalsIgnoreCase()」を使いましょう。要は以下のようにするわけです。false;」が気になりませんか?これはコマンドが成功したか失敗したかをBukkitに教えてやるための命令で、trueなら成功、falseなら失敗です。仮に結果がfalseだった場合はplugin.ymlのコマンド設定に記載出来る(今回はやっていませんが)using:項目のメッセージが表示されます。チュートリアルにてonCommand()をコーディングする際は、上記の例のように、メソッドの最終ステップにfalseをreturnする行を記述するのが良い方法です。falseが返る事で、plugin.yml(下記参照)内に記述されたメッセージが表示され、onCommand()処理が正しく動作しなかった事をメッセージから検知できるため、動作確認の助けになるからです。処理結果チェック処理と結果が不正である場合にfalseを返すような、同じ処理を何度も記述する必要が出てきますので、大変な無駄となります。true;として、正しく動作しなかった場合(引数が足りなかった、など)は設定から読み込んだエラーメッセージを表示する様にしています。(この手法が正しいかどうかは別として)サブコマンドに対応してみるせっかくですのでサブコマンドに対応してみましょう。sub」などの場合の「sub」の部分の事です。サブコマンド、と当たり前の様に呼んでいますが、これは要は引数を利用した分岐です。nogui」もjavaコマンドの引数として-jre、minecraft_server.jre、noguiの3つを渡しているのです。多くのプラグインはこのサブコマンドで様々な機能を切り替えています、そうした方がコマンド1個1個をplugin.ymlに記入する手間も無く、とても楽です。今回は仮に「a」と「b」をサブコマンドとして、それ以外の時は使い方を表示する様にしてみましょう。引数の取得コマンド実行時の引数は「args」と言う変数に詰め込まれて送られてきます、これはString型の配列です。配列なのでargs[x]などとすれば取得できます、xの部分は0から始まり、1ずつ増えて行きます。c」ならaが0、bが1、cが2、と言った具合に)大事な事なのでもう一度言いますが、xの部分は0から始まります。(本来args[0]であるべき所をargs[1]にしてぬるぽになる人はとてもとてもとてもとても多いです)ただし、引数が無かった(「/sample」で実行された)時はargs[0]はnullになり、equalsIgnoreCaseをやろうとしてもぬるぽが出るので、まず最初にargsの長さ(配列に入っている要素の数)を確認する必要があります。早い話、以下のようにすれば良い訳です。false;}少々慣れた方であれば少し独特の書き方に見えるかも知れませんが、こうしておけば「引数がない、または未知の引数」の時に使い方を表示するのが楽です。0でも動作は同じです、ただ、比較演算子は<,<=,>,>=があって個人的に混乱しやすいのであえてこうしています。)サブコマンドの分岐さて、先程の手法で「安全に」引数を取得出来る様になりました。それではさっそくサブコマンドに対応してみましょう。文字列の比較は「equals()」ですが、コマンドは大文字小文字を区別しないので「equalsIgnoreCase()」を使う、これはもうパターンです。ifの中はargs配列の長さが非0、すなわち、最低1つは要素がある訳ですので、args[0]がnullになる可能性を考慮する必要性はありません。今回の場合は「サブコマンドはaとb、それ以外は使い方を表示」ですので以下の様になります。true;する事でそれ以上先の処理は行われません。それ以外」の所に処理が流れて、使い方が表示される、と言う訳です。true;」をするのは決して優雅ではありません。要はNullPointerExceptionさえ出なければ良いのでもっと楽をしてやりましょう、最小の手数で最大限の効果を発揮する事こそが優雅と言う事です。工夫する事で楽に安全に処理を行う事が出来ます。falseの時の値」で、条件式に応じてどちらかの値を返せます。要は以下の処理を1行で書いたようなものです。args[0];}すなわち、argsの長さが0なら空文字を、そうでなければargs[0]の値をsubCommand変数に入れています。もって、そのsubCommandをequalsで判断する、と言う訳です、こうすればnullの時は空文字が入っているのでぬるぽを出さずにチェックが出来ます。この三項演算子、何故か「読みづらい」と言う理由で一定数のアンチ派な人間が存在するのですが、普通に使えば綺麗にまとまって読みやすいと、(個人的には)思うんですけどねぇ......(たかが分岐して変数に値を入れる如きに5行も6行も使ってる方がよっぽど読みづらいですよ)本当はもっと沢山色々とダラダラ書けるのですが、ソースコード含め7000文字超えちゃっていますし、コマンドの扱い方を1回で説明し切るのは無理があるので今回はこれくらいにしましょう。其之四は「[Bukkitプラグイン制作講座-其之四]もっとコマンド!!」です。今回の記事のソースコードはGitHubからご覧いただけます。1.11が出た事ですし、お陰様で様々なプラグインが動かなくなりまし......続きを読む→シンボリックリンクのパフォーマンスが気になった便利な便利なシンボリックリンク、その用途はWebサイトのホットデプロイやらMun......続きを読む→PREVUbuntu(またはRaspbian)のMuninでrrdcachedを使うNEXT[Bukkit/Spigot]経済プラグイン「Jecon」を作ったナカのヒト:HimaJyun​散って美しいのは桜だけです、情報はまとまっていた方が美しいのです。