mirror of
https://git.code.sf.net/p/quake/prozac-qfcc
synced 2025-03-02 07:31:54 +00:00
1) added checkmove forward so it's easier to build against walls 2) Can't build sentries on top of forcefields anymore (they get bounced off) 3) fieldgens are now one unit taller than their fields, so you CAN build on the gen 4) forcefields bounce everything (including buildings) away now. 5) added #ifdef DISALLOW_BLOCKED_TELE around tele block checks. didn't get the point Debug tweaks: 1) added #ifdef DEBUG, which enables RPrint(), dremove(), and printtrace(), as well as the warlock cheat and origin reporting. 2) replaced EVERY dprint with RPrint. 3) changed makefile so that all = no DEBUG and no .sym
1251 lines
28 KiB
C++
1251 lines
28 KiB
C++
/*
|
||
TeamFortress 2.1 - 22/1/97
|
||
|
||
TeamFortress Software
|
||
Robin Walker, John Cook, Ian Caughley.
|
||
|
||
Functions handling all the help displaying for TeamFortress.
|
||
*/
|
||
#include "defs.qh"
|
||
// Prototypes
|
||
// Team Functions
|
||
float() TeamFortress_TeamPutPlayerInTeam;
|
||
float(float tno) TeamFortress_TeamSet;
|
||
float(float tno) 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;
|
||
void(entity p) SetTeamName;
|
||
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 lowest, lowest_num;
|
||
local float i, i_num;
|
||
local float teams_with_vacancy = 0;
|
||
local float maxplayers, curplayers;
|
||
|
||
for (i = 1; i <= number_of_teams; i = i + 1) {
|
||
maxplayers = TeamFortress_TeamGetMaxPlayers (i);
|
||
curplayers = TeamFortress_TeamGetNoPlayers (i);
|
||
if (curplayers < maxplayers)
|
||
teams_with_vacancy = teams_with_vacancy + 1;
|
||
}
|
||
|
||
lowest = 0;
|
||
lowest_num = -1;
|
||
for (i = 1; i <= number_of_teams; i = i + 1) {
|
||
i_num = TeamFortress_TeamGetNoPlayers(i);
|
||
if (TeamFortress_TeamGetMaxPlayers (i) > i_num) {
|
||
if (i_num < lowest_num // eww, ugly
|
||
|| lowest_num == -1
|
||
|| (i_num == lowest_num
|
||
&& random () < 1 / teams_with_vacancy)) {
|
||
lowest = i;
|
||
lowest_num = i_num;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (lowest == 0) { // ummm, I don't think this should be possible..
|
||
sprint (self, PRINT_HIGH, "All teams are full!\n");
|
||
return 0;
|
||
}
|
||
|
||
return TeamFortress_TeamSet (lowest);
|
||
};
|
||
|
||
//=========================================================================
|
||
// Return the color for the team corresponding to the no passed in
|
||
float(float tno) 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;
|
||
}
|
||
};
|
||
|
||
string(float tno) GetTeamName =
|
||
{
|
||
local string st;
|
||
|
||
if (tno == 1)
|
||
{
|
||
/*if (world.b_b && world.b_b)
|
||
{
|
||
return world.b_b;
|
||
}*/
|
||
|
||
st = infokey(NIL, "team1");
|
||
if (!st)
|
||
st = infokey(NIL, "t1");
|
||
|
||
if (!st || st == "")
|
||
return "blue";
|
||
}
|
||
else if (tno == 2)
|
||
{
|
||
/*if (world.b_t != "" && world.b_t)
|
||
{
|
||
return world.b_t;
|
||
}*/
|
||
|
||
st = infokey(NIL, "team2");
|
||
if (!st)
|
||
st = infokey(NIL, "t2");
|
||
|
||
if (!st)
|
||
return "red";
|
||
}
|
||
else if (tno == 3)
|
||
{
|
||
/*if (world.b_n != "" && world.b_n)
|
||
{
|
||
return world.b_n;
|
||
}*/
|
||
|
||
st = infokey(NIL, "team3");
|
||
if (!st)
|
||
st = infokey(NIL, "t3");
|
||
|
||
if (!st)
|
||
return "yell";
|
||
}
|
||
else if (tno == 4)
|
||
{
|
||
/*if (world.b_o != "" && world.b_o)
|
||
{
|
||
return world.b_o;
|
||
}*/
|
||
|
||
st = infokey(NIL, "team4");
|
||
if (!st)
|
||
st = infokey(NIL, "t4");
|
||
|
||
if (!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";
|
||
};
|
||
|
||
void(entity p) SetTeamName =
|
||
{
|
||
local string st;
|
||
|
||
st = GetTeamName(p.team_no);
|
||
stuffcmd(p, "team \""); //careful about empty team
|
||
stuffcmd(p, st);
|
||
stuffcmd(p, "\"\n");
|
||
setinfokey(p, "team", st);
|
||
};
|
||
|
||
//=========================================================================
|
||
// 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, tc2;
|
||
|
||
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 (TeamGetColor(tno) == 0)
|
||
{
|
||
TeamFortress_TeamSetColor(tno);
|
||
// If the color wasn't set
|
||
if (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;
|
||
tc = TeamGetColor (tno) - 1;
|
||
tc2 = TeamGetNiceColor (tno);
|
||
SetPlayerColor (self, tc, tc2);
|
||
self.team_no = tno;
|
||
self.lives = TeamFortress_TeamGetLives(tno);
|
||
|
||
SetTeamName(self);
|
||
|
||
// 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");
|
||
|
||
tc = TeamGetColor (tno) - 1;
|
||
tc2 = TeamGetNiceColor (tno);
|
||
SetPlayerColor (self, tc, tc2);
|
||
|
||
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);
|
||
|
||
SetTeamName(self);
|
||
|
||
// 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, tc2;
|
||
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) {
|
||
stuffcmd(self,"name \"I'm a cheater even when RENAMED\"\n");
|
||
stuffcmd(self,"disconnect\n");
|
||
}
|
||
|
||
//WK Limit rate to 10k?
|
||
st = infokey(self,"rate");
|
||
if (st)
|
||
rate = stof(st);
|
||
if (rate > 10000) {
|
||
stuffcmd(self,"rate 10000\n");
|
||
}
|
||
|
||
//- 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)
|
||
{
|
||
// 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 ((TeamGetColor(self.undercover_team) - 1) != tc || !IsValidTopColor(self.undercover_team,tTopColor))
|
||
{
|
||
#ifdef CHEAT_WARNINGS
|
||
RPrint(self.netname);
|
||
RPrint(" had his colors reset.\n");
|
||
#endif
|
||
|
||
tc = TeamGetColor (self.undercover_team) - 1;
|
||
tc2 = TeamGetNiceColor (self.undercover_team);
|
||
SetPlayerColor (self, tc, tc2);
|
||
|
||
// 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 != (TeamGetColor(self.team_no) - 1) || !IsValidTopColor(self.team_no,tTopColor))
|
||
{
|
||
#ifdef CHEAT_WARNINGS
|
||
RPrint(self.netname);
|
||
RPrint(" had his colors reset.\n");
|
||
#endif
|
||
|
||
tc = TeamGetColor (self.team_no) - 1;
|
||
tc2 = TeamGetNiceColor (self.team_no);
|
||
SetPlayerColor (self, tc, tc2);
|
||
|
||
// 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;
|
||
}
|
||
|
||
// Have they changed their skin?
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
*/
|
||
};
|
||
|
||
void (entity pl, float topcolor, float bottomcolor) SetPlayerColor =
|
||
{
|
||
local string top;
|
||
local string bottom;
|
||
|
||
top = ftos (topcolor);
|
||
bottom = ftos (bottomcolor);
|
||
|
||
setinfokey (pl, "topcolor", top);
|
||
setinfokey (pl, "bottomcolor", bottom);
|
||
|
||
stuffcmd (pl, "topcolor " + top + "\n");
|
||
stuffcmd (pl, "bottomcolor " + bottom + "\n");
|
||
// stuffcmd (pl, "color " + top + " " + bottom + "\n");
|
||
};
|
||
|
||
void (string key, string value) UserInfoCallback =
|
||
{ // FIXME: remove the cheat poller
|
||
local string oldval;
|
||
oldval = infokey (self, key);
|
||
|
||
if (value == oldval) { // generic reject
|
||
// dprint ("[oldval [" + self.netname + "](" + key + ")(" + value + ")(" + oldval + ")]\n");
|
||
}
|
||
// dprint ("[[" + self.netname + "](" + key + ")(" + value + ")(" + oldval + ")]\n");
|
||
|
||
else if (key == "topcolor") { // FIXME: some topcolors may be allowed
|
||
RPrint ("items: " + ftos (self.cutf_items & CUTF_SPY_KIT) + " ");
|
||
RPrint ("skin: " + ftos (self.is_undercover) + "\n");
|
||
if ((self.cutf_items & CUTF_SPY_KIT) && self.is_undercover) {
|
||
setinfokey(self, "topcolor", oldval);
|
||
stuffcmd(self, "color \"" + oldval + "\"\n");
|
||
} else
|
||
setinfokey (self, key, value);
|
||
} else if (key == "bottomcolor") {
|
||
setinfokey (self, "bottomcolor", oldval);
|
||
stuffcmd (self, "bottomcolor \"" + oldval + "\"\n");
|
||
} else if (key == "skin") { // FIXME: some other skins may be allowed
|
||
stuffcmd(self, "skin \"" + oldval + "\"\n");
|
||
} else if (key == "name") {
|
||
self.netname = value;
|
||
setinfokey (self, key, value);
|
||
} else if (key == "team") {
|
||
stuffcmd (self, "team \"" + oldval + "\"\n");
|
||
} else {
|
||
// accept everything else
|
||
setinfokey (self, key, value);
|
||
// RPrint ("[default [" + self.netname + "](" + key + ")(" + value + ")(" + oldval + ")]\n");
|
||
}
|
||
};
|
||
|
||
//=========================================================================
|
||
// 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(NIL, 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 = 0;
|
||
local entity search;
|
||
//local string st;
|
||
|
||
search = find (NIL, classname, "player");
|
||
while (search)
|
||
{
|
||
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 (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 (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 = 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(NIL, "no_showmembers"); */
|
||
|
||
local entity e;
|
||
local float found;
|
||
|
||
found = FALSE;
|
||
|
||
e = find(NIL, classname, "player");
|
||
while (e)
|
||
{
|
||
if (((e.team_no == Player.team_no) || (e.team_no == 0)) && (e != Player))
|
||
{
|
||
if (e.model) // 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 = 0, 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 =
|
||
{
|
||
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
|
||
void(float tno, entity ignore, string st) teamsprint =
|
||
{
|
||
// Don't do teamprints in DM
|
||
if (tno == 0)
|
||
return;
|
||
|
||
local entity te;
|
||
|
||
te = find(NIL, classname, "player");
|
||
while (te)
|
||
{
|
||
if (Teammate(te.team_no,tno) && te != ignore)
|
||
{
|
||
sprint(te, PRINT_HIGH, st);
|
||
}
|
||
|
||
te = find(te, classname, "player");
|
||
}
|
||
};
|
||
|
||
|
||
|