From 5e3c7ce7126a52e9ad9344900c0158c2311dd069 Mon Sep 17 00:00:00 2001 From: arcade_kappa Date: Tue, 1 Oct 2024 17:34:34 +0800 Subject: [PATCH] Test better record patch --- build.gradle | 2 + .../fugue/common/FugueMixinConfigPlugin.java | 1 + .../fugue/config/ModPatchConfig.java | 2 + .../cleanroommc/fugue/helper/SoundThread.java | 38 +++++++++++++++++++ .../betterrecords/SoundManagerMixin.java | 38 +++++++++++++++++++ src/main/resources/fugue.mixin.mod.json | 1 + 6 files changed, 82 insertions(+) create mode 100644 src/main/java/com/cleanroommc/fugue/helper/SoundThread.java create mode 100644 src/main/java/com/cleanroommc/fugue/mixin/betterrecords/SoundManagerMixin.java diff --git a/build.gradle b/build.gradle index c4550bc..29836f6 100644 --- a/build.gradle +++ b/build.gradle @@ -235,6 +235,8 @@ dependencies { //Carry on compileOnly(fg.deobf("curse.maven:carry-274259:4507139")) + //Better Records + compileOnly(fg.deobf("curse.maven:br-222722:2930159")) implementation("com.cleanroommc:groovyscript:1.1.1") { transitive = false diff --git a/src/main/java/com/cleanroommc/fugue/common/FugueMixinConfigPlugin.java b/src/main/java/com/cleanroommc/fugue/common/FugueMixinConfigPlugin.java index ae7f7b8..0497c0e 100644 --- a/src/main/java/com/cleanroommc/fugue/common/FugueMixinConfigPlugin.java +++ b/src/main/java/com/cleanroommc/fugue/common/FugueMixinConfigPlugin.java @@ -55,6 +55,7 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { case "infinitylib" -> Loader.isModLoaded("infinitylib") && FugueConfig.modPatchConfig.enableInfLib; case "carryon" -> Loader.isModLoaded("carryon") && FugueConfig.modPatchConfig.enableCarryon; case "litematica" -> Loader.isModLoaded("litematica") && FugueConfig.modPatchConfig.enableLitematica; + case "betterrecords" -> Loader.isModLoaded("betterrecords") && FugueConfig.modPatchConfig.enableBetterRecords; default -> true; }; } diff --git a/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java b/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java index c14af56..a037fdd 100644 --- a/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java +++ b/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java @@ -124,4 +124,6 @@ public class ModPatchConfig { public boolean enableCarryon = true; @Config.Name("Enable Litematica Patch") public boolean enableLitematica = true; + @Config.Name("Enable Better Records Patch") + public boolean enableBetterRecords = true; } diff --git a/src/main/java/com/cleanroommc/fugue/helper/SoundThread.java b/src/main/java/com/cleanroommc/fugue/helper/SoundThread.java new file mode 100644 index 0000000..84ccbe4 --- /dev/null +++ b/src/main/java/com/cleanroommc/fugue/helper/SoundThread.java @@ -0,0 +1,38 @@ +package com.cleanroommc.fugue.helper; + +import net.minecraft.util.math.BlockPos; +import tech.feldman.betterrecords.api.sound.Sound; +import tech.feldman.betterrecords.client.sound.SoundPlayer; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class SoundThread extends Thread { + private final AtomicBoolean interrupted; + private final List sounds; + private final BlockPos pos; + private final int dim; + private final boolean repeat; + + public SoundThread(AtomicBoolean interrupted, List sounds, BlockPos pos, int dim, boolean repeat) { + super("Better Records Sound Thread"); + this.interrupted = interrupted; + this.sounds = sounds; + this.pos = pos; + this.dim = dim; + this.repeat = repeat; + } + + @Override + public void interrupt() { + interrupted.set(true); + } + + @Override + public void run() { + while (!interrupted.get()) { + sounds.forEach(sound -> SoundPlayer.INSTANCE.playSound(pos, dim, sound)); + if (!repeat) return; + } + } +} diff --git a/src/main/java/com/cleanroommc/fugue/mixin/betterrecords/SoundManagerMixin.java b/src/main/java/com/cleanroommc/fugue/mixin/betterrecords/SoundManagerMixin.java new file mode 100644 index 0000000..9270d05 --- /dev/null +++ b/src/main/java/com/cleanroommc/fugue/mixin/betterrecords/SoundManagerMixin.java @@ -0,0 +1,38 @@ +package com.cleanroommc.fugue.mixin.betterrecords; + +import com.cleanroommc.fugue.helper.SoundThread; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import tech.feldman.betterrecords.api.sound.Sound; +import tech.feldman.betterrecords.client.sound.SoundManager; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; + +@Mixin(value = SoundManager.class, remap = false) +public class SoundManagerMixin { + @Unique + private static final Map threads = new ConcurrentHashMap<>(); + @Redirect(method = "stopQueueAt", at = @At(value = "INVOKE", target = "Ljava/lang/Thread;stop()V")) + private void stopQueueAt(Thread thread) { + threads.get(thread).set(Boolean.FALSE); + thread.interrupt(); + } + + @Inject(method = "queueSongsAt", at = @At(value = "INVOKE", target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")) + private void hackThread(BlockPos pos, int dimension, List sounds, boolean shuffle, boolean repeat, CallbackInfo ci, @Local LocalRef job) { + AtomicBoolean interrupted = new AtomicBoolean(false); + job.set(new SoundThread(interrupted, sounds, pos, dimension, repeat)); + threads.put(Thread.currentThread(), interrupted); + } + +} diff --git a/src/main/resources/fugue.mixin.mod.json b/src/main/resources/fugue.mixin.mod.json index 2c7530b..a112af1 100644 --- a/src/main/resources/fugue.mixin.mod.json +++ b/src/main/resources/fugue.mixin.mod.json @@ -10,6 +10,7 @@ "armourers_workshop.GlobalTaskMixin", "armourers_workshop.SkinTextureMixin", "astralsorcery.PerkAttributeTypeMixin", + "betterrecords.SoundManagerMixin", "carryon.ItemTileMixin", "charset.ColorspacesMixin", "codechickenlib.ReflectionManagerMixin",