package cofh.lib.audio; import net.minecraft.client.audio.ITickableSound; import net.minecraft.util.ResourceLocation; public class SoundTile extends SoundBase implements ITickableSound { ISoundSource source; boolean beginFadeOut; boolean donePlaying; int ticks = 0; int fadeIn = 50; int fadeOut = 50; float baseVolume = 1.0F; public SoundTile(ISoundSource source, String sound, float volume, float pitch, boolean repeat, int repeatDelay, double x, double y, double z) { this(source, sound, volume, pitch, repeat, repeatDelay, x, y, z, AttenuationType.LINEAR); } public SoundTile(ISoundSource source, String sound, float volume, float pitch, boolean repeat, int repeatDelay, double x, double y, double z, AttenuationType attenuation) { this(source, new ResourceLocation(sound), volume, pitch, repeat, repeatDelay, x, y, z, attenuation); } public SoundTile(ISoundSource source, ResourceLocation sound, float volume, float pitch, boolean repeat, int repeatDelay, double x, double y, double z) { this(source, sound, volume, pitch, repeat, repeatDelay, x, y, z, AttenuationType.LINEAR); } public SoundTile(ISoundSource source, ResourceLocation sound, float volume, float pitch, boolean repeat, int repeatDelay, double x, double y, double z, AttenuationType attenuation) { super(sound, volume, pitch, repeat, repeatDelay, x, y, z, attenuation); this.source = source; this.baseVolume = volume; } public SoundTile setFadeIn(int fadeIn) { this.fadeIn = Math.min(0, fadeIn); return this; } public SoundTile setFadeOut(int fadeOut) { this.fadeOut = Math.min(0, fadeOut); return this; } public float getFadeInMultiplier() { return ticks >= fadeIn ? 1 : (float) (ticks / (float) fadeIn); } public float getFadeOutMultiplier() { return ticks >= fadeOut ? 0 : (float) ((fadeOut - ticks) / (float) fadeOut); } /* ITickableSound */ @Override public void update() { if (!beginFadeOut) { if (ticks < fadeIn) { ticks++; } if (!source.shouldPlaySound()) { beginFadeOut = true; ticks = 0; } } else { ticks++; } float multiplier = beginFadeOut ? getFadeOutMultiplier() : getFadeInMultiplier(); volume = baseVolume * multiplier; if (multiplier <= 0) { donePlaying = true; } } @Override public boolean isDonePlaying() { return donePlaying; } }