private void RunUpdate(ref SensorDetectingTemplate template) { var sensor = template.Sensor; sensor.DetectedCells.Clear(); var start = template.Position.Value; sensor.LastDetectedCenter = start; var fwd = template.Tr.ForwardDirection2D(); var ls = World.Get <LineOfSightSystem>(); for (int i = 0; i < DirectionsExtensions.Length2D; i++) { var dir = (Directions)i; var maxRowDistance = dir == fwd ? sensor.MaxVisionDistance : sensor.MaxHearDistance; var adjacent = dir.Adjacent(); ShadowFloodFill.CheckRow( ref sensor.DetectedCells, start, start, maxRowDistance, new[] { adjacent[0].ToPoint3(), adjacent[1].ToPoint3() }, dir.ToPoint3()); } for (int i = 0; i < _occupyTemplates.Max; i++) { if (_occupyTemplates.IsInvalid(i)) { continue; } var visible = _occupyTemplates[i]; if (visible.Entity == template.Entity) { continue; } if (!sensor.DetectedCells.Contains(visible.Position)) { continue; } var isVision = true; if (CheckVision) { ls.CanSeeOrHear(template.Entity, visible.Entity, out isVision); } sensor.AddWatch(visible.Entity, isVision); } for (int w = sensor.WatchTargets.Count - 1; w >= 0; w--) { if (sensor.WatchTargets[w].Target == null) { sensor.RemoveWatch(sensor.WatchTargets[w]); continue; } sensor.WatchTargets[w].LastSensedTurnCount++; if (sensor.WatchTargets[w].LastSensedTurnCount > MaxTurnsNpcVisible) { sensor.RemoveWatch(sensor.WatchTargets[w]); } } }
public bool MoveNext() { while (true) { unchecked { _position++; } if (_position >= _array.Max) { return(false); } if (!_array.IsInvalid(_position)) { return(true); } } }