summaryrefslogtreecommitdiff
path: root/src/engine/server.cpp
diff options
context:
space:
mode:
authorxolatile2025-08-06 22:54:55 +0200
committerxolatile2025-08-06 22:54:55 +0200
commit0a1172b75f571685c264a8b9d8ee224bbf11381f (patch)
treed041fdc68a60f0ebb48a3852bbcce6d9432f83d5 /src/engine/server.cpp
parentaffde05dc07a94643f1fd2751b2b441f57f73d7d (diff)
downloadxolatile-badassbug-0a1172b75f571685c264a8b9d8ee224bbf11381f.tar.xz
xolatile-badassbug-0a1172b75f571685c264a8b9d8ee224bbf11381f.tar.zst
Please do not hate me, it makes sense...
Diffstat (limited to 'src/engine/server.cpp')
-rw-r--r--src/engine/server.cpp349
1 files changed, 105 insertions, 244 deletions
diff --git a/src/engine/server.cpp b/src/engine/server.cpp
index 7e338b3..29761e1 100644
--- a/src/engine/server.cpp
+++ b/src/engine/server.cpp
@@ -7,25 +7,20 @@
static FILE *logfile = NULL;
-void closelogfile()
-{
- if(logfile)
- {
+void closelogfile() {
+ if(logfile) {
fclose(logfile);
logfile = NULL;
}
}
-FILE *getlogfile()
-{
+FILE *getlogfile() {
return logfile ? logfile : stdout;
}
-void setlogfile(const char *fname)
-{
+void setlogfile(const char *fname) {
closelogfile();
- if(fname && fname[0])
- {
+ if(fname && fname[0]) {
fname = findfile(fname, "w");
if(fname) logfile = fopen(fname, "w");
}
@@ -33,8 +28,7 @@ void setlogfile(const char *fname)
if(f) setvbuf(f, NULL, _IOLBF, BUFSIZ);
}
-void logoutf(const char *fmt, ...)
-{
+void logoutf(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
logoutfv(fmt, args);
@@ -42,28 +36,24 @@ void logoutf(const char *fmt, ...)
}
-static void writelog(FILE *file, const char *buf)
-{
+static void writelog(FILE *file, const char *buf) {
static uchar ubuf[512];
size_t len = strlen(buf), carry = 0;
- while(carry < len)
- {
+ while(carry < len) {
size_t numu = encodeutf8(ubuf, sizeof(ubuf)-1, &((const uchar *)buf)[carry], len - carry, &carry);
if(carry >= len) ubuf[numu++] = '\n';
fwrite(ubuf, 1, numu, file);
}
}
-static void writelogv(FILE *file, const char *fmt, va_list args)
-{
+static void writelogv(FILE *file, const char *fmt, va_list args) {
static char buf[LOGSTRLEN];
vformatstring(buf, fmt, args, sizeof(buf));
writelog(file, buf);
}
#ifdef STANDALONE
-void fatal(const char *fmt, ...)
-{
+void fatal(const char *fmt, ...) {
void cleanupserver();
cleanupserver();
defvformatstring(msg,fmt,fmt);
@@ -73,8 +63,7 @@ void fatal(const char *fmt, ...)
exit(EXIT_FAILURE);
}
-void conoutfv(int type, const char *fmt, va_list args)
-{
+void conoutfv(int type, const char *fmt, va_list args) {
logoutfv(fmt, args);
}
#endif
@@ -83,8 +72,7 @@ void conoutfv(int type, const char *fmt, va_list args)
enum { ST_EMPTY, ST_LOCAL, ST_TCPIP };
-struct client // server side version of "dynent" type
-{
+struct client { // server side version of "dynent" type {
int type;
int num;
ENetPeer *peer;
@@ -103,53 +91,44 @@ int localclients = 0, nonlocalclients = 0;
bool hasnonlocalclients() { return nonlocalclients!=0; }
bool haslocalclients() { return localclients!=0; }
-client &addclient(int type)
-{
+client &addclient(int type) {
client *c = NULL;
- loopv(clients) if(clients[i]->type==ST_EMPTY)
- {
+ loopv(clients) if(clients[i]->type==ST_EMPTY) {
c = clients[i];
break;
}
- if(!c)
- {
+ if(!c) {
c = new client;
c->num = clients.length();
clients.add(c);
}
c->info = server::newclientinfo();
c->type = type;
- switch(type)
- {
+ switch(type) {
case ST_TCPIP: nonlocalclients++; break;
case ST_LOCAL: localclients++; break;
}
return *c;
}
-void delclient(client *c)
-{
+void delclient(client *c) {
if(!c) return;
- switch(c->type)
- {
+ switch(c->type) {
case ST_TCPIP: nonlocalclients--; if(c->peer) c->peer->data = NULL; break;
case ST_LOCAL: localclients--; break;
case ST_EMPTY: return;
}
c->type = ST_EMPTY;
c->peer = NULL;
- if(c->info)
- {
+ if(c->info) {
server::deleteclientinfo(c->info);
c->info = NULL;
}
}
-void cleanupserver()
-{
+void cleanupserver() {
if(serverhost) enet_host_destroy(serverhost);
serverhost = NULL;
-
if(pongsock != ENET_SOCKET_NULL) enet_socket_destroy(pongsock);
if(lansock != ENET_SOCKET_NULL) enet_socket_destroy(lansock);
pongsock = lansock = ENET_SOCKET_NULL;
@@ -167,18 +146,14 @@ ENetPeer *getclientpeer(int i) { return clients.inrange(i) && clients[i]->type==
int getnumclients() { return clients.length(); }
uint getclientip(int n) { return clients.inrange(n) && clients[n]->type==ST_TCPIP ? clients[n]->peer->address.host : 0; }
-void sendpacket(int n, int chan, ENetPacket *packet, int exclude)
-{
- if(n<0)
- {
+void sendpacket(int n, int chan, ENetPacket *packet, int exclude) {
+ if(n<0) {
server::recordpacket(chan, packet->data, packet->dataLength);
loopv(clients) if(i!=exclude && server::allowbroadcast(i)) sendpacket(i, chan, packet);
return;
}
- switch(clients[n]->type)
- {
- case ST_TCPIP:
- {
+ switch(clients[n]->type) {
+ case ST_TCPIP: {
enet_peer_send(clients[n]->peer, chan, packet);
break;
}
@@ -191,43 +166,35 @@ void sendpacket(int n, int chan, ENetPacket *packet, int exclude)
}
}
-ENetPacket *sendf(int cn, int chan, const char *format, ...)
-{
+ENetPacket *sendf(int cn, int chan, const char *format, ...) {
int exclude = -1;
bool reliable = false;
if(*format=='r') { reliable = true; ++format; }
packetbuf p(MAXTRANS, reliable ? ENET_PACKET_FLAG_RELIABLE : 0);
va_list args;
va_start(args, format);
- while(*format) switch(*format++)
- {
+ while(*format) switch(*format++) {
case 'x':
exclude = va_arg(args, int);
break;
-
- case 'v':
- {
+ case 'v': {
int n = va_arg(args, int);
int *v = va_arg(args, int *);
loopi(n) putint(p, v[i]);
break;
}
-
- case 'i':
- {
+ case 'i': {
int n = isdigit(*format) ? *format++-'0' : 1;
loopi(n) putint(p, va_arg(args, int));
break;
}
- case 'f':
- {
+ case 'f': {
int n = isdigit(*format) ? *format++-'0' : 1;
loopi(n) putfloat(p, (float)va_arg(args, double));
break;
}
case 's': sendstring(va_arg(args, const char *), p); break;
- case 'm':
- {
+ case 'm': {
int n = va_arg(args, int);
p.put(va_arg(args, uchar *), n);
break;
@@ -239,26 +206,20 @@ ENetPacket *sendf(int cn, int chan, const char *format, ...)
return packet->referenceCount > 0 ? packet : NULL;
}
-ENetPacket *sendfile(int cn, int chan, stream *file, const char *format, ...)
-{
- if(cn < 0)
- {
+ENetPacket *sendfile(int cn, int chan, stream *file, const char *format, ...) {
+ if(cn < 0) {
#ifdef STANDALONE
return NULL;
#endif
}
else if(!clients.inrange(cn)) return NULL;
-
int len = (int)min(file->size(), stream::offset(INT_MAX));
if(len <= 0 || len > 16<<20) return NULL;
-
packetbuf p(MAXTRANS+len, ENET_PACKET_FLAG_RELIABLE);
va_list args;
va_start(args, format);
- while(*format) switch(*format++)
- {
- case 'i':
- {
+ while(*format) switch(*format++) {
+ case 'i': {
int n = isdigit(*format) ? *format++-'0' : 1;
loopi(n) putint(p, va_arg(args, int));
break;
@@ -267,10 +228,8 @@ ENetPacket *sendfile(int cn, int chan, stream *file, const char *format, ...)
case 'l': putint(p, len); break;
}
va_end(args);
-
file->seek(0, SEEK_SET);
file->read(p.subbuf(len).buf, len);
-
ENetPacket *packet = p.finalize();
if(cn >= 0) sendpacket(cn, chan, packet, -1);
#ifndef STANDALONE
@@ -279,10 +238,8 @@ ENetPacket *sendfile(int cn, int chan, stream *file, const char *format, ...)
return packet->referenceCount > 0 ? packet : NULL;
}
-const char *disconnectreason(int reason)
-{
- switch(reason)
- {
+const char *disconnectreason(int reason) {
+ switch(reason) {
case DISC_EOP: return "end of packet";
case DISC_LOCAL: return "server is in local mode";
case DISC_KICK: return "kicked/banned";
@@ -297,8 +254,7 @@ const char *disconnectreason(int reason)
}
}
-void disconnect_client(int n, int reason)
-{
+void disconnect_client(int n, int reason) {
if(!clients.inrange(n) || clients[n]->type!=ST_TCPIP) return;
enet_peer_disconnect(clients[n]->peer, reason);
server::clientdisconnect(n);
@@ -311,33 +267,28 @@ void disconnect_client(int n, int reason)
server::sendservmsg(s);
}
-void kicknonlocalclients(int reason)
-{
+void kicknonlocalclients(int reason) {
loopv(clients) if(clients[i]->type==ST_TCPIP) disconnect_client(i, reason);
}
-void process(ENetPacket *packet, int sender, int chan) // sender may be -1
-{
+void process(ENetPacket *packet, int sender, int chan) { // sender may be -1 {
packetbuf p(packet);
server::parsepacket(sender, chan, p);
if(p.overread()) { disconnect_client(sender, DISC_EOP); return; }
}
-void localclienttoserver(int chan, ENetPacket *packet)
-{
+void localclienttoserver(int chan, ENetPacket *packet) {
client *c = NULL;
loopv(clients) if(clients[i]->type==ST_LOCAL) { c = clients[i]; break; }
if(c) process(packet, c->num, chan);
}
#ifdef STANDALONE
-bool resolverwait(const char *name, ENetAddress *address)
-{
+bool resolverwait(const char *name, ENetAddress *address) {
return enet_address_set_host(address, name) >= 0;
}
-int connectwithtimeout(ENetSocket sock, const char *hostname, const ENetAddress &remoteaddress)
-{
+int connectwithtimeout(ENetSocket sock, const char *hostname, const ENetAddress &remoteaddress) {
return enet_socket_connect(sock, &remoteaddress);
}
#endif
@@ -349,48 +300,38 @@ vector<char> masterout, masterin;
int masteroutpos = 0, masterinpos = 0;
VARN(updatemaster, allowupdatemaster, 0, 1, 1);
-void disconnectmaster()
-{
- if(mastersock != ENET_SOCKET_NULL)
- {
+void disconnectmaster() {
+ if(mastersock != ENET_SOCKET_NULL) {
server::masterdisconnected();
enet_socket_destroy(mastersock);
mastersock = ENET_SOCKET_NULL;
}
-
masterout.setsize(0);
masterin.setsize(0);
masteroutpos = masterinpos = 0;
-
masteraddress.host = ENET_HOST_ANY;
masteraddress.port = ENET_PORT_ANY;
-
lastupdatemaster = masterconnecting = masterconnected = 0;
}
SVARF(mastername, server::defaultmaster(), disconnectmaster());
VARF(masterport, 1, server::masterport(), 0xFFFF, disconnectmaster());
-ENetSocket connectmaster(bool wait)
-{
+ENetSocket connectmaster(bool wait) {
if(!mastername[0]) return ENET_SOCKET_NULL;
- if(masteraddress.host == ENET_HOST_ANY)
- {
+ if(masteraddress.host == ENET_HOST_ANY) {
if(isdedicatedserver()) logoutf("looking up %s...", mastername);
masteraddress.port = masterport;
if(!resolverwait(mastername, &masteraddress)) return ENET_SOCKET_NULL;
}
ENetSocket sock = enet_socket_create(ENET_SOCKET_TYPE_STREAM);
- if(sock == ENET_SOCKET_NULL)
- {
+ if(sock == ENET_SOCKET_NULL) {
if(isdedicatedserver()) logoutf("could not open master server socket");
return ENET_SOCKET_NULL;
}
- if(wait || serveraddress.host == ENET_HOST_ANY || !enet_socket_bind(sock, &serveraddress))
- {
+ if(wait || serveraddress.host == ENET_HOST_ANY || !enet_socket_bind(sock, &serveraddress)) {
enet_socket_set_option(sock, ENET_SOCKOPT_NONBLOCK, 1);
- if(wait)
- {
+ if(wait) {
if(!connectwithtimeout(sock, mastername, masteraddress)) return sock;
}
else if(!enet_socket_connect(sock, &masteraddress)) return sock;
@@ -400,78 +341,60 @@ ENetSocket connectmaster(bool wait)
return ENET_SOCKET_NULL;
}
-bool requestmaster(const char *req)
-{
- if(mastersock == ENET_SOCKET_NULL)
- {
+bool requestmaster(const char *req) {
+ if(mastersock == ENET_SOCKET_NULL) {
mastersock = connectmaster(false);
if(mastersock == ENET_SOCKET_NULL) return false;
lastconnectmaster = masterconnecting = totalmillis ? totalmillis : 1;
}
-
if(masterout.length() >= 4096) return false;
-
masterout.put(req, strlen(req));
return true;
}
-bool requestmasterf(const char *fmt, ...)
-{
+bool requestmasterf(const char *fmt, ...) {
defvformatstring(req, fmt, fmt);
return requestmaster(req);
}
-void processmasterinput()
-{
+void processmasterinput() {
if(masterinpos >= masterin.length()) return;
-
char *input = &masterin[masterinpos], *end = (char *)memchr(input, '\n', masterin.length() - masterinpos);
- while(end)
- {
+ while(end) {
*end = '\0';
-
const char *args = input;
while(args < end && !iscubespace(*args)) args++;
int cmdlen = args - input;
while(args < end && iscubespace(*args)) args++;
-
if(matchstring(input, cmdlen, "failreg"))
conoutf(CON_ERROR, "master server registration failed: %s", args);
else if(matchstring(input, cmdlen, "succreg"))
conoutf("master server registration succeeded");
- else server::processmasterinput(input, cmdlen, args);
-
+ else server::processmasterinput(input, cmdlen);
end++;
masterinpos = end - masterin.getbuf();
input = end;
end = (char *)memchr(input, '\n', masterin.length() - masterinpos);
}
-
- if(masterinpos >= masterin.length())
- {
+ if(masterinpos >= masterin.length()) {
masterin.setsize(0);
masterinpos = 0;
}
}
-void flushmasteroutput()
-{
- if(masterconnecting && totalmillis - masterconnecting >= 60000)
- {
+void flushmasteroutput() {
+ if(masterconnecting && totalmillis - masterconnecting >= 60000) {
logoutf("could not connect to master server");
disconnectmaster();
}
if(masterout.empty() || !masterconnected) return;
-
ENetBuffer buf;
buf.data = &masterout[masteroutpos];
buf.dataLength = masterout.length() - masteroutpos;
int sent = enet_socket_send(mastersock, NULL, &buf, 1);
- if(sent >= 0)
- {
+ if(sent >= 0) {
masteroutpos += sent;
- if(masteroutpos >= masterout.length())
- {
+ if(masteroutpos >= masterout.length()) {
masterout.setsize(0);
masteroutpos = 0;
}
@@ -479,17 +402,14 @@ void flushmasteroutput()
else disconnectmaster();
}
-void flushmasterinput()
-{
+void flushmasterinput() {
if(masterin.length() >= masterin.capacity())
masterin.reserve(4096);
-
ENetBuffer buf;
buf.data = masterin.getbuf() + masterin.length();
buf.dataLength = masterin.capacity() - masterin.length();
int recv = enet_socket_receive(mastersock, NULL, &buf, 1);
- if(recv > 0)
- {
+ if(recv > 0) {
masterin.advance(recv);
processmasterinput();
}
@@ -498,8 +418,7 @@ void flushmasterinput()
static ENetAddress pongaddr;
-void sendserverinforeply(ucharbuf &p)
-{
+void sendserverinforeply(ucharbuf &p) {
ENetBuffer buf;
buf.data = p.buf;
buf.dataLength = p.length();
@@ -508,33 +427,27 @@ void sendserverinforeply(ucharbuf &p)
#define MAXPINGDATA 32
-void checkserversockets() // reply all server info requests
-{
+void checkserversockets() { // reply all server info requests {
static ENetSocketSet readset, writeset;
ENET_SOCKETSET_EMPTY(readset);
ENET_SOCKETSET_EMPTY(writeset);
ENetSocket maxsock = pongsock;
ENET_SOCKETSET_ADD(readset, pongsock);
- if(mastersock != ENET_SOCKET_NULL)
- {
+ if(mastersock != ENET_SOCKET_NULL) {
maxsock = max(maxsock, mastersock);
ENET_SOCKETSET_ADD(readset, mastersock);
if(!masterconnected) ENET_SOCKETSET_ADD(writeset, mastersock);
}
- if(lansock != ENET_SOCKET_NULL)
- {
+ if(lansock != ENET_SOCKET_NULL) {
maxsock = max(maxsock, lansock);
ENET_SOCKETSET_ADD(readset, lansock);
}
if(enet_socketset_select(maxsock, &readset, &writeset, 0) <= 0) return;
-
ENetBuffer buf;
uchar pong[MAXTRANS];
- loopi(2)
- {
+ loopi(2) {
ENetSocket sock = i ? lansock : pongsock;
if(sock == ENET_SOCKET_NULL || !ENET_SOCKETSET_CHECK(readset, sock)) continue;
-
buf.data = pong;
buf.dataLength = sizeof(pong);
int len = enet_socket_receive(sock, &pongaddr, &buf, 1);
@@ -543,21 +456,15 @@ void checkserversockets() // reply all server info requests
p.len += len;
server::serverinforeply(req, p);
}
-
- if(mastersock != ENET_SOCKET_NULL)
- {
- if(!masterconnected)
- {
- if(ENET_SOCKETSET_CHECK(readset, mastersock) || ENET_SOCKETSET_CHECK(writeset, mastersock))
- {
+ if(mastersock != ENET_SOCKET_NULL) {
+ if(!masterconnected) {
+ if(ENET_SOCKETSET_CHECK(readset, mastersock) || ENET_SOCKETSET_CHECK(writeset, mastersock)) {
int error = 0;
- if(enet_socket_get_option(mastersock, ENET_SOCKOPT_ERROR, &error) < 0 || error)
- {
+ if(enet_socket_get_option(mastersock, ENET_SOCKOPT_ERROR, &error) < 0 || error) {
logoutf("could not connect to master server");
disconnectmaster();
}
- else
- {
+ else {
masterconnecting = 0;
masterconnected = totalmillis ? totalmillis : 1;
server::masterconnected();
@@ -576,8 +483,7 @@ VARF(serverport, 0, server::serverport(), 0xFFFF-1, { if(!serverport) serverport
int curtime = 0, lastmillis = 0, elapsedtime = 0, totalmillis = 0;
#endif
-void updatemasterserver()
-{
+void updatemasterserver() {
if(!masterconnected && lastconnectmaster && totalmillis-lastconnectmaster <= 5*60*1000) return;
if(mastername[0] && allowupdatemaster) requestmasterf("regserv %d\n", serverport);
lastupdatemaster = totalmillis ? totalmillis : 1;
@@ -585,30 +491,23 @@ void updatemasterserver()
uint totalsecs = 0;
-void updatetime()
-{
+void updatetime() {
static int lastsec = 0;
- if(totalmillis - lastsec >= 1000)
- {
+ if(totalmillis - lastsec >= 1000) {
int cursecs = (totalmillis - lastsec) / 1000;
totalsecs += cursecs;
lastsec += cursecs * 1000;
}
}
-void serverslice(bool dedicated, uint timeout) // main server update, called from main loop in sp, or from below in dedicated server
-{
- if(!serverhost)
- {
+void serverslice(bool dedicated, uint timeout) { // main server update, called from main loop in sp, or from below in dedicated server {
+ if(!serverhost) {
server::serverupdate();
server::sendpackets();
return;
}
-
// below is network only
-
- if(dedicated)
- {
+ if(dedicated) {
int millis = (int)enet_time_get();
elapsedtime = millis - totalmillis;
static int timeerr = 0;
@@ -621,33 +520,24 @@ void serverslice(bool dedicated, uint timeout) // main server update, called f
updatetime();
}
server::serverupdate();
-
flushmasteroutput();
checkserversockets();
-
if(!lastupdatemaster || totalmillis-lastupdatemaster>60*60*1000) // send alive signal to masterserver every hour of uptime
updatemasterserver();
-
- if(totalmillis-laststatus>60*1000) // display bandwidth stats, useful for server ops
- {
+ if(totalmillis-laststatus>60*1000) { // display bandwidth stats, useful for server ops {
laststatus = totalmillis;
if(nonlocalclients || serverhost->totalSentData || serverhost->totalReceivedData) logoutf("status: %d remote clients, %.1f send, %.1f rec (K/sec)", nonlocalclients, serverhost->totalSentData/60.0f/1024, serverhost->totalReceivedData/60.0f/1024);
serverhost->totalSentData = serverhost->totalReceivedData = 0;
}
-
ENetEvent event;
bool serviced = false;
- while(!serviced)
- {
- if(enet_host_check_events(serverhost, &event) <= 0)
- {
+ while(!serviced) {
+ if(enet_host_check_events(serverhost, &event) <= 0) {
if(enet_host_service(serverhost, &event, timeout) <= 0) break;
serviced = true;
}
- switch(event.type)
- {
- case ENET_EVENT_TYPE_CONNECT:
- {
+ switch(event.type) {
+ case ENET_EVENT_TYPE_CONNECT: {
client &c = addclient(ST_TCPIP);
c.peer = event.peer;
c.peer->data = &c;
@@ -658,15 +548,13 @@ void serverslice(bool dedicated, uint timeout) // main server update, called f
if(reason) disconnect_client(c.num, reason);
break;
}
- case ENET_EVENT_TYPE_RECEIVE:
- {
+ case ENET_EVENT_TYPE_RECEIVE: {
client *c = (client *)event.peer->data;
if(c) process(event.packet, c->num, event.channelID);
if(event.packet->referenceCount==0) enet_packet_destroy(event.packet);
break;
}
- case ENET_EVENT_TYPE_DISCONNECT:
- {
+ case ENET_EVENT_TYPE_DISCONNECT: {
client *c = (client *)event.peer->data;
if(!c) break;
logoutf("disconnected client (%s)", c->hostname);
@@ -681,17 +569,14 @@ void serverslice(bool dedicated, uint timeout) // main server update, called f
if(server::sendpackets()) enet_host_flush(serverhost);
}
-void flushserver(bool force)
-{
+void flushserver(bool force) {
if(server::sendpackets(force) && serverhost) enet_host_flush(serverhost);
}
#ifndef STANDALONE
-void localdisconnect(bool cleanup)
-{
+void localdisconnect(bool cleanup) {
bool disconnected = false;
- loopv(clients) if(clients[i]->type==ST_LOCAL)
- {
+ loopv(clients) if(clients[i]->type==ST_LOCAL) {
server::localdisconnect(i);
delclient(clients[i]);
disconnected = true;
@@ -701,8 +586,7 @@ void localdisconnect(bool cleanup)
mainmenu = 1;
}
-void localconnect()
-{
+void localconnect() {
if(initing) return;
client &c = addclient(ST_LOCAL);
copystring(c.hostname, "local");
@@ -711,8 +595,7 @@ void localconnect()
}
#endif
-void logoutfv(const char *fmt, va_list args)
-{
+void logoutfv(const char *fmt, va_list args) {
FILE *f = getlogfile();
if(f) writelogv(f, fmt, args);
}
@@ -721,19 +604,17 @@ static bool dedicatedserver = false;
bool isdedicatedserver() { return dedicatedserver; }
-void rundedicatedserver()
-{
+void rundedicatedserver() {
dedicatedserver = true;
logoutf("dedicated server started, waiting for clients...");
for(;;) serverslice(true, 5);
dedicatedserver = false;
}
-bool servererror(bool dedicated, const char *desc)
-{
+bool servererror(bool dedicated, const char *desc) {
+ (void) dedicated;
#ifndef STANDALONE
- if(!dedicated)
- {
+ if(!dedicated) {
conoutf(CON_ERROR, "%s", desc);
cleanupserver();
}
@@ -743,11 +624,9 @@ bool servererror(bool dedicated, const char *desc)
return false;
}
-bool setuplistenserver(bool dedicated)
-{
+bool setuplistenserver(bool dedicated) {
ENetAddress address = { ENET_HOST_ANY, enet_uint16(serverport <= 0 ? server::serverport() : serverport) };
- if(*serverip)
- {
+ if(*serverip) {
if(enet_address_set_host(&address, serverip)<0) conoutf(CON_WARN, "WARNING: server ip not resolved");
else serveraddress.host = address.host;
}
@@ -756,8 +635,7 @@ bool setuplistenserver(bool dedicated)
serverhost->duplicatePeers = maxdupclients ? maxdupclients : MAXCLIENTS;
address.port = server::serverinfoport(serverport > 0 ? serverport : -1);
pongsock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM);
- if(pongsock != ENET_SOCKET_NULL && enet_socket_bind(pongsock, &address) < 0)
- {
+ if(pongsock != ENET_SOCKET_NULL && enet_socket_bind(pongsock, &address) < 0) {
enet_socket_destroy(pongsock);
pongsock = ENET_SOCKET_NULL;
}
@@ -765,8 +643,7 @@ bool setuplistenserver(bool dedicated)
else enet_socket_set_option(pongsock, ENET_SOCKOPT_NONBLOCK, 1);
address.port = server::laninfoport();
lansock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM);
- if(lansock != ENET_SOCKET_NULL && (enet_socket_set_option(lansock, ENET_SOCKOPT_REUSEADDR, 1) < 0 || enet_socket_bind(lansock, &address) < 0))
- {
+ if(lansock != ENET_SOCKET_NULL && (enet_socket_set_option(lansock, ENET_SOCKOPT_REUSEADDR, 1) < 0 || enet_socket_bind(lansock, &address) < 0)) {
enet_socket_destroy(lansock);
lansock = ENET_SOCKET_NULL;
}
@@ -775,16 +652,11 @@ bool setuplistenserver(bool dedicated)
return true;
}
-void initserver(bool listen, bool dedicated)
-{
+void initserver(bool listen, bool dedicated) {
execfile("server-init.cfg", false);
-
if(listen) setuplistenserver(dedicated);
-
server::serverinit();
-
- if(listen)
- {
+ if(listen) {
dedicatedserver = dedicated;
updatemasterserver();
if(dedicated) rundedicatedserver(); // never returns
@@ -795,37 +667,27 @@ void initserver(bool listen, bool dedicated)
}
#ifndef STANDALONE
-void startlistenserver(int *usemaster)
-{
+void startlistenserver(int *usemaster) {
if(serverhost) { conoutf(CON_ERROR, "listen server is already running"); return; }
-
allowupdatemaster = *usemaster>0 ? 1 : 0;
-
if(!setuplistenserver(false)) return;
-
updatemasterserver();
-
conoutf("listen server started for %d clients%s", maxclients, allowupdatemaster ? " and listed with master server" : "");
}
COMMAND(startlistenserver, "i");
-void stoplistenserver()
-{
+void stoplistenserver() {
if(!serverhost) { conoutf(CON_ERROR, "listen server is not running"); return; }
-
kicknonlocalclients();
enet_host_flush(serverhost);
cleanupserver();
-
conoutf("listen server stopped");
}
COMMAND(stoplistenserver, "");
#endif
-bool serveroption(char *opt)
-{
- switch(opt[1])
- {
+bool serveroption(char *opt) {
+ switch(opt[1]) {
case 'u': setvar("serveruprate", atoi(opt+2)); return true;
case 'c': setvar("maxclients", atoi(opt+2)); return true;
case 'i': setsvar("serverip", opt+2); return true;
@@ -843,8 +705,7 @@ bool serveroption(char *opt)
vector<const char *> gameargs;
#ifdef STANDALONE
-int main(int argc, char **argv)
-{
+int main(int argc, char **argv) {
setlogfile(NULL);
if(enet_initialize()<0) fatal("Unable to initialise network module");
atexit(enet_deinitialize);