void SetChangeParms (entity this)
{
// save parms for level change
- parm1 = this.parm_idlesince - time;
+ parm1 = CS(this).parm_idlesince - time;
MUTATOR_CALLHOOK(SetChangeParms);
}
void DecodeLevelParms(entity this)
{
// load parms
- this.parm_idlesince = parm1;
- if (this.parm_idlesince == -(86400 * 366))
- this.parm_idlesince = time;
+ CS(this).parm_idlesince = parm1;
+ if (CS(this).parm_idlesince == -(86400 * 366))
+ CS(this).parm_idlesince = time;
// whatever happens, allow 60 seconds of idling directly after connect for map loading
- this.parm_idlesince = max(this.parm_idlesince, time - sv_maxidle + 60);
+ CS(this).parm_idlesince = max(CS(this).parm_idlesince, time - sv_maxidle + 60);
MUTATOR_CALLHOOK(DecodeLevelParms);
}
.float clientkill_nexttime;
void ClientKill_Now_TeamChange(entity this)
{
- if(this.killindicator_teamchange == -1)
+ if(CS(this).killindicator_teamchange == -1)
{
JoinBestTeam( this, false, true );
}
- else if(this.killindicator_teamchange == -2)
+ else if(CS(this).killindicator_teamchange == -2)
{
if(blockSpectators)
Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime);
PutObserverInServer(this);
}
else
- SV_ChangeTeam(this, this.killindicator_teamchange - 1);
- this.killindicator_teamchange = 0;
+ SV_ChangeTeam(this, CS(this).killindicator_teamchange - 1);
+ CS(this).killindicator_teamchange = 0;
}
void ClientKill_Now(entity this)
if(this.vehicle)
{
vehicles_exit(this.vehicle, VHEF_RELEASE);
- if(!this.killindicator_teamchange)
+ if(!CS(this).killindicator_teamchange)
{
this.vehicle_health = -1;
Damage(this, this, this, 1 , DEATH_KILL.m_id, this.origin, '0 0 0');
this.killindicator = NULL;
- if(this.killindicator_teamchange)
+ if(CS(this).killindicator_teamchange)
ClientKill_Now_TeamChange(this);
if(!IS_SPEC(this) && !IS_OBSERVER(this))
return;
killtime = M_ARGV(1, float);
- this.killindicator_teamchange = targetteam;
+ CS(this).killindicator_teamchange = targetteam;
if(!this.killindicator)
{
MUTATOR_CALLHOOK(FixClientCvars, e);
}
-float PlayerInIDList(entity p, string idlist)
+bool findinlist_abbrev(string tofind, string list)
{
- float n, i;
- string s;
+ // this function allows abbreviated strings!
+ FOREACH_WORD(list, it == substring(tofind, 0, strlen(it)),
+ {
+ return true;
+ });
+
+ return false;
+}
+bool PlayerInIPList(entity p, string iplist)
+{
+ // some safety checks (never allow local?)
+ if(p.netaddress == "local" || p.netaddress == "" || !IS_REAL_CLIENT(p))
+ return false;
+
+ return findinlist_abbrev(p.netaddress, iplist);
+}
+
+bool PlayerInIDList(entity p, string idlist)
+{
// NOTE: we do NOT check crypto_idfp_signed here, an unsigned ID is fine too for this
- if (!p.crypto_idfp)
- return 0;
+ if(!p.crypto_idfp)
+ return false;
- // this function allows abbreviated player IDs too!
- n = tokenize_console(idlist);
- for(i = 0; i < n; ++i)
- {
- s = argv(i);
- if(s == substring(p.crypto_idfp, 0, strlen(s)))
- return 1;
- }
+ return findinlist_abbrev(p.crypto_idfp, idlist);
+}
- return 0;
+bool PlayerInList(entity player, string list)
+{
+ return PlayerInIDList(player, list) || PlayerInIPList(player, list);
}
#ifdef DP_EXT_PRECONNECT
}
}
}
- else if (PlayerInIDList(this, autocvar_g_forced_team_red)) this.team_forced = NUM_TEAM_1;
- else if (PlayerInIDList(this, autocvar_g_forced_team_blue)) this.team_forced = NUM_TEAM_2;
- else if (PlayerInIDList(this, autocvar_g_forced_team_yellow)) this.team_forced = NUM_TEAM_3;
- else if (PlayerInIDList(this, autocvar_g_forced_team_pink)) this.team_forced = NUM_TEAM_4;
+ else if (PlayerInList(this, autocvar_g_forced_team_red)) this.team_forced = NUM_TEAM_1;
+ else if (PlayerInList(this, autocvar_g_forced_team_blue)) this.team_forced = NUM_TEAM_2;
+ else if (PlayerInList(this, autocvar_g_forced_team_yellow)) this.team_forced = NUM_TEAM_3;
+ else if (PlayerInList(this, autocvar_g_forced_team_pink)) this.team_forced = NUM_TEAM_4;
else switch (autocvar_g_forced_team_otherwise)
{
default: this.team_forced = 0; break;
Called every frame for each client after the physics are run
=============
*/
-.float idlekick_lasttimeleft;
void PlayerPostThink (entity this)
{
Player_Physics(this);
if (sv_maxidle_slots > 0 && (maxclients - totalClients) > sv_maxidle_slots)
{ /* do nothing */ }
- else if (time - this.parm_idlesince < 1) // instead of (time == this.parm_idlesince) to support sv_maxidle <= 10
+ else if (time - CS(this).parm_idlesince < 1) // instead of (time == this.parm_idlesince) to support sv_maxidle <= 10
{
- if (this.idlekick_lasttimeleft)
+ if (CS(this).idlekick_lasttimeleft)
{
- this.idlekick_lasttimeleft = 0;
+ CS(this).idlekick_lasttimeleft = 0;
Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_IDLING);
}
}
else
{
- float timeleft = ceil(sv_maxidle - (time - this.parm_idlesince));
+ float timeleft = ceil(sv_maxidle - (time - CS(this).parm_idlesince));
if (timeleft == min(10, sv_maxidle - 1)) { // - 1 to support sv_maxidle <= 10
- if (!this.idlekick_lasttimeleft)
+ if (!CS(this).idlekick_lasttimeleft)
Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_DISCONNECT_IDLING, timeleft);
}
if (timeleft <= 0) {
return;
}
else if (timeleft <= 10) {
- if (timeleft != this.idlekick_lasttimeleft) {
+ if (timeleft != CS(this).idlekick_lasttimeleft) {
Send_Notification(NOTIF_ONE, this, MSG_ANNCE, Announcer_PickNumber(CNT_IDLE, timeleft));
}
- this.idlekick_lasttimeleft = timeleft;
+ CS(this).idlekick_lasttimeleft = timeleft;
}
}
}