Trigger Reactor
1. 개요
마인크래프트에서 사용하는 스크립터 플러그인 중 하나로, 타 스크립터 플러그인에 비해 상대적으로 최근에 알려졌다. 국내애서나 해외에서나 인지도가 그리 높지는 않고, 해외보다는 한국 내에서의 인지도가 높다.
2. 특징
직접 파일을 수정하여 작성할 수도 있으며, 파일은 .trg 라는 고유의 확장자를 사용한다.[5] 인게임에서도 'In-Game Editor' 이라 불리는 리액터 고유의 인게임 구문작성 솔루션으로 구문작성이 가능하다.
기본적 기능, 이를테면 CMDOP나 CMDCON과 같은 점은 Variable Triggers의 문법과 유사하나[6] , 심화로 갈수록 프로그래밍 언어 Java 의 문법을 일부 활용하기 때문에 심화적인 기능으로 가면 갈수록 구문의 대부분이 프로그래밍 언어를 연상시킨다(...)[7] 때문에 객체지향적 특성을 가지고 있기도 하며, 이러한 특성 때문에 일각에서는 '플러그인을 제작하는 편이 더 낫지 않느냐'는 의견이 나오는 경우도 있다. 물론 이건 잘못된 생각이다. 실제로 플러그인을 제작해본다면 기능은 천지차이다. 가령 트리거 리액터는 '''Comsumer'''과 같은 함수형 문법을 처리하지 못하며 이 때문에 가장 기본적인 기능 중 하나인 ''public void run()'' 을 구현할 수 없는 한계가 있다. 이처럼 트리거 리액터는 자바 문법을 일부 빌려 구현 범위를 확장한 것일 뿐, 자바와 동등한 구현 범위를 가지지는 못한다.
처음 진입장벽이 '''매우 높다'''는 평가를 받는다. 실제로 처음 접했음에도 불구하고 CommonFunctions 와 같은 Javadoc 형태의 문서를 이해하고 사용해야 하는 경우도 적지 않을 뿐더러, 문자열 처리를 상따옴표(") 로 하는 등, 일반 프로그래밍 언어의 문법을 배우는 것과 같기에 첫 진입장벽이 매우 높은 것이 사실이다. 사용자가 적은 이유도 이러한 특성이라고 여겨지며, 어려운 문법을 사용하는 것에 장단점을 모두 가지고 있다는 것이다. 장점은 매우 넓은 구현범위이며 , 단점은 점점 여러워지는 문법이 되는 것이다.
또한, 스크립터 플러그인중 유일하게 '''구문에서 직접 동기/비동기를 제어할 수 있는 플러그인이다.''' 즉, 사용자 정의의 멀티 쓰레딩을 지원하는 것이다. 덕분에 사용자의 서버 부하를 유연하게 조절할 수 있게 되었다.
3. 문제점
3.1. 접근성및 작성 난이도
트리거와 기본이 같을 수 있지만 Skript등과 달리[8] 심화로 들어가게 되면 Java 프로그래밍 언어의 문법 일부를 사용하기 때문에, 이해하기 힘들고 대소문자 구분 등, 어느정도 JAVA에 대한 기본 상식 없다면 심화접근이 어렵다.
4. Trigger Reactor 구문 작성
TR 구문의 특성이나 여러 구문 예시를 다룬다.
4.1. 자료형 처리
TR은 객체지향적이다. 때문에 변수에 대한 자료형이 여러 가지가 존재한다. 일반적으로 JAVA의 구문 내부에서는 변수 앞에 자료형을 붙임으로써 선언하지만, 트리거 리엑터는 이와 다르게 자료형에 따라서 모두 오브젝트 인스턴스로 선언한다.
4.1.1. 문자열
트리거 리엑터에서 문자열은 쌍따옴표(") 로 선언한다. String 클래스를 불러와 객체를 선언할 필요는 없다.
예를 들어,
위 구문은 "안녕하세요!" 의 값을 가진 문자열 인스턴스를 myStr이라는 이름을 가진 변수에 저장한다.
이때, 주의할 점이 있다면 트리거에서는 그 자체의 내용으로써 불러오는 '''정적 문자열''' 과 변수로써, 또는 변수를 통해 불러오는 '''동적 문자열''' 의 입력방식이 존재한다. 위 구문은 "안녕하세요!" 라는 그 자체의 내용을 담고있으므로 '''정적 문자열''' 입력방식을 사용한 것이다. 저 구문을 실행하고 바로 아래 줄에서
위와 같은 구문을 적는다면 myStr은 "안녕하세요!" 라는 문자열의 내용을 직접적으로 서술하지 못하는 변수명이기에 '''동적 문자열''' 의 입력 방식을 사용한 것이다. 두 방식의 다른 점은 '''동적 문자열''' 입력방식은 쌍따옴표(") 가 사용되지 않는 것이다. 위와 같이 두가지 입력 방식으로 나눈 이유는 바로 PlaceHolder[9] 라는 트리거 리엑터가 내장하는 기능이 있기 때문이다. 결론부터 말하자면 PlaceHolder는 '''동적 문자열''' 입력방식의 일종이다. 그도 그런게, $playername 을 입력하면 플레이어의 이름 값을 불러온다. 이는 실질적으로 구문에서 $playername을 사용함으로써 정확히 불러와지는 것이 불분명하고 사용하는 플레이어에 따라 변할 수 있기 때문인데, 이 때문에 $playername 과 같은 플레이스 홀더는 쌍다옴표(") 사이에 위치시키면 작동하지 않는다.
위 구문은 $playername을 문자 그대로 출력한다.
위 구문은 이 트리거를 실행시킨 플레이어의 닉네임을 불러온다.
이렇게 두 가지 입력방식이 있는데, 이 두개를 한번에, 가령 "<플레이어 이름> 님이 우승!" 과 같은 '''정적 문자열''' 과 '''동적 문자열''' 을 동시에 사용하려면 사이에 +를 넣어서 두 문자열을 붙일 수 있다.
#BROADCAST $playername+"님이 우승!"
4.1.2. 정수, 실수
int, Double 등과 같은 정수, 실수는 위와 같은 특정 기호를 통한 선언 방식이 없다. 즉,
위와 같은 방식으로 바로 정수, 실수타입을 선언할 수 있다.
4.1.3. 이진법(Boolean)
트리거 리엑터에서는 이진법, 즉 옳고 그름('''True''' 와 '''False''') 또한 특정 기호를 통한 선언 방식이 없고, 단지 '''true''' 와 '''false''' 로 선언할 수 있다.
주의할 점은 '''쌍따옴표(")'''를 붙이면 문자열로 인식하여 이진 연산이 불가능하다는 점이다.
4.2. 변수
트리거 리엑터의 변수는 크게 [10] '''전역변수(광역변수)''' , '''지역변수''' , 그리고 '''임시 전역변수'''. 이렇게 세가지이다. 변수는 이해하기 상대적으로 쉽다.
4.2.1. 지역변수(Local Variable)
지역변수는 해당 구문에서 곧바로 선언하고 '''해당 변수를 선언한 구문에서만 사용이 가능한 변수'''이다. 한마디로, A.trg에서 선언한 임시변수는 B.trg에서 사용될 수 없고, A.trg의 실행이 끝나면 곧바로 삭제된다.[11]
지역변수의 선언 방법은 다음과 같다.
이미 이 문서 상단에서 서술한 변수 선언도 실질적으로 지역변수의 선언이다.
위 구문은 name이라는 지역변수에 해당 구문을 실행시킨 플레이어의 닉네임을 저장한다.
지역변수를 선언할 때, '''변수명'''에서 반드시 지켜야 할 규칙이 존재한다.
[추천] 여기서 본인의 버전에 맞게 다운로드하는 것을 추천한다.[1] 1.5.2~1.12.2는 legacy 버전이 따로 존재한다. 1.13 이상은 latest. Sponge는 API 7까지 지원하며, sponge 버전 역시 따로 존재한다.[2] 재미 한국인으로 추정되며, Java외에도 웹 프론트엔드, 백엔드, DB등 다양한 언어를 활용할 수 있는 듯 하다.[3] 현재 개인 사정으로 모두 중단[4] 준비중[5] 단, 확장자 고유의 방식이 있는 것은 아니다. txt로 확장자를 임의로 수정해도 파일이 깨지는 등의 오류는 발생하지 않는다. 하지만, 파일 인코딩을 UTF-8(BOM 없음) 으로 설정하지 않을 경우 파일이 깨지고 한글이 제대로 출력이 안되는 문제가 발생할 수 있다.[6] 실제로 설명서 소개 페이지에 VariableTriggers에 영감을 얻었다고 명시되어있다.[7] 가령 #MESSAGE "Hi" 는 player.sendMessage("Hi") 로 대체할 수도 있다.[8] 물론 Skript도 직접 코드를 작성하도록 해주는 애드온이 존재하지만, 기본 플로우를 코드로 하지는 않는다.[9] 특정 상황에서의 특정 값을 불러오는 기능을 하는 것이다. 가령 VT에서 <playername>은 트리거를 실행시킨 플레이어의 이름이 불러와지듯이, 트리거 리엑터에서도 $playername 과 같은 것이 있다.[10] 원래는 두가지였지만 최근에 임시전역변수 기능이 추가되었다.[11] 단, 예외적으로 A.trg에서 Named Trigger 형식의 B.trg를 호출한다면 실행 영역이 합쳐지기 때문에 B.trg에서도 A.trg에서 선언한 지역변수를 사용할 수 있다.