OnPlayerIdleCheck hook (Rust)Suggestion
Hi,

I'm looking for the appropriate place to add a feature suggestion, specifically an additional hook for Rust;

public class BasePlayer : BaseCombatEntity
{
    .......
    public static void ServerCycle(float deltaTime)
    {
        BasePlayer.activePlayerList.RemoveAll((BasePlayer x) => x == null);
        List<BasePlayer> basePlayers = Pool.Get<List<BasePlayer>>();
        basePlayers.AddRange(BasePlayer.activePlayerList);
        for (int i = 0; i < basePlayers.Count; i++)
        {
            if (basePlayers[i] != null)
            {
                basePlayers[i].ServerUpdate(deltaTime);
            }
        }
        if (Server.idlekick > 0 && (ServerMgr.AvailableSlots <= 0 && Server.idlekickmode == 1 || Server.idlekickmode == 2))
        {
            for (int j = 0; j < basePlayers.Count; j++)
            {

                // BEGIN NEW HOOK #############
                object obj = Interface.CallHook("OnPlayerIdleCheck", basePlayers[j], basePlayers[j].IdleTime);
                if (obj != null)
                {
                    continue;
                }            
                // END NEW HOOK ##############

                if (basePlayers[j].IdleTime >= (float)(Server.idlekick * 60))
                {
                    if (!basePlayers[j].IsAdmin || Server.idlekickadmins != 0)
                    {
                        if (!basePlayers[j].IsDeveloper || Server.idlekickadmins != 0)
                        {
                            basePlayers[j].Kick(string.Concat("Idle for ", Server.idlekick, " minutes"));
                        }
                    }
                }
            }
        }
        Pool.FreeList<BasePlayer>(ref basePlayers);
    }​
    ......
}

If someone could point me in the right direction, it would be appreciated.

Thanks,
Pink.

Thanks for the suggestion, I've moved this to the Rust support forum.

Just wanted to check on the status of this,

I wrote the Raid Simulator server for Rust and this hook would be incredibly useful for ejecting afk players from Raids at desired intervals without having to server kick them to begin with. (I'm sure this hook would also gain adoption by most "event" plugins)

Cheers.

After some conversation we agreed that the following hook structure would be better

public class BasePlayer : BaseCombatEntity
{
    .......
    public static void ServerCycle(float deltaTime)
    {
        BasePlayer.activePlayerList.RemoveAll((BasePlayer x) => x == null);
        List<BasePlayer> basePlayers = Pool.Get<List<BasePlayer>>();
        basePlayers.AddRange(BasePlayer.activePlayerList);
        for (int i = 0; i < basePlayers.Count; i++)
        {
            if (basePlayers[i] != null)
            {
                basePlayers[i].ServerUpdate(deltaTime);
            }
        }
        if (Server.idlekick > 0 && (ServerMgr.AvailableSlots <= 0 && Server.idlekickmode == 1 || Server.idlekickmode == 2))
        {
            for (int j = 0; j < basePlayers.Count; j++)
            {

                // BEGIN NEW HOOK #############
                object obj = Interface.CallHook("CanPlayerIdle", basePlayers[j], basePlayers[j].IdleTime);
                if (obj != null)
                {
                    continue;
                }            
                // END NEW HOOK ##############

                if (basePlayers[j].IdleTime >= (float)(Server.idlekick * 60))
                {
                    if (!basePlayers[j].IsAdmin || Server.idlekickadmins != 0)
                    {
                        if (!basePlayers[j].IsDeveloper || Server.idlekickadmins != 0)
                        {
                            // BEGIN NEW HOOK #############
                            object obj1 = Interface.CallHook("OnPlayerIdle", basePlayers[j], basePlayers[j].IdleTime);
                            if (obj1 != null)
                            {
                                continue;
                            }
                            // END NEW HOOK ##############
                            basePlayers[j].Kick(string.Concat("Idle for ", Server.idlekick, " minutes"));
                        }
                    }
                }
            }
        }
        Pool.FreeList<BasePlayer>(ref basePlayers);
    }​
    ......
}​
Those are two pre-hooks @Calytic, normally we'd only have one pre and potentially a post.
Makes sense

This may also be an effective way to structure the hooks.

This way there is only one pre hook for Idle Kick purposes, then another for the ServerUpdate for each player providing a place devs can manually initiate a kick or perform other logic with the server update for each player.

After thinking about the previously agreed upon solution, I noticed that the two hooks would be restricted to server pop being maxed. Which is almost making those hooks redundant for purposes other than preventing a server kick for idle.

Both of these hooks could still be utilised as universal hooks.

public class BasePlayer : BaseCombatEntity
{
    .......
    public static void ServerCycle(float deltaTime)
    {
        BasePlayer.activePlayerList.RemoveAll((BasePlayer x) => x == null);
        List<BasePlayer> basePlayers = Pool.Get<List<BasePlayer>>();
        basePlayers.AddRange(BasePlayer.activePlayerList);
        for (int i = 0; i < basePlayers.Count; i++)
        {
            if (basePlayers[i] != null)
            {
                basePlayers[i].ServerUpdate(deltaTime);
                // BEGIN NEW HOOK #############
                Interface.CallHook("OnPlayerServerUpdate", basePlayers[i]);
                // END NEW HOOK ##############
            }
        }
        if (Server.idlekick > 0 && (ServerMgr.AvailableSlots <= 0 && Server.idlekickmode == 1 || Server.idlekickmode == 2))
        {
            for (int j = 0; j < basePlayers.Count; j++)
            {

                // BEGIN NEW HOOK #############
                object obj = Interface.CallHook("CanPlayerIdle", basePlayers[j], basePlayers[j].IdleTime);
                if (obj != null)
                {
                    continue;
                }            
                // END NEW HOOK ##############

                if (basePlayers[j].IdleTime >= (float)(Server.idlekick * 60))
                {
                    if (!basePlayers[j].IsAdmin || Server.idlekickadmins != 0)
                    {
                        if (!basePlayers[j].IsDeveloper || Server.idlekickadmins != 0)
                        {
                            basePlayers[j].Kick(string.Concat("Idle for ", Server.idlekick, " minutes"));
                        }
                    }
                }
            }
        }
        Pool.FreeList<BasePlayer>(ref basePlayers);
    }​
    ......
}​