本篇教程由作者设定未经允许禁止转载。

游戏中事件具有很多,可以在这里查看,但大多为英文,所以我再说明一下。

本教程将说明两个例子。

在这里强烈推荐youyihj大佬写的Zen Utils模组,加入后可以热重载游戏事件

例1:只有当玩家经验等级大于等于两级时,才能破坏铁矿石。

导包:挖掘方块事件包,事件取消包,IBlock对象,IPlayer对象

import crafttweaker.event.BlockBreakEvent;
import crafttweaker.event.IEventCancelable;
import crafttweaker.block.IBlock;
import crafttweaker.player.IPlayer;

实例代码:(不要双击关键字,不然会按java格式告诉你全报错了)

events.onBlockBreak(function(event as BlockBreakEvent){   //建立方块破坏事件,用event获取
    var block as IBlock = event.block;  //建立IBlock对象
    var player as IPlayer = event.player;   //建立IPlayer对象
    if(!isNull(block) && block.definition.id == "minecraft:iron_ore"){   //如果方块不为空,并且是铁矿石
        if(player.creative){  
            return;   //创造模式无视限制
        }
        if(player.xp <2){  //经验等级低于2
           event.cancel();  //取消事件(只有部分实现了取消事件的接口,要注意查看)
           event.player.sendStatusMessage(format.red("你至少需要2级才能破坏铁矿石"));  //给予提示
        }
    }
});

例2:只有当玩家经验等级大于等于30级时,才能攻击BOSS(有血条都算)

导包

import crafttweaker.event.PlayerAttackEntityEvent;
import crafttweaker.event.IEventCancelable;
import crafttweaker.entity.IEntity;
import crafttweaker.player.IPlayer;

实现代码:(IPlayer类继承IEntity类)

events.onPlayerAttackEntity(function(event as PlayerAttackEntityEvent){
    var entity as IEntity = event.target;  //建立IEntity对象,这里指的是攻击目标
    var player as IPlayer = event.player;  //建立IPlayer对象,这里指的是攻击玩家
    if(!isNull(entity) && player.creative){
        return ;  //创造模式忽略
    }
    if(!isNull(entity) && entity.dimension!=7 && entity.isBoss){  //判断是否为boss[注1]
        if(player.xp <30){  //判断玩家经验是否小于30
            event.cancel();  //取消事件
            event.player.sendStatusMessage(format.red("你至少需要30级才能攻击"+entity.definition.name));  //给予提示
        }
    }
});

注1:为什么要排除dim=7的所有boss?

这里只是个例子,如果一个boss由多个实体组成(例如:娜迦,九头蛇),当玩家等级不足要求时,如果攻击非能直接造成伤害部位(例如:头部),将会  ERROR:java.lang.NullPointerException

对于这种情况,可以使用print进行分析,得知这些boss对应的部位实体对象的definition为null值,所以把上述代码第7排改成如下这样:

if(!isNull(entity.definition) && entity.isBoss)

这样就可以选中暮色森林的boss了。