diff --git a/source/src/client.cpp b/source/src/client.cpp index a49ee4d9..0ae294ed 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -60,7 +60,7 @@ void abortconnect() clienthost = NULL; } -void connects(char *servername, char *port, char *password) +void connects(char *servername, char *serverport, char *password) { if(connpeer) { @@ -71,12 +71,12 @@ void connects(char *servername, char *port, char *password) s_strcpy(clientpassword, password ? password : ""); ENetAddress address; - int p = atoi(port); + int p = atoi(serverport); address.port = p > 0 ? p : CUBE_DEFAULT_SERVER_PORT; if(servername) { - addserver(servername); + addserver(servername, serverport); conoutf("attempting to connect to %s", servername); if(!resolverwait(servername, &address)) { diff --git a/source/src/cube.h b/source/src/cube.h index 8aa0327d..c0445751 100644 --- a/source/src/cube.h +++ b/source/src/cube.h @@ -91,7 +91,7 @@ extern int hwtexsize; #include "protos.h" // external function decls -#define AC_VERSION 930 +#define AC_VERSION 940 #endif diff --git a/source/src/protocol.h b/source/src/protocol.h index b9d0e8ff..fcdadb57 100644 --- a/source/src/protocol.h +++ b/source/src/protocol.h @@ -2,7 +2,7 @@ #define DEFAULTCLIENTS 6 #define MAXTRANS 5000 // max amount of data to swallow in 1 go #define CUBE_DEFAULT_SERVER_PORT 28763 -#define CUBE_SERVINFO_PORT 28764 +#define CUBE_SERVINFO_PORT(serverport) (serverport+1) #define PROTOCOL_VERSION 1126 // bump when protocol changes // network messages codes, c2s, c2c, s2c diff --git a/source/src/protos.h b/source/src/protos.h index 34e6b587..5afdc099 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -49,7 +49,7 @@ extern void menuselect(void *menu, int sel); extern void drawmenubg(int x1, int y1, int x2, int y2, bool border); // serverbrowser -extern void addserver(char *servername); +extern void addserver(char *servername, char *serverport); extern char *getservername(int n); extern bool resolverwait(const char *name, ENetAddress *address); extern int connectwithtimeout(ENetSocket sock, char *hostname, ENetAddress &remoteaddress); @@ -105,7 +105,7 @@ extern void renderstripssky(); extern void renderstrips(); // client -extern void connects(char *servername, char *port = NULL, char *password = NULL); +extern void connects(char *servername, char *serverport = NULL, char *password = NULL); extern void abortconnect(); extern void disconnect(int onlyclean = 0, int async = 0); extern void toserver(char *text); @@ -374,7 +374,7 @@ extern void startintermission(); extern void restoreserverstate(vector &ents); extern uchar *retrieveservers(uchar *buf, int buflen); extern char msgsizelookup(int msg); -extern void serverms(int mode, int numplayers, int minremain, char *smapname, int millis); -extern void servermsinit(const char *master, char *ip, char *sdesc, bool listen); +extern void serverms(int mode, int numplayers, int minremain, char *smapname, int millis, int serverport); +extern void servermsinit(const char *master, char *ip, int serverport, char *sdesc, bool listen); extern bool serverpickup(int i, int sender); diff --git a/source/src/server.cpp b/source/src/server.cpp index b3156dcd..4529696a 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -1725,7 +1725,7 @@ void serverslice(uint timeout) // main server update, called from cube main lo if(!isdedicated) return; // below is network only - serverms(smode, numclients(), minremain, smapname, servmillis); + serverms(smode, numclients(), minremain, smapname, servmillis, serverhost->address.port); if(servmillis-laststatus>60*1000) // display bandwidth stats, useful for server ops { @@ -1802,15 +1802,15 @@ void localconnect() } #endif -void initserver(bool dedicated, int uprate, char *sdesc, char *ip, int port, char *master, char *passwd, int maxcl, char *maprot, char *adminpwd, char *srvmsg, int scthreshold) +void initserver(bool dedicated, int uprate, char *sdesc, char *ip, int serverport, char *master, char *passwd, int maxcl, char *maprot, char *adminpwd, char *srvmsg, int scthreshold) { if(passwd) s_strcpy(serverpassword, passwd); maxclients = maxcl > 0 ? min(maxcl, MAXCLIENTS) : DEFAULTCLIENTS; - servermsinit(master ? master : "masterserver.cubers.net/cgi-bin/actioncube.pl/", ip, sdesc, dedicated); + servermsinit(master ? master : "masterserver.cubers.net/cgi-bin/actioncube.pl/", ip, CUBE_SERVINFO_PORT(serverport), sdesc, dedicated); if(isdedicated = dedicated) { - ENetAddress address = { ENET_HOST_ANY, port > 0 ? port : CUBE_DEFAULT_SERVER_PORT }; + ENetAddress address = { ENET_HOST_ANY, serverport }; if(*ip && enet_address_set_host(&address, ip)<0) printf("WARNING: server ip not resolved"); serverhost = enet_host_create(&address, maxclients+1, 0, uprate); if(!serverhost) fatal("could not create server host\n"); @@ -1881,7 +1881,7 @@ int main(int argc, char **argv) } if(enet_initialize()<0) fatal("Unable to initialise network module"); - initserver(true, uprate, sdesc, ip, port, master, passwd, maxcl, maprot, adminpasswd, srvmsg, scthreshold); + initserver(true, uprate, sdesc, ip, port > 0 ? port : CUBE_DEFAULT_SERVER_PORT, master, passwd, maxcl, maprot, adminpasswd, srvmsg, scthreshold); return EXIT_SUCCESS; } #endif diff --git a/source/src/serverbrowser.cpp b/source/src/serverbrowser.cpp index d6c81a8c..963591b5 100644 --- a/source/src/serverbrowser.cpp +++ b/source/src/serverbrowser.cpp @@ -46,7 +46,8 @@ int resolverloop(void * data) rt->starttime = lastmillis; SDL_UnlockMutex(resolvermutex); - ENetAddress address = { ENET_HOST_ANY, CUBE_SERVINFO_PORT }; + //ENetAddress address = { ENET_HOST_ANY, CUBE_SERVINFO_PORT }; + ENetAddress address = { ENET_HOST_ANY, ENET_PORT_ANY }; enet_address_set_host(&address, rt->query); SDL_LockMutex(resolvermutex); @@ -290,7 +291,7 @@ struct serverinfo string map; string sdesc; string cmd; - int mode, numplayers, maxclients, ping, protocol, minremain, resolved; + int mode, numplayers, maxclients, ping, protocol, minremain, resolved, port; ENetAddress address; }; @@ -302,11 +303,12 @@ int lastinfo = 0; char *getservername(int n) { return servers[n].name; } -void addserver(char *servername) +void addserver(char *servername, char *serverport) { - loopv(servers) if(strcmp(servers[i].name, servername)==0) return; + loopv(servers) if(strcmp(servers[i].name, servername)==0 && servers[i].port == atoi(serverport)) return; serverinfo &si = servers.insert(0, serverinfo()); si.name = newstring(servername); + si.port = atoi(serverport); si.full[0] = 0; si.mode = 0; si.numplayers = 0; @@ -318,7 +320,7 @@ void addserver(char *servername) si.sdesc[0] = 0; si.resolved = UNRESOLVED; si.address.host = ENET_HOST_ANY; - si.address.port = CUBE_SERVINFO_PORT; + si.address.port = CUBE_SERVINFO_PORT(si.port); } void pingservers() @@ -354,7 +356,8 @@ void checkresolver() if(!resolving) return; const char *name = NULL; - ENetAddress addr = { ENET_HOST_ANY, CUBE_SERVINFO_PORT }; + //ENetAddress addr = { ENET_HOST_ANY, CUBE_SERVINFO_PORT }; + ENetAddress addr = { ENET_HOST_ANY, ENET_PORT_ANY }; while(resolvercheck(&name, &addr)) { loopv(servers) @@ -415,7 +418,10 @@ int sicompare(const serverinfo *a, const serverinfo *b) if(a->numplayers>b->numplayers) return -1; if(a->ping>b->ping) return 1; if(a->pingping) return -1; - return strcmp(a->name, b->name); + int namecmp = strcmp(a->name, b->name); + if(namecmp) return namecmp; + if(a->port>b->port) return 1; + else return -1; } void *servmenu = NULL; @@ -442,15 +448,15 @@ void refreshservers(void *menu, bool init) serverinfo &si = servers[i]; if(si.address.host != ENET_HOST_ANY && si.ping != 9999) { - if(si.protocol!=PROTOCOL_VERSION) s_sprintf(si.full)("%s [%s protocol]", si.name, si.protocol