Index: messages.c
===================================================================
--- messages.c	(revision 11589)
+++ messages.c	(working copy)
@@ -46,13 +46,21 @@
 
 // Q3: "heartbeat QuakeArena-1\x0A"
 // DP: "heartbeat DarkPlaces\x0A"
+#ifdef ELITEFORCE
+#define S2M_HEARTBEAT "\\heartbeat\\"
+#else
 #define S2M_HEARTBEAT "heartbeat "
+#endif
 
 // Q3 & DP & QFusion: "getinfo A_Challenge"
 #define M2S_GETINFO "getinfo"
 
 // Q3 & DP & QFusion: "infoResponse\x0A\\pure\\1\\..."
+#ifdef ELITEFORCE
+#define S2M_INFORESPONSE "infoResponse "
+#else
 #define S2M_INFORESPONSE "infoResponse\x0A"
+#endif
 
 // Q3: "getservers 67 ffa empty full"
 // DP: "getservers DarkPlaces-Quake 3 empty full"
@@ -64,9 +72,15 @@
 // IOQuake3: "getserversExt 68 empty ipv6"
 #define C2M_GETSERVERSEXT "getserversExt "
 
+#ifdef ELITEFORCE
+// EliteForce:
+// "getserversResponse \"\\ABCDEFGH\\...(12 hex chars) ...\\EOT"
+#define M2C_GETSERVERSREPONSE "getserversResponse "
+#else
 // Q3 & DP & QFusion:
 // "getserversResponse\\...(6 bytes)...\\...(6 bytes)...\\EOT\0\0\0"
 #define M2C_GETSERVERSREPONSE "getserversResponse"
+#endif
 
 // DP & IOQuake3:
 // "getserversExtResponse\\...(6 bytes)...//...(18 bytes)...\\EOT\0\0\0"
@@ -88,6 +102,17 @@
 	size_t buffer_ind;
 	char c;
 
+	#ifdef ELITEFORCE
+	if(*infostring != '\\')
+	{
+		for(; *infostring && *infostring != '"'; infostring++);
+		
+		if(!*infostring)
+			return NULL;
+		infostring++;
+	}
+	#endif
+
 	if (*infostring++ != '\\')
 		return NULL;
 
@@ -120,7 +145,11 @@
 
 					if (c == '\0')
 						return NULL;
+#ifdef ELITEFORCE
+					if (c == '\\' || c == '"')
+#else
 					if (c == '\\')
+#endif
 						break;
 				}
 
@@ -140,7 +169,11 @@
 			{
 				c = *infostring++;
 
+#ifdef ELITEFORCE
+				if (c == '\0' || c == '\\' || c == '"')
+#else
 				if (c == '\0' || c == '\\')
+#endif
 				{
 					str_buffer[buffer_ind] = '\0';
 					return str_buffer;
@@ -250,7 +283,23 @@
 	qboolean flatlineHeartbeat;
 
 	// Extract the tag
+#ifdef ELITEFORCE
+	const char *tagptr = SearchInfostring(msg, "gamename");
+	unsigned short customPort = 0;
+
+	if(!tagptr)
+	{
+		Com_Printf (MSG_WARNING,
+					"> WARNING: Rejecting heartbeat from %s (no gamename specified)\n",
+					peer_address, tag);
+		return;
+	}
+	
+	snprintf(tag, sizeof(tag), "%s", tagptr);
+#else
 	sscanf (msg, "%63s", tag);
+#endif
+
 	Com_Printf (MSG_NORMAL, "> %s ---> heartbeat (%s)\n",
 				peer_address, tag);
 
@@ -288,6 +337,16 @@
 	else
 		game_props = NULL;
 
+	#ifdef ELITEFORCE
+	tagptr = SearchInfostring(msg, "heartbeat");
+	if(tagptr)
+		customPort = atoi(tagptr);
+	
+	//sockaddr_in and sockaddr_in6 have port information at same offset
+	if(customPort)
+		((struct sockaddr_in *) addr)->sin_port = htons(customPort);
+	#endif
+
 	// Get the server in the list (add it to the list if necessary)
 	server = Sv_GetByAddr (addr, addrlen, true);
 	if (server == NULL)
@@ -588,7 +647,11 @@
 		}
 
 		// If the packet doesn't have enough free space for this server
+#ifdef ELITEFORCE
+		next_sv_size = (sv->user.address.ss_family == AF_INET ? 12 : 18) + 1;
+#else
 		next_sv_size = (sv->user.address.ss_family == AF_INET ? 4 : 16) + 3;
+#endif
 		if (packetind + next_sv_size > sizeof (packet))
 		{
 			// Send the packet to the client
@@ -632,24 +695,34 @@
 			}
 
 			// Heading '\'
-			packet[packetind    ] = '\\';
+			packet[packetind++] = '\\';
 
+#ifdef ELITEFORCE
+			snprintf((char *) &packet[packetind], sizeof(packet) - packetind, "%02X%02X%02X%02X%02X%02X",
+				 ((unsigned char *) &sv_addr)[3],
+				 ((unsigned char *) &sv_addr)[2],
+				 ((unsigned char *) &sv_addr)[1],
+				 ((unsigned char *) &sv_addr)[0],
+	       			 ((unsigned char *) &sv_port)[1],
+				 ((unsigned char *) &sv_port)[0]);
+
+			packetind += 12;
+#else
 			// IP address
-			packet[packetind + 1] =  sv_addr >> 24;
-			packet[packetind + 2] = (sv_addr >> 16) & 0xFF;
-			packet[packetind + 3] = (sv_addr >>  8) & 0xFF;
-			packet[packetind + 4] =  sv_addr        & 0xFF;
+			packet[packetind++] =  sv_addr >> 24;
+			packet[packetind++] = (sv_addr >> 16) & 0xFF;
+			packet[packetind++] = (sv_addr >>  8) & 0xFF;
+			packet[packetind++] =  sv_addr        & 0xFF;
 
 			// Port
-			packet[packetind + 5] = sv_port >> 8;
-			packet[packetind + 6] = sv_port & 0xFF;
+			packet[packetind++] = sv_port >> 8;
+			packet[packetind++] = sv_port & 0xFF;
+#endif
 
 			Com_Printf (MSG_DEBUG, "  - Sending server %u.%u.%u.%u:%hu\n",
-						packet[packetind + 1], packet[packetind + 2],
-						packet[packetind + 3], packet[packetind + 4],
-						sv_port);
-
-			packetind += 7;
+					((unsigned char *) &sv_addr)[0], ((unsigned char *) &sv_addr)[1],
+					((unsigned char *) &sv_addr)[2], ((unsigned char *) &sv_addr)[3],
+					sv_port);
 		}
 		else
 		{
@@ -891,8 +964,12 @@
 	// If it's an heartbeat
 	if (!strncmp (S2M_HEARTBEAT, msg, strlen (S2M_HEARTBEAT)))
 	{
+#ifdef ELITEFORCE
+		HandleHeartbeat (msg, address, addrlen, recv_socket);
+#else
 		HandleHeartbeat (msg + strlen (S2M_HEARTBEAT), address, addrlen,
 						 recv_socket);
+#endif
 	}
 
 	// If it's an infoResponse message
Index: games.c
===================================================================
--- games.c	(revision 11589)
+++ games.c	(working copy)
@@ -149,11 +149,14 @@
 // ---------- Private constants ---------- //
 
 // Gamenames
+#ifdef ELITEFORCE
+#define GAMENAME_STEF   "EliteForce"	// Star Trek Voyager: Elite Force
+#else
 #define GAMENAME_Q3A	"Quake3Arena"	// Quake 3 Arena
 #define GAMENAME_RTCW	"wolfmp"		// Return to Castle Wolfenstein
 #define GAMENAME_WOET	"et"			// Wolfenstein: Enemy Territory
+#endif
 
-
 // ---------- Private types (game properties) ---------- //
 
 typedef struct
@@ -539,6 +542,17 @@
 
 	builtin_props_t builtin_props_array [] =
 	{
+#ifdef ELITEFORCE
+		// Elite Force
+		{
+			GAMENAME_STEF,
+			2,
+			{
+				"protocols=24,25,26",
+				"heartbeat=STEF1",
+			},
+		}
+#else
 		// Quake 3 Arena
 		{
 			GAMENAME_Q3A,
@@ -571,7 +585,7 @@
 				"flatline=ETFlatline-1",
 			},
 		},
-
+#endif
 	};
 
 	size_t game_count = sizeof (builtin_props_array) / sizeof (builtin_props_array[0]);
Index: Makefile
===================================================================
--- Makefile	(revision 11589)
+++ Makefile	(working copy)
@@ -15,7 +15,7 @@
 
 CC=gcc
 CFLAGS_COMMON=-Wall
-CFLAGS_DEBUG=$(CFLAGS_COMMON) -g
+CFLAGS_DEBUG=$(CFLAGS_COMMON) -g3 -ggdb3
 CFLAGS_RELEASE=$(CFLAGS_COMMON) -O2 -DNDEBUG
 OBJECTS=clients.o common.o dpmaster.o games.o messages.o servers.o system.o
 
@@ -40,17 +40,17 @@
 	$(CC) -o $@ $(OBJECTS) $(LDFLAGS)
 
 debug:
-	$(MAKE) EXE=$(UNIX_EXE) LDFLAGS="$(UNIX_LDFLAGS)" CFLAGS="$(CFLAGS_DEBUG)" $(UNIX_EXE) 
+	$(MAKE) EXE=$(UNIX_EXE) LDFLAGS="$(UNIX_LDFLAGS)" CFLAGS="$(CFLAGS_DEBUG) $(CFLAGS)" $(UNIX_EXE) 
 
 mingw-debug:
-	$(MAKE) EXE=$(WIN32_EXE) LDFLAGS="$(WIN32_LDFLAGS)" CFLAGS="$(WIN32_CFLAGS) $(CFLAGS_DEBUG)" $(WIN32_EXE)
+	$(MAKE) EXE=$(WIN32_EXE) LDFLAGS="$(WIN32_LDFLAGS)" CFLAGS="$(WIN32_CFLAGS) $(CFLAGS_DEBUG) $(CFLAGS)" $(WIN32_EXE)
 
 release:
-	$(MAKE) EXE=$(UNIX_EXE) LDFLAGS="$(UNIX_LDFLAGS)" CFLAGS="$(CFLAGS_RELEASE)" $(UNIX_EXE) 
+	$(MAKE) EXE=$(UNIX_EXE) LDFLAGS="$(UNIX_LDFLAGS)" CFLAGS="$(CFLAGS_RELEASE) $(CFLAGS)" $(UNIX_EXE) 
 	strip $(UNIX_EXE)
 
 mingw-release:
-	$(MAKE) EXE=$(WIN32_EXE) LDFLAGS="$(WIN32_LDFLAGS)" CFLAGS="$(WIN32_CFLAGS) $(CFLAGS_RELEASE)" $(WIN32_EXE)
+	$(MAKE) EXE=$(WIN32_EXE) LDFLAGS="$(WIN32_LDFLAGS)" CFLAGS="$(WIN32_CFLAGS) $(CFLAGS_RELEASE) $(CFLAGS)" $(WIN32_EXE)
 	strip $(WIN32_EXE)
 
 clean:

