diff --git a/src/main/java/mekanism/client/ClientProxy.java b/src/main/java/mekanism/client/ClientProxy.java index 987c4f0d3..e67ef9c2f 100644 --- a/src/main/java/mekanism/client/ClientProxy.java +++ b/src/main/java/mekanism/client/ClientProxy.java @@ -80,8 +80,8 @@ import mekanism.client.render.tileentity.RenderRotaryCondensentrator; import mekanism.client.render.tileentity.RenderSalinationController; import mekanism.client.render.tileentity.RenderSeismicVibrator; import mekanism.client.render.tileentity.RenderTeleporter; -import mekanism.client.sound.Sound; import mekanism.client.sound.SoundHandler; +import mekanism.client.sound.SoundMap; import mekanism.common.CommonProxy; import mekanism.common.IElectricChest; import mekanism.common.IInvConfiguration; @@ -185,13 +185,13 @@ public class ClientProxy extends CommonProxy } @Override - public void registerSound(Object obj) + public void registerSound(TileEntity tileEntity) { if(MekanismClient.enableSounds && MekanismClient.audioHandler != null) { - synchronized(MekanismClient.audioHandler.sounds) + synchronized(MekanismClient.audioHandler.soundMaps) { - MekanismClient.audioHandler.register(obj); + MekanismClient.audioHandler.registerTileSound(tileEntity); } } } @@ -201,11 +201,11 @@ public class ClientProxy extends CommonProxy { if(MekanismClient.enableSounds && MekanismClient.audioHandler != null) { - synchronized(MekanismClient.audioHandler.sounds) + synchronized(MekanismClient.audioHandler.soundMaps) { - if(MekanismClient.audioHandler.getFrom(tileEntity) != null) + if(MekanismClient.audioHandler.getMap(tileEntity) != null) { - MekanismClient.audioHandler.getFrom(tileEntity).remove(); + MekanismClient.audioHandler.getMap(tileEntity).kill(); } } } @@ -504,17 +504,17 @@ public class ClientProxy extends CommonProxy { if(MekanismClient.audioHandler != null) { - synchronized(MekanismClient.audioHandler.sounds) + synchronized(MekanismClient.audioHandler.soundMaps) { - HashMap sounds = new HashMap(); - sounds.putAll(MekanismClient.audioHandler.sounds); + HashMap mapsCopy = new HashMap(); + mapsCopy.putAll(MekanismClient.audioHandler.soundMaps); - for(Sound sound : sounds.values()) + for(SoundMap map : mapsCopy.values()) { - sound.remove(); + map.kill(); } - MekanismClient.audioHandler.sounds.clear(); + MekanismClient.audioHandler.soundMaps.clear(); } } } diff --git a/src/main/java/mekanism/client/ClientTickHandler.java b/src/main/java/mekanism/client/ClientTickHandler.java index 4059db0da..7bf69343c 100644 --- a/src/main/java/mekanism/client/ClientTickHandler.java +++ b/src/main/java/mekanism/client/ClientTickHandler.java @@ -387,22 +387,26 @@ public class ClientTickHandler { for(String username : Mekanism.jetpackOn) { - if(mc.theWorld.getPlayerEntityByName(username) != null) + EntityPlayer player = mc.theWorld.getPlayerEntityByName(username); + + if(player != null) { - if(MekanismClient.audioHandler.getFrom(mc.theWorld.getPlayerEntityByName(username)) == null) + if(MekanismClient.audioHandler.getMap(player) == null) { - new JetpackSound(MekanismClient.audioHandler.getIdentifier(), mc.theWorld.getPlayerEntityByName(username)); + new JetpackSound(MekanismClient.audioHandler.getIdentifier(player), player); } } } for(String username : Mekanism.gasmaskOn) { - if(mc.theWorld.getPlayerEntityByName(username) != null) + EntityPlayer player = mc.theWorld.getPlayerEntityByName(username); + + if(player != null) { - if(MekanismClient.audioHandler.getFrom(mc.theWorld.getPlayerEntityByName(username)) == null) + if(MekanismClient.audioHandler.getMap(player) == null) { - new GasMaskSound(MekanismClient.audioHandler.getIdentifier(), mc.theWorld.getPlayerEntityByName(username)); + new GasMaskSound(MekanismClient.audioHandler.getIdentifier(player), player); } } } @@ -411,7 +415,10 @@ public class ClientTickHandler { if(hasFlamethrower(player)) { - new FlamethrowerSound(MekanismClient.audioHandler.getIdentifier(), player); + if(MekanismClient.audioHandler.getMap(player) == null) + { + new FlamethrowerSound(MekanismClient.audioHandler.getIdentifier(player), player); + } } } } @@ -546,7 +553,7 @@ public class ClientTickHandler public static boolean hasFlamethrower(EntityPlayer player) { - if(player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemJetpack) + if(player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemFlamethrower) { ItemFlamethrower flamethrower = (ItemFlamethrower)player.getCurrentEquippedItem().getItem(); @@ -563,7 +570,7 @@ public class ClientTickHandler { if(MekanismClient.audioHandler != null) { - synchronized(MekanismClient.audioHandler.sounds) + synchronized(MekanismClient.audioHandler.soundMaps) { MekanismClient.audioHandler.onTick(); } diff --git a/src/main/java/mekanism/client/sound/FlamethrowerSound.java b/src/main/java/mekanism/client/sound/FlamethrowerSound.java index da287074f..931f8f03b 100644 --- a/src/main/java/mekanism/client/sound/FlamethrowerSound.java +++ b/src/main/java/mekanism/client/sound/FlamethrowerSound.java @@ -2,7 +2,6 @@ package mekanism.client.sound; import mekanism.client.ClientTickHandler; import mekanism.common.item.ItemFlamethrower; -import mekanism.common.item.ItemJetpack; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; @@ -12,7 +11,7 @@ public class FlamethrowerSound extends PlayerSound public FlamethrowerSound(String id, EntityPlayer entity) { - super(id, "Flamethrower.ogg", entity); + super(id, getSound(getInUse(entity)), entity); inUse = getInUse(entity); } @@ -35,16 +34,22 @@ public class FlamethrowerSound extends PlayerSound if(isPlaying) { + System.out.println(getLocation()); ticksSincePlay++; } return true; } - private boolean getInUse(EntityPlayer player) + private static boolean getInUse(EntityPlayer player) { ItemFlamethrower flamethrower = (ItemFlamethrower)player.getCurrentEquippedItem().getItem(); return flamethrower.getInUse(player.getCurrentEquippedItem()); } + + private static String getSound(boolean inUse) + { + return inUse ? "FlamethrowerActive.ogg" : "FlamethrowerIdle.ogg"; + } } diff --git a/src/main/java/mekanism/client/sound/Sound.java b/src/main/java/mekanism/client/sound/Sound.java index edd541e11..f33864c94 100644 --- a/src/main/java/mekanism/client/sound/Sound.java +++ b/src/main/java/mekanism/client/sound/Sound.java @@ -33,12 +33,12 @@ public abstract class Sound */ public Sound(String id, String sound, Object obj, Pos3D loc) { - if(MekanismClient.audioHandler.getFrom(obj) != null) + if(MekanismClient.audioHandler.getMap(obj) != null) { return; } - synchronized(MekanismClient.audioHandler.sounds) + synchronized(MekanismClient.audioHandler.soundMaps) { prevSoundPath = sound; identifier = id; @@ -58,7 +58,7 @@ public abstract class Sound SoundHandler.getSoundSystem().activate(id); } - MekanismClient.audioHandler.sounds.put(obj, this); + MekanismClient.audioHandler.registerSound(objRef, prevSoundPath, this); } } @@ -67,7 +67,7 @@ public abstract class Sound */ public void play() { - synchronized(MekanismClient.audioHandler.sounds) + synchronized(MekanismClient.audioHandler.soundMaps) { if(isPlaying) { @@ -91,7 +91,7 @@ public abstract class Sound */ public void stopLoop() { - synchronized(MekanismClient.audioHandler.sounds) + synchronized(MekanismClient.audioHandler.soundMaps) { if(!isPlaying) { @@ -113,14 +113,14 @@ public abstract class Sound */ public void remove() { - synchronized(MekanismClient.audioHandler.sounds) + synchronized(MekanismClient.audioHandler.soundMaps) { if(isPlaying) { stopLoop(); } - MekanismClient.audioHandler.sounds.remove(objRef); + MekanismClient.audioHandler.removeSound(objRef, prevSoundPath); if(SoundHandler.getSoundSystem() != null) { @@ -158,7 +158,7 @@ public abstract class Sound */ public void updateVolume() { - synchronized(MekanismClient.audioHandler.sounds) + synchronized(MekanismClient.audioHandler.soundMaps) { try { float multiplier = getMultiplier(); diff --git a/src/main/java/mekanism/client/sound/SoundHandler.java b/src/main/java/mekanism/client/sound/SoundHandler.java index 2a018c2f4..76a0a760e 100644 --- a/src/main/java/mekanism/client/sound/SoundHandler.java +++ b/src/main/java/mekanism/client/sound/SoundHandler.java @@ -44,7 +44,7 @@ import cpw.mods.fml.relauncher.SideOnly; public class SoundHandler { /** All the sound references in the Minecraft game. */ - public Map sounds = Collections.synchronizedMap(new HashMap()); + public Map soundMaps = Collections.synchronizedMap(new HashMap()); public static Minecraft mc = Minecraft.getMinecraft(); @@ -173,7 +173,7 @@ public class SoundHandler */ public void onTick() { - synchronized(sounds) + synchronized(soundMaps) { if(getSoundSystem() != null) { @@ -184,17 +184,20 @@ public class SoundHandler if(FMLClientHandler.instance().getClient().thePlayer != null && world != null) { - for(Sound sound : sounds.values()) + for(SoundMap map : soundMaps.values()) { - if(!sound.update(world)) + for(Sound sound : map) { - soundsToRemove.add(sound); - continue; - } - - if(sound.isPlaying) - { - sound.updateVolume(); + if(!sound.update(world)) + { + soundsToRemove.add(sound); + continue; + } + + if(sound.isPlaying) + { + sound.updateVolume(); + } } } @@ -205,12 +208,9 @@ public class SoundHandler } } else { - for(Sound sound : sounds.values()) + for(SoundMap map : soundMaps.values()) { - if(sound.isPlaying) - { - sound.stopLoop(); - } + map.stopLoops(); } } } @@ -219,40 +219,68 @@ public class SoundHandler } } } + + public void removeSound(Object ref, String path) + { + if(soundMaps.get(ref) == null) + { + return; + } + + soundMaps.get(ref).remove(path); + } + + public void registerSound(Object ref, String path, Sound sound) + { + if(soundMaps.get(ref) == null) + { + soundMaps.put(ref, new SoundMap(ref, path, sound)); + return; + } + + soundMaps.get(ref).add(path, sound); + } /** * Gets a sound object from a specific TileEntity, null if there is none. * @param tileEntity - the holder of the sound * @return Sound instance */ - public Sound getFrom(Object obj) + public SoundMap getMap(Object obj) { - synchronized(sounds) + synchronized(soundMaps) { - return sounds.get(obj); + return soundMaps.get(obj); } } + + public Sound getSound(Object obj, String path) + { + if(soundMaps.get(obj) == null) + { + return null; + } + + return soundMaps.get(obj).getSound(path); + } /** * Create and return an instance of a Sound. * @param tileEntity - the holder of this sound. * @return Sound instance */ - public void register(Object obj) + public void registerTileSound(TileEntity tile) { - if(obj instanceof TileEntity && !(obj instanceof IHasSound)) + if(!(tile instanceof IHasSound)) { return; } - synchronized(sounds) + synchronized(soundMaps) { - if(getFrom(obj) == null) + if(getMap(tile) == null) { - if(obj instanceof TileEntity) - { - new TileSound(getIdentifier(), HolidayManager.filterSound(((IHasSound)obj).getSoundPath()), (TileEntity)obj); - } + new TileSound(getIdentifier(tile), HolidayManager.filterSound(((IHasSound)tile).getSoundPath()), tile); } } } @@ -263,19 +291,11 @@ public class SoundHandler * number between 0 and 10,000. Example: "Mekanism_6_6123" * @return unique identifier */ - public String getIdentifier() + public String getIdentifier(Object obj) { - synchronized(sounds) + synchronized(soundMaps) { - String toReturn = "Mekanism_" + sounds.size() + "_" + new Random().nextInt(10000); - - for(Sound sound : sounds.values()) - { - if(sound.identifier.equals(toReturn)) - { - return getIdentifier(); - } - } + String toReturn = "Mekanism_" + soundMaps.size() + "_" + new Random().nextInt(10000); return toReturn; } @@ -350,11 +370,11 @@ public class SoundHandler if(tileEntity instanceof IHasSound) { - if(getFrom(tileEntity) != null) + if(getMap(tileEntity) != null) { - if(sounds.containsKey(tileEntity)) + if(soundMaps.containsKey(tileEntity)) { - getFrom(tileEntity).remove(); + getMap(tileEntity).kill(); } } } diff --git a/src/main/java/mekanism/client/sound/SoundMap.java b/src/main/java/mekanism/client/sound/SoundMap.java new file mode 100644 index 000000000..befe8dfea --- /dev/null +++ b/src/main/java/mekanism/client/sound/SoundMap.java @@ -0,0 +1,73 @@ +package mekanism.client.sound; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import mekanism.client.MekanismClient; + +public class SoundMap implements Iterable +{ + public Map soundMap = new HashMap(); + + public Object objRef; + + public SoundMap(Object obj) + { + objRef = obj; + } + + public SoundMap(Object obj, String path, Sound sound) + { + this(obj); + + soundMap.put(path, sound); + } + + @Override + public Iterator iterator() + { + return soundMap.values().iterator(); + } + + public Sound getSound(String path) + { + return soundMap.get(path); + } + + public boolean hasSound(String path) + { + return soundMap.containsKey(path); + } + + public void remove(String path) + { + soundMap.remove(path); + } + + public void add(String path, Sound sound) + { + soundMap.put(path, sound); + } + + public void stopLoops() + { + for(Sound sound : soundMap.values()) + { + if(sound.isPlaying) + { + sound.stopLoop(); + } + } + } + + public void kill() + { + for(Sound sound : soundMap.values()) + { + sound.remove(); + } + + MekanismClient.audioHandler.soundMaps.remove(objRef); + } +} diff --git a/src/main/java/mekanism/common/CommonProxy.java b/src/main/java/mekanism/common/CommonProxy.java index 731062624..2b130aae4 100644 --- a/src/main/java/mekanism/common/CommonProxy.java +++ b/src/main/java/mekanism/common/CommonProxy.java @@ -142,9 +142,9 @@ public class CommonProxy /** * Registers a client-side sound, assigned to a TileEntity. - * @param obj - TileEntity who is registering the sound + * @param tile - TileEntity who is registering the sound */ - public void registerSound(Object obj) {} + public void registerSound(TileEntity tileEntity) {} /** * Unregisters a client-side sound, assigned to a TileEntity; diff --git a/src/main/resources/assets/mekanism/sounds/FlamethrowerActive.ogg b/src/main/resources/assets/mekanism/sounds/FlamethrowerActive.ogg new file mode 100644 index 000000000..0cce81211 Binary files /dev/null and b/src/main/resources/assets/mekanism/sounds/FlamethrowerActive.ogg differ diff --git a/src/main/resources/assets/mekanism/sounds/FlamethrowerIdle.ogg b/src/main/resources/assets/mekanism/sounds/FlamethrowerIdle.ogg new file mode 100644 index 000000000..1776d2828 Binary files /dev/null and b/src/main/resources/assets/mekanism/sounds/FlamethrowerIdle.ogg differ