summon minecraft:fireball, arrow, trident, potion 등은 {Motion:[x,y,z]} tag를 가지고 있어야 제대로 된 형태를 가집니다. Motion은 좌표값을 가지므로, 영점(0,0,0)에서 플레이어가 바라보는 방향으로 n블록 떨어진 곳의 좌표를 안다면 원하는 방향으로의 Motion값을 지정할 수 있습니다. (벡터 평행 이동)
1. 좌표(0,0,0)에서의 플레이어 시선 벡터 시작/끝점 생성
위 gif와 같이 0,0,0에 위치하는 아머스탠드{Tags:["main"]}는 플레이어의 시선과 동일하게 회전하고,
그 아머스탠드의 4블럭 앞에 있는 아머스탠드{Tags:["position"]}를 구현하는 커맨드는 다음과 같습니다.
1-1. 벡터 시작점, 끝점 물체 생성
:summon minecraft:armor_stand 0 0 0 {Tags:["main"],NoGravity:1,Invulnerable:1}
=> 아머스탠드가 아닌 상하좌우를 모두 볼 수 있는 entity를 사용하는 것을 추천드립니다.
해당 entitiy는 {NoAI:1,Silent:1,PersistenceRequired:1}를 추가합니다.
: summon minecraft:armor_stand ~ ~ ~ {Tags:["position"]},NoGravity:1,Invulnerable:1}
1-2. 플레이어의 시선, 벡터의 끝점에 대한 스코어보드
'main'의 시선을 지정하기 위한 스코어보드 R1, R2
'position'의 위치를 지정하기 위한 스코어보드 P0X, P1Y, P2Z 를 생성합니다.
: scoreboard objectives add (R1, R2, P0X, P1Y, P2Z) dummy
1-3. 플레이어의 시선을 'main'에 적용 시키기
: (repeat) execute as @e[tag=main] store result score @s R1 run data get entity <대상> Rotation[0] 1
: (repeat) execute as @e[tag=main] store result score @s R2 run data get entity <대상> Rotation[1] 1
1-4. 'main' 시선 앞 4블록에 'position' 위치 시키기
: (repeat) execute at @e[tag=main] run tp @e[tag=position] ^ ^ ^4
2. 'main'의 시선 방향을 플레이어의 시선과 일치시키기
2-1. 횡 방향 시선
: (repeat) execute as @e[tag=main] store result entity @s Rotaion[0] double 0.01 run scoreboard players get @e[tag=main,limit=1] R1
: (repeat) execute as @e[tag=main] store result entity @s Rotation[0] float 1 run scoreboard players get @e[tag=main,limit=1] R1
- 플레이어의 횡 방향 시선은 0.000~360.000의 값을 가집니다. 그러나 store result ~~ Rotation[] 의 값은 0~360,000의 값을 가집니다. (소숫점 아래 3번째 자리의 수가 일의 자리의 값으로 저장됨) 따라서 0.01을 곱한 뒤(double) 소숫점 1까지 올림(float)해 줍니다.
2-2. 종 방향 시선
Rotation[0] -> Rotation[1] , R1 -> R2 로 바꾸어 사용합니다.
=> 'main'이 아머스탠드인 경우 사용하지 않습니다. (아머스탠드는 종 방향 시선을 갖지 않음)
3. 'position'의 위치값을 스코어보드에 저장하기
: (repeat) execute as @e[tag=position] store result score @s P0X run data get entity @s Pos[0] 1000
: (repeat) execute as @e[tag=position] store result score @s P1Y run data get entity @s Pos[1] 1000
: (repeat) execute as @e[tag=position] store result score @s P2Z run data get entity @s Pos[2] 1000
4. 투사체를 소환한 뒤 'position'의 위치값을 투사체의 Motion[]값에 넣기
: summon minecraft:arrow ^ ^ ^0.7 {Tags:["AR","summoned"]}
투사체를 소환했을 경우, 다음과 같은 커맨드가 작동하게 합니다.
: execute as @e[tag=AR,tag=summoned] store result entity @s Motion[0] double 0.0001 run scoreboard players get @e[tag=position,limit=1] P0X
: execute as @e[tag=AR,tag=summoned] store result entity @s Motion[1] double -0.0001 run scoreboard players get @e[tag=position,limit=1] P1Y
: execute as @e[tag=AR,tag=summoned] store result entity @s Motion[2] double 0.0001 run scoreboard players get @e[tag=position,limit=1] P2Z
: tag @e[tag=AR,tag=summoned] remove summoned
이때 배수를 0.0001로 설정 시 플레이어로부터 화살이 약 2블럭만 이동합니다. 더 빠른 속도를 원하실 경우 0.0001에서 n배한 값을 사용하시면 됩니다. (0.0005 권장)
'마인크래프트 > 명령어 응용' 카테고리의 다른 글
minecraft Owner (0) | 2021.07.30 |
---|---|
minecraft 레이저 포인터 (0) | 2020.12.28 |
minecraft 타이머 (0) | 2020.12.27 |
minecraft 내 시선으로 날아가는 투사체(下) (0) | 2020.08.15 |
minecraft 발사체를 이용한 순간이동 (0) | 2020.08.14 |
'마인크래프트/명령어 응용'의 다른글
- 현재글minecraft 내 시선으로 날아가는 투사체(上)