Загрузка данных


/* ~ Includes. ~ */
#include < amxmisc >
#include < reapi >

/* ~ We cut off old versions. ~ */
#if AMXX_VERSION_NUM < 190
    #assert Outdated version of AMX Mod X (AMXX_VERSION_NUM), please update in order to use this plugin properly.
#endif

/* ~ Sub-includes. ~ */
#include < bio >

/* ~ Special instruction. ~ */
#pragma semicolon 1

/* ~ Immutable cvars list. ~ */
new const IMMUTABLE_CVARS_LIST[ ][ ][ ] =
{
    { "mp_limitteams", "0" },
    { "mp_autoteambalance", "0" },
    { "mp_round_infinite", "b" },
    { "mp_roundover", "1" },
    { "mp_auto_join_team", "1" },
    { "humans_join_team", "CT" },
    { "mp_autokick", "0" }
};
new m_csImmutableCvarsList[ sizeof IMMUTABLE_CVARS_LIST ];

#define DELAY_BEFORE_NEW_ROUND 5.0

enum ( += 100 )
{
    TASKID_WARMUP
};

new bool: m_bWarmup;

new m_pCvar_FreezeTime,
    m_pCvar_RoundTime,
    m_pCvar_OverHumansWin;

/* ~ This forward allows plugins to add models, sounds and generic files to the precache tables using the precache_* set of functions. ~ */
public plugin_precache( )
{
    // Sets informations about the calling plugin.
    register_plugin( "[BIO] Rules", BIO_VERSION, "oxsi. x Vision" );

    for ( new i = 0; i < sizeof IMMUTABLE_CVARS_LIST; i++ )
    {
        m_csImmutableCvarsList[ i ] = get_cvar_pointer( IMMUTABLE_CVARS_LIST[ i ][ 0 ] );
        set_pcvar_string( m_csImmutableCvarsList[ i ], IMMUTABLE_CVARS_LIST[ i ][ 1 ] );

        hook_cvar_change( m_csImmutableCvarsList[ i ], "@Hook_ForcingCvarChange" );
    }

    m_pCvar_FreezeTime = get_cvar_pointer( "mp_freezetime" );
    m_pCvar_RoundTime = get_cvar_pointer( "mp_roundtime" );

    set_pcvar_flags( m_pCvar_FreezeTime, get_pcvar_flags( m_pCvar_FreezeTime ) | FCVAR_UNLOGGED );
    set_pcvar_flags( m_pCvar_RoundTime, get_pcvar_flags( m_pCvar_RoundTime ) | FCVAR_UNLOGGED );

    new warmupTime = bio_get_data( Arg_WarmupTime );
    if ( warmupTime )
    {
        m_bWarmup = true;
        bio_set_round_cvars( 0, warmupTime );
    }
    else
        bio_set_round_cvars( bio_get_data( Arg_PrepareTime ), bio_get_data( Arg_RoundTime ) );
}

public plugin_init( )
{
    m_pCvar_OverHumansWin = register_cvar( "bio_over_humans_win", "1" );

    RegisterHookChain( RG_RoundEnd, "@RoundEnd_Pre", false );

    RegisterHookChain( RG_CSGameRules_RestartRound, "@CSGameRules_RestartRound_Pre", false );
    RegisterHookChain( RG_CSGameRules_CheckWinConditions, "@CSGameRules_CheckWinConditions_Pre", false );
    //RegisterHookChain( RG_CSGameRules_CheckWinConditions, "@CSGameRules_CheckWinConditions_Post", true );

    set_task_ex( 1.0, "@Task_Warmup", TASKID_WARMUP, .flags = SetTask_Repeat );
}

@Hook_ForcingCvarChange( pcvar, const old_value[ ], const new_value[ ] )
{
    for ( new i = 0; i < sizeof IMMUTABLE_CVARS_LIST; i++ )
    {
        if ( m_csImmutableCvarsList[ i ] != pcvar )
            continue;

        if ( equal( new_value, IMMUTABLE_CVARS_LIST[ i ][ 1 ] ) )
            continue;

        set_pcvar_string( pcvar, IMMUTABLE_CVARS_LIST[ i ][ 1 ] );
        break;
    }
}

@Task_Warmup( taskid )
{
    if ( !m_bWarmup )
    {
        remove_task( TASKID_WARMUP );
        return;
    }

    if ( get_member_game( m_bRoundTerminating ) )
        return;

    new timeLeft = floatround( float( get_member_game( m_iRoundTimeSecs ) ) - get_gametime( ) + Float: get_member_game( m_fRoundStartTimeReal ) );
    if ( timeLeft == 11 )
        client_cmd( 0, "spk ^"plats/elevbell1.wav^"" );
    else if ( timeLeft <= 4 && timeLeft > 1 )
        client_cmd(0, "spk ^"buttons/bell1.wav^"");
}

@RoundEnd_Pre( WinStatus: status, ScenarioEventEndRound: event, Float: tmDelay )
{
    if ( m_bWarmup )
    {
        SetHookChainArg( 2, ATYPE_INTEGER, ROUND_GAME_COMMENCE );
        SetHookChainArg( 3, ATYPE_FLOAT, DELAY_BEFORE_NEW_ROUND );
        return;
    }

    if ( !get_member_game( m_bGameStarted ) )
        return;

    if ( status == WINSTATUS_NONE )
        status = WINSTATUS_DRAW;

    if ( status == WINSTATUS_DRAW )
    {
        if ( get_pcvar_bool( m_pCvar_OverHumansWin ) )
            status = WINSTATUS_CTS;
    }

    SetHookChainArg( 1, ATYPE_INTEGER, status );
}

@CSGameRules_RestartRound_Pre( )
{
    m_bWarmup = false;
    remove_task( TASKID_WARMUP );

    bio_set_round_cvars( bio_get_data( Arg_PrepareTime ), bio_get_data( Arg_RoundTime ) );
}

@CSGameRules_CheckWinConditions_Pre( )
{
    return HC_SUPERCEDE;
}

@CSGameRules_CheckWinConditions_Post( )
{
    if ( get_member_game( m_bGameStarted ) )
        return;

    rg_round_end( DELAY_BEFORE_NEW_ROUND, WINSTATUS_DRAW, ROUND_GAME_COMMENCE, .trigger = true );
}

bio_set_round_cvars( freezeTime, roundTime )
{
    set_pcvar_num( m_pCvar_FreezeTime, freezeTime );
    set_pcvar_float( m_pCvar_RoundTime, float( roundTime ) / 60.0 );
}