protected virtual string CreateWelcomeMessage(DriverInfo driverReport) { if (!string.IsNullOrWhiteSpace(this.WelcomeMessage)) { return this.WelcomeMessage.Replace("$DriverName$", driverReport.DriverName).Replace("$ServerName$", this.PluginManager.CurrentSession.ServerName); } return null; }
/// <summary> /// Computes the distance to the closest opponent. /// </summary> /// <param name="driver">The driver.</param> /// <param name="opponent">The closest opponent.</param> /// <returns>The distance in meters.</returns> public float GetDistanceToClosestOpponent(DriverInfo driver, out DriverInfo opponent) { opponent = this.Drivers.Where(d => d != driver && Math.Abs(d.LastPositionUpdate - driver.LastPositionUpdate) < 2 * RealtimeUpdateInterval) .OrderBy(d => (d.LastPosition - driver.LastPosition).Length()).FirstOrDefault(); if (opponent != null) { return((opponent.LastPosition - driver.LastPosition).Length()); } else { return(float.MaxValue); } }
protected internal virtual void OnCarUpdate(DriverInfo driverInfo) { }
protected override void OnCarUpdate(DriverInfo di) { if (!_distancesToReport.ContainsKey(di)) _distancesToReport.Add(di, new MRDistanceHelper()); var dh = _distancesToReport[di]; // Generally, the meters driven are stored dh.MetersDriven += di.LastDistanceTraveled; // To protect this from some simple 1st gear driving together in combat range to grind stuff, we'll only allow Attack & Combat range // recording if there is acceleration. 3 or 5 are quite little values, even for slow cars like the GT86 if (Math.Abs(di.CurrentAcceleration) > 2.0f && di.CurrentDistanceToClosestCar != 0) { // Then we'll check this interval (we're talking about a second or similar) // for driving in attack range (let's say.. inside 20m) or even combating (maybe 8m) if (di.CurrentDistanceToClosestCar < 8) dh.MetersCombatRange += di.LastDistanceTraveled; else if (di.CurrentDistanceToClosestCar < 20) dh.MetersAttackRange += di.LastDistanceTraveled; } }
private void SendDistance(DriverInfo di, bool forced = false) { if (!_distancesToReport.ContainsKey(di)) _distancesToReport.Add(di, new MRDistanceHelper()); var distanceCached = _distancesToReport[di]; // Then we'll do it in different resolutions; the first meters are more important than the later ones if (di.Distance > REGULAR_DISTANCE && distanceCached.MetersDriven > 2000 || forced) // After 2km, we'll just report in big chunks - or if forced { PluginManager.Log(DateTime.Now.TimeOfDay.ToString() + "- Send DistanceDriven: " + di.CarId + ": " + distanceCached.MetersDriven); HandleClientActions(LiveDataServer.DistanceDriven(CurrentSessionGuid, di.CarId, distanceCached)); _distancesToReport[di] = new MRDistanceHelper(); } else if (di.Distance < REGULAR_DISTANCE && distanceCached.MetersDriven > 200) // 200m is about "left pits", so we'll report this until { PluginManager.Log(DateTime.Now.TimeOfDay.ToString() + "- Send DistanceDriven: " + di.CarId + ": " + distanceCached.MetersDriven); HandleClientActions(LiveDataServer.DistanceDriven(CurrentSessionGuid, di.CarId, distanceCached)); _distancesToReport[di] = new MRDistanceHelper(); } }