본문으로 건너뛰기
버전: v1

Entity Events

엔티티별 이벤트 등록 시스템

Manager

이벤트 등록을 위한 매니저

val manager = EntityEventManager(plugin: Plugin)

리스너 등록

entity(이하 등록 엔티티)가 이벤트를 작동(trigger)시켰을때 실행되는 리스너를 등록합니다.

manager.registerEvents(entity: Entity, listener: Listener)

EntityProvider

한 이벤트에는 관련된 엔티티가 2개가 있을 수 있는데, 이 경우에는 누가 작동시켰는지 말하기 애매합니다. 따라서 이 경우에는 등록 엔티티를 직접 설정해야합니다. 몇은 EntityProvider에 기본적으로 지원되나 그렇지 않은 경우도 있습니다. Tap은 EntityProvider이라는 API를 제공해 다음과 같이 직접 추가하실 수 있습니다.

/**
* 엔티티가 2개인 대표적인 예시로 EntityDamageByEntityEvent가 있다.
* 아래 코드는 Damagee(데미지를 입은 자)를 등록 엔티티로 설정해주는 기능을 갖는다.
*/
class Damagee: EntityProvider<EntityDamageByEntityEvent> {
override fun getFrom(event: EntityDamageByEntityEvent): Entity {
// 등록 엔티티로 설정할 엔티티를 반환
return event.entity
}
}

TargetEntity

위에서 설정한 EntityProvider을 등록해줍니다. DefaultProvider에 존재하는 경우에는 사용하지 않아도 됩니다

@TargetEntity(KClass<out EntityProvider<*>>)

사용법

import io.github.monun.tap.event.EntityProvider

class MyListener: Listener {
/**
* EntityDamageByEntityEvent 중 등록 엔티티가 Damager인 경우 실행됨, 다른말로 등록 엔티티가 다른 엔티티를 공격한 경우 실행됨.
*/
@EventHandler
@TargetEntity(EntityProvider.EntityDamageByEntity.Damager::class)
fun onPlayerInteract(e: EntityDamageByEntityEvent) {
println(e.damager)
}
}

사용 예시

package io.github.xxx.plugin

import io.github.monun.tap.event.EntityProvider
import io.github.monun.tap.event.EntityEventManager
...

class InteractingPlayer: EntityProvider<PlayerInteractEvent> {
override fun getFrom(event: PlayerInteractEvent): Entity {
return event.player
}
}

class Plugin: JavaPlugin() {
override fun onEnable() {
val manager = EntityEventManager(this)

kommand {
register("minigame") {
requires { isPlayer }
then("register") {
executes {
manager.registerEvents(player, object: Listener {
var validHits = 0
var totalHits = 0

val meleeAccuracy: Double
get() {
if (totalHits == 0) return 0.0
return validHits.toDouble() / totalHits
}

@EventHandler
@TargetEntity(InteractingPlayer::class)
fun onPlayerInteract(e: PlayerInteractEvent) {
totalHits++
}

@EventHandler
@TargetEntity(EntityProvider.EntityDamageByEntity.Damager::class)
fun onDoDamage(e: EntityDamageByEntityEvent) {
validHits++

// 데미지의 10% 돌려받기
(e.damager as LivingEntity).damage(e.damage * 0.1) // e.damager은 등록 엔티티이므로 플레이어임이 보장된다
}
})
}
}
}
}
}
}