コード例 #1
0
    public void Refresh()
    {
        UnregisterLight();
        Operational component = GetComponent <Operational>();

        if ((!((Object)component != (Object)null) || component.IsOperational) && base.isActiveAndEnabled)
        {
            Vector3 position = base.transform.GetPosition();
            position = new Vector3(position.x + Offset.x, position.y + Offset.y, position.z);
            int num = Grid.PosToCell(position);
            if (Grid.IsValidCell(num))
            {
                Vector2I vector2I = Grid.CellToXY(num);
                int      num2     = (int)Range;
                if (shape == LightShape.Circle)
                {
                    Vector2I vector2I2 = new Vector2I(vector2I.x - num2, vector2I.y - num2);
                    solidPartitionerEntry  = GameScenePartitioner.Instance.Add("Radiator", base.gameObject, vector2I2.x, vector2I2.y, 2 * num2, 2 * num2, GameScenePartitioner.Instance.solidChangedLayer, TriggerRefresh);
                    liquidPartitionerEntry = GameScenePartitioner.Instance.Add("Radiator", base.gameObject, vector2I2.x, vector2I2.y, 2 * num2, 2 * num2, GameScenePartitioner.Instance.liquidChangedLayer, TriggerRefresh);
                }
                else if (shape == LightShape.Cone)
                {
                    Vector2I vector2I3 = new Vector2I(vector2I.x - num2, vector2I.y - num2);
                    solidPartitionerEntry  = GameScenePartitioner.Instance.Add("Radiator", base.gameObject, vector2I3.x, vector2I3.y, 2 * num2, num2, GameScenePartitioner.Instance.solidChangedLayer, TriggerRefresh);
                    liquidPartitionerEntry = GameScenePartitioner.Instance.Add("Radiator", base.gameObject, vector2I3.x, vector2I3.y, 2 * num2, num2, GameScenePartitioner.Instance.liquidChangedLayer, TriggerRefresh);
                }
                cell = num;
                litCells.Clear();
                emitter = new RadiationGridEmitter(cell, litCells, Lux, Range, shape, 0.5f);
                emitter.Add();
                isRegistered = true;
            }
        }
    }
コード例 #2
0
        /// <summary>
        /// Applied before Emit runs.
        /// </summary>
        internal static bool Prefix(RadiationGridEmitter __instance)
        {
            int n = __instance.projectionCount;

            if (n > 0)
            {
                var startPos = (Vector2)Grid.CellToPosCCC(__instance.originCell, Grid.
                                                          SceneLayer.Building);
                float angle = __instance.angle, direction = __instance.direction - 0.5f *
                                                            angle, step = angle / n, intensity = __instance.intensity;
                var scanCells = __instance.scanCells;
                scanCells.Clear();
                for (int i = 0; i < n; i++)
                {
                    float netAngle = Mathf.Deg2Rad * (direction + Random.Range(-step, step) *
                                                      0.5f);
                    var     unitVector = new Vector2(Mathf.Cos(netAngle), Mathf.Sin(netAngle));
                    float   rads       = intensity;
                    Vector2 a2         = unitVector;
                    float   dist       = 0f;
                    while (rads > 0.01f && dist < RadiationGridEmitter.MAX_EMIT_DISTANCE)
                    {
                        int cell = Grid.PosToCell(startPos + a2 * dist);
                        // 1 / 3
                        dist += 0.333333f;
                        if (!Grid.IsValidCell(cell))
                        {
                            break;
                        }
                        if (!scanCells.Contains(cell))
                        {
                            SimMessages.ModifyRadiationOnCell(cell, Mathf.RoundToInt(rads));
                            scanCells.Add(cell);
                        }
                        float mass = Grid.Mass[cell];
                        // Attenuate over distance, with a slight random factor
                        rads *= ((mass > 0.0f) ? Mathf.Max(0f, 1f - Mathf.Pow(mass, 1.25f) *
                                                           Grid.Element[cell].molarMass / 1000000.0f) : 1.0f) *
                                Random.Range(0.96f, 0.98f);
                    }
                    direction += step;
                }
            }
            return(false);
        }