Zentutorial
  • 首页
  • Zenscript
  • 简单运用
    • 局部变量
    • 尖括号调用
    • 工作台合成
      • 添加配方
      • 移除配方
      • Metadata
      • NBT
    • 熔炉配方
    • 矿物词典(Ore Dictionaries)
    • 物品名称修改
    • tooltips
      • 样式代码
    • 物品条件
    • 物品转换器
    • 掉落物
      • 打草掉落物
      • 生物掉落物
      • Dropt - 导言
        • Dropt - 方法速查
        • Dropt - 使用示例
    • 战利品表 : 导论
      • 战利品表修改(LootTableTweaker)
      • 战利品表修改(LootTweaker-基础)
    • 循环语句(foreach循环) / 普通数组
  • 高级运用
    • 概论
      • 基本类
      • ZenGetter
      • ZenSetter
      • ZenMethod(方法)
    • 常见错误
    • 基本运算
    • 数组与集合
    • 循环与遍历
    • 全局函数
    • Math包
    • if
    • in/has 操作符
    • 战利品表修改(LootTweaker-进阶)
    • 三元操作符
    • 预处理器
    • 全局和静态变量
    • 跨脚本引用
    • 关联数组(映射)
    • IItemStack类型的重新认识
    • IIngredient接口
    • IItemDefinition & IBlockDefinition
    • IData 类型
      • DataMap
    • 穷举与遍历
    • 自定义函数
    • 配方函数与配方事件
      • 配方函数
      • 配方事件
    • 事件概论
      • 一些忠告
    • ZenClass
  • ContentTweaker
    • ContentTweaker
    • 指令
    • 原版加工厂
      • 概论
      • 物品
      • 方块
      • 流体
      • 创造标签
      • 食物
    • 材料系统
      • 基础用法
        • 材料
        • 部件
        • 注册材料部件
        • 材料部件信息
      • 高级运用
        • 自定义部件类型
        • 注册自定义部件
        • 自定义材料部件信息
    • 高级运用
    • 更多鸡联动
    • 匠魂联动
      • 材料引导
        • 材料
        • 构建材料
      • 特性引导
        • 特性
        • 构建特性
        • 特性数据
      • 高级运用
  • 实战
    • 配方
      • 数据驱动合成修改
    • 事件
      • 修改方块掉落物
      • 禁止开创造
由 GitBook 提供支持
在本页
  • 具体游戏逻辑
  • 取消事件
  • 后记

这有帮助吗?

  1. 高级运用

事件概论

Yep,你真的以为魔改仅仅只是个改合成的东西吗?它也可以参与mod制作!上文的一堆Getter,可能你会觉得一点用都没有,但在这里将会大量用到。

什么是事件?某个时间点上发生一件值得关注的事。你可以使用 CrT 在一件事发生时,额外执行别的行为。

// onPlayerCrafted 当玩家合成时
events.onPlayerCrafted(function(event){
    // ...
});

在匿名函数内部可以编写你想要的行为,这个函数内部的代码将在玩家合成时才会执行,而不像一般配方修改的脚本那样在游戏加载时执行。

// onPlayerCrafted 当玩家合成时
events.onPlayerCrafted(function(event){
    print("A player crafted something.");
});

比如这样,在玩家合成时,在日志打印信息。

具体游戏逻辑

不对啊,只是在日志打印个消息有啥用。我们需要在游戏有一个具体行为才行啊。我们便需要利用这个匿名函数的 event 参数,当这个事件发生时,这个函数执行时会传入这个参数,这个参数包含了这个事件发生的背景。简单来说,可以利用 event 参数的 ZenGetter 获取各种游戏对象,比如玩家、坐标、世界、方块等等,通过操作这些游戏对象,你就可以在合理的时机做你想要的新的游戏逻辑,限制你的只有想象力而已。

例如下面的例子,每次玩家合成时受到 1 点伤害。

import crafttweaker.event.PlayerCraftedEvent; //导入玩家合成事件的类

// onPlayerCrafted 当玩家合成时
// 由于 ZenScript 的限制,在这里你需要给 event 指定对应的事件类,否则你无法获取事件包含的信息
// 这里就是 PlayerCraftedEvent 玩家合成事件,记得在脚本最前面导入该类
events.onPlayerCrafted(function(event as PlayerCraftedEvent) {
    // 获取是哪个玩家合成了物品
    var player = event.player;
    // 让玩家受到 1 点魔法伤害
    player.attackEntityFrom(<damageSource:MAGIC>, 1.0f);
});

取消事件

有的时候你希望一些原版行为不会发生,你可以使用 cancel 方法取消事件来阻止原版行为。

下面的例子为阻止苦力怕的生成。

import crafttweaker.event.EntityJoinWorldEvent; //导入实体进入世界事件

// onPlayerCrafted 当玩家合成时
// 由于 ZenScript 的限制,在这里你必须要给 event 参数指定对应的事件类,否则你无法获取事件包含的信息
// 这里就是 PlayerCraftedEvent 玩家合成事件,记得在脚本最前面导入该类
events.onEntityJoinWorld(function(event as EntityJoinWorldEvent) {
    // 获取将被加入的实体的定义
    val definition = event.entity.definition;
    // 如果该实体为玩家,definition 会返回 null,需要先进行判空
    // 然后再判断这个实体的 ID 是否是苦力怕
    if (!isNull(definition) && definition.id == "minecraft:creeper") {
        // 取消该事件
        // 取消实体加入世界的结果自然是阻止实体加入世界
        event.cancel();
    }
});

后记

本教程不可能列出所有可用的事件,以及所有游戏对象和可供使用的操作。你依旧需要官方 wiki 作为「工具书」来查找。

常用游戏对象:

上一页配方事件下一页一些忠告

最后更新于1年前

这有帮助吗?

:指定玩家,包含玩家的各种信息。IPlayer继承 类

:指定一个Mob 继承 类

:指定一个实体

:包含世界中的一个维度的信息,包含天气效果、方块信息、服务端客户端等信息。可以用来在世界中召唤一个实体

:指定世界中一个坐标,常用这个获取或更改一个IWorld的指定坐标的IBlockState

:指令发送者,如果想用 zs 发送指令需要用这个,但也要注意权限,推荐用直接用 server 关键词,表示服务器发送指令

:方块

:方块状态,真正在世界里的方块,包含方块定义和当前的状态,比如草方块是否被雪覆盖,炼药锅装了多少水。

可用事件列表
IPlayer
IEntityLivingBase
IEntityLivingBase
IEntity
IEntity
IWorld
IBlockPos
ICommandSender
IBlock
IBlockState