v0.4.22: route video audio through Players sound category
Some checks failed
build / build (push) Has been cancelled
Some checks failed
build / build (push) Has been cancelled
Previously the per-anchor audio gain was just volume × distance attenuation, which ignored Minecraft's sound options sliders entirely — Master and Players both had no effect on video audio. Now updateDistanceGains multiplies in options.getSoundSourceVolume(MASTER) × getSoundSourceVolume(PLAYERS) to match vanilla SoundEngine.calculateVolume, so the Players slider attenuates video audio like other player sounds and Master gates everything. Recomputed at the same 20Hz tick as distance gain — slider drags take effect within ~50ms with no extra plumbing.
This commit is contained in:
@@ -5,7 +5,7 @@ org.gradle.configuration-cache=false
|
||||
|
||||
# Mod
|
||||
mod_id=video_player
|
||||
mod_version=0.4.21
|
||||
mod_version=0.4.22
|
||||
maven_group=com.ejclaw.videoplayer
|
||||
archives_base_name=video_player
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ import net.fabricmc.fabric.api.event.player.AttackBlockCallback;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.player.LocalPlayer;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
|
||||
@@ -89,17 +90,26 @@ public class VideoPlayerClient implements ClientModInitializer {
|
||||
* Distance is measured from the player's eye to the <em>panel center</em>, not the anchor
|
||||
* block corner — for a 4×4 panel the corner is ~2 blocks off from where the screen visually
|
||||
* sits, which made the audio feel like it was off to the side.
|
||||
*
|
||||
* <p>Gain is also gated by the Minecraft sound options so the in-game sliders work as
|
||||
* expected: vanilla {@code SoundEngine.calculateVolume} multiplies by master × category, so
|
||||
* we do the same with {@link SoundSource#PLAYERS} as the category. Result: dragging the
|
||||
* "Players" slider in Options → Music & Sounds attenuates video audio just like other
|
||||
* player sounds, and "Master" still gates everything.
|
||||
*/
|
||||
private static void updateDistanceGains(Minecraft client) {
|
||||
LocalPlayer p = client.player;
|
||||
if (p == null || client.level == null) return;
|
||||
Vec3 eye = p.getEyePosition();
|
||||
float masterVol = client.options.getSoundSourceVolume(SoundSource.MASTER);
|
||||
float playersVol = client.options.getSoundSourceVolume(SoundSource.PLAYERS);
|
||||
float categoryScale = masterVol * playersVol;
|
||||
for (BlockPos pos : VideoPlayback.activePositions()) {
|
||||
if (!(client.level.getBlockEntity(pos) instanceof VideoAnchorBlockEntity be)) continue;
|
||||
Vec3 center = be.panelCenter();
|
||||
double d = center.distanceTo(eye);
|
||||
float attenuation = (float) Math.max(0.0, Math.min(1.0, 1.0 - d / 16.0));
|
||||
float gain = be.isMuted() ? 0F : be.getVolume() * attenuation;
|
||||
float gain = be.isMuted() ? 0F : be.getVolume() * attenuation * categoryScale;
|
||||
VideoPlayback.setGain(pos, gain);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user