+static double nextheartbeattime = 0;
+
+
+/*
+====================
+Master_AllowHeartbeat
+
+Allow (or not) NET_Heartbeat to proceed depending on various factors
+====================
+*/
+qboolean Master_AllowHeartbeat (int priority)
+{
+ // LordHavoc: make advertising optional
+ if (!sv_public.integer)
+ return false;
+ // LordHavoc: don't advertise singleplayer games
+ if (svs.maxclients < 2)
+ return false;
+ // if it's a state change (client connected), limit next heartbeat to no
+ // more than 30 sec in the future
+ if (priority == 1 && nextheartbeattime > realtime + 30.0)
+ nextheartbeattime = realtime + 30.0;
+ if (priority <= 1 && realtime < nextheartbeattime)
+ return false;
+ // limit heartbeatperiod to 30 to 270 second range,
+ // lower limit is to avoid abusing master servers with excess traffic,
+ // upper limit is to avoid timing out on the master server (which uses
+ // 300 sec timeout)
+ if (sv_heartbeatperiod.value < 30)
+ Cvar_SetValueQuick(&sv_heartbeatperiod, 30);
+ if (sv_heartbeatperiod.value > 270)
+ Cvar_SetValueQuick(&sv_heartbeatperiod, 270);
+ // send a heartbeat as often as the admin wants
+ nextheartbeattime = realtime + sv_heartbeatperiod.value;
+ return true;
+}
+