public void AddParticle(Vector2 root_pos, byte elementIdx, float base_mass, float temperature, byte disease_idx, int base_disease_count, bool skip_sound = false, bool skip_decor = false, bool debug_track = false, bool disable_randomness = false) { int num = Grid.PosToCell(root_pos); if (!Grid.IsValidCell(num)) { KCrashReporter.Assert(false, "Trying to add falling water outside of the scene"); } else { if (temperature <= 0f || base_mass <= 0f) { Debug.LogError($"Unexpected water mass/temperature values added to the falling water manager T({temperature}) M({base_mass})"); } float time = GetTime(); if (!skip_sound) { if (!topSounds.TryGetValue(num, out SoundInfo value)) { value = default(SoundInfo); value.handle = LoopingSoundManager.StartSound(liquid_top_loop, root_pos, true, true); } value.startTime = time; LoopingSoundManager.Get().UpdateSecondParameter(value.handle, HASH_LIQUIDVOLUME, SoundUtil.GetLiquidVolume(base_mass)); topSounds[num] = value; } while (base_mass > 0f) { float num2 = UnityEngine.Random.value * 2f * particleMassVariation - particleMassVariation; float num3 = Mathf.Max(0f, Mathf.Min(base_mass, particleMassToSplit + num2)); float num4 = num3 / base_mass; base_mass -= num3; int disease_count = (int)(num4 * (float)base_disease_count); int frame = UnityEngine.Random.Range(0, numFrames); Vector2 b = (!disable_randomness) ? new Vector2(jitterStep * Mathf.Sin(offset), jitterStep * Mathf.Sin(offset + 17f)) : Vector2.zero; Vector2 b2 = (!disable_randomness) ? new Vector2(UnityEngine.Random.Range(0f - multipleOffsetRange.x, multipleOffsetRange.x), UnityEngine.Random.Range(0f - multipleOffsetRange.y, multipleOffsetRange.y)) : Vector2.zero; Element element = ElementLoader.elements[elementIdx]; Vector2 vector = root_pos; bool flag = !skip_decor && SpawnLiquidTopDecor(time, Grid.CellLeft(num), false, element); bool flag2 = !skip_decor && SpawnLiquidTopDecor(time, Grid.CellRight(num), true, element); Vector2 b3 = Vector2.ClampMagnitude(initialOffset + b + b2, 1f); if (flag || flag2) { if (flag && flag2) { vector += b3; vector.x += 0.5f; } else if (flag) { vector += b3; } else { vector.x += 1f - b3.x; vector.y += b3.y; } } else { vector += b3; vector.x += 0.5f; } int num5 = Grid.PosToCell(vector); Element element2 = Grid.Element[num5]; Element.State state = element2.state & Element.State.Solid; if (state == Element.State.Solid || (Grid.Properties[num5] & 2) != 0) { vector.y = Mathf.Floor(vector.y + 1f); } physics.Add(new ParticlePhysics(vector, Vector2.zero, frame, elementIdx)); particleProperties.Add(new ParticleProperties(elementIdx, num3, temperature, disease_idx, disease_count, debug_track)); } } }