前回の続き。高さ制限を設定して、制限の高さを超えた場合にダメージを与える仕組みを考えてみよう。
ダメージを与えるコマンドの検討
単にプレイヤーを切るするだけであれば、effectコマンドを使用する方法がある。
execute as @s run effect give @s instant_damage 1 2 true
この場合、ログの上では「(プレイヤー名)は魔法で殺された」と表示される。ダメージ量は「2^効果レベル×3」とwikiに書いてあった通り、効果レベル0で3、1で6、2で12、3で24のダメージ。他データパック等を組み合わせていることを考慮するならば、もっと大きいダメージにするべきかもしれないが、基本は効果レベル2以上を与えれば即死する。wikiには「効果レベル30 – 32はダメージを与えない」とあるが、1.19.1で確認した限りレベル28が最大。tickでダメージを与えるのを想定する(範囲外にいても戻ればセーフ的な)のであれば、効果レベル0でもよいのかもしれない。
killコマンドでも当然可能で、
kill @s
となる。この時のログは、「(プレイヤー名)は奈落の底へ落ちた」と表示される。
datapackのみでは、キルログを変えることは不可能なので、これらではない方法とすると、メッセージを出して、持ち物を空にして、初期位置にtpさせる、とかだろうか。
tellraw @s [{"selector":"@s"},{"text":"は高さ制限を超えたので、初期位置に戻ります。"}]
clear @s
tp @s 0 -59 0
titleコマンドを使用して表示をするのもありだろう。
title @s title {"text":"高さ制限を超えました", "color":"red"}
title @s subtitle {"text":"アイテム没収・初期位置に移動します"}
高さ管理をするコマンドの検討
数値管理となるので、基本的には「scoreboard」の「dummy」で管理することになるのだろう。
scoreboard objectives add height dummy "高さ制限"
scoreboard objectives setdisplay sidebar height
scoreboard players set @s height -59
「-59」をセットしているのは、岩盤生成の最大の高さ。獲得したブロック数にするならば、「0」をセットすればよいが、プレイヤーの座標と比較する際計算が必要になるのでもう1つscoreboardを定義する必要がある。
setdisplayは、debug用も兼ねて表示。
条件をクリアしたときに(所定の場所に置いたとき)にscoreboardをaddすればよい。
scoreboard players add @s getblock 1
マルチ想定するなら、破壊不可能な場所にarmmor_standを置いてそこに持たせた方がよい可能性はある。
組み合わせる
プレイヤーの座標とスコアボードの値を比較することになる。
まずはプレイヤーのY座標を取得してみよう
プレイヤーの座標を取得する
プレイヤーはエンティティなので、dataコマンドで取得できる。
data get entity @s[type=minecraft:player] Pos[1]
Posは3次元で、minecraftはx座標, y座標, z座標で入っているので、高さのY座標のindexは1となる(0origin)
この座標もscoreboardとしてtick毎に評価するべきだろう。
scoreboard定義
scoreboard objectives add position dummy
tick時処理
execute at @s[type=player] at @s store result score @s position run data get entity @s Pos[1]
組み合わせてみる
if scoreで、 高さ制限と高さを比較する。(とりあえずinstant_damageでキルする)
execute at @s at @s store result score @s position run data get entity @s Pos[1]
execute if score @s height < @s position run effect give @s instant_damage 1 3 true
まとめ
今回の成果
scoreboard objectives add height dummy "高さ制限"
scoreboard objectives add position dummy
scoreboard objectives setdisplay sidebar height
scoreboard players set @s height-59
scoreboard players set @s position -59
execute at @s at @s store result score @s position run data get entity @s Pos[1]
execute if score @s height < @s position run effect give @s instant_damage 1 3 true
設定用コマンドとダメージ判定コマンドを作成した。単体実行では動作ができる。
initializeが初期で呼ばれて、damageがtickで呼ばれる想定。とはいえ、これだとtickの@sは呼ばれないので、変更する必要がある。
次回へ続く
コメント