diff --git a/src/Cube.mm b/src/Cube.mm index aadab90..818b0cc 100644 --- a/src/Cube.mm +++ b/src/Cube.mm @@ -90,8 +90,7 @@ VARP(minmillis, 0, 5, 1000); initclient(); // never returns if dedicated - initserver(dedicated, uprate, sdesc.UTF8String, ip.UTF8String, - master.UTF8String, passwd, maxcl); + initserver(dedicated, uprate, sdesc, ip, master, passwd, maxcl); log(@"world"); empty_world(7, true); diff --git a/src/client.mm b/src/client.mm index daa17ec..0c2c26d 100644 --- a/src/client.mm +++ b/src/client.mm @@ -293,7 +293,7 @@ c2sinfo(dynent *d) // send update to the server // update packet->flags = ENET_PACKET_FLAG_RELIABLE; putint(p, SV_MAPCHANGE); - sendstring(toservermap.UTF8String, p); + sendstring(toservermap, p); toservermap = @""; putint(p, nextmode); } else { @@ -334,7 +334,7 @@ c2sinfo(dynent *d) // send update to the server { packet->flags = ENET_PACKET_FLAG_RELIABLE; putint(p, SV_TEXT); - sendstring(ctext, p); + sendstring(@(ctext), p); ctext[0] = 0; } if (!c2sinit) // tell other clients who I am @@ -342,8 +342,8 @@ c2sinfo(dynent *d) // send update to the server packet->flags = ENET_PACKET_FLAG_RELIABLE; c2sinit = true; putint(p, SV_INITC2S); - sendstring(player1->name, p); - sendstring(player1->team, p); + sendstring(@(player1->name), p); + sendstring(@(player1->team), p); putint(p, player1->lifesequence); } for (OFData *msg in messages) { diff --git a/src/clientextras.mm b/src/clientextras.mm index 3f3b568..519faf5 100644 --- a/src/clientextras.mm +++ b/src/clientextras.mm @@ -191,7 +191,7 @@ sendmap(OFString *mapname) uchar *start = packet->data; uchar *p = start + 2; putint(p, SV_SENDMAP); - sendstring(mapname.UTF8String, p); + sendstring(mapname, p); putint(p, mapdata.count); if (65535 - (p - start) < mapdata.count) { conoutf(@"map %@ is too large to send", mapname); diff --git a/src/clientgame.mm b/src/clientgame.mm index 0f557ee..4b2067d 100644 --- a/src/clientgame.mm +++ b/src/clientgame.mm @@ -510,7 +510,7 @@ startmap(OFString *name) // called just after a map load showscores(false); intermission = false; Cube.sharedInstance.framesInMap = 0; - conoutf(@"game mode is %s", modestr(gamemode)); + conoutf(@"game mode is %@", modestr(gamemode)); } COMMANDN(map, changemap, ARG_1STR) diff --git a/src/clients2c.mm b/src/clients2c.mm index edfc80b..4636550 100644 --- a/src/clients2c.mm +++ b/src/clients2c.mm @@ -15,12 +15,10 @@ neterr(OFString *s) } void -changemapserv(char *name, int mode) // forced map change from the server +changemapserv(OFString *name, int mode) // forced map change from the server { gamemode = mode; - @autoreleasepool { - load_world(@(name)); - } + load_world(name); } void @@ -100,7 +98,7 @@ localservertoclient( if (getint(p) == 1) conoutf(@"server is FULL, disconnecting.."); break; - }; + } case SV_POS: // position of another client { @@ -129,7 +127,7 @@ localservertoclient( if (!demoplayback) updatepos(d); break; - }; + } case SV_SOUND: playsound(getint(p), &d->o); @@ -142,7 +140,9 @@ localservertoclient( case SV_MAPCHANGE: sgetstr(); - changemapserv(text, getint(p)); + @autoreleasepool { + changemapserv(@(text), getint(p)); + } mapchanged = true; break; @@ -151,7 +151,7 @@ localservertoclient( if (mapchanged) { senditemstoserver = false; resetspawns(); - }; + } while ((n = getint(p)) != -1) if (mapchanged) setspawn(n, true); @@ -367,10 +367,11 @@ localservertoclient( text); int mapsize = getint(p); @autoreleasepool { - writemap(@(text), mapsize, p); + OFString *string = @(text); + writemap(string, mapsize, p); + p += mapsize; + changemapserv(string, gamemode); } - p += mapsize; - changemapserv(text, gamemode); break; } diff --git a/src/commands.mm b/src/commands.mm index 8bd68e6..84b9576 100644 --- a/src/commands.mm +++ b/src/commands.mm @@ -345,17 +345,12 @@ bool execfile(OFString *cfgfile) { @autoreleasepool { - OFMutableData *data; @try { - data = [OFMutableData dataWithContentsOfFile:cfgfile]; + execute([OFString stringWithContentsOfFile:cfgfile]); } @catch (id e) { return false; } - // Ensure \0 termination. - [data addItem:""]; - - execute(@((char *)data.mutableItems)); return true; } } diff --git a/src/menus.mm b/src/menus.mm index 5ba9eca..6569fc6 100644 --- a/src/menus.mm +++ b/src/menus.mm @@ -156,7 +156,7 @@ menukey(int code, bool isdown) OFString *action = menus[vmenu].items[menusel].action; if (vmenu == 1) { @autoreleasepool { - connects(@(getservername(menusel))); + connects(getservername(menusel)); } } diff --git a/src/protos.h b/src/protos.h index 0d7e518..00f890f 100644 --- a/src/protos.h +++ b/src/protos.h @@ -37,7 +37,7 @@ extern void newmenu(OFString *name); // serverbrowser extern void addserver(OFString *servername); -extern char *getservername(int n); +extern OFString *getservername(int n); extern void writeservercfg(); // rendergl @@ -82,7 +82,7 @@ extern void neterr(OFString *s); extern void initclientnet(); extern bool netmapstart(); extern int getclientnum(); -extern void changemapserv(char *name, int mode); +extern void changemapserv(OFString *name, int mode); extern void writeclientinfo(OFStream *stream); // clientgame @@ -95,7 +95,7 @@ extern void spawnplayer(dynent *d); extern void selfdamage(int damage, int actor, dynent *act); extern dynent *newdynent(); extern OFString *getclientmap(); -extern const char *modestr(int n); +extern OFString *modestr(int n); extern void zapdynent(dynent *&d); extern dynent *getclient(int cn); extern void timeupdate(int timeremain); @@ -215,8 +215,8 @@ extern void rendermodel(OFString *mdl, int frame, int range, int tex, float rad, extern MapModelInfo *getmminfo(int i); // server -extern void initserver(bool dedicated, int uprate, const char *sdesc, - const char *ip, const char *master, OFString *passwd, int maxcl); +extern void initserver(bool dedicated, int uprate, OFString *sdesc, + OFString *ip, OFString *master, OFString *passwd, int maxcl); extern void cleanupserver(); extern void localconnect(); extern void localdisconnect(); @@ -224,15 +224,15 @@ extern void localclienttoserver(struct _ENetPacket *); extern void serverslice(int seconds, unsigned int timeout); extern void putint(uchar *&p, int n); extern int getint(uchar *&p); -extern void sendstring(const char *t, uchar *&p); +extern void sendstring(OFString *t, uchar *&p); 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 seconds, bool isfull); -extern void servermsinit(const char *master, const char *sdesc, bool listen); -extern void sendmaps(int n, string mapname, int mapsize, uchar *mapdata); +extern void serverms(int mode, int numplayers, int minremain, + OFString *smapname, int seconds, bool isfull); +extern void servermsinit(OFString *master, OFString *sdesc, bool listen); +extern void sendmaps(int n, OFString *mapname, int mapsize, uchar *mapdata); extern ENetPacket *recvmap(int n); // weapon @@ -243,7 +243,7 @@ extern void shootv(int gun, OFVector3D &from, OFVector3D &to, dynent *d = 0, extern void createrays(OFVector3D &from, OFVector3D &to); extern void moveprojectiles(float time); extern void projreset(); -extern char *playerincrosshair(); +extern OFString *playerincrosshair(); extern int reloadtime(int gun); // monster diff --git a/src/renderextras.mm b/src/renderextras.mm index 00ee4da..fcda6f4 100644 --- a/src/renderextras.mm +++ b/src/renderextras.mm @@ -367,14 +367,14 @@ gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwater) @autoreleasepool { OFString *command = getcurcommand(); - char *player = playerincrosshair(); + OFString *player = playerincrosshair(); if (command) draw_textf(@"> %@_", 20, 1570, 2, command); else if (closeent[0]) draw_text(@(closeent), 20, 1570, 2); - else if (player) - draw_text(@(player), 20, 1570, 2); + else if (player != nil) + draw_text(player, 20, 1570, 2); } renderscores(); diff --git a/src/server.mm b/src/server.mm index 2b33b84..10d5de0 100644 --- a/src/server.mm +++ b/src/server.mm @@ -18,7 +18,7 @@ struct client // server side version of "dynent" type vector clients; int maxclients = 8; -string smapname; +static OFString *smapname; struct server_entity // server side version of "entity" type { @@ -96,7 +96,7 @@ send2(bool rel, int cn, int a, int b) }; void -sendservmsg(char *msg) +sendservmsg(OFString *msg) { ENetPacket *packet = enet_packet_create( NULL, _MAXDEFSTR + 10, ENET_PACKET_FLAG_RELIABLE); @@ -109,7 +109,7 @@ sendservmsg(char *msg) multicast(packet, -1); if (packet->referenceCount == 0) enet_packet_destroy(packet); -}; +} void disconnect_client(int n, char *reason) @@ -165,12 +165,16 @@ vote(char *map, int reqmode, int sender) }; if (yes == 1 && no == 0) return true; // single player - sprintf_sd(msg)("%s suggests %s on map %s (set map to vote)", - clients[sender].name, modestr(reqmode), map); - sendservmsg(msg); + @autoreleasepool { + OFString *msg = + [OFString stringWithFormat: + @"%s suggests %@ on map %s (set map to vote)", + clients[sender].name, modestr(reqmode), map]; + sendservmsg(msg); + } if (yes / (float)(yes + no) <= 0.5f) return false; - sendservmsg("vote passed"); + sendservmsg(@"vote passed"); resetvotes(); return true; }; @@ -211,7 +215,7 @@ process(ENetPacket *packet, int sender) // sender may be -1 int reqmode = getint(p); if (reqmode < 0) reqmode = 0; - if (smapname[0] && !mapreload && + if (smapname.length > 0 && !mapreload && !vote(text, reqmode, sender)) return; mapreload = false; @@ -219,11 +223,13 @@ process(ENetPacket *packet, int sender) // sender may be -1 minremain = mode & 1 ? 15 : 10; mapend = lastsec + minremain * 60; interm = 0; - strcpy_s(smapname, text); + @autoreleasepool { + smapname = @(text); + } resetitems(); sender = -1; break; - }; + } case SV_ITEMLIST: { int n; @@ -236,13 +242,13 @@ process(ENetPacket *packet, int sender) // sender may be -1 }; notgotitems = false; break; - }; + } case SV_ITEMPICKUP: { int n = getint(p); pickup(n, getint(p), sender); break; - }; + } case SV_PING: send2(false, cn, SV_PONG, getint(p)); @@ -259,12 +265,14 @@ process(ENetPacket *packet, int sender) // sender may be -1 assert(size != -1); loopi(size - 2) getint(p); break; - }; + } case SV_SENDMAP: { sgetstr(); int mapsize = getint(p); - sendmaps(sender, text, mapsize, p); + @autoreleasepool { + sendmaps(sender, @(text), mapsize, p); + } return; } @@ -307,21 +315,23 @@ send_welcome(int n) putint(p, SV_INITS2C); putint(p, n); putint(p, PROTOCOL_VERSION); - putint(p, smapname[0]); - sendstring(serverpassword.UTF8String, p); + @autoreleasepool { + putint(p, *smapname.UTF8String); + } + sendstring(serverpassword, p); putint(p, clients.length() > maxclients); - if (smapname[0]) { + if (smapname.length > 0) { putint(p, SV_MAPCHANGE); sendstring(smapname, p); putint(p, mode); putint(p, SV_ITEMLIST); loopv(sents) if (sents[i].spawned) putint(p, i); putint(p, -1); - }; + } *(ushort *)start = ENET_HOST_TO_NET_16(p - start); enet_packet_resize(packet, p - start); send(n, packet); -}; +} void multicast(ENetPacket *packet, int sender) @@ -371,7 +381,7 @@ resetserverifempty() { loopv(clients) if (clients[i].type != ST_EMPTY) return; clients.setsize(0); - smapname[0] = 0; + smapname = @""; resetvotes(); resetitems(); mode = 0; @@ -379,7 +389,7 @@ resetserverifempty() minremain = 10; mapend = lastsec + minremain * 60; interm = 0; -}; +} int nonlocalclients = 0; int lastconnect = 0; @@ -509,18 +519,21 @@ localconnect() }; void -initserver(bool dedicated, int uprate, const char *sdesc, const char *ip, - const char *master, OFString *passwd, int maxcl) +initserver(bool dedicated, int uprate, OFString *sdesc, OFString *ip, + OFString *master, OFString *passwd, int maxcl) { serverpassword = passwd; maxclients = maxcl; - servermsinit(master ? master : "wouter.fov120.com/cube/masterserver/", + servermsinit(master ? master : @"wouter.fov120.com/cube/masterserver/", sdesc, dedicated); if (isdedicated = dedicated) { ENetAddress address = {ENET_HOST_ANY, CUBE_SERVER_PORT}; - if (*ip && enet_address_set_host(&address, ip) < 0) - printf("WARNING: server ip not resolved"); + @autoreleasepool { + if (ip.length > 0 && + enet_address_set_host(&address, ip.UTF8String) < 0) + printf("WARNING: server ip not resolved"); + } serverhost = enet_host_create(&address, MAXCLIENTS, 0, uprate); if (!serverhost) fatal(@"could not create server host\n"); diff --git a/src/serverbrowser.mm b/src/serverbrowser.mm index ff4fd89..c098f67 100644 --- a/src/serverbrowser.mm +++ b/src/serverbrowser.mm @@ -145,10 +145,12 @@ vector servers; ENetSocket pingsock = ENET_SOCKET_NULL; int lastinfo = 0; -char * +OFString * getservername(int n) { - return servers[n].name; + @autoreleasepool { + return @(servers[n].name); + } } void @@ -272,11 +274,16 @@ refreshservers() if (si.protocol != PROTOCOL_VERSION) sprintf_s(si.full)( "%s [different cube protocol]", si.name); - else - sprintf_s(si.full)("%d\t%d\t%s, %s: %s %s", - si.ping, si.numplayers, - si.map[0] ? si.map : "[unknown]", - modestr(si.mode), si.name, si.sdesc); + else { + @autoreleasepool { + sprintf_s(si.full)( + "%d\t%d\t%s, %s: %s %s", si.ping, + si.numplayers, + si.map[0] ? si.map : "[unknown]", + modestr(si.mode).UTF8String, + si.name, si.sdesc); + } + } } else { sprintf_s(si.full)( si.address.host != ENET_HOST_ANY diff --git a/src/serverms.mm b/src/serverms.mm index 2270fbb..9d1a0b1 100644 --- a/src/serverms.mm +++ b/src/serverms.mm @@ -12,18 +12,18 @@ httpgetsend(ENetAddress &ad, char *hostname, char *req, char *ref, char *agent) enet_address_set_host(&ad, hostname); if (ad.host == ENET_HOST_ANY) return; - }; + } if (mssock != ENET_SOCKET_NULL) enet_socket_destroy(mssock); mssock = enet_socket_create(ENET_SOCKET_TYPE_STREAM, NULL); if (mssock == ENET_SOCKET_NULL) { printf("could not open socket\n"); return; - }; + } if (enet_socket_connect(mssock, &ad) < 0) { printf("could not connect\n"); return; - }; + } ENetBuffer buf; sprintf_sd(httpget)( "GET %s HTTP/1.0\nHost: %s\nReferer: %s\nUser-Agent: %s\n\n", req, @@ -32,7 +32,7 @@ httpgetsend(ENetAddress &ad, char *hostname, char *req, char *ref, char *agent) buf.dataLength = strlen((char *)buf.data); printf("sending request to %s...\n", hostname); enet_socket_send(mssock, NULL, &buf, 1); -}; +} void httpgetrecieve(ENetBuffer &buf) @@ -110,11 +110,11 @@ retrieveservers(uchar *buf, int buflen) }; ENetSocket pongsock = ENET_SOCKET_NULL; -string serverdesc; +static OFString *serverdesc; void -serverms(int mode, int numplayers, int minremain, char *smapname, int seconds, - bool isfull) +serverms(int mode, int numplayers, int minremain, OFString *smapname, + int seconds, bool isfull) { checkmasterreply(); updatemasterserver(seconds); @@ -136,9 +136,9 @@ serverms(int mode, int numplayers, int minremain, char *smapname, int seconds, putint(p, mode); putint(p, numplayers); putint(p, minremain); - string mname; - strcpy_s(mname, isfull ? "[FULL] " : ""); - strcat_s(mname, smapname); + OFString *mname = + [OFString stringWithFormat:@"%@%@", + (isfull ? @"[FULL] " : @""), smapname]; sendstring(mname, p); sendstring(serverdesc, p); buf.dataLength = p - pong; @@ -147,20 +147,24 @@ serverms(int mode, int numplayers, int minremain, char *smapname, int seconds, } void -servermsinit(const char *master, const char *sdesc, bool listen) +servermsinit(OFString *master_, OFString *sdesc, bool listen) { - const char *mid = strstr(master, "/"); - if (!mid) - mid = master; - strcpy_s(masterpath, mid); - strn0cpy(masterbase, master, mid - master + 1); - strcpy_s(serverdesc, sdesc); + @autoreleasepool { + const char *master = master_.UTF8String; + const char *mid = strstr(master, "/"); + if (!mid) + mid = master; + strcpy_s(masterpath, mid); + strn0cpy(masterbase, master, mid - master + 1); + serverdesc = sdesc; - if (listen) { - ENetAddress address = {ENET_HOST_ANY, CUBE_SERVINFO_PORT}; - pongsock = - enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM, &address); - if (pongsock == ENET_SOCKET_NULL) - fatal(@"could not create server info socket\n"); + if (listen) { + ENetAddress address = { + ENET_HOST_ANY, CUBE_SERVINFO_PORT}; + pongsock = enet_socket_create( + ENET_SOCKET_TYPE_DATAGRAM, &address); + if (pongsock == ENET_SOCKET_NULL) + fatal(@"could not create server info socket\n"); + } } } diff --git a/src/serverutil.mm b/src/serverutil.mm index 246fd04..7652972 100644 --- a/src/serverutil.mm +++ b/src/serverutil.mm @@ -40,38 +40,41 @@ getint(uchar *&p) return n | (*p++ << 24); } else return c; -}; +} void -sendstring(const char *t, uchar *&p) +sendstring(OFString *t_, uchar *&p) { - while (*t) - putint(p, *t++); - putint(p, 0); + @autoreleasepool { + const char *t = t_.UTF8String; + while (*t) + putint(p, *t++); + putint(p, 0); + } +} + +static const OFString *modenames[] = { + @"SP", + @"DMSP", + @"ffa/default", + @"coopedit", + @"ffa/duel", + @"teamplay", + @"instagib", + @"instagib team", + @"efficiency", + @"efficiency team", + @"insta arena", + @"insta clan arena", + @"tactics arena", + @"tactics clan arena", }; -const char *modenames[] = { - "SP", - "DMSP", - "ffa/default", - "coopedit", - "ffa/duel", - "teamplay", - "instagib", - "instagib team", - "efficiency", - "efficiency team", - "insta arena", - "insta clan arena", - "tactics arena", - "tactics clan arena", -}; - -const char * +OFString * modestr(int n) { - return (n >= -2 && n < 12) ? modenames[n + 2] : "unknown"; -}; + return (n >= -2 && n < 12) ? modenames[n + 2] : @"unknown"; +} char msgsizesl[] = // size inclusive message token, 0 for variable or // not-checked sizes @@ -94,16 +97,16 @@ msgsizelookup(int msg) // sending of maps between clients -string copyname; +static OFString *copyname; int copysize; uchar *copydata = NULL; void -sendmaps(int n, string mapname, int mapsize, uchar *mapdata) +sendmaps(int n, OFString *mapname, int mapsize, uchar *mapdata) { if (mapsize <= 0 || mapsize > 256 * 256) return; - strcpy_s(copyname, mapname); + copyname = mapname; copysize = mapsize; if (copydata) free(copydata); @@ -189,7 +192,7 @@ main(int argc, char *argv[]) if (enet_initialize() < 0) fatal(@"Unable to initialise network module"); - initserver(true, uprate, sdesc, ip, master, @(passwd), maxcl); + initserver(true, uprate, @(sdesc), @(ip), @(master), @(passwd), maxcl); return 0; } #endif diff --git a/src/tools.h b/src/tools.h index a43373f..8606fd4 100644 --- a/src/tools.h +++ b/src/tools.h @@ -48,14 +48,9 @@ typedef unsigned int uint; #define loopk(m) loop(k, m) #define loopl(m) loop(l, m) -#ifdef WIN32 -# pragma warning(3 : 4189) -// #pragma comment(linker,"/OPT:NOWIN98") -# define PATHDIV '\\' -#else +#ifndef OF_WINDOWS # define __cdecl # define _vsnprintf vsnprintf -# define PATHDIV '/' #endif // easy safe strings diff --git a/src/weapon.mm b/src/weapon.mm index 546d0a2..7d673eb 100644 --- a/src/weapon.mm +++ b/src/weapon.mm @@ -111,7 +111,7 @@ intersect(dynent *d, OFVector3D &from, p->z <= d->o.z + d->aboveeye && p->z >= d->o.z - d->eyeheight); } -char * +OFString * playerincrosshair() { if (demoplayback) @@ -121,8 +121,11 @@ playerincrosshair() dynent *o = players[i]; if (!o) continue; - if (intersect(o, player1->o, worldpos)) - return o->name; + if (intersect(o, player1->o, worldpos)) { + @autoreleasepool { + return @(o->name); + } + } } return NULL; }