- 版权类型
- 原创
- 版权链接
- #
- 语言支持
- English
- 模组加载器
- Fabric
- NeoForge
- 前置组件
- (Fabric侧)Fabric API: https://modrinth.com/mod/fabric-api
- 适配版本(Java)
- 1.21
什么是 Katton?
Katton 是一个强大的 Minecraft 模组开发框架,允许你使用 Kotlin 脚本创建和修改游戏内容。借助热重载脚本,你可以实时查看更改,无需重启游戏。Katton 同时支持 Fabric 和 NeoForge。我们会尽可能保持 API 在两者之间保持一致,但是仍然可能会存在一些些的差别。
基于 26.1 以后 Minecraft 代码混淆的取消,Kotlin脚本现在可以非常简单的直接访问 Minecraft 的类。对于26.1之前的版本,虽然理论上可以做到相同的功能,但是暂时没有解决反混淆和混淆的方案(你也不希望你的脚本里面的类名全是abc叭233)
为什么选择 Katton?
- 易用:Katton 直观的 API 和热重载功能让各水平的模组开发者都能快速创建和测试他们的脚本。
- 灵活:借助 Kotlin 的强大功能,你可以创建与 Minecraft 交互的复杂脚本。
- 高性能:Katton 使用 Kotlin 脚本在 Minecraft 运行时直接与 Java 对象交互,确保高性能和无缝集成。
- 强大的 API:Katton 提供了全面的 API,允许你访问和修改游戏的各个方面,从方块和物品到实体和世界生成,甚至包括类似 Mixin 的代码注入,并且全部支持热重载。
- 数据包开发者友好:Katton在保留数据包热重载优势的同时,实现堪比模组的强大功能。Katton提供了一系列的函数,封装了原版命令的所有功能。即使你对 Fabric 模组开发一无所知,你仍然可以使用这些函数实现至少你能在数据包中能做到的一切。
一个简单的展示用例喵,实现了一个爆炸箭:
代码:
//不——为什么代码高亮不支持 kotlin
fun main() {
// 当实体加载时执行
ServerEntityEvent.onAfterEntityLoad += load@
fun(arg: EntityLoadArg) {
val (entity, _) = arg
if (entity !is Arrow) return
// 如果玩家射出一支箭,检查手持弓的数据
val owner = entity.owner
if (owner is ServerPlayer) {
onArrowShot(owner, entity)
}
}
// 每 tick 执行
onStartServerTick += tick@
fun(_) {
// 检查 TNT 箭是否击中地面并使其爆炸
processTNTArrow()
}
}
// 一个集合,暂存了所有被标记为 TNT 箭的箭实体
val tntArrow = HashSet<Arrow>()
fun onArrowShot(player: ServerPlayer, arrow: Arrow) {
tell(player, Component.empty() + "你手中的武器是: " + player[Weapon.MainHand]?.itemName)
// 这支箭是由 TNT 弓射出的,将会在击中地面后爆炸
if (player.mainHandItem.nbt["tnt"](false)) {
tntArrow.add(arrow)
}
}
fun processTNTArrow() {
val iterator = tntArrow.iterator()
while (iterator.hasNext()) {
val arrow = iterator.next()
// 通过检查 NBT 数据来检查箭是否击中地面
if (getEntityNbt(arrow).getBooleanOr("inGround", false)) {
// 让箭爆炸
// 这个方法来自原版代码
arrow.level().explode(
arrow,
arrow.damageSources().explosion(arrow, arrow.owner),
null,
arrow.position(),
16.0f,
false,
Level.ExplosionInteraction.TNT
)
iterator.remove()
// 爆炸后移除箭实体
arrow.kill(arrow.level() as ServerLevel)
}
}
}