diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 8116119b3..fa229ec95 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -104,7 +104,6 @@ import com.hbm.render.util.RenderOverhead; import com.hbm.render.util.RenderOverhead.Marker; import com.hbm.sound.AudioWrapper; import com.hbm.sound.AudioWrapperClient; -import com.hbm.sound.AudioWrapperClientStartStop; import com.hbm.tileentity.TileEntityDoorGeneric; import com.hbm.tileentity.bomb.*; import com.hbm.tileentity.conductor.*; @@ -2009,14 +2008,6 @@ public class ClientProxy extends ServerProxy { audio.setKeepAlive(keepAlive); return audio; } - - /** Only used for doors */ - @Override - public AudioWrapper getLoopedSoundStartStop(World world, String sound, String start, String stop, float x, float y, float z, float volume, float pitch) { - AudioWrapperClientStartStop audio = new AudioWrapperClientStartStop(world, sound == null ? null : new ResourceLocation(sound), start, stop, volume * 5); - audio.updatePosition(x, y, z); - return audio; - } @Override public void playSound(String sound, Object data) { } diff --git a/src/main/java/com/hbm/main/ServerProxy.java b/src/main/java/com/hbm/main/ServerProxy.java index e30cbe562..554783cee 100644 --- a/src/main/java/com/hbm/main/ServerProxy.java +++ b/src/main/java/com/hbm/main/ServerProxy.java @@ -45,7 +45,6 @@ public class ServerProxy { public AudioWrapper getLoopedSound(String sound, float x, float y, float z, float volume, float range, float pitch) { return null; } public AudioWrapper getLoopedSound(String sound, float x, float y, float z, float volume, float range, float pitch, int keepAlive) { return null; } - public AudioWrapper getLoopedSoundStartStop(World world, String sound, String start, String stop, float x, float y, float z, float volume, float pitch) { return null; } public void playSound(String sound, Object data) { } diff --git a/src/main/java/com/hbm/sound/AudioWrapperClientStartStop.java b/src/main/java/com/hbm/sound/AudioWrapperClientStartStop.java deleted file mode 100644 index 6df22c652..000000000 --- a/src/main/java/com/hbm/sound/AudioWrapperClientStartStop.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.hbm.sound; - -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; - -/** Only used for doors */ -public class AudioWrapperClientStartStop extends AudioWrapperClient { - - public String start; - public String stop; - public World world; - public float ssVol; - public float x, y, z; - - public AudioWrapperClientStartStop(World world, ResourceLocation source, String start, String stop, float vol){ - super(source); - if(sound != null){ - sound.setVolume(vol); - } - this.ssVol = vol; - this.world = world; - this.start = start; - this.stop = stop; - } - - @Override - public void updatePosition(float x, float y, float z){ - this.x = x; - this.y = y; - this.z = z; - super.updatePosition(x, y, z); - } - - @Override - public void startSound(){ - if(start != null){ - world.playSound(x, y, z, start, ssVol * 0.2F, 1, false); - } - super.startSound(); - } - - @Override - public void stopSound(){ - if(stop != null){ - world.playSound(x, y, z, stop, ssVol * 0.2F, 1, false); - } - super.stopSound(); - } - - @Override - public float getVolume(){ - return ssVol; - } -} diff --git a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java index 526b9ce5c..6b4e32d02 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java +++ b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java @@ -243,27 +243,49 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn public void handleNewState(byte state){ if(this.state != state) { - if(this.state == 0 && state == 3){ - if(audio == null){ - audio = MainRegistry.proxy.getLoopedSoundStartStop(worldObj, getDoorType().getOpenSoundLoop(), getDoorType().getOpenSoundStart(), getDoorType().getOpenSoundEnd(), xCoord, yCoord, zCoord, getDoorType().getSoundVolume(), 1); + DoorDecl doorType = getDoorType(); + + if(this.state == 0 && state == 3){ // Door transitioning to open + if(audio != null) audio.stopSound(); + + if(doorType.getOpenSoundLoop() != null){ + audio = MainRegistry.proxy.getLoopedSound(doorType.getOpenSoundLoop(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); audio.startSound(); } - if(audio2 == null && getDoorType().getSoundLoop2() != null){ - audio2 = MainRegistry.proxy.getLoopedSoundStartStop(worldObj, getDoorType().getSoundLoop2(), null, null, xCoord, yCoord, zCoord, getDoorType().getSoundVolume(), 1); + + if(doorType.getOpenSoundStart() != null){ + worldObj.playSound(xCoord, yCoord, zCoord, doorType.getOpenSoundStart(), doorType.getSoundVolume(), 1F, false); + } + + if(doorType.getSoundLoop2() != null){ + if(audio2 != null) audio2.stopSound(); + + audio2 = MainRegistry.proxy.getLoopedSound(doorType.getSoundLoop2(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); audio2.startSound(); } } - if(this.state == 1 && state == 2){ - if(audio == null){ - audio = MainRegistry.proxy.getLoopedSoundStartStop(worldObj, getDoorType().getCloseSoundLoop(), getDoorType().getCloseSoundStart(), getDoorType().getCloseSoundEnd(), xCoord, yCoord, zCoord, getDoorType().getSoundVolume(), 1); + + if(this.state == 1 && state == 2){ // Door transitioning to closed + if(audio != null) audio.stopSound(); + + if(doorType.getCloseSoundLoop() != null){ + audio = MainRegistry.proxy.getLoopedSound(doorType.getCloseSoundLoop(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); audio.startSound(); } - if(audio2 == null && getDoorType().getSoundLoop2() != null){ - audio2 = MainRegistry.proxy.getLoopedSoundStartStop(worldObj, getDoorType().getSoundLoop2(), null, null, xCoord, yCoord, zCoord, getDoorType().getSoundVolume(), 1); + + if(doorType.getCloseSoundStart() != null){ + worldObj.playSound(xCoord, yCoord, zCoord, doorType.getCloseSoundStart(), doorType.getSoundVolume(), 1F, false); + } + + if(doorType.getSoundLoop2() != null){ + if(audio2 != null) audio2.stopSound(); + + audio2 = MainRegistry.proxy.getLoopedSound(doorType.getSoundLoop2(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); audio2.startSound(); } } - if((this.state == 3 && state == 1) || (this.state == 2 && state == 0)){ + + if((this.state == 3 && state == 1) || (this.state == 2 && state == 0)){ // Door finished any transition if(audio != null){ audio.stopSound(); audio = null; @@ -273,6 +295,18 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn audio2 = null; } } + + if(this.state == 3 && state == 1){ // Door finished transitioning to open + if(doorType.getOpenSoundEnd() != null){ + worldObj.playSound(xCoord, yCoord, zCoord, doorType.getOpenSoundEnd(), doorType.getSoundVolume(), 1F, false); + } + } + + if(this.state == 2 && state == 0){ // Door finished transitioning to closed + if(doorType.getCloseSoundEnd() != null){ + worldObj.playSound(xCoord, yCoord, zCoord, doorType.getCloseSoundEnd(), doorType.getSoundVolume(), 1F, false); + } + } this.state = state; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java index 2a2e761db..e32a41fb8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java @@ -14,8 +14,10 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Coolable; import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.lib.Library; +import com.hbm.main.MainRegistry; import com.hbm.packet.NBTPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.BlockPos; @@ -50,11 +52,16 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc public FluidTank[] tanks; + private AudioWrapper audio; + private float audioDesync; + public TileEntityChungus() { - tanks = new FluidTank[2]; tanks[0] = new FluidTank(Fluids.STEAM, 1000000000, 0); tanks[1] = new FluidTank(Fluids.SPENTSTEAM, 1000000000, 1); + + Random rand = new Random(); + audioDesync = rand.nextFloat() * 0.05F; } @Override @@ -119,9 +126,9 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc } if(turnTimer > 0) { - - this.fanAcceleration = Math.max(0F, Math.min(25F, this.fanAcceleration += 0.1F)); - + // Fan accelerates with a random offset to ensure the audio doesn't perfectly align, makes for a more pleasant hum + this.fanAcceleration = Math.max(0F, Math.min(25F, this.fanAcceleration += 0.075F + audioDesync)); + Random rand = worldObj.rand; ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection side = dir.getRotation(ForgeDirection.UP); @@ -133,9 +140,29 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc zCoord + 0.5 + dir.offsetZ * (rand.nextDouble() + 1.25) + rand.nextGaussian() * side.offsetZ * 0.65, -dir.offsetX * 0.2, 0, -dir.offsetZ * 0.2); } - } - if(turnTimer < 0) { + + + if(audio == null) { + audio = MainRegistry.proxy.getLoopedSound("hbm:block.chungusTurbineRunning", xCoord, yCoord, zCoord, 1.0F, 20F, 1.0F); + audio.startSound(); + } + + float turbineSpeed = this.fanAcceleration / 25F; + audio.updateVolume(getVolume(0.5f * turbineSpeed)); + audio.updatePitch(0.25F + 0.75F * turbineSpeed); + } else { this.fanAcceleration = Math.max(0F, Math.min(25F, this.fanAcceleration -= 0.1F)); + + if(audio != null) { + if(this.fanAcceleration > 0) { + float turbineSpeed = this.fanAcceleration / 25F; + audio.updateVolume(getVolume(0.5f * turbineSpeed)); + audio.updatePitch(0.25F + 0.75F * turbineSpeed); + } else { + audio.stopSound(); + audio = null; + } + } } } } @@ -286,6 +313,26 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc public String getComponentName() { return "ntm_turbine"; } + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public void invalidate() { + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } @Callback(direct = true) @Optional.Method(modid = "OpenComputers") diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 59f759c71..4a7e3de46 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -24,6 +24,7 @@ import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -63,6 +64,10 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser public float lastRotor; public boolean isOn; + private float rotorSpeed = 0F; + + private AudioWrapper audio; + public TileEntityITER() { super(5); tanks = new FluidTank[2]; @@ -181,16 +186,38 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser /// END Notif packets /// } else { - + this.lastRotor = this.rotor; + this.rotor += this.rotorSpeed; + + if(this.rotor >= 360) { + this.rotor -= 360; + this.lastRotor -= 360; + } - if(this.isOn && this.power >= this.powerReq) { + if(this.isOn && this.power >= powerReq) { + this.rotorSpeed = Math.max(0F, Math.min(15F, this.rotorSpeed + 0.05F)); + + if(audio == null) { + audio = MainRegistry.proxy.getLoopedSound("hbm:block.fusionReactorRunning", xCoord, yCoord, zCoord, 1.0F, 30F, 1.0F); + audio.startSound(); + } + + float rotorSpeed = this.rotorSpeed / 15F; + audio.updateVolume(getVolume(0.5f * rotorSpeed)); + audio.updatePitch(0.25F + 0.75F * rotorSpeed); + } else { + this.rotorSpeed = Math.max(0F, Math.min(15F, this.rotorSpeed - 0.1F)); - this.rotor += 15F; - - if(this.rotor >= 360) { - this.rotor -= 360; - this.lastRotor -= 360; + if(audio != null) { + if(this.rotorSpeed > 0) { + float rotorSpeed = this.rotorSpeed / 15F; + audio.updateVolume(getVolume(0.5f * rotorSpeed)); + audio.updatePitch(0.25F + 0.75F * rotorSpeed); + } else { + audio.stopSound(); + audio = null; + } } } } @@ -477,6 +504,26 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser return 0; } + @Override + public void onChunkUnload() { + super.onChunkUnload(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public void invalidate() { + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java index f629c577b..eb22b3289 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java @@ -8,6 +8,8 @@ import com.hbm.inventory.fluid.trait.FT_Heatable; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingStep; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.lib.Library; +import com.hbm.main.MainRegistry; +import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -37,6 +39,8 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements private int[] heat = new int[10]; private long fissureScanTime; + + private AudioWrapper audio; @Override public void updateEntity() { @@ -91,6 +95,16 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements double z = worldObj.rand.nextGaussian() * 2; worldObj.spawnParticle("cloud", xCoord + 0.5 + x, yCoord + 6 + y, zCoord + 0.5 + z, 0, 0, 0); } + + if(audio == null) { + audio = MainRegistry.proxy.getLoopedSound("hbm:block.hephaestusRunning", xCoord, yCoord + 5F, zCoord, 0.75F, 10F, 1.0F); + audio.startSound(); + } + } else { + if(audio != null) { + audio.stopSound(); + audio = null; + } } if(this.rot >= 360F) { @@ -234,6 +248,26 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements return dir != ForgeDirection.UNKNOWN && dir != ForgeDirection.UP && dir != ForgeDirection.DOWN; } + @Override + public void onChunkUnload() { + super.onChunkUnload(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public void invalidate() { + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + AxisAlignedBB bb = null; @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java index 1d8eefaa0..885408284 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java @@ -2,6 +2,7 @@ package com.hbm.tileentity.machine; import java.util.ArrayList; import java.util.List; +import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.handler.CompatHandler; @@ -16,6 +17,8 @@ import com.hbm.inventory.fluid.trait.FT_Coolable; import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.inventory.gui.GUIMachineLargeTurbine; import com.hbm.lib.Library; +import com.hbm.main.MainRegistry; +import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -51,6 +54,9 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme public float rotor; public float lastRotor; public float fanAcceleration = 0F; + + private AudioWrapper audio; + private float audioDesync; public TileEntityMachineLargeTurbine() { super(7); @@ -58,6 +64,9 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme tanks = new FluidTank[2]; tanks[0] = new FluidTank(Fluids.STEAM, 512000, 0); tanks[1] = new FluidTank(Fluids.SPENTSTEAM, 10240000, 1); + + Random rand = new Random(); + audioDesync = rand.nextFloat() * 0.05F; } @Override @@ -129,11 +138,30 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme } if(shouldTurn) { + // Fan accelerates with a random offset to ensure the audio doesn't perfectly align, makes for a more pleasant hum + this.fanAcceleration = Math.max(0F, Math.min(15F, this.fanAcceleration += 0.075F + audioDesync)); - this.fanAcceleration = Math.max(0F, Math.min(15F, this.fanAcceleration += 0.1F)); - } - if(!shouldTurn) { + if(audio == null) { + audio = MainRegistry.proxy.getLoopedSound("hbm:block.largeTurbineRunning", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F); + audio.startSound(); + } + + float turbineSpeed = this.fanAcceleration / 15F; + audio.updateVolume(getVolume(0.4f * turbineSpeed)); + audio.updatePitch(0.25F + 0.75F * turbineSpeed); + } else { this.fanAcceleration = Math.max(0F, Math.min(15F, this.fanAcceleration -= 0.1F)); + + if(audio != null) { + if(this.fanAcceleration > 0) { + float turbineSpeed = this.fanAcceleration / 15F; + audio.updateVolume(getVolume(0.4f * turbineSpeed)); + audio.updatePitch(0.25F + 0.75F * turbineSpeed); + } else { + audio.stopSound(); + audio = null; + } + } } } } @@ -293,6 +321,26 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme public String getComponentName() { return "ntm_turbine"; } + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public void invalidate() { + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } @Callback(direct = true) @Optional.Method(modid = "OpenComputers") diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index b7038f609..552af731b 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -51,6 +51,8 @@ "block.turbinegasStartup": {"category": "block", "sounds": [{"name": "block/turbinegasStartup", "stream": true}]}, "block.turbinegasRunning": {"category": "block", "sounds": [{"name": "block/turbinegasRunning", "stream": false}]}, "block.turbinegasShutdown": {"category": "block", "sounds": [{"name": "block/turbinegasShutdown", "stream": true}]}, + "block.chungusTurbineRunning": {"category": "block", "sounds": [{"name": "block/chungusTurbine", "stream": false}]}, + "block.largeTurbineRunning": {"category": "block", "sounds": [{"name": "block/largeTurbine", "stream": false}]}, "block.damage": {"category": "block", "sounds": ["block/dam1", "block/dam2", "block/dam3", "block/dam4"]}, "block.electricHum": {"category": "block", "sounds": [{"name": "block/electricHum", "stream": false}]}, "block.boiler": {"category": "block", "sounds": [{"name": "block/boiler", "stream": false}]}, @@ -59,7 +61,9 @@ "block.hornFarSingle": {"category": "block", "sounds": [{"name": "block/hornFarSingle", "stream": false}]}, "block.hornFarDual": {"category": "block", "sounds": [{"name": "block/hornFarDual", "stream": false}]}, "block.reactorLoop": {"category": "block", "sounds": [{"name": "block/reactorLoop", "stream": false}]}, + "block.fusionReactorRunning": {"category": "block", "sounds": [{"name": "block/fusionReactorSpin", "stream": false}]}, "block.fel": {"category": "block", "sounds": [{"name": "block/fel", "stream": false}]}, + "block.hephaestusRunning": {"category": "block", "sounds": [{"name": "block/hephaestusRunning", "stream": false}]}, "door.TransitionSealOpen": {"category": "block", "sounds": [{"name": "block/door/transition_seal_open", "stream": true}]}, "door.wghStart": {"category": "block", "sounds": [{"name": "block/door/wgh_start", "stream": true}]}, diff --git a/src/main/resources/assets/hbm/sounds/block/chungusTurbine.ogg b/src/main/resources/assets/hbm/sounds/block/chungusTurbine.ogg new file mode 100644 index 000000000..f66133991 Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/chungusTurbine.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/block/fusionReactorSpin.ogg b/src/main/resources/assets/hbm/sounds/block/fusionReactorSpin.ogg new file mode 100644 index 000000000..b3752f91c Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/fusionReactorSpin.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/block/hephaestusRunning.ogg b/src/main/resources/assets/hbm/sounds/block/hephaestusRunning.ogg new file mode 100644 index 000000000..0129ce676 Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/hephaestusRunning.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/block/largeTurbine.ogg b/src/main/resources/assets/hbm/sounds/block/largeTurbine.ogg new file mode 100644 index 000000000..4648b3dd3 Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/largeTurbine.ogg differ