개인 자료란 (JE)

  서버 커뮤니티

Profile Mule_sup_ 대표칭호 없음
Profile

질문하기 스크립트

좌표값 조건, 반복문 처리 질문

2020.12.13 조회 수 217 추천 수 0
이해도 1.16 
게임버전 (JE) 페이퍼 
스크립트 버전 입문자(아무것도 몰라요) 
스크립트 애드온 2.5.2 

command /spawn:
    trigger:
        set {_title} to "&f[ &a3 &f]"
        set {_time} to 3
        play sound "BLOCK_STONE_BUTTON_CLICK_ON" with volume 0.8 and pitch 1 for player
        send title {_title} to player for 1 seconds
        wait 1 seconds
        set {_Xcoor} to x-coordinate of player
        set {_Ycoor} to y-coordinate of player
        set {_Zcoor} to z-coordinate of player
        loop {_time} times:
            if {_Xcoor} is x-coordinate of player:
                if {_Ycoor} is y-coordinate of player:
                    if {_Zcoor} is z-coordinate of player:
                        if loop-number < {_time}:
                            set {_rest} to {_time} - loop-number
                            play sound "BLOCK_STONE_BUTTON_CLICK_ON" with volume 0.8 and pitch 1 for player
                            send title "&f[ &a%{_rest}% &f]" to player for 1 seconds
                            wait 1 seconds
                        else:
                            send title "&f[ &a이동 완료 &f]" to player for 1 seconds
                            execute player command "/essentialsspawn:spawn"
                            play sound "ENTITY_PLAYER_LEVELUP" with volume 0.8 and pitch 0.9 for player


                    else:
                        send title "&f[ &4취소 &f]" to player for 1 seconds
                        stop
                else:
                    send title "&f[ &4취소 &f]" to player for 1 seconds
                    stop
            else:
                send title "&f[ &4취소 &f]" to player for 1 seconds
                stop

우선 이게 제가 작성한 코드입니다.  사용자가 /spawn을 입력했을 때,

커맨드를 입력한 시점에 플레이어의 좌표값을 기록하고, 

그 후 매초 플레이어의 좌표값과 현재의 좌표값 비교를 반복하여

도중에 움직임이 발생할 경우 이동을 취소하게 만들었습니다.

그러나 너무 정확한 체크는 도리어 플레이에 불편함을 줄 수 있기에

처음 1초간은 좌표값 비교를 하지 않고  무조건으로 "3초" 출력 후,
그다음 플레이어의 좌표값을 기록하고 그 뒤 나머지 초엔 좌표값을 비교하게

만들고자한 시행착오를 겪은 게 지금의 코드 모습입니다.

그러나 실제 적용 결과 '3초' 메세지 출력 후  '2초' 메세지가 나오기 전  잠깐의 시간동안
움직였을 경우, 이동이 취소되지 않아야 하는 기존의  목표와는 달리 '2초' 메세지가 나온 후

'1초' 메세지가 나오기 바로 직전 조건문에서 else로 판별해버립니다..

어떤 부분을 고쳐야 본 의도대로 실행되게 만들 수 있을까요??

2개의 댓글

스크립터브혼
2020.12.13

플레이어가 움직이다 정지했을때 바로 멈추는게 아니라 짧게 미끄러집니다.
자연스러운 움직임을 위해 이러한 움직임을 보이는 것 같습니다.

명령 후 바로 살짝 움직인 것과, 2초가 되기 바로 전까지 움직인 것
두 경우 모두 2초 전에 움직였다고 생각하시겠지만 후자의 경우 2초가 된 후에도 약간 밀려 위치가 변경됩니다.
그래서 전자의 경우 바르게 동작하고, 후자의 경우 잘못된 동작처럼 보이게 됩니다.

스크립트는 기본 옵션으로 소수점 2자리만 표기하기 때문에 미세한 변화를 알 수 없는데,
config.sk파일의 number accuracy 옵션을 변경하여 더 작은 소숫점 자리까지 표시해서 확인해 보시길 바랍니다.

작성된 코드는 구현하고자 하는 것이 정확하게 구현 된 것이 맞습니다.
다만, 완전 일치가 아닌 조금은 유연하게 동작하게 하려면 시간을 지연하는 것 보다 판정 범위를 주는 것이 더 어울릴 것 같습니다.


x-coordinate of player > {_Xcoor} - 0.3
x-coordinate of player < {_Xcoor} + 0.3

이와 같이 각 성분의 ±0.3 정도 허용해 주도록 구성해보세요.

Mule_sup_
2020.12.13
@스크립터브혼

기술하신 방법대로 적용해보니

정확히 원하는대로 작동합니다!

감사합니다.