#include < amxmodx >
#include < amxmisc >
#include < hamsandwich >
#include < fakemeta >
#include < biohazard >
#define is_user_player(%1) ( 1 <= %1 <= g_iMaxPlayers )
new const
PLUGIN_VERSION[ ] = "1.5",
PLUGIN_AUTHOR[ ] = "YONTU",
PLUGIN_NAME[ ] = "[Bio] Addon: VIP System";
// from fakemeta util
#if cellbits == 32
const OFFSET_CSMONEY = 115;
#else
const OFFSET_CSMONEY = 140;
#endif
const OFFSET_LINUX = 5;
enum {
SCOREATTRIB_ARG_PLAYERID = 1,
SCOREATTRIB_ARG_FLAGS
};
enum ( <<= 1 ) {
SCOREATTRIB_FLAG_NONE = 0,
SCOREATTRIB_FLAG_DEAD = 1,
SCOREATTRIB_FLAG_BOMB,
SCOREATTRIB_FLAG_VIP
};
enum _:WhatUserHas {
Speed,
Jump
}
new bool:g_bUserHas[ 33 ][ WhatUserHas ];
new g_cvar_speed_spawn,
g_cvar_health_spawn,
g_cvar_armor_spawn,
g_cvar_multidmg,
g_cvar_health_kill_reward,
g_cvar_health_hs_reward,
g_cvar_maxhealth,
g_cvar_kill_money_reward,
g_cvar_enable_show_dmg,
g_cvar_ebable_vip_scoreboard,
g_cvar_enable_vip_noflash,
g_cvar_enable_vip_multijump;
new Ham:Ham_Player_ResetMaxSpeed = Ham_Item_PreFrame;
new iJumpNum[ 33 ] = 0;
new g_iMultiJumps[ 33 ] = 0;
new g_iMaxJumps = 0;
new IsUserVip[ 33 ];
new szVipsList[ 128 ][ 32 ];
new szTotalLines;
new szNameVipList[ ] = "vips_list.ini";
new szFile2[ 128 ];
new g_iMaxPlayers;
new SyncHudMessage;
public plugin_init( ) {
register_plugin( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR );
is_biomod_active( ) ? plugin_init2( ) : pause( "ad" );
}
public plugin_init2( ) {
register_clcmd( "say /vip", "ShowAbilityForVip" );
register_clcmd( "say_team /vip", "ShowAbilityForVip" );
register_clcmd( "say /vips", "ShowVipsOnline" );
register_clcmd( "say_team /vips", "ShowVipsOnline" );
register_concmd( "amx_addvip", "ConCmdAddVip", ADMIN_RCON, " < nume > - adauga un vip" );
register_concmd( "amx_vips", "ConCmdVipsList", ADMIN_RCON, "vezi lista vip-urilor" );
register_event( "DeathMsg", "event_DeathMsg", "a" );
register_event( "DeathMsg", "event_DeathMsg2", "ae" );
register_event( "Damage", "event_Damage", "b", "2!0", "3=0", "4!0" );
register_logevent( "logevent_RoundStart", 2 , "1=Round_Start" );
register_logevent( "logevent_RoundEnd", 2, "1=Round_End" );
register_forward( FM_PlayerPreThink, "forward_PlayerPreThink" );
register_forward( FM_PlayerPostThink, "forward_PlayerPostThink" );
RegisterHam( Ham_Spawn, "player", "Ham_PlayerSpawnPost", 1 );
RegisterHam( Ham_TakeDamage, "player", "Ham_TakeDamagePre" );
RegisterHam( Ham_Player_ResetMaxSpeed, "player", "Ham_ResetMaxSpeedPost", 1 );
register_message( get_user_msgid( "ScoreAttrib" ), "MessageScoreAttrib" );
register_message( get_user_msgid( "ScreenFade" ), "MessageScreenFade" );
g_cvar_speed_spawn = register_cvar( "vip_speed_spawn", "500.0" ); // viteza pe care o primeste vip-ul la spawn( sa fie cu zecimala.0 )
g_cvar_health_spawn = register_cvar( "vip_health_spawn", "200" ); // viata pe care o primeste vip-ul la spawn
g_cvar_armor_spawn = register_cvar( "vip_armor_spawn", "150" ); // armura pe care o primeste vip-ul la spawn
g_cvar_multidmg = register_cvar( "vip_multi_dmg", "1.5" ); // vip-ul are dmg mai mare la toate armele
g_cvar_health_kill_reward = register_cvar( "vip_hp_kill_reward", "25" ); // cata viata sa primeasca vip-ul cand face un kill
g_cvar_health_hs_reward = register_cvar( "vip_hp_hs_reward", "50" ); // cata viata sa primeasca vip-ul cand face un headshot
g_cvar_maxhealth = register_cvar( "vip_maxhealth", "300" ); // viata maxima a vip-ului
g_cvar_kill_money_reward = register_cvar( "vip_kill_money", "1000" ); // Cati bani sa primeasca Vip-ul pe un frag
g_cvar_enable_show_dmg = register_cvar( "vip_show_dmg", "1" ); // afiseaza vip-ului dmg-ul facut de victima si dmg-ul pe care i la facut victimei
g_cvar_ebable_vip_scoreboard = register_cvar( "vip_on_scoreboard", "1" ); // 1 - vip-ii apar in scoreboard ca "VIP" | 0 - dezactivat
g_cvar_enable_vip_noflash = register_cvar( "vip_imune_flashbang", "1" ); // 1 - Vip-ul este imun la flash-uri | 0 - Nu este
g_cvar_enable_vip_multijump = register_cvar( "vip_enable_multijump", "0" ); // 1 - Vip-ul beneficiaza de multi jump | 0 - Nu beneficiaza
new szFile[ 64 ]
get_configsdir( szFile, 63 );
format( szFile, 63, "%s/vip_system.cfg", szFile );
if( file_exists( szFile ) )
server_cmd( "exec %s", szFile );
g_iMaxPlayers = get_maxplayers( );
SyncHudMessage = CreateHudSyncObj( );
}
public plugin_cfg( ) {
new DirectorCfg[ 64 ];
get_configsdir( DirectorCfg, charsmax( DirectorCfg ) );
formatex( szFile2, charsmax( szFile2 ), "%s/%s", DirectorCfg, szNameVipList );
if( !file_exists( szFile2 ) )
write_file( szFile2, "; --- | Aici sunt adaugati membrii V.I.P | --- " );
// thx husky for this 'while'
new szBuffer[ 192 ], szLine, iLen;
while( ( szLine = read_file( szFile2, szLine, szBuffer, charsmax( szBuffer ), iLen ) ) ) {
if( !strlen( szBuffer ) || szBuffer[ 0 ] == ';' || ( szBuffer[ 0 ] == '/' && szBuffer[ 1 ] == '/' ) )
continue;
copy( szVipsList[ szTotalLines++ ], 32, szBuffer );
}
set_cvar_float( "sv_maxspeed", 1000.0 );
}
public plugin_natives( )
register_native( "is_user_vip", "native_get_vip", 1 );
public native_get_vip( id ) {
if( !is_user_player( id ) )
return false;
if( !is_user_vip( id ) )
return false;
if( !is_user_vip( id ) )
IsUserVip[ id ] = 0;
else
IsUserVip[ id ] = 1;
return IsUserVip[ id ];
}
public client_putinserver( id ) {
g_iMultiJumps[ id ] = 0;
iJumpNum[ id ] = 0;
g_bUserHas[ id ][ Jump ] = false;
g_bUserHas[ id ][ Speed ] = false;
}
public client_disconnect( id ) {
g_iMultiJumps[ id ] = 0;
iJumpNum[ id ] = 0;
g_bUserHas[ id ][ Jump ] = false;
g_bUserHas[ id ][ Speed ] = false;
}
public event_infect( Victim, Attacker ) {
if( is_user_zombie( Victim ) || is_user_zombie( Attacker ) ) {
IsUserVip[ Victim ] = 0;
return 1;
}
IsUserVip[ Victim ] = 0;
g_iMultiJumps[ Victim ] = 0;
iJumpNum[ Victim ] = 0;
g_bUserHas[ Victim ][ Jump ] = false;
g_bUserHas[ Victim ][ Speed ] = false;
return 0;
}
public event_DeathMsg( ) {
new iAttacker = read_data( 1 );
new iVictim = read_data( 2 );
new iHeadshot = read_data( 3 );
if( iAttacker == iVictim )
return 0;
if( is_user_zombie( iAttacker ) ) {
IsUserVip[ iAttacker ] = 0;
return 1;
}
if( !is_user_vip( iAttacker ) ) {
IsUserVip[ iAttacker ] = 0;
return 1;
}
if( is_user_vip( iAttacker ) && is_user_zombie( iVictim ) && iAttacker != iVictim ) {
if( fm_get_user_health( iAttacker ) <= get_pcvar_num( g_cvar_maxhealth ) ) {
if( iHeadshot ) {
fm_set_user_health( iAttacker, fm_get_user_health( iAttacker ) + get_pcvar_num( g_cvar_health_hs_reward ) );
} else {
fm_set_user_health( iAttacker, fm_get_user_health( iAttacker ) + get_pcvar_num( g_cvar_health_kill_reward ) );
}
}
}
g_bUserHas[ iVictim ][ Jump ] = false;
g_bUserHas[ iVictim ][ Speed ] = false;
IsUserVip[ iAttacker ] = 1;
return 0;
}
public event_DeathMsg2( ) {
new iAttacker = read_data( 1 );
new iVictim = read_data( 2 );
if( iAttacker == iVictim )
return 0;
if( !is_user_alive( iAttacker ) )
return 1;
if( is_user_zombie( iAttacker ) ) {
IsUserVip[ iAttacker ] = 0;
return 1;
}
if( !is_user_vip( iAttacker ) ) {
IsUserVip[ iAttacker ] = 0;
return 1;
}
if( is_user_vip( iAttacker ) && is_user_zombie( iVictim ) ) {
if( fm_get_user_money( iAttacker ) < 16000 - get_pcvar_num( g_cvar_kill_money_reward ) - 300 ) {
fm_set_user_money( iAttacker, fm_get_user_money( iAttacker ) + get_pcvar_num( g_cvar_kill_money_reward ) - 300 );
}
}
IsUserVip[ iAttacker ] = 1;
return 0;
}
// thx Sniffer. for this event
public event_Damage( id ) {
if( get_pcvar_num( g_cvar_enable_show_dmg ) > 0 ) {
static iAttacker;
static fDamage;
iAttacker = get_user_attacker( id );
fDamage = read_data( 2 );
if( is_user_vip( iAttacker ) ) {
IsUserVip[ iAttacker ] = 1;
if( is_user_alive( id ) && is_user_vip( id ) ) {
set_hudmessage( 255, 0, 0, 0.45, 0.50, 2, 0.1, 1.0, 0.1, 0.1, -1 );
ShowSyncHudMsg( id, SyncHudMessage, "%i^n", fDamage );
}
if( is_user_alive( iAttacker ) && is_user_vip( iAttacker ) ) {
set_hudmessage( 0, 255, 15, -1.0, 0.55, 2, 0.1, 1.0, 0.02, 0.02, -1 );
ShowSyncHudMsg( iAttacker, SyncHudMessage, "%i^n^n", fDamage );
}
}
else {
IsUserVip[ id ] = 1;
}
}
return 0;
}
public logevent_RoundStart( ) {
new szPlayers[ 32 ], iNum;
get_players( szPlayers, iNum, "ch" );
for( new i = 0; i < iNum; i++ ) {
g_bUserHas[ szPlayers[ i ] ][ Speed ] = false;
g_bUserHas[ szPlayers[ i ] ][ Jump ] = false;
g_iMultiJumps[ szPlayers[ i ] ] = 0;
iJumpNum[ szPlayers[ i ] ] = 0;
}
}
public logevent_RoundEnd( ) {
new szPlayers[ 32 ], iNum;
get_players( szPlayers, iNum, "ch" );
for( new i = 0; i < iNum; i++ )
remove_task( szPlayers[ i ] );
}
// thx pharse.(zp50) for this 2 forwards
public forward_PlayerPreThink( id ) {
if( !is_user_alive( id ) || !g_iMultiJumps[ id ] )
return 0;
if( ( pev( id, pev_button ) & IN_JUMP ) && !( pev( id, pev_flags ) & FL_ONGROUND ) && !( pev( id, pev_oldbuttons ) & IN_JUMP ) ) {
if( iJumpNum[ id ] < g_iMultiJumps[ id ] ) {
g_bUserHas[ id ][ Jump ] = true;
iJumpNum[ id ]++;
return 0;
}
}
if( ( pev( id, pev_button ) & IN_JUMP ) && ( pev( id, pev_flags ) & FL_ONGROUND ) ) {
iJumpNum[ id ] = 0;
return 0;
}
return 0;
}
public forward_PlayerPostThink( id ) {
if( !is_user_alive( id ) || !g_iMultiJumps[ id ] )
return 0;
if( g_bUserHas[ id ][ Jump ] ) {
new Float:fVelocity[ 3 ];
pev( id, pev_velocity, fVelocity );
fVelocity[ 2 ] = random_float( 265.0, 285.0 );
set_pev( id, pev_velocity, fVelocity );
g_bUserHas[ id ][ Jump ] = false;
return 0;
}
return 0;
}
public Ham_PlayerSpawnPost( id ) {
if( !is_user_alive( id ) )
return HAM_IGNORED;
if( !is_user_vip( id ) ) {
IsUserVip[ id ] = 0;
return HAM_IGNORED;
}
if( is_user_vip( id ) && !is_user_bot( id ) )
set_task( 0.1, "task_GiveSkillsAllVips", id );
IsUserVip[ id ] = 1;
return HAM_IGNORED;
}
public task_GiveSkillsAllVips( id ) {
g_bUserHas[ id ][ Speed ] = true;
set_pev( id, pev_maxspeed, get_pcvar_float( g_cvar_speed_spawn ) );
new szCommand[ 128 ];
formatex( szCommand, sizeof( szCommand ) - 1, "cl_forwardspeed %.1f;cl_sidespeed %.1f;cl_backspeed %.1f", get_pcvar_float( g_cvar_speed_spawn ), get_pcvar_float( g_cvar_speed_spawn ), get_pcvar_float( g_cvar_speed_spawn ) );
client_cmd( id, szCommand );
if( get_pcvar_num( g_cvar_enable_vip_multijump ) > 0 )
if( g_iMultiJumps[ id ] < g_iMaxJumps || !g_iMaxJumps )
g_iMultiJumps[ id ]++;
fm_set_user_health( id, get_pcvar_num( g_cvar_health_spawn ) );
fm_set_user_armor( id, get_pcvar_num( g_cvar_armor_spawn ) );
fm_give_item( id, "weapon_hegrenade" );
fm_give_item( id, "weapon_flashbang" );
fm_give_item( id, "weapon_flashbang" );
fm_give_item( id, "weapon_smokegrenade" );
IsUserVip[ id ] = 1;
}
public ShowVipsOnline( user ) {
new szVipNames[ 33 ][ 32 ];
new szMessage[ 256 ];
new iCount, iLen;
for( new id = 1 ; id <= g_iMaxPlayers ; id++ ) {
if( is_user_connected( id ) && is_user_vip( id ) ) {
get_user_name( id, szVipNames[ iCount++ ], 31 );
IsUserVip[ id ] = 1;
}
}
iLen = format( szMessage, 255, "^x04[Bio.Lunetistii.Ro]^x01 VIP's Online: " );
if( iCount > 0 ) {
for( new i = 0 ; i < iCount ; i++ ) {
iLen += format( szMessage[ iLen ], 255 - iLen, "^x03%s^x01, ", szVipNames[ i ] );
if( iLen > 96 ) {
ColorChat( user, szMessage );
}
}
ColorChat( user, szMessage );
} else {
iLen += format( szMessage[ iLen ], 255 - iLen, "^x03Nu sunt VIP-i online." );
ColorChat( user, szMessage );
}
}
public Ham_ResetMaxSpeedPost( id ) {
if( !is_user_vip( id ) ) {
IsUserVip[ id ] = 0;
return HAM_IGNORED;
}
if( is_user_alive( id ) && is_user_vip( id ) && pev( id, pev_maxspeed ) != 1.0 ) {
new Float:flMaxSpeed;
if( g_bUserHas[ id ][ Speed ] )
flMaxSpeed = float( get_pcvar_num( g_cvar_speed_spawn ) );
if( flMaxSpeed > 0.0 )
set_pev( id, pev_maxspeed, flMaxSpeed );
}
IsUserVip[ id ] = 1;
return HAM_IGNORED;
}
public Ham_TakeDamagePre( iVictim, iInflictor, iAttacker, Float:fDamage ) {
if( !is_user_vip( iAttacker ) ) {
IsUserVip[ iAttacker ] = 0;
return HAM_HANDLED;
}
if( iVictim == iAttacker || !is_user_player( iAttacker ) || !is_user_alive( iAttacker ) || is_user_bot( iAttacker ) )
return HAM_HANDLED;
if( is_user_vip( iAttacker ) && is_user_zombie( iVictim ) )
SetHamParamFloat( 4, fDamage * get_pcvar_float( g_cvar_multidmg ) );
IsUserVip[ iAttacker ] = 1;
return HAM_IGNORED;
}
// thx Exolent. for this public
public MessageScoreAttrib( iMsgId, iMsgDest, id ) {
if( get_pcvar_num( g_cvar_ebable_vip_scoreboard ) > 0 ) {
new iPlayer = get_msg_arg_int( SCOREATTRIB_ARG_PLAYERID );
if( !is_user_vip( iPlayer ) ) {
IsUserVip[ iPlayer ] = 0;
return;
}
if( is_user_vip( iPlayer ) && !is_user_zombie( iPlayer ) )
set_msg_arg_int( SCOREATTRIB_ARG_FLAGS, ARG_BYTE, SCOREATTRIB_FLAG_VIP );
IsUserVip[ iPlayer ] = 1;
}
}
// thx cheep.suit for this public
public MessageScreenFade( iMsgId, iMsgDest, id ) {
if( !is_user_vip( id ) ) {
IsUserVip[ id ] = 0;
return 1;
}
if( is_user_alive( id ) )
return 1;
if( is_user_vip( id ) && get_pcvar_num( g_cvar_enable_vip_noflash ) ) {
static szData[ 4 ];
szData[ 0 ] = get_msg_arg_int( 4 );
szData[ 1 ] = get_msg_arg_int( 5 );
szData[ 2 ] = get_msg_arg_int( 6 );
szData[ 3 ] = get_msg_arg_int( 7 );
if( szData[ 0 ] == 255 && szData[ 1 ] == 255 && szData[ 2 ] == 255 && szData[ 3] > 199 )
return 1;
}
IsUserVip[ id ] = 1;
return 0;
}
public ShowAbilityForVip( id ) {
new iCfgDir[ 32 ], iFile[ 192 ];
get_configsdir( iCfgDir, charsmax( iCfgDir ) );
formatex( iFile, charsmax( iFile ), "%s/vip.html", iCfgDir );
show_motd( id, iFile );
}
public ConCmdAddVip( id, level, cid ) {
if( !cmd_access( id, level, cid, 2 ) )
return 1;
if( !is_user_connected( id ) || is_user_bot( id ) )
return 1;
new szVipName[ 33 ];
new DataLog[ 128 ];
get_user_name( id, szVipName, charsmax( szVipName ) );
// thx CryWolf for this codes
new File = fopen( szFile2, "a+" );
formatex( DataLog, 127, "%s^n", szVipName );
fputs( File, DataLog );
fclose( File );
new szTarget[ 32 ];
read_argv( 1, szTarget, 31 );
new iPlayer = cmd_target( id, szTarget, 8 );
if( !iPlayer )
return 1;
new szAdminName[ 32 ], szPlayerName[ 32 ];
get_user_name( id, szAdminName, 31 );
get_user_name( iPlayer, szPlayerName, 31 );
ColorChat( 0, "!3(!1ADMIN^x03)^x04 %s^x01: make VIP^x03 %s", szAdminName, szPlayerName );
ColorChat( iPlayer, "^x04*^x01 Felicitari, ai fost adaugat ca^x03 membru VIP^x01! Daca nu stii beneficiile unui VIP, tasteaza^x03 /vip^x01!" );
console_print( id, "* V.I.P-ul '%s'a fost adaugat in lista!", iPlayer );
return 0;
}
public ConCmdVipsList( id, level, cid ) {
if( !cmd_access( id, level, cid, 1 ) )
return 1;
new szName[ 32 ];
get_user_name( id, szName, 31 );
console_print( id, "--== | Lista membrilor VIP | ==--" );
for( new i; i < szTotalLines; i++ ) {
// thx KronoS # GG pentru explicatia acestei linii
if( strcmp( szName, szVipsList[ i ] ) ) {
console_print( id, " - %s", szVipsList[ i ] );
}
}
console_print( id, "--== | Lista membrilor VIP | ==--" );
return 0;
}
stock is_user_vip( id ) {
new szName[ 32 ];
get_user_name( id, szName, 31 );
for( new i; i < szTotalLines; i++ ) {
// thx KronoS # GG pentru explicatia acestei linii
if( !strcmp( szName, szVipsList[ i ] ) ) {
return 1;
}
}
return 0;
}
// Fakemeta Util
stock fm_set_user_money( id, money, flash = 1 ) {
set_pdata_int( id, OFFSET_CSMONEY, money, OFFSET_LINUX );
message_begin( MSG_ONE, get_user_msgid( "Money" ), { 0, 0, 0 }, id );
write_long( money );
write_byte( flash );
message_end( );
}
stock fm_get_user_money( id )
return get_pdata_int( id, OFFSET_CSMONEY, OFFSET_LINUX );
stock fm_set_user_health( id, health )
( health > 0 ) ? set_pev( id, pev_health, float( health ) ) : dllfunc( DLLFunc_ClientKill, id );
stock fm_get_user_health( index ) {
new health;
pev( index, pev_health, health );
return health;
}
stock fm_set_user_armor( index, armor ) {
set_pev( index, pev_armorvalue, float( armor ) );
return 1;
}
stock fm_give_item( index, const item[ ] ) {
if( !equal( item, "weapon_", 7 ) && !equal( item, "ammo_", 5 ) && !equal( item, "item_", 5 ) && !equal( item, "tf_weapon_", 10 ) )
return 0;
new ent = fm_create_entity( item );
if( !pev_valid( ent ) )
return 0;
new Float:fOrigin[ 3 ];
pev( index, pev_origin, fOrigin );
set_pev( ent, pev_origin, fOrigin );
set_pev( ent, pev_spawnflags, pev( ent, pev_spawnflags ) | SF_NORESPAWN );
dllfunc( DLLFunc_Spawn, ent );
new save = pev( ent, pev_solid );
dllfunc( DLLFunc_Touch, ent, index );
if( pev( ent, pev_solid ) != save )
return ent;
engfunc( EngFunc_RemoveEntity, ent );
return -1;
}
stock fm_create_entity( const classname[ ] )
return engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, classname ) );
stock ColorChat( const id, const input[ ], any:... ) {
new iCount = 1, szPlayers[ 32 ];
static szMsg[ 191 ];
vformat( szMsg, 190, input, 3 );
replace_all( szMsg, 190, "!4", "^4" );
replace_all( szMsg, 190, "!1", "^1" );
replace_all( szMsg, 190, "!3", "^3" );
if( id )
szPlayers[ 0 ] = id;
else
get_players( szPlayers, iCount, "ch" );
for( new i = 0; i < iCount; i++ ) {
if( is_user_connected( szPlayers[ i ] ) ) {
message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, szPlayers[ i ] );
write_byte( szPlayers[ i ] );
write_string( szMsg );
message_end( );
}
}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/