//Edit the connectivity between two potential nodes
        protected override bool SetNodeConnection(CommNode a, CommNode b)
        {
            //stop links between ground stations
            if (a.isHome && b.isHome)
            {
                Disconnect(a, b, true);
                return(false);
            }

            List <short> aFreqs, bFreqs;

            //each CommNode has at least some frequencies?
            try
            {
                aFreqs = Cache.GetFrequencies(a);
                bFreqs = Cache.GetFrequencies(b);
            }
            catch (NullReferenceException e) // either CommNode could be a kerbal on EVA
            {
                Lib.Debug("Connection issue between '{0}' and '{1}'", a.name, b.name);
                Disconnect(a, b, true);
                return(false);
            }

            //share same frequency?
            for (int i = 0; i < aFreqs.Count; i++)
            {
                if (bFreqs.Contains(aFreqs[i]))
                {
                    AntennasByFrequency a_Antennas = Cache.GetNodeAntennaCache(a, aFreqs[i]);
                    AntennasByFrequency b_Antennas = Cache.GetNodeAntennaCache(b, aFreqs[i]);

                    if (a_Antennas.antennaPower + a_Antennas.relayPower == 0.0 || b_Antennas.antennaPower + b_Antennas.relayPower == 0.0)
                    {
                        Disconnect(a, b, true);
                        return(false);
                    }
                    Vector3d precisePosition1 = a.precisePosition;
                    Vector3d precisePosition2 = b.precisePosition;

                    double num      = (precisePosition2 - precisePosition1).sqrMagnitude;
                    double distance = a.distanceOffset + b.distanceOffset;
                    if (distance != 0.0)
                    {
                        distance = Math.Sqrt(num) + distance;
                        num      = distance <= 0.0 ? (distance = 0.0) : distance * distance;
                    }
                    bool bothRelay = CommNetScenario.RangeModel.InRange(a_Antennas.relayPower, b_Antennas.relayPower, num);
                    bool aCanRelay = bothRelay;
                    bool bCanRelay = bothRelay;
                    if (!bothRelay)
                    {
                        aCanRelay = CommNetScenario.RangeModel.InRange(a_Antennas.relayPower, b_Antennas.antennaPower, num);
                        bCanRelay = CommNetScenario.RangeModel.InRange(a_Antennas.antennaPower, b_Antennas.relayPower, num);
                    }
                    if (!aCanRelay && !bCanRelay)
                    {
                        Disconnect(a, b, true);
                        return(false);
                    }
                    if (num == 0.0 && (bothRelay || aCanRelay || bCanRelay))
                    {
                        return(TryConnectFreq(a, b, 1E-07, aCanRelay, bCanRelay, bothRelay, aFreqs[i]));
                    }
                    if (distance == 0.0)
                    {
                        distance = Math.Sqrt(num);
                    }
                    if (TestOcclusion(precisePosition1, a.occluder, precisePosition2, b.occluder, distance))
                    {
                        return(TryConnectFreq(a, b, distance, aCanRelay, bCanRelay, bothRelay, aFreqs[i]));
                    }

                    Disconnect(a, b, true);
                    return(false);
                }
            }

            Disconnect(a, b, true);
            return(false);
        }