본문 바로가기
마인크래프트/Skript 기초 활용편

스크립트 기초 활용 5편(테러방지)

by 스터디립트 2022. 2. 21.

저번 시간에는 금지명령어와 관련된 스크립트에 대해서 배워보았습니다. 이번 시간에는 저번 금지명령어 스크립트에서 한 단계 더 나아간 스크립트라고도 볼 수 있는 테러방지 스크립트에 대해서 배워보도록 하겠습니다. 서버가 어느 장르의 서버인가에 따라서 허용되는 행동이라고 볼 수도 있고, 테러라고 볼 수도 있습니다. 이번 시간에는 일반적인 반야생 서버를 기준으로 테러방지 스크립트를 만들어 보았습니다. 다만 테러방지와 같은 중요한 부분들은 왠만하면 그냥 테러방지 플러그인을 사용하고, 혹시 구멍이 발견된다면 스크립트로 보수하는 형식이 마음이 편하긴 합니다. 이번 시간의 테러방지 스크립트는 그저 스크립트 연습용으로 생각해주세요.

 

 

 

 

 

그러면 스크립트 사용 방법부터 알아보도록 하겠습니다. 이번 시간의 스크립트는 모두 이벤트문으로 이루어져 있어서 마인크래프트 내에서 따로 설정해줘야하는 부분은 없습니다. 다만 스크립트 파일을 수정해서 금지아이템들을 설정할 수 있습니다.

on Skript start:
    set {금지아이템::*} to "tnt block", "tnt minecart", "lava bucket", "piston", "sticky piston", "redstone block" and "redstone torch"
on explode:
    cancel event
on drop:
    if {금지아이템::*} contains "%event-itemtype%":
        cancel event
        broadcast "%event-player%님이 %event-itemtype%을 버리려 했습니다"
on death of player:
    loop {금지아이템::*}:
        if "%drops%" contains "%loop-value%":
            clear drops
            broadcast "%loop-value%을 소지하고 죽은 %event-player%님의 아이템이 삭제되었습니다"
on inventory click:
    loop {금지아이템::*}:
        if "%event-itemtype%" contains loop-value:
            cancel event
            broadcast "%event-player%님이 %event-itemtype%을 인벤토리에서 클릭하셨습니다"
on rightclick:
    loop {금지아이템::*}:
        if "%event-player's tool%" contains loop-value:
            cancel event
            broadcast "%event-player%님이 %event-player's tool%을 사용하려 했습니다"
on craft:
    if {금지아이템::*} contains "%event-itemtype%":
        cancel event
        broadcast "%event-player%님이 %event-itemtype%을 제작하려 했습니다"

총 7개의 이벤트문들이 있는데, 하나하나 알아가보도록 하겠습니다.

 

 

1. on Skript start

이 이벤트문은 스크립트가 시작되었을 때, 즉 서버를 열거나 서버를 리로드 했을 시 스크립트 플러그인이 시작되었을 때, 작동하는 이벤트문입니다. 위 스크립트에서는 set {금지아이템::*} to ~ 를 통해서 금지아이템들을 설정해주었습니다. 금지아이템들을 수정하고 싶으시면 to 뒤의 텍스트들을 수정해주시면 됩니다. 다만 스크립트 상에서의 itemtype은 마인크래프트 상에서의 아이템이름과 조금 다릅니다. 예를 들어 마인크래프트에서는 tnt_minecart가 티엔티 광산수레의 이름이라면, 스크립트에서는 tnt minecart 라고 적어줘야 합니다.

 

2. on explode

이 이벤트문은 크리퍼, 위더, 티엔티 등 모든 종류의 폭발이 일어났을 때 작동하는 이벤트문입니다. 위 스크립트에서는 폭발이 일어났을 때 cancel event 로 폭발을 캔슬시켜 폭발방지 기능을 수행합니다.

 

 

3. on drop

이 이벤트문은 플레이어가 아이템을 버렸을 때 작동합니다. 서버의 테러범들을 생각보다 매우 교묘합니다. 상상하지도 못한 방법들로 테러를 시도하곤 하지요. 따라서 어디서 획득했는지 불분명한 금지아이템들을 소지하고 있을 수도 있습니다. 아무리 최대한 막으려고 시도해도요. 따라서 위 스크립트의 이 이벤트문은 만약 금지아이템을 획득했더라도, 그 아이템을 버리지 못하도록 하여 다른 플레이어들과 공유하지 못하도록 차단시켜주는 역할을 합니다. 플레이어가 버린 아이템의 이름을 가져와서 그 이름이 금지아이템의 목록에 포함되는지 비교하고, 만약 들어있다면 전체 채팅으로 다른 유저들도 알 수 있도록 일단은 만들어놓았습니다. 만약 다른 기능을 넣고싶으시다면 broadcast 구문 부분에 적어주시면 됩니다.

 

4. on death of player

이 이벤트문은 플레이어가 죽었을 때 작동합니다. 만약 플레이어가 아닌 다른 종류의 엔티티가 죽었을 때 작동하도록 만들고 싶으시다면 player 자리에 그 엔티티 종류의 이름을 넣어주시면 됩니다. 3번과 같은 이유로, 만약 테러범들이 어떻게 얻었는지는 모르겠지만 어떻게든 금지아이템을 손에 넣었을 때, 그 아이템을 버려서 다른 플레이어와 공유할 수 있기에 그것을 금지시켰습니다. 하지만 거기에서 한 단계 더 나아간 똑똑한 테러범들은, 아이템을 버려서 공유하지 않고, 죽으면 아이템이 흩뿌려지는것을 이용하여, 죽어서 금지아이템을 공유할 수도 있습니다. 따라서 위 스크립트에서 이 이벤트문은 만약 플레이어가 죽었을 때, 흩뿌려진 아이템들 중에서 금지아이템이 섞여있다면, 플레이어가 죽었을 시 흩뿌려지는 아이템들을 다 사라지게 하는 역할을 수행합니다. 3번과 마찬가지로 전체 채팅으로 그 사실을 알리는 기능도 넣어놓았습니다.

 

5. on inventory click

이 이벤트문은 플레이어가 인벤토리 슬롯을 클릭했을 시 작동합니다. 그 인벤토리가 깔때기이던, 상자이던, 플레이어의 인벤토리이던지에 상관 없이 말이죠. 3,4번의 구문들을 통해서 금지아이템의 공유들을 차단했습니다. 다만 아직 하나 더 방법이 남아있습니다. 상자, 셜커상자 등을 사용하여 아이템을 공유할 수도 있겠지요. 따라서 위 스크립트의 이 이벤트문은 인벤토리에서 슬롯을 클릭했을 때, 클릭된 슬롯의 아이템이 금지아이템 목록에 포함되어 있다면 차단하고, 그 사실을 전체 채팅으로 알리는 기능도 있습니다.

 

6. on rightclick

이 이벤트문은 플레이어가 우클릭을 했을 시에 작동하는 이벤트문입니다. 만약 플레이어가 어떻게 했는지는 모르겠지만 금지아이템을 손에 넣었다면, 그 아이템을 사용하도록 해서는 안됩니다. 만약 용암 양동이를 테러범이 손에 넣었다면 용암을 뿌리고 다니면서 테러를 할 것이 뻔하지요. 따라서 위 스크립트의 이 이벤트문은 만약 플레이어가 우클릭을 했을 때, 손에 들고있는 아이템이 금지아이템 목록에 포함되어 있다면 사용을 차단하고 그 사실을 전체 채팅으로 알려줍니다.

 

 

7. on craft

이 이벤트문은 플레이어가 조합을 했을 때 작동하는 이벤트문입니다. tnt와 같이 조합이 가능한 테러 아이템들을 제작하지 못하도록 해야하겠지요. 위 스크립트의 이 이벤트문은 플레이어가 조합을 할 시 조합하는 아이템이 금지아이템 목록에 포함이 되어있는지 확인해서, 만약 금지아이템이라면 조합을 못하도록 차단하고 그 사실을 전체 채팅으로 알려줍니다.

 

 

자 이렇게 해서 테러방지 스크립트에 대해서 알아보았습니다. 딱히 특별하게 처음 볼만한 구문들이 없을것으로 판단되지만, 혹시나 질문이 있으시다면 이 글의 댓글에 적어주시면 답변해드리도록 하겠습니다.

 

아래는 스크립트 파일들입니다.

 

주석 미포함

테러방지.sk
0.00MB

주석 포함

테러방지(주석 포함).sk
0.00MB

댓글