Minecraft Skript 基礎編 Part.1

#変数について・・・
[入門編](https://qiita.com/meoto2408/items/a44335d24d4ea3e75b73)で書こうか迷ったけど、変数は少し厄介だから、基礎編に書こうと思う。

変数というのは簡単に言えば、あらゆるものを格納する箱だと思ってください。
主な種類は `変数` `一時変数` `リスト変数` があります。（たしか、これですべて・・・

```yaml
　変　　　　　数　 -- {test}
　一　時　変　数　 -- {_test}
リ　ス　ト　変　数 -- {test::*}
一時　リスト　変数 -- {_test::*}
```
といった感じで書けます。（この解説ページでは今後このように解説します

まず変数は、サーバー内すべてで使えます。
一時変数は、そのイベント内のみ使えます。
リスト変数は、サーバー内すべてで使えます。
一時リスト変数は、そのイベント内のみ使えます。

では、変数とリスト変数は？というと、変数には１つしか格納できませんが、リスト変数には複数のものを格納できます。
プレイヤーに置き換えるとわかりやすいかもしれません。

変数にAさんを入れます。
そのあとBさんを入れるとAさんは押し出されて外に出てしまいます。

ですが、
リスト変数にAさんを入れて、Bさんも入れるとAさんは押し出されずに２人ともリスト変数の中に入っています。

出すときはリスト変数からAさんを削除というコードを書かなければいけません。

```:test.sk
#例文
add A to {test::*}
set {test} to A
remove A from {test::*}
delete {test::*}
```
`add A to {test::*}`でAをリスト変数に追加できます。
`set {test} to A`でAを変数にセットできます。
`remove A from {test::*}`でリスト変数からAを削除できます。
`delete {test::*}`でリスト変数を削除できます。

じゃあ、どんな時に使うか？
ということですが、、、

Loopはあらゆる使い方ができます。

ではその一つを紹介しましょう。

```:test.sk
command /check:
    trigger:
        set {point.%player%} to location of player
        send "%5チェックポイントを保存しました。" to player

command /pt:
    trigger:
        teleport player to {point.%player%}
        send "%5チェックポイントにテレポートしました" to player
```
はい。
これで完成です。

追加したコマンドは`/check`と`/pt`です。

余談ではありますが、
わたくしが見てきた中で、基本的には多くのコマンドの名前には意味があります。

例えば、
`/check`はまさにそのままですが、チェックという意味で、
`/pt`はポイントテレポートの略です。

`send`で実行時に何をしたのかを説明してるからわかるかもしれませんが・・・
`set {point.%player%} to location of player`
この部分が初登場ですね。

まず変数である`{point.%player%}`ですが・・・
メッセージで使う`%`があることに気づきましたか？
そうなんです。

変数内でも使えるんです。
これを使うと何が起きるかといいますと、プレイヤー専用の変数を用意できるのです。
まだ理解できてない方がいるかもなんでもっとわかりやすく説明します。

メッセージで`%player%`を使ったときに表示されたのはイベントを起こしたプレイヤーの名前が表示されましたよね？
なのでMCIDが`Monster2408`だった場合、先ほどの変数は、`{point.Monster2408}`となるんですね。

ここで勘のいい人は疑問に思ったのでは？
もしMCIDが同じだった場合、困るのでは？と・・・

そこら辺は大丈夫です（たぶんｗ）。
これはMinecraftの話になりますが、プレイヤーには個々にUUIDという個人暗号のようなものが存在します。
Skriptの`%player%`にはUUIDが格納されていて、たとえ同じMCIDだったとしても混合しないように対策は取られているそうです。

まあ、心配な方は`%player's uuid%`を使うといいでしょう。
これなら直接UUIDを代入してくれますので。

それでは本題に戻りましょう。

`location of player`ですが、プレイヤーの座標という意味です。これで変数にプレイヤーの座標を代入できました。

あとはその変数にテレポートすると書けば、`/check`を実行済みであれば`/pt`でテレポートできます。


ですが、ここで注意！！


`/check`を実行していないとテレポートせずに「%5チェックポイントにテレポートしました」とだけ表示されてしまいます。

それを見た人からすれば「テレポートしてないやんけ！！」ということになってしまいますね。

そこで`if`文が出てくるのです。

#IF文とは・・・
`IF`というのは、「例えば」という意味を持ちます。
そして主に使うタイミングは、条件が複数あり、その条件により実行内容が違うというものです。

それと同時に出てくる`ELSE`についても説明します。
`ELSE`はそれ以外という意味を持ちます。
基本的には`IF`文を書いた後に、それ以外の場合の動作を書くときに使います。

では先ほどのコードに`IF`文を追加していきましょう。

```:test.sk
command /check:
    trigger:
        if {point.%player%} is set:
            set {point.%player%} to location of player
            send "%5チェックポイントを上書きしました。" to player
            stop
        else:
            set {point.%player%} to location of player
            send "%5チェックポイントを保存しました。" to player
            stop

command /pt:
    trigger:
        if {point.%player%} is set:
            teleport player to {point.%player%}
            send "%5チェックポイントにテレポートしました" to player
            stop
        else:
            send "&cチェックポイントが保存されていません。" to player
            stop
```
これで完成です。
まあ、`/check`の`IF`文はただのメッセージを変えるために作ったのですがね・・・

では解説です。
`if {point.%player%} is set:`これは変数がsetされている・・・
まあ、代入済みであるかどうかを聞いています。

そして`ELSE`文はそれ以外なので代入されていない・・・というコードになります。

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

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