개인 자료란 (JE)

  서버 커뮤니티

Profile wysohn 대표칭호 없음
Profile

강좌 자바 에디션(JE) 플러그인 개발

[트리거 리엑터] 3. 하이픽셀 같은 로비 만들기 (완)

2019.12.30 조회 수 803 추천 수 3
분야 트리거 
장르 서버 관리자 툴, 개발자 툴 
게임버전 모든버전 
API 버킷, 스피곳, 페이퍼, 스펀지 

버킷 버전: *

트리거 버전: 2.2.1 에서 테스트

 

심화적인 내용이므로 위키를 충분히 숙지 하셔야 합니다. (https://github.com/wysohn/TriggerReactor/wiki/Home_kr)

 

요구 지식: 인벤토리 트리거, 네임드 트리거, 조건문, 변수, 등.

 

1. 실시간 애니메이션


너무시간이 오래걸려 죄송합니다. 일이 좀 바빠서 이제야 써보게 되었네요. 이전 강좌에 이어서 이번 강좌에서는 이전에 추가한 다이아몬드 검에 애니메이션 효과를 추가 해 보려고 합니다. 이거야말로 타이틀에서 말하던 것 처럼 하이픽셀같은 메뉴를 만드는 핵심 입니다.

 

1.1. 아이템 조작 코드


하이픽셀처럼 아이템에 애니메이션 효과를 넣으려면 어떻게 해야할까요? 단순하게도 그냥 아이템 로어를 실시간으로 변경 해 주면 됩니다. 1초 간격으로 로어나 아이템이름을 계속 바꿔준다면 유저들 입장에서는 애니메이션 처럼 보이겠죠?

 

아래는 이전 강좌에서 작성한 코드입니다


IF trigger == "open"
    inventory.setItem(0, item("DIAMOND_SWORD", 1)) 
ENDIF 

 

IF trigger == "click"
    IF slot == 10
        #MESSAGE "11번 째 슬롯을 클릭 함"
    ENDIF
ENDIF


 

위와 같은 코드로는 0번째 칸에 다이아몬드 검을 넣고 10번째 슬롯을 클릭하면 메시지가 나오게 했을 뿐 입니다.

 

이제 여기서 WHILE문을 사용해서 1초 간격으로 로어나 아이템이름을 계속 바꿔 주려고 합니다.

 


IF trigger == "open"
    inventory.setItem(0, item("DIAMOND_SWORD", 1)) 


    WHILE true

        //여기에 코드를 추가

    ENDWHILE
ENDIF 

 

IF trigger == "click"
    IF slot == 10
        #MESSAGE "11번 째 슬롯을 클릭 함"
    ENDIF
ENDIF


 

보이시나요? 무한 반복되는 WHILE문을 다이아몬드 검을 넣은 직후에 작동하도록 했습니다. 그런데 아마 의문점이 드실겁니다. WHILE문의 wiki를 보시면 무한반복을 쓰지 말라고 되어있는데 어떻게 여기서는 쓸 수 있는건가요?

 

그 이유는 인벤토리 트리거의 특성에 있습니다. 인벤토리 트리거는 wiki에 나와있는 것 처럼 "open" 혹은 "click" 으로 시작된 모든 작업이 인벤토리를 유저가 닫는 순간 모두 종료됩니다. 이는 무한반복하는 WHILE문도 예외가 아니기 때문에 이를 애니메이션에 응용 할 수 있는 것 입니다.

 

단순히 반복문만 넣어서는 애니메이션 효과가 생기는게 아니니 코드를 더 추가하겠습니다.


IF trigger == "open"
    item = item("DIAMOND_SWORD", 1)
    inventory.setItem(0, item) 
    blink = false

 

    WHILE true
        setItemTitle(item, "PVP 서버로 이동") 
        addLore(item, placeholder.parse(player, "&7상태&8: &6%pinger_isonline_127.0.0.1:25500%")) 
        addLore(item, placeholder.parse(player, "&7접속자 수&8: &6%pinger_players_127.0.0.1:25500%")) 
        addLore(item, placeholder.parse(player, "&7버전&8: &61.8.8~1.13.2")) 
        addLore(item, "") 

        IF blink 
            addLore(item, color("&a➤ 클릭 시 이동")) 
        ELSE 
            addLore(item, color("&8➤ 클릭 시 이동")) 
        ENDIF 
        
        inventory.setItem(targetSlot, item) 
        blink = !blink

 

        #WAIT 1
    ENDWHILE
ENDIF 

 

IF trigger == "click"
    IF slot == 10
        #MESSAGE "11번 째 슬롯을 클릭 함"
    ENDIF

    IF slot == 0
        #MESSAGE "PVP 서버로 이동합니다."
        #SERVER "pvp"
    ENDIF
ENDIF


갑자기 많은 코드가 추가되어서 당황스러울 수 있는데 별로 복잡하지 않습니다.

 

한줄한줄 알아봅시다.

 


IF trigger == "open"
    item = item("DIAMOND_SWORD", 1)
    inventory.setItem(0, item) 
    blink = false

 

    WHILE true
        setItemTitle(item, "PVP 서버로 이동") 
        addLore(item, placeholder.parse(player, "&7상태&8: &6%pinger_isonline_127.0.0.1:25500%")) 
        addLore(item, placeholder.parse(player, "&7접속자 수&8: &6%pinger_players_127.0.0.1:25500%")) 
        addLore(item, placeholder.parse(player, "&7버전&8: &61.8.8~1.13.2")) 
        addLore(item, "") 

        IF blink 
            addLore(item, color("&a➤ 클릭 시 이동")) 
        ELSE 
            addLore(item, color("&8➤ 클릭 시 이동")) 
        ENDIF 
        
        inventory.setItem(targetSlot, item) 
        blink = !blink
    ENDWHILE
ENDIF 

 

IF trigger == "click"
    IF slot == 10
        #MESSAGE "11번 째 슬롯을 클릭 함"
    ENDIF

    IF slot == 0
        #MESSAGE "PVP 서버로 이동합니다."
        #SERVER "pvp"
    ENDIF
ENDIF


 

굵게 표시된 부분이 보이시나요? blink 라는 변수를 false로 설정 해 주었습니다.

 

false 가 뭔지 모른다면 위키의 변수 항목을 참고 해 주세요.

 

blink = !blink 의 경우 생소 할 수 있는데요, = 는 아시다시피 변수에 넣으라는 것이고 ! 는 불리언 값을 반대로 바꿔주라는 것 입니다.

즉 위의 코드는 blink 가 true 라면 false로 바꾸고 false라면 true 로 바꾸라는 뜻 인 것이지요.

 

이제 blink 가 true/false 로 값이 계속 바뀐다는 것을 기억 하고 계세요.

 


IF trigger == "open"

    item = item("DIAMOND_SWORD", 1)
    inventory.setItem(0, item) 
    blink = false

    WHILE true
        setItemTitle(item, "PVP 서버로 이동") 
        addLore(item, placeholder.parse(player, "&7상태&8: &6%pinger_isonline_127.0.0.1:25500%")) 
        addLore(item, placeholder.parse(player, "&7접속자 수&8: &6%pinger_players_127.0.0.1:25500%")) 
        addLore(item, placeholder.parse(player, "&7버전&8: &61.8.8~1.13.2")) 
         addLore(item, "") 

        IF blink 
            addLore(item, color("&a➤ 클릭 시 이동")) 
        ELSE 
            addLore(item, color("&8➤ 클릭 시 이동")) 
        ENDIF 
        
      
  inventory.setItem(targetSlot, item) 
        blink = !blink

        #WAIT 1
    ENDWHILE
ENDIF 

IF trigger == "click"
    IF slot == 10
        #MESSAGE "11번 째 슬롯을 클릭 함"
    ENDIF

    IF slot == 0
        #MESSAGE "PVP 서버로 이동합니다."
        #SERVER "pvp"
    ENDIF
ENDIF


애니메이션의 핵심인 부분이 굵게 표시되어 있습니다.

 

위의 코드 전문은 제가 로비서버에서 사용하던 코드로 말그대로 번지코드에 등록된 서버의 정보를 확인 하는 코드 입니다.

 

여기서 세가지정도 핵심적인 메소드가 보이는데 바로 setItemTitle(), addLore(), 그리고 inventory.setItem() 입니다.

 


setItemTitle(아이템, 새로운 아이템 이름)

말그대로 아이템의 이름을 바꿔주는 부분 입니다.

 

addLore(아이템, 로어값)

말그대로 아이템에 로어를 추가 합니다. 위에서부터 한줄한줄 추가됩니다.


 

별로 어렵지 않죠? 로어값에 들어간 placeholder.parse(player, "&7상태&8: &6%pinger_isonline_127.0.0.1:25500%") 단순히 PlaceholderAPI 플러그인과 연동해서 해당 서버(127.0.0.1:25500) 의 정보를 가져오는 부분입니다. 다들 /papi 명령어는 사용 해 보셨을꺼라 생각하니 이 부분은 생략 하겠습니다.

 

그리고! 가장 중요한 부분입니다.


        IF blink 
            addLore(item, color("&a➤ 클릭 시 이동")) 
        ELSE 
            addLore(item, color("&8➤ 클릭 시 이동")) 
         ENDIF 


아까 blink 의 값이 true 와 false로 계속 바뀐다는것을 기억 하고 계시라고 했지요? 이 부분은 addLore로 "&a➤ 클릭 시 이동" 혹은 "&8➤ 클릭 시 이동" 을 아이템 맨 아래쪽 줄에 추가 하라는 것 인데 아시다시피 이 blink의 값이 계속 바뀌기 때문에 컬러코드가 &a 와 &8을 번갈아가면서 사용하게 될 것 입니다. 유저들이 보기에는 아이템의 로어가 반짝반짝 하는 것 처럼 보이겠지요?

 


IF trigger == "open"
    item = item("DIAMOND_SWORD", 1)
    inventory.setItem(0, item) 
    blink = false

    WHILE true
        setItemTitle(item, "PVP 서버로 이동") 
        addLore(item, placeholder.parse(player, "&7상태&8: &6%pinger_isonline_127.0.0.1:25500%")) 
        addLore(item, placeholder.parse(player, "&7접속자 수&8: &6%pinger_players_127.0.0.1:25500%")) 
        addLore(item, placeholder.parse(player, "&7버전&8: &61.8.8~1.13.2")) 
        addLore(item, "") 

        IF blink 
            addLore(item, color("&a➤ 클릭 시 이동")) 
        ELSE 
            addLore(item, color("&8➤ 클릭 시 이동")) 
        ENDIF 
        
        inventory.setItem(targetSlot, item) 
        blink = !blink

        #WAIT 1
    ENDWHILE
ENDIF 

IF trigger == "click"
    IF slot == 10
        #MESSAGE "11번 째 슬롯을 클릭 함"
    ENDIF

    IF slot == 0
        #MESSAGE "PVP 서버로 이동합니다."
        #SERVER "pvp"
    ENDIF
ENDIF


 

그리고 마지막의 #WAIT 1 역시 중요한 부분 입니다. WHILE 문의 경우 아무런 딜레이가 없기때문에 코드가 초고속으로 계속 반복되게 됩니다. 애니메이션을 넣더라도 애니메이션이 너무 빠르면 유저들이 보기에는 아무런 효과가 없는 것 처럼 보입니다. 그러니 한번 실행후 1초 대기, 한번 실행후 1초 대기, ... 이런식으로 반복문 사이사이마다 딜레이를 주는것이 중요합니다. 약 1초정도의 딜레이를 주는것이 가장 안정적 입니다.

 

ezgif.com-gif-makerace1ec381d191adf.gif

 

위는 조금 다른버전의 예시 입니다. (PlaceholderAPI를 설치 하지 않아서 상태와 접속자수는 제대로 나오지 않습니다)

 


그럼 여기까지 하겠습니다. 눈치 채셨는지는 모르겠지만 적절히 응용만 하면 아이템의 인챈트를 실시간으로 바꾸거나 아이템 위치를 실시간으로 바꾸거나 아주 여러가지 방법이 있습니다만 여러분의 상상에 맡기도록 하겠습니다.




6개의 댓글

아이스틴
2019.12.30

오늘도 역시 어렵군요!

흔호
2020.01.04

좋은정보 감사합니다!

DDang_
2020.01.12

좋은 글은 추천입니다

mchang
2020.05.20

좋은 정보 감사합니다

마크러버
2020.05.20

좋은 정보 감사합니다

뉴스 및 창작물
/files/thumbnails/246/933/003/262x150.crop.jpg?20241204080049

업데이트

[마인크래프트 1.21.4 업데이트]

제작대

2024-12-04

0

/files/thumbnails/477/930/003/262x150.crop.jpg?20241201030912

레드스톤

뉴진스 - Super Shy | 마크 노트블럭 커버

노트블럭전문가

2024-12-01

0

/files/thumbnails/483/916/003/262x150.crop.jpg?20241127115329

레드스톤

[노트블럭 커버] 뉴진스 - ETA 3

노트블럭전문가

2024-11-27

1

/files/thumbnails/150/925/003/262x150.crop.jpg?20241123005717

건축

응답하라 1988 ? 2

팀뉴일리시

2024-11-23

5

/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 6

KHC

2024-10-25

2

/files/thumbnails/578/899/003/262x150.crop.jpg?20241010142350

건축

경주 월정교 1

KHC

2024-10-10

2

/files/thumbnails/219/899/003/262x150.crop.jpg?20241009200950

건축

송전탑+도시 2

dbasd12

2024-10-09

2