【第1回】アイテムを追加する【ModPE Script】

# 最初に

前回は【第0回】Hello, world【ModPE Script】等と謳って概要やらを色々と語りました。
今回は早速、Minecraft PEの世界にアイテムを追加してみようと思います。
正直悩んだんですよ。
ブロックにするかアイテムにするかを。
ID的にはブロックの方が若い(0~255)んで、そっちしたいなぁと思いつつ、記事で書くならアイテムの方が絶対楽だよなぁと。
心の弱いお兄さんは面倒臭さには勝てなかったみたいです。
少し話がそれましたが、早速追加してみましょう

# 作業フォルダを作成する

バニラのテクスチャを使うだけなら別に気にしなくても良いんですけど、自作テクスチャを使う場合、規定のフォルダを作る必要があります。
適当なフォルダに以下の通りに作成してください

```
+-assets
| `-images
|   +-items-opaque
|   `-terrain-atlas
`-script.js
```

作成したアイテムのテクスチャは、`assets/images/items-opaque`の直下に移動してください。
ひとまずこれで前準備はできました。
では次のステップに移ります。

# 実際に追加する前に

実際にアイテムを追加するわけですけど、その前に準備しなきゃいけないものがあるんですよ。
Minecraft PEをプレイしたことのあるユーザーなら、わかりますよね？
テクスチャです。
ユーザーがアイテムを視認するための画像ファイルです。
別に作成せずにバニラにある画像を読み込ませても良いんですけど、何かしょぼいじゃん？
やっぱ自分で作りたいじゃん？
まぁそーゆーわけです、はい。

で、そのテクスチャを作るんだけど、これもまたプレイしたことのあるユーザーならご存知ですよね？
テクスチャの解像度の件。
Minecraft PEのデフォルトのテクスチャは16x16です。
最近は高解像度対応もしているそうですが、ModPE Scriptにおいては16x16が基本です。
じゃあ早速作っちゃいましょう。
適当なペイントアプリ、私は[Pixel Art editor](https://play.google.com/store/apps/details?id=net.spc.app.pixelarteditor)を愛用しています。
操作系統がシンプルで使いやすいんですよ、こいつ。
まぁそこは各自の判断に任せますが適当なアプリをインストールして起動してください。
今回アプリの使い方は触りませんが、16x16のキャンバスを作って、お絵描きして、端末に保存してください。
今回は取り敢えず、`sample_0.png`と名前を付けて、`assets/images/items-opaque`の直下に置いておきましょう。
時間があれば、別の画像を`sample_1.png`として保存しておいてもらえると後の説明が楽になります。

# script.jsの編集

Minecraft PEにアイテムを追加する上で使う関数は2つです。

1. ゲームにアイテムを追加する関数
1. インベントリにアイテムを追加する関数

それぞれの関数について説明していきます。

## ゲームにアイテムを追加する関数

こちらで使う関数は`ModPE.setItem`です。
語る前に少し余談をさせていただきます。

BlockLauncherはJavaで構成されており、ModPE Scriptの関数もそれぞれJavaで実装されています。
例えば今回の`ModPE.setItem`ですが、[ScriptManager.java](https://github.com/zhuowei/MCPELauncher/blob/master/src/net/zhuoweizhang/mcpelauncher/ScriptManager.java)に実装されている。
`ModPE`クラスは主に、ゲームシステムに干渉する、アイテムの追加やカメラの変更等といった処理が実装されています。
その中の`setItem`メソッドが、今回で言うアイテムの追加を行うわけですね。

その`ModPE.setItem`には、実行する上で以下の5つの引数を要します。

1. アイテムID
1. テクスチャ名
1. グループ番号
1. アイテム名
1. スタック数

### アイテムID

これはシンプルですね。
追加するアイテムのIDです。
私の環境においては256~4095が使用可能です。
最近は上限が緩和されたという話も聞きますが、そんなこと知りません。
範囲外の数値や、整数でない数値を渡した場合、勿論エラーとなります。
仕様には従いましょう。
引数の型が気になったら[ScriptManager.java](https://github.com/zhuowei/MCPELauncher/blob/master/src/net/zhuoweizhang/mcpelauncher/ScriptManager.java)を見返しましょう。

### テクスチャ名

これは追加するアイテムに充てるテクスチャの名前です。
`assets/images/items-opaque`の中に保存した画像ファイルの名前になりますが、拡張子の記述は不要です。
また、今回の例では`sample_0.png`というファイル名ですが、引数に渡すのは`sample`のみです。
理由は第3引数のグループ番号に繋がります。

### グループ番号

こいつが恐らく一番分かりにくい引数です。
一番簡単な説明をするならば、特別な理由がないなら`0`を入れておけ、でしょうか。
どういったときにこの引数が活用されるかというと、染料等のような同一IDで複数の色があるアイテムの追加等で活用します。
但しその場合、画像ファイルの名前は`sample_1.png`のように、`名前_グループ番号`となります。

### アイテム名

これはもう文字通りです。
故に説明はしません。
注意事項を挙げておくとするなら、Minecraft PEでも可能になったコマンドへの対応を心掛けておきましょう。
コマンドは半角スペースを区切りに構文を判定します。
アイテム名に半角スペースがあるとコマンドに不具合を発生させます。

### スタック数

これも文字通りですね。
そのアイテムが最大で何個スタックできるかを指定します。

## インベントリにアイテムを追加する関数

続いて、クリエイティブモードのインベントリに追加をします。
これをしないと、クリエイティブモードでのプレイ時にインベントリに存在しない状態になります。

ここで使う関数は`Player.addItemCreativeInv`です。
長いですが、IMEに登録するなりすれば問題は無いでしょう。
こちらは`Player`クラスに実装されています。
`Player`クラスは名前の通り、プレイヤーに関する、体力の変更や持ち物の変更等といった処理が実装されています。

その`Player.addItemCreativeInv`には、実行する上で以下の3つの引数を要します。

1. アイテムID
1. 数量
1. グループ番号

### アイテムID

先述のため、省略します。


### 数量

インベントリに追加するとき、何個にするかです。
基本的に`ModPE.setItem`で指定したスタック数になります。

### グループ番号

これも先述のため、省略します。

以上の2点を踏まえ、script.jsを記述します。

```javascript:script.js
(function(){
	"use strict";
	const sample=1000;
	ModPE.setItem(sample,"sample",0,"Sample",64);
	Player.addItemCreativeInv(sample,64,0);
})();
```

簡単ですね。
プログラミング経験者ならIDを変数に入れている理由もわかりますよね？

とまぁ、たったこれだけでアイテムの追加は完了します。

# 最後の処理

ここまでで、ModPE Script側は完成しました。
ですが、最後にしておかなければならない処理があります。

確かにアイテム用の画像は作りましたが、まだ作っただけです。
これだけだと読み込まれません。
勝手に読み込んでくれる仕様になれば楽なんですけどね。
まぁ嘆いていても変わりません、さっさと終えましょう。
と言ってもフォルダを圧縮するだけです。

`assets`フォルダを`.zip`形式で圧縮してください。
圧縮はファイルエクスプローラーでできます。
私は[ES ファイルエクスプローラー](https://play.google.com/store/apps/details?id=com.estrongs.android.pop)を使っています。
少し前は怪しい噂が立ってたアプリですが、最近は落ち着きましたよね。
まぁ信用できなければ何でも良いんですよ。
PCで圧縮しようが他のアプリを使おうが。
要は必要なフォルダ/ファイルを`.zip`形式に圧縮しておけば良いんです。

はい、圧縮したら作業完了です。
BlockLauncherに読み込ませるときはテクスチャを適用したあとにModPE Scriptを読み込ませましょう。
ワールドに入ってインベントリを開けばアイテムが追加されているはずです。

# 最後に

アイテムを追加するだけでこんなに書くとは思わなかったです。
普段は流れ作業的に済ませちゃってますしね。
いざ口で説明しろとなると難しいもんです。
今後の説明についてですが、1点だけ変更点を設けます。
今まではModPE Scriptと長く表記してましたが、ModPEに省略します。
たったそれだけのことです、はい。
では、また機会があれば。