ここから本文です

Minecraft 1.14のコマンドについて質問です。 Summonで召喚した村人に視点を合わ...

uul********さん

2019/10/2600:25:46

Minecraft 1.14のコマンドについて質問です。
Summonで召喚した村人に視点を合わせると動作するコマンドを作成したいのですが、何をどうすればさっぱりわかりません。Executeのコマンドを使用する(?)事まではなんとな

く分かるのですが、1.12と比べると仕様が大幅に変更されていて何が何だかわからない状態です。どなたか回答お願いします。

閲覧数:
28
回答数:
1

違反報告

ベストアンサーに選ばれた回答

tka********さん

2019/10/2813:57:44

「視線を合わせる」というのが曖昧な表現だったため、下記条件として実現します

条件
1.対象の村人(以下「村人」)はタグ:facingを保有
2.プレイヤーと村人の距離が5m以内の場合
3.プレイヤーと村人の視線が「ある程度」一致する(程度は後述)
4.村人、プレイヤーは複数居ても可能

として実現します

準備(各一回実行)
/scoreboard objectives add rotxz dummy
/scoreboard objectives add roty dummy

①リピート②~無条件常時チェーン
①/execute as @e[tag=facing,type=villager] at @s facing entity @p[distance=..5] feet run teleport @s ~ ~ ~ ~ ~
②/execute as @a store result score @s rotxz run data get entity @s Rotation[0] 10
③/execute as @a store result score @s roty run data get entity @s Rotation[1] 10
④/execute as @e[tag=facing,type=villager] store result score @s rotxz run data get entity @s Rotation[0] 10
⑤/execute as @e[tag=facing,type=villager] store result score @s roty run data get entity @s Rotation[1] -10
⑥/execute as @a[scores={rotxz=-3600..-1}] run scoreboard players add @s rotxz 3600
⑦/tag @e[tag=facing,type=villager,scores={rotxz=..-1801}] add p5400
⑧/tag @e[tag=facing,type=villager,scores={rotxz=-1800..1799}] add p1800
⑨/scoreboard players add @e[tag=facing,type=villager,tag=p5400] rotxz 5400
⑩/scoreboard players add @e[tag=facing,type=villager,tag=p1800] rotxz 1800
⑪/scoreboard players remove @e[tag=facing,type=villager,tag=!p5400,tag=!p1800] rotxz 1800
⑫/execute as @e[tag=facing,type=villager] run data merge entity @s {Tags:["facing"]}
⑬/execute as @e[tag=facing,type=villager] at @s run scoreboard players operation @s rotxz -= @p[distance=..5] rotxz
⑭/execute as @e[tag=facing,type=villager] at @s run scoreboard players operation @s roty -= @p[distance=..5] roty
⑮execute 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":"私を見ているな"}


細かく分解して説明していきます
①は「条件2」を満たす「最も近いプレイヤー」の方向を向かせています。
立ち止まった状態の場合、村人の顔や体の向きが変わっても内部データが変わっていない場合があるため強引に振り向かせます(これほんと厄介だった)
②③はプレイヤーの横方向、縦方向の回転度合いの数値を
④⑤は村人の横方向、縦方向の回転度合いの数値をそれぞれ10倍で取得しています(横:rotxz,縦:roty)
⑥は-180~0~180度表記では面倒なので「0~3600」にするための下駄です
稀に何故か-360~0になる場合もあるためそれ対策も兼ねています
⑦⑧は村人の視線を180度回して「プレイヤーに背を向ける視線」の数値に変換する準備です
⑨⑩⑪で村人のスコアを「プレイヤーに背を向ける視線」の数値に変換し、
⑫はその後始末です
⑬⑭で横、縦方向の視線の数値を引き算することで
⑮にて「目線があっているか」の判定をしています
ピッタリ視線があえば横縦それぞれが0になるようになっているため、
そこからどれだけ誤差を許容するかは⑮の
if score @s rotxz matches -50..50

if score @s roty matches -50..50
で横、縦それぞれの許容誤差を現在5度(10倍しているため)としています

実行者は「目線を合わせられた村人」となっているため、tellraw部分をそのまま書き換えれば「目線を合わせられた村人が実行者としてのコマンド」が可能になります

質問した人からのコメント

2019/10/29 00:00:37

ここまで丁寧に教えて下さりありがとうございました!

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる