Skip to content
Scripter36 edited this page Jan 8, 2018 · 3 revisions

플러그인

플러그인을 이용하여 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

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"
}

API

기본적으로 플러그인은 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()}님이 로그인 하셨습니다.`)
})

명령어 등록

서버 플러그인에서 명령어를 등록할 수 있습니다.

권장하는 명령어 등록 방법은 다음과 같습니다:

  1. 서버 플러그인 폴더에 commands 폴더를 생성합니다.
  2. 폴더 안에 Command를 상속하는 새 클래스 모듈 파일을 만듭니다. (Commands는 require('../../../../src/io/github/Vokkit/command/commands/Command.js')을 통해 접근할 수 있습니다.)
  3. 클래스의 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 경로는 경로가 복잡하기에 작성된 것이며, 예제와 다른 경로에서 사용하는 경우 경로를 직접 지정해야 합니다.

Clone this wiki locally