高さ縛りデータパックを作ろう1

スポンサーリンク
Minecraft

前回の続き。高さ制限を設定して、制限の高さを超えた場合にダメージを与える仕組みを考えてみよう。

【この記事での目標】高さ制限を実現してみよう

スポンサーリンク

ダメージを与えるコマンドの検討

単にプレイヤーを切るするだけであれば、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は呼ばれないので、変更する必要がある。

次回へ続く

コメント

タイトルとURLをコピーしました