self.damageforcescale = 0;
self.death_time = 0;
self.respawn_time = 0;
+ self.stat_respawn_time = 0;
self.alpha = 0;
self.scale = 0;
self.fade_time = 0;
self.damageforcescale = 2;
self.death_time = 0;
self.respawn_time = 0;
+ self.stat_respawn_time = 0;
self.scale = 0;
self.fade_time = 0;
self.pain_frame = 0;
self.stat_allow_oldnexbeam = autocvar_g_allow_oldnexbeam;
self.stat_leadlimit = autocvar_leadlimit;
- self.stat_respawn_time = self.respawn_time;
-
if(frametime)
{
// physics frames: update anticheat stuff
if (self.deadflag != DEAD_NO)
{
- float button_pressed, force_respawn;
if(self.personal && g_race_qualifying)
{
if(time > self.respawn_time)
{
self.respawn_time = time + 1; // only retry once a second
+ self.stat_respawn_time = self.respawn_time;
respawn();
self.impulse = 141;
}
}
else
{
+ float button_pressed, respawn_flags;
if(frametime)
player_anim();
button_pressed = (self.BUTTON_ATCK || self.BUTTON_JUMP || self.BUTTON_ATCK2 || self.BUTTON_HOOK || self.BUTTON_USE);
- force_respawn = (g_lms || g_ca || g_cts || autocvar_g_forced_respawn);
+
+ respawn_flags = MUTATOR_CALLHOOK(GetRespawnFlags);
+ if(g_lms || g_cts || autocvar_g_forced_respawn)
+ respawn_flags = respawn_flags | RESPAWN_FORCE;
+
if (self.deadflag == DEAD_DYING)
{
- if(force_respawn)
+ if(respawn_flags & RESPAWN_FORCE)
self.deadflag = DEAD_RESPAWNING;
else if(!button_pressed)
self.deadflag = DEAD_DEAD;
respawn();
}
}
+
ShowRespawnCountdown();
+
+ if(respawn_flags & RESPAWN_SILENT)
+ self.stat_respawn_time = 0;
+ else
+ self.stat_respawn_time = self.respawn_time;
}
// if respawning, invert stat_respawn_time to indicate this, the client translates it
self.respawn_time = ceil((time + sdelay) / waves) * waves;
else
self.respawn_time = time + sdelay;
+ self.stat_respawn_time = self.respawn_time;
if((sdelay + waves >= 5.0) && (self.respawn_time - time > 1.75))
self.respawn_countdown = 10; // first number to count down from is 10
else
float DEAD_RESPAWNABLE = 3;
float DEAD_RESPAWNING = 4;
+float RESPAWN_FORCE = 1;
+float RESPAWN_SILENT = 2;
+
float DAMAGE_NO = 0;
float DAMAGE_YES = 1;
float DAMAGE_AIM = 2;
MUTATOR_HOOKABLE(ClientDisconnect);
// called when a player disconnects
+MUTATOR_HOOKABLE(GetRespawnFlags);
+ // returns respawn flags
+
MUTATOR_HOOKABLE(PlayerDies);
// called when a player dies to e.g. remove stuff he was carrying.
// INPUT:
return 1;
}
-MUTATOR_HOOKFUNCTION(arena_PlayerPreThink)
+MUTATOR_HOOKFUNCTION(arena_GetRespawnFlags)
{
- self.stat_respawn_time = 0;
-
// put dead players in the spawn queue
if(arena_roundbased)
- if(self.deadflag && time - self.death_time >= 1.5)
- PutClientInServer();
-
- return 1;
+ return (RESPAWN_FORCE | RESPAWN_SILENT);
+ return RESPAWN_SILENT;
}
MUTATOR_HOOKFUNCTION(arena_ForbidPlayerScore_Clear)
MUTATOR_HOOK(PutClientInServer, arena_PutClientInServer, CBC_ORDER_ANY);
MUTATOR_HOOK(ClientConnect, arena_ClientConnect, CBC_ORDER_ANY);
MUTATOR_HOOK(PlayerSpawn, arena_PlayerSpawn, CBC_ORDER_ANY);
- MUTATOR_HOOK(PlayerPreThink, arena_PlayerPreThink, CBC_ORDER_ANY);
+ MUTATOR_HOOK(GetRespawnFlags, arena_GetRespawnFlags, CBC_ORDER_ANY);
MUTATOR_HOOK(ForbidPlayerScore_Clear, arena_ForbidPlayerScore_Clear, CBC_ORDER_ANY);
MUTATOR_HOOK(GiveFragsForKill, arena_GiveFragsForKill, CBC_ORDER_ANY);
MUTATOR_HOOK(PlayerDies, arena_PlayerDies, CBC_ORDER_ANY);
return 1;
}
-MUTATOR_HOOKFUNCTION(ca_PlayerPreThink)
+MUTATOR_HOOKFUNCTION(ca_GetRespawnFlags)
{
if(!allowed_to_spawn)
- self.stat_respawn_time = 0;
- return 1;
+ return RESPAWN_SILENT;
+ return 0;
}
MUTATOR_HOOKFUNCTION(ca_ForbidPlayerScore_Clear)
MUTATOR_HOOK(reset_map_global, ca_reset_map_global, CBC_ORDER_ANY);
MUTATOR_HOOK(reset_map_players, ca_reset_map_players, CBC_ORDER_ANY);
MUTATOR_HOOK(GetTeamCount, ca_GetTeamCount, CBC_ORDER_EXCLUSIVE);
- MUTATOR_HOOK(PlayerPreThink, ca_PlayerPreThink, CBC_ORDER_ANY);
+ MUTATOR_HOOK(GetRespawnFlags, ca_GetRespawnFlags, CBC_ORDER_ANY);
MUTATOR_HOOK(ForbidPlayerScore_Clear, ca_ForbidPlayerScore_Clear, CBC_ORDER_ANY);
MUTATOR_HOOK(ForbidThrowCurrentWeapon, ca_ForbidThrowCurrentWeapon, CBC_ORDER_ANY);
MUTATOR_HOOK(GiveFragsForKill, ca_GiveFragsForKill, CBC_ORDER_FIRST);