From 7a8221ed3ce99e9834ba9ad46692bc0df93181e2 Mon Sep 17 00:00:00 2001 From: driAn Date: Sat, 9 Dec 2006 13:56:50 +0000 Subject: [PATCH] no message git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@773 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/client.cpp | 54 ++++++++++++++++++++++++++----------- source/src/clientextras.cpp | 2 +- source/src/clientgame.cpp | 30 ++++++++++++--------- source/src/clients2c.cpp | 13 +++++++++ source/src/entities.cpp | 8 +++--- source/src/entity.h | 6 ++--- source/src/protocol.h | 3 ++- source/src/protos.h | 6 +++-- source/src/renderextras.cpp | 6 ++--- source/src/server.cpp | 49 ++++++++++++++++++++++++++++++--- source/src/serverutil.cpp | 1 + 11 files changed, 134 insertions(+), 44 deletions(-) diff --git a/source/src/client.cpp b/source/src/client.cpp index 8c74bc5a..fedf18b8 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -47,18 +47,6 @@ void throttle() enet_peer_throttle_configure(clienthost->peers, throttle_interval*1000, throttle_accel, throttle_decel); }; -void ctf_team(char *name) -{ - bool isvalidteam = strcmp(name, "RVSF") == 0 || strcmp(name, "CLA") == 0; - if(strcmp(name, player1->team) == 0 && isvalidteam) return; - c2sinit = false; - ctf_death(); - if(isvalidteam) strcpy(player1->team, name); - else strcpy(player1->team, rb_team_string(rnd(2))); - player1->lastaction = lastmillis; - player1->state = CS_DEAD; -}; - void newname(char *name) { if(name[0]) @@ -69,11 +57,46 @@ void newname(char *name) else conoutf("your name is: %s", player1->name); }; -void newteam(char *name) +int smallerteam() +{ + int teamsize[2] = {0, 0}; + loopv(players) if(players[i]) teamsize[team_int(players[i]->team)]++; + if(teamsize[0] == teamsize[1]) return -1; + return teamsize[0] < teamsize[1] ? 0 : 1; +}; + +void changeteam(char *name) // force team and respawn +{ + c2sinit = false; + if(m_ctf) dropctfflags(); + s_strncpy(player1->team, name, MAXTEAMLEN+1); + player1->lastaction = lastmillis; + player1->state = CS_DEAD; +}; + +void newteam(char *name) // save team changing { if(name[0]) { - if(m_teammode) ctf_team(name); + if(m_teammode) + { + bool checkteam = autoteambalance && players.length() > 1; + + if(!strcmp(name, "RVSF") || !strcmp(name, "CLA")) + { + if(strcmp(name, player1->team)) + { + if(checkteam && team_int(name) != smallerteam()) + { + conoutf("\f3the %s team is already full", name); + return; + }; + changeteam(name); + } + else return; // same team + } + else changeteam(checkteam ? team_string(smallerteam()) : team_string(rnd(2))); // random assignement + } else { c2sinit = false; s_strncpy(player1->team, name, MAXTEAMLEN+1); }; } else conoutf("your team is: %s", player1->team); @@ -153,6 +176,7 @@ void disconnect(int onlyclean, int async) disconnecting = 0; clientnum = -1; c2sinit = false; + autoteambalance = false; player1->lifesequence = 0; if(m_botmode) BotManager.EndMap(); loopv(players) zapplayer(players[i]); @@ -239,7 +263,7 @@ bool netmapstart() { senditemstoserver = true; return clienthost!=NULL; }; void initclientnet() { newname("unnamed"); - ctf_team("cube"); + changeteam("cube"); }; void sendpackettoserv(int chan, ENetPacket *packet) diff --git a/source/src/clientextras.cpp b/source/src/clientextras.cpp index 31ae2aff..2d8493b9 100644 --- a/source/src/clientextras.cpp +++ b/source/src/clientextras.cpp @@ -47,7 +47,7 @@ void renderplayer(playerent *d) { if(!d) return; - int team = rb_team_int(d->team); + int team = team_int(d->team); s_sprintfd(mdl)("playermodels/%s/0%i", team==TEAM_CLA ? "terrorist" : "counterterrorist", 1 + max(0, min(d->skin, (team==TEAM_CLA ? 3 : 5)))); string vwep; if(d->gunselect>=0 && d->gunselectgunselect]); diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index c81db655..5ca5af5f 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -14,7 +14,8 @@ void mode(int n) }; COMMAND(mode, ARG_1INT); -bool intermission = false; +bool intermission = false; +bool autoteambalance = false; playerent *player1 = newplayerent(); // our client vector players; // other clients @@ -37,7 +38,7 @@ extern int dblend; void setskin(playerent *pl, int skin) { if(!pl) return; - int maxskin = rb_team_int(pl->team) == TEAM_CLA ? 3 : 5; + int maxskin = team_int(pl->team) == TEAM_CLA ? 3 : 5; pl->skin = max(0, skin % (maxskin+1)); }; @@ -93,9 +94,9 @@ void freebotent(botent *d) }; }; -void ctf_death() // EDIT: AH +void dropctfflags() { - int flag = rb_opposite(rb_team_int(player1->team)); + int flag = team_opposite(team_int(player1->team)); flaginfo &f = flaginfos[flag]; if(f.state==CTFF_STOLEN && f.actor==player1) { @@ -324,7 +325,7 @@ int findplayerstart(playerent *d) { int r = fixspawn-->0 ? 4 : rnd(10)+1; - if(m_teammode) loopi(r) spawncycle = findentity(PLAYERSTART, spawncycle+1, rb_team_int(d->team)); + if(m_teammode) loopi(r) spawncycle = findentity(PLAYERSTART, spawncycle+1, team_int(d->team)); else if(m_arena) loopi(r) spawncycle = findentity(PLAYERSTART, spawncycle+1, 100); else { @@ -481,7 +482,7 @@ void selfdamage(int damage, int actor, playerent *act, bool gib, playerent *pl) }; if(pl==player1) { - if(m_ctf) ctf_death(); + if(m_ctf) dropctfflags(); showscores(true); setscope(false); addmsg(gib ? SV_GIBDIED : SV_DIED, "ri", actor); @@ -616,7 +617,7 @@ void flagaction(int flag, int action) { flaginfo &f = flaginfos[flag]; if(!f.actor) return; - bool ownflag = flag == rb_team_int(player1->team); + bool ownflag = flag == team_int(player1->team); switch(action) { case SV_FLAGPICKUP: @@ -681,6 +682,15 @@ void mastercommand(int cmd, int a) // one of MCMD_* void kick(int player) { mastercommand(MCMD_KICK, player); }; void ban(int player) { mastercommand(MCMD_BAN, player); }; void removebans() { mastercommand(MCMD_REMBANS, 0); }; +void autoteam(int enable) { mastercommand(MCMD_AUTOTEAM, enable); }; +void shuffle() { mastercommand(MCMD_SHUFFLETEAMS, 0); }; + +COMMAND(setmaster, ARG_2STR); +COMMAND(kick, ARG_1INT); +COMMAND(ban, ARG_1INT); +COMMAND(removebans, ARG_NONE); +COMMAND(autoteam, ARG_1INT); +COMMAND(shuffle, ARG_NONE); struct mline { string cmd; }; static vector mlines; @@ -702,8 +712,4 @@ void showmastermenu(int m) // 0=kick, 1=ban menuset(menu); }; -COMMAND(setmaster, ARG_2STR); -COMMAND(kick, ARG_1INT); -COMMAND(ban, ARG_1INT); -COMMAND(removebans, ARG_NONE); -COMMAND(showmastermenu, ARG_1INT); +COMMAND(showmastermenu, ARG_1INT); \ No newline at end of file diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index 3c343be7..d2d2c926 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -479,6 +479,19 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) }; break; }; + + case SV_FORCETEAM: + { + changeteam(team_string(getint(p))); + break; + }; + + case SV_AUTOTEAM: + { + autoteambalance = getint(p) == 1; + conoutf("autoteam is %s", autoteambalance ? "enabled" : "disabled"); + break; + }; /* demo recording compat */ case SV_PING: diff --git a/source/src/entities.cpp b/source/src/entities.cpp index 6df5011b..99f006fc 100644 --- a/source/src/entities.cpp +++ b/source/src/entities.cpp @@ -44,12 +44,12 @@ void renderentities() if(f.state==CTFF_STOLEN && f.actor) { if(f.actor == player1) continue; - s_sprintfd(path)("pickups/flags/small_%s", rb_team_string(e.attr2)); + s_sprintfd(path)("pickups/flags/small_%s", team_string(e.attr2)); rendermodel(path, ANIM_FLAG|ANIM_START, 0, 1.1f, f.actor->o.x, f.actor->o.z+0.3f+(sinf(lastmillis/100.0f)+1)/10, f.actor->o.y, lastmillis/2.5f, 0, 120.0f); } else { - s_sprintfd(path)("pickups/flags/%s", rb_team_string(e.attr2)); + s_sprintfd(path)("pickups/flags/%s", team_string(e.attr2)); rendermodel(path, ANIM_FLAG|ANIM_LOOP, 0, 4, e.x, f.state==CTFF_INBASE ? (float)S(e.x, e.y)->floor : e.z, e.y, (float)((e.attr1+7)-(e.attr1+7)%15), 0, 120.0f); }; } @@ -192,7 +192,7 @@ void pickup(int n, playerent *d) if(d->type!=ENT_PLAYER) break; int team = ents[n].attr2; flaginfo &f = flaginfos[team]; - bool isownflag = team == rb_team_int(d->team); + bool isownflag = team == team_int(d->team); if(f.state == CTFF_STOLEN) break; else if(isownflag && f.state == CTFF_DROPPED) { @@ -207,7 +207,7 @@ void pickup(int n, playerent *d) f.state = CTFF_STOLEN; f.pick_ack = false; } - else if(isownflag && f.state == CTFF_INBASE && flaginfos[rb_opposite(team)].state == CTFF_STOLEN && flaginfos[rb_opposite(team)].actor == d) addmsg(SV_FLAGSCORE, "ri", rb_opposite(team)); + else if(isownflag && f.state == CTFF_INBASE && flaginfos[team_opposite(team)].state == CTFF_STOLEN && flaginfos[team_opposite(team)].actor == d) addmsg(SV_FLAGSCORE, "ri", team_opposite(team)); break; }; }; diff --git a/source/src/entity.h b/source/src/entity.h index 8acae65c..d286fb9f 100644 --- a/source/src/entity.h +++ b/source/src/entity.h @@ -35,9 +35,9 @@ enum { GUN_KNIFE = 0, GUN_PISTOL, GUN_SHOTGUN, GUN_SUBGUN, GUN_SNIPER, GUN_ASSAU #define TEAM_CLA 0 // #define TEAM_RVSF 1 // // rb means red/blue -#define rb_team_string(t) ((t) ? "RVSF" : "CLA") -#define rb_team_int(t) (strcmp((t), "CLA") == 0 ? TEAM_CLA : TEAM_RVSF) -#define rb_opposite(o) ((o) == TEAM_CLA ? TEAM_RVSF : TEAM_CLA) +#define team_string(t) ((t) ? "RVSF" : "CLA") +#define team_int(t) (strcmp((t), "CLA") == 0 ? TEAM_CLA : TEAM_RVSF) +#define team_opposite(o) ((o) == TEAM_CLA ? TEAM_RVSF : TEAM_CLA) struct itemstat { int add, start, max, sound; }; // End add diff --git a/source/src/protocol.h b/source/src/protocol.h index b6147eca..90b5a7bd 100644 --- a/source/src/protocol.h +++ b/source/src/protocol.h @@ -19,11 +19,12 @@ enum SV_MODELSKIN, SV_FLAGPICKUP, SV_FLAGDROP, SV_FLAGRETURN, SV_FLAGSCORE, SV_FLAGINFO, SV_FLAGS, //EDIT: AH SV_SETMASTER, SV_SETMASTERLOGIN, SV_MASTERINFO, SV_MASTERCMD, + SV_FORCETEAM, SV_AUTOTEAM, SV_PWD, SV_CLIENT, }; -enum { MCMD_KICK = 0, MCMD_BAN, MCMD_REMBANS, MCMD_MASTERMODE }; +enum { MCMD_KICK = 0, MCMD_BAN, MCMD_REMBANS, MCMD_MASTERMODE, MCMD_AUTOTEAM, MCMD_SHUFFLETEAMS }; #define DMF 16.0f #define DAF 1.0f diff --git a/source/src/protos.h b/source/src/protos.h index 2003139a..7053eabe 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -86,11 +86,13 @@ extern void initclientnet(); extern bool netmapstart(); extern int getclientnum(); extern void changemapserv(char *name, int mode); +extern void changeteam(char *name); extern void newteam(char *name); extern bool sendpwd; // clientgame extern flaginfo flaginfos[2]; +extern bool autoteambalance; extern void mousemove(int dx, int dy); extern void updateworld(int curtime, int lastmillis); extern void startmap(char *name); @@ -108,8 +110,8 @@ extern playerent *getclient(int cn); extern playerent *newclient(int cn); extern void timeupdate(int timeremain); extern void fixcamerarange(physent *cam = camera1); -extern void respawnself(); // EDIT: AH -extern void ctf_death(); +extern void respawnself(); +extern void dropctfflags(); extern void setskin(playerent *pl, int skin); //game mode extras extern void arenarespawn(); diff --git a/source/src/renderextras.cpp b/source/src/renderextras.cpp index 897f3091..0e2a393e 100644 --- a/source/src/renderextras.cpp +++ b/source/src/renderextras.cpp @@ -447,11 +447,11 @@ void gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwat if(flaginfos[TEAM_RVSF].state == CTFF_INBASE) glDisable(GL_BLEND); else glEnable(GL_BLEND); drawicon(0, 0, 1820, 1650, flagtex, 1.0f/4.0f); glDisable(GL_BLEND); - drawicon((float)(rb_team_int(player1->team)*64*ctf_scl), (float)(64*ctf_scl), VIRTW-128-10, 10, flagtex, 1.0/4.0); // shows which team you are + drawicon((float)(team_int(player1->team)*64*ctf_scl), (float)(64*ctf_scl), VIRTW-128-10, 10, flagtex, 1.0/4.0); // shows which team you are glPopMatrix(); // big flag icon - flaginfo &f = flaginfos[rb_opposite(rb_team_int(player1->team))]; + flaginfo &f = flaginfos[team_opposite(team_int(player1->team))]; if(f.state==CTFF_STOLEN && f.actor == player1 && f.pick_ack ) { glPushMatrix(); @@ -459,7 +459,7 @@ void gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwat glBlendFunc(GL_SRC_ALPHA, GL_ONE); glColor4f(1.0f, 1.0f, 1.0f, (sinf(lastmillis / 100.0f) + 1.0f) / 2.0f); glEnable(GL_BLEND); - drawicon((float)(rb_opposite(rb_team_int(player1->team))*128*ctf_scl),(float)(128*ctf_scl), 1065, VIRTH/2/3*2, flagtex, 1.0/2.0); + drawicon((float)(team_opposite(team_int(player1->team))*128*ctf_scl),(float)(128*ctf_scl), 1065, VIRTH/2/3*2, flagtex, 1.0/2.0); glPopMatrix(); }; }; diff --git a/source/src/server.cpp b/source/src/server.cpp index 946abf28..df63a11e 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -36,7 +36,7 @@ struct client // server side version of "dynent" type ENetPeer *peer; string hostname; string mapvote; - string name; + string name, team; int modevote; uint pos[3]; clientscore score; @@ -192,6 +192,13 @@ void zapclient(int c) clients[c]->ismaster = clients[c]->isauthed = false; }; +int freeteam() +{ + int teamsize[2] = {0, 0}; + loopv(clients) if(clients[i]->type!=ST_EMPTY) teamsize[team_int(clients[i]->team)]++; + return teamsize[0] < teamsize[1] ? 0 : 1; +}; + clientscore *findscore(client &c, bool insert) { if(c.type!=ST_TCPIP) return NULL; @@ -241,7 +248,7 @@ void restoreserverstate(vector &ents) // hack: called from savegame co }; int interm = 0, minremain = 0, mapend = 0; -bool mapreload = false; +bool mapreload = false, autoteam = true; string serverpassword = ""; @@ -493,6 +500,19 @@ bool isbanned(int cn) return false; }; +void shuffleteams() +{ + int numplayers = numclients(); + int teamsize[2] = {0, 0}; + loopv(clients) if(clients[i]->type!=ST_EMPTY) + { + int team = rnd(2); + if(teamsize[team] > numplayers/2) team = (team+1)%2; + sendf(i, 1, "rii", SV_FORCETEAM, team); + teamsize[team]++; + }; +}; + int master() { loopv(clients) if(clients[i]->type!=ST_EMPTY && clients[i]->ismaster) return i; @@ -557,6 +577,20 @@ void mastercmd(int sender, int cmd, int a) sendservmsg(msg); break; }; + case MCMD_AUTOTEAM: + { + if(a < 0 || a > 1) return; + autoteam = a == 1; + sendf(-1, 1, "rii", SV_AUTOTEAM, a); + break; + }; + case MCMD_SHUFFLETEAMS: + { + if(!m_teammode) return; + shuffleteams(); + sendservmsg("teams were shuffled"); + break; + }; }; }; @@ -628,6 +662,7 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 }; }; getstring(text, p); + s_strncpy(cl->team, text, MAXTEAMLEN+1); getint(p); getint(p); QUEUE_MSG; @@ -854,6 +889,13 @@ void send_welcome(int n) putint(p, c.score.frags); putint(p, c.score.flags); }; + if(autoteam) + { + putint(p, SV_FORCETEAM); + putint(p, freeteam()); + }; + putint(p, SV_AUTOTEAM); + putint(p, autoteam); enet_packet_resize(packet, p.length()); sendpacket(n, 1, packet); if(smapname[0] && m_ctf) loopi(2) sendflaginfo(i, -1, n); // EDIT: AH @@ -906,6 +948,7 @@ void resetserverifempty() //clients.setsize(0); resetmap("", 0, 10, false); mastermode = MM_OPEN; + autoteam = true; }; int refuseconnect(int i) @@ -947,7 +990,7 @@ void serverslice(int seconds, unsigned int timeout) // main server update, cal { f.state=CTFF_INBASE; sendflaginfo(i, -1); - s_sprintfd(msg)("the server reset the %s flag", rb_team_string(i)); + s_sprintfd(msg)("the server reset the %s flag", team_string(i)); sendservmsg(msg); sendf(-1, 1, "rii", SV_SOUND, S_FLAGRETURN); }; diff --git a/source/src/serverutil.cpp b/source/src/serverutil.cpp index 4a67e786..51a97691 100644 --- a/source/src/serverutil.cpp +++ b/source/src/serverutil.cpp @@ -95,6 +95,7 @@ char msgsizesl[] = // size inclusive message token, 0 for variable SV_MODELSKIN, 2, SV_FLAGPICKUP, 2, SV_FLAGDROP, 2, SV_FLAGRETURN, 2, SV_FLAGSCORE, 2, SV_FLAGINFO, 0, SV_FLAGS, 2, // EDIT: AH SV_SETMASTER, 2, SV_SETMASTERLOGIN, 0, SV_MASTERINFO, 2, SV_MASTERCMD, 3, + SV_FORCETEAM, 2, SV_AUTOTEAM, 2, SV_PWD, 0, SV_CLIENT, 0, -1