介绍
仅此一物
Only One Item 是一款适用于 Minecraft 1.12.2 的模组,可通过将等效物品和流体堆叠重定向至共同目标,减少整合包中的重复物品和流体。运行时需要 MixinBooter >= 8.0。
本项目的灵感来自 OneEnoughItem。它不是分支,也未使用该项目的代码。它与 UniDict 的用途有重叠,但采用独立实现。
英文
项目
Only One Item 是一款独立的 Minecraft 1.12.2 模组,用于在整合包中统一等效物品和流体。它会将创建、复制或修改后的物品堆叠重定向至已配置的目标,运行时需要 MixinBooter >= 8.0。
本项目的灵感来自 OneEnoughItem,但既不是其分支,也不是其代码衍生作品。它是 UniDict 的独立替代方案。
配置
三个文件分别是 config/ooi/ooi_item.json、config/ooi/ooi_fluid.json 和 config/ooi/ooi_item_black_list.json。物品文件接受物品 ID/元数据和矿辞匹配来源,流体文件用于映射流体名称,黑名单则接受 Item、ModID 和 OreDict 条目。请参阅 JSON 示例。
最终生效的 JSON 和 CRT 配置会写回这三个文件。注释和原有格式不会保留,因此请在编辑前备份文件。无效目标将被忽略并记录在日志中。
CraftTweaker 主要用于生成或补全这三个 JSON 文件,有效的已注册条目会写入 JSON。首次添加或修改 CRT 脚本后启动游戏时,替换结果可能不完整或不准确。请在启动后检查生成的 JSON,并重启游戏或服务器。确认 JSON 无误后,之后启动时可直接使用 JSON,无需保留 CRT 脚本。
CraftTweaker
当前 API 包括 mods.ooi.ConversionItem(create(IItemStack)、addMatchItem(...) 的多个重载,以及 register())、mods.ooi.ConversionFluid(create(ILiquidStack)、addMatchFluid(...) 的多个重载,以及 register())和 mods.ooi.BlackList(用于物品、矿辞条目、模组 ID 和可变参数的 addMatchItem(...) 重载)。请参阅 通用 ZenScript 示例。请先添加匹配来源,再调用 register();黑名单条目可以直接添加。CRT 主要用于生成或补全 JSON 配置,有效的注册内容会保存到其中。
配方
矿辞条目可以用作物品匹配来源。Only One Item 会分析重复的工作站配方,并在符合其合并规则时将其合并;它不会无条件合并所有物品或流体配方。如果已加载 UniDict,Only One Item 会跳过自身的工作站配方清理。
项目定位
Only One Item 在物品或流体堆叠创建、复制和修改时应用映射,让功能重复但注册名不同的内容可以使用统一目标。它适合用于减少整合包中的重复物品、流体和由此产生的配方碎片。
本项目受到 OneEnoughItem 启发,但不是其分支,也没有使用其代码。本项目可以作为 UniDict 的独立替代方案。
配置文件
配置目录是 config/ooi,包含以下三个文件:
ooi_item.json:物品和矿辞匹配来源到目标物品的映射。ooi_fluid.json:流体匹配来源到目标流体的映射。ooi_item_black_list.json:不参与物品替换的物品、模组或矿辞。
ooi_item.json
[
{
"matchItems": [
{
"id": "minecraft:gold_ingot",
"meta": 0
},
{
"oreName": "ingotGold"
}
],
"targetID": "minecraft:gold_ingot",
"targetMeta": 0
}
]
matchItems 可以包含具体物品(id + meta)或矿辞(oreName)。上例把 minecraft:gold_ingot:0 和 ingotGold 枚举出的来源指向 minecraft:gold_ingot:0;目标相同时只是语法示例。
ooi_fluid.json
[
{
"matchFluids": [
"water",
"some_mod:water"
],
"targetID": "water"
}
]
matchFluids 和 targetID 使用流体注册表名称;最终阶段会检查目标流体是否存在,不存在的目标映射会被丢弃。
ooi_item_black_list.json
[
{
"type": "Item",
"name": "minecraft:gold_ingot",
"meta": 0
},
{
"type": "ModID",
"name": "minecraft"
},
{
"type": "OreDict",
"name": "ingotGold"
}
]
Item 按物品 ID 和 meta 排除,ModID 按模组 ID 排除,OreDict 按矿辞名称排除。黑名单会阻止匹配到的物品或矿辞参与统一。
注意事项
最终有效配置会写回 config/ooi/ooi_item.json、config/ooi/ooi_fluid.json 和 config/ooi/ooi_item_black_list.json。文件会被规范化覆盖,手工注释和原始排版不会保留,编辑前请备份。无效目标会被忽略并记录日志。
CRT 在本模组中主要用于生成或补全这三份 JSON 配置,脚本注册的有效条目会写入 JSON。首次加入或修改 CRT 脚本的那次启动,运行中的替换结果可能不完整或不准确;启动完成后请检查生成的 JSON 并重启游戏或服务端。确认 JSON 无误后,后续启动以 JSON 为准,不要求继续保留 CRT 脚本。
CraftTweaker 前置库
当前 ZenScript 类名和方法如下:
mods.ooi.ConversionItem:create(IItemStack)、addMatchItem(IItemStack)、addMatchItem(IOreDictEntry)、addMatchItem(Object...)、register()。mods.ooi.ConversionFluid:create(ILiquidStack)、addMatchFluid(String)、addMatchFluid(ILiquidStack)、addMatchFluid(Object...)、register()。mods.ooi.BlackList:addMatchItem(IItemStack)、addMatchItem(IOreDictEntry)、addMatchItem(String)、addMatchItem(Object...)。
ConversionItem 和 ConversionFluid 先用 addMatch... 添加来源,再调用 register() 提交目标;BlackList.addMatchItem(...) 可直接添加黑名单项。
以下脚本可用于批量生成上述 JSON;首次运行请先阅读注意事项。
import mods.ooi.ConversionItem;
import mods.ooi.ConversionFluid;
import mods.ooi.BlackList;
BlackList.addMatchItem("chisel");
static modid as string[] = [
"minecraft",
"thermalfoundation",
"enderio",
"tconstruct",
"ic2",
"mekanism",
"taiga"
];
function getODItem(od as IOreDictEntry) as IItemStack {
if (isNull(od.firstItem)) return <minecraft:stone>;
var selected as IItemStack = null;
for i in 0 to modid.length {
for item in od.items {
if (item.definition.owner == modid[i]) {
selected = item;
break;
}
}
if (!isNull(selected)) break;
}
return isNull(selected) ? od.firstItem : selected;
}
if (!(<ore:itemSilicon>.empty)) {
ConversionItem.create(getODItem(<ore:itemSilicon>))
.addMatchItem(<ore:itemSilicon>)
.register();
}
for od in oreDict.entries {
var odName = od.name;
if (odName.startsWith("ore")
|| odName.startsWith("dust")
|| odName.startsWith("ingot")
|| odName.startsWith("gem")
|| odName.startsWith("nugget")
|| odName.startsWith("plate")
|| odName.startsWith("gear")
|| odName.startsWith("stick")
) {
ConversionItem.create(getODItem(od))
.addMatchItem(od)
.register();
if (odName.startsWith("gem")) {
val od0 = oreDict.get("block" + odName.substring("gem".length));
if (!od0.empty) {
ConversionItem.create(getODItem(od0))
.addMatchItem(od0)
.register();
}
} else if (odName.startsWith("ingot")) {
val od0 = oreDict.get("block" + odName.substring("ingot".length));
if (!od0.empty) {
ConversionItem.create(getODItem(od0))
.addMatchItem(od0)
.register();
}
}
}
}
复杂的批量规则可以使用同一套 API 编写循环或函数。替换某些模组物品可能改变其配方或机器行为,请在目标整合包中验证。
配方处理
Only One Item 会分析工作台中的重复配方,并在满足条件时重建合并后的配方。它并非无条件地直接合并所有物品和流体配方。
如果检测到 UniDict 已加载,Only One Item 会跳过自身对工作台重复配方的处理,以避免重复处理。
常见问题
OnlyOneItem 支持哪些 Minecraft 版本?
OnlyOneItem 支持 Minecraft Java 版 1.12.2,可用的加载器:Forge。下载时注意选择和你游戏版本一致的文件。
OnlyOneItem 怎么安装?
先用 PCL2 或 HMCL 启动器安装对应版本的 Forge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。
Circulate233 的其他作品
查看全部 →AE2UEL Wireless Universal Terminal
AE2UEL的更好的无线通用终端
RandomComplement
可随心修复、补充与创造。
AE2FluidCraft-Rework-Unofficial
更现代的AE2FC
Better Meteorite
改进 AE2 陨石生成
评论
登录后评论和评分