+static qboolean masteravailable = false;
+static double nextheartbeattime = 0;
+static unsigned int nbtries = 6;
+
+
+/*
+====================
+Master_AllowHeartbeat
+
+Allow (or not) NET_Heartbeat to proceed depending on various factors
+====================
+*/
+qboolean Master_AllowHeartbeat (int priority)
+{
+ // We try "nbtries" times to contact a master server before giving up
+ if (! masteravailable)
+ {
+ if (!nbtries || realtime < nextheartbeattime)
+ return false;
+
+ nbtries--;
+ }
+ else
+ {
+ // if it's a state change, it can wait a little bit (30 sec max for now)
+ if (priority == 1 && nextheartbeattime - realtime > 30.0)
+ {
+ nextheartbeattime = realtime + 30.0;
+ return false;
+ }
+
+ if (priority <= 1 && realtime < nextheartbeattime)
+ return false;
+ }
+
+ // send an heartbeat every 3 minutes by default (every 5 sec if we haven't yet found a master server)
+ // TODO: some cvars would be better than hardcoded values
+ nextheartbeattime = realtime + (masteravailable ? (3.0 * 60.0) : 5.0);
+ return true;
+}
+