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; } } }
/// <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); }