마인크래프트/명령어 응용

minecraft 내 시선으로 날아가는 투사체(上)

dasd1568 2020. 12. 27. 20:55
반응형

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 내 시선으로 날아가는 투사체(上)