Event - noonmaru/psychics GitHub Wiki

이 페이지는 Ability에서 Event를 수신하는 방법에 대해서 다룹니다.

개요

Bukkit plugin을 다뤄보신분들은 Event listener의 개념을 알고계실겁니다.

Event listener는 특정 사건이 발생할 때 (블록 설치, 블록 파괴, 플레이어 접속 등) 해당 정보를 수신하여 처리합니다.

Psychics에서도 이와 비슷한 기능을 제공합니다.

Tap의 EntityEventManager 클래스를 활용하여 능력 사용자의 Event를 수신 할 수 있습니다.

Listener 클래스 제작하기

Hello Ability!에서 만든 Ability 클래스를 열어서 Listener를 만들어보세요.

Bukkit의 Listener제작 방법과 동일합니다.

class MyAbilityListener : Listener {
    @EventHandler
    fun onPlayerInteract(event: PlayerInteractEvent) {
        if (event.action == Action.LEFT_CLICK_AIR) {
            event.player.sendMessage("능력 사용자가 왼손을 휘둘렀다.")
        }
    }
}

Listener 등록하기

MyAbilityListener 를 제작 후 등록해야 Event를 수신받을 수 있습니다.

Ability 클래스에서 onEnable함수를 Override하고 psychic에 registerEvents 함수로 MyAbilityListener 전달하세요.

ps. psychic은 Ability 인스턴스를 소유하고있는 Psychic 인스턴스입니다. 뒷 페이지에서 다시 설명하겠습니다.

Test

다시 빌드하여 서버에 적용해봅시다.

참조 작성하기

psychic파일은 다음과 같이 작성했습니다.

myfirstpsychic.yml

abilities:
  myfirstability:
    ability: .myability

myfirstpsychic이 정상적으로 로딩됐습니다.

이제 마인크래프트로 서버에 접속해서 psychics attach <player> myfirstpsychic 명령으로 능력을 적용해봅시다.

왼손을 휘두를때 메시지가 나오는것을 볼 수 있습니다.

Provider

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

Tip

psychic 에 등록된 listener 는 능력이 비활성화될 경우 자동으로 제거됩니다.

⚠️ **GitHub.com Fallback** ⚠️