From 1278246cf79f234bbee0515da6e6920644759efc Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 12 Feb 2025 13:40:58 +0000 Subject: [PATCH] Add back MoreRed support I removed this in fc834cd97fe941a192e40962ac3bb27be102ce09, way back in late 2024. Looks like it's been updating in the meantime and I hadn't noticed, so add it back. I've simplified the code a little bit, to make use of our NeoForge's new capability system, but otherwise it's almost exactly the same :D. --- .../cc-tweaked.java-convention.gradle.kts | 2 +- gradle/libs.versions.toml | 4 +- .../dan200/computercraft/ComputerCraft.java | 3 ++ .../integration/MoreRedIntegration.java | 54 +++++++++++++++++++ 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 projects/forge/src/main/java/dan200/computercraft/shared/integration/MoreRedIntegration.java diff --git a/buildSrc/src/main/kotlin/cc-tweaked.java-convention.gradle.kts b/buildSrc/src/main/kotlin/cc-tweaked.java-convention.gradle.kts index 54414f366..a6f59cd4e 100644 --- a/buildSrc/src/main/kotlin/cc-tweaked.java-convention.gradle.kts +++ b/buildSrc/src/main/kotlin/cc-tweaked.java-convention.gradle.kts @@ -48,7 +48,7 @@ repositories { includeGroup("cc.tweaked") // Things we mirror includeGroup("com.simibubi.create") - includeGroup("commoble.morered") + includeGroup("net.commoble.morered") includeGroup("dev.architectury") includeGroup("dev.emi") includeGroup("maven.modrinth") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b3ba6a34a..52e584525 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -42,7 +42,7 @@ iris-fabric = "1.8.0-beta.3+1.21-fabric" iris-forge = "1.8.0-beta.3+1.21-neoforge" jei = "19.8.2.99" modmenu = "11.0.0-rc.4" -moreRed = "4.0.0.4" +moreRed = "6.0.0.3" rei = "16.0.729" sodium-fabric = "mc1.21-0.6.0-beta.1-fabric" sodium-forge = "mc1.21-0.6.0-beta.1-neoforge" @@ -119,7 +119,7 @@ jei-forge = { module = "mezz.jei:jei-1.21-neoforge", version.ref = "jei" } mixin = { module = "org.spongepowered:mixin", version.ref = "mixin" } mixinExtra = { module = "io.github.llamalad7:mixinextras-common", version.ref = "mixinExtra" } modmenu = { module = "com.terraformersmc:modmenu", version.ref = "modmenu" } -moreRed = { module = "commoble.morered:morered-1.20.1", version.ref = "moreRed" } +moreRed = { module = "net.commoble.morered:morered-1.21.1", version.ref = "moreRed" } rei-api = { module = "me.shedaniel:RoughlyEnoughItems-api", version.ref = "rei" } rei-builtin = { module = "me.shedaniel:RoughlyEnoughItems-default-plugin", version.ref = "rei" } rei-fabric = { module = "me.shedaniel:RoughlyEnoughItems-fabric", version.ref = "rei" } diff --git a/projects/forge/src/main/java/dan200/computercraft/ComputerCraft.java b/projects/forge/src/main/java/dan200/computercraft/ComputerCraft.java index 4b6d201b9..a3d092b52 100644 --- a/projects/forge/src/main/java/dan200/computercraft/ComputerCraft.java +++ b/projects/forge/src/main/java/dan200/computercraft/ComputerCraft.java @@ -20,6 +20,7 @@ import dan200.computercraft.shared.config.Config; import dan200.computercraft.shared.config.ConfigSpec; import dan200.computercraft.shared.details.FluidData; import dan200.computercraft.shared.integration.CreateIntegration; +import dan200.computercraft.shared.integration.MoreRedIntegration; import dan200.computercraft.shared.network.NetworkMessage; import dan200.computercraft.shared.network.NetworkMessages; import dan200.computercraft.shared.network.client.ClientNetworkContext; @@ -70,6 +71,8 @@ public final class ComputerCraft { var container = ModLoadingContext.get().getActiveContainer(); container.registerConfig(ModConfig.Type.SERVER, ((ForgeConfigFile) ConfigSpec.serverSpec).spec()); container.registerConfig(ModConfig.Type.CLIENT, ((ForgeConfigFile) ConfigSpec.clientSpec).spec()); + + if (ModList.get().isLoaded(MoreRedIntegration.MOD_ID)) MoreRedIntegration.setup(eventBus); } private static void withEventBus(IEventBus eventBus, Runnable task) { diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/integration/MoreRedIntegration.java b/projects/forge/src/main/java/dan200/computercraft/shared/integration/MoreRedIntegration.java new file mode 100644 index 000000000..12a5581ea --- /dev/null +++ b/projects/forge/src/main/java/dan200/computercraft/shared/integration/MoreRedIntegration.java @@ -0,0 +1,54 @@ +// SPDX-FileCopyrightText: 2021 The CC: Tweaked Developers +// +// SPDX-License-Identifier: MPL-2.0 + +package dan200.computercraft.shared.integration; + +import commoble.morered.api.MoreRedAPI; +import dan200.computercraft.api.ComputerCraftAPI; +import dan200.computercraft.shared.common.IBundledRedstoneBlock; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.Level; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; + +public final class MoreRedIntegration { + public static final String MOD_ID = "morered"; + + private static void onRegisterCapabilities(RegisterCapabilitiesEvent event) { + for (var block : BuiltInRegistries.BLOCK) { + if (!(block instanceof IBundledRedstoneBlock bundledBlock)) continue; + event.registerBlock( + MoreRedAPI.CHANNELED_POWER_CAPABILITY, + (level, pos, state, blockEntity, context) -> (level2, wirePos, wireState, wireFace, channel) -> { + var outputLevel = bundledBlock.getBundledRedstoneOutput(level2, pos, context); + return (outputLevel & (1 << channel)) != 0 ? 31 : 0; + }, + block + ); + } + } + + public static void setup(IEventBus bus) { + bus.addListener(MoreRedIntegration::onRegisterCapabilities); + ComputerCraftAPI.registerBundledRedstoneProvider(MoreRedIntegration::getBundledPower); + } + + private static int getBundledPower(Level world, BlockPos pos, Direction side) { + var blockState = world.getBlockState(pos); + + // Skip ones already handled by CC. We can do this more efficiently. + if (blockState.getBlock() instanceof IBundledRedstoneBlock) return -1; + + var power = world.getCapability(MoreRedAPI.CHANNELED_POWER_CAPABILITY, pos, blockState, null, side); + if (power == null) return -1; + + var mask = 0; + for (var i = 0; i < 16; i++) { + mask |= power.getPowerOnChannel(world, pos, blockState, side, i) > 0 ? (1 << i) : 0; + } + return mask; + } +}