한마포 갤러리
https://www.koreaminecraft.net/files/thumbnails/830/183/002/262x150.crop.jpg
생일

marku6692

2020-11-30

0

https://www.koreaminecraft.net/files/thumbnails/814/183/002/262x150.crop.jpg
할로윈

marku6692

2020-11-30

0

한국 마인크래프트 포럼

새롭게 돌아온
마인크래프트 커뮤니티 및 자료 플랫폼

전체 회원수 82,483명 오늘 가입자 115명

※ 1년 이상 활동하지 않은 휴면 회원은 제외된 수치입니다.

Profile 베개냥이 창작자

Pillowprism_ 0a03b80180354f0d931c014a9ca5e1df

Profile

자료란new 공통new 리뷰, 강좌new 레드스톤

[ 커맨드 실전 I ] 멀티플레이에서 플레이어 좌표 소수점 단위로 출력하기

2020.10.25 조회 수 31 추천 수 1

[문제가 있는 커맨드입니다]

강좌 업로드 이후 마지막 테스트 과정에서 문제를 발견했습니다.

본 강좌는 좌표가 음수일때 제대로 표기되지 않는 문제가 발생하여, 좌표가 일반적으로 양수인 y좌표에 대해서만 참고하시길 바랍니다.

최대한 빨리 이 문제를 해결하고 업데이트하겠습니다.


에디터 베개에요!

커맨드 강좌같은걸 시리즈 단위로 쓰고 싶은데,

 /help나 /gamemode같은 쉽고 재미없는 커맨드를 다루면 지금 제가 쓰고 있는 강좌까지 7개월은 걸릴 것 같아서, 1편부터 하드 난이도로 준비했습니다.


스코어보드는 파란색,

상수는 초록색,

좌표는 보라색,

그 외의 값들은 빨간색으로 강조했습니다.


우선, 사전에 한 번씩 실행해야 하는 명령어는 다음과 같습니다.

scoreboard objectives add x dummy 

scoreboard objectives add xint dummy  

scoreboard objectives add xfrac dummy  

scoreboard objectives add y dummy

scoreboard objectives add yint dummy  

scoreboard objectives add yfrac dummy  

scoreboard objectives add z dummy 

scoreboard objectives add zint dummy  

scoreboard objectives add zfrac dummy 

scoreboard objectives add assets dummy 

scoreboard players set const1000 assets 1000



*assetsconst1000은 단순히 값 1000을 저장하기 위한 것으로, 다른 변수명을 만드시거나 이미 있는 경우 지정해도 괜찮습니다.



출력해야 할 숫자가 x, y, z 3가지가 있지만, 일단 x만 따로 떼와서 확인해봅시다.

24b158b037e99fe69ef5fc0d72ab40fa.png

3개의 스코어보드인 x, xint, xfrac가 있습니다.

아직 3개의 스코어보드에 아무런 값이 저장되어 있지 않습니다.


이때 이 명령어의 영향을 받는 플레이어의 x좌표를 12.9876543.. 라고 생각하고 진행하겠습니다.



a06a85397cb2a0b18fd5b650c76c75d6.png

1) execute as @a at @s run execute store result score @s x run data get entity @s Pos[0] 1000


모든 플레이어에 대해 그 플레이어의 x좌푯값 1000을 곱해서 스코어보드 x의 자신의 닉네임으로 저장합니다.


Pos[0]이 뭔지 모르시겠다고요?

Pos[]는 엔티티의 x, y, z좌표를 담고 있는 nbt 태그입니다.

2653df318d194adb7cd1bc46603fef7d.png

어떤 플레이어의 Pos[] nbt 태그 예시


Pos[0] : X좌표

Pos[1] : Y좌표

Pos[2] : Z좌표


이때 Pos[0]12.9876543... 이므로 여기서 1000을 곱하면 12987.6543...이 됩니다.

하지만, 스코어보드에서 소숫점 밑은 날려버리기 때문에 x에는 정확히 12987이 저장됩니다.

ec3cbbecd564a24704e15d3a1e2998e7.png



2) execute as @a at @s run scoreboard players operation @s x %= const1000 assets


스코어보드 x의 값을 1000으로 나눈 나머지로 바꿉니다.


간단히 말해서, 12987 1000으로 나눈 나머지는 987인데, 그걸 다시 x에 넣는다고 보면 됩니다.







55f2a6dca9329d07da4ddbcc1f7b7ddf.png

3) execute as @a at @s run scoreboard players operation @s xfrac = @s x


스코어보드 xfrac 값을 스코어보드 x 값과 동일하게 바꿉니다.

이걸로 xfrac에는 987이 저장되었네요.




7ca8f29e9f6e9e59c34acf5ac4ca86d9.png

4) execute as @a at @s run execute store result score @s x run data get entity @s Pos[0] 1000


1)과 동일합니다.  x 좌표를 얻어와서 1000을 곱한 뒤 x에 넣습니다.




98f61c5634b4c153c0ac0f08469ecae8.png

5) execute as @a at @s run scoreboard players operation @s x /= const1000 assets


스코어보드 x의 값을 1000으로 나눠, 다시 x에 넣습니다.


129871000으로 나누면 12.987이 되지만, 아까 말했다시피 스코어보드는 소숫점을 모두 버리기 때문에 12가 저장됩니다.





e6c960d19259bdfd4ab42e4400d85a9f.png

6) execute as @a at @s run scoreboard players operation @s xint = @s x


스코어보드 xint 값을 스코어보드 x 값과 동일하게 바꿉니다.

xfrac 987이 저장된것과 같이, xint에는 12가 저장되었네요.



037592ae264944d1987bbd7dd79f1bc5.png

7) execute as @a at @s run title @s actionbar ["",{"text":"x= "},{"score":{"name":"@s","objective":"xint"}},{"text":"."},{"score":{"name":"@s","objective":"xfrac"}}]


x = 12.987 메시지를 그 플레이어의 액션바로 출력합니다.


12 xint, 987xfrac 값입니다.





execute as @a at @s run execute store result score @s x run data get entity @s Pos[0] 1000

execute as @a at @s run scoreboard players operation @s x %= const1000 assets

execute as @a at @s run scoreboard players operation @s xfrac = @s x

execute as @a at @s run execute store result score @s x run data get entity @s Pos[0] 1000

execute as @a at @s run scoreboard players operation @s x /= const1000 assets

execute as @a at @s run scoreboard players operation @s xint = @s x

execute as @a at @s run title @s actionbar ["",{"text":"yx= "},{"score":{"name":"@s","objective":"xint"}},{"text":"."},{"score":{"name":"@s","objective":"xfrac"}}]




위의 7개 명령어가 1틱당 1번씩 돌면서, 스코어보드 값을 갱신하며 x좌표를 계속 출력합니다.

지금까지 알아본 명령어들은 모두 x좌표만을 출력하는 것으로, 위의 7개 명령어를 반복해서 x, y, z 모든 좌표를 출력하게 하는 명령어를 마침내 짤 수 있게 되었습니다.




execute as @a at @s run execute store result score @s x run data get entity @s Pos[0] 1000

execute as @a at @s run scoreboard players operation @s x %= const1000 assets

execute as @a at @s run scoreboard players operation @s xfrac = @s x

execute as @a at @s run execute store result score @s x run data get entity @s Pos[0] 1000

execute as @a at @s run scoreboard players operation @s x /= const1000 assets

execute as @a at @s run scoreboard players operation @s xint = @s x

execute as @a at @s run execute store result score @s y run data get entity @s Pos[1] 1000

execute as @a at @s run scoreboard players operation @s y %= const1000 assets

execute as @a at @s run scoreboard players operation @s yfrac = @s y

execute as @a at @s run execute store result score @s y run data get entity @s Pos[1] 1000

execute as @a at @s run scoreboard players operation @s y /= const1000 assets

execute as @a at @s run scoreboard players operation @s yint = @s y

execute as @a at @s run execute store result score @s z run data get entity @s Pos[2] 1000

execute as @a at @s run scoreboard players operation @s z %= const1000 assets

execute as @a at @s run scoreboard players operation @s zfrac = @s z

execute as @a at @s run execute store result score @s z run data get entity @s Pos[2] 1000

execute as @a at @s run scoreboard players operation @s z /= const1000 assets

execute as @a at @s run scoreboard players operation @s zint = @s z

execute as @a at @s run title @s actionbar ["",{"text":"x = "},{"score":{"name":"@s","objective":"xint"}},{"text":"."},{"score":{"name":"@s","objective":"xfrac"}},{"text":" y = "},{"score":{"name":"@s","objective":"yint"}},{"text":"."},{"score":{"name":"@s","objective":"yfrac"}},{"text":" z = "},{"score":{"name":"@s","objective":"zint"}},{"text":"."},{"score":{"name":"@s","objective":"zfrac"}}]

(명령어 19개, 모두 1틱마다 반복, 순서 반드시 지킬 것)



y좌표를 구할 때는 Pos[1], z좌표를 구할 때는 Pos[2]를 불러오는 것을 알 수 있습니다.

지금까지 알아본 명령어는 1000을 곱하고 1000을 나누어 소숫점 셋째 자리까지 표기했지만, 곱하고 나누는 숫자를 바꿔 표시할 소숫점 단위를 바꿀 수 있습니다.


그럼 이만!


:D


2개의 댓글

햇님온라인
2020.10.30

유용한 강의 감사합니다!

아이스틴
2020.10.25

흥미로운 글, 잘 읽었습니다 :D