private bool HandleWaterSource(ushort buildingID, ref Building data, bool output, int rate, int max, float radius) { TerrainManager instance = Singleton <TerrainManager> .instance; WaterSimulation waterSimulation = instance.WaterSimulation; if (data.m_waterSource != 0) { return(false); } else { Vector3 vector2 = data.CalculatePosition(this.m_waterLocationOffset); WaterSource sourceData2 = default(WaterSource); sourceData2.m_type = 2; sourceData2.m_inputPosition = vector2; sourceData2.m_outputPosition = vector2; sourceData2.m_outputRate = 50u; sourceData2.m_inputRate = 1u; sourceData2.m_water = 1000u; Debug.Log("[RF]NDai.HWS vector2 = " + vector2.ToString()); sourceData2.m_target = (ushort)(vector2.y + this.m_standingWaterDepth); Debug.Log("[RF]NDai.HWS target = " + sourceData2.m_target.ToString()); if (!waterSimulation.CreateWaterSource(out data.m_waterSource, sourceData2)) { return(false); } } return(true); }
public WaterSource NewWaterSource(Vector2 point, uint flow, uint inrate, uint outrate) { ushort sourceNum; WaterSource defaultSource = default(WaterSource); var z = Singleton <TerrainManager> .instance.SampleRawHeightSmoothWithWater(new Vector3(point.x, 0, point.y), false, 0f); var pos = new Vector3(point.x, z, point.y); // water source settings defaultSource.m_flow = flow; defaultSource.m_inputRate = inrate; defaultSource.m_outputRate = outrate; defaultSource.m_outputPosition = pos; defaultSource.m_inputPosition = pos; defaultSource.m_type = 2; defaultSource.m_water = 8000000u; _waterSimulation.CreateWaterSource(out sourceNum, defaultSource); _waterSourceIDs.Add(sourceNum); Temp++; return(defaultSource); }
private int HandleWaterSource(ushort buildingID, ref Building data, bool output, int rate, int max, float radius) { uint num = (uint)(Mathf.Min(rate, max) >> 1); if (num == 0u) { return(0); } TerrainManager instance = Singleton <TerrainManager> .instance; WaterSimulation waterSimulation = instance.WaterSimulation; if (data.m_waterSource != 0) { bool flag = false; WaterSource sourceData = waterSimulation.LockWaterSource(data.m_waterSource); try { if (output) { uint num2 = num; if (num2 < sourceData.m_water >> 3) { num2 = sourceData.m_water >> 3; } sourceData.m_outputRate = num2 + 3u >> 2; sourceData.m_water += num; } else { uint num3 = num; if (num3 < sourceData.m_water >> 3) { num3 >>= 1; } sourceData.m_inputRate = num3 + 3u >> 2; if (num > sourceData.m_water) { num = sourceData.m_water; } if (sourceData.m_water != 0u) { data.m_waterPollution = (byte)Mathf.Min(255f, 255u * sourceData.m_pollution / sourceData.m_water); sourceData.m_pollution = (uint)((ulong)sourceData.m_pollution * (ulong)(sourceData.m_water - num) / (ulong)sourceData.m_water); } else { data.m_waterPollution = 0; } sourceData.m_water -= num; Vector3 vector = sourceData.m_inputPosition; if (!instance.HasWater(VectorUtils.XZ(vector))) { vector = data.CalculatePosition(this.m_waterLocationOffset); if (instance.GetClosestWaterPos(ref vector, radius)) { sourceData.m_inputPosition = vector; sourceData.m_outputPosition = vector; } else { flag = true; } } } } finally { waterSimulation.UnlockWaterSource(data.m_waterSource, sourceData); } if (flag) { waterSimulation.ReleaseWaterSource(data.m_waterSource); data.m_waterSource = 0; } } else { Vector3 vector2 = data.CalculatePosition(this.m_waterLocationOffset); WaterSource sourceData2 = default(WaterSource); sourceData2.m_type = 2; sourceData2.m_inputPosition = vector2; sourceData2.m_outputPosition = vector2; if (output) { sourceData2.m_outputRate = num + 3u >> 2; sourceData2.m_water = num; // sourceData2.m_pollution = num * (uint)this.m_outletPollution / (uint)Mathf.Max(100, waterSimulation.GetPollutionDisposeRate() * 100); if (!waterSimulation.CreateWaterSource(out data.m_waterSource, sourceData2)) { num = 0u; } } else { sourceData2.m_inputRate = num + 3u >> 2; waterSimulation.CreateWaterSource(out data.m_waterSource, sourceData2); num = 0u; } } return((int)((int)num << 1)); }