Загрузка данных
/* ~ 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 );
}