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

废话少说,上代码!

import crafttweaker.events.IEventManager;
import crafttweaker.event.PlayerUseHoeEvent; //导入事件包,该“PlayerUseHoeEvent”位于官方英文wiki:Vanilla/Events/Events/PlayerUseHoeEvent;

import crafttweaker.world.IWorld;
import crafttweaker.world.IBlockPos; //该世界包用于获取世界信息,在本文中用于获取玩家位置信息;

//import crafttweaker.item.IIngredient; //无用,仅当需要转换类型时导入

import crafttweaker.entity.IEntity;
import crafttweaker.entity.IEntityDefinition;//该实体包用于定义实体,下文将详细讲述;

import mods.ctutils.utils.Math; //导入数学包,如无概率需求可忽略;

events.onPlayerUseHoe (function (event as crafttweaker.event.PlayerUseHoeEvent) { //事件“当玩家使用锄时”,

    var mobEntity = event.world.getEntities(); //定义合集mobEntity,从世界上获取所有实体,并令该合集表示这个实体集合;请注意:该获取的实体为一个集合;
    var p = event.player.position; //获取玩家所在位置,用于在下文指导生物生成位置;
    var w = event.player.world; //请参见评论区
    var a as IEntityDefinition[] = []; //定义“a”为一个集合,它的类型为“IEntityDefinition”,在“IEntityDefinition”后加上[]表示为该类型的集合;
    var x = Math.random(); //定义“x”为一个从0~1的随机数;如无概率需求可忽略;

    for mobEntityDefinition in mobEntity { //for循环,该mobEntityDefinition为单个实体,如<entity:minecraft:sheep>;mobEntity为上面定义的从世界获取的实体集合;
        if (!isNull(mobEntityDefinition.definition) && mobEntityDefinition.definition.id == <entity:minecraft:sheep>.id) { //该部分判定“实体”是否为指定/目标/特定的实体;
            a += mobEntityDefinition.definition; //如if判定该“实体”属于指定/目标/特定实体,则将其放入前所定义的集合“a”中;
        }
    }

    if (a.length == 0) { //a.length表示获取“a”集合中的“元素”的个数;在这里判定若“元素”个数为0,则继续;
        if (x < 0.1){ //该“x”属于上所定义的随机数,在此为概率判断;x<0.1即10%;如无概率需求可删去;
            if (!event.world.remote) { //该判定保证事件仅在服务器运行,请注意,单人模式如无此判断将生成两只生物,其一为假生物;具体参见:https://crt.imc.wiki/Zen/advanced/event-overview/tips.html
                <entity:minecraft:sheep>.spawnEntity(w, p); //上文已获取玩家所在维度与位置信息,此处直接调用生成即可;
            }
        }
    }
});

好了,相信你已经迫不及待了,快去试试罢


事件(Events)召唤实体——数组与集合、循环与遍历的初步使用-第1张图片



一些碎碎念:

在很多教程中,IEntity和IEntityDefinition两者的差别并未完全指出,借用youyi大佬的话,其实IEntity是一堆生物,IEntityDefinition是一只生物,就是这样......大概


当我们获得了一个“世界上所有实体”的集合时,怎么能判定“我想要的实体”在不在里面呢?

循环。

答案是循环for i in [1,2,3],它会把i“代入”这个集合中的每一个数,在上例中,这意味着我for的一个东西会一个个“代入”集合中的每一个对象,这时候判断,如果(if)“代入”发现相等(==),那么就放入新集合中,这样一来,当for循环一轮后,所有符合条件的对象被选出放入新集合,这也就意味着我们知道该世界上存在多少目标实体了。


对于上方if (!isNull(mobEntityDefinition.definition) && mobEntityDefinition.definition.id == <entity:minecraft:sheep>.id),

首先 isNull() 用于判断括号内的东西是否为空,如果是空的则返回true,返回true则表示if继续下一步判断,而下一步中空的==<entity:minecraft:sheep>.id,显然不合理,于是就会报错空指针(NullPointerException);

所以应返回false才对,于是用!取反,即 !isNull() ,表示如为空则返回false;


&&意为和;

等于号的区别在于:=表示赋值,==表示匹配;




最后感谢youyi大佬的帮助、感谢众多群友的帮助(id太离谱了怎么打都很奇怪啊喂)、感谢B站吕不才大佬的启蒙(从他的魔改小教程学到不少来着(笑))

如有错误欢迎指出~ 如有问题欢迎提出~ (= ̄ω ̄=)