#include <amxmodx>
#include <fun>
#include <fakemeta>
#include <amxmisc>
#include <cstrike>
#include <xs>
#include <nvault>
#include <hamsandwich>
#define PLUGIN "HnSNivelMod"
#define VERSION "1.0"
#define AUTHOR "D3luxe"
#define DNS_LICENTIAT "freakz"
#define MAX_LEVEL 40
#define OWNER_FLAGS read_flags("abcdefghijklmnopqrstu")
new const Tag[] = "[Freakz]"
new const XP_NECESAR[MAX_LEVEL+1] =
{
1,
100,
135,
170,
300,
600,
700,
900,
1200,
1500,
1750,
2010,
2500,
3200,
3800,
4100,
4500,
4800,
5500,
6100,
6400,
6600,
6800,
7300,
7500,
7700,
7900,
8300,
8400,
9400,
10400,
10800,
11200,
12700,
13700,
14700,
15700,
16700,
17700,
19000,
20000
};
new user[33];
new g_xp[33],g_lvl[33];
new xp_kill,xp_kill_hs,g_msgsync;
new TeleportSprite2,g_spriteShockwave;
new Teleport_Cooldown[33];
new const SOUND_BLINK[] = "weapons/flashbang-1.wav" ;
const UNIT_SEC = 0x1000;
const FFADE = 0x0000;
new CvarTeleportCooldown, CvarTeleportRange;
new g_vault;
public plugin_init()
{
new szHostName[ 64 ];
get_cvar_string( "hostname", szHostName, sizeof( szHostName ) -1 );
if( contain( szHostName, DNS_LICENTIAT ) == -1 )
set_fail_state( "Plugin Nelicentiat.");
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("+ultimate","start_teleport");
register_clcmd("-ultimate","start_teleport");
register_clcmd("say /lvl ", "show_lvlmenu" );
register_clcmd("Nivelul_Dorit?","cmd_lvl");
RegisterHam(Ham_Spawn,"player","item_spawn",1);
RegisterHam(Ham_Killed,"player","give_xp");
xp_kill = register_cvar("hns_xp_kill","15");
xp_kill_hs = register_cvar("hns_xp_kill_hs","25");
CvarTeleportCooldown = register_cvar("teleport_cooldown", "30");
CvarTeleportRange = register_cvar("teleport_range", "12345");
g_msgsync = CreateHudSyncObj();
g_vault = nvault_open("LevelModbyD3luxe");
if(g_vault == INVALID_HANDLE)
set_fail_state("Eroare la deschiderea bazei de date nvault.");
set_task(1.0,"show_hud",_,_,_,"b");
}
public plugin_precache()
{
TeleportSprite2 = precache_model( "sprites/blueflare2.spr");
g_spriteShockwave = precache_model( "sprites/shockwave.spr" );
precache_sound("hnsm_lvlup.wav");
}
public client_putinserver(id)
{
Teleport_Cooldown[id] = 0;
remove_task(id);
if(!is_user_bot(id))
LoadData(id);
}
public show_hud()
{
new Players[32],num,id;
get_players(Players,num,"c");
for(new i = 0; i < num; i++)
{
id = Players[i];
if(is_user_bot(id) || !is_user_connected(id)) continue;
if(g_lvl[id] == 40)
{
set_hudmessage(0,252,30,-1.0,0.16,0,6.0,1.2)
ShowSyncHudMsg(id,g_msgsync,"~~|Lvl:%d/40|~~",g_lvl[id]);
}else{
set_hudmessage(0,252,30,-1.0,0.16,0,6.0,1.2)
ShowSyncHudMsg(id,g_msgsync,"XP:%d/%d | Lvl:%d/40",g_xp[id],XP_NECESAR[g_lvl[id]],g_lvl[id]);
}
}
}
public show_lvlmenu(id)
{
static szText[ 555 char ],szNumber[10];
new Player[32],num,ids;
get_players(Player,num,"c");
new menu = menu_create("Playeri ONLINE :", "clasament_handler" );
for(new i = 0; i < num; i++)
{
ids = Player[i];
if(!is_user_connected(ids)) continue;
new name[33];
get_user_name(ids,name,charsmax(name));
num_to_str(ids, szNumber, charsmax( szNumber ));
formatex(szText, charsmax( szText ),"\yNume: \w%s\r|\yXP: \w%d \r|\yNivel: \w%d\r|",name,g_xp[ids],g_lvl[ids]);
menu_additem(menu,szText,szNumber, 0);
}
menu_setprop( menu, MPROP_EXITNAME, "Exit")
menu_display( id, menu, 0);
}
public clasament_handler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
static data[6], name[64], acs, cllbck;
menu_item_getinfo(menu, item, acs, data, 5, name, 63, cllbck);
if(!(get_user_flags(id) & OWNER_FLAGS))
{
ChatColor(id,"!g%s !yDoar ownerul poate da !teamlvl",Tag);
show_lvlmenu(id);
return PLUGIN_HANDLED;
}
new PlayerD = str_to_num(data);
if(!PlayerD)
{
ChatColor(id,"!g%s !yAcel player nu exista.",Tag);
show_lvlmenu(id);
return PLUGIN_HANDLED;
}
user[id] = PlayerD;
client_cmd(id,"messagemode Nivelul_Dorit?")
menu_destroy(menu);
return PLUGIN_HANDLED;
}
public cmd_lvl( id )
{
static szArg[ 15 ];
read_argv( 1, szArg, sizeof ( szArg ) -1 );
new number = str_to_num(szArg);
if(number < 1 )
{
ChatColor(id,"!g%s !yNivelul nu poate fii mai mic decat !team1.", Tag)
return PLUGIN_HANDLED;
}else if(number > 40 ){
ChatColor(id,"!g%s !yNivelul nu poate fii mai mare decat !team40.", Tag)
return PLUGIN_HANDLED;
}else if(!characters(szArg, strlen(szArg))){
ChatColor(id,"!g%s !yTrebuie sa introduci un !teamnumar.", Tag)
return PLUGIN_HANDLED;
}
new name[33];
get_user_name(user[id],name,charsmax(name));
g_lvl[user[id]] = number;
emit_sound(user[id],CHAN_AUTO,"hnsm_lvlup.wav",VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
give_special_item(user[id]);
ChatColor(id,"!g%s !yI-ai dat !teamlevel %d !ylui %s!g.",Tag,number,name);
return PLUGIN_HANDLED;
}
public give_xp(victim,attacker,shouldgib)
{
if(g_lvl[attacker] < 40)
{
if(get_pdata_int(victim, 75) == HIT_HEAD)
g_xp[attacker] += get_pcvar_num(xp_kill_hs);
else
g_xp[attacker] += get_pcvar_num(xp_kill);
while(g_xp[attacker] >= XP_NECESAR[g_lvl[attacker]] && g_lvl[attacker] < 40)
{
emit_sound(attacker,CHAN_AUTO,"hnsm_lvlup.wav",VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
give_special_item(attacker);
g_lvl[attacker]++;
}
}
SaveData(attacker);
return HAM_IGNORED;
}
public give_special_item(id)
{
if(is_user_alive(id) && g_lvl[id] > 0 && g_lvl[id] <= MAX_LEVEL && !is_user_bot(id))
{
Teleport_Cooldown[id] = 0;
remove_task(id);
strip_user_weapons(id);
give_item(id,"weapon_knife");
switch(g_lvl[id])
{
case 1 : give_item(id,"weapon_smokegrenade");
case 2 : give_item(id,"weapon_hegrenade");
case 3 :
{
give_item(id,"weapon_hegrenade");
cs_set_user_bpammo(id,CSW_HEGRENADE,2);
}
case 4 :
{
give_item(id,"weapon_smokegrenade");
give_item(id,"weapon_hegrenade");
cs_set_user_bpammo(id,CSW_SMOKEGRENADE,2);
cs_set_user_bpammo(id,CSW_HEGRENADE,2);
}
case 5..7 : {
set_user_health(id,100 + g_lvl[id]);
give_item(id,"weapon_smokegrenade");
give_item(id,"weapon_hegrenade");
cs_set_user_bpammo(id,CSW_SMOKEGRENADE,2);
cs_set_user_bpammo(id,CSW_HEGRENADE,2);
}
case 8..24 :{
set_user_health(id,100 + g_lvl[id]);
give_item(id,"weapon_smokegrenade");
give_item(id,"weapon_hegrenade");
cs_set_user_bpammo(id,CSW_SMOKEGRENADE,2);
cs_set_user_bpammo(id,CSW_HEGRENADE,2);
new dgl = give_item(id,"weapon_deagle");
if(dgl){
cs_set_weapon_ammo(dgl,1);
cs_set_user_bpammo(id,CSW_DEAGLE,0);
}
}
case 25 : {
set_user_health(id,100 + g_lvl[id]);
give_item(id,"weapon_smokegrenade");
give_item(id,"weapon_hegrenade");
cs_set_user_bpammo(id,CSW_SMOKEGRENADE,2);
cs_set_user_bpammo(id,CSW_HEGRENADE,2);
new dgl = give_item(id,"weapon_deagle");
if(dgl){
cs_set_weapon_ammo(dgl,2);
cs_set_user_bpammo(id,CSW_DEAGLE,0);
}
}
case 30..39 :
{
set_user_health(id,100 + g_lvl[id]+5);
give_item(id,"weapon_smokegrenade");
give_item(id,"weapon_hegrenade");
cs_set_user_bpammo(id,CSW_SMOKEGRENADE,2);
cs_set_user_bpammo(id,CSW_HEGRENADE,2);
TeleportShowHUD(id);
new dgl = give_item(id,"weapon_deagle");
if(dgl){
cs_set_weapon_ammo(dgl,2);
cs_set_user_bpammo(id,CSW_DEAGLE,0);
}
}
case 40 : {
set_user_health(id,150);
give_item(id,"weapon_smokegrenade");
give_item(id,"weapon_hegrenade");
give_item(id,"weapon_flashbang");
cs_set_user_bpammo(id,CSW_SMOKEGRENADE,5);
cs_set_user_bpammo(id,CSW_FLASHBANG,5);
cs_set_user_bpammo(id,CSW_HEGRENADE,5);
TeleportShowHUD(id);
new dgl = give_item(id,"weapon_deagle");
if(dgl){
cs_set_weapon_ammo(dgl,3);
cs_set_user_bpammo(id,CSW_DEAGLE,0);
}
}
}
}
}
public item_spawn(id)
{
set_task(12.5,"give_special_item",id);
}
//teleport
public start_teleport(id)
{
if(!is_user_alive(id)) return PLUGIN_HANDLED;
if(!Teleport_Cooldown[id] && g_lvl[id] > 30)
{
if (teleport(id))
{
emit_sound(id, CHAN_STATIC, SOUND_BLINK, 1.0, ATTN_NORM, 0, PITCH_NORM);
remove_task(id);
Teleport_Cooldown[id] = get_pcvar_num(CvarTeleportCooldown);
set_task(1.0, "TeleportShowHUD", id, _, _, "b");
return PLUGIN_HANDLED;
}else{
Teleport_Cooldown[id] = 0;
set_hudmessage(0, 100, 200,-1.0, -1.0, 0, 1.0, 1.1, 0.0, 0.0, -11);
show_hudmessage(id, "Pozitia de teleportare este invalida.");
return PLUGIN_HANDLED;
}
}
return PLUGIN_HANDLED;
}
public TeleportShowHUD(id) {
if (!is_user_alive(id)) {
remove_task(id);
Teleport_Cooldown[id] = 0;
return PLUGIN_HANDLED;
}
set_hudmessage(0, 100, 200, 0.05, 0.60, 0, 1.0, 1.1, 0.0, 0.0, -11);
if(is_user_alive(id) && Teleport_Cooldown[id] == 1) {
Teleport_Cooldown[id] --;
show_hudmessage(id, "Puterea iti va reveni in: %d secunda",Teleport_Cooldown[id]);
}
if(is_user_alive(id) && Teleport_Cooldown[id] > 1) {
Teleport_Cooldown[id] --;
show_hudmessage(id, "Puterea iti va reveni in: %d secunde",Teleport_Cooldown[id]);
}
if(Teleport_Cooldown[id] <= 0) {
show_hudmessage(id, "Iti poti folosi din nou puterea.");
remove_task(id);
Teleport_Cooldown[id] = 0;
}
return PLUGIN_HANDLED;
}
bool:teleport(id) {
new Float:vOrigin[3], Float:vNewOrigin[3],
Float:vNormal[3], Float:vTraceDirection[3],
Float:vTraceEnd[3];
pev(id, pev_origin, vOrigin);
velocity_by_aim(id, get_pcvar_num(CvarTeleportRange), vTraceDirection);
xs_vec_add(vTraceDirection, vOrigin, vTraceEnd);
engfunc(EngFunc_TraceLine, vOrigin, vTraceEnd, DONT_IGNORE_MONSTERS, id, 0);
new Float:flFraction;
get_tr2(0, TR_flFraction, flFraction);
if (flFraction < 1.0) {
get_tr2(0, TR_vecEndPos, vTraceEnd);
get_tr2(0, TR_vecPlaneNormal, vNormal);
}
xs_vec_mul_scalar(vNormal, 40.0, vNormal); // do not decrease the 40.0
xs_vec_add(vTraceEnd, vNormal, vNewOrigin);
if (is_player_stuck(id, vNewOrigin))
return false;
emit_sound(id, CHAN_STATIC, SOUND_BLINK, 1.0, ATTN_NORM, 0, PITCH_NORM);
tele_effect(vOrigin);
engfunc(EngFunc_SetOrigin, id, vNewOrigin);
tele_effect2(vNewOrigin);
return true;
}
stock is_player_stuck(id, Float:originF[3]) {
engfunc(EngFunc_TraceHull, originF, originF, 0, (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN, id, 0);
if (get_tr2(0, TR_StartSolid) || get_tr2(0, TR_AllSolid) || !get_tr2(0, TR_InOpen))
return true;
return false;
}
stock tele_effect(const Float:torigin[3]) {
new origin[3];
origin[0] = floatround(torigin[0]);
origin[1] = floatround(torigin[1]);
origin[2] = floatround(torigin[2]);
message_begin(MSG_PAS, SVC_TEMPENTITY, origin);
write_byte(TE_BEAMCYLINDER);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2]+10);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2]+60);
write_short(g_spriteShockwave);
write_byte(0);
write_byte(0);
write_byte(3);
write_byte(60);
write_byte(0);
write_byte(255);
write_byte(255);
write_byte(255);
write_byte(255);
write_byte(0);
message_end();
}
stock tele_effect2(const Float:torigin[3]) {
new origin[3];
origin[0] = floatround(torigin[0]);
origin[1] = floatround(torigin[1]);
origin[2] = floatround(torigin[2]);
message_begin(MSG_PAS, SVC_TEMPENTITY, origin);
write_byte(TE_BEAMCYLINDER);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2]+10);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2]+60);
write_short(g_spriteShockwave);
write_byte(0);
write_byte(0);
write_byte(3);
write_byte(60);
write_byte(0);
write_byte(255);
write_byte(255);
write_byte(255);
write_byte(255);
write_byte(0);
message_end();
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_SPRITETRAIL);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2]+40);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2]);
write_short(TeleportSprite2);
write_byte(30);
write_byte(10);
write_byte(1);
write_byte(50);
write_byte(10);
message_end();
}
public client_disconnect(id)
{
Teleport_Cooldown[id] = 0;
remove_task(id);
if(!is_user_bot(id))
SaveData(id);
}
public SaveData(id)
{
new vaultkey[64],vaultdata[256],name[32]
get_user_name(id,name,charsmax(name))
formatex(vaultkey,63,"%s-Del",name)
formatex(vaultdata,63,"%i#%i#",g_xp[id],g_lvl[id])
nvault_set(g_vault,vaultkey,vaultdata)
}
public LoadData(id) {
new vaultkey[64],vaultdata[256],name[32];
get_user_name(id,name,charsmax(name))
formatex(vaultkey,63,"%s-Del",name)
formatex(vaultdata,255,"%i#%i#",g_xp[id],g_lvl[id])
nvault_get(g_vault,vaultkey,vaultdata,255)
replace_all(vaultdata, 255, "#", " ")
new XP[32],LEVEL[32]
parse(vaultdata,XP,31,LEVEL,31)
g_xp[id] = str_to_num(XP)
g_lvl[id] = str_to_num(LEVEL)
}
public plugin_end() nvault_close(g_vault);
bool:characters(const symbol[], len) {
new const valid_chars[][] = {
"0" ,"1" ,"2" ,"3" ,"4" ,"5" ,"6" ,"7" ,"8" ,"9"
}
static i, a, valids;
valids = 0
for(i = 0; i < len; i++) {
for(a = 0; a < sizeof(valid_chars); a++) {
if(symbol[i] == valid_chars[a][0]) {
valids++
break
}
}
}
if(valids != len)
return false
return true
}
stock ChatColor(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4")
replace_all(msg, 190, "!y", "^1")
replace_all(msg, 190, "!team", "^3")
if (id) players[0] = id; else get_players(players, count, "ch")
{
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}
}