Rohan Verma



Commit Diff


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<Entry> 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<int[]> 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<String, String[]> 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