#include <sdktools>
float fSavePos[MAXPLAYERS+1][3];
float fSaveAng[MAXPLAYERS+1][3];
float fProtect[MAXPLAYERS+1];
int iCountAfk[MAXPLAYERS+1];
int RGB[3];
bool bTimeAfk[MAXPLAYERS+1];
ConVar cv_CheckDitance;
ConVar cv_TimeToAfk;
ConVar cv_GodTime;
public void OnPluginStart(){
RGB[0] = 255;
HookEvent("player_spawn", OnPlayerSpawn);
cv_CheckDitance = CreateConVar("SPAWNPROTECT_check_distance", "500.0");
cv_TimeToAfk = CreateConVar("SPAWNPROTECT_time_to_afk", "25.0");
cv_GodTime = CreateConVar("SPAWNPROTECT_god_time", "5.0");
}
public void OnGameFrame(){
if(RGB[0] == 255 && RGB[1] == 0 && 0 <= RGB[2] && RGB[2] <= 255) RGB[2] += 5;
if(RGB[1] == 0 && RGB[2] == 255 && 0 <= RGB[0] && RGB[0] <= 255) RGB[0] -= 5;
if(RGB[0] == 0 && RGB[2] == 255 && 0 <= RGB[1] && RGB[1] <= 255) RGB[1] += 5;
if(RGB[0] == 0 && RGB[1] == 255 && 0 <= RGB[2] && RGB[2] <= 255) RGB[2] -= 5;
if(RGB[1] == 255 && RGB[2] == 0 && 0 <= RGB[0] && RGB[0] <= 255) RGB[0] += 5;
if(RGB[0] == 255 && RGB[2] == 0 && 0 <= RGB[1] && RGB[1] <= 255) RGB[1] -= 5;
static float fTime;
static float fDistance;
static float fPos[3];
static float fAng[3];
for(int client = 1; client <= MaxClients; client++){
if(fProtect[client] != 0.0 && (fTime = (fProtect[client] - GetGameTime())) >= 0.0 && IsClientInGame(client) && IsPlayerAlive(client) && !IsFakeClient(client)){
GetClientEyeAngles(client, fAng);
if(fAng[0] != fSaveAng[client][0] || fAng[1] != fSaveAng[client][1]){
iCountAfk[client] = 0;
if(bTimeAfk[client]){
bTimeAfk[client] = false;
fProtect[client] = 0.0;
SetEntProp(client, Prop_Data, "m_takedamage", 2);
SetColor(client, 255, 255, 255, 255);
continue;
}
}
else{
iCountAfk[client]++;
}
if(cv_CheckDitance.FloatValue > 0.0){
GetClientAbsOrigin(client, fPos);
fDistance = GetVectorDistance(fSavePos[client], fPos);
if(fDistance > cv_CheckDitance.FloatValue){
fProtect[client] = 0.0;
SetEntProp(client, Prop_Data, "m_takedamage", 2);
SetColor(client, 255, 255, 255, 255);
continue;
}
}
if(fTime <= 0.0){
if(RoundToNearest(GetTickInterval() * iCountAfk[client]) >= (!bTimeAfk[client] ? cv_GodTime.FloatValue : cv_TimeToAfk.FloatValue)) {
if(!bTimeAfk[client]){
fProtect[client] = GetGameTime() + cv_TimeToAfk.FloatValue;
bTimeAfk[client] = true;
}
else{
ChangeClientTeam(client, 1);
fProtect[client] = 0.0;
SetColor(client, 255, 255, 255, 255);
}
}
else{
fProtect[client] = 0.0;
SetEntProp(client, Prop_Data, "m_takedamage", 2);
SetColor(client, 255, 255, 255, 255);
}
}
else{
if(bTimeAfk[client]){
PrintCenterText(client, "Время до АФК: %.1f", fTime);
SetColor(client, RGB[0], RGB[1], RGB[2], RoundToNearest((fTime / cv_TimeToAfk.FloatValue) * 200.0));
}
else{
PrintCenterText(client, "Время бессмертия: %.1f\nРасстояние от спавна: [%.1f/%.1f]", fTime, fDistance, cv_CheckDitance.FloatValue);
SetColor(client, RGB[0], RGB[1], RGB[2], RoundToNearest((fDistance / cv_CheckDitance.FloatValue) * 200.0));
}
}
}
}
}
public void OnPlayerSpawn(Event event, const char[] name, bool db){
RequestFrame(rf_OnPlayerSpawn, event.GetInt("userid"));
}
public void rf_OnPlayerSpawn(int client){
client = GetClientOfUserId(client);
if(client < 1 || !IsPlayerAlive(client)/* || IsFakeClient(client)*/) return;
fProtect[client] = GetGameTime() + cv_GodTime.FloatValue;
if(cv_CheckDitance.FloatValue > 0.0){
GetClientAbsOrigin(client, fSavePos[client]);
}
GetClientEyeAngles(client, fSaveAng[client]);
SetEntProp(client, Prop_Data, "m_takedamage", 0);
SetColor(client, RGB[0], RGB[1], RGB[2], 200);
iCountAfk[client] = 0;
bTimeAfk[client] = false;
}
public void SetColor(int index, int ir, int ig, int ib, int ia){
SetEntityRenderMode(index, RENDER_TRANSCOLOR);
SetEntityRenderColor(index, ir, ig, ib, ia);
}