// Includes
#include < amxmodx >
#include < amxmisc >
#include < hamsandwich >
#include < cstrike >
#include < fakemeta >
#include < fun >
#include < fvault >
// Register Plugin
new const PLUGIN_NAME[ ] = "[SURF] Level System",
PLUGIN_VERSION[ ] = "1.7",
PLUGIN_AUTHOR[ ] = "YONTU";
#define MAX_LEVEL 15 // This is max level
#define ADMIN_ACCESS ADMIN_LEVEL_G
#define is_user_valid(%1) (1 <= %1 <= 32)
enum bs_data { Level = 1, Gravity, Speed, Health, Armor, Flash, He, Smoke }
new const Tag[ ] = "[SURF: Level System]";
new const SoundLevelUp[ ] = "misc/levelup.wav";
new const g_Vault[ ] = "surf_levelmod_1.7";
new g_UserXP[ 33 ], g_UserLevel[ 33 ];
new cvar_levelup_protect, cvar_levelup_effects, cvar_kill_xp, cvar_hs_xp;
new c_levelup_protect, c_levelup_effects, SyncHudMessage;
// Hack to be able to use Ham_Player_ResetMaxSpeed (by joaquimandrade)
new Ham:Ham_Player_ResetMaxSpeed = Ham_Item_PreFrame;
enum e_data { Xp, Float:Gravity, Float:Speed, Health, Armor, Flash, He, Smoke }
new const g_PlayerData[ MAX_LEVEL+1 ][ e_data ] = {
/* XP Gravity Speed Health Armor Flash He Smoke */ // e_data
{ 0, 800.0, 260.0, 100, 0, 0, 0, 0 }, // NU modifica nimic pe linia asta
{ 100, 800.0, 260.0, 100, 0, 0, 0, 0 }, // Level 1
{ 250, 780.0, 260.5, 105, 5, 0, 0, 0 }, // Level 2
{ 300, 760.0, 270.0, 105, 10, 0, 0, 0 }, // Level 3
{ 400, 740.0, 270.5, 110, 10, 0, 0, 0 }, // Level 4
{ 500, 720.0, 280.0, 110, 15, 0, 0, 0 }, // Level 5
{ 750, 700.0, 280.5, 115, 20, 0, 0, 0 }, // Level 6
{ 1000, 680.0, 290.0, 120, 25, 0, 0, 0 }, // Level 7
{ 1400, 660.0, 290.5, 125, 30, 0, 0, 0 }, // Level 8
{ 1800, 640.0, 300.0, 130, 35, 0, 0, 0 }, // Level 9
{ 2500, 620.0, 300.5, 150, 50, 0, 0, 0 }, // Level 10
{ 4000, 600.0, 310.0, 150, 50, 1, 0, 0 }, // Level 11
{ 5500, 580.0, 310.5, 150, 50, 1, 0, 1 }, // Level 12
{ 7500, 560.0, 315.0, 150, 50, 2, 0, 1 }, // Level 13
{ 9000, 540.0, 320.0, 150, 50, 2, 1, 1 }, // Level 14
{ 12000, 500.0, 330.0, 175, 75, 2, 1, 1 } // Level 15
/* XP Gravity Speed Health Armor Flash He Smoke */ //e_data
}
public plugin_init( ) {
register_plugin( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR );
register_cvar( "level_mod_", PLUGIN_VERSION, FCVAR_SPONLY|FCVAR_SERVER );
set_cvar_string( "level_mod_", PLUGIN_VERSION );
cvar_kill_xp = register_cvar( "surf_kill_xp", "25" );
cvar_hs_xp = register_cvar( "surf_hs_xp", "50" );
cvar_levelup_protect = register_cvar( "surf_levelup_protect", "1" );
cvar_levelup_effects = register_cvar( "surf_levelup_effects", "1" );
register_event( "HLTV", "event_NewRound", "a", "1=0", "2=0" );
register_event( "DeathMsg", "event_DeathMsg", "a" );
// Block change name. Is restricted.
register_forward( FM_ClientUserInfoChanged, "fw_ChangeName" );
RegisterHam( Ham_Spawn, "player", "fw_PlayerSpawn", 1 );
RegisterHam( Ham_Player_ResetMaxSpeed, "player", "fw_ResetMaxSpeed_Post", 1 );
register_clcmd( "say /xp", "ClShowXp" );
register_clcmd( "say_team /xp", "ClShowXp" );
register_clcmd( "say /level", "CmdManagePlayers" );
register_clcmd( "say_team /level", "CmdManagePlayers" );
SyncHudMessage = CreateHudSyncObj( );
}
public plugin_precache( )
precache_sound( SoundLevelUp );
public plugin_cfg( ) {
c_levelup_protect = get_pcvar_num( cvar_levelup_protect );
c_levelup_effects = get_pcvar_num( cvar_levelup_effects );
}
public plugin_natives( ) {
// Player specific natives
register_native( "xp_mod", "native_xp_mod", 1 );
register_native( "get_user_xp", "native_get_user_xp", 1 );
register_native( "get_user_level", "native_get_user_level", 1 );
register_native( "get_max_level", "native_get_max_level", 1 );
register_native( "get_user_next_level_xp", "native_get_user_next_level_xp", 1 );
}
public native_xp_mod( id, set_xp, xp, set_level, level, update, save ) {
if( !is_user_valid( id ) ) {
log_error( AMX_ERR_NATIVE, "%s: Invalid Player (%d).", PLUGIN_NAME, id );
return false;
}
return make_user_happy( id, set_xp, xp, set_level, level, update, save );
}
public native_get_user_xp( id ) {
if( !is_user_valid( id ) ) {
log_error( AMX_ERR_NATIVE, "%s: Invalid Player (%d).", PLUGIN_NAME, id );
return false;
}
return g_UserXP[ id ];
}
public native_get_user_level( id ) {
if( !is_user_valid( id ) ) {
log_error( AMX_ERR_NATIVE, "%s: Invalid Player (%d).", PLUGIN_NAME, id );
return false;
}
return g_UserLevel[ id ];
}
public native_get_max_level( )
return MAX_LEVEL;
public native_get_user_next_level_xp( id ) {
if( !is_user_valid( id ) ) {
log_error( AMX_ERR_NATIVE, "%s: Invalid Player (%d).", PLUGIN_NAME, id );
return false;
}
if( is_user_connected( id ) && g_UserLevel[ id ] <= native_get_max_level( ) )
return get_xp_on_level( id );
return true;
}
public client_putinserver( id ) {
LoadUserExperience( id );
set_task( 1.0, "task_ShowHUD", id + 1221, _, _, "b" );
}
public client_disconnect( id ) {
SaveUserExperience( id );
remove_task( id + 1221 );
}
public fw_ChangeName( id ) {
if( is_user_connected( id ) ) {
new g_NewName[ 32 ];
get_user_info( id, "name", g_NewName, charsmax( g_NewName ) );
if( !equal( get_name( id ), g_NewName ) ) {
ColorChat( id, "!3%s!1 Este!4 INTERZISA!1 schimbarea numelui pe server.", Tag );
set_user_info( id, "name", get_name( id ) );
}
}
}
public fw_ResetMaxSpeed_Post( id ) {
if( !is_user_alive( id ) )
return HAM_HANDLED;
new Float:fMaxSpeed = g_PlayerData[ g_UserLevel[ id ] ][ Speed ];
set_user_maxspeed( id, fMaxSpeed );
new command[ 128 ];
formatex( command, charsmax( command ), "cl_forwardspeed %.1f;cl_sidespeed %.1f;cl_backspeed %.1f", fMaxSpeed, fMaxSpeed, fMaxSpeed );
client_cmd( id, command );
return HAM_IGNORED;
}
public fw_PlayerSpawn( id ) {
if( !is_user_alive( id ) )
return PLUGIN_HANDLED;
if( g_UserLevel[ id ] == MAX_LEVEL)
ColorChat( id, "!4***!1 Level:!3 %d!4 ***!1 XP:!3 %d", MAX_LEVEL, g_UserXP[ id ] );
else
ColorChat( id, "!4***!1 Level:!3 %d!1/!3%d!4 ***!1 XP:!3 %d!1/!3%d", g_UserLevel[ id ], MAX_LEVEL, g_UserXP[ id ], get_xp_on_level( id ) );
if( g_UserLevel[ id ] == 0 ) {
make_user_happy( id, 0, 0, 0, 0, 1, 0 );
return PLUGIN_CONTINUE;
}
set_task( 1.0, "set_user_items", id );
return PLUGIN_CONTINUE;
}
public event_NewRound( ) {
c_levelup_protect = get_pcvar_num( cvar_levelup_protect );
c_levelup_effects = get_pcvar_num( cvar_levelup_effects );
}
public event_DeathMsg( ) {
new iAttacker = read_data( 1 );
new iVictim = read_data( 2 );
new iHeadShot = read_data( 3 );
new HitSelf = ( iAttacker == iVictim ) ? 1 : 0;
if( HitSelf )
return PLUGIN_HANDLED;
new _xp_kill, _xp_hs;
_xp_hs = get_pcvar_num( cvar_hs_xp );
_xp_kill = get_pcvar_num( cvar_kill_xp );
if( is_user_connected( iAttacker ) && is_user_connected( iVictim ) && !HitSelf ) {
if( iHeadShot ) {
if( _xp_hs != 0 ) {
make_user_happy( iAttacker, 1, _xp_hs, 0, 0, 1, 1 );
ColorChat( iAttacker, "!4%s!1 You have been received!3 %i xp!1 for getting a headshot.", Tag, _xp_hs );
}
return PLUGIN_HANDLED;
} else {
if( _xp_kill != 0 ) {
make_user_happy( iAttacker, 1, _xp_kill, 0, 0, 1, 1 );
ColorChat( iAttacker, "!4%s!1 You have been received!3 %i xp!1 for killing the enemy.", Tag, _xp_kill );
}
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
return PLUGIN_CONTINUE;
}
public ClShowXp( id ) {
if( is_user_connected( id ) ) {
if( g_UserLevel[ id ] == MAX_LEVEL)
ColorChat( id, "!4***!1 Level:!3 %d!4 ***!1 XP:!3 %d", MAX_LEVEL, g_UserXP[ id ] );
else
ColorChat( id, "!4***!1 Level:!3 %d!1/!3%d!4 ***!1 XP:!3 %d!1/!3%d", g_UserLevel[ id ], MAX_LEVEL, g_UserXP[ id ], get_xp_on_level( id ) );
}
return PLUGIN_HANDLED;
}
public CmdManagePlayers( id ) {
if( !( get_user_flags( id ) & ADMIN_ACCESS ) ) {
ColorChat( id, "!4%s!1 Doar!3 ADMINII!1 au acces!", Tag );
return PLUGIN_HANDLED;
}
new menu = menu_create( "Alege un jucator:", "MenuHandler" );
new iPlayers[ 32 ], iNum, i, player;
new szUserID[ 32 ], szName[ 64 ];
get_players( iPlayers, iNum );
for( i = 0; i < iNum; i++ ) {
player = iPlayers[ i ];
formatex( szName, charsmax( szName ), "%s:\y Level:\r %d", get_name( player ), g_UserLevel[ player ] );
formatex( szUserID, charsmax( szUserID ), "%d", get_user_userid( player ) );
menu_additem( menu, szName, szUserID );
}
menu_display( id, menu );
return PLUGIN_HANDLED;
}
public MenuHandler( id, menu, item ) {
if( item == MENU_EXIT ) {
menu_destroy( menu );
return PLUGIN_HANDLED;
}
new item_access, callback, info[ 64 ], name[ 32 ];
menu_item_getinfo( menu, item, item_access, info, charsmax( info ), name, charsmax( name ), callback );
new userid = str_to_num( info );
new player = find_player( "k", userid );
ChoosePlayer( id, player );
return PLUGIN_HANDLED;
}
public ChoosePlayer( id, Choosen ) {
new szTitle[ 101 ], mm[ 200 ], szChoosen[ 200 ];
formatex( szTitle, charsmax( szTitle ), "Schimba-i lui \r%s\y level-ul in:", get_name( Choosen ) );
new menu = menu_create( szTitle, "SetLevelHandler" );
num_to_str( Choosen, szChoosen, charsmax( szChoosen ) );
for( new i = 1; i < sizeof( g_PlayerData ); i++ ) {
formatex( mm, charsmax( mm ), "%d", g_PlayerData[ i ][ Xp ] );
menu_additem( menu, mm, szChoosen );
}
menu_display( id, menu );
return PLUGIN_HANDLED;
}
public SetLevelHandler( id, menu, item ) {
if( item == MENU_EXIT ) {
menu_destroy( menu );
return PLUGIN_HANDLED;
}
new item_access, callback, info[ 64 ], name[ 32 ];
menu_item_getinfo( menu, item, item_access, info, charsmax( info ), name, charsmax( name ), callback );
new player = str_to_num( info );
g_UserXP[ player ] = g_PlayerData[ item ][ Xp ];
g_UserLevel[ player ] = item;
CheckUserLevel( player );
//make_user_happy( player, 1, g_PlayerData[ item ][ Xp ], 1, item, 1, 1 );
ColorChat( player, "!4%s!1 Adminul!3 %s!1 ti-a schimbat level-ul in!4 %d!1.", Tag, get_name( id ), g_UserLevel[ player ] );
menu_destroy( menu );
return PLUGIN_HANDLED;
}
public CheckUserLevel( id ) {
if( g_UserLevel[ id ] <= MAX_LEVEL ) {
if( g_UserXP[ id ] >= get_xp_on_level( id ) ) {
make_user_happy( id, 0, 0, 1, 1, 0, 1 );
emit_sound( id, CHAN_AUTO, SoundLevelUp, 1.0, ATTN_NORM, 0, PITCH_NORM );
// Un mic efect? Nu strica...
if( c_levelup_effects ) {
// Luam culorile setate pentru fiecare level in parte
new g_Color[ 3 ];
g_Color[ 0 ] = get_color_level( id, 0 ); // r
g_Color[ 1 ] = get_color_level( id, 1 ); // g
g_Color[ 2 ] = get_color_level( id, 2 ); // b
// Producem efectul jucatorului
MakeFadeScreen( id, 1.5, g_Color[ 2 ], g_Color[ 1 ], g_Color[ 0 ], random_num( 100, 200 ) );
}
if( c_levelup_protect ) {
fm_set_user_godmode( id, 1 );
set_task( 1.0, "task_RemoveProtect", id );
}
ColorChat( id, "!3%s!1 Congratulations, you've !4leveled up!1. Current level:!3 %d!1 !", Tag, g_UserLevel[ id ] );
if( g_UserLevel[ id ] <= MAX_LEVEL -1 )
ColorChat( id, "!3%s!1 Next XP:!4 %d!1 !", Tag, get_xp_on_level( id ) );
}
}
return PLUGIN_HANDLED;
}
stock MakeFadeScreen( id, const Float:Seconds, const Red, const Green, const Blue, const Alpha ) {
static g_MsgScreenFade = 0;
if( !g_MsgScreenFade )
g_MsgScreenFade = get_user_msgid( "ScreenFade" );
message_begin( MSG_ONE, g_MsgScreenFade, _, id );
write_short( floatround( 4096.0 * Seconds, floatround_round ) );
write_short( floatround( 4096.0 * Seconds, floatround_round ) );
write_short( 0x0000 );
write_byte( Red );
write_byte( Green );
write_byte( Blue );
write_byte( Alpha );
message_end( );
}
public get_color_level( id, number ) {
new g_Color[ 3 ];
switch( g_UserLevel[ id ] ) {
case 1: g_Color = { 248, 172, 58 };
case 2: g_Color = { 0, 255, 128 };
case 3: g_Color = { 170, 255, 127 };
case 4: g_Color = { 155, 240, 70 };
case 5: g_Color = { 255, 255, 0 };
case 6: g_Color = { 255, 127, 85 };
case 7: g_Color = { 0, 212, 255 };
case 8: g_Color = { 70, 70, 240 };
case 9: g_Color = { 170, 0, 255 };
case 10: g_Color = { 255, 255, 0 };
default: g_Color = { 0, 255, 0 };
}
return g_Color[ number ];
}
public task_RemoveProtect( id )
fm_set_user_godmode( id, 0 );
public task_ShowHUD( taskid ) {
new ID_SHOWHUD = taskid - 1221;
new player = ID_SHOWHUD;
if( !is_user_alive( player ) ) {
player = pev( player, pev_iuser2 );
if( !is_user_alive( player ) )
return;
}
if( player == ID_SHOWHUD ) {
new g_Color[ 3 ];
g_Color[ 0 ] = get_color_level( player, 0 );
g_Color[ 1 ] = get_color_level( player, 1 );
g_Color[ 2 ] = get_color_level( player, 2 );
if( g_UserLevel[ player ] == MAX_LEVEL) {
set_hudmessage( g_Color[ 0 ], g_Color[ 1 ], g_Color[ 2 ], 0.02, 0.92, 0, 6.0, 1.1, 0.0, 0.0, -1 );
ShowSyncHudMsg( player, SyncHudMessage, "LEVEL: Max Level - XP: %d", g_UserXP[ player ] );
} else {
set_hudmessage( g_Color[ 0 ], g_Color[ 1 ], g_Color[ 2 ], 0.02, 0.92, 0, 6.0, 1.1, 0.0, 0.0, -1 );
ShowSyncHudMsg( player, SyncHudMessage, "LEVEL: %d/%d - XP: %d/%d - SPEED: %1.f", g_UserLevel[ player ], MAX_LEVEL, g_UserXP[ player ], get_xp_on_level( player ), get_user_maxspeed( player ) );
}
}
}
public SaveUserExperience( id ) {
new szVaultKey[ 64 ], szVaultData[ 256 ];
format( szVaultKey, charsmax( szVaultKey ), "%s", get_name( id ) );
format( szVaultData, charsmax( szVaultData ), "%d %d", g_UserXP[ id ], g_UserLevel[ id ] );
fvault_set_data( g_Vault, szVaultKey, szVaultData );
}
public LoadUserExperience( id ) {
new szVaultKey[ 64 ], szVaultData[ 256 ], xp[ 33 ], levels[ 33 ];
format( szVaultKey, charsmax( szVaultKey ), "%s", get_name( id ) );
format( szVaultData, charsmax( szVaultData ), "%d %d", g_UserXP[ id ], g_UserLevel[ id ] );
if( fvault_get_data( g_Vault, szVaultKey, szVaultData, charsmax( szVaultData ) ) ) {
parse( szVaultData, xp, charsmax( xp ), levels, charsmax( levels ) );
g_UserXP[ id ] = str_to_num( xp );
g_UserLevel[ id ] = str_to_num( levels );
}
}
// STOCK'S
public set_user_items( id ) {
if( !is_user_alive( id ) )
return;
set_user_health( id, g_PlayerData[ g_UserLevel[ id ] ][ Health ] );
set_user_armor( id, g_PlayerData[ g_UserLevel[ id ] ][ Armor ] );
set_user_gravity( id, g_PlayerData[ g_UserLevel[ id ] ][ Gravity ] * 0.00125 );
if( g_PlayerData[ g_UserLevel[ id ] ][ Flash ] != 0 ) {
give_item( id, "weapon_flashbang" );
cs_set_user_bpammo( id, CSW_FLASHBANG, cs_get_user_bpammo( id, CSW_FLASHBANG ) + g_PlayerData[ g_UserLevel[ id ] ][ Flash ] );
}
if( g_PlayerData[ g_UserLevel[ id ] ][ He ] != 0 ) {
give_item( id, "weapon_hegrenade" );
cs_set_user_bpammo( id, CSW_HEGRENADE, cs_get_user_bpammo( id, CSW_HEGRENADE ) + g_PlayerData[ g_UserLevel[ id ] ][ He ] );
}
if( g_PlayerData[ g_UserLevel[ id ] ][ Smoke ] != 0 ) {
give_item( id, "weapon_smokegrenade" );
cs_set_user_bpammo( id, CSW_SMOKEGRENADE, cs_get_user_bpammo( id, CSW_SMOKEGRENADE ) + g_PlayerData[ g_UserLevel[ id ] ][ Smoke ] );
}
ColorChat( id, "!3%s!1 Items: [!4%i He Grenades!1] [!4%i FlashBangs!1] [!4%i Smoke!1] [!4%i Health!1] [!4%i Armor!1]", Tag,
g_PlayerData[ g_UserLevel[ id ] ][ He ],
g_PlayerData[ g_UserLevel[ id ] ][ Flash ],
g_PlayerData[ g_UserLevel[ id ] ][ Smoke ],
g_PlayerData[ g_UserLevel[ id ] ][ Health ],
g_PlayerData[ g_UserLevel[ id ] ][ Armor ] );
}
// Stock by YONTU, pentru a preveni toate bugurile si pentru a optimiza codul doar printr-o linie, cand e vorba de setat si sters level.
// Stock-ul accepta valori pozitive si negative si eventuale activari si dezactivari
stock make_user_happy(id, set_xp, xp, set_level, level, update, save)
{
if(!is_user_connected(id))
return PLUGIN_HANDLED;
if(set_xp)
{
g_UserXP[id] += xp;
if(g_UserXP[id] <= 0) g_UserXP[id] = 0;
}
if(set_level)
{
if(level == 0) g_UserLevel[id] = 0;
else if(level > MAX_LEVEL) g_UserLevel[id] = MAX_LEVEL;
else
{
g_UserLevel[id] += level;
if(g_UserLevel[id] <= 0) g_UserLevel[id] = 0;
}
}
if(update) CheckUserLevel(id);
if(save) SaveUserExperience(id);
return PLUGIN_CONTINUE;
}
// 'Luam' xp-ul pentru fiecare level
stock get_xp_on_level( id ) {
// 'Luam' xp-ul pentru fiecare level
return g_PlayerData[ g_UserLevel[ id ] ][ Xp ];
}
stock ColorChat( id, String[ ], any:... ) {
static szMesage[ 192 ];
vformat( szMesage, charsmax( szMesage ), String, 3 );
replace_all( szMesage, charsmax( szMesage ), "!1", "^1" );
replace_all( szMesage, charsmax( szMesage ), "!3", "^3" );
replace_all( szMesage, charsmax( szMesage ), "!4", "^4" );
static g_msg_SayText = 0;
if( !g_msg_SayText )
g_msg_SayText = get_user_msgid( "SayText" );
new Players[ 32 ], iNum = 1, i;
if( id ) Players[ 0 ] = id;
else get_players( Players, iNum, "ch" );
for( --iNum; iNum >= 0; iNum-- ) {
i = Players[ iNum ];
message_begin( MSG_ONE_UNRELIABLE, g_msg_SayText, _, i );
write_byte( i );
write_string( szMesage );
message_end( );
}
}
stock get_name( id ) {
new szName[ 32 ];
get_user_name( id, szName, charsmax( szName ) );
return szName;
}
stock fm_set_user_godmode( id, godmode = 0 ) {
set_pev( id, pev_takedamage, godmode == 1 ? DAMAGE_NO : DAMAGE_AIM );
return PLUGIN_HANDLED;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/