LTDV10/packet/kubejs/server_scripts/mbd2/assembly_line.js
2026-04-14 18:20:56 +08:00

141 lines
6.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const $FluidIngredient = Java.loadClass("com.lowdragmc.mbd2.api.recipe.ingredient.FluidIngredient")
const $SizedIngredient = Java.loadClass("com.lowdragmc.mbd2.api.recipe.ingredient.SizedIngredient")
const $mbdFluidStack = Java.loadClass("com.lowdragmc.lowdraglib.side.fluid.FluidStack")
const $ItemApplicationRecipe = Java.loadClass("com.simibubi.create.content.kinetics.deployer.ItemApplicationRecipe")
MBDMachineEvents.onBeforeRecipeWorking("createdelight:assembly_line", e => {
let event = e.event
const { machine, recipe } = event
/** @type {Internal.MBDMultiblockMachine} */
let multiblock = machine
let conlist = []
let parts = multiblock.getParts()
let fluidIndex = 0
let itemIndex = 4
//content为先流体再物品
let input = recipe.inputs.values().toArray()
input[0].forEach(content => {
/** @type {com.lowdragmc.mbd2.api.recipe.ingredient.FluidIngredient} */
let fContent = content.getContent()
/**@type {Internal.MBDPartMachine} */
let part = multiblock.parts.get(fluidIndex)
let fluid = part.getCapability(ForgeCapabilities.FLUID_HANDLER).orElse(null).getFluidInTank(0)
if (!(fContent.values[0].getStacks()[0].isSame(fluid.fluid) && fContent.amount == fluid.amount)) {
event.setCanceled(true)
}
fluidIndex++
})
input[1].forEach(content => {
/** @type {Internal.SizedIngredient} */
let sContent = content.getContent()
/**@type {Internal.MBDPartMachine} */
let part = multiblock.parts.get(itemIndex)
let item = part.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null).getStackInSlot(0)
if (!(sContent.first.count == item.count && sContent.first.is(item.item))) {
event.setCanceled(true)
}
itemIndex++
})
})
MBDMachineEvents.onStructureFormed("createdelight:assembly_line", e => {
let event = e.event
/**
* @type {Internal.MBDMultiblockMachine}
*/
let multiblock = event.machine
let axisDirection = multiblock.frontFacing.get().axisDirection.opposite().ordinal()
let axis = multiblock.frontFacing.get().axis
multiblock.parts.sort((/**@type {Internal.MBDPartMachine} */ a, /**@type {Internal.MBDPartMachine} */ b) => {
let posA = a.pos
let posB = b.pos
let itemA = a.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null)
let itemB = b.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null)
// 没有物品 capability 的优先排前
if (itemA === null && itemB !== null) return -1
if (itemA !== null && itemB === null) return 1
// 根据机器的朝向轴来反向排序
switch (axis) {
case "x":
return (posB.x - posA.x) * (axisDirection === 1 ? 1 : -1)
case "y":
return (posB.y - posA.y) * (axisDirection === 1 ? 1 : -1)
case "z":
return (posB.z - posA.z) * (axisDirection === 1 ? 1 : -1)
default:
return 0
}
})
})
MBDRecipeTypeEvents.onTransferProxyRecipe("createdelight:assembly_line", e => {
let event = e.event;
const { recipeType, proxyTypeId, proxyType, proxyRecipeId, proxyRecipe } = event;
if (proxyTypeId.toString() === "create:sequenced_assembly") {
let changed = false
/**@type {Internal.SequencedAssemblyRecipe} */
let proxySequencedAssemblyRecipe = proxyRecipe
/**@type {Internal.MBDRecipeSchema$MBDRecipeJS} */
let resRecipe = recipeType.recipeBuilder() // same as create recipe via kjs event
resRecipe.inputItems(Ingredient.of(proxySequencedAssemblyRecipe.getIngredient(), 64 / proxySequencedAssemblyRecipe.loops))
// console.log(proxyRecipeId)
if (proxySequencedAssemblyRecipe.sequence.size() > 1)
proxySequencedAssemblyRecipe.sequence.forEach(recipe => {
let pRecipe = recipe.getRecipe()
let ingr = pRecipe.ingredients
let fluidIngr = pRecipe.fluidIngredients
// console.log("ingr:")
// if (ingr != null)
// ingr.forEach(ingr => {
// console.log(ingr.getFirst())
// })
// console.log("fluidIngr:")
// console.log(fluidIngr)
// if (fluidIngr != null && !fluidIngr.empty) {
// console.log(fluidIngr.get(0))
// console.log(fluidIngr.get(0).getMatchingFluidStacks())
// }
if (!fluidIngr.empty) {
let fluids = fluidIngr.get(0).getMatchingFluidStacks().map(fluid => {
let resAmount = fluid.amount * 64 / proxySequencedAssemblyRecipe.loops
if (proxySequencedAssemblyRecipe.loops != 1 && 64 % proxySequencedAssemblyRecipe.loops != 0)
resAmount = parseInt(resAmount / 50) * 50
return Fluid.of(fluid.fluid, resAmount)
})
resRecipe.inputFluids([fluids])
changed = true
}
if (ingr.size() == 2) {
if (pRecipe instanceof $ItemApplicationRecipe) {
/**@type {Internal.ItemApplicationRecipe} */
let appRecipe = pRecipe
if (appRecipe.shouldKeepHeldItem())
resRecipe.chance(0, builder =>
builder.inputItems(Ingredient.of(ingr.get(1), 1)))
else
resRecipe.inputItems(Ingredient.of(ingr.get(1), 64))
}
else
resRecipe.inputItems(Ingredient.of(ingr.get(1), 64))
changed = true
}
})
resRecipe
.duration(parseInt(Math.sqrt(proxySequencedAssemblyRecipe.loops) * 100))
.outputItems(Item.of(proxySequencedAssemblyRecipe.getResultItem(null), 64 / proxySequencedAssemblyRecipe.loops * proxySequencedAssemblyRecipe.getResultItem(null).count))
.id(proxyRecipeId + "_mbd2")
// console.log("changed:" + changed)
if (changed)
event.mbdRecipe = resRecipe.buildMBDRecipe()
else
event.mbdRecipe = null
// console.log("on finish")
}
})