package speedytools.clientside.sound;
import net.minecraft.client.audio.ITickableSound;
import net.minecraft.client.audio.PositionedSound;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.Vec3;
import speedytools.common.utilities.UsefulFunctions;
/**
* Created by TheGreyGhost on 8/10/14.
*/
public class SoundEffectBoundaryHum
{
public SoundEffectBoundaryHum(SoundEffectNames i_soundEffectName, SoundController i_soundController, BoundaryHumUpdateLink i_boundaryHumUpdateLink)
{
soundEffectName = i_soundEffectName;
soundController = i_soundController;
resourceLocation = new ResourceLocation(soundEffectName.getJsonName());
boundaryHumUpdateLink = i_boundaryHumUpdateLink;
}
public void startPlayingLoop()
{
if (boundaryFieldSound != null) {
stopPlaying();
}
final float INITIAL_VOLUME = 0.001F;
boundaryFieldSound = new BoundaryFieldSound(resourceLocation, INITIAL_VOLUME, true);
soundController.playSound(boundaryFieldSound);
boundaryFieldSound.update();
}
public void stopPlaying()
{
if (boundaryFieldSound != null) {
soundController.stopSound(boundaryFieldSound);
boundaryFieldSound = null;
}
}
private SoundEffectNames soundEffectName;
private SoundController soundController;
private ResourceLocation resourceLocation;
private BoundaryFieldSound boundaryFieldSound;
private BoundaryHumUpdateLink boundaryHumUpdateLink;
/**
* Used as a callback to update the sound's position and
*/
public interface BoundaryHumUpdateLink
{
public boolean refreshHumInfo(BoundaryHumInfo infoToUpdate);
}
public static class BoundaryHumInfo
{
public Vec3 soundEpicentre;
public float distanceToEpicentre;
}
private class BoundaryFieldSound extends PositionedSound implements ITickableSound
{
public BoundaryFieldSound(ResourceLocation i_resourceLocation, float i_volume, boolean i_repeat)
{
super(i_resourceLocation);
repeat = i_repeat;
volume = i_volume;
attenuationType = AttenuationType.NONE;
}
private boolean donePlaying;
@Override
public boolean isDonePlaying() {
return donePlaying;
}
/**
* Updates the JList with a new model.
*/
@Override
public void update() {
BoundaryHumInfo boundaryHumInfo = new BoundaryHumInfo();
boolean playing = boundaryHumUpdateLink.refreshHumInfo(boundaryHumInfo);
final float MINIMUM_VOLUME = 0.01F;
final float MAXIMUM_VOLUME = 0.05F;
final float INSIDE_VOLUME = 0.10F;
final float OFF_VOLUME = 0.0F;
if (!playing) {
// donePlaying = true;
this.volume = OFF_VOLUME;
} else {
// System.out.println(boundaryHumInfo.distanceToEpicentre);
this.xPosF = (float)boundaryHumInfo.soundEpicentre.xCoord;
this.yPosF = (float)boundaryHumInfo.soundEpicentre.yCoord;
this.zPosF = (float)boundaryHumInfo.soundEpicentre.zCoord;
if (boundaryHumInfo.distanceToEpicentre < 0.01F) {
this.volume = INSIDE_VOLUME;
} else {
final float MINIMUM_VOLUME_DISTANCE = 20.0F;
float fractionToMinimum = boundaryHumInfo.distanceToEpicentre / MINIMUM_VOLUME_DISTANCE;
this.volume = UsefulFunctions.clipToRange(MINIMUM_VOLUME,
MAXIMUM_VOLUME - fractionToMinimum * (MAXIMUM_VOLUME - MINIMUM_VOLUME),
MAXIMUM_VOLUME);
}
}
}
}
}