diff --git a/compat/audits/createaddition/1.6.0.json b/compat/audits/createaddition/1.6.0.json new file mode 100644 index 00000000..13e79279 --- /dev/null +++ b/compat/audits/createaddition/1.6.0.json @@ -0,0 +1,5818 @@ +{ + "ancestry_classpath": [ + { + "sha256": "0cf4611ad853042b689ac386184c5bbe02950efcffddb49e5f604e82baddb0dc", + "size": 820109 + }, + { + "sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f", + "size": 56279815 + }, + { + "sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308", + "size": 279363 + }, + { + "sha256": "a9a29a1beda28f772103f79f13ef517589fb86ae3a0a99446b914b9164a0c9de", + "size": 131329 + }, + { + "sha256": "e3f114c10b79e8bd65641b592d9678331604b4eb60153cd73d02111b4e13b4fb", + "size": 30668 + }, + { + "sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb", + "size": 17452009 + } + ], + "ancestry_dependencies": [ + { + "dependency": "cc.tweaked:cc-tweaked-1.21.1-core-api:1.115.1", + "sha256": "e3f114c10b79e8bd65641b592d9678331604b4eb60153cd73d02111b4e13b4fb", + "size": 30668 + }, + { + "dependency": "com.simibubi.create:create-1.21.1:6.0.10-280:slim", + "sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb", + "size": 17452009 + }, + { + "dependency": "dev.engine-room.flywheel:flywheel-neoforge-api-1.21.1:1.0.6", + "sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308", + "size": 279363 + }, + { + "dependency": "mezz.jei:jei-1.21.1-common-api:19.25.0.323", + "sha256": "a9a29a1beda28f772103f79f13ef517589fb86ae3a0a99446b914b9164a0c9de", + "size": 131329 + }, + { + "dependency": "net.createmod.ponder:ponder-neoforge:1.0.82+mc1.21.1", + "sha256": "0cf4611ad853042b689ac386184c5bbe02950efcffddb49e5f604e82baddb0dc", + "size": 820109 + } + ], + "artifact": { + "class_count": 215, + "class_inventory_sha256": "e0f50c31bfc7bef9bed5c20449c8dc7dc35f10a25145375cbc77051a1313fffe", + "sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9", + "size": 1661802 + }, + "candidates": { + "block_entity_classes": [ + { + "class": "com.mrh0.createaddition.blocks.alternator.AlternatorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.alternator.AlternatorBlockEntity", + "com.simibubi.create.content.kinetics.base.KineticBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.alternator.AlternatorBlockEntity", + "com.simibubi.create.content.kinetics.base.KineticBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"AlternatorBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.alternator.AlternatorBlockEntity extends com.simibubi.create.content.kinetics.base.KineticBlockEntity implements com.mrh0.createaddition.energy.IEnergyProvider {\n public com.mrh0.createaddition.blocks.alternator.AlternatorBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent);\n public boolean addToGoggleTooltip(java.util.List, boolean);\n public float calculateStressApplied();\n public boolean isEnergyInput(net.minecraft.core.Direction);\n public boolean isEnergyOutput(net.minecraft.core.Direction);\n public void writeSafe(net.minecraft.nbt.CompoundTag, net.minecraft.core.HolderLookup$Provider);\n public void tick();\n public void tickAudio();\n public static int getEnergyProductionRate(int);\n public void firstTick();\n public void updateCache();\n public net.neoforged.neoforge.energy.IEnergyStorage getEnergyStorage(net.minecraft.core.Direction);\n}", + "source_class": "com.mrh0.createaddition.blocks.alternator.AlternatorBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.LargeConnectorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.LargeConnectorBlockEntity", + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.LargeConnectorBlockEntity", + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"LargeConnectorBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.connector.LargeConnectorBlockEntity extends com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity {\n public static final net.minecraft.world.phys.Vec3 OFFSET_DOWN;\n public static final net.minecraft.world.phys.Vec3 OFFSET_UP;\n public static final net.minecraft.world.phys.Vec3 OFFSET_NORTH;\n public static final net.minecraft.world.phys.Vec3 OFFSET_WEST;\n public static final net.minecraft.world.phys.Vec3 OFFSET_SOUTH;\n public static final net.minecraft.world.phys.Vec3 OFFSET_EAST;\n public com.mrh0.createaddition.blocks.connector.LargeConnectorBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent);\n public void addBehaviours(java.util.List);\n public int getMaxIn();\n public int getMaxOut();\n public int getNodeCount();\n public net.minecraft.world.phys.Vec3 getNodeOffset(int);\n public com.mrh0.createaddition.blocks.connector.ConnectorType getConnectorType();\n public int getMaxWireLength();\n}", + "source_class": "com.mrh0.createaddition.blocks.connector.LargeConnectorBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.SmallConnectorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.SmallConnectorBlockEntity", + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.SmallConnectorBlockEntity", + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"SmallConnectorBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.connector.SmallConnectorBlockEntity extends com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity {\n public static final net.minecraft.world.phys.Vec3 OFFSET_DOWN;\n public static final net.minecraft.world.phys.Vec3 OFFSET_UP;\n public static final net.minecraft.world.phys.Vec3 OFFSET_NORTH;\n public static final net.minecraft.world.phys.Vec3 OFFSET_WEST;\n public static final net.minecraft.world.phys.Vec3 OFFSET_SOUTH;\n public static final net.minecraft.world.phys.Vec3 OFFSET_EAST;\n public com.mrh0.createaddition.blocks.connector.SmallConnectorBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent);\n public void addBehaviours(java.util.List);\n public int getMaxIn();\n public int getMaxOut();\n public int getNodeCount();\n public net.minecraft.world.phys.Vec3 getNodeOffset(int);\n public com.mrh0.createaddition.blocks.connector.ConnectorType getConnectorType();\n public int getMaxWireLength();\n}", + "source_class": "com.mrh0.createaddition.blocks.connector.SmallConnectorBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.SmallLightConnectorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.SmallLightConnectorBlockEntity", + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.SmallLightConnectorBlockEntity", + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"SmallLightConnectorBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.connector.SmallLightConnectorBlockEntity extends com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity {\n public static final net.minecraft.world.phys.Vec3 OFFSET_DOWN;\n public static final net.minecraft.world.phys.Vec3 OFFSET_UP;\n public static final net.minecraft.world.phys.Vec3 OFFSET_NORTH;\n public static final net.minecraft.world.phys.Vec3 OFFSET_WEST;\n public static final net.minecraft.world.phys.Vec3 OFFSET_SOUTH;\n public static final net.minecraft.world.phys.Vec3 OFFSET_EAST;\n public com.mrh0.createaddition.blocks.connector.SmallLightConnectorBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent);\n public void read(net.minecraft.nbt.CompoundTag, net.minecraft.core.HolderLookup$Provider, boolean);\n public void writeSafe(net.minecraft.nbt.CompoundTag, net.minecraft.core.HolderLookup$Provider);\n public void addBehaviours(java.util.List);\n public int getMaxIn();\n public int getMaxOut();\n public int getNodeCount();\n public net.minecraft.world.phys.Vec3 getNodeOffset(int);\n public com.mrh0.createaddition.blocks.connector.ConnectorType getConnectorType();\n public int getMaxWireLength();\n}", + "source_class": "com.mrh0.createaddition.blocks.connector.SmallLightConnectorBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"AbstractConnectorBlockEntity.java\"\npublic abstract class com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity extends com.simibubi.create.foundation.blockEntity.SmartBlockEntity implements com.mrh0.createaddition.energy.IWireNode,com.mrh0.createaddition.network.IObserveBlockEntity,com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation,com.mrh0.createaddition.debug.IDebugDrawer,com.mrh0.createaddition.energy.IEnergyProvider {\n public com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity$InterfaceEnergyHandler internal;\n public com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public net.neoforged.neoforge.energy.IEnergyStorage getEnergyStorage(net.minecraft.core.Direction);\n public abstract int getMaxIn();\n public abstract int getMaxOut();\n public int getCapacity();\n public com.mrh0.createaddition.energy.IWireNode getWireNode(int);\n public com.mrh0.createaddition.energy.LocalNode getLocalNode(int);\n public void setNode(int, int, net.minecraft.core.BlockPos, com.mrh0.createaddition.energy.WireType);\n public void removeNode(int, boolean);\n public net.minecraft.core.BlockPos getPos();\n public void setNetwork(int, com.mrh0.createaddition.energy.network.EnergyNetwork);\n public com.mrh0.createaddition.energy.network.EnergyNetwork getNetwork(int);\n public boolean isEnergyInput(net.minecraft.core.Direction);\n public boolean isEnergyOutput(net.minecraft.core.Direction);\n public void read(net.minecraft.nbt.CompoundTag, net.minecraft.core.HolderLookup$Provider, boolean);\n public void write(net.minecraft.nbt.CompoundTag, net.minecraft.core.HolderLookup$Provider, boolean);\n public void firstTick();\n public void tick();\n public void remove();\n public void invalidateLocalNodes();\n public void invalidateNodeCache();\n public com.mrh0.createaddition.blocks.connector.base.ConnectorMode getMode();\n public void onObserved(net.minecraft.server.level.ServerPlayer, com.mrh0.createaddition.network.ObservePacketPayload);\n public boolean addToGoggleTooltip(java.util.List, boolean);\n public boolean ignoreCapSide();\n public void updateExternalEnergyStorage();\n public void drawDebug();\n}", + "source_class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlockEntity", + "com.simibubi.create.content.logistics.crate.CrateBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlockEntity", + "com.simibubi.create.content.logistics.crate.CrateBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"CreativeEnergyBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlockEntity extends com.simibubi.create.content.logistics.crate.CrateBlockEntity {\n public com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent);\n public void tick();\n public void firstTick();\n public void updateCache();\n}", + "source_class": "com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"DigitalAdapterBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterBlockEntity extends net.minecraft.world.level.block.entity.BlockEntity {\n public final java.util.List textLines;\n public static final int MAX_LINES;\n public static final net.minecraft.network.chat.MutableComponent EMPTY_LINE;\n public com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public void incrementLine();\n public void setTextLine(int, net.minecraft.network.chat.MutableComponent);\n public net.minecraft.network.chat.MutableComponent getTextLine(int);\n public void clearLine(int);\n public void clearAll();\n public void append(int, net.minecraft.network.chat.MutableComponent);\n public int getLine();\n public int setLine(int);\n public com.simibubi.create.content.kinetics.speedController.SpeedControllerBlockEntity getSpeedController(net.minecraft.core.Direction);\n public com.simibubi.create.content.contraptions.pulley.PulleyBlockEntity getRopePulley(net.minecraft.core.Direction);\n public com.simibubi.create.content.fluids.hosePulley.HosePulleyBlockEntity getHosePulley(net.minecraft.core.Direction);\n public com.simibubi.create.content.contraptions.elevator.ElevatorPulleyBlockEntity getElevatorPulley(net.minecraft.core.Direction);\n public com.simibubi.create.content.contraptions.piston.MechanicalPistonBlockEntity getMechanicalPiston(net.minecraft.core.Direction);\n public com.simibubi.create.content.contraptions.bearing.MechanicalBearingBlockEntity getMechanicalBearing(net.minecraft.core.Direction);\n public com.simibubi.create.content.kinetics.gauge.StressGaugeBlockEntity getStressGauge(net.minecraft.core.Direction);\n public com.simibubi.create.content.kinetics.gauge.SpeedGaugeBlockEntity getSpeedGauge(net.minecraft.core.Direction);\n public void setTargetSpeed(net.minecraft.core.Direction, int);\n public int getTargetSpeed(net.minecraft.core.Direction);\n}", + "source_class": "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.electric_motor.ElectricMotorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.electric_motor.ElectricMotorBlockEntity", + "com.simibubi.create.content.kinetics.base.GeneratingKineticBlockEntity", + "com.simibubi.create.content.kinetics.base.KineticBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.electric_motor.ElectricMotorBlockEntity", + "com.simibubi.create.content.kinetics.base.GeneratingKineticBlockEntity", + "com.simibubi.create.content.kinetics.base.KineticBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"ElectricMotorBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.electric_motor.ElectricMotorBlockEntity extends com.simibubi.create.content.kinetics.base.GeneratingKineticBlockEntity {\n public com.mrh0.createaddition.blocks.electric_motor.ElectricMotorBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent);\n public void addBehaviours(java.util.List);\n public static int step(com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour$StepContext);\n public float calculateAddedStressCapacity();\n public boolean addToGoggleTooltip(java.util.List, boolean);\n public void updateGeneratedRotation(int);\n public void initialize();\n public float getGeneratedSpeed();\n public void writeSafe(net.minecraft.nbt.CompoundTag, net.minecraft.core.HolderLookup$Provider);\n public void lazyTick();\n public static int getEnergyConsumptionRate(float);\n public void tick();\n public void tickAudio();\n public static float getDurationAngle(float, float, float);\n public static float getDurationDistance(float, float, float);\n public boolean setRPM(float);\n public float getRPM();\n public int getGeneratedStress();\n public int getEnergyConsumption();\n public boolean isPoweredState();\n}", + "source_class": "com.mrh0.createaddition.blocks.electric_motor.ElectricMotorBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"LiquidBlazeBurnerBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlockEntity extends com.simibubi.create.foundation.blockEntity.SmartBlockEntity implements com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation,com.mrh0.createaddition.network.IObserveBlockEntity {\n public static int MAX_HEAT_CAPACITY;\n public final boolean stockKeeper;\n public boolean first;\n public com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public void addBehaviours(java.util.List);\n public com.simibubi.create.content.processing.burner.BlazeBurnerBlock$HeatLevel getHeatLevelForRender();\n public static void registerCapability(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent);\n public java.util.Optional> find(net.neoforged.neoforge.fluids.FluidStack, net.minecraft.world.level.Level);\n public void burningTick();\n public com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlockEntity$FuelType getActiveFuel();\n public int getRemainingBurnTime();\n public boolean isCreative();\n public void tick();\n public void lazyTick();\n public void write(net.minecraft.nbt.CompoundTag, net.minecraft.core.HolderLookup$Provider, boolean);\n public com.simibubi.create.content.processing.burner.BlazeBurnerBlock$HeatLevel getHeatLevelFromBlock();\n public void updateBlockState();\n public boolean isCreativeFuel(net.minecraft.world.item.ItemStack);\n public boolean isValidBlockAbove();\n public void spawnParticleBurst(boolean);\n public boolean addToGoggleTooltip(java.util.List, boolean);\n public void onObserved(net.minecraft.server.level.ServerPlayer, com.mrh0.createaddition.network.ObservePacketPayload);\n}", + "source_class": "com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"ModularAccumulatorBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlockEntity extends com.simibubi.create.foundation.blockEntity.SmartBlockEntity implements com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation,com.mrh0.createaddition.energy.IMultiTileEnergyContainer,com.mrh0.createaddition.network.IObserveBlockEntity,com.mrh0.createaddition.debug.IDebugDrawer,com.simibubi.create.content.redstone.thresholdSwitch.ThresholdSwitchObservable {\n public net.createmod.catnip.animation.LerpedFloat gauge;\n public com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent);\n public void onChunkUnloaded();\n public void updateCache();\n public void tick();\n public void tickOutput();\n public void tickOutputSide(net.minecraft.core.Direction);\n public void tickAudio();\n public net.minecraft.core.BlockPos getLastKnownPos();\n public boolean isController();\n public void initialize();\n public com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlockEntity getControllerBE();\n public void applySize(int);\n public void removeController(boolean);\n public void sendDataImmediately();\n public void sendData();\n public void setController(net.minecraft.core.BlockPos);\n public net.minecraft.core.BlockPos getController();\n public float getFillState();\n public void write(net.minecraft.nbt.CompoundTag, net.minecraft.core.HolderLookup$Provider, boolean);\n public int getTotalAccumulatorSize();\n public static int getCapacityMultiplier();\n public static int getMaxHeight();\n public int getMaxWidth();\n public void preventConnectivityUpdate();\n public void notifyMultiUpdated();\n public net.minecraft.core.Direction$Axis getMainConnectionAxis();\n public int getMaxLength(net.minecraft.core.Direction$Axis, int);\n public int getHeight();\n public void setHeight(int);\n public int getWidth();\n public void setWidth(int);\n public void addBehaviours(java.util.List);\n public boolean addToGoggleTooltip(java.util.List, boolean);\n public void observe();\n public void onObserved(net.minecraft.server.level.ServerPlayer, com.mrh0.createaddition.network.ObservePacketPayload);\n public boolean hasAccumulator();\n public int getSize(int);\n public void setSize(int, int);\n public com.mrh0.createaddition.energy.InternalEnergyStorage getEnergy();\n public void drawDebug();\n public int getMaxValue();\n public int getMinValue();\n public int getCurrentValue();\n public net.minecraft.network.chat.MutableComponent format(int);\n public net.minecraft.world.level.block.entity.BlockEntity getControllerBE();\n}", + "source_class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity", + "com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity", + "com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"PortableEnergyInterfaceBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity extends com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity {\n public com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent);\n public void startTransferringTo(com.simibubi.create.content.contraptions.Contraption, float);\n public boolean isConnected();\n public int getEnergy();\n public int getCapacity();\n}", + "source_class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.redstone_relay.RedstoneRelayBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.redstone_relay.RedstoneRelayBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.redstone_relay.RedstoneRelayBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"RedstoneRelayBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.redstone_relay.RedstoneRelayBlockEntity extends com.simibubi.create.foundation.blockEntity.SmartBlockEntity implements com.mrh0.createaddition.energy.IWireNode,com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation,com.mrh0.createaddition.network.IObserveBlockEntity {\n public static net.minecraft.world.phys.Vec3 OFFSET_NORTH;\n public static net.minecraft.world.phys.Vec3 OFFSET_WEST;\n public static net.minecraft.world.phys.Vec3 OFFSET_SOUTH;\n public static net.minecraft.world.phys.Vec3 OFFSET_EAST;\n public static net.minecraft.world.phys.Vec3 IN_VERTICAL_OFFSET_NORTH;\n public static net.minecraft.world.phys.Vec3 IN_VERTICAL_OFFSET_WEST;\n public static net.minecraft.world.phys.Vec3 IN_VERTICAL_OFFSET_SOUTH;\n public static net.minecraft.world.phys.Vec3 IN_VERTICAL_OFFSET_EAST;\n public static net.minecraft.world.phys.Vec3 OUT_VERTICAL_OFFSET_NORTH;\n public static net.minecraft.world.phys.Vec3 OUT_VERTICAL_OFFSET_WEST;\n public static net.minecraft.world.phys.Vec3 OUT_VERTICAL_OFFSET_SOUTH;\n public static net.minecraft.world.phys.Vec3 OUT_VERTICAL_OFFSET_EAST;\n public static final int NODE_COUNT;\n public com.mrh0.createaddition.blocks.redstone_relay.RedstoneRelayBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public void addBehaviours(java.util.List);\n public com.mrh0.createaddition.energy.IWireNode getWireNode(int);\n public com.mrh0.createaddition.energy.LocalNode getLocalNode(int);\n public void setNode(int, int, net.minecraft.core.BlockPos, com.mrh0.createaddition.energy.WireType);\n public void removeNode(int, boolean);\n public int getNodeCount();\n public net.minecraft.world.phys.Vec3 getNodeOffset(int);\n public int getAvailableNode(net.minecraft.world.phys.Vec3);\n public boolean isNodeInput(int);\n public boolean isNodeOutput(int);\n public net.minecraft.core.BlockPos getPos();\n public com.mrh0.createaddition.energy.network.EnergyNetwork getNetwork(int);\n public void setNetwork(int, com.mrh0.createaddition.energy.network.EnergyNetwork);\n public void write(net.minecraft.nbt.CompoundTag, net.minecraft.core.HolderLookup$Provider, boolean);\n public void tick();\n public int getThroughput();\n public void remove();\n public void invalidateLocalNodes();\n public void invalidateNodeCache();\n public boolean isNodeIndeciesConnected(int, int);\n public com.mrh0.createaddition.blocks.connector.ConnectorType getConnectorType();\n public int getDemand();\n public void onObserved(net.minecraft.server.level.ServerPlayer, com.mrh0.createaddition.network.ObservePacketPayload);\n public boolean addToGoggleTooltip(java.util.List, boolean);\n public int getMaxWireLength();\n}", + "source_class": "com.mrh0.createaddition.blocks.redstone_relay.RedstoneRelayBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity", + "com.simibubi.create.content.kinetics.base.KineticBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity", + "com.simibubi.create.content.kinetics.base.KineticBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"RollingMillBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity extends com.simibubi.create.content.kinetics.base.KineticBlockEntity {\n public net.neoforged.neoforge.items.ItemStackHandler inputInv;\n public net.neoforged.neoforge.items.ItemStackHandler outputInv;\n public net.neoforged.neoforge.items.IItemHandler capability;\n public int timer;\n public com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent);\n public void addBehaviours(java.util.List);\n public void tickAudio();\n public void tick();\n public void invalidate();\n public void destroy();\n public void spawnParticles();\n public void write(net.minecraft.nbt.CompoundTag, net.minecraft.core.HolderLookup$Provider, boolean);\n public int getProcessingSpeed();\n public java.util.Optional> find(net.neoforged.neoforge.items.wrapper.RecipeWrapper, net.minecraft.world.level.Level);\n}", + "source_class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity" + }, + { + "class": "com.mrh0.createaddition.blocks.tesla_coil.TeslaCoilBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.tesla_coil.TeslaCoilBlockEntity", + "com.mrh0.createaddition.energy.AbstractElectricBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.blocks.tesla_coil.TeslaCoilBlockEntity", + "com.mrh0.createaddition.energy.AbstractElectricBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"TeslaCoilBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.tesla_coil.TeslaCoilBlockEntity extends com.mrh0.createaddition.energy.AbstractElectricBlockEntity implements com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation,com.mrh0.createaddition.network.IObserveBlockEntity {\n public com.simibubi.create.content.kinetics.belt.behaviour.BeltProcessingBehaviour processingBehaviour;\n public com.mrh0.createaddition.blocks.tesla_coil.TeslaCoilBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent);\n public int getCapacity();\n public int getMaxIn();\n public int getMaxOut();\n public void addBehaviours(java.util.List);\n public boolean isEnergyInput(net.minecraft.core.Direction);\n public boolean isEnergyOutput(net.minecraft.core.Direction);\n public int getConsumption();\n public void tick();\n public void tickAudio();\n public boolean isPoweredState();\n public java.util.Optional> find(net.neoforged.neoforge.items.wrapper.RecipeWrapper, net.minecraft.world.level.Level);\n public boolean addToGoggleTooltip(java.util.List, boolean);\n public void onObserved(net.minecraft.server.level.ServerPlayer, com.mrh0.createaddition.network.ObservePacketPayload);\n}", + "source_class": "com.mrh0.createaddition.blocks.tesla_coil.TeslaCoilBlockEntity" + }, + { + "class": "com.mrh0.createaddition.energy.AbstractElectricBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.energy.AbstractElectricBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.energy.AbstractElectricBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"AbstractElectricBlockEntity.java\"\npublic abstract class com.mrh0.createaddition.energy.AbstractElectricBlockEntity extends com.simibubi.create.foundation.blockEntity.SmartBlockEntity {\n public com.mrh0.createaddition.energy.AbstractElectricBlockEntity(net.minecraft.world.level.block.entity.BlockEntityType, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n public abstract int getCapacity();\n public abstract int getMaxIn();\n public abstract int getMaxOut();\n public void addBehaviours(java.util.List);\n public abstract boolean isEnergyInput(net.minecraft.core.Direction);\n public abstract boolean isEnergyOutput(net.minecraft.core.Direction);\n public void writeSafe(net.minecraft.nbt.CompoundTag, net.minecraft.core.HolderLookup$Provider);\n public void outputTick(int);\n public void tick();\n public void updateCache(net.minecraft.core.Direction);\n}", + "source_class": "com.mrh0.createaddition.energy.AbstractElectricBlockEntity" + } + ], + "client_viewer_classes": [ + { + "class": "com.mrh0.createaddition.compat.jei.AnimatedRollingMill", + "classification": { + "evidence": [ + ".jei." + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"AnimatedRollingMill.java\"\npublic class com.mrh0.createaddition.compat.jei.AnimatedRollingMill extends com.simibubi.create.compat.jei.category.animations.AnimatedKinetics {\n public com.mrh0.createaddition.compat.jei.AnimatedRollingMill(boolean);\n public com.mrh0.createaddition.compat.jei.AnimatedRollingMill();\n public void draw(net.minecraft.client.gui.GuiGraphics, int, int);\n}", + "source_class": "com.mrh0.createaddition.compat.jei.AnimatedRollingMill" + }, + { + "class": "com.mrh0.createaddition.compat.jei.AnimatedTeslaCoil", + "classification": { + "evidence": [ + ".jei." + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"AnimatedTeslaCoil.java\"\npublic class com.mrh0.createaddition.compat.jei.AnimatedTeslaCoil extends com.simibubi.create.compat.jei.category.animations.AnimatedKinetics {\n public com.mrh0.createaddition.compat.jei.AnimatedTeslaCoil();\n public void draw(net.minecraft.client.gui.GuiGraphics, int, int);\n}", + "source_class": "com.mrh0.createaddition.compat.jei.AnimatedTeslaCoil" + }, + { + "class": "com.mrh0.createaddition.compat.jei.CARecipeCategory", + "classification": { + "evidence": [ + ".jei." + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CARecipeCategory.java\"\npublic abstract class com.mrh0.createaddition.compat.jei.CARecipeCategory> extends com.simibubi.create.compat.jei.category.CreateRecipeCategory {\n public com.mrh0.createaddition.compat.jei.CARecipeCategory(com.simibubi.create.compat.jei.category.CreateRecipeCategory$Info);\n}", + "source_class": "com.mrh0.createaddition.compat.jei.CARecipeCategory" + }, + { + "class": "com.mrh0.createaddition.compat.jei.ChargingCategory", + "classification": { + "evidence": [ + ".jei." + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"ChargingCategory.java\"\npublic class com.mrh0.createaddition.compat.jei.ChargingCategory extends com.mrh0.createaddition.compat.jei.CARecipeCategory {\n public com.mrh0.createaddition.compat.jei.ChargingCategory(com.simibubi.create.compat.jei.category.CreateRecipeCategory$Info);\n public void setRecipe(mezz.jei.api.gui.builder.IRecipeLayoutBuilder, com.mrh0.createaddition.recipe.charging.ChargingRecipe, mezz.jei.api.recipe.IFocusGroup);\n public void draw(com.mrh0.createaddition.recipe.charging.ChargingRecipe, mezz.jei.api.gui.ingredient.IRecipeSlotsView, net.minecraft.client.gui.GuiGraphics, double, double);\n public void draw(net.minecraft.world.item.crafting.Recipe, mezz.jei.api.gui.ingredient.IRecipeSlotsView, net.minecraft.client.gui.GuiGraphics, double, double);\n public void setRecipe(mezz.jei.api.gui.builder.IRecipeLayoutBuilder, net.minecraft.world.item.crafting.Recipe, mezz.jei.api.recipe.IFocusGroup);\n}", + "source_class": "com.mrh0.createaddition.compat.jei.ChargingCategory" + }, + { + "class": "com.mrh0.createaddition.compat.jei.CreateAdditionJEI", + "classification": { + "evidence": [ + ".jei." + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CreateAdditionJEI.java\"\npublic class com.mrh0.createaddition.compat.jei.CreateAdditionJEI implements mezz.jei.api.IModPlugin {\n public mezz.jei.api.runtime.IIngredientManager ingredientManager;\n public com.mrh0.createaddition.compat.jei.CreateAdditionJEI();\n public net.minecraft.resources.ResourceLocation getPluginUid();\n public void registerCategories(mezz.jei.api.registration.IRecipeCategoryRegistration);\n public void registerRecipes(mezz.jei.api.registration.IRecipeRegistration);\n public void registerRecipeCatalysts(mezz.jei.api.registration.IRecipeCatalystRegistration);\n}", + "source_class": "com.mrh0.createaddition.compat.jei.CreateAdditionJEI" + }, + { + "class": "com.mrh0.createaddition.compat.jei.CreateAdditionJEI$CategoryBuilder", + "classification": { + "evidence": [ + ".jei." + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CreateAdditionJEI.java\"\nclass com.mrh0.createaddition.compat.jei.CreateAdditionJEI$CategoryBuilder> extends com.simibubi.create.compat.jei.category.CreateRecipeCategory$Builder {\n public com.mrh0.createaddition.compat.jei.CreateAdditionJEI$CategoryBuilder(java.lang.Class);\n public com.simibubi.create.compat.jei.category.CreateRecipeCategory build(net.minecraft.resources.ResourceLocation, com.simibubi.create.compat.jei.category.CreateRecipeCategory$Factory);\n public com.simibubi.create.compat.jei.category.CreateRecipeCategory build(java.lang.String, com.simibubi.create.compat.jei.category.CreateRecipeCategory$Factory);\n}", + "source_class": "com.mrh0.createaddition.compat.jei.CreateAdditionJEI.CategoryBuilder" + }, + { + "class": "com.mrh0.createaddition.compat.jei.LiquidBurningCategory", + "classification": { + "evidence": [ + ".jei." + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"LiquidBurningCategory.java\"\npublic class com.mrh0.createaddition.compat.jei.LiquidBurningCategory extends com.mrh0.createaddition.compat.jei.CARecipeCategory {\n public com.mrh0.createaddition.compat.jei.LiquidBurningCategory(com.simibubi.create.compat.jei.category.CreateRecipeCategory$Info);\n public void setRecipe(mezz.jei.api.gui.builder.IRecipeLayoutBuilder, com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe, mezz.jei.api.recipe.IFocusGroup);\n public void draw(com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe, mezz.jei.api.gui.ingredient.IRecipeSlotsView, net.minecraft.client.gui.GuiGraphics, double, double);\n public void draw(net.minecraft.world.item.crafting.Recipe, mezz.jei.api.gui.ingredient.IRecipeSlotsView, net.minecraft.client.gui.GuiGraphics, double, double);\n public void setRecipe(mezz.jei.api.gui.builder.IRecipeLayoutBuilder, net.minecraft.world.item.crafting.Recipe, mezz.jei.api.recipe.IFocusGroup);\n}", + "source_class": "com.mrh0.createaddition.compat.jei.LiquidBurningCategory" + }, + { + "class": "com.mrh0.createaddition.compat.jei.RollingMillAssemblySubCategory", + "classification": { + "evidence": [ + ".jei." + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"RollingMillAssemblySubCategory.java\"\npublic class com.mrh0.createaddition.compat.jei.RollingMillAssemblySubCategory extends com.simibubi.create.compat.jei.category.sequencedAssembly.SequencedAssemblySubCategory {\n public com.mrh0.createaddition.compat.jei.RollingMillAssemblySubCategory();\n public void draw(com.simibubi.create.content.processing.sequenced.SequencedRecipe, net.minecraft.client.gui.GuiGraphics, double, double, int);\n}", + "source_class": "com.mrh0.createaddition.compat.jei.RollingMillAssemblySubCategory" + }, + { + "class": "com.mrh0.createaddition.compat.jei.RollingMillCategory", + "classification": { + "evidence": [ + ".jei." + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"RollingMillCategory.java\"\npublic class com.mrh0.createaddition.compat.jei.RollingMillCategory extends com.mrh0.createaddition.compat.jei.CARecipeCategory {\n public com.mrh0.createaddition.compat.jei.RollingMillCategory(com.simibubi.create.compat.jei.category.CreateRecipeCategory$Info);\n public void setRecipe(mezz.jei.api.gui.builder.IRecipeLayoutBuilder, com.mrh0.createaddition.recipe.rolling.RollingRecipe, mezz.jei.api.recipe.IFocusGroup);\n public void draw(com.mrh0.createaddition.recipe.rolling.RollingRecipe, mezz.jei.api.gui.ingredient.IRecipeSlotsView, net.minecraft.client.gui.GuiGraphics, double, double);\n public void draw(net.minecraft.world.item.crafting.Recipe, mezz.jei.api.gui.ingredient.IRecipeSlotsView, net.minecraft.client.gui.GuiGraphics, double, double);\n public void setRecipe(mezz.jei.api.gui.builder.IRecipeLayoutBuilder, net.minecraft.world.item.crafting.Recipe, mezz.jei.api.recipe.IFocusGroup);\n}", + "source_class": "com.mrh0.createaddition.compat.jei.RollingMillCategory" + } + ], + "datagen_classes": [ + { + "class": "com.mrh0.createaddition.datagen.CADamageTypesDatagen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CADamageTypesDatagen.java\"\npublic class com.mrh0.createaddition.datagen.CADamageTypesDatagen {\n public com.mrh0.createaddition.datagen.CADamageTypesDatagen();\n public static void bootstrap(net.minecraft.data.worldgen.BootstrapContext);\n}", + "source_class": "com.mrh0.createaddition.datagen.CADamageTypesDatagen" + }, + { + "class": "com.mrh0.createaddition.datagen.CAPotatoProjectileTypesDatagen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CAPotatoProjectileTypesDatagen.java\"\npublic class com.mrh0.createaddition.datagen.CAPotatoProjectileTypesDatagen {\n public com.mrh0.createaddition.datagen.CAPotatoProjectileTypesDatagen();\n public static void bootstrap(net.minecraft.data.worldgen.BootstrapContext);\n}", + "source_class": "com.mrh0.createaddition.datagen.CAPotatoProjectileTypesDatagen" + }, + { + "class": "com.mrh0.createaddition.datagen.CreateAdditionsDataGen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CreateAdditionsDataGen.java\"\npublic class com.mrh0.createaddition.datagen.CreateAdditionsDataGen {\n public com.mrh0.createaddition.datagen.CreateAdditionsDataGen();\n public static void gatherData(net.neoforged.neoforge.data.event.GatherDataEvent);\n}", + "source_class": "com.mrh0.createaddition.datagen.CreateAdditionsDataGen" + }, + { + "class": "com.mrh0.createaddition.datagen.Models.BlockGenHelper", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"BlockGenHelper.java\"\npublic class com.mrh0.createaddition.datagen.Models.BlockGenHelper {\n public com.mrh0.createaddition.datagen.Models.BlockGenHelper();\n public static com.tterrag.registrate.util.nullness.NonNullBiConsumer, com.tterrag.registrate.providers.RegistrateBlockstateProvider> directionalBlockState(net.minecraft.resources.ResourceLocation);\n public static com.tterrag.registrate.util.nullness.NonNullBiConsumer, com.tterrag.registrate.providers.RegistrateBlockstateProvider> directionalBlockState();\n public static com.tterrag.registrate.util.nullness.NonNullBiConsumer, com.tterrag.registrate.providers.RegistrateBlockstateProvider> horizontalBlockState(net.minecraft.resources.ResourceLocation);\n public static com.tterrag.registrate.util.nullness.NonNullBiConsumer, com.tterrag.registrate.providers.RegistrateBlockstateProvider> horizontalBlockState();\n public static void directionalModel(net.minecraft.resources.ResourceLocation, com.tterrag.registrate.providers.DataGenContext, com.tterrag.registrate.providers.RegistrateBlockstateProvider);\n public static com.tterrag.registrate.util.nullness.NonNullBiConsumer, com.tterrag.registrate.providers.RegistrateBlockstateProvider> simpleBlock(net.minecraft.resources.ResourceLocation);\n public static com.tterrag.registrate.util.nullness.NonNullBiConsumer, com.tterrag.registrate.providers.RegistrateBlockstateProvider> simpleBlock();\n public static void horizontalModel(net.minecraft.resources.ResourceLocation, com.tterrag.registrate.providers.DataGenContext, com.tterrag.registrate.providers.RegistrateBlockstateProvider, int);\n public static void simpleBlockModel(net.minecraft.resources.ResourceLocation, com.tterrag.registrate.providers.DataGenContext, com.tterrag.registrate.providers.RegistrateBlockstateProvider);\n public static java.lang.String getBlockName(net.minecraft.world.level.block.Block);\n}", + "source_class": "com.mrh0.createaddition.datagen.Models.BlockGenHelper" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeGen.ChargingRecipeGen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"ChargingRecipeGen.java\"\npublic class com.mrh0.createaddition.datagen.RecipeGen.ChargingRecipeGen extends com.simibubi.create.api.data.recipe.ProcessingRecipeGen> {\n public com.mrh0.createaddition.datagen.RecipeGen.ChargingRecipeGen(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture, java.lang.String);\n public com.simibubi.create.api.data.recipe.BaseRecipeProvider$GeneratedRecipe deoxidize(net.minecraft.world.level.block.Block, net.minecraft.world.level.block.Block);\n public com.simibubi.create.api.data.recipe.BaseRecipeProvider$GeneratedRecipe deoxidize(net.minecraft.world.level.block.Block);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeGen.ChargingRecipeGen" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeGen.LiquidBurningRecipeGen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"LiquidBurningRecipeGen.java\"\npublic class com.mrh0.createaddition.datagen.RecipeGen.LiquidBurningRecipeGen extends com.simibubi.create.api.data.recipe.ProcessingRecipeGen> {\n public com.mrh0.createaddition.datagen.RecipeGen.LiquidBurningRecipeGen(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture, java.lang.String);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeGen.LiquidBurningRecipeGen" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeGen.RollingRecipeGen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"RollingRecipeGen.java\"\npublic class com.mrh0.createaddition.datagen.RecipeGen.RollingRecipeGen extends com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen {\n public com.mrh0.createaddition.datagen.RecipeGen.RollingRecipeGen(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture, java.lang.String);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeGen.RollingRecipeGen" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CAChargingRecipeProvider", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CAChargingRecipeProvider.java\"\npublic class com.mrh0.createaddition.datagen.RecipeProvider.CAChargingRecipeProvider extends com.mrh0.createaddition.datagen.RecipeGen.ChargingRecipeGen {\n public com.mrh0.createaddition.datagen.RecipeProvider.CAChargingRecipeProvider(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture, java.lang.String);\n public com.simibubi.create.api.data.recipe.BaseRecipeProvider$GeneratedRecipe buildCreateDeoxidizeVariants(com.simibubi.create.foundation.block.CopperBlockSet$Variant);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeProvider.CAChargingRecipeProvider" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CACompactingRecipeGen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CACompactingRecipeGen.java\"\npublic class com.mrh0.createaddition.datagen.RecipeProvider.CACompactingRecipeGen extends com.simibubi.create.api.data.recipe.CompactingRecipeGen {\n public com.mrh0.createaddition.datagen.RecipeProvider.CACompactingRecipeGen(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeProvider.CACompactingRecipeGen" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CACraftingRecipeProvider", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CACraftingRecipeProvider.java\"\npublic class com.mrh0.createaddition.datagen.RecipeProvider.CACraftingRecipeProvider extends net.minecraft.data.recipes.RecipeProvider {\n public com.mrh0.createaddition.datagen.RecipeProvider.CACraftingRecipeProvider(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeProvider.CACraftingRecipeProvider" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CACraftingRecipeProvider$SaveUtility", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CACraftingRecipeProvider.java\"\npublic class com.mrh0.createaddition.datagen.RecipeProvider.CACraftingRecipeProvider$SaveUtility {\n public net.minecraft.data.recipes.RecipeOutput output;\n public com.mrh0.createaddition.datagen.RecipeProvider.CACraftingRecipeProvider$SaveUtility(com.mrh0.createaddition.datagen.RecipeProvider.CACraftingRecipeProvider, net.minecraft.data.recipes.RecipeOutput);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeProvider.CACraftingRecipeProvider.SaveUtility" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CACrushingRecipeGen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CACrushingRecipeGen.java\"\npublic class com.mrh0.createaddition.datagen.RecipeProvider.CACrushingRecipeGen extends com.simibubi.create.api.data.recipe.CrushingRecipeGen {\n public com.mrh0.createaddition.datagen.RecipeProvider.CACrushingRecipeGen(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeProvider.CACrushingRecipeGen" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CAFillingRecipeGen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CAFillingRecipeGen.java\"\npublic class com.mrh0.createaddition.datagen.RecipeProvider.CAFillingRecipeGen extends com.simibubi.create.api.data.recipe.FillingRecipeGen {\n public com.mrh0.createaddition.datagen.RecipeProvider.CAFillingRecipeGen(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeProvider.CAFillingRecipeGen" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CALiquidBurningRecipeProvider", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CALiquidBurningRecipeProvider.java\"\npublic class com.mrh0.createaddition.datagen.RecipeProvider.CALiquidBurningRecipeProvider extends com.mrh0.createaddition.datagen.RecipeGen.LiquidBurningRecipeGen {\n public com.mrh0.createaddition.datagen.RecipeProvider.CALiquidBurningRecipeProvider(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeProvider.CALiquidBurningRecipeProvider" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CAMechanicalCrafterRecipeGen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CAMechanicalCrafterRecipeGen.java\"\npublic class com.mrh0.createaddition.datagen.RecipeProvider.CAMechanicalCrafterRecipeGen extends com.simibubi.create.api.data.recipe.MechanicalCraftingRecipeGen {\n public com.mrh0.createaddition.datagen.RecipeProvider.CAMechanicalCrafterRecipeGen(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeProvider.CAMechanicalCrafterRecipeGen" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CAMixingRecipeGen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CAMixingRecipeGen.java\"\npublic class com.mrh0.createaddition.datagen.RecipeProvider.CAMixingRecipeGen extends com.simibubi.create.api.data.recipe.MixingRecipeGen {\n public com.mrh0.createaddition.datagen.RecipeProvider.CAMixingRecipeGen(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeProvider.CAMixingRecipeGen" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CAPressingRecipeGen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CAPressingRecipeGen.java\"\npublic class com.mrh0.createaddition.datagen.RecipeProvider.CAPressingRecipeGen extends com.simibubi.create.api.data.recipe.PressingRecipeGen {\n public com.mrh0.createaddition.datagen.RecipeProvider.CAPressingRecipeGen(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeProvider.CAPressingRecipeGen" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CARollingRecipeGen", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CARollingRecipeGen.java\"\npublic class com.mrh0.createaddition.datagen.RecipeProvider.CARollingRecipeGen extends com.mrh0.createaddition.datagen.RecipeGen.RollingRecipeGen {\n public com.mrh0.createaddition.datagen.RecipeProvider.CARollingRecipeGen(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeProvider.CARollingRecipeGen" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CABlockTagProvider", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CABlockTagProvider.java\"\npublic class com.mrh0.createaddition.datagen.TagProvider.CABlockTagProvider extends net.neoforged.neoforge.common.data.BlockTagsProvider {\n public com.mrh0.createaddition.datagen.TagProvider.CABlockTagProvider(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture, net.neoforged.neoforge.common.data.ExistingFileHelper);\n}", + "source_class": "com.mrh0.createaddition.datagen.TagProvider.CABlockTagProvider" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CAFluidTagProvider", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CAFluidTagProvider.java\"\npublic class com.mrh0.createaddition.datagen.TagProvider.CAFluidTagProvider extends net.minecraft.data.tags.FluidTagsProvider {\n public com.mrh0.createaddition.datagen.TagProvider.CAFluidTagProvider(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture, net.neoforged.neoforge.common.data.ExistingFileHelper);\n}", + "source_class": "com.mrh0.createaddition.datagen.TagProvider.CAFluidTagProvider" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CAItemTagProvider", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CAItemTagProvider.java\"\npublic class com.mrh0.createaddition.datagen.TagProvider.CAItemTagProvider extends net.minecraft.data.tags.ItemTagsProvider {\n public com.mrh0.createaddition.datagen.TagProvider.CAItemTagProvider(net.minecraft.data.PackOutput, java.util.concurrent.CompletableFuture, java.util.concurrent.CompletableFuture>, net.neoforged.neoforge.common.data.ExistingFileHelper);\n}", + "source_class": "com.mrh0.createaddition.datagen.TagProvider.CAItemTagProvider" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CATagRegister.java\"\npublic class com.mrh0.createaddition.datagen.TagProvider.CATagRegister {\n public com.mrh0.createaddition.datagen.TagProvider.CATagRegister();\n}", + "source_class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Blocks", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CATagRegister.java\"\npublic class com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Blocks {\n public static final net.minecraft.tags.TagKey STORAGE_BLOCKS;\n public static final net.minecraft.tags.TagKey STORAGE_BLOCKS_BIOMASS;\n public static final net.minecraft.tags.TagKey STORAGE_BLOCKS_BIO;\n public static final net.minecraft.tags.TagKey STORAGE_BLOCKS_ELECTRUM;\n public static final net.minecraft.tags.TagKey FARMERSDELIGHT_MINEABLE_KNIFE;\n public com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Blocks();\n public static net.minecraft.tags.TagKey commonTags(java.lang.String, java.lang.String);\n public static net.minecraft.tags.TagKey commonTags(java.lang.String);\n public static net.minecraft.tags.TagKey modTags(java.lang.String, java.lang.String);\n public static net.minecraft.tags.TagKey modTags(java.lang.String, java.lang.String, java.lang.String);\n}", + "source_class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister.Blocks" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Fluids", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CATagRegister.java\"\npublic class com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Fluids {\n public static final net.minecraft.tags.TagKey BIOFUEL;\n public static final net.minecraft.tags.TagKey CREOSOTE;\n public static final net.minecraft.tags.TagKey CRUDE_OIL;\n public static final net.minecraft.tags.TagKey PLANTOIL;\n public static final net.minecraft.tags.TagKey ETHANOL;\n public static final net.minecraft.tags.TagKey GASOLINE;\n public static final net.minecraft.tags.TagKey DIESEL;\n public static final net.minecraft.tags.TagKey BIODIESEL;\n public static final net.minecraft.tags.TagKey IGNITES;\n public com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Fluids();\n public static net.minecraft.tags.TagKey commonTags(java.lang.String, java.lang.String);\n public static net.minecraft.tags.TagKey commonTags(java.lang.String);\n}", + "source_class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister.Fluids" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Items", + "classification": { + "evidence": [ + "datagen" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CATagRegister.java\"\npublic class com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Items {\n public static final net.minecraft.tags.TagKey DIAMOND_DUSTS;\n public static final net.minecraft.tags.TagKey OBSIDIAN_DUSTS;\n public static final net.minecraft.tags.TagKey BIO_FUELS;\n public static final net.minecraft.tags.TagKey ELECTRUM_BLOCKS;\n public static final net.minecraft.tags.TagKey ELECTRUM_INGOTS;\n public static final net.minecraft.tags.TagKey ELECTRUM_NUGGETS;\n public static final net.minecraft.tags.TagKey ELECTRUM_PLATES;\n public static final net.minecraft.tags.TagKey ZINC_PLATES;\n public static final net.minecraft.tags.TagKey ZINC_INGOTS;\n public static final net.minecraft.tags.TagKey ALL_METAL_RODS;\n public static final net.minecraft.tags.TagKey BRASS_RODS;\n public static final net.minecraft.tags.TagKey COPPER_RODS;\n public static final net.minecraft.tags.TagKey ELECTRUM_RODS;\n public static final net.minecraft.tags.TagKey GOLD_RODS;\n public static final net.minecraft.tags.TagKey IRON_RODS;\n public static final net.minecraft.tags.TagKey ALL_METAL_WIRES;\n public static final net.minecraft.tags.TagKey COPPER_WIRES;\n public static final net.minecraft.tags.TagKey ELECTRUM_WIRES;\n public static final net.minecraft.tags.TagKey GOLD_WIRES;\n public static final net.minecraft.tags.TagKey IRON_WIRES;\n public static final net.minecraft.tags.TagKey BUCKETS;\n public static final net.minecraft.tags.TagKey DUSTS;\n public static final net.minecraft.tags.TagKey FUELS;\n public static final net.minecraft.tags.TagKey INGOTS;\n public static final net.minecraft.tags.TagKey NUGGETS;\n public static final net.minecraft.tags.TagKey PLATES;\n public static final net.minecraft.tags.TagKey RODS;\n public static final net.minecraft.tags.TagKey RODS_IRON;\n public static final net.minecraft.tags.TagKey WIRES;\n public static final net.minecraft.tags.TagKey FOODS;\n public static final net.minecraft.tags.TagKey FOODS_EDIBLE;\n public static final net.minecraft.tags.TagKey STORAGE_BLOCKS_BIOMASS;\n public static final net.minecraft.tags.TagKey STORAGE_BLOCKS_BIO;\n public static final net.minecraft.tags.TagKey STORAGE_BLOCKS_ELECTRUM;\n public static final net.minecraft.tags.TagKey PLANT_FOODS;\n public static final net.minecraft.tags.TagKey PLANTS;\n public static final net.minecraft.tags.TagKey SPOOLS;\n public static final net.minecraft.tags.TagKey LARGE_CONNECTOR_USABLE_RODS;\n public static final net.minecraft.tags.TagKey MODULAR_ACCUMULATOR_USABLE_WIRES;\n public com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Items();\n public static net.minecraft.tags.TagKey commonTags(java.lang.String, java.lang.String);\n public static net.minecraft.tags.TagKey commonTags(java.lang.String);\n public static net.minecraft.tags.TagKey createAdditionsTags(java.lang.String, java.lang.String);\n public static net.minecraft.tags.TagKey createAdditionsTags(java.lang.String);\n public static net.minecraft.tags.TagKey modTags(java.lang.String, java.lang.String);\n public static net.minecraft.tags.TagKey modTags(java.lang.String, java.lang.String, java.lang.String);\n}", + "source_class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister.Items" + } + ], + "recipe_builders": [ + { + "class": "com.mrh0.createaddition.datagen.RecipeBuilders.CALiquidBurningRecipeBuilder", + "classification": { + "evidence": [ + "recipebuilder" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CALiquidBurningRecipeBuilder.java\"\npublic class com.mrh0.createaddition.datagen.RecipeBuilders.CALiquidBurningRecipeBuilder extends com.mrh0.createaddition.datagen.RecipeBuilders.CARecipeBuilder {\n public com.mrh0.createaddition.datagen.RecipeBuilders.CALiquidBurningRecipeBuilder(int);\n public static com.mrh0.createaddition.datagen.RecipeBuilders.CALiquidBurningRecipeBuilder liquidBurning(int);\n public com.mrh0.createaddition.datagen.RecipeBuilders.CALiquidBurningRecipeBuilder require(net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient);\n public com.mrh0.createaddition.datagen.RecipeBuilders.CALiquidBurningRecipeBuilder require(net.minecraft.world.level.material.Fluid);\n public com.mrh0.createaddition.datagen.RecipeBuilders.CALiquidBurningRecipeBuilder require(net.minecraft.tags.TagKey);\n public com.mrh0.createaddition.datagen.RecipeBuilders.CALiquidBurningRecipeBuilder superheated();\n public void save(net.minecraft.data.recipes.RecipeOutput, net.minecraft.resources.ResourceLocation);\n public void save(net.minecraft.data.recipes.RecipeOutput, java.lang.String);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeBuilders.CALiquidBurningRecipeBuilder" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeBuilders.CARecipeBuilder", + "classification": { + "evidence": [ + "recipebuilder" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CARecipeBuilder.java\"\npublic abstract class com.mrh0.createaddition.datagen.RecipeBuilders.CARecipeBuilder implements net.minecraft.data.recipes.RecipeBuilder {\n public com.mrh0.createaddition.datagen.RecipeBuilders.CARecipeBuilder(net.minecraft.world.item.ItemStack);\n public net.minecraft.data.recipes.RecipeBuilder unlockedBy(java.lang.String, net.minecraft.advancements.Criterion);\n public net.minecraft.data.recipes.RecipeBuilder group(java.lang.String);\n public net.minecraft.world.item.Item getResult();\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeBuilders.CARecipeBuilder" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder", + "classification": { + "evidence": [ + "recipebuilder" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"ChargingRecipeBuilder.java\"\npublic class com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder extends com.mrh0.createaddition.datagen.RecipeBuilders.CARecipeBuilder {\n public com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder(net.minecraft.world.item.ItemStack);\n public static com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder charging(net.minecraft.world.item.ItemStack);\n public static com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder charging(net.minecraft.world.level.ItemLike, int);\n public static com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder charging(net.minecraft.world.level.ItemLike);\n public static com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder charging(net.minecraft.world.item.Item, int);\n public static com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder charging(net.minecraft.world.item.Item);\n public static com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder charging(net.minecraft.world.item.ItemStack, net.minecraft.resources.ResourceKey, net.minecraft.core.HolderLookup$Provider);\n public static com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder deoxidize(net.minecraft.world.level.block.Block);\n public static com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder deoxidize(net.minecraft.world.level.block.Block, net.minecraft.world.level.block.Block);\n public com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder require(net.minecraft.world.item.crafting.Ingredient);\n public com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder require(net.minecraft.world.level.ItemLike);\n public com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder require(net.minecraft.world.item.ItemStack);\n public com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder require(net.minecraft.world.level.ItemLike, int);\n public com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder energy(int);\n public com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder maxChargeRate(int);\n public void save(net.minecraft.data.recipes.RecipeOutput, net.minecraft.resources.ResourceLocation);\n public void save(net.minecraft.data.recipes.RecipeOutput);\n public void save(net.minecraft.data.recipes.RecipeOutput, java.lang.String);\n}", + "source_class": "com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder" + } + ], + "recipe_classes": [ + { + "class": "com.mrh0.createaddition.recipe.charging.ChargingRecipe", + "classification": { + "evidence": [ + "com.mrh0.createaddition.recipe.charging.ChargingRecipe", + "com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "net.minecraft.world.item.crafting.Recipe" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.recipe.charging.ChargingRecipe", + "com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "net.minecraft.world.item.crafting.Recipe" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"ChargingRecipe.java\"\npublic class com.mrh0.createaddition.recipe.charging.ChargingRecipe extends com.simibubi.create.content.processing.recipe.ProcessingRecipe {\n public static final com.simibubi.create.foundation.recipe.IRecipeTypeInfo TYPE_INFO;\n public int energy;\n public int maxChargeRate;\n public com.mrh0.createaddition.recipe.charging.ChargingRecipe(com.mrh0.createaddition.recipe.charging.ChargingRecipeParams);\n public boolean matches(net.neoforged.neoforge.items.wrapper.RecipeWrapper, net.minecraft.world.level.Level);\n public int getEnergy();\n public int getMaxChargeRate();\n public net.minecraft.world.item.ItemStack getResultStack();\n public boolean matches(net.minecraft.world.item.crafting.RecipeInput, net.minecraft.world.level.Level);\n}", + "source_class": "com.mrh0.createaddition.recipe.charging.ChargingRecipe" + }, + { + "class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe", + "classification": { + "evidence": [ + "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe", + "com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "net.minecraft.world.item.crafting.Recipe" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe", + "com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "net.minecraft.world.item.crafting.Recipe" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"LiquidBurningRecipe.java\"\npublic class com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe extends com.simibubi.create.content.processing.recipe.ProcessingRecipe {\n public static final com.simibubi.create.foundation.recipe.IRecipeTypeInfo TYPE_INFO;\n public com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe(com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipeParams);\n public int getBurnTime();\n public boolean isSuperheated();\n public boolean matches(com.mrh0.createaddition.recipe.FluidRecipeWrapper, net.minecraft.world.level.Level);\n public net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient getFluidInput();\n public boolean matches(net.minecraft.world.item.crafting.RecipeInput, net.minecraft.world.level.Level);\n}", + "source_class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe" + }, + { + "class": "com.mrh0.createaddition.recipe.rolling.RollingRecipe", + "classification": { + "evidence": [ + "com.mrh0.createaddition.recipe.rolling.RollingRecipe", + "com.simibubi.create.content.processing.recipe.StandardProcessingRecipe", + "com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "net.minecraft.world.item.crafting.Recipe" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.recipe.rolling.RollingRecipe", + "com.simibubi.create.content.processing.recipe.StandardProcessingRecipe", + "com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "net.minecraft.world.item.crafting.Recipe" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"RollingRecipe.java\"\npublic class com.mrh0.createaddition.recipe.rolling.RollingRecipe extends com.simibubi.create.content.processing.recipe.StandardProcessingRecipe {\n public static final com.simibubi.create.foundation.recipe.IRecipeTypeInfo TYPE_INFO;\n public com.mrh0.createaddition.recipe.rolling.RollingRecipe(com.simibubi.create.content.processing.recipe.ProcessingRecipeParams);\n public net.minecraft.world.item.crafting.Ingredient getIngredient();\n public boolean matches(net.neoforged.neoforge.items.wrapper.RecipeWrapper, net.minecraft.world.level.Level);\n public net.minecraft.world.item.ItemStack getResultStack();\n public boolean matches(net.minecraft.world.item.crafting.RecipeInput, net.minecraft.world.level.Level);\n}", + "source_class": "com.mrh0.createaddition.recipe.rolling.RollingRecipe" + } + ], + "recipe_serializers": [ + { + "class": "com.mrh0.createaddition.recipe.charging.ChargingRecipe$Serializer", + "classification": { + "evidence": [ + "com.mrh0.createaddition.recipe.charging.ChargingRecipe$Serializer", + "net.minecraft.world.item.crafting.RecipeSerializer" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.recipe.charging.ChargingRecipe$Serializer", + "net.minecraft.world.item.crafting.RecipeSerializer" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"ChargingRecipe.java\"\npublic class com.mrh0.createaddition.recipe.charging.ChargingRecipe$Serializer implements net.minecraft.world.item.crafting.RecipeSerializer {\n public com.mrh0.createaddition.recipe.charging.ChargingRecipe$Serializer(com.simibubi.create.content.processing.recipe.ProcessingRecipe$Factory);\n public com.mojang.serialization.MapCodec codec();\n public net.minecraft.network.codec.StreamCodec streamCodec();\n}", + "source_class": "com.mrh0.createaddition.recipe.charging.ChargingRecipe.Serializer" + }, + { + "class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe$Serializer", + "classification": { + "evidence": [ + "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe$Serializer", + "net.minecraft.world.item.crafting.RecipeSerializer" + ], + "method": "class_hierarchy" + }, + "hierarchy": { + "evidence": [ + "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe$Serializer", + "net.minecraft.world.item.crafting.RecipeSerializer" + ], + "method": "class_hierarchy" + }, + "public_signature": "Compiled from \"LiquidBurningRecipe.java\"\npublic class com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe$Serializer implements net.minecraft.world.item.crafting.RecipeSerializer {\n public com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe$Serializer(com.simibubi.create.content.processing.recipe.ProcessingRecipe$Factory);\n public com.mojang.serialization.MapCodec codec();\n public net.minecraft.network.codec.StreamCodec streamCodec();\n}", + "source_class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe.Serializer" + } + ], + "recipe_types": [], + "resource_apis": [ + { + "class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity$InterfaceEnergyHandler", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"AbstractConnectorBlockEntity.java\"\nclass com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity$InterfaceEnergyHandler implements net.neoforged.neoforge.energy.IEnergyStorage {\n public com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity$InterfaceEnergyHandler(com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity);\n public int receiveEnergy(int, boolean);\n public int extractEnergy(int, boolean);\n public int getEnergyStored();\n public int getMaxEnergyStored();\n public boolean canExtract();\n public boolean canReceive();\n}", + "source_class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity.InterfaceEnergyHandler" + }, + { + "class": "com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlock", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CreativeEnergyBlock.java\"\npublic class com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlock extends com.simibubi.create.content.logistics.crate.CrateBlock implements com.simibubi.create.foundation.block.IBE {\n public static final net.minecraft.world.phys.shapes.VoxelShape CREATIVE_ENERGY_SHAPE;\n public com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlock(net.minecraft.world.level.block.state.BlockBehaviour$Properties);\n public net.minecraft.world.phys.shapes.VoxelShape getShape(net.minecraft.world.level.block.state.BlockState, net.minecraft.world.level.BlockGetter, net.minecraft.core.BlockPos, net.minecraft.world.phys.shapes.CollisionContext);\n public java.lang.Class getBlockEntityClass();\n public net.minecraft.world.level.block.entity.BlockEntityType getBlockEntityType();\n public void neighborChanged(net.minecraft.world.level.block.state.BlockState, net.minecraft.world.level.Level, net.minecraft.core.BlockPos, net.minecraft.world.level.block.Block, net.minecraft.core.BlockPos, boolean);\n public net.minecraft.world.level.block.entity.BlockEntity newBlockEntity(net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n}", + "source_class": "com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlock" + }, + { + "class": "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterDisplaySource", + "classification": { + "evidence": [ + "source" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"DigitalAdapterDisplaySource.java\"\npublic class com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterDisplaySource extends com.simibubi.create.api.behaviour.display.DisplaySource {\n public com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterDisplaySource();\n public java.util.List provideText(com.simibubi.create.content.redstone.displayLink.DisplayLinkContext, com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats);\n}", + "source_class": "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterDisplaySource" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorDisplaySource", + "classification": { + "evidence": [ + "source" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"ModularAccumulatorDisplaySource.java\"\npublic class com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorDisplaySource extends com.simibubi.create.content.redstone.displayLink.source.PercentOrProgressBarDisplaySource {\n public com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorDisplaySource();\n public void initConfigurationWidgets(com.simibubi.create.content.redstone.displayLink.DisplayLinkContext, com.simibubi.create.foundation.gui.ModularGuiLineBuilder, boolean);\n}", + "source_class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorDisplaySource" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PEIActorVisual", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"PEIActorVisual.java\"\npublic class com.mrh0.createaddition.blocks.portable_energy_interface.PEIActorVisual extends com.simibubi.create.content.contraptions.render.ActorVisual {\n public com.mrh0.createaddition.blocks.portable_energy_interface.PEIActorVisual(dev.engine_room.flywheel.api.visualization.VisualizationContext, com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld, com.simibubi.create.content.contraptions.behaviour.MovementContext);\n public void beginFrame();\n}", + "source_class": "com.mrh0.createaddition.blocks.portable_energy_interface.PEIActorVisual" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PEIInstance", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"PEIInstance.java\"\npublic class com.mrh0.createaddition.blocks.portable_energy_interface.PEIInstance {\n public com.mrh0.createaddition.blocks.portable_energy_interface.PEIInstance(dev.engine_room.flywheel.api.instance.InstancerProvider, net.minecraft.world.level.block.state.BlockState, net.minecraft.core.BlockPos, boolean);\n public void beginFrame(float);\n public void tick(boolean);\n public void remove();\n public void collectCrumblingInstances(java.util.function.Consumer);\n}", + "source_class": "com.mrh0.createaddition.blocks.portable_energy_interface.PEIInstance" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PEIVisual", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"PEIVisual.java\"\npublic class com.mrh0.createaddition.blocks.portable_energy_interface.PEIVisual extends dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual implements dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual, dev.engine_room.flywheel.lib.visual.SimpleTickableVisual {\n public com.mrh0.createaddition.blocks.portable_energy_interface.PEIVisual(dev.engine_room.flywheel.api.visualization.VisualizationContext, com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity, float);\n public void tick(dev.engine_room.flywheel.api.visual.TickableVisual$Context);\n public void beginFrame(dev.engine_room.flywheel.api.visual.DynamicVisual$Context);\n public void updateLight(float);\n public void collectCrumblingInstances(java.util.function.Consumer);\n}", + "source_class": "com.mrh0.createaddition.blocks.portable_energy_interface.PEIVisual" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlock", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"PortableEnergyInterfaceBlock.java\"\npublic class com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlock extends com.simibubi.create.foundation.block.WrenchableDirectionalBlock implements com.simibubi.create.foundation.block.IBE {\n public com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlock(net.minecraft.world.level.block.state.BlockBehaviour$Properties);\n public void neighborChanged(net.minecraft.world.level.block.state.BlockState, net.minecraft.world.level.Level, net.minecraft.core.BlockPos, net.minecraft.world.level.block.Block, net.minecraft.core.BlockPos, boolean);\n public net.minecraft.world.level.block.state.BlockState getStateForPlacement(net.minecraft.world.item.context.BlockPlaceContext);\n public net.minecraft.world.phys.shapes.VoxelShape getShape(net.minecraft.world.level.block.state.BlockState, net.minecraft.world.level.BlockGetter, net.minecraft.core.BlockPos, net.minecraft.world.phys.shapes.CollisionContext);\n public boolean hasAnalogOutputSignal(net.minecraft.world.level.block.state.BlockState);\n public int getAnalogOutputSignal(net.minecraft.world.level.block.state.BlockState, net.minecraft.world.level.Level, net.minecraft.core.BlockPos);\n public java.lang.Class getBlockEntityClass();\n public net.minecraft.world.level.block.entity.BlockEntityType getBlockEntityType();\n public net.minecraft.world.level.block.entity.BlockEntity newBlockEntity(net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n}", + "source_class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlock" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity$InterfaceEnergyHandler", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"PortableEnergyInterfaceBlockEntity.java\"\npublic class com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity$InterfaceEnergyHandler implements net.neoforged.neoforge.energy.IEnergyStorage {\n public com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity$InterfaceEnergyHandler(com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity, net.neoforged.neoforge.energy.IEnergyStorage);\n public int receiveEnergy(int, boolean);\n public int extractEnergy(int, boolean);\n public int getEnergyStored();\n public int getMaxEnergyStored();\n public boolean canExtract();\n public boolean canReceive();\n public void keepAlive();\n}", + "source_class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity.InterfaceEnergyHandler" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceMovement", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"PortableEnergyInterfaceMovement.java\"\npublic class com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceMovement implements com.simibubi.create.api.behaviour.movement.MovementBehaviour {\n public com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceMovement();\n public net.minecraft.world.phys.Vec3 getActiveAreaOffset(com.simibubi.create.content.contraptions.behaviour.MovementContext);\n public void renderInContraption(com.simibubi.create.content.contraptions.behaviour.MovementContext, com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld, com.simibubi.create.content.contraptions.render.ContraptionMatrices, net.minecraft.client.renderer.MultiBufferSource);\n public com.simibubi.create.content.contraptions.render.ActorVisual createVisual(dev.engine_room.flywheel.api.visualization.VisualizationContext, com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld, com.simibubi.create.content.contraptions.behaviour.MovementContext);\n public void visitNewPosition(com.simibubi.create.content.contraptions.behaviour.MovementContext, net.minecraft.core.BlockPos);\n public void tick(com.simibubi.create.content.contraptions.behaviour.MovementContext);\n public void cancelStall(com.simibubi.create.content.contraptions.behaviour.MovementContext);\n public void reset(com.simibubi.create.content.contraptions.behaviour.MovementContext);\n public static net.createmod.catnip.animation.LerpedFloat getAnimation(com.simibubi.create.content.contraptions.behaviour.MovementContext);\n}", + "source_class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceMovement" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceRenderer", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"PortableEnergyInterfaceRenderer.java\"\npublic class com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceRenderer extends com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer {\n public com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceRenderer(net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider$Context);\n public static void renderInContraption(com.simibubi.create.content.contraptions.behaviour.MovementContext, com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld, com.simibubi.create.content.contraptions.render.ContraptionMatrices, net.minecraft.client.renderer.MultiBufferSource);\n}", + "source_class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceRenderer" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"PortableEnergyManager.java\"\npublic class com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager {\n public com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager();\n public static void tick();\n public static void track(com.simibubi.create.content.contraptions.behaviour.MovementContext);\n public static void untrack(com.simibubi.create.content.contraptions.behaviour.MovementContext);\n public static net.neoforged.neoforge.energy.IEnergyStorage get(com.simibubi.create.content.contraptions.Contraption);\n}", + "source_class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager$EnergyData", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"PortableEnergyManager.java\"\npublic class com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager$EnergyData {\n public com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager$EnergyData(net.minecraft.nbt.CompoundTag);\n public int receiveEnergy(int);\n public int extractEnergy(int);\n}", + "source_class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager.EnergyData" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager$EnergyStorageHolder", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"PortableEnergyManager.java\"\npublic class com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager$EnergyStorageHolder implements net.neoforged.neoforge.energy.IEnergyStorage {\n public com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager$EnergyStorageHolder();\n public int receiveEnergy(int, boolean);\n public int extractEnergy(int, boolean);\n public int getEnergyStored();\n public int getMaxEnergyStored();\n public boolean canExtract();\n public boolean canReceive();\n}", + "source_class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager.EnergyStorageHolder" + }, + { + "class": "com.mrh0.createaddition.compat.computercraft.PortableEnergyInterfacePeripheral", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"PortableEnergyInterfacePeripheral.java\"\npublic class com.mrh0.createaddition.compat.computercraft.PortableEnergyInterfacePeripheral implements dan200.computercraft.api.peripheral.IPeripheral {\n public com.mrh0.createaddition.compat.computercraft.PortableEnergyInterfacePeripheral(java.lang.String, com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity);\n public java.lang.String getType();\n public boolean equals(dan200.computercraft.api.peripheral.IPeripheral);\n public java.lang.Object getTarget();\n public final int getEnergy();\n public final int getCapacity();\n public final boolean isConnected();\n public final int getMaxInsert();\n public final int getMaxExtract();\n}", + "source_class": "com.mrh0.createaddition.compat.computercraft.PortableEnergyInterfacePeripheral" + }, + { + "class": "com.mrh0.createaddition.compat.simulated.DockEnergyStorage", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"DockEnergyStorage.java\"\npublic class com.mrh0.createaddition.compat.simulated.DockEnergyStorage implements net.neoforged.neoforge.energy.IEnergyStorage {\n public com.mrh0.createaddition.compat.simulated.DockEnergyStorage(net.minecraft.world.level.block.entity.BlockEntity, int);\n public void connect(net.minecraft.core.BlockPos, com.mrh0.createaddition.compat.simulated.DockEnergyStorage);\n public void disconnect();\n public boolean isConnected();\n public int receiveEnergy(int, boolean);\n public int extractEnergy(int, boolean);\n public int getEnergyStored();\n public int getMaxEnergyStored();\n public boolean canExtract();\n public boolean canReceive();\n public com.mrh0.createaddition.compat.simulated.DockEnergyStorage getConnectedStorage();\n}", + "source_class": "com.mrh0.createaddition.compat.simulated.DockEnergyStorage" + }, + { + "class": "com.mrh0.createaddition.energy.CreativeEnergyStorage", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CreativeEnergyStorage.java\"\npublic class com.mrh0.createaddition.energy.CreativeEnergyStorage implements net.neoforged.neoforge.energy.IEnergyStorage {\n public com.mrh0.createaddition.energy.CreativeEnergyStorage();\n public int receiveEnergy(int, boolean);\n public int extractEnergy(int, boolean);\n public int getEnergyStored();\n public int getMaxEnergyStored();\n public boolean canExtract();\n public boolean canReceive();\n}", + "source_class": "com.mrh0.createaddition.energy.CreativeEnergyStorage" + }, + { + "class": "com.mrh0.createaddition.energy.IEnergyProvider", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"IEnergyProvider.java\"\npublic interface com.mrh0.createaddition.energy.IEnergyProvider {\n public abstract net.neoforged.neoforge.energy.IEnergyStorage getEnergyStorage(net.minecraft.core.Direction);\n}", + "source_class": "com.mrh0.createaddition.energy.IEnergyProvider" + }, + { + "class": "com.mrh0.createaddition.energy.IMultiTileEnergyContainer", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"IMultiTileEnergyContainer.java\"\npublic interface com.mrh0.createaddition.energy.IMultiTileEnergyContainer extends com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer {\n}", + "source_class": "com.mrh0.createaddition.energy.IMultiTileEnergyContainer" + }, + { + "class": "com.mrh0.createaddition.energy.IWireNode", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"IWireNode.java\"\npublic interface com.mrh0.createaddition.energy.IWireNode {\n public abstract com.mrh0.createaddition.energy.IWireNode getWireNode(int);\n public static com.mrh0.createaddition.energy.IWireNode getWireNodeFrom(int, com.mrh0.createaddition.energy.IWireNode, com.mrh0.createaddition.energy.LocalNode[], com.mrh0.createaddition.energy.IWireNode[], net.minecraft.world.level.Level);\n public abstract com.mrh0.createaddition.energy.LocalNode getLocalNode(int);\n public abstract void setNode(int, int, net.minecraft.core.BlockPos, com.mrh0.createaddition.energy.WireType);\n public abstract void removeNode(int, boolean);\n public default void removeNode(int);\n public default void removeNode(com.mrh0.createaddition.energy.LocalNode, boolean);\n public default void removeNode(com.mrh0.createaddition.energy.LocalNode);\n public default int getNodeCount();\n public default int getAvailableNode(net.minecraft.world.phys.Vec3);\n public default int getAvailableNode();\n public default net.minecraft.core.BlockPos getNodePos(int);\n public default com.mrh0.createaddition.energy.WireType getNodeType(int);\n public default int getOtherNodeIndex(int);\n public default boolean hasConnection(int);\n public default boolean hasAnyConnection();\n public default boolean hasConnectionTo(net.minecraft.core.BlockPos);\n public default com.mrh0.createaddition.energy.LocalNode getConnectionTo(net.minecraft.core.BlockPos);\n public default boolean isNodeInput(int);\n public default boolean isNodeOutput(int);\n public abstract net.minecraft.world.phys.Vec3 getNodeOffset(int);\n public abstract net.minecraft.core.BlockPos getPos();\n public abstract void invalidateNodeCache();\n public abstract void setNetwork(int, com.mrh0.createaddition.energy.network.EnergyNetwork);\n public abstract com.mrh0.createaddition.energy.network.EnergyNetwork getNetwork(int);\n public default boolean awakeNetwork(net.minecraft.world.level.Level);\n public default boolean isNetworkValid(int);\n public default boolean isNodeIndeciesConnected(int, int);\n public default boolean validateLocalNodes(com.mrh0.createaddition.energy.LocalNode[]);\n public default void convertOldNbt(net.minecraft.nbt.CompoundTag);\n public default void handleWireCache(net.minecraft.world.level.Level, java.util.Set);\n public default void disconnectWires();\n public default void dropWire(net.minecraft.world.level.Level, com.mrh0.createaddition.energy.LocalNode);\n public default void dropWires(net.minecraft.world.level.Level, boolean);\n public default void dropWires(net.minecraft.world.level.Level, net.minecraft.world.entity.player.Player, boolean);\n public abstract com.mrh0.createaddition.blocks.connector.ConnectorType getConnectorType();\n public static net.minecraft.core.BlockPos readNodeBlockPos(net.minecraft.nbt.CompoundTag, int, net.minecraft.core.BlockPos);\n public static com.mrh0.createaddition.energy.WireType readNodeWireType(net.minecraft.nbt.CompoundTag, int);\n public static int readNodeOtherIndex(net.minecraft.nbt.CompoundTag, int);\n public static net.minecraft.nbt.CompoundTag getNbtNode(net.minecraft.nbt.CompoundTag, int);\n public abstract int getMaxWireLength();\n public static com.mrh0.createaddition.energy.WireConnectResult connect(net.minecraft.world.level.Level, net.minecraft.core.BlockPos, int, net.minecraft.core.BlockPos, int, com.mrh0.createaddition.energy.WireType);\n public static com.mrh0.createaddition.energy.WireConnectResult disconnect(net.minecraft.world.level.Level, net.minecraft.core.BlockPos, net.minecraft.core.BlockPos);\n public static com.mrh0.createaddition.energy.WireType getTypeOfConnection(net.minecraft.world.level.Level, net.minecraft.core.BlockPos, net.minecraft.core.BlockPos);\n public static com.mrh0.createaddition.energy.IWireNode getWireNode(net.minecraft.world.level.Level, net.minecraft.core.BlockPos);\n public static void dropWire(net.minecraft.world.level.Level, net.minecraft.core.BlockPos, net.minecraft.world.item.ItemStack);\n}", + "source_class": "com.mrh0.createaddition.energy.IWireNode" + }, + { + "class": "com.mrh0.createaddition.energy.InternalEnergyStorage", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"InternalEnergyStorage.java\"\npublic class com.mrh0.createaddition.energy.InternalEnergyStorage extends net.neoforged.neoforge.energy.EnergyStorage {\n public com.mrh0.createaddition.energy.InternalEnergyStorage(int);\n public com.mrh0.createaddition.energy.InternalEnergyStorage(int, int);\n public com.mrh0.createaddition.energy.InternalEnergyStorage(int, int, int);\n public com.mrh0.createaddition.energy.InternalEnergyStorage(int, int, int, int);\n public net.minecraft.nbt.CompoundTag write(net.minecraft.nbt.CompoundTag);\n public void read(net.minecraft.nbt.CompoundTag);\n public net.minecraft.nbt.CompoundTag write(net.minecraft.nbt.CompoundTag, java.lang.String);\n public void read(net.minecraft.nbt.CompoundTag, java.lang.String);\n public int getSpace();\n public boolean canExtract();\n public boolean canReceive();\n public int internalConsumeEnergy(int);\n public int internalProduceEnergy(int);\n public void setEnergy(int);\n public void setCapacity(int);\n public void outputToSide(net.minecraft.world.level.Level, net.minecraft.core.BlockPos, net.minecraft.core.Direction, int);\n public java.lang.String toString();\n}", + "source_class": "com.mrh0.createaddition.energy.InternalEnergyStorage" + }, + { + "class": "com.mrh0.createaddition.energy.LocalNode", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"LocalNode.java\"\npublic class com.mrh0.createaddition.energy.LocalNode {\n public static final java.lang.String NODES;\n public static final java.lang.String ID;\n public static final java.lang.String OTHER;\n public static final java.lang.String TYPE;\n public static final java.lang.String X;\n public static final java.lang.String Y;\n public static final java.lang.String Z;\n public com.mrh0.createaddition.energy.LocalNode(net.minecraft.world.level.block.entity.BlockEntity, int, int, com.mrh0.createaddition.energy.WireType, net.minecraft.core.BlockPos);\n public com.mrh0.createaddition.energy.LocalNode(net.minecraft.world.level.block.entity.BlockEntity, net.minecraft.nbt.CompoundTag);\n public void write(net.minecraft.nbt.CompoundTag);\n public void updateRelative(com.mrh0.createaddition.energy.NodeRotation);\n public int getIndex();\n public int getOtherIndex();\n public com.mrh0.createaddition.energy.WireType getType();\n public net.minecraft.core.Vec3i getRelativePos();\n public net.minecraft.core.BlockPos getPos();\n public boolean isInvalid();\n public void invalid();\n}", + "source_class": "com.mrh0.createaddition.energy.LocalNode" + }, + { + "class": "com.mrh0.createaddition.energy.NodeMovementBehaviour", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"NodeMovementBehaviour.java\"\npublic class com.mrh0.createaddition.energy.NodeMovementBehaviour implements com.simibubi.create.api.behaviour.movement.MovementBehaviour {\n public com.mrh0.createaddition.energy.NodeMovementBehaviour();\n public void startMoving(com.simibubi.create.content.contraptions.behaviour.MovementContext);\n}", + "source_class": "com.mrh0.createaddition.energy.NodeMovementBehaviour" + }, + { + "class": "com.mrh0.createaddition.energy.NodeRotation", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"NodeRotation.java\"\npublic final class com.mrh0.createaddition.energy.NodeRotation extends java.lang.Enum implements net.minecraft.util.StringRepresentable {\n public static final com.mrh0.createaddition.energy.NodeRotation NONE;\n public static final com.mrh0.createaddition.energy.NodeRotation Y_CLOCKWISE_90;\n public static final com.mrh0.createaddition.energy.NodeRotation Y_CLOCKWISE_180;\n public static final com.mrh0.createaddition.energy.NodeRotation Y_COUNTERCLOCKWISE_90;\n public static final com.mrh0.createaddition.energy.NodeRotation X_CLOCKWISE_90;\n public static final com.mrh0.createaddition.energy.NodeRotation X_CLOCKWISE_180;\n public static final com.mrh0.createaddition.energy.NodeRotation X_COUNTERCLOCKWISE_90;\n public static final com.mrh0.createaddition.energy.NodeRotation Z_CLOCKWISE_90;\n public static final com.mrh0.createaddition.energy.NodeRotation Z_CLOCKWISE_180;\n public static final com.mrh0.createaddition.energy.NodeRotation Z_COUNTERCLOCKWISE_90;\n public static final net.minecraft.world.level.block.state.properties.EnumProperty ROTATION;\n public static final com.mrh0.createaddition.energy.NodeRotation[] VALUES;\n public static com.mrh0.createaddition.energy.NodeRotation[] values();\n public static com.mrh0.createaddition.energy.NodeRotation valueOf(java.lang.String);\n public net.minecraft.core.Direction rotate(net.minecraft.core.Direction, boolean);\n public net.minecraft.core.Vec3i updateRelative(net.minecraft.core.Vec3i);\n public net.minecraft.core.Direction$Axis getAxis();\n public net.minecraft.world.level.block.Rotation getRotation();\n public java.lang.String getSerializedName();\n public static com.mrh0.createaddition.energy.NodeRotation get(net.minecraft.core.Direction$Axis, net.minecraft.world.level.block.Rotation);\n}", + "source_class": "com.mrh0.createaddition.energy.NodeRotation" + }, + { + "class": "com.mrh0.createaddition.energy.WireConnectResult", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"WireConnectResult.java\"\npublic final class com.mrh0.createaddition.energy.WireConnectResult extends java.lang.Enum {\n public static final com.mrh0.createaddition.energy.WireConnectResult LINKED;\n public static final com.mrh0.createaddition.energy.WireConnectResult LINKED_IN;\n public static final com.mrh0.createaddition.energy.WireConnectResult LINKED_OUT;\n public static final com.mrh0.createaddition.energy.WireConnectResult CONNECT;\n public static final com.mrh0.createaddition.energy.WireConnectResult CONNECT_IN;\n public static final com.mrh0.createaddition.energy.WireConnectResult CONNECT_OUT;\n public static final com.mrh0.createaddition.energy.WireConnectResult LONG;\n public static final com.mrh0.createaddition.energy.WireConnectResult OBSTRUCTED;\n public static final com.mrh0.createaddition.energy.WireConnectResult COUNT;\n public static final com.mrh0.createaddition.energy.WireConnectResult REMOVED;\n public static final com.mrh0.createaddition.energy.WireConnectResult EXISTS;\n public static final com.mrh0.createaddition.energy.WireConnectResult NO_CONNECTION;\n public static final com.mrh0.createaddition.energy.WireConnectResult INVALID;\n public static final com.mrh0.createaddition.energy.WireConnectResult REQUIRES_HIGH_CURRENT;\n public static com.mrh0.createaddition.energy.WireConnectResult[] values();\n public static com.mrh0.createaddition.energy.WireConnectResult valueOf(java.lang.String);\n public net.minecraft.network.chat.Component getMessage();\n public boolean isLinked();\n public boolean isConnect();\n public static com.mrh0.createaddition.energy.WireConnectResult getLink(boolean, boolean);\n public static com.mrh0.createaddition.energy.WireConnectResult getConnect(boolean, boolean);\n}", + "source_class": "com.mrh0.createaddition.energy.WireConnectResult" + }, + { + "class": "com.mrh0.createaddition.energy.WireType", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"WireType.java\"\npublic final class com.mrh0.createaddition.energy.WireType extends java.lang.Enum {\n public static final com.mrh0.createaddition.energy.WireType COPPER;\n public static final com.mrh0.createaddition.energy.WireType GOLD;\n public static final com.mrh0.createaddition.energy.WireType ELECTRUM;\n public static final com.mrh0.createaddition.energy.WireType FESTIVE;\n public static com.mrh0.createaddition.energy.WireType[] values();\n public static com.mrh0.createaddition.energy.WireType valueOf(java.lang.String);\n public static com.mrh0.createaddition.energy.WireType fromIndex(int);\n public int getIndex();\n public net.minecraft.world.item.ItemStack getDrop();\n public net.minecraft.world.item.ItemStack getSourceDrop();\n public int transfer();\n public int getRed();\n public int getGreen();\n public int getBlue();\n public boolean isFestive();\n public static com.mrh0.createaddition.energy.WireType of(net.minecraft.world.item.Item);\n}", + "source_class": "com.mrh0.createaddition.energy.WireType" + }, + { + "class": "com.mrh0.createaddition.energy.network.EnergyNetwork", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"EnergyNetwork.java\"\npublic class com.mrh0.createaddition.energy.network.EnergyNetwork {\n public com.mrh0.createaddition.energy.network.EnergyNetwork(net.minecraft.world.level.Level);\n public int getMaxBuff();\n public void tick(int);\n public int getBuff();\n public int push(int, boolean);\n public int push(int);\n public int demand(int);\n public int getDemand();\n public int getPulled();\n public int getPushed();\n public int pull(int, boolean);\n public int pull(int);\n public static com.mrh0.createaddition.energy.network.EnergyNetwork nextNode(net.minecraft.world.level.Level, com.mrh0.createaddition.energy.network.EnergyNetwork, java.util.Map, com.mrh0.createaddition.energy.IWireNode, int);\n public void invalidate();\n public boolean isValid();\n public void removed();\n public int getId();\n}", + "source_class": "com.mrh0.createaddition.energy.network.EnergyNetwork" + }, + { + "class": "com.mrh0.createaddition.energy.network.EnergyNetworkManager", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"EnergyNetworkManager.java\"\npublic class com.mrh0.createaddition.energy.network.EnergyNetworkManager {\n public static java.util.Map instances;\n public com.mrh0.createaddition.energy.network.EnergyNetworkManager(net.minecraft.world.level.LevelAccessor);\n public void add(com.mrh0.createaddition.energy.network.EnergyNetwork);\n public void tick();\n public static void tickWorld(net.minecraft.world.level.LevelAccessor);\n}", + "source_class": "com.mrh0.createaddition.energy.network.EnergyNetworkManager" + }, + { + "class": "com.mrh0.createaddition.event.ResourceReloadListener", + "classification": { + "evidence": [ + "source" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"ResourceReloadListener.java\"\npublic class com.mrh0.createaddition.event.ResourceReloadListener implements net.minecraft.server.packs.resources.ResourceManagerReloadListener {\n public com.mrh0.createaddition.event.ResourceReloadListener();\n public void onResourceManagerReload(net.minecraft.server.packs.resources.ResourceManager);\n}", + "source_class": "com.mrh0.createaddition.event.ResourceReloadListener" + }, + { + "class": "com.mrh0.createaddition.index.CADisplaySources", + "classification": { + "evidence": [ + "source" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CADisplaySources.java\"\npublic class com.mrh0.createaddition.index.CADisplaySources {\n public static final com.tterrag.registrate.util.entry.RegistryEntry MODULAR_ACCUMULATOR;\n public static final com.tterrag.registrate.util.entry.RegistryEntry DIGITAL_ADAPTER;\n public com.mrh0.createaddition.index.CADisplaySources();\n public static void register();\n}", + "source_class": "com.mrh0.createaddition.index.CADisplaySources" + }, + { + "class": "com.mrh0.createaddition.index.CAFluids", + "classification": { + "evidence": [ + "fluid" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CAFluids.java\"\npublic class com.mrh0.createaddition.index.CAFluids {\n public static com.tterrag.registrate.util.entry.FluidEntry SEED_OIL;\n public static com.tterrag.registrate.util.entry.FluidEntry BIOETHANOL;\n public com.mrh0.createaddition.index.CAFluids();\n public static void register();\n}", + "source_class": "com.mrh0.createaddition.index.CAFluids" + }, + { + "class": "com.mrh0.createaddition.index.CAFluids$NoColorFluidAttributes", + "classification": { + "evidence": [ + "fluid" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CAFluids.java\"\nclass com.mrh0.createaddition.index.CAFluids$NoColorFluidAttributes extends com.simibubi.create.AllFluids$TintedFluidType {\n public com.mrh0.createaddition.index.CAFluids$NoColorFluidAttributes(net.neoforged.neoforge.fluids.FluidType$Properties, net.minecraft.resources.ResourceLocation, net.minecraft.resources.ResourceLocation);\n public int getTintColor(net.minecraft.world.level.material.FluidState, net.minecraft.world.level.BlockAndTintGetter, net.minecraft.core.BlockPos);\n}", + "source_class": "com.mrh0.createaddition.index.CAFluids.NoColorFluidAttributes" + }, + { + "class": "com.mrh0.createaddition.item.CapacitorItem$CapacitorEnergyStorage", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"CapacitorItem.java\"\npublic class com.mrh0.createaddition.item.CapacitorItem$CapacitorEnergyStorage implements net.neoforged.neoforge.energy.IEnergyStorage {\n public com.mrh0.createaddition.item.CapacitorItem$CapacitorEnergyStorage(net.minecraft.world.item.ItemStack);\n public int receiveEnergy(int, boolean);\n public int extractEnergy(int, boolean);\n public int getEnergyStored();\n public int getMaxEnergyStored();\n public boolean canExtract();\n public boolean canReceive();\n}", + "source_class": "com.mrh0.createaddition.item.CapacitorItem.CapacitorEnergyStorage" + }, + { + "class": "com.mrh0.createaddition.mixin.FlowingFluidMixin", + "classification": { + "evidence": [ + "fluid" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"FlowingFluidMixin.java\"\npublic class com.mrh0.createaddition.mixin.FlowingFluidMixin {\n public com.mrh0.createaddition.mixin.FlowingFluidMixin();\n}", + "source_class": "com.mrh0.createaddition.mixin.FlowingFluidMixin" + }, + { + "class": "com.mrh0.createaddition.network.EnergyNetworkPacketPayload", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"EnergyNetworkPacketPayload.java\"\npublic final class com.mrh0.createaddition.network.EnergyNetworkPacketPayload extends java.lang.Record implements net.minecraft.network.protocol.common.custom.CustomPacketPayload {\n public static double clientSaturation;\n public static int clientDemand;\n public static int clientBuff;\n public static final net.minecraft.network.protocol.common.custom.CustomPacketPayload$Type TYPE;\n public static final net.minecraft.network.codec.StreamCodec STREAM_CODEC;\n public com.mrh0.createaddition.network.EnergyNetworkPacketPayload(net.minecraft.core.BlockPos, int, int);\n public net.minecraft.network.protocol.common.custom.CustomPacketPayload$Type type();\n public static void updateClientCache(net.minecraft.core.BlockPos, int, int);\n public static boolean send(net.minecraft.core.BlockPos, int, int, net.minecraft.server.level.ServerPlayer);\n public final java.lang.String toString();\n public final int hashCode();\n public final boolean equals(java.lang.Object);\n public net.minecraft.core.BlockPos pos();\n public int demand();\n public int buff();\n}", + "source_class": "com.mrh0.createaddition.network.EnergyNetworkPacketPayload" + }, + { + "class": "com.mrh0.createaddition.recipe.FluidRecipeWrapper", + "classification": { + "evidence": [ + "fluid" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"FluidRecipeWrapper.java\"\npublic class com.mrh0.createaddition.recipe.FluidRecipeWrapper implements net.minecraft.world.Container,net.minecraft.world.item.crafting.RecipeInput {\n public net.neoforged.neoforge.fluids.FluidStack fluid;\n public com.mrh0.createaddition.recipe.FluidRecipeWrapper(net.neoforged.neoforge.fluids.FluidStack);\n public void clearContent();\n public int getContainerSize();\n public boolean isEmpty();\n public net.minecraft.world.item.ItemStack getItem(int);\n public int size();\n public net.minecraft.world.item.ItemStack removeItem(int, int);\n public net.minecraft.world.item.ItemStack removeItemNoUpdate(int);\n public void setItem(int, net.minecraft.world.item.ItemStack);\n public void setChanged();\n public boolean stillValid(net.minecraft.world.entity.player.Player);\n}", + "source_class": "com.mrh0.createaddition.recipe.FluidRecipeWrapper" + }, + { + "class": "com.mrh0.createaddition.recipe.conditions.HasFluidTagCondition", + "classification": { + "evidence": [ + "fluid" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"HasFluidTagCondition.java\"\npublic final class com.mrh0.createaddition.recipe.conditions.HasFluidTagCondition extends java.lang.Record implements net.neoforged.neoforge.common.conditions.ICondition {\n public static final com.mojang.serialization.MapCodec CODEC;\n public com.mrh0.createaddition.recipe.conditions.HasFluidTagCondition(java.lang.String);\n public com.mrh0.createaddition.recipe.conditions.HasFluidTagCondition(java.lang.String, java.lang.String);\n public com.mrh0.createaddition.recipe.conditions.HasFluidTagCondition(net.minecraft.resources.ResourceLocation);\n public com.mrh0.createaddition.recipe.conditions.HasFluidTagCondition(net.minecraft.tags.TagKey);\n public boolean test(net.neoforged.neoforge.common.conditions.ICondition$IContext);\n public com.mojang.serialization.MapCodec codec();\n public java.lang.String toString();\n public net.minecraft.tags.TagKey tag();\n public final int hashCode();\n public final boolean equals(java.lang.Object);\n}", + "source_class": "com.mrh0.createaddition.recipe.conditions.HasFluidTagCondition" + }, + { + "class": "com.mrh0.createaddition.trains.schedule.condition.EnergyThresholdCondition", + "classification": { + "evidence": [ + "energy" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"EnergyThresholdCondition.java\"\npublic class com.mrh0.createaddition.trains.schedule.condition.EnergyThresholdCondition extends com.simibubi.create.content.trains.schedule.condition.CargoThresholdCondition {\n public com.mrh0.createaddition.trains.schedule.condition.EnergyThresholdCondition();\n public net.minecraft.world.item.ItemStack getSecondLineIcon();\n public int slotsTargeted();\n public boolean lazyTickCompletion(net.minecraft.world.level.Level, com.simibubi.create.content.trains.entity.Train, net.minecraft.nbt.CompoundTag);\n public java.util.List getTitleAs(java.lang.String);\n public net.minecraft.resources.ResourceLocation getId();\n public void initConfigurationWidgets(com.simibubi.create.foundation.gui.ModularGuiLineBuilder);\n public net.minecraft.network.chat.MutableComponent getWaitingStatus(net.minecraft.world.level.Level, com.simibubi.create.content.trains.entity.Train, net.minecraft.nbt.CompoundTag);\n}", + "source_class": "com.mrh0.createaddition.trains.schedule.condition.EnergyThresholdCondition" + } + ], + "station_classes": [ + { + "class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlock", + "classification": { + "evidence": [ + "mill" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"RollingMillBlock.java\"\npublic class com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlock extends com.simibubi.create.content.kinetics.base.HorizontalKineticBlock implements com.simibubi.create.foundation.block.IBE {\n public static final net.minecraft.world.phys.shapes.VoxelShape ROLLING_MILL_SHAPE;\n public com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlock(net.minecraft.world.level.block.state.BlockBehaviour$Properties);\n public net.minecraft.world.phys.shapes.VoxelShape getShape(net.minecraft.world.level.block.state.BlockState, net.minecraft.world.level.BlockGetter, net.minecraft.core.BlockPos, net.minecraft.world.phys.shapes.CollisionContext);\n public void updateEntityAfterFallOn(net.minecraft.world.level.BlockGetter, net.minecraft.world.entity.Entity);\n public void onRemove(net.minecraft.world.level.block.state.BlockState, net.minecraft.world.level.Level, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState, boolean);\n public net.minecraft.world.level.block.state.BlockState getStateForPlacement(net.minecraft.world.item.context.BlockPlaceContext);\n public net.minecraft.core.Direction$Axis getRotationAxis(net.minecraft.world.level.block.state.BlockState);\n public boolean hasShaftTowards(net.minecraft.world.level.LevelReader, net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState, net.minecraft.core.Direction);\n public net.minecraft.world.level.block.entity.BlockEntityType getBlockEntityType();\n public java.lang.Class getBlockEntityClass();\n public net.minecraft.world.level.block.entity.BlockEntity newBlockEntity(net.minecraft.core.BlockPos, net.minecraft.world.level.block.state.BlockState);\n}", + "source_class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlock" + }, + { + "class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity$MillstoneInventoryHandler", + "classification": { + "evidence": [ + "mill" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"RollingMillBlockEntity.java\"\nclass com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity$MillstoneInventoryHandler extends net.neoforged.neoforge.items.wrapper.CombinedInvWrapper {\n public com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity$MillstoneInventoryHandler(com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity);\n public boolean isItemValid(int, net.minecraft.world.item.ItemStack);\n public net.minecraft.world.item.ItemStack insertItem(int, net.minecraft.world.item.ItemStack, boolean);\n public net.minecraft.world.item.ItemStack extractItem(int, int, boolean);\n}", + "source_class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity.MillstoneInventoryHandler" + }, + { + "class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillRenderer", + "classification": { + "evidence": [ + "mill" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"RollingMillRenderer.java\"\npublic class com.mrh0.createaddition.blocks.rolling_mill.RollingMillRenderer extends com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer {\n public com.mrh0.createaddition.blocks.rolling_mill.RollingMillRenderer(net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider$Context);\n}", + "source_class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillRenderer" + }, + { + "class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillVisual", + "classification": { + "evidence": [ + "mill" + ], + "method": "name_term" + }, + "hierarchy": null, + "public_signature": "Compiled from \"RollingMillVisual.java\"\npublic class com.mrh0.createaddition.blocks.rolling_mill.RollingMillVisual extends com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual {\n public com.mrh0.createaddition.blocks.rolling_mill.RollingMillVisual(dev.engine_room.flywheel.api.visualization.VisualizationContext, com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity, float);\n public void update(float);\n public void updateLight(float);\n public void collectCrumblingInstances(java.util.function.Consumer);\n}", + "source_class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillVisual" + } + ] + }, + "kind": "auto_storage_compat_audit", + "recipe_data": { + "declared_recipes": 152, + "digest": "08c912d27581a94ba005c8b58713e3f95942ffa1e2660b23f6db812e0d306034", + "effective_recipes": 152, + "format": 1, + "overrides": [], + "serializers": [ + { + "condition_types": [], + "conditional_recipes": 0, + "fields": [ + "ingredients", + "results", + "type" + ], + "max_array_sizes": { + "ingredients": 4, + "results": 2 + }, + "recipe_count": 3, + "sample_recipe_ids": [ + "createaddition:compacting/biomass_pellet", + "createaddition:compacting/cake_base", + "createaddition:compacting/seed_oil" + ], + "serializer_id": "create:compacting" + }, + { + "condition_types": [ + "neoforge:mod_loaded", + "neoforge:not" + ], + "conditional_recipes": 2, + "fields": [ + "ingredients", + "neoforge:conditions", + "processingTime", + "processing_time", + "results", + "type" + ], + "max_array_sizes": { + "ingredients": 1, + "neoforge:conditions": 1, + "results": 6 + }, + "recipe_count": 6, + "sample_recipe_ids": [ + "create:crushing/ochrum", + "create:crushing/ochrum_recycling", + "create:crushing/tuff", + "create:crushing/tuff_recycling", + "createaddition:compat/immersiveengineering/crushing/steel_ingot", + "createaddition:crushing/diamond" + ], + "serializer_id": "create:crushing" + }, + { + "condition_types": [], + "conditional_recipes": 0, + "fields": [ + "ingredients", + "results", + "type" + ], + "max_array_sizes": { + "ingredients": 2, + "results": 1 + }, + "recipe_count": 3, + "sample_recipe_ids": [ + "createaddition:filling/cake", + "createaddition:filling/chocolate_cake", + "createaddition:filling/honey_cake" + ], + "serializer_id": "create:filling" + }, + { + "condition_types": [ + "neoforge:mod_loaded" + ], + "conditional_recipes": 3, + "fields": [ + "ingredients", + "neoforge:conditions", + "results", + "type" + ], + "max_array_sizes": { + "ingredients": 2, + "neoforge:conditions": 1, + "results": 1 + }, + "recipe_count": 3, + "sample_recipe_ids": [ + "createaddition:compat/immersiveengineering/item_application/kiln_brick", + "createaddition:compat/immersiveengineering/item_application/leaded_concrete", + "createaddition:compat/immersiveengineering/item_application/reinforced_blast_brick" + ], + "serializer_id": "create:item_application" + }, + { + "condition_types": [], + "conditional_recipes": 0, + "fields": [ + "accept_mirrored", + "category", + "key", + "pattern", + "result", + "type" + ], + "max_array_sizes": { + "pattern": 5 + }, + "recipe_count": 3, + "sample_recipe_ids": [ + "createaddition:mechanical_crafting/alternator", + "createaddition:mechanical_crafting/electric_motor", + "createaddition:mechanical_crafting/tesla_coil" + ], + "serializer_id": "create:mechanical_crafting" + }, + { + "condition_types": [ + "neoforge:mod_loaded", + "neoforge:not" + ], + "conditional_recipes": 9, + "fields": [ + "heatRequirement", + "heat_requirement", + "ingredients", + "neoforge:conditions", + "results", + "type" + ], + "max_array_sizes": { + "ingredients": 9, + "neoforge:conditions": 1, + "results": 1 + }, + "recipe_count": 19, + "sample_recipe_ids": [ + "createaddition:compat/immersiveengineering/constantan", + "createaddition:compat/tconstruct/amethyst_bronze", + "createaddition:compat/tconstruct/hepatizon", + "createaddition:compat/tconstruct/manyullyn", + "createaddition:compat/tconstruct/queens_slime", + "createaddition:compat/tconstruct/rose_gold", + "createaddition:compat/tconstruct/slimesteel", + "createaddition:compat/tconstruct/tinkers_bronze", + "createaddition:mixing/bioethanol", + "createaddition:mixing/biomass_from_crops", + "createaddition:mixing/biomass_from_flowers", + "createaddition:mixing/biomass_from_honeycomb", + "createaddition:mixing/biomass_from_leaves", + "createaddition:mixing/biomass_from_plant_foods", + "createaddition:mixing/biomass_from_plants", + "createaddition:mixing/biomass_from_saplings" + ], + "serializer_id": "create:mixing" + }, + { + "condition_types": [], + "conditional_recipes": 0, + "fields": [ + "ingredients", + "results", + "type" + ], + "max_array_sizes": { + "ingredients": 1, + "results": 1 + }, + "recipe_count": 2, + "sample_recipe_ids": [ + "createaddition:pressing/electrum_ingot", + "createaddition:pressing/zinc_ingot" + ], + "serializer_id": "create:pressing" + }, + { + "condition_types": [ + "neoforge:mod_loaded" + ], + "conditional_recipes": 1, + "fields": [ + "energy", + "ingredients", + "max_charge_rate", + "neoforge:conditions", + "results", + "type" + ], + "max_array_sizes": { + "ingredients": 1, + "neoforge:conditions": 1, + "results": 1 + }, + "recipe_count": 53, + "sample_recipe_ids": [ + "createaddition:charging/channeling", + "createaddition:charging/deoxidize_create_exposed_copper_shingle_slab", + "createaddition:charging/deoxidize_create_exposed_copper_shingle_stairs", + "createaddition:charging/deoxidize_create_exposed_copper_shingles", + "createaddition:charging/deoxidize_create_exposed_copper_tile_slab", + "createaddition:charging/deoxidize_create_exposed_copper_tile_stairs", + "createaddition:charging/deoxidize_create_exposed_copper_tiles", + "createaddition:charging/deoxidize_create_oxidized_copper_shingle_slab", + "createaddition:charging/deoxidize_create_oxidized_copper_shingle_stairs", + "createaddition:charging/deoxidize_create_oxidized_copper_shingles", + "createaddition:charging/deoxidize_create_oxidized_copper_tile_slab", + "createaddition:charging/deoxidize_create_oxidized_copper_tile_stairs", + "createaddition:charging/deoxidize_create_oxidized_copper_tiles", + "createaddition:charging/deoxidize_create_weathered_copper_shingle_slab", + "createaddition:charging/deoxidize_create_weathered_copper_shingle_stairs", + "createaddition:charging/deoxidize_create_weathered_copper_shingles" + ], + "serializer_id": "createaddition:charging" + }, + { + "condition_types": [ + "createaddition:has_fluid_tag", + "neoforge:mod_loaded" + ], + "conditional_recipes": 11, + "fields": [ + "burnTime", + "burn_time", + "ingredients", + "input", + "neoforge:conditions", + "results", + "superheated", + "type" + ], + "max_array_sizes": { + "ingredients": 1, + "neoforge:conditions": 1, + "results": 0 + }, + "recipe_count": 14, + "sample_recipe_ids": [ + "createaddition:compat/tconstruct/blaze_blood", + "createaddition:compat/thermal/liquid_burning/heavy_oil", + "createaddition:compat/thermal/liquid_burning/light_oil", + "createaddition:compat/thermal/liquid_burning/refined_fuel", + "createaddition:compat/thermal/liquid_burning/tree_oil", + "createaddition:liquid_burning/biodiesel", + "createaddition:liquid_burning/biofuel", + "createaddition:liquid_burning/creosote", + "createaddition:liquid_burning/crude_oil", + "createaddition:liquid_burning/diesel", + "createaddition:liquid_burning/ethanol", + "createaddition:liquid_burning/gasoline", + "createaddition:liquid_burning/lava", + "createaddition:liquid_burning/plantoil" + ], + "serializer_id": "createaddition:liquid_burning" + }, + { + "condition_types": [ + "neoforge:mod_loaded" + ], + "conditional_recipes": 5, + "fields": [ + "ingredients", + "neoforge:conditions", + "results", + "type" + ], + "max_array_sizes": { + "ingredients": 1, + "neoforge:conditions": 1, + "results": 1 + }, + "recipe_count": 16, + "sample_recipe_ids": [ + "create:rolling/bamboo", + "create:rolling/paper", + "createaddition:compat/immersiveengineering/rolling/aluminum_ingot", + "createaddition:compat/immersiveengineering/rolling/aluminum_plate", + "createaddition:compat/immersiveengineering/rolling/lead_plate", + "createaddition:compat/immersiveengineering/rolling/steel_ingot", + "createaddition:compat/immersiveengineering/rolling/steel_plate", + "createaddition:rolling/brass_rod", + "createaddition:rolling/copper_ingot", + "createaddition:rolling/copper_plate", + "createaddition:rolling/electrum_ingot", + "createaddition:rolling/electrum_plate", + "createaddition:rolling/gold_ingot", + "createaddition:rolling/gold_plate", + "createaddition:rolling/iron_ingot", + "createaddition:rolling/iron_plate" + ], + "serializer_id": "createaddition:rolling" + }, + { + "condition_types": [ + "neoforge:mod_loaded" + ], + "conditional_recipes": 1, + "fields": [ + "biome_predicates", + "fail_chance", + "neoforge:conditions", + "ores", + "spoils", + "type", + "weight" + ], + "max_array_sizes": { + "biome_predicates": 1, + "neoforge:conditions": 1, + "ores": 3, + "spoils": 3 + }, + "recipe_count": 1, + "sample_recipe_ids": [ + "createaddition:compat/immersiveengineering/sphalerite" + ], + "serializer_id": "immersiveengineering:mineral_mix" + }, + { + "condition_types": [ + "neoforge:mod_loaded" + ], + "conditional_recipes": 1, + "fields": [ + "effect", + "neoforge:conditions", + "providers", + "type" + ], + "max_array_sizes": { + "neoforge:conditions": 1, + "providers": 1 + }, + "recipe_count": 1, + "sample_recipe_ids": [ + "createaddition:compat/jeed/shocking" + ], + "serializer_id": "jeed:effect_provider" + }, + { + "condition_types": [ + "neoforge:mod_loaded" + ], + "conditional_recipes": 1, + "fields": [ + "input", + "neoforge:conditions", + "output", + "type" + ], + "max_array_sizes": { + "neoforge:conditions": 1 + }, + "recipe_count": 1, + "sample_recipe_ids": [ + "createaddition:compat/mekanism/rose_quartz_enriching" + ], + "serializer_id": "mekanism:enriching" + }, + { + "condition_types": [ + "neoforge:mod_loaded" + ], + "conditional_recipes": 1, + "fields": [ + "chemical_input", + "item_input", + "neoforge:conditions", + "output", + "per_tick_usage", + "type" + ], + "max_array_sizes": { + "neoforge:conditions": 1 + }, + "recipe_count": 1, + "sample_recipe_ids": [ + "createaddition:compat/mekanism/rose_quartz_metallurgic_infusing" + ], + "serializer_id": "mekanism:metallurgic_infusing" + }, + { + "condition_types": [ + "neoforge:mod_loaded" + ], + "conditional_recipes": 1, + "fields": [ + "category", + "key", + "neoforge:conditions", + "pattern", + "result", + "type" + ], + "max_array_sizes": { + "neoforge:conditions": 1, + "pattern": 3 + }, + "recipe_count": 15, + "sample_recipe_ids": [ + "createaddition:compat/immersiveengineering/fabric_sail", + "createaddition:crafting/barbed_wire", + "createaddition:crafting/biomass_pallet_block", + "createaddition:crafting/capacitor_1", + "createaddition:crafting/capacitor_2", + "createaddition:crafting/copper_spool", + "createaddition:crafting/electrum_amulet", + "createaddition:crafting/electrum_block", + "createaddition:crafting/electrum_ingot_from_nugget", + "createaddition:crafting/electrum_spool", + "createaddition:crafting/gold_spool", + "createaddition:crafting/modular_accumulator", + "createaddition:crafting/redstone_relay", + "createaddition:crafting/rolling_mill", + "createaddition:crafting/spool" + ], + "serializer_id": "minecraft:crafting_shaped" + }, + { + "condition_types": [ + "neoforge:mod_loaded" + ], + "conditional_recipes": 1, + "fields": [ + "category", + "ingredients", + "neoforge:conditions", + "result", + "type" + ], + "max_array_sizes": { + "ingredients": 4, + "neoforge:conditions": 1 + }, + "recipe_count": 10, + "sample_recipe_ids": [ + "createaddition:crafting/biomass_pellet_from_biomass_pallet_block", + "createaddition:crafting/connector", + "createaddition:crafting/diamond_grit_sandpaper", + "createaddition:crafting/digital_adapter", + "createaddition:crafting/electrum_ingot_from_electrum_block", + "createaddition:crafting/electrum_nugget", + "createaddition:crafting/festive_spool", + "createaddition:crafting/large_connector", + "createaddition:crafting/portable_energy_interface", + "createaddition:crafting/small_light_connector" + ], + "serializer_id": "minecraft:crafting_shapeless" + }, + { + "condition_types": [], + "conditional_recipes": 0, + "fields": [ + "category", + "cookingtime", + "experience", + "ingredient", + "result", + "type" + ], + "max_array_sizes": {}, + "recipe_count": 1, + "sample_recipe_ids": [ + "createaddition:smoking/cake_base_baked" + ], + "serializer_id": "minecraft:smoking" + } + ], + "sources": [ + { + "declared_recipes": 152, + "id": "target_jar", + "sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + } + ] + }, + "risks": [ + { + "code": "generic_ingredients", + "disposition": "needs_decision", + "evidence": [ + "com.mrh0.createaddition.recipe.charging.ChargingRecipe#getIngredients via com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe#getIngredients via com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "com.mrh0.createaddition.recipe.rolling.RollingRecipe#getIngredients via com.simibubi.create.content.processing.recipe.ProcessingRecipe" + ] + }, + { + "code": "randomness", + "disposition": "needs_decision", + "evidence": [ + "com.mrh0.createaddition.recipe.charging.ChargingRecipe: Random via com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe: Random via com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "com.mrh0.createaddition.recipe.rolling.RollingRecipe: Random via com.simibubi.create.content.processing.recipe.ProcessingRecipe" + ] + }, + { + "code": "world_mutation", + "disposition": "needs_decision", + "evidence": [ + "com.mrh0.createaddition.recipe.charging.ChargingRecipe: world API", + "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe: world API", + "com.mrh0.createaddition.recipe.rolling.RollingRecipe: world API" + ] + } + ], + "scanner_format": 17, + "schema": 1, + "source": { + "files": [ + "src/main/java/com/mrh0/createaddition/blocks/alternator/AlternatorBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/connector/LargeConnectorBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/connector/SmallConnectorBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/connector/SmallLightConnectorBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/connector/base/AbstractConnectorBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/creative_energy/CreativeEnergyBlock.java", + "src/main/java/com/mrh0/createaddition/blocks/creative_energy/CreativeEnergyBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/digital_adapter/DigitalAdapterBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/digital_adapter/DigitalAdapterDisplaySource.java", + "src/main/java/com/mrh0/createaddition/blocks/electric_motor/ElectricMotorBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/liquid_blaze_burner/LiquidBlazeBurnerBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/modular_accumulator/ModularAccumulatorBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/modular_accumulator/ModularAccumulatorDisplaySource.java", + "src/main/java/com/mrh0/createaddition/blocks/portable_energy_interface/PEIActorVisual.java", + "src/main/java/com/mrh0/createaddition/blocks/portable_energy_interface/PEIInstance.java", + "src/main/java/com/mrh0/createaddition/blocks/portable_energy_interface/PEIVisual.java", + "src/main/java/com/mrh0/createaddition/blocks/portable_energy_interface/PortableEnergyInterfaceBlock.java", + "src/main/java/com/mrh0/createaddition/blocks/portable_energy_interface/PortableEnergyInterfaceBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/portable_energy_interface/PortableEnergyInterfaceMovement.java", + "src/main/java/com/mrh0/createaddition/blocks/portable_energy_interface/PortableEnergyInterfaceRenderer.java", + "src/main/java/com/mrh0/createaddition/blocks/portable_energy_interface/PortableEnergyManager.java", + "src/main/java/com/mrh0/createaddition/blocks/redstone_relay/RedstoneRelayBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/rolling_mill/RollingMillBlock.java", + "src/main/java/com/mrh0/createaddition/blocks/rolling_mill/RollingMillBlockEntity.java", + "src/main/java/com/mrh0/createaddition/blocks/rolling_mill/RollingMillRenderer.java", + "src/main/java/com/mrh0/createaddition/blocks/rolling_mill/RollingMillVisual.java", + "src/main/java/com/mrh0/createaddition/blocks/tesla_coil/TeslaCoilBlockEntity.java", + "src/main/java/com/mrh0/createaddition/compat/computercraft/PortableEnergyInterfacePeripheral.java", + "src/main/java/com/mrh0/createaddition/compat/jei/AnimatedRollingMill.java", + "src/main/java/com/mrh0/createaddition/compat/jei/AnimatedTeslaCoil.java", + "src/main/java/com/mrh0/createaddition/compat/jei/CARecipeCategory.java", + "src/main/java/com/mrh0/createaddition/compat/jei/ChargingCategory.java", + "src/main/java/com/mrh0/createaddition/compat/jei/CreateAdditionJEI.java", + "src/main/java/com/mrh0/createaddition/compat/jei/LiquidBurningCategory.java", + "src/main/java/com/mrh0/createaddition/compat/jei/RollingMillAssemblySubCategory.java", + "src/main/java/com/mrh0/createaddition/compat/jei/RollingMillCategory.java", + "src/main/java/com/mrh0/createaddition/compat/simulated/DockEnergyStorage.java", + "src/main/java/com/mrh0/createaddition/datagen/CADamageTypesDatagen.java", + "src/main/java/com/mrh0/createaddition/datagen/CAPotatoProjectileTypesDatagen.java", + "src/main/java/com/mrh0/createaddition/datagen/CreateAdditionsDataGen.java", + "src/main/java/com/mrh0/createaddition/datagen/Models/BlockGenHelper.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeBuilders/CALiquidBurningRecipeBuilder.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeBuilders/CARecipeBuilder.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeBuilders/ChargingRecipeBuilder.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeGen/ChargingRecipeGen.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeGen/LiquidBurningRecipeGen.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeGen/RollingRecipeGen.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeProvider/CAChargingRecipeProvider.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeProvider/CACompactingRecipeGen.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeProvider/CACraftingRecipeProvider.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeProvider/CACrushingRecipeGen.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeProvider/CAFillingRecipeGen.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeProvider/CALiquidBurningRecipeProvider.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeProvider/CAMechanicalCrafterRecipeGen.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeProvider/CAMixingRecipeGen.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeProvider/CAPressingRecipeGen.java", + "src/main/java/com/mrh0/createaddition/datagen/RecipeProvider/CARollingRecipeGen.java", + "src/main/java/com/mrh0/createaddition/datagen/TagProvider/CABlockTagProvider.java", + "src/main/java/com/mrh0/createaddition/datagen/TagProvider/CAFluidTagProvider.java", + "src/main/java/com/mrh0/createaddition/datagen/TagProvider/CAItemTagProvider.java", + "src/main/java/com/mrh0/createaddition/datagen/TagProvider/CATagRegister.java", + "src/main/java/com/mrh0/createaddition/energy/AbstractElectricBlockEntity.java", + "src/main/java/com/mrh0/createaddition/energy/CreativeEnergyStorage.java", + "src/main/java/com/mrh0/createaddition/energy/IEnergyProvider.java", + "src/main/java/com/mrh0/createaddition/energy/IMultiTileEnergyContainer.java", + "src/main/java/com/mrh0/createaddition/energy/IWireNode.java", + "src/main/java/com/mrh0/createaddition/energy/InternalEnergyStorage.java", + "src/main/java/com/mrh0/createaddition/energy/LocalNode.java", + "src/main/java/com/mrh0/createaddition/energy/NodeMovementBehaviour.java", + "src/main/java/com/mrh0/createaddition/energy/NodeRotation.java", + "src/main/java/com/mrh0/createaddition/energy/WireConnectResult.java", + "src/main/java/com/mrh0/createaddition/energy/WireType.java", + "src/main/java/com/mrh0/createaddition/energy/network/EnergyNetwork.java", + "src/main/java/com/mrh0/createaddition/energy/network/EnergyNetworkManager.java", + "src/main/java/com/mrh0/createaddition/event/ResourceReloadListener.java", + "src/main/java/com/mrh0/createaddition/index/CADisplaySources.java", + "src/main/java/com/mrh0/createaddition/index/CAFluids.java", + "src/main/java/com/mrh0/createaddition/item/CapacitorItem.java", + "src/main/java/com/mrh0/createaddition/mixin/FlowingFluidMixin.java", + "src/main/java/com/mrh0/createaddition/network/EnergyNetworkPacketPayload.java", + "src/main/java/com/mrh0/createaddition/recipe/FluidRecipeWrapper.java", + "src/main/java/com/mrh0/createaddition/recipe/charging/ChargingRecipe.java", + "src/main/java/com/mrh0/createaddition/recipe/conditions/HasFluidTagCondition.java", + "src/main/java/com/mrh0/createaddition/recipe/liquid_burning/LiquidBurningRecipe.java", + "src/main/java/com/mrh0/createaddition/recipe/rolling/RollingRecipe.java", + "src/main/java/com/mrh0/createaddition/trains/schedule/condition/EnergyThresholdCondition.java" + ], + "revision": "84c7b2ceafc0b382da4606ac0770085e63104c3a" + }, + "structural_candidate_inventory_sha256": "f1e15b83f2c0a7c14ee8349ff071e0465694030e5811dd2b54ffc31cbe9dc95c", + "structural_class_graph": [ + { + "class": "com.mrh0.createaddition.CreateAddition", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.alternator.AlternatorBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.foundation.block.IBE", + "com.simibubi.create.content.kinetics.base.IRotate" + ], + "super_class": "com.simibubi.create.content.kinetics.base.DirectionalKineticBlock" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.alternator.AlternatorBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.mrh0.createaddition.energy.IEnergyProvider" + ], + "super_class": "com.simibubi.create.content.kinetics.base.KineticBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.alternator.AlternatorRenderer", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.alternator.AlternatorVisual", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.barbed_wire.BarbedWireBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.neoforged.neoforge.common.IShearable", + "net.minecraft.world.level.block.SimpleWaterloggedBlock" + ], + "super_class": "net.minecraft.world.level.block.Block" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.cake.CACakeBlock", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.level.block.CakeBlock" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.centrifugal_governor.CentrifugalGovernor", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.ConnectorType", + "metadata": { + "access_flags": 16433, + "interfaces": [], + "super_class": "java.lang.Enum" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.LargeConnectorBlock", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlock" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.LargeConnectorBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.SmallConnectorBlock", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlock" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.SmallConnectorBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.SmallLightConnectorBlock", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlock" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.SmallLightConnectorBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlock", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "com.simibubi.create.foundation.block.IBE", + "com.simibubi.create.content.equipment.wrench.IWrenchable", + "com.simibubi.create.api.contraption.transformable.TransformableBlock" + ], + "super_class": "net.minecraft.world.level.block.Block" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "com.mrh0.createaddition.energy.IWireNode", + "com.mrh0.createaddition.network.IObserveBlockEntity", + "com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation", + "com.mrh0.createaddition.debug.IDebugDrawer", + "com.mrh0.createaddition.energy.IEnergyProvider" + ], + "super_class": "com.simibubi.create.foundation.blockEntity.SmartBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity$InterfaceEnergyHandler", + "metadata": { + "access_flags": 32, + "interfaces": [ + "net.neoforged.neoforge.energy.IEnergyStorage" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.base.ConnectorMode", + "metadata": { + "access_flags": 16433, + "interfaces": [ + "net.minecraft.util.StringRepresentable" + ], + "super_class": "java.lang.Enum" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.base.ConnectorRenderer", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.rendering.WireNodeRenderer" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.connector.base.ConnectorVariant", + "metadata": { + "access_flags": 16433, + "interfaces": [ + "net.minecraft.util.StringRepresentable" + ], + "super_class": "java.lang.Enum" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.foundation.block.IBE" + ], + "super_class": "com.simibubi.create.content.logistics.crate.CrateBlock" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.logistics.crate.CrateBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.crops.HarmfulPlantBlock", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.level.block.CropBlock" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.foundation.block.IBE", + "com.simibubi.create.content.equipment.wrench.IWrenchable" + ], + "super_class": "net.minecraft.world.level.block.Block" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.level.block.entity.BlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterBlockItem", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.item.BlockItem" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterDisplaySource", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.api.behaviour.display.DisplaySource" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.electric_motor.ElectricMotorBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.foundation.block.IBE" + ], + "super_class": "com.simibubi.create.content.kinetics.base.DirectionalKineticBlock" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.electric_motor.ElectricMotorBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.base.GeneratingKineticBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.electric_motor.ElectricMotorRenderer", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.electric_motor.ElectricMotorVisual", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.foundation.block.IBE", + "com.simibubi.create.content.equipment.wrench.IWrenchable" + ], + "super_class": "net.minecraft.world.level.block.HorizontalDirectionalBlock" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation", + "com.mrh0.createaddition.network.IObserveBlockEntity" + ], + "super_class": "com.simibubi.create.foundation.blockEntity.SmartBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlockEntity$FuelType", + "metadata": { + "access_flags": 16433, + "interfaces": [], + "super_class": "java.lang.Enum" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerRenderer", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerVisual", + "metadata": { + "access_flags": 33, + "interfaces": [ + "dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual", + "dev.engine_room.flywheel.lib.visual.SimpleTickableVisual" + ], + "super_class": "dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.CAConnectivityHandler", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.CAConnectivityHandler$SearchCache", + "metadata": { + "access_flags": 32, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.content.equipment.wrench.IWrenchable", + "com.simibubi.create.foundation.block.IBE" + ], + "super_class": "net.minecraft.world.level.block.Block" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation", + "com.mrh0.createaddition.energy.IMultiTileEnergyContainer", + "com.mrh0.createaddition.network.IObserveBlockEntity", + "com.mrh0.createaddition.debug.IDebugDrawer", + "com.simibubi.create.content.redstone.thresholdSwitch.ThresholdSwitchObservable" + ], + "super_class": "com.simibubi.create.foundation.blockEntity.SmartBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlockItem", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.item.BlockItem" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorCTBehaviour", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.foundation.block.connected.HorizontalCTBehaviour" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorDisplaySource", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.redstone.displayLink.source.PercentOrProgressBarDisplaySource" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorMovement", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.api.behaviour.movement.MovementBehaviour" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorMovement$TemporaryData", + "metadata": { + "access_flags": 32, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorRenderer", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PEIActorVisual", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.contraptions.render.ActorVisual" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PEIInstance", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PEIVisual", + "metadata": { + "access_flags": 33, + "interfaces": [ + "dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual", + "dev.engine_room.flywheel.lib.visual.SimpleTickableVisual" + ], + "super_class": "dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.foundation.block.IBE" + ], + "super_class": "com.simibubi.create.foundation.block.WrenchableDirectionalBlock" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity$InterfaceEnergyHandler", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.neoforged.neoforge.energy.IEnergyStorage" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceMovement", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.api.behaviour.movement.MovementBehaviour" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceRenderer", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager$EnergyData", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyManager$EnergyStorageHolder", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.neoforged.neoforge.energy.IEnergyStorage" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.redstone_relay.RedstoneRelayBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.foundation.block.IBE", + "com.simibubi.create.content.equipment.wrench.IWrenchable", + "com.simibubi.create.api.contraption.transformable.TransformableBlock" + ], + "super_class": "net.minecraft.world.level.block.Block" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.redstone_relay.RedstoneRelayBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.mrh0.createaddition.energy.IWireNode", + "com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation", + "com.mrh0.createaddition.network.IObserveBlockEntity" + ], + "super_class": "com.simibubi.create.foundation.blockEntity.SmartBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.redstone_relay.RedstoneRelayRenderer", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.rendering.WireNodeRenderer" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.foundation.block.IBE" + ], + "super_class": "com.simibubi.create.content.kinetics.base.HorizontalKineticBlock" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.base.KineticBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity$MillstoneInventoryHandler", + "metadata": { + "access_flags": 32, + "interfaces": [], + "super_class": "net.neoforged.neoforge.items.wrapper.CombinedInvWrapper" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillRenderer", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillVisual", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.sprinkler.SprinklerBlock", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.stator.StatorBlock", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.tesla_coil.TeslaCoilBeltCallbacks", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.tesla_coil.TeslaCoilBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.foundation.block.IBE", + "com.simibubi.create.content.equipment.wrench.IWrenchable" + ], + "super_class": "net.minecraft.world.level.block.Block" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.blocks.tesla_coil.TeslaCoilBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation", + "com.mrh0.createaddition.network.IObserveBlockEntity" + ], + "super_class": "com.mrh0.createaddition.energy.AbstractElectricBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.commands.CCApiCommand", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.computercraft.DigitalAdapterPeripheral", + "metadata": { + "access_flags": 33, + "interfaces": [ + "dan200.computercraft.api.peripheral.IPeripheral" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.computercraft.ElectricMotorPeripheral", + "metadata": { + "access_flags": 33, + "interfaces": [ + "dan200.computercraft.api.peripheral.IPeripheral" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.computercraft.Helpers", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.computercraft.ModularAccumulatorPeripheral", + "metadata": { + "access_flags": 33, + "interfaces": [ + "dan200.computercraft.api.peripheral.IPeripheral" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.computercraft.Peripherals", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.computercraft.PortableEnergyInterfacePeripheral", + "metadata": { + "access_flags": 33, + "interfaces": [ + "dan200.computercraft.api.peripheral.IPeripheral" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.computercraft.RedstoneRelayPeripheral", + "metadata": { + "access_flags": 33, + "interfaces": [ + "dan200.computercraft.api.peripheral.IPeripheral" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.jei.AnimatedRollingMill", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.compat.jei.category.animations.AnimatedKinetics" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.jei.AnimatedTeslaCoil", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.compat.jei.category.animations.AnimatedKinetics" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.jei.CARecipeCategory", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.compat.jei.category.CreateRecipeCategory" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.jei.ChargingCategory", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.compat.jei.CARecipeCategory" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.jei.CreateAdditionJEI", + "metadata": { + "access_flags": 33, + "interfaces": [ + "mezz.jei.api.IModPlugin" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.jei.CreateAdditionJEI$CategoryBuilder", + "metadata": { + "access_flags": 32, + "interfaces": [], + "super_class": "com.simibubi.create.compat.jei.category.CreateRecipeCategory$Builder" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.jei.LiquidBurningCategory", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.compat.jei.CARecipeCategory" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.jei.RollingMillAssemblySubCategory", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.compat.jei.category.sequencedAssembly.SequencedAssemblySubCategory" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.jei.RollingMillCategory", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.compat.jei.CARecipeCategory" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.simulated.DockEnergyStorage", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.neoforged.neoforge.energy.IEnergyStorage" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.simulated.DockingConnectorBEAccess", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.compat.simulated.SIMCapabilities", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.config.ClientConfig", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.config.CommonConfig", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.config.ServerConfig", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.CADamageTypesDatagen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.CAPotatoProjectileTypesDatagen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.CreateAdditionsDataGen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.Models.BlockGenHelper", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeBuilders.CALiquidBurningRecipeBuilder", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.datagen.RecipeBuilders.CARecipeBuilder" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeBuilders.CARecipeBuilder", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "net.minecraft.data.recipes.RecipeBuilder" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeBuilders.ChargingRecipeBuilder", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.datagen.RecipeBuilders.CARecipeBuilder" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeGen.ChargingRecipeGen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.ProcessingRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeGen.LiquidBurningRecipeGen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.ProcessingRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeGen.RollingRecipeGen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CAChargingRecipeProvider", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.datagen.RecipeGen.ChargingRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CACompactingRecipeGen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.CompactingRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CACraftingRecipeProvider", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.data.recipes.RecipeProvider" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CACraftingRecipeProvider$SaveUtility", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CACrushingRecipeGen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.CrushingRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CAFillingRecipeGen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.FillingRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CALiquidBurningRecipeProvider", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.datagen.RecipeGen.LiquidBurningRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CAMechanicalCrafterRecipeGen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.MechanicalCraftingRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CAMixingRecipeGen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.MixingRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CAPressingRecipeGen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.PressingRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.RecipeProvider.CARollingRecipeGen", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.mrh0.createaddition.datagen.RecipeGen.RollingRecipeGen" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CABlockTagProvider", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.neoforged.neoforge.common.data.BlockTagsProvider" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CAFluidTagProvider", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.data.tags.FluidTagsProvider" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CAItemTagProvider", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.data.tags.ItemTagsProvider" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Blocks", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Fluids", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.datagen.TagProvider.CATagRegister$Items", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.debug.CADebugger", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.debug.IDebugDrawer", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.effect.ShockingEffect", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.effect.MobEffect" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.AbstractElectricBlockEntity", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.foundation.blockEntity.SmartBlockEntity" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.CreativeEnergyStorage", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.neoforged.neoforge.energy.IEnergyStorage" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.IEnergyProvider", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.IMultiTileEnergyContainer", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.IWireNode", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.InternalEnergyStorage", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.neoforged.neoforge.energy.EnergyStorage" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.LocalNode", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.NodeMovementBehaviour", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.api.behaviour.movement.MovementBehaviour" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.NodeRotation", + "metadata": { + "access_flags": 16433, + "interfaces": [ + "net.minecraft.util.StringRepresentable" + ], + "super_class": "java.lang.Enum" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.WireConnectResult", + "metadata": { + "access_flags": 16433, + "interfaces": [], + "super_class": "java.lang.Enum" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.WireType", + "metadata": { + "access_flags": 16433, + "interfaces": [], + "super_class": "java.lang.Enum" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.network.EnergyNetwork", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.energy.network.EnergyNetworkManager", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.event.ClientEventHandler", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.event.ClientEventHandler$ModBusEvents", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.event.GameEvents", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.event.ResourceReloadListener", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.minecraft.server.packs.resources.ResourceManagerReloadListener" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CAAdvancements", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CAArmInteractions", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CAArmInteractions$LiquidBlazeBurnerPoint", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.mechanicalArm.AllArmInteractionPointTypes$DepositOnlyArmInteractionPoint" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CAArmInteractions$LiquidBlazeBurnerType", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointType" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CABlockEntities", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CABlocks", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CACapabilities", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CADamageTypes", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CADisplaySources", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CAEffects", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CAEntities", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CAFluids", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CAFluids$NoColorFluidAttributes", + "metadata": { + "access_flags": 32, + "interfaces": [], + "super_class": "com.simibubi.create.AllFluids$TintedFluidType" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CAItems", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CALang", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CAPartials", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CAPonders", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CARecipes", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CASounds", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.index.CASpriteShifts", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.item.BiomassPelletBlockItem", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.item.BlockItem" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.item.BiomassPelletItem", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.item.Item" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.item.BrassAmuletItem", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.item.Item" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.item.CADebuggerItem", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.item.Item" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.item.CapacitorItem", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.item.Item" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.item.CapacitorItem$CapacitorEnergyStorage", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.neoforged.neoforge.energy.IEnergyStorage" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.item.DiamondGritSandpaperItem", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.equipment.sandPaper.SandPaperItem" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.item.ElectrumAmuletItem", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.item.Item" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.item.WireSpool", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.item.Item" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.mixin.BaseFireBlockMixin", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.mixin.BlockMovementChecksMixin", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.mixin.ContraptionMixin", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.mixin.DockingConnectorBEMixin", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "com.mrh0.createaddition.compat.simulated.DockingConnectorBEAccess" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.mixin.FireBlockInvoker", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.mixin.FireBlockMixin", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.mixin.FlowingFluidMixin", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.network.ClientPayloadHandler", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.network.EnergyNetworkPacketPayload", + "metadata": { + "access_flags": 49, + "interfaces": [ + "net.minecraft.network.protocol.common.custom.CustomPacketPayload" + ], + "super_class": "java.lang.Record" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.network.IObserveBlockEntity", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.network.ObservePacketPayload", + "metadata": { + "access_flags": 49, + "interfaces": [ + "net.minecraft.network.protocol.common.custom.CustomPacketPayload" + ], + "super_class": "java.lang.Record" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.network.ServerPayloadHandler", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.network.TimeRemainingPacketPayload", + "metadata": { + "access_flags": 49, + "interfaces": [ + "net.minecraft.network.protocol.common.custom.CustomPacketPayload" + ], + "super_class": "java.lang.Record" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.ponder.CAPonderPlugin", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.createmod.ponder.api.registration.PonderPlugin" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.ponder.DebugScenes", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.ponder.PonderScenes", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.FluidRecipeWrapper", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.minecraft.world.Container", + "net.minecraft.world.item.crafting.RecipeInput" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.charging.ChargingRecipe", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.processing.recipe.ProcessingRecipe" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.charging.ChargingRecipe$Builder", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.charging.ChargingRecipe$Factory", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "com.simibubi.create.content.processing.recipe.ProcessingRecipe$Factory" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.charging.ChargingRecipe$Serializer", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.minecraft.world.item.crafting.RecipeSerializer" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.charging.ChargingRecipeParams", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.processing.recipe.ProcessingRecipeParams" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.conditions.HasFluidTagCondition", + "metadata": { + "access_flags": 49, + "interfaces": [ + "net.neoforged.neoforge.common.conditions.ICondition" + ], + "super_class": "java.lang.Record" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.processing.recipe.ProcessingRecipe" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe$Builder", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe$Factory", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "com.simibubi.create.content.processing.recipe.ProcessingRecipe$Factory" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe$Serializer", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.minecraft.world.item.crafting.RecipeSerializer" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipeParams", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.processing.recipe.ProcessingRecipeParams" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.recipe.rolling.RollingRecipe", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.processing.recipe.StandardProcessingRecipe" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.rendering.CARenderType", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.client.renderer.RenderType" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.rendering.WireNodeRenderer", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.minecraft.client.renderer.blockentity.BlockEntityRenderer" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.shapes.CAShapes", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.shapes.CAShapes$Builder", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.sound.CAContinuousSound", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.client.resources.sounds.AbstractTickableSoundInstance" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.sound.CASoundScape", + "metadata": { + "access_flags": 32, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.sound.CASoundScapes", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.sound.CASoundScapes$AmbienceGroup", + "metadata": { + "access_flags": 16433, + "interfaces": [], + "super_class": "java.lang.Enum" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.sound.CASoundScapes$PitchGroup", + "metadata": { + "access_flags": 16433, + "interfaces": [], + "super_class": "java.lang.Enum" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.trains.schedule.CASchedule", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.trains.schedule.condition.EnergyThresholdCondition", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.trains.schedule.condition.CargoThresholdCondition" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.util.ClientMinecraftWrapper", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.util.IComparatorOverride", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.util.Util", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.mrh0.createaddition.util.Util$Triple", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + { + "class": "com.simibubi.create.AllFluids$TintedFluidType", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "net.neoforged.neoforge.fluids.FluidType" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.behaviour.display.DisplaySource", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.behaviour.movement.MovementBehaviour", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.contraption.transformable.TransformableBlock", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.data.recipe.BaseRecipeProvider", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "net.minecraft.data.recipes.RecipeProvider" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.data.recipe.CompactingRecipeGen", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.data.recipe.CrushingRecipeGen", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.data.recipe.FillingRecipeGen", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.data.recipe.MechanicalCraftingRecipeGen", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.BaseRecipeProvider" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.data.recipe.MixingRecipeGen", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.data.recipe.PressingRecipeGen", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.data.recipe.ProcessingRecipeGen", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.BaseRecipeProvider" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.data.recipe.StandardProcessingRecipeGen", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.api.data.recipe.ProcessingRecipeGen" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.equipment.goggles.IHaveCustomOverlayIcon", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "com.simibubi.create.api.equipment.goggles.IHaveCustomOverlayIcon" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.equipment.goggles.IHaveHoveringInformation", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "com.simibubi.create.api.equipment.goggles.IHaveCustomOverlayIcon" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.schematic.nbt.PartialSafeNBT", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.api.schematic.requirement.SpecialBlockEntityItemRequirement", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.compat.jei.category.CreateRecipeCategory", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "mezz.jei.api.recipe.category.IRecipeCategory" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.compat.jei.category.CreateRecipeCategory$Builder", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.compat.jei.category.animations.AnimatedKinetics", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "mezz.jei.api.gui.drawable.IDrawable" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.compat.jei.category.sequencedAssembly.SequencedAssemblySubCategory", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.foundation.blockEntity.SmartBlockEntity" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.contraptions.render.ActorVisual", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "dev.engine_room.flywheel.api.visual.Visual" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.equipment.sandPaper.SandPaperItem", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.foundation.item.CustomUseEffectsItem" + ], + "super_class": "net.minecraft.world.item.Item" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.equipment.wrench.IWrenchable", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.kinetics.base.DirectionalKineticBlock", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.base.KineticBlock" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.kinetics.base.GeneratingKineticBlockEntity", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.base.KineticBlockEntity" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.kinetics.base.HorizontalKineticBlock", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.base.KineticBlock" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.kinetics.base.IRotate", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "com.simibubi.create.content.equipment.wrench.IWrenchable" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.kinetics.base.KineticBlock", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "com.simibubi.create.content.kinetics.base.IRotate" + ], + "super_class": "net.minecraft.world.level.block.Block" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.kinetics.base.KineticBlockEntity", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation", + "com.simibubi.create.api.equipment.goggles.IHaveHoveringInformation" + ], + "super_class": "com.simibubi.create.foundation.blockEntity.SmartBlockEntity" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.kinetics.mechanicalArm.AllArmInteractionPointTypes$DepositOnlyArmInteractionPoint", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPoint" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPoint", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointType", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.logistics.crate.CrateBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.content.equipment.wrench.IWrenchable" + ], + "super_class": "com.simibubi.create.foundation.block.WrenchableDirectionalBlock" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.logistics.crate.CrateBlockEntity", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.foundation.blockEntity.SmartBlockEntity" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "net.minecraft.world.item.crafting.Recipe" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.processing.recipe.ProcessingRecipe$Factory", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.processing.recipe.ProcessingRecipeParams", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.processing.recipe.StandardProcessingRecipe", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.content.processing.recipe.ProcessingRecipe" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.redstone.displayLink.source.NumericSingleLineDisplaySource", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.content.redstone.displayLink.source.SingleLineDisplaySource" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.redstone.displayLink.source.PercentOrProgressBarDisplaySource", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.content.redstone.displayLink.source.NumericSingleLineDisplaySource" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.redstone.displayLink.source.SingleLineDisplaySource", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.api.behaviour.display.DisplaySource" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.redstone.thresholdSwitch.ThresholdSwitchObservable", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.trains.schedule.IScheduleInput", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.trains.schedule.ScheduleDataEntry", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "com.simibubi.create.content.trains.schedule.IScheduleInput" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.trains.schedule.condition.CargoThresholdCondition", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.content.trains.schedule.condition.LazyTickedScheduleCondition" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.trains.schedule.condition.LazyTickedScheduleCondition", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.content.trains.schedule.condition.ScheduleWaitCondition" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.content.trains.schedule.condition.ScheduleWaitCondition", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.content.trains.schedule.ScheduleDataEntry" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.block.IBE", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "net.minecraft.world.level.block.EntityBlock" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.block.WrenchableDirectionalBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "com.simibubi.create.content.equipment.wrench.IWrenchable" + ], + "super_class": "net.minecraft.world.level.block.DirectionalBlock" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour$Base", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.block.connected.HorizontalCTBehaviour", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour$Base" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "com.simibubi.create.api.schematic.nbt.PartialSafeNBT", + "com.simibubi.create.foundation.utility.IInteractionChecker", + "com.simibubi.create.api.schematic.requirement.SpecialBlockEntityItemRequirement", + "net.createmod.ponder.api.VirtualBlockEntity" + ], + "super_class": "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "net.minecraft.world.level.block.entity.BlockEntity" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "net.minecraft.client.renderer.blockentity.BlockEntityRenderer" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.item.CustomUseEffectsItem", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "com.simibubi.create.foundation.utility.IInteractionChecker", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "f0652bee27460f2d26a748f537cb5d687981441378d3a526d17ffaab5a1072bb" + }, + { + "class": "dan200.computercraft.api.peripheral.IPeripheral", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "e3f114c10b79e8bd65641b592d9678331604b4eb60153cd73d02111b4e13b4fb" + }, + { + "class": "dev.engine_room.flywheel.api.visual.BlockEntityVisual", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "dev.engine_room.flywheel.api.visual.Visual" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308" + }, + { + "class": "dev.engine_room.flywheel.api.visual.DynamicVisual", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "dev.engine_room.flywheel.api.visual.Visual" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308" + }, + { + "class": "dev.engine_room.flywheel.api.visual.LightUpdatedVisual", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "dev.engine_room.flywheel.api.visual.SectionTrackedVisual" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308" + }, + { + "class": "dev.engine_room.flywheel.api.visual.SectionTrackedVisual", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "dev.engine_room.flywheel.api.visual.Visual" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308" + }, + { + "class": "dev.engine_room.flywheel.api.visual.TickableVisual", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "dev.engine_room.flywheel.api.visual.Visual" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308" + }, + { + "class": "dev.engine_room.flywheel.api.visual.Visual", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308" + }, + { + "class": "dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "dev.engine_room.flywheel.api.visual.BlockEntityVisual", + "dev.engine_room.flywheel.api.visual.LightUpdatedVisual" + ], + "super_class": "dev.engine_room.flywheel.lib.visual.AbstractVisual" + }, + "owner_sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308" + }, + { + "class": "dev.engine_room.flywheel.lib.visual.AbstractVisual", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "dev.engine_room.flywheel.api.visual.Visual" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308" + }, + { + "class": "dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "dev.engine_room.flywheel.api.visual.DynamicVisual" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308" + }, + { + "class": "dev.engine_room.flywheel.lib.visual.SimpleTickableVisual", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "dev.engine_room.flywheel.api.visual.TickableVisual" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a79565dee7160fedd48de4899e0d21c845a8933b0413020e0a3ff65d0bec0308" + }, + { + "class": "mezz.jei.api.IModPlugin", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a9a29a1beda28f772103f79f13ef517589fb86ae3a0a99446b914b9164a0c9de" + }, + { + "class": "mezz.jei.api.gui.drawable.IDrawable", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a9a29a1beda28f772103f79f13ef517589fb86ae3a0a99446b914b9164a0c9de" + }, + { + "class": "mezz.jei.api.recipe.category.IRecipeCategory", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "a9a29a1beda28f772103f79f13ef517589fb86ae3a0a99446b914b9164a0c9de" + }, + { + "class": "net.createmod.ponder.api.VirtualBlockEntity", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "0cf4611ad853042b689ac386184c5bbe02950efcffddb49e5f604e82baddb0dc" + }, + { + "class": "net.createmod.ponder.api.registration.PonderPlugin", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "0cf4611ad853042b689ac386184c5bbe02950efcffddb49e5f604e82baddb0dc" + }, + { + "class": "net.minecraft.client.renderer.RenderStateShard", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.client.renderer.RenderType", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "net.minecraft.client.renderer.RenderStateShard" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.client.renderer.blockentity.BlockEntityRenderer", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "net.neoforged.neoforge.client.extensions.IBlockEntityRendererExtension" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.client.resources.sounds.AbstractSoundInstance", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "net.minecraft.client.resources.sounds.SoundInstance" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.client.resources.sounds.AbstractTickableSoundInstance", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "net.minecraft.client.resources.sounds.TickableSoundInstance" + ], + "super_class": "net.minecraft.client.resources.sounds.AbstractSoundInstance" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.client.resources.sounds.SoundInstance", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.client.resources.sounds.TickableSoundInstance", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "net.minecraft.client.resources.sounds.SoundInstance" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.data.DataProvider", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.data.recipes.RecipeBuilder", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.data.recipes.RecipeProvider", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "net.minecraft.data.DataProvider" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.data.tags.FluidTagsProvider", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.data.tags.IntrinsicHolderTagsProvider" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.data.tags.IntrinsicHolderTagsProvider", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "net.minecraft.data.tags.TagsProvider" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.data.tags.ItemTagsProvider", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "net.minecraft.data.tags.IntrinsicHolderTagsProvider" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.data.tags.TagsProvider", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "net.minecraft.data.DataProvider" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.network.protocol.common.custom.CustomPacketPayload", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.server.packs.resources.PreparableReloadListener", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.server.packs.resources.ResourceManagerReloadListener", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "net.minecraft.server.packs.resources.PreparableReloadListener" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.util.StringRepresentable", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.Clearable", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.Container", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "net.minecraft.world.Clearable" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.effect.MobEffect", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.minecraft.world.flag.FeatureElement", + "net.neoforged.neoforge.common.extensions.IMobEffectExtension" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.flag.FeatureElement", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.item.BlockItem", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.item.Item" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.item.Item", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.minecraft.world.flag.FeatureElement", + "net.minecraft.world.level.ItemLike", + "net.neoforged.neoforge.common.extensions.IItemExtension" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.item.crafting.Recipe", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.item.crafting.RecipeInput", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.item.crafting.RecipeSerializer", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.ItemLike", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.Block", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.minecraft.world.level.ItemLike", + "net.neoforged.neoforge.common.extensions.IBlockExtension" + ], + "super_class": "net.minecraft.world.level.block.state.BlockBehaviour" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.BonemealableBlock", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.BucketPickup", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "net.neoforged.neoforge.common.extensions.IBucketPickupExtension" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.BushBlock", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "net.minecraft.world.level.block.Block" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.CakeBlock", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "net.minecraft.world.level.block.Block" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.CropBlock", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.minecraft.world.level.block.BonemealableBlock" + ], + "super_class": "net.minecraft.world.level.block.BushBlock" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.DirectionalBlock", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "net.minecraft.world.level.block.Block" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.EntityBlock", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.HorizontalDirectionalBlock", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "net.minecraft.world.level.block.Block" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.LiquidBlockContainer", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.SimpleWaterloggedBlock", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "net.minecraft.world.level.block.BucketPickup", + "net.minecraft.world.level.block.LiquidBlockContainer" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.entity.BlockEntity", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "net.neoforged.neoforge.common.extensions.IBlockEntityExtension" + ], + "super_class": "net.neoforged.neoforge.attachment.AttachmentHolder" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.minecraft.world.level.block.state.BlockBehaviour", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "net.minecraft.world.flag.FeatureElement" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.attachment.AttachmentHolder", + "metadata": { + "access_flags": 1057, + "interfaces": [ + "net.neoforged.neoforge.attachment.IAttachmentHolder" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.attachment.IAttachmentHolder", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.client.extensions.IBlockEntityRendererExtension", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.common.IShearable", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.common.conditions.ICondition", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.common.data.BlockTagsProvider", + "metadata": { + "access_flags": 1057, + "interfaces": [], + "super_class": "net.minecraft.data.tags.IntrinsicHolderTagsProvider" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.common.extensions.IBlockEntityExtension", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.common.extensions.IBlockExtension", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.common.extensions.IBucketPickupExtension", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.common.extensions.IItemExtension", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.common.extensions.IMobEffectExtension", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.common.util.INBTSerializable", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.energy.EnergyStorage", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.neoforged.neoforge.energy.IEnergyStorage", + "net.neoforged.neoforge.common.util.INBTSerializable" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.energy.IEnergyStorage", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.fluids.FluidType", + "metadata": { + "access_flags": 33, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.items.IItemHandler", + "metadata": { + "access_flags": 1537, + "interfaces": [], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.items.IItemHandlerModifiable", + "metadata": { + "access_flags": 1537, + "interfaces": [ + "net.neoforged.neoforge.items.IItemHandler" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + }, + { + "class": "net.neoforged.neoforge.items.wrapper.CombinedInvWrapper", + "metadata": { + "access_flags": 33, + "interfaces": [ + "net.neoforged.neoforge.items.IItemHandlerModifiable" + ], + "super_class": "java.lang.Object" + }, + "owner_sha256": "2382ea29e50ff9deb46fa393d1e49c3a54b5d6273c252d0208d3fed903e8eb5f" + } + ], + "structural_hierarchy": [ + { + "class": "com.mrh0.createaddition.blocks.alternator.AlternatorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.alternator.AlternatorBlockEntity", + "com.simibubi.create.content.kinetics.base.KineticBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.connector.LargeConnectorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.LargeConnectorBlockEntity", + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.connector.SmallConnectorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.SmallConnectorBlockEntity", + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.connector.SmallLightConnectorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.SmallLightConnectorBlockEntity", + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.connector.base.AbstractConnectorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.creative_energy.CreativeEnergyBlockEntity", + "com.simibubi.create.content.logistics.crate.CrateBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.digital_adapter.DigitalAdapterBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.electric_motor.ElectricMotorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.electric_motor.ElectricMotorBlockEntity", + "com.simibubi.create.content.kinetics.base.GeneratingKineticBlockEntity", + "com.simibubi.create.content.kinetics.base.KineticBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.liquid_blaze_burner.LiquidBlazeBurnerBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.modular_accumulator.ModularAccumulatorBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.portable_energy_interface.PortableEnergyInterfaceBlockEntity", + "com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.redstone_relay.RedstoneRelayBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.redstone_relay.RedstoneRelayBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.rolling_mill.RollingMillBlockEntity", + "com.simibubi.create.content.kinetics.base.KineticBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.blocks.tesla_coil.TeslaCoilBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.blocks.tesla_coil.TeslaCoilBlockEntity", + "com.mrh0.createaddition.energy.AbstractElectricBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.energy.AbstractElectricBlockEntity", + "classification": { + "evidence": [ + "com.mrh0.createaddition.energy.AbstractElectricBlockEntity", + "com.simibubi.create.foundation.blockEntity.SmartBlockEntity", + "com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity", + "com.simibubi.create.foundation.blockEntity.SyncedBlockEntity", + "net.minecraft.world.level.block.entity.BlockEntity" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.recipe.charging.ChargingRecipe", + "classification": { + "evidence": [ + "com.mrh0.createaddition.recipe.charging.ChargingRecipe", + "com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "net.minecraft.world.item.crafting.Recipe" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.recipe.charging.ChargingRecipe$Serializer", + "classification": { + "evidence": [ + "com.mrh0.createaddition.recipe.charging.ChargingRecipe$Serializer", + "net.minecraft.world.item.crafting.RecipeSerializer" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe", + "classification": { + "evidence": [ + "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe", + "com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "net.minecraft.world.item.crafting.Recipe" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe$Serializer", + "classification": { + "evidence": [ + "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe$Serializer", + "net.minecraft.world.item.crafting.RecipeSerializer" + ], + "method": "class_hierarchy" + } + }, + { + "class": "com.mrh0.createaddition.recipe.rolling.RollingRecipe", + "classification": { + "evidence": [ + "com.mrh0.createaddition.recipe.rolling.RollingRecipe", + "com.simibubi.create.content.processing.recipe.StandardProcessingRecipe", + "com.simibubi.create.content.processing.recipe.ProcessingRecipe", + "net.minecraft.world.item.crafting.Recipe" + ], + "method": "class_hierarchy" + } + } + ], + "target": { + "display_name": "Create Crafts & Additions", + "mod_id": "createaddition", + "version": "1.6.0" + } +} diff --git a/compat/contracts/createaddition.json b/compat/contracts/createaddition.json new file mode 100644 index 00000000..e49f40d7 --- /dev/null +++ b/compat/contracts/createaddition.json @@ -0,0 +1,295 @@ +{ + "families": [ + { + "class": "com.mrh0.createaddition.recipe.charging.ChargingRecipe", + "costs": [ + { + "amount": "ceil(recipe.energy / min(CommonConfig.TESLA_COIL_RECIPE_CHARGE_RATE, recipe.maxChargeRate))", + "resource_kind": "auto_storage:station_work" + }, + { + "amount": "recipe.getEnergy()", + "resource_kind": "neoforge_energy" + } + ], + "decision": "Accept ChargingRecipe / createaddition:charging when the recipe has exactly one simple non-empty item ingredient, no fluid ingredients/results, exactly one ProcessingOutput with chance 1.0 and a non-empty stack, positive energy, and positive maxChargeRate. Station is createaddition:tesla_coil at 1 work/tick. FE cost equals recipe.energy; station work equals ceil(energy / min(CommonConfig.TESLA_COIL_RECIPE_CHARGE_RATE, recipe.maxChargeRate)). Tesla Coil entity-hurt, redstone zap, and capability item-charging without a ChargingRecipe remain unsupported. Belt transport is abstracted away like Create spout/drain.", + "evidence": [ + "src/main/java/com/mrh0/createaddition/recipe/charging/ChargingRecipe.java", + "src/main/java/com/mrh0/createaddition/blocks/tesla_coil/TeslaCoilBlockEntity.java#chargeRecipe", + "src/main/java/com/mrh0/createaddition/config/CommonConfig.java#TESLA_COIL_RECIPE_CHARGE_RATE", + "src/main/java/com/mrh0/createaddition/index/CARecipes.java#CHARGING_TYPE" + ], + "id": "charging_recipe", + "inputs": [ + { + "amount": 1, + "resource_kind": "item", + "role": "consume", + "selector": "recipe ingredients[0] simple Ingredient alternatives with crafting remainders" + }, + { + "amount": "recipe.getEnergy()", + "resource_kind": "neoforge_energy", + "role": "consume", + "selector": "recipe.energy FE" + } + ], + "outputs": [ + { + "amount": "recipe.getResultStack().getCount()", + "resource_kind": "item", + "role": "primary", + "selector": "recipe.getResultStack() exact ItemStack including enchantment components" + } + ], + "recipe_type": "createaddition:charging", + "risks": [ + "generic_ingredients", + "randomness", + "world_mutation" + ], + "station": { + "category": "process", + "descriptor_id": "auto_storage:createaddition_tesla_coil", + "variants": [ + { + "bounds": "plain tesla_coil item; entity-hurt and capability item-charging without ChargingRecipe are not modeled", + "item": "createaddition:tesla_coil", + "rate": { + "denominator": 1, + "numerator": 1 + } + } + ] + }, + "status": "accepted" + }, + { + "class": "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe", + "costs": [], + "decision": "Liquid burning consumes a sized fluid into Liquid Blaze Burner live burn-time/superheated heat state and emits no item/fluid craft outputs. Auto Storage has no exact simulate-then-commit contract for retained burner heat, so the family is rejected.", + "evidence": [ + "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe#public_signature" + ], + "id": "liquid_burning_recipe", + "inputs": [], + "outputs": [], + "recipe_type": null, + "risks": [ + "generic_ingredients", + "randomness", + "world_mutation" + ], + "station": null, + "status": "rejected" + }, + { + "class": "com.mrh0.createaddition.recipe.rolling.RollingRecipe", + "costs": [ + { + "amount": "CommonConfig.ROLLING_MILL_PROCESSING_DURATION.get()", + "resource_kind": "auto_storage:station_work" + } + ], + "decision": "Accept RollingRecipe / createaddition:rolling when the recipe has exactly one simple non-empty item ingredient, no fluid ingredients/results, exactly one ProcessingOutput with chance 1.0 and a non-empty stack, and CommonConfig.ROLLING_MILL_PROCESSING_DURATION is positive. Station is createaddition:rolling_mill at 1 work/tick; station work equals the loaded config duration (default 120). Kinetic RPM is abstracted exactly as Create milling. Input is consumed once with crafting remainders; output is the exact result stack/components/count.", + "evidence": [ + "src/main/java/com/mrh0/createaddition/recipe/rolling/RollingRecipe.java", + "src/main/java/com/mrh0/createaddition/blocks/rolling_mill/RollingMillBlockEntity.java", + "src/main/java/com/mrh0/createaddition/config/CommonConfig.java#ROLLING_MILL_PROCESSING_DURATION", + "src/main/java/com/mrh0/createaddition/index/CARecipes.java#ROLLING_TYPE" + ], + "id": "rolling_recipe", + "inputs": [ + { + "amount": 1, + "resource_kind": "item", + "role": "consume", + "selector": "recipe.getIngredient() simple Ingredient alternatives with crafting remainders" + } + ], + "outputs": [ + { + "amount": "recipe.getRollableResults().getFirst().getStack().getCount()", + "resource_kind": "item", + "role": "primary", + "selector": "recipe.getResultStack() exact ItemStack" + } + ], + "recipe_type": "createaddition:rolling", + "risks": [ + "generic_ingredients", + "randomness", + "world_mutation" + ], + "station": { + "category": "process", + "descriptor_id": "auto_storage:createaddition_rolling_mill", + "variants": [ + { + "bounds": "plain rolling_mill item; Create RPM/stress is not simulated", + "item": "createaddition:rolling_mill", + "rate": { + "denominator": 1, + "numerator": 1 + } + } + ] + }, + "status": "accepted" + } + ], + "kind": "auto_storage_compat_contract", + "matrix": { + "acceptedRecipes": [ + "createaddition:rolling/iron_ingot", + "createaddition:charging/electrify_gold_nugget" + ], + "descriptors": [ + "auto_storage:createaddition_rolling_mill", + "auto_storage:createaddition_tesla_coil" + ], + "mods": [ + "createaddition" + ], + "recipeInventory": { + "namespaces": [ + "createaddition" + ], + "sha256": "57916d79470225dd3db82f96c7e5c70a87192df1930c8d8efa4768add46fd0a3" + }, + "rejectedDescriptors": [], + "rejectedResourceKinds": [], + "resourceKinds": [] + }, + "schema": 1, + "source_audit_sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9", + "source_recipe_data_sha256": "08c912d27581a94ba005c8b58713e3f95942ffa1e2660b23f6db812e0d306034", + "source_recipe_inventory_sha256": "2631e6d878b23243382174fde8da370438577821db650c81166829e344b57de1", + "target": { + "dependency": "maven.modrinth:createaddition:qPr8V4G2", + "display_name": "Create Crafts & Additions", + "mod_id": "createaddition", + "repositories": [ + "https://api.modrinth.com/maven", + "https://maven.createmod.net", + "https://maven.squiddev.cc", + "https://maven.blamejared.com/" + ], + "runtime_dependencies": [ + "maven.modrinth:create:UjX6dr61" + ], + "version": "1.6.0" + }, + "verification": { + "checks": [ + "absent_target_no_classload", + "present_target_load_once", + "ingredient_shortage_atomic", + "destination_capacity_atomic", + "checked_overflow_atomic", + "stale_recipe_holder_atomic", + "catalyst_tool_remainder_exact", + "multi_output_merge_exact", + "mixed_resource_rollback_atomic", + "dedicated_server_client_isolation", + "api_only_compilation", + "all_mod_coexistence" + ], + "evidence": { + "absent_target_no_classload": [ + { + "marker": "verifyAbsentOptionalCompatDoesNotResolve(helper);", + "source": "src/main/java/com/swear/autostorage/gametest/CraftingTests.java", + "task": "runGameTestServer" + } + ], + "all_mod_coexistence": [ + { + "marker": "manifest.assertCoexistence(helper, \"Descriptor matrix coexistence\")", + "source": "src/compatibilityMatrixFixture/java/com/swear/autostorage/fixture/compatibilitymatrix/CompatibilityMatrixGameTests.java", + "task": "runCompatibilityMatrixGameTestServer" + } + ], + "api_only_compilation": [ + { + "marker": "compileAddonExampleJava", + "source": "build.gradle", + "task": "build" + } + ], + "catalyst_tool_remainder_exact": [ + { + "marker": "Create Crafts & Additions rolling remainder transaction was wrong", + "source": "src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionIntegrationGameTests.java", + "task": "runCreateadditionGameTestServer" + } + ], + "checked_overflow_atomic": [ + { + "marker": "Long.MAX_VALUE", + "source": "src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionIntegrationGameTests.java", + "task": "runCreateadditionGameTestServer" + } + ], + "dedicated_server_client_isolation": [ + { + "marker": "verifyCompatIsolation", + "source": "build.gradle", + "task": "build" + } + ], + "destination_capacity_atomic": [ + { + "marker": "Create Crafts & Additions full destination transaction was not an atomic no-op", + "source": "src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionIntegrationGameTests.java", + "task": "runCreateadditionGameTestServer" + } + ], + "ingredient_shortage_atomic": [ + { + "marker": "Create Crafts & Additions missing-ingredient transaction was not an atomic no-op", + "source": "src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionIntegrationGameTests.java", + "task": "runCreateadditionGameTestServer" + } + ], + "mixed_resource_rollback_atomic": [ + { + "marker": "Failed typed family commit partially mutated resources", + "source": "src/recipeAddonFixture/java/com/swear/autostorage/fixture/recipe/RecipeFamilyIntegrationTests.java", + "task": "runRecipeAddonGameTestServer" + } + ], + "multi_output_merge_exact": [ + { + "marker": "Typed family changed the wrong exact resources or output amounts", + "source": "src/recipeAddonFixture/java/com/swear/autostorage/fixture/recipe/RecipeFamilyIntegrationTests.java", + "task": "runRecipeAddonGameTestServer" + } + ], + "present_target_load_once": [ + { + "marker": "Create Crafts & Additions rolling/charging registration was incorrect", + "source": "src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionIntegrationGameTests.java", + "task": "runCreateadditionGameTestServer" + } + ], + "stale_recipe_holder_atomic": [ + { + "marker": "Create Crafts & Additions stale holder transaction was not an atomic no-op", + "source": "src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionIntegrationGameTests.java", + "task": "runCreateadditionGameTestServer" + } + ] + }, + "expected_game_tests": 9, + "fixture": "createadditionFixture", + "game_test_task": "runCreateadditionGameTestServer", + "gradle_tasks": [ + "build", + "runGameTestServer", + "runRecipeAddonGameTestServer", + "runCreateadditionGameTestServer", + "runCompatibilityMatrixGameTestServer" + ] + } +} diff --git a/docs/createaddition-compatibility.md b/docs/createaddition-compatibility.md new file mode 100644 index 00000000..74506361 --- /dev/null +++ b/docs/createaddition-compatibility.md @@ -0,0 +1,161 @@ +# Create Crafts & Additions Compatibility + +Auto Storage's Compat Kit module supports the deterministic Rolling Mill and +Tesla Coil charging slices from Create Crafts & Additions. It loads only when +`createaddition` is present and compiles in the isolated `compatCreateaddition` +source set against the public Auto Storage API plus Create Crafts & Additions +and its required Create companion. + +## Reproducible audit evidence + +- target: Create Crafts & Additions `1.6.0`; +- Modrinth version ID: `qPr8V4G2`; +- immutable jar URL: + `https://cdn.modrinth.com/data/kU1G12Nn/versions/qPr8V4G2/createaddition-1.6.0.jar`; +- jar SHA-256: + `41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9`; +- ATM10 modlist SHA-1: + `87b539d41ed238e98b26c607c0c81a973323147e`; +- official source branch `1.21.1`, commit + `84c7b2ceafc0b382da4606ac0770085e63104c3a`; +- required runtime companion: Create `6.0.10+mc1.21.1` (`UjX6dr61`); +- scanner format `17`: 215 target classes and 3 actual `Recipe` candidates + (`ChargingRecipe`, `LiquidBurningRecipe`, `RollingRecipe`); legacy format-7 + name-shaped datagen/JEI/builder/serializer false candidates are no longer + contract families; +- six reachable ancestry artifacts: normalized NeoForge/Minecraft + `2382ea29…eb5f` / `56,279,815` bytes plus five exact Maven coordinates + (`cc.tweaked:cc-tweaked-1.21.1-core-api:1.115.1`, + `com.simibubi.create:create-1.21.1:6.0.10-280:slim`, + `dev.engine-room.flywheel:flywheel-neoforge-api-1.21.1:1.0.6`, + `mezz.jei:jei-1.21.1-common-api:19.25.0.323`, + `net.createmod.ponder:ponder-neoforge:1.0.82+mc1.21.1`); +- exact target-jar recipe-data inventory: 152 declared/effective recipes, + SHA-256 `08c912d27581a94ba005c8b58713e3f95942ffa1e2660b23f6db812e0d306034`; +- isolated fixture recipe-inventory digest for loaded `createaddition:*` + recipes: `57916d79470225dd3db82f96c7e5c70a87192df1930c8d8efa4768add46fd0a3` + (110 recipes); +- audit: `compat/audits/createaddition/1.6.0.json`; +- reviewed contract: `compat/contracts/createaddition.json`. + +This version is representative CI/audit evidence. Auto Storage does not impose +an exact Create Crafts & Additions version on players and does not claim a +multi-version matrix. + +## Accepted families + +### Rolling + +Exact class/type: + +- `com.mrh0.createaddition.recipe.rolling.RollingRecipe`; +- `createaddition:rolling` / `CARecipes.ROLLING_TYPE`. + +Logical station: + +- descriptor `auto_storage:createaddition_rolling_mill`; +- station item `createaddition:rolling_mill`; +- Processing category, `1` work per tick; +- station work equals loaded + `CommonConfig.ROLLING_MILL_PROCESSING_DURATION` (default `120`). + +Transaction: + +- one simple item ingredient consumed once, with crafting remainders; +- one exact item output from the single guaranteed `ProcessingOutput` + (`chance == 1.0`); inherited fluid ingredients/results and any extra or + chance outputs fail closed before exposure; +- Create RPM/stress is abstracted exactly as Create milling. +- station work and Craftable cache identity follow + `CommonConfig.ROLLING_MILL_PROCESSING_DURATION` through + `dynamicDeterministicResources`, so a live config reload cannot leave a + stale work cost. Recipe eligibility remains independent of that reloadable + value; a non-positive current duration yields no usable variant during + dynamic cost refresh without throwing through menu or server tick. + +### Charging + +Exact class/type: + +- `com.mrh0.createaddition.recipe.charging.ChargingRecipe`; +- `createaddition:charging` / `CARecipes.CHARGING_TYPE`. + +Logical station: + +- descriptor `auto_storage:createaddition_tesla_coil`; +- station item `createaddition:tesla_coil`; +- Processing category, `1` work per tick; +- FE cost equals `recipe.energy`; +- station work equals + `ceil(energy / min(CommonConfig.TESLA_COIL_RECIPE_CHARGE_RATE, recipe.maxChargeRate))`. + Eligibility depends only on invariant recipe fields. If a live config reload + makes the evaluated rate non-positive, dynamic cost refresh yields no usable + variant without throwing through menu or server tick, instead of dividing by + zero or inventing a rate. + +Transaction: + +- one simple item ingredient consumed once, with crafting remainders; +- exact FE consume; +- one exact item output from the single guaranteed `ProcessingOutput` + (`chance == 1.0`), including enchantment components when present; + inherited fluid ingredients/results and any extra or chance outputs fail + closed before exposure; +- belt transport is abstracted away like Create spout/drain. +- FE charge-rate config participates in + `dynamicDeterministicResources` so a live + `TESLA_COIL_RECIPE_CHARGE_RATE` reload cannot leave a stale work cost. + +## Explicit exclusions + +- Liquid burning: consumes fluid into Liquid Blaze Burner live burn-time / + superheated heat state and emits no craft outputs. +- Tesla Coil entity-hurt, redstone zap, and capability item-charging without a + `ChargingRecipe`. +- JEI/datagen/builder/serializer/params/condition helpers and Create recipe + datagen providers that emit Create families already owned elsewhere. +- Runtime reflection, viewer authority, and third-party EMI workstation + registration. + +## Declarative matrix evidence + +The module descriptor and reviewed contract declare `createaddition` present +with Rolling Mill and Tesla Coil descriptors plus the two accepted recipe IDs +used by the fixture. The isolated Create Crafts & Additions fixture locks the +110 successfully loaded `createaddition:*` recipes by SHA-256 +`57916d79470225dd3db82f96c7e5c70a87192df1930c8d8efa4768add46fd0a3`. Cross-namespace +Create datapack recipes shipped inside the jar remain Create-owned coexistence +evidence in the matrix report only. + +## Verification + +```bash +./gradlew runCreateadditionGameTestServer +tools/compat-kit/compat-kit verify compat/contracts/createaddition.json \ + --audit compat/audits/createaddition/1.6.0.json \ + --jar build/compat-kit/artifacts/createaddition-1.6.0.jar \ + --classpath …exact ancestry jars… \ + --bundled . \ + --output build/compat-kit/createaddition-report.json +./gradlew runCompatibilityMatrixGameTestServer +``` + +Nine real GameTests cover rolling/charging registration and liquid-burning +exclusion plus loaded chance-recipe presence and programmatic fluid-shape +fail-closed at both Create validation and Auto Storage classification, exact rolling remainder, +exact rolling output, exact charging FE/work, missing ingredient, +insufficient FE, destination overflow, `Long.MAX_VALUE` overflow, and stale +holder rollback. Bundled Compat Kit verify reports twelve exact checks across +five commands (`build`, base GameTests, recipe-addon, createaddition, matrix). +`catalyst_tool_remainder_exact` maps to the rolling remainder GameTest; +`multi_output_merge_exact` binds the generic public-SDK typed-family multi-output +evidence because accepted Rolling/Charging families are single-output only. +Processing labels use the JEI family names Rolling / Charging. +Both overflow cases assert the input stack, full output destination, and +accumulated station work remain unchanged. +Latest local matrix evidence after the Codex review recovery onto Immersive +Engineering `d8314fc`: **21,162** recipes, Craftable prepare **30.682 ms**, +first/shared p95/warm switch **0.925 / 0.360 / 0.277 ms**, storage interaction +p95 **13.128 ms**, shared index retained **4,113,648** bytes ≈ **3.922 MiB**, +per-menu **116,952** bytes, and report +`build/reports/terminal-scale-10000.json`. 9 MiB/50 ms/128 KiB gates unchanged. diff --git a/docs/notes.md b/docs/notes.md index 6acd1d6e..7caaf228 100644 --- a/docs/notes.md +++ b/docs/notes.md @@ -1,5 +1,13 @@ # Notes +2026-08-03 PR #74 Codex review recovery(onto Immersive Engineering `d8314fc`):stale-holder fixture先選真實`IRON_ROD`再`replaceRecipes`移除後commit,完整atomic no-op;`RecipeFamily`對dynamic(`!cacheTypedPlan`)pending用`Cost.free()`,`resolveVariants`/`match`對cost/plan的`IllegalArgumentException`回傳無usable variant且不拋進menu/server tick;Createaddition ingredient alternatives改以canonical `StorageResourceKey` `putIfAbsent`去重;notes澄清reloadable rate屬cost/plan fail-closed而非eligibility membership。Local gate:focused createaddition static **8/8**、createaddition **9/9**、bundled verify **12/12** across 5 commands、quiet exclusive matrix **3/3**(**21,162** recipes;Craftable prepare **30.682 ms**;first/shared p95/warm switch **0.925 / 0.360 / 0.277 ms**;storage interaction p95 **13.128 ms**;shared index **4,113,648** bytes ≈ 3.922 MiB;per-menu **116,952** bytes)、Python **610/610**、`build`、`runData` written **0**、`git diff --check` clean。9 MiB/50 ms/128 KiB gates unchanged。 + +2026-08-03 local shell coordinator gotcha:`build/compat-coordinator/heavy_gradle.py`把第一個參數起的argv原樣交給`subprocess.run`,語法是`python3 .../heavy_gradle.py ./gradlew --no-daemon`;不可插入獨立`--`,否則wrapper會把`--`當成executable並以`FileNotFoundError`失敗。zsh中的`status`是readonly special parameter;需要保存command exit code時使用`rc=$?`,否則tests即使完成,wrapper仍會在`status=$?`處失敗且漏印summary。 + +2026-08-03 PR #74 dynamic eligibility/overflow review correction:`dynamicDeterministicResources`的reload token只可改plan/cost,不可改candidate eligibility或index。Createaddition Rolling/Charging eligibility因此只檢查recipe本身的invariant shape;reload後的non-positive duration/charge rate由current cost evaluation fail closed。`Long.MAX_VALUE` output overflow fixture另必須同時驗input與已累積station work完全不變,不能只檢查滿額output。Local gate(head `b4bef5e`):static RED→GREEN 2/2、createaddition **9/9**、bundled verify **12/12** across 5 commands、quiet exclusive matrix **3/3**(**19,772** recipes;Craftable prepare **22.819 ms**;first/shared p95/warm switch **1.092 / 3.816 / 0.435 ms**;storage interaction p95 **28.735 ms**;shared index retained **0** bytes under #79 steady-state;per-menu **116,626** bytes)、Python **605/605**、`build`、`runData` written **0**、`git diff --check` clean。9 MiB/50 ms/128 KiB gates unchanged。 + +2026-08-03 Create Crafts & Additions rebase onto current main `a1582ad`(CEI #72 + fixture runtime transforms #87):加總保留 Create Enchantment Industry Outcome C、#87 Compat Kit/runtime/docs,與 PR #74 全部 reviewed Createaddition 決策(Rolling/Charging accept、Liquid Burning reject、shape fail-closed、dynamic config tokens、JEI labels、9/9 fixture、contract/manifest)。未手改 digest/manifest。Local gate:focused static 3/3、createaddition **9/9**、bundled verify **12/12** across 5 commands、quiet exclusive matrix **3/3**(**18,765** recipes;Craftable prepare **17.321 ms**;first/shared p95/warm switch **0.884 / 0.430 / 0.344 ms**;storage interaction p95 **11.948 ms**;shared index **3,716,144** bytes ≈ 3.544 MiB;per-menu **117,223** bytes)、Python **598/598**、`build`、`runData` written **0**、`git diff --check` clean。9 MiB/50 ms/128 KiB gates unchanged。 + 2026-08-03 Create Enchantment Industry format-17 Outcome C:legacy format-7 把28個name-shaped surfaces當recipe families;以exact target `b25cc576…07eb`、clean source `37ec6810…992`、AE2同款binary-pipeline NeoForge/Minecraft `2382ea29…b5f:56,279,815`及完整compile classpath(含ApothicEnchanting)重掃後,format 17只保留4個actual Recipe candidates並全部reject;descriptor isolated inventory鎖定22個live `create_enchantment_industry:*` recipes digest `967c0ea0…dbdf`。bundled descriptor compile dependencies必須含6筆audited ancestry coordinates,因此reviewed `target.repositories`需補上upstream CEI `build.gradle`發現的 `maven.createmod.net`/`maven.dragons.plus/releases`/`maven.shadowsoffire.dev/releases`/BlameJared,否則`verify`的`build`無法解析 Ponder/Dragons Plus/Apothic。詳見[`create-enchantment-industry-compatibility.md`](create-enchantment-industry-compatibility.md)。 2026-08-03 PR #87 schema review correction:array-level `uniqueItems: true`只比較完整record;同dependency搭配不同SHA/entry仍會被公開schema接受、之後才被CLI拒絕。Contract `runtime_artifact_transforms`因此改成以exact dependency coordinate為key、且exactly-one-property的object,value只保存SHA與entries;單一contract中的重複coordinate與SHA alias都在schema資料模型中不可表示,多份descriptor仍可共享同一transform,generator再穩定排序成descriptor record list。Focused回歸同時鎖住公開schema shape、CLI拒絕舊array/多artifact object及descriptor輸出。 @@ -14,9 +22,16 @@ 2026-08-03 GitHub #64/PR #71 Codex P2 recovery:`catalyst_tool_remainder_exact` evidence must live inside the accepted Reprocessor craft GameTest and assert the installed `seed_reprocessor` still remains after exact seed/FE/work commit;pointing the marker only at `rejected_machine_families_fail_closed` is not remainder evidence. Compat Kit `_minecraft_resource_location` must also accept separator-prefixed empty namespaces (`:crafting_shaped` → `minecraft:crafting_shaped`) exactly like `ResourceLocation.bySeparator` when the separator index is 0;uppercase/control/path validation stays fail closed. 2026-08-03 GitHub #64/PR #71 Mystical Agriculture recovery gotcha:MA jar內大量vanilla recipe JSON使用path-only `type`(`crafting_shaped`/`crafting_shapeless`/`smelting`)。Compat Kit recipe-data parser若只接受namespaced ResourceLocation,format-17 `migrate-audit`會在第一筆就fail closed。正確語意對齊Minecraft `ResourceLocation.bySeparator`/`withDefaultNamespace`:合法path展開為`minecraft:`,非法字元仍拒絕;digest繼續hash raw payload bytes。MA format-17 rescan把legacy 36個name-shaped candidates縮成14個actual recipe classes(6 interfaces + 8 concrete);只接受`ReprocessorRecipe`,其餘顯式reject。Compile ancestry含NeoForge binary-pipeline `2382ea29…`、Cucumber、CraftTweaker、Jade、JEI common API;descriptor repositories需含`https://maven.blakesmods.com`才能解析`com.blakebr0.cucumber` coordinate。 +2026-08-03 Create Crafts & Additions Codex review recovery:Rolling/Charging eligibility改查inherited `getIngredients`/`getFluidIngredients`/`getFluidResults`/`getRollableResults`,只接受exactly-one simple item、no fluid、single `chance == 1.0` output;fixture datapack覆蓋chance/fluid reject與lava-bucket remainder,且chance recipes必須`recipePresent`後再assert unsupported。兩家族改`dynamicDeterministicResources`,token分別綁`ROLLING_MILL_PROCESSING_DURATION`與`TESLA_COIL_RECIPE_CHARGE_RATE`。Processing labels改JEI家族名Rolling/Charging(zh_tw:軋制/充電)。`catalyst_tool_remainder_exact`指remainder GameTest;`multi_output_merge_exact`綁generic SDK typed-family multi-output(accepted families本身單輸出)。expectedTests 9。Local gate:static RED→GREEN、createaddition shape RED(舊eligibility誤接受chance)→9/9 GREEN、bundled verify 12/12 across 5 commands、Python 585/585、`build`、`runData` written 0、`git diff --check` clean;matrix 18,503 recipes、Craftable prepare 19.933 ms、per-menu 116,600 bytes。 + +2026-08-03 Create Crafts & Additions format-17 recovery:legacy format-7 32個name-shaped candidates經exact artifact `41876c37…e7e9`、clean source `84c7b2ce…4c3a`、normalized NeoForge/Minecraft `2382ea29…eb5f`與完整compile ancestry `migrate-audit`後只剩3個actual `Recipe` classes;`migrate-contract`重開後保留Rolling/Charging accept與Liquid Burning reject,並寫入新audit完整risk set(inherited ProcessingRecipe `generic_ingredients`/`randomness`/`world_mutation`)。Descriptor compile dependencies鎖5個reachable ancestry coordinates,runtime仍是Modrinth createaddition `qPr8V4G2`+Create `UjX6dr61`;isolated fixture digest `57916d79…d0a3`(110個`createaddition:*`)。不改peer descriptor/不放寬9 MiB gate。Final local gate:createaddition 8/8、bundled verify 12/12 across 5 commands、matrix 3/3(18,503 recipes;Craftable prepare 32.554 ms;shared index 3,711,264 bytes;per-menu 116,493 bytes)、`build`、`runData` no drift、Python 585/585、`git diff --check` clean。高負載下Craftable prepare曾量到52–66 ms;gate維持50 ms,安靜後重跑通過。 + +2026-08-03 Create Crafts & Additions review-fix gotcha:PR #74 Gemini 指出`itemKeys`對`StorageResourceKey`再`.distinct()`會讓`alternatives`比`representatives`短,`consumedWithRemainder`以index取remainder時可能`IndexOutOfBoundsException`。後續Codex另指出`ItemStack.distinct()`也無法去掉正規化後相同的datapack alternatives;正確作法是在建構`TypedRecipeInput`前以canonical `StorageResourceKey` `putIfAbsent`去重,並保留各surviving alternative對應remainder。同則建議把`chargingWork`的rate clamp成`Math.max(1L, …)`;那會在config reload成非正rate時靜默發明work量,違反No Silent Fallback。正確作法是eligibility只看recipe invariant(含正的`maxChargeRate`),reloadable config rate留給cost/plan路徑fail-closed:對`rate <= 0`仍`IllegalArgumentException`,但dynamic refresh必須轉成no usable variant且不拋進menu/server tick,並保留`Math.addExact` overflow檢查。Static regressions鎖住這些邊界。 2026-08-03 PR #84 review correction:authoritative Compat Kit cache copy must name jar SHA, scanner format, and the resolved target mod ID together; repeating only SHA+format is no longer accurate because multi-mod jars isolate selections. Jar-backed `diff` must call `_validate_audit(old)` before reading `old["target"]["mod_id"]`, matching `migrate-audit`, so malformed/wrong-format old JSON returns the normal concise validation error/exit 2 instead of an uncaught `KeyError`/exit 1. +2026-08-01 Create Crafts & Additions gotcha:ATM10代表`1.6.0`/`qPr8V4G2`(SHA-256 `41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9`)只接受`RollingRecipe`與`ChargingRecipe`。Rolling work用`CommonConfig.ROLLING_MILL_PROCESSING_DURATION`(預設120)與1 work/tick;Charging FE用`recipe.energy`,work為`ceil(energy / min(config TESLA_COIL_RECIPE_CHARGE_RATE, recipe.maxChargeRate))`。Liquid Burning只把fluid轉成Liquid Blaze Burner live heat、沒有craft output,必須fail-closed。Recipe types繼承Create processing父類,所以bundled descriptor必須把Create companion同時放進`dependencies`與`runtimeDependencies`;Compat Kit scaffold已對`target.runtime_dependencies`做同樣處理。Active契約見[`createaddition-compatibility.md`](createaddition-compatibility.md)。 + 2026-08-03 Compat Kit nested `source_class` recursion gotcha:`_is_inspectable_class`改成iterative/1,024-bound後,`_candidate_source_class`若仍遞迴走同一條admitted owner chain,約1,000層named nested會在Python預設recursion limit撞上`RecursionError`,而不是受控的1,024層驗證錯誤。source-level type導出必須同樣iterative並重用`MAX_NESTED_CLASS_OWNER_DEPTH`;不可只修inspectability。 2026-08-02 Compat Kit legacy classifier migration gotcha:`migrate-audit`或其後的`migrate-contract --old-audit`若先用current classifier重建legacy format-14至16的candidate buckets,任何正當的classifier修正都會讓舊audit在exact rescan/contract comparison前先以`audit candidates do not match independent structural evidence`失敗,等於沒有可用migration path。兩條explicit migration只可放寬「用current classifier重判舊bucket」這一項;舊format schema、structural/target digests、target identity、artifact SHA/size及舊contract bindings仍要完整驗證,fresh `--new-audit`也維持current strict validation;之後只可從exact jar/source/ancestry全量current rescan及逐family evidence comparison取得新證據,legacy bucket絕不作新語意授權。 @@ -253,6 +268,7 @@ export JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home | Create Aquatic Ambitions 整合測試 | `./gradlew runCreateAquaticAmbitionsGameTestServer`(隔離載入代表性2.0.4與Create,固定要求4個present-mod/零registration/代表性及全Channeling fail-closed GameTests全過;不是玩家端exact dependency pin) | | Create Enchantment Industry 整合測試 | `./gradlew runCreateEnchantmentIndustryGameTestServer`(隔離載入代表性`2.5.0-preview-alpha1`、Create與Create Dragons Plus,固定要求5個present-mod/零registration/namespace crafting及grinding fail-closed GameTests全過;不是玩家端exact dependency pin) | | PneumaticCraft 整合測試 | `./gradlew runPneumaticCraftGameTestServer`(隔離載入代表性8.2.22,固定要求9個Air/Pressure Chamber/Thermo/Fluid Mixer/Assembly/Refinery/Heat Frame/Explosion fail-closed GameTests全過;不是玩家端exact dependency pin) | +| Create Crafts & Additions 整合測試 | `./gradlew runCreateadditionGameTestServer`(隔離載入代表性1.6.0與Create 6.0.10,固定要求9個Rolling/Charging registration、exact remainder、exact output/FE/work、loaded chance recipe與程式建構的fluid shape在Create validation及Auto Storage classification雙重fail-closed、shortage/overflow/stale-holder rollback與Liquid Burning fail-closed GameTests全過;不是玩家端exact dependency pin) | | Extended Crafting 整合測試 | `./gradlew runExtendedCraftingGameTestServer`(隔離載入代表性Extended Crafting 7.0.8與Cucumber 8.0.16,固定要求4個Ultimate Table gating、9×9/81-position exact commit、one-short no-op、destination rollback與真實Ultimate Singularity component identity GameTests全過;不是玩家端exact dependency pin) | | Ender IO 整合測試 | `./gradlew runEnderIoGameTestServer`(隔離載入代表性Ender IO 8.2.11-beta artifact,固定要求6個Alloy Smelting registration/rate、官方Conductive Alloy配方、FE/work/ingredient shortage、destination overflow rollback,以及smelting-batch與Sag Mill fail-closed GameTests全過;不是玩家端exact dependency pin) | | Theurgy 整合測試 | `./gradlew runTheurgyGameTestServer`(隔離載入代表性Theurgy 1.73.1、Modonomicon 1.105.0與GeckoLib 4.5.8,固定要求9個Calcination/Distillation/Liquefaction registration、item/solvent/work、rejected-family、shortage/overflow rollback GameTests全過;不是玩家端exact dependency pin) | diff --git a/docs/overview.md b/docs/overview.md index 9d3da0c7..c334a374 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -18,10 +18,10 @@ - **配方進程 / 指南** — T1 改以黑色混凝土粉末、銅、紅石與木桶製作,不再要求紫水晶;Core 與 T1–T6 依序引入黑曜石、玄武岩、鑽石/史萊姆、海磷晶/蜂蜜與獄髓。Patchouli 的雙語「配方總覽」集中顯示所有 Auto Storage 配方,每個配方只出現一次。 - **工具與終端進程** — Wrench 是 Brush + Tripwire Hook 的廉價建設工具。Storage Terminal 保持起步期但加入紅石火把控制件;Crafting Terminal 以金、銅、紅石和工作台成為早中期升級;Remote Terminal 再要求終界珍珠、黑曜石與指南針,作為較晚取得的移動能力。指南書本身註冊為 `auto_storage:guide_book` 並可合成。 - **Transforms and Stations** — Fuel、Brew、Axe、FE、Mana與addon資源都保存於Core的同一typed ledger。Transform頁把一個明確input以×1/×8/×64/Max轉成typed資源;輸入與amount strip都留在上方,Auto只列可用用途,不會自行消耗,每張card直接標示來源或所需station/work,失敗時input、資源與輸出保持原狀。Stations頁只分Processing與Instant:Processing按exact installed variant的live rational rate累積work,可安裝到`Integer.MAX_VALUE`並顯示installed aggregate/rate/work;Instant每descriptor最多一台,只解鎖配方且不顯示installed數量或work。兩區都有獨立前後頁與滾輪;`All`與搜尋結果中的未安裝代表物明顯變暗,已安裝物保持原始亮度;非空搜尋才合併stations,Processing最後一列不足欄數也保持固定欄寬並靠左靠上,inventory旁status panel只顯示type capacity且不隨hover重複資訊。物品hitbox保留exact機器的原生tooltip;Processing數值hitbox使用server同步的logical family名稱與aggregate rate,不再把Crusher、Energizing Rod、Furnator等不同資源全部叫做`Station Work`。Furnace cooking time、燃料burn time、工具耐久與optional-mod provider的recipe/config是數值真值;Botania Elven Trade也會消耗runtime exact Mana。所有mutation只在server,client只接同步。 -- **Crafting Terminal GUI** — `TerminalProfile`與唯一`TerminalLayout.forProfile(...)`讓Storage Terminal成為Crafting Terminal的減配版;Crafting固定提供Storage、Craftable、Transform、Stations四頁。寬版四頁content bottom一致對齊player inventory上緣,四頁搜尋欄共用top header位置、同一focused-key/character router與`TerminalSearchQuery` parser,只有候選scope不同;空查詢不顯示placeholder,裸`@`、`#`、`$`都等同空查詢並顯示全部,玩家仍可在欄內繼續輸入;點擊欄外會解除focus但保留query與結果;`@mod`對namespace做substring match,所以`@creat`可命中Create;Processing以代表工作站的item namespace比對,`#tag`在All中仍以真正Item holder比對。Storage/Craftable的server-owned資源選擇器只循環已註冊的Item/Fluid/Energy/Gas/**Processing**/Other群組,最後另有聚合全部key的**All**(tooltip固定為`Show: All`);Energy包含FE、Fuel/Brew、Mana與Source,Processing只含descriptor-keyed加工量,Axe Uses與未分類addon值留在Other。`station_work`仍是server persistence/API技術名稱,不再直接當玩家名稱;Mekanism chemical entry保留Oxygen/Hydrogen等exact名稱,並直接渲染EMI的colored chemical glyph;internal carrier不得直接顯示給玩家;All中的Item仍走普通顯示/取出/選取路徑,只有non-item代表物不可被當成icon物品取出。physical-client的`auto_storage-client.toml`全域保存sort/order/search sync/resource view、Auto Focus,以及Crafting page/source/output/Transform target;search文字、scroll、selection與任何Core狀態不保存。Craftable使用server-start預熱的shared weak recipe index與exact family dispatch;每次snapshot建立ItemKey/item source index,避免每個recipe掃完整大型庫存。Simple ingredient直接使用item-total;NeoForge `DataComponentIngredient`只以完整item-type集合篩候選,exact component predicate仍逐variant驗證;其他non-exhaustive custom predicate保持完整掃描。開啟Terminal或停在Storage頁不建立Craftable結果;Core只建立目前請求的sort index,search/source metadata由大型GUI fixture在handoff前顯式prepare。完成listing後,每個Core只保留一份由recipe/craftability/machine/topology revision、query、sort與resource view守護的server-side shared result;Use Player Inventory繞過cache。Processing正向work不會每tick清空結果,只有跨過記錄的energy/station threshold才重建,任何減少、一般ingredient/typed resource改變、機器、拓撲或recipe reload仍明確失效。recipe preview由server-synced presentation驅動,EMI只負責公開widget diagram,Auto Storage保留Available/Required ledger、輸出容量與原子commit。Public widget原尺寸放得下就直接畫,否則完整等比縮放;TMRV等bridge沒有backing holder時,只接受exact output與完整item-input multiset唯一吻合的public recipe,歧義時fail closed。短數值如`1/1`維持單行,只有實際超過cell寬度才拆兩行;recipe workspace不再畫冗餘外框,diagram/ledger共用4px上/側inset。相同exact output的recipe先依`maxCraftable > 0`分組,再依adapter priority與完整recipe ID排序;rerank保留exact selected ID,包含0-craftable狀態,右上header顯示`n / craftable (total)`。Scrollbar使用有recessed frame及enabled/pressed/disabled狀態的vanilla scroller;按thumb保留精確grab offset,按track翻頁並在持續按住後重複,wheel立即移動一個server對齊完整列;Craftable重建或cache restore縮短結果時也重用同一row-aligned clamp;沒有easing、queue、彈力或client storage snapshot。Storage/Craftable依可用高度使用全部完整列,Stations另有All/Installed顯示切換並依可用高度自適應,Processing使用較大的最多三欄區域、item-overlay安裝數與水平累積work,Instant使用緊密icon grid;Transform使用持續顯示、可搜尋/換頁的target側欄與必須明確選取的水平use cards,不另畫重複的selected preview;Transform與Stations直接重用Storage的Sort Method/Order及同一comparator;provider card與machine descriptor都先採EMI category語意,再使用對全部accepted workstation variants都成立的最短family名稱,tier/speed只留在輪播圖示而不進label。 +- **Crafting Terminal GUI** — `TerminalProfile`與唯一`TerminalLayout.forProfile(...)`讓Storage Terminal成為Crafting Terminal的減配版;Crafting固定提供Storage、Craftable、Transform、Stations四頁。寬版四頁content bottom一致對齊player inventory上緣,四頁搜尋欄共用top header位置、同一focused-key/character router與`TerminalSearchQuery` parser,只有候選scope不同;空查詢不顯示placeholder,裸`@`、`#`、`$`都等同空查詢並顯示全部,玩家仍可在欄內繼續輸入;點擊欄外會解除focus但保留query與結果;`@mod`對namespace做substring match,所以`@creat`可命中Create / Create Crafts & Additions;Processing以代表工作站的item namespace比對,`#tag`在All中仍以真正Item holder比對。Storage/Craftable的server-owned資源選擇器只循環已註冊的Item/Fluid/Energy/Gas/**Processing**/Other群組,最後另有聚合全部key的**All**(tooltip固定為`Show: All`);Energy包含FE、Fuel/Brew、Mana與Source,Processing只含descriptor-keyed加工量,Axe Uses與未分類addon值留在Other。`station_work`仍是server persistence/API技術名稱,不再直接當玩家名稱;Mekanism chemical entry保留Oxygen/Hydrogen等exact名稱,並直接渲染EMI的colored chemical glyph;internal carrier不得直接顯示給玩家;All中的Item仍走普通顯示/取出/選取路徑,只有non-item代表物不可被當成icon物品取出。physical-client的`auto_storage-client.toml`全域保存sort/order/search sync/resource view、Auto Focus,以及Crafting page/source/output/Transform target;search文字、scroll、selection與任何Core狀態不保存。Craftable使用server-start預熱的shared weak recipe index與exact family dispatch;每次snapshot建立ItemKey/item source index,避免每個recipe掃完整大型庫存。Simple ingredient直接使用item-total;NeoForge `DataComponentIngredient`只以完整item-type集合篩候選,exact component predicate仍逐variant驗證;其他non-exhaustive custom predicate保持完整掃描。開啟Terminal或停在Storage頁不建立Craftable結果;Core只建立目前請求的sort index,search/source metadata由大型GUI fixture在handoff前顯式prepare。完成listing後,每個Core只保留一份由recipe/craftability/machine/topology revision、query、sort與resource view守護的server-side shared result;Use Player Inventory繞過cache。Processing正向work不會每tick清空結果,只有跨過記錄的energy/station threshold才重建,任何減少、一般ingredient/typed resource改變、機器、拓撲或recipe reload仍明確失效。recipe preview由server-synced presentation驅動,EMI只負責公開widget diagram,Auto Storage保留Available/Required ledger、輸出容量與原子commit。Public widget原尺寸放得下就直接畫,否則完整等比縮放;TMRV等bridge沒有backing holder時,只接受exact output與完整item-input multiset唯一吻合的public recipe,歧義時fail closed。短數值如`1/1`維持單行,只有實際超過cell寬度才拆兩行;recipe workspace不再畫冗餘外框,diagram/ledger共用4px上/側inset。相同exact output的recipe先依`maxCraftable > 0`分組,再依adapter priority與完整recipe ID排序;rerank保留exact selected ID,包含0-craftable狀態,右上header顯示`n / craftable (total)`。Scrollbar使用有recessed frame及enabled/pressed/disabled狀態的vanilla scroller;按thumb保留精確grab offset,按track翻頁並在持續按住後重複,wheel立即移動一個server對齊完整列;Craftable重建或cache restore縮短結果時也重用同一row-aligned clamp;沒有easing、queue、彈力或client storage snapshot。Storage/Craftable依可用高度使用全部完整列,Stations另有All/Installed顯示切換並依可用高度自適應,Processing使用較大的最多三欄區域、item-overlay安裝數與水平累積work,Instant使用緊密icon grid;Transform使用持續顯示、可搜尋/換頁的target側欄與必須明確選取的水平use cards,不另畫重複的selected preview;Transform與Stations直接重用Storage的Sort Method/Order及同一comparator;provider card與machine descriptor都先採EMI category語意,再使用對全部accepted workstation variants都成立的最短family名稱,tier/speed只留在輪播圖示而不進label。 - **Terminal(三階)** — `storage_terminal`(T1 取存)、`crafting_terminal`(T2 配方+一鍵合成)、`remote_terminal`(T3 物品,同維度遠端存取;綁 exact Core UUID,同座標 replacement 不會被靜默接管;重綁不覆蓋其他 `CUSTOM_DATA`)。 - **Network / Bus automation** — Core 掃描/維護 Core ↔ Unit ↔ Terminal/Bus 連通;一般/指令/活塞放置會合併到 next-tick topology pass,安全範圍內增量成長,破壞/不確定拓樸時 full rebuild。Server 也會依 FULL chunk lifecycle延後、合併並bounded掃描loaded network boundary;Terminal/Bus只沿目前已載入且仍為network block的cached path工作,絕不為驗證連線載入chunk。Directional Import/Export每10 tick在正面各自嘗試一個item stack與一個bounded typed resource,並同時掃generic addon endpoint與native fluid/FE/optional chemical endpoint;成功item不會餓死typed,同一外部方塊的generic與native資源可同時被發現。Import在設定允許的side/null另暴露stable insert-only item/generic/native capabilities;Export只有Directionless才暴露filtered extract-only能力,item只是一格、最多正常stack的安全view,generic typed路徑明確拒絕Item kind。Mode、六面mask、unsided、automation、Allow/Deny與九格filter由server menu原子設定;owner/operator、距離、當前BE、stale revision與Wrench操作全部server驗證,legacy首次有效操作才claim owner。每個cached wrapper每次call都重驗BE identity、escrow、mode/side、filter、loaded Core path與conflict;缺Core時保持inert,設定面改變則invalidate capability。structured actor guard阻止same-network/inverse re-entry。Item與typed immutable plan都在commit前及external execute callback後重驗Bus/config/Core/network/topology/path/endpoint;Import不寫回detached source,Export會反向reclaim已接受量,detached target拒絕歸還的exact item或typed差額也走recovery。rollback無法立即歸還時進Bus持久escrow,若Bus已被移除/取代則改產生owner-stripped recovery drop,絕不寫detached BE。能力暫停並先回流Core;一般/創造/Wrench/爆炸/direct-air/替換拆除都必須先回收或保存exact escrow;Wrench尊重其他mod取消或替換普通BlockDropsEvent結果,只有仍無法回流Core的exact escrow才用per-Bus recovery UUID建立direct drop,避免資料被later listener吞掉或把兩次移除誤dedupe。 -- **Supported recipes / safe output** — Vanilla exact-concrete Shaped/Shapeless Crafting、Stonecutting、Smelting、Blasting、Smoking、Campfire、component-exact `SmithingTransformRecipe`、component-preserving `SmithingTrimRecipe`,以及只掃 `minecraft` namespace default state 的 internal synthetic axe strip/scrape/wax-off;任何 namespace 使用相同 exact vanilla class/type 都零設定支援。Optional source-audited modules另支援Farmer's Delight Cooking Pot;Mekanism支援九個Factory-backed families、Pressurized Reaction、兩種安全單向Rotary shape及Chemical Oxidizer、Chemical Infuser、Electrolytic Separator、Chemical Dissolution Chamber、Chemical Washer、Chemical Crystallizer、Isotopic Centrifuge、Antiprotonic Nucleosynthesizer、Pigment Extractor、Pigment Mixer、Painting Machine,完整22/26 recipe-type盤點與排除理由見[`mekanism-compatibility.md`](mekanism-compatibility.md);Botania支援Mana Infusion、Runic Altar、Terrestrial Agglomeration、Petal Apothecary與Elven Trade;Modern Industrialization支援14個direct `MachineRecipe` families及exact item/fluid/EU/catalyst/multi-output transaction,tier/proxy/RNG邊界見[`modern-industrialization-compatibility.md`](modern-industrialization-compatibility.md);Ars Nouveau支援Imbuement與Enchanting Apparatus的exact Source/item/catalyst/remainder/component transaction,邊界見[`ars-nouveau-compatibility.md`](ars-nouveau-compatibility.md);EvilCraft支援Blood Infuser的exact item/Blood/Promise tier/duration/output transaction,XP/Purifier邊界見[`evilcraft-compatibility.md`](evilcraft-compatibility.md);Powah支援1–6 item Energizing、scaled FE與loaded rod throughput,邊界見[`powah-compatibility.md`](powah-compatibility.md);Industrial Foregoing支援Dissolution Chamber、Material Stonework Factory與Crusher的exact item/fluid/FE/work transaction,邊界見[`industrial-foregoing-compatibility.md`](industrial-foregoing-compatibility.md);Create支援deterministic Milling、Crushing、Cutting、Filling與Emptying,邊界見[`create-compatibility.md`](create-compatibility.md);Extended Crafting支援安裝Ultimate Crafting Table後的3×3–9×9 exact shaped-table recipes及真實Ultimate Singularity,含最多81個exact input groups、component identity、remainders與rollback,邊界見[`extended-crafting-compatibility.md`](extended-crafting-compatibility.md);Oritech支援exact pulverizer item/FE/work與deterministic multi-output remainder,邊界見[`oritech-compatibility.md`](oritech-compatibility.md);Theurgy支援deterministic Calcination、Distillation與Liquefaction,邊界見[`theurgy-compatibility.md`](theurgy-compatibility.md)。Advanced AE 1.6.11的Reaction Chamber因live AE-network power、speed-card state與generic item/fluid stacks維持fail closed;present-mod module不註冊station或recipe family,邊界見[Advanced AE compatibility](advanced-ae-compatibility.md)。所有exact sized item/fluid/chemical/Mana、FE、station work、retained catalyst、container remainder與deterministic multi-output都放進同一atomic transaction;non-item primary只送Storage。Custom exact class/type可透過公開`auto_storage:recipe_family` registry一次註冊整個family;`singleItemToItem`處理窄單輸入,`deterministicResources`處理1–81個item/fluid/power/chemical/addon alternatives、retained roles與alternative-specific remainders。開啟Use Player Inventory時,typed item input與普通配方一樣把Core及可見36格玩家背包放進同一exact simulate/commit plan;non-item typed input仍只讀Core。沒有名稱、serializer、`Recipe#getIngredients()`或EMI widget推測fallback。每種都先要求Core安裝matching station或具備足夠Axe Energy。所有lookup/select/current/reload/execute都按ID重取目前server holder;輸入、work/Fuel、typed outputs、玩家/Core destination與capacity完整simulate後才commit,失敗整批rollback。Direct `×1/×8/×64/Max` 與 EMI request維持各自既有destination contract。第三方recipe-viewer metadata由原mod擁有:Iron Furnaces以自己的JEI plugin註冊Smelting catalysts,Prism GUI support pack由TMRV把該JEI plugin metadata接到EMI且不安裝JEI;Auto Storage只管理terminal station variants,絕不替第三方呼叫EMI `addWorkstation`。PneumaticCraft目前只跑present-mod fail-closed fixture:其Air無simulate/accepted amount且可為負值,pressure/heat/multiblock是live retained state,所以不註冊Air kind或recipe family;完整審計見[`pneumaticcraft-compatibility.md`](pneumaticcraft-compatibility.md)。Immersive Engineering目前同樣只跑present-mod fail-closed fixture:format-17 的44個actual recipe-class candidates全拒(multiblock、live fuel/tank、`RecipeMultiplier`、chance/`TagOutput`),不註冊自訂 station/family;完整審計見[`immersiveengineering-compatibility.md`](immersiveengineering-compatibility.md)。Create Aquatic Ambitions 2.0.4也只跑present-mod fail-closed fixture:Channeling依賴Encased Fan world catalysts、Conduit side effect與chance outputs,所以不註冊station、resource kind或recipe family;完整審計見[`create-aquatic-ambitions-compatibility.md`](create-aquatic-ambitions-compatibility.md)。Create Enchantment Industry `2.5.0-preview-alpha1`同樣只跑present-mod fail-closed fixture:Grindstone kinetics/tank/disenchant、Printer template behaviour與Blaze Enchanter/Forger randomness都無法進atomic transaction,所以不註冊station、resource kind或recipe family;完整審計見[`create-enchantment-industry-compatibility.md`](create-enchantment-industry-compatibility.md)。Draconic Evolution 3.1.4.632也維持present-mod fail-closed:Fusion Crafting依賴live multiblock injectors、tiered energy charging與config-timed state machine,不註冊station、resource kind或recipe family;完整審計見[`draconicevolution-compatibility.md`](draconicevolution-compatibility.md)。Productive Metalworks同樣為outcome C fail-closed:Foundry melting/alloying與live casting/entity melting沒有完整simulate-then-commit contract,因此不註冊custom station/family;完整審計見[`productivemetalworks-compatibility.md`](productivemetalworks-compatibility.md)。Productive Bees 1.21.1-13.13.5的16個actual recipe classes經format-17重審後也因chance、live bee/entity/world、dynamic component或machine-state語意維持零registration Outcome C;完整審計見[`productivebees-compatibility.md`](productivebees-compatibility.md)。Railcraft Reborn 1.2.10同樣只跑present-mod fail-closed fixture:受審concrete recipes因chance、live multiblock/machine state或special-crafting語意全部rejected,不註冊station、resource kind或recipe family;完整審計見[`railcraft-compatibility.md`](railcraft-compatibility.md)。目前仍不執行遞迴合成;multi-step路線見 [`recipe-family-api.md`](recipe-family-api.md) 及 `docs/superpowers/plans/2026-07-14-modded-recipes-multistep-crafting.md`,EMI tree只作client規劃/參考介面。Chance/dynamic/per-tick-use families、缺少registry context、Brewing、任意mod block hook、自由world/player-context recipe與external-machine send-and-wait仍fail closed。 +- **Supported recipes / safe output** — Vanilla exact-concrete Shaped/Shapeless Crafting、Stonecutting、Smelting、Blasting、Smoking、Campfire、component-exact `SmithingTransformRecipe`、component-preserving `SmithingTrimRecipe`,以及只掃 `minecraft` namespace default state 的 internal synthetic axe strip/scrape/wax-off;任何 namespace 使用相同 exact vanilla class/type 都零設定支援。Optional source-audited modules另支援Farmer's Delight Cooking Pot;Mekanism支援九個Factory-backed families、Pressurized Reaction、兩種安全單向Rotary shape及Chemical Oxidizer、Chemical Infuser、Electrolytic Separator、Chemical Dissolution Chamber、Chemical Washer、Chemical Crystallizer、Isotopic Centrifuge、Antiprotonic Nucleosynthesizer、Pigment Extractor、Pigment Mixer、Painting Machine,完整22/26 recipe-type盤點與排除理由見[`mekanism-compatibility.md`](mekanism-compatibility.md);Botania支援Mana Infusion、Runic Altar、Terrestrial Agglomeration、Petal Apothecary與Elven Trade;Modern Industrialization支援14個direct `MachineRecipe` families及exact item/fluid/EU/catalyst/multi-output transaction,tier/proxy/RNG邊界見[`modern-industrialization-compatibility.md`](modern-industrialization-compatibility.md);Ars Nouveau支援Imbuement與Enchanting Apparatus的exact Source/item/catalyst/remainder/component transaction,邊界見[`ars-nouveau-compatibility.md`](ars-nouveau-compatibility.md);EvilCraft支援Blood Infuser的exact item/Blood/Promise tier/duration/output transaction,XP/Purifier邊界見[`evilcraft-compatibility.md`](evilcraft-compatibility.md);Powah支援1–6 item Energizing、scaled FE與loaded rod throughput,邊界見[`powah-compatibility.md`](powah-compatibility.md);Industrial Foregoing支援Dissolution Chamber、Material Stonework Factory與Crusher的exact item/fluid/FE/work transaction,邊界見[`industrial-foregoing-compatibility.md`](industrial-foregoing-compatibility.md);Create支援deterministic Milling、Crushing、Cutting、Filling與Emptying,邊界見[`create-compatibility.md`](create-compatibility.md);Create Crafts & Additions支援deterministic Rolling與Charging,Liquid Burning fail-closed,邊界見[`createaddition-compatibility.md`](createaddition-compatibility.md);Extended Crafting支援安裝Ultimate Crafting Table後的3×3–9×9 exact shaped-table recipes及真實Ultimate Singularity,含最多81個exact input groups、component identity、remainders與rollback,邊界見[`extended-crafting-compatibility.md`](extended-crafting-compatibility.md);Oritech支援exact pulverizer item/FE/work與deterministic multi-output remainder,邊界見[`oritech-compatibility.md`](oritech-compatibility.md);Theurgy支援deterministic Calcination、Distillation與Liquefaction,邊界見[`theurgy-compatibility.md`](theurgy-compatibility.md)。Advanced AE 1.6.11的Reaction Chamber因live AE-network power、speed-card state與generic item/fluid stacks維持fail closed;present-mod module不註冊station或recipe family,邊界見[Advanced AE compatibility](advanced-ae-compatibility.md)。所有exact sized item/fluid/chemical/Mana、FE、station work、retained catalyst、container remainder與deterministic multi-output都放進同一atomic transaction;non-item primary只送Storage。Custom exact class/type可透過公開`auto_storage:recipe_family` registry一次註冊整個family;`singleItemToItem`處理窄單輸入,`deterministicResources`處理1–81個item/fluid/power/chemical/addon alternatives、retained roles與alternative-specific remainders。開啟Use Player Inventory時,typed item input與普通配方一樣把Core及可見36格玩家背包放進同一exact simulate/commit plan;non-item typed input仍只讀Core。沒有名稱、serializer、`Recipe#getIngredients()`或EMI widget推測fallback。每種都先要求Core安裝matching station或具備足夠Axe Energy。所有lookup/select/current/reload/execute都按ID重取目前server holder;輸入、work/Fuel、typed outputs、玩家/Core destination與capacity完整simulate後才commit,失敗整批rollback。Direct `×1/×8/×64/Max` 與 EMI request維持各自既有destination contract。第三方recipe-viewer metadata由原mod擁有:Iron Furnaces以自己的JEI plugin註冊Smelting catalysts,Prism GUI support pack由TMRV把該JEI plugin metadata接到EMI且不安裝JEI;Auto Storage只管理terminal station variants,絕不替第三方呼叫EMI `addWorkstation`。PneumaticCraft目前只跑present-mod fail-closed fixture:其Air無simulate/accepted amount且可為負值,pressure/heat/multiblock是live retained state,所以不註冊Air kind或recipe family;完整審計見[`pneumaticcraft-compatibility.md`](pneumaticcraft-compatibility.md)。Immersive Engineering目前同樣只跑present-mod fail-closed fixture:format-17 的44個actual recipe-class candidates全拒(multiblock、live fuel/tank、`RecipeMultiplier`、chance/`TagOutput`),不註冊自訂 station/family;完整審計見[`immersiveengineering-compatibility.md`](immersiveengineering-compatibility.md)。Create Aquatic Ambitions 2.0.4也只跑present-mod fail-closed fixture:Channeling依賴Encased Fan world catalysts、Conduit side effect與chance outputs,所以不註冊station、resource kind或recipe family;完整審計見[`create-aquatic-ambitions-compatibility.md`](create-aquatic-ambitions-compatibility.md)。Create Enchantment Industry `2.5.0-preview-alpha1`同樣只跑present-mod fail-closed fixture:Grindstone kinetics/tank/disenchant、Printer template behaviour與Blaze Enchanter/Forger randomness都無法進atomic transaction,所以不註冊station、resource kind或recipe family;完整審計見[`create-enchantment-industry-compatibility.md`](create-enchantment-industry-compatibility.md)。Draconic Evolution 3.1.4.632也維持present-mod fail-closed:Fusion Crafting依賴live multiblock injectors、tiered energy charging與config-timed state machine,不註冊station、resource kind或recipe family;完整審計見[`draconicevolution-compatibility.md`](draconicevolution-compatibility.md)。Productive Metalworks同樣為outcome C fail-closed:Foundry melting/alloying與live casting/entity melting沒有完整simulate-then-commit contract,因此不註冊custom station/family;完整審計見[`productivemetalworks-compatibility.md`](productivemetalworks-compatibility.md)。Productive Bees 1.21.1-13.13.5的16個actual recipe classes經format-17重審後也因chance、live bee/entity/world、dynamic component或machine-state語意維持零registration Outcome C;完整審計見[`productivebees-compatibility.md`](productivebees-compatibility.md)。Railcraft Reborn 1.2.10同樣只跑present-mod fail-closed fixture:受審concrete recipes因chance、live multiblock/machine state或special-crafting語意全部rejected,不註冊station、resource kind或recipe family;完整審計見[`railcraft-compatibility.md`](railcraft-compatibility.md)。目前仍不執行遞迴合成;multi-step路線見 [`recipe-family-api.md`](recipe-family-api.md) 及 `docs/superpowers/plans/2026-07-14-modded-recipes-multistep-crafting.md`,EMI tree只作client規劃/參考介面。Chance/dynamic/per-tick-use families、缺少registry context、Brewing、任意mod block hook、自由world/player-context recipe與external-machine send-and-wait仍fail closed。 - **Typed-resource Core** — Item、fluid、NeoForge Energy、optional Mekanism chemical、optional Botania Mana、optional Ars Nouveau Source與addon kinds現在共用一個server-owned `StorageResourceLedger`;`ItemKey`只保留exact-item bridge,舊segmented item NBT是save/load相容邊界而非第二個live map。公開`auto_storage:resource_kind`、`resource_block_strategy`與`resource_container_strategy` registries,加上`StorageResourceKey`、`StorageResourceTransaction`與generic block capability,形成不授予任意Core callback的addon邊界。Storage/Crafting Terminal以代表物列出non-item exact key/long amount,並可在cursor上用一個supported fluid/FE/chemical/Mana/addon container原子存取;stacked container只處理一個,result必須能精確替換cursor或放入玩家背包,否則Core與玩家狀態整筆不變。icon不可被當物品抽出。Creative容量對全部kind無限;Bus主動/被動路徑支援generic與native typed endpoints。`deterministicResources` family可宣告1–81個exact consume/catalyst/tool inputs與多個primary/remainder outputs,所有Core item/non-item delta以同一transaction simulate→commit。Addon handler必須simulation無副作用、回傳`0..requested`且execute mutation精確等於回傳值;binary-incompatible optional bridge直接明確失敗,不silent fallback。Mekanism CI只驗一個代表版本,不建立多版本承諾;其他版本問題由使用者回報。External-machine send-and-wait仍不屬於本mod,multi-step planner仍是後續。完整契約見 [`typed-resource-storage.md`](typed-resource-storage.md) 與 [`recipe-family-api.md`](recipe-family-api.md)。 - **Assets / tools** — Runtime block/item icons維持vanilla 16x16與同一dark chassis/cyan-amethyst palette。T1–T6 ornament逐級華麗,Creative Storage Unit使用Replicate seed 71425候選與同family semantic cleanup完成cyan-amethyst infinity cell;全部以x=7.5水平鏡射並以2×2偶數中心校正。World casing預設使用ordinary 16x16 vanilla model;若client安裝可選Fusion 1.2.12,內建且自動啟用的connected-casing overlay才會以`pieced` 80×16 sheet相連,Creative Unit也納入全部12種network block predicates。item model仍是ordinary 16x16;Fusion只進Gradle隔離的client/data `fusionRuntime` source set,不進server/GameTest dependency也不bundle。Auto Storage Wrench加入`c:tools/wrench`並接受同tag的其他mod工具:右鍵旋轉directional bus,Shift+右鍵以正常loot path安全拆除network block;含資料Core透過同一repository record的recovery token移動。生成metadata/contact sheets只留在`art/texture-generation/`,static tests不取代fullscreen目視。 - **macOS GUI fullscreen validation** — Visual Prism sessions use Minecraft F11 through a macOS-only borderless Cocoa implementation, never GLFW monitor fullscreen or a desktop display-mode change. Each scenario contains only its current checklist fixtures and starts aimed at the first target. The crafting scenario generates one matching server-owned Core record with all stored resources, stations, Processing work, typed reserves, exact fluid/gas/energy/mana inputs, and all 19 component-bearing Ultimate Singularity materials; player inventory is otherwise empty, with only hotbar 1/2 navigation and one Coal in hotbar 3 because the Transform visual check requires an input. The user performs fullscreen approval, page/recipe selection, that one shift-click, and visual inspection; repeatable setup remains automated. Normal close is F11 → visible titled window → Command-Q. [MacFix 0.1.0](https://modrinth.com/mod/macfix) is an active hash-pinned macOS-only Prism GUI support artifact that prevents the macOS 26 Cocoa delegate close/styleMask crash; it is not an Auto Storage player dependency. See [`docs/macos-fullscreen-guide.md`](macos-fullscreen-guide.md) and [`docs/notes.md`](notes.md#prism-dev--manual-handoff). diff --git a/docs/recipe-family-api.md b/docs/recipe-family-api.md index fa8d11a6..bc2ce3c5 100644 --- a/docs/recipe-family-api.md +++ b/docs/recipe-family-api.md @@ -117,6 +117,9 @@ current complete identity of every server value that can affect the plan or cost. Equal behavior may reuse a token; changed behavior must not. Family eligibility and candidate-index shape must remain stable across token changes; use a recipe-manager reload rather than this factory when membership changes. +When a live token value makes cost or plan construction throw +`IllegalArgumentException`, dynamic resolution yields no usable variant without +propagating that exception through Craftable refresh or server tick. Shared Craftable result caches compare the token map before reuse, so a config reload cannot restore outputs built from stale amounts. The supplier runs on the authoritative server thread and must be deterministic, side-effect free, @@ -136,6 +139,7 @@ leave stale FE/work costs. - **Powah:** Energizing consumes one to six exact items plus scaled NeoForge Energy, uses the same scaled amount as station work, and derives each installed rod tier rate from loaded Powah config. Dynamic/custom inputs, non-positive energy, physical warm-up, and world links fail closed. - **Industrial Foregoing:** Dissolution Chamber plans consume grouped exact item slots, sized fluid, live-config FE, and station work while preserving deterministic item/fluid outputs. Material Stonework Factory plans preserve water/lava catalysts or consume exact full thresholds; Crusher accepts only one exact deterministic output. Partial thresholds, laser/extractor world state, custom output callbacks, and ambiguous outputs fail closed. - **Create:** Milling, Crushing, and Cutting consume one exact item plus recipe duration; Filling consumes exact item + fluid; Emptying returns exact item + fluid. All outputs must be deterministic and all five stations use normalized station work. Chance, heat, RPM-dependent, multi-station, tool-durability, world-catalyst, Mechanical Crafting, and Sequenced Assembly shapes fail closed. +- **Create Crafts & Additions:** exact `RollingRecipe` and `ChargingRecipe` with Rolling / Charging Processing labels, config-backed dynamic work tokens, exact FE consume for charging, crafting remainders, single guaranteed ProcessingOutput shape fail-closed, and Liquid Burning fail-closed; see [`createaddition-compatibility.md`](createaddition-compatibility.md). - **Create Aquatic Ambitions:** the present-mod module registers no station, resource kind, or recipe family. Channeling remains fail closed because its Encased Fan catalyst is selected from live Conduit/block/fluid world state, mutates entity Conduit Power, and may emit chance outputs. Exact vanilla/Create-class datapack recipes remain owned by the corresponding built-in/Create contracts rather than a CAA-specific approximation. - **Create Enchantment Industry:** the present-mod module registers no station, resource kind, or recipe family. Mechanical Grindstone kinetics/tank/disenchant paths, Printer template behaviours, and Blaze Enchanter/Forger randomness remain outside the transaction contract; see [`create-enchantment-industry-compatibility.md`](create-enchantment-industry-compatibility.md). - **Extended Crafting:** exact shaped-table recipes from 3×3 through 9×9 and the real `UltimateSingularityRecipe` require one installed Ultimate Crafting Table. Up to 81 exact groups preserve alternatives, remainders, components, and atomic rollback; custom transformers fail closed; see [`extended-crafting-compatibility.md`](extended-crafting-compatibility.md). diff --git a/docs/structure.md b/docs/structure.md index b2e80c9b..8a1e0426 100644 --- a/docs/structure.md +++ b/docs/structure.md @@ -50,6 +50,8 @@ | `src/industrialForegoingFixture/` | 代表性Industrial Foregoing 1.21-3.6.39 + Titanium 4.0.45隔離GameTest fixture;驗證item/fluid/FE/work、persistence、rollback與fail-closed。 | | `docs/create-compatibility.md` | Create optional Milling/Crushing/Cutting/Filling/Emptying exact contract、normalized station work與RPM/chance/multi-station邊界。 | | `src/createFixture/` | 代表性Create 6.0.10隔離GameTest fixture;13個tests驗五個deterministic families、item/fluid/remainder/work/reload與atomic rollback。 | +| `docs/createaddition-compatibility.md` | Create Crafts & Additions 1.6.0 scanner-format-17 Rolling/Charging contract、Liquid Burning fail-closed、isolated 110-recipe digest與Create companion ancestry。 | +| `src/createadditionFixture/` | 代表性Create Crafts & Additions 1.6.0 + Create隔離GameTest fixture;9個tests驗Rolling/Charging registration、exact remainder、exact FE/work、loaded chance recipe與程式建構fluid-shape雙重fail-closed、shortage/overflow/stale-holder rollback及Liquid Burning fail-closed。 | | `docs/create-aquatic-ambitions-compatibility.md` | Create Aquatic Ambitions 2.0.4 scanner-format-17 audit:79個target classes、6個reachable ancestry、2個actual Recipe candidates重審拒絕、Channeling world/chance邊界與零production-family Outcome C。 | | `src/createAquaticAmbitionsFixture/` | 代表性Create Aquatic Ambitions 2.0.4 + Create隔離GameTest fixture;4個tests驗present target、零custom registration及全部Channeling recipes fail closed。 | | `docs/create-enchantment-industry-compatibility.md` | Create Enchantment Industry `2.5.0-preview-alpha1` Compat Kit Outcome C:Grindstone/Printer/Enchanter/Forger fail-closed與零production-family邊界。 | diff --git a/scripts/test_static_regressions.py b/scripts/test_static_regressions.py index c969700b..d4e1b39b 100644 --- a/scripts/test_static_regressions.py +++ b/scripts/test_static_regressions.py @@ -2197,7 +2197,308 @@ def test_productivemetalworks_registry_checks_cover_namespace_and_path(self): 'id.getNamespace().equals("productivemetalworks")', coexistence, ) + def test_createaddition_compat_is_optional_and_isolated(self): + metadata = self.read_required("src/main/templates/META-INF/neoforge.mods.toml") + module_index = self.read_compat_module("createaddition") + module = self.read_required( + "src/compat/createaddition/java/com/swear/autostorage/compat/" + "createaddition/CreateadditionCompatModule.java" + ) + compat = self.read_required( + "src/compat/createaddition/java/com/swear/autostorage/compat/" + "createaddition/CreateadditionCompat.java" + ) + fixture = self.read_required( + "src/createadditionFixture/java/com/swear/autostorage/fixture/" + "createaddition/CreateadditionIntegrationGameTests.java" + ) + fixture_metadata = self.read_required( + "src/createadditionFixture/resources/META-INF/neoforge.mods.toml" + ) + compatibility_doc = self.read_required("docs/createaddition-compatibility.md") + build = self.read_required("build.gradle") + contract = json.loads( + self.read_required("compat/contracts/createaddition.json") + ) + audit = json.loads( + self.read_required("compat/audits/createaddition/1.6.0.json") + ) + descriptor = json.loads( + self.read_required("src/compat/createaddition/compat-module.json") + ) + en_us = json.loads( + self.read_required("src/main/resources/assets/auto_storage/lang/en_us.json") + ) + zh_tw = json.loads( + self.read_required("src/main/resources/assets/auto_storage/lang/zh_tw.json") + ) + + self.assert_descriptor_driven_fixture( + build, "createaddition", "createadditionFixture", 9 + ) + self.assertNotIn('modId="createaddition"', metadata) + self.assertIn('"createaddition"', module_index) + self.assertIn("maven.modrinth:createaddition:qPr8V4G2", module_index) + self.assertIn( + "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9", + module_index, + ) + self.assertEqual(17, audit["scanner_format"]) + self.assertEqual( + [ + "com.mrh0.createaddition.recipe.charging.ChargingRecipe", + "com.mrh0.createaddition.recipe.liquid_burning.LiquidBurningRecipe", + "com.mrh0.createaddition.recipe.rolling.RollingRecipe", + ], + sorted( + candidate["class"] + for candidate in audit["candidates"]["recipe_classes"] + ), + ) + self.assertEqual(contract["matrix"], descriptor["matrix"]) + self.assertEqual( + "57916d79470225dd3db82f96c7e5c70a87192df1930c8d8efa4768add46fd0a3", + descriptor["matrix"]["recipeInventory"]["sha256"], + ) + self.assertEqual(9, contract["verification"]["expected_game_tests"]) + self.assertEqual(9, descriptor["expectedTests"]) + self.assertIn("IsolatedRecipeInventoryEvidence", fixture) + self.assertIn("implements AutoStorageCompatModule", module) + self.assertIn("CreateadditionCompat.register(MACHINES, RECIPES)", module) + self.assertIn("RollingRecipe.class", compat) + self.assertIn("ChargingRecipe.class", compat) + self.assertNotIn("LiquidBurningRecipe.class", compat) + self.assertEqual( + 2, + compat.count("RecipeFamilyFactories.dynamicDeterministicResources("), + ) + self.assertNotIn( + "RecipeFamilyFactories.deterministicResources(", + compat, + ) + self.assertIn("getFluidIngredients()", compat) + self.assertIn("getFluidResults()", compat) + self.assertIn("getRollableResults()", compat) + self.assertIn("getChance() == 1.0F", compat) + self.assertIn("rolling_returns_item_remainder_and_consumes_duration", fixture) + self.assertIn( + "Create Crafts & Additions rolling remainder transaction was wrong", + fixture, + ) + self.assertIn("recipePresent(helper, fixtureRecipe(\"chance_rolling\"))", fixture) + self.assertIn("recipePresent(helper, fixtureRecipe(\"chance_charging\"))", fixture) + for recipe_name in ( + "fluid_result_rolling", + "fluid_ingredient_rolling", + "fluid_result_charging", + "fluid_ingredient_charging", + ): + self.assertRegex( + fixture, + rf'upstreamAndAutoStorageReject\(\s*fixtureRecipe\("{recipe_name}"\)', + ) + self.assertFalse( + (ROOT / "src/createadditionFixture/resources/data/" + "auto_storage_createaddition_fixture/recipe/" + f"{recipe_name}.json").exists() + ) + self.assertIn("chance_rolling", fixture) + self.assertIn("fluid_result_rolling", fixture) + self.assertIn("fluid_ingredient_rolling", fixture) + self.assertIn("chance_charging", fixture) + self.assertIn("fluid_result_charging", fixture) + self.assertIn("fluid_ingredient_charging", fixture) + self.assertEqual( + "Create Crafts & Additions rolling remainder transaction was wrong", + contract["verification"]["evidence"]["catalyst_tool_remainder_exact"][0][ + "marker" + ], + ) + self.assertEqual( + "src/createadditionFixture/java/com/swear/autostorage/fixture/" + "createaddition/CreateadditionIntegrationGameTests.java", + contract["verification"]["evidence"]["catalyst_tool_remainder_exact"][0][ + "source" + ], + ) + self.assertEqual( + "Typed family changed the wrong exact resources or output amounts", + contract["verification"]["evidence"]["multi_output_merge_exact"][0][ + "marker" + ], + ) + self.assertEqual( + "src/recipeAddonFixture/java/com/swear/autostorage/fixture/recipe/" + "RecipeFamilyIntegrationTests.java", + contract["verification"]["evidence"]["multi_output_merge_exact"][0][ + "source" + ], + ) + self.assertEqual( + "runRecipeAddonGameTestServer", + contract["verification"]["evidence"]["multi_output_merge_exact"][0][ + "task" + ], + ) + self.assertIn('modId="createaddition"', fixture_metadata) + self.assertIn("maven.modrinth:create:UjX6dr61", module_index) + self.assertIn("representative CI", compatibility_doc) + self.assertIn("scanner format `17`", compatibility_doc) + self.assertEqual( + "Rolling", + en_us["gui.auto_storage.station.createaddition_rolling_mill"], + ) + self.assertEqual( + "Charging", + en_us["gui.auto_storage.station.createaddition_tesla_coil"], + ) + self.assertEqual( + "軋制", + zh_tw["gui.auto_storage.station.createaddition_rolling_mill"], + ) + self.assertEqual( + "充電", + zh_tw["gui.auto_storage.station.createaddition_tesla_coil"], + ) + + def test_createaddition_charging_work_rejects_non_positive_rate(self): + compat = self.read_required( + "src/compat/createaddition/java/com/swear/autostorage/compat/" + "createaddition/CreateadditionCompat.java" + ) + match = re.search( + r"private static long chargingWork\(ChargingRecipe recipe\)\s*" + r"\{(?P.*?)\n \}", + compat, + re.S, + ) + self.assertIsNotNone(match, "missing CreateadditionCompat.chargingWork") + body = match.group("body") + self.assertRegex( + body, + r"long rate = chargeRate\(recipe\);", + ) + self.assertRegex( + body, + r"if\s*\(\s*rate\s*<=\s*0L?\s*\)", + ) + self.assertIn("Math.addExact(energy, rate - 1L) / rate", body) + self.assertNotIn("Math.max(1L, chargeRate", compat) + self.assertNotIn("Math.max(1L, rate", body) + + + def test_createaddition_reloadable_rates_do_not_change_candidate_eligibility(self): + compat = self.read_required( + "src/compat/createaddition/java/com/swear/autostorage/compat/" + "createaddition/CreateadditionCompat.java" + ) + rolling = self.java_block( + compat, + r"\bprivate\s+static\s+boolean\s+supportsRolling\s*\(", + "Createaddition rolling eligibility", + ) + charging = self.java_block( + compat, + r"\bprivate\s+static\s+boolean\s+supportsCharging\s*\(", + "Createaddition charging eligibility", + ) + + self.assertNotIn("rollingDuration()", rolling) + self.assertNotIn("chargeRate(recipe)", charging) + self.assertIn("RecipeFamilyCost.stationWork(rollingDuration())", compat) + self.assertIn("RecipeFamilyCost.stationWork(chargingWork(recipe))", compat) + + def test_createaddition_checked_overflow_fixture_asserts_complete_atomic_no_op(self): + fixture = self.read_required( + "src/createadditionFixture/java/com/swear/autostorage/fixture/" + "createaddition/CreateadditionIntegrationGameTests.java" + ) + method = self.java_block( + fixture, + r"\bpublic\s+static\s+void\s+checked_overflow_rejects_long_max_seed\s*\(", + "Createaddition checked-overflow GameTest", + ) + self.assertIn('itemCount(context.core(), Items.IRON_INGOT) != 1', method) + self.assertIn( + "context.core().getStationWork(ROLLING_MILL) != work", + method, + ) + + def test_createaddition_stale_holder_fixture_selects_then_invalidates_real_recipe(self): + fixture = self.read_required( + "src/createadditionFixture/java/com/swear/autostorage/fixture/" + "createaddition/CreateadditionIntegrationGameTests.java" + ) + method = self.java_block( + fixture, + r"\bpublic\s+static\s+void\s+stale_holder_is_atomic\s*\(", + "Createaddition stale-holder GameTest", + ) + + self.assertNotIn("missing_stale_holder", method) + self.assertIn("IRON_ROD", method) + self.assertIn("replaceRecipes", method) + self.assertIn("CraftingDestination.NONE", method) + self.assertIn("CraftingDestination.STORAGE", method) + + def test_createaddition_dedupes_ingredient_alternatives_by_canonical_key(self): + compat = self.read_required( + "src/compat/createaddition/java/com/swear/autostorage/compat/" + "createaddition/CreateadditionCompat.java" + ) + method = self.java_block( + compat, + r"\bprivate\s+static\s+TypedRecipeInput\s+consumedWithRemainder\s*\(", + "Createaddition consumedWithRemainder", + ) + representatives = self.java_block( + compat, + r"\bprivate\s+static\s+List\s+representatives\s*\(", + "Createaddition representatives", + ) + + self.assertIn("LinkedHashMap", method) + self.assertIn("StorageResourceKey.item", method) + self.assertIn("putIfAbsent", method) + self.assertNotRegex( + representatives, + r"\.map\(\s*stack\s*->\s*stack\.copyWithCount\(1\)\s*\)\s*\.distinct\(\)", + "ItemStack.distinct cannot normalize duplicate ingredient alternatives", + ) + + def test_createaddition_dynamic_cost_refresh_fails_closed_without_throwing(self): + family = self.read_required( + "src/main/java/com/swear/autostorage/RecipeFamily.java" + ) + resolve = self.java_block( + family, + r"\bpublic\s+List\s+resolveVariants\s*\(", + "RecipeFamily.resolveVariants", + ) + contract = self.java_block( + family, + r"\bpublic\s+RecipeAdapterMatch\.Contract\s+contract\s*\(", + "RecipeFamily.contract", + ) + + self.assertIn("IllegalArgumentException", resolve) + self.assertIn("return List.of()", resolve) + self.assertIn("cacheTypedPlan", contract) + self.assertIn("Cost.free()", contract) + + def test_createaddition_notes_distinguish_eligibility_from_live_rate_cost(self): + notes = self.read_required("docs/notes.md") + compatibility = self.read_required("docs/createaddition-compatibility.md") + + self.assertNotIn("正確作法是eligibility已要求正rate", notes) + self.assertIn("maxChargeRate", notes) + self.assertIn("cost", notes.lower()) + self.assertNotIn( + "cost evaluation fail-closes with\n `IllegalArgumentException`", + compatibility, + ) + self.assertIn("no usable variant", compatibility) def test_immersiveengineering_compat_is_optional_fail_closed(self): metadata = self.read_required("src/main/templates/META-INF/neoforge.mods.toml") diff --git a/src/compat/createaddition/.compat-kit-manifest.json b/src/compat/createaddition/.compat-kit-manifest.json new file mode 100644 index 00000000..8f644a88 --- /dev/null +++ b/src/compat/createaddition/.compat-kit-manifest.json @@ -0,0 +1,14 @@ +{ + "contract_sha256": "34ba4c1fcbb700f9859c74df08c52d179646466a79c8177b14baf095d6bf0728", + "files": { + "src/compat/createaddition/compat-module.json": "be1dac13b7eff4d6769f18aaeab19d94fbe9a12bd315311fe926e89f3933e9ee", + "src/compat/createaddition/java/com/swear/autostorage/compat/createaddition/CreateadditionCompat.java": "c75ec856c6c99de411eb121fddbaaf6cdb13d7ef9a36ff6db407243d41b73bf6", + "src/compat/createaddition/java/com/swear/autostorage/compat/createaddition/CreateadditionCompatModule.java": "e980cf1754b0cb3a77c2fe54f6ea866d1c9739b343871f7aaa29c11b37e58784", + "src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionFixtureMod.java": "5a2ffda9ee35447c9aedd366952584d8ef4d03ede358b6e10992a7e823f6291a", + "src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionIntegrationGameTests.java": "a0b2255f4d083b37e9bfc67a2a2968a8998d4130fc734e2ddeb326923e0bbaad", + "src/createadditionFixture/resources/META-INF/neoforge.mods.toml": "e544e4eb01f76c598cd49b966615b29d34893ec0974f01f62ab017b310b11456", + "src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/structure/craftingtests.platform.nbt": "4f9baea23014a7ecde3871c56eba0271274269ed00688fc981bd3e6116c4dfbc" + }, + "schema": 1, + "tool_version": "0.3.0" +} diff --git a/src/compat/createaddition/compat-module.json b/src/compat/createaddition/compat-module.json new file mode 100644 index 00000000..f2325ab4 --- /dev/null +++ b/src/compat/createaddition/compat-module.json @@ -0,0 +1,56 @@ +{ + "auditArtifact": { + "dependency": "maven.modrinth:createaddition:qPr8V4G2", + "sha256": "41876c3780b70365a1848994d146a73423cc19fbe86485885795d9e7d855e7e9" + }, + "dependencies": [ + "maven.modrinth:createaddition:qPr8V4G2", + "cc.tweaked:cc-tweaked-1.21.1-core-api:1.115.1", + "com.simibubi.create:create-1.21.1:6.0.10-280:slim", + "dev.engine-room.flywheel:flywheel-neoforge-api-1.21.1:1.0.6", + "mezz.jei:jei-1.21.1-common-api:19.25.0.323", + "net.createmod.ponder:ponder-neoforge:1.0.82+mc1.21.1" + ], + "entrypoint": "com.swear.autostorage.compat.createaddition.CreateadditionCompatModule", + "expectedTests": 9, + "fixture": "createadditionFixture", + "id": "auto_storage:createaddition", + "matrix": { + "acceptedRecipes": [ + "createaddition:rolling/iron_ingot", + "createaddition:charging/electrify_gold_nugget" + ], + "descriptors": [ + "auto_storage:createaddition_rolling_mill", + "auto_storage:createaddition_tesla_coil" + ], + "mods": [ + "createaddition" + ], + "recipeInventory": { + "namespaces": [ + "createaddition" + ], + "sha256": "57916d79470225dd3db82f96c7e5c70a87192df1930c8d8efa4768add46fd0a3" + }, + "rejectedDescriptors": [], + "rejectedResourceKinds": [], + "resourceKinds": [] + }, + "repositories": [ + "https://api.modrinth.com/maven", + "https://maven.createmod.net", + "https://maven.squiddev.cc", + "https://maven.blamejared.com/" + ], + "requires": [ + "createaddition" + ], + "runtimeDependencies": [ + "maven.modrinth:createaddition:qPr8V4G2", + "maven.modrinth:create:UjX6dr61" + ], + "schema": 1, + "side": "both", + "sourceSet": "compatCreateaddition" +} diff --git a/src/compat/createaddition/java/com/swear/autostorage/compat/createaddition/CreateadditionCompat.java b/src/compat/createaddition/java/com/swear/autostorage/compat/createaddition/CreateadditionCompat.java new file mode 100644 index 00000000..cbdd6bac --- /dev/null +++ b/src/compat/createaddition/java/com/swear/autostorage/compat/createaddition/CreateadditionCompat.java @@ -0,0 +1,258 @@ +package com.swear.autostorage.compat.createaddition; + +import com.mrh0.createaddition.config.CommonConfig; +import com.mrh0.createaddition.index.CARecipes; +import com.mrh0.createaddition.recipe.charging.ChargingRecipe; +import com.mrh0.createaddition.recipe.rolling.RollingRecipe; +import com.simibubi.create.content.processing.recipe.ProcessingOutput; +import com.swear.autostorage.MachineCategory; +import com.swear.autostorage.MachineDescriptor; +import com.swear.autostorage.MachineDescriptorApi; +import com.swear.autostorage.MachineVariant; +import com.swear.autostorage.MachineWorkRate; +import com.swear.autostorage.RecipeFamily; +import com.swear.autostorage.RecipeFamilyApi; +import com.swear.autostorage.RecipeFamilyCost; +import com.swear.autostorage.RecipeFamilyFactories; +import com.swear.autostorage.RecipePresentationKind; +import com.swear.autostorage.StorageResourceKey; +import com.swear.autostorage.TypedRecipeInput; +import com.swear.autostorage.TypedRecipeOutput; +import com.swear.autostorage.TypedRecipePlan; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public final class CreateadditionCompat { + private static final String MOD_ID = "createaddition"; + private static final ResourceLocation ROLLING_MILL_ITEM = + ResourceLocation.fromNamespaceAndPath(MOD_ID, "rolling_mill"); + private static final ResourceLocation TESLA_COIL_ITEM = + ResourceLocation.fromNamespaceAndPath(MOD_ID, "tesla_coil"); + + private CreateadditionCompat() { + } + + public static void register( + DeferredRegister machineDescriptors, + DeferredRegister recipeFamilies + ) { + Objects.requireNonNull(machineDescriptors, "machineDescriptors"); + Objects.requireNonNull(recipeFamilies, "recipeFamilies"); + if (!machineDescriptors.getRegistryKey().equals(MachineDescriptorApi.REGISTRY_KEY)) { + throw new IllegalArgumentException( + "Create Crafts & Additions descriptor register targets the wrong registry"); + } + if (!recipeFamilies.getRegistryKey().equals(RecipeFamilyApi.REGISTRY_KEY)) { + throw new IllegalArgumentException( + "Create Crafts & Additions family register targets the wrong registry"); + } + if (!machineDescriptors.getNamespace().equals(recipeFamilies.getNamespace())) { + throw new IllegalArgumentException( + "Create Crafts & Additions descriptors and families must share one namespace"); + } + + ResourceLocation rollingId = ResourceLocation.fromNamespaceAndPath( + machineDescriptors.getNamespace(), "createaddition_rolling_mill"); + ResourceLocation chargingId = ResourceLocation.fromNamespaceAndPath( + machineDescriptors.getNamespace(), "createaddition_tesla_coil"); + + machineDescriptors.register(rollingId.getPath(), () -> + MachineDescriptor.installableVariants( + rollingId, + Component.translatable( + "gui.auto_storage.station.createaddition_rolling_mill"), + () -> List.of(MachineVariant.of( + new ItemStack(requiredItem(ROLLING_MILL_ITEM)), + MachineWorkRate.ONE)), + MachineCategory.PROCESS, + MachineDescriptorApi.MAX_INSTALLED_COUNT, + null)); + recipeFamilies.register(rollingId.getPath(), () -> + RecipeFamilyFactories.dynamicDeterministicResources( + RollingRecipe.class, + CARecipes.ROLLING_TYPE::get, + rollingId, + CreateadditionCompat::supportsRolling, + CreateadditionCompat::rollingPlan, + recipe -> RecipeFamilyCost.stationWork(rollingDuration()), + CreateadditionCompat::rollingDuration, + RecipePresentationKind.CRAFTING)); + + machineDescriptors.register(chargingId.getPath(), () -> + MachineDescriptor.installableVariants( + chargingId, + Component.translatable( + "gui.auto_storage.station.createaddition_tesla_coil"), + () -> List.of(MachineVariant.of( + new ItemStack(requiredItem(TESLA_COIL_ITEM)), + MachineWorkRate.ONE)), + MachineCategory.PROCESS, + MachineDescriptorApi.MAX_INSTALLED_COUNT, + null)); + recipeFamilies.register(chargingId.getPath(), () -> + RecipeFamilyFactories.dynamicDeterministicResources( + ChargingRecipe.class, + CARecipes.CHARGING_TYPE::get, + chargingId, + CreateadditionCompat::supportsCharging, + CreateadditionCompat::chargingPlan, + recipe -> RecipeFamilyCost.stationWork(chargingWork(recipe)), + CreateadditionCompat::chargingConfigToken, + RecipePresentationKind.CRAFTING)); + } + + private static boolean supportsRolling(RollingRecipe recipe) { + return recipe.getIngredients().size() == 1 + && exact(recipe.getIngredients().getFirst()) + && recipe.getFluidIngredients().isEmpty() + && recipe.getFluidResults().isEmpty() + && singleGuaranteed(recipe.getRollableResults()); + } + + private static TypedRecipePlan rollingPlan( + RollingRecipe recipe, + HolderLookup.Provider registries + ) { + ItemStack output = recipe.getRollableResults().getFirst().getStack().copy(); + return TypedRecipePlan.builder() + .input(consumedWithRemainder(recipe.getIngredients().getFirst(), registries)) + .output(TypedRecipeOutput.primary( + StorageResourceKey.item(output.copyWithCount(1), registries), + output.getCount())) + .presentationOutput(output) + .layout(1, 1, true) + .build(); + } + + private static boolean supportsCharging(ChargingRecipe recipe) { + return recipe.getEnergy() > 0 + && recipe.getMaxChargeRate() > 0 + && recipe.getIngredients().size() == 1 + && exact(recipe.getIngredients().getFirst()) + && recipe.getFluidIngredients().isEmpty() + && recipe.getFluidResults().isEmpty() + && singleGuaranteed(recipe.getRollableResults()); + } + + private static TypedRecipePlan chargingPlan( + ChargingRecipe recipe, + HolderLookup.Provider registries + ) { + ItemStack output = recipe.getRollableResults().getFirst().getStack().copy(); + int inputCount = 2; + int width = Math.min(3, inputCount); + return TypedRecipePlan.builder() + .input(consumedWithRemainder(recipe.getIngredients().getFirst(), registries)) + .input(TypedRecipeInput.consume( + StorageResourceKey.neoforgeEnergy(), recipe.getEnergy())) + .output(TypedRecipeOutput.primary( + StorageResourceKey.item(output.copyWithCount(1), registries), + output.getCount())) + .presentationOutput(output) + .layout(width, (inputCount + width - 1) / width, true) + .build(); + } + + private static TypedRecipeInput consumedWithRemainder( + Ingredient ingredient, + HolderLookup.Provider registries + ) { + LinkedHashMap unique = new LinkedHashMap<>(); + for (ItemStack stack : ingredient.getItems()) { + if (stack.isEmpty()) { + continue; + } + ItemStack representative = stack.copyWithCount(1); + unique.putIfAbsent( + StorageResourceKey.item(representative, registries), + representative); + } + List alternatives = List.copyOf(unique.keySet()); + Map remainders = new LinkedHashMap<>(); + for (Map.Entry entry : unique.entrySet()) { + ItemStack stack = entry.getValue(); + if (!stack.hasCraftingRemainingItem()) { + continue; + } + ItemStack remainder = stack.getCraftingRemainingItem(); + if (remainder.isEmpty()) { + continue; + } + remainders.put( + entry.getKey(), + TypedRecipeOutput.remainder( + StorageResourceKey.item(remainder, registries), + remainder.getCount())); + } + return remainders.isEmpty() + ? TypedRecipeInput.consumeAny(alternatives, 1) + : TypedRecipeInput.consumeAnyWithRemainders( + alternatives, 1, remainders); + } + + private static boolean singleGuaranteed(List outputs) { + return outputs.size() == 1 + && outputs.getFirst().getChance() == 1.0F + && !outputs.getFirst().getStack().isEmpty(); + } + + private static long rollingDuration() { + return CommonConfig.ROLLING_MILL_PROCESSING_DURATION.get(); + } + + private static long chargingConfigToken() { + return CommonConfig.TESLA_COIL_RECIPE_CHARGE_RATE.get(); + } + + private static long chargingWork(ChargingRecipe recipe) { + long rate = chargeRate(recipe); + if (rate <= 0L) { + throw new IllegalArgumentException( + "Create Crafts & Additions charge rate must be positive"); + } + long energy = recipe.getEnergy(); + return Math.addExact(energy, rate - 1L) / rate; + } + + private static long chargeRate(ChargingRecipe recipe) { + return Math.min( + CommonConfig.TESLA_COIL_RECIPE_CHARGE_RATE.get(), + recipe.getMaxChargeRate()); + } + + private static boolean exact(Ingredient ingredient) { + return ingredient != null + && !ingredient.isEmpty() + && ingredient.isSimple() + && !representatives(ingredient).isEmpty(); + } + + private static List representatives(Ingredient ingredient) { + return Arrays.stream(ingredient.getItems()) + .filter(stack -> !stack.isEmpty()) + .map(stack -> stack.copyWithCount(1)) + .toList(); + } + + private static Item requiredItem(ResourceLocation id) { + Item item = BuiltInRegistries.ITEM.get(id); + if (item == Items.AIR) { + throw new IllegalStateException( + "Missing Create Crafts & Additions station item " + id); + } + return item; + } +} diff --git a/src/compat/createaddition/java/com/swear/autostorage/compat/createaddition/CreateadditionCompatModule.java b/src/compat/createaddition/java/com/swear/autostorage/compat/createaddition/CreateadditionCompatModule.java new file mode 100644 index 00000000..aa658445 --- /dev/null +++ b/src/compat/createaddition/java/com/swear/autostorage/compat/createaddition/CreateadditionCompatModule.java @@ -0,0 +1,25 @@ +package com.swear.autostorage.compat.createaddition; + +import com.swear.autostorage.MachineDescriptor; +import com.swear.autostorage.MachineDescriptorApi; +import com.swear.autostorage.RecipeFamily; +import com.swear.autostorage.RecipeFamilyApi; +import com.swear.autostorage.api.AutoStorageApi; +import com.swear.autostorage.api.AutoStorageCompatContext; +import com.swear.autostorage.api.AutoStorageCompatModule; +import net.neoforged.neoforge.registries.DeferredRegister; + +public final class CreateadditionCompatModule implements AutoStorageCompatModule { + private static final DeferredRegister MACHINES = + MachineDescriptorApi.createDeferredRegister(AutoStorageApi.MOD_ID); + private static final DeferredRegister RECIPES = + RecipeFamilyApi.createDeferredRegister(AutoStorageApi.MOD_ID); + + @Override + public void register(AutoStorageCompatContext context) { + CreateadditionCompat.register(MACHINES, RECIPES); + context.register(addon -> addon + .machineDescriptors(MACHINES) + .recipeFamilies(RECIPES)); + } +} diff --git a/src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionFixtureMod.java b/src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionFixtureMod.java new file mode 100644 index 00000000..2b679fa0 --- /dev/null +++ b/src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionFixtureMod.java @@ -0,0 +1,8 @@ +package com.swear.autostorage.fixture.createaddition; + +import net.neoforged.fml.common.Mod; + +@Mod(CreateadditionFixtureMod.MODID) +public final class CreateadditionFixtureMod { + public static final String MODID = "auto_storage_createaddition_fixture"; +} diff --git a/src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionIntegrationGameTests.java b/src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionIntegrationGameTests.java new file mode 100644 index 00000000..68c2a53e --- /dev/null +++ b/src/createadditionFixture/java/com/swear/autostorage/fixture/createaddition/CreateadditionIntegrationGameTests.java @@ -0,0 +1,520 @@ +package com.swear.autostorage.fixture.createaddition; + +import com.mrh0.createaddition.config.CommonConfig; +import com.mrh0.createaddition.recipe.charging.ChargingRecipe; +import com.mrh0.createaddition.recipe.charging.ChargingRecipeParams; +import com.mrh0.createaddition.recipe.rolling.RollingRecipe; +import com.simibubi.create.content.processing.recipe.ProcessingOutput; +import com.simibubi.create.content.processing.recipe.ProcessingRecipe; +import com.simibubi.create.content.processing.recipe.ProcessingRecipeParams; +import com.swear.autostorage.Action; +import com.swear.autostorage.AutoStorage; +import com.swear.autostorage.CraftingDestination; +import com.swear.autostorage.CraftingTerminalMenu; +import com.swear.autostorage.IsolatedRecipeInventoryEvidence; +import com.swear.autostorage.ItemKey; +import com.swear.autostorage.MachineCategory; +import com.swear.autostorage.MachineDescriptor; +import com.swear.autostorage.MachineDescriptorApi; +import com.swear.autostorage.MachineEnergyTable; +import com.swear.autostorage.MachineWorkRate; +import com.swear.autostorage.StorageCoreBlockEntity; +import com.swear.autostorage.StorageResourceKey; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.material.Fluids; +import net.neoforged.neoforge.gametest.GameTestHolder; +import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient; + +@GameTestHolder(CreateadditionFixtureMod.MODID) +@PrefixGameTestTemplate(false) +public final class CreateadditionIntegrationGameTests { + private static final int STORAGE_PAGE_BUTTON = 14; + private static final int STATIONS_PAGE_BUTTON = 29; + private static final ResourceLocation ROLLING_MILL = + ResourceLocation.fromNamespaceAndPath( + AutoStorage.MODID, "createaddition_rolling_mill"); + private static final ResourceLocation TESLA_COIL = + ResourceLocation.fromNamespaceAndPath( + AutoStorage.MODID, "createaddition_tesla_coil"); + private static final ResourceLocation LIQUID_BURNER = + ResourceLocation.fromNamespaceAndPath( + AutoStorage.MODID, "createaddition_liquid_blaze_burner"); + private static final ResourceLocation IRON_ROD = createadditionRecipe("rolling/iron_ingot"); + private static final ResourceLocation ELECTRUM_NUGGET = + createadditionRecipe("charging/electrify_gold_nugget"); + private static final ResourceLocation PLANTOIL = + createadditionRecipe("liquid_burning/plantoil"); + + private CreateadditionIntegrationGameTests() { + } + + @GameTest(template = "craftingtests.platform") + public static void rolling_and_charging_register_and_liquid_burning_stays_excluded( + GameTestHelper helper + ) { + IsolatedRecipeInventoryEvidence.assertMatchesDescriptor( + helper.getLevel().getRecipeManager(), + CreateadditionIntegrationGameTests.class); + MachineDescriptor rolling = MachineEnergyTable.get(ROLLING_MILL); + MachineDescriptor charging = MachineEnergyTable.get(TESLA_COIL); + ItemStack rollingMill = new ItemStack(createadditionItem("rolling_mill")); + ItemStack teslaCoil = new ItemStack(createadditionItem("tesla_coil")); + if (rolling == null + || charging == null + || rolling.category() != MachineCategory.PROCESS + || charging.category() != MachineCategory.PROCESS + || rolling.maxInstalledCount() != MachineDescriptorApi.MAX_INSTALLED_COUNT + || charging.maxInstalledCount() != MachineDescriptorApi.MAX_INSTALLED_COUNT + || rolling.variants().size() != 1 + || charging.variants().size() != 1 + || !rolling.accepts(rollingMill) + || !charging.accepts(teslaCoil) + || !rolling.rateFor(rollingMill).orElseThrow().equals(MachineWorkRate.ONE) + || !charging.rateFor(teslaCoil).orElseThrow().equals(MachineWorkRate.ONE) + || !AutoStorage.RECIPE_FAMILY_REGISTRY.containsKey(ROLLING_MILL) + || !AutoStorage.RECIPE_FAMILY_REGISTRY.containsKey(TESLA_COIL) + || AutoStorage.RECIPE_FAMILY_REGISTRY.containsKey(LIQUID_BURNER) + || !supports(helper, IRON_ROD) + || !supports(helper, ELECTRUM_NUGGET) + || !supports(helper, fixtureRecipe("remainder_rolling")) + || supports(helper, PLANTOIL) + || !recipePresent(helper, fixtureRecipe("chance_rolling")) + || supports(helper, fixtureRecipe("chance_rolling")) + || !recipePresent(helper, fixtureRecipe("chance_charging")) + || supports(helper, fixtureRecipe("chance_charging")) + || !upstreamAndAutoStorageReject( + fixtureRecipe("fluid_result_rolling"), + new RollingRecipe(new SyntheticProcessingParams(false, true))) + || !upstreamAndAutoStorageReject( + fixtureRecipe("fluid_ingredient_rolling"), + new RollingRecipe(new SyntheticProcessingParams(true, false))) + || !upstreamAndAutoStorageReject( + fixtureRecipe("fluid_result_charging"), + new ChargingRecipe(new SyntheticChargingParams(false, true))) + || !upstreamAndAutoStorageReject( + fixtureRecipe("fluid_ingredient_charging"), + new ChargingRecipe(new SyntheticChargingParams(true, false)))) { + helper.fail( + "Create Crafts & Additions rolling/charging registration was incorrect"); + return; + } + helper.succeed(); + } + + @GameTest(template = "craftingtests.platform") + public static void rolling_returns_item_remainder_and_consumes_duration( + GameTestHelper helper + ) { + withCore(helper, context -> { + long work = rollingDuration(); + seedItem(context.core(), Items.LAVA_BUCKET, 1); + installStation(context, "rolling_mill", ROLLING_MILL); + tick(context.core(), (int) work); + if (!craft(context, fixtureRecipe("remainder_rolling")) + || itemCount(context.core(), Items.LAVA_BUCKET) != 0 + || itemCount(context.core(), Items.BUCKET) != 1 + || itemCount(context.core(), Items.OBSIDIAN) != 1 + || context.core().getStationWork(ROLLING_MILL) != 0) { + helper.fail( + "Create Crafts & Additions rolling remainder transaction was wrong"); + return; + } + helper.succeed(); + }); + } + + @GameTest(template = "craftingtests.platform") + public static void rolling_iron_ingot_emits_exact_wire_output(GameTestHelper helper) { + withCore(helper, context -> { + long work = rollingDuration(); + seedItem(context.core(), Items.IRON_INGOT, 1); + installStation(context, "rolling_mill", ROLLING_MILL); + tick(context.core(), (int) work); + if (!craft(context, IRON_ROD) + || itemCount(context.core(), Items.IRON_INGOT) != 0 + || itemCount(context.core(), createadditionItem("iron_rod")) != 2 + || context.core().getStationWork(ROLLING_MILL) != 0) { + helper.fail("Create Crafts & Additions rolling did not emit exact wire output"); + return; + } + helper.succeed(); + }); + } + + @GameTest(template = "craftingtests.platform") + public static void charging_consumes_exact_fe_and_work(GameTestHelper helper) { + withCore(helper, context -> { + long energy = chargingEnergy(ELECTRUM_NUGGET, helper); + long work = chargingWork(ELECTRUM_NUGGET, helper); + seedItem(context.core(), Items.GOLD_NUGGET, 1); + seedResource(context.core(), StorageResourceKey.neoforgeEnergy(), energy); + installStation(context, "tesla_coil", TESLA_COIL); + tick(context.core(), (int) work); + if (!craft(context, ELECTRUM_NUGGET) + || itemCount(context.core(), Items.GOLD_NUGGET) != 0 + || itemCount(context.core(), createadditionItem("electrum_nugget")) != 1 + || context.core().getResourceAmount( + StorageResourceKey.neoforgeEnergy()) != 0 + || context.core().getStationWork(TESLA_COIL) != 0) { + helper.fail("Create Crafts & Additions charging did not consume exact FE/work"); + return; + } + helper.succeed(); + }); + } + + @GameTest(template = "craftingtests.platform") + public static void missing_ingredient_is_atomic(GameTestHelper helper) { + withCore(helper, context -> { + long work = rollingDuration(); + installStation(context, "rolling_mill", ROLLING_MILL); + tick(context.core(), (int) work); + if (craft(context, IRON_ROD) + || itemCount(context.core(), Items.IRON_INGOT) != 0 + || itemCount(context.core(), createadditionItem("iron_rod")) != 0 + || context.core().getStationWork(ROLLING_MILL) != work) { + helper.fail( + "Create Crafts & Additions missing-ingredient transaction was not an atomic no-op"); + return; + } + helper.succeed(); + }); + } + + @GameTest(template = "craftingtests.platform") + public static void insufficient_fe_is_atomic(GameTestHelper helper) { + withCore(helper, context -> { + long energy = chargingEnergy(ELECTRUM_NUGGET, helper) - 1; + long work = chargingWork(ELECTRUM_NUGGET, helper); + seedItem(context.core(), Items.GOLD_NUGGET, 1); + seedResource(context.core(), StorageResourceKey.neoforgeEnergy(), energy); + installStation(context, "tesla_coil", TESLA_COIL); + tick(context.core(), (int) work); + if (craft(context, ELECTRUM_NUGGET) + || itemCount(context.core(), Items.GOLD_NUGGET) != 1 + || itemCount(context.core(), createadditionItem("electrum_nugget")) != 0 + || context.core().getResourceAmount( + StorageResourceKey.neoforgeEnergy()) != energy + || context.core().getStationWork(TESLA_COIL) != work) { + helper.fail( + "Create Crafts & Additions insufficient-FE transaction was not an atomic no-op"); + return; + } + helper.succeed(); + }); + } + + @GameTest(template = "craftingtests.platform") + public static void destination_overflow_is_atomic(GameTestHelper helper) { + withCore(helper, context -> { + long work = rollingDuration(); + seedItem(context.core(), Items.IRON_INGOT, 1); + seedResource( + context.core(), + StorageResourceKey.item( + new ItemStack(createadditionItem("iron_rod")), + context.level().registryAccess()), + Long.MAX_VALUE); + installStation(context, "rolling_mill", ROLLING_MILL); + tick(context.core(), (int) work); + if (craft(context, IRON_ROD) + || itemCount(context.core(), Items.IRON_INGOT) != 1 + || itemCount(context.core(), createadditionItem("iron_rod")) != Long.MAX_VALUE + || context.core().getStationWork(ROLLING_MILL) != work) { + helper.fail( + "Create Crafts & Additions full destination transaction was not an atomic no-op"); + return; + } + helper.succeed(); + }); + } + + @GameTest(template = "craftingtests.platform") + public static void checked_overflow_rejects_long_max_seed(GameTestHelper helper) { + withCore(helper, context -> { + long work = rollingDuration(); + seedItem(context.core(), Items.IRON_INGOT, 1); + seedResource( + context.core(), + StorageResourceKey.item( + new ItemStack(createadditionItem("iron_rod")), + context.level().registryAccess()), + Long.MAX_VALUE); + installStation(context, "rolling_mill", ROLLING_MILL); + tick(context.core(), (int) work); + if (craft(context, IRON_ROD) + || itemCount(context.core(), Items.IRON_INGOT) != 1 + || itemCount(context.core(), createadditionItem("iron_rod")) != Long.MAX_VALUE + || context.core().getStationWork(ROLLING_MILL) != work) { + helper.fail("Create Crafts & Additions Long.MAX_VALUE overflow was not rejected"); + return; + } + helper.succeed(); + }); + } + + @GameTest(template = "craftingtests.platform") + public static void stale_holder_is_atomic(GameTestHelper helper) { + withCore(helper, context -> { + long work = rollingDuration(); + seedItem(context.core(), Items.IRON_INGOT, 1); + installStation(context, "rolling_mill", ROLLING_MILL); + tick(context.core(), (int) work); + var manager = context.level().getRecipeManager(); + var originalRecipes = java.util.List.copyOf(manager.getRecipes()); + var menu = new CraftingTerminalMenu( + 931, context.player().getInventory(), context.core()); + try { + if (!menu.handleRecipeRequest( + context.level(), IRON_ROD, 1, + CraftingDestination.NONE, context.player())) { + helper.fail( + "Could not select Create Crafts & Additions iron rod recipe"); + return; + } + manager.replaceRecipes(originalRecipes.stream() + .filter(holder -> !holder.id().equals(IRON_ROD)) + .toList()); + if (menu.handleRecipeRequest( + context.level(), IRON_ROD, 1, + CraftingDestination.STORAGE, context.player()) + || itemCount(context.core(), Items.IRON_INGOT) != 1 + || itemCount(context.core(), createadditionItem("iron_rod")) != 0 + || context.core().getStationWork(ROLLING_MILL) != work) { + helper.fail( + "Create Crafts & Additions stale holder transaction was not an atomic no-op"); + return; + } + helper.succeed(); + } finally { + manager.replaceRecipes(originalRecipes); + } + }); + } + + private static boolean recipePresent(GameTestHelper helper, ResourceLocation recipeId) { + return helper.getLevel().getRecipeManager().byKey(recipeId).isPresent(); + } + + private static boolean supports(GameTestHelper helper, ResourceLocation recipeId) { + var holder = helper.getLevel().getRecipeManager().byKey(recipeId).orElse(null); + return CraftingTerminalMenu.supportsRecipeHolder(holder); + } + + private static boolean upstreamAndAutoStorageReject( + ResourceLocation recipeId, + ProcessingRecipe recipe + ) { + return !recipe.validate().isEmpty() + && !CraftingTerminalMenu.supportsRecipeHolder( + new RecipeHolder<>(recipeId, recipe)); + } + + private static long rollingDuration() { + return CommonConfig.ROLLING_MILL_PROCESSING_DURATION.get(); + } + + private static long chargingEnergy(ResourceLocation recipeId, GameTestHelper helper) { + return chargingRecipe(recipeId, helper).getEnergy(); + } + + private static long chargingWork(ResourceLocation recipeId, GameTestHelper helper) { + ChargingRecipe recipe = chargingRecipe(recipeId, helper); + long rate = Math.min( + CommonConfig.TESLA_COIL_RECIPE_CHARGE_RATE.get(), + recipe.getMaxChargeRate()); + long energy = recipe.getEnergy(); + return Math.addExact(energy, rate - 1L) / rate; + } + + private static ChargingRecipe chargingRecipe( + ResourceLocation recipeId, + GameTestHelper helper + ) { + var holder = helper.getLevel().getRecipeManager().byKey(recipeId).orElse(null); + if (holder == null || !(holder.value() instanceof ChargingRecipe recipe)) { + throw new IllegalStateException("Missing charging recipe " + recipeId); + } + return recipe; + } + + private static void withCore(GameTestHelper helper, FixtureAssertion assertion) { + var level = helper.getLevel(); + BlockPos corePos = helper.absolutePos(new BlockPos(1, 3, 1)); + level.setBlock( + corePos, + AutoStorage.STORAGE_CORE.get().defaultBlockState(), + Block.UPDATE_ALL); + level.setBlock( + corePos.south(), + AutoStorage.STORAGE_UNIT_T1.get().defaultBlockState(), + Block.UPDATE_ALL); + helper.runAfterDelay(2, () -> { + if (!(level.getBlockEntity(corePos) instanceof StorageCoreBlockEntity core)) { + helper.fail("Core not found"); + return; + } + core.rebuildNetwork(level); + var player = helper.makeMockPlayer(GameType.SURVIVAL); + player.setPos( + corePos.getX() + 0.5, + corePos.getY() + 0.5, + corePos.getZ() + 0.5); + assertion.run(new FixtureContext(level, core, player)); + }); + } + + private static void installStation( + FixtureContext context, + String itemPath, + ResourceLocation descriptorId + ) { + ItemStack station = new ItemStack(createadditionItem(itemPath)); + var menu = new CraftingTerminalMenu( + 930, context.player().getInventory(), context.core()); + menu.clickMenuButton(context.player(), STATIONS_PAGE_BUTTON); + for (int index = CraftingTerminalMenu.MACHINE_SLOT_START; + index < CraftingTerminalMenu.MACHINE_SLOT_START + + CraftingTerminalMenu.MACHINE_SLOT_COUNT; + index++) { + var slot = menu.getSlot(index); + if (!slot.isActive() || !slot.mayPlace(station)) { + continue; + } + MachineDescriptor descriptor = MachineEnergyTable.get(descriptorId); + if (descriptor == null || !descriptor.accepts(station)) { + continue; + } + slot.set(station.copy()); + slot.setChanged(); + menu.clickMenuButton(context.player(), STORAGE_PAGE_BUTTON); + return; + } + throw new IllegalStateException("Could not install " + itemPath); + } + + private static boolean craft(FixtureContext context, ResourceLocation recipeId) { + var menu = new CraftingTerminalMenu( + 931, context.player().getInventory(), context.core()); + if (!menu.handleRecipeRequest( + context.level(), recipeId, 1, + CraftingDestination.NONE, context.player())) { + return false; + } + if (menu.computeCraftPreview(context.core(), context.player()).craftable() < 1) { + return false; + } + return menu.handleRecipeRequest( + context.level(), recipeId, 1, + CraftingDestination.STORAGE, context.player()); + } + + private static void seedItem(StorageCoreBlockEntity core, Item item, int amount) { + ItemStack stack = new ItemStack(item, amount); + if (core.insertItem(stack) != amount) { + throw new IllegalStateException("Could not seed " + item + " x" + amount); + } + } + + private static void seedResource( + StorageCoreBlockEntity core, + StorageResourceKey key, + long amount + ) { + if (core.insertResource(key, amount, Action.EXECUTE) != amount) { + throw new IllegalStateException("Could not seed " + key + " x" + amount); + } + } + + private static long itemCount(StorageCoreBlockEntity core, Item item) { + return core.getItemCount(ItemKey.of(new ItemStack(item))); + } + + private static void tick(StorageCoreBlockEntity core, int ticks) { + for (int tick = 0; tick < ticks; tick++) { + core.tick(); + } + } + + private static Item createadditionItem(String path) { + Item item = BuiltInRegistries.ITEM.get(createadditionId(path)); + if (item == Items.AIR) { + throw new IllegalStateException("Missing Create Crafts & Additions item " + path); + } + return item; + } + + private static ResourceLocation createadditionRecipe(String path) { + return createadditionId(path); + } + + private static ResourceLocation fixtureRecipe(String path) { + return ResourceLocation.fromNamespaceAndPath( + CreateadditionFixtureMod.MODID, path); + } + + private static ResourceLocation createadditionId(String path) { + return ResourceLocation.fromNamespaceAndPath("createaddition", path); + } + + private static class SyntheticProcessingParams extends ProcessingRecipeParams { + private SyntheticProcessingParams(boolean fluidInput, boolean fluidOutput) { + ingredients.add(Ingredient.of(Items.IRON_INGOT)); + results.add(new ProcessingOutput(new ItemStack(Items.IRON_NUGGET), 1.0F)); + if (fluidInput) { + fluidIngredients.add(SizedFluidIngredient.of(Fluids.WATER, 250)); + } + if (fluidOutput) { + fluidResults.add(new FluidStack(Fluids.WATER, 250)); + } + } + } + + private static final class SyntheticChargingParams extends ChargingRecipeParams { + private SyntheticChargingParams(boolean fluidInput, boolean fluidOutput) { + ingredients.add(Ingredient.of(Items.IRON_INGOT)); + results.add(new ProcessingOutput(new ItemStack(Items.IRON_NUGGET), 1.0F)); + if (fluidInput) { + fluidIngredients.add(SizedFluidIngredient.of(Fluids.WATER, 250)); + } + if (fluidOutput) { + fluidResults.add(new FluidStack(Fluids.WATER, 250)); + } + } + + @Override + public int getEnergy() { + return 1_000; + } + + @Override + public int getMaxChargeRate() { + return 360; + } + } + + private record FixtureContext( + net.minecraft.server.level.ServerLevel level, + StorageCoreBlockEntity core, + net.minecraft.world.entity.player.Player player + ) { + } + + @FunctionalInterface + private interface FixtureAssertion { + void run(FixtureContext context); + } +} diff --git a/src/createadditionFixture/resources/META-INF/neoforge.mods.toml b/src/createadditionFixture/resources/META-INF/neoforge.mods.toml new file mode 100644 index 00000000..bee174ec --- /dev/null +++ b/src/createadditionFixture/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,37 @@ +modLoader="javafml" +loaderVersion="[4,)" +license="MIT" + +[[mods]] +modId="auto_storage_createaddition_fixture" +version="1.0.0" +displayName="Auto Storage Createaddition Fixture" +description="Isolated GameTest fixture for Create Crafts & Additions Rolling and Charging compatibility." + +[[dependencies.auto_storage_createaddition_fixture]] +modId="neoforge" +type="required" +versionRange="[21.1,)" +ordering="NONE" +side="BOTH" + +[[dependencies.auto_storage_createaddition_fixture]] +modId="minecraft" +type="required" +versionRange="[1.21.1,1.22)" +ordering="NONE" +side="BOTH" + +[[dependencies.auto_storage_createaddition_fixture]] +modId="auto_storage" +type="required" +versionRange="[0.3,)" +ordering="AFTER" +side="BOTH" + +[[dependencies.auto_storage_createaddition_fixture]] +modId="createaddition" +type="required" +versionRange="[0,)" +ordering="AFTER" +side="BOTH" diff --git a/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/recipe/chance_charging.json b/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/recipe/chance_charging.json new file mode 100644 index 00000000..2ea5067d --- /dev/null +++ b/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/recipe/chance_charging.json @@ -0,0 +1,16 @@ +{ + "type": "createaddition:charging", + "energy": 1000, + "ingredients": [ + { + "item": "minecraft:iron_nugget" + } + ], + "max_charge_rate": 360, + "results": [ + { + "chance": 0.5, + "id": "createaddition:electrum_nugget" + } + ] +} diff --git a/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/recipe/chance_rolling.json b/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/recipe/chance_rolling.json new file mode 100644 index 00000000..cfd7877a --- /dev/null +++ b/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/recipe/chance_rolling.json @@ -0,0 +1,14 @@ +{ + "type": "createaddition:rolling", + "ingredients": [ + { + "item": "minecraft:gold_ingot" + } + ], + "results": [ + { + "chance": 0.5, + "id": "createaddition:gold_rod" + } + ] +} diff --git a/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/recipe/remainder_rolling.json b/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/recipe/remainder_rolling.json new file mode 100644 index 00000000..1b9f9bf7 --- /dev/null +++ b/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/recipe/remainder_rolling.json @@ -0,0 +1,13 @@ +{ + "type": "createaddition:rolling", + "ingredients": [ + { + "item": "minecraft:lava_bucket" + } + ], + "results": [ + { + "id": "minecraft:obsidian" + } + ] +} diff --git a/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/structure/craftingtests.platform.nbt b/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/structure/craftingtests.platform.nbt new file mode 100644 index 00000000..eed9781f Binary files /dev/null and b/src/createadditionFixture/resources/data/auto_storage_createaddition_fixture/structure/craftingtests.platform.nbt differ diff --git a/src/main/java/com/swear/autostorage/RecipeFamily.java b/src/main/java/com/swear/autostorage/RecipeFamily.java index fd8854f4..a2a907e2 100644 --- a/src/main/java/com/swear/autostorage/RecipeFamily.java +++ b/src/main/java/com/swear/autostorage/RecipeFamily.java @@ -250,16 +250,23 @@ public RecipeAdapterMatch match(RecipeHolder holder, Level level) { if (typedPlan == null || level == null) { return RecipeAdapter.super.match(holder, level); } - TypedRecipePlan plan = typedPlanFor(recipe, level.registryAccess()); - RecipeAdapterMatch.Contract contract = cacheTypedPlan - ? typedContractCache.computeIfAbsent( - recipe, ignored -> typedContract(recipe, plan)) - : typedContract(recipe, plan); - return new RecipeAdapterMatch( - this, - holder, - typedCandidateIndex(plan, level.registryAccess()), - contract); + try { + TypedRecipePlan plan = typedPlanFor(recipe, level.registryAccess()); + RecipeAdapterMatch.Contract contract = cacheTypedPlan + ? typedContractCache.computeIfAbsent( + recipe, ignored -> typedContract(recipe, plan)) + : typedContract(recipe, plan); + return new RecipeAdapterMatch( + this, + holder, + typedCandidateIndex(plan, level.registryAccess()), + contract); + } catch (IllegalArgumentException exception) { + if (cacheTypedPlan) { + throw exception; + } + return RecipeAdapter.super.match(holder, level); + } } private RecipeCandidateIndex typedCandidateIndex( @@ -301,8 +308,11 @@ public RecipeAdapterMatch.Contract contract(RecipeHolder holder) { false, (inputs, level) -> ItemStack.EMPTY); RecipeAdapterMatch.HolderValidator validator = this::supports; + RecipeAdapterMatch.Cost pendingCost = cacheTypedPlan + ? costFor(recipe).toInternal(stationDescriptorId) + : RecipeAdapterMatch.Cost.free(); return RecipeAdapterMatch.Contract.pendingTyped( - stationDescriptorId, costFor(recipe).toInternal(stationDescriptorId), presentation, validator); + stationDescriptorId, pendingCost, presentation, validator); } Ingredient ingredient = inputFor(recipe); RecipeAdapterMatch.Input adapterInput = RecipeAdapterMatch.Input.of( @@ -353,16 +363,20 @@ public List resolveVariants( Recipe recipe = checkedRecipe(holder); if (isTyped()) { if (level == null) return List.of(); - if (typedPlan != null) { - if (cacheTypedPlan && baseContract.typedRecipePlan() != null) { - return List.of(baseContract); + try { + if (typedPlan != null) { + if (cacheTypedPlan && baseContract.typedRecipePlan() != null) { + return List.of(baseContract); + } + return List.of(typedContract( + recipe, typedPlanFor(recipe, level.registryAccess()))); } - return List.of(typedContract( - recipe, typedPlanFor(recipe, level.registryAccess()))); + return typedPlansFor(recipe, availableStacks, level.registryAccess()).stream() + .map(plan -> typedContract(recipe, plan)) + .toList(); + } catch (IllegalArgumentException exception) { + return List.of(); } - return typedPlansFor(recipe, availableStacks, level.registryAccess()).stream() - .map(plan -> typedContract(recipe, plan)) - .toList(); } if (level == null || outputFor(recipe, level.registryAccess()).isEmpty()) return List.of(); return List.of(baseContract); diff --git a/src/main/resources/assets/auto_storage/lang/en_us.json b/src/main/resources/assets/auto_storage/lang/en_us.json index ef1b5d4a..71897686 100644 --- a/src/main/resources/assets/auto_storage/lang/en_us.json +++ b/src/main/resources/assets/auto_storage/lang/en_us.json @@ -160,6 +160,8 @@ "gui.auto_storage.station.ae2_inscriber": "Inscriber", "gui.auto_storage.station.enderio_alloy_smelting": "Alloy Smelting", "gui.auto_storage.station.mysticalagriculture_reprocessor": "Seed Reprocessing", + "gui.auto_storage.station.createaddition_rolling_mill": "Rolling", + "gui.auto_storage.station.createaddition_tesla_coil": "Charging", "gui.auto_storage.station.powah_energizing": "Energizing Rod", "gui.auto_storage.station.powah_furnator": "Furnator", "gui.auto_storage.station.oritech_pulverizer": "Pulverizer", diff --git a/src/main/resources/assets/auto_storage/lang/zh_tw.json b/src/main/resources/assets/auto_storage/lang/zh_tw.json index 92a7f7e2..158c6e02 100644 --- a/src/main/resources/assets/auto_storage/lang/zh_tw.json +++ b/src/main/resources/assets/auto_storage/lang/zh_tw.json @@ -160,6 +160,8 @@ "gui.auto_storage.station.ae2_inscriber": "壓印器", "gui.auto_storage.station.enderio_alloy_smelting": "合金冶煉", "gui.auto_storage.station.mysticalagriculture_reprocessor": "種子再處理", + "gui.auto_storage.station.createaddition_rolling_mill": "軋制", + "gui.auto_storage.station.createaddition_tesla_coil": "充電", "gui.auto_storage.station.powah_energizing": "充能棒", "gui.auto_storage.station.powah_furnator": "Furnator", "gui.auto_storage.station.oritech_pulverizer": "粉碎機",