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
에서 if block at location at {_x}, {_y}, {_z} in "world" is air: 가 있는 단락에 else나 뭐 다른 명령문이 없죠? while문 조건상 set {_loop} to false가 작동해야 반복이 멈추는데 맨 처음 조건문 단락에 아무것도 없으므로, 만약 처음 뽑은 블록이 공기가 아니라면 아무것도 안하고 무한 반복을 돌게 되거든요. 그럼 서버가 과부하 걸려서 꺼져요.
TPS가 떨어지는건 위의 무한 반복 문제 말고도 기본적으로 실행 방식이
y 90에서 밑으로 한칸씩 내려가면서: 보통 y 좌표는 60쯤이므로 여기서 30번 정도 실행할 껍니다
물이면 다른 지점을 뽑는거라: 30번씩 하는걸 물이 아닐 때 까지 다시 해야 합니다
이라서 평균적으로 명령어를 수백번 실행하게 되구요,서버에 과부하가 걸리게 되는거죠.
결론은 이 스크립트 만든 사람이 심각하게 이상하게 만든 게 맞구요, 실력이 부족해서 이런 참사가 벌어지는거니 다른 사람 스크립트를 알아보는게 좋으실꺼에요. 이건 다른 구현 방식이 많거든요.
qsef1256
2022.01.16일단 상당히 이상하게 만든 스크립트네요. 3500블록 범위로 랜덤 좌표를 뽑아서 물이면 다시 뽑고 물이 아닐때까지 반복해요. 발적화죠. 이거 만든 사람이 돈받고 하는거면 외주 파기하는게 맞아요.
qsef1256
2022.01.16물이면 다시 뽑는게 아니라 y좌표 상에서 왔다갔다 하면서 스폰 장소 잡기만 해도 좀 나을 텐데 말이죠;
qsef1256
2022.01.16이게 왜 터지나면요, while은 어떤 조건이 거짓일 때 반복을 중단하는데,
에서
if block at location at {_x}, {_y}, {_z} in "world" is air:
가 있는 단락에 else나 뭐 다른 명령문이 없죠? while문 조건상 set {_loop} to false가 작동해야 반복이 멈추는데 맨 처음 조건문 단락에 아무것도 없으므로, 만약 처음 뽑은 블록이 공기가 아니라면 아무것도 안하고 무한 반복을 돌게 되거든요. 그럼 서버가 과부하 걸려서 꺼져요.TPS가 떨어지는건 위의 무한 반복 문제 말고도 기본적으로 실행 방식이
이라서 평균적으로 명령어를 수백번 실행하게 되구요,서버에 과부하가 걸리게 되는거죠.
결론은 이 스크립트 만든 사람이 심각하게 이상하게 만든 게 맞구요, 실력이 부족해서 이런 참사가 벌어지는거니 다른 사람 스크립트를 알아보는게 좋으실꺼에요. 이건 다른 구현 방식이 많거든요.
Lee_Junki
2022.01.16감사합니다.!