private static void SetReverbPreset() // Custom function for setting reverb preset. { if (curReverbPreset != lastReverbPreset) { lastReverbPreset = curReverbPreset; float[] arr = ReverbPresetArrays[(int)curReverbPreset]; audioReverb.dryLevel = arr[0]; audioReverb.room = arr[1]; audioReverb.roomHF = arr[2]; audioReverb.roomLF = arr[3]; audioReverb.decayTime = arr[4]; audioReverb.decayHFRatio = arr[5]; audioReverb.reflectionsLevel = arr[6]; audioReverb.reflectionsDelay = arr[7]; audioReverb.reverbLevel = arr[8]; audioReverb.reverbDelay = arr[9]; audioReverb.hfReference = arr[10]; audioReverb.lfReference = arr[11]; audioReverb.diffusion = arr[12]; audioReverb.density = arr[13]; } }
private static void Postfix(GorillaLocomotion.Player __instance) { try { if (fetched) { Vector3 plyPos = __instance.bodyCollider.transform.position; // Get player position. if (!ranOnce) { audio = Resources.FindObjectsOfTypeAll <AudioListener>()[0]; // Get audio listener. audioReverb = audio.gameObject.AddComponent <AudioReverbFilter>(); audioLowPass = audio.gameObject.AddComponent <AudioLowPassFilter>(); audioReverb.enabled = true; audioLowPass.enabled = false; triggers = Resources.FindObjectsOfTypeAll <GorillaTriggerBox>(); for (int i = 0; i < ambienceAudio.Length; i++) // Create audio sources. { if (i != 7 || i != 8) // Is this actually working? { AudioSource source = GorillaLocomotion.Player.Instance.gameObject.AddComponent <AudioSource>(); sources.Add(source); } } int cnt = 0; foreach (AudioSource source in sources) // Set up audio sources. { source.volume = 0f; source.loop = true; source.clip = ambienceAudio[cnt]; source.Play(); cnt++; } foreach (GorillaTriggerBox trig in triggers) // Set up triggers. { if (triggerList.Contains <string>(trig.name)) { boundList.AddItem <Bounds>(trig.GetComponent <Collider>().bounds); } } triggerSides[(int)Areas.None] = false; // How could I do this better? Actually I know, I'll do it later! Or will I? triggerSides[(int)Areas.Forest] = false; triggerSides[(int)Areas.Cosmetics] = false; triggerSides[(int)Areas.Cave] = false; triggerSides[(int)Areas.Canyon] = false; ranOnce = true; sources[5].volume = volume; GameObject.Destroy(sources[5], ambienceAudio[5].length); // Destroy startup sound game object. timeSinceLoad = Time.time; //Inserting computer ambience here. Computer ambience is 3D sound for now. pcSource = GorillaComputer.instance.gameObject.AddComponent <AudioSource>(); pcSource.volume = volume / 8; pcSource.spatialBlend = 1f; pcSource.maxDistance = 1f; pcSource.clip = ambienceAudio[6]; pcSource.loop = true; pcSource.Play(); Console.WriteLine(Application.streamingAssetsPath); Console.WriteLine("Ambient Sounds is ready!"); } if (Time.frameCount % 5 == 0) // OpTiMiZaTiOnS!?!? { Task t1 = new Task(() => // Run in new thread. Multi-threading for the win! { foreach (GorillaTriggerBox trigger in triggers) // Cycle through all triggers, maybe a better way? { string name = trigger.name; Bounds bounds = trigger.GetComponent <Collider>().bounds; Vector3 closest = bounds.ClosestPoint(plyPos); Vector3 center = bounds.center; bool hit = bounds.Intersects(__instance.bodyCollider.bounds); float dist = (plyPos - closest).magnitude / 6; AudioSource source = new AudioSource(); float tmpVolume = -0f; Areas side = Areas.None; bool sideBool = false; switch (name) // Ignore everything in this switch statement, it's all a mess! AHHHHH!! { case "JoinPublicRoom (tree exit)": if (hit) { side = Areas.Forest; if (plyPos.z > center.z - 1) { sideBool = true; curReverbPreset = UserReverbPresets.Forest; pcSource.volume = 0f; } else if (plyPos.x < center.x + 2 && plyPos.x > center.x - 3) { sideBool = false; curReverbPreset = UserReverbPresets.Room; pcSource.volume = volume / 8; } } source = sources[(int)Tracks.Forest - 1]; if (!triggerSides[(int)Areas.Forest]) { if (!triggerSides[(int)Areas.Cosmetics]) { tmpVolume = (1 - dist) * volume; } Vector3 dir = (__instance.headCollider.transform.position - closest).normalized; source.panStereo = Vector3.Dot(-__instance.headCollider.transform.right, dir) / Mathf.Clamp(2 - dist, 0, 2); } else { source.panStereo = 0f; } break; case "JoinPublicRoom (cave entrance)": if (hit) { side = Areas.Cave; if (plyPos.z < center.z) { curReverbPreset = UserReverbPresets.Cave; sideBool = true; } else { curReverbPreset = UserReverbPresets.Hallway; sideBool = false; } } source = sources[(int)Tracks.Cave - 1]; if (triggerSides[(int)Areas.Cave]) { tmpVolume = Mathf.Clamp(dist, 0, 1) * volume; } else { tmpVolume = 0; if (triggerSides[(int)Areas.Cave]) { if (plyPos.y < 20) { Console.WriteLine("1"); curReverbPreset = UserReverbPresets.Forest; } else { curReverbPreset = UserReverbPresets.Cave; } } } break; case "LeavingCaveGeo": if (hit) { if (plyPos.y < center.y) { curReverbPreset = UserReverbPresets.Hallway; } else { curReverbPreset = UserReverbPresets.Room; } } break; case "EnteringCosmetics": if (hit) { side = Areas.Cosmetics; if (plyPos.x < center.x) { sideBool = true; pcSource.volume = 0f; } else { sideBool = false; pcSource.volume = volume / 8; } } source = sources[(int)Tracks.Cosmetics - 1]; if (triggerSides[(int)Areas.Cosmetics]) { tmpVolume = Mathf.Clamp(dist * 2, 0, 1) * volume; } else { tmpVolume = 0; } break; /* * if (!triggerSides[(int)Areas.Cosmetics] && !triggerSides[(int)Areas.Forest]) * { * tmpVolume = (1 - dist * 3) * volume; * Vector3 dir = (__instance.headCollider.transform.position - closest).normalized; * source.panStereo = Vector3.Dot(-__instance.headCollider.transform.right, dir) / Mathf.Clamp(2 - dist, 0, 2); * } * else * { * Vector3 dir = (__instance.headCollider.transform.position - closest).normalized; * source.panStereo = Vector3.Dot(-__instance.headCollider.transform.right, dir) / Mathf.Clamp(2 - dist, 0, 2); * if (triggerSides[(int)Areas.Forest]) * tmpVolume = 0; * } */ break; case "JoinPublicRoom (canyon)": if (hit) { side = Areas.Canyon; if (plyPos.z < center.z) { sideBool = true; curReverbPreset = UserReverbPresets.City; } else if (plyPos.x < center.x + 2 && plyPos.x > center.x - 3) { sideBool = false; curReverbPreset = UserReverbPresets.Room; } } source = sources[(int)Tracks.Canyon - 1]; if (!triggerSides[(int)Areas.Canyon] && !triggerSides[(int)Areas.Forest]) { tmpVolume = (1 - dist) * volume; Vector3 dir = (__instance.headCollider.transform.position - closest).normalized; source.panStereo = Vector3.Dot(-__instance.headCollider.transform.right, dir) / Mathf.Clamp(2 - dist, 0, 2); } else { source.panStereo = 0f; if (triggerSides[(int)Areas.Forest]) { tmpVolume = 0; } if (triggerSides[(int)Areas.Canyon]) { if (plyPos.y < 5) { curReverbPreset = UserReverbPresets.Hallway; } else { curReverbPreset = UserReverbPresets.City; } } } break; case "QuitBox": source = sources[(int)Tracks.Void - 1]; tmpVolume = (1 - Mathf.Clamp((float)Math.Log(dist / 2.5f), 0, 1)) * volume * 2; //tmpVolume = (1 - dist / 25) * volume; break; } if (tmpVolume != -0f) // Weird crap here. { source.volume = tmpVolume; } if (side != Areas.None) // Why do I have Areas.None?? { triggerSides[(int)side] = sideBool; } } // Falling and reverb. AudioSource falling = sources[(int)Tracks.Falling - 1]; float vel = __instance.GetComponent <Rigidbody>().velocity.magnitude; falling.pitch = Mathf.Clamp((float)Math.Log(vel / 5), 0, 3); falling.volume = (float)Math.Log(vel / 10) * volume * 12; SetReverbPreset(); }); t1.Start(); } float time = Time.time - timeSinceLoad; // Startup sound. OpTiMiZe! if (time < 1) { AudioListener.volume = time; } } } catch (Exception err) { Console.WriteLine("AmbientSounds Error! : " + err); } }