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. 高级运用

穷举与遍历

上一页DataMap下一页自定义函数

最后更新于3年前

这有帮助吗?

是的,你正在用循环做批量魔改。可为什么你可以对一些物品做批量魔改?那是因为这些物品都有相同点。而你需要找到所有你要改的物品,保存在一个数组中,这是穷举。但为什么不换个思路,直接遍历游戏内所有物品,找到符合你需要的条件的物品后,进行合成修改呢?

首先你需要知道的是:

  • 矿辞的结构是"类型+金属名"

  • 可以用contains方法检查一个字符串是否包含某些字

  • 可以用oreDict.get()用字符串呼出一个OD

  • 可以用itemUtils.getItem()用字符串和Meta值(可选,若是32767即为Meta通配符)呼出一个IItemStack

  • 类包含了一个配方的信息,可以用recipes.all()调出游戏内所有ICraftingRecipe的列表

  • 可以用oreDict.entries调出游戏内所有OD的列表

例子一:删除一个物品所参与的所有合成配方

for recipe in recipes.all { // 遍历游戏内所有注册配方
    //用ICraftingRecipe的ingredients1D ZenGetter获取配方的材料,返回IIngredient[]
    if (recipe.ingredients1D has <minecraft:iron_ingot>) {
        recipes.removeByRecipeName(recipe.name);
    }
}

例子二:根据OD对齿轮进行合成修改

import crafttweaker.item.IItemStack;
import crafttweaker.item.IIngredient;
import crafttweaker.oredict.IOreDictEntry;
import crafttweaker.oredict.IOreDict;

for ench in oreDict.entries /* oreDict.entries 在所有注册OD中循环 */ {
    var oreName as string = ench.name;
    var enchGear as IItemStack = ench.firstItem; // 获得OD的第一个物品
    // 进行条件判断,第二个条件是当时魔改时,排除EIO充能合金齿轮等的干扰
    if (oreName.startsWith("gear") && enchGear.definition.owner != "enderio") {
        var key as string = oreName.substring("gear".length); // 获取金属名
        // 获取魔改需要的该金属的其他部件,杆和板
        var stick as IOreDictEntry = oreDict.get("stick" ~ key);
        var plate as IOreDictEntry = oreDict.get("plate" ~ key);
        var ingot as IItemStack = oreDict.get("ingot" ~ key).firstItem;
        // 排除空矿辞,排除木齿轮和石齿轮等的干扰
        if (!stick.empty && !plate.empty) {
            // 经典合成修改
            recipes.remove(enchGear); 
            mods.forestry.Carpenter.addRecipe(enchGear,
            [[stick,plate,stick],
            [plate,<contenttweaker:bushing>,plate],
            [stick,plate,stick]], 6, <liquid:soldering> * 72); 
            mods.immersiveengineering.MetalPress.removeRecipe(enchGear);
            mods.thermalexpansion.Compactor.removeGearRecipe(ingot); 
            mods.tconstruct.Casting.removeTableRecipe(enchGear); 
        }
    }
}

例子三:遍历游戏内所有物品

for mod in loadedMods { //遍历游戏内所有的模组,loadedMods一个全局关键词,包括游戏内所有模组(IMod[string])
    for item in mod.items { //再遍历一个模组的所有物品
        recipes.remove(item); 
        //这只是个例子!要删除游戏内所有物品的配方,用recipes.removeAll();就好了
    }
}
ICraftingRecipe