no message
git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@773 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
+39
-15
@@ -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)
|
||||
|
||||
@@ -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->gunselect<NUMGUNS) s_sprintf(vwep)("weapons/%s/world", hudgunnames[d->gunselect]);
|
||||
|
||||
+18
-12
@@ -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<playerent *> 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<mline> 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);
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
+4
-2
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
};
|
||||
|
||||
+46
-3
@@ -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<entity> &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);
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user