CustomFoods特殊設定チュートリアル

「CustomFoods特殊設定チュートリアル」の編集履歴(バックアップ)一覧に戻る

CustomFoods特殊設定チュートリアル - (2017/06/17 (土) 23:07:47) の編集履歴(バックアップ)


このページはCustomFoodsを読んでいることを前提に解説していきます。

特殊設定はすべてJavaScriptで書きます。これはプログラムというものです。プログラムがわからない場合は初級編から徐々に理解していきましょう。
CraftBukkit/Spigotプラグインを作っている方なら読む必要はあまりないと思います。
全てを読むには少し根気が必要です。なぜなら、このページにはあまり画像がないからです。
素早く理解するにはJavaというプログラムを少し理解しておくといいでしょう。

初級編

まず、名前.jsで設定したファイルのサンプルを見てみましょう。

ID="BREAD";
name="サンプルフード";
lore="サンプルのためのアイテム。,§c色も変えれる。";
hunger=2;
saturation_hunger=1;
action="1";

こうなっています。
さて、プレイヤーがクリックしたかつactionが一致した際に呼ばれるイベントを紹介します。
これをjsに追加することでイベントの変更ができます。
function eat(player,block) {
	ここにプログラム
}
さて、これだけでは右クリックしても何も起こりません。
試しに「食べる」という動作を書いてみましょう。
function eat(player,block) {
	eating(player);
}
これで「食べる」という動作ができます。
ちなみに初期状態(この文を書かない)ではこれが設定してありません。
functionとは、関数というものを作るときのお決まり文です。関数の説明は割愛。
ちなみにこの{}内では最初のカッコにあるplayerとblockという変数が利用できます。
変数とは、PCのメモリーにデータを一時的に保存しておくものです。
ちなみにこのカッコ内には引数とよばれるものが入っています。
よく出てくるので覚えておきましょう。
それでは「eating(player);」の解説をします。
実は自分で書いていないだけですでに
function eating(player) {
	if(player.getGameMode()!=gm_survival&&player.getGameMode()!=gm_adventure) {return;}
	player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1);
	player.setSaturation(player.getSaturation()+saturation_hunger);
	if(player.getFoodLevel()<player.getSaturation()) {player.setSaturation(player.getFoodLevel());}
	if(player.getFoodLevel()<20) {player.setFoodLevel(player.getFoodLevel()+hunger);}}
}
という関数が追加されています。
引数にはplayerが設定してあります。
さて、おそらく全く理解できないと思います。処理をすべて日本語に変えてみましょう。
もし、プレイヤーがサバイバルでもアドベンチャーでもなかったら、この処理を終了する。
(この行以降はゲームモードがサバイバルかアドベンチャーの時にのみ実行される。)
プレイヤーの今持っているアイテムを1つ減らす。
プレイヤーの隠し満腹度を現在の隠し満腹度+このアイテムの隠し満腹度に設定。
もし、プレイヤーの満腹度より隠し満腹度が多ければ、隠し満腹度を満腹度と同じに設定。
もし、プレイヤーの満腹度が20以下だったら、プレイヤーの満腹度を現在の満腹度+このアイテムの満腹度に設定。
となっています。

  • 初級チュートリアルの前に
さて、いよいよプログラミングの開始です。
と、その前にサンプルプログラムを見てもらいましょう。
ID="BREAD";
name="サンプルフード";
lore="サンプルのためのアイテム。,§c色も変えれる。";
hunger=2;
saturation_hunger=1;
action="1";
function eat(player,block) {
	
}
eating(player);は書かなくても処理は実行出来るので、書くかどうかは自由にしてください。
また、これから紹介するプログラムは
function eat(player,block) {
	
}
この{}の中に書いてください。また、プログラムのルールとして
一文の中で改行しない。
ea tin g(pla yer);のように途中で空白を入れない。
eating(
	player
);
のように、一文以外であれば改行はしてよい。
function eat(player,block) {eating(player);}
と、一行で書いてもよい。
FunctionやFUNCTIONのように、大文字小文字を変えないこと。
文の最後に;をつけ忘れないこと。{}には不要。

  • Objectの利用
文字列は「String」
数字は「int」
小数点を含む数字は「double」

といった感じにObjectというものが設定してあります。
それぞれ、決まった書き方があります。
文字列であれば"で囲む、
数字であれば小数点を使わない、
小数点を含む数字であれば最後にdをつけるなど
いろいろあります。
では、playerはなんのObject何でしょうか?



正解は「越後製菓」ではなく「Player」です。
実はPlayerというのはJavaScriptには存在しません。では、Playerとはいったい何者なんでしょうか。

実はこれ、自作Object何です。
そうです。Objectだって自作できてしまうんです。
ですがJavaScriptに元から入っていないObjectには"で囲んだりするだけでは生成されません。
そこでnew Test()とすることでTestというObjectが作れます。
この生成したObjectは、この後紹介する変数に保存することができます。

  • 変数の利用
さて、playerやblockは変数と紹介しましたが、変数は自分で作ることもできます。
なにか一時的に保存しておきたいものがあればこれを利用すればいいでしょう。
var name;
これでnameという変数ができます。
ちなみに初期値というものが設定でき、
var name = "初期値";
こうすることで、初期値というStringが入ったnameが出来上がりました。
それ以外にも
var test = new Test();
とすれば、testに新品のTestオブジェクトの入った変数ができました。

また、変数はそれを書いた行以降、同じ{}内であればどこからでも利用できます。ただし、
決して同じ名前の変数を使わないこと。
もちろん、とある変数の使えないところ(var nameとは違う{}の中など)であれば同じ名前でもOKです。

そして、この変数を使うには
name
と書くだけです。これでnameが"初期値"に置き換わったと思ってください。
ちなみにfunction eat(player,block)
のplayerとblockはここが実行される時にそれぞれプラグイン側で生成されて、その変数がここにコピーされます。
そしてプラグイン側にあったものと同じものが使える、ということです。

  • プレイヤーにメッセージを送信してみる
player.sendMessage("食べ物を食べました。");
こうすればクリック時にプレイヤーにチャットが出力されます。また、
"食べ物"+"を"+"食べました。"
のように、+で""を結合して書くこともできます。

  • プレイヤーにポーション効果を付与してみる
これこそCustomFoodsを入れた理由ではないでしょうか。
食べたときにいろんなポーション効果が付与される。なんて食べ物を追加したかったのでは?
それでは伝授しましょう。プラグインを作ったことのある方も必ず見て見てください。
player.addPotionEffect(new org.bukkit.potion.PotionEffect(org.bukkit.potion.PotionEffectType.HUNGER, 10*20, 20));
これでプレイヤーに空腹を10秒間20レベルで実行できます。
なんだか急に難しくなったような気がしますか?では、解説を見てみましょう。

player.addPotionEffect();
ここでプレイヤーにポーションを追加します。ですがこれだけでは何のポーションか、時間やレベルなどが設定されていません。
なのでその情報を得るため、addPotionEffectに引数を渡してあげる必要があります。
new org.bukkit.potion.PotionEffect(org.bukkit.potion.PotionEffectType.HUNGER, 10*20, 20)
これがポーションデータです。最初のnew org.bukkit.potion.PotionEffectでポーションデータを生成します。
もちろんこの子にも引数を渡します。
org.bukkit.potion.PotionEffectType.HUNGER, 10*20, 20
org.bukkit.potion.PotionEffectTypeにはポーションIDのようなものが入っています。のようなものなので代わりに数字を入力したりは禁止です。
ちなみに.でそのObject内の変数などが使えます。今回は空腹なのでHUNGERですね。今後紹介するPotionEffectTypeに全てのポーションを記入するのでそれに応じてHUNGERの部分を変更してください。
10*20
ここでは、時間の設定です。マイクラのTick数を設定するので10秒*20Tickで10秒になります。
 *は乗数です。コンピューターはこういう計算が得意です。嫌がることはありません。
11-1とすれば10になります。
20
ここでは普通にレベル指定です。
ここでプラグイン経験のある方にお知らせ。
new PotionEffectのようにインポートした状態で記入はできません。なぜならインポートがされていないからです。インポートを使いたいなら
importPackage(org.bukkit.potion.PotionEffect);
と記入してください。これがjava.script.ScriptEngineの特徴です。