diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index 6c38a937..a6d4fb92 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -33,6 +33,8 @@ extern int framesinmap; char *getclientmap() { return clientmap; } +int getclientmode() { return gamemode; } + extern bool c2sinit, sendmapidenttoserver; void setskin(playerent *pl, uint skin) @@ -140,7 +142,6 @@ VARNP(skin_rvsf, nextskin_rvsf, 0, 0, 1000); int curteam() { return player1->team; } int currole() { return player1->clientrole; } -int curmode() { return gamemode; } void curmap(int cleaned) { result(cleaned ? behindpath(getclientmap()) : getclientmap()); } int curmodeattr(char *attr) @@ -156,7 +157,7 @@ COMMANDN(team, newteam, ARG_1STR); COMMANDN(name, newname, ARG_1STR); COMMAND(curteam, ARG_IVAL); COMMAND(currole, ARG_IVAL); -COMMAND(curmode, ARG_IVAL); +COMMAND(getclientmode, ARG_IVAL); COMMAND(curmodeattr, ARG_1EST); COMMAND(curmap, ARG_1INT); VARP(showscoresondeath, 0, 1, 1); @@ -1067,17 +1068,6 @@ void setadmin(char *claim, char *password) COMMAND(setadmin, ARG_2STR); -void changemap(const char *name) // silently request map change, server may ignore -{ - ENetPacket *packet = enet_packet_create(NULL, MAXTRANS, ENET_PACKET_FLAG_RELIABLE); - ucharbuf p(packet->data, packet->dataLength); - putint(p, SV_NEXTMAP); - sendstring(name, p); - putint(p, nextmode); - enet_packet_resize(packet, p.length()); - sendpackettoserv(1, packet); -} - struct mline { string name, cmd; }; static vector mlines; diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index 447265d4..cc451950 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -308,15 +308,6 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) break; } - case SV_MAPRELOAD: // server requests next map - { - getint(p); - s_sprintfd(nextmapalias)("nextmap_%s", getclientmap()); - const char *map = getalias(nextmapalias); // look up map in the cycle - changemap(map ? map : getclientmap()); - break; - } - case SV_INITC2S: // another client either connected or changed name/team { d = newclient(cn); @@ -862,13 +853,6 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) } } - // check if joining here so as not to interrupt welcomepacket - if(joining<0 && getclientmap()[0]) // we are the first client on this server, set map - { - nextmode = gamemode; - changemap(getclientmap()); - } - #ifdef _DEBUG protocoldebug(false); #endif diff --git a/source/src/main.cpp b/source/src/main.cpp index cbeff9e8..8af0093d 100644 --- a/source/src/main.cpp +++ b/source/src/main.cpp @@ -724,8 +724,9 @@ int main(int argc, char **argv) persistidents = true; initlog("localconnect"); + extern string clientmap; + s_strcpy(clientmap, "ac_complex"); localconnect(); - changemap("maps/ac_complex"); if(initscript) execute(initscript); diff --git a/source/src/protocol.cpp b/source/src/protocol.cpp index 69337c63..9ca1d43e 100644 --- a/source/src/protocol.cpp +++ b/source/src/protocol.cpp @@ -211,7 +211,7 @@ char msgsizesl[] = // size inclusive message token, 0 for variable SV_SHOOT, 0, SV_EXPLODE, 0, SV_SUICIDE, 1, SV_AKIMBO, 2, SV_RELOAD, 3, SV_SCOPE, 3, SV_GIBDIED, 4, SV_DIED, 4, SV_GIBDAMAGE, 6, SV_DAMAGE, 6, SV_HITPUSH, 6, SV_SHOTFX, 9, SV_THROWNADE, 8, SV_TRYSPAWN, 1, SV_SPAWNSTATE, 23, SV_SPAWN, 3, SV_FORCEDEATH, 2, SV_RESUME, 0, - SV_TIMEUP, 2, SV_EDITENT, 10, SV_MAPRELOAD, 2, SV_NEXTMAP, 0, SV_ITEMACC, 2, + SV_TIMEUP, 2, SV_EDITENT, 10, SV_ITEMACC, 2, SV_MAPCHANGE, 0, SV_ITEMSPAWN, 2, SV_ITEMPICKUP, 2, SV_PING, 2, SV_PONG, 2, SV_CLIENTPING, 2, SV_GAMEMODE, 2, SV_EDITMODE, 2, SV_EDITH, 7, SV_EDITT, 7, SV_EDITS, 6, SV_EDITD, 6, SV_EDITE, 6, SV_NEWMAP, 2, diff --git a/source/src/protocol.h b/source/src/protocol.h index dab2d9d0..24c8a58b 100644 --- a/source/src/protocol.h +++ b/source/src/protocol.h @@ -21,7 +21,7 @@ enum SV_SHOOT, SV_EXPLODE, SV_SUICIDE, SV_AKIMBO, SV_RELOAD, SV_SCOPE, SV_GIBDIED, SV_DIED, SV_GIBDAMAGE, SV_DAMAGE, SV_HITPUSH, SV_SHOTFX, SV_THROWNADE, SV_TRYSPAWN, SV_SPAWNSTATE, SV_SPAWN, SV_FORCEDEATH, SV_RESUME, - SV_TIMEUP, SV_EDITENT, SV_MAPRELOAD, SV_NEXTMAP, SV_ITEMACC, + SV_TIMEUP, SV_EDITENT, SV_ITEMACC, SV_MAPCHANGE, SV_ITEMSPAWN, SV_ITEMPICKUP, SV_PING, SV_PONG, SV_CLIENTPING, SV_GAMEMODE, SV_EDITMODE, SV_EDITH, SV_EDITT, SV_EDITS, SV_EDITD, SV_EDITE, SV_NEWMAP, @@ -51,7 +51,7 @@ const static char *messagenames[] = "SV_SHOOT", "SV_EXPLODE", "SV_SUICIDE", "SV_AKIMBO", "SV_RELOAD", "SV_SCOPE", "SV_GIBDIED", "SV_DIED", "SV_GIBDAMAGE", "SV_DAMAGE", "SV_HITPUSH", "SV_SHOTFX", "SV_THROWNADE", "SV_TRYSPAWN", "SV_SPAWNSTATE", "SV_SPAWN", "SV_FORCEDEATH", "SV_RESUME", - "SV_TIMEUP", "SV_EDITENT", "SV_MAPRELOAD", "SV_NEXTMAP", "SV_ITEMACC", + "SV_TIMEUP", "SV_EDITENT", "SV_ITEMACC", "SV_MAPCHANGE", "SV_ITEMSPAWN", "SV_ITEMPICKUP", "SV_PING", "SV_PONG", "SV_CLIENTPING", "SV_GAMEMODE", "SV_EDITMODE", "SV_EDITH", "SV_EDITT", "SV_EDITS", "SV_EDITD", "SV_EDITE", "SV_NEWMAP", diff --git a/source/src/protos.h b/source/src/protos.h index e07d9a01..e36f4025 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -361,6 +361,7 @@ extern playerent *newplayerent(); extern botent *newbotent(); extern void freebotent(botent *d); extern char *getclientmap(); +extern int getclientmode(); extern void zapplayer(playerent *&d); extern playerent *getclient(int cn); extern playerent *newclient(int cn); diff --git a/source/src/server.cpp b/source/src/server.cpp index e5d75b69..5e4a7f4d 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -42,7 +42,6 @@ vector demofiles; int mastermode = MM_OPEN; static bool autoteam = true; -static bool mapreload = false; static bool forceintermission = false; string servdesc_current; @@ -1003,10 +1002,14 @@ void arenacheck() { // start new arena round arenaround = 0; distributespawns(); - loopv(clients) if(clients[i]->type!=ST_EMPTY && clients[i]->isauthed && clients[i]->isonrightmap) + loopv(clients) if(clients[i]->type!=ST_EMPTY && clients[i]->isauthed && team_isactive(clients[i]->team)) { - clients[i]->state.respawn(); - sendspawn(clients[i]); + if(clients[i]->isonrightmap) + { + clients[i]->state.respawn(); + sendspawn(clients[i]); + } + else sendservmsg("\f3you have to be on the right map to spawn: type /getmap", i); // FIXME } return; } @@ -1417,7 +1420,6 @@ void resetserver(const char *newname, int newmode, int newtime) gamemillis = 0; gamelimit = minremain*60000; - mapreload = false; interm = 0; if(!laststatus) laststatus = servmillis-61*1000; lastfillup = servmillis; @@ -1426,7 +1428,7 @@ void resetserver(const char *newname, int newmode, int newtime) ctfreset(); } -void resetmap(const char *newname, int newmode, int newtime, bool notify) +void startgame(const char *newname, int newmode, int newtime, bool notify) { bool lastteammode = m_teammode; resetserver(newname, newmode, newtime); @@ -1760,7 +1762,7 @@ void welcomepacket(ucharbuf &p, int n, ENetPacket *packet, bool forcedeath) } \ } - if(!smapname[0] && maprot.configsets.length()) maprot.next(false); + if(!smapname[0]) maprot.next(false); client *c = valid_client(n) ? clients[n] : NULL; int numcl = numclients(); @@ -1903,7 +1905,7 @@ int checktype(int type, client *cl) static int servtypes[] = { SV_INITS2C, SV_WELCOME, SV_CDIS, SV_GIBDIED, SV_DIED, SV_GIBDAMAGE, SV_DAMAGE, SV_HITPUSH, SV_SHOTFX, SV_SPAWNSTATE, SV_FORCEDEATH, SV_RESUME, SV_TIMEUP, - SV_MAPRELOAD, SV_ITEMACC, SV_MAPCHANGE, SV_ITEMSPAWN, SV_PONG, + SV_ITEMACC, SV_MAPCHANGE, SV_ITEMSPAWN, SV_PONG, SV_SERVMSG, SV_ITEMLIST, SV_FLAGINFO, SV_FLAGMSG, SV_FLAGCNT, SV_ARENAWIN, SV_SERVOPINFO, SV_CALLVOTESUC, SV_CALLVOTEERR, SV_VOTERESULT, @@ -2354,15 +2356,6 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 break; } - case SV_NEXTMAP: - { - getstring(text, p); - filtertext(text, text); - int mode = getint(p); - if(mapreload || numclients() == 1) resetmap(text, mode); - break; - } - case SV_SENDMAP: { getstring(text, p); @@ -2444,7 +2437,7 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 { getstring(text, p); filtertext(text, text); - string oldname, newname; + string filename; const char *rmmap = behindpath(text), *reject = NULL; int mp = findmappath(rmmap); int reqrole = strchr(scl.mapperm, 'D') ? CR_ADMIN : (strchr(scl.mapperm, 'd') ? CR_DEFAULT : CR_ADMIN + 100); @@ -2452,18 +2445,14 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 else if(readonlymap(mp)) reject = "map is readonly"; else if(mp == MAP_NOTFOUND) reject = "map not found"; else - { // don't really delete - just rename - s_sprintf(oldname)(SERVERMAP_PATH_INCOMING "%s.cgz", rmmap); - s_sprintf(newname)(SERVERMAP_PATH_INCOMING "%s.cgz.%d.deleted", rmmap, servmillis); - remove(newname); - rename(oldname, newname); - s_sprintf(oldname)(SERVERMAP_PATH_INCOMING "%s.cfg", rmmap); - s_sprintf(newname)(SERVERMAP_PATH_INCOMING "%s.cfg.%d.deleted", rmmap, servmillis); - remove(newname); - rename(oldname, newname); + { + s_sprintf(filename)(SERVERMAP_PATH_INCOMING "%s.cgz", rmmap); + remove(filename); + s_sprintf(filename)(SERVERMAP_PATH_INCOMING "%s.cfg", rmmap); + remove(filename); s_sprintfd(msg)("map '%s' deleted", rmmap); sendservmsg(msg, sender); - logline(ACLOG_INFO,"[%s] deleted map %s, backup %d", clients[sender]->hostname, rmmap, servmillis); + logline(ACLOG_INFO,"[%s] deleted map %s", clients[sender]->hostname, rmmap); } if (reject) { @@ -2780,14 +2769,8 @@ void serverslice(uint timeout) // main server update, called from cube main lo interm = 0; //start next game - if(nextmapname[0]) resetmap(nextmapname, nextgamemode); - else if(maprot.configsets.length()) maprot.next(); - else loopv(clients) if(clients[i]->type!=ST_EMPTY) - { - sendf(i, 1, "rii", SV_MAPRELOAD, 0); // ask a client to trigger map reload - mapreload = true; - break; - } + if(nextmapname[0]) startgame(nextmapname, nextgamemode); + else maprot.next(); } resetserverifempty(); diff --git a/source/src/server.h b/source/src/server.h index 5328c1b8..12c52e93 100644 --- a/source/src/server.h +++ b/source/src/server.h @@ -295,7 +295,7 @@ struct demofile int len; }; -void resetmap(const char *newname, int newmode, int newtime = -1, bool notify = true); +void startgame(const char *newname, int newmode, int newtime = -1, bool notify = true); void disconnect_client(int n, int reason = -1); int clienthasflag(int cn); bool refillteams(bool now = false, bool notify = true); diff --git a/source/src/serveractions.h b/source/src/serveractions.h index a6b2578f..a09ab699 100644 --- a/source/src/serveractions.h +++ b/source/src/serveractions.h @@ -37,7 +37,7 @@ struct mapaction : serveraction } else { - resetmap(map, mode); + startgame(map, mode); } } bool isvalid() { return serveraction::isvalid() && mode != GMODE_DEMO && mapok && !(isdedicated && !m_mp(mode)); } @@ -99,7 +99,7 @@ struct mapaction : serveraction struct demoplayaction : serveraction { char *map; - void perform() { resetmap(map, GMODE_DEMO); } + void perform() { startgame(map, GMODE_DEMO); } demoplayaction(char *map) : map(map) { area = EE_LOCAL_SERV; // only local diff --git a/source/src/serverfiles.h b/source/src/serverfiles.h index 50ed8632..82744dcb 100644 --- a/source/src/serverfiles.h +++ b/source/src/serverfiles.h @@ -296,6 +296,15 @@ struct servermaprot : serverconfigfile int next(bool notify = true, bool nochange = false) // load next maprotation set { +#ifndef STANDALONE + if(!isdedicated) + { + s_sprintfd(nextmapalias)("nextmap_%s", getclientmap()); + const char *map = getalias(nextmapalias); // look up map in the cycle + startgame(map && notify ? map : getclientmap(), getclientmode(), -1, notify); + return -1; + } +#endif int n = numclients(); int csl = configsets.length(); int ccs = curcfgset; @@ -316,7 +325,7 @@ struct servermaprot : serverconfigfile if(!nochange) { curcfgset = ccs; - resetmap(c->mapname, c->mode, c->time, notify); + startgame(c->mapname, c->mode, c->time, notify); } return ccs; }