View Single Post
siriusmd99
Veteran Member
Join Date: Oct 2013
Location: Republic of Moldova
Old 05-13-2016 , 08:52   Re: Full Server Slot Reservation
Reply With Quote #2

PHP Code:
// ================================================================================================
//
//    Plugin:  Full Server Slot Reservation
//    Version: 0.2.1
//    Authors: PomanoB & droper
//
//    Copyright © 2011 - 2013
//
// ================================================================================================

#include < amxmodx >
#include < amxmisc >  
#include < orpheu >

// ================================================================================================
//
//    Макроконстанты
//
// ================================================================================================

#define PLUGIN    "Full Server Slot Reservation"
#define VERSION    "0.2.1"
#define AUTHOR    "PomanoB & droper"

// Проверять пароль _pw или нет
#define PASSWORD_CHECK

// Причина кика
#define KICK_REASON "Slot reservation! You unluck player!"


#if defined PASSWORD_CHECK

    // Строка должна быть такой же как и в кваре amx_password_field ( но \ в начале и конце обязательны )
    
new const g_passwordField[] = "\_pw\";
#endif

// ================================================================================================
//
//    Глобальные переменные
//
// ================================================================================================

new g_maxplayers = 0;


// ================================================================================================
//
//    plugin_precache ()
//
// ================================================================================================

public plugin_precache ( )
{
    register_plugin ( PLUGIN, VERSION, AUTHOR );

    OrpheuRegisterHook ( OrpheuGetFunction ( "
SV_ConnectClient" ), "OnSV_ConnectClient" );

    g_maxplayers = get_maxplayers ( );
}

// ================================================================================================
//
//    OnSV_ConnectClient ()
//
// ================================================================================================

public OrpheuHookReturn:OnSV_ConnectClient ( )
{
    static szInfo[512], szName[ 32 ], iPos, iCount, iFlags;

    read_args ( szInfo, charsmax( szInfo ) );

    szInfo[ strlen ( szInfo ) - 1 ] = EOS;

    iPos = contain ( szInfo, "
\name\" );

    copyc ( szName, charsmax( szName ), szInfo[ iPos + 6 ], '\' );

#if defined PASSWORD_CHECK

        static szPassword[ 64 ];

        iPos = contain ( szInfo, g_passwordField );

        if ( iPos != -1 )
        {
            copyc ( szPassword, charsmax( szPassword), szInfo[ iPos + charsmax( g_passwordField ) ], '\' );
        }
        else
        {
            szPassword[ 0 ] = EOS;
        }
#endif

    iCount = admins_num ( );

    for ( iPos = 0; iPos < iCount; iPos++ )
    {
        iFlags = admins_lookup ( iPos, AdminProp_Flags );

        admins_lookup ( iPos, AdminProp_Auth, szInfo, charsmax( szInfo ) );

        if ( iFlags & ( FLAG_AUTHID | FLAG_IP ) )
        {
            continue;
        }

        if ( iFlags & FLAG_TAG )
        {
            if ( iFlags & FLAG_CASE_SENSITIVE )
            {
                if ( contain ( szName, szInfo ) != -1 )
                {
                    break;
                }
            }
            else if ( contain ( szName, szInfo ) != -1 )
            {
                break;
            }
        }
        else
        {

            if ( iFlags & FLAG_CASE_SENSITIVE )
            {
                if ( equal ( szInfo, szName ) )
                {
                    break;
                }
            }
            else
            {
                if ( equali ( szInfo, szName ) )
                {
                    break;

                }
            }
        }

    }

    if ( iPos == iCount )
    {
        return OrpheuIgnored;
    }

#if defined PASSWORD_CHECK

        if ( !( iFlags & FLAG_NOPASS ) )
        {
            admins_lookup ( iPos, AdminProp_Password, szInfo, charsmax( szInfo ) );

            if ( !equal ( szInfo, szPassword ) )
            {
                return OrpheuIgnored;
            }
        }
#endif

    iPos = findKickedPlayer ( );

    if ( iPos && !is_user_admin(iPos) )
    {
        server_cmd ( "
kick #%d ^"%s^"", get_user_userid ( iPos ), KICK_REASON );
        
server_exec ( );
    }

    return 
OrpheuIgnored;
}

// ================================================================================================
//
//    findKickedPlayer ()
//
// ================================================================================================

public findKickedPlayer()
{
    static 
iiUnluckPlayeriPlayersNum;

    
iUnluckPlayer 0;

    
iPlayersNum 0;

    for ( 
1<= g_maxplayersi++ )
    {
        if ( 
is_user_connected ) )
        {
            
iPlayersNum++

            if ( !
iUnluckPlayer && !is_user_bot ) )
            {
                
iUnluckPlayer i;
            }
        }
    }

    if ( 
iUnluckPlayer && iPlayersNum == g_maxplayers )
    {
        return 
iUnluckPlayer;
    }

    return 
0;


Last edited by siriusmd99; 05-13-2016 at 13:48.
siriusmd99 is offline