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

스크립트 기초 활용 14편(총기)

by 스터디립트 2023. 1. 9.

이번 시간에는 Skript를 이용하여 간단한 총 시스템을 만들어 보도록 하겠습니다. 이번 시간의 스크립트에는 어떤 애드온도 필요하지 않습니다.

 

1. 총 만들기

총 시스템을 만드려면 우선 총부터 만들어야겠죠? 명령어로 총 아이템을 지급하도록 만들어 봅시다. 아래는 그 코드입니다.

command /gun <text> <number> <number> [<integer>]:
    executable by: players
    usage: /gun 이름 피해량 탄속 (customModelData)
    trigger:
        if arg-3 <= 0:
            send "탄속은 양의 실수로 입력해 주세요"
            exit
        set {_gun} to 1 diamond hoe named colorCodeTranslate(arg-1) with lore "", "&7피해량 : %arg-2%", "&7탄속 : %arg-3%" and ""
        
        if arg-4 < 0:
            send "customModelData의 값은 0 이상 99999999 이하의 정수만 가능합니다" to player
            exit
        if arg-4 > 99999999:
            send "customModelData의 값은 0 이상 99999999 이하의 정수만 가능합니다" to player
            exit
        if arg-4 is set:
            set custom model data of {_gun} to arg-4
        give {_gun} to player
   
 
 function colorCodeTranslate(t : text) :: text:
    replace all "&&" with "%%%%%%%%%%%%" in {_t}
    replace all "&" with "§" in {_t}
    replace all "%%%%%%%%%%%%" with "&" in {_t}
    return {_t}

이렇게 커스텀 명령어를 만들어서. 총의 이름, 피해량 그리고 탄속은 필수로 입력하게 해 주었고, customModelData의 값은 선택으로 입력 가능하도록 해 주었습니다. customModelData에 대해 간단하게 설명드리자면, 아이템에 고유한 태그 비슷한 것을 부여해서, 같은 종류의 아이템인데, 커스텀모델데이터 값에 따라 다른 리소스팩을 적용시킨다거나 하는 형식으로 사용할 수 있는 기능입니다. customModelData의 값을 지정하지 않는다면 기본값은 0이 됩니다.

 

colorCodeTranslate라는 이름의 함수가 하나 있는데, 반드시 필요한 것은 아닌 아이템 이름에 색깔코드를 사용 가능하도록 하기 위해서, 사용한 함수입니다. &를 이용하여 색깔코드를 사용할 수 있고, '&' 문자 자체를 입력하고 싶다면 &&를 입력하시면 됩니다.

 

2. 총알 발사하기

이제 총을 만들었으니, 총을 우클릭했을 시에 총알이 발사되도록 만들어주어야하겠죠? 아래는 그 코드입니다.

on right click:
    if event-item is not diamond hoe:
        exit
    set {_lores::*} to uncolored lore of event-item
    loop {_lores::*}:
        set {_split::*} to loop-value split at " : "
        set {_lores::%loop-index%} to {_split::2}
    set {_damage} to {_lores::2} parsed as number
    set {_bulletSpeed} to {_lores::3} parsed as number
    make event-player shoot a snowball with speed {_bulletspeed}
    set {_bullet} to last shot entity
    set metadata value "damage" of {_bullet} to {_damage}
    set metadata value "bullet" of {_bullet} to true

다이아몬드 호미를 들고 우클릭을 했을 시, 아이템 설명에 있는 탄속 및 피해량 값을 가져와서, 탄속 값 만큼의 속도로 눈덩이를 던지게 합니다.

https://docs.skunity.com/syntax/search/id:5029

 

skUnity

The central place of everything Skript

skunity.com

그리고 피해량 값은 메타데이터를 이용하여 저장해 줍니다. 메타데이터는 서버가 재시작될 때 삭제되는 변수로, 오래 저장해야 하는 값이 아닌, 엔티티나 블록과 관련된 일시적인 값을 저장해야할 때 사용할 수 있는 변수라 생각하시면 됩니다.

https://docs.skunity.com/syntax/search/id:5192

 

skUnity

The central place of everything Skript

skunity.com

 

이 때, 메타데이터 값을 지정해 줄 시에 {_bullet}에 last shot entity를 이용하여 발사한 눈덩이를 저장해 주었습니다.

https://docs.skunity.com/syntax/search/id:5171

 

skUnity

The central place of everything Skript

skunity.com

3. 총알이 맞았을 시 피해 주기

총알을 발사시켰으니 이제 그 총알이 상대에게 맞았을 시 피해를 주도록 코드를 짜 봅시다. 아래는 그 코드입니다.

on projectile hit:
    if event-projectile does not have metadata value "bullet":
        exit
    if event-projectile's metadata value "bullet" is not true:
        exit
    set {_damage} to event-projectile's metadata value "damage"
    damage victim by {_damage}

https://docs.skunity.com/syntax/search/id:4863

 

skUnity

The central place of everything Skript

skunity.com

위 링크의 이벤트문을 이용하여 눈덩이가 맞았을 시에 이벤트문이 발동되도록 해 주었습니다. 한 가지 유의점은 위 이벤트문은 엔티티에 맞았을 때 뿐만 아니라 블록에 맞았을 시에도 발동됩니다.

 

그 후 메타데이터 값을 이용하여 총알인지 아닌지 판단한 후, 총알이라면 피해량 값을 다시 메타데이터 값에서 가져와서 그 값 만큼의 피해를 맞은 엔티티에게 부여합니다. 

 

 

 

이렇게 이번 시간에는 애드온 없이 Skript만의 기능을 이용하여 약간 부실하긴 하지만 총 시스템을 만들어 보았습니다. 질문이 있으시다면 이 글의 댓글에 적어주시면 답변해드리도록 하겠습니다.

 

 

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

주석미포함

gun.sk
0.00MB

댓글