#include <amxmodx>
#include <amxmisc>
new const
// _________________________________________________
PLUGIN [] = "Alternative End Round Sounds",
VERSION[] = "2.3b",
AUTHOR [] = "Arkshine";
// _________________________________________________
#if AMXX_VERSION_NUM < 180
#define old_amxx
#endif
/* ========================= [ "START" AERA FOR CHANGES ] ========================= */
#define _DEBUG // Active debug
#define MAX_FILE_LENGTH 196 // Max length for files + path.
#if defined old_amxx
#define MAX_SOUNDS 25 // Max sounds per team
#endif
new const
g_FileName[] = "roundsound", // Name of the main file if no files is found in 'g_FileFolder'.
g_FileFolder[] = "round_sound", // Name of the directory in amxmodx/configs/ for per-map files.
g_FilePrefix[] = "ini", // File extension used for the files.
g_CmdChat[] = "/roundsound"; // Chat command for player.
/* ========================= [ "END" AERA FOR CHANGES ] ========================= */
// - - - - - - - - - - - - - - - - - - - - - - -
#define MAX_PLAYERS 32
#define TASKID_ADS 1333
#define SIZE_FILE 0
#define NULL -1
new
bool:g_pHeardSound[ MAX_PLAYERS + 1 ],
#if !defined old_amxx
Array:g_lstSoundCT,
Array:g_lstSoundT,
#endif
p_enabled,
p_player_toggle,
p_time_ads,
p_random_precache,
g_sRp_value[12],
g_msgSayText;
enum _:e_Team
{
T = 0,
CT,
};
new g_nSnd[ e_Team ];
#if defined old_amxx
new g_sTeam_sounds[ MAX_SOUNDS ][ e_Team ][ MAX_FILE_LENGTH ];
#define charsmax(%1) sizeof( %1 ) - 1
#endif
#define _is_wav(%1) equali( %1[strlen( %1 ) - 4 ], ".wav" )
// - - - - - - - - - - - - - - - - - - - - - - -
public plugin_precache()
{
register_dictionary( "end_roundsound.txt" );
if( ( p_random_precache = get_cvar_pointer( "erc_random_precache" ) ) )
get_pcvar_string( p_random_precache, g_sRp_value, charsmax( g_sRp_value ) );
if( !p_random_precache )
return;
#if !defined old_amxx
g_lstSoundCT = ArrayCreate( MAX_FILE_LENGTH );
g_lstSoundT = ArrayCreate( MAX_FILE_LENGTH );
#endif
loading_file();
}
public plugin_init()
{
register_plugin( PLUGIN, VERSION, AUTHOR );
register_cvar( "ers_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY );
register_event( "SendAudio", "eT_win" , "a", "2&%!MRAD_terwin" );
register_event( "SendAudio", "eCT_win", "a", "2&%!MRAD_ctwin" );
p_enabled = register_cvar( "ers_enabled" , "1" );
p_player_toggle = register_cvar( "ers_player_toggle" , "1" );
p_time_ads = register_cvar( "erc_time_ads" , "120" );
if( !p_random_precache )
{
register_cvar( "erc_random_precache", g_sRp_value );
server_cmd( "restart" );
}
register_clcmd( "say" , "cmd_Say" );
register_clcmd( "say_team" , "cmd_Say" );
g_msgSayText = get_user_msgid( "SayText" );
}
public client_authorized( id )
g_pHeardSound[id] = true;
public client_disconnect( id )
{
g_pHeardSound[id] = true;
remove_task( id + TASKID_ADS );
}
public client_putinserver( id )
{
new Float:time = get_pcvar_float( p_time_ads );
if( !time )
return;
remove_task( id + TASKID_ADS );
set_task( time, "show_ads", id + TASKID_ADS, _, _, "b" );
}
public show_ads( taskid )
{
new id = taskid - TASKID_ADS;
ShowPrint( id, "%L", id, "ERS_DISPLAY_ADS", g_CmdChat );
}
public cmd_Say( id )
{
if( !get_pcvar_num( p_enabled ) )
return PLUGIN_CONTINUE;
static sMsg[64];
read_argv( 1, sMsg, charsmax( sMsg ) );
if( equali( sMsg, g_CmdChat ) )
{
if( !get_pcvar_num( p_player_toggle ) )
{
ShowPrint( id, "%L", id, "ERS_CMD_DISABLED" );
return PLUGIN_HANDLED;
}
g_pHeardSound[id] = g_pHeardSound[id] ? false : true;
ShowPrint( id, "%L", id, g_pHeardSound[id] ? "ERS_SOUND_ENABLED" : "ERS_SOUND_DISABLED" );
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public eT_win()
{
if( !g_nSnd[ e_Team:T ] )
return;
play_sound( e_Team:T );
}
public eCT_win()
{
if( !g_nSnd[ e_Team:CT ] )
return;
play_sound( e_Team:CT );
}
play_sound( iTeam )
{
static
// - - - - - - - - - - - - - - - -
sCurSnd[ MAX_FILE_LENGTH ];
// - - - - - - - - - - - - - - - -
new iRand;
if( g_nSnd[ iTeam ] > 1 )
iRand = random( g_nSnd[ iTeam ] );
#if defined old_amxx
copy( sCurSnd, MAX_FILE_LENGTH - 1, g_sTeam_sounds[ iRand ][ iTeam ] );
#else
ArrayGetString( iTeam == CT ? g_lstSoundCT : g_lstSoundT, iRand, sCurSnd, MAX_FILE_LENGTH - 1 );
#endif
_is_wav( sCurSnd ) ?
format( sCurSnd, MAX_FILE_LENGTH - 1, "spk %s", sCurSnd[6] ) :
format( sCurSnd, MAX_FILE_LENGTH - 1, "mp3 play %s", sCurSnd );
if( get_pcvar_num( p_player_toggle ) )
{
static
// - - - - - - - - - - -
iPlayers[32],
iNum, pid;
// - - - - - - - - - - -
get_players( iPlayers, iNum, "c" );
for( new i; i < iNum; i++ )
{
pid = iPlayers[i];
if( !g_pHeardSound[pid] || is_user_bot( pid ) )
continue;
client_cmd( pid, "%s", sCurSnd );
}
}
else
client_cmd( 0, "%s", sCurSnd );
}
get_prefix( sMap[], iLen_map, sMapType[], iLen_type )
{
new
// - - - - - - - - -
sRest[32];
// - - - - - - - - -
get_mapname( sMap, iLen_map );
strtok( sMap, sMapType, iLen_type, sRest, charsmax( sRest ), '_', 1 );
}
loading_file()
{
static
// - - - - - - - - - - - - - - - - -
sPath[ MAX_FILE_LENGTH ],
// |
sConfigsDir[64],
sPrefix[6],
sMap[32];
// - - - - - - - - - - - - - - - - -
get_prefix( sMap, charsmax( sMap ), sPrefix, charsmax( sPrefix ) );
get_configsdir( sConfigsDir, charsmax( sConfigsDir ) );
new bool:bFound;
for( new i = 1; i <= 3; i++ )
{
switch( i )
{
case 1 : formatex( sPath, charsmax( sPath ), "%s/%s/prefix-%s.%s", sConfigsDir, g_FileFolder, sPrefix, g_FilePrefix );
case 2 : formatex( sPath, charsmax( sPath ), "%s/%s/%s.%s", sConfigsDir, g_FileFolder, sMap, g_FilePrefix );
case 3 : formatex( sPath, charsmax( sPath ), "%s/%s.%s", sConfigsDir, g_FileName, g_FilePrefix );
default : break;
}
if( !CheckFile( sPath ) )
continue;
bFound = true;
break;
}
log_amx( "---" );
bFound ?
log_amx( "%L", LANG_SERVER, "ERS_LOG_LOADING", sPath ) :
log_amx( "%L", LANG_SERVER, "ERS_LOG_NO_FILES_FOUND" );
load_sound( sPath );
}
load_sound( const file[] )
{
new
// - - - - - - - - - - - - - - -
sBuffer[256],
// |
sLeft[ MAX_FILE_LENGTH ],
sRight[4],
sExt[6],
// |
eTeam;
// - - - - - - - - - - - - - - -
new fp = fopen( file, "rt" );
while( !feof( fp ) )
{
fgets( fp, sBuffer, charsmax( sBuffer ) );
trim( sBuffer );
if( !sBuffer[0] || sBuffer[0] == ';' || ( sBuffer[0] == '/' && sBuffer[1] == '/' ) )
continue;
if( sBuffer[0] != '"' || strlen( sBuffer ) < 11 )
continue;
parse( sBuffer, sLeft, charsmax( sLeft ), sRight, charsmax( sRight ) );
formatex( sExt, charsmax( sExt ), sLeft[ strlen( sLeft ) - 4 ] );
if( equali( sExt, ".mp3" ) == -1 || equali( sExt, ".wav" ) == -1 )
{
log_amx( "%L", LANG_SERVER, "ERS_LOG_UNKNOW_EXTENSION", sExt );
continue;
}
if( !file_exists( sLeft ) )
{
log_amx( "%L", LANG_SERVER, "ERS_LOG_INEXISTENT_FILE", sLeft );
continue;
}
eTeam = NULL;
if( equali( sRight, "CT" ) )
eTeam = CT;
else if( equali( sRight, "T" ) )
eTeam = T;
if( eTeam == NULL )
{
log_amx( "%L", LANG_SERVER, "ERS_LOG_NO_TEAM_SOUND", sLeft );
continue;
}
#if defined old_amxx
copy( g_sTeam_sounds[ g_nSnd[ eTeam ] ][ eTeam ], MAX_FILE_LENGTH - 1, sLeft );
#else
ArrayPushString( eTeam == CT ? g_lstSoundCT : g_lstSoundT, sLeft );
#endif
++g_nSnd[ eTeam ];
}
fclose( fp );
if( g_nSnd[ e_Team:T ] > 1 || g_nSnd[ e_Team:CT ] > 1 )
{
new iMax_t, iMax_ct;
GetPrecacheValue( iMax_t, iMax_ct );
#if defined old_amxx
UpdateArray( iMax_t, e_Team:T );
UpdateArray( iMax_ct, e_Team:CT );
#else
p_DeleteRandomItem( iMax_t , e_Team:T , g_lstSoundT );
p_DeleteRandomItem( iMax_ct, e_Team:CT, g_lstSoundCT );
#endif
}
log_amx( "---" );
#if defined _DEBUG
log_amx( "[ Loading %d CTs Sounds ]", g_nSnd[ e_team:CT ] );
#endif
#if defined old_amxx
PrecacheSounds( e_Team:CT );
#else
PrecacheSounds_n( g_lstSoundCT );
#endif
#if defined _DEBUG
log_amx( "[ Loading %d Ts Sounds ]", g_nSnd[ e_team:T ] );
#endif
#if defined old_amxx
PrecacheSounds( e_Team:T );
#else
PrecacheSounds_n( g_lstSoundT );
#endif
}
GetPrecacheValue( &iMax_t, &iMax_ct )
{
trim( g_sRp_value );
new pos = contain( g_sRp_value, "-" );
if( pos > 0 )
{
iMax_ct = str_to_num( g_sRp_value[ pos + 1 ] )
g_sRp_value[ pos ] = '^0';
iMax_t = str_to_num( g_sRp_value );
}
else
{
iMax_t = str_to_num( g_sRp_value );
iMax_ct = iMax_t;
}
}
stock UpdateArray( iMax, iTeam )
{
new const iCnt_sound = g_nSnd[ iTeam ];
if( !iMax || iMax == iCnt_sound )
return;
if( iMax >= iCnt_sound )
iMax = iCnt_sound - 1;
static
sTmp_sounds[ MAX_SOUNDS ][ e_Team ][ MAX_FILE_LENGTH ],
iLast_number[ MAX_SOUNDS ];
new i, iRand;
for( i = 0; i < iCnt_sound; i++ )
{
copy( sTmp_sounds[i][ iTeam ], MAX_FILE_LENGTH - 1, g_sTeam_sounds[i][ iTeam ] );
g_sTeam_sounds[i][ iTeam ][0] = '^0';
}
arrayset( iLast_number, 0, charsmax( iLast_number ) );
i = 0;
while( i != iMax )
{
check:
iRand = random( iCnt_sound );
if( iLast_number[ iRand ] )
goto check;
copy( g_sTeam_sounds[i][ iTeam ], MAX_FILE_LENGTH - 1, sTmp_sounds[ iRand ][ iTeam ] );
++i;
iLast_number[ iRand ] = 1;
}
g_nSnd[ iTeam ] = iMax;
}
stock p_DeleteRandomItem( iMax, iTeam, Array:sSound_a )
{
new const iCnt_sound = g_nSnd[ iTeam ];
if( !iMax || iMax == iCnt_sound )
return;
if( iMax >= iCnt_sound )
iMax = iCnt_sound - 1;
DeleteRandomItem( iCnt_sound - iMax, sSound_a );
g_nSnd[ iTeam ] = iMax;
}
stock DeleteRandomItem( iRandom_n, Array:sSound_a )
{
new i;
while( i++ != iRandom_n )
ArrayDeleteItem( sSound_a, random( ArraySize( sSound_a ) ) );
}
stock PrecacheSounds( iTeam )
{
for( new i; i < g_nSnd[ iTeam ]; i++ )
{
PrecacheFile( g_sTeam_sounds[i][ iTeam ] );
#if defined _DEBUG
log_amx( " - %s", g_sTeam_sounds[i][ iTeam ] );
#endif
}
log_amx( "---" );
}
stock PrecacheSounds_n( Array:sSound_a )
{
static
// - - - - - - - - - - - - - - - - - - -
sFile[ MAX_FILE_LENGTH ],
iFileLen = charsmax( sFile );
// - - - - - - - - - - - - - - - - - - -
for( new i; i < ArraySize( sSound_a ); i++ )
{
ArrayGetString( sSound_a, i, sFile, iFileLen );
PrecacheFile( sFile );
#if defined _DEBUG
log_amx( " - %s", sFile );
#endif
}
log_amx( "---" );
}
PrecacheFile( const sound[] )
{
_is_wav( sound ) ?
precache_sound( sound[6] ) :
precache_generic( sound );
}
ShowPrint( id, const sMsg[], { Float, Sql, Result, _ }:... )
{
static
// - - - - - - - - -
newMsg[191],
message[191],
// |
tNewMsg;
// - - - - - - - - -
tNewMsg = charsmax( newMsg );
vformat( newMsg, tNewMsg, sMsg, 3 );
replace_all( newMsg, tNewMsg, "!t", "^3" );
replace_all( newMsg, tNewMsg, "!g", "^4" );
replace_all( newMsg, tNewMsg, "!n", "^1" );
formatex( message, charsmax( message ), "^4[ERS]^1 %s", newMsg );
emessage_begin( MSG_ONE, g_msgSayText, _, id );
ewrite_byte( id );
ewrite_string( message );
emessage_end();
}
bool:CheckFile( const file[] )
{
new
// - - - - - - - - - - - - - - - - -
sBuffer[256],
fp = fopen( file, "rt" );
// - - - - - - - - - - - - - - - - -
if( !fp )
return false;
while( !feof( fp ) )
{
fgets( fp, sBuffer, charsmax( sBuffer ) );
trim( sBuffer );
if( !sBuffer[0] || sBuffer[0] == ';' || ( sBuffer[0] == '/' && sBuffer[1] == '/' ) || sBuffer[0] != '"' )
continue;
if( ( contain( sBuffer, ".mp3^"" ) != -1 || contain( sBuffer, ".wav^"" ) != -1 ) && ( contain( sBuffer, "^"T^"" ) != -1 || contain( sBuffer, "^"CT^"" ) != -1 ) )
return true;
}
fclose( fp );
return false;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1038\\ f0\\ fs16 \n\\ par }
*/