summaryrefslogtreecommitdiff
path: root/src/engine/serverbrowser.cpp
diff options
context:
space:
mode:
authorxolatile2025-08-04 18:17:30 +0200
committerxolatile2025-08-04 18:17:30 +0200
commita89dca11cf475e0bd1399cf5d5c5135d00495ec3 (patch)
tree4d551a7f4193bc89a0b8560e955f4f874101b388 /src/engine/serverbrowser.cpp
parent9d533fa4d82935a083ff93a09aed95baea9fbfd4 (diff)
downloadxolatile-badassbug-a89dca11cf475e0bd1399cf5d5c5135d00495ec3.tar.xz
xolatile-badassbug-a89dca11cf475e0bd1399cf5d5c5135d00495ec3.tar.zst
Minor changes...
Diffstat (limited to 'src/engine/serverbrowser.cpp')
-rw-r--r--src/engine/serverbrowser.cpp50
1 files changed, 26 insertions, 24 deletions
diff --git a/src/engine/serverbrowser.cpp b/src/engine/serverbrowser.cpp
index 281b0dc..ee36eea 100644
--- a/src/engine/serverbrowser.cpp
+++ b/src/engine/serverbrowser.cpp
@@ -2,6 +2,8 @@
#include "engine.h"
+#define PROTOCOL_VERSION 260 // bump when protocol changes, dpulicate
+
struct resolverthread
{
SDL_Thread *thread;
@@ -88,7 +90,7 @@ void resolverstop(resolverthread &rt)
rt.query = NULL;
rt.starttime = 0;
SDL_UnlockMutex(resolvermutex);
-}
+}
void resolverclear()
{
@@ -129,12 +131,12 @@ bool resolvercheck(const char **name, ENetAddress *address)
else loopv(resolverthreads)
{
resolverthread &rt = resolverthreads[i];
- if(rt.query && totalmillis - rt.starttime > RESOLVERLIMIT)
+ if(rt.query && totalmillis - rt.starttime > RESOLVERLIMIT)
{
resolverstop(rt);
*name = rt.query;
resolved = true;
- }
+ }
}
SDL_UnlockMutex(resolvermutex);
return resolved;
@@ -152,10 +154,10 @@ bool resolverwait(const char *name, ENetAddress *address)
SDL_CondSignal(querycond);
int starttime = SDL_GetTicks(), timeout = 0;
bool resolved = false;
- for(;;)
+ for(;;)
{
SDL_CondWaitTimeout(resultcond, resolvermutex, 250);
- loopv(resolverresults) if(resolverresults[i].query == name)
+ loopv(resolverresults) if(resolverresults[i].query == name)
{
address->host = resolverresults[i].address.host;
resolverresults.remove(i);
@@ -163,11 +165,11 @@ bool resolverwait(const char *name, ENetAddress *address)
break;
}
if(resolved) break;
-
+
timeout = SDL_GetTicks() - starttime;
renderprogress(min(float(timeout)/RESOLVERLIMIT, 1.0f), text);
if(interceptkey(SDLK_ESCAPE)) timeout = RESOLVERLIMIT + 1;
- if(timeout > RESOLVERLIMIT) break;
+ if(timeout > RESOLVERLIMIT) break;
}
if(!resolved && timeout > RESOLVERLIMIT)
{
@@ -213,7 +215,7 @@ int connectwithtimeout(ENetSocket sock, const char *hostname, const ENetAddress
return -1;
}
-
+
struct pingattempts
{
enum { MAXATTEMPTS = 2 };
@@ -224,7 +226,7 @@ struct pingattempts
void clearattempts() { memset(attempts, 0, sizeof(attempts)); }
- void setoffset() { offset = 1 + rnd(0xFFFFFF); }
+ void setoffset() { offset = 1 + rnd(0xFFFFFF); }
int encodeping(int millis)
{
@@ -261,8 +263,8 @@ enum { UNRESOLVED = 0, RESOLVING, RESOLVED };
struct serverinfo : pingattempts
{
- enum
- {
+ enum
+ {
WAITING = INT_MAX,
MAXPINGS = 3
@@ -334,8 +336,8 @@ struct serverinfo : pingattempts
static bool compare(serverinfo *a, serverinfo *b)
{
- bool ac = server::servercompatible(a->name, a->sdesc, a->map, a->ping, a->attr, a->numplayers),
- bc = server::servercompatible(b->name, b->sdesc, b->map, b->ping, b->attr, b->numplayers);
+ bool ac = (a->attr.length() != 0) && (a->attr[0]==PROTOCOL_VERSION);
+ bool bc = (b->attr.length() != 0) && (b->attr[0]==PROTOCOL_VERSION);
if(ac > bc) return true;
if(bc > ac) return false;
if(a->keep > b->keep) return true;
@@ -415,7 +417,7 @@ template<size_t N> static inline void buildping(ENetBuffer &buf, uchar (&ping)[N
void pingservers()
{
- if(pingsock == ENET_SOCKET_NULL)
+ if(pingsock == ENET_SOCKET_NULL)
{
pingsock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM);
if(pingsock == ENET_SOCKET_NULL)
@@ -441,7 +443,7 @@ void pingservers()
if(si.address.host == ENET_HOST_ANY) continue;
buildping(buf, ping, si);
enet_socket_send(pingsock, &si.address, &buf, 1);
-
+
si.checkdecay(servpingdecay);
}
if(searchlan)
@@ -454,7 +456,7 @@ void pingservers()
}
lastinfo = totalmillis;
}
-
+
void checkresolver()
{
int resolving = 0;
@@ -480,7 +482,7 @@ void checkresolver()
serverinfo &si = *servers[i];
if(name == si.name)
{
- si.resolved = RESOLVED;
+ si.resolved = RESOLVED;
si.address.host = addr.host;
break;
}
@@ -498,12 +500,12 @@ void checkpings()
ENetAddress addr;
uchar ping[MAXTRANS];
char text[MAXTRANS];
- buf.data = ping;
+ buf.data = ping;
buf.dataLength = sizeof(ping);
while(enet_socket_wait(pingsock, &events, 0) >= 0 && events)
{
int len = enet_socket_receive(pingsock, &addr, &buf, 1);
- if(len <= 0) return;
+ if(len <= 0) return;
ucharbuf p(ping, len);
int millis = getint(p);
serverinfo *si = NULL;
@@ -516,7 +518,7 @@ void checkpings()
else if(!searchlan || !lanpings.checkattempt(millis, false)) continue;
else
{
- si = newserver(NULL, server::serverport(addr.port), addr.host);
+ si = newserver(NULL, server::serverport(addr.port), addr.host);
millis = lanpings.decodeping(millis);
}
int rtt = clamp(totalmillis - millis, 0, min(servpingdecay, totalmillis));
@@ -545,7 +547,7 @@ void refreshservers()
{
static int lastrefresh = 0;
if(lastrefresh==totalmillis) return;
- if(totalmillis - lastrefresh > 1000)
+ if(totalmillis - lastrefresh > 1000)
{
loopv(servers) servers[i]->reset();
lastreset = totalmillis;
@@ -633,7 +635,7 @@ void retrieveservers(vector<char> &data)
while(reqlen > 0)
{
enet_uint32 events = ENET_SOCKET_WAIT_SEND;
- if(enet_socket_wait(sock, &events, 250) >= 0 && events)
+ if(enet_socket_wait(sock, &events, 250) >= 0 && events)
{
buf.data = (void *)req;
buf.dataLength = reqlen;
@@ -737,10 +739,10 @@ void writeservercfg()
}
if(kept) f->printf("\n");
f->printf("// servers connected to are added here automatically\n\n");
- loopv(servers)
+ loopv(servers)
{
serverinfo *s = servers[i];
- if(!s->keep)
+ if(!s->keep)
{
if(s->password) f->printf("addserver %s %d %s\n", escapeid(s->name), s->port, escapestring(s->password));
else f->printf("addserver %s %d\n", escapeid(s->name), s->port);