イベント

Lepinoidの親切設計とKotlinによりイベントの作成/呼び出しが驚くほどかんたん1になっているので崇め奉って。

イベントを聞く

listenEventを呼び出せばイベントを聞くことができます。

ジェネリクスには聞くイベントのタイプを入れます。

listenEvent<PlayerJoinEvent> { e ->
    // 発火するとここが実行される
    println(e.player)
}

イベントはnet.lepinoid.lepinoid.eventパッケージ内に入っているので色々見てみるといい感じです。

イベントを作成

使いたいイベントないんだが??? 無けりゃ自分で作れ

eventパッケージ内にイベントのクラスを書きましょう。イベントクラスはEventBaseまたはEventBaseCancellableを継承する必要があります。

試しに羊の毛を刈ったときに発火するイベントを作ります。

イベントクラス本体

// net.lepinoid.lepinoid.event.entity.SheepShearEvent.kt
class SheepShearEvent(val player: PlayerEntity, val entity: SheepEntity) : EventBase()

ミックスイン

// net.lepinoid.lepinoid.mixin.SheepEntityMixin.kt
@Mixin(SheepEntity::class)
abstract class SheepEntityMixin {

    @Suppress("CAST_NEVER_SUCCEEDS")
    @Inject(
        method = ["interactMob"],
        at = [At(
            value = "INVOKE",
            target = "Lnet/minecraft/entity/passive/SheepEntity;dropItems()V"
        )],
        cancellable = true
    )
    private fun onShear(player: PlayerEntity, hand: Hand, cir: CallbackInfoReturnable<Boolean>) {
        SheepShearEvent(player, this as SheepEntity).callEvent()
    }
}

これでlistenEvent<SheepShearEvent> { }で作ったイベントを聞くことができるようになりました。

キャンセルできるイベントを作る

上記のイベントは"聞く"ことしかできないのでイベントをキャンセルすることができません。

キャンセル可能にするにはEventBaseの代わりにEventBaseCancellableを継承してミックスインにも手を加える必要があります。

- class SheepShearEvent(val player: PlayerEntity, val entity: SheepEntity) : EventBase()
+ class SheepShearEvent(val player: PlayerEntity, val entity: SheepEntity) : EventBaseCancellable()

callEvent関数はキャンセルされなかったらtrueされたらfalseが帰ってきます。

@Mixin(SheepEntity::class)
abstract class SheepEntityMixin {

    @Suppress("CAST_NEVER_SUCCEEDS")
    @Inject(
        method = ["interactMob"],
        at = [At(
            value = "INVOKE",
            target = "Lnet/minecraft/entity/passive/SheepEntity;dropItems()V"
        )],
        cancellable = true
    )
    private fun onShear(player: PlayerEntity, hand: Hand, cir: CallbackInfoReturnable<Boolean>) {
-        SheepShearEvent(player, this as SheepEntity).callEvent()
+        val event = SheepShearEvent(player, this as SheepEntity)
+        if (!event.callEvent()) {
+            cir.cancel()
+        }
    }
}

参考

1当社比

results matching ""

    No results matching ""