From 45e049e82e44e96673121f6b4e3b3d43a073f168 Mon Sep 17 00:00:00 2001 From: blockninja124 <64211894+blockninja124@users.noreply.github.com.> Date: Tue, 13 Jan 2026 17:14:49 -0500 Subject: [PATCH 1/4] Update CC + add runtime dep for testing --- dependencies.gradle | 1 + gradle/forge.versions.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 4334e330e3c..e2a86c9b7b3 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -70,6 +70,7 @@ dependencies { // CC: Tweaked modCompileOnly(forge.cc.tweaked.core.api) modCompileOnly(forge.cc.tweaked.forge.api) + //modLocalRuntime(forge.cc.tweaked.forge.impl) // Standard runtime mods // modLocalRuntime(forge.jade) diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index eac33484595..e98ba18e3bf 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -21,7 +21,7 @@ ftblibrary = "2001.2.4" ftbteams = "2001.3.0" ftbquests = "2001.4.11" ftbchunks = "2001.3.4" -ccTweaked = "1.114.3" +ccTweaked = "1.115.1" create = "6.0.6-150" ponder = "1.0.80" flywheel = "1.0.4" From 484bb7e7c5cda5fc1d3dba8848494d0a42bb35af Mon Sep 17 00:00:00 2001 From: blockninja124 <64211894+blockninja124@users.noreply.github.com.> Date: Tue, 13 Jan 2026 17:15:12 -0500 Subject: [PATCH 2/4] Add CircuitSlotPeripheral + IHasCircuitSlot capability --- .../blockentity/MetaMachineBlockEntity.java | 10 +++++ .../api/capability/GTCapabilityHelper.java | 6 +++ .../api/capability/forge/GTCapability.java | 3 ++ .../cctweaked/CCTweakedPlugin.java | 2 + .../peripherals/CircuitSlotPeripheral.java | 41 +++++++++++++++++++ 5 files changed, 62 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java index db0589bd9c4..d6c35521995 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java @@ -7,6 +7,7 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -179,6 +180,15 @@ public static LazyOptional getCapability(MetaMachine machine, @NotNull Ca return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } } + } else if (cap == GTCapability.CAPABILITY_CIRCUIT_SLOT) { + if (machine instanceof IHasCircuitSlot hasCircuitSlot) { + return GTCapability.CAPABILITY_CIRCUIT_SLOT.orEmpty(cap, LazyOptional.of(() -> hasCircuitSlot)); + } + for (MachineTrait trait : machine.getTraits()) { + if (trait instanceof IHasCircuitSlot hasCircuitSlot) { + return GTCapability.CAPABILITY_CIRCUIT_SLOT.orEmpty(cap, LazyOptional.of(() -> hasCircuitSlot)); + } + } } else if (cap == GTCapability.CAPABILITY_RECIPE_LOGIC) { for (MachineTrait trait : machine.getTraits()) { if (trait instanceof RecipeLogic recipeLogic) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java index 49ba637ac4d..babd82db0fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.capability; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; +import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -70,6 +71,11 @@ public static IControllable getControllable(Level level, BlockPos pos, @Nullable return getBlockEntityCapability(GTCapability.CAPABILITY_CONTROLLABLE, level, pos, side); } + @Nullable + public static IHasCircuitSlot getCircuitSlot(Level level, BlockPos pos, @Nullable Direction side) { + return getBlockEntityCapability(GTCapability.CAPABILITY_CIRCUIT_SLOT, level, pos, side); + } + @Nullable public static RecipeLogic getRecipeLogic(Level level, BlockPos pos, @Nullable Direction side) { return getBlockEntityCapability(GTCapability.CAPABILITY_RECIPE_LOGIC, level, pos, side); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java index 18e989bda1e..52a06f726a5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.capability.forge; import com.gregtechceu.gtceu.api.capability.*; +import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -20,6 +21,7 @@ public class GTCapability { public static final Capability CAPABILITY_WORKABLE = CapabilityManager.get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_CONTROLLABLE = CapabilityManager .get(new CapabilityToken<>() {}); + public static final Capability CAPABILITY_CIRCUIT_SLOT = CapabilityManager.get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_RECIPE_LOGIC = CapabilityManager .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_ELECTRIC_ITEM = CapabilityManager @@ -53,6 +55,7 @@ public static void register(RegisterCapabilitiesEvent event) { event.register(IToolable.class); event.register(IWorkable.class); event.register(IControllable.class); + event.register(IHasCircuitSlot.class); event.register(RecipeLogic.class); event.register(IElectricItem.class); event.register(ICleanroomReceiver.class); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java index 5df5704c76a..a87218ec587 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java @@ -20,10 +20,12 @@ public static void init() { ComputerCraftAPI.registerGenericSource(new WorkablePeripheral()); ComputerCraftAPI.registerGenericSource(new CoverHolderPeripheral()); ComputerCraftAPI.registerGenericSource(new CentralMonitorPeripheral()); + ComputerCraftAPI.registerGenericSource(new CircuitSlotPeripheral()); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CONTROLLABLE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_TURBINE_MACHINE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_WORKABLE); + ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CIRCUIT_SLOT); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_COVERABLE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CENTRAL_MONITOR); PlaceholderHandler.addPlaceholder(new Placeholder("bufferText") { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java new file mode 100644 index 00000000000..9c57c640dc3 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java @@ -0,0 +1,41 @@ +package com.gregtechceu.gtceu.integration.cctweaked.peripherals; + +import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; +import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.lua.MethodResult; +import dan200.computercraft.api.peripheral.GenericPeripheral; +import net.minecraft.world.item.ItemStack; + +import javax.annotation.Nullable; +import java.util.Optional; + +public class CircuitSlotPeripheral implements GenericPeripheral { + + public String id() { + return "gtceu:circuit_slot"; + } + + @LuaFunction + public static @Nullable Integer getProgrammedCircuit(IHasCircuitSlot hasCircuitSlot) { + ItemStack circuitStack = hasCircuitSlot.getCircuitInventory().getStackInSlot(0); + if (circuitStack == ItemStack.EMPTY) return null; + return IntCircuitBehaviour.getCircuitConfiguration(circuitStack); + } + + // Note: using '@Nullable Integer newValue' as a param causes the function to not be picked up by CC. + // It needs the Optional, despite Java complaining about it. + @LuaFunction + public static void setProgrammedCircuit(IHasCircuitSlot hasCircuitSlot, Optional newValue) throws LuaException { + if (newValue.isEmpty()) { + hasCircuitSlot.getCircuitInventory().setStackInSlot(0, ItemStack.EMPTY); + } else { + if ((newValue.get() < 0) || (newValue.get() > 32)) { + throw new LuaException("newValue "+newValue.get()+" is not within range 0..32 or nil"); + } + hasCircuitSlot.getCircuitInventory().setStackInSlot(0, IntCircuitBehaviour.stack(newValue.get())); + } + } + +} From 63f9a134332cbaa6432bc8ed0b95e4949f299ee4 Mon Sep 17 00:00:00 2001 From: blockninja124 <64211894+blockninja124@users.noreply.github.com.> Date: Thu, 15 Jan 2026 11:31:32 -0500 Subject: [PATCH 3/4] Apply spotless formatting --- .../api/blockentity/MetaMachineBlockEntity.java | 2 +- .../gtceu/api/capability/forge/GTCapability.java | 3 ++- .../peripherals/CircuitSlotPeripheral.java | 14 ++++++++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java index d6c35521995..a36235f28d9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java @@ -180,7 +180,7 @@ public static LazyOptional getCapability(MetaMachine machine, @NotNull Ca return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } } - } else if (cap == GTCapability.CAPABILITY_CIRCUIT_SLOT) { + } else if (cap == GTCapability.CAPABILITY_CIRCUIT_SLOT) { if (machine instanceof IHasCircuitSlot hasCircuitSlot) { return GTCapability.CAPABILITY_CIRCUIT_SLOT.orEmpty(cap, LazyOptional.of(() -> hasCircuitSlot)); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java index 52a06f726a5..da01c5e0a22 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java @@ -21,7 +21,8 @@ public class GTCapability { public static final Capability CAPABILITY_WORKABLE = CapabilityManager.get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_CONTROLLABLE = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_CIRCUIT_SLOT = CapabilityManager.get(new CapabilityToken<>() {}); + public static final Capability CAPABILITY_CIRCUIT_SLOT = CapabilityManager + .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_RECIPE_LOGIC = CapabilityManager .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_ELECTRIC_ITEM = CapabilityManager diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java index 9c57c640dc3..fbeb396689e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java @@ -2,15 +2,17 @@ import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; + +import net.minecraft.world.item.ItemStack; + import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; -import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.peripheral.GenericPeripheral; -import net.minecraft.world.item.ItemStack; -import javax.annotation.Nullable; import java.util.Optional; +import javax.annotation.Nullable; + public class CircuitSlotPeripheral implements GenericPeripheral { public String id() { @@ -27,15 +29,15 @@ public String id() { // Note: using '@Nullable Integer newValue' as a param causes the function to not be picked up by CC. // It needs the Optional, despite Java complaining about it. @LuaFunction - public static void setProgrammedCircuit(IHasCircuitSlot hasCircuitSlot, Optional newValue) throws LuaException { + public static void setProgrammedCircuit(IHasCircuitSlot hasCircuitSlot, + Optional newValue) throws LuaException { if (newValue.isEmpty()) { hasCircuitSlot.getCircuitInventory().setStackInSlot(0, ItemStack.EMPTY); } else { if ((newValue.get() < 0) || (newValue.get() > 32)) { - throw new LuaException("newValue "+newValue.get()+" is not within range 0..32 or nil"); + throw new LuaException("newValue " + newValue.get() + " is not within range 0..32 or nil"); } hasCircuitSlot.getCircuitInventory().setStackInSlot(0, IntCircuitBehaviour.stack(newValue.get())); } } - } From 75450d9fdd66c98414cd675cfc5272175e4a8c43 Mon Sep 17 00:00:00 2001 From: blockninja124 <64211894+blockninja124@users.noreply.github.com.> Date: Thu, 15 Jan 2026 11:31:55 -0500 Subject: [PATCH 4/4] Move runtime CC dep to modExtraLocalRuntime section --- dependencies.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index e2a86c9b7b3..fcfdee1e87d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -70,7 +70,6 @@ dependencies { // CC: Tweaked modCompileOnly(forge.cc.tweaked.core.api) modCompileOnly(forge.cc.tweaked.forge.api) - //modLocalRuntime(forge.cc.tweaked.forge.impl) // Standard runtime mods // modLocalRuntime(forge.jade) @@ -94,8 +93,8 @@ dependencies { modExtraLocalRuntime(forge.javd) modExtraLocalRuntime(forge.trenzalore) modExtraLocalRuntime(forge.curios) + modExtraLocalRuntime(forge.cc.tweaked.forge.impl) // modExtraLocalRuntime(forge.worldstripper) -// modExtraLocalRuntime(forge.cc.tweaked.forge.impl) for some reason this breaks create modExtraLocalRuntime(forge.bundles.kjs)