Raised This Month: $32 Target: $400
 8% 

Afk Manager I'm having a problem, is there anyone who can help?


Post New Thread Closed Thread   
 
Thread Tools Display Modes
Author Message
Darkwob
BANNED
Join Date: Oct 2018
Old 05-04-2021 , 09:16   Afk Manager I'm having a problem, is there anyone who can help?
#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;
    }

Darkwob is offline
Psyk0tik
Veteran Member
Join Date: May 2012
Location: Homeless
Old 05-04-2021 , 09:31   Re: Afk Manager I'm having a problem, is there anyone who can help?
#2

Didn’t you already make a thread a month ago asking for the same thing?

https://forums.alliedmods.net/showthread.php?t=331813
__________________

Last edited by DarkDeviL; 05-04-2021 at 11:50. Reason: Removed incorrect statement about the AlliedModders Rules, to avoid confusion.
Psyk0tik is offline
Darkwob
BANNED
Join Date: Oct 2018
Old 05-04-2021 , 11:17   Re: Afk Manager I'm having a problem, is there anyone who can help?
#3

Quote:
Originally Posted by Crasher_3637 View Post
Didn’t you already make a thread a month ago asking for the same thing?

https://forums.alliedmods.net/showthread.php?t=331813
that topic is closed bro. and I could not get an answer to my problem. I am not that good at detecting problems, as I do not know enough pawn coding. I mean, an experienced person should help me in this matter.

no offence bro but I need this problem to be solved.

Last edited by DarkDeviL; 05-04-2021 at 11:50. Reason: Removed incorrect statement about the AlliedModders Rules (from quote), to avoid confusion.
Darkwob is offline
DarkDeviL
SourceMod Moderator
Join Date: Apr 2012
Old 05-04-2021 , 11:56   Re: Afk Manager I'm having a problem, is there anyone who can help?
#4

Quote:
Originally Posted by Darkwob View Post
that topic is closed bro. and I could not get an answer to my problem.
It is not really a good idea to claim topics are closed, or otherwise give impression that you have what you need, I quote:

Quote:
Originally Posted by Darkwob View Post
Thank God I finally got an answer. I gave up hope on this topic.
Exactly here, you're digging the grave of your own thread.


Quote:
Originally Posted by Darkwob View Post
I am not that good at detecting problems, as I do not know enough pawn coding. I mean, an experienced person should help me in this matter.
Quote:
Originally Posted by Darkwob View Post
no offence bro but I need this problem to be solved.
As for those two, no people will ever waste time on trying to solve issues that are already resolved, as you indicate with your other thread.


I do however also suggest you to stop bumping threads, stop cross posting, and other things mentioned in the AlliedModders Rules.
__________________
Mostly known as "DarkDeviL".

Dropbox FastDL: Public folder will no longer work after March 15, 2017!
For more info, see the [SRCDS Thread], or the [HLDS Thread].
DarkDeviL is offline
Closed Thread


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 13:17.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode