개인 자료란 (JE)

  서버 커뮤니티

Profile sdfdsr 대표칭호 없음

bl9ckSapphire 86355e6bbe4b483482de818ff64e62da

Profile

질문하기 스크립트

랜덤워프 관련 질문드립니다

2020.08.18 조회 수 301 추천 수 0
이해도 1.16 
게임버전 (JE) 페이퍼 
스크립트 애드온 2.5-alpha6 

랜덤워프2.sk  

랜덤워프를 쓰면 물이 있는 곳 말고 무조건 땅 위에 워프되도록 하려고했는데

여전히 물로도 워프가 됩니다.. 어떻게 고쳐야 하나요? 




9개의 댓글

스크립터브혼
2020.08.18

반복문에서 분기를 나누실때 비교하는 대상이 잘못되어서 그렇습니다.

while {_loop} is true:
    if block at location at {_x}, {_y}, {_z} in "world" is air:
        if block at location at {_x}, {_y}-1, {_z} in "world" is air:
            remove 1 from {_y}
        
        else:
            if block at location at {_x}, {_y}, {_z} in "world" is water:
                set {_x} to a random number between -3000 and 3000
                set {_y} to 90
                set {_z} to a random number between -3000 and 3000
            else:
                set {_loop} to false
teleport player to location at {_x}, {_y}, {_z} in "world"        

if block at location at {_x}, {_y}, {_z} in "world" is water:이 부분은
아랫블록과 비교해야하니 {_y}-1 이 맞겠죠. 그리고 마지막 텔레포트 부분도 {_y}-1 이어야합니다.

air, water, else는 비교하는 대상이 같기때문에 if else 한개로 묶어도 됩니다.

코드를 정리하면 아래와 같습니다.

while {_loop} is true:
    if block at location at {_x}, {_y}, {_z} in "world" is air:
        if block at location at {_x}, {_y}-1, {_z} in "world" is air:
            remove 1 from {_y}
        
        else if block at location at {_x}, {_y}-1, {_z} in "world" is water:
            set {_x} to a random number between -3000 and 3000
            set {_y} to 90
            set {_z} to a random number between -3000 and 3000

        else:
            set {_loop} to false
teleport player to location at {_x}, {_y}-1, {_z} in "world"    


이렇게 익스프레션이 긴 경우는 가독성이 떨어지기 때문에 변수로 잡아 사용하는 편이 좋습니다.
최종 코드는 아래와 같습니다.

while {_loop} is true:
    set {_block_top} to block at location at {_x}, {_y}, {_z} in "world"
    set {_block_bottom} to block at location at {_x}, {_y}-1, {_z} in "world"
    if {_block_top} is air:
        if {_block_bottom} is air:
            remove 1 from {_y}
        else if {_block_bottom} is water:
            set {_x} to a random number between -3000 and 3000
            set {_y} to 90
            set {_z} to a random number between -3000 and 3000
        else:
            set {_loop} to false
teleport player to {_block_bottom}              
sdfdsr
2020.08.18
@스크립터브혼

랜덤워프2.sk 이렇게 수정하고 리로드를 하니

 [Skript] Variables cannot be used here. (랜덤워프.sk, line 24: teleport player to {_block_bottom} in "world"')

라는 오류 문구가 뜹니다. 여기서 변수를 사용할 수 없다는데 틀린 부분이 있나요?

스크립터브혼
2020.08.18
@sdfdsr

아 마지막 in "world"는 빼주세요. 덧글 수정했습니다.

sdfdsr
2020.08.18
@스크립터브혼

감사합니다 !!

sdfdsr
2020.08.18
@스크립터브혼

오류로그.sk  오류가 뜬 로그기록입니다

여러사람이 쓰면서 랜덤워프 명령어가 반복적으로 사용되면 이런식으로 오류문구가 뜨면서 버킷이 꺼지는데 x,z 값이 너무 광범위해서 그런건가요?  

스크립터브혼
2020.08.18
@sdfdsr

반복문을 빠져나오지 못해 오버플로우가 생기는걸로 보입니다.

sdfdsr
2020.08.19
@스크립터브혼

혹시 해결방법이 있나요? 이제 한번만써도 버킷이 꺼지고있어서..ㅠ

스크립터브혼
2020.08.19
@sdfdsr

while 말고 loop로 횟수를 제한하시고, loop 안에서 코드가 어떻게 동작하고 있고, 어째서 빠져나오지 못하는지 찾아보시길 바랍니다.

sdfdsr
2020.08.19
@스크립터브혼

넵 감사합니다