
skript-reflect 애드온의 가장 강력한 기능은 제한된 기능을 가진 Skript에서 Java의 클래스와 메소드를 사용할 수 있는 것입니다.
이것 만으로도 활용 가치가 무궁무진하나, 커스텀 문법을 사용하면 Skript의 잠재력을 최대한 발휘할 수 있습니다.
오늘은 그 중에서 첫 번째로 이벤트(Event)에 대해 알아보겠습니다.

Skript에서는 Bukkit API를 이용하여 서버에서 발생 가능한 다양한 상황을 구현한 이벤트 문법이 존재합니다.
위 사진의 'on player join'(플레이어 접속)과 'on explode'(엔티티 폭발)처럼 어떤 상황이 발생함을 가정하고, 이 아래에 코드를 적을 수 있는 문법을 이벤트(Event)라고 부릅니다.
Skript에서는 기존 게임의 룰을 수정하고 새로운 규칙을 가진 서버를 만드는 것이 목표입니다. Skript 코드를 작성하게 되면 명령어를 제외한 대부분의 코드는 전부 이벤트로 시작하게 됩니다.
각 이벤트는 이벤트 값(event value)를 가지고 있으며, 이벤트가 구체적으로 언제, 어디서, 누가, 어떻게 발생했는지에 대한 부가적인 데이터를 사용할 수 있습니다.
이벤트에 대한 정의를 이해했다면 이제 커스텀 이벤트를 만드는 방법을 알아봅시다.

커스텀 이벤트의 가장 기본적인 두가지 형태입니다.
이벤트의 명칭과, 실제 코드에서 사용하는 방법인 패턴(pattern)으로 이루어져 있습니다.
패턴은 Skript의 독스 등에서 자주 보는 그것과 완전히 동일하며, 문법의 유연함을 위해 여러 괄호와 특수기호를 사용할 수 있습니다. 이 때, on은 생략합니다.
| 기호 | 설명 |
|---|---|
| [ ] | 선택 사항(택1) |
| ( ) | 필수 사항(택1) |
| | | 구분 기호 |
| : | 태그(parser tag) |
패턴이 하나일 경우에는 MyEvent1의 경우처럼 pattern:, 여러 개가 필요한 경우는 patterns:를 사용하면 됩니다.

이제 실제로 사용할 이벤트를 만들어봅시다. 이 글에서는 플레이어 리스트에 변경이 생겼을 때 발생하는 이벤트로, 플레이어가 들어오거나 나갈 때 호출됩니다.
먼저 이벤트 값은 정수(integer)와 숫자(number) 자료형으로, 이는 현재 플레이어의 수를 반환하도록 할 것이므로 event-values: 항목에 추가합니다.
이후 parse:와 check: 항목은 이 이벤트에서는 필요하지 않지만 어떻게 사용하는지 보여드리고자 넣어봤습니다. 간단히 말하면 parse: 부분은 이벤트가 제대로 작성되었는지, check: 부분은 이벤트를 꼭 호출해야하는지 판단할 필요가 있을 때 continue와 함께 사용하는 것이라고 알고 계시면 됩니다.

그리고 on join과 on quit 이벤트에 만들어진 커스텀 이벤트를 호출하는 코드를 작성합니다.
아까 추가한 이벤트 값을 넘겨주기 위해 리스트를 만들고, 리스트의 인덱스를 자료형(integer, number)로 해야 제대로 이벤트 값이 설정됩니다.
여기서 플레이어 수는 항상 정수이므로 event-integer와 event-number는 사실상 똑같은 값을 나타낼 것입니다.
이후 new custom event과 call event 문법을 통하여 이벤트를 호출하도록 하면 커스텀 이벤트가 완성됩니다.

이제 만들어진 커스텀 이벤트를 사용한 코드를 작성하여 실제로 이벤트가 동작하는지 확인해봅시다.
event "onPlayerListChanged":
pattern: player (count[er]|list) change[d]
event-values: integer, number
on join:
set {_values::integer} to number of all players
set {_values::number} to number of all players
set {_event} to new custom event "onPlayerListChanged" with values {_values::*}
call event {_event}
on quit:
wait a tick
set {_values::integer} to number of all players
set {_values::number} to number of all players
set {_event} to new custom event "onPlayerListChanged" with values {_values::*}
call event {_event}
on player list changed:
broadcast "이제 서버에 %event-number%명이 접속 중입니다."