速查表
本页面的目的是供开发者记录有用的函数,以备将来使用。如果您有任何值得分享的 JavaScript 或 Java 代码,请放在这里。
JavaScript:
标签转数组
以下是将物品标签转换为数组的示例,您可以根据需要省略任何部分。
const tag_array = Ingredient.of('#forge:tag').itemIds.toArray().map(String);- .itemIds 这用于访问该材料标签中的物品 ID 列表。结果是一个 Java Set。
- .toArray() 这将列表(一个 Java Set)转换为 JavaScript 数组。
- .map(String) 这将数组中的每个物品 ID 转换为字符串。大多数 js 函数都需要此步骤,但并非全部。
标签减法
以下是在配方中使用数组来生成相同数组(但不包括原始物品)的示例。适用于切石机、染色等。
const tag_array = Ingredient.of('#forge:tag').itemIds.toArray().map(String);
tag_array.forEach(item => {
event.stonecutting(item,
Ingredient.of('#forge:tag').subtract(item)
).id(`tfg:stonecutter/${item.replace(/:/g, "/")}`)
})注意:如果您使用多个输入或多个减法,则必须按以下示例格式编写:
let example = Ingredient.of('#forge:tag').subtract('item:1').subtract('item:2').withCount(8)JavaScript 转 JSON
以下示例用于盔甲纹饰构建器。
materials.forEach(material => {
const trimfilepaths = [
`kubejs/data/minecraft/trim_material/${material.materialName}.json`,
`kubejs/data/tfc/trim_material/${material.materialName}.json`
];
const newtrimdata = {
asset_name: material.materialName,
description: {
color: material.nameColor,
translate: `trim_material.tfc.${material.materialName}`
},
ingredient: material.itemName,
item_model_index: material.indexNumber
};
trimfilepaths.forEach(trimfilepaths => {
const existingData = JsonIO.read(trimfilepaths);
// 仅当文件缺失或内容不同时才写入
if (JSON.stringify(existingData) !== JSON.stringify(newtrimdata)) {
JsonIO.write(trimfilepaths, newtrimdata);
}
});
});- 声明文件路径。(上例中的
trimfilepaths) - 创建一个包含 JSON 信息的常量版本。(上例中的
newtrimdata) - 对每个文件路径,读取其内容,如果缺失则写入新数据。(上例中的
existingData)
打印配方 JSON 到日志
用于查看当前配方 JSON 的编写方式,以便进行编辑。
event.forEachRecipe({ id: string }, (recipe) => {
console.log(recipe.json.toString());
});- 您可以将
{id: string}替换为任何kubejs配方方法;例如{type: string}或{mod: string}。
向已存在的配方添加电路
预制的实用脚本可在以下位置找到:gtceu/utility.js
全局数组在:gtceu/constants.js
您可以通过覆盖其 json 来向 gtceu 添加电路编号,如下所示:
event.findRecipes({ id: string }).forEach(recipe => {
// 获取现有的 "inputs" JsonObject
const inputs = recipe.json.get("inputs");
// 获取当前的 item 数组或创建一个新的
const itemArray = inputs.has("item") ? Java.from(inputs.get("item")) : [];
// 推送电路输入 Json
itemArray.push({
content: {
type: "gtceu:circuit",
configuration: 1
},
chance: 0,
maxChance: 10000,
tierChanceBoost: 0
});
// 将更新后的 item 数组设置回 inputs 中
inputs.add("item", itemArray);
// 将修改后的 inputs 重新应用到配方 JSON 中
recipe.json.add("inputs", inputs);
});您也可以直接覆盖 inputs,这将移除任何其他已存在的输入:
event.findRecipes({ id: string }).forEach(recipe => {
recipe.json.add("inputs",
{
item: [
{
content: {
type: "gtceu:circuit",
configuration: 1
},
chance: 0,
maxChance: 10000,
tierChanceBoost: 0
}
]
}
)
})- 您可以将
{id: string}替换为任何kubejs配方方法;例如{type: string}或{mod: string}。
概率化输入/输出
如何为 gtceu 配方编写概率化输入/输出材料。
.chancedOutput('minecraft:dirt', 100, 0)
.chancedInput('minecraft:dirt', 100, 0)
.chancedFluidInput(Fluid.of('minecraft:water', 100), 1000, 0)
.chancedFluidOutput('minecraft:water 1000', 100, 0)- 第一个数字是几率,1 代表 0.01%,10000 代表 100%
- 第二个数字是每个能量等级的提升量(此功能在 GTm 7.0 中已废弃)
如果您想要不同的几率逻辑,例如 XOR:
const $ChanceLogic = Java.loadClass('com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic')
event.recipes.gtceu.chemical_reactor("test_and")
.itemInputs('1x minecraft:stone')
.chancedItemOutputLogic($ChanceLogic.AND)
.chancedOutput('2x minecraft:dirt', 5000, 100)
.chancedOutput('4x minecraft:dirt', 2500, 600)
.duration(400)
.EUt(25)
event.recipes.gtceu.chemical_reactor("test_xor")
.itemInputs('1x minecraft:stone')
.chancedFluidOutputLogic($ChanceLogic.XOR)
.chancedFluidOutput('gtceu:oxygen 500', 5000, 0)
.chancedFluidOutput('gtceu:fluorine 500', 2500, 0)
.duration(400)
.EUt(25)范围输出:
.itemOutputsRanged('#forge:crushed_ores/bauxite',1,10)Java:
从 Forge 注册表获取粒子类型
为了使用来自其他模组的粒子类型而不使其成为依赖项,您可以使用 ForgeRegistries.PARTICLE_TYPES.getValue()。以下是使用 ae2:lightning_fx 的示例。如果该模组不存在,它将回退到 minecraft:end_rod。
@Override
public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) {
for (int i = 0; i < 4; i++) {
if (level.isClientSide) {
ParticleType<?> pt = ForgeRegistries.PARTICLE_TYPES.getValue(new ResourceLocation("ae2", "lightning_fx"));
if (pt instanceof SimpleParticleType) {
level.addAlwaysVisibleParticle((SimpleParticleType) pt, true,
pos.getX() + 0.5 + (random.nextFloat() - 0.5) * 0.5,
pos.getY() + random.nextDouble(),
pos.getZ() + 0.5 + (random.nextFloat() - 0.5) * 0.5,
0.1, 0.1, 0.1);
} else {
// 使用原版粒子回退
level.addAlwaysVisibleParticle(ParticleTypes.END_ROD, true,
pos.getX() + 0.5,
pos.getY() + 0.5,
pos.getZ() + 0.5,
0.1, 0.1, 0.1);
}
}
}
}Extra Mixins
如果您的 mixin 覆盖了 Minecraft 中的任何内容,或者注入到了一个从 Minecraft 继承的方法中,您的 mixin 需要 remap = true。其他所有情况都应使用 remap = false。
要获取 mixin 的重映射路径,请在 IntelliJ 中右键单击该方法,然后选择 Copy Special > Mixin Target Reference。
高级 Mixin 工具
"Annotating the Mixin class with @Pseudo which allows us to target classes which might not be present at compile time, but are at runtime, for this we use the fully qualified class name to target said class." -Kolja
Wormsignhandlermixin 中有一个很好的例子。由于 mod/maven 可能表现异常,此工具应仅在必要时使用。
调试
您可以使用 ReflectionStringBuilder.toString() 将整个对象转储为字符串。
JSON:
Greate:
阻止自动生成
如果您想为格雷科技机器生成一个配方,但_不_希望 greate 自动生成一个配方(例如,一个您不希望出现在机械压印机中的卷板机配方),请在配方 ID 的末尾加上 _electric_only 或 _manual_only。 (_manual_only 灵感来源于原版 Create,此后缀可以阻止 Create 根据熔炼配方等生成批量高炉配方)
Firmalife
您可以通过右键单击种植盆并手持基岩块来使其瞬间生长。
GregTech
自定义化学式
如果您有一个具有更复杂化学式的自定义材料,但需要告诉格雷科技"它由 X 个氧、Y 个氢、Z 个其他元素组成"以生成分解配方,您可以使用:
material.setFormula("Al2Si2O5(OH)4", true)将化学式工具提示更改为您想要的任何内容!我认为 true 会将数字变为下标。
平衡化学式
格雷科技 Discord 有一个用于检查您的化学式是否平衡的机器人。这里 有一个例子。
对于固体物品,1 摩尔 = 该物品分子中的原子数,所以 1 摩尔的 Al2O3 是 5 个蓝宝石粉。
对于液体物品则相反,1 摩尔 = 1 桶。所以 1 摩尔的 H2O 是一桶水。