mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-01-10 01:10:30 +00:00
Register modems as attached to their adjacent block
In c8eadf4011
we marked our various modems
as "brittle", which ensures they do not pop-off computers when the whole
structure moves.
However, this still requires the modem to be glued — if the modem is
outside the superglue range, it will still pop off. We can fix it by
registering a special "attached check" for the various modem blocks,
which says that the modem should be moved when the adjacent block does.
Fixes #1913
This commit is contained in:
parent
38e516d7c7
commit
4dd0735066
@ -54,6 +54,7 @@ repositories {
|
|||||||
filter {
|
filter {
|
||||||
includeGroup("cc.tweaked")
|
includeGroup("cc.tweaked")
|
||||||
// Things we mirror
|
// Things we mirror
|
||||||
|
includeGroup("com.simibubi.create")
|
||||||
includeGroup("commoble.morered")
|
includeGroup("commoble.morered")
|
||||||
includeGroup("dev.architectury")
|
includeGroup("dev.architectury")
|
||||||
includeGroup("dev.emi")
|
includeGroup("dev.emi")
|
||||||
|
@ -46,6 +46,8 @@ oculus = "1.2.5"
|
|||||||
rei = "12.0.626"
|
rei = "12.0.626"
|
||||||
rubidium = "0.6.1"
|
rubidium = "0.6.1"
|
||||||
sodium = "mc1.20-0.4.10"
|
sodium = "mc1.20-0.4.10"
|
||||||
|
create-forge = "0.5.1.f-33"
|
||||||
|
create-fabric = "0.5.1-f-build.1467+mc1.20.1"
|
||||||
|
|
||||||
# Testing
|
# Testing
|
||||||
hamcrest = "2.2"
|
hamcrest = "2.2"
|
||||||
@ -100,11 +102,13 @@ nightConfig-toml = { module = "com.electronwill.night-config:toml", version.ref
|
|||||||
slf4j = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" }
|
slf4j = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" }
|
||||||
|
|
||||||
# Minecraft mods
|
# Minecraft mods
|
||||||
fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabric-api" }
|
create-fabric = { module = "com.simibubi.create:create-fabric-1.20.1", version.ref = "create-fabric" }
|
||||||
fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "fabric-loader" }
|
create-forge = { module = "com.simibubi.create:create-1.20.1", version.ref = "create-forge" }
|
||||||
fabric-junit = { module = "net.fabricmc:fabric-loader-junit", version.ref = "fabric-loader" }
|
|
||||||
fabricPermissions = { module = "me.lucko:fabric-permissions-api", version.ref = "fabricPermissions" }
|
|
||||||
emi = { module = "dev.emi:emi-xplat-mojmap", version.ref = "emi" }
|
emi = { module = "dev.emi:emi-xplat-mojmap", version.ref = "emi" }
|
||||||
|
fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabric-api" }
|
||||||
|
fabric-junit = { module = "net.fabricmc:fabric-loader-junit", version.ref = "fabric-loader" }
|
||||||
|
fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "fabric-loader" }
|
||||||
|
fabricPermissions = { module = "me.lucko:fabric-permissions-api", version.ref = "fabricPermissions" }
|
||||||
iris = { module = "maven.modrinth:iris", version.ref = "iris" }
|
iris = { module = "maven.modrinth:iris", version.ref = "iris" }
|
||||||
jei-api = { module = "mezz.jei:jei-1.20.1-common-api", version.ref = "jei" }
|
jei-api = { module = "mezz.jei:jei-1.20.1-common-api", version.ref = "jei" }
|
||||||
jei-fabric = { module = "mezz.jei:jei-1.20.1-fabric", version.ref = "jei" }
|
jei-fabric = { module = "mezz.jei:jei-1.20.1-fabric", version.ref = "jei" }
|
||||||
|
@ -43,6 +43,7 @@ dependencies {
|
|||||||
clientImplementation(clientClasses(project(":common-api")))
|
clientImplementation(clientClasses(project(":common-api")))
|
||||||
|
|
||||||
compileOnly(libs.bundles.externalMods.common)
|
compileOnly(libs.bundles.externalMods.common)
|
||||||
|
compileOnly(variantOf(libs.create.forge) { classifier("slim") }) { isTransitive = false }
|
||||||
clientCompileOnly(variantOf(libs.emi) { classifier("api") })
|
clientCompileOnly(variantOf(libs.emi) { classifier("api") })
|
||||||
|
|
||||||
annotationProcessorEverywhere(libs.autoService)
|
annotationProcessorEverywhere(libs.autoService)
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
|
package dan200.computercraft.shared.integration;
|
||||||
|
|
||||||
|
import com.simibubi.create.content.contraptions.BlockMovementChecks;
|
||||||
|
import com.simibubi.create.content.contraptions.BlockMovementChecks.CheckResult;
|
||||||
|
import dan200.computercraft.shared.peripheral.modem.wired.CableBlock;
|
||||||
|
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemBlock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integration with Create.
|
||||||
|
*/
|
||||||
|
public final class CreateIntegration {
|
||||||
|
public static final String ID = "create";
|
||||||
|
|
||||||
|
private CreateIntegration() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setup() {
|
||||||
|
// Allow modems to be treated as "attached" to their adjacent block.
|
||||||
|
BlockMovementChecks.registerAttachedCheck((state, world, pos, direction) -> {
|
||||||
|
var block = state.getBlock();
|
||||||
|
if (block instanceof WirelessModemBlock) {
|
||||||
|
return CheckResult.of(state.getValue(WirelessModemBlock.FACING) == direction);
|
||||||
|
} else if (block instanceof CableBlock) {
|
||||||
|
return CheckResult.of(state.getValue(CableBlock.MODEM).getFacing() == direction);
|
||||||
|
} else {
|
||||||
|
return CheckResult.PASS;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -8,6 +8,7 @@ import net.minecraft.core.registries.Registries;
|
|||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.tags.TagKey;
|
import net.minecraft.tags.TagKey;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tags defined by external mods.
|
* Tags defined by external mods.
|
||||||
@ -26,9 +27,9 @@ public final class ExternalModTags {
|
|||||||
/**
|
/**
|
||||||
* Create's "brittle" tag, used to determine if this block needs to be moved before its neighbours.
|
* Create's "brittle" tag, used to determine if this block needs to be moved before its neighbours.
|
||||||
*
|
*
|
||||||
* @see <a href="https://github.com/Creators-of-Create/Create/blob/mc1.20.1/dev/src/main/java/com/simibubi/create/content/contraptions/BlockMovementChecks.java">{@code BlockMovementChecks}</a>
|
* @see com.simibubi.create.content.contraptions.BlockMovementChecks#isBrittle(BlockState)
|
||||||
*/
|
*/
|
||||||
public static final TagKey<Block> CREATE_BRITTLE = make("create", "brittle");
|
public static final TagKey<Block> CREATE_BRITTLE = make(CreateIntegration.ID, "brittle");
|
||||||
|
|
||||||
private static TagKey<Block> make(String mod, String name) {
|
private static TagKey<Block> make(String mod, String name) {
|
||||||
return TagKey.create(Registries.BLOCK, new ResourceLocation(mod, name));
|
return TagKey.create(Registries.BLOCK, new ResourceLocation(mod, name));
|
||||||
|
@ -69,6 +69,7 @@ dependencies {
|
|||||||
exclude("net.fabricmc", "fabric-loader")
|
exclude("net.fabricmc", "fabric-loader")
|
||||||
exclude("net.fabricmc.fabric-api")
|
exclude("net.fabricmc.fabric-api")
|
||||||
}
|
}
|
||||||
|
modCompileOnly(libs.create.fabric) { isTransitive = false }
|
||||||
|
|
||||||
modClientRuntimeOnly(libs.bundles.externalMods.fabric.runtime) {
|
modClientRuntimeOnly(libs.bundles.externalMods.fabric.runtime) {
|
||||||
exclude("net.fabricmc", "fabric-loader")
|
exclude("net.fabricmc", "fabric-loader")
|
||||||
|
@ -13,6 +13,7 @@ import dan200.computercraft.shared.command.CommandComputerCraft;
|
|||||||
import dan200.computercraft.shared.config.Config;
|
import dan200.computercraft.shared.config.Config;
|
||||||
import dan200.computercraft.shared.config.ConfigSpec;
|
import dan200.computercraft.shared.config.ConfigSpec;
|
||||||
import dan200.computercraft.shared.details.FluidDetails;
|
import dan200.computercraft.shared.details.FluidDetails;
|
||||||
|
import dan200.computercraft.shared.integration.CreateIntegration;
|
||||||
import dan200.computercraft.shared.network.NetworkMessages;
|
import dan200.computercraft.shared.network.NetworkMessages;
|
||||||
import dan200.computercraft.shared.network.client.UpgradesLoadedMessage;
|
import dan200.computercraft.shared.network.client.UpgradesLoadedMessage;
|
||||||
import dan200.computercraft.shared.network.server.ServerNetworking;
|
import dan200.computercraft.shared.network.server.ServerNetworking;
|
||||||
@ -34,6 +35,7 @@ import net.fabricmc.fabric.api.loot.v2.LootTableEvents;
|
|||||||
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
|
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
|
||||||
import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener;
|
import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener;
|
||||||
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
|
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
|
||||||
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.minecraft.core.registries.BuiltInRegistries;
|
import net.minecraft.core.registries.BuiltInRegistries;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.server.packs.PackType;
|
import net.minecraft.server.packs.PackType;
|
||||||
@ -119,6 +121,8 @@ public class ComputerCraft {
|
|||||||
ComputerCraftAPI.registerGenericSource(new InventoryMethods());
|
ComputerCraftAPI.registerGenericSource(new InventoryMethods());
|
||||||
|
|
||||||
Peripherals.addGenericLookup((world, pos, state, blockEntity, side, invalidate) -> InventoryMethods.extractContainer(world, pos, state, blockEntity, side));
|
Peripherals.addGenericLookup((world, pos, state, blockEntity, side, invalidate) -> InventoryMethods.extractContainer(world, pos, state, blockEntity, side));
|
||||||
|
|
||||||
|
if (FabricLoader.getInstance().isModLoaded(CreateIntegration.ID)) CreateIntegration.setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
private record ReloadListener(String name, PreparableReloadListener listener)
|
private record ReloadListener(String name, PreparableReloadListener listener)
|
||||||
|
@ -121,6 +121,11 @@ dependencies {
|
|||||||
libs.bundles.externalMods.forge.compile.get().map { compileOnly(fg.deobf(it)) }
|
libs.bundles.externalMods.forge.compile.get().map { compileOnly(fg.deobf(it)) }
|
||||||
libs.bundles.externalMods.forge.runtime.get().map { runtimeOnly(fg.deobf(it)) }
|
libs.bundles.externalMods.forge.runtime.get().map { runtimeOnly(fg.deobf(it)) }
|
||||||
|
|
||||||
|
// fg.debof only accepts a closure to configure the dependency, so doesn't work with Kotlin. We create and configure
|
||||||
|
// the dep first, and then pass it off to ForgeGradle.
|
||||||
|
(create(variantOf(libs.create.forge) { classifier("slim") }.get()) as ExternalModuleDependency)
|
||||||
|
.apply { isTransitive = false }.let { compileOnly(fg.deobf(it)) }
|
||||||
|
|
||||||
// Depend on our other projects.
|
// Depend on our other projects.
|
||||||
api(commonClasses(project(":forge-api"))) { cct.exclude(this) }
|
api(commonClasses(project(":forge-api"))) { cct.exclude(this) }
|
||||||
clientApi(clientClasses(project(":forge-api"))) { cct.exclude(this) }
|
clientApi(clientClasses(project(":forge-api"))) { cct.exclude(this) }
|
||||||
|
@ -16,6 +16,7 @@ import dan200.computercraft.shared.CommonHooks;
|
|||||||
import dan200.computercraft.shared.ModRegistry;
|
import dan200.computercraft.shared.ModRegistry;
|
||||||
import dan200.computercraft.shared.config.ConfigSpec;
|
import dan200.computercraft.shared.config.ConfigSpec;
|
||||||
import dan200.computercraft.shared.details.FluidData;
|
import dan200.computercraft.shared.details.FluidData;
|
||||||
|
import dan200.computercraft.shared.integration.CreateIntegration;
|
||||||
import dan200.computercraft.shared.integration.MoreRedIntegration;
|
import dan200.computercraft.shared.integration.MoreRedIntegration;
|
||||||
import dan200.computercraft.shared.peripheral.generic.methods.EnergyMethods;
|
import dan200.computercraft.shared.peripheral.generic.methods.EnergyMethods;
|
||||||
import dan200.computercraft.shared.peripheral.generic.methods.FluidMethods;
|
import dan200.computercraft.shared.peripheral.generic.methods.FluidMethods;
|
||||||
@ -78,6 +79,7 @@ public final class ComputerCraft {
|
|||||||
|
|
||||||
ForgeDetailRegistries.FLUID_STACK.addProvider(FluidData::fill);
|
ForgeDetailRegistries.FLUID_STACK.addProvider(FluidData::fill);
|
||||||
|
|
||||||
|
if (ModList.get().isLoaded(CreateIntegration.ID)) event.enqueueWork(CreateIntegration::setup);
|
||||||
if (ModList.get().isLoaded(MoreRedIntegration.MOD_ID)) MoreRedIntegration.setup();
|
if (ModList.get().isLoaded(MoreRedIntegration.MOD_ID)) MoreRedIntegration.setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user