개인 자료란 (JE)

  서버 커뮤니티

Profile Dr_Romantic 대표칭호 없음

Dr_Romantic 47b10a506ea44415a8bd3b4fb28197d6

Profile

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

[Trigger Reactor] 제 1강 - 플러그인의 전체적 구조

2019.11.11 조회 수 2574 추천 수 1
분야 트리거 
장르 서버 관리자 툴, 개발자 툴, 그 외에 장르 
게임버전 1.5.x, 1.6.x, 1.7.x, 1.8.x, 1.9.x, 1.10.x, 1.11.x, 1.12.x, 1.13.x, 1.14.x, 1.15.x, 1.16.x, 1.17.x 
API 버킷, 스피곳, 페이퍼, 스펀지 
자료글 https://www.curseforge.com/minecraft/buk...gerreactor 

logo.png

Trigger Reactor / 트리거 리엑터


 트리거 리엑터의 구성

 트리거 리엑터의 기능은 크게 5가지(일반,초급중급고급, 선택)로 나눌 수 있습니다.

 이때, 일반 을 제외한  초급중급고급은 구문 작성과 직접적 관련이 있는 항목입니다.

  • 일반
    • 구조적 개념(Structure Definition)
    • 커맨드 및 펄미션(Commands and Permissions)
    • 인-게임 에디터(In-Game Editor)
    • 코드 기초(Basic Syntax)
  • 초급
    • 실행자(Executors)
    • 플레이스 홀더(PlaceHolders)
    • 조건 판별(Conditions)
    • 변수(Variables)
    • 일부 트리거
      • 클릭 트리거(Click Trigger)
      • 워크 트리거(Walk Trigger)
      • 커맨드 트리거(Command Trigger)
  • 중급
    • 반복문(Loops)
    • 동기 모드(Sync Mode)
    • 배열 타입(Array)
    • FOR 반복문을 이용한 콜렉션 처리 기법(Collection Treatment with FOR Loop)
    • 일부 트리거
      • 구역 트리거(Area Trigger)
      • 네임드 트리거(Named Triggers)
  • 고급
    • Bukkit API를 이용한 구문 작성 요령(Using Bukkit API)
    • 타 플러그인 엑세스(Plugin Access)
    • JavaDoc  독해 기법(How to read JavaDoc)
    • commonFunction 사용하기(How to use commonFunction)
    • IMPORT 명령자 사용하기(How to use IMPORT Statement)
    • IS 특수 비교 연산자 사용하기(How to use IS Statement)
    • 일부 트리거
      • 커스텀 트리거(Area Trigger)
      • 인벤토리 트리거(Inventory Trigger) 
      • 반복 트리거(Repeating Trigger)
  • 선택
    • 커스텀 Executor 제작하기(Creating Custom Executor) 
      • 검증 시스템(Validation System)
        •  
        •  
    • 커스텀 PlaceHolder 제작하기(Creating Custom PlaceHolder)

 


구조적 개념

구조적 개념이란, TR 플러그인의 구조를 이해하고 구조에서의 각 구성요소에 대한 정의를 이해하는 모든 것을 말합니다. 가장 기본적인

구성 요소 중 하나로써, 암기보다는 특정 구조에 대해 이해하고 상황에 맞는 구성요소를 선정하는 능력을 기르는 것이 최우선입니다.

실질적으로 이 문서 자체가 구조적 개념을 설명하는 문서입니다. 즉, 지금 '구조적 개념'에 대하여 설명하는 것도 구조적 개념입니다.

어려운 말로 '재귀적이다' 라고 할 수 있겠지요?


커맨드 및 펄미션

 

TR 플러그인이 가지고 있는 각종 커맨드, 즉 명령어와 펄미션을 이해하는 것을 말합니다.

여느 플러그인이나 그렇듯이, 플러그인에서 제공하는 명령어를 이해하지 못하면 플러그인을 사용할 수 있다고 말할 수 없습니다.


인-게임 에디터

 

인-게임 에디터는 트리거 리엑터에서 독자적으로 지원하는 기능으로, 인게임에서 채팅창을 마치 메모장처럼 사용하여

더욱 손쉽게 구문 작성을 하게 해주는 기능입니다. 

캡처.JPG

위와 같이 채팅으로 다중 라인의 구문을 작성하게 해주는 기능입니다.


코드 기초

 

다른 Variable Triggers 또는 Skript와 다르게, 트리거 리엑터는 실제로 존재하는 프로그래밍 언어인 Java의 문법을 

일부 따르고 있습니다. 따라서 트리거 리엑터의 자체 문법을 공부하기 전, Java 코드 문법의 기초를 습득해야 합니다.

프로그래밍 언어라고 어려워할 필요는 없습니다. 정말 쉬운 문법만 따르고 있으니까요. 

하지만, 쉽다고 해서 대수롭지 않게 여기면 안됩니다. 가장 쉬운 부분임에도 불구하고, 가장 실수를 많이 하는 부분이기도 합니다.

즉, 정확하게 습득하지 않으면 코드에서 오류가 발생할 수 있습니다.


실행자

보통 Executor라고 부릅니다. 트리거 리엑터에서 중요한 부분에 자리하고 있는 요소입니다.

말 그대로 특정한 기능을 실행하는 것으로 Variable Triggers에서의 스크립트(@CMDOP)와 같습니다.

이 부분은 Variable Triggers와 비슷한 부분이 많습니다. 예를 들어, 트리거 리엑터에서의 #CMDOP 등이 기존의 것과 매우 흡사합니다.


플레이스 홀더

실행자와 함께 트리거 리엑터에서 중요한 부분에 자리하고 있는 요소입니다.

구문 내부에서 특정 정보를 불러오는 기능을 합니다.

이 역시 Variable Triggers에서의 플레이스 홀더(<playername>) 와 같으며, 하는 기능 역시 Variable Triggers와

비슷한 부분이 많습니다. 예를 들어, 트리거 리엑터에서의 $playername 등이 기존의 것과 매우 흡사합니다.


조건 판별

트리거 리엑터를 비롯한 모든 스크립터 플러그인에서 없어서는 안되는 기능합니다.

TR만의 문법에 따라서 조건을 판별, 즉 참과 거짓을 논하는 구문을 말합니다.

트리거 리엑터에서는 IF, ELSEIF, ELSE, ENDIF 가 그 기능을 가지고 있습니다.


변수
 

트리거 리엑터에서 다루는 변수를 설명합니다.이는 기존의 방식과 다른 독자적인 문법을 가지고 있습니다.

변수는 특정 값을 저장하는 저장 공간으로, 코드를 조금 더 편리하게 작성할 수 있도록 도와주는 역할을 하며,

트리거 리엑터에서는 동시에 영구적으로 저장되어 보존할 수 있는 종류의 변수도 지원합니다.

예를 들어,

#BROADCAST "hello, "+player.getName()
#MESSAGE player.getName()

위와 같이 어느정도의 길이를 가지고 있는 호출, 이를테면 player.getName()을 여러번 쓰는 건 비효율적 입니다.

 

var = player.getName()
#MESSAGE var
#BROADCAST "hello, "+var

위와 같이 변수로 저장하여 쉽게 표현할 수 있습니다.


반복문

반복문은 이름과 같이 어떠한 블록 안에 위치한 구문을 일정 횟수동안 반복하는 기능을 합니다.

트리거 리엑터에서는 WHILE 문과 FOR문이 이 기능을 하고 있으며, 이중 FOR은 정말 중요한 기능을 합니다.

이와 더불어서 반복문 내에서만 작동하는 #BREAK, #CONTINUE  실행자 또한 존재하며 이에 대한 이해를 하는 것이 반복문을 이해하는 것입니다.


동기 모드

동기모드는 중급에 있지만 그 개념을 깊게 파고들면 고급을 뛰어넘을 정도의 난이도를 요구합니다.

동기모드를 통해서 우리는 특정한 이벤트를 캔슬(취소) 시킬 수도 있고, 모든 구문을 동시 실행할 수도 있습니다.

하지만 깊은 이해를 원하지 않는다면 동기 모드는 '구문의 모든 줄을 동시에 실행' 함을 나타낸다고 보면 됩니다.

동기모드와 상반되는 개념은 비동기 모드로 트리거 리엑터는 기본값으로 비동기 모드를 사용합니다.

비동기모드는 구문 한 줄 마다 딜레이가 있습니다.

이러한 모드 말고도 구문 일부만 동기, 비동기로 바꿀 수 있는 ASYNC, SYNC, ENDSYNC, ENDASYNC 등이 있습니다.


배열 타입

배열 타입은 변수 하나에 여러가지의 값을 저장하는 방법 중에 하나입니다.

index라는 번호를 부여받아 값의 위치를 표시합니다.

예를 들어 "안", "녕", "하", "세", "요" 이렇게 5개의 문자열이 있고, 이를 hello 라는 변수에 모두 저장한다면,

hello[0] = "안"
hello[1] = "녕"
....
hello[4] = "요"

이런 식으로 하나의 변수에 0부터 시작하는 번호를 부여하여 저장할 수 있는 겁니다.

커맨드 트리거에서 주로 커맨드 뒤에 오는 문자열들을 다룰 때 사용됩니다.

 


FOR 반복문을 이용한 콜렉션 처리 기법

이 항목은 매우 중요하며, 요긴하게 사용되는 트리거 만의 방법입니다.

위에서 FOR이 중요하게 사용된다고 했는데, 그 이유가 이 기능 때문입니다.

예를 들어서 getPlayers() 를 사용하여 현재 접속해 있는 플레이어 목록을 불러온다고 치면,

이는 하나의 변수에 여러개를 저장하는 이른바 '콜렉션' 의 형태로 저장될 겁니다.

그런데 "플레이어 한명한명에게 무언가를 실행시키고 싶다." 같은 상황이 올 수 있습니다. 그럴 때 사용하는 게 바로 FOR 반복문 입니다.


Bukkit API및 자바 문법을 이용한 구문 작성 요령

트리거 리엑터에서는 확장성을 위하여 버킷 API와 자바 문법을 그대로 사용하는 것을 지원합니다.
예를 들어, 플레이스 홀더인 $playername 는 Bukkit API를 이용하여 작성하면 player.getName() 가 됩니다.

이 기능은 기존에 PlaceHolders 나 Executors 로써 만들어지지 않은 기능을 사용하고 싶을 때 사용합니다.


타 플러그인 엑세스

일명 Hooking이라고 하는 이 기법은 서버에 적용된 다른 플러그인에 엑세스하여 그 플러그인의 기능을

사용할 수 있도록 하는 기능입니다. 하지만, 해당 플러그인이 JavaDoc을 가지고 있지 않는다면 소스 코드를 직접 분석해서
어떠한 것에 어떠한 기능을 실행하는지 직접 파악하여 사용해야 합니다.
예를 들어, Essentials의 ignore(채팅 무시) 기능을 트리거 에서 사용하려면,

User#_getIgnoredPlayers() 과 같은 걸 소스코드에서 직접 찾아야 합니다.


JavaDoc 독해 기법

위에서 설명한 모든 기능을 사용하려면 먼저 API를 설명하는 문서인 JavaDoc의 독해 기법을 습득해야 합니다.

JavaDoc은 이렇게 생겼습니다:

캡2처.JPG

보시는 바와 같이 모든 게 영어로 적혀 있습니다. 때문에 이부분은 본인의 영어 실력 또한 필요로 합니다.

위 JavaDoc을 독해하는 방법을 습득한다면, 수준 높은 구문을 구사할 수 있습니다.

 


commonFunction 사용하기

commonFunction은 비교적 쉽습니다. 중급 정도의 난이도이나, JavaDoc 독해를 필요로 하기에 고급으로 분류할 수 있습니다.

commonFunction은 PlaceHolder의 고도화된, 또는 심화된 버전이라고 보시면 됩니다.

상단에서 한 번 언급한 getPlayers() 역시 접속한 플레이어들을 불러오는 commonFuncion 입니다.


IMPORT 명령자 사용하기

ㅇIMPORT 명령자는 Java의 import라는 것의 개념을 모르면 어려울 수 있는 심화 중 심화입니다.

이는 "특정 기능을 사용하기 위해 기능이 위치한 장소를 구문으로 끌어들인다" 정도로 해석할 수 있는데,

예를 들어 java.lang.Math 라는 위치에 있는 random()을 사용하려면

IMPORT java.lang.Math
#MESSAGE Math.random(1, 4)

위와 같이 바로 Math.random(1, 4) 를 사용하지 못하고 IMPORT를 통해 그 위치를 트리거에게 알려준 후 사용할 수 있습니다.


IS 특수 비교 연산자 사용하기

이 역시 심화중 심화의 개념으로 Java의 가장 큰 특징인 "객체 지향적 프로그래밍"의 개념을 이해해야
이 기능의 정확한 의미를 파악할 수 있습니다.

여기서 IS는 instanceof의 줄임말로 "~ 타입인가요?" 를 묻는 겁니다.
 이 역시
JavaDoc 독해를 필요로 하며, 구문에서 IS 연산자 사용 전에는 무조건 IMPORT를 사용하여 주어야 합니다.

예를 들어:

IMPORT org.bukkit.entity.Player
IF entity IS Player
    entity.sendMessage("hi")
ENDIF

위에서 IMPORT는 Player 즉 플레이어라는 것을 불러왔습니다.

그리고 IF 조건문에서는 "entity 라는 변수 안에 저장되어 있는 값이 Player 타입이냐?" 라고 판별합니다.

그리고 맞다면 entity에게 메시지를 전송합니다. 왜냐하면 entity가 플레이어일 경우 메시지를 받을 수 있기 때문입니다.

이 개념은 이해가 가지 않을 수 있습니다. 구지 이해하려 하지 않아도 됩니다.


커스텀 실행자/플레이스 홀더 만들기

이 개념은 심화를 넘어선 JavaScript라는 프로그래밍 언어를 통한 제작 기법으로, 선택적인 항목입니다.

트리거 리엑터의 몇몇을 제외한 대부분의 실행자와 플레이스 홀더는 JavaScript라는 프로그래밍 언어에 기반하여 짜여진 구문으로 실행됩니다.

예를 들어:

function playername(args){
    if(player == null)
        return null;

return player.getName();
}

위 JavaScript 구문은 플레이어의 이름을 불러오는 $playername 의 구문입니다.


 

지금까지 트리거 리엑터의 전체적인 구조를 자세하게, 그리고 각각의 요소에 대한 정의를 간략한 설명을 통해 알아보았습니다.

제가 난이도를 분류해 놓았지만, 그렇다고 해서 초급 -> 중급 -> 고급 순으로 진행하지 않아도 됩니다. 저 같은 경우도 필요에 따라서 커스텀 플레이스 홀더 만들기 를 먼저 시도했었고, 이를 기점으로 트리거 리엑터를 본격적으로 좋아하게 되었습니다.

전체적으로 어려워 보인다고 해도, 막상 도전하면 본인에게 꽤나 잘 맞을 수도, 잘 맞지 않을 수도 있습니다. 그럼에도 불구하고 도전하는 것에 대한 가치는 충분합니다.

 

이상 1강을 마치도록 하겠습니다. 감사합니다.

트리거 리엑터 Github 소스 [자료 출처]

https://github.com/wysohn/TriggerReactor/

 

트리거 리엑터 다운로드 (Latest: 1.13~, Legacy: ~1.12.2, Sponge: sponge)

https://github.com/wysohn/TriggerReactor/releases

 

트리거 리엑터 공식 Github 위키

https://github.com/wysohn/TriggerReactor/wiki/Home_kr

 

트리거 리엑터 공식 디스코드 커뮤니티

https://discordapp.com/invite/U3pyUYc

 




1개의 댓글

Andylab
2019.12.29

트리거 리액터 강좌 찾고 있었는데

감사합니다~!

뉴스 및 창작물
/files/thumbnails/483/916/003/262x150.crop.jpg?20241127115329

레드스톤

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

노트블럭전문가

2024-11-27

0

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

건축

응답하라 1988 ?

팀뉴일리시

2024-11-23

4

/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

/files/thumbnails/246/898/003/262x150.crop.jpg?20241008102328

레드스톤

단다단 - 오토노케(オトノケ) | 마인크래프트 노트블럭 커버

노트블럭전문가

2024-10-08

1

/files/thumbnails/348/896/003/262x150.crop.jpg?20241006103035

디도스/봇테러등등을 낚는 방법 5

물귀신

2024-10-06

3