AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Function that cause lag (https://forums.alliedmods.net/showthread.php?t=240490)

egbertjan 05-16-2014 16:07

Function that cause lag
 
Hello again!

I'm working on a plugin and I got lag issues and I'm wondering what could cause it! Upon roundstart I got issues (spikes) and when shooting / spraying it's also a bit lagging.

What are functions to check out what could cause the lag / what should I be aware off?

Thanks in advance!

Code:

#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#include <cstrike>
#include <hamsandwich>
#include <fun>
#include <sqlx>



#define MAX 32                        //Max number of valid player entities
#define CS_PLAYER_HEIGHT 72.0
#define GLOBAL_COOLDOWN 0.5
#define TASK_HUD 120
#define task_revive 4985 
#define MAX_PLAYERS 32
#define BASE_SPEED        245.0
#define GLUTON 95841
#define x 0
#define y 1
#define z 2
#define TASK_CHARGE 100
#define TASK_FLASH_LIGHT 81184
#define pev_zorigin        pev_fuser4
#define seconds(%1) ((1<<12) * (%1))
#define MAX_FLASH 15

stock get_loguser_index() {
    new loguser[80], name[32]
    read_logargv(0, loguser, 79)
    parse_loguser(loguser, name, 31)
    return get_user_index(name)
}

stock const maxClip[31] = { -1, 13, -1, 10,  1,  7,  1,  30, 30,  1,  30,  20,  25, 30, 35, 25,  12,  20, 10,  30, 100,  8, 30,  30, 20,  2,  7, 30, 30, -1,  50 };
stock const maxAmmo[31] = { -1, 52, -1, 90, -1, 32, -1, 100, 90, -1, 120, 100, 100, 90, 90, 90, 100, 100, 30, 120, 200, 32, 90, 120, 60, -1, 35, 90, 90, -1, 100 };

new g_szPrefix[ ] = "DiabloMod"
new Basepath[128]       
new gmsgSayText
new gmsgDeathMsg
new gmsgStatusText
new g_msg_screenfade

new flashlight[33]
new flashbattery[33]
new flashlight_r
new flashlight_g
new flashlight_b
new Float:agi=BASE_SPEED

new DemageTake[33]

new planter
new defuser
new map_end = 0
new gmsgBartimer
new gmsgScoreInfo
new gmsgHealth
new bool:freeze_ended
new sprite_blood_drop = 0
new sprite_blood_spray = 0
new sprite_white = 0
new sprite_line = 0
new player_xp[33] = 0                //Holds players experience
new player_lvl[33] = 1                        //Holds players level
new player_point[33] = 0                //Holds players level points
new player_intelligence[33]
new player_strength[33]
new player_agility[33]
new player_power[33]
new player_vampyric[33]
new Float:player_damreduction[33]
new player_dextery[33]
new player_class[33]               
new Float:player_huddelay[33]

new player_b_gravity[33] = 1        //Gravity bonus : 1 = best

new player_sorc_heal[33] = 0

new player_ultra_armor[33]
new player_ultra_armor_left[33]
new bool:new_class[33]
new bool:paladin_bullet[33]
new bool:HunterUlt_active[33]
new bool:NinjaUlt_active[33]
new NecroRevive[33]
new bool:BarbUlt[33]
new bool:BarbUlt_used[33]
new jumpnum[33] = 0
new bool:dojump[33] = false

new bool:autobuyxp[33]

new KNIFE_VIEW[]        = "models/v_knife.mdl"
new KNIFE_PLAYER[]        = "models/p_knife.mdl"
new Ninja_katana[]        ="models/diablomod/dbo/ninja_katana.mdl"
new Deagle_view[]        ="models/diablomod/dbo/v_paladin_deagle.mdl"
new Deagle_player[]        ="models/diablomod/dbo/p_paladin_deagle.mdl"
new C4_VIEW[]                = "models/v_c4.mdl"
new C4_PLAYER[]        = "models/p_c4.mdl"
new HE_VIEW[] = "models/v_hegrenade.mdl"
new HE_PLAYER[] = "models/p_hegrenade.mdl"
new FL_VIEW[] = "models/v_flashbang.mdl"
new FL_PLAYER[] = "models/p_flashbang.mdl"
new SE_VIEW[] = "models/v_smokegrenade.mdl"
new SE_PLAYER[] = "models/p_smokegrenade.mdl"
new cbow_VIEW[]  = "models/diablomod/dbo/v_hunter.mdl"
new cvow_PLAYER[]= "models/diablomod/dbo/p_hunter.mdl"
new cbow_bolt[]  = "models/diablomod/Crossbow_bolt.mdl"
new Barb_Rage[]        = "dbmod/Barbarian_Rage.wav"

enum { NONE = 0, Mag, Paladin, Assassin, Necromancer, Barbarian, Ninja, Hunter, Bot }
new Race[][18] = { "None","Sorcerer","Paladin","Assassin","Necromancer","Barbarian", "Ninja", "Hunter", "Bot Class" }
new race_heal[9] = { 100,80,50,100,70,50,170,120, 150 }

new LevelXP[152] = { 0,50,125,225,350,500,675,875,1100,1350,1625,1925,2250,2600,2975,3375,3800,4250,4725,5225,5750,6300,6875,7475,8100,8750, //26
9450,10200,11000,11850,12750,13700,14700,15750,16850,18000,19200,20450,21750,23100,24500,25950,27450,29000,30600,32250,33950,35700,37500,39350,41250,43200, //51
45200,47300,49500,51800,54200,56700,59300,62000,62800,65700,68700,71800,75000,78300,81700,85200,88800,92400,96100,99900,103800,107800,111900,116100,120400, //76
125000,130000,135000,140000,145000,150000,156000,162000,168000,174000,180000,187000,194000,201000,208000,216000,224000,232000,240000,250000,260000,270000,280000,290000,300000,310000, //101
330000,350000,370000,390000,410000,430000,450000,470000,490000,510000,530000,550000,570000,590000,610000,630000,650000,670000,690000,710000,730000,750000,770000,790000,810000,830000, //126
850000,900000,950000,1000000,1050000,1100000,1150000,1200000,1250000,1300000,1350000,1400000,1450000,1500000,1550000,1600000,1650000,1700000,1750000,1800000,1850000,1900000,99909999/*151*/}


#define TARACE_TASK 91203
#define NADE_VELOCITY        EV_INT_iuser1
#define NADE_ACTIVE        EV_INT_iuser2       
#define NADE_TEAM        EV_INT_iuser3       
#define NADE_PAUSE        EV_INT_iuser4


new LeaderCT = -1
new LeaderT = -1
new GodLeft[33]

new AssassinUlt[33]
new HunterUlt[33]
new NecroUlt[33]
new NinjaUlt[33]
new loaded_xp[33]
new sqlstart = 30
new asked_sql[33]
new asked_klass[33]
new olny_one_time=0
new player_class_lvl[33][8]
new player_class_lvl_save[33]
new player_xp_old[33]
new database_user_created[33]
new srv_avg[8] = {1,1,1,1,1,1,1,1}


new last_update_xp[33]
new Float:last_update_perc[33]


new max_knife[33]
new player_knife[33]
new Float:tossdelay[33]
new Float:bowdelay[33]
new bow[33]
new button[33]
new trace_bool[33]
new cvar_throw_vel = 90 // def: 90
new cvar_activate_dis = 175 // def 190
new cvar_nade_vel = 280 //def 280

new g_TrapMode[33]
new g_GrenadeTrap[33] = {0, ... }
new Float:g_PreThinkDelay[33]
new casting[33]
new Float:cast_end[33]
new Float:HunterUlt_end[33]
new on_knife[33]
new golden_bulet[33]
new ultra_armor[33]
new after_bullet[33]
new invisible_cast[33]
new player_dmg[33]
new Handle:g_SqlTuple
new g_sqlTable[64] = "dbmod_tables"
new g_boolsqlOK=0

public plugin_init() {

        register_cvar("diablo_sql_host","127.0.0.1",FCVAR_PROTECTED)
        register_cvar("diablo_sql_user","root",FCVAR_PROTECTED)
        register_cvar("diablo_sql_pass","pi3141592654",FCVAR_PROTECTED)
        register_cvar("diablo_sql_database","dbmod",FCVAR_PROTECTED)
        register_cvar("diablo_sql_table","dbmod_tablet",FCVAR_PROTECTED)
        register_cvar("diablo_sql_save","2",FCVAR_PROTECTED)
        register_cvar("diablo_classes", "abcdefgh")
        register_cvar("diablo_avg", "1")       
        register_cvar("diablomod_version","6.0",FCVAR_SERVER)
        register_cvar("flashlight_custom","1");
        register_cvar("flashlight_drain","1.0");
        register_cvar("flashlight_charge","0.5");
        register_cvar("flashlight_radius","8");
        register_cvar("flashlight_decay","90");               
        register_cvar("diablo_dmg_exp","20",0)
        register_cvar("diablo_xpbonus","5",0) //bomb planted / bomb defused
        register_cvar("diablo_xpbonus2","20",0) //planted / defused
        register_cvar("diablo_knife","20")
        register_cvar("diablo_knife_speed","1000")
        register_cvar("diablo_arrow","80.0") //dmg
        register_cvar("diablo_arrow_multi","4.0")
        register_cvar("diablo_arrow_speed","1500")
        register_cvar("diablo_klass_delay","0.5")       
        register_cvar("diablo_dir", "addons/amxmodx/diablo/")
        register_cvar("diablo_show_health","1")       
       
        g_msg_screenfade= get_user_msgid("ScreenFade")
        register_forward(FM_Touch,                "fwd_touch")
        register_plugin("DiabloMod","6.0","Dbo version")

        register_event("Flashlight","event_flashlight","b");
        register_event("CurWeapon","CurWeapon","be")
        register_event("ResetHUD", "ResetHUD", "abe")
        register_event("DeathMsg","DeathMsg","ade")
        register_event("Damage", "Damage", "b", "2!0")
        register_event("SendAudio","freeze_over","b","2=%!MRAD_GO","2=%!MRAD_MOVEOUT","2=%!MRAD_LETSGO","2=%!MRAD_LOCKNLOAD")
        register_event("SendAudio","freeze_begin","a","2=%!MRAD_terwin","2=%!MRAD_ctwin","2=%!MRAD_rounddraw")
        register_event( "SendAudio", "eT_win" , "a", "2&%!MRAD_terwin" )
        register_event( "SendAudio", "eCT_win", "a", "2&%!MRAD_ctwin" )
        register_event("SendAudio", "award_defuse", "a", "2&%!MRAD_BOMBDEF")         
        register_event("BarTime", "bomb_defusing", "be", "1=10", "1=5")
        register_event("StatusIcon", "got_bomb", "be", "1=1", "1=2", "2=c4")
        register_event("TextMsg", "award_hostageALL", "a", "2&#All_Hostages_R" )
        register_event("TextMsg","host_killed","b","2&#Killed_Hostage")
        register_event("TextMsg", "freeze_begin", "a", "2=#Game_will_restart_in")
        register_event("SendAudio","freeze_over1","b","2=%!MRAD_GO","2=%!MRAD_MOVEOUT","2=%!MRAD_LETSGO","2=%!MRAD_LOCKNLOAD")
        register_event("Health", "Health", "be", "1!255")
       
        RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
        RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_deagle", "Paladin_deagle", 1 )
       
        register_clcmd( "ultimate", "cmd_Ultimate")
        register_clcmd("say","on_Chat");
        register_clcmd("say_team","on_Chat");
       
        register_logevent("award_plant", 3, "2=Planted_The_Bomb");       
        register_logevent("award_rescuehostage", 3, "1=triggered", "2=Rescued_A_Hostage");
        register_logevent("RoundStart", 2, "0=World triggered", "1=Round_Start")
       
        register_concmd("db_givexp", "CmdGiveXp", ADMIN_KICK, "<name/userid/steamid> <Amount>")
       
        gmsgSayText = get_user_msgid("SayText")
        gmsgDeathMsg = get_user_msgid("DeathMsg")
        gmsgStatusText = get_user_msgid("StatusText")
        gmsgBartimer = get_user_msgid("BarTime")
        gmsgScoreInfo = get_user_msgid("ScoreInfo")
        set_msg_block ( gmsgDeathMsg, BLOCK_SET )
        gmsgHealth = get_user_msgid("Health")
       
        set_task(2.0, "UpdateHUD",0,"",0,"b")
        register_think("PowerUp","Think_PowerUp")
        register_think("Effect_Healing_Totem","Effect_Healing_Totem_Think")
        register_think("grenade", "think_Grenade")
        register_think("think_bot", "think_Bot")       
       
        register_forward(FM_WriteString, "FW_WriteString")
        register_forward(FM_AddToFullPack, "client_AddToFullPack")
        register_forward(FM_TraceLine,"fw_traceline")
               
        get_cvar_string("diablo_dir",Basepath,127)
       
        register_touch("throwing_knife", "player", "touchKnife")
        register_touch("throwing_knife", "worldspawn",                "touchWorld")
        register_touch("throwing_knife", "func_wall",                "touchWorld")
        register_touch("throwing_knife", "func_door",                "touchWorld")
        register_touch("throwing_knife", "func_door_rotating",        "touchWorld")
        register_touch("throwing_knife", "func_wall_toggle",        "touchWorld")
        register_touch("throwing_knife", "dbmod_shild",                "touchWorld")
        register_touch("throwing_knife", "func_breakable",        "touchbreakable")
        register_touch("func_breakable", "throwing_knife",        "touchbreakable")
        register_touch("xbow_arrow", "player",                        "toucharrow")
        register_touch("xbow_arrow", "worldspawn",                "touchWorld2")
        register_touch("xbow_arrow", "func_wall",                "touchWorld2")
        register_touch("xbow_arrow", "func_door",                "touchWorld2")
        register_touch("xbow_arrow", "func_door_rotating",        "touchWorld2")
        register_touch("xbow_arrow", "func_wall_toggle",        "touchWorld2")
        register_touch("xbow_arrow", "dbmod_shild",                "touchWorld2")
        register_touch("xbow_arrow", "func_breakable",                "touchbreakable")
        register_touch("func_breakable", "xbow_arrow",                "touchbreakable")

        _create_ThinkBot()
       
        return PLUGIN_CONTINUE 
}



public on_Chat(id) {
       
        new szSaid[32]
        read_args(szSaid, 31)

        if (equali(szSaid,"^"/class^"") || equali(szSaid,"^"/changerace^"") || equali(szSaid,"^"/changeclass^"") ) {
                changerace(id)
        }
       
        if (equali(szSaid,"^"/speed^"")) {
                speed(id)
        }
        if (equali(szSaid,"^"/players^"")) {
                cmd_who(id)
        }
        if (equali(szSaid,"^"/reset^"") || equali(szSaid,"^"/resetskills^"")) {
                reset_skill(id)
        }
        if (equali(szSaid,"^"/showskills^"") || equali(szSaid,"^"/skills^"")) {
                skills(id)
        }       
        if (equali(szSaid,"^"/help^"")  || equali(szSaid,"^"/helpme^"") || equali(szSaid,"^"/commands^"") ) {
                Commands_menu(id)
        }       
       
        if (equali(szSaid,"^"/savexp^"")  || equali(szSaid,"^"savexp^"")) {
                savexpcom(id)
        }
        if (equali(szSaid,"^"/buyxp^"")  || equali(szSaid,"^"buyxp^"")) {
                BuyXP(id)
        }
        if (equali(szSaid,"^"/classinfo^"")  || equali(szSaid,"^"classinfo^"")) {
                Classinfo_menu(id)
        }
        if (equali(szSaid,"^"/autobuyxp^"")  || equali(szSaid,"^"autobuyxp^"")) {
                Autobuyxp(id)
        }                       
        if (equali(szSaid,"^"/classattribs^"")  || equali(szSaid,"^"classattribs^"") || equali(szSaid,"^"/classattributes^"") || equali(szSaid,"^"classattribs^"")) {
                ClassAttribs(id)
        }       
                       
}

public sql_start() {
        if(sqlstart<0) return
        if(g_boolsqlOK) return
       
        new host[128]
        new user[64]
        new pass[64]
        new database[64]
       
        get_cvar_string("diablo_sql_database",database,63)
        get_cvar_string("diablo_sql_host",host,127)
        get_cvar_string("diablo_sql_user",user,63)
        get_cvar_string("diablo_sql_pass",pass,63)
       
        g_SqlTuple = SQL_MakeDbTuple(host,user,pass,database)
               
        get_cvar_string("diablo_sql_table",g_sqlTable,63)
       
        new q_command[512]
        format(q_command,511,"CREATE TABLE IF NOT EXISTS `%s` ( `nick` VARCHAR( 64 ),`ip` VARCHAR( 64 ),`sid` VARCHAR( 64 ), `klasa` integer( 2 ) , `lvl` integer( 3 ) DEFAULT 1, `exp` integer( 9 ) DEFAULT 0,  `str` integer( 3 ) DEFAULT 0, `int` integer( 3 ) DEFAULT 0, `dex` integer( 3 ) DEFAULT 0, `agi` integer( 3 ) DEFAULT 0,  `pow` integer( 3 ) DEFAULT 0,  `vamp` integer( 3 ) DEFAULT 0 ) ",g_sqlTable)
       
        SQL_ThreadQuery(g_SqlTuple,"TableHandle",q_command)
}

public TableHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
        g_boolsqlOK=1
        if(Errcode) {
                g_boolsqlOK=0
                log_to_file("addons/amxmodx/logs/diablo.log","Error on Table query: %s",Error)
        }
        if(FailState == TQUERY_CONNECT_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
                g_boolsqlOK=0
                return PLUGIN_CONTINUE
        }
        else if(FailState == TQUERY_QUERY_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","Table Query failed.")
                g_boolsqlOK=0
                return PLUGIN_CONTINUE
        }
               
        LoadAVG()
        return PLUGIN_CONTINUE
}

public create_klass(id) {
        if(g_boolsqlOK) {       
                if(!is_user_bot(id) && database_user_created[id]==0) {
                        new name[64]
                        new ip[64]
                        new sid[64]
                       
                        get_user_name(id,name,63)
                        replace_all ( name, 63, "'", "Q" )
                        replace_all ( name, 63, "`", "Q" )
                       
                        get_user_ip ( id, ip, 63, 1 )
                        get_user_authid(id, sid ,63)
                       
                        log_to_file("addons/amxmodx/logs/test_log.log","*** %s %s *** Create Class ***",name,sid)
                       
                        for(new i=1;i<8;i++) {
                                new q_command[512]
                                format(q_command,511,"INSERT INTO `%s` (`nick`,`ip`,`sid`,`klasa`,`lvl`,`exp`) VALUES ('%s','%s','%s',%i,%i,%i ) ",g_sqlTable,name,ip,sid,i,srv_avg[i],LevelXP[srv_avg[i]-1])
                                SQL_ThreadQuery(g_SqlTuple,"create_klass_Handle",q_command)
                        }
                        database_user_created[id]=1
                }
        }
        else sql_start()
}

public create_klass_Handle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
        if(Errcode) {
                log_to_file("addons/amxmodx/logs/diablo.log","Error on create klass query: %s",Error)
        }
        if(FailState == TQUERY_CONNECT_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
                return PLUGIN_CONTINUE
        }
        else if(FailState == TQUERY_QUERY_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","create klass Query failed.")
                return PLUGIN_CONTINUE
        }
         
        return PLUGIN_CONTINUE
}

public load_xp(id) {
        if(g_boolsqlOK) {
                if(!is_user_bot(id)) {
                        new name[64]
                        new data[1]
                        data[0]=id
                       
                        if(get_cvar_num("diablo_sql_save")==2) {
                                get_user_authid(id, name ,63)
                                new q_command[512]
                                format(q_command,511,"SELECT `klasa` FROM `%s` WHERE `sid`='%s' ",g_sqlTable,name)
                                SQL_ThreadQuery(g_SqlTuple,"SelectHandle",q_command,data,1)
                        }
                        loaded_xp[id]=1
                }
        }
        else sql_start()
}

public SelectHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
        if(Errcode)        {
                log_to_file("addons/amxmodx/logs/diablo.log","Error on load_xp query: %s",Error)
        }
        if(FailState == TQUERY_CONNECT_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
                return PLUGIN_CONTINUE
        }
        else if(FailState == TQUERY_QUERY_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","load_xp Query failed.")
                return PLUGIN_CONTINUE
        }
       
        if(SQL_MoreResults(Query)) return PLUGIN_CONTINUE
        else create_klass(Data[0])               
 
        return PLUGIN_CONTINUE
}

public Health(id) {
        if(get_cvar_num("diablo_show_health")==1) {
                new health = read_data(1)
                if(health>255) {
                        message_begin( MSG_ONE, gmsgHealth, {0,0,0}, id )
                        write_byte( 255 )
                        message_end()
                }
        }
}

public speed(id) {
        new Float:spd = get_user_maxspeed(id)
        ColorChat(id, "Max Speed: %f", spd)
       
        new Float:vect[3]
        entity_get_vector(id,EV_VEC_velocity,vect)
        new Float: sped= floatsqroot(vect[0]*vect[0]+vect[1]*vect[1]+vect[2]*vect[2])
       
        ColorChat(id, "Current Speed: %f", sped)
}

public plugin_precache() {

        precache_model("addons/amxmodx/diablo/totem_heal.mdl")
        precache_model(KNIFE_VIEW)   
        precache_model(KNIFE_PLAYER)
        precache_model(Deagle_view)
        precache_model(Ninja_katana)       
        precache_model(Deagle_player)
        precache_model(C4_VIEW)   
        precache_model(C4_PLAYER)
        precache_model(HE_VIEW)   
        precache_model(HE_PLAYER)
        precache_model(FL_VIEW)   
        precache_model(FL_PLAYER)
        precache_model(SE_VIEW)   
        precache_model(SE_PLAYER)       
        precache_sound("weapons/xbow_hit2.wav")
        precache_sound("weapons/xbow_fire1.wav")
        sprite_blood_drop = precache_model("sprites/blood.spr")
        sprite_blood_spray = precache_model("sprites/bloodspray.spr")
        sprite_line = precache_model("sprites/dot.spr")
        sprite_white = precache_model("sprites/white.spr")
        precache_sound(Barb_Rage)
        precache_sound("weapons/knife_hitwall1.wav")
        precache_sound("weapons/knife_hit4.wav")
        precache_sound("weapons/knife_deploy1.wav")
        precache_model("models/diablomod/w_throwingknife.mdl")
        precache_model(cbow_VIEW)
        precache_model(cvow_PLAYER)
        precache_model(cbow_bolt)
}

public savexpcom(id) {
        if(!is_user_bot(id)) {
                if(player_class[id]!=0 && player_class_lvl[id][player_class[id]]==player_lvl[id] ) {
                        SaveXP(id)
                }
        }
}

public SaveXP(id) {
        if(g_boolsqlOK) {
                if(!is_user_bot(id) && player_xp[id]!=player_xp_old[id]) {
                        new name[64]
                        new ip[64]
                        new sid[64]
                       
                        get_user_name(id,name,63)
                        replace_all ( name, 63, "'", "Q" )
                        replace_all ( name, 63, "`", "Q" )
                       
                        get_user_ip(id, ip ,63,1)
                        get_user_authid(id, sid ,63)
                       
                        if(get_cvar_num("diablo_sql_save")==2) {
                                new q_command[512]
                                format(q_command,511,"UPDATE `%s` SET `nick`='%s',`ip`='%s',`lvl`='%i',`exp`='%i',`str`='%i',`int`='%i',`dex`='%i',`agi`='%i',`pow`='%i',`vamp`='%i' WHERE `sid`='%s' AND `klasa`='%i' ",g_sqlTable,name,ip,player_lvl[id],player_xp[id],player_strength[id],player_intelligence[id],player_dextery[id],player_agility[id],player_power[id],player_vampyric[id],sid,player_class[id])
                                SQL_ThreadQuery(g_SqlTuple,"Save_xp_handle",q_command)
                        }
                        player_xp_old[id]=player_xp[id]
                               
                }
        }
        else sql_start()
       
        return PLUGIN_HANDLED
}

public Save_xp_handle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
        if(Errcode) {
                log_to_file("addons/amxmodx/logs/diablo.log","Error on Save_xp query: %s",Error)
        }
        if(FailState == TQUERY_CONNECT_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
                return PLUGIN_CONTINUE
        }
        else if(FailState == TQUERY_QUERY_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","Save_xp Query failed.")
                return PLUGIN_CONTINUE
        }
       
        return PLUGIN_CONTINUE
}

public LoadXP(id, klasa){       
        if(is_user_bot(id) || asked_sql[id]==1) return PLUGIN_HANDLED
       
        if(player_class[id]==0)load_xp(id)
       
        if(g_boolsqlOK ) {
                new name[64]
                new data[2]
                data[0]=id
                data[1]=klasa
               
                if(get_cvar_num("diablo_sql_save")==2) {
                        get_user_authid(id, name ,63)
                        new q_command[512]
                        format(q_command,511,"SELECT * FROM `%s` WHERE `sid`='%s' AND `klasa`='%i'", g_sqlTable, name, player_class[id]) 
                       
                        SQL_ThreadQuery(g_SqlTuple,"Load_xp_handle",q_command,data,2)
                        asked_sql[id]=1
                }
        }
        else sql_start()
        return PLUGIN_HANDLED
}

public Load_xp_handle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
        new id = Data[0]
        asked_sql[id]=0
       
        if(Errcode) {
                log_to_file("addons/amxmodx/logs/diablo.log","Error on Load_xp query: %s",Error)
        }
        if(FailState == TQUERY_CONNECT_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
                return PLUGIN_CONTINUE
        }
        else if(FailState == TQUERY_QUERY_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","Load_xp Query failed.")
                return PLUGIN_CONTINUE
        }
         
        if(SQL_MoreResults(Query)) {
               
                player_class[id] = Data[1]
                player_lvl[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"lvl"))       
                player_xp[id] =        SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"exp"))       
                player_xp_old[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"exp"))
               
                player_intelligence[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"int"))
                player_strength[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"str"))
                player_agility[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"agi"))
                player_dextery[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"dex"))
                player_power[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"pow"))
                player_vampyric[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"vamp"))
               
               
                player_point[id]=(player_lvl[id]-1)*2-player_intelligence[id]-player_strength[id]-player_dextery[id]-player_agility[id]        -player_power[id]-player_vampyric[id]
                if(player_point[id]<0) player_point[id]=0
                player_damreduction[id] = (47.3057*(1.0-floatpower( 2.7182, -0.06798*float(player_agility[id])))/100)               
        }
        return PLUGIN_CONTINUE
}

public LoadAVG() {
        if(g_boolsqlOK) {
                new data[2]
                data[0]= get_cvar_num("diablo_avg")
               
                if(data[0]) {
                        for(new i=1;i<8;i++) {
                                new q_command[512]
                                data[1]=i
                                format(q_command,511,"SELECT `klasa`,AVG(`lvl`) AS `AVG` FROM `%s` WHERE `lvl` > '%d' GROUP BY `klasa`", g_sqlTable, data[0]-1)
                                SQL_ThreadQuery(g_SqlTuple,"Load_AVG_handle",q_command,data,2)
                        }
                }
        }
        else sql_start()
        return PLUGIN_HANDLED
}

public Load_AVG_handle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
        if(Errcode)        {
                log_to_file("addons/amxmodx/logs/diablo.log","Error on Load_AVG query: %s",Error)
        }
        if(FailState == TQUERY_CONNECT_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
                return PLUGIN_CONTINUE
        }
        else if(FailState == TQUERY_QUERY_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","Load_AVG Query failed.")
                return PLUGIN_CONTINUE
        }
       
        while(SQL_MoreResults(Query)) {
                new i = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "klasa"))
                srv_avg[i] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "AVG"))
                SQL_NextRow(Query)
        }
        if(olny_one_time==0) {
                olny_one_time=1
                look_for_none()
        }
        return PLUGIN_CONTINUE
}

public look_for_none() {
        for(new i=1;i<33;i++) {
                if(is_user_alive(i)) {
                        if(player_class[i]==0) {
                                select_class_query(i)
                        }
                }
        }
}

public reset_skill(id) {
        ColorChat(id, "Reseting Skills...");
        player_point[id] = player_lvl[id]*2-2
        player_intelligence[id] = 0
        player_strength[id] = 0
        player_agility[id] = 0
        player_dextery[id] = 0
        player_power[id] = 0
        player_vampyric[id] = 0
        skilltree(id)
        set_speedchange(id)
        player_damreduction[id] = (47.3057*(1.0-floatpower( 2.7182, -0.06798*float(player_agility[id])))/100)
}


public freeze_over() {
        set_task(get_cvar_float("diablo_klass_delay"), "freezeover", 3659, "", 0, "")
}

public freezeover() {
        freeze_ended = true
}

public freeze_begin() {
        freeze_ended = false
        for (new i=1; i <= get_maxplayers(); i++){
                if (new_class[i] == true) {
                changerace(i)
               
                }
        }
}

public RoundStart() {
        for (new i=1; i <= get_maxplayers(); i++){
        if(!is_user_bot(i) && is_user_alive(i)) {
                Check_Ults(i)
                invisible_cast[i]=0
                set_renderchange(i)
                RoundExperience(i)
                if (autobuyxp[i] == true) peformautobuy(i)
        }
       
        kill_all_entity("throwing_knife")
       
        }
}

public RoundExperience(id) {
        if (player_lvl[id] < 51) {
                Give_Xp(id,20) 
                client_print(id, print_chat, "You have been given 20 experience points!")
        }       
}

public Check_Ults(id) {

        if (player_class[id] == Mag) {
                player_sorc_heal[id] = 1 + (player_intelligence[id]/25)
        }       
       
        if( player_class[id]== Paladin ) {
                if (player_intelligence[id] == 50) {
                        golden_bulet[id]=2 + (player_intelligence[id]/10)
                } else {
                        golden_bulet[id]=1 + (player_intelligence[id]/10)
                }       
                GodLeft[id]=1 + (player_intelligence[id]/25)
        }
       
        if (player_class[id] == Assassin) {
                AssassinUlt[id] = 1 + (player_intelligence[id]/10)
        }
       
        if (player_class[id] == Necromancer) {
                NecroRevive[id] = 1 + (player_intelligence[id] / 25)
                NecroUlt[id] = 0
        }
       
        if (player_class[id] == Barbarian) {
                if (player_intelligence[id] > 24 && player_intelligence[id] < 50) {
                        ultra_armor[id]=2 + (player_intelligence[id]/10)
                } else if (player_intelligence[id] == 50) {
                        ultra_armor[id]=3 + (player_intelligence[id]/10)
                } else {
                        ultra_armor[id]=1 + (player_intelligence[id]/10)
                }
                BarbUlt_used[id] = false
        }
       
        if (player_class[id] == Ninja) {
                jumpnum[id] = 30
                give_knife(id)
                set_user_armor(id,100)
                set_gravitychange(id)
                NinjaUlt[id] = 1 + (player_intelligence[id]/16)
        }
       
        if (player_class[id] == Hunter) {
                        HunterUlt[id] = 1 + (player_intelligence[id] / 25)
        }       
}

public csw_c44(id) {
        client_cmd(id,"weapon_knife")
        engclient_cmd(id,"weapon_knife")
        on_knife[id]=1
}

public CurWeapon(id) {       

        after_bullet[id]=1
       
        new clip,ammo
        new weapon=get_user_weapon(id,clip,ammo)
        invisible_cast[id]=0
       
        if(weapon == CSW_KNIFE) on_knife[id]=1
        else on_knife[id]=0
       
        if ((weapon != CSW_C4 ) && !on_knife[id] && (player_class[id] == Ninja)) {
                client_cmd(id,"weapon_knife")
                engclient_cmd(id,"weapon_knife")
                on_knife[id]=1
        }

        if (is_user_connected(id)) {

               
                if(on_knife[id]) {
                        entity_set_string(id, EV_SZ_viewmodel, KNIFE_VIEW) 
                        entity_set_string(id, EV_SZ_weaponmodel, KNIFE_PLAYER) 
                }
                if(weapon == CSW_C4){
                        entity_set_string(id, EV_SZ_viewmodel, C4_VIEW) 
                        entity_set_string(id, EV_SZ_weaponmodel, C4_PLAYER) 
                }
                if(weapon == CSW_HEGRENADE){
                        entity_set_string(id, EV_SZ_viewmodel, HE_VIEW) 
                        entity_set_string(id, EV_SZ_weaponmodel, HE_PLAYER) 
                }
                if(weapon == CSW_FLASHBANG){
                        entity_set_string(id, EV_SZ_viewmodel, FL_VIEW) 
                        entity_set_string(id, EV_SZ_weaponmodel, FL_PLAYER) 
                }
                if(weapon == CSW_SMOKEGRENADE){
                        entity_set_string(id, EV_SZ_viewmodel, SE_VIEW) 
                        entity_set_string(id, EV_SZ_weaponmodel, SE_PLAYER) 
                }                       
               
                if(bow[id]==1) {
                        bow[id]=0
                        if(on_knife[id]) {
                                entity_set_string(id, EV_SZ_viewmodel, KNIFE_VIEW) 
                                entity_set_string(id, EV_SZ_weaponmodel, KNIFE_PLAYER) 
                        }
                }
               
                if (player_class[id] == Ninja) {
                        entity_set_string(id, EV_SZ_viewmodel, Ninja_katana) 
                }
               
                if (player_class[id] == Paladin && weapon == CSW_DEAGLE) {
               
                        paladin_bullet[id] = true
                        entity_set_string(id, EV_SZ_viewmodel, Deagle_view) 
                        entity_set_string(id, EV_SZ_weaponmodel, Deagle_player) 
                } else {
                        paladin_bullet[id] = false
                }

                set_gravitychange(id)
                set_speedchange(id)
                set_renderchange(id)
                write_hud(id)
        }       
       
}

public ResetHUD(id) {
        if (!is_user_bot(id)) {
                if (is_user_connected(id)) {       
                        remove_task(id+GLUTON)
                        change_health(id,999,0,"")
               
                        if ((player_intelligence[id]+player_strength[id]+player_agility[id]+player_dextery[id]+player_power[id]+player_vampyric[id])>(player_lvl[id]*2)) reset_skill(id)
       
                        player_ultra_armor_left[id]=player_ultra_armor[id]
                        if (player_point[id] > 0 ) skilltree(id)
                        if (player_class[id] == 0) select_class_query(id)
                        client_cmd(id,"hud_centerid 0") 
                        set_gravitychange(id)
                        set_renderchange(id)
                }
        } else {
                if (player_class[id] == 0)        player_class[id] = Bot
        }
}

public DeathMsg(id) {
        new weaponname[20]
        new kid = read_data(1)
        new vid = read_data(2)
        new headshot = read_data(3)
        read_data(4,weaponname,19)
        new players[32], num

        static Float:minsize[3]
        pev(vid, pev_mins, minsize)
       
        flashbattery[vid] = MAX_FLASH;
        flashlight[vid] = 0;
       
        if(cs_get_user_team(vid) == CS_TEAM_CT) get_players(players, num, "ae", "CT")
        if(cs_get_user_team(vid) == CS_TEAM_T) get_players(players, num, "ae", "TERRORIST")
       
        if(num > 0) {
                new id
                for(new i = 0; i < num; i++) {
                        id = players[i]
                        if(player_class[id] == Necromancer && NecroRevive[id] > 0) {
                                new param[1] 
                                param[0] = id // save the necromancer 
                                NecroRevive[id] --
                                set_task(1.0, "necro_spawn", vid+task_revive, param, 1) // little delay to respawn 
                                break // already found a necromancer, so let's break loop 
                        }   
                }
        }
        if (headshot && is_user_connected(kid) && is_user_connected(vid) && get_user_team(kid) != get_user_team(vid)) Give_Xp(kid, 5)
               
        if(!is_user_bot(id)) {
        if (is_user_connected(kid) && is_user_connected(vid) && get_user_team(kid) != get_user_team(vid)) {
                show_deadmessage(kid,vid,headshot,weaponname)
                award_kill(kid,vid)
                if (player_class[kid] == Barbarian) change_health(kid,20,0,"")
                change_health(kid,player_vampyric[kid],0,"")
                if (player_class[kid] == Barbarian) refill_ammo(kid)
                set_renderchange(kid)
                savexpcom(vid)
                }
        }
}
public necro_spawn(params[], id) { 
        id -= task_revive 
        new necro = params[0] 
   
        if(is_user_alive(id))    //already revived ? 
                return PLUGIN_HANDLED

        ExecuteHamB(Ham_CS_RoundRespawn, id)
        new name[32]
        get_user_name(necro, name, 31)
        change_health(id,player_intelligence[necro],0,"")
        Give_Xp(necro, 10)
        client_print(id, print_chat, "You're alive now, thanks to %s", name)
     
        return PLUGIN_HANDLED 


public Damage(id) {
        if(!is_user_bot(id)) {
        if (is_user_connected(id)) {
                new weapon
                new bodypart
                new attacker_id = get_user_attacker(id,weapon,bodypart)
                if(attacker_id!=0 && attacker_id != id) {
                        new damage = read_data(2)
                        if (is_user_connected(attacker_id)) {       
                                if(get_user_team(id) != get_user_team(attacker_id)) {                             
                                        if(damage>175) player_dmg[attacker_id]+=damage/2
                                        else {
                                                player_dmg[attacker_id]+=damage
                                                dmg_exp(attacker_id)
                                        }
                           

                               
                                        if (damage > 0 && player_agility[id] > 0) {     
                                                new heal = floatround(player_damreduction[id]*damage)
                                                if (is_user_alive(id)) change_health(id,heal,0,"")
                                        }     
               
                                        if(weapon == CSW_GLOCK18 || weapon == CSW_USP || weapon == CSW_P228 || weapon == CSW_DEAGLE || weapon == CSW_ELITE || weapon == CSW_FIVESEVEN) {
                                                switch(player_class[attacker_id]) {
                                                        case Hunter:
                                                        {
                                                                new ori[3]
                                                                trace_bool[attacker_id]=id
                                                                get_user_origin(id,ori)       
                                                               
                                                                new parms[5];
                                                               
                                                                for(new i=0;i<3;i++) {
                                                                        parms[i] = ori[i]
                                                                }
                                                                parms[3]=attacker_id
                                                                parms[4]=id
                                                                set_task(0.5,"charge_hunter",attacker_id,parms,5)
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
        }
}

public un_rander(task_id) {
        new id = task_id - TASK_FLASH_LIGHT
        if(is_user_connected(id)) set_renderchange(id)
}
public client_PreThink ( id ) {       
        new button2 = get_user_button(id);
       
        if(flashlight[id] && flashbattery[id] && (get_cvar_num("flashlight_custom")) && (player_class[id] == Mag)) {
                new num1, num2, num3
                num1=random_num(0,2)
                num2=random_num(-1,1)
                num3=random_num(-1,1)
                flashlight_r+=1+num1
                if (flashlight_r>250) flashlight_r-=245
                flashlight_g+=1+num2
                if (flashlight_g>250) flashlight_g-=245
                flashlight_b+=-1+num3
                if (flashlight_b<5) flashlight_b+=240               
                new origin[3];
                get_user_origin(id,origin,3);
                message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
                write_byte(27); // TE_DLIGHT
                write_coord(origin[0]); // X
                write_coord(origin[1]); // Y
                write_coord(origin[2]); // Z
                write_byte(get_cvar_num("flashlight_radius")); // radius
                write_byte(flashlight_r); // R
                write_byte(flashlight_g); // G
                write_byte(flashlight_b); // B
                write_byte(1); // life
                write_byte(get_cvar_num("flashlight_decay")); // decay rate
                message_end();
               
                new index1, bodypart1
                get_user_aiming(id,index1,bodypart1)
                if ((get_user_team(id)!=get_user_team(index1)) && (index1!=0)) {
                        if ((index1!=54) && (is_user_connected(index1))) set_user_rendering(index1,kRenderFxGlowShell,flashlight_r,flashlight_g,flashlight_b,kRenderNormal,4)       
                        remove_task(TASK_FLASH_LIGHT+index1);
                        set_task(7.5, "un_rander",TASK_FLASH_LIGHT+index1)
                }
        }
       
        if (((player_class[id] == Assassin)) && is_user_alive(id))
                entity_set_int(id, EV_INT_flTimeStepSound, 300)
               
        new Float:vect[3]
        entity_get_vector(id,EV_VEC_velocity,vect)
       
        if (button2 & IN_RELOAD && on_knife[id] && button[id]==0 && player_class[id]==Hunter){
                bow[id]++
                button[id] = 1;
                command_bow(id)
        }
       
        if ((!(button2 & IN_RELOAD)) && on_knife[id] && button[id]==1) button[id]=0
       
        if (!freeze_ended)
                return PLUGIN_CONTINUE

        if (player_class[id] == Barbarian && BarbUlt[id] == true) {
                set_pev(id,pev_punchangle,{ 0.0,0.0,0.0 });
        }       
       
        if (player_class[id] == Ninja && NinjaUlt_active[id] == true) {
        new nbut = get_user_button(id)
       
        if((nbut & IN_JUMP) && !(get_entity_flags(id) & FL_ONGROUND) && !(get_user_oldbutton(id) & IN_JUMP)) {
                if(jumpnum[id] < 30) {
                        dojump[id] = true
                        jumpnum[id]++
                        return PLUGIN_CONTINUE
                }
        }
        if((nbut & IN_JUMP) && (get_entity_flags(id) & FL_ONGROUND)) {
                jumpnum[id] = 0
                return PLUGIN_CONTINUE
                }
        }

        if (get_entity_flags(id) & FL_ONGROUND && (!(button2 & (IN_FORWARD+IN_BACK+IN_MOVELEFT+IN_MOVERIGHT))) && is_user_alive(id) && on_knife[id] && player_class[id]==Assassin  && invisible_cast[id]==0 || player_class[id] == Hunter && is_user_alive(id) && !bow[id] && on_knife[id] && cs_get_user_bpammo(id, CSW_FLASHBANG) != 2) {
                if(casting[id]==1 && halflife_time()>cast_end[id]) {
                        message_begin( MSG_ONE, gmsgBartimer, {0,0,0}, id )
                        write_byte( 0 )
                        write_byte( 0 )
                        message_end()
                        casting[id]=0
                       
                       
                        if (player_class[id] == Assassin) {
                                invisible_cast[id]=1
                                set_renderchange(id)
                        }
                        if (player_class[id] == Hunter) give_item(id, "weapon_flashbang")
                               
               
                       
                } else if(casting[id]==0) {
                        new Float: time_delay = 5.0-(player_intelligence[id]/25.0)

                        if(player_class[id] == Assassin) time_delay*=2.0

                        cast_end[id]=halflife_time()+time_delay
                        new bar_delay = floatround(time_delay,floatround_ceil)
                        casting[id]=1
                        message_begin( MSG_ONE, gmsgBartimer, {0,0,0}, id )
                        write_byte( bar_delay )
                        write_byte( 0 )
                        message_end()
                }
        } else {       
                if(casting[id]==1) {
                        message_begin( MSG_ONE, gmsgBartimer, {0,0,0}, id )
                        write_byte( 0 )
                        write_byte( 0 )
                        message_end()       
                }
                casting[id]=0                       
        }
               
        if(player_class[id]==Ninja && (pev(id,pev_button) & IN_RELOAD)) command_knife(id)
        else if (pev(id,pev_button) & IN_RELOAD && on_knife[id] && max_knife[id]>0) command_knife(id)

        if(player_class[id]==Hunter) {
                new clip,ammo
                new weapon = get_user_weapon(id,clip,ammo)       
               
                if(bow[id] == 1) {
                        if((bowdelay[id] + 4.25 - float(player_intelligence[id]/19))< get_gametime() && button2 & IN_ATTACK) {
                                bowdelay[id] = get_gametime()
                                command_arrow(id)
                        }
                        entity_set_int(id, EV_INT_button, (button2 & ~IN_ATTACK) & ~IN_ATTACK2)
                }
               
                if(g_GrenadeTrap[id] && button2 & IN_ATTACK2) {
                        switch(weapon) {
                                case CSW_HEGRENADE, CSW_FLASHBANG, CSW_SMOKEGRENADE:
                                {
                                        if((g_PreThinkDelay[id] + 0.28) < get_gametime()) {
                                                switch(g_TrapMode[id]) {
                                                        case 0: g_TrapMode[id] = 1
                                                        case 1: g_TrapMode[id] = 0
                                                }
                                                client_print(id, print_center, "Grenade Trap %s", g_TrapMode[id] ? "[ON]" : "[OFF]")
                                                g_PreThinkDelay[id] = get_gametime()
                                        }
                                }
                                default: g_TrapMode[id] = 0
                        }
                }
        }
       
        return PLUGIN_CONTINUE               
}

public client_PostThink(id) {
        if(!is_user_alive(id)) return PLUGIN_CONTINUE
       
        if(dojump[id] == true) {
                new Float:velocity[3]       
                entity_get_vector(id,EV_VEC_velocity,velocity)
                velocity[2] = random_float(265.0,285.0)
                entity_set_vector(id,EV_VEC_velocity,velocity)
                dojump[id] = false
                return PLUGIN_CONTINUE
        }
        return PLUGIN_CONTINUE
}       

public client_AddToFullPack(ent_state,e,edict_t_ent,edict_t_host,hostflags,player,pSet) {
       
        if (!pev_valid(e)|| !pev_valid(edict_t_ent) || !pev_valid(edict_t_host))
                return FMRES_HANDLED
                       
        new classname[32]
        pev(e,pev_classname,classname,31)
       
        new hostclassname[32]
        pev(edict_t_host,pev_classname,hostclassname,31)
               
        if (is_user_alive(e) && is_user_alive(edict_t_host) && e != edict_t_host) {
               
        }               
        return FMRES_HANDLED
}

public skilltree(id) {
        new szText[ 555 char ];
       
        formatex( szText, charsmax( szText ), "Select Stats - \rPoints: %i", player_point[ id ] );
        new skillzMenu = menu_create( szText , "skill_menu" );
       
        formatex( szText, charsmax( szText ), "Intelligence [%i] [Improve your class's unique ability]", player_intelligence[id] );
        menu_additem( skillzMenu, szText, "1", 0 );
       
        formatex( szText, charsmax( szText ), "Strength [%i] [Increase your maximum health]", player_strength[id] );
        menu_additem( skillzMenu, szText, "2", 0 );
       
        formatex( szText, charsmax( szText ), "Agility [%i]  [Take less physical damage]", player_agility[id] );
        menu_additem( skillzMenu, szText, "3", 0 );
       
        formatex( szText, charsmax( szText ), "Dexterity [%i]  [Increased movement speed and magical damage reduction]", player_dextery[id] );
        menu_additem( skillzMenu, szText, "4", 0 );

        formatex( szText, charsmax( szText ), "Power [%i]  [Deal additional physical damage]", player_power[id] );
        menu_additem( skillzMenu, szText, "5", 0 );

        formatex( szText, charsmax( szText ), "Vampyrism [%i]  [Restore health upon kill]", player_vampyric[id] );
        menu_additem( skillzMenu, szText, "6", 0 );

       
        menu_setprop( skillzMenu, MPROP_NUMBER_COLOR, "\w" );
        menu_setprop( skillzMenu , MPROP_EXIT , MEXIT_NEVER );
        menu_display( id , skillzMenu , 0 );
        return PLUGIN_HANDLED;
}
       
public skill_menu(id , skillzMenu , iItem) {
        if( iItem == MENU_EXIT ) {
        menu_destroy( skillzMenu );
        return PLUGIN_HANDLED;
    }

        new data[ 6 ] , szName[ 64 ];
        new access, callback;
        menu_item_getinfo( skillzMenu, iItem, access, data, charsmax( data ), szName, charsmax( szName ), callback );
       
        new key = str_to_num( data );
        switch( key ) {
                case 1:
                {
                        if (player_intelligence[id]<50){
                                player_point[id]-=1
                                player_intelligence[id]+=1
                        }
                        else client_print(id,print_center,"You have reached the Maximum level of Intelligence!")
                }
               
                case 2:
                {
                        if (player_strength[id]<50){
                                player_point[id]-=1       
                                player_strength[id]+=1
                        }
                        else client_print(id,print_center,"You have reached the Maximum level of Strength!")
                }
               
                case 3:
                {
                        if (player_agility[id]<50){
                                player_point[id]-=1
                                player_agility[id]+=1
                                player_damreduction[id] = (47.3057*(1.0-floatpower( 2.7182, -0.06798*float(player_agility[id])))/100)
                        }
                        else client_print(id,print_center,"You have reached the Maximum level of Agility!")
                }
               
                case 4:
                {       
                        if (player_dextery[id]<50){
                                player_point[id]-=1
                                player_dextery[id]+=1
                                set_speedchange(id)
                        }
                        else client_print(id,print_center,"You have reached the Maximum level of Dexterity!")
                }
               
                case 5:
                {       
                        if (player_power[id]<50){
                                player_point[id]-=1
                                player_power[id]+=1
                        }
                        else client_print(id,print_center,"You have reached the Maximum level of Power!")
                }
               
                case 6:
                {       
                        if (player_vampyric[id]<50){
                                player_point[id]-=1
                                player_vampyric[id]+=1
                        }
                        else client_print(id,print_center,"You have reached the Maximum level of Vampyrism!")
                }
        }
       
        if (player_point[id] > 0)
        skilltree(id)
       
        menu_destroy( skillzMenu );
        return PLUGIN_CONTINUE
}

public show_deadmessage(killer_id,victim_id,headshot,weaponname[]) {
        if (!(killer_id==victim_id && !headshot && equal(weaponname,"world"))) {
                message_begin( MSG_ALL, gmsgDeathMsg,{0,0,0},0)
                write_byte(killer_id)
                write_byte(victim_id)
                write_byte(headshot)
                write_string(weaponname)
                message_end()
        }
}

public got_bomb(id) {
    planter = id;
    return PLUGIN_CONTINUE
}

public award_plant() {
        new Players[32], playerCount, id
        get_players(Players, playerCount, "aeh", "TERRORIST")
               
        for (new i=0; i<playerCount; i++) {
                id = Players[i]
                Give_Xp(id,get_cvar_num("diablo_xpbonus"))       
                ColorChat(id, "^x04You have earned *%i* Experience for the team bomb plant event!", get_cvar_num("diablo_xpbonus"));
        }       
        Give_Xp(planter,get_cvar_num("diablo_xpbonus2"))
        ColorChat(planter,"^x04You have earned *%i* Experience for planting the bomb!",get_cvar_num("diablo_xpbonus2"))
}

public bomb_defusing(id) {
    defuser = id;
    return PLUGIN_CONTINUE
}

public award_defuse() {
        new Players[32], playerCount, id
        get_players(Players, playerCount, "aeh", "CT")
               
        for (new i=0; i<playerCount; i++) {
                id = Players[i]
                Give_Xp(id,get_cvar_num("diablo_xpbonus"))
                ColorChat(id, "^x04You have earned *%i* Experience for the team bomb defuse event!", get_cvar_num("diablo_xpbonus"))
        }
        Give_Xp(defuser,get_cvar_num("diablo_xpbonus2"))
        ColorChat(defuser,"^x04You have earned *%i* Experience for defusing the bomb!",get_cvar_num("diablo_xpbonus2"))
}

public award_hostageALL(id) {
        if (is_user_connected(id) == 1)
                Give_Xp(id,get_cvar_num("diablo_xpbonus2")/2)       
}

public award_rescuehostage() {
        new id = get_loguser_index();
        Give_Xp(id,5)
        ColorChat(id,"^x04You have earned 5 Experience for rescuing a hostage!")
}

public award_kill(killer_id,victim_id) {
        if (!is_user_connected(killer_id) || !is_user_connected(victim_id))
                return PLUGIN_CONTINUE
               
        new xp_award = get_cvar_num("diablo_xpbonus")
               
        new Team[32]
        get_user_team(killer_id,Team,31)
       
        if (LeaderCT > 0 && equal(Team,"CT") && !is_user_alive(LeaderCT))
                xp_award-= get_cvar_num("diablo_xpbonus")/4
       
        if (LeaderT > 0 && equal(Team,"TERRORIST") && !is_user_alive(LeaderT))
                xp_award-= get_cvar_num("diablo_xpbonus")/4
               
        if (player_xp[killer_id]<player_xp[victim_id])
                xp_award+=get_cvar_num("diablo_xpbonus")/4
               
        new more_lvl=player_lvl[victim_id]-player_lvl[killer_id]
       
        if(more_lvl>0) xp_award += floatround((get_cvar_num("diablo_xpbonus")/7)*(more_lvl*((2.0-more_lvl/40.0)/3.0)))
        else if(more_lvl<-50)xp_award -= get_cvar_num("diablo_xpbonus")*(2/3)
        else if(more_lvl<-40)xp_award -= get_cvar_num("diablo_xpbonus")/2
        else if(more_lvl<-30)xp_award -= get_cvar_num("diablo_xpbonus")/3
        else if(more_lvl<-20)xp_award -= get_cvar_num("diablo_xpbonus")/4
        else if(more_lvl<-10)xp_award -= get_cvar_num("diablo_xpbonus")/7
       
        Give_Xp(killer_id,xp_award)

        return PLUGIN_CONTINUE
}

public Give_Xp(id,amount) {       
        if(!is_user_bot(id)) {
                if(player_class_lvl[id][player_class[id]]==player_lvl[id]) {
                        if(player_xp[id]+amount!=0 && get_playersnum()>1) {
                                player_xp[id]+=amount
                                if (player_xp[id] > LevelXP[player_lvl[id]]) {
                                        player_lvl[id]+=1
                                        player_point[id]+=2
                                        set_hudmessage(60, 200, 25, -1.0, 0.25, 0, 1.0, 2.0, 0.1, 0.2, 2)
                                        show_hudmessage(id, "You have advanced to level %i!", player_lvl[id])
                                        savexpcom(id)
                                        player_class_lvl[id][player_class[id]]=player_lvl[id]
                                }
                       
                                if (player_xp[id] < LevelXP[player_lvl[id]-1]) {
                                        player_lvl[id]-=1
                                        player_point[id]-=2
                                        set_hudmessage(60, 200, 25, -1.0, 0.25, 0, 1.0, 2.0, 0.1, 0.2, 2)
                                        show_hudmessage(id, "You have dropped to level %i!", player_lvl[id])
                                        savexpcom(id)
                                        player_class_lvl[id][player_class[id]]=player_lvl[id]
                                }
                                write_hud(id)
                        }
                }
        }
}

public client_connect(id) {
        asked_sql[id]=0
        flashbattery[id] = MAX_FLASH
        player_xp[id] = 0               
        player_lvl[id] = 1               
        player_point[id] = 0       
        player_agility[id] = 0
        player_strength[id] = 0
        player_intelligence[id] = 0
        player_dextery[id] = 0
        player_power[id] = 0
        player_vampyric[id] = 0
        player_class[id] = 0
        player_damreduction[id] = 0.0
        last_update_xp[id] = -1
        DemageTake[id]=0
        g_GrenadeTrap[id] = 0
        g_TrapMode[id] = 0
        select_class_query(id)
}

public client_putinserver(id) {
        loaded_xp[id]=0
        player_class_lvl_save[id]=0
        database_user_created[id]=0
        select_class_query(id)
        jumpnum[id] = 0
        dojump[id] = false
}

public client_disconnect(id) {
        jumpnum[id] = 0
        dojump[id] = false       
        savexpcom(id)
        remove_task(TASK_CHARGE+id)   
        player_class_lvl_save[id]=0
        loaded_xp[id]=0
}

public write_hud(id) {

        if (!is_user_bot(id)) {
        set_hudmessage(60, 200, 25, 0.0, 0.9, 0, 1.0, 2.0, 0.1, 0.2, 2)

        if (player_lvl[id] == 0)
                player_lvl[id] = 1
                       
        new tpstring[1024]
       
        new Float:xp_now
        new Float:xp_need
        new Float:perc
       
        if (last_update_xp[id] == player_xp[id]) {
                perc = last_update_perc[id]
        } else {
                if (player_lvl[id] == 1) {
                        xp_now = float(player_xp[id])
                        xp_need = float(LevelXP[player_lvl[id]])
                        perc = xp_now*100.0/xp_need
                } else {
                        xp_now = float(player_xp[id])-float( LevelXP[player_lvl[id]-1])
                        xp_need = float(LevelXP[player_lvl[id]])-float(LevelXP[player_lvl[id]-1])
                        perc = xp_now*100.0/xp_need
                }
        }
       
        last_update_xp[id] = player_xp[id]
        last_update_perc[id] = perc
       
        if(player_class[id]==Paladin) {
                show_hudmessage(id, "    Godmode Charges: %i  Magic deagle bullets: %i" ,GodLeft[id], golden_bulet[id])
        } else if(player_class[id]==Assassin) {
                show_hudmessage(id, "    Blink Charges: %i    Status: %s  " ,AssassinUlt[id], invisible_cast[id] ? "[Invisible]" : "[Visible]")
        } else if(player_class[id]==Barbarian) {
                show_hudmessage(id, "    Armor Charges: %i    " ,ultra_armor[id])
        } else if(player_class[id]==Ninja) {
                show_hudmessage(id, "    Knife Charges: %i  Max Speed: %f  Hyper charges %i" ,player_knife[id], get_user_maxspeed(id), NinjaUlt[id])
        } else if(player_class[id]==Hunter) {
                show_hudmessage(id, "    Hunter invisible stacks: %i  " ,HunterUlt[id])
        } else if(player_class[id]==Necromancer) {
                show_hudmessage(id, "    Team revive stacks: %i  " ,NecroRevive[id])       
        }
       
        if (player_lvl[id] == 151) {
                format(tpstring,1023,"%s Level: %i (Max) ", Race[player_class[id]], player_lvl[id])
        } else {
                format(tpstring,1023,"%s Level: %i XP: %i/%i (%0.0f%s)", Race[player_class[id]], player_lvl[id], player_xp[id], LevelXP[player_lvl[id]], perc,"%%")
        }
        message_begin(MSG_ONE,gmsgStatusText,{0,0,0}, id)
        write_byte(0)
        write_string(tpstring)
        message_end()
        }
}

public UpdateHUD() { 
       
        for (new id=1; id <= get_maxplayers(); id++){
                if (!is_user_bot(id)) {
               
                if (!is_user_connected(id))
                        continue
                       
                set_renderchange(id)       
                if (!is_user_bot(id)) {

                        set_gravitychange(id)
                        set_speedchange(id)
                        set_renderchange(id)
               
                        if (is_user_alive(id)) write_hud(id)
                        else {
                                new index,bodypart
                                get_user_aiming(id,index,bodypart) 
                       
                                if(index >= 0 && index < MAX && is_user_connected(index) && is_user_alive(index)) {
                                        new pname[32]
                                        get_user_name(index,pname,31)
                               
                                        new Msg[512]
                                        set_hudmessage(255, 255, 255, 0.78, 0.65, 0, 6.0, 3.0)
                                        format(Msg,511,"Name: %s^nLevel: %i^nClass: %s^nIntelligence: %i^nStrength: %i^nAgility: %i^nDexterity: %i^nPower: %i^nVampyric: %i    ",pname,player_lvl[index],Race[player_class[index]], player_intelligence[index],player_strength[index],player_agility[index],player_dextery[index],player_power[index],player_vampyric[index])               
                                        show_hudmessage(id, Msg)
                                        }
                                }
                        }
                }       
        }
}

public Create_Line(id,origin1[3],origin2[3],bool:draw) {
        if (draw) {
                message_begin(MSG_ONE,SVC_TEMPENTITY,{0,0,0},id)
                write_byte(0)
                write_coord(origin1[0])        // starting pos
                write_coord(origin1[1])
                write_coord(origin1[2])
                write_coord(origin2[0])        // ending pos
                write_coord(origin2[1])
                write_coord(origin2[2])
                write_short(sprite_line)        // sprite index
                write_byte(1)                // starting frame
                write_byte(5)                // frame rate
                write_byte(2)                // life
                write_byte(3)                // line width
                write_byte(0)                // noise
                write_byte(255)        // RED
                write_byte(50)        // GREEN
                write_byte(50)        // BLUE                                       
                write_byte(155)                // brightness
                write_byte(5)                // scroll speed
                message_end()
        }
       
        new Float:ret[3],Float:fOrigin1[3],Float:fOrigin2[3]
        origin1[2]+=50
        IVecFVec(origin1,fOrigin1)
        IVecFVec(origin2,fOrigin2)
        new hit = trace_line ( 0, fOrigin1, fOrigin2, ret )
        return hit
}

public host_killed(id) {
        if (player_lvl[id] > 1)        {
                hudmsg(id,2.0,"You lost some experience for killing hostages!")
                Give_Xp(id,-floatround(3*player_lvl[id]/(1.65-player_lvl[id]/60)))
        }
}

public select_class_query(id) {
        if(is_user_bot(id) || asked_klass[id]!=0) return PLUGIN_HANDLED
        if(loaded_xp[id]==0) {
                load_xp(id)
                return PLUGIN_HANDLED
        }
       
        if(g_boolsqlOK) {
                asked_klass[id]=1
                new name[64]
                new data[1]
                data[0]=id
                new lx[8]
                if(player_class_lvl_save[id]==0) {
                        if(get_cvar_num("diablo_sql_save")==2) {
                                get_user_authid(id, name ,63)
                                new q_command[512]
                                format(q_command,511,"SELECT `klasa`,`lvl` FROM `%s` WHERE `sid`='%s' ",g_sqlTable,name)
                                SQL_ThreadQuery(g_SqlTuple,"select_class_handle",q_command,data,1)
                        }
                } else {
                        for(new i=1;i<8;i++) lx[i]=player_class_lvl[id][i]
                        select_class(id,lx)
                }
        } else sql_start()
       
        return PLUGIN_HANDLED 
}

public select_class_handle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
        new id=Data[0]
        if(Errcode) {
                log_to_file("addons/amxmodx/logs/diablo.log","Error on select_class_handle query: %s",Error)
                asked_klass[id]=0
        }
        if(FailState == TQUERY_CONNECT_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
                asked_klass[id]=0
                return PLUGIN_CONTINUE
        } else if(FailState == TQUERY_QUERY_FAILED) {
                log_to_file("addons/amxmodx/logs/diablo.log","select_class_handle Query failed.")
                asked_klass[id]=0
                return PLUGIN_CONTINUE
        }               
       
        if(SQL_MoreResults(Query)) {
                new lx[8]
               
                while(SQL_MoreResults(Query)) {
                        new i = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "klasa"))
                        lx[i] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "lvl"))
                        player_class_lvl[id][i] = lx[i]
                        SQL_NextRow(Query)
                }
               
                if(asked_klass[id]==1) {
                        asked_klass[id]=2
                        select_class(id,lx)
                }
               
        }
        return PLUGIN_CONTINUE
}

public select_class(id,lx[]) {
                   
        asked_klass[id]=0
   
        new szText[555 char]
       
        new ClassMenu = menu_create("Select Class", "select_class_menu")
       
        formatex(szText, charsmax(szText), "Sorcerer^t^tLevel: %d", lx[1])
        menu_additem(ClassMenu, szText, "1", 0)
   
        formatex(szText, charsmax(szText), "Paladin^t^tLevel: %d", lx[2])
        menu_additem(ClassMenu, szText, "2", 0)
   
        formatex(szText, charsmax(szText), "Assassin^t^tLevel: %d", lx[3])
        menu_additem(ClassMenu, szText, "3", 0)
   
        formatex(szText, charsmax(szText), "Necromancer^t^tLevel: %d", lx[4])
        menu_additem(ClassMenu, szText, "4", 0)
   
        formatex(szText, charsmax(szText), "Barbarian^t^tLevel: %d", lx[5])
        menu_additem(ClassMenu, szText, "5", 0)

        formatex(szText, charsmax(szText), "Ninja^t^tLevel: %d", lx[6])
        menu_additem(ClassMenu, szText, "6", 0)
   
        formatex(szText, charsmax(szText), "Hunter^t^tLevel: %d", lx[7])
        menu_additem(ClassMenu, szText, "7", 0)

        menu_setprop(ClassMenu, MPROP_EXIT , MEXIT_NEVER);
        menu_display(id, ClassMenu, 0);
}

public select_class_menu(id, ClassMenu, item) {
    if(item == MENU_EXIT) {
        menu_destroy(ClassMenu);
        return PLUGIN_HANDLED;
    }
   
    new Data[7], Name[64];
    new Access, Callback;
    menu_item_getinfo(ClassMenu, item, Access, Data,5, Name, 63, Callback);
   
    new Key = str_to_num(Data);
   
    switch(Key) {
        case 1:
            player_class[id] = Mag
        case 2:
        {   
            player_class[id] = Paladin
                     
        }
        case 3:
            player_class[id] = Assassin

        case 4:
                {
            player_class[id] = Necromancer
           
        }
        case 5:
        {   
            player_class[id] = Barbarian
        }
        case 6:
            player_class[id] = Ninja
        case 7:
        {
            player_class[id] = Hunter
            g_GrenadeTrap[id] = 1
        }
    }
       
    LoadXP(id, player_class[id])
    CurWeapon(id)
    Check_Ults(id)
    new_class[id] = false
    return PLUGIN_HANDLED


public UTIL_Teleport(id,distance) {       
        Set_Origin_Forward(id,distance)
        new origin[3]
        get_user_origin(id,origin)
        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY) //message begin
        write_byte(TE_PARTICLEBURST )
        write_coord(origin[0]) // origin
        write_coord(origin[1]) // origin
        write_coord(origin[2]) // origin
        write_short(20) // radius
        write_byte(1) // particle color
        write_byte(4) // duration * 10 will be randomized a bit
        message_end()
}

stock Set_Origin_Forward(id, distance) {
        new Float:origin[3]
        new Float:angles[3]
        new Float:teleport[3]
        new Float:heightplus = 10.0
        new Float:playerheight = 64.0
        new bool:recalculate = false
        new bool:foundheight = false
        pev(id,pev_origin,origin)
        pev(id,pev_angles,angles)
       
        teleport[0] = origin[0] + distance * floatcos(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
        teleport[1] = origin[1] + distance * floatsin(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
        teleport[2] = origin[2]+heightplus
       
        while (!Can_Trace_Line_Origin(origin,teleport) || Is_Point_Stuck(teleport,48.0)) {       
                if (distance < 10)
                        break;
                       
                for (new i=1; i < playerheight+20.0; i++) {
                        teleport[2]+=i
                        if (Can_Trace_Line_Origin(origin,teleport) && !Is_Point_Stuck(teleport,48.0)){
                                foundheight = true
                                heightplus += i
                                break
                        }
                        teleport[2]-=i
                }
       
                if (foundheight)
                        break
               
                recalculate = true
                distance-=10
                teleport[0] = origin[0] + (distance+32) * floatcos(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
                teleport[1] = origin[1] + (distance+32) * floatsin(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
                teleport[2] = origin[2]+heightplus
        }
       
        if (!recalculate) {
                set_pev(id,pev_origin,teleport)
                return PLUGIN_CONTINUE
        }
       
        teleport[0] = origin[0] + distance * floatcos(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
        teleport[1] = origin[1] + distance * floatsin(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
        teleport[2] = origin[2]+heightplus
        set_pev(id,pev_origin,teleport)
       
        return PLUGIN_CONTINUE
}

stock bool:Can_Trace_Line_Origin(Float:origin1[3], Float:origin2[3]) {       
        new Float:Origin_Return[3]       
        new Float:temp1[3]
        new Float:temp2[3]
        temp1[x] = origin1[x]
        temp1[y] = origin1[y]
        temp1[z] = origin1[z]-30
        temp2[x] = origin2[x]
        temp2[y] = origin2[y]
        temp2[z] = origin2[z]-30
       
        trace_line(-1, temp1, temp2, Origin_Return)
       
        if (get_distance_f(Origin_Return,temp2) < 1.0)
                return true
       
        return false
}

stock bool:Is_Point_Stuck(Float:Origin[3], Float:hullsize) {
        new Float:temp[3]
        new Float:iterator = hullsize/3
       
        temp[2] = Origin[2]
       
        for (new Float:i=Origin[0]-hullsize; i < Origin[0]+hullsize; i+=iterator) {
                for (new Float:j=Origin[1]-hullsize; j < Origin[1]+hullsize; j+=iterator) {
                        for (new Float:k=Origin[2]-CS_PLAYER_HEIGHT; k < Origin[2]+CS_PLAYER_HEIGHT; k+=6) {
                                temp[0] = i
                                temp[1] = j
                                temp[2] = k
                               
                                if (point_contents(temp) != -1)
                                        return true
                        }
                }
        }
        return false
}

stock Effect_Bleed(id,color) {
        new origin[3]
        get_user_origin(id,origin)
       
        new dx, dy, dz
       
        for(new i = 0; i < 3; i++)  {
                dx = random_num(-15,15)
                dy = random_num(-15,15)
                dz = random_num(-20,25)
               
                for(new j = 0; j < 2; j++)  {
                        message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
                        write_byte(TE_BLOODSPRITE)
                        write_coord(origin[0]+(dx*j))
                        write_coord(origin[1]+(dy*j))
                        write_coord(origin[2]+(dz*j))
                        write_short(sprite_blood_spray)
                        write_short(sprite_blood_drop)
                        write_byte(color) // color index
                        write_byte(8) // size
                        message_end()
                }
        }
}

public changerace(id) {
        if(freeze_ended && player_class[id]!=NONE && is_user_alive(id)) {
                new_class[id] = true
                client_print(id,print_center,"[Diablo Mod] Please wait for the next round to change your class!")
        } else {
                savexpcom(id)
                player_class[id]=NONE
                client_connect(id)
                select_class_query(id)
        }
}

public FW_WriteString(string[]) {
        if (equal(string,""))
                return FMRES_IGNORED
               
        if (equal(string,"#Hint_press_buy_to_purchase") || equal(string,"#Hint_press_buy_to_purchase ")) {
                write_string( "" );
                return FMRES_SUPERCEDE
        }
       
        if (equal(string, "#Hint_spotted_a_friend") || equal(string, "#Hint_you_have_the_bomb")) {
                write_string( "" );
                return FMRES_SUPERCEDE
        }
        return FMRES_IGNORED
}

stock hudmsg(id,Float:display_time,const fmt[], {Float,Sql,Result,_}:...) {       
        if (player_huddelay[id] >= 0.03*4)
                return PLUGIN_CONTINUE
       
        new buffer[512]
        vformat(buffer, 511, fmt, 4)
       
        set_hudmessage ( 255, 0, 0, -1.0, 0.4 + player_huddelay[id], 0, display_time/2, display_time, 0.1, 0.2, -1 )       
        show_hudmessage(id, buffer)
       
        player_huddelay[id]+=0.03
       
        remove_task(id+TASK_HUD)
        set_task(display_time, "hudmsg_clear", id+TASK_HUD, "", 0, "a", 3)
       
        return PLUGIN_CONTINUE
}

public hudmsg_clear(id) {
        new pid = id-TASK_HUD
        player_huddelay[pid]=0.0
}

stock Spawn_Ent(const classname[]) {
        new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, classname))
        set_pev(ent, pev_origin, {0.0, 0.0, 0.0})   
        dllfunc(DLLFunc_Spawn, ent)
        return ent
}

stock bool:Can_Trace_Line(id, target) {       
        for (new i=-35; i < 60; i+=35) {               
                new Float:Origin_Id[3]
                new Float:Origin_Target[3]
                new Float:Origin_Return[3]
               
                pev(id,pev_origin,Origin_Id)
                pev(target,pev_origin,Origin_Target)
               
                Origin_Id[z] = Origin_Id[z] + i
                Origin_Target[z] = Origin_Target[z] + i
               
                trace_line(-1, Origin_Id, Origin_Target, Origin_Return)
               
                if (get_distance_f(Origin_Return,Origin_Target) < 25.0)
                        return true
        }
        return false
}

public item_totemheal(id) {

        new origin[3]
        pev(id,pev_origin,origin)
               
        new ent = Spawn_Ent("info_target")
        set_pev(ent,pev_classname,"Effect_Healing_Totem")
        set_pev(ent,pev_owner,id)
        set_pev(ent,pev_solid,SOLID_TRIGGER)
        set_pev(ent,pev_origin,origin)
        set_pev(ent,pev_ltime, halflife_time() + 7 + 0.1)
       
        engfunc(EngFunc_SetModel, ent, "addons/amxmodx/diablo/totem_heal.mdl")         
        set_rendering ( ent, kRenderFxGlowShell, 255,0,0, kRenderFxNone, 255 )       
        engfunc(EngFunc_DropToFloor,ent)
       
        set_pev(ent,pev_nextthink, halflife_time() + 0.1)
       
        return PLUGIN_CONTINUE       
}

public Effect_Healing_Totem_Think(ent) {
        new id = pev(ent,pev_owner)
        new totem_dist = 300
       

        if (pev(ent,pev_euser2) == 1) {               
                new Float:forigin[3], origin[3]
                pev(ent,pev_origin,forigin)       
                FVecIVec(forigin,origin)

                new entlist[513]
                new numfound = find_sphere_class(0,"player",totem_dist+0.0,entlist,512,forigin)
               
                for (new i=0; i < numfound; i++) {               
                        new pid = entlist[i]
                       
                        if (get_user_team(pid) != get_user_team(id))
                                continue
                                                               
                        if (is_user_alive(pid) && player_class[pid] == Mag) change_health(pid,5+player_intelligence[id],0,"")                       
                }
               
                set_pev(ent,pev_euser2,0)
                set_pev(ent,pev_nextthink, halflife_time() + 1.5)
               
                return PLUGIN_CONTINUE
        }

        if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id)) {
                remove_entity(ent)
                return PLUGIN_CONTINUE
        }

        if (pev(ent,pev_ltime)-2.0 < halflife_time())
                set_rendering ( ent, kRenderFxNone, 255,255,255, kRenderTransAlpha, 100 )
               
        new Float:forigin[3], origin[3]
        pev(ent,pev_origin,forigin)       
        FVecIVec(forigin,origin)

        message_begin( MSG_BROADCAST, SVC_TEMPENTITY, origin );
        write_byte( TE_BEAMCYLINDER );
        write_coord( origin[0] );
        write_coord( origin[1] );
        write_coord( origin[2] );
        write_coord( origin[0] );
        write_coord( origin[1] + totem_dist );
        write_coord( origin[2] + totem_dist );
        write_short( sprite_white );
        write_byte( 0 ); // startframe
        write_byte( 0 ); // framerate
        write_byte( 10 ); // life
        write_byte( 10 ); // width
        write_byte( 255 ); // noise
        write_byte( 255 ); // r, g, b
        write_byte( 100 ); // r, g, b
        write_byte( 100 ); // r, g, b
        write_byte( 128 ); // brightness
        write_byte( 5 ); // speed
        message_end();
               
        set_pev(ent,pev_euser2,1)
        set_pev(ent,pev_nextthink, halflife_time() + 0.5)
       
        return PLUGIN_CONTINUE
}

public freeze_over1() {
       
        agi = BASE_SPEED;
        new players[32], num
        get_players(players,num,"a")       
       
        for(new i=0 ; i<num ; i++) {
                set_speedchange(players[i])
       
        }
}

public set_speedchange(id) {
        if(DemageTake[id]==1) agi=(BASE_SPEED / 2)
        else agi=BASE_SPEED
       
        if (is_user_connected(id) && freeze_ended) {
                new speeds
               
                if(player_class[id] == Ninja) {
                        if (NinjaUlt_active[id] == true) {
                                speeds= (40 + floatround(player_dextery[id]*1.3) + floatround(player_intelligence[id]*1.3)) * 2
                        } else {       
                                speeds= 40 + floatround(player_dextery[id]*1.3) + floatround(player_intelligence[id]*1.3)
                        }       
                }

                else if(player_class[id] == Assassin) speeds= 10 + floatround(player_dextery[id]*1.3)
                else speeds= floatround(player_dextery[id]*1.3)
                set_user_maxspeed(id, agi + speeds)
        }
}

public set_renderchange(id) {

        if(is_user_connected(id) && is_user_alive(id)) {       
                if(!task_exists(id+TASK_FLASH_LIGHT)) {
                        if (player_class[id] == Ninja || player_class[id] == Hunter && HunterUlt_active[id] == true)
                                set_user_rendering(id,kRenderFxNone, 0,0,0, kRenderTransTexture,9)
                        else if(invisible_cast[id]==1) {
                                set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 10)
                               
                                Display_Fade(id,1<<14,1<<14 ,1<<16,192,192,192,20)               
                        } else
                                set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 255)
                }       
                else set_user_rendering(id,kRenderFxGlowShell,flashlight_r,flashlight_g,flashlight_b,kRenderNormal,4)
        }
}

public set_gravitychange(id) {
        if(is_user_alive(id) && is_user_connected(id)) {
                if(player_class[id] == Ninja) {
                        if(player_b_gravity[id]>6) set_user_gravity(id, 0.17)
                        else if(player_b_gravity[id]>3) set_user_gravity(id, 0.2)
                        else set_user_gravity(id, 0.25)
                } else
                        set_user_gravity(id,1.0*(1.0-player_b_gravity[id]/12.0))
                }
}

public cmd_who(id) {
        static motd[1000], header[100], name[32], len, i
        len = 0
        new team[32]
        static players[32], numplayers;
        get_players(players, numplayers, "")
        new playerid;
        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000>")
        len += formatex(motd[len],sizeof motd - 1 - len,"<center><table width=700 border=1 cellpadding=4 cellspacing=4>")
        len += formatex(motd[len],sizeof motd - 1 - len,"<tr><td>Name</td><td>Class</td><td>Level</td><td>Team</td></tr>")
        formatex( header, sizeof header - 1, "Diablo Mod")
       
        for(i=0; i < numplayers; i++) {
                playerid = players[i]
                if ( get_user_team(playerid) == 1 ) team = "Terrorist"
                else if ( get_user_team(playerid) == 2 ) team = "CT"
                else team = "Spectator"
                get_user_name( playerid, name, 31 )
                get_user_name( playerid, name, 31 )
               
                len += formatex(motd[len],sizeof motd - 1 - len,"<tr><td>%s</td><td>%s</td><td>%d</td><td>%s</td></tr>",name,Race[player_class[playerid]], player_lvl[playerid],team)
        }
        len += formatex(motd[len],sizeof motd - 1 - len,"</table></center>")
        show_motd(id, motd, header)
}

 
stock refill_ammo(id) {       
        new wpnid
        if(!is_user_alive(id) || pev(id,pev_iuser1)) return;

        cs_set_user_armor(id,200,CS_ARMOR_VESTHELM);
       
        new wpn[32],clip,ammo
        wpnid = get_user_weapon(id, clip, ammo)
        get_weaponname(wpnid,wpn,31)

        new wEnt;

        wpnid = get_weaponid(wpn)
        wEnt = get_weapon_ent(id,wpnid);
        cs_set_weapon_ammo(wEnt,maxClip[wpnid]);

}

stock get_weapon_ent(id,wpnid=0,wpnName[]="") {
        static newName[32];

        if(wpnid) get_weaponname(wpnid,newName,31);

        else formatex(newName,31,"%s",wpnName);

        if(!equal(newName,"weapon_",7))
                format(newName,31,"weapon_%s",newName);

        new ent;
        while((ent = engfunc(EngFunc_FindEntityByString,ent,"classname",newName)) && pev(ent,pev_owner) != id) {}

        return ent;
}
 
public event_flashlight(id) {
        if(!get_cvar_num("flashlight_custom")) {
                return;
        }

        if(flashlight[id]) {
                flashlight[id] = 0;
        } else {
                if(flashbattery[id] > 0) {
                        flashlight[id] = 1;
                }
        }

        if(!task_exists(TASK_CHARGE+id)) {
                new parms[1];
                parms[0] = id;
                set_task((flashlight[id]) ? get_cvar_float("flashlight_drain") : get_cvar_float("flashlight_charge"),"charge",TASK_CHARGE+id,parms,1);
        }

        message_begin(MSG_ONE,get_user_msgid("Flashlight"),{0,0,0},id);
        write_byte(flashlight[id]);
        write_byte(flashbattery[id]);
        message_end();

        entity_set_int(id,EV_INT_effects,entity_get_int(id,EV_INT_effects) & ~EF_DIMLIGHT);
}

public charge(parms[]) {
        if(!get_cvar_num("flashlight_custom")) {
                return;
        }

        new id = parms[0];

        if(flashlight[id])
                flashbattery[id] -= 1;
        else
                flashbattery[id] += 1;

        message_begin(MSG_ONE,get_user_msgid("FlashBat"),{0,0,0},id);
        write_byte(flashbattery[id]);
        message_end();

        if(flashbattery[id] <= 0) {
                flashbattery[id] = 0;
                flashlight[id] = 0;

                message_begin(MSG_ONE,get_user_msgid("Flashlight"),{0,0,0},id);
                write_byte(flashlight[id]);
                write_byte(flashbattery[id]);
                message_end();
        } else if(flashbattery[id] >= MAX_FLASH)  {
                flashbattery[id] = MAX_FLASH
                return; // return because we don't need to charge anymore
        }

        set_task((flashlight[id]) ? get_cvar_float("flashlight_drain") : get_cvar_float("flashlight_charge"),"charge",TASK_CHARGE+id,parms,1)
}

public give_knife(id) {
        new knifes = 0
        if(player_class[id] == Ninja) knifes = 5 + floatround ( player_intelligence[id]/10.0 , floatround_floor )
       
        max_knife[id] = knifes
        player_knife[id] = knifes
}

public command_knife(id) {
        if(!is_user_alive(id)) return PLUGIN_HANDLED
       
        if(!player_knife[id]) {
                client_print(id,print_center,"You have no more throwing knives!")
                return PLUGIN_HANDLED
        }

        if(tossdelay[id] > get_gametime() - 0.9) return PLUGIN_HANDLED
        else tossdelay[id] = get_gametime()

        player_knife[id]--

        if (player_knife[id] == 1) {
                client_print(id,print_center,"You have one throwing knife left!")
        }

        new Float: Origin[3], Float: Velocity[3], Float: vAngle[3], Ent

        entity_get_vector(id, EV_VEC_origin , Origin)
        entity_get_vector(id, EV_VEC_v_angle, vAngle)

        Ent = create_entity("info_target")

        if (!Ent) return PLUGIN_HANDLED

        entity_set_string(Ent, EV_SZ_classname, "throwing_knife")
        entity_set_model(Ent, "models/diablomod/w_throwingknife.mdl")

        new Float:MinBox[3] = {-1.0, -7.0, -1.0}
        new Float:MaxBox[3] = {1.0, 7.0, 1.0}
        entity_set_vector(Ent, EV_VEC_mins, MinBox)
        entity_set_vector(Ent, EV_VEC_maxs, MaxBox)

        vAngle[0] -= 90

        entity_set_origin(Ent, Origin)
        entity_set_vector(Ent, EV_VEC_angles, vAngle)

        entity_set_int(Ent, EV_INT_effects, 2)
        entity_set_int(Ent, EV_INT_solid, 1)
        entity_set_int(Ent, EV_INT_movetype, 6)
        entity_set_edict(Ent, EV_ENT_owner, id)

        VelocityByAim(id, get_cvar_num("diablo_knife_speed") , Velocity)
        entity_set_vector(Ent, EV_VEC_velocity ,Velocity)
       
        return PLUGIN_HANDLED
}

public touchKnife(knife, id) {       
        new kid = entity_get_edict(knife, EV_ENT_owner)
       
        if(is_user_alive(id)) {
                new movetype = entity_get_int(knife, EV_INT_movetype)
               
                if(movetype == 0) {
                        if( player_knife[id] < max_knife[id]) {
                                player_knife[id] += 1
                                client_print(id,print_center,"You have %i throwing knives left!",player_knife[id])
                        }
                        emit_sound(knife, CHAN_ITEM, "weapons/knife_deploy1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
                        remove_entity(knife)
                } else if (movetype != 0) {
                        if(kid == id) return

                        remove_entity(knife)

                        if(get_cvar_num("mp_friendlyfire") == 0 && get_user_team(id) == get_user_team(kid)) return

                        entity_set_float(id, EV_FL_dmg_take, get_cvar_num("diablo_knife") * 1.0)

                        change_health(id,-get_cvar_num("diablo_knife"),kid,"knife")
                        message_begin(MSG_ONE,get_user_msgid("ScreenShake"),{0,0,0},id)
                        write_short(7<<14)
                        write_short(1<<13)
                        write_short(1<<14)
                        message_end()               

                        if(get_user_team(id) == get_user_team(kid)) {
                                new name[33]
                                get_user_name(kid,name,32)
                                client_print(0,print_chat,"%s attacked a teammate",name)
                        }

                        emit_sound(id, CHAN_ITEM, "weapons/knife_hit4.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
                }
        }
}

public touchWorld(knife, world) {
        entity_set_int(knife, EV_INT_movetype, 0)
        emit_sound(knife, CHAN_ITEM, "weapons/knife_hitwall1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
}

public touchbreakable(ent1, ent2) {
        new name[32],breakable,ent
        entity_get_string(ent1,EV_SZ_classname,name,31)
        if(equali(name,"func_breakable")) {
                breakable=ent1
                ent=ent2
        } else {
                breakable=ent2
                ent=ent1
        }
        new Float: b_hp = entity_get_float(breakable,EV_FL_health)
        if(b_hp>80) entity_set_float(breakable,EV_FL_health,b_hp-50.0)
        else dllfunc(DLLFunc_Use,breakable,ent)
       
        entity_get_string(ent,EV_SZ_classname,name,31)
        if(equali(name,"throwing_knife")) {
                emit_sound(ent, CHAN_ITEM, "weapons/knife_hitwall1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
        } else remove_entity(ent)
}
       
public kill_all_entity(classname[]) {
        new iEnt = find_ent_by_class(-1, classname)
        while(iEnt > 0) {
                remove_entity(iEnt)
                iEnt = find_ent_by_class(iEnt, classname)               
        }
}

public command_arrow(id) {
        if(!is_user_alive(id)) return PLUGIN_HANDLED

        new Float: Origin[3], Float: Velocity[3], Float: vAngle[3], Ent

        entity_get_vector(id, EV_VEC_origin , Origin)
        entity_get_vector(id, EV_VEC_v_angle, vAngle)

        Ent = create_entity("info_target")

        if (!Ent) return PLUGIN_HANDLED

        entity_set_string(Ent, EV_SZ_classname, "xbow_arrow")
        entity_set_model(Ent, cbow_bolt)

        new Float:MinBox[3] = {-2.8, -2.8, -0.8}
        new Float:MaxBox[3] = {2.8, 2.8, 2.0}
        entity_set_vector(Ent, EV_VEC_mins, MinBox)
        entity_set_vector(Ent, EV_VEC_maxs, MaxBox)

        vAngle[0]*= -1
        Origin[2]+=10
       
        entity_set_origin(Ent, Origin)
        entity_set_vector(Ent, EV_VEC_angles, vAngle)

        entity_set_int(Ent, EV_INT_effects, 2)
        entity_set_int(Ent, EV_INT_solid, 1)
        entity_set_int(Ent, EV_INT_movetype, 5)
        entity_set_edict(Ent, EV_ENT_owner, id)
        new Float:dmg = get_cvar_float("diablo_arrow") + player_intelligence[id] * get_cvar_float("diablo_arrow_multi")
        entity_set_float(Ent, EV_FL_dmg,dmg)

        VelocityByAim(id, get_cvar_num("diablo_arrow_speed") , Velocity)
        set_rendering (Ent,kRenderFxGlowShell, 255,0,0, kRenderNormal,56)
        entity_set_vector(Ent, EV_VEC_velocity ,Velocity)
       
        return PLUGIN_HANDLED
}

public command_bow(id) {
        if(!is_user_alive(id)) return PLUGIN_HANDLED
        if(bow[id] == 1) {
                entity_set_string(id,EV_SZ_viewmodel,cbow_VIEW)
                entity_set_string(id,EV_SZ_weaponmodel,cvow_PLAYER)
                bowdelay[id] = get_gametime()
        } else {
                entity_set_string(id,EV_SZ_viewmodel,KNIFE_VIEW)
                entity_set_string(id,EV_SZ_weaponmodel,KNIFE_PLAYER)
                bow[id]=0
        }
        return PLUGIN_CONTINUE
}

public toucharrow(arrow, id) {       
        new kid = entity_get_edict(arrow, EV_ENT_owner)
        new lid = entity_get_edict(arrow, EV_ENT_enemy)
       
        if(is_user_alive(id)) {
                if(kid == id || lid == id) return
               
                entity_set_edict(arrow, EV_ENT_enemy,id)
       
                new Float:dmg = entity_get_float(arrow,EV_FL_dmg)
                entity_set_float(arrow,EV_FL_dmg,(dmg*3.0)/5.0)
               
                if(get_cvar_num("mp_friendlyfire") == 0 && get_user_team(id) == get_user_team(kid)) return
               
                Effect_Bleed(id,248)

                //bowdelay[kid] -=  0.5 - floatround(player_intelligence[kid]/5.0)
       
                change_health(id,floatround(-dmg-(player_dextery[id]*2)),kid,"knife")
                               
                message_begin(MSG_ONE,get_user_msgid("ScreenShake"),{0,0,0},id);
                write_short(7<<14);
                write_short(1<<13);
                write_short(1<<14);
                message_end();

                if(get_user_team(id) == get_user_team(kid)) {
                        new name[33]
                        get_user_name(kid,name,32)
                        client_print(0,print_chat,"%s attacked a teammate",name)
                }

                emit_sound(id, CHAN_ITEM, "weapons/knife_hit4.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
                if(dmg<30) remove_entity(arrow)
        }
}

public touchWorld2(arrow, world) {
        remove_entity(arrow)
}

public hunter_Line(id,vid,end[3]) {
        if(is_user_alive(id) && is_user_alive(vid) && trace_bool[id]) {
                new start[3]
                get_user_origin(vid,start)
               
                message_begin(MSG_ONE,SVC_TEMPENTITY,{0,0,0},id)
                write_byte(0)
                write_coord(start[0])        // starting pos
                write_coord(start[1])
                write_coord(start[2])
                write_coord(end[0])        // ending pos
                write_coord(end[1])
                write_coord(end[2])
                write_short(sprite_line)        // sprite index
                write_byte(1)                // starting frame
                write_byte(5)                // frame rate
                write_byte(100)                // life
                write_byte(1)                // line width
                write_byte(1)                // noise
                write_byte(255)        // RED
                write_byte(255)        // GREEN
                write_byte(100)        // BLUE                                       
                write_byte(150)                // brightness
                write_byte(5)                // scroll speed
                message_end()
               
                new parms[5];
               
                for(new i=0;i<3;i++) {
                        parms[i] = start[i]
                }
                parms[3]=id
                parms[4]=vid
               
                set_task(0.20,"charge_hunter",id+TARACE_TASK+vid*100,parms,5)
        }
}

public charge_hunter(parms[]) {
        new stop[3]
       
        for(new i=0;i<3;i++) {
                stop[i] =parms[i]
        }
        hunter_Line(parms[3],parms[4],stop)
}

public grenade_throw(id, ent, wID) {       
        if(!g_TrapMode[id] || !is_valid_ent(ent))
                return PLUGIN_CONTINUE
               
        new Float:fVelocity[3]
        VelocityByAim(id, cvar_throw_vel, fVelocity)
        entity_set_vector(ent, EV_VEC_velocity, fVelocity)
       
        new Float: angle[3]
        entity_get_vector(ent,EV_VEC_angles,angle)
        angle[0]=0.00
        entity_set_vector(ent,EV_VEC_angles,angle)
       
        entity_set_float(ent,EV_FL_dmgtime,get_gametime()+3.5)
       
        entity_set_int(ent, NADE_PAUSE, 0)
        entity_set_int(ent, NADE_ACTIVE, 0)
        entity_set_int(ent, NADE_VELOCITY, 0)
        entity_set_int(ent, NADE_TEAM, get_user_team(id))
       
        new param[1]
        param[0] = ent
        set_task(3.0, "task_ActivateTrap", 0, param, 1)
       
        return PLUGIN_CONTINUE
}

public task_ActivateTrap(param[]) {
        new ent = param[0]
        if(!is_valid_ent(ent))
                return PLUGIN_CONTINUE
       
        entity_set_int(ent, NADE_PAUSE, 1)
        entity_set_int(ent, NADE_ACTIVE, 1)
       
        new Float:fOrigin[3]
        entity_get_vector(ent, EV_VEC_origin, fOrigin)
        fOrigin[2] -= 8.1*(1.0-floatpower( 2.7182, -0.06798*float(player_agility[entity_get_edict(ent,EV_ENT_owner)])))
        entity_set_vector(ent, EV_VEC_origin, fOrigin)
       
        return PLUGIN_CONTINUE
}

public think_Grenade(ent) {
        new entModel[33]
        entity_get_string(ent, EV_SZ_model, entModel, 32)
       
        if(!is_valid_ent(ent) || equal(entModel, "models/w_c4.mdl"))
                return PLUGIN_CONTINUE
       
        if(entity_get_int(ent, NADE_PAUSE))
                return PLUGIN_HANDLED
       
        return PLUGIN_CONTINUE
}

public think_Bot(bot) {
        new ent = -1
        while((ent = find_ent_by_class(ent, "grenade"))) {
                new entModel[33]
                entity_get_string(ent, EV_SZ_model, entModel, 32)
                       
                if(equal(entModel, "models/w_c4.mdl"))
                        continue

                if(!entity_get_int(ent, NADE_ACTIVE))
                        continue
                               
                new Players[32], iNum
                get_players(Players, iNum, "a")
                                               
                for(new i = 0; i < iNum; ++i) {
                        new id = Players[i]
                        if(entity_get_int(ent, NADE_TEAM) == get_user_team(id))
                                continue
                               
                        if(get_entity_distance(id, ent) > cvar_activate_dis || player_speed(id) <200.0)
                                continue
                       
                        if(entity_get_int(ent, NADE_VELOCITY)) continue
                       
                        new Float:fOrigin[3]
                        entity_get_vector(ent, EV_VEC_origin, fOrigin)
                        while(PointContents(fOrigin) == CONTENTS_SOLID)
                                fOrigin[2] += 100.0
               
                        entity_set_vector(ent, EV_VEC_origin, fOrigin)
                        drop_to_floor(ent)
                               
                        new Float:fVelocity[3]
                        entity_get_vector(ent, EV_VEC_velocity, fVelocity)
                        fVelocity[2] += float(cvar_nade_vel)
                        entity_set_vector(ent, EV_VEC_velocity, fVelocity)
                        entity_set_int(ent, NADE_VELOCITY, 1)
               
                        new param[1]
                        param[0] = ent
                        entity_set_float(param[0], EV_FL_nextthink, halflife_time())
                        entity_set_int(param[0], NADE_PAUSE, 0)
                }
        }
        if(get_timeleft()<2 && map_end<2)
                map_end=2
        else if(get_timeleft()<6 && map_end<1) {
                new play[32],num

                get_players(play,num)
               
                for(new i=0;i<num;i++) {
                        savexpcom(play[i])
                }
                map_end=1
        }
       
        entity_set_float(bot, EV_FL_nextthink, halflife_time() + 0.1)
}

stock Float:player_speed(index) {
        new Float:vec[3]
       
        pev(index,pev_velocity,vec)
        vec[2]=0.0
       
        return floatsqroot ( vec[0]*vec[0]+vec[1]*vec[1] )
}

public _create_ThinkBot() {
        new think_bot = create_entity("info_target")
        if(!is_valid_ent(think_bot))
                log_amx("For some reason, the universe imploded, reload your server")
        else {
                entity_set_string(think_bot, EV_SZ_classname, "think_bot")
                entity_set_float(think_bot, EV_FL_nextthink, halflife_time() + 1.0)
        }
}

public change_health(id,hp,attacker,weapon[]) {

        new m_health
        if (player_strength[id] < 25) {
                m_health = race_heal[player_class[id]]+player_strength[id]*2
        }
        if (player_strength[id] > 24 && player_strength[id] < 50) {
                m_health = race_heal[player_class[id]] + 10 + player_strength[id]*2
        }       
        if (player_strength[id] == 50) {
                m_health = race_heal[player_class[id]] + 20 + player_strength[id]*2
        }       
        if(is_user_alive(id) && is_user_connected(id)) {
                new health = get_user_health(id)
                if(hp>0) {
                        if (hp+health>m_health) set_user_health(id,m_health)
                        else set_user_health(id,get_user_health(id)+hp)
                } else {
                        if(health+hp<1)
                                UTIL_Kill(attacker,id,weapon)
                        else set_user_health(id,get_user_health(id)+hp)
                }
       
                if(id!=attacker && hp<0) {
                        player_dmg[attacker]-=hp
                        dmg_exp(attacker)
                }
        }
}

public UTIL_Kill(attacker,id,weapon[]) {
        if( is_user_alive(id)){
                if(get_user_team(attacker)!=get_user_team(id))
                        set_user_frags(attacker,get_user_frags(attacker) +1);
       
                if (cs_get_user_money(attacker) + 150 <= 16000)
                        cs_set_user_money(attacker,cs_get_user_money(attacker)+150)
                else
                        cs_set_user_money(attacker,16000)
       
                cs_set_user_deaths(id, cs_get_user_deaths(id)+1)
                user_kill(id,1)
               
                if(is_user_connected(attacker) && attacker!=id) {
                        award_kill(attacker,id)
                }
                               
                message_begin( MSG_ALL, gmsgDeathMsg,{0,0,0},0)
                write_byte(attacker)
                write_byte(id)
                write_byte(0)
                write_string(weapon)
                message_end()
       
                message_begin(MSG_ALL,gmsgScoreInfo)
                write_byte(attacker)
                write_short(get_user_frags(attacker))
                write_short(get_user_deaths(attacker))
                write_short(0)
                write_short(get_user_team(attacker))
                message_end()
       
                message_begin(MSG_ALL,gmsgScoreInfo)
                write_byte(id)
                write_short(get_user_frags(id))
                write_short(get_user_deaths(id))
                write_short(0)
                write_short(get_user_team(id))
                message_end()
       
                new kname[32], vname[32], kauthid[32], vauthid[32], kteam[10], vteam[10];
       
                get_user_name(attacker, kname, 31);
                get_user_team(attacker, kteam, 9);
                get_user_authid(attacker, kauthid, 31);
       
                get_user_name(id, vname, 31);
                get_user_team(id, vteam, 9);
                get_user_authid(id, vauthid, 31);
       
                log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"",
                kname, get_user_userid(attacker), kauthid, kteam,
                vname, get_user_userid(id), vauthid, vteam, weapon);
        }
}

stock Display_Fade(id,duration,holdtime,fadetype,red,green,blue,alpha) {
        message_begin( MSG_ONE, g_msg_screenfade,{0,0,0},id )
        write_short( duration )        // Duration of fadeout
        write_short( holdtime )        // Hold time of color
        write_short( fadetype )        // Fade type
        write_byte ( red )                // Red
        write_byte ( green )                // Green
        write_byte ( blue )                // Blue
        write_byte ( alpha )        // Alpha
        message_end()
}

public fw_traceline(Float:vecStart[3],Float:vecEnd[3],ignoreM,id,trace) {
       
        if(!is_user_connected(id))
                return FMRES_IGNORED;

        if(!is_user_alive(id))
                return FMRES_IGNORED;

        new hit = get_tr2(trace, TR_pHit)       

        if(!(pev(id,pev_button) & IN_ATTACK))
                return FMRES_IGNORED;
               
        new h_bulet=0
       
        if(golden_bulet[id]>0 && paladin_bullet[id] && player_class[id] == Paladin) {
               
                h_bulet=1
        }
               
        if(is_valid_ent(hit)) {
                new name[64]
                entity_get_string(hit,EV_SZ_classname,name,63)
               
                if(equal(name,"dbmod_shild")) {
                        new Float: ori[3]
                        entity_get_vector(hit,EV_VEC_origin,ori)
                        set_tr2(trace,TR_vecEndPos,vecEnd)
                        if(after_bullet[id]>0) {                       
                                new Float: health=entity_get_float(hit,EV_FL_health)
                                entity_set_float(hit,EV_FL_health,health-3.0)
                                if(health-1.0<0.0) remove_entity(hit)
                                after_bullet[id]--
                        }
                        set_tr2(trace,TR_iHitgroup,8);
                        set_tr2(trace,TR_flFraction,1.0);
                        return FMRES_SUPERCEDE;
                }
        }       
               
        if(is_user_alive(hit)) {
                if(h_bulet) {
                        set_tr2(trace, TR_iHitgroup, HIT_HEAD)
                        static hit, Float:head_origin[3], Float:angles[3]
                       
                        hit = get_tr2(trace, TR_pHit)
                        engfunc(EngFunc_GetBonePosition, hit, 8, head_origin, angles)
                       
                        set_tr2(trace, TR_vecEndPos, head_origin) // Blood now comes out of the head!
                       
                }
               
                if(ultra_armor[hit]>0 ) {
                        if(after_bullet[id]>0) {
                                if(ultra_armor[hit]>0) { ultra_armor[hit]--
                                } else if(player_ultra_armor_left[hit]>0) {
                                player_ultra_armor_left[hit]--
                                after_bullet[id]--
                                }
                        }
                        set_tr2(trace, TR_iHitgroup, 8)
                }
                return FMRES_IGNORED
        }
               
        return FMRES_IGNORED;
}

public dmg_exp(id) {
        if(!is_user_bot(id)) {
        new min=get_cvar_num("diablo_dmg_exp")
        if(min<1) return
        new exp=0
        while(player_dmg[id]>min)
        {
                player_dmg[id]-=min
                exp++
        }
        Give_Xp(id,exp)
        }
}

ColorChat( index, const Msg[], any:... ) {
        new Buffer[ 190 ], Buffer2[ 192 ];
        formatex( Buffer2, charsmax( Buffer2 ), "^x04[%s]^x01 %s", g_szPrefix, Msg );
        vformat( Buffer, charsmax( Buffer ), Buffer2, 3 );

        if( !index ) {
                for( new i = 1; i <= MAX; i++ ) {
                        if( !is_user_connected( i ) )
                                continue;

                        message_begin( MSG_ONE_UNRELIABLE, gmsgSayText,_, i );
                        write_byte( i );
                        write_string( Buffer );
                        message_end( );
                }
        } else {
                if( !is_user_connected( index ) )
                        return;

                message_begin( MSG_ONE, gmsgSayText,_, index );
                write_byte( index );
                write_string( Buffer );
                message_end( );
        }
}

BuyXP(id) {
        new xpp, xpcost, money
        new numbuys
        new name[33], authid[33]
        new cvar_xp, cvar_xpcost
       
        cvar_xp = 1
        cvar_xpcost = (500 - player_lvl[id])

        xpcost        = cvar_xpcost
        xpp        = 0

        money = cs_get_user_money(id)
        get_user_authid(id,authid,32)
        get_user_name(id,name,32)
       
        if( money < cvar_xpcost ){
                client_print(id,print_chat,"[Diablo Mod] Sorry, %s. You need at least $%d to buy experience!", name, cvar_xpcost )
                return PLUGIN_CONTINUE
        }

        numbuys = money / cvar_xpcost                //calculate the max number of transactions (originally used in for loop)
        xpp = numbuys * cvar_xp                        //calculate how much exp they can buy using numbuys
        xpcost = numbuys * cvar_xpcost                //calculate the cost of the above amount of exp
       
        console_print(0, "[Diablo Mod] %s PURCHASED %d XP : COST %d", name, xpp, xpcost)

        cs_set_user_money(  id, (money - xpcost) ,1 )                                //subtract money from buys
        server_cmd("db_givexp ^"%s^" %d", authid, xpp)                        //add exp for buys
       
       
        if( cs_get_user_money(id) < 0 ){
                cs_set_user_money( id, 0, 1 )
        }
        return PLUGIN_CONTINUE
       
}

public CmdGiveXp(id, iCid, iLvl) {
    if(!cmd_access(id, iLvl, iCid, 3))
        return PLUGIN_HANDLED;
   
    if (get_user_flags(id) & ADMIN_LEVEL_A) {   
    new szPlayer[32], szAmount[10];
    read_argv(1, szPlayer, charsmax(szPlayer));
    read_argv(2, szAmount, charsmax(szAmount));
   
    new iPlayer = cmd_target(id, szPlayer, CMDTARGET_ALLOW_SELF | CMDTARGET_NO_BOTS);
    new iAmount = str_to_num(szAmount);
   
    if(iAmount < 0 || !iPlayer)
        return PLUGIN_HANDLED;
   
    Give_Xp(iPlayer, iAmount);
   
    new szName[32];
    get_user_name(iPlayer, szName, charsmax(szName));
   
    console_print(id, "* Gave %i xp to %s", iAmount, szName);
    }
    return PLUGIN_HANDLED;
       
}

public cmd_Ultimate(id) {

        new Float: paladin_ult = 1.5+(player_intelligence[id]/50.0)
        if (freeze_ended && is_user_alive(id)) {
       
        if (player_class[id] == Mag) {
                if (player_sorc_heal[id] > 0) {
                        item_totemheal(id)
                        player_sorc_heal[id] --
                } else {
                        client_print(id,print_center,"[Diablo Mod] You have already placed a healing totem!")
                }
        }       
       
        if (player_class[id] == Paladin ) {
                new Float: time_delay = 2.0
                HunterUlt_end[id]=halflife_time()+time_delay
                new bar_delay = floatround(time_delay,floatround_ceil)
       
       
                if (GodLeft[id]>0) {
                        if (halflife_time()>cast_end[id]) {
                                message_begin( MSG_ONE, gmsgBartimer, {0,0,0}, id )
                                write_byte( bar_delay )
                                write_byte( 0 )
                                message_end()
                                GodLeft[id]--
                                Display_Fade(id,8192,0 ,1<<16,255,255,0,20)               
                                set_user_godmode(id, 1)
                                set_user_rendering(id, kRenderFxGlowShell, 255, 255, 0, kRenderNormal, 50)
                        }
                        set_task(paladin_ult, "paladin_godmodeoff",id)
                } else {
                        client_print(id,print_center,"[Diablo Mod] You have already used all your god mode stacks!")
                }
        }
       
        if (player_class[id] == Assassin) {
                if (AssassinUlt[id] > 0 && on_knife[id]) {
                        UTIL_Teleport(id,300+15*player_intelligence[id])
                        AssassinUlt[id] --               
                } else {
                        client_print(id,print_center,"[Diablo Mod] You cannot blink right now!")
                }
        }
       
        if (player_class[id] == Hunter) {
                new Float: time_delay = 2.0
                HunterUlt_end[id]=halflife_time()+time_delay
                new bar_delay = floatround(time_delay,floatround_ceil)
               
                if(bow[id]) {
                        if (HunterUlt[id] > 0) {
                                if (halflife_time()>cast_end[id]) {
                                        message_begin( MSG_ONE, gmsgBartimer, {0,0,0}, id )
                                        write_byte( bar_delay )
                                        write_byte( 0 )
                                        message_end()
                                        HunterUlt[id] --
                                        HunterUlt_active[id] = true
                                        set_renderchange(id)
                                        client_print(id,print_center,"[Diablo Mod] You are now invisible!")
                                        set_task(2.0, "Hunter_UltOff",id)
                                } else {
                                        client_print(id,print_center,"[Diablo Mod] You are already invisible!")
                                }
                        } else {
                                client_print(id,print_center,"[Diablo Mod] You don't have enough stacks to become invisible!")
                        }
                } else {
                        client_print(id,print_center,"[Diablo Mod] You need to equip your bow!")
                }
        }
               
        if (player_class[id] == Necromancer) {
                if (NecroUlt[id] == 0) {
                        spawn(id)
                        spawn(id)
                        NecroUlt[id] = 1
                } else {
                        client_print(id,print_center,"[Diablo Mod] You have already used your ultimate for this round!")
                }
        }
       
        if (player_class[id] == Ninja) {
                if (NinjaUlt[id] > 0) {
                        NinjaUlt[id] --
                        NinjaUlt_active[id] = true
                        Display_Fade(id,1<<11,1<<14 ,1<<16,255,0,0,20)               
                        set_speedchange(id)
                        set_task(5.0, "Ninja_ultOff",id)
                } else {
                        client_print(id,print_center,"[Diablo Mod] You don't have enough stacks to power up!")
                }
        }       
       
        if (player_class[id] == Barbarian) {
                if (BarbUlt_used[id] == false) {
                        BarbUlt_used[id] = true
                        BarbUlt[id] = true
                        change_health(id,50+player_intelligence[id] ,0,"")
                        refill_ammo(id)
                        Display_Fade(id,40960,0 ,1<<16,255,0,0,30)               
                        emit_sound(id, CHAN_ITEM, "dbmod/Barbarian_Rage.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
                        client_print(id,print_center,"[Diablo Mod] No recoil recoil + health, armor and ammo refill!")
                        set_task(10.0, "Barb_Ultoff",id)
                } else {       
                        client_print(id,print_center,"[Diablo Mod] You have already used your power up!")
                }               
        }
       
        }
}       

public Ninja_ultOff(id) {
        NinjaUlt_active[id] = false
}

public paladin_godmodeoff(id) {
        set_user_godmode(id, 0)
        set_user_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 50)
}

public Hunter_UltOff(id) {
        HunterUlt_active[id] = false
}

public Barb_Ultoff(id) {
        BarbUlt[id] = false
}
       
public Paladin_deagle( ent_Deagle ) {

        new id = pev( ent_Deagle, pev_owner ) // Find the owner
        if (is_user_alive(id) && player_class[id] == Paladin) {
                if (golden_bulet[id] > 0) golden_bulet[id]--
                return HAM_HANDLED
        }       
        return HAM_IGNORED
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage) {
        if ( is_user_connected(victim) && is_user_connected(attacker) && player_power[attacker] > 0 ) {
                SetHamParamFloat(4, damage * (1.0 + player_power[attacker]*0.01))
                return HAM_HANDLED
        }
        return HAM_IGNORED


public Commands_menu(id) {
        new menu = menu_create( "\rCommands menu:", "Commands_handler" );
        menu_additem( menu, "\w/class or /changerace-- Change your class!", "", 0 );
        menu_additem( menu, "\w/classinfo -- Get all the information about a class!", "", 0 );
        menu_additem( menu, "\w/speed -- Check your max speed!", "", 0 );
        menu_additem( menu, "\w/reset -- Reset your skills!", "", 0 );
        menu_additem( menu, "\w/players -- See all players their class!", "", 0 );
        menu_additem( menu, "\w/buyxp -- Buy experience based on your current money!", "", 0 );
        menu_additem( menu, "\w/skills -- Get information about your skills!", "", 0 );
        menu_additem( menu, "\w/classattribs -- Get more information about what class skills do!", "", 0 );
        menu_additem( menu, "\w/autobuyxp -- Automaticly buys experience [Donator only]", "", 0 );
        menu_setprop( menu, MPROP_EXIT, MEXIT_ALL );
          menu_display( id, menu, 0 );
}
 
public Commands_handler(id, menu, item) {
   
        switch( item ) {
                case 0:
                {
                        changerace(id)
                       
                }
                case 1:
                {
                        Classinfo_menu(id)
                }
                case 2:
                {
                        speed(id)
                }
                case 3:
                {
                        reset_skill(id)
                }
                case 4:
                {
                        cmd_who(id)
                }
                case 5:
                {
                        BuyXP(id)
                }               
                        case 6:
                {
                        skills(id)
                }
                        case 7:
                {
                        ClassAttribs(id)
                }
                case 8:
                {
                        Autobuyxp(id)
                }               
                case MENU_EXIT:
                {
                        client_print( id, print_chat, "I hope your knowledge has been increased!" );
                }
                }

        menu_destroy( menu );
        return PLUGIN_HANDLED;
}

public Classinfo_menu(id) {
        new menu = menu_create( "\rClass information:", "Classinfo_handler" );
        menu_additem( menu, "\w Sorcerer", "", 0 );
        menu_additem( menu, "\w Paladin", "", 0 );
        menu_additem( menu, "\w Assassin", "", 0 );
        menu_additem( menu, "\w Necromancer", "", 0 );
        menu_additem( menu, "\w Barbarian", "", 0 );
        menu_additem( menu, "\w Ninja", "", 0 );
        menu_additem( menu, "\w Hunter", "", 0 );
        menu_setprop( menu, MPROP_EXIT, MEXIT_ALL );
        menu_display( id, menu, 0 );
}
 
public skills(id) {
        static motd[1000], header[100], len
        len = 0   
               
        formatex( header, sizeof header - 1, "Skills information")
        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=4><center><br><br><br><br><br><br>")
        len += formatex(motd[len],sizeof motd - 1 - len,"Your current intelligence is: %i. This is used to increase your class skills! <br><br>", player_intelligence[id])
        len += formatex(motd[len],sizeof motd - 1 - len,"Your current strength is: %i. For every strength you gain 2 HP and on 25/50 you gain 10/20 extra HP.<br><br>", player_strength[id])
        len += formatex(motd[len],sizeof motd - 1 - len,"Your current agility is: %i. This will give you %0.0f%% damage reduction.<br><br>",player_agility[id],player_damreduction[id]*100)
        len += formatex(motd[len],sizeof motd - 1 - len,"Your current power is %i This will give you %i%% total damage<br><br>", player_power[id], 100 + player_power[id] )
        len += formatex(motd[len],sizeof motd - 1 - len,"Your current vampyric power is %i. This will heal you with %i HP upon kill!<br><br>",player_vampyric[id],player_vampyric[id])
        len += formatex(motd[len],sizeof motd - 1 - len,"You currently have %i Dextery. This will make you run with %0.0f% extra speed!<br><br>", player_dextery[id], player_dextery[id]*1.3)
       
        len += formatex(motd[len],sizeof motd - 1 - len,"</center>")
        show_motd(id, motd, header)       
}
 
public Classinfo_handler(id, menu, item) {
        static motd[1000], header[100], len
        len = 0   
               
        switch( item ) {
                case 0:
                {
                        formatex( header, sizeof header - 1, "Class information: Sorcerer")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Start with 80hp.<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Use your flashlight to make invisible enemy's visible by aiming on them!<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len," Use your ultimate to create a healing totem to heal all your allies close to your totem! <br>This will heal you up for 20 HP, and 4 more for every point you have in INT!")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</center>")
                        show_motd(id, motd, header)
                }
                case 1:
                {
                        formatex( header, sizeof header - 1, "Class information: Paladin")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Start with 50 hp.<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Your deagle will have magic bullets(headshot no matter where you hit the enemy) Max 7 depending on your INT!<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate to become invulnerable for a small period ( increase this with higher INT).")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</center>")
                        show_motd(id, motd, header)
                }
                case 2:
                {
                        formatex( header, sizeof header - 1, "Class information: Assassin")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Start with 100hp. <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"You will walk around silently! <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Stand still with your knife to become invisible! <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate to blink around the map, every 5 int will give you a new charge! <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
                        show_motd(id, motd, header)
                }
                case 3:
                {
                        formatex( header, sizeof header - 1, "Class information: Necromancer")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Start with 70 hp. <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate to return to spawn with your current hp! <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Get the ability to revive your team members (increase the amount of stacks with higher INT)! <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
                        show_motd(id, motd, header)
                }
                case 4:
                {
                        formatex( header, sizeof header - 1, "Class information: Barbarian")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Start with 50hp. <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"You will have 1 charge of armor, which will deflect the first hit you take, the more int you get, the more charges! <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate for a boost! You will get 50 hp(+1 per int) 200 armor, an ammo refill and no recoil for 10 seconds! <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
                        show_motd(id, motd, header)
                }
                case 5:
                {
                        formatex( header, sizeof header - 1, "Class information: Ninja")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Start with 170hp. <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"You cannot use a gun, but you are invisible and have increased gravity. <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Throw a knife with R, the more INT you have, the more throwing knives you have. <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"INT will also boost your speed! <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate to become a superninja for a short period! <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
                        show_motd(id, motd, header)
                }
                case 6:
                {
                        formatex( header, sizeof header - 1, "Class information: Hunter")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Start with 120hp. <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Press R on your knife to gain a bow! The more int, the faster you can shoot and the more damage you deal. <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Load up with your knife to gain a flashbang. Press use to make any grenade into a trap, then throw it! <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate to become invisible temporarily(with bow equipped) <br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
                        show_motd(id, motd, header)
                }       
        }

        menu_destroy( menu );
        return PLUGIN_HANDLED;
}

public eT_win() {
        new Players[32], playerCount, id
        get_players(Players, playerCount, "eh", "TERRORIST")
               
        for (new i=0; i<playerCount; i++) {
                id = Players[i]
                Give_Xp(id, 20)
                client_print(id, print_chat, "You have been given 20 experience points for winning the round!")
        }       
}

public eCT_win() {
        new Players[32], playerCount, id
        get_players(Players, playerCount, "eh", "CT")
               
        for (new i=0; i<playerCount; i++) {
                id = Players[i]
                Give_Xp(id, 20)
                client_print(id, print_chat, "You have been given 20 experience points for winning the round!")
        }       
}

public Autobuyxp(id) {
        if(get_user_flags(id) & ADMIN_LEVEL_A)        {
                if (autobuyxp[id] == false) {
                        autobuyxp[id] = true
                        client_print(id, print_chat, "You have enabled autobuyxp, to disable write /autobuyxp again!")
                } else {
                        autobuyxp[id] = false
                        client_print(id, print_chat, "You have disabled autobuyxp, to enable write /autobuyxp again!")       
                }
        } else {
                client_print(id, print_chat, "Sorry, this function is only possible for admins and donators!")
        }

}

public peformautobuy(id) {
        if(is_user_alive(id) && get_user_flags(id) & ADMIN_LEVEL_A && autobuyxp[id] == true && cs_get_user_money(id) > 15000) {
                BuyXP(id)
                client_print(id, print_chat, "You automaticly purchased experience because /autobuyxp is enabled!")
        }
}

public ClassAttribs(id) {

        static motd[1000], header[100], len
        len = 0   
               
        if (player_class[id] == Mag) {
                        formatex( header, sizeof header - 1, "Class information: Sorcerer")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Get a total of 90 seconds flashlight per round to reveal invisible enemies.<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Your healing wards will heal for 5 HP + 1 HP per int per wave. In total there are 4 waves.<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</center>")
                        show_motd(id, motd, header)
                } else if (player_class[id] == Paladin) {
                        formatex( header, sizeof header - 1, "Class information: Paladin")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Passive: For each 10 points in intelligence you will gain an extra magic deagle bullet!<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Gained 1.5 seconds + 0.02 second per intelligence of god mode, Each 25 intelligence you will gain another godmode stack!<br><br>")                       
                        len += formatex(motd[len],sizeof motd - 1 - len,"</center>")
                        show_motd(id, motd, header)
                } else if (player_class[id] == Assassin) {
                        formatex( header, sizeof header - 1, "Class information: Assassin")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Silent run + Become invisible when holding your knife for 10 seconds - 0.04 second per intelligence.<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Peform a teleport with a base distance of 300 units. Per intelligence you will gain another 15 units!<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
                        show_motd(id, motd, header)
                } else if (player_class[id] == Necromancer) {
                        formatex( header, sizeof header - 1, "Class information: Necromancer")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Revive a team member. Per 25 intelligence you will gain another stack.<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Use your ultimate to respawn with full health! This can only be done once per round.<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
                        show_motd(id, motd, header)
                } else if (player_class[id] == Barbarian) {
                        formatex( header, sizeof header - 1, "Class information: Barbarian")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Regain full ammo and 20 HP upon kill, On roundstart you will gain 200 armor and bullet blocking armor stacks. Per 10 intelligence you will gain another stack.<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Gain instant ammo refill, 200 armor and no recoil for 10 seconds.<br><br>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
                        show_motd(id, motd, header)
                } else if (player_class[id] == Ninja) {
                        formatex( header, sizeof header - 1, "Class information: Ninja")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Run with 40 extra speed, for every dextery or intelligence you will gain an extra 1.3 speed!<br><br>  ")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Become a super ninja! This will give you double your passive speed and allows you to peform jumps in the air for a small duration!<br><br>  ")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
                        show_motd(id, motd, header)
                } else if (player_class[id] == Hunter) {
                        formatex( header, sizeof header - 1, "Class information: Hunter")
                        len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Equip your knife to load for a flashbang. It will take 5 seconds - 0.02 per intelligence to get a new flashbang.<br><br>  ")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Passive Bow: Deal 80 damage + 4 damage per intelligence with your arrows! However the damage is reduced if the enemy has dextery, every points reduces 2 damage! The arrow delay is 4.25 seconds - 0.05 seconds per intelligence.<br><br>  ")
                        len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Get 1 stack + 1 per 25 intelligence to become invisible for 2 seconds.  ")
                        len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
                        show_motd(id, motd, header)
                }       
}


^SmileY 05-16-2014 16:59

Re: Function that cause lag
 
First: pCvars
Second: Probably SQL is not using threaded queries.

Other: About lag, when it happens?

Backstabnoob 05-16-2014 17:24

Re: Function that cause lag
 
Well, what did you try to fix it?

Try some common sense. You do a lot of stuff in PreThink, which gets called 60 times per second per player. Try to comment that out and see if it changes. Etc etc.

@Smiley he is using threaded queries.

^SmileY 05-16-2014 17:27

Re: Function that cause lag
 
Quote:

Originally Posted by Backstabnoob (Post 2138729)
Well, what did you try to fix it?

Try some common sense. You do a lot of stuff in PreThink, which gets called 60 times per second per player. Try to comment that out and see if it changes. Etc etc.

@Smiley he is using threaded queries.

I never said I did not use :)

Backstabnoob 05-16-2014 17:29

Re: Function that cause lag
 
I said he is.
Quote:

Originally Posted by ^SmileY
Second: Probably SQL is not using threaded queries.


^SmileY 05-16-2014 17:34

Re: Function that cause lag
 
Ok Probably, Ok Again

egbertjan 05-16-2014 17:49

Re: Function that cause lag
 
About the pcvars, I'm new to this, so could I do the following?

Code:

new g_sql_host

plugin init:
g_sql_host= register_cvar("diablo_sql_host", "127.0.0.1"FCVAR_PROTECTED)

and to call the function: get_pcvar_num

What querry isn't used by your looks?

The lag happends on roundstart / upon shooting with guns and spraying basicly.

meTaLiCroSS 05-17-2014 02:30

Re: Function that cause lag
 
"new" variables on AddToFullPack? That's insane lol

egbertjan 05-17-2014 06:27

Re: Function that cause lag
 
@ meTaLiCroSS
What exactly is wrong with this? This is diablo mod 5.9 heavily modified. I tried to remove all the stuff that I don't need + add stuff that I wanted to be in. What does this function do?

Fr33m@n 05-17-2014 08:24

Re: Function that cause lag
 
well in a forward called often it's better to use static rather than new to register variable.

Anyway, it's not the cause of your lag. It's trivial compared to not caching value requested more than 1 time in a forward called often.


All times are GMT -4. The time now is 09:36.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.