commit 62b3bb8066fd31d86098f91d771f995979fb9ef3 from: rohanverma2007 date: Sun Apr 26 11:07:34 2026 UTC add pneumaticraft support & fix chain duplication commit - e79e68ab0bad1b80f54a5648509db813f4bd9b8d commit + 62b3bb8066fd31d86098f91d771f995979fb9ef3 blob - fb01827e3186ba84d898350b60fcf18869380bf9 blob + 15cfbbc30857d1e0d869401a0982367fea87236b --- build.gradle +++ build.gradle @@ -89,6 +89,10 @@ jar { exclude 'com/github/alexthe666/**' exclude 'com/starfish_studios/**' exclude 'com/leclowndu93150/**' + exclude 'com/kipti/**' + exclude 'dev/ryanhcode/**' + exclude 'dev/simulated_team/**' + exclude 'me/desht/**' } var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { blob - c53d8b772252b1b4fd2cd0b92e319090d3500aa8 blob + 2c260442910ad072e003f809c87e5384f48e1dd2 --- gradle.properties +++ gradle.properties @@ -25,7 +25,7 @@ citadel_version_range=[2.0.0,3.0.0) mod_id=aeronauticscompat mod_name=AeronauticsCompat mod_license=MIT -mod_version=1.0.9 +mod_version=1.1.0 mod_authors=rohan mod_description=Compatibility fixes for Create: Aeronautics / Sable sub-levels. Per-mod patches apply only when the target mod is installed. mod_group_id=sh.rsap.aeronauticscompat blob - /dev/null blob + 2c71a1200a07fc2247a6d6af8c62ff53fc2f5238 (mode 644) --- /dev/null +++ src/main/java/com/kipti/bnb/content/cogwheel_chain/block/CogwheelChainBlockEntity.java @@ -0,0 +1,14 @@ +package com.kipti.bnb.content.cogwheel_chain.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class CogwheelChainBlockEntity extends BlockEntity { + protected CogwheelChainBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + public void destroy() {} +} blob - /dev/null blob + 11bbad628318b2cd789c4b028b825414064c45d1 (mode 644) --- /dev/null +++ src/main/java/dev/ryanhcode/sable/api/SubLevelAssemblyHelper.java @@ -0,0 +1,6 @@ +package dev.ryanhcode.sable.api; + +public final class SubLevelAssemblyHelper { + private SubLevelAssemblyHelper() {} + public static void moveBlocks() {} +} blob - /dev/null blob + 360b8df0707974c6c8574342debd5663e5207010 (mode 644) --- /dev/null +++ src/main/java/dev/simulated_team/simulated/util/SimAssemblyHelper.java @@ -0,0 +1,7 @@ +package dev.simulated_team.simulated.util; + +public final class SimAssemblyHelper { + private SimAssemblyHelper() {} + public static void disassembleSubLevel() {} + public static void assembleFromSingleBlock() {} +} blob - /dev/null blob + 31482ef83be2a944904deec14227471b70c55d7b (mode 644) --- /dev/null +++ src/main/java/me/desht/pneumaticcraft/client/sound/MovingSoundMinigun.java @@ -0,0 +1,11 @@ +package me.desht.pneumaticcraft.client.sound; + +import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; + +public abstract class MovingSoundMinigun extends AbstractTickableSoundInstance { + protected MovingSoundMinigun(SoundEvent soundEvent, SoundSource soundSource) { + super(soundEvent, soundSource, net.minecraft.util.RandomSource.create()); + } +} blob - /dev/null blob + fd12ce7fa3dc2c551d7bfd01f22a4d0636587e53 (mode 644) --- /dev/null +++ src/main/java/me/desht/pneumaticcraft/common/block/AbstractPneumaticCraftBlock.java @@ -0,0 +1,14 @@ +package me.desht.pneumaticcraft.common.block; + +import net.minecraft.world.level.Level; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class AbstractPneumaticCraftBlock extends Block { + protected AbstractPneumaticCraftBlock(Properties properties) { + super(properties); + } + + public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) {} +} blob - /dev/null blob + bca6c7845d7df5e1e6f549e38579385716a31dfc (mode 644) --- /dev/null +++ src/main/java/me/desht/pneumaticcraft/common/util/PneumaticCraftUtils.java @@ -0,0 +1,11 @@ +package me.desht.pneumaticcraft.common.util; + +import net.minecraft.core.Vec3i; + +public final class PneumaticCraftUtils { + private PneumaticCraftUtils() {} + + public static double distBetweenSq(Vec3i pos, double x, double y, double z) { + return 0.0; + } +} blob - /dev/null blob + 2f3d2843481580b2d583cc4af4babce295498386 (mode 644) --- /dev/null +++ src/main/java/sh/rsap/aeronauticscompat/compat/DeferredSoundQueue.java @@ -0,0 +1,42 @@ +package sh.rsap.aeronauticscompat.compat; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; + +import java.util.ArrayDeque; +import java.util.Deque; + +public final class DeferredSoundQueue { + + private DeferredSoundQueue() {} + + /** Single deferred sound entry. */ + private record Entry(double x, double y, double z, SoundEvent sound, SoundSource source, float volume, float pitch) {} + + private static final Deque QUEUE = new ArrayDeque<>(); + + public static void enqueue(double x, double y, double z, SoundEvent sound, SoundSource source, float volume, float pitch) { + QUEUE.addLast(new Entry(x, y, z, sound, source, volume, pitch)); + } + + public static void drain() { + if (QUEUE.isEmpty()) return; + + ClientLevel level = Minecraft.getInstance().level; + Player player = Minecraft.getInstance().player; + if (level == null) { + QUEUE.clear(); + return; + } + + Entry entry; + while ((entry = QUEUE.pollFirst()) != null) { + level.playSound(player, entry.x, entry.y, entry.z, entry.sound, entry.source, entry.volume, entry.pitch); + } + } +} blob - /dev/null blob + 631910323d8057637e2fddeb0dd070a736e1467c (mode 644) --- /dev/null +++ src/main/java/sh/rsap/aeronauticscompat/compat/SableAssemblyFlag.java @@ -0,0 +1,21 @@ +package sh.rsap.aeronauticscompat.compat; + +public final class SableAssemblyFlag { + + private static final ThreadLocal DEPTH = ThreadLocal.withInitial(() -> new int[1]); + + private SableAssemblyFlag() {} + + public static void enter() { + DEPTH.get()[0]++; + } + + public static void exit() { + int[] d = DEPTH.get(); + if (d[0] > 0) d[0]--; + } + + public static boolean isAssembling() { + return DEPTH.get()[0] > 0; + } +} blob - /dev/null blob + 0fbb6e445663a3bd4e6605b1f49d5e59f43301f9 (mode 644) --- /dev/null +++ src/main/java/sh/rsap/aeronauticscompat/AeronauticsCompatClientEvents.java @@ -0,0 +1,18 @@ +package sh.rsap.aeronauticscompat; + +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import sh.rsap.aeronauticscompat.compat.DeferredSoundQueue; + +@EventBusSubscriber(modid = AeronauticsCompat.MOD_ID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) +public final class AeronauticsCompatClientEvents { + + private AeronauticsCompatClientEvents() {} + + @SubscribeEvent + public static void onClientTick(ClientTickEvent.Post event) { + DeferredSoundQueue.drain(); + } +} blob - 24c93dfb70c5f956300ffa0580d4fa5e4921a8bf blob + 0f8f0800da5605f8ea9f0fc97c3fb1d5fc5c86c1 --- src/main/java/sh/rsap/aeronauticscompat/mixin/AeronauticsCompatMixinPlugin.java +++ src/main/java/sh/rsap/aeronauticscompat/mixin/AeronauticsCompatMixinPlugin.java @@ -15,6 +15,9 @@ public class AeronauticsCompatMixinPlugin implements I private static final String WATERFRAMES = "me.srrapero720.waterframes.WaterFrames"; private static final String CITADEL = "com.github.alexthe666.citadel.server.entity.pathfinding.raycoms.AdvancedPathNavigate"; private static final String THICK_AIR = "com.leclowndu93150.thick_air.api.AirQualityHelper"; + private static final String BITS_N_BOBS = "com.kipti.bnb.content.cogwheel_chain.block.CogwheelChainBlockEntity"; + private static final String SIMULATED = "dev.simulated_team.simulated.util.SimAssemblyHelper"; + private static final String PNEUMATIC_CRAFT = "me.desht.pneumaticcraft.common.block.entity.utility.SentryTurretBlockEntity"; /** Per-mixin marker-class requirements (all must resolve to apply). */ private static final Map REQUIREMENTS = Map.of( @@ -25,7 +28,19 @@ public class AeronauticsCompatMixinPlugin implements I "sh.rsap.aeronauticscompat.mixin.citadel.CitadelAdvancedPathNavigateMixin", new String[]{SABLE, CITADEL}, "sh.rsap.aeronauticscompat.mixin.thickair.ThickAirAirQualityHelperMixin", - new String[]{SABLE, THICK_AIR} + new String[]{SABLE, THICK_AIR}, + "sh.rsap.aeronauticscompat.mixin.sable.SubLevelAssemblyHelperMixin", + new String[]{SABLE, BITS_N_BOBS}, + "sh.rsap.aeronauticscompat.mixin.bitsnbobs.CogwheelChainBehaviourMixin", + new String[]{SABLE, BITS_N_BOBS}, + "sh.rsap.aeronauticscompat.mixin.simulated.SimAssemblyHelperMixin", + new String[]{SABLE, SIMULATED, BITS_N_BOBS}, + "sh.rsap.aeronauticscompat.mixin.pneumaticcraft.SentryTurretEntitySelectorMixin", + new String[]{SABLE, PNEUMATIC_CRAFT}, + "sh.rsap.aeronauticscompat.mixin.pneumaticcraft.MovingSoundMinigunMixin", + new String[]{SABLE, PNEUMATIC_CRAFT}, + "sh.rsap.aeronauticscompat.mixin.pneumaticcraft.AbstractPneumaticCraftBlockMixin", + new String[]{SABLE, PNEUMATIC_CRAFT} ); @Override @@ -36,7 +51,11 @@ public class AeronauticsCompatMixinPlugin implements I + " etched=" + resolves(ETCHED, cl) + " waterframes=" + resolves(WATERFRAMES, cl) + " citadel=" + resolves(CITADEL, cl) - + " thick_air=" + resolves(THICK_AIR, cl)); + + " thick_air=" + resolves(THICK_AIR, cl) + + " bnb=" + resolves(BITS_N_BOBS, cl) + + " simulated=" + resolves(SIMULATED, cl) + + " pneumaticcraft=" + resolves(PNEUMATIC_CRAFT, cl) + + " pneumaticcraft=" + resolves(PNEUMATIC_CRAFT, cl)); } @Override blob - /dev/null blob + 98628d904cd81de78fb6dc78b42f7de5602c8089 (mode 644) --- /dev/null +++ src/main/java/sh/rsap/aeronauticscompat/mixin/bitsnbobs/CogwheelChainBlockEntityMixin.java @@ -0,0 +1,26 @@ +package sh.rsap.aeronauticscompat.mixin.bitsnbobs; + +import com.kipti.bnb.content.cogwheel_chain.block.CogwheelChainBlockEntity; +import com.mojang.logging.LogUtils; +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import sh.rsap.aeronauticscompat.compat.SableAssemblyFlag; + +@Pseudo +@Mixin(value = CogwheelChainBlockEntity.class, remap = false) +public abstract class CogwheelChainBlockEntityMixin { + + private static final Logger AERONAUTICSCOMPAT_LOGGER = LogUtils.getLogger(); + + @Inject(method = "destroy", at = @At("HEAD"), cancellable = true, remap = false) + private void aeronauticscompat$suppressDestroyDuringAssembly(CallbackInfo ci) { + if (SableAssemblyFlag.isAssembling()) { + ci.cancel(); + return; + } + } +} blob - /dev/null blob + c91489e7b6aa071754c755deb35affadd7115ddb (mode 644) --- /dev/null +++ src/main/java/sh/rsap/aeronauticscompat/mixin/pneumaticcraft/AbstractPneumaticCraftBlockMixin.java @@ -0,0 +1,32 @@ +package sh.rsap.aeronauticscompat.mixin.pneumaticcraft; + +import me.desht.pneumaticcraft.common.block.AbstractPneumaticCraftBlock; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import sh.rsap.aeronauticscompat.compat.SableAssemblyFlag; + +@Pseudo +@Mixin(value = AbstractPneumaticCraftBlock.class, remap = false) +public abstract class AbstractPneumaticCraftBlockMixin { + + @Inject( + method = "onRemove", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private void aeronauticscompat$skipDropsDuringAssembly( + BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving, + CallbackInfo ci + ) { + if (SableAssemblyFlag.isAssembling()) { + ci.cancel(); + } + } +} blob - /dev/null blob + da5243af0af47374ff06814519c49af7da6e9cd0 (mode 644) --- /dev/null +++ src/main/java/sh/rsap/aeronauticscompat/mixin/pneumaticcraft/MovingSoundMinigunMixin.java @@ -0,0 +1,36 @@ +package sh.rsap.aeronauticscompat.mixin.pneumaticcraft; + +import me.desht.pneumaticcraft.client.sound.MovingSoundMinigun; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import sh.rsap.aeronauticscompat.compat.DeferredSoundQueue; + +@Pseudo +@Mixin(value = MovingSoundMinigun.class, remap = false) +public abstract class MovingSoundMinigunMixin { + + @Redirect( + method = "tick", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/Level;playSound(Lnet/minecraft/world/entity/player/Player;DDDLnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FF)V" + ), + remap = true + ) + private void aeronauticscompat$deferStopSound( + Level level, + Player ignoredPlayer, + double x, double y, double z, + SoundEvent sound, SoundSource source, + float volume, float pitch + ) { + DeferredSoundQueue.enqueue(x, y, z, sound, source, volume, pitch); + } +} blob - /dev/null blob + ae56012c378a1f13ebd906c7abe4eafe10add051 (mode 644) --- /dev/null +++ src/main/java/sh/rsap/aeronauticscompat/mixin/pneumaticcraft/SentryTurretEntitySelectorMixin.java @@ -0,0 +1,48 @@ +package sh.rsap.aeronauticscompat.mixin.pneumaticcraft; + +import me.desht.pneumaticcraft.common.util.PneumaticCraftUtils; +import net.minecraft.core.Vec3i; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import sh.rsap.aeronauticscompat.compat.SableBridge; + +@Pseudo +@Mixin( + targets = "me.desht.pneumaticcraft.common.block.entity.utility.SentryTurretBlockEntity$SentryTurretEntitySelector", + remap = false +) +public abstract class SentryTurretEntitySelectorMixin { + + @Redirect( + method = "inRange", + at = @At( + value = "INVOKE", + target = "Lme/desht/pneumaticcraft/common/util/PneumaticCraftUtils;distBetweenSq(Lnet/minecraft/core/Vec3i;DDD)D" + ), + remap = false + ) + private double aeronauticscompat$crossSubLevelDistance( + Vec3i turretPos, + double entityX, double entityY, double entityZ, + Entity entity + ) { + if (entity == null || entity.level() == null) { + return PneumaticCraftUtils.distBetweenSq(turretPos, entityX, entityY, entityZ); + } + + Level level = entity.level(); + Vec3 turretCenter = new Vec3(turretPos.getX() + 0.5, turretPos.getY() + 0.5, turretPos.getZ() + 0.5); + Vec3 entityPos = new Vec3(entityX, entityY, entityZ); + + double sableDist = SableBridge.distanceSquaredWithSubLevels(level, turretCenter, entityPos); + if (Double.isNaN(sableDist)) { + return PneumaticCraftUtils.distBetweenSq(turretPos, entityX, entityY, entityZ); + } + return sableDist; + } +} blob - /dev/null blob + c9465fa62205391509efe0fe88b9a6bdbc555bce (mode 644) --- /dev/null +++ src/main/java/sh/rsap/aeronauticscompat/mixin/sable/SubLevelAssemblyHelperMixin.java @@ -0,0 +1,24 @@ +package sh.rsap.aeronauticscompat.mixin.sable; + +import dev.ryanhcode.sable.api.SubLevelAssemblyHelper; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import sh.rsap.aeronauticscompat.compat.SableAssemblyFlag; + +@Pseudo +@Mixin(value = SubLevelAssemblyHelper.class, remap = false) +public abstract class SubLevelAssemblyHelperMixin { + + @Inject(method = "moveBlocks", at = @At("HEAD"), remap = false) + private static void aeronauticscompat$enterAssembly(CallbackInfo ci) { + SableAssemblyFlag.enter(); + } + + @Inject(method = "moveBlocks", at = @At("RETURN"), remap = false) + private static void aeronauticscompat$exitAssembly(CallbackInfo ci) { + SableAssemblyFlag.exit(); + } +} blob - /dev/null blob + 33427ccbc8ebd1717ee34f4b7183ba899c5986e8 (mode 644) --- /dev/null +++ src/main/java/sh/rsap/aeronauticscompat/mixin/simulated/SimAssemblyHelperMixin.java @@ -0,0 +1,35 @@ +package sh.rsap.aeronauticscompat.mixin.simulated; + +import dev.simulated_team.simulated.util.SimAssemblyHelper; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import sh.rsap.aeronauticscompat.compat.SableAssemblyFlag; + +@Pseudo +@Mixin(value = SimAssemblyHelper.class, remap = false) +public abstract class SimAssemblyHelperMixin { + + @Inject(method = "disassembleSubLevel", at = @At("HEAD"), remap = false) + private static void aeronauticscompat$enterDisassembly(CallbackInfo ci) { + SableAssemblyFlag.enter(); + } + + @Inject(method = "disassembleSubLevel", at = @At("RETURN"), remap = false) + private static void aeronauticscompat$exitDisassembly(CallbackInfo ci) { + SableAssemblyFlag.exit(); + } + + @Inject(method = "assembleFromSingleBlock", at = @At("HEAD"), remap = false) + private static void aeronauticscompat$enterAssembleFromBlock(CallbackInfoReturnable cir) { + SableAssemblyFlag.enter(); + } + + @Inject(method = "assembleFromSingleBlock", at = @At("RETURN"), remap = false) + private static void aeronauticscompat$exitAssembleFromBlock(CallbackInfoReturnable cir) { + SableAssemblyFlag.exit(); + } +} blob - d91b3c5e01393e9b9955c2db55684b7274b08924 blob + 6db1cf80e7a659514d7f374979f6f454fa78a59b --- src/main/resources/aeronauticscompat.mixins.json +++ src/main/resources/aeronauticscompat.mixins.json @@ -6,11 +6,17 @@ "minVersion": "0.8", "mixins": [ "citadel.CitadelAdvancedPathNavigateMixin", - "thickair.ThickAirAirQualityHelperMixin" + "thickair.ThickAirAirQualityHelperMixin", + "sable.SubLevelAssemblyHelperMixin", + "simulated.SimAssemblyHelperMixin", + "bitsnbobs.CogwheelChainBlockEntityMixin", + "pneumaticcraft.SentryTurretEntitySelectorMixin", + "pneumaticcraft.AbstractPneumaticCraftBlockMixin" ], "client": [ "etched.EtchedStopListeningSoundMixin", - "waterframes.WaterFramesSableDistanceMixin" + "waterframes.WaterFramesSableDistanceMixin", + "pneumaticcraft.MovingSoundMinigunMixin" ], "injectors": { "defaultRequire": 1