-
Notifications
You must be signed in to change notification settings - Fork 5
Plugin
플러그인을 이용하여 Vokkit에 여러 기능을 추가하거나 제거할 수 있습니다.
플러그인은 폴더 형식으로 이루어지며, 폴더 안에는 다음을 포함해야 합니다.
- manifest.json
- 서버 플러그인 폴더
- 클라이언트 플러그인 폴더
서버 / 클라이언트 플러그인 폴더 안에는 PluginBase를 상속하는 클래스 모듈 파일이 있어야 하며, manifest.json을 통해 파일을 지정해 주면 onLoad, onEnable, onDisable 메서드가 상황에 맞게 실행됩니다.
(서버 PluginBase는 require('../../../src/io/github/Vokkit/plugin/PluginBase.js')
로, 클라이언트 PluginBase는 require('../../../public/src/plugin/PluginBase.js')
로 접근할 수 있습니다.)
manifest.json 파일은 다음 정보를 포함해야 합니다.
{
"name":"플러그인 이름. 플러그인 폴더명과 동일해야 합니다.",
"version":"플러그인 버전",
"server-plugin":"서버 플러그인 폴더 이름",
"client-plugin":"클라이언트 플러그인 폴더 이름",
"server-main":"서버 플러그인 폴더의 메인 코드",
"client-main":"클라이언트 플러그인 폴더의 메인 코드"
}
다음은 Vokkit에서 제공하는 Template의 manifest.json입니다.
{
"name":"Template",
"version":"v0.0.1",
"server-plugin":"server",
"client-plugin":"client",
"server-main":"index.js",
"client-main":"index.js"
}
기본적으로 플러그인은 Vokkit의 내부 코드에 접근할 수 있으며, Vokkit에 접근할 수 있는 전역 변수 Vokkit과 three.js 관련 기능을 사용할 수 있는 전역 변수 THREE가 제공됩니다.
서버 플러그인은 이벤트를 받아올 수 있습니다. (클라이언트 플러그인 이벤트는 지원하지 않습니다.)
(이벤트 목록: BlockBreakEvent, BlockPlaceEvent, PlayerChatEvent, PlayerJoinEvent, PlayerLoginEvent, PlayerMoveEvent, PlayerQuitEvent, ServerCommandEvent, SocketConnectionEvent(미작동)
)
이벤트를 받아오려면 이벤트를 처리할 메서드 또는 함수를 생성한 뒤, 다음 메서드를 통해 이벤트를 등록합니다.
Vokkit.getServer().getPluginManager().registerEvent(plugin, eventName, listener)
plugin은 메인 클래스이고, eventName은 이벤트의 이름 문자열이며, listener은 이벤트를 처리할 메서드 또는 함수입니다.
예를 들어 다음과 같이 사용할 수 있습니다. (onLoad 메서드에서)
Vokkit.getServer().getPluginManager().registerEvent(this, 'PlayerLoginEvent', (event) => {
Vokkit.getServer().getLogger().info(`${event.getPlayer().getName()}님이 로그인 하셨습니다.`)
})
서버 플러그인에서 명령어를 등록할 수 있습니다.
권장하는 명령어 등록 방법은 다음과 같습니다:
- 서버 플러그인 폴더에 commands 폴더를 생성합니다.
- 폴더 안에
Command
를 상속하는 새 클래스 모듈 파일을 만듭니다. (Commands는require('../../../../src/io/github/Vokkit/command/commands/Command.js')
을 통해 접근할 수 있습니다.) - 클래스의 constructor에서 명령어의 정보를 입력합니다.
constructor () {
super(name, description, usage, parameterType)
}
name은 명령어의 이름, description은 설명, usage는 사용법이며 parameterType은 ParameterType[][]입니다. (추후 설명)
Vokkit에서는 명령어가 생성될 때 파라미터가 어떤 형식인지 지정하게 하여 비생산적인 예외 처리 및 형식 지정을 자동 처리하고 있습니다.
parameterType에 여러 개의 파라미터 형식을 넣을 수 있으며, 각 파라미터 형식은 띄어쓰기로 구분됩니다.
다음은 공식 플러그인인 EssentialCommands의 일부입니다.
super('ban', '플레이어를 영구히 추방합니다.', '/ban <Player>', [
[ParameterType.PLAYER],
[ParameterType.PLAYER, ParameterType.STRING]
])
이 플러그인은 /ban <Player>
, /ban <Player> <String>
의 두 가지 파라미터 형식이 존재합니다.
ParameterType은 require('../../../../src/io/github/Vokkit/command/parameter/ParameterType.js')
을 통해 접근할 수 있으며, ParameterType은 STRING, NUMBER, PLAYER, BOOLEAN, UNLIMITED_STRING
의 5가지 종류가 존재합니다.
명령어 클래스에 execute (parameterNumber, sender, parameter)
메서드를 생성하세요. parameterType은 어떤 파라미터 형식으로 데이터가 들어오는지 알려주며, sender은 명령어를 실행한 ConsoleCommandSender
또는 PlayerCommandSender
이며, parameter은 Parameter[]입니다.
Parameter에서는 getValue
메서드를 통해 데이터를 얻을 수 있는데, ParameterType이 STRING, UNLIMITED_STRING
인 경우 문자열, NUMBER
인 경우 숫자, BOOLEAN
인 경우 bool 값, PLAYER
인 경우 플레이어를 반환합니다.
switch문이나 if문과 parameterNumber을 통해 파라미터를 처리하고, 파라미터 형식이 올바르지 않은 경우를 대비해 default 또는 else에 오류 처리 코드를 작성하세요.
다음은 EssentialCommands의 HealthCommand의 일부입니다.
execute (parameterNumber, sender, parameter) {
switch (parameterNumber) {
case 0: // parameter: [ParameterType.PLAYER, ParameterType.NUMBER]
let player = parameter[0].getValue()
player.setHealth(Math.floor(parameter[1].getValue()))
break
default: //예외 처리
sender.sendMessage(this.getUsage())
break
}
}
sender이 PlayerCommandSender인지 확인하려면, instanceof를 사용하거나 sender.getPlayer 메서드가 존재하는지 확인하면 됩니다.
주의: 위의 require 경로는 경로가 복잡하기에 작성된 것이며, 예제와 다른 경로에서 사용하는 경우 경로를 직접 지정해야 합니다.