View Single Post
Author Message
Darkwob
BANNED
Join Date: Oct 2018
Old 04-08-2021 , 15:40   [L4D2]AFK Manager Modification / Help Requests
Reply With Quote #1

Hey guys

This plugin says that players switch to the spectator team when they are inactive for a certain period of time, but the thing is that the player does not go to the spectator team. Also, when we write an !idle to the chat, we do not switch to the spectator team. Can anyone help edit this plugin?

PHP Code:
#pragma semicolon 1
#pragma newdecls required

#include <sourcemod>
#include <sdktools>

#define PLUGIN_VERSION "1.4"

public Plugin myinfo = {
    
name "[L4D(2)] AFK Manager",
    
author "Matthias Vance",
    
description "",
    
version PLUGIN_VERSION,
    
url "http://www.matthiasvance.com/"
};

float advertiseInterval 300.0;
Handle advertiseTimer null;

float specTime[MAXPLAYERS 1];
float afkTime[MAXPLAYERS 1];

float checkInterval 10.0;
float maxAfkSpecTime 40.0;
float maxAfkKickTime 480.0;
float joinTeamInterval 60.0;
float timeLeftInterval 5.0;

float lastMessage[MAXPLAYERS 1];

float clientPos[MAXPLAYERS 1][3];
float clientAngles[MAXPLAYERS 1][3];

int messageLevel 3;
int iTimeAfk;

public 
void OnPluginStart() 
{
    
CreateConVar("l4d_afkmanager_version"PLUGIN_VERSION"[L4D(2)] AFK Manager"FCVAR_SPONLY|FCVAR_NOTIFY|FCVAR_DONTRECORD);
    
SetConVarString(FindConVar("l4d_afkmanager_version"), PLUGIN_VERSION);

    
char temp[12];
    
    
FloatToString(advertiseIntervaltempsizeof(temp)); (CreateConVar("afk_adinterval"temp"Interval in which the plugin will advertise the 'idle' command.")).AddChangeHook(convar_AdvertiseTime);
    
FloatToString(maxAfkSpecTimetempsizeof(temp)); (CreateConVar("afk_spectime"temp"AFK time after which you will be moved to the Spectator team.")).AddChangeHook(convar_AfkSpecTime);
    
FloatToString(maxAfkKickTimetempsizeof(temp)); (CreateConVar("afk_kicktime"temp"AFK time after which you will be kicked.")).AddChangeHook(convar_AfkKickTime);
    (
CreateConVar("afk_messages""3""Control spec/kick messages. (0 = disable, 1 = spec, 2 = kick, 3 = spec + kick")).AddChangeHook(convar_Messages);
    
FloatToString(joinTeamIntervaltempsizeof(temp)); (CreateConVar("afk_joinmsg_time"temp)).AddChangeHook(convar_JoinMsgTime);
    
FloatToString(timeLeftIntervaltempsizeof(temp)); (CreateConVar("afk_warning_time"temp)).AddChangeHook(convar_WarningTime);

    
HookEvent("player_team"Event_PlayerTeam);
    
HookEvent("round_end"Event_RoundEndEventHookMode_PostNoCopy);
    
    
CreateTimer(1.0MapStart);
    
advertiseTimer CreateTimer(advertiseIntervaltimer_Advertise_TIMER_REPEAT);
    
CreateTimer(checkIntervaltimer_Check_TIMER_REPEAT);

    
//AutoExecConfig(true, "l4d_afkmanager");
}

public 
Action MapStart(Handle timer)
{
    
OnMapStart();
}

public 
void OnMapStart()
{
    
iTimeAfk GetTime();
}

public 
void convar_JoinMsgTime(ConVar convar, const char[] oldValue, const char[] newValue)
{
    
joinTeamInterval StringToFloat(newValue);
}

public 
void convar_WarningTime(ConVar convar, const char[] oldValue, const char[] newValue)
{
    
timeLeftInterval StringToFloat(newValue);
}

public 
void convar_Messages(ConVar convar, const char[] oldValue, const char[] newValue)
{
    if (
messageLevel <= 0)
    {
        
convar.SetInt(0);
        return;
    }
    if (
messageLevel >= 3)
    {
        
convar.SetInt(3);
        return;
    }
    
messageLevel convar.IntValue;
}

public 
Action timer_Check(Handle timer
{
    
float currentPos[3];
    
float currentAngles[3];

    
int team;
    
bool isAFK;
    
int clientindex;

    for (
client 1client <= MaxClientsclient++) 
    {
        if (
IsClientInGame(client) && !IsFakeClient(client)) 
        {
            
team GetClientTeam(client);
            if (
team == 1
            {
                
specTime[client] += checkInterval;
                if (
specTime[client] >= maxAfkKickTime
                {
                    
                    if (
GetRealClientCount() > 25)
                    {
                        
                        if (!
IsVip(client))
                        {
                            
KickClient(client"You were AFK for too long.");
                            if (
messageLevel >= 2)
                                
PrintToChatAll("\x04[\x05AFK Manager\x04]\x01 Player \x04'%N'\x01 was kicked."client);
                        }
                    }
                    
                    if (
GetClientCount(false) >= 30 && !IsRoot(client))
                    {
                        
KickClient(client"You were AFK for too long.");
                        if (
messageLevel >= 2)
                            
PrintToChatAll("\x04[\x05AFK Manager\x04]\x01 Player \x04'%N'\x01 was kicked."client);
                    }
                    else
                        
specTime[client] = (specTime[client] - checkInterval 1);
                } 
                else 
                {
                    if (
GetClientTime(client) - lastMessage[client] >= timeLeftInterval
                    {
                        if (!
IsRoot(client))
                            
PrintToChat(client"\x04[\x05AFK Manager\x04]\x01 You can spectate for \x04%d\x01 more seconds before you will be kicked."RoundToFloor(maxAfkKickTime specTime[client]));
                        
lastMessage[client] = GetClientTime(client);
                    }
                    if (
GetClientTime(client) - lastMessage[client] >= joinTeamInterval
                    {
                        if (!
IsRoot(client))
                            
PrintToChat(client"\x04[\x05AFK Manager\x04]\x01 Say \x05!join\x01 to join game.");
                        
lastMessage[client] = GetClientTime(client);
                    }
                }
            } 
            else if (
IsPlayerAlive(client) && (team == || team == 3)) 
            {
                
GetClientAbsOrigin(clientcurrentPos);
                
GetClientAbsAngles(clientcurrentAngles);

                
isAFK true;
                for (
index 0index 3index++) 
                {
                    if(
currentPos[index] != clientPos[client][index]) 
                    {
                        
isAFK false;
                        break;
                    }
                }
                if (
isAFK
                {
                    for(
index 0index 3index++) 
                    {
                        if(
currentAngles[index] != clientAngles[client][index]) 
                        {
                            
isAFK false;
                            break;
                        }
                    }
                }
                if (
isAFK
                {
                    
afkTime[client] += checkInterval;
                    if (
afkTime[client] >= maxAfkSpecTime
                    {
                        if (
GetClientCount(false) >= 30)
                        {
                            
KickClient(client"Sorry, no open slots for spectators.");
                            if (
messageLevel >= 2)
                                
PrintToChatAll("\x04[\x05AFK Manager\x04]\x01 Player \x04'%N'\x01 was kicked. No open slots for spectators."client);
                        }
                        else
                            
ClientAFK(client);
                    }
                } 
                else 
                    
afkTime[client] = 0.0;

                for (
index 0index 3index++) 
                {
                    
clientPos[client][index] = currentPos[index];
                    
clientAngles[client][index] = currentAngles[index];
                }
            }
        }
    }
    return 
Plugin_Continue;
}

void ClientAFK(int client)
{
    if (!
IsClientInGame(client))
        return;
    if (
IsFakeClient(client))
        return;
    if (
GetClientTeam(client) == 1)
        return;
    
    
float fAFK GetRandomFloat(0.15.1);
    
CreateTimer(fAFKTimer_Afkclient);
}

public 
Action Timer_Afk(Handle timerany client)
{
    if (
IsClientInGame(client))
    {
        if (!
IsFakeClient(client))
        {
            if (
GetClientTeam(client) != 1)
            {
                
int afktime = (GetTime() - iTimeAfk);
                if (
afktime 50)
                    
afkTime[client] = (afkTime[client] - (checkInterval 1.0));
                else
                {
                    if (
GetClientCount(false) >= 30)
                    {
                        
KickClient(client"Sorry, no open slots for spectators.");
                        if (
messageLevel >= 2)
                            
PrintToChatAll("\x04[\x05AFK Manager\x04]\x01 Player \x04'%N'\x01 was kicked. No open slots for spectators."client);
                        return 
Plugin_Stop;
                    }
                    
                    if (
messageLevel == || messageLevel == 3)
                        
PrintToChatAll("\x04[\x05AFK Manager\x04]\x01 Player \x04'%N'\x01 was moved to Spectator team."client);
                    
PrintToServer("[AFK Manager] Player '%N' was moved to Spectator team."client);
                    
ServerCommand("sm_switchplayer2 #%d 1"GetClientUserId(client));
                    
iTimeAfk GetTime();
                }
            }
        }
    }
    return 
Plugin_Stop;
}

int GetRealClientCount()
{
    
int clients 0;
    for (
int i 1<= MaxClientsi++)
    {
        if (
IsClientInGame(i))
        {
            if (!
IsFakeClient(i))
                
clients++;
        }
    }
    return 
clients;
}

public 
void convar_AfkSpecTime(ConVar convar, const char[] oldValue, const char[] newValue)
{
    
maxAfkSpecTime StringToFloat(newValue);
    if (
maxAfkSpecTime == 0.0 || maxAfkSpecTime <= 30.0)
    {
        
convar.SetFloat(30.0);
        return;
    }
}

public 
void convar_AfkKickTime(ConVar convar, const char[] oldValue, const char[] newValue)
{
    
maxAfkKickTime StringToFloat(newValue);
    if (
maxAfkKickTime == 0.0 || maxAfkKickTime <= 60.0)
    {
        
convar.SetFloat(60.0);
        return;
    }
}

public 
Action Event_PlayerTeam(Event event, const char[] namebool dontBroadcast)
{
    
int client GetClientOfUserId(event.GetInt("userid"));
    
int team GetEventInt(event"team");
    switch(
team)
    {
        case 
1specTime[client] = 0.0;
        case 
23afkTime[client] = 0.0;
    }
    if (
event.GetBool("disconnected"))
    {
        
clientPos[client] = view_as<float>({0.00.00.0});
        
clientAngles[client] = view_as<float>({0.00.00.0});
    }
}

public 
void convar_AdvertiseTime(ConVar convar, const char[] oldValue, const char[] newValue)
{
    if (
advertiseTimer != null)
    {
        
KillTimer(advertiseTimer);
        
advertiseTimer null;
    }
    
advertiseInterval StringToFloat(newValue);
    if (
advertiseInterval <= 10.0)
    {
        
convar.SetFloat(10.0);
        return;
    }
    if (
advertiseInterval 0.0)
        
advertiseTimer CreateTimer(advertiseIntervaltimer_Advertise_TIMER_REPEAT);
}

public 
Action timer_Advertise(Handle timer
{
    
PrintToChatAll("\x04[\x05AFK Manager\x04]\x01 Use \x05!idle \x01if you plan to go AFK for a while.");
    return 
Plugin_Continue;
}

bool IsRoot(int client)
{
    
AdminId admin GetUserAdmin(client);

    if (
admin == INVALID_ADMIN_ID)
        return 
false;
    if (
GetAdminFlag(adminAdmin_Root) || GetAdminFlag(adminAdmin_Password))
        return 
true;
    
    return 
true;
}

bool IsVip(int client)
{
    
AdminId admin GetUserAdmin(client);

    if (
admin == INVALID_ADMIN_ID)
        return 
false;
    if (
GetAdminFlag(adminAdmin_Reservation))
        return 
true;
    return 
true;
}

public 
Action Event_RoundEnd(Event event, const char[] namebool dontBroadcast)
{
    
int i 1;
    while (
<= MaxClients)
    {
        if (
IsClientInGame(i))
        {
            
afkTime[i] = 0.0;
        }
        
+= 1;
    }


Last edited by Darkwob; 04-08-2021 at 15:40.
Darkwob is offline