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

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

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

目次
+ ...
初級編

応用編

よく使うクラスの解説

初級編

目次
+ ...
はじめに
Objectの利用
変数の利用
プレイヤーにメッセージを送信してみる
プレイヤーにポーション効果を付与してみる
ランダムな数を使おう
if文を使ってみよう
繰り返し文を使ってみよう
ブロックをクリックした時にそのブロックの情報を得よう

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

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

こうなっています。
さて、プレイヤーがクリックしたかつactionが一致した際に呼ばれるイベントを紹介します。
これをjsに追加することでイベントの追加ができます。
eat=function(player,block,event) {
	ここにプログラム
}
さて、これだけでは右クリックしても何も起こりません。
試しに「食べる」という動作を書いてみましょう。
eat=function(player,block,event) {
	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";
eat=function(player,block,event) {
	
}
eating(player);は書かなくても処理は実行出来るので、書くかどうかは自由にしてください。
また、これから紹介するプログラムは
eat=function(player,block,event) {
	
}
この{}の中に書いてください。また、プログラムのルールとして
一文の中で改行しない。
ea tin g(pla yer);のように途中で空白を入れない。
eating(
	player
);
のように、一文以外であれば改行はしてよい。
eat=function(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が"初期値"に置き換わったと思ってください。
ちなみにeat=function(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の特徴です。


  • ランダムな数を使おう
ランダムな数を使ってたまに毒になるなんてことをやりたくないですか?
もちろん、CustomFoodsならできます。
今回はランダムな数を作るだけなのでそのほかの物を見たり応用編を見たりして用途を考えてみてください。
Math.floor( Math.random() * 5 ) ;
これで、0-4の数字がランダムに作られます。
var rand = Math.floor( Math.random() * 5 ) ;
このようにして変数に保存しておくと便利かも。

  • if文を使ってみよう
if文とは、条件文とも言い、もし~ならば○○を実行といった感じにできます。
CustomFoodsでもプログラムでもよく使うので覚えておきましょう。
if(条件) {プログラム}
このように書きます。また、
if(条件) {
	プログラム
}
でもOKです。
さて、条件にはbooleanというtrueとfalseの値を入れることのできるObjectを使います。
trueならプログラムを実行、falseならプログラムはスルーという感じです。
var IF = true;
if(IF) {プログラム}
こうすることでif文にはtrueがあるので、プログラムは実行されます。
ですがこれではifを使う必要はありません。そこで、あるObjectとあるObjectを比較してみます。
var IF1 = true;
var IF2 = false;
if(IF1==IF2) {プログラム}
このように書けば、IF1とIF2を比較し、同じであればプログラムを実行することができます。
では、プログラムは実行されると思いますか?

IF1とIF2は違うのでプログラムは実行されません。

では、==とはどういう意味でしょうか?
これは、左の値、右の値が同じだったらtrue、違うのであればfalseになります。
他にもあるのでリストを見てみましょう。
文字 trueになる条件 使い方
== 左の値と右の値が同じ Object==Object
!= 左の値と右の値が違う Object!=Object
左の値が右の値より大きい 数字(小数点可)>数字(小数点可)
< 左の値が右の値より小さい 数字(小数点可)<数字(小数点可)
>= 左の値が右の値より大きいか同じ 数字(小数点可)>=数字(小数点可)
<= 左の値が右の値より小さいか同じ 数字(小数点可)<=数字(小数点可)
こうなっています。

ここで問題。
if(1>0) {
	if(5>10) {
		
	}
}
このように書くのは面倒じゃないですか?ここで登場するのが&&。
if(1>0&&5>10) {
	
}
こうすれば、if文の中のすべての条件がtrueだったら実行になります。
ほかにも
if(1>0||5>10) {
	
}
このように||があります。これは、このうちのどれかがtrueならプログラムが実行されます。
また、
if(1>0||5>10&&3<5||8>=4) {
	
}
このように&&を使えば、&&より左側の条件どれかがtrue、右側もtrueだったら実行となります。

  • 繰り返し文を使ってみよう
繰り返し文は特定のプログラムを繰り返し実行できる物です。
繰り返し分には2つあり、
while
for
の二つあります。
それぞれ便利なことがあるので見ていきましょう。

  • while文の特徴
  • メリット
  短く出来る。
  • デメリット
  何回繰り返すというのが作りにくい

  • for文の特徴
  • メリット
  何回繰り返すというのが簡単にできる。
  • デメリット
  whileより長くなってしまう。


それぞれ使い方を見てみましょう。
while(条件) {}

for(変数初期化;条件;変数の処理) {}
whileは条件にifと同じように書きます。簡単ですね。
難しいのはfor文です。少しずつ理解していきましょう。
使用例はこちら
for(var i = 0;i < 5;i++) {}
このように、最初に関数、次にifと同じ条件、ループが終わるたびに行う処理となります。
ちなみにこれは{}内を5回繰り返すものになります。

  • ブロックをクリックした時にそのブロックの情報を得よう
クリックしたブロックを得るにはactionを
action="2,4";
のように2か4を設定してください。
そうすると正しくblock変数にクリックしたブロックの情報を得ることができます。
試しにプレイヤーに情報を送信してみます。
player.sendMessage(block.toString());
これで情報が送信されます。Blockオブジェクトには他にも便利なものがあるのでよく使うクラスの解説を見てください。



応用編

目次
+ ...
はじめに
毒リンゴ
骨付きビーフ
3x3x3採掘ツルハシ

  • はじめに
これから紹介するプログラムはあまり紹介をしません。自分で解読してください。

  • 毒リンゴ
食べるとたまに毒にかかる毒リンゴを作ります。
ID="SLIME_BALL";
name="§f毒りんご";
lore="青森産の味がする";
hunger=3;
saturation_hunger=1;
eat=function(player,block) {
	var rand = Math.floor( Math.random() * 5 ) ;
	if(rand==2) {
		player.sendMessage("毒にかかった!");
		player.addPotionEffect(new org.bukkit.potion.PotionEffect(org.bukkit.potion.PotionEffectType.POISON, 3*20, 2));
	}
	eating(player);
}

  • 骨付きビーフ
食べると骨が帰ってくるビーフを作ります。
ID="COOKED_BEEF";
name="§f骨付きビーフ";
lore="食べると骨が帰ってくる。";
hunger=4;
saturation_hunger=3;
eat=function(player,block) {
	eating(player);
	player.getInventory().addItem(new org.bukkit.inventory.ItemStack(org.bukkit.Material.BONE,1));
}

  • 3x3x3採掘ツルハシ
引数のeventを利用した一例です。
左クリックすると、クリックしたブロックを中心に3x3x3で採掘。
右クリックすると、クリックしたブロックのみ採掘。
耐久力を減らすだけではツールが壊れないので耐久力が特定の数より大きいとアイテムをなくすようにしてあります。
ID="DIAMOND_PICKAXE";
name="3x3x3採掘ツルハシ";
action="2,4";
eat=function(player,block,event){
	if(event.getAction()==org.bukkit.event.block.Action.LEFT_CLICK_BLOCK) {
		for(var y = block.getY()+1;y > block.getY()-2;y--) {
			for(var x = block.getX()+1;x > block.getX()-2;x--) {
				for(var z = block.getZ()+1;z > block.getZ()-2;z--) {
					if(player.getGameMode()!=gm_creative&&block.getWorld().getBlockAt(x,y,z).getType()!=org.bukkit.Material.BEDROCK&&
					block.getWorld().getBlockAt(x,y,z).getType()!=org.bukkit.Material.AIR)
						player.getItemInHand().setDurability(player.getItemInHand().getDurability()+1);
					if(block.getWorld().getBlockAt(x,y,z).getType()!=org.bukkit.Material.BEDROCK)
						block.getWorld().getBlockAt(x,y,z).breakNaturally(player.getItemInHand());
				}
			}
		}
	}
	if(event.getAction()==org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK) {
		if(player.getGameMode()!=gm_creative&&block.getType()!=org.bukkit.Material.BEDROCK&&
		block.getType()!=org.bukkit.Material.AIR) {player.getItemInHand().setDurability(player.getItemInHand().getDurability()+1);}
		if(block.getType()!=org.bukkit.Material.BEDROCK) {block.breakNaturally(player.getItemInHand());}
	}
	if(player.getItemInHand().getType().getMaxDurability()<player.getItemInHand().getDurability())
	player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1);
}

よく使うクラスの解説

目次
+ ...
PotionEffect
PotionEffectType
World
Material
Block
Player
ItemStack

new org.bukkit.potion.PotionEffect(PotionEffectType)
new org.bukkit.potion.PotionEffect(PotionEffectType,ParticleDraw)
1つめは、初級編で紹介した通りです。
2つ目はParticleDrawにtrueもしくはfalseを入れることでパーティクルの表示/非表示を決められます。
true  表示
false 非表示
org.bukkit.potion.PotionEffectType.値
値のところにHUNGERなどを入れてください。
ID 和名
SPEED 1 移動速度上昇
SLOW 2 移動速度低下
FAST_DIGGING 3 採掘速度上昇
SLOW_DIGGING 4 採掘速度低下
INCREASE_DAMAGE 5 攻撃力上昇
HEAL 6 即時回復
HARM 7 即時ダメージ
JUMP 8 跳躍力上昇
CONFUSION 9 吐き気
REGENERATION 10 再生能力
DAMAGE_RESISTANCE 11 耐性
FIRE_RESISTANCE 12 火炎耐性
WATER_BREATHING 13 水中呼吸
INVISIBILITY 14 透明化
BLINDNESS 15 盲目
NIGHT_VISION 16 暗視
HUNGER 17 空腹
WEAKNESS 18 弱体化
POISON 19
WITHER 20 ウィザー
HEALTH_BOOST 21 体力増強
ABSORPTION 22 衝撃吸収
SATURATION 23 満腹度回復
GLOWING 24 発光
LEVITATION 25 浮遊
LUCK 26 幸運
UNLUCK 27 不運

org.bukkit.World
Worldはnewで作れないのでPlayer.getWorld()やBlock.getWorld()などでWorldを取得しましょう。
これより下はworld.○○の○○の部分を書いていきます。

getBlockAt(X,Y,Z);
X,Y,Zの座標のブロックを取得。
戻り値にBlockが設定してある。
getBlockAt(Location);
Locationにはplayer.getLocation()などで座標を入れる。
dropItem(Location,ItemStack)
Locationにはplayer.getLocation()など、ItemStackにはドロップアイテムの情報を。
spawnEntity(Location,EntityType);
座標にEntityTypeのエンティティを召喚。

org.bukkit.Material
この後ろに.○○を書く。

アイテム、ブロックたちの一覧はこちら

org.bukkit.block.Block
この後ろに.○○を書く。
getType()
そのBlockのMaterialを返す。
getWorld()
ブロックの置いてあるワールドを取得


org.bukkit.entity.Player
これも.○○とかく。newは使えない
getInventory()
プレイヤーのInventoryを取得。
addPotionEffect(PotionEffect);
プレイヤーにポーション効果を付与。
removePotionEffect(org.bukkit.potion.PotionEffectType);
プレイヤーから指定したポーション効果を削除。
sendMessage(Message);
Messageには""と書いたり、""の変数を使ったりする。
getDisplayName()
プレイヤーの表示名を取得。
isSneaking()
プレイヤーがスニークしているかどうかを取得
true  スニークしている
false スニークしていない
playSound(Location,Sound,float1,float2)
Locationの場所で音を再生。日本語にすると、座標、音、ボリューム、ピッチになる。
Sound
stopSound(Sound);
Soundに設定した音を止める。
giveExp(lv)
lvに与えたい量の整数を入れる。
getLevel()
プレイヤーのレベルを取得。
getFoodLevel()
プレイヤーの満腹度を取得。最大20.
setFoodLevel()
プレイヤーの満腹度を設定。最大20。
getSaturation()
プレイヤーの隠し満腹度を取得。
setSaturation()
プレイヤーの隠し満腹度をセット。
spawnParticle(Particle,X,Y,Z,半径,数)
spawnParticle(Particle,Location,半径,数)
XYZまたはLocationの場所にParticleを指定した半径に指定した数発生させる。

org.bukkit.inventory.ItemStack
この後ろに.○○を書く。newが使える。
new org.bukkit.inventory.ItemStack(Material)
new org.bukkit.inventory.ItemStack(Material,数)
ItemStackを生成する。Material
最終更新:2017年06月19日 21:11