よく見るシステム
色々なプラグインを使っているとプラグインのヘルプコマンドにページ機能のあるものをみたことはないでしょうか?
それをSkriptで作りましたのでご紹介いたします。
ソースコード
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}
command /test <number>:
trigger:
sendTestHelp(player, arg-1)
function(ファンクション)とは...
まず初めて紹介するかもだけどfunction
(ファンクション)について解説していきます。function
とはまったく同じ動作をする部分を一つにまとめて使うことができる機能です。これを使うことで機能を更新する際に複数箇所をわざわざ編集せずとも一か所を修正することで完了する。
めんどくささを解決できるうえにバグの発生を抑えることができるんです。
自作function
の構文は、function 任意の文字()
で作成可能です。そしてそのfunction
にプレイヤーなどを渡したい場合はfunction 任意の文字(一時変数の文字: 任意の型)
でできます。function
の中では{_一時変数の文字}
という型で渡されたものを扱うことが可能です。(理解できない方はこの下の解説を見ると分かるかも)
function.sk
の解説
function createTestHelpList():
delete {test.helps::*}
add "&6/test help <number> &a- &6コマンドのヘルプを表示します。" to {test.helps::*}
1行目は先ほど解説したように任意の名前でfunction
を作成しました。
今回はtest
というコマンドのヘルプ機能なのでfunction
の名前はcreateTestHelpList
にしました。中では{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}
先ほどと同じようにヘルプ文章を送るfunction
はsendTestHelp
にしました。渡す方はそのヘルプを送信するプレイヤーとページ数なのでsendTestHelp(p: player, i: number)
でOK
そして{_size}
に{test.helps::*}
のサイズを代入します。
そして計算上5項目表示する予定ですので先ほどの{_size}
に5を追加します。そしてそれを6で割ります。値によっては割った値が少数になることがあると思うのでceil
というfunction
で値を切り上げます。その値を{_max}
に代入します。詳細はceilについてをご覧ください。
指定したページ数が{_max}
よりも大きい場合と1よりも小さい場合にページ数が間違っているということを伝えるメッセージを送信します。
そして{_n}
にページ数を1を引いた数を代入してそれを6倍します。指定したページ数が1だと{_n}
が0になってしまうためその時は1を追加するようにします。これはset {_n} to 1
でも構いません。
5項目送信するべくloop 5 times:
を使用します。そしてリスト変数の該当部分から5項目取得するのですがこれもまた解説したことがなかったと思います。こちらにて詳細を解説しました。
もしも、{test.helps::%{_n}%}
が存在しなかったときに動作を止めて、締めるためのメッセージを送信します。
そうじゃなかった場合は該当部分をプレイヤーに送信します。送信したら{_n}
に1を追加します。5回ループしたら締めるためのメッセージを送信します。
今回はかなりの分量になってしまった...と反省しながら別途解説をしていきましょう。
ceilについて
ceil
とは小数点以下の繰り上げのことです。ceil(number)
は以下のように値を代入すると返してくれます。
ceil(5) → 5
ceil(5.25) → 6
ceil(5.65) → 6
ceil(0.1) → 1
リスト変数の構造
過去にも解説したようにリスト変数は{test::*}
という形で扱えるわけですがリスト変数に5つのアイテムが格納されていた場合に1つめのアイテムを取得するには{test::1}
で可能です。ようは*
はすべてでそこが数字になるとX番目のアイテムを取得できるわけです。
ちなみに格納されている数よりも大きな数や0、負の数を入れても存在しない扱いになります。
さいごに
きっとソースコード自体もっときれいに書けるだろうからこっちのほうがよくね?ってのがあったらコメントしてくれるとありがたいです。
また、複雑でなければこんなの作りたいとか言ってくれたら紹介&解説するかも...
次はコチラ
前はコチラ