-
Notifications
You must be signed in to change notification settings - Fork 20
Event
이 페이지는 Ability에서 Event를 수신하는 방법에 대해서 다룹니다.
Bukkit plugin을 다뤄보신분들은 Event listener의 개념을 알고계실겁니다.
Event listener는 특정 사건이 발생할 때 (블록 설치, 블록 파괴, 플레이어 접속 등) 해당 정보를 수신하여 처리합니다.
Psychics에서도 이와 비슷한 기능을 제공합니다.
Tap의 EntityEventManager 클래스를 활용하여 능력 사용자의 Event를 수신 할 수 있습니다.
Hello Ability!에서 만든 Ability 클래스를 열어서 Listener를 만들어보세요.
Bukkit의 Listener제작 방법과 동일합니다.
class MyAbilityListener : Listener {
@EventHandler
fun onPlayerInteract(event: PlayerInteractEvent) {
if (event.action == Action.LEFT_CLICK_AIR) {
event.player.sendMessage("능력 사용자가 왼손을 휘둘렀다.")
}
}
}
MyAbilityListener 를 제작 후 등록해야 Event를 수신받을 수 있습니다.
Ability 클래스에서 onEnable함수를 Override하고 psychic에 registerEvents 함수로 MyAbilityListener 전달하세요.
ps. psychic은 Ability 인스턴스를 소유하고있는 Psychic 인스턴스입니다. 뒷 페이지에서 다시 설명하겠습니다.
다시 빌드하여 서버에 적용해봅시다.
참조 작성하기
psychic파일은 다음과 같이 작성했습니다.
abilities:
myfirstability:
ability: .myability
myfirstpsychic이 정상적으로 로딩됐습니다.
이제 마인크래프트로 서버에 접속해서 psychics attach <player> myfirstpsychic
명령으로 능력을 적용해봅시다.
왼손을 휘두를때 메시지가 나오는것을 볼 수 있습니다.
psychic에 등록된 listener 는 능력 사용자의 Event만을 수신합니다.
대부분의 Event는 EntityEventManager 에서 Event의 Entity를 자동으로 감지하여 함수를 호출해줍니다.
하지만 Custom Event 혹은 이벤트의 Entity를 EntityEventManager에서 구별할 수 없는 경우 Provider를 적용해야합니다.
@TargetEntity를 Event 수신 함수에 붙여서 사용합니다.
class MyAbility : Ability<AbilityConcept>() {
override fun onEnable() {
psychic.registerEvents(MyAbilityListener())
}
}
class MyAbilityListener : Listener {
@EventHandler
@TargetEntity(KillerProvider::class)
fun onPlayerKill(event: EntityDeathEvent) {
event.drops.add(ItemStack(Material.STONE))
}
// 능력 사용자가 Entity를 죽일때 드랍 아이템에 돌을 추가
}
class KillerProvider : EntityProvider<EntityDeathEvent> {
override fun getFrom(event: EntityDeathEvent): Entity? {
return event.entity.killer
}
}
psychic 에 등록된 listener 는 능력이 비활성화될 경우 자동으로 제거됩니다.