Skip to content

Commit

Permalink
Add back MoreRed support
Browse files Browse the repository at this point in the history
I removed this in aa0d544, way back in
late 2021. 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 new capability
helpers, but otherwise it's almost exactly the same :D.
  • Loading branch information
SquidDev committed Aug 27, 2023
1 parent 13ed422 commit 0f6ea3d
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ repositories {
includeGroup("cc.tweaked")
includeModule("org.squiddev", "Cobalt")
// Things we mirror
includeGroup("commoble.morered")
includeGroup("dev.architectury")
includeGroup("dev.emi")
includeGroup("maven.modrinth")
Expand Down
4 changes: 3 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ fabricPermissions = "0.3.20230723"
iris = "1.6.4+1.20"
jei = "15.2.0.22"
modmenu = "7.1.0"
moreRed = "4.0.0.4"
oculus = "1.2.5"
rei = "12.0.626"
rubidium = "0.6.1"
Expand Down Expand Up @@ -102,6 +103,7 @@ jei-fabric = { module = "mezz.jei:jei-1.20.1-fabric", version.ref = "jei" }
jei-forge = { module = "mezz.jei:jei-1.20.1-forge", version.ref = "jei" }
mixin = { module = "org.spongepowered:mixin", version.ref = "mixin" }
modmenu = { module = "com.terraformersmc:modmenu", version.ref = "modmenu" }
moreRed = { module = "commoble.morered:morered-1.20.1", version.ref = "moreRed" }
oculus = { module = "maven.modrinth:oculus", version.ref = "oculus" }
rei-api = { module = "me.shedaniel:RoughlyEnoughItems-api", version.ref = "rei" }
rei-builtin = { module = "me.shedaniel:RoughlyEnoughItems-default-plugin", version.ref = "rei" }
Expand Down Expand Up @@ -153,7 +155,7 @@ kotlin = ["kotlin-stdlib", "kotlin-coroutines"]

# Minecraft
externalMods-common = ["jei-api", "nightConfig-core", "nightConfig-toml"]
externalMods-forge-compile = ["oculus", "jei-api"]
externalMods-forge-compile = ["moreRed", "oculus", "jei-api"]
externalMods-forge-runtime = ["jei-forge"]
externalMods-fabric = ["nightConfig-core", "nightConfig-toml"]
externalMods-fabric-compile = ["fabricPermissions", "iris", "jei-api", "rei-api", "rei-builtin"]
Expand Down
2 changes: 0 additions & 2 deletions projects/fabric/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,11 @@ dependencies {
exclude("net.fabricmc", "fabric-loader")
exclude("net.fabricmc.fabric-api")
}
/*

modClientRuntimeOnly(libs.bundles.externalMods.fabric.runtime) {
exclude("net.fabricmc", "fabric-loader")
exclude("net.fabricmc.fabric-api")
}
*/

"modTestWithSodium"(libs.sodium)
"modTestWithIris"(libs.iris)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.config.ConfigSpec;
import dan200.computercraft.shared.details.FluidData;
import dan200.computercraft.shared.integration.MoreRedIntegration;
import dan200.computercraft.shared.peripheral.generic.methods.EnergyMethods;
import dan200.computercraft.shared.peripheral.generic.methods.FluidMethods;
import dan200.computercraft.shared.peripheral.generic.methods.InventoryMethods;
Expand All @@ -23,6 +24,7 @@
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig;
Expand Down Expand Up @@ -73,6 +75,8 @@ public static void init(FMLCommonSetupEvent event) {
ForgeComputerCraftAPI.registerGenericCapability(ForgeCapabilities.FLUID_HANDLER);

ForgeDetailRegistries.FLUID_STACK.addProvider(FluidData::fill);

if (ModList.get().isLoaded(MoreRedIntegration.MOD_ID)) MoreRedIntegration.setup();
}

@SubscribeEvent
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// 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 dan200.computercraft.shared.util.SidedCapabilityProvider;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;

public class MoreRedIntegration {
public static final String MOD_ID = "morered";

private static final ResourceLocation ID = new ResourceLocation(ComputerCraftAPI.MOD_ID, MOD_ID);

@SubscribeEvent
public static void attachBlockCapabilities(AttachCapabilitiesEvent<BlockEntity> event) {
var blockEntity = event.getObject();

if (blockEntity.getBlockState().getBlock() instanceof IBundledRedstoneBlock bundledBlock) {
// The API is a little unclear on whether this needs to be sided. The API design mirrors Block.getSignal
// (suggesting we can use wireFace.getOpposite(), which is what we did on older versions), but on the other
// hand that parameter is not guaranteed to be non-null (suggesting we should use the cap side instead).
SidedCapabilityProvider.attach(event, ID, MoreRedAPI.CHANNELED_POWER_CAPABILITY, side -> (world, wirePos, wireState, wireFace, channel) -> {
if (side == null) return 0; // It's not clear if there's a sensible implementation here.

var level = bundledBlock.getBundledRedstoneOutput(world, blockEntity.getBlockPos(), side);
return (level & (1 << channel)) != 0 ? 31 : 0;
});
}
}

public static void setup() {
MinecraftForge.EVENT_BUS.register(MoreRedIntegration.class);
ComputerCraftAPI.registerBundledRedstoneProvider(MoreRedIntegration::getBundledPower);
}

private static int getBundledPower(Level world, BlockPos pos, Direction side) {
var blockEntity = world.getBlockEntity(pos);
if (blockEntity == null) return -1;

var blockState = blockEntity.getBlockState();

// Skip ones already handled by CC. We can do this more efficiently.
if (blockState.getBlock() instanceof IBundledRedstoneBlock) return -1;

var powerCap = blockEntity.getCapability(MoreRedAPI.CHANNELED_POWER_CAPABILITY, side);
if (!powerCap.isPresent()) return -1;
var power = powerCap.orElseThrow(NullPointerException::new);

var mask = 0;
for (var i = 0; i < 16; i++) {
mask |= power.getPowerOnChannel(world, pos, blockState, side, i) > 0 ? (1 << i) : 0;
}
return mask;
}
}

0 comments on commit 0f6ea3d

Please sign in to comment.