Skip to content
On this page

事件

在 Katton 中,事件是一种响应游戏中各种操作和变化的强大手段。它们允许你在特定事件发生时执行自定义代码,例如玩家交互、世界更改或实体更新。

要监听事件,你可以使用 Katton 事件 API。你可以在 Fabric API 文档NeoForge API 文档Paper API 文档 中找到生成的事件页面。每个事件都有自己的参数类型,用于提供事件数据、取消语义和可变字段。

简单示例

以下是一个监听 onPlayerJoin 事件并向玩家发送欢迎消息的简单示例。该示例与入门指南中的示例相同。

kotlin
// Necessary imports for the script
import net.minecraft.network.chat.Component
import top.katton.api.ServerPhase
import top.katton.api.ServerScriptEntrypoint
import top.katton.api.event.PlayerArg
import top.katton.api.event.ServerPlayerEvent

// The function with @ServerScriptEntrypoint is the entry point of the script.
@ServerScriptEntrypoint(ServerPhase.READY)
fun main(){
   // Register an event listener for when a player joins the server
   ServerPlayerEvent.onPlayerJoin += onJoin@
   fun(arg: PlayerArg){
      // Get the player who joined and send them a message
      val player = arg.player
      // As same as you would do in a normal mod!
      player.sendSystemMessage(Component.literal("Hello Katton"))
   }
}

每个事件都有自己的一组参数,这些参数提供关于该事件的信息,并允许你与之交互。你可以在API文档中查找每个事件的详细参数。

监听尚未封装的原生事件

如果你需要的 Fabric、NeoForge 或 Paper 事件还没有被 Katton 封装,可以使用 托管事件。托管事件会把监听器注册到平台原生事件总线,同时仍然由 Katton 按脚本包 scope 追踪。WORLDSERVER_CACHE 监听器会在重载或断开清理时移除;GLOBAL 监听器会一直保留,直到手动注销或关闭。

kotlin
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents
import top.katton.api.ServerPhase
import top.katton.api.ServerScriptEntrypoint
import top.katton.api.event.managed.registerFabricEvent

@ServerScriptEntrypoint(ServerPhase.READY)
fun listenFabricTicks() {
    registerFabricEvent(ServerTickEvents.START_SERVER_TICK, ServerTickEvents.StartTick { server ->
        println("Tick ${server.tickCount}")
    })
}
kotlin
import net.neoforged.neoforge.event.entity.living.LivingDamageEvent
import top.katton.api.ServerPhase
import top.katton.api.ServerScriptEntrypoint
import top.katton.api.event.managed.registerEvent

@ServerScriptEntrypoint(ServerPhase.READY)
fun listenNeoForgeDamage() {
    registerEvent<LivingDamageEvent.Pre> { event ->
        println("${event.entity.name.string} is about to take damage")
    }
}
kotlin
import org.bukkit.event.block.BlockExplodeEvent
import top.katton.api.ServerPhase
import top.katton.api.ServerScriptEntrypoint
import top.katton.api.event.managed.registerEvent

@ServerScriptEntrypoint(ServerPhase.READY)
fun listenBukkitExplosions() {
    registerEvent<BlockExplodeEvent>(priority = 4, ignoreCancelled = true) { event ->
        event.blockList().forEach { block ->
            println("Explosion touched ${block.type} at ${block.location}")
        }
    }
}

registerEventregisterFabricEvent 都会返回 handle,只有需要提前手动注销时才需要保存。大多数脚本可以不用保存它,因为 Katton 会在重载时清理托管监听器。

详细事件列表

Fabric、NeoForge 和 Paper 都提供 14 类事件桥接。下方表格展示了三个平台事件支持的主要差异。

事件类型事件名FabricNeoForgePaper
Chunk and BlockonAfterBlockBreak-
onBeforeBlockBreak-
onBlockBreak-
onBlockEntityLoad
onBlockEntityUnload
onBlockPlace-
onCanceledBlockBreak-
onChunkDataLoad-
onChunkDataSave-
onChunkLevelTypeChange
onChunkLoad
onChunkSent-
onChunkUnload
onChunkUnWatch-
onChunkWatch-
onExplosionDetonate
onExplosionStart
Item ComponentonAllowEnchanting
onModifyComponent
onModifyEnchantment
ItemonUse
onUseOn
Living BehavioronAllowBed
onAllowNearbyMonsters
onAllowResettingTime
onAllowSettingSpawn
onAllowSleeping
onAnimalTame-
onBabySpawn-
onElytraAllow
onElytraCustom
onModifySleepingDirection
onModifyWakeUpPosition
onPlayerWakeUp
onSetBedOccupationState
onStartSleeping
onStopSleeping
Living Use ItemonUseItemFinish
onUseItemStart
onUseItemStop
onUseItemTick
Loot TableonLootTableAllLoad
onLootTableModify
onLootTableModifyDrops
onLootTableReplace
PlayeronAttackBlock-
onAttackEntity
onBlockInteract
onDestroyItem
onEntityInteract
onItemInteract
onLeftClickBlock-
onUseItemOn-
onUseWithoutItem-
Server Entity CombatonAfterKilledOtherEntity
onCriticalHit-
onShieldBlock
Server EntityonAfterEntityChangeLevel
onAfterEntityLoad-
onAfterPlayerChangeLevel
onEndermanAnger
onEntityLoad-
onEntityTeleport-
onEntityUnload
onEquipmentChange
ServeronAfterSave
onBeforeSave
onEndDatapackReload
onEndServerTick
onEndWorldTick
onLevelLoad-
onLevelSave-
onLevelUnload-
onServerStarted
onServerStarting
onServerStopped
onServerStopping
onStartDatapackReload
onStartServerTick
onStartWorldTick
onSyncDatapackContents
Server Living EntityonAfterDamage
onAfterDeath
onAllowDamage
onAllowDeath
onLivingDrops--
onLivingFall
onLivingHurt
onLivingJump-
onMobConversion
Server MessageonAllowChatMessage-
onAllowCommandMessage-
onAllowGameMessage-
onChatMessage-
onCommandMessage-
onGameMessage-
onServerChat-
Server Mob EffectonAfterAdd-
onAfterRemove-
onAllowAdd-
onAllowEarlyRemove-
onBeforeAdd-
onBeforeRemove-
onMobEffectAdd-
onMobEffectApplicable-
onMobEffectExpire-
onMobEffectRemove-
Server PlayeronAfterPlayerRespawn
onItemPickupPost--
onItemPickupPre--
onItemToss--
onPickFromBlock
onPickFromEntity
onPlayerCopy
onPlayerItemCrafted--
onPlayerItemSmelted--
onPlayerJoin
onPlayerLeave
onPlayerLoadFromFile--
onPlayerPickupXp
onPlayerSaveToFile--
onPlayerSpawnPhantoms--
onPlayerXpChange
onPlayerXpLevelChange
onStartTracking--
onStopTracking--