* functionシートで使える構文 [#uc7c3326]
基本的にはJava言語にかなり近い、静的型付け、静的スコープ、スクリプト型言語となっています。
また、異なる型同士の演算の場合、なるべく型をキャストしてから計算します。
なお関数ごとに変数のスコープは別なので、他の関数と変数がかぶっても問題ありません。
* コメントの書き方 [#s8d241b7]
~// とすればコメントになります
* 演算子一覧 [#c34cb5ae]
各演算については後で詳細を記述します
|+|(加算)|
|-|(減算)|
|*|(乗算)|
|/|(除算)|
|%|(剰算)|
|>>|(右論理シフト)|
|>>>|(右算術シフト)|
|<<|(左シフト)|
|&&|(論理積)|
| |||(論理和)|
|&|(bit演算and)|
|||(bit演算or)|
|^|(bit演算xor)|
|!|(否定)|
|~|(bit反転)|
|(型名)|(キャスト演算)|
* 対応している型 [#c34cb5ae]
|型名|説明|表記法|
|int|64bit整数|12, -23などの数字|
|double|64bit浮動小数点数|12d, 0.32d, -12.32dなど末尾にdをつける|
|boolean|真偽値(true, false)|true falseのみ|
|null|中身がないことを示す|null|
|String|文字列|""、もしくは''で囲う (\\ \" \'によりエスケープ可能)|
|Entity|エンティティ|なし、組み込み関数で取得してください|
|Player|プレーヤー|なし、組み込み関数で取得してください|
* 配列型 [#k1f2fddb]
int[] a = new int[3]などのように変数定義をすることで、配列を定義できます。
配列はa[2]のようにアクセスすることが出来ます(すべて初期値はnullです)
また、int[][] aのように高次元の配列も定義することが出来ますが、a[2]のように部分配列アクセスは対応していません。ご了承ください。
配列に定義されているプロパティは以下の通りです
|プロパティ名|型|内容|
|length|int|配列の長さ、多次元配列の場合はすべての次元の要素数の積|
|shape|int[]|配列の形、多次元の場合は[2,3,1]のように帰ってくる|
* Entity型 [#ne31440e]
Minecraft上のEntityを扱う型です。
Entity型の変数は以下のように定義できます。
Entity e = getOneEntity("@e[type=Zombie,c=1]");
複数のEntityを取得する場合は、Entity配列として受け取ります。
Entity[] entities = getEntities("@e[type=Zombie]");
Entity型の値には、`.` を使って属性を読み出せます。(書き込みはできないので注意、xなどは普通にTP使ってください)
Entity e = getOneEntity("@e[type=Zombie,c=1]");
double x = e.x;
int blockX = e.blockX;
String world = e.world;
String[] tags = e.tag;
** Entity型の属性 [#o0b24e82]
| 属性名 | 型 | 説明 |
| --- | --- | --- |
| x | double | EntityのX座標 |
| y | double | EntityのY座標 |
| z | double | EntityのZ座標 |
| velocity | double[] | Entityの移動ベクトル。[X, Y, Z] の順で格納される |
| velocityX | double | Entityの移動ベクトルのX成分 |
| velocityY | double | Entityの移動ベクトルのY成分 |
| velocityZ | double | Entityの移動ベクトルのZ成分 |
| velocityLength | double | Entityの移動ベクトルの長さ |
| velocityLengthSquared | double | Entityの移動ベクトルの長さの2乗 |
| blockX | int | EntityのブロックX座標 |
| blockY | int | EntityのブロックY座標 |
| blockZ | int | EntityのブロックZ座標 |
| eyeY | double | Entityの目線のY座標。LivingEntity以外ではY座標と同じ |
| yaw | double | Entityの向き yaw |
| pitch | double | Entityの向き pitch |
| world | String | Entityがいるワールド名 |
| type | String | EntityType名 |
| name | String | Entity名 |
| uuid | String | EntityのUUID |
| hp | double | Entityの現在HP。LivingEntity以外では0 |
| tag | String[] | EntityTagの一覧。タグがない場合は空配列 |
* Block型 [#q1bf3d19]
Block型は、ワールド内のブロックを扱うための型です。
getBlock(String world, int x, int y, int z)で取得できます。
Block block = getBlock("world", 100, 64, 200);
指定したワールドが存在しない場合など、ブロックを取得できない場合は null が返ることがあります。
そのため、利用前に null チェックを行うことができます。
Block block = getBlock("world", 100, 64, 200);
if (block == null) {
return;
}
** Block型の属性 [#n77e1e32]
| 属性名 | 型 | 説明 |
|id|int|ブロックID|
|typeId|int|ブロックID|
|data|int|ブロックのデータ値|
|x|int|X座標|
|y|int|Y座標|
|z|int|Z座標|
|world|String|ワールド名|
|type|String|ブロックの種類|
|biome|String|ブロック位置のバイオーム|
|materialData|String|ブロックの内部データ|
|chunkX|int|所属するチャンクのX座標|
|chunkZ|int|所属するチャンクのZ座標|
|temperature|double|ブロック位置の温度(これ何に使うんだ...?)|
|humidity|double|ブロック位置の湿度(これ何に使うんだ...?)|
|lightLevel|int|明るさレベル|
|lightFromSky|int|空からの明るさ|
|lightFromBlocks|int|ブロックからの明るさ|
|power|int|レッドストーン動力の強さ|
|isLoaded|boolean|ブロックが読み込まれているか|
|isEmpty|boolean|空気ブロックか|
|isLiquid|boolean|液体ブロックか|
|isPowered|boolean|レッドストーン動力を受けているか|
|isIndirectlyPowered|boolean|間接的にレッドストーン動力を受けているか|
* Vector2d / Vector3d 型 [#pd94ebcf]
2次元・3次元ベクトルを扱うための型です。
Entityの座標や移動量、Mathのベクトル演算などで利用できます。
** 宣言・生成 [#l9a8349a]
Vector2d v2 = new Vector2d(1.0, 2.0);
Vector3d v3 = new Vector3d(1.0, 2.0, 3.0);
** Vector2d の属性 [#i5a5b208]
| 属性名 | 型 | 説明 |
| --- | --- | --- |
| x | double | X成分 |
| y | double | Y成分 |
| length | double | ベクトルの長さ |
| lengthSquared | double | ベクトルの長さの二乗 |
** Vector3d の属性 [#l996c7b8]
| 属性名 | 型 | 説明 |
| --- | --- | --- |
| x | double | X成分 |
| y | double | Y成分 |
| z | double | Z成分 |
| length | double | ベクトルの長さ |
| lengthSquared | double | ベクトルの長さの二乗 |
* 一般的な構文 [#k5f96bdc]
** for文 [#k152ce1b]
何回も処理を行うための構文
> for(定義文;条件文;条件更新){
> 繰り返される文
> }
詳しくはfor文について調べてください
例:
> for(int i=0;i<10;i++){
> print(i, "@a[r=3]");
> }
0から10までを順番に表示する
** while文 [#k152ce1b]
何回も処理を行うための構文
> while(条件文){
> 繰り返される文
> }
詳しくはwhile文について調べてください
例:
> while(i < 10){
> print(i, "@a[r=3]");
> i++
> }
0から10までを順番に表示する
** if文 [#k152ce1b]
条件で分岐処理を行う構文
> if(条件文①){
> 条件文①が成立する時に行われる処理
> }else if(条件文②){
> 条件文①が成立せず、条件文②が成立する時に行われる処理
> }else if
> ...
> ...
> }else{
> これまでの条件が成立しなかったときに行われる処理
>
詳しくはif文について調べてください
例:
> int a=10;
> if (a < 5){
> print(a + "は5未満", "@a[r=3]");
> }else if(a < 20){
> print(a + "は20未満", "@a[r=3]");
> }else{
> print(a + "は20以上", "@a[r=3]");
> }
aの値が5未満,5以上20未満、20以上のどれかを判断する
** break/continue文 [#r0d874a6]
ループの途中で、そのループを抜ける/それ以降の行を無視して、ループの先頭に戻る分
> for(int i=0;i<10;i++){
> if (i % 5 == 0){
> continue;
> }
> }
** return文 [#k152ce1b]
関数が結果を返す文
> return 値;
これで値を返すことが出来る
例:
>return 3;
3が返される
** sync文 [#g9effa64]
-asyncをつけた非同期実行の中で、同期実行をすることが出来ます
> sync{ 処理; }
とすると、syncで囲まれた内部の処理が同期実行になります。effectやtpなど、非同期実行から呼ぶとうまく動かない処理を動かすのに使います。
* 外部関数呼び出し [#cdf61b52]
functionシートで定義した他の関数(や、自分自身)を呼び出すことができます
[groupid].[function名](引数, 引数, ...);
とすると呼び出すことが出来ます(return文がある場合、結果も帰ってきます)
* 組み込み関数一覧 [#y28e01ec]
別ページにまとめてあります [[function/組み込み関数]]