[[분류:나무위키 마인크래프트 프로젝트]][[분류:마인크래프트/플러그인]] [include(틀:마인크래프트/관련 문서)] ||<-3><tablealign=right><tablebordercolor=#3f83c4><table width=450><tablebgcolor=#3f83c4> {{{+1 {{{#f4bb67 '''트리거 리엑터'''}}} [br] {{{#f4bb67 '''Trigger Reactor'''}}}}}} || ||<bgcolor=#fff><height=150px><-3><:> [[파일:TriggerReactor-logo.png|width=80%]] || ||<-2><#3f83c4> {{{#fff 다운로드 페이지 }}} ||<#fff><:> [[https://www.spigotmc.org/resources/triggerreactor-script-for-everything.40987/?__cf_chl_jschl_tk__=1b93b0ba204fcd1ee9ebffc0bbc27f4e70ed8fda-1590846982-0-AW2fJdSb2tQ4IJUo8ejo2_GuLQ7GhLLqzjXpAtYpmGffVrxASn8eOFf9jb4sul-HNsucI81SDoRDHolPp5OSgVSIXX6PAxUxPCw-iu8D2jHIfyvtWZLe59spXaDARZGNabq6WFOBQCIw0PWu7I0tItJ14o5Q8p27_L_BZ0Pxg_VzNUr4OTidkLkQVwJ_QyrZZU82flvA9eT3tt-GivB_0phgV54rRfcs3XJVSbuw_uphiFFrohkuYU5VT6fVwqFPL3WTDFeUq3sx_kEjXDTvAquimRCZ34YjJaG5p_j-hlcOJNYfSQce2OmxXX2DrW0ZRG_py8zHP6vjmNdxe8L_QtvO7i2JjZq11l6zzClAzEWh|Spigot]] [[https://dev.bukkit.org/projects/triggerreactor|Bukkit]] [[https://github.com/TriggerReactor/TriggerReactor/releases|Github]][*추천 여기서 본인의 버전에 맞게 다운로드하는 것을 추천한다.]|| ||<-2><#3f83c4> {{{#fff 버전 }}} ||<#fff> {{{#a0a0a0 '''1.5.2 ~ 최신버전[* 1.5.2~1.12.2는 legacy 버전이 따로 존재한다. 1.13 이상은 latest. Sponge는 API 7까지 지원하며, sponge 버전 역시 따로 존재한다.]''' }}} || ||<-2><#3f83c4> {{{#fff 개발자 }}} ||<#fff><:> {{{#a0a0a0 wysohn}}}[* 재미 한국인으로 추정되며, Java외에도 웹 프론트엔드, 백엔드, DB등 다양한 언어를 활용할 수 있는 듯 하다.] || ||<-2><#3f83c4> {{{#fff 개발 협력자 }}} ||<#fff><:> ~~gerzytet(외국인) Dr_Romantic(한국인)~~[* 현재 개인 사정으로 모두 중단]|| ||<-2><#3f83c4> {{{#fff 공식 설명서}}} ||<#fff><:> [[https://github.com/TriggerReactor/TriggerReactor/wiki/Home_kr|[[파일:github-logo.png|width=20]]]] || ||<-2><#3f83c4> {{{#fff 설명서 번역가 }}} ||<#fff><:> {{{#a0a0a0 Dr_Romantic, RedLime}}} || ||<-2><#3f83c4> {{{#fff 공식 링크 }}} ||<#fff><:> [[https://discord.gg/U3pyUYc|[[파일:디스코드 아이콘.png|width=20]]]] ~~~[[http://trigger.co.kr|[[파일:KakaoTalk_20200530_231823522.png|width=20]]]]~~~[* 준비중] [[https://github.com/TriggerReactor/TriggerReactor|[[파일:github-logo.png|width=20]]]]|| [목차] == 개요 == [[마인크래프트]]에서 사용하는 스크립터 플러그인 중 하나로, 타 스크립터 플러그인에 비해 상대적으로 최근에 알려졌다. 국내애서나 해외에서나 인지도가 그리 높지는 않고, 해외보다는 한국 내에서의 인지도가 높다. == 특징 == 직접 파일을 수정하여 작성할 수도 있으며, 파일은 .trg 라는 고유의 확장자를 사용한다.[* 단, 확장자 고유의 방식이 있는 것은 아니다. txt로 확장자를 임의로 수정해도 파일이 깨지는 등의 오류는 발생하지 않는다. 하지만, 파일 인코딩을 UTF-8(BOM 없음) 으로 설정하지 않을 경우 파일이 깨지고 한글이 제대로 출력이 안되는 문제가 발생할 수 있다.] 인게임에서도 'In-Game Editor' 이라 불리는 리액터 고유의 인게임 구문작성 솔루션으로 구문작성이 가능하다. 기본적 기능, 이를테면 CMDOP나 CMDCON과 같은 점은 Variable Triggers의 문법과 유사하나[* 실제로 설명서 소개 페이지에 VariableTriggers에 영감을 얻었다고 명시되어있다.], 심화로 갈수록 프로그래밍 언어 [[Java]] 의 문법을 일부 활용하기 때문에 심화적인 기능으로 가면 갈수록 구문의 대부분이 프로그래밍 언어를 연상시킨다(...)[* 가령 #MESSAGE "Hi" 는 player.sendMessage("Hi") 로 대체할 수도 있다.] 때문에 객체지향적 특성을 가지고 있기도 하며, 이러한 특성 때문에 일각에서는 '플러그인을 제작하는 편이 더 낫지 않느냐'는 의견이 나오는 경우도 있다. 물론 이건 잘못된 생각이다. 실제로 플러그인을 제작해본다면 기능은 천지차이다. 가령 트리거 리액터는 '''Comsumer'''과 같은 함수형 문법을 처리하지 못하며 이 때문에 가장 기본적인 기능 중 하나인 ''public void run()'' 을 구현할 수 없는 한계가 있다. 이처럼 트리거 리액터는 자바 문법을 일부 빌려 구현 범위를 확장한 것일 뿐, 자바와 동등한 구현 범위를 가지지는 못한다. 처음 진입장벽이 '''매우 높다'''는 평가를 받는다. 실제로 처음 접했음에도 불구하고 [[https://TriggerReactor.github.io/io/github/wysohn/triggerreactor/bukkit/manager/trigger/share/CommonFunctions.html|CommonFunctions]] 와 같은 Javadoc 형태의 문서를 이해하고 사용해야 하는 경우도 적지 않을 뿐더러, 문자열 처리를 상따옴표(") 로 하는 등, 일반 프로그래밍 언어의 문법을 배우는 것과 같기에 첫 진입장벽이 매우 높은 것이 사실이다. 사용자가 적은 이유도 이러한 특성이라고 여겨지며, 어려운 문법을 사용하는 것에 장단점을 모두 가지고 있다는 것이다. 장점은 매우 넓은 구현범위이며 ~~트리거로 System32 파일을 삭제해보자~~, 단점은 점점 여러워지는 문법이 되는 것이다. 또한, 스크립터 플러그인중 유일하게 '''구문에서 직접 동기/비동기를 제어할 수 있는 플러그인이다.''' 즉, 사용자 정의의 멀티 쓰레딩을 지원하는 것이다. 덕분에 사용자의 서버 부하를 유연하게 조절할 수 있게 되었다. ~~다시 말해 개발자의 일이 늘어났다.~~ == 문제점 == === 접근성및 작성 난이도 === 트리거와 기본이 같을 수 있지만 Skript등과 달리[* 물론 Skript도 직접 코드를 작성하도록 해주는 애드온이 존재하지만, 기본 플로우를 코드로 하지는 않는다.] 심화로 들어가게 되면 [[Java]] 프로그래밍 언어의 문법 일부를 사용하기 때문에, 이해하기 힘들고 대소문자 구분 등, 어느정도 JAVA에 대한 기본 상식 없다면 심화접근이 어렵다. == Trigger Reactor 구문 작성 == TR 구문의 특성이나 여러 구문 예시를 다룬다. === 자료형 처리 === TR은 객체지향적이다. 때문에 변수에 대한 자료형이 여러 가지가 존재한다. 일반적으로 JAVA의 구문 내부에서는 변수 앞에 자료형을 붙임으로써 선언하지만, 트리거 리엑터는 이와 다르게 자료형에 따라서 모두 오브젝트 인스턴스로 선언한다. ==== 문자열 ==== 트리거 리엑터에서 문자열은 쌍따옴표(") 로 선언한다. String 클래스를 불러와 객체를 선언할 필요는 없다. 예를 들어, ||myStr = "안녕하세요!"|| 위 구문은 "안녕하세요!" 의 값을 가진 문자열 인스턴스를 myStr이라는 이름을 가진 변수에 저장한다. 이때, 주의할 점이 있다면 트리거에서는 그 자체의 내용으로써 불러오는 '''정적 문자열''' 과 변수로써, 또는 변수를 통해 불러오는 '''동적 문자열''' 의 입력방식이 존재한다. 위 구문은 "안녕하세요!" 라는 그 자체의 내용을 담고있으므로 '''정적 문자열''' 입력방식을 사용한 것이다. 저 구문을 실행하고 바로 아래 줄에서 ||#MESSAGE myStr|| 위와 같은 구문을 적는다면 myStr은 "안녕하세요!" 라는 문자열의 내용을 직접적으로 서술하지 못하는 변수명이기에 '''동적 문자열''' 의 입력 방식을 사용한 것이다. 두 방식의 다른 점은 '''동적 문자열''' 입력방식은 쌍따옴표(") 가 사용되지 않는 것이다. 위와 같이 두가지 입력 방식으로 나눈 이유는 바로 PlaceHolder[* 특정 상황에서의 특정 값을 불러오는 기능을 하는 것이다. 가령 VT에서 <playername>은 트리거를 실행시킨 플레이어의 이름이 불러와지듯이, 트리거 리엑터에서도 $playername 과 같은 것이 있다.] 라는 트리거 리엑터가 내장하는 기능이 있기 때문이다. 결론부터 말하자면 PlaceHolder는 '''동적 문자열''' 입력방식의 일종이다. 그도 그런게, $playername 을 입력하면 플레이어의 이름 값을 불러온다. 이는 실질적으로 구문에서 $playername을 사용함으로써 정확히 불러와지는 것이 불분명하고 사용하는 플레이어에 따라 변할 수 있기 때문인데, 이 때문에 $playername 과 같은 플레이스 홀더는 쌍다옴표(") 사이에 위치시키면 작동하지 않는다. ||#MESSAGE "$playername"|| 위 구문은 $playername을 문자 그대로 출력한다. ||#MESSAGE $playername|| 위 구문은 이 트리거를 실행시킨 플레이어의 닉네임을 불러온다. 이렇게 두 가지 입력방식이 있는데, 이 두개를 한번에, 가령 "<플레이어 이름> 님이 우승!" 과 같은 '''정적 문자열''' 과 '''동적 문자열''' 을 동시에 사용하려면 사이에 +를 넣어서 두 문자열을 붙일 수 있다. #BROADCAST $playername+"님이 우승!" ==== 정수, 실수 ==== int, Double 등과 같은 정수, 실수는 위와 같은 특정 기호를 통한 선언 방식이 없다. 즉, ||myInt = 13 myDouble = 16.3|| 위와 같은 방식으로 바로 정수, 실수타입을 선언할 수 있다. ==== 이진법(Boolean) ==== 트리거 리엑터에서는 이진법, 즉 옳고 그름('''True''' 와 '''False''') 또한 특정 기호를 통한 선언 방식이 없고, 단지 '''true''' 와 '''false''' 로 선언할 수 있다. ||myBool = true|| 주의할 점은 '''쌍따옴표(")'''를 붙이면 문자열로 인식하여 이진 연산이 불가능하다는 점이다. === 변수 === 트리거 리엑터의 변수는 크게 [* 원래는 두가지였지만 최근에 임시전역변수 기능이 추가되었다.] '''전역변수(광역변수)''' , '''지역변수''' , 그리고 '''임시 전역변수'''. 이렇게 세가지이다. 변수는 이해하기 상대적으로 쉽다. ==== 지역변수(Local Variable) ==== 지역변수는 해당 구문에서 곧바로 선언하고 '''해당 변수를 선언한 구문에서만 사용이 가능한 변수'''이다. 한마디로, A.trg에서 선언한 임시변수는 B.trg에서 사용될 수 없고, A.trg의 실행이 끝나면 곧바로 삭제된다.[* 단, 예외적으로 A.trg에서 Named Trigger 형식의 B.trg를 호출한다면 실행 영역이 합쳐지기 때문에 B.trg에서도 A.trg에서 선언한 지역변수를 사용할 수 있다.] 지역변수의 선언 방법은 다음과 같다. ||변수명 = 값|| 이미 이 문서 상단에서 서술한 변수 선언도 실질적으로 지역변수의 선언이다. ||name = $playername|| 위 구문은 name이라는 지역변수에 해당 구문을 실행시킨 플레이어의 닉네임을 저장한다. 지역변수를 선언할 때, '''변수명'''에서 반드시 지켜야 할 규칙이 존재한다. ||1. 변수명의 첫머리는 무조건 소문자를 사용한다. (Name = "hello" [X]) 2. 변수명의 첫머리에는 숫자를 사용하지 않는다. (6hours = "18시" [X]) 3. [관례] 변수명에 여러 단어가 올 적에, 첫 단어를 제외한 나머지 단어는 첫 머리를 대문자로 쓴다. (myMiddleName = "danger" [O]) 4. 특수문자는 언더바(_) 이외에는 사용하지 않는다. (^43* = "hello" [X]) 5. [관례] 변수명은 무조건 그 변수가 담고 있는 값의 의미를 대표할 수 있어야 한다.. (playerName = $worldname [X])||