From 7d2895af3a87f880fbaf15989b2d63f351da8ff4 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Mon, 3 Aug 2015 16:25:40 +0200 Subject: [PATCH] Set all sound volume levels (except for master) to 0 before rendering a video to prevent all sounds the replay might produce from being played, but GUI interactions still play sounds --- .../replaymod/replay/ReplayProcess.java | 30 +++++++++++++++++++ .../replaymod/replay/ReplaySender.java | 7 ----- src/main/resources/META-INF/replaymod_at.cfg | 3 ++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java index 0a281c32..98be15ff 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java @@ -13,6 +13,7 @@ import eu.crushedpixel.replaymod.utils.CameraPathValidator; import eu.crushedpixel.replaymod.video.VideoRenderer; import lombok.Getter; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.SoundCategory; import net.minecraft.client.gui.GuiErrorScreen; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.chunk.RenderChunk; @@ -22,6 +23,8 @@ import net.minecraft.util.ReportedException; import org.lwjgl.opengl.Display; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; public class ReplayProcess { @@ -47,6 +50,12 @@ public class ReplayProcess { return isVideoRecording; } + //a copy of the initial sound settings, + //which we will modify to prevent game sounds from annoying us while rendering + + @SuppressWarnings("unchecked") //I, too, blame Forge for not re-adding generics to that Map. + private static Map mapSoundLevelsBefore = null; + private static void resetProcess() { firstTime = true; @@ -101,12 +110,30 @@ public class ReplayProcess { ReplayMod.chatMessageHandler.addLocalizedChatMessage("replaymod.chat.pathstarted", ChatMessageType.INFORMATION); mc.timer.timerSpeed = 1; + + //set the sound level map to null + //so a previous map doesn't override the current game settings after a camera path + mapSoundLevelsBefore = null; } else { //if FBOs are not enabled/supported, prevent the user from resizing the MC window if(!OpenGlHelper.isFramebufferEnabled()) { Display.setResizable(false); } + //if rendering, disable all game sounds except for gui sounds + @SuppressWarnings("unchecked") //I, too, blame Forge for not re-adding generics to that Map. + Map orgMap = (Map)mc.gameSettings.mapSoundLevels; + mapSoundLevelsBefore = new HashMap(orgMap); + + //turn down for what? to mute all sound of course! + //the GUI sounds (button clicks etc) are not muted this way. + for(SoundCategory category : SoundCategory.values()) { + if(category == SoundCategory.MASTER) continue; + orgMap.put(category, 0f); + } + + mc.gameSettings.mapSoundLevels = orgMap; + initialTimestamp = 0; boolean success = false; try { @@ -149,6 +176,9 @@ public class ReplayProcess { //re-enable window resizing after rendering Display.setResizable(true); + + //restore the sound settings + mc.gameSettings.mapSoundLevels = mapSoundLevelsBefore; } //if justCheck is true, no Screenshot will be taken, it will only be checked diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java index d788d655..2bcc9b49 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java @@ -7,7 +7,6 @@ import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.entities.CameraEntity; import eu.crushedpixel.replaymod.events.handlers.RecordingHandler; import eu.crushedpixel.replaymod.holders.PacketData; -import eu.crushedpixel.replaymod.holders.AdvancedPosition; import eu.crushedpixel.replaymod.utils.ReplayFile; import eu.crushedpixel.replaymod.utils.ReplayFileIO; import io.netty.channel.ChannelHandler.Sharable; @@ -286,12 +285,6 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { protected Packet processPacket(Packet p) throws Exception { if(BAD_PACKETS.contains(p.getClass())) return null; - if (p instanceof S29PacketSoundEffect || p instanceof S28PacketEffect) { - if (!asyncMode || isHurrying()) { - return null; - } - } - if(p instanceof S48PacketResourcePackSend) { S48PacketResourcePackSend packet = (S48PacketResourcePackSend) p; String url = packet.func_179783_a(); diff --git a/src/main/resources/META-INF/replaymod_at.cfg b/src/main/resources/META-INF/replaymod_at.cfg index 2b4322ec..223cde53 100644 --- a/src/main/resources/META-INF/replaymod_at.cfg +++ b/src/main/resources/META-INF/replaymod_at.cfg @@ -99,5 +99,8 @@ public net.minecraft.client.particle.EffectRenderer field_78876_b # fxLayers # IntegratedServer public net.minecraft.server.integrated.IntegratedServer field_71348_o # isGamePaused +# GameSettings +public net.minecraft.client.settings.GameSettings field_151446_aD # mapSoundLevels + # Example # public net.minecraft.package.ClassName func_some_id(Ljava/lang/Class;IZS)V # methodName