Skip to content

Commit

Permalink
Fix underwater music always playing out of water
Browse files Browse the repository at this point in the history
Fixes #1
  • Loading branch information
Ampflower committed May 10, 2023
1 parent 0ec7c70 commit 83c6e77
Showing 1 changed file with 32 additions and 3 deletions.
35 changes: 32 additions & 3 deletions src/main/java/gay/ampflower/musicmoods/mixin/MixinMinecraft.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,50 @@

import gay.ampflower.musicmoods.client.WidgetAttachment;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.sounds.MusicManager;
import net.minecraft.sounds.Music;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
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.Slice;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

/**
* Late-init hook because Quilt hooks in too early for what we need.
*
* @author Ampflower
* @since 0.1.0
**/
@Mixin(Minecraft.class)
public class MixinMinecraft {
public abstract class MixinMinecraft {
@Shadow
@Nullable
public LocalPlayer player;

/**
* Late-init hook because Quilt hooks in too early for what we need.
*
* @since 0.1.0
*/
@Inject(method = "<init>", at = @At("RETURN"))
private void musicmoods$returnHook(CallbackInfo ci) {
WidgetAttachment.init((Minecraft) (Object) this);
}

/**
* Fixes underwater music constantly playing when set to always playing or
* replacing.
*
* @reason {@link LocalPlayer#isUnderWater()} check needs to happen as we have a
* continuous mode, in which Minecraft does not account for when telling
* if it should return underwater music.
* @since 0.3.0
*/
@Redirect(method = "getSituationalMusic", at = @At(value = "INVOKE", ordinal = 0, slice = "underWaterMusicManager", target = "Lnet/minecraft/client/sounds/MusicManager;isPlayingMusic(Lnet/minecraft/sounds/Music;)Z"), slice = @Slice(id = "underWaterMusicManager", from = @At(value = "FIELD", target = "Lnet/minecraft/sounds/Musics;UNDER_WATER:Lnet/minecraft/sounds/Music;")))
private boolean musicmoods$checkPlayer(MusicManager self, Music music) {
assert this.player != null : "Minecraft moved underwater check?";
return this.player.isUnderWater() && self.isPlayingMusic(music);
}
}

0 comments on commit 83c6e77

Please sign in to comment.