Minecraft Skript 応用編 Part.7 コマンドに便利なシステム

# よく見るシステム
　色々なプラグインを使っているとプラグインのヘルプコマンドにページ機能のあるものをみたことはないでしょうか？
　それをSkriptで作りましたのでご紹介いたします。
# ソースコード
```ruby:function.sk
function createTestHelpList():
	delete {test.helps::*}
	add "&6/test help <number> &a- &6コマンドのヘルプを表示します。" to {test.helps::*}
	
function sendTestHelp(p: player, i: number):
	set {_size} to size of {test.helps::*}
	add 5 to {_size}
	set {_size} to {_size}/6
	set {_max} to ceil({_size})
	if {_i} > {_max}:
		send "%{prefix}%&cそのページは指定できません。[1 - %{_max}%&c]" to {_p}
		stop
	if 1 > {_max}:
		send "%{prefix}%&cそのページは指定できません。[1 - %{_max}%&c]" to {_p}
		stop
	set {_n} to {_i} - 1
	set {_n} to {_n} * 6
	if {_n} is 0:
		add 1 to {_n}
	send "&6============================================================" to {_p}
	loop 5 times:
		if {test.helps::%{_n}%} is not set:
			send "&6============================================================" to {_p}
			stop
		send "%{test.helps::%{_n}%}%" to {_p}
		add 1 to {_n}
	send "&6============================================================" to {_p}
```
```ruby:command.sk
command /test <number>:
	trigger:
		sendTestHelp(player, arg-1)
```
# function（ファンクション）とは...
　まず初めて紹介するかもだけど`function`（ファンクション）について解説していきます。`function`とはまったく同じ動作をする部分を一つにまとめて使うことができる機能です。これを使うことで機能を更新する際に複数箇所をわざわざ編集せずとも一か所を修正することで完了する。
　めんどくささを解決できるうえにバグの発生を抑えることができるんです。
　自作`function`の構文は、`function 任意の文字()`で作成可能です。そしてその`function`にプレイヤーなどを渡したい場合は`function 任意の文字(一時変数の文字: 任意の型)`でできます。`function`の中では`{_一時変数の文字}`という型で渡されたものを扱うことが可能です。（理解できない方はこの下の解説を見ると分かるかも）
# `function.sk`の解説
```ruby:１行目～３行目
function createTestHelpList():
    delete {test.helps::*}
    add "&6/test help <number> &a- &6コマンドのヘルプを表示します。" to {test.helps::*}
```
１行目は先ほど解説したように任意の名前で`function`を作成しました。
今回は`test`というコマンドのヘルプ機能なので`function`の名前は`createTestHelpList`にしました。中では`{test.helps::*}`というリスト変数を削除してからヘルプの文章を追加していきます。

```ruby:５行目～２７行目
function sendTestHelp(p: player, i: number):
	set {_size} to size of {test.helps::*}
	add 5 to {_size}
	set {_size} to {_size}/6
	set {_max} to ceil({_size})
	if {_i} > {_max}:
		send "%{prefix}%&cそのページは指定できません。[1 - %{_max}%&c]" to {_p}
		stop
	if 1 > {_max}:
		send "%{prefix}%&cそのページは指定できません。[1 - %{_max}%&c]" to {_p}
		stop
	set {_n} to {_i} - 1
	set {_n} to {_n} * 6
	if {_n} is 0:
		add 1 to {_n}
	send "&6============================================================" to {_p}
	loop 5 times:
		if {test.helps::%{_n}%} is not set:
			send "&6============================================================" to {_p}
			stop
		send "%{test.helps::%{_n}%}%" to {_p}
		add 1 to {_n}
	send "&6============================================================" to {_p}
```
先ほどと同じようにヘルプ文章を送る`function`は`sendTestHelp`にしました。渡す方はそのヘルプを送信するプレイヤーとページ数なので`sendTestHelp(p: player, i: number)`でOK
そして`{_size}`に`{test.helps::*}`のサイズを代入します。
そして計算上５項目表示する予定ですので先ほどの`{_size}`に５を追加します。そしてそれを６で割ります。値によっては割った値が少数になることがあると思うので`ceil`という`function`で値を切り上げます。その値を`{_max}`に代入します。詳細は[ceilについて](https://qiita.com/meoto2408/items/5b96e179b6e6d214f08f#ceil%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)をご覧ください。
　指定したページ数が`{_max}`よりも大きい場合と１よりも小さい場合にページ数が間違っているということを伝えるメッセージを送信します。
　そして`{_n}`にページ数を１を引いた数を代入してそれを６倍します。指定したページ数が１だと`{_n}`が０になってしまうためその時は１を追加するようにします。これは`set {_n} to 1`でも構いません。
　５項目送信するべく`loop 5 times:`を使用します。そしてリスト変数の該当部分から５項目取得するのですがこれもまた解説したことがなかったと思います。[こちら](https://qiita.com/meoto2408/items/5b96e179b6e6d214f08f#%E3%83%AA%E3%82%B9%E3%83%88%E5%A4%89%E6%95%B0%E3%81%AE%E6%A7%8B%E9%80%A0)にて詳細を解説しました。
もしも、`{test.helps::%{_n}%}`が存在しなかったときに動作を止めて、締めるためのメッセージを送信します。
　そうじゃなかった場合は該当部分をプレイヤーに送信します。送信したら`{_n}`に１を追加します。５回ループしたら締めるためのメッセージを送信します。

今回はかなりの分量になってしまった...と反省しながら別途解説をしていきましょう。
# ceilについて
`ceil`とは小数点以下の繰り上げのことです。`ceil(number)`は以下のように値を代入すると返してくれます。

```
ceil(5) → 5
ceil(5.25) → 6
ceil(5.65) → 6
ceil(0.1) → 1
```
# リスト変数の構造
　過去にも解説したようにリスト変数は`{test::*}`という形で扱えるわけですがリスト変数に５つのアイテムが格納されていた場合に１つめのアイテムを取得するには`{test::1}`で可能です。ようは`*`はすべてでそこが数字になるとX番目のアイテムを取得できるわけです。
　ちなみに格納されている数よりも大きな数や０、負の数を入れても存在しない扱いになります。
# さいごに
きっとソースコード自体もっときれいに書けるだろうからこっちのほうがよくね？ってのがあったらコメントしてくれるとありがたいです。
また、複雑でなければこんなの作りたいとか言ってくれたら紹介＆解説するかも...

次は[コチラ](https://qiita.com/meoto2408/items/fe236ca64ea1d970fd5c)

前は[コチラ](https://qiita.com/meoto2408/items/dc3b0be38acd85c9e94d)