mirror of
https://git.code.sf.net/p/quake/prozac-qfcc
synced 2024-11-24 05:01:48 +00:00
9977533035
skin, and team are all set using setinfokey. You are no longer kicked for changing them. And the callback happily rejects every attempted change from the client (for skin and color atleast).
1347 lines
31 KiB
C++
1347 lines
31 KiB
C++
/*
|
||
TeamFortress 2.1 - 22/1/97
|
||
|
||
TeamFortress Software
|
||
Robin Walker, John Cook, Ian Caughley.
|
||
|
||
Functions handling all the help displaying for TeamFortress.
|
||
*/
|
||
// Prototypes
|
||
// Team Functions
|
||
float() TeamFortress_TeamPutPlayerInTeam;
|
||
float(float tno) TeamFortress_TeamSet;
|
||
float(float tno) TeamFortress_TeamGetColor;
|
||
void(float tno) TeamFortress_TeamSetColor;
|
||
void() TeamFortress_CheckTeamCheats;
|
||
void(float tno, float scoretoadd) TeamFortress_TeamIncreaseScore;
|
||
float(float tno) TeamFortress_TeamGetScore;
|
||
float (float tno) TeamFortress_TeamGetLives;
|
||
float(float tno) TeamFortress_TeamGetNoPlayers;
|
||
float (float tno) TeamFortress_TeamGetMaxPlayers;
|
||
float() TeamFortress_TeamGetWinner;
|
||
void(float tno) TeamFortress_TeamShowScores;
|
||
string(float tno) TeamFortress_TeamGetColorString;
|
||
void(entity Player) TeamFortress_TeamShowMemberClasses;
|
||
float(float tno) TeamFortress_TeamGetIllegalClasses;
|
||
float(float tno) TeamFortress_TeamIsCivilian;
|
||
#ifdef QUAKE_WORLD
|
||
void(entity p) SetTeamName;
|
||
#endif
|
||
string(float tno) GetTrueTeamName;
|
||
|
||
//-------- OfN ---------------------------------//
|
||
void(float tno, entity ignore) teamprefixsprint;
|
||
|
||
//- OfN - Extra cheat checking...
|
||
float (string skin_str) Is_TF_Skin;
|
||
float (float tno, float theColor ) IsValidTopColor;
|
||
|
||
//=========================================================================
|
||
// TEAM FUNCTIONS
|
||
//=========================================================================
|
||
// Put the player into the team with the least number of players in it. Return #TRUE if successful
|
||
float() TeamFortress_TeamPutPlayerInTeam =
|
||
{
|
||
local float i, j, lowest, likely_team;
|
||
local string st;
|
||
|
||
i = 1;
|
||
likely_team = random() * number_of_teams;
|
||
likely_team = ceil(likely_team);
|
||
if (likely_team == 0)
|
||
likely_team = number_of_teams;
|
||
lowest = 33;
|
||
while (i < (number_of_teams + 1))
|
||
{
|
||
j = TeamFortress_TeamGetNoPlayers(i);
|
||
if (j <= lowest) //WK j < lowest
|
||
{
|
||
// Is the team full?
|
||
if (TeamFortress_TeamGetMaxPlayers(i) > j)
|
||
{
|
||
if (lowest == j) { //WK tie
|
||
if (random() < (1/number_of_teams)) {
|
||
lowest = j;
|
||
likely_team = i;
|
||
}
|
||
}
|
||
else {
|
||
lowest = j;
|
||
likely_team = i;
|
||
}
|
||
}
|
||
}
|
||
i = i + 1;
|
||
}
|
||
|
||
// Put the player in likely_team
|
||
return TeamFortress_TeamSet(likely_team);
|
||
};
|
||
|
||
//=========================================================================
|
||
// Return the color for the team corresponding to the no passed in
|
||
float(float tno) TeamFortress_TeamGetColor =
|
||
{
|
||
if (tno == 1)
|
||
return #DARKBLUE;
|
||
if (tno == 2)
|
||
return #RED;
|
||
if (tno == 3)
|
||
return #YELLOW;
|
||
if (tno == 4)
|
||
return #DARKGREEN;
|
||
|
||
return 0;
|
||
};
|
||
|
||
//=========================================================================
|
||
// Set the color for the team corresponding to the no passed in, to self.team_no
|
||
void(float tno) TeamFortress_TeamSetColor =
|
||
{
|
||
if (tno == 1)
|
||
{
|
||
team1col = #DARKBLUE;
|
||
return;
|
||
}
|
||
if (tno == 2)
|
||
{
|
||
team2col = #RED;
|
||
return;
|
||
}
|
||
if (tno == 3)
|
||
{
|
||
team3col = #YELLOW;
|
||
return;
|
||
}
|
||
if (tno == 4)
|
||
{
|
||
team4col = #DARKGREEN;
|
||
return;
|
||
}
|
||
};
|
||
|
||
#ifdef QUAKE_WORLD
|
||
string(float tno) GetTeamName =
|
||
{
|
||
local string st;
|
||
|
||
if (tno == 1)
|
||
{
|
||
/*if (world.b_b != "" && world.b_b != string_null)
|
||
{
|
||
return world.b_b;
|
||
}*/
|
||
|
||
st = infokey(world, "team1");
|
||
if (st == string_null)
|
||
st = infokey(world, "t1");
|
||
|
||
if (st == string_null || st == "")
|
||
return "blue";
|
||
}
|
||
else if (tno == 2)
|
||
{
|
||
/*if (world.b_t != "" && world.b_t != string_null)
|
||
{
|
||
return world.b_t;
|
||
}*/
|
||
|
||
st = infokey(world, "team2");
|
||
if (st == string_null)
|
||
st = infokey(world, "t2");
|
||
|
||
if (st == string_null || st == "")
|
||
return "red";
|
||
}
|
||
else if (tno == 3)
|
||
{
|
||
/*if (world.b_n != "" && world.b_n != string_null)
|
||
{
|
||
return world.b_n;
|
||
}*/
|
||
|
||
st = infokey(world, "team3");
|
||
if (st == string_null)
|
||
st = infokey(world, "t3");
|
||
|
||
if (st == string_null || st == "")
|
||
return "yell";
|
||
}
|
||
else if (tno == 4)
|
||
{
|
||
/*if (world.b_o != "" && world.b_o != string_null)
|
||
{
|
||
return world.b_o;
|
||
}*/
|
||
|
||
st = infokey(world, "team4");
|
||
if (st == string_null)
|
||
st = infokey(world, "t4");
|
||
|
||
if (st == string_null || st == "")
|
||
return "teal";
|
||
}
|
||
else
|
||
st = "\"\"";
|
||
|
||
return st;
|
||
};
|
||
//returns only the team color
|
||
string(float tno) GetTrueTeamName =
|
||
{
|
||
if (tno == 1)
|
||
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
||
else if (tno == 2)
|
||
return "<EFBFBD><EFBFBD><EFBFBD>";
|
||
else if (tno == 3)
|
||
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
||
else if (tno == 4)
|
||
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
||
else
|
||
return "ERROR";
|
||
};
|
||
#endif
|
||
|
||
#ifdef QUAKE_WORLD
|
||
void(entity p) SetTeamName =
|
||
{
|
||
local string st;
|
||
|
||
st = GetTeamName(p.team_no);
|
||
stuffcmd(p, "team ");
|
||
stuffcmd(p, st);
|
||
stuffcmd(p, "\n");
|
||
setinfokey(p, "team", st);
|
||
};
|
||
#endif
|
||
|
||
//=========================================================================
|
||
// Set the current player's.team_no to self.impulse. Return #TRUE if successful
|
||
float(float tno) TeamFortress_TeamSet =
|
||
{
|
||
local string st;
|
||
local float tc;
|
||
|
||
if (teamplay < 1)
|
||
{
|
||
sprint (self, #PRINT_HIGH, "Teamplay is not On, so FortressTeams are inactive.\n");
|
||
return #FALSE;
|
||
}
|
||
|
||
/* if (chris)
|
||
if (prematch > time)
|
||
{
|
||
sprint(self, #PRINT_HIGH, "Sorry, Chris' Teamplay Plus Mode is active and a round is in progress. Please wait for the next round to begin.\n");
|
||
PlayerObserverMode();
|
||
}*/
|
||
|
||
if (tno > number_of_teams && number_of_teams != 0)
|
||
{
|
||
sprint (self, #PRINT_HIGH, "There can be only ");
|
||
st = ftos(number_of_teams);
|
||
sprint (self, #PRINT_HIGH, st);
|
||
sprint (self, #PRINT_HIGH, " teams on this map.\nTry again\n");
|
||
return #FALSE;
|
||
}
|
||
|
||
if (self.team_no > 0)
|
||
{
|
||
sprint (self, #PRINT_HIGH, "You're already in Team No ");
|
||
st = ftos(self.team_no);
|
||
sprint (self, #PRINT_HIGH, st);
|
||
sprint (self, #PRINT_HIGH, ".\n");
|
||
return #FALSE;
|
||
}
|
||
|
||
tc = TeamFortress_TeamGetNoPlayers(tno);
|
||
if (tc >= TeamFortress_TeamGetMaxPlayers(tno))
|
||
{
|
||
//- OfN
|
||
if (mapname == "huntedr")
|
||
{
|
||
if (tno == 3)
|
||
sprint (self, #PRINT_HIGH, "The game has already enough assassins, be a bodyguard.\n");
|
||
else if (tno == 1)
|
||
sprint (self, #PRINT_HIGH, "You wanna be the vicepresident or what?\n");
|
||
}
|
||
else
|
||
sprint (self, #PRINT_HIGH, "That team is full. Pick another.\n");
|
||
|
||
return #FALSE;
|
||
}
|
||
|
||
// If the color for the team this player is changing to is 0,
|
||
// then this is the first player in this team, and we set the
|
||
// teamcolor to this player's pants color.
|
||
// If not, we change this player's color to this team.
|
||
if (TeamFortress_TeamGetColor(tno) == 0)
|
||
{
|
||
TeamFortress_TeamSetColor(tno);
|
||
// If the color wasn't set
|
||
if (TeamFortress_TeamGetColor(tno) == 0)
|
||
{
|
||
sprint (self, #PRINT_HIGH, "You can't start a new team with your color, since another ");
|
||
sprint (self, #PRINT_HIGH, "already using that color. Change your pants color, then try again.\n");
|
||
return #FALSE;
|
||
}
|
||
|
||
// Announce the new team
|
||
bprint(#PRINT_HIGH, self.netname);
|
||
bprint(#PRINT_HIGH, " has started Team No ");
|
||
st = ftos(tno);
|
||
bprint(#PRINT_HIGH, st);
|
||
bprint(#PRINT_HIGH, ".\n");
|
||
|
||
// Prevent the cheatchecking mechanism from nabbing them b4 the
|
||
// color command works.
|
||
makeImmune(self,time+10);
|
||
//self.immune_to_check = time + 10;
|
||
// FOO
|
||
tc = TeamFortress_TeamGetColor(tno) - 1;
|
||
st = ftos(tc);
|
||
setinfokey(self, "color", st);
|
||
/*
|
||
// Set the player's color
|
||
stuffcmd(self, "color ");
|
||
tc = TeamFortress_TeamGetColor(tno) - 1;
|
||
st = ftos(tc);
|
||
|
||
//- OfN - Nice colors
|
||
if (nicecolors==1) st =TeamGetNiceColor(tno);
|
||
|
||
stuffcmd(self, st);
|
||
stuffcmd(self, "\n");
|
||
*/
|
||
self.team_no = tno;
|
||
self.lives = TeamFortress_TeamGetLives(tno);
|
||
|
||
#ifdef QUAKE_WORLD
|
||
SetTeamName(self);
|
||
#endif
|
||
|
||
// Set the Civilian Class of anyone in a Civilian Team
|
||
if (self.playerclass == #PC_UNDEFINED)
|
||
{
|
||
if (TeamFortress_TeamIsCivilian(self.team_no))
|
||
{
|
||
self.impulse = 1;
|
||
TeamFortress_ChangeClass();
|
||
}
|
||
}
|
||
|
||
return #TRUE;
|
||
}
|
||
|
||
// Announce the new teammember
|
||
bprint(#PRINT_HIGH, self.netname);
|
||
bprint(#PRINT_HIGH, " has joined Team No ");
|
||
st = ftos(tno);
|
||
bprint(#PRINT_HIGH, st);
|
||
bprint(#PRINT_HIGH, ".\n");
|
||
|
||
//FOO
|
||
tc = TeamFortress_TeamGetColor(tno) - 1;
|
||
st = ftos(tc);
|
||
setinfokey(self, "topcolor", st);
|
||
setinfokey(self, "bottomcolor", st);
|
||
|
||
// Set the player's color
|
||
stuffcmd(self, "color ");
|
||
tc = TeamFortress_TeamGetColor(tno) - 1;
|
||
st = ftos(tc);
|
||
|
||
//- OfN - Nice colors
|
||
if (nicecolors==1) st =TeamGetNiceColor(tno);
|
||
|
||
stuffcmd(self, st);
|
||
stuffcmd(self, "\n");
|
||
|
||
self.team_no = tno;
|
||
// Prevent the cheatchecking mechanism from nabbing them b4 the
|
||
// color command works.
|
||
// makeImmune(self,time+10);
|
||
//self.immune_to_check = time + 10;
|
||
self.lives = TeamFortress_TeamGetLives(tno);
|
||
|
||
// Tell them what class the other members of their team are
|
||
TeamFortress_TeamShowMemberClasses(self);
|
||
|
||
#ifdef QUAKE_WORLD
|
||
SetTeamName(self);
|
||
#endif
|
||
|
||
// Set the Civilian Class of anyone in a Civilian Team
|
||
if (self.playerclass == #PC_UNDEFINED)
|
||
{
|
||
if (TeamFortress_TeamIsCivilian(self.team_no))
|
||
{
|
||
self.impulse = 1;
|
||
TeamFortress_ChangeClass();
|
||
}
|
||
}
|
||
//RJM
|
||
if (toggleflags & #TFLAG_TEAMFRAGS)
|
||
self.frags = TeamFortress_TeamGetScore(self.team_no);
|
||
//RJM
|
||
|
||
//- OfN Team3 should have less players than red in Hunted
|
||
if (mapname == "huntedr")
|
||
{
|
||
local float result;
|
||
result = floor(TeamFortress_TeamGetNoPlayers(2) * #HUNTED_YELLOWTEAM_FACTOR);
|
||
team3maxplayers = result;
|
||
if (team3maxplayers < 1) team3maxplayers = 1;
|
||
}
|
||
|
||
return #TRUE;
|
||
};
|
||
|
||
//=========================================================================
|
||
// Make sure no-one is changing their colors
|
||
void() TeamFortress_CheckTeamCheats =
|
||
{
|
||
local string st, sk;
|
||
local float tc;
|
||
local float rate;
|
||
|
||
if (self.immune_to_chec > time)
|
||
return;
|
||
|
||
if (self.deadflag)
|
||
return;
|
||
|
||
#ifdef COOP_MODE
|
||
if (coop && !deathmatch) // don't worry about it if in coop game
|
||
return;
|
||
#endif
|
||
|
||
//WK Add in hack for "skins" cheat. This is as good a place as any
|
||
if (self.netname == string_null) {
|
||
stuffcmd(self,"name \"I'm a cheater even when RENAMED\"\n");
|
||
stuffcmd(self,"disconnect\n");
|
||
}
|
||
|
||
#ifdef QUAKE_WORLD
|
||
//WK Limit rate to 10k?
|
||
st = infokey(self,"rate");
|
||
if (st != string_null)
|
||
rate = stof(st);
|
||
if (rate > 10000) {
|
||
stuffcmd(self,"rate 10000\n");
|
||
}
|
||
#endif
|
||
|
||
//- OfN - Added checking for topcolor changes... (see IsValidTopColor in OfteN.qc)
|
||
local float tTopColor;
|
||
st = infokey(self,"topcolor");
|
||
tTopColor=stof(st);
|
||
|
||
// Have they changed color?
|
||
if (self.team_no > 0 && teamplay > 0)
|
||
{
|
||
#ifndef QUAKE_WORLD
|
||
// if they're a spy, check to see if they've changed colors manually
|
||
if ((self.cutf_items & #CUTF_SPY_KIT) && self.undercover_team != 0)
|
||
{
|
||
if (TeamFortress_TeamGetColor(self.undercover_team) != self.team) //- OfN
|
||
//if ((TeamFortress_TeamGetColor(self.undercover_team) != self.team) || !IsValidTopColor(self.undercover_team,tTopColor))
|
||
// || !IsValidTopColor(self.undercover_team,tTopColor)
|
||
{
|
||
// Set their color
|
||
stuffcmd(self, "color ");
|
||
tc = TeamFortress_TeamGetColor(self.undercover_team) - 1;
|
||
|
||
st = ftos(tc);
|
||
|
||
//- OfN - Nice colors
|
||
if (nicecolors==1) st =TeamGetNiceColor(self.undercover_team);
|
||
|
||
stuffcmd(self, st);
|
||
stuffcmd(self, "\n");
|
||
setinfokey(self, "topcolor", st);
|
||
setinfokey(self, "bottomcolor", st);
|
||
|
||
// bprint2(#PRINT_MEDIUM, self.netname, " has been kicked for changing color.\n");
|
||
// sprint(self, #PRINT_HIGH, "You have been kicked for changing your color. Don't do it.\n");
|
||
// stuffcmd(self, "disconnect\n");
|
||
return;
|
||
}
|
||
}
|
||
else if (TeamFortress_TeamGetColor(self.team_no) != self.team)
|
||
{
|
||
// Set their color
|
||
stuffcmd(self, "color ");
|
||
tc = TeamFortress_TeamGetColor(self.team_no) - 1;
|
||
st = ftos(tc);
|
||
|
||
//- OfN - Nice colors
|
||
if (nicecolors==1) st =TeamGetNiceColor(self.team_no);
|
||
|
||
stuffcmd(self, st);
|
||
stuffcmd(self, "\n");
|
||
setinfokey(self, "topcolor", st);
|
||
setinfokey(self, "bottomcolor", st);
|
||
|
||
// bprint2(#PRINT_MEDIUM, self.netname, " has been kicked for changing color.\n");
|
||
// sprint(self, #PRINT_HIGH, "You have been kicked for changing your color. Don't do it.\n");
|
||
// stuffcmd(self, "disconnect\n");
|
||
return;
|
||
}
|
||
#else
|
||
// QuakeWorld
|
||
st = infokey(self, "bottomcolor");
|
||
tc = stof(st);
|
||
// if they're a spy, check to see if they've changed colors manually
|
||
if ((self.cutf_items & #CUTF_SPY_KIT) && self.undercover_team != 0)
|
||
{
|
||
if ((TeamFortress_TeamGetColor(self.undercover_team) - 1) != tc || !IsValidTopColor(self.undercover_team,tTopColor))
|
||
{
|
||
#ifdef CHEAT_WARNINGS
|
||
RPrint(self.netname);
|
||
RPrint(" had his colors reset.\n");
|
||
#endif
|
||
|
||
// Set the player's color
|
||
stuffcmd(self, "color ");
|
||
tc = TeamFortress_TeamGetColor(self.undercover_team) - 1;
|
||
st = ftos(tc);
|
||
|
||
//- OfN - Nice colors
|
||
if (nicecolors==1) st =TeamGetNiceColor(self.undercover_team);
|
||
|
||
stuffcmd(self, st);
|
||
stuffcmd(self, "\n");
|
||
setinfokey(self, "topcolor", st);
|
||
setinfokey(self, "bottomcolor", st);
|
||
|
||
// bprint2(#PRINT_MEDIUM, self.netname, " has been kicked for changing color.\n");
|
||
// sprint(self, #PRINT_HIGH, "You have been kicked for changing your color. Don't do it.\n");
|
||
// stuffcmd(self, "disconnect\n");
|
||
return;
|
||
}
|
||
}
|
||
else if (tc != (TeamFortress_TeamGetColor(self.team_no) - 1) || !IsValidTopColor(self.team_no,tTopColor))
|
||
{
|
||
#ifdef CHEAT_WARNINGS
|
||
RPrint(self.netname);
|
||
RPrint(" had his colors reset.\n");
|
||
#endif
|
||
|
||
// Set the player's color
|
||
stuffcmd(self, "color ");
|
||
tc = TeamFortress_TeamGetColor(self.team_no) - 1;
|
||
st = ftos(tc);
|
||
|
||
//- OfN - Nice colors
|
||
if (nicecolors==1) st =TeamGetNiceColor(self.team_no);
|
||
|
||
stuffcmd(self, st);
|
||
stuffcmd(self, "\n");
|
||
setinfokey(self, "topcolor", st);
|
||
setinfokey(self, "bottomcolor", st);
|
||
|
||
// bprint2(#PRINT_MEDIUM, self.netname, " has been kicked for changing color.\n");
|
||
// sprint(self, #PRINT_HIGH, "You have been kicked for changing your color. Don't do it.\n");
|
||
// stuffcmd(self, "disconnect\n");
|
||
return;
|
||
}
|
||
|
||
#endif
|
||
|
||
// Have they changed their skin?
|
||
#ifdef QUAKE_WORLD
|
||
if (self.playerclass != #PC_UNDEFINED)
|
||
{
|
||
//WK For some reason, this isn't reading right for el PC_CUSTOM
|
||
st = infokey(self, "skin");
|
||
tc = 0;
|
||
|
||
// OfN kick custom player classes using a non TF-skin
|
||
if (self.playerclass == #PC_CUSTOM && !Is_TF_Skin(st))
|
||
{
|
||
TeamFortress_SetSkin(self);
|
||
|
||
// bprint2(#PRINT_MEDIUM, self.netname, " has been kicked for changing skin.\n");
|
||
// sprint(self, #PRINT_HIGH, "You have been kicked for changing your skin. Don't do it.\n");
|
||
// stuffcmd(self, "disconnect\n");
|
||
}
|
||
|
||
if ((self.cutf_items & #CUTF_SPY_KIT) && self.undercover_skin != 0)
|
||
{
|
||
//WK tc = #PC_SPY;
|
||
tc = self.playerclass;
|
||
self.playerclass = self.undercover_skin;
|
||
}
|
||
|
||
if ( self.playerclass == #PC_SCOUT )
|
||
sk = "tf_scout";
|
||
else if ( self.playerclass == #PC_SNIPER )
|
||
sk = "tf_snipe";
|
||
else if ( self.playerclass == #PC_SOLDIER )
|
||
sk = "tf_sold";
|
||
else if ( self.playerclass == #PC_DEMOMAN )
|
||
sk = "tf_demo";
|
||
else if ( self.playerclass == #PC_MEDIC )
|
||
sk = "tf_medic";
|
||
else if ( self.playerclass == #PC_HVYWEAP )
|
||
sk = "tf_hwguy";
|
||
else if ( self.playerclass == #PC_PYRO )
|
||
sk = "tf_pyro";
|
||
else if ( self.playerclass == #PC_SPY )
|
||
sk = "tf_spy";
|
||
else if ( self.playerclass == #PC_ENGINEER )
|
||
sk = "tf_eng";
|
||
else
|
||
{
|
||
if ((self.cutf_items & #CUTF_SPY_KIT) && self.undercover_skin != 0)
|
||
{
|
||
self.playerclass = tc;
|
||
}
|
||
return; //WK Don't check as a safety precaution.
|
||
}
|
||
|
||
if (self.cutf_items & #CUTF_SPY_KIT && self.undercover_skin != 0)
|
||
{
|
||
//sprint(self,#PRINT_HIGH,"Mommy Wuvs You!\n");
|
||
self.playerclass = tc;
|
||
}
|
||
|
||
//WK Ignore our custom, spy-kitting friends. Kick everyone else
|
||
if ((st != sk) && !((self.playerclass == #PC_CUSTOM) && (self.cutf_items & #CUTF_SPY_KIT)))
|
||
{
|
||
#ifdef CHEAT_WARNINGS
|
||
RPrint(self.netname);
|
||
RPrint(" had his skin reset.\n");
|
||
#endif
|
||
|
||
TeamFortress_SetSkin(self);
|
||
|
||
// bprint2(#PRINT_MEDIUM, self.netname, " has been kicked for changing skin.\n");
|
||
// sprint(self, #PRINT_HIGH, "You have been kicked for changing your skin. Don't do it.\n");
|
||
// stuffcmd(self, "disconnect\n");
|
||
}
|
||
|
||
}
|
||
|
||
|
||
// Have they Changed their Team?
|
||
st = GetTeamName(self.team_no);
|
||
if (st != infokey(self, "team"))
|
||
{
|
||
if (self.penance_time < time) { //Ignore if we're cursed
|
||
|
||
#ifdef CHEAT_WARNINGS
|
||
RPrint(self.netname);
|
||
RPrint(" had his team reset.\n");
|
||
#endif
|
||
|
||
// Set the player's team
|
||
SetTeamName(self);
|
||
bprint2(#PRINT_MEDIUM, self.netname, " has been kicked for changing team.\n");
|
||
sprint(self, #PRINT_HIGH, "You have been kicked for changing your team. Don't do it.\n");
|
||
stuffcmd(self, "disconnect\n");
|
||
return;
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
};
|
||
|
||
void(string key, string value) UserInfoCallback =
|
||
{
|
||
local string oldval;
|
||
local string st;
|
||
oldval = infokey(self, key);
|
||
|
||
if(value == oldval) // generic reject
|
||
{
|
||
bprint(#PRINT_MEDIUM, "[oldval (" + key + ")(" + value + ")(" + oldval + ")]\n");
|
||
return 1; // rejected!
|
||
}
|
||
|
||
if (key == "topcolor" || key == "bottomcolor")
|
||
{
|
||
// no changing colors allowed
|
||
st = infokey(self, "bottomcolor"); // make sure top is same as bottom
|
||
setinfokey(self, "topcolor", st);
|
||
stuffcmd(self, "color ");
|
||
stuffcmd(self, st);
|
||
stuffcmd(self, "\n");
|
||
bprint(#PRINT_MEDIUM, "[color (" + key + ")(" + value + ")(" + oldval + ")]\n");
|
||
return 1;
|
||
}
|
||
else if (key == "skin")
|
||
{
|
||
stuffcmd(self, "skin ");
|
||
stuffcmd(self, oldval);
|
||
stuffcmd(self, "\n");
|
||
bprint(#PRINT_MEDIUM, "[skin (" + key + ")(" + value + ")(" + oldval + ")]\n");
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
bprint(#PRINT_MEDIUM, "[default (" + key + ")(" + value + ")(" + oldval + ")]\n");
|
||
return 0; // accept everything else
|
||
}
|
||
};
|
||
|
||
//=========================================================================
|
||
// Increase the score of a team
|
||
void(float tno, float scoretoadd) TeamFortress_TeamIncreaseScore =
|
||
{
|
||
local entity e;
|
||
|
||
if (tno == 0 || scoretoadd == 0)
|
||
return;
|
||
|
||
if (tno == 1)
|
||
team1score = team1score + scoretoadd;
|
||
if (tno == 2)
|
||
team2score = team2score + scoretoadd;
|
||
if (tno == 3)
|
||
team3score = team3score + scoretoadd;
|
||
if (tno == 4)
|
||
team4score = team4score + scoretoadd;
|
||
|
||
// If TeamFrags is on, update all the team's player's frags.
|
||
if (toggleflags & #TFLAG_TEAMFRAGS)
|
||
{
|
||
e = find(world, classname, "player");
|
||
while (e)
|
||
{
|
||
if (e.team_no == tno)
|
||
e.frags = TeamFortress_TeamGetScore(tno);
|
||
e = find(e, classname, "player");
|
||
}
|
||
}
|
||
};
|
||
|
||
//=========================================================================
|
||
// Return the score of a team
|
||
float (float tno) TeamFortress_TeamGetScore =
|
||
{
|
||
if (tno == 1)
|
||
return team1score;
|
||
if (tno == 2)
|
||
return team2score;
|
||
if (tno == 3)
|
||
return team3score;
|
||
if (tno == 4)
|
||
return team4score;
|
||
|
||
return 0;
|
||
};
|
||
|
||
//=========================================================================
|
||
// Return the number of lives each team member in a team has
|
||
float (float tno) TeamFortress_TeamGetLives =
|
||
{
|
||
if (tno == 1)
|
||
return team1lives;
|
||
if (tno == 2)
|
||
return team2lives;
|
||
if (tno == 3)
|
||
return team3lives;
|
||
if (tno == 4)
|
||
return team4lives;
|
||
|
||
return 0;
|
||
};
|
||
|
||
//=========================================================================
|
||
// Return the number of players in a team
|
||
float (float tno) TeamFortress_TeamGetNoPlayers =
|
||
{
|
||
local float size_team;
|
||
local entity search;
|
||
//local string st;
|
||
|
||
search = find (world, classname, "player");
|
||
while (search != world)
|
||
{
|
||
if (search.team_no == tno)
|
||
size_team = size_team + 1;
|
||
search = find (search, classname, "player");
|
||
}
|
||
|
||
return size_team;
|
||
};
|
||
|
||
//=========================================================================
|
||
// Return the number of lives each team member in a team has
|
||
float (float tno) TeamFortress_TeamGetMaxPlayers =
|
||
{
|
||
if (tno == 1)
|
||
return team1maxplayers;
|
||
if (tno == 2)
|
||
return team2maxplayers;
|
||
if (tno == 3)
|
||
return team3maxplayers;
|
||
if (tno == 4)
|
||
return team4maxplayers;
|
||
|
||
return 0;
|
||
};
|
||
|
||
//=========================================================================
|
||
// Return the team that's winning
|
||
float() TeamFortress_TeamGetWinner =
|
||
{
|
||
local float i,j,highest,highestteam;
|
||
|
||
i = 1;
|
||
highest = 0;
|
||
highestteam = 0;
|
||
while (i < (number_of_teams + 1))
|
||
{
|
||
j = TeamFortress_TeamGetScore(i);
|
||
if (j > highest)
|
||
{
|
||
highest = j;
|
||
highestteam = i;
|
||
}
|
||
i = i + 1;
|
||
}
|
||
|
||
return highestteam;
|
||
};
|
||
|
||
//=========================================================================
|
||
// Return the team that's winning
|
||
/*CH i saw no uses
|
||
float() TeamFortress_TeamGetSecond =
|
||
{
|
||
local float i,j,highest,highestteam, secondteam, second;
|
||
|
||
i = 1;
|
||
highestteam = TeamFortress_TeamGetWinner();
|
||
highest = TeamFortress_TeamGetScore(highestteam);
|
||
secondteam = 0;
|
||
second = 0;
|
||
while (i < (number_of_teams + 1))
|
||
{
|
||
j = TeamFortress_TeamGetScore(i);
|
||
if (j < highest && j > second)
|
||
{
|
||
second = j;
|
||
secondteam = i;
|
||
}
|
||
i = i + 1;
|
||
}
|
||
|
||
return secondteam;
|
||
};
|
||
*/
|
||
//=========================================================================
|
||
// Display all the Team Scores
|
||
void(float all) TeamFortress_TeamShowScores =
|
||
{
|
||
local string st;
|
||
local float i,j;
|
||
|
||
i = 1;
|
||
// short scores
|
||
if (all == 2)
|
||
{
|
||
while (i <= number_of_teams)
|
||
{
|
||
if (TeamFortress_TeamGetColor(i) > 0)
|
||
{
|
||
j = TeamFortress_TeamGetScore(i);
|
||
st = TeamFortress_TeamGetColorString(i);
|
||
|
||
bprint(#PRINT_HIGH, st);
|
||
bprint(#PRINT_HIGH, ": ");
|
||
st = ftos(j);
|
||
bprint(#PRINT_HIGH, st);
|
||
bprint(#PRINT_HIGH, " ");
|
||
}
|
||
i = i + 1;
|
||
}
|
||
bprint (#PRINT_HIGH, "\n");
|
||
return;
|
||
}
|
||
|
||
// long scores
|
||
while (i <= number_of_teams)
|
||
{
|
||
if (TeamFortress_TeamGetColor(i) > 0)
|
||
{
|
||
if (all)
|
||
bprint (#PRINT_HIGH, "Team ");
|
||
else
|
||
sprint (self, #PRINT_HIGH, "Team ");
|
||
|
||
st = ftos(i);
|
||
if (all)
|
||
bprint (#PRINT_HIGH, st);
|
||
else
|
||
sprint (self, #PRINT_HIGH, st);
|
||
|
||
if (all)
|
||
bprint (#PRINT_HIGH, " (");
|
||
else
|
||
sprint (self, #PRINT_HIGH, " (");
|
||
|
||
st = TeamFortress_TeamGetColorString(i);
|
||
if (all)
|
||
bprint (#PRINT_HIGH, st);
|
||
else
|
||
sprint (self, #PRINT_HIGH, st);
|
||
|
||
if (all)
|
||
bprint (#PRINT_HIGH, ") : ");
|
||
else
|
||
sprint (self, #PRINT_HIGH, ") : ");
|
||
|
||
j = TeamFortress_TeamGetScore(i);
|
||
st = ftos(j);
|
||
|
||
if (all)
|
||
bprint (#PRINT_HIGH, st);
|
||
else
|
||
sprint (self, #PRINT_HIGH, st);
|
||
|
||
if (all)
|
||
bprint (#PRINT_HIGH, "\n");
|
||
else
|
||
sprint (self, #PRINT_HIGH, "\n");
|
||
}
|
||
i = i + 1;
|
||
}
|
||
};
|
||
|
||
//=========================================================================
|
||
// Return a string containing the color of the team passed in tno
|
||
string(float tno) TeamFortress_TeamGetColorString =
|
||
{
|
||
local float col;
|
||
|
||
col = TeamFortress_TeamGetColor(tno);
|
||
if (col == 1)
|
||
return "White";
|
||
if (col == 2)
|
||
return "Brown";
|
||
if (col == 3)
|
||
return "LightBlue"; //- OfN was blue
|
||
if (col == 4)
|
||
return "Green";
|
||
if (col == 5)
|
||
return "Red";
|
||
if (col == 6)
|
||
return "Tan";
|
||
if (col == 7)
|
||
return "Pink";
|
||
if (col == 8)
|
||
return "Orange";
|
||
if (col == 9)
|
||
return "Purple";
|
||
if (col == 10)
|
||
return "DarkPurple";
|
||
if (col == 11)
|
||
return "Grey";
|
||
if (col == 12)
|
||
return "DarkGreen";
|
||
if (col == 13)
|
||
return "Yellow";
|
||
|
||
return "Blue"; // was DarkBlue
|
||
};
|
||
|
||
//=========================================================================
|
||
// Print to the Player's screen a list of all the members of his/her
|
||
// team, and the class they've chosen
|
||
void(entity Player) TeamFortress_TeamShowMemberClasses =
|
||
{
|
||
/*local string st;
|
||
st = infokey(world, "no_showmembers"); */
|
||
|
||
local entity e;
|
||
local float found;
|
||
|
||
found = #FALSE;
|
||
|
||
e = find(world, classname, "player");
|
||
while (e)
|
||
{
|
||
if (((e.team_no == Player.team_no) || (e.team_no == 0)) && (e != Player))
|
||
{
|
||
if (e.model != string_null) // check if valid player
|
||
{
|
||
if (!found)
|
||
{
|
||
found = #TRUE;
|
||
sprint (self, #PRINT_HIGH, "The other members of your team are:\n");
|
||
}
|
||
|
||
sprint (Player, #PRINT_HIGH, e.netname);
|
||
sprint (Player, #PRINT_HIGH, " : ");
|
||
if (e.playerclass != #PC_CUSTOM)
|
||
TeamFortress_PrintClassName(Player,e.playerclass, (e.tfstate & #TFSTATE_RANDOMPC));
|
||
else
|
||
TeamFortress_PrintJobName(Player,e.job);
|
||
|
||
}
|
||
}
|
||
e = find(e, classname, "player");
|
||
}
|
||
|
||
if (!found)
|
||
{
|
||
sprint (Player, #PRINT_HIGH, "There are no other players on your team.\n");
|
||
}
|
||
};
|
||
|
||
|
||
void() CalculateTeamEqualiser =
|
||
{
|
||
local float t1, t2, t3, t4;
|
||
local float t_ave, calc;
|
||
|
||
team1advantage = 1;
|
||
team2advantage = 1;
|
||
team3advantage = 1;
|
||
team4advantage = 1;
|
||
|
||
if (number_of_teams < 2)
|
||
{
|
||
// not enought teams!
|
||
// wait a while, then try again (more teams may be created)
|
||
self.nextthink = time + 60;
|
||
return;
|
||
}
|
||
|
||
if (teamplay & #TEAMPLAY_LESSPLAYERSHELP)
|
||
{
|
||
|
||
t1 = TeamFortress_TeamGetNoPlayers(1);
|
||
t2 = TeamFortress_TeamGetNoPlayers(2);
|
||
t3 = TeamFortress_TeamGetNoPlayers(3);
|
||
t4 = TeamFortress_TeamGetNoPlayers(4);
|
||
|
||
if ((t1 + t2 + t3 + t4) < 1) // is there any players at all?
|
||
{
|
||
self.nextthink = time + 30;
|
||
return;
|
||
}
|
||
|
||
t_ave = (t1 + t2 + t3 + t4) / number_of_teams;
|
||
|
||
// calulate teams equalisation ratio
|
||
if (t1 > 0)
|
||
{
|
||
calc = (t_ave / t1) - 1;
|
||
|
||
if (calc != 0)
|
||
calc = (calc / 3) + 1;
|
||
else
|
||
calc = calc + 1;
|
||
|
||
team1advantage = calc;
|
||
}
|
||
|
||
if (t2 > 0 && number_of_teams >= 2)
|
||
{
|
||
calc = (t_ave / t2) - 1;
|
||
|
||
if (calc != 0)
|
||
calc = (calc / 3) + 1;
|
||
else
|
||
calc = calc + 1;
|
||
|
||
team2advantage = calc;
|
||
}
|
||
|
||
if (t3 > 0 && number_of_teams >= 3)
|
||
{
|
||
calc = (t_ave / t3) - 1;
|
||
|
||
if (calc != 0)
|
||
calc = (calc / 3) + 1;
|
||
else
|
||
calc = calc + 1;
|
||
|
||
team3advantage = calc;
|
||
}
|
||
|
||
if (t4 > 0 && number_of_teams >= 4)
|
||
{
|
||
calc = (t_ave / t4) - 1;
|
||
|
||
if (calc != 0)
|
||
calc = (calc / 3) + 1;
|
||
else
|
||
calc = calc + 1;
|
||
|
||
team4advantage = calc;
|
||
}
|
||
}
|
||
|
||
if (teamplay & #TEAMPLAY_LESSSCOREHELP)
|
||
{
|
||
t1 = team1score + #TEAM_HELP_RATE;
|
||
|
||
if (number_of_teams >= 2)
|
||
t2 = team2score + #TEAM_HELP_RATE;
|
||
else
|
||
t2 = 0;
|
||
|
||
if (number_of_teams >= 3)
|
||
t3 = team3score + #TEAM_HELP_RATE;
|
||
else
|
||
t3 = 0;
|
||
|
||
if (number_of_teams >= 4)
|
||
t4 = team4score + #TEAM_HELP_RATE;
|
||
else
|
||
t4 = 0;
|
||
|
||
|
||
// calulate teams equalisation ratio
|
||
t_ave = (t2 + t3 + t4) / (number_of_teams - 1);
|
||
|
||
calc = (t_ave / t1) - 1;
|
||
|
||
if (calc != 0)
|
||
calc = (calc / 3) + 1;
|
||
else
|
||
calc = calc + 1;
|
||
|
||
team1advantage = calc * team1advantage;
|
||
|
||
if (number_of_teams >= 2)
|
||
{
|
||
t_ave = (t1 + t3 + t4) / (number_of_teams - 1);
|
||
|
||
calc = (t_ave / t2) - 1;
|
||
|
||
if (calc != 0)
|
||
calc = (calc / 3) + 1;
|
||
else
|
||
calc = calc + 1;
|
||
|
||
team2advantage = calc * team2advantage;
|
||
}
|
||
|
||
if (number_of_teams >= 3)
|
||
{
|
||
t_ave = (t2 + t1 + t4) / (number_of_teams - 1);
|
||
|
||
calc = (t_ave / t3) - 1;
|
||
|
||
if (calc != 0)
|
||
calc = (calc / 3) + 1;
|
||
else
|
||
calc = calc + 1;
|
||
|
||
team3advantage = calc * team3advantage;
|
||
}
|
||
|
||
if (number_of_teams >= 4)
|
||
{
|
||
t_ave = (t2 + t3 + t1) / (number_of_teams - 1);
|
||
|
||
calc = (t_ave / t4) - 1;
|
||
|
||
if (calc != 0)
|
||
calc = (calc / 3) + 1;
|
||
else
|
||
calc = calc + 1;
|
||
|
||
team4advantage = calc * team4advantage;
|
||
}
|
||
}
|
||
|
||
self.nextthink = time + 10;
|
||
};
|
||
|
||
|
||
void() SetupTeamEqualiser =
|
||
{
|
||
team1advantage = 1;
|
||
team2advantage = 1;
|
||
team3advantage = 1;
|
||
team4advantage = 1;
|
||
|
||
if (!(teamplay & (#TEAMPLAY_LESSPLAYERSHELP | #TEAMPLAY_LESSSCOREHELP)))
|
||
return;
|
||
|
||
// setup teamplay timer
|
||
local entity TE;
|
||
|
||
TE = spawn();
|
||
TE.classname = "Team Equaliser";
|
||
TE.think = CalculateTeamEqualiser;
|
||
TE.nextthink = time + 30;
|
||
};
|
||
|
||
|
||
float (entity targ, entity attacker, float damage) TeamEqualiseDamage =
|
||
{
|
||
if (targ.classname != "player" || attacker.classname != "player")
|
||
return damage;
|
||
|
||
if (Teammate(targ.team_no, attacker.team_no))
|
||
return damage;
|
||
|
||
local float adv, newdam;
|
||
|
||
// increase damage done by attacker's team advantage
|
||
if (attacker.team_no == 1)
|
||
adv = team1advantage;
|
||
else if (attacker.team_no == 2)
|
||
adv = team2advantage;
|
||
else if (attacker.team_no == 3)
|
||
adv = team3advantage;
|
||
else if (attacker.team_no == 4)
|
||
adv = team4advantage;
|
||
|
||
if (adv == 0)
|
||
{
|
||
RPrint("There is a team with an advantage of 0\n");
|
||
adv = 0.1;
|
||
}
|
||
|
||
newdam = damage * adv;
|
||
|
||
// reduce damage done by target's team advantage
|
||
if (targ.team_no == 1)
|
||
adv = team1advantage;
|
||
else if (targ.team_no == 2)
|
||
adv = team2advantage;
|
||
else if (targ.team_no == 3)
|
||
adv = team3advantage;
|
||
else if (targ.team_no == 4)
|
||
adv = team4advantage;
|
||
|
||
if (adv == 0)
|
||
{
|
||
RPrint("There is a team with an advantage of 0\n");
|
||
adv = 0.1;
|
||
}
|
||
|
||
newdam = newdam * (1 / adv);
|
||
|
||
return newdam;
|
||
};
|
||
|
||
//=========================================================================
|
||
// StatusQuery
|
||
void() TeamFortress_StatusQuery =
|
||
{
|
||
local float ft;
|
||
local string st;
|
||
|
||
sprint (self, #PRINT_HIGH, "players per team: ");
|
||
|
||
ft = TeamFortress_TeamGetNoPlayers(1);
|
||
st = ftos(ft);
|
||
sprint (self, #PRINT_HIGH, st);
|
||
sprint (self, #PRINT_HIGH, " ");
|
||
ft = TeamFortress_TeamGetNoPlayers(2);
|
||
st = ftos(ft);
|
||
sprint (self, #PRINT_HIGH, st);
|
||
|
||
sprint (self, #PRINT_HIGH, " ");
|
||
ft = TeamFortress_TeamGetNoPlayers(3);
|
||
st = ftos(ft);
|
||
sprint (self, #PRINT_HIGH, st);
|
||
sprint (self, #PRINT_HIGH, " ");
|
||
ft = TeamFortress_TeamGetNoPlayers(4);
|
||
st = ftos(ft);
|
||
sprint (self, #PRINT_HIGH, st);
|
||
sprint (self, #PRINT_HIGH, "\n");
|
||
|
||
sprint (self, #PRINT_HIGH, " equalisation: ");
|
||
|
||
st = ftos(team1advantage);
|
||
sprint (self, #PRINT_HIGH, st);
|
||
sprint (self, #PRINT_HIGH, " ");
|
||
st = ftos(team2advantage);
|
||
sprint (self, #PRINT_HIGH, st);
|
||
sprint (self, #PRINT_HIGH, " ");
|
||
st = ftos(team3advantage);
|
||
sprint (self, #PRINT_HIGH, st);
|
||
sprint (self, #PRINT_HIGH, " ");
|
||
st = ftos(team4advantage);
|
||
sprint (self, #PRINT_HIGH, st);
|
||
|
||
sprint (self, #PRINT_HIGH, "\n");
|
||
|
||
st = ftos(teamplay);
|
||
sprint (self, #PRINT_HIGH, "Teamplay is ");
|
||
sprint (self, #PRINT_HIGH, st);
|
||
sprint (self, #PRINT_HIGH, "\n");
|
||
|
||
};
|
||
|
||
//=========================================================================
|
||
// Return the illegal classes for this team
|
||
float(float tno) TeamFortress_TeamGetIllegalClasses =
|
||
{
|
||
if (tno == 1)
|
||
return illegalclasses1;
|
||
if (tno == 2)
|
||
return illegalclasses2;
|
||
if (tno == 3)
|
||
return illegalclasses3;
|
||
if (tno == 4)
|
||
return illegalclasses4;
|
||
|
||
return 0;
|
||
};
|
||
|
||
//=========================================================================
|
||
// Return TRUE if this team is restricted to Civilian class
|
||
float(float tno) TeamFortress_TeamIsCivilian =
|
||
{
|
||
local entity te;
|
||
|
||
if (tno == 1)
|
||
{
|
||
if (civilianteams & #TEAM1_CIVILIANS)
|
||
return #TRUE;
|
||
}
|
||
else if (tno == 2)
|
||
{
|
||
if (civilianteams & #TEAM2_CIVILIANS)
|
||
return #TRUE;
|
||
}
|
||
else if (tno == 3)
|
||
{
|
||
if (civilianteams & #TEAM3_CIVILIANS)
|
||
return #TRUE;
|
||
}
|
||
else // if (tno == 4)
|
||
{
|
||
if (civilianteams & #TEAM4_CIVILIANS)
|
||
return #TRUE;
|
||
}
|
||
|
||
return #FALSE;
|
||
};
|
||
|
||
//=========================================================================
|
||
// Sprints to all the members on one team except one
|
||
float(float tno, entity ignore, string st) teamsprint =
|
||
{
|
||
// Don't do teamprints in DM
|
||
if (tno == 0)
|
||
return;
|
||
|
||
local entity te;
|
||
|
||
te = find(world, classname, "player");
|
||
while (te)
|
||
{
|
||
if (Teammate(te.team_no,tno) && te != ignore)
|
||
{
|
||
sprint(te, #PRINT_HIGH, st);
|
||
}
|
||
|
||
te = find(te, classname, "player");
|
||
}
|
||
};
|
||
|
||
|
||
|