Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
        }