개인 자료란 (JE)

  서버 커뮤니티

Profile kr_wonse 대표칭호 없음
Profile

질문하기 스크립트

반복문으로 구문줄이기 질문

2020.09.28 조회 수 154 추천 수 0
이해도 1.12 
게임버전 (JE) 페이퍼 
스크립트 애드온 2.4-beta 

command /무기 [<text>] [<player>]:

    trigger:

        if player is op:

            if arg 1 is not set:

                send "{@접} 무기종류를 입력하세요"

            if arg 1 is "목검0강"

                Give 1 of wooden sword named "&6&l목검 &7+0" with lore "" and "   &c✗ &f레벨제한 : 0" and "   &c✗ &f등급 : &e&l⭐" and "" and "   &c✗ &f공격력 : 10" and "" and "   &c✗ &f초라해보이지만 꽤나 단단하고 아파보인다    " and "" with no NBT to player

            if arg 1 is "목검1강":   

                Give 1 of wooden sword named "&6&l목검 &7+1" with lore "" and "   &c✗ &f레벨제한 : 0" and "   &c✗ &f등급 : &e&l⭐" and "" and "   &c✗ &f공격력 : 12" and "" and "   &c✗ &f초라해보이지만 꽤나 단단하고 아파보인다    " and "" with no NBT to player

            if arg 1 is "목검2강":

                Give 1 of wooden sword named "&6&l목검 &7+2" with lore "" and "   &c✗ &f레벨제한 : 0" and "   &c✗ &f등급 : &e&l⭐" and "" and "   &c✗ &f공격력 : 14" and "" and "   &c✗ &f초라해보이지만 꽤나 단단하고 아파보인다    " and "" with no NBT to player

            if arg 1 is "목검3강":

                Give 1 of wooden sword named "&6&l목검 &7+3" with lore "" and "   &c✗ &f레벨제한 : 0" and "   &c✗ &f등급 : &e&l⭐" and "" and "   &c✗ &f공격력 : 16" and "" and "   &c✗ &f초라해보이지만 꽤나 단단하고 아파보인다    " and "" with no NBT to player

            if arg 1 is "목검4강":

                Give 1 of wooden sword named "&6&l목검 &7+4" with lore "" and "   &c✗ &f레벨제한 : 0" and "   &c✗ &f등급 : &e&l⭐" and "" and "   &c✗ &f공격력 : 18" and "" and "   &c✗ &f초라해보이지만 꽤나 단단하고 아파보인다    " and "" with no NBT to player

        else:

            send "{@접} 당신은 해당 명령어에 접근할 권한이 없습니다."


누가봐도 loop반복문으로 줄일수있을꺼같은데 막상 적을려고하면 감도안잡히네요 도와주세요잉

6개의 댓글

스크립터브혼
2020.09.29

해당 기능은 반복문이 아니라 수식으로 간추릴수 있습니다.

강화에 영향을 받는것은 강화수치와 공격력 두가지 이고,
강화수치는 강화당 1씩 증가, 공격력은 2씩 증가입니다.

강화수치를 수식으로 표현하면 ( y = x )이입니다.

공격력은 0강일때 10부터 4강일때 18까지 1강당 2씩 증가하는 "등차수열"을 이룹니다.
이것을 방정식으로 표현하면 ( y = 10 + 2x )가 되겠죠.

이 두가지 수식을 넣으주면 됩니다.


command /무기 [<integer>] [<player>]:
    trigger:
        player is op
        if arg 1 is not set:
            send "{@접} 무기종류를 입력하세요"
            stop

        set {_level} = arg 1
        set {_damage} = 10 + 2 * {_level}

        set {_name} = "&6&l목검 &7+%{_level}%"

        set {_lore::1} = ""
        set {_lore::2} = "   &c✗ &f레벨제한 : 0"
        set {_lore::3} = "   &c✗ &f등급 : &e&l⭐"
        set {_lore::4} = ""
        set {_lore::5} = "   &c✗ &f공격력 : 10"
        set {_lore::6} = ""
        set {_lore::7} = "   &c✗ &f초라해보이지만 꽤나 단단하고 아파보인다    "
        set {_lore::8} = ""

        set {_item} to wooden sword named {_name}
        set lore of {_item} to {_lore::*}

        Give {_item} to player

코드 작성 팁을 드리자면,

컨디션(조건)은 if가 없는 것이 기본형입니다. Skript는 if ~ else를 조건의 의미보다는 분기의 의미로 사용됩니다.
분기가 필요없는 상황에서는 컨디션 만 작성하시는것이 가독성이 좋습니다 (player is op 부분)

그리고 예외 상황을 제외하기위해서 if ~ else를 사용하는 것보다 예외상황에서 stop을 걸어주는 것이 가독성이 좋습니다.
분기가 꼭 필요한 것이 아니라면 지양하는것이 좋습니다.

그리고 아이템을 세팅하실때 with lore는 지양해주세요. 버그가 많은 코드입니다.
아이템같은 어떤 오브젝트들을 한번에 세팅하는 코드는 버전에 따라 오류가 있기도하고 없기도 합니다.
그 이유는 이러한 코드들이 Bukkit API에서 제공하는 것이아니라 Skript 제작진이 임의로 만들어 넣은 기능이라 업데이트하면서 오류가 생겼다, 고쳐졌다 하는 것입니다.
lore of %item% 익스프레션으로 세팅하는것이 디버깅하는 데에도 유리합니다.

kr_wonse
2020.09.29
@스크립터브혼

와.. 진짜 감사합니다 조건문만 생각했는데 수식을 이용한다니 뭔가 벽이 깨진느낌이네요 감사합니다 RPG서버를 개발하면서 저러한 아이템 수십개가 만들어질텐데 이렇게 갈끔하게 정리해주시니 감사할따름입니다

kr_wonse
2020.09.30
@스크립터브혼

on damage:

if {레벨제한상태} is true:

set {_%attacker%.레벨제한설명::*} to uncolored lore of attacker tool

loop {_%attacker%.레벨제한설명::*}:

if {_%loop-attacker%.레벨제한설명::%loop-index%} contains "레벨제한":

set {_무기레벨제한} to {_%loop-attacker%.레벨제한설명::%loop-index%}

replace all "✗" and "레벨제한" and ":" and " " with "" in {_무기레벨제한}

set {_레벨제한} to {_무기레벨제한} parsed as integer

if attacker level < {_레벨제한}:

cancel event

send "{@접두사} &e&l%{_레벨제한}% &f레벨 이상부터 사용가능한 무기입니다" to attacker

 

혹시 이것도 알수있을까요 로어인식해서 레벨제한하는건데 3번째 줄부터 오류가 나오네요..

스크립터브혼
2020.09.30
@kr_wonse

set {_%attacker%.레벨제한설명::*} to uncolored lore of attacker tool 에서 오류가 있다는건가요?
tool of attacker 인데 of가 빠진게 아닐까요?
attacker's tool

kr_wonse
2020.09.30
@스크립터브혼
on damage:
    if {레벨제한상태} is true:
        set {_%attacker%.레벨제한설명::*} to uncolored lore of attacker's tool
        loop {_%attacker%.레벨제한설명::*}:
    if {_%attacker%.레벨제한설명::%loop-index%} contains "레벨제한":
        set {_무기레벨제한} to {_%attacker%.레벨제한설명::%loop-index%}
        replace all "✗" and "레벨제한" and ":" and " " with "" in {_무기레벨제한}
        set {_레벨제한} to {_무기레벨제한} parsed as integer
    if attacker's level < {_레벨제한}:
        cancel event
        send "{@접두사} &e&l%{_레벨제한}% &f레벨 이상부터 사용가능한 아이템입니다" to attacker

 

여러번 시도로 이렇게 구문을 적으니 스크립트 리로드한후 오류는 안나오는데 레벨이 10인 상태로 레벨제한이 0인 무기를 들고 때려도 레벨제한이 걸리네요.. if attacker's level < {_레벨제한}: 에서 문제가있다는건데 아무리 천천히 읽어봐도 이유를 모르겠네요

스크립터브혼
2020.09.30
@kr_wonse

임의로 들여쓰기 해놨습니다. 작성하신 구문에 맞게 수정해주세요.

코드작성시 에디터의 본문 탭에보시면 코드가 있습니다. 또는 html 태그의 pre태그 사용해주세요.