이번 시간에는 유리 블록 위에서 점프를 하면 위로, 웅크리기를 하면 아래로 내려가는 엘리베이터 기능을 Skript로 만들어 보도록 하겠습니다. 이번 시간의 스크립트는 다른 애드온이 필요하지 않습니다.
1. 올라가는 기능 만들기
1-1) 위에 있는 유리 블록 감지하기
점프를 했을 때, 위에 있는 유리 블록 위로 텔레포트를 시켜주어야 하기 때문에, 플레이어가 유리 블록 위에서 점프했을 때 그 위치의 x,z 좌표에서 y좌표만 위로 올라가면서 유리블록인지 아닌지 확인을 해 주어야 합니다. loop n times 구문을 이용해서 블록의 좌표를 이용한 감지를 해도 되지만, 블록들을 지정해서 블록 자체를 루프할 수도 있기 때문에 이번 시간에는 블록을 루프해서 만들어 보도록 하겠습니다. 아래는 그 코드입니다.
on jump:
set {_block} to the block below event-player
if {_block} is not glass block:
exit
loop blocks from the block 1 above {_block} to the block {@range} above the player:
set {_b} to loop-block
if {_b} is not glass block:
continue
우선 플레이어의 위치로부터 1 블록 아래에 있는 블록이 유리 블록인지 확인한 뒤, 유리 블록으로부터 1 블록 위에 있는 블록부터 플레이어의 위치에서 {@range} 블록만큼 위에 있는 블록까지의 블록들을 루프해 주었습니다. 그리고 루프 내에서는 감지한 블록이 유리 블록이 아닐 시 continue를 이용하여 다음 루프로 넘어가도록 해 주었습니다.
여기서, {@range}는 스크립트 기초 이론시간에 배웠던 옵션을 이용했습니다.
2022.02.19 - [마인크래프트/Skript 기초 이론편] - 스크립트 기초 이론 7편(옵션)
모든 범위를 다 감지할 수는 없고, 너무 많은 범위를 감지한다면 서버에 부담이 되므로 옵션을 이용하여 감지할 범위를 지정해 주었습니다. 기본값은 100으로 지정해 놓았습니다.
1-2) 텔레포트 가능한 지 확인하기
마인크래프트 플레이어는 1칸짜리 블록에는 들어가지 못합니다. 정확히는 1.8칸이었나 였던걸로 기억하지만, 소숫점 단위까지 따져가면서 코딩을 하면 매우 복잡해 지므로, 유리 블록 위에 2칸의 여유가 있을 시에만 텔레포트가 가능한 것으로 치도록 하겠습니다. 아래는 그 코드입니다.
if the block 1 above {_b} is not air:
continue
if the block 2 above {_b} is not air:
continue
{_b}는 루프 블록입니다. 루프 블록으로부터 1칸 그리고 2칸 위의 블록들을 감지한 뒤, 둘 중 하나라도 공기가 아니라면 다음 루프로 넘어가도록 해 주었습니다.
1-3) 텔레포트 시키기
이제 감지한 유리 블록 위의 1~2칸이 비어 있다는 사실도 확인했으니, 플레이어를 유리 블록 1칸 위의 위치로 텔레포트 시켜줄 차례입니다. 아래는 그 코드입니다.
set {_l} to location of {_b}
set {_l} to the location 0.5 above {_l}
set pitch of {_l} to pitch of event-player
set yaw of {_l} to yaw of event-player
teleport event-player to {_l}
exit loop
플레이어를 텔레포트 시켜줄 때 yaw와 pitch를 지정해 주지 않으면 텔레포트를 시켰을 때 원래 보고 있던 방향이 아닌 0,0을 바라보게 되기 때문에, 플레이어의 yaw와 pitch 값을 가져와서 지정해 주었습니다. 또한 유리 블록으로부터 1칸 위로 위치를 지정해 주면, 텔레포트를 시켰을 때 0.5칸 위로 붕 뜨는 현상이 있기 때문에, 저는 0.5칸 위로 텔레포트를 시켜주었습니다.
한 가지 중요한 점은, 1,2,3층이 있다고 했을 때, 1층에서 점프를 했을 때 2층의 유리블록을 감지하고 2층으로 텔레포트를 한 후에는 3층의 유리블록을 감지하여 텔레포트를 하면 안됩니다. 따라서 플레이어의 위치부터 100칸 위 사이의 블록들 중 플레이어와 가장 가까운 유리 블록 순서대로 감지를 하기 때문에, 텔레포트를 한번 성공한 후에는 exit loop 구문을 이용하여 루프를 종료시켜주어야 합니다.
1-4) 정리
1-1~3 단계의 코드들을 전부 다 합치면 아래와 같은 형식입니다.
options:
range: 100
on jump:
set {_block} to the block below event-player
if {_block} is not glass block:
exit
loop blocks from the block 1 above {_block} to the block {@range} above the player:
set {_b} to loop-block
if {_b} is not glass block:
continue
if the block 1 above {_b} is not air:
continue
if the block 2 above {_b} is not air:
continue
set {_l} to location of {_b}
set {_l} to the location 0.5 above {_l}
set pitch of {_l} to pitch of event-player
set yaw of {_l} to yaw of event-player
teleport event-player to {_l}
exit loop
2. 내려가는 기능 만들기
2-1) 아래에 있는 유리 블록 감지하기
올라갈 때에는 발밑에 있는 유리블록 -> 100칸 위의 유리블록 순서대로 감지해 주었다면, 내려갈 때에는 발밑에 있는 유리블록 -> 100칸 아래의 유리블록 순서대로 감지해 주어야 합니다. 또한 또 하나의 차이점은 올라갈 때에는 점프를 했을 시에 엘리베이터가 작동되도록 했지만, 아래로 내려갈때는 웅크리기를 이용하여 작동되도록 만들어야 합니다. 아래는 그 코드입니다.
on sneak toggle:
if event-player is not sneaking:
exit
set {_block} to the block below event-player
if {_block} is not glass block:
exit
loop blocks from the block 1 below {_block} to the block {@range} below the player:
set {_b} to loop-block
if {_b} is not glass block:
continue
Skript에는 "웅크리기를 눌렀을 때" 또는 "웅크리기 키를 땠을 때" 라는 이벤트문은 존재하지 않습니다. 대신에 그 두 상황을 합쳐서 "웅크리기 상태에 변화가 일어났을 때", 즉 "웅크리기 키를 누르거나 땠을 때" 라는 의미의 on sneak toggle 이라는 이벤트문은 존재합니다. 저는 "웅크리기 키를 땠을 때" 이벤트문이 작동하도록 만들고 싶기 때문에, 이벤트 문 안에 조건문을 추가해 주었습니다. 만약 조건문을 추가하지 않았을 시에는 웅크리기 키를 눌렀을 때 1번, 그리고 땠을 때 1번 해서 엘리베이터가 2번 동시에 작동되어 2층 아래로 내려가는 불상사가 발생할 수 있으니 주의하시길 바랍니다.
올라갈때와는 반대로 아래의 블록들을 감지해 주기 때문에 전체적인 틀은 올라갈 때의 구문과 다르지 않고, 위 라는 의미의 above 라는 단어들만 아래 라는 의미의 below라는 단어로 변경된 것을 볼 수 있습니다.
2-2) 텔레포트 가능한 지 확인하기
내려갈 때에도 마찬가지로 2칸의 여유가 있는지 확인해 주도록 하겠습니다. 내려갈 때에도 올라갈 때와 마찬가지로 텔레포트시킬 유리 블록으로부터 1칸과 2칸 위의 블록들만 확인해주면 되기 때문에 올라갈 때의 코드와 변경점은 없습니다. 아래는 그 코드입니다.
if the block 1 above {_b} is not air:
continue
if the block 2 above {_b} is not air:
continue
2-3) 텔레포트 시키기
2-2와 마찬가지로 올라갈 때와 다른 점은 없습니다. 올라갈 때의 코드를 그저 복사 붙여넣기 해주시면 됩니다. 아래는 그 코드입니다.
set {_l} to location of {_b}
set {_l} to the location 0.5 above {_l}
set pitch of {_l} to pitch of event-player
set yaw of {_l} to yaw of event-player
teleport event-player to {_l}
exit loop
구문들에 관한 자세한 설명들은 1단계에서 다 했기 때문에 2단계에서 다시 한번 하지는 않겠습니다.
2-4) 정리
2-1~3 단계의 코드들을 다 합치면 아래와 같은 형식입니다.
on sneak toggle:
if event-player is not sneaking:
exit
set {_block} to the block below event-player
if {_block} is not glass block:
exit
loop blocks from the block 1 below {_block} to the block {@range} below the player:
set {_b} to loop-block
if {_b} is not glass block:
continue
if the block 1 above {_b} is not air:
continue
if the block 2 above {_b} is not air:
continue
set {_l} to location of {_b}
set {_l} to the location 0.5 above {_l}
set pitch of {_l} to pitch of event-player
set yaw of {_l} to yaw of event-player
teleport event-player to {_l}
exit loop
이번 시간에는 블록을 루프하는 기능을 활용해서 유리 블록을 이용한 엘리베이터 기능을 만들어 보았습니다. 여기서 더 추가할 점이 있다면 엘리베이터를 작동시켰을 때 효과음을 넣어준다면 좋을 것 같네요. 질문이 있으시다면 이 글의 댓글에 남겨주시면 답변해드리도록 하겠습니다.
아래는 스크립트 파일들입니다
주석 미포함
'마인크래프트 > Skript 기초 활용편' 카테고리의 다른 글
스크립트 기초 활용 13편(원 그리기) (0) | 2023.01.08 |
---|---|
스크립트 기초 활용 시즌 2 로드맵 (0) | 2023.01.07 |
스크립트 기초 활용 11편(오늘의 날씨) (1) | 2023.01.04 |
스크립트 기초 활용 10편(자동심기) (1) | 2023.01.02 |
스크립트 기초 활용 9편(자동완성) (0) | 2022.02.26 |
댓글