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

120 lines
4.5 KiB
JavaScript

const $IMultiPart = Java.loadClass('com.lowdragmc.mbd2.api.machine.IMultiPart');
const $BlockStateProperties = Java.loadClass('net.minecraft.world.level.block.state.properties.BlockStateProperties')
//自动化逻辑
//初始化customData
MBDMachineEvents.onPlaced("createdelight:fission_reactor_controller", e => {
const { machine } = e.event
if (!machine.customData.getInt("state")) {
machine.customData.putInt("state", 0)
}
if (!machine.customData.getInt("last_signal")) {
let facing = machine.level.getBlockState(machine.pos).getValue($BlockStateProperties.HORIZONTAL_FACING)
let blockPos = machine.pos.relative(facing)
let blcokState = machine.level.getBlockState(blockPos)
machine.customData.putInt("last_signal", blcokState.getSignal(machine.level, blockPos, facing))
}
})
//UI实现
MBDMachineEvents.onUI("createdelight:fission_reactor_controller", e => {
const { machine, root } = e.event
/**@type {SwitchWidget} */
let button_0 = root.getFirstWidgetById("off")
/**@type {SwitchWidget} */
let button_1 = root.getFirstWidgetById("on")
/**@type {SwitchWidget} */
let button_2 = root.getFirstWidgetById("high_temp")
/**@type {SwitchWidget} */
let button_3 = root.getFirstWidgetById("output_fluid_choke")
/**@type {SwitchWidget} */
let button_4 = root.getFirstWidgetById("output_energy_choke")
/**@type {SwitchWidget} */
let button_5 = root.getFirstWidgetById("lack_of_fuel")
const buttons = [button_0, button_1, button_2, button_3, button_4, button_5]
let state = machine.customData.getInt("state")
buttons[state].setPressed(true)
let buttons_rs = buttons.filter(btn => btn != buttons[state])
buttons_rs.forEach(btn_rs => {
btn_rs.setPressed(false)
})
buttons.forEach((btn) => {
btn.setOnPressCallback(p => {
if (!p.isRemote) {
if (btn.pressed) {
buttons.forEach(b => b.setPressed(false))
machine.customData.putInt("state", buttons.indexOf(btn))
}
if (!btn.pressed) {
btn.setPressed(true)
}
}
return
})
})
})
MBDMachineEvents.onTick("createdelight:fission_reactor_controller", e => {
const {machine} = e.event
if (machine.level.time % 3 != 0) return
let state = machine.customData.getInt("state")
if(machine.getMachineStateName() == "base" || state == 0) {
ReactorUtil.outputSignal(machine, 0)
return
}
/**
* @type {Internal.MBDMultiblockMachine}
*/
let controller = e.event.machine.controllers.get(0)
switch(state) {
case 1 : {
ReactorUtil.outputSignal(machine, 0)
let facing = machine.level.getBlockState(machine.pos).getValue($BlockStateProperties.HORIZONTAL_FACING)
let blockPos = machine.pos.relative(facing)
let blockState = machine.level.getBlockState(blockPos)
let currentSignal = blockState.getSignal(machine.level, blockPos, facing)
let lastSignal = machine.customData.getInt("last_signal")
// T 触发:仅在上升沿(0 -> >0)时切换一次
if (currentSignal > 0 && lastSignal == 0) {
let br = controller.customData.getDouble("burning_rate")
controller.customData.putDouble("burning_rate", br == 0 ? 1 : 0)
}
// 记录本次信号用于下一 Tick 边沿检测
machine.customData.putInt("last_signal", currentSignal)
break
}
case 2 :
if(controller.customData.getDouble("temperature") >= 1500) {
ReactorUtil.outputSignal(machine, 15)
} else {
ReactorUtil.outputSignal(machine, 0)
}
break
case 3 :
let fluid = controller.getCapability(ForgeCapabilities.FLUID_HANDLER).orElse(null)
let maxFluidOutput = ReactorUtil.outputFluid(controller)
if(fluid.getFluidInTank(1).amount + maxFluidOutput >= fluid.getTankCapacity(1)) {
ReactorUtil.outputSignal(machine, 15)
} else {
ReactorUtil.outputSignal(machine, 0)
}
break
case 4 :
let energy = controller.getCapability(ForgeCapabilities.ENERGY).orElse(null)
let maxEnergyOutput = ReactorUtil.outputEnergy(controller)
if(energy.getEnergyStored() + maxEnergyOutput >= energy.getMaxEnergyStored()) {
ReactorUtil.outputSignal(machine, 15)
} else {
ReactorUtil.outputSignal(machine, 0)
}
break
case 5 :
let item = controller.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null)
if(item.getStackInSlot(0).count == 0) {
ReactorUtil.outputSignal(machine, 15)
} else {
ReactorUtil.outputSignal(machine, 0)
}
break
}
})