public void CleanupDelegates() { // Drivers_Changed -= OnDriversChanged; foreach (DriversChanged d in Drivers_Changed.GetInvocationList()) { Drivers_Changed -= d; } }
public virtual void OnTimedEvent(Object source, ElapsedEventArgs e) { timer.Stop(); ///Console.WriteLine("DriversChanged at {0:HH:mm:ss.fff}", e.SignalTime); foreach (Section section in track.Sections) { SectionData data = GetSectionData(section); if (data.Left != null) { int leftDistance = data.DistanceLeft + getTravelDistanceOfDriver((Driver)data.Left); //berekent te reizen afstand. works if (leftDistance > 200) { for (int i = 0; i < _positions.Count; i++) { if (_positions.ElementAt(i).Value.Left == data.Left) //if the left contains the participant im looking for { var MovingDriver = _positions.ElementAt(i).Value.Left; ShouldBeBroken(MovingDriver.Equipment); //chance that this will break the car //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged if (i == _positions.Count - 1) //is hij aan het "einde" van de track { if (_positions.ElementAt(0).Value.Left == null && !MovingDriver.Equipment.IsBroken) //kan ik vooruit (naar het begin) { LapCompletedTest(MovingDriver); MovingDriver.LapTime += (stopwatch.Elapsed - MovingDriver.LapTime); if (MovingDriver.LapsCompleted == LapsAmount) //ronden zijn gereden, driver verdwijnt { ParticipantsOnTrack--; eindstand.AddLast((Driver)MovingDriver); //adds the finished driver to the eindstand list } else { _positions.ElementAt(0).Value.Left = MovingDriver; _positions.ElementAt(0).Value.DistanceLeft = leftDistance - 200; } data.DistanceLeft = 0; data.Left = null; //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged } else if (_positions.ElementAt(0).Value.Right == null && !MovingDriver.Equipment.IsBroken) //kan ik van baan wisselen (naar het begin) { LapCompletedTest(MovingDriver); MovingDriver.LapTime += (stopwatch.Elapsed - MovingDriver.LapTime); if (MovingDriver.LapsCompleted == LapsAmount) //ronden zijn gereden, driver verdwijnt { ParticipantsOnTrack--; eindstand.AddLast((Driver)MovingDriver); } else { _positions.ElementAt(0).Value.Right = MovingDriver; _positions.ElementAt(0).Value.DistanceRight = leftDistance - 200; } data.DistanceLeft = 0; data.Left = null; //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged } else { data.DistanceLeft = 0;//ik kan niet inhalen en niet doorrijden of isbroken: distance wordt gereset //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged } } else //hij is niet aan het einde { if (_positions.ElementAt(i + 1).Value.Left == null) //kan ik vooruit { _positions.ElementAt(i + 1).Value.Left = MovingDriver; _positions.ElementAt(i + 1).Value.DistanceLeft = leftDistance - 200; data.DistanceLeft = 0; data.Left = null; //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); break; } else if (_positions.ElementAt(i + 1).Value.Right == null) //kan ik van baan wisselen { _positions.ElementAt(i + 1).Value.Right = MovingDriver; _positions.ElementAt(i + 1).Value.DistanceRight = leftDistance - 200; data.DistanceLeft = 0; data.Left = null; //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); break; } else { data.DistanceLeft = 0; //ik kan niet inhalen en niet doorrijden : distance wordt gereset //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged } } } } } else { data.DistanceLeft += leftDistance; //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged } } if (data.Right != null) { int rightDistance = data.DistanceRight + getTravelDistanceOfDriver((Driver)data.Right); //berekent te reizen afstand. works if (rightDistance > 200) { for (int i = 0; i < _positions.Count; i++) { if (_positions.ElementAt(i).Value.Right == data.Right) //if the left contains the participant im looking for { var MovingDriver = _positions.ElementAt(i).Value.Right; ShouldBeBroken(MovingDriver.Equipment); //chance that this will break the car //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged if (i == _positions.Count - 1) //is hij aan het "einde" van de track { if (_positions.ElementAt(0).Value.Right == null && !MovingDriver.Equipment.IsBroken) //kan ik vooruit (naar het begin) { LapCompletedTest(MovingDriver); MovingDriver.LapTime += (stopwatch.Elapsed - MovingDriver.LapTime); if (MovingDriver.LapsCompleted == LapsAmount) //ronden zijn gereden, driver verdwijnt { ParticipantsOnTrack--; eindstand.AddLast((Driver)MovingDriver); } else { _positions.ElementAt(0).Value.Right = MovingDriver; _positions.ElementAt(0).Value.DistanceRight = rightDistance - 200; } data.DistanceRight = 0; data.Right = null; //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged } else if (_positions.ElementAt(0).Value.Left == null && !MovingDriver.Equipment.IsBroken) //kan ik van baan wisselen (naar het begin) { LapCompletedTest(MovingDriver); MovingDriver.LapTime += (stopwatch.Elapsed - MovingDriver.LapTime); if (MovingDriver.LapsCompleted == LapsAmount) //ronden zijn gereden, driver verdwijnt { ParticipantsOnTrack--; eindstand.AddLast((Driver)MovingDriver); } else { _positions.ElementAt(0).Value.Left = MovingDriver; _positions.ElementAt(0).Value.DistanceLeft = rightDistance - 200; } data.DistanceRight = 0; data.Right = null; //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged } else { data.DistanceRight = 0;//ik kan niet inhalen en niet doorrijden of isbroken: distance wordt gereset //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged } } else //hij is niet aan het einde { if (_positions.ElementAt(i + 1).Value.Right == null) //kan ik vooruit { _positions.ElementAt(i + 1).Value.Right = MovingDriver; _positions.ElementAt(i + 1).Value.DistanceRight = rightDistance - 200; data.DistanceRight = 0; data.Right = null; //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); break; } else if (_positions.ElementAt(i + 1).Value.Left == null) //kan ik van baan wisselen { _positions.ElementAt(i + 1).Value.Left = MovingDriver; _positions.ElementAt(i + 1).Value.DistanceLeft = rightDistance - 200; data.DistanceRight = 0; data.Right = null; //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); break; } else { data.DistanceRight = 0; //ik kan niet inhalen en niet doorrijden : distance wordt gereset //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged } } } } } else { data.DistanceRight += rightDistance; //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged } } } //GiveData(); Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged timer.Start(); if (RaceEnded_NoParticipantsLeft()) { timer.Stop(); stopwatch.Reset(); GiveData(); Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); CleanupDelegates(); Race_Finished?.Invoke(this, new RaceFinishedEventArgs() { Participants = Participants }); } }