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

스크립트 기초 활용 6편(장비)

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

여러 마인크래프트 rpg 서버들을 가보면, 다양한 장비 시스템들을 가지고 있습니다. 장비를 착용할 시 최대 체력이 늘어나거나, 버프를 주기도 하고, 공격력과 방어력 등의 시스템을 가지고 있기도 합니다. 착용했을 시에 포션 버프 또는 디버프를 주는 시스템은 다음에 기회가 된다면 만들어보도록 하고, 이번 시간에 소개할 장비 스크립트는, 공격력, 방어력, 체력 이 3가지의 버프 또는 너프를 주는 장비시스템입니다. 

 

 

 

사용법은 간단합니다.

/장비 [아이템] [공격력] [방어력] [체력] (수량) (이름)
ex1) /장비 diamond sword 4 1 2
ex2) /장비 leather chestplate 10 -5 -5 3 &c도박의 갑옷

그러면 이제 소스코드를 보며 구문들을 분석해보도록 하겠습니다.

 

command /장비 <item type> <integer> <integer> <integer> [<integer>] [<text>]:
    permission: *
    permission message: &c당신은 이 명령어를 사용할 권한이 없습니다
    usage: /장비 [아이템] [공격력] [방어력] [체력] (수량) (아이템 이름)
    executable by: player
    trigger:
        if arg 5 is not set:
            if arg 6 is not set:
                give 1 of arg 1 with lore "" and "&7공격력 - %arg 2%" and "&7방어력 - %arg 3%" and "&7체력 - %arg 4%" to player
            else:
                set {_name} to arg 6
                replace all "&" in {_name} with "§"
                give 1 of arg 1 named {_name} with lore "" and "&7공격력 - %arg 2%" and "&7방어력 - %arg 3%" and "&7체력 - %arg 4%" to player
        else:
            if arg 6 is not set:
                give arg 5 of arg 1 with lore "" and "&7공격력 - %arg 2%" and "&7방어력 - %arg 3%" and "&7체력 - %arg 4%" to player
            else:
                set {_name} to arg 6
                replace all "&" in {_name} with "§"
                give arg 5 of arg 1 named {_name} with lore "" and "&7공격력 - %arg 2%" and "&7방어력 - %arg 3%" and "&7체력 - %arg 4%" to player

every 10 ticks:
    loop all players:
        if loop-player's helmet is not air:
            set {_lores::*} to uncolored lore of loop-player's helmet
            loop {_lores::*}:
                if {_lores::%loop-index%} contains "체력":
                    set {_h::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::helmet::health} to {_h::2} parsed as number
                if {_lores::%loop-index%} contains "방어력":
                    set {_d::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::helmet::defense} to {_d::2} parsed as number
                if {_lores::%loop-index%} contains "공격력":
                    set {_a::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::helmet::attack} to {_a::2} parsed as number
        else:
            delete {%uuid of loop-player%::helmet::*}

        if loop-player's chestplate is not air:
            set {_lores::*} to uncolored lore of loop-player's chestplate
            loop {_lores::*}:
                if {_lores::%loop-index%} contains "체력":
                    set {_h::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::chestplate::health} to {_h::2} parsed as number
                if {_lores::%loop-index%} contains "방어력":
                    set {_d::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::chestplate::defense} to {_d::2} parsed as number
                if {_lores::%loop-index%} contains "공격력":
                    set {_a::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::chestplate::attack} to {_a::2} parsed as number
        else:
            delete {%uuid of loop-player%::chestplate::*}

        if loop-player's leggings are not air:
            set {_lores::*} to uncolored lore of loop-player's leggings
            loop {_lores::*}:
                if {_lores::%loop-index%} contains "체력":
                    set {_h::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::leggings::health} to {_h::2} parsed as number
                if {_lores::%loop-index%} contains "방어력":
                    set {_d::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::leggings::defense} to {_d::2} parsed as number
                if {_lores::%loop-index%} contains "공격력":
                    set {_a::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::leggings::attack} to {_a::2} parsed as number
        else:
            delete {%uuid of loop-player%::leggings::*}

        if loop-player's boots are not air:
            set {_lores::*} to uncolored lore of loop-player's boots
            loop {_lores::*}:
                if {_lores::%loop-index%} contains "체력":
                    set {_h::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::boots::health} to {_h::2} parsed as number
                if {_lores::%loop-index%} contains "방어력":
                    set {_d::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::boots::defense} to {_d::2} parsed as number
                if {_lores::%loop-index%} contains "공격력":
                    set {_a::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::boots::attack} to {_a::2} parsed as number
        else:
            delete {%uuid of loop-player%::boots::*}
        
        if loop-player's tool are not air:
            set {_lores::*} to uncolored lore of loop-player's tool
            loop {_lores::*}:
                if {_lores::%loop-index%} contains "체력":
                    set {_h::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::tool::health} to {_h::2} parsed as number
                if {_lores::%loop-index%} contains "방어력":
                    set {_d::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::tool::defense} to {_d::2} parsed as number
                if {_lores::%loop-index%} contains "공격력":
                    set {_a::*} to {_lores::%loop-index%} split at " - "
                    set {%uuid of loop-player%::tool::attack} to {_a::2} parsed as number
        else:
            delete {%uuid of loop-player%::tool::*}
        set {%uuid of loop-player%.health} to {%uuid of loop-player%::helmet::health} + {%uuid of loop-player%::chestplate::health} + {%uuid of loop-player%::leggings::health} + {%uuid of loop-player%::boots::health} + {%uuid of loop-player%::tool::health}
        set {%uuid of loop-player%.defense} to {%uuid of loop-player%::helmet::defense} + {%uuid of loop-player%::chestplate::defense} + {%uuid of loop-player%::leggings::defense} + {%uuid of loop-player%::boots::defense} + {%uuid of loop-player%::tool::defense}
        set {%uuid of loop-player%.attack} to {%uuid of loop-player%::helmet::attack} + {%uuid of loop-player%::chestplate::attack} + {%uuid of loop-player%::leggings::attack} + {%uuid of loop-player%::boots::attack} + {%uuid of loop-player%::tool::attack}
        set loop-player's max health to {%uuid of loop-player%.health}/2+10

on damage:
    if attacker is player:
        message "초기 데미지 : %damage%" to attacker
        set damage to damage + {%uuid of attacker%.attack}/2
        message "버프 후 데미지 : %damage%" to attacker
    if victim is player:
        send "초기 데미지 : %damage%" to victim
        set damage to damage - {%uuid of victim%.defense}/2
        send "버프 후 데미지 : %damage%" to victim

 

이번 스크립트의 구문들은 복잡해 보이지만 사실 분석해보면 비슷한 구문들이 반복되어서 복잡해 보이는 것으로, 겹치는 부분들을 제외한다면 아주 적은 양의 구문들입니다. 지금까지의 커스텀 명령어들을 보면, arguments들이 다 [<>]에 둘러쌓여있었습니다. 하지만 이번 스크립트는 무언가 조금 다릅니다. 대괄호가 빠졌습니다. 의외로 모르고 계신 분들이 많은 사실인데, arguments들은 기본적으로 <>을 사용합니다. 다만 []을 덮어씌울 시, 그 argument는 선택사항이 됩니다. 대부분 스크립트를 만들 때 예상치 못한 변수를 차단하기 위해서 굳이 필요한 것이 아니라면 [<>]을 사용합니다. 위 스크립트에서는 [<>]을 사용할 시 제대로 작동하지 않기에, <>을 사용했습니다.

 

 

그리고 이전의 스크립트들에서 보지 못했던 것들이 trigger: 전에 몇개 보입니다. permission은 설정한 권한이 있을 시 사용이 가능합니다. 위 스크립트에서는 *을 사용해서 모든 권한이 있는 오피 또는 콘솔만 사용이 가능하도록 했는데, 자신이 원하는 대로 펄미션을 만들 수도 있습니다. 예를 들어서 jangbi라는 권한이 있을 시 사용이 가능하도록 한 후, 럭펌과 같은 플러그인으로 권한을 설정해주면 원하는 대로 권한을 허용할 수 있습니다.

 

permission messasge는 만약 권한이 없는데 명령어를 사용하려고 할 시에 출력되는 메시지입니다. 한가지 유의하셔야 할 점은, 메시지는 큰따옴표를 사용하지 않습니다. &을 통해서 색깔코드도 사용할 수 있습니다.

 

 

usage는 만약 플레이어가 명령어를 잘못 사용했을 시에 출력되는 도움말 메시지입니다. 기존에는 if문을 통해서 일일이 도움말 메시지들을 출력했다면, usage를 사용하여 간편하게 출력할 수 있습니다.

 

executable by는 설정한 대상만 이 명령어를 사용할 수 있도록 설정합니다. 위 스크립트의 경우에 /장비 명령어는 아이템을 명령어를 사용한 플레이어에게 지급하는 것인데, 콘솔은 플레이어가 아니기에 아이템을 가질 수 없어 오류가 날 수도 있습니다. 따라서 플레이어만 사용이 가능하도록 설정해놓은 것입니다.

 

 

기본적인 원리는 아이템의 설명에 체력, 공격력, 방어력 값을 저장해놓은 뒤, 매 0.5초마다 모든 플레이어를 루프해서 투구,흉갑,레깅스,부츠,무기 이렇게 5가지 아이템의 공격력, 방어력, 체력 값을 아이템의 설명으로부터 가져온 뒤에 그 값을 모두 더합니다. 그 뒤에 플레이어의 최대 체력을 10 + 체력 값/2 으로 설정합니다. 보통 플러그인 등에서는 한 칸의 하트를 2체력으로 계산하지만, 스크립트에서는 1체력으로 계산합니다. 하지만 저는 한칸에 1체력으로 계산하고 싶으니, 체력 값 에서 2를 나눠준 뒤, 기존의 최대 체력인 10에 더해줍니다. 공격력과 방어력은 각각 데미지를 받았을 시 기존 피해량 + 공격력/2 만큼 데미지를 주고, 기존 피해량 - 방어력/2 만큼 데미지를 입습니다. 위 스크립트에서는 변동된 피해량을 테스트하기 쉽도록 하기 위해서 플레이어가 공격을 하거나 피해를 입었을 시에 기존 피해량과 버프 후 피해량이 플레이어에게 뜨도록 설정해놓았습니다.

 

 

다음 시간에는 플레이어의 접속 시간을 확인할 수 있는 스크립트에 대해서 배워보도록 하겠습니다. 질문이 있으시다면 이 글의 댓글에 적어주시면 답변해드리도록 하겠습니다.

 

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

주석 미포함

장비.sk
0.01MB

주석 포함

장비(주석 포함).sk
0.01MB

댓글