public void deregisterListener(ProxSensor sensor) { if (ProxChannel.Listeners.Any(listener => listener.vessel.id == this.vessel.id && listener.channel == this.channel) == true) { MonoBehaviour.print(sensor.vessel.vesselName + " proximity alarm has been deregistered on channel " + sensor.channel); ProxChannel.Listeners.Remove(sensor); ProxChannel.Listeners.TrimExcess(); } }
private void updateDistance() { double testDistance = 0; double lastDistance = 0; ProxSensor closestSensor = null; //Set the last distance for the purpose of direction determination lastDistance = currentDistance; //Find closest target on our channel and set closestDistance foreach (var listener in ProxChannel.Listeners.ToList()) { if (this.vessel.id != listener.vessel.id) { testDistance = Vector3d.Distance(this.vessel.GetWorldPos3D(), listener.vessel.GetWorldPos3D()); //Set distance and listener to the values from the closest non-self sensor on the same channel as us if (listener.channel == this.channel && (testDistance < currentDistance || closestSensor == null)) { closestSensor = listener; currentDistance = testDistance; } } } //If no sensors detected, proceed no further if (closestSensor == null) { return; } //Determine if the vessel is approaching or departing departing = (currentDistance < lastDistance ? false : true); //Update target window size based on current velocity relative to target //If the target was just registered (AKA just entered 2.5km), it's velocity measurements are innacurate. Manually set to 0 until next pass. currentWindow = (closestSensor.justRegistered ? 0 : Math.Abs(currentDistance - lastDistance) * 1.05); //We now have one data point. Remove the justRegistered flag for the next pass if (closestSensor.justRegistered) { MonoBehaviour.print(closestSensor.vessel.name + " inelligible for proximity detection this time. Waiting for next pass."); } }