package net.minecraft.client.audio; import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Map.Entry; import net.minecraft.client.resources.IResource; import net.minecraft.client.resources.IResourceManager; import net.minecraft.client.resources.IResourceManagerReloadListener; import net.minecraft.client.settings.GameSettings; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.gui.IUpdatePlayerListBox; import net.minecraft.util.ResourceLocation; import org.apache.commons.lang3.ArrayUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @SideOnly(Side.CLIENT) public class SoundHandler implements IResourceManagerReloadListener, IUpdatePlayerListBox { private static final Logger logger = LogManager.getLogger(); private static final Gson field_147699_c = (new GsonBuilder()).registerTypeAdapter(SoundList.class, new SoundListSerializer()).create(); private static final ParameterizedType field_147696_d = new ParameterizedType() { private static final String __OBFID = "CL_00001148"; public Type[] getActualTypeArguments() { return new Type[] {String.class, SoundList.class}; } public Type getRawType() { return Map.class; } public Type getOwnerType() { return null; } }; public static final SoundPoolEntry missing_sound = new SoundPoolEntry(new ResourceLocation("meta:missing_sound"), 0.0D, 0.0D, false); private final SoundRegistry sndRegistry = new SoundRegistry(); private final SoundManager sndManager; private final IResourceManager mcResourceManager; private static final String __OBFID = "CL_00001147"; public SoundHandler(IResourceManager p_i45122_1_, GameSettings p_i45122_2_) { this.mcResourceManager = p_i45122_1_; this.sndManager = new SoundManager(this, p_i45122_2_); } public void onResourceManagerReload(IResourceManager p_110549_1_) { this.sndManager.reloadSoundSystem(); this.sndRegistry.clearMap(); Iterator iterator = p_110549_1_.getResourceDomains().iterator(); while (iterator.hasNext()) { String s = (String)iterator.next(); try { List list = p_110549_1_.getAllResources(new ResourceLocation(s, "sounds.json")); Iterator iterator1 = list.iterator(); while (iterator1.hasNext()) { IResource iresource = (IResource)iterator1.next(); try { Map map = (Map)field_147699_c.fromJson(new InputStreamReader(iresource.getInputStream()), field_147696_d); Iterator iterator2 = map.entrySet().iterator(); while (iterator2.hasNext()) { Entry entry = (Entry)iterator2.next(); this.loadSoundResource(new ResourceLocation(s, (String)entry.getKey()), (SoundList)entry.getValue()); } } catch (RuntimeException runtimeexception) { logger.warn("Invalid sounds.json", runtimeexception); } } } catch (IOException ioexception) { ; } } } private void loadSoundResource(ResourceLocation p_147693_1_, SoundList p_147693_2_) { SoundEventAccessorComposite soundeventaccessorcomposite; if (this.sndRegistry.containsKey(p_147693_1_) && !p_147693_2_.canReplaceExisting()) { soundeventaccessorcomposite = (SoundEventAccessorComposite)this.sndRegistry.getObject(p_147693_1_); } else { logger.debug("Registered/replaced new sound event location {}", new Object[] {p_147693_1_}); soundeventaccessorcomposite = new SoundEventAccessorComposite(p_147693_1_, 1.0D, 1.0D, p_147693_2_.getSoundCategory()); this.sndRegistry.registerSound(soundeventaccessorcomposite); } Iterator iterator = p_147693_2_.getSoundList().iterator(); while (iterator.hasNext()) { final SoundList.SoundEntry soundentry = (SoundList.SoundEntry)iterator.next(); String s = soundentry.getSoundEntryName(); ResourceLocation resourcelocation1 = new ResourceLocation(s); final String s1 = s.contains(":") ? resourcelocation1.getResourceDomain() : p_147693_1_.getResourceDomain(); Object object; switch (SoundHandler.SwitchType.field_148765_a[soundentry.getSoundEntryType().ordinal()]) { case 1: ResourceLocation resourcelocation2 = new ResourceLocation(s1, "sounds/" + resourcelocation1.getResourcePath() + ".ogg"); try { this.mcResourceManager.getResource(resourcelocation2); } catch (FileNotFoundException filenotfoundexception) { logger.warn("File {} does not exist, cannot add it to event {}", new Object[] {resourcelocation2, p_147693_1_}); continue; } catch (IOException ioexception) { logger.warn("Could not load sound file " + resourcelocation2 + ", cannot add it to event " + p_147693_1_, ioexception); continue; } object = new SoundEventAccessor(new SoundPoolEntry(resourcelocation2, (double)soundentry.getSoundEntryPitch(), (double)soundentry.getSoundEntryVolume(), soundentry.isStreaming()), soundentry.getSoundEntryWeight()); break; case 2: object = new ISoundEventAccessor() { final ResourceLocation field_148726_a = new ResourceLocation(s1, soundentry.getSoundEntryName()); private static final String __OBFID = "CL_00001149"; public int func_148721_a() { SoundEventAccessorComposite soundeventaccessorcomposite1 = (SoundEventAccessorComposite)SoundHandler.this.sndRegistry.getObject(this.field_148726_a); return soundeventaccessorcomposite1 == null ? 0 : soundeventaccessorcomposite1.func_148721_a(); } public SoundPoolEntry func_148720_g() { SoundEventAccessorComposite soundeventaccessorcomposite1 = (SoundEventAccessorComposite)SoundHandler.this.sndRegistry.getObject(this.field_148726_a); return soundeventaccessorcomposite1 == null ? SoundHandler.missing_sound : soundeventaccessorcomposite1.func_148720_g(); } }; break; default: throw new IllegalStateException("IN YOU FACE"); } soundeventaccessorcomposite.addSoundToEventPool((ISoundEventAccessor)object); } } public SoundEventAccessorComposite getSound(ResourceLocation p_147680_1_) { return (SoundEventAccessorComposite)this.sndRegistry.getObject(p_147680_1_); } /** * Play a sound */ public void playSound(ISound p_147682_1_) { this.sndManager.playSound(p_147682_1_); } /** * Plays the sound in n ticks */ public void playDelayedSound(ISound p_147681_1_, int p_147681_2_) { this.sndManager.playDelayedSound(p_147681_1_, p_147681_2_); } public void setListener(EntityPlayer p_147691_1_, float p_147691_2_) { this.sndManager.setListener(p_147691_1_, p_147691_2_); } public void pauseSounds() { this.sndManager.pauseAllSounds(); } public void stopSounds() { this.sndManager.stopAllSounds(); } public void unloadSounds() { this.sndManager.unloadSoundSystem(); } /** * Updates the JList with a new model. */ public void update() { this.sndManager.updateAllSounds(); } public void resumeSounds() { this.sndManager.resumeAllSounds(); } public void setSoundLevel(SoundCategory p_147684_1_, float p_147684_2_) { if (p_147684_1_ == SoundCategory.MASTER && p_147684_2_ <= 0.0F) { this.stopSounds(); } this.sndManager.setSoundCategoryVolume(p_147684_1_, p_147684_2_); } public void stopSound(ISound p_147683_1_) { this.sndManager.stopSound(p_147683_1_); } /** * Returns a random sound from one or more categories */ public SoundEventAccessorComposite getRandomSoundFromCategories(SoundCategory ... p_147686_1_) { ArrayList arraylist = Lists.newArrayList(); Iterator iterator = this.sndRegistry.getKeys().iterator(); while (iterator.hasNext()) { ResourceLocation resourcelocation = (ResourceLocation)iterator.next(); SoundEventAccessorComposite soundeventaccessorcomposite = (SoundEventAccessorComposite)this.sndRegistry.getObject(resourcelocation); if (ArrayUtils.contains(p_147686_1_, soundeventaccessorcomposite.getSoundCategory())) { arraylist.add(soundeventaccessorcomposite); } } if (arraylist.isEmpty()) { return null; } else { return (SoundEventAccessorComposite)arraylist.get((new Random()).nextInt(arraylist.size())); } } public boolean isSoundPlaying(ISound p_147692_1_) { return this.sndManager.isSoundPlaying(p_147692_1_); } @SideOnly(Side.CLIENT) static final class SwitchType { static final int[] field_148765_a = new int[SoundList.SoundEntry.Type.values().length]; private static final String __OBFID = "CL_00001150"; static { try { field_148765_a[SoundList.SoundEntry.Type.FILE.ordinal()] = 1; } catch (NoSuchFieldError var2) { ; } try { field_148765_a[SoundList.SoundEntry.Type.SOUND_EVENT.ordinal()] = 2; } catch (NoSuchFieldError var1) { ; } } } }