LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-20

よく見るシステム

 色々なプラグインを使っているとプラグインのヘルプコマンドにページ機能のあるものをみたことはないでしょうか?
 それをSkriptで作りましたのでご紹介いたします。

ソースコード

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}
command.sk
command /test <number>:
    trigger:
        sendTestHelp(player, arg-1)

function(ファンクション)とは...

 まず初めて紹介するかもだけどfunction(ファンクション)について解説していきます。functionとはまったく同じ動作をする部分を一つにまとめて使うことができる機能です。これを使うことで機能を更新する際に複数箇所をわざわざ編集せずとも一か所を修正することで完了する。
 めんどくささを解決できるうえにバグの発生を抑えることができるんです。
 自作functionの構文は、function 任意の文字()で作成可能です。そしてそのfunctionにプレイヤーなどを渡したい場合はfunction 任意の文字(一時変数の文字: 任意の型)でできます。functionの中では{_一時変数の文字}という型で渡されたものを扱うことが可能です。(理解できない方はこの下の解説を見ると分かるかも)

function.skの解説

1行目~3行目
function createTestHelpList():
    delete {test.helps::*}
    add "&6/test help <number> &a- &6コマンドのヘルプを表示します。" to {test.helps::*}

1行目は先ほど解説したように任意の名前でfunctionを作成しました。
今回はtestというコマンドのヘルプ機能なのでfunctionの名前はcreateTestHelpListにしました。中では{test.helps::*}というリスト変数を削除してからヘルプの文章を追加していきます。

5行目~27行目
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}

先ほどと同じようにヘルプ文章を送るfunctionsendTestHelpにしました。渡す方はそのヘルプを送信するプレイヤーとページ数なので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、負の数を入れても存在しない扱いになります。

さいごに

きっとソースコード自体もっときれいに書けるだろうからこっちのほうがよくね?ってのがあったらコメントしてくれるとありがたいです。
また、複雑でなければこんなの作りたいとか言ってくれたら紹介&解説するかも...

次はコチラ

前はコチラ

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0