質問: Minecraft 1.14のコマンドについて質問です。 Summonで召喚した村人に視点を合わせると動作するコマンドを作成したいのですが、何をどうすればさっぱりわかりません。Executeのコマンドを使用する(?)事まではなんとな
回答: 「視線を合わせる」というのが曖昧な表現だったため、下記条件として実現します 条件 1.対象の村人(以下「村人」)はタグ:facingを保有 2.プレイヤーと村人の距離が5m以内の場合 3.プレイヤーと村人の視線が「ある程度」一致する(程度は後述) 4.村人、プレイヤーは複数居ても可能 として実現します 準備(各一回実行) /scoreboard objectives add rotxz dummy /scoreboard objectives add roty dummy 1リピート2~無条件常時チェーン 1/execute as @e[tag=facing,type=villager] at @s facing entity @p[distance=..5] feet run teleport @s ~ ~ ~ ~ ~ 2/execute as @a store result score @s rotxz run data get entity @s Rotation[0] 10 3/execute as @a store result score @s roty run data get entity @s Rotation[1] 10 4/execute as @e[tag=facing,type=villager] store result score @s rotxz run data get entity @s Rotation[0] 10 5/execute as @e[tag=facing,type=villager] store result score @s roty run data get entity @s Rotation[1] -10 6/execute as @a[scores={rotxz=-3600..-1}] run scoreboard players add @s rotxz 3600 7/tag @e[tag=facing,type=villager,scores={rotxz=..-1801}] add p5400 8/tag @e[tag=facing,type=villager,scores={rotxz=-1800..1799}] add p1800 9/scoreboard players add @e[tag=facing,type=villager,tag=p5400] rotxz 5400 10/scoreboard players add @e[tag=facing,type=villager,tag=p1800] rotxz 1800 11/scoreboard players remove @e[tag=facing,type=villager,tag=!p5400,tag=!p1800] rotxz 1800 12/execute as @e[tag=facing,type=villager] run data merge entity @s {Tags:["facing"]} 13/execute as @e[tag=facing,type=villager] at @s run scoreboard players operation @s rotxz -= @p[distance=..5] rotxz 14/execute as @e[tag=facing,type=villager] at @s run scoreboard players operation @s roty -= @p[distance=..5] roty 15execute as @e[tag=facing,type=villager] if score @s rotxz matches -50..50 if score @s roty matches -50..50 at @s run tellraw @p[distance=..5] {"text":"私を見ているな"} 細かく分解して説明していきます 1は「条件2」を満たす「最も近いプレイヤー」の方向を向かせています。 立ち止まった状態の場合、村人の顔や体の向きが変わっても内部データが変わっていない場合があるため強引に振り向かせます(これほんと厄介だった) 23はプレイヤーの横方向、縦方向の回転度合いの数値を 45は村人の横方向、縦方向の回転度合いの数値をそれぞれ10倍で取得しています(横:rotxz,縦:roty) 6は-180~0~180度表記では面倒なので「0~3600」にするための下駄です 稀に何故か-360~0になる場合もあるためそれ対策も兼ねています 78は村人の視線を180度回して「プレイヤーに背を向ける視線」の数値に変換する準備です 91011で村人のスコアを「プレイヤーに背を向ける視線」の数値に変換し、 12はその後始末です 1314で横、縦方向の視線の数値を引き算することで 15にて「目線があっているか」の判定をしています ピッタリ視線があえば横縦それぞれが0になるようになっているため、 そこからどれだけ誤差を許容するかは15の if score @s rotxz matches -50..50 と if score @s roty matches -50..50 で横、縦それぞれの許容誤差を現在5度(10倍しているため)としています 実行者は「目線を合わせられた村人」となっているため、tellraw部分をそのまま書き換えれば「目線を合わせられた村人が実行者としてのコマンド」が可能になります