commit - e79e68ab0bad1b80f54a5648509db813f4bd9b8d
commit + 62b3bb8066fd31d86098f91d771f995979fb9ef3
blob - fb01827e3186ba84d898350b60fcf18869380bf9
blob + 15cfbbc30857d1e0d869401a0982367fea87236b
--- build.gradle
+++ build.gradle
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
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
+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
+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
+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
+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
+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
+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
+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
+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
+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
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(
"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
+ " 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
+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
+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
+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
+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
+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
+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
"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