AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Base Builder Zombies with level system help (https://forums.alliedmods.net/showthread.php?t=333519)

thebest24 07-18-2021 08:41

Base Builder Zombies with level system help
 
hi everyone i need know how to make zombie classes with levels in base builder mod i use oxicroms
crx rank system and want add some zombies with this plugin. [ example: new class husk zombie unlocks at level 10 ] is there any code or tutorial for that?

basebuilder.sma
Code:

y/*
Base Builder Zombie Mod
Tirant

Version 1.2 NXK
*/

#include <amxmodx>
#include <amxmisc>
#include <credits>
#include <cstrike>
#include <fun>
#include <hamsandwich>
#include <fakemeta>
#include <engine>
#include <csx>
#include <dhudmessage>


//Enable this only if you have bought the credits plugin
//#define BB_CREDITS

#define FLAGS_BUILD        ADMIN_KICK
#define FLAGS_LOCK        ADMIN_ALL
#define FLAGS_LOCKAFTER ADMIN_RCON
#define FLAGS_BUILDBAN        ADMIN_KICK
#define FLAGS_SWAP        ADMIN_BAN
#define FLAGS_REVIVE        ADMIN_KICK
#define FLAGS_GUNS        ADMIN_ADMIN
#define FLAGS_RELEASE        ADMIN_RCON
#define FLAGS_OVERRIDE        ADMIN_KICK

#define VERSION "1.2"
#define MODNAME "^x01 [^x04 Base Builder^x01 ]"

#define LockBlock(%1,%2)          ( entity_set_int( %1, EV_INT_iuser1,    %2 ) )
#define UnlockBlock(%1)          ( entity_set_int( %1, EV_INT_iuser1,    0  ) )
#define BlockLocker(%1)          ( entity_get_int( %1, EV_INT_iuser1        ) )

#define MovingEnt(%1)            ( entity_set_int( %1, EV_INT_iuser2,    1 ) )
#define UnmovingEnt(%1)          ( entity_set_int( %1, EV_INT_iuser2,    0 ) )
#define IsMovingEnt(%1)          ( entity_get_int( %1, EV_INT_iuser2 ) == 1 )

#define SetEntMover(%1,%2)          ( entity_set_int( %1, EV_INT_iuser3, %2 ) )
#define UnsetEntMover(%1)          ( entity_set_int( %1, EV_INT_iuser3, 0  ) )
#define GetEntMover(%1)          ( entity_get_int( %1, EV_INT_iuser3    ) )

#define SetLastMover(%1,%2)          ( entity_set_int( %1, EV_INT_iuser4, %2 ) )
#define UnsetLastMover(%1)          ( entity_set_int( %1, EV_INT_iuser4, 0  ) )
#define GetLastMover(%1)          ( entity_get_int( %1, EV_INT_iuser4    ) )

#define MAXPLAYERS 32
#define MAXENTS 1024
#define AMMO_SLOT 376
#define MODELCHANGE_DELAY 0.5
#define AUTO_TEAM_JOIN_DELAY 0.1
#define TEAM_SELECT_VGUI_MENU_ID 2
#define OBJECT_PUSHPULLRATE 4.0
#define HUD_FRIEND_HEIGHT 0.30

#define BARRIER_COLOR 255.0, 205.0, 80.0
#define BARRIER_RENDERAMT 150.0

#define BLOCK_RENDERAMT 250.0

#define LOCKED_COLOR 125.0, 0.0, 0.0
#define LOCKED_RENDERAMT 115.0

const ZOMBIE_ALLOWED_WEAPONS_BITSUM = (1<<CSW_KNIFE)
#define OFFSET_WPN_WIN          41
#define OFFSET_WPN_LINUX  4

#define OFFSET_ACTIVE_ITEM 373
#define OFFSET_LINUX 5

#if cellbits == 32
        #define OFFSET_BUYZONE 235
#else
        #define OFFSET_BUYZONE 268
#endif

new g_iMaxPlayers
new g_msgSayText, g_msgStatusText
new g_HudSync

new g_isConnected[MAXPLAYERS+1]
new g_isAlive[MAXPLAYERS+1]
new g_isZombie[MAXPLAYERS+1]
new g_isBuildBan[MAXPLAYERS+1]
new g_isCustomModel[MAXPLAYERS+1]

enum (+= 5000)
{
        TASK_BUILD = 10000,
        TASK_PREPTIME,
        TASK_MODELSET,
        TASK_RESPAWN,
        TASK_HEALTH,
        TASK_IDLESOUND
}

//Custom Sounds
new g_szRoundStart[][] =
{
        "basebuilder/round_start.wav",
        "basebuilder/round_start2.wav"
}

#define WIN_ZOMBIES        "basebuilder/winzm.wav"
#define WIN_BUILDERS        "basebuilder/winbb.wav"

#define PHASE_PREP        "basebuilder/phase_prep3.wav"
#define PHASE_BUILD        "basebuilder/phase_build3.wav"

#define LOCK_OBJECT        "buttons/lightswitch2.wav"
#define LOCK_FAIL        "buttons/button10.wav"

#define GRAB_START        "basebuilder/block_grab.wav"
#define GRAB_STOP        "basebuilder/block_drop.wav"

#define INFECTION        "basebuilder/zombie_kill1.wav"

new const g_szZombiePain[][] =
{
        "basebuilder/zombie/pain/pain1.wav",
        "basebuilder/zombie/pain/pain2.wav",
        "basebuilder/zombie/pain/pain3.wav"
}

new const g_szZombieDie[][] =
{
        "basebuilder/zombie/death/death1.wav",
        "basebuilder/zombie/death/death2.wav",
        "basebuilder/zombie/death/death3.wav"
}

new const g_szZombieIdle[][] =
{
        "basebuilder/zombie/idle/idle1.wav",
        "basebuilder/zombie/idle/idle2.wav",
        "basebuilder/zombie/idle/idle3.wav"
}

new const g_szZombieHit[][] =
{
        "basebuilder/zombie/hit/hit1.wav",
        "basebuilder/zombie/hit/hit1.wav",
        "basebuilder/zombie/hit/hit1.wav"
}

new const g_szZombieMiss[][] =
{
        "basebuilder/zombie/miss/miss1.wav",
        "basebuilder/zombie/miss/miss2.wav",
        "basebuilder/zombie/miss/miss3.wav"
}

//Custom Player Models
new Float:g_fModelsTargetTime, Float:g_fRoundStartTime
new g_szPlayerModel[MAXPLAYERS+1][32]

//Game Name
new g_szModName[32]

new g_iCountDown, g_iEntBarrier
new bool:g_boolCanBuild, bool:g_boolPrepTime, bool:g_boolRoundEnded
new g_iFriend[MAXPLAYERS+1]
new CsTeams:g_iTeam[MAXPLAYERS+1], CsTeams:g_iCurTeam[MAXPLAYERS+1]
new bool:g_boolFirstTeam[MAXPLAYERS+1]

//Building Stores
new Float:g_fOffset1[MAXPLAYERS+1], Float:g_fOffset2[MAXPLAYERS+1], Float:g_fOffset3[MAXPLAYERS+1]
new g_iOwnedEnt[MAXPLAYERS+1], g_iOwnedEntities[MAXPLAYERS+1]
new Float:g_fEntDist[MAXPLAYERS+1]

static const g_szWpnEntNames[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
                        "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
                        "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
                        "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
                        "weapon_ak47", "weapon_knife", "weapon_p90" }
                       
//Weapon Names (For Guns Menu)
static const szWeaponNames[24][23] = { "Schmidt Scout", "XM1014 M4", "Ingram MAC-10", "Steyr AUG A1", "UMP 45", "SG-550 Auto-Sniper",
                        "IMI Galil", "Famas", "AWP Magnum Sniper", "MP5 Navy", "M249 Para Machinegun", "M3 Super 90", "M4A1 Carbine",
                        "Schmidt TMP", "G3SG1 Auto-Sniper", "SG-552 Commando", "AK-47 Kalashnikov", "ES P90", "P228 Compact",
                        "Dual Elite Berettas", "Fiveseven", "USP .45 ACP Tactical", "Glock 18C", "Desert Eagle .50 AE" }
                       
#define MAX_COLORS 24
new const Float:g_fColor[MAX_COLORS][3] =
{
        {200.0, 000.0, 000.0},
        {255.0, 083.0, 073.0},
        {255.0, 117.0, 056.0},
        {255.0, 174.0, 066.0},
        {255.0, 207.0, 171.0},
        {252.0, 232.0, 131.0},
        {254.0, 254.0, 034.0},
        {059.0, 176.0, 143.0},
        {197.0, 227.0, 132.0},
        {000.0, 150.0, 000.0},
        {120.0, 219.0, 226.0},
        {135.0, 206.0, 235.0},
        {128.0, 218.0, 235.0},
        {000.0, 000.0, 255.0},
        {146.0, 110.0, 174.0},
        {255.0, 105.0, 180.0},
        {246.0, 100.0, 175.0},
        {205.0, 074.0, 076.0},
        {250.0, 167.0, 108.0},
        {234.0, 126.0, 093.0},
        {180.0, 103.0, 077.0},
        {149.0, 145.0, 140.0},
        {000.0, 000.0, 000.0},
        {255.0, 255.0, 255.0}
}

new const Float:g_fRenderAmt[MAX_COLORS] =
{
        100.0, //Red
        135.0, //Red Orange
        140.0, //Orange
        120.0, //Yellow Orange
        140.0, //Peach
        125.0, //Yellow
        100.0, //Lemon Yellow
        125.0, //Jungle Green
        135.0, //Yellow Green
        100.0, //Green
        125.0, //Aquamarine
        150.0, //Baby Blue
        090.0, //Sky Blue
        075.0, //Blue
        175.0, //Violet
        150.0, //Hot Pink
        175.0, //Magenta
        140.0, //Mahogany
        140.0, //Tan
        140.0, //Light Brown
        165.0, //Brown
        175.0, //Gray
        125.0, //Black
        125.0  //White
}

new const g_szColorName[MAX_COLORS][] =
{
        "Red",
        "Red Orange",
        "Orange",
        "Yellow Orange",
        "Peach",
        "Yellow",
        "Lemon Yellow",
        "Jungle Green",
        "Yellow Green",
        "Green",
        "Aquamarine",
        "Baby Blue",
        "Sky Blue",
        "Blue",
        "Violet",
        "Hot Pink",
        "Magenta",
        "Mahogany",
        "Tan",
        "Light Brown",
        "Brown",
        "Gray",
        "Black",
        "White"
}

enum
{
        COLOR_RED = 0,                //200, 000, 000
        COLOR_REDORANGE,        //255, 083, 073
        COLOR_ORANGE,                //255, 117, 056
        COLOR_YELLOWORANGE,        //255, 174, 066
        COLOR_PEACH,                //255, 207, 171
        COLOR_YELLOW,                //252, 232, 131
        COLOR_LEMONYELLOW,        //254, 254, 034
        COLOR_JUNGLEGREEN,        //059, 176, 143
        COLOR_YELLOWGREEN,        //197, 227, 132
        COLOR_GREEN,                //000, 200, 000
        COLOR_AQUAMARINE,        //120, 219, 226
        COLOR_BABYBLUE,                //135, 206, 235
        COLOR_SKYBLUE,                //128, 218, 235
        COLOR_BLUE,                //000, 000, 200
        COLOR_VIOLET,                //146, 110, 174
        COLOR_PINK,                //255, 105, 180
        COLOR_MAGENTA,                //246, 100, 175
        COLOR_MAHOGANY,                //205, 074, 076
        COLOR_TAN,                //250, 167, 108
        COLOR_LIGHTBROWN,        //234, 126, 093
        COLOR_BROWN,                //180, 103, 077
        COLOR_GRAY,                //149, 145, 140
        COLOR_BLACK,                //000, 000, 000
        COLOR_WHITE                //255, 255, 255
}

new g_iColor[MAXPLAYERS+1]
new g_iColorOwner[MAX_COLORS]

//Color Menu
new g_iMenuOffset[MAXPLAYERS+1], g_iMenuOptions[MAXPLAYERS+1][8], g_iWeaponPicked[2][MAXPLAYERS+1],
        g_iPrimaryWeapon[MAXPLAYERS+1]
       
new bool:g_boolFirstTime[MAXPLAYERS+1], bool:g_boolRepick[MAXPLAYERS+1]

new Float:g_fBuildDelay[MAXPLAYERS+1]
#define BUILD_DELAY 0.75

#define KEYS_GENERIC (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)

enum
{
        ATT_HEALTH = 0,
        ATT_SPEED,
        ATT_GRAVITY
}

//Zombie Classes
new g_iZClasses
new g_iZombieClass[MAXPLAYERS+1]
new bool:g_boolFirstSpawn[MAXPLAYERS+1]
new g_szPlayerClass[MAXPLAYERS+1][32]
new g_iNextClass[MAXPLAYERS+1]
new Float:g_fPlayerSpeed[MAXPLAYERS+1]
new bool:g_boolArraysCreated
new Array:g_zclass_name
new Array:g_zclass_info
new Array:g_zclass_modelsstart // start position in models array
new Array:g_zclass_modelsend // end position in models array
new Array:g_zclass_playermodel // player models array
new Array:g_zclass_modelindex // model indices array
new Array:g_zclass_clawmodel
new Array:g_zclass_hp
new Array:g_zclass_spd
new Array:g_zclass_grav
new Array:g_zclass_admin
new Array:g_zclass_level
new Array:g_zclass_credits
//new Float:g_fClassMultiplier[MAXPLAYERS+1][3]

new Array:g_zclass2_realname, Array:g_zclass2_name, Array:g_zclass2_info,
Array:g_zclass2_modelsstart, Array:g_zclass2_modelsend, Array:g_zclass2_playermodel,
Array:g_zclass2_clawmodel, Array:g_zclass2_hp, Array:g_zclass2_spd,
Array:g_zclass2_grav, Array:g_zclass2_admin, Array:g_zclass2_level, Array:g_zclass2_credits, Array:g_zclass_new

//Forwards
new g_fwRoundStart, g_fwPrepStarted, g_fwBuildStarted, g_fwClassPicked, g_fwClassSet,
g_fwPushPull, g_fwGrabEnt_Pre, g_fwGrabEnt_Post, g_fwDropEnt_Pre,
 g_fwDropEnt_Post, g_fwNewColor, g_fwLockEnt_Pre, g_fwLockEnt_Post, g_fwDummyResult

 //Cvars
new g_pcvar_buildtime, g_iBuildTime,
        g_pcvar_preptime, g_iPrepTime,
        g_pcvar_givenades, g_iGrenadeHE, g_iGrenadeFLASH, g_iGrenadeSMOKE,
        g_pcvar_entmindist, Float: g_fEntMinDist,
        g_pcvar_entsetdist, Float: g_fEntSetDist,
        g_pcvar_entmaxdist, Float: g_fEntMaxDist,
        g_pcvar_resetent, g_iResetEnt,
        g_pcvar_showmovers, g_iShowMovers,
        g_pcvar_lockblocks, g_iLockBlocks,
        g_pcvar_lockmax, g_iLockMax,
        g_pcvar_colormode, g_iColorMode,
        g_pcvar_zombietime, g_iZombieTime,
        g_pcvar_infecttime, g_iInfectTime,
        g_pcvar_supercut, g_iSupercut,
        g_pcvar_gunsmenu, g_iGunsMenu,
        g_pcvar_enabled,
        g_pcvar_allowedweps
 
public plugin_precache()
{
        server_cmd("bb_credits_active 0")
       
        register_plugin("Base Builder", VERSION, "NXK")
        register_cvar("base_builder", VERSION, FCVAR_SPONLY|FCVAR_SERVER)
        set_cvar_string("base_builder", VERSION)
       
        g_pcvar_enabled = register_cvar("bb_enabled", "1")
       
        if (!get_pcvar_num(g_pcvar_enabled))
                return;

        new szCache[64], i;
               
        g_pcvar_buildtime = register_cvar("bb_buildtime", "185") //Build Time
        g_iBuildTime = clamp(get_pcvar_num(g_pcvar_buildtime), 30, 300)
        g_pcvar_preptime = register_cvar("bb_preptime", "35") //Prep Time
        g_iPrepTime = clamp(get_pcvar_num(g_pcvar_preptime), 0, 60)
        g_pcvar_zombietime = register_cvar("bb_zombie_respawn_delay", "3") //Zombie Respawn Delay
        g_iZombieTime = clamp(get_pcvar_num(g_pcvar_zombietime), 1, 30)
        g_pcvar_infecttime = register_cvar("bb_infection_respawn", "5") //Survivor Respawn Infection Delay
        g_iInfectTime = clamp(get_pcvar_num(g_pcvar_infecttime), 0, 30)
        g_pcvar_showmovers = register_cvar("bb_showmovers", "1") //Show Movers
        g_iShowMovers = clamp(get_pcvar_num(g_pcvar_showmovers), 0, 1)
        g_pcvar_lockblocks = register_cvar("bb_lockblocks", "1") //Lock blocks
        g_iLockBlocks = clamp(get_pcvar_num(g_pcvar_lockblocks), 0, 1)
        g_pcvar_lockmax = register_cvar("bb_lockmax", "15") //Lock max
        g_iLockMax = clamp(get_pcvar_num(g_pcvar_lockmax), 0, 50)
        g_pcvar_colormode = register_cvar("bb_colormode", "1") //Color mode <0/1/2> Menu, one color per player, random
        g_iColorMode = clamp(get_pcvar_num(g_pcvar_colormode), 0, 2)
        g_pcvar_entmaxdist = register_cvar("bb_max_move_dist", "768") //Push ceiling
        g_fEntMaxDist = get_pcvar_float(g_pcvar_entmaxdist)
        g_pcvar_entmindist = register_cvar("bb_min_move_dist", "32") //Pull floor
        g_fEntMinDist = get_pcvar_float(g_pcvar_entmindist)
        g_pcvar_entsetdist = register_cvar("bb_min_dist_set", "64") //Grab set
        g_fEntSetDist = get_pcvar_float(g_pcvar_entsetdist)
        g_pcvar_resetent = register_cvar("bb_resetblocks", "1") //Reset blocks on new round
        g_iResetEnt = clamp(get_pcvar_num(g_pcvar_resetent), 0, 1)
        g_pcvar_supercut = register_cvar("bb_zombie_supercut", "0") //One hit kill for zombies
        g_iSupercut = clamp(get_pcvar_num(g_pcvar_supercut), 0, 1)
        g_pcvar_gunsmenu = register_cvar("bb_gunsmenu", "0") //Use the internal guns menu
        g_iGunsMenu = clamp(get_pcvar_num(g_pcvar_gunsmenu), 0, 1)
       
        g_pcvar_givenades = register_cvar("bb_roundnades","h") //Grenades
        g_pcvar_allowedweps = register_cvar("bb_weapons","abcdeghijlmnqrstuvwx")
       
        get_pcvar_string(g_pcvar_givenades, szCache, sizeof szCache - 1)
        for (i=0; i<strlen(szCache);i++)
        {
                switch(szCache[i])
                {
                        case 'h': g_iGrenadeHE++
                        case 'f': g_iGrenadeFLASH++
                        case 's': g_iGrenadeSMOKE++
                }
        }
       
        for (i=0; i<sizeof g_szRoundStart; i++)        precache_sound(g_szRoundStart[i])
        for (i=0; i<sizeof g_szZombiePain;i++)        precache_sound(g_szZombiePain[i])
        for (i=0; i<sizeof g_szZombieDie;i++)        precache_sound(g_szZombieDie[i])
        for (i=0; i<sizeof g_szZombieIdle;i++)        precache_sound(g_szZombieIdle[i])
        for (i=0; i<sizeof g_szZombieHit;i++)        precache_sound(g_szZombieHit[i])
        for (i=0; i<sizeof g_szZombieMiss;i++)        precache_sound(g_szZombieMiss[i])
       
        precache_sound(WIN_ZOMBIES)
        precache_sound(WIN_BUILDERS)
        precache_sound(PHASE_BUILD)
        precache_sound(PHASE_PREP)
        precache_sound(LOCK_OBJECT)
        precache_sound(LOCK_FAIL)
        precache_sound(GRAB_START)
        precache_sound(GRAB_STOP)
        if (g_iInfectTime)
                precache_sound(INFECTION)
       
        i = create_entity("info_bomb_target");
        entity_set_origin(i, Float:{8192.0,8192.0,8192.0})
       
        i = create_entity("info_map_parameters");
        DispatchKeyValue(i, "buying", "3");
        DispatchKeyValue(i, "bombradius", "1");
        DispatchSpawn(i);
       
        g_zclass_name = ArrayCreate(32, 1)
        g_zclass_info = ArrayCreate(32, 1)
        g_zclass_modelsstart = ArrayCreate(1, 1)
        g_zclass_modelsend = ArrayCreate(1, 1)
        g_zclass_playermodel = ArrayCreate(32, 1)
        g_zclass_modelindex = ArrayCreate(1, 1)
        g_zclass_clawmodel = ArrayCreate(32, 1)
        g_zclass_hp = ArrayCreate(1, 1)
        g_zclass_spd = ArrayCreate(1, 1)
        g_zclass_grav = ArrayCreate(1, 1)
        g_zclass_admin = ArrayCreate(1, 1)
        g_zclass_level = ArrayCreate(1, 1)
        g_zclass_credits = ArrayCreate(1, 1)
       
        g_zclass2_realname = ArrayCreate(32, 1)
        g_zclass2_name = ArrayCreate(32, 1)
        g_zclass2_info = ArrayCreate(32, 1)
        g_zclass2_modelsstart = ArrayCreate(1, 1)
        g_zclass2_modelsend = ArrayCreate(1, 1)
        g_zclass2_playermodel = ArrayCreate(32, 1)
        g_zclass2_clawmodel = ArrayCreate(32, 1)
        g_zclass2_hp = ArrayCreate(1, 1)
        g_zclass2_spd = ArrayCreate(1, 1)
        g_zclass2_grav = ArrayCreate(1, 1)
        g_zclass2_admin = ArrayCreate(1, 1)
        g_zclass2_level = ArrayCreate(1, 1)
        g_zclass2_credits = ArrayCreate(1, 1)
        g_zclass_new = ArrayCreate(1, 1)
       
        g_boolArraysCreated = true
       
        return;
}

public plugin_cfg()
{
        g_boolArraysCreated = false
}

public plugin_init()
{
        if (!get_pcvar_num(g_pcvar_enabled))
                return;
               
        formatex(g_szModName, charsmax(g_szModName), "SH Base Builder %s", VERSION)
       
        register_clcmd("say",                    "cmdSay");
        register_clcmd("say_team",        "cmdSay");
       
        //Added for old users
        register_clcmd("+grab",                "cmdGrabEnt");
        register_clcmd("-grab",                "cmdStopEnt");
       
        register_clcmd("bb_lock",        "cmdLockBlock",0, " - Aim at a block to lock it");
        register_clcmd("bb_claim",        "cmdLockBlock",0, " - Aim at a block to lock it");
       
        register_clcmd("bb_buildban",        "cmdBuildBan",0, " <player>");
        register_clcmd("bb_unbuildban",        "cmdBuildBan",0, " <player>");
        register_clcmd("bb_bban",        "cmdBuildBan",0, " <player>");
       
        register_clcmd("bb_swap",        "cmdSwap",0, " <player>");
        register_clcmd("bb_revive",        "cmdRevive",0, " <player>");
        if (g_iGunsMenu) register_clcmd("bb_guns",        "cmdGuns",0, " <player>");
        register_clcmd("bb_startround",        "cmdStartRound",0, " - Starts the round");
       
        register_logevent("logevent_round_start",2,        "1=Round_Start")
        register_logevent("logevent_round_end", 2,        "1=Round_End")
       
        register_message(get_user_msgid("TextMsg"),        "msgRoundEnd")
        register_message(get_user_msgid("TextMsg"),        "msgSendAudio")
        register_message(get_user_msgid("StatusIcon"),        "msgStatusIcon");
        register_message(get_user_msgid("Health"),        "msgHealth");
        register_message(get_user_msgid("StatusValue"),        "msgStatusValue")
        register_message(get_user_msgid("TeamInfo"),        "msgTeamInfo");
       
        register_menucmd(register_menuid("ColorsSelect"),KEYS_GENERIC,"colors_pushed")
        register_menucmd(register_menuid("ZClassSelect"),KEYS_GENERIC,"zclass_pushed")
        if (g_iGunsMenu)
        {
                register_menucmd(register_menuid("WeaponMethodMenu"),(1<<0)|(1<<1)|(1<<2),"weapon_method_pushed")
                register_menucmd(register_menuid("PrimaryWeaponSelect"),KEYS_GENERIC,"prim_weapons_pushed")
                register_menucmd(register_menuid("SecWeaponSelect"),KEYS_GENERIC,"sec_weapons_pushed")
        }
       
        register_event("HLTV",                "ev_RoundStart", "a", "1=0", "2=0")
        register_event("AmmoX",                "ev_AmmoX",          "be", "1=1", "1=2", "1=3", "1=4", "1=5", "1=6", "1=7", "1=8", "1=9", "1=10")
        register_event("Health",          "ev_Health",          "be", "1>0");
        register_event("StatusValue",        "ev_SetTeam",          "be", "1=1");
        register_event("StatusValue",        "ev_ShowStatus", "be", "1=2", "2!0");
        register_event("StatusValue",        "ev_HideStatus", "be", "1=1", "2=0");

        RegisterHam(Ham_Touch,                "weapon_shield","ham_WeaponCleaner_Post", 1)
        RegisterHam(Ham_Touch,                "weaponbox",          "ham_WeaponCleaner_Post", 1)
        RegisterHam(Ham_Spawn,                "player",        "ham_PlayerSpawn_Post", 1)
        RegisterHam(Ham_TakeDamage,        "player",        "ham_TakeDamage")
        for (new i = 1; i < sizeof g_szWpnEntNames; i++)
                if (g_szWpnEntNames[i][0]) RegisterHam(Ham_Item_Deploy, g_szWpnEntNames[i], "ham_ItemDeploy_Post", 1)
       
        register_forward(FM_GetGameDescription,                "fw_GetGameDescription")
        register_forward(FM_SetClientKeyValue,                "fw_SetClientKeyValue")
        register_forward(FM_ClientUserInfoChanged,        "fw_ClientUserInfoChanged")
        register_forward(FM_CmdStart,                        "fw_CmdStart");
        register_forward(FM_PlayerPreThink,                "fw_PlayerPreThink")
        register_forward(FM_EmitSound,                        "fw_EmitSound")
        register_forward(FM_ClientKill,                        "fw_Suicide")
        if (g_iShowMovers)
                register_forward(FM_TraceLine,                "fw_Traceline")
       
        register_clcmd("drop", "clcmd_drop")
        register_clcmd("buy", "clcmd_buy")
       
        //Team Handlers
        register_clcmd("chooseteam",        "clcmd_changeteam")
        register_clcmd("jointeam",        "clcmd_changeteam")
        register_message(get_user_msgid("ShowMenu"), "message_show_menu")
        register_message(get_user_msgid("VGUIMenu"), "message_vgui_menu")
       
        set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET)
       
        g_iMaxPlayers = get_maxplayers()
        g_HudSync = CreateHudSyncObj();
        g_msgSayText = get_user_msgid("SayText")
        g_msgStatusText = get_user_msgid("StatusText");
       
        g_iEntBarrier = find_ent_by_tname( -1, "barrier" );
       
        //Custom Forwards
        g_fwRoundStart = CreateMultiForward("bb_round_started", ET_IGNORE)
        g_fwPrepStarted = CreateMultiForward("bb_prepphase_started", ET_IGNORE)
        g_fwBuildStarted = CreateMultiForward("bb_buildphase_started", ET_IGNORE)
        g_fwClassPicked = CreateMultiForward("bb_zombie_class_picked", ET_IGNORE, FP_CELL, FP_CELL)
        g_fwClassSet = CreateMultiForward("bb_zombie_class_set", ET_IGNORE, FP_CELL, FP_CELL)
        g_fwPushPull = CreateMultiForward("bb_block_pushpull", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
        g_fwGrabEnt_Pre = CreateMultiForward("bb_grab_pre", ET_IGNORE, FP_CELL, FP_CELL)
        g_fwGrabEnt_Post = CreateMultiForward("bb_grab_post", ET_IGNORE, FP_CELL, FP_CELL)
        g_fwDropEnt_Pre = CreateMultiForward("bb_drop_pre", ET_IGNORE, FP_CELL, FP_CELL)
        g_fwDropEnt_Post = CreateMultiForward("bb_drop_post", ET_IGNORE, FP_CELL, FP_CELL)
        g_fwNewColor = CreateMultiForward("bb_new_color", ET_IGNORE, FP_CELL, FP_CELL)
        g_fwLockEnt_Pre = CreateMultiForward("bb_lock_pre", ET_IGNORE, FP_CELL, FP_CELL)
        g_fwLockEnt_Post = CreateMultiForward("bb_lock_post", ET_IGNORE, FP_CELL, FP_CELL)
       
        register_dictionary("basebuilder.txt");
}

public plugin_natives()
{
        register_native("bb_register_zombie_class","native_register_zombie_class", 1)
       
        register_native("bb_get_class_cost","native_get_class_cost", 1)
        register_native("bb_get_user_zombie_class","native_get_user_zombie_class", 1)
        register_native("bb_get_user_next_class","native_get_user_next_class", 1)
        register_native("bb_set_user_zombie_class","native_set_user_zombie_class", 1)
       
       
        register_native("bb_is_user_zombie","native_is_user_zombie", 1)
        register_native("bb_is_user_banned","native_is_user_banned", 1)
       
        register_native("bb_is_build_phase","native_bool_buildphase", 1)
        register_native("bb_is_prep_phase","native_bool_prepphase", 1)
       
        register_native("bb_get_build_time","native_get_build_time", 1)
        register_native("bb_set_build_time","native_set_build_time", 1)
       
        register_native("bb_get_user_color","native_get_user_color", 1)
        register_native("bb_set_user_color","native_set_user_color", 1)
       
        register_native("bb_drop_user_block","native_drop_user_block", 1)
        register_native("bb_get_user_block","native_get_user_block", 1)
        register_native("bb_set_user_block","native_set_user_block", 1)
       
        register_native("bb_is_locked_block","native_is_locked_block", 1)
        register_native("bb_lock_block","native_lock_block", 1)
        register_native("bb_unlock_block","native_unlock_block", 1)
       
        register_native("bb_release_zombies","native_release_zombies", 1)
       
        register_native("bb_set_user_primary","native_set_user_primary", 1)
        register_native("bb_get_user_primary","native_get_user_primary", 1)
       
        register_native("bb_get_flags_build","native_get_flags_build", 1)
        register_native("bb_get_flags_lock","native_get_flags_lock", 1)
        register_native("bb_get_flags_lockafter","native_get_flags_lockafter", 1)
        register_native("bb_get_flags_buildban","native_get_flags_buildban", 1)
        register_native("bb_get_flags_swap","native_get_flags_swap", 1)
        register_native("bb_get_flags_revive","native_get_flags_revive", 1)
        register_native("bb_get_flags_guns","native_get_flags_guns", 1)
        register_native("bb_get_flags_release","native_get_flags_release", 1)
        register_native("bb_get_flags_override","native_get_flags_override", 1)
       
        //register_native("bb_set_user_mult","native_set_user_mult", 1)
       
        //ZP Natives Converted
        register_native("zp_register_zombie_class","native_register_zombie_class", 1)
        register_native("zp_get_user_zombie_class","native_get_user_zombie_class", 1)
        register_native("zp_get_user_next_class","native_get_user_next_class", 1)
        register_native("zp_set_user_zombie_class","native_set_user_zombie_class", 1)
        register_native("zp_get_user_zombie","native_is_user_zombie", 1)
}

public fw_GetGameDescription()
{
        forward_return(FMV_STRING, g_szModName)
        return FMRES_SUPERCEDE;
}

public client_putinserver(id)
{
        if (!is_user_connected(id))
                return PLUGIN_HANDLED;
               
        g_isConnected[id] = true
        g_isAlive[id] = false
        g_isZombie[id] = false
        g_isBuildBan[id] = false
        g_isCustomModel[id] = false
        g_boolFirstSpawn[id] = true
        g_boolFirstTeam[id] = false
        g_boolFirstTime[id] = true
        g_boolRepick[id] = true
       
        g_iZombieClass[id] = 0
        g_iNextClass[id] = g_iZombieClass[id]
        //for (new i = 0; i < 3; i++) g_fClassMultiplier[id][i] = 1.0
       
        set_task(7.0,"Respawn_Player",id+TASK_RESPAWN);
       
        return PLUGIN_CONTINUE;
}

public client_disconnect(id)
{
        if (g_iOwnedEnt[id])
                cmdStopEnt(id)

        g_isConnected[id] = false
        g_isAlive[id] = false
        g_isZombie[id] = false
        g_isBuildBan[id] = false
        g_isCustomModel[id] = false
        g_boolFirstSpawn[id] = false
        g_boolFirstTeam[id] = false
        g_boolFirstTime[id] = false
        g_boolRepick[id] = false
       
        g_iZombieClass[id] = 0
        g_iNextClass[id] = 0
        //for (new i = 0; i < 3; i++) g_fClassMultiplier[id][i] = 1.0
       
        g_iOwnedEntities[id] = 0
       
        remove_task(id+TASK_RESPAWN)
        remove_task(id+TASK_HEALTH)
        remove_task(id+TASK_IDLESOUND)
       
        for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
        {
                if (is_valid_ent(iEnt) && g_iLockBlocks && BlockLocker(iEnt) == id)
                {
                        UnlockBlock(iEnt)
                        set_pev(iEnt,pev_rendermode,kRenderNormal)
                               
                        UnsetLastMover(iEnt);
                        UnsetEntMover(iEnt);
                }
        }


public ev_RoundStart()
{
        remove_task(TASK_BUILD)
        remove_task(TASK_PREPTIME)
       
        arrayset(g_iOwnedEntities, 0, MAXPLAYERS+1)
        arrayset(g_iColor, 0, MAXPLAYERS+1)
        arrayset(g_iColorOwner, 0, MAX_COLORS)
        arrayset(g_boolRepick, true, MAXPLAYERS+1)
       
        g_boolRoundEnded = false
        g_boolCanBuild = true
        g_fRoundStartTime = get_gametime()
       
        if (g_iResetEnt)
        {
                new szClass[10], szTarget[7];
                for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
                {
                        if (is_valid_ent(iEnt))
                        {
                                entity_get_string(iEnt, EV_SZ_classname, szClass, 9);
                                entity_get_string(iEnt, EV_SZ_targetname, szTarget, 6);
                                if (!BlockLocker(iEnt) && iEnt != g_iEntBarrier && equal(szClass, "func_wall") && !equal(szTarget, "ignore"))
                                {
                                        set_pev(iEnt,pev_rendermode,kRenderNormal)
                                        engfunc( EngFunc_SetOrigin, iEnt, Float:{ 0.0, 0.0, 0.0 } );
                                       
                                        UnsetLastMover(iEnt);
                                        UnsetEntMover(iEnt);
                                }
                                else if (g_iLockBlocks && BlockLocker(iEnt))
                                {
                                        UnlockBlock(iEnt)
                                        set_pev(iEnt,pev_rendermode,kRenderNormal)
                                        engfunc( EngFunc_SetOrigin, iEnt, Float:{ 0.0, 0.0, 0.0 } );
                                       
                                        UnsetLastMover(iEnt);
                                        UnsetEntMover(iEnt);
                                }
                        }
                }
        }
}

public ev_AmmoX(id)
        set_pdata_int(id, AMMO_SLOT + read_data(1), 200, 5)

public ev_Health(taskid)
{

       
}

public msgStatusIcon(const iMsgId, const iMsgDest, const iPlayer)
{
        if(g_isAlive[iPlayer] && g_isConnected[iPlayer])
        {
                static szMsg[8]
                get_msg_arg_string(2, szMsg, 7)
   
                if(equal(szMsg, "buyzone"))
                {
                        set_pdata_int(iPlayer, OFFSET_BUYZONE, get_pdata_int(iPlayer, OFFSET_BUYZONE) & ~(1<<0))
                        return PLUGIN_HANDLED
                }
        }
        return PLUGIN_CONTINUE
}

public msgHealth(msgid, dest, id)
{
        if(!g_isAlive[id])
                return PLUGIN_CONTINUE;
       
        static hp;
        hp = get_msg_arg_int(1);
       
        if(hp > 255 && (hp % 256) == 0)
                set_msg_arg_int(1, ARG_BYTE, ++hp);
       
        return PLUGIN_CONTINUE;
}

public msgRoundEnd(const MsgId, const MsgDest, const MsgEntity)
{
        static Message[192]
        get_msg_arg_string(2, Message, 191)
       
        if (equal(Message, "#Terrorists_Win"))
        {
                g_boolRoundEnded = true
                set_hudmessage(255, 255, 255, -1.0, 0.40, 0, 6.0, 6.0, 0.1, 0.2, 1)
                show_hudmessage(0, "%L", LANG_SERVER, "WIN_ZOMBIE")
                set_msg_arg_string(2, "")
                client_cmd(0, "spk %s", WIN_ZOMBIES)
               
                return PLUGIN_HANDLED
        }
        else if (equal(Message, "#Target_Saved") || equal(Message, "#CTs_Win"))
        {
                g_boolRoundEnded = true
                set_hudmessage(255, 255, 255, -1.0, 0.40, 0, 6.0, 6.0, 0.1, 0.2, 1)
                show_hudmessage(0, "%L", LANG_SERVER, "WIN_BUILDER")
                set_msg_arg_string(2, "")
                client_cmd(0, "spk %s", WIN_BUILDERS)
               
                return PLUGIN_HANDLED
        }
        return PLUGIN_HANDLED
}

public msgSendAudio(const MsgId, const MsgDest, const MsgEntity)
{
        static szSound[17]
        get_msg_arg_string(2,szSound,16)
        if(equal(szSound[7], "terwin") || equal(szSound[7], "ctwin") || equal(szSound[7], "rounddraw")) return PLUGIN_HANDLED
        return PLUGIN_CONTINUE
}

public ham_WeaponCleaner_Post(iEnt)
{
        call_think(iEnt)
}

public ham_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
        if (!is_valid_ent(victim) || !g_isAlive[victim] || !is_user_connected(attacker))
                return HAM_IGNORED
               
        if(g_boolCanBuild || g_boolRoundEnded || g_boolPrepTime)
                return HAM_SUPERCEDE;
               
        if (victim == attacker)
                return HAM_SUPERCEDE;
               
        if (g_iSupercut)
        {
                damage*=99.0
        }
               
        SetHamParamFloat(4, damage)
        return HAM_HANDLED
}

public ham_ItemDeploy_Post(weapon_ent)
{
        static owner
        owner = get_pdata_cbase(weapon_ent, OFFSET_WPN_WIN, OFFSET_WPN_LINUX);

        static weaponid
        weaponid = cs_get_weapon_id(weapon_ent)
       
        if (g_isZombie[owner] && weaponid == CSW_KNIFE)
        {
                static szClawModel[100]
                ArrayGetString(g_zclass_clawmodel, g_iZombieClass[owner], szClawModel, charsmax(szClawModel))
                format(szClawModel, charsmax(szClawModel), "models/%s.mdl", szClawModel)
                entity_set_string( owner , EV_SZ_viewmodel , szClawModel ) 
                entity_set_string( owner , EV_SZ_weaponmodel , "" )
        }
       
        if (g_isZombie[owner] && !((1<<weaponid) & ZOMBIE_ALLOWED_WEAPONS_BITSUM))
        {
                engclient_cmd(owner, "weapon_knife")
        }
        else if (g_boolCanBuild)
        {
                engclient_cmd(owner, "weapon_knife")
                client_print(owner, print_center, "%L", LANG_SERVER, "FAIL_KNIFE");
        }
}

public logevent_round_start()
{
        set_pev(g_iEntBarrier,pev_solid,SOLID_BSP)
        set_pev(g_iEntBarrier,pev_rendermode,kRenderTransColor)
        set_pev(g_iEntBarrier,pev_rendercolor, Float:{ BARRIER_COLOR })
        set_pev(g_iEntBarrier,pev_renderamt, Float:{ BARRIER_RENDERAMT })
       
        print_color(0, "^x04[ NXK Base Builder %s ]", VERSION);
        print_color(0, "^x03 %L", LANG_SERVER, "ROUND_MESSAGE");

        client_cmd(0, "spk %s", PHASE_BUILD)
       
        remove_task(TASK_BUILD)
        set_task(1.0, "task_CountDown", TASK_BUILD,_, _, "a", g_iBuildTime);
        g_iCountDown = (g_iBuildTime-1);
       
        ExecuteForward(g_fwBuildStarted, g_fwDummyResult);
}

public task_CountDown()
{
        g_iCountDown--
        new mins = g_iCountDown/60, secs = g_iCountDown%60
        if (g_iCountDown>=0)
        {
                set_dhudmessage(255, 205, 80, -1.0, 0.25, 0, 6.0, 0.001, 0.1, 1.0, false);
                show_dhudmessage(0, " %L : %d:%s%d ", LANG_SERVER, "BUILD_TIMER", mins, (secs < 10 ? "0" : ""), secs);
        }
        else
        {
                if (g_iPrepTime)
                {
                        g_boolCanBuild = false
                        g_boolPrepTime = true
                        g_iCountDown = g_iPrepTime+1
                        set_task(1.0, "task_PrepTime", TASK_PREPTIME,_, _, "a", g_iCountDown);
                       
                        set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
                        show_hudmessage(0, "%L", LANG_SERVER, "PREP_ANNOUNCE");
                       
                        new players[32], num
                        get_players(players, num)
                        for (new i = 0; i < num; i++)
                        {
                                if (g_isAlive[players[i]] && !g_isZombie[players[i]])
                                {
                                        ExecuteHamB(Ham_CS_RoundRespawn, players[i])
                                       
                                        if (g_iOwnedEnt[players[i]])
                                                cmdStopEnt(players[i])
                                }
                        }
                        print_color(0, "%s^x04 %L", MODNAME, LANG_SERVER, "PREP_ANNOUNCE")
                       
                        client_cmd(0, "spk %s", PHASE_PREP)
                       
                        ExecuteForward(g_fwPrepStarted, g_fwDummyResult);
                }
                else
                        Release_Zombies()

                remove_task(TASK_BUILD);
                return PLUGIN_HANDLED;
        }
       
        new szTimer[32]
        if (g_iCountDown>10)
        {
                if (mins && !secs) num_to_word(mins, szTimer, 31)
                else if (!mins && secs == 30) num_to_word(secs, szTimer, 31)
                else return PLUGIN_HANDLED;
               
                client_cmd(0, "spk ^"fvox/%s %s remaining^"", szTimer, (mins ? "minutes" : "seconds"))
        }
        else
        {
                num_to_word(g_iCountDown, szTimer, 31)
                client_cmd(0, "spk ^"fvox/%s^"", szTimer)
        }
        return PLUGIN_CONTINUE;
}

public task_PrepTime()
{
        g_iCountDown--
       
        if (g_iCountDown>=0)
        {
                set_dhudmessage(255, 205, 80, -1.0, 0.25, 0, 6.0, 0.001, 0.1, 1.0, false);
                show_dhudmessage(0, " %L : 0:%s%d ", LANG_SERVER, "PREP_TIMER", (g_iCountDown < 10 ? "0" : ""), g_iCountDown);
        }
       
        if (0<g_iCountDown<11)
        {
                new szTimer[32]
                num_to_word(g_iCountDown, szTimer, 31)
                client_cmd(0, "spk ^"fvox/%s^"", szTimer)
        }
        else if (g_iCountDown == 0)
        {
                Release_Zombies()
                remove_task(TASK_PREPTIME);
                return PLUGIN_HANDLED
        }
       
        return PLUGIN_CONTINUE;
}

public logevent_round_end()
{
        if (g_boolRoundEnded)
        {
                new players[32], num, player
                get_players(players, num)
                for (new i = 0; i < num; i++)
                {
                        player = players[i]
                       
                        if (g_iCurTeam[player] == g_iTeam[player] )
                                cs_set_user_team(player, (g_iTeam[player] = (g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T)))
                        else
                                g_iTeam[player] = g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T
                }
                print_color(0, "%s^x04 %L", MODNAME, LANG_SERVER, "SWAP_ANNOUNCE")
        }
        remove_task(TASK_BUILD)       
        return PLUGIN_HANDLED
}

public client_death(g_attacker, g_victim, wpnindex, hitplace, TK)
{
        if (is_user_alive(g_victim))
                return PLUGIN_HANDLED;
       
        remove_task(g_victim+TASK_IDLESOUND)
       
        g_isAlive[g_victim] = false;
       
        if (TK == 0 && g_attacker != g_victim && g_isZombie[g_attacker])
        {
                client_cmd(0, "spk %s", INFECTION)
                new szPlayerName[32]
                get_user_name(g_victim, szPlayerName, 31)
                set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 5.0, 0.1, 0.2, 1)
                show_hudmessage(0, "%L", LANG_SERVER, "INFECT_ANNOUNCE", szPlayerName);
        }
       
        set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
        if (g_isZombie[g_victim])
        {
                show_hudmessage(g_victim, "%L", LANG_SERVER, "DEATH_ZOMBIE", g_iZombieTime);
                set_task(float(g_iZombieTime), "Respawn_Player", g_victim+TASK_RESPAWN)
        }
        else if (g_iInfectTime)
        {
                show_hudmessage(g_victim, "%L", LANG_SERVER, "DEATH_HUMAN", g_iInfectTime);
                cs_set_user_team(g_victim, CS_TEAM_T)
                g_isZombie[g_victim] = true
                set_task(float(g_iInfectTime), "Respawn_Player", g_victim+TASK_RESPAWN)
        }
       
        return PLUGIN_CONTINUE;
}

public Respawn_Player(id)
{
        id-=TASK_RESPAWN
       
        if (!is_user_connected(id))
                return PLUGIN_HANDLED
       
        if (((g_boolCanBuild || g_boolPrepTime) && cs_get_user_team(id) == CS_TEAM_CT) || cs_get_user_team(id) == CS_TEAM_T)
        {
                ExecuteHamB(Ham_CS_RoundRespawn, id)
               
                //Loop the task until they have successfully spawned
                if (!g_isAlive[id])
                        set_task(3.0,"Respawn_Human",id+TASK_RESPAWN)
        }
        return PLUGIN_HANDLED
}

public ham_PlayerSpawn_Post(id)
{
        if (is_user_alive(id))
        {
                g_isAlive[id] = true;
               
                g_isZombie[id] = (cs_get_user_team(id) == CS_TEAM_T ? true : false)
               
                remove_task(id + TASK_RESPAWN)
                remove_task(id + TASK_MODELSET)
                remove_task(id + TASK_IDLESOUND)
                if (g_isZombie[id])
                {
                        if (g_boolFirstSpawn[id])
                        {
                                print_color(id, "This server is running Base Builder v%s by NXK", VERSION);
                                show_zclass_menu(id, 0)
                                g_boolFirstSpawn[id] = false
                        }
                       
                        if (g_iNextClass[id] != g_iZombieClass[id])
                                g_iZombieClass[id] = g_iNextClass[id]

                        set_pev(id, pev_health, float(ArrayGetCell(g_zclass_hp, g_iZombieClass[id]))/**g_fClassMultiplier[id][ATT_HEALTH]*/)
                        set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_iZombieClass[id])/**g_fClassMultiplier[id][ATT_GRAVITY]*/)
                        g_fPlayerSpeed[id] = float(ArrayGetCell(g_zclass_spd, g_iZombieClass[id]))/**g_fClassMultiplier[id][ATT_SPEED]*/
                               
                        //Handles the knife and claw model
                        strip_user_weapons(id)
                        give_item(id, "weapon_knife")
                                                       
                        static szClawModel[100]
                        ArrayGetString(g_zclass_clawmodel, g_iZombieClass[id], szClawModel, charsmax(szClawModel))
                        format(szClawModel, charsmax(szClawModel), "models/%s.mdl", szClawModel)
                        entity_set_string( id , EV_SZ_viewmodel , szClawModel ) 
                        entity_set_string( id , EV_SZ_weaponmodel , "" )
                                               
                        ArrayGetString(g_zclass_name, g_iZombieClass[id], g_szPlayerClass[id], charsmax(g_szPlayerClass[]))
                       
                        set_task(random_float(60.0, 360.0), "task_ZombieIdle", id+TASK_IDLESOUND, _, _, "b")

                        ArrayGetString(g_zclass_playermodel, g_iZombieClass[id], g_szPlayerModel[id], charsmax(g_szPlayerModel[]))
                        new szCurrentModel[32]
                        fm_get_user_model(id, szCurrentModel, charsmax(szCurrentModel))
                        if (!equal(szCurrentModel, g_szPlayerModel[id]))
                        {
                                if (get_gametime() - g_fRoundStartTime < 5.0)
                                        set_task(5.0 * MODELCHANGE_DELAY, "fm_user_model_update", id + TASK_MODELSET)
                                else
                                        fm_user_model_update(id + TASK_MODELSET)
                        }
                       
                        ExecuteForward(g_fwClassSet, g_fwDummyResult, id, g_iZombieClass[id]);
                }
                else if (g_isCustomModel[id])
                {
                        fm_reset_user_model(id)
                }
               
                if (!g_isZombie[id])
                {
                        entity_set_string( id , EV_SZ_viewmodel , "models/v_knife.mdl" ) 
                       
                        if (((/*g_boolPrepTime && */g_iPrepTime && !g_boolCanBuild) || (g_boolCanBuild && !g_iPrepTime)) && g_iGunsMenu)
                        {
                                //if (is_credits_active())
                                #if defined BB_CREDITS
                                        credits_show_gunsmenu(id)
                                #else
                                        show_method_menu(id)
                                #endif
                        }
                               
                        if (!g_iColor[id])
                        {
                                new i = random(MAX_COLORS)
                                if (g_iColorMode)
                                {
                                        while (g_iColorOwner[i])
                                        {
                                                i = random(MAX_COLORS)
                                        }
                                }
                                print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_PICKED", g_szColorName[i]);
                                g_iColor[id] = i
                                g_iColorOwner[i] = id

                                if (g_iOwnedEnt[id])
                                {
                                        set_pev(g_iOwnedEnt[id],pev_rendercolor, g_fColor[g_iColor[id]] )
                                        set_pev(g_iOwnedEnt[id],pev_renderamt, g_fRenderAmt[g_iColor[id]] )
                                }
                        }
                }
               
                ev_Health(id)
        }
}

public task_ZombieIdle(taskid)
{
        taskid-=TASK_IDLESOUND
        if (g_isAlive[taskid] && g_isConnected[taskid] && !g_isZombie[taskid])
                emit_sound(taskid, CHAN_VOICE, g_szZombieIdle[random(sizeof g_szZombieIdle - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
}

public fw_SetClientKeyValue(id, const infobuffer[], const key[])

        if (g_isCustomModel[id] && equal(key, "model"))
                return FMRES_SUPERCEDE
        return FMRES_IGNORED
}

public fw_ClientUserInfoChanged(id)
{
        if (!g_isCustomModel[id])
                return FMRES_IGNORED
        static szCurrentModel[32]
        fm_get_user_model(id, szCurrentModel, charsmax(szCurrentModel))
        if (!equal(szCurrentModel, g_szPlayerModel[id]) && !task_exists(id + TASK_MODELSET))
                fm_set_user_model(id + TASK_MODELSET)
        return FMRES_IGNORED
}

public fm_user_model_update(taskid)
{
        static Float:fCurTime
        fCurTime = get_gametime()
       
        if (fCurTime - g_fModelsTargetTime >= MODELCHANGE_DELAY)
        {
                fm_set_user_model(taskid)
                g_fModelsTargetTime = fCurTime
        }
        else
        {
                set_task((g_fModelsTargetTime + MODELCHANGE_DELAY) - fCurTime, "fm_set_user_model", taskid)
                g_fModelsTargetTime += MODELCHANGE_DELAY
        }
}

public fm_set_user_model(player)
{
        player -= TASK_MODELSET
        engfunc(EngFunc_SetClientKeyValue, player, engfunc(EngFunc_GetInfoKeyBuffer, player), "model", g_szPlayerModel[player])
        g_isCustomModel[player] = true
}

stock fm_get_user_model(player, model[], len)
{
        engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, player), "model", model, len)
}

stock fm_reset_user_model(player)
{
        g_isCustomModel[player] = false
        dllfunc(DLLFunc_ClientUserInfoChanged, player, engfunc(EngFunc_GetInfoKeyBuffer, player))
}

public message_show_menu(msgid, dest, id)
{
        if (!(!get_user_team(id) && !is_user_bot(id) && !access(id, ADMIN_IMMUNITY)))
                return PLUGIN_CONTINUE

        static team_select[] = "#Team_Select"
        static menu_text_code[sizeof team_select]
        get_msg_arg_string(4, menu_text_code, sizeof menu_text_code - 1)
        if (!equal(menu_text_code, team_select))
                return PLUGIN_CONTINUE

        static param_menu_msgid[2]
        param_menu_msgid[0] = msgid
        set_task(AUTO_TEAM_JOIN_DELAY, "task_force_team_join", id, param_menu_msgid, sizeof param_menu_msgid)

        return PLUGIN_HANDLED
}

public message_vgui_menu(msgid, dest, id)
{
        if (get_msg_arg_int(1) != TEAM_SELECT_VGUI_MENU_ID || !(!get_user_team(id) && !is_user_bot(id) && !access(id, ADMIN_IMMUNITY)))//
                return PLUGIN_CONTINUE
               
        static param_menu_msgid[2]
        param_menu_msgid[0] = msgid
        set_task(AUTO_TEAM_JOIN_DELAY, "task_force_team_join", id, param_menu_msgid, sizeof param_menu_msgid)

        return PLUGIN_HANDLED
}

public task_force_team_join(menu_msgid[], id)
{
        if (get_user_team(id))
                return

        static msg_block
        msg_block = get_msg_block(menu_msgid[0])
        set_msg_block(menu_msgid[0], BLOCK_SET)
        engclient_cmd(id, "jointeam", "5")
        engclient_cmd(id, "joinclass", "5")
        set_msg_block(menu_msgid[0], msg_block)
}

public msgTeamInfo(msgid, dest)
{
        if (dest != MSG_ALL && dest != MSG_BROADCAST)
                return;
       
        static id, team[2]
        id = get_msg_arg_int(1)

        get_msg_arg_string(2, team, charsmax(team))
        switch (team[0])
        {
                case 'T' : // TERRORIST
                {
                        g_iCurTeam[id] = CS_TEAM_T;
                }
                case 'C' : // CT
                {
                        g_iCurTeam[id] = CS_TEAM_CT;
                }
                case 'S' : // SPECTATOR
                {
                        g_iCurTeam[id] = CS_TEAM_SPECTATOR;
                }
                default : g_iCurTeam[id] = CS_TEAM_UNASSIGNED;
        }
        if (!g_boolFirstTeam[id])
        {
                g_boolFirstTeam[id] = true
                g_iTeam[id] = g_iCurTeam[id]
        }
}

public clcmd_changeteam(id)
{
        static CsTeams:team
        team = cs_get_user_team(id)
       
        if (team == CS_TEAM_SPECTATOR || team == CS_TEAM_UNASSIGNED)
                return PLUGIN_CONTINUE;

        show_zclass_menu(id, 0)
        return PLUGIN_HANDLED;
}

public clcmd_drop(id)
{
        client_print (id, print_center, "%L", LANG_SERVER, "FAIL_DROP")
        return PLUGIN_HANDLED
}

public clcmd_buy(id)
{
        client_print (id, print_center, "%L", LANG_SERVER, "FAIL_BUY")
        return PLUGIN_HANDLED
}

public msgStatusValue()
        set_msg_block(g_msgStatusText, BLOCK_SET);

public ev_SetTeam(id)
        g_iFriend[id] = read_data(2)

public ev_ShowStatus(id) //called when id looks at someone
{
        new szName[32], pid = read_data(2);
        get_user_name(pid, szName, 31);

        if (g_iFriend[id] == 1)        // friend
        {
                new clip, ammo, wpnid = get_user_weapon(pid, clip, ammo), szWpnName[32];

                if (wpnid)
                        xmod_get_wpnname(wpnid, szWpnName, 31);

                set_hudmessage(0, 225, 0, -1.0, HUD_FRIEND_HEIGHT, 1, 0.01, 3.0, 0.01, 0.01);
                new nLen, szStatus[512]
                if (!g_isZombie[pid])
                        nLen += format( szStatus[nLen], 511-nLen, "%s^nHealth: %d | Weapon: %s^nColor: %s", szName, pev(pid, pev_health), szWpnName, g_szColorName[g_iColor[pid]]);
                else
                {
                        nLen += format( szStatus[nLen], 511-nLen, "%s^nClass: %s^nHealth: %d", szName, g_szPlayerClass[pid], pev(pid, pev_health));
                       
                        /*if (is_credits_active())
                        {
                                nLen += format( szStatus[nLen], 511-nLen, "^n^nClass Multipliers:", szName, g_szPlayerClass[pid], pev(pid, pev_health));
                                nLen += format( szStatus[nLen], 511-nLen, "^nHealth: %f", g_fClassMultiplier[pid][ATT_HEALTH]);
                                nLen += format( szStatus[nLen], 511-nLen, "^nSpeed: %f", g_fClassMultiplier[pid][ATT_SPEED]);
                                nLen += format( szStatus[nLen], 511-nLen, "^nGravity: %f", g_fClassMultiplier[pid][ATT_GRAVITY]);
                        }*/
                }
                ShowSyncHudMsg(id, g_HudSync, szStatus);
        }
        if (g_iFriend[id] != 1) //enemy
        {
                set_hudmessage(225, 0, 0, -1.0, HUD_FRIEND_HEIGHT, 1, 0.01, 3.0, 0.01, 0.01);
                if (g_isZombie[pid])
                        ShowSyncHudMsg(id, g_HudSync, "%s", szName);
                else
                        ShowSyncHudMsg(id, g_HudSync, "%s^nColor: %s", szName, g_szColorName[g_iColor[pid]]);
        }
}

public ev_HideStatus(id)
        ClearSyncHud(id, g_HudSync);

public cmdSay(id)
{
        if (!g_isConnected[id])
                return PLUGIN_HANDLED;

        new szMessage[32]
        read_args(szMessage, charsmax(szMessage));
        remove_quotes(szMessage);
               
        if(szMessage[0] == '/')
        {
                if (equali(szMessage, "/commands") == 1 || equali(szMessage, "/cmd")  == 1 )
                {
                        print_color(id, "%s /class, /respawn, /random, /mycolor%s%s%s", MODNAME, (g_iColorMode ? ", /whois <color>": ""), (g_iColorMode != 2 ? ", /colors":""), (access(id, FLAGS_LOCK) ? ", /lock":"")  );
                }
                else if (equali(szMessage, "/class") == 1)
                {
                        show_zclass_menu(id, 0)
                }
                else if (equali(szMessage, "/respawn") == 1 || equali(szMessage, "/revive")  == 1 || equali(szMessage, "/fixspawn")  == 1)
                {
                        if (g_boolCanBuild && !g_isZombie[id])
                                ExecuteHamB(Ham_CS_RoundRespawn, id)
                        else if (g_isZombie[id])
                        {
                                if (pev(id, pev_health) == float(ArrayGetCell(g_zclass_hp, g_iZombieClass[id])) || !is_user_alive(id))
                                        ExecuteHamB(Ham_CS_RoundRespawn, id)
                                else
                                        client_print(id, print_center, "%L", LANG_SERVER, "FAIL_SPAWN");
                        }
                }
                else if (equali(szMessage, "/lock") == 1 || equali(szMessage, "/claim") == 1 && g_isAlive[id])
                {
                        if (access(id, FLAGS_LOCK))
                                cmdLockBlock(id)
                        else
                                client_print(id, print_center, "%L", LANG_SERVER, "FAIL_ACCESS");
                        return PLUGIN_HANDLED;
                }
                else if (equal(szMessage, "/whois",6) && g_iColorMode)
                {
                        for ( new i=0; i<MAX_COLORS; i++)
                        {
                                if (equali(szMessage[7], g_szColorName[i]) == 1)
                                {
                                        if (g_iColorOwner[i])
                                        {
                                                new szPlayerName[32]
                                                get_user_name(g_iColorOwner[i], szPlayerName, 31)
                                                print_color(id, "%s^x04 %s^x01's color is^x04 %s", MODNAME, szPlayerName, g_szColorName[i]);
                                        }
                                        else
                                                print_color(id, "%s %L^x04 %s", MODNAME, LANG_SERVER, "COLOR_NONE", g_szColorName[i]);
                                               
                                        break;
                                }
                        }
                }
                else if (equali(szMessage, "/colors") == 1 && !g_isZombie[id] && g_boolCanBuild && g_iColorMode != 2)
                {
                        show_colors_menu(id, 0)
                }
                else if (equali(szMessage, "/mycolor") == 1 && !g_isZombie[id])
                {
                        print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_YOURS", g_szColorName[g_iColor[id]]);
                        return PLUGIN_HANDLED
                }
                else if (equali(szMessage, "/random") == 1 && !g_isZombie[id] && g_boolCanBuild)
                {
                        new i = random(MAX_COLORS)
                        if (g_iColorMode)
                        {
                                while (g_iColorOwner[i])
                                {
                                        i = random(MAX_COLORS)
                                }
                        }
                        print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_RANDOM", g_szColorName[i]);
                        g_iColorOwner[g_iColor[id]] = 0
                        g_iColor[id] = i
                        g_iColorOwner[i] = id
                       
                        for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
                        {
                                if (is_valid_ent(iEnt) && g_iLockBlocks && BlockLocker(iEnt) == id)
                                        set_pev(iEnt,pev_rendercolor,g_fColor[g_iColor[id]])
                        }
                       
                        ExecuteForward(g_fwNewColor, g_fwDummyResult, id, g_iColor[id]);
                }
                else if (equali(szMessage, "/guns", 5) && g_iGunsMenu)
                {
                        if(!g_isAlive[id] || g_isZombie[id])
                                return PLUGIN_HANDLED
                               
                        if (access(id, FLAGS_GUNS))
                        {
                                new player = cmd_target(id, szMessage[6], 0)
                       
                                if (!player)
                                {
                                        //if (is_credits_active())
                                        #if defined BB_CREDITS
                                                credits_show_gunsmenu(id)
                                        #else
                                                show_method_menu(id)
                                        #endif
                                        return PLUGIN_CONTINUE
                                }
                               
                                cmdGuns(id, player)
                                return PLUGIN_HANDLED;
                        }
                        else
                        {
                                if(!g_boolCanBuild || !g_boolRepick[id])
                                        return PLUGIN_HANDLED       
               
                                //if (is_credits_active())
                                #if defined BB_CREDITS
                                        credits_show_gunsmenu(id)
                                #else
                                        show_method_menu(id)
                                #endif
                                return PLUGIN_HANDLED
                        }
                }
                else if (equal(szMessage, "/swap",5) && access(id, FLAGS_SWAP))
                {
                        new player = cmd_target(id, szMessage[6], 0)
               
                        if (!player)
                        {
                                print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
                                return PLUGIN_CONTINUE
                        }
                       
                        cmdSwap(id, player)
                        ExecuteHamB(Ham_CS_RoundRespawn, player)
                }
                else if (equal(szMessage, "/revive",7) && access(id, FLAGS_REVIVE))
                {
                        new player = cmd_target(id, szMessage[8], 0)
               
                        if (!player)
                        {
                                print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
                                return PLUGIN_CONTINUE
                        }
                       
                        cmdRevive(id, player)
                }
                else if (equal(szMessage, "/ban",4) && access(id, FLAGS_BUILDBAN))
                {
                        new player = cmd_target(id, szMessage[5], 0)
               
                        if (!player)
                        {
                                print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
                                return PLUGIN_CONTINUE
                        }
                       
                        cmdBuildBan(id, player)
                }
                else if (equal(szMessage, "/releasezombies",5) && access(id, FLAGS_RELEASE))
                {
                        cmdStartRound(id)
                }
        }
        return PLUGIN_CONTINUE
}

public cmdSwap(id, target)
{
        if (access(id, FLAGS_SWAP))
        {
                new player
               
                if (target) player = target
                else
                {
                        new arg[32]
                        read_argv(1, arg, 31)
                        player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
                }

                if (!player || !is_user_connected(player))
                        return client_print(id, print_console, "Base Builder %L", LANG_SERVER, "FAIL_NAME");
                       
                cs_set_user_team(player,( g_iTeam[player] = g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T))
                       
                if (is_user_alive(player))
                        ExecuteHamB(Ham_CS_RoundRespawn, player)
               
                new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
                get_user_name(id,szAdminName,31)
                get_user_authid (id,szAdminAuthid,31)
                get_user_name(player, szPlayerName, 31)
                get_user_authid (player,szPlayerID,31)
               
                client_print(id, print_console, "[Base Builder] Player %s was swapped from the %s team to the %s team", szPlayerName, g_iTeam[player] == CS_TEAM_CT ? "zombie":"builder", g_iTeam[player] == CS_TEAM_CT ? "builder":"zombie")
                Log("[SWAP] Admin: %s || SteamID: %s swapped Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
               
                set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
                show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_SWAP");
               
                print_color(0, "%s Player^x04 %s^x01 has been^x04 swapped^x01 to the^x04 %s^x01 team", MODNAME, szPlayerName, g_iTeam[player] == CS_TEAM_CT ? "builder":"zombie")
        }
        return PLUGIN_HANDLED       
}

public cmdRevive(id, target)
{
        if (access(id, FLAGS_REVIVE))
        {
                new player
                if (target) player = target
                else
                {
                        new arg[32]
                        read_argv(1, arg, 31)
                        player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
                }

                if (!player || !is_user_connected(player))
                        return client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_NAME");
                       
                ExecuteHamB(Ham_CS_RoundRespawn, player)
               
                new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
                get_user_name(id,szAdminName,31)
                get_user_authid (id,szAdminAuthid,31)
                get_user_name(player, szPlayerName, 31)
                get_user_authid (player,szPlayerID,31)
               
                client_print(id, print_console, "[Base Builder] Player %s has been^x04 revived", szPlayerName)
                Log("[REVIVE] Admin: %s || SteamID: %s revived Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
               
                set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
                show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_REVIVE");
               
                print_color(0, "%s Player^x04 %s^x01 has been^x04 revived^x01 by an admin", MODNAME, szPlayerName)
        }
        return PLUGIN_HANDLED       
}

public cmdGuns(id, target)
{
        if (access(id, FLAGS_GUNS))
        {
                new player
                if (target) player = target
                else
                {
                        new arg[32]
                        read_argv(1, arg, 31)
                        player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
                }
               
                if (!player || !is_user_connected(player))
                {
                        client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_NAME");
                        return PLUGIN_HANDLED;
                }
               
                if (g_isZombie[player])
                {
                        return PLUGIN_HANDLED;
                }
               
                if (!g_isAlive[player])
                {
                        client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_DEAD");
                        return PLUGIN_HANDLED;
                }

                //if (is_credits_active())
                #if defined BB_CREDITS
                        credits_show_gunsmenu(player)
                #else
                        show_method_menu(player)
                #endif
               
                new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
                get_user_name(id,szAdminName,31)
                get_user_authid (id,szAdminAuthid,31)
                get_user_name(player, szPlayerName, 31)
                get_user_authid (player,szPlayerID,31)
               
                client_print(id, print_console, "[Base Builder] Player %s has had his weapons menu re-opened", szPlayerName);
                Log("[GUNS] Admin: %s || SteamID: %s opened the guns menu for Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID);
               
                set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
                show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_GUNS");
               
                print_color(0, "%s Player^x04 %s^x01 has had their^x04 guns^x01 menu^x04 re-opened", MODNAME, szPlayerName)
        }
        return PLUGIN_HANDLED       
}

public cmdStartRound(id)
{
        if (access(id, FLAGS_RELEASE))
        {
                native_release_zombies()
        }
}

public Release_Zombies()
{
        g_boolCanBuild = false
        remove_task(TASK_BUILD);
       
        g_boolPrepTime = false
        remove_task(TASK_PREPTIME);
       
        new players[32], num, player, szWeapon[32]
        get_players(players, num, "a")
        for(new i = 0; i < num; i++)
        {
                player = players[i]

                if (!g_isZombie[player])
                {
                        if (g_iOwnedEnt[player])
                                cmdStopEnt(player)

                        if(g_iGrenadeHE                ) give_item(player,"weapon_hegrenade"        ), cs_set_user_bpammo(player,CSW_HEGRENADE,        g_iGrenadeHE)
                        if(g_iGrenadeFLASH        ) give_item(player,"weapon_flashbang"        ), cs_set_user_bpammo(player,CSW_FLASHBANG,        g_iGrenadeFLASH)
                        if(g_iGrenadeSMOKE        ) give_item(player,"weapon_smokegrenade"        ), cs_set_user_bpammo(player,CSW_SMOKEGRENADE,        g_iGrenadeSMOKE)

                        if (g_iPrimaryWeapon[player])
                        {
                                get_weaponname(g_iPrimaryWeapon[player],szWeapon,sizeof szWeapon - 1)
                                engclient_cmd(player, szWeapon);
                        }
                }
        }
                       
        set_pev(g_iEntBarrier,pev_solid,SOLID_NOT)
        set_pev(g_iEntBarrier,pev_renderamt,Float:{ 0.0 })
       
        set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
        show_hudmessage(0, "%L", LANG_SERVER, "RELEASE_ANNOUNCE");
        client_cmd(0, "spk %s", g_szRoundStart[ random( sizeof g_szRoundStart ) ] )
       
        ExecuteForward(g_fwRoundStart, g_fwDummyResult);
}

public fw_CmdStart( id, uc_handle, randseed )
{
        if (!g_isConnected[id] || !g_isAlive[id])
                return FMRES_IGNORED

        //new button = pev(id, pev_button)
        new button = get_uc( uc_handle , UC_Buttons );
        new oldbutton = pev(id, pev_oldbuttons)

        if( button & IN_USE && !(oldbutton & IN_USE) && !g_iOwnedEnt[id])
                cmdGrabEnt(id)
        else if( oldbutton & IN_USE && !(button & IN_USE) && g_iOwnedEnt[id])
                cmdStopEnt(id)

        return FMRES_IGNORED;
}

public cmdGrabEnt(id)
{
        if (g_fBuildDelay[id] + BUILD_DELAY > get_gametime())
        {
                g_fBuildDelay[id] = get_gametime()
                client_print (id, print_center, "%L", LANG_SERVER, "BUILD_SPAM")
                return PLUGIN_HANDLED
        }
        else
                g_fBuildDelay[id] = get_gametime()

        if (g_isBuildBan[id])
        {
                client_print (id, print_center, "%L", LANG_SERVER, "BUILD_BANNED")
                client_cmd(id, "spk %s", LOCK_FAIL);
                return PLUGIN_HANDLED;
        }
       
        if (g_isZombie[id] && !access(id, FLAGS_OVERRIDE))
                return PLUGIN_HANDLED
               
        if (!g_boolCanBuild && !access(id, FLAGS_BUILD) && !access(id, FLAGS_OVERRIDE))
        {
                client_print (id, print_center, "%L", LANG_SERVER, "BUILD_NOTIME")
                return PLUGIN_HANDLED
        }
       
        if (g_iOwnedEnt[id] && is_valid_ent(g_iOwnedEnt[id]))
                cmdStopEnt(id)
       
        new ent, bodypart
        get_user_aiming (id,ent,bodypart)
       
        if (!is_valid_ent(ent) || ent == g_iEntBarrier || is_user_alive(ent) || IsMovingEnt(ent))
                return PLUGIN_HANDLED;
       
        if ((BlockLocker(ent) && BlockLocker(ent) != id) || (BlockLocker(ent) && !access(id, FLAGS_OVERRIDE)))
                return PLUGIN_HANDLED;
       
        new szClass[10], szTarget[7];
        entity_get_string(ent, EV_SZ_classname, szClass, 9);
        entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
        if (!equal(szClass, "func_wall") || equal(szTarget, "ignore"))
                return PLUGIN_HANDLED;
               
        ExecuteForward(g_fwGrabEnt_Pre, g_fwDummyResult, id, ent);

        new Float:fOrigin[3], iAiming[3], Float:fAiming[3]
       
        get_user_origin(id, iAiming, 3);
        IVecFVec(iAiming, fAiming);
        entity_get_vector(ent, EV_VEC_origin, fOrigin);

        g_fOffset1[id] = fOrigin[0] - fAiming[0];
        g_fOffset2[id] = fOrigin[1] - fAiming[1];
        g_fOffset3[id] = fOrigin[2] - fAiming[2];
       
        g_fEntDist[id] = get_user_aiming(id, ent, bodypart);
               
        if (g_fEntMinDist)
        {
                if (g_fEntDist[id] < g_fEntMinDist)
                        g_fEntDist[id] = g_fEntSetDist;
        }
        else if (g_fEntMaxDist)
        {
                if (g_fEntDist[id] > g_fEntMaxDist)
                        return PLUGIN_HANDLED
        }

        set_pev(ent,pev_rendermode,kRenderTransColor)
        set_pev(ent,pev_rendercolor, g_fColor[g_iColor[id]] )
        set_pev(ent,pev_renderamt, g_fRenderAmt[g_iColor[id]] )
               
        MovingEnt(ent);
        SetEntMover(ent, id);
        g_iOwnedEnt[id] = ent

        //Checked after object is successfully grabbed
        if (!g_boolCanBuild && (access(id, FLAGS_BUILD) || access(id, FLAGS_OVERRIDE)))
        {
                new adminauthid[32],adminname[32]
                get_user_authid (id,adminauthid,31)
                get_user_name(id,adminname,31)
                Log("[MOVE] Admin: %s || SteamID: %s moved an entity", adminname, adminauthid)
        }
       
        client_cmd(id, "spk %s", GRAB_START);
       
        ExecuteForward(g_fwGrabEnt_Post, g_fwDummyResult, id, ent);
       
        return PLUGIN_HANDLED
}

public cmdStopEnt(id)
{
        if (!g_iOwnedEnt[id])
                return PLUGIN_HANDLED;
               
        new ent = g_iOwnedEnt[id]
       
        ExecuteForward(g_fwDropEnt_Pre, g_fwDummyResult, id, ent);
       
        if (BlockLocker(ent))
        {
                switch(g_iLockBlocks)
                {
                        case 0:
                        {
                                set_pev(ent,pev_rendermode,kRenderTransColor)
                                set_pev(ent,pev_rendercolor, Float:{ LOCKED_COLOR })
                                set_pev(ent,pev_renderamt,Float:{ LOCKED_RENDERAMT })
                        }
                        case 1:
                        {
                                set_pev(ent,pev_rendermode,kRenderTransColor)
                                set_pev(ent,pev_rendercolor, g_fColor[g_iColor[id]])
                                set_pev(ent,pev_renderamt,Float:{ LOCKED_RENDERAMT })
                        }
                }
        }
        else
                set_pev(ent,pev_rendermode,kRenderNormal)       
       
        UnsetEntMover(ent);
        SetLastMover(ent,id);
        g_iOwnedEnt[id] = 0;
        UnmovingEnt(ent);
       
        client_cmd(id, "spk %s", GRAB_STOP);
       
        ExecuteForward(g_fwDropEnt_Post, g_fwDummyResult, id, ent);
       
        return PLUGIN_HANDLED;
}

public cmdLockBlock(id)
{
        if (!g_boolCanBuild && g_iLockBlocks && !access(id, FLAGS_LOCKAFTER))
        {
                client_print(id, print_center, "%L", LANG_SERVER, "FAIL_LOCK");
                return PLUGIN_HANDLED;
        }
       
        if (!access(id, FLAGS_LOCK) || (g_isZombie[id] && !access(id, FLAGS_OVERRIDE)))
                return PLUGIN_HANDLED;
               
        new ent, bodypart
        get_user_aiming (id,ent,bodypart)
       
        new szTarget[7], szClass[10];
        entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
        entity_get_string(ent, EV_SZ_classname, szClass, 9);
        if (!ent || !is_valid_ent(ent) || is_user_alive(ent) || ent == g_iEntBarrier || !equal(szClass, "func_wall") || equal(szTarget, "ignore"))
                return PLUGIN_HANDLED;
       
        ExecuteForward(g_fwLockEnt_Pre, g_fwDummyResult, id, ent);
       
        switch (g_iLockBlocks)
        {
                case 0:
                {
                        if (!BlockLocker(ent) && !IsMovingEnt(ent))
                        {
                                LockBlock(ent, id);
                                set_pev(ent,pev_rendermode,kRenderTransColor)
                                set_pev(ent,pev_rendercolor,Float:{LOCKED_COLOR})
                                set_pev(ent,pev_renderamt,Float:{LOCKED_RENDERAMT})
                                client_cmd(id, "spk %s", LOCK_OBJECT);
                        }
                        else if (BlockLocker(ent))
                        {
                                UnlockBlock(ent)
                                set_pev(ent,pev_rendermode,kRenderNormal)
                                client_cmd(id, "spk %s", LOCK_OBJECT);
                        }
                }
                case 1:
                {
                        if (!BlockLocker(ent) && !IsMovingEnt(ent))
                        {
                                if (g_iOwnedEntities[id]<g_iLockMax || !g_iLockMax)
                                {
                                        LockBlock(ent, id)
                                        g_iOwnedEntities[id]++
                                        set_pev(ent,pev_rendermode,kRenderTransColor)
                                        set_pev(ent,pev_rendercolor,g_fColor[g_iColor[id]])
                                        set_pev(ent,pev_renderamt,Float:{LOCKED_RENDERAMT})
                                       
                                        client_print(id, print_center, "%L [ %d / %d ]", LANG_SERVER, "BUILD_CLAIM_NEW", g_iOwnedEntities[id], g_iLockMax)
                                        client_cmd(id, "spk %s", LOCK_OBJECT);
                                }
                                else if (g_iOwnedEntities[id]>=g_iLockMax)
                                {
                                        client_print(id, print_center, "%L", LANG_SERVER, "BUILD_CLAIM_MAX", g_iLockMax)
                                        client_cmd(id, "spk %s", LOCK_FAIL);
                                }
                        }
                        else if (BlockLocker(ent))
                        {
                                if (BlockLocker(ent) == id || access(id, FLAGS_OVERRIDE))
                                {
                                        g_iOwnedEntities[BlockLocker(ent)]--
                                        set_pev(ent,pev_rendermode,kRenderNormal)
                                       
                                        client_print(BlockLocker(ent), print_center, "%L [ %d / %d ]", LANG_SERVER, "BUILD_CLAIM_LOST", g_iOwnedEntities[BlockLocker(ent)], g_iLockMax)
                                       
                                        UnlockBlock(ent)
                                        client_cmd(id, "spk %s", LOCK_OBJECT);
                                }
                                else
                                {
                                        client_print(id, print_center, "%L", LANG_SERVER, "BUILD_CLAIM_FAIL")
                                        client_cmd(id, "spk %s", LOCK_FAIL);
                                }
                        }       
                }
        }
       
        ExecuteForward(g_fwLockEnt_Post, g_fwDummyResult, id, ent);
       
        return PLUGIN_HANDLED
}

public cmdBuildBan(id, target)
{
        if (access(id, FLAGS_BUILDBAN))
        {
                new player
                if (target) player = target
                else
                {
                        new arg[32]
                        read_argv(1, arg, 31)
                        player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY)
                }
               
                if (!player)
                        return client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_NAME");
               
                new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
                get_user_name(id,szAdminName,31)
                get_user_authid (id,szAdminAuthid,31)
                get_user_name(player, szPlayerName, 31)
                get_user_authid (player,szPlayerID,31)
               
                g_isBuildBan[player] = g_isBuildBan[player] ? false : true
               
                if (g_isBuildBan[player] && g_iOwnedEnt[player])
                        cmdStopEnt(player)
               
                client_print(id, print_console, "[Base Builder] Player %s was %s from building", szPlayerName, g_isBuildBan[player] ? "banned":"unbanned")
                Log("[MOVE] Admin: %s || SteamID: %s banned Player: %s || SteamID: %s from building", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
               
                set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
                show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_BUILDBAN", g_isBuildBan[player] ? "disabled":"re-enabled");
               
                print_color(0, "%s Player^x04 %s^x01 has been^x04 %s^x01 from building", MODNAME, szPlayerName, g_isBuildBan[player] ? "banned":"unbanned")
        }
       
        return PLUGIN_HANDLED;
}

public fw_PlayerPreThink(id)
{
        if (!is_user_connected(id))
        {
                cmdStopEnt(id)
                return PLUGIN_HANDLED
        }
       
        if (g_isZombie[id])
                set_pev(id, pev_maxspeed, g_fPlayerSpeed[id])
       
        if (!g_iOwnedEnt[id] || !is_valid_ent(g_iOwnedEnt[id]))
                return FMRES_HANDLED
               
        new buttons = pev(id, pev_button)
        if (buttons & IN_ATTACK)
        {
                g_fEntDist[id] += OBJECT_PUSHPULLRATE;
               
                if (g_fEntDist[id] > g_fEntMaxDist)
                {
                        g_fEntDist[id] = g_fEntMaxDist
                        client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_MAX")
                }
                else
                        client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_PUSH")
                       
                ExecuteForward(g_fwPushPull, g_fwDummyResult, id, g_iOwnedEnt[id], 1);
        }
        else if (buttons & IN_ATTACK2)
        {
                g_fEntDist[id] -= OBJECT_PUSHPULLRATE;
                       
                if (g_fEntDist[id] < g_fEntSetDist)
                {
                        g_fEntDist[id] = g_fEntSetDist
                        client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_MIN")
                }
                else
                        client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_PULL")
                       
                ExecuteForward(g_fwPushPull, g_fwDummyResult, id, g_iOwnedEnt[id], 2);
        }
       
        new iOrigin[3], iLook[3], Float:fOrigin[3], Float:fLook[3], Float:vMoveTo[3], Float:fLength
           
        get_user_origin(id, iOrigin, 1);
        IVecFVec(iOrigin, fOrigin);
        get_user_origin(id, iLook, 3);
        IVecFVec(iLook, fLook);
           
        fLength = get_distance_f(fLook, fOrigin);
        if (fLength == 0.0) fLength = 1.0;

        vMoveTo[0] = (fOrigin[0] + (fLook[0] - fOrigin[0]) * g_fEntDist[id] / fLength) + g_fOffset1[id];
        vMoveTo[1] = (fOrigin[1] + (fLook[1] - fOrigin[1]) * g_fEntDist[id] / fLength) + g_fOffset2[id];
        vMoveTo[2] = (fOrigin[2] + (fLook[2] - fOrigin[2]) * g_fEntDist[id] / fLength) + g_fOffset3[id];
        vMoveTo[2] = float(floatround(vMoveTo[2], floatround_floor));

        entity_set_origin(g_iOwnedEnt[id], vMoveTo);
       
        return FMRES_HANDLED
}

public fw_Traceline(Float:start[3], Float:end[3], conditions, id, trace)
{
        if (!is_user_alive(id))
                return PLUGIN_HANDLED
       
        new ent = get_tr2(trace, TR_pHit)
       
        if (is_valid_ent(ent))
        {
                new ent,body
                get_user_aiming(id,ent,body)
               
                new szClass[10], szTarget[7];
                entity_get_string(ent, EV_SZ_classname, szClass, 9);
                entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
                if (equal(szClass, "func_wall") && !equal(szTarget, "ignore") && ent != g_iEntBarrier && g_iShowMovers == 1)
                {
                        if (g_boolCanBuild || access(id, ADMIN_SLAY))
                        {
                                set_hudmessage(0, 50, 255, -1.0, 0.55, 1, 0.01, 3.0, 0.01, 0.01);
                                if (!BlockLocker(ent))
                                {
                                        new szCurMover[32], szLastMover[32]
                                        if (GetEntMover(ent))
                                        {
                                                get_user_name(GetEntMover(ent),szCurMover,31)
                                                if (!GetLastMover(ent))
                                                        ShowSyncHudMsg(id, g_HudSync, "Current Mover: %s^nLast Mover: NONE", szCurMover);
                                        }
                                        if (GetLastMover(ent))
                                        {
                                                get_user_name(GetLastMover(ent),szLastMover,31)
                                                if (!GetEntMover(ent))
                                                        ShowSyncHudMsg(id, g_HudSync, "Current Mover: NONE^nLast Mover: %s", szLastMover);
                                        }
                                        if (GetEntMover(ent) && GetLastMover(ent))
                                                ShowSyncHudMsg(id, g_HudSync, "Current Mover: %s^nLast Mover: %s", szCurMover, szLastMover);
                                        else if (!GetEntMover(ent) && !GetLastMover(ent))
                                                ShowSyncHudMsg(id, g_HudSync, "This object hasn't been moved");
                                }
                                else
                                {
                                        new szEntOwner[32]
                                        get_user_name(BlockLocker(ent),szEntOwner,31)
                                        ShowSyncHudMsg(id, g_HudSync, "Claimed by: %s", szEntOwner);
                                }
                        }
                }
        }
        else ClearSyncHud(id, g_HudSync);
       
        return PLUGIN_HANDLED
}

public fw_EmitSound(id,channel,const sample[],Float:volume,Float:attn,flags,pitch)
{
        if (!is_user_connected(id) || !g_isZombie[id] || g_boolCanBuild || g_boolPrepTime || g_boolRoundEnded)
                return FMRES_IGNORED;
               
        if(equal(sample[7], "die", 3) || equal(sample[7], "dea", 3))
        {
                emit_sound(id,channel,g_szZombieDie[random(sizeof g_szZombieDie - 1)],volume,attn,flags,pitch)
                return FMRES_SUPERCEDE
        }
       
        if(equal(sample[7], "bhit", 4))
        {
                emit_sound(id,channel,g_szZombiePain[random(sizeof g_szZombiePain - 1)],volume,attn,flags,pitch)
                return FMRES_SUPERCEDE
        }
       
        // Zombie attacks with knife
        if (equal(sample[8], "kni", 3))
        {
                if (equal(sample[14], "sla", 3)) // slash
                {
                        emit_sound(id,channel,g_szZombieMiss[random(sizeof g_szZombieMiss - 1)],volume,attn,flags,pitch)
                        return FMRES_SUPERCEDE;
                }
                if (equal(sample[14], "hit", 3)) // hit
                {
                        if (sample[17] == 'w') // wall
                        {
                                emit_sound(id,channel,g_szZombieHit[random(sizeof g_szZombieHit - 1)],volume,attn,flags,pitch)
                                return FMRES_SUPERCEDE;
                        }
                        else
                        {
                                emit_sound(id,channel,g_szZombieHit[random(sizeof g_szZombieHit - 1)],volume,attn,flags,pitch)
                                return FMRES_SUPERCEDE;
                        }
                }
                if (equal(sample[14], "sta", 3)) // stab
                {
                        emit_sound(id,channel,g_szZombieMiss[random(sizeof g_szZombieMiss - 1)],volume,attn,flags,pitch)
                        return FMRES_SUPERCEDE;
                }
        }
       
        return FMRES_IGNORED
}

public fw_Suicide(id) return FMRES_SUPERCEDE

public show_colors_menu(id,offset)
{
        if(offset<0) offset = 0

        new keys, curnum, menu[2048]
        for(new i=offset;i<MAX_COLORS;i++)
        {
                if (g_iColorMode == 0 || (g_iColorMode == 1 && !g_iColorOwner[i]))
                {
                        g_iMenuOptions[id][curnum] = i
                        keys += (1<<curnum)
       
                        curnum++
                        format(menu,2047,"%s^n%d. %s", menu, curnum, g_szColorName[i])
       
                        if(curnum==8)
                                break;
                }
        }

        format(menu,2047,"\ySelect Your Color:^nCurrent: \r%s\w^n^n%s^n", g_szColorName[g_iColor[id]], menu)
        if(curnum==8 && offset<12)
        {
                keys += (1<<8)
                format(menu,2047,"%s^n9. Next",menu)
        }
        if(offset)
        {
                keys += (1<<9)
                format(menu,2047,"%s^n0. Back",menu)
        }

        show_menu(id,keys,menu,-1,"ColorsSelect")
}

public colors_pushed(id,key)
{
        if(key<8)
        {
                g_iColorOwner[g_iMenuOptions[id][key]] = id
                g_iColorOwner[g_iColor[id]] = 0
                g_iColor[id] = g_iMenuOptions[id][key]
                print_color(id, "%s You have picked^x04 %s^x01 as your color", MODNAME, g_szColorName[g_iColor[id]])
                g_iMenuOffset[id] = 0
               
                ExecuteForward(g_fwNewColor, g_fwDummyResult, id, g_iColor[id]);
        }
        else
        {
                if(key==8)
                        g_iMenuOffset[id] += 8
                if(key==9)
                        g_iMenuOffset[id] -= 8
                show_colors_menu(id,g_iMenuOffset[id])
        }

        return ;
}

public show_zclass_menu(id,offset)
{
        if(offset<0) offset = 0

        new keys, curnum, menu[512], szCache1[32], szCache2[32], iCache3
        for(new i=offset;i<g_iZClasses;i++)
        {
                ArrayGetString(g_zclass_name, i, szCache1, charsmax(szCache1))
                ArrayGetString(g_zclass_info, i, szCache2, charsmax(szCache2))
                iCache3 = ArrayGetCell(g_zclass_admin, i)
               
                // Add to menu
                if (i == g_iZombieClass[id])
                        format(menu,511,"%s^n\d%d. %s %s \r%s", menu, curnum+1, szCache1, szCache2, iCache3 == ADMIN_ALL ? "\y [ Selected ]" : "\y [ Selected ]")
                else
                        format(menu,511,"%s^n\w%d. %s \y%s \r%s", menu, curnum+1, szCache1, szCache2, iCache3 == ADMIN_ALL ? "" : "")
               
                g_iMenuOptions[id][curnum] = i
                keys += (1<<curnum)
       
                curnum++
               
                if(curnum==8)
                        break;
        }

        format(menu,511,"\ySelect Your Class:^n\w%s^n", menu)
        if(curnum==8 && offset<12)
        {
                keys += (1<<8)
                format(menu,511,"%s^n\w9. Next",menu)
        }
        if(offset)
        {
                keys += (1<<9)
                format(menu,511,"%s^n\w0. Back",menu)
        }

        show_menu(id,keys,menu,-1,"ZClassSelect")
}

public zclass_pushed(id,key)
{
        if(key<8)
        {
                if (g_iMenuOptions[id][key] == g_iZombieClass[id])
                {
                        client_cmd(id, "spk %s", LOCK_FAIL);
                       
                        print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_CURRENT")
                        show_zclass_menu(id,g_iMenuOffset[id])
                        return ;
                }
               
                new iCache3 = ArrayGetCell(g_zclass_admin, g_iMenuOptions[id][key])
               
                if ((iCache3 != ADMIN_ALL || !iCache3) && !access(id, iCache3))
                {
                        print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_NO_ACCESS")
                        show_zclass_menu(id,g_iMenuOffset[id])
                        return ;
                }
                g_iNextClass[id] = g_iMenuOptions[id][key]
       
                new szCache1[32]
                ArrayGetString(g_zclass_name, g_iMenuOptions[id][key], szCache1, charsmax(szCache1))
               
                if (!g_isZombie[id] || (g_isZombie[id] && (g_boolCanBuild || g_boolPrepTime)))
                        print_color(id, "%s You have selected^x04 %s^x01 as your next class", MODNAME, szCache1)
                if (!g_isAlive[id])
                        print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_RESPAWN")
                g_iMenuOffset[id] = 0
               
                if (g_isZombie[id] && (g_boolCanBuild || g_boolPrepTime))
                        ExecuteHamB(Ham_CS_RoundRespawn, id)
                       
                ExecuteForward(g_fwClassPicked, g_fwDummyResult, id, g_iZombieClass[id]);
        }
        else
        {
                if(key==8)
                        g_iMenuOffset[id] += 8
                if(key==9)
                        g_iMenuOffset[id] -= 8
                show_zclass_menu(id,g_iMenuOffset[id])
        }

        return ;
}

/*------------------------------------------------------------------------------------------------*/
public show_method_menu(id)
{
        if(g_boolFirstTime[id])
        {
                g_boolFirstTime[id] = false
                show_primary_menu(id,0)
        }
        else
        {
                g_iMenuOffset[id] = 0
                show_menu(id,(1<<0)|(1<<1),"\yChoose Your Weapon^n^n\y1. \wNew Guns^n\y2. \wLast Guns",-1,"WeaponMethodMenu")
        }
}

public weapon_method_pushed(id,key)
{
        switch(key)
        {
                case 0: show_primary_menu(id,0)
                case 1: give_weapons(id)
        }
        return ;
}

public show_primary_menu(id,offset)
{
        if(offset<0) offset = 0

        new cvar_value[32]
        get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
        new flags = read_flags(cvar_value)

        new keys, curnum, menu[2048]
        for(new i=offset;i<19;i++)
        {
                if(flags & power(2,i))
                {
                        g_iMenuOptions[id][curnum] = i
                        keys += (1<<curnum)
       
                        curnum++
                        format(menu,2047,"%s^n%d. %s",menu,curnum,szWeaponNames[i])
       
                        if(curnum==8)
                                break;
                }
        }

        format(menu,2047,"\yPrimary Weapon:\w^n%s^n",menu)
        if(curnum==8 && offset<12)
        {
                keys += (1<<8)
                format(menu,2047,"%s^n9. Next",menu)
        }
        if(offset)
        {
                keys += (1<<9)
                format(menu,2047,"%s^n0. Back",menu)
        }

        show_menu(id,keys,menu,-1,"PrimaryWeaponSelect")
}

public prim_weapons_pushed(id,key)
{
        if(key<8)
        {
                g_iWeaponPicked[0][id] = g_iMenuOptions[id][key]
                g_iMenuOffset[id] = 0
                show_secondary_menu(id,0)
        }
        else
        {
                if(key==8)
                        g_iMenuOffset[id] += 8
                if(key==9)
                        g_iMenuOffset[id] -= 8
                show_primary_menu(id,g_iMenuOffset[id])
        }
        return ;
}

public show_secondary_menu(id,offset)
{
        if(offset<0) offset = 0

        new cvar_value[32]
        get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
        new flags = read_flags(cvar_value)

        new keys, curnum, menu[2048]
        for(new i=18;i<24;i++)
        {
                if(flags & power(2,i))
                {
                        g_iMenuOptions[id][curnum] = i
                        keys += (1<<curnum)
       
                        curnum++
                        format(menu,2047,"%s^n%d. %s",menu,curnum,szWeaponNames[i])
                }
        }

        format(menu,2047,"\ySecondary Weapon:\w^n%s",menu)

        show_menu(id,keys,menu,-1,"SecWeaponSelect")
}

public sec_weapons_pushed(id,key)
{
        if(key<8)
        {
                g_iWeaponPicked[1][id] = g_iMenuOptions[id][key]
        }
        give_weapons(id)
        return ;
}

public give_weapons(id)
{
        strip_user_weapons(id)
        give_item(id,"weapon_knife")
 
        new szWeapon[32], csw
        csw = csw_contant(g_iWeaponPicked[0][id])
        get_weaponname(csw,szWeapon,31)
        give_item(id,szWeapon)
        cs_set_user_bpammo(id,csw,999)
        g_iPrimaryWeapon[id] = csw

        csw = csw_contant(g_iWeaponPicked[1][id])
        get_weaponname(csw,szWeapon,31)
        give_item(id,szWeapon)
        cs_set_user_bpammo(id,csw,999)
       
        g_boolRepick[id] = false
}

stock csw_contant(weapon)
{
        new num = 29
        switch(weapon)
        {
                case 0: num = 3
                case 1: num = 5
                case 2: num = 7
                case 3: num = 8
                case 4: num = 12
                case 5: num = 13
                case 6: num = 14
                case 7: num = 15
                case 8: num = 18
                case 9: num = 19
                case 10: num = 20
                case 11: num = 21
                case 12: num = 22
                case 13: num = 23
                case 14: num = 24
                case 15: num = 27
                case 16: num = 28
                case 17: num = 30
                case 18: num = 1
                case 19: num = 10
                case 20: num = 11
                case 21: num = 16
                case 22: num = 17
                case 23: num = 26
                case 24:
                {
                        new s_weapon[32]
               
                        get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
                 
                        new flags = read_flags(s_weapon)
                        do
                        {
                                num = random_num(0,18)
                                if(!(num & flags))
                                {
                                        num = -1
                                }
                        }
                        while(num==-1)
                        num = csw_contant(num)
                }
                case 25:
                {
                        new s_weapon[32]

                        get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
               
                        new flags = read_flags(s_weapon)
                        do
                        {
                                num = random_num(18,23)
                                if(!(num & flags))
                                {
                                        num = -1
                                }
                        }
                        while(num==-1)
                        num = csw_contant(num)
                }
        }
        return num;
}
/*------------------------------------------------------------------------------------------------*/

Log(const message_fmt[], any:...)
{
        static message[256];
        vformat(message, sizeof(message) - 1, message_fmt, 2);
       
        static filename[96];
        static dir[64];
        if( !dir[0] )
        {
                get_basedir(dir, sizeof(dir) - 1);
                add(dir, sizeof(dir) - 1, "/logs");
        }
       
        format_time(filename, sizeof(filename) - 1, "%m-%d-%Y");
        format(filename, sizeof(filename) - 1, "%s/BaseBuilder_%s.log", dir, filename);
       
        log_to_file(filename, "%s", message);
}

print_color(target, const message[], any:...)
{
        static buffer[512], i, argscount
        argscount = numargs()
       
        // Send to everyone
        if (!target)
        {
                static player
                for (player = 1; player <= g_iMaxPlayers; player++)
                {
                        // Not connected
                        if (!g_isConnected[player])
                                continue;
                       
                        // Remember changed arguments
                        static changed[5], changedcount // [5] = max LANG_PLAYER occurencies
                        changedcount = 0
                       
                        // Replace LANG_PLAYER with player id
                        for (i = 2; i < argscount; i++)
                        {
                                if (getarg(i) == LANG_PLAYER)
                                {
                                        setarg(i, 0, player)
                                        changed[changedcount] = i
                                        changedcount++
                                }
                        }
                       
                        // Format message for player
                        vformat(buffer, charsmax(buffer), message, 3)
                       
                        // Send it
                        message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
                        write_byte(player)
                        write_string(buffer)
                        message_end()
                       
                        // Replace back player id's with LANG_PLAYER
                        for (i = 0; i < changedcount; i++)
                                setarg(changed[i], 0, LANG_PLAYER)
                }
        }
        // Send to specific target
        else
        {
                // Format message for player
                vformat(buffer, charsmax(buffer), message, 3)
               
                // Send it
                message_begin(MSG_ONE, g_msgSayText, _, target)
                write_byte(target)
                write_string(buffer)
                message_end()
        }
}

stock fm_cs_get_current_weapon_ent(id)
        return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX);

public native_register_zombie_class(const name[], const info[], const model[], const clawmodel[], hp, speed, Float:gravity, Float:knockback, adminflags, credits)
{
        if (!g_boolArraysCreated)
                return 0;
               
        // Strings passed byref
        param_convert(1)
        param_convert(2)
        param_convert(3)
        param_convert(4)
       
        // Add the class
        ArrayPushString(g_zclass_name, name)
        ArrayPushString(g_zclass_info, info)
       
        ArrayPushCell(g_zclass_modelsstart, ArraySize(g_zclass_playermodel))
        ArrayPushString(g_zclass_playermodel, model)
        ArrayPushCell(g_zclass_modelsend, ArraySize(g_zclass_playermodel))
        ArrayPushCell(g_zclass_modelindex, -1)
       
        ArrayPushString(g_zclass_clawmodel, clawmodel)
        ArrayPushCell(g_zclass_hp, hp)
        ArrayPushCell(g_zclass_spd, speed)
        ArrayPushCell(g_zclass_grav, gravity)
        ArrayPushCell(g_zclass_admin, adminflags)
        ArrayPushCell(g_zclass_level, level)
        ArrayPushCell(g_zclass_credits, credits)
       
        // Set temporary new class flag
        ArrayPushCell(g_zclass_new, 1)
       
        // Override zombie classes data with our customizations
        new i, k, buffer[32], Float:buffer2, nummodels_custom, nummodels_default, prec_mdl[100], size = ArraySize(g_zclass2_realname)
        for (i = 0; i < size; i++)
        {
                ArrayGetString(g_zclass2_realname, i, buffer, charsmax(buffer))
               
                // Check if this is the intended class to override
                if (!equal(name, buffer))
                        continue;
               
                // Remove new class flag
                ArraySetCell(g_zclass_new, g_iZClasses, 0)
               
                // Replace caption
                ArrayGetString(g_zclass2_name, i, buffer, charsmax(buffer))
                ArraySetString(g_zclass_name, g_iZClasses, buffer)
               
                // Replace info
                ArrayGetString(g_zclass2_info, i, buffer, charsmax(buffer))
                ArraySetString(g_zclass_info, g_iZClasses, buffer)
               
                nummodels_custom = ArrayGetCell(g_zclass2_modelsend, i) - ArrayGetCell(g_zclass2_modelsstart, i)
                nummodels_default = ArrayGetCell(g_zclass_modelsend, g_iZClasses) - ArrayGetCell(g_zclass_modelsstart, g_iZClasses)
                       
                // Replace each player model and model index
                for (k = 0; k < min(nummodels_custom, nummodels_default); k++)
                {
                        ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer))
                        ArraySetString(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k, buffer)
                               
                        // Precache player model and replace its modelindex with the real one
                        formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer)
                        ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k, engfunc(EngFunc_PrecacheModel, prec_mdl))
                }
                       
                // We have more custom models than what we can accommodate,
                // Let's make some space...
                if (nummodels_custom > nummodels_default)
                {
                        for (k = nummodels_default; k < nummodels_custom; k++)
                        {
                                ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer))
                                ArrayInsertStringAfter(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k - 1, buffer)
                               
                                // Precache player model and retrieve its modelindex
                                formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer)
                                ArrayInsertCellAfter(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k - 1, engfunc(EngFunc_PrecacheModel, prec_mdl))
                        }
                               
                        // Fix models end index for this class
                        ArraySetCell(g_zclass_modelsend, g_iZClasses, ArrayGetCell(g_zclass_modelsend, g_iZClasses) + (nummodels_custom - nummodels_default))
                }
               
                // Replace clawmodel
                ArrayGetString(g_zclass2_clawmodel, i, buffer, charsmax(buffer))
                ArraySetString(g_zclass_clawmodel, g_iZClasses, buffer)
               
                // Precache clawmodel
                formatex(prec_mdl, charsmax(prec_mdl), "models/%s.mdl", buffer)
                engfunc(EngFunc_PrecacheModel, prec_mdl)
               
                // Replace health
                buffer[0] = ArrayGetCell(g_zclass2_hp, i)
                ArraySetCell(g_zclass_hp, g_iZClasses, buffer[0])
               
                // Replace speed
                buffer[0] = ArrayGetCell(g_zclass2_spd, i)
                ArraySetCell(g_zclass_spd, g_iZClasses, buffer[0])
               
                // Replace gravity
                buffer2 = Float:ArrayGetCell(g_zclass2_grav, i)
                ArraySetCell(g_zclass_grav, g_iZClasses, buffer2)
               
                // Replace admin flags
                buffer2 = ArrayGetCell(g_zclass2_admin, i)
                ArraySetCell(g_zclass_admin, g_iZClasses, buffer2)
             
                // Replace level
                buffer2 = ArrayGetCell(g_zclass2_level, i)
                ArraySetCell(g_zclass_level, g_iZClasses, buffer2)
       
                // Replace credits
                buffer2 = ArrayGetCell(g_zclass2_credits, i)
                ArraySetCell(g_zclass_credits, g_iZClasses, buffer2)
        }
       
        // If class was not overriden with customization data
        if (ArrayGetCell(g_zclass_new, g_iZClasses))
        {
                // Precache default class model and replace modelindex with the real one
                formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", model, model)
                ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses), engfunc(EngFunc_PrecacheModel, prec_mdl))
               
                // Precache default clawmodel
                formatex(prec_mdl, charsmax(prec_mdl), "models/%s.mdl", clawmodel)
                engfunc(EngFunc_PrecacheModel, prec_mdl)
        }

        g_iZClasses++
       
        return g_iZClasses-1
}

public native_get_class_cost(classid)
{
        if (classid < 0 || classid >= g_iZClasses)
                return -1;
       
        return ArrayGetCell(g_zclass_credits, classid)
}

public native_get_user_zombie_class(id) return g_iZombieClass[id];
public native_get_user_next_class(id) return g_iNextClass[id];
public native_set_user_zombie_class(id, classid)
{
        if (classid < 0 || classid >= g_iZClasses)
                return 0;
       
        g_iNextClass[id] = classid
        return 1;
}

public native_is_user_zombie(id) return g_isZombie[id]
public native_is_user_banned(id) return g_isBuildBan[id]

public native_bool_buildphase() return g_boolCanBuild
public native_bool_prepphase() return g_boolPrepTime

public native_get_build_time()
{
        if (g_boolCanBuild)
                return g_iCountDown
               
        return 0;
}

public native_set_build_time(time)
{
        if (g_boolCanBuild)
        {
                g_iCountDown = time
                return 1
        }
               
        return 0;
}

public native_get_user_color(id) return g_iColor[id]
public native_set_user_color(id, color)
{
        g_iColor[id] = color
}

public native_drop_user_block(id)
{
        cmdStopEnt(id)
}
public native_get_user_block(id)
{
        if (g_iOwnedEnt[id])
                return g_iOwnedEnt[id]
               
        return 0;
}
public native_set_user_block(id, entity)
{
        if (is_valid_ent(entity) && !is_user_alive(entity) && !MovingEnt(entity))
                g_iOwnedEnt[id] = entity
}

public native_is_locked_block(entity)
{
        if (is_valid_ent(entity) && !is_user_alive(entity))
                return BlockLocker(entity) ? true : false
               
        return -1;
}
public native_lock_block(entity)
{
        if (is_valid_ent(entity) && !is_user_alive(entity) && !BlockLocker(entity))
        {
                LockBlock(entity, 33);
                set_pev(entity,pev_rendermode,kRenderTransColor)
                set_pev(entity,pev_rendercolor,Float:{LOCKED_COLOR})
                set_pev(entity,pev_renderamt,Float:{LOCKED_RENDERAMT})
        }
}
public native_unlock_block(entity)
{
        if (is_valid_ent(entity) && !is_user_alive(entity) && BlockLocker(entity))
        {
                UnlockBlock(entity)
                set_pev(entity,pev_rendermode,kRenderNormal)
        }
}

public native_release_zombies()
{
        if (g_boolCanBuild || g_boolPrepTime)
        {
                Release_Zombies()
                return 1;
        }
        return 0;
}

public native_set_user_primary(id, csw_primary)
{
        if (CSW_P228<=csw_primary<=CSW_P90)
        {
                g_iPrimaryWeapon[id] = csw_primary
                return g_iPrimaryWeapon[id];
        }
               
        return -1;
}

public native_get_user_primary(id) return g_iPrimaryWeapon[id]

public native_get_flags_build()                return FLAGS_BUILD
public native_get_flags_lock()                return FLAGS_LOCK
public native_get_flags_lockafter()        return FLAGS_LOCKAFTER
public native_get_flags_buildban()        return FLAGS_BUILDBAN
public native_get_flags_swap()                return FLAGS_SWAP
public native_get_flags_revive()        return FLAGS_REVIVE
public native_get_flags_guns()                return FLAGS_GUNS
public native_get_flags_release()        return FLAGS_RELEASE
public native_get_flags_override()        return FLAGS_OVERRIDE

/*public native_set_user_mult(id, attribute, Float: amount)
{
        if (attribute < ATT_HEALTH || attribute > ATT_GRAVITY)
                return 0;
               
        if (amount < 1.0)
                amount = 1.0
               
        g_fClassMultiplier[id][attribute] = amount
       
        return 1;
}*/

bb_classes.sma
PHP Code:

#include <amxmodx>
#include <basebuilder>

/*================================================================================
 [Plugin Customization]
=================================================================================*/

// Classic Zombie Attributes
new const zclass1_name[] = { "Classic Zombie" }
new const 
zclass1_info[] = { "\y| \w{\rFree\w}" }
new const 
zclass1_model[] = { "shbb_classic" }
new const 
zclass1_clawmodel[] = { "v_bloodyhands" }
const 
zclass1_health 4000
const zclass1_speed 270
const Float:zclass1_gravity 0.7
const zclass1_adminflags ADMIN_ALL

// Jumper Zombie Attributes
new const zclass2_name[] = { "Jumper Zombie" }
new const 
zclass2_info[] = { "\y| \w{\rFree\w}" }
new const 
zclass2_model[] = { "shbb_jumper" }
new const 
zclass2_clawmodel[] = { "v_bloodyhands" }
const 
zclass2_health 3200
const zclass2_speed 265
const Float:zclass2_gravity 0.4
const zclass2_adminflags ADMIN_ALL

// Tanker Zombie Attributes
new const zclass3_name[] = { "Tanker Zombie" }
new const 
zclass3_info[] = { "\y| \w{\rFree\w}" }
new const 
zclass3_model[] = { "shbb_tanker" }
new const 
zclass3_clawmodel[] = { "v_bloodyhands" }
const 
zclass3_health 4800
const zclass3_speed 230
const Float:zclass3_gravity 0.9
const zclass3_adminflags ADMIN_ALL

// Fast Zombie Attributes
new const zclass4_name[] = { "Fast Zombie" }
new const 
zclass4_info[] = { "\y| \w{\rFree\w}" }
new const 
zclass4_model[] = { "shbb_boogeyman" }
new const 
zclass4_clawmodel[] = { "v_bloodyhands" }
const 
zclass4_health 3000
const zclass4_speed 325
const Float:zclass4_gravity 0.8
const zclass4_adminflags ADMIN_ALL

// Vip Zombie Attributes
new const zclass5_name[] = { "Doctor Zombie" }
new const 
zclass5_info[] = { "\y| \w{\rVIP\w}" }
new const 
zclass5_model[] = { "shbb_vipzm" }
new const 
zclass5_clawmodel[] = { "v_bloodyhands" }
const 
zclass5_health 4200
const zclass5_speed 285
const Float:zclass5_gravity 0.6
const zclass5_adminflags ADMIN_LEVEL_H

// Admin Zombie Attributes
new const zclass6_name[] = { "Nemessis Zombie" }
new const 
zclass6_info[] = { "\y| \w{\rAdmin\w}" }
new const 
zclass6_model[] = { "shbb_admin" }
new const 
zclass6_clawmodel[] = { "v_bloodyhands" }
const 
zclass6_health 5000
const zclass6_speed 255
const Float:zclass6_gravity 0.5
const zclass6_adminflags ADMIN_BAN

// Full Admin Zombie Attributes
new const zclass7_name[] = { "Hunter Zombie" }
new const 
zclass7_info[] = { "\y| \w{\rFull Admin\w}" }
new const 
zclass7_model[] = { "shbb_fulladmin" }
new const 
zclass7_clawmodel[] = { "v_bloodyhands" }
const 
zclass7_health 5400
const zclass7_speed 300
const Float:zclass7_gravity 0.4
const zclass7_adminflags ADMIN_CVAR

// Head Admin Zombie Attributes
new const zclass8_name[] = { "Frost Zombie" }
new const 
zclass8_info[] = { "\y| \w{\rHead Admin\w}" }
new const 
zclass8_model[] = { "shbb_owner2" }
new const 
zclass8_clawmodel[] = { "v_bloodyhands" }
const 
zclass8_health 6000
const zclass8_speed 320
const Float:zclass8_gravity 0.7
const zclass8_adminflags ADMIN_RCON

// Head Admin Zombie Attributes
new const zclass9_name[] = { "Shogun Zombie" }
new const 
zclass9_info[] = { "\y| \w{\rCoder\w}" }
new const 
zclass9_model[] = { "shbb_coder" }
new const 
zclass9_clawmodel[] = { "v_bloodyhands" }
const 
zclass9_health 6500
const zclass9_speed 290
const Float:zclass9_gravity 0.4
const zclass9_adminflags ADMIN_LEVEL_F

// Head Admin Zombie Attributes
new const zclass10_name[] = { "SH Zombie" }
new const 
zclass10_info[] = { "\y| \w{\rOwner\w}" }
new const 
zclass10_model[] = { "shbb_headadmin" }
new const 
zclass10_clawmodel[] = { "v_bloodyhands" }
const 
zclass10_health 7000
const zclass10_speed 310
const Float:zclass10_gravity 0.4
const zclass10_adminflags ADMIN_LEVEL_C

// Head Admin Zombie Attributes
new const zclass11_name[] = { "\yBoss Zombie" }
new const 
zclass11_info[] = { "\y| \w{\yEvent\w}" }
new const 
zclass11_model[] = { "boss5" }
new const 
zclass11_clawmodel[] = { "v_boss5" }
const 
zclass11_health 150000
const zclass11_speed 230
const Float:zclass11_gravity 0.4
const zclass11_adminflags ADMIN_LEVEL_F

/*============================================================================*/

// Zombie Classes MUST be registered on plugin_precache
public plugin_precache()
{
    
register_plugin("[SH - BB] Zombie Classes""6.5""Tirant")
    
    
// Register all classes
    
bb_register_zombie_class(zclass1_namezclass1_infozclass1_modelzclass1_clawmodelzclass1_healthzclass1_speedzclass1_gravity0.0zclass1_adminflags)
    
bb_register_zombie_class(zclass2_namezclass2_infozclass2_modelzclass2_clawmodelzclass2_healthzclass2_speedzclass2_gravity0.0zclass2_adminflags)
    
bb_register_zombie_class(zclass3_namezclass3_infozclass3_modelzclass3_clawmodelzclass3_healthzclass3_speedzclass3_gravity0.0zclass3_adminflags)
    
bb_register_zombie_class(zclass4_namezclass4_infozclass4_modelzclass4_clawmodelzclass4_healthzclass4_speedzclass4_gravity0.0zclass4_adminflags)
    
bb_register_zombie_class(zclass5_namezclass5_infozclass5_modelzclass5_clawmodelzclass5_healthzclass5_speedzclass5_gravity0.0zclass5_adminflags)
    
bb_register_zombie_class(zclass6_namezclass6_infozclass6_modelzclass6_clawmodelzclass6_healthzclass6_speedzclass6_gravity0.0zclass6_adminflags)
    
bb_register_zombie_class(zclass7_namezclass7_infozclass7_modelzclass7_clawmodelzclass7_healthzclass7_speedzclass7_gravity0.0zclass7_adminflags)
    
bb_register_zombie_class(zclass8_namezclass8_infozclass8_modelzclass8_clawmodelzclass8_healthzclass8_speedzclass8_gravity0.0zclass8_adminflags)
    
bb_register_zombie_class(zclass9_namezclass9_infozclass9_modelzclass9_clawmodelzclass9_healthzclass9_speedzclass9_gravity0.0zclass9_adminflags)
    
bb_register_zombie_class(zclass10_namezclass10_infozclass10_modelzclass10_clawmodelzclass10_healthzclass10_speedzclass10_gravity0.0zclass10_adminflags)
    
bb_register_zombie_class(zclass11_namezclass11_infozclass11_modelzclass11_clawmodelzclass11_healthzclass11_speedzclass11_gravity0.0zclass11_adminflags)
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ fbidis\\ ansi\\ ansicpg1252\\ deff0{\\ fonttbl{\\ f0\\ fnil\\ fcharset0 Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ ltrpar\\ lang11265\\ f0\\ fs16 \n\\ par }
*/ 

levelsystem.sma
PHP Code:

#include <amxmodx>
#include <amxmisc>
#include <cromchat>
#include <crxranks_const>
#include <csx>
#include <fakemeta>
#include <nvault>
#include <sqlx>

#if AMXX_VERSION_NUM < 183 || !defined set_dhudmessage
    #tryinclude <dhudmessage>

    #if !defined _dhudmessage_included
        #error "dhudmessage.inc" is missing in your "scripting/include" folder. Download it from: "https://amxx-bg.info/inc/"
    #endif
#endif

#if !defined client_disconnected
    #define client_disconnected client_disconnect
#endif

#if !defined replace_string
    #define replace_string replace_all
#endif

new const PLUGIN_VERSION[] = "3.10"
const Float:DELAY_ON_CONNECT 5.0
const Float:HUD_REFRESH_FREQ 1.0
const Float:DELAY_ON_CHANGE 0.1
const MAX_SQL_LENGTH 512
const MAX_QUERY_LENGTH 256
const MAX_SOUND_LENGTH 128
const MAX_SQL_PLAYER_LENGTH 64
const MAX_SQL_RANK_LENGTH CRXRANKS_MAX_RANK_LENGTH 2
const MAX_TEAM_LENGTH 10
const TASK_HUD 304500

#if !defined MAX_NAME_LENGTH
const MAX_NAME_LENGTH 32
#endif

#if !defined MAX_PLAYERS
const MAX_PLAYERS 32
#endif

new const ARG_CURRENT_XP[]          = "$current_xp$"
new const ARG_NEXT_XP[]             = "$next_xp$"
new const ARG_XP_NEEDED[]           = "$xp_needed$"
new const ARG_LEVEL[]               = "$level$"
new const ARG_NEXT_LEVEL[]          = "$next_level$"
new const ARG_RANK[]                = "$rank$"
new const ARG_NEXT_RANK[]           = "$next_rank$"
new const ARG_MAX_LEVELS[]          = "$max_levels$"
new const ARG_LINE_BREAK[]          = "$br$"
new const ARG_NAME[]                = "$name$"

new const XPREWARD_KILL[]           = "kill"
new const XPREWARD_HEADSHOT[]       = "headshot"
new const XPREWARD_TEAMKILL[]       = "teamkill"
new const XPREWARD_SUICIDE[]        = "suicide"
new const XPREWARD_DEATH[]          = "death"

new const XPREWARD_BOMB_PLANTED[]   = "bomb_planted"
new const XPREWARD_BOMB_DEFUSED[]   = "bomb_defused"
new const XPREWARD_BOMB_EXPLODED[]  = "bomb_exploded"

new const XPREWARD_TEAM_WIN[]       = "team_win"
new const XPREWARD_TEAM_LOSE[]      = "team_lose"
new const XPREWARD_TEAM_WIN_CT[]    = "team_win_ct"
new const XPREWARD_TEAM_WIN_T[]     = "team_win_t"
new const XPREWARD_TEAM_LOSE_CT[]   = "team_lose_ct"
new const XPREWARD_TEAM_LOSE_T[]    = "team_lose_t"

#define clr(%1) %1 == -1 ? random(256) : %1

#define HUDINFO_PARAMS clr(g_eSettings[HUDINFO_COLOR][0]), clr(g_eSettings[HUDINFO_COLOR][1]), clr(g_eSettings[HUDINFO_COLOR][2]),\
g_eSettings[HUDINFO_POSITION][0], g_eSettings[HUDINFO_POSITION][1], 00.11.00.10.1

#define HUDINFO_PARAMS_DEAD clr(g_eSettings[HUDINFO_COLOR][0]), clr(g_eSettings[HUDINFO_COLOR][1]), clr(g_eSettings[HUDINFO_COLOR][2]),\
g_eSettings[HUDINFO_POSITION_DEAD][0], g_eSettings[HUDINFO_POSITION_DEAD][1], 00.11.00.10.1

#define XP_NOTIFIER_PARAMS_GET clr(g_eSettings[XP_NOTIFIER_COLOR_GET][0]), clr(g_eSettings[XP_NOTIFIER_COLOR_GET][1]), clr(g_eSettings[XP_NOTIFIER_COLOR_GET][2]),\
g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime g_eSettings[XP_NOTIFIER_DURATION]

#define XP_NOTIFIER_PARAMS_LOSE clr(g_eSettings[XP_NOTIFIER_COLOR_LOSE][0]), clr(g_eSettings[XP_NOTIFIER_COLOR_LOSE][1]), clr(g_eSettings[XP_NOTIFIER_COLOR_LOSE][2]),\
g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime g_eSettings[XP_NOTIFIER_DURATION]

enum _:SaveLoad
{
    
SL_SAVE_DATA,
    
SL_LOAD_DATA
}

enum _:Objects
{
    
OBJ_HUDINFO,
    
OBJ_XP_NOTIFIER
}

enum _:SaveTypes
{
    
SAVE_NICKNAME,
    
SAVE_IP,
    
SAVE_STEAMID
}

enum _:SaveInterval
{
    
SAVE_ON_DISCONNECT,
    
SAVE_ON_DEATH,
    
SAVE_ON_ROUND_END,
    
SAVE_ON_XP_CHANGE
}

enum _:SaveMethods
{
    
SAVE_NVAULT,
    
SAVE_MYSQL
}

enum _:HUDInfoVisibility
{
    
VIS_ALL_PLAYERS,
    
VIS_ONLY_ALIVE,
    
VIS_ONLY_DEAD,
    
VIS_DEAD_FREEZE_TIME
}

enum _:Sections
{
    
SECTION_NONE,
    
SECTION_SETTINGS,
    
SECTION_RANKS,
    
SECTION_XP_REWARDS
}

enum _:PlayerData
{
    
XP,
    
Level,
    
NextXP,
    
Rank[CRXRANKS_MAX_RANK_LENGTH],
    
NextRank[CRXRANKS_MAX_RANK_LENGTH],
    
HUDInfo[CRXRANKS_MAX_HUDINFO_LENGTH],
    
SaveInfo[CRXRANKS_MAX_PLAYER_INFO_LENGTH],
    
bool:HudInfoEnabled,
    
bool:IsOnFinalLevel,
    
bool:IsVIP,
    
bool:IsBot
}

enum _:Settings
{
    
SAVE_TYPE,
    
SAVE_INTERVAL,
    
bool:USE_MYSQL,
    
SQL_HOST[MAX_NAME_LENGTH],
    
SQL_USER[MAX_NAME_LENGTH],
    
SQL_PASSWORD[MAX_NAME_LENGTH],
    
SQL_DATABASE[MAX_NAME_LENGTH],
    
SQL_TABLE[MAX_NAME_LENGTH],
    
LEVELUP_MESSAGE_TYPE,
    
LEVELUP_SOUND[MAX_SOUND_LENGTH],
    
bool:LEVELUP_SCREEN_FADE_ENABLED,
    
LEVELUP_SCREEN_FADE_COLOR[4],
    
LEVELDN_SOUND[MAX_SOUND_LENGTH],
    
bool:LEVELDN_SCREEN_FADE_ENABLED,
    
LEVELDN_SCREEN_FADE_COLOR[4],
    
FINAL_LEVEL_FLAGS[MAX_NAME_LENGTH],
    
FINAL_LEVEL_FLAGS_BIT,
    
VIP_FLAGS[MAX_NAME_LENGTH],
    
VIP_FLAGS_BIT,
    
VAULT_NAME[MAX_NAME_LENGTH],
    
TEAM_LOCK,
    
MINIMUM_PLAYERS,
    
bool:IGNORE_BOTS,
    
bool:USE_COMBINED_EVENTS,
    
bool:NOTIFY_ON_KILL,
    
bool:HUDINFO_ENABLED,
    
HUDINFO_VISIBILITY,
    
bool:HUDINFO_TEAM_LOCK,
    
bool:HUDINFO_OTHER_PLAYERS,
    
HUDINFO_COLOR[3],
    
Float:HUDINFO_POSITION[2],
    
Float:HUDINFO_POSITION_DEAD[2],
    
bool:HUDINFO_USE_DHUD,
    
HUDINFO_FORMAT[CRXRANKS_MAX_HUDINFO_LENGTH],
    
HUDINFO_FORMAT_FINAL[CRXRANKS_MAX_HUDINFO_LENGTH],
    
HUDINFO_INVALID_TEXT[MAX_NAME_LENGTH],
    
bool:XP_NOTIFIER_ENABLED,
    
XP_NOTIFIER_COLOR_GET[3],
    
XP_NOTIFIER_COLOR_LOSE[3],
    
Float:XP_NOTIFIER_POSITION[2],
    
Float:XP_NOTIFIER_DURATION,
    
bool:XP_NOTIFIER_USE_DHUD
}

new 
g_eSettings[Settings]
new 
g_ePlayerData[MAX_PLAYERS 1][PlayerData]
new 
g_szMaxLevels[CRXRANKS_MAX_XP_LENGTH]
new 
g_szSqlError[MAX_SQL_LENGTH]
new 
Handle:g_iSqlTuple
new Array:g_aLevels
new Array:g_aRankNames
new Trie:g_tSettings
new Trie:g_tXPRewards
new Trie:g_tXPRewardsVIP
new bool:g_bIsCstrike
new bool:g_bFreezeTime

new g_iVault
new g_iMaxLevels
new g_iFlagZ
new g_iScreenFade
new g_iObject[2]

new 
g_fwdUserLevelUpdated
new g_fwdUserReceiveXP
new g_fwdUserXPUpdated
new g_fwdUserNameChanged

// !!!
public amxbans_admin_connect(id)
{
    if(
g_ePlayerData[id][Level] == g_iMaxLevels && g_eSettings[FINAL_LEVEL_FLAGS])
    {
        
set_user_flags(idg_eSettings[FINAL_LEVEL_FLAGS_BIT])
        
remove_user_flags(idg_iFlagZ)
    }
}

public 
plugin_init()
{
    
register_plugin("OciXCrom's Rank System"PLUGIN_VERSION"OciXCrom")
    
register_cvar("CRXRankSystem"PLUGIN_VERSIONFCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)

    
register_dictionary("RankSystem.txt")

    
register_event("DeathMsg""OnPlayerKilled""a")
    
register_event("SayText""OnSayText""a""2=#Cstrike_Name_Change")

    if(
g_eSettings[HUDINFO_VISIBILITY] == VIS_DEAD_FREEZE_TIME)
    {
        
register_event("HLTV""OnFreezeTimeStart""a""1=0""2=0")
        
register_logevent("OnRoundStart"2"1=Round_Start")
    }

    if(
g_eSettings[SAVE_INTERVAL] == SAVE_ON_ROUND_END)
    {
        
register_logevent("OnRoundEnd"2"1=Round_End")
    }

    if(
g_bIsCstrike)
    {
        
register_event("SendAudio""OnTeamWin""a""2&%!MRAD_terwin""2&%!MRAD_ctwin")
    }

    
register_clcmd("say /xplist",            "Cmd_XPList",      ADMIN_BAN)
    
register_clcmd("say_team /xplist",       "Cmd_XPList",      ADMIN_BAN)
    
register_clcmd("say /hudinfo",           "Cmd_HudInfo",     ADMIN_ALL)
    
register_clcmd("say_team /hudinfo",      "Cmd_HudInfo",     ADMIN_ALL)
    
register_concmd("crxranks_give_xp",      "Cmd_GiveXP",      ADMIN_LEVEL_F"<nick|#userid> <amount>")
    
register_concmd("crxranks_reset_xp",     "Cmd_ResetXP",     ADMIN_LEVEL_F"<nick|#userid>")

    if(
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] || g_eSettings[LEVELDN_SCREEN_FADE_ENABLED])
    {
        
g_iScreenFade get_user_msgid("ScreenFade")
    }

    
g_fwdUserLevelUpdated CreateMultiForward("crxranks_user_level_updated"ET_IGNOREFP_CELLFP_CELLFP_CELL)
    
g_fwdUserReceiveXP    CreateMultiForward("crxranks_user_receive_xp",    ET_STOP,   FP_CELLFP_CELLFP_CELL)
    
g_fwdUserXPUpdated    CreateMultiForward("crxranks_user_xp_updated",    ET_IGNOREFP_CELLFP_CELLFP_CELL)

    if(
g_eSettings[USE_MYSQL])
    {
        
g_iSqlTuple SQL_MakeDbTuple(g_eSettings[SQL_HOST], g_eSettings[SQL_USER], g_eSettings[SQL_PASSWORD], g_eSettings[SQL_DATABASE])

        new 
iErrorCodeHandle:iSqlConnection SQL_Connect(g_iSqlTupleiErrorCodeg_szSqlErrorcharsmax(g_szSqlError))

        if(
iSqlConnection == Empty_Handle)
        {
            
log_amx(g_szSqlError)
            
log_amx("%L"LANG_SERVER"CRXRANKS_MYSQL_FAILED")
            
g_eSettings[USE_MYSQL] = false
        
}
        else
        {
            
SQL_FreeHandle(iSqlConnection)
        }

        new 
szQuery[MAX_QUERY_LENGTH]

        
formatex(szQuerycharsmax(szQuery), "CREATE TABLE IF NOT EXISTS `%s` (`Player` VARCHAR(%i) NOT NULL, `XP` INT(%i) NOT NULL, `Level` INT(%i) NOT NULL,\
        `Next XP` INT(%i) NOT NULL, `Rank` VARCHAR(%i) NOT NULL, `Next Rank` VARCHAR(%i) NOT NULL, PRIMARY KEY(Player));"
,\
        
g_eSettings[SQL_TABLE], MAX_SQL_PLAYER_LENGTHCRXRANKS_MAX_XP_LENGTHCRXRANKS_MAX_XP_LENGTHCRXRANKS_MAX_XP_LENGTH,\
        
MAX_SQL_RANK_LENGTHMAX_SQL_RANK_LENGTH)

        
SQL_ThreadQuery(g_iSqlTuple"QueryHandler"szQuery)
    }

    if(!
g_eSettings[USE_MYSQL])
    {
        
g_iVault nvault_open(g_eSettings[VAULT_NAME])
    }
}

public 
plugin_precache()
{
    new 
szModname[MAX_NAME_LENGTH]
    
get_modname(szModnamecharsmax(szModname))

    if(
equal(szModname"cstrike") || equal(szModname"czero"))
    {
        
g_bIsCstrike true
    
}

    
g_aLevels ArrayCreate(1)
    
ArrayPushCell(g_aLevels0)

    
g_aRankNames ArrayCreate(MAX_NAME_LENGTH)
    
ArrayPushString(g_aRankNames"")

    
g_tSettings TrieCreate()
    
g_tXPRewards TrieCreate()
    
g_tXPRewardsVIP TrieCreate()

    
ReadFile()
}

public 
plugin_cfg()
{
    if(
g_eSettings[HUDINFO_VISIBILITY] == VIS_DEAD_FREEZE_TIME && get_cvar_num("mp_freezetime"))
    {
        
g_bFreezeTime true
    
}
}

public 
plugin_end()
{
    
ArrayDestroy(g_aLevels)
    
ArrayDestroy(g_aRankNames)
    
TrieDestroy(g_tSettings)
    
TrieDestroy(g_tXPRewards)
    
TrieDestroy(g_tXPRewardsVIP)
    
DestroyForward(g_fwdUserLevelUpdated)

    if(
g_eSettings[USE_MYSQL])
    {
        
SQL_FreeHandle(g_iSqlTuple)
    }
    else
    {
        
nvault_close(g_iVault)
    }
}

ReadFile()
{
    new 
szFilename[256]
    
get_configsdir(szFilenamecharsmax(szFilename))
    
add(szFilenamecharsmax(szFilename), "/RankSystem.ini")

    new 
iFilePointer fopen(szFilename"rt")

    if(
iFilePointer)
    {
        new 
szData[CRXRANKS_MAX_HUDINFO_LENGTH MAX_NAME_LENGTH], szValue[CRXRANKS_MAX_HUDINFO_LENGTH], szMap[MAX_NAME_LENGTH], szKey[MAX_NAME_LENGTH]
        new 
szTemp[4][5], bool:bRead truebool:bHasDeadPositioniiSizeiSection SECTION_NONE
        get_mapname
(szMapcharsmax(szMap))

        while(!
feof(iFilePointer))
        {
            
fgets(iFilePointerszDatacharsmax(szData))
            
trim(szData)

            switch(
szData[0])
            {
                case 
EOS'#'';': continue
                case 
'-':
                {
                    
iSize strlen(szData)

                    if(
szData[iSize 1] == '-')
                    {
                        
szData[0] = ' '
                        
szData[iSize 1] = ' '
                        
trim(szData)

                        if(
contain(szData"*") != -1)
                        {
                            
strtok(szDataszKeycharsmax(szKey), szValuecharsmax(szValue), '*')
                            
copy(szValuestrlen(szKey), szMap)
                            
bRead equal(szValueszKey) ? true false
                        
}
                        else
                        {
                            static const 
szAll[] = "#all"
                            
bRead equal(szDataszAll) || equali(szDataszMap)
                        }
                    }
                    else continue
                }
                case 
'[':
                {
                    
iSize strlen(szData)

                    if(
szData[iSize 1] == ']')
                    {
                        switch(
szData[1])
                        {
                            case 
'S''s'iSection SECTION_SETTINGS
                            
case 'R''r'iSection SECTION_RANKS
                            
case 'X''x'iSection SECTION_XP_REWARDS
                            
default: iSection SECTION_NONE
                        
}
                    }
                    else continue
                }
                default:
                {
                    if(!
bRead || iSection == SECTION_NONE)
                    {
                        continue
                    }

                    
strtok(szDataszKeycharsmax(szKey), szValuecharsmax(szValue), '=')
                    
trim(szKey); trim(szValue)

                    switch(
iSection)
                    {
                        case 
SECTION_SETTINGS:
                        {
                            
TrieSetString(g_tSettingsszKeyszValue)

                            if(
equal(szKey"CHAT_PREFIX"))
                            {
                                if(
g_bIsCstrike)
                                {
                                    
CC_SetPrefix(szValue)
                                }
                                else
                                {
                                    
copy(CC_PREFIXcharsmax(CC_PREFIX), szValue)
                                }
                            }
                            else if(
equal(szKey"SAVE_TYPE"))
                            {
                                
g_eSettings[SAVE_TYPE] = clamp(str_to_num(szValue), SAVE_NICKNAMESAVE_STEAMID)
                            }
                            else if(
equal(szKey"SAVE_INTERVAL"))
                            {
                                
g_eSettings[SAVE_INTERVAL] = clamp(str_to_num(szValue), SAVE_ON_DISCONNECTSAVE_ON_XP_CHANGE)
                            }
                            else if(
equal(szKey"USE_MYSQL"))
                            {
                                
g_eSettings[USE_MYSQL] = _:clamp(str_to_num(szValue), falsetrue)
                            }
                            else if(
equal(szKey"SQL_HOST"))
                            {
                                
copy(g_eSettings[SQL_HOST], charsmax(g_eSettings[SQL_HOST]), szValue)
                            }
                            else if(
equal(szKey"SQL_USER"))
                            {
                                
copy(g_eSettings[SQL_USER], charsmax(g_eSettings[SQL_USER]), szValue)
                            }
                            else if(
equal(szKey"SQL_PASSWORD"))
                            {
                                
copy(g_eSettings[SQL_PASSWORD], charsmax(g_eSettings[SQL_PASSWORD]), szValue)
                            }
                            else if(
equal(szKey"SQL_DATABASE"))
                            {
                                
copy(g_eSettings[SQL_DATABASE], charsmax(g_eSettings[SQL_DATABASE]), szValue)
                            }
                            else if(
equal(szKey"SQL_TABLE"))
                            {
                                
copy(g_eSettings[SQL_TABLE], charsmax(g_eSettings[SQL_TABLE]), szValue)
                            }
                            else if(
equal(szKey"XP_COMMANDS"))
                            {
                                while(
szValue[0] != && strtok(szValueszKeycharsmax(szKey), szValuecharsmax(szValue), ','))
                                {
                                    
trim(szKey); trim(szValue)
                                    
register_clcmd(szKey"Cmd_XP")
                                }
                            }
                            else if(
equal(szKey"LEVELUP_MESSAGE_TYPE"))
                            {
                                
g_eSettings[LEVELUP_MESSAGE_TYPE] = clamp(str_to_num(szValue), 02)
                            }
                            else if(
equal(szKey"LEVELUP_SOUND"))
                            {
                                
copy(g_eSettings[LEVELUP_SOUND], charsmax(g_eSettings[LEVELUP_SOUND]), szValue)

                                if(
szValue[0])
                                {
                                    
precache_sound_if_found(szValue)
                                }
                            }
                            else if(
equal(szKey"LEVELUP_SCREEN_FADE_ENABLED"))
                            {
                                
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            }
                            else if(
equal(szKey"LEVELUP_SCREEN_FADE_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))

                                for(
04i++)
                                {
                                    
g_eSettings[LEVELUP_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                                }
                            }
                            else if(
equal(szKey"LEVELDN_SOUND"))
                            {
                                
copy(g_eSettings[LEVELDN_SOUND], charsmax(g_eSettings[LEVELDN_SOUND]), szValue)

                                if(
szValue[0])
                                {
                                    
precache_sound_if_found(szValue)
                                }
                            }
                            else if(
equal(szKey"LEVELDN_SCREEN_FADE_ENABLED"))
                            {
                                
g_eSettings[LEVELDN_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            }
                            else if(
equal(szKey"LEVELDN_SCREEN_FADE_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))

                                for(
04i++)
                                {
                                    
g_eSettings[LEVELDN_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                                }
                            }
                            else if(
equal(szKey"FINAL_LEVEL_FLAGS"))
                            {
                                
copy(g_eSettings[FINAL_LEVEL_FLAGS], charsmax(g_eSettings[FINAL_LEVEL_FLAGS]), szValue)
                                
g_eSettings[FINAL_LEVEL_FLAGS_BIT] = read_flags(szValue)
                                
g_iFlagZ read_flags("z")
                            }
                            else if(
equal(szKey"VIP_FLAGS"))
                            {
                                
copy(g_eSettings[VIP_FLAGS], charsmax(g_eSettings[VIP_FLAGS]), szValue)
                                
g_eSettings[VIP_FLAGS_BIT] = read_flags(szValue)
                            }
                            else if(
equal(szKey"VAULT_NAME"))
                            {
                                
copy(g_eSettings[VAULT_NAME], charsmax(g_eSettings[VAULT_NAME]), szValue)
                            }
                            else if(
equal(szKey"TEAM_LOCK"))
                            {
                                
g_eSettings[TEAM_LOCK] = str_to_num(szValue)
                            }
                            else if(
equal(szKey"MINIMUM_PLAYERS"))
                            {
                                
g_eSettings[MINIMUM_PLAYERS] = clamp(str_to_num(szValue), 032)
                            }
                            else if(
equal(szKey"IGNORE_BOTS"))
                            {
                                
g_eSettings[IGNORE_BOTS] = _:clamp(str_to_num(szValue), falsetrue)
                            }
                            else if(
equal(szKey"USE_COMBINED_EVENTS"))
                            {
                                
g_eSettings[USE_COMBINED_EVENTS] = _:clamp(str_to_num(szValue), falsetrue)
                            }
                            else if(
equal(szKey"NOTIFY_ON_KILL"))
                            {
                                
g_eSettings[NOTIFY_ON_KILL] = _:clamp(str_to_num(szValue), falsetrue)
                            }
                            else if(
equal(szKey"HUDINFO_ENABLED"))
                            {
                                
g_eSettings[HUDINFO_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            }
                            else if(
equal(szKey"HUDINFO_VISIBILITY") || equal(szKey"HUDINFO_ALIVE_ONLY"/* changed in v3.9 */ )
                            {
                                
g_eSettings[HUDINFO_VISIBILITY] = clamp(str_to_num(szValue), VIS_ALL_PLAYERSVIS_DEAD_FREEZE_TIME)
                            }
                            else if(
equal(szKey"HUDINFO_TEAM_LOCK"))
                            {
                                
g_eSettings[HUDINFO_TEAM_LOCK] = _:clamp(str_to_num(szValue), falsetrue)
                            }
                            else if(
equal(szKey"HUDINFO_OTHER_PLAYERS"))
                            {
                                
g_eSettings[HUDINFO_OTHER_PLAYERS] = _:clamp(str_to_num(szValue), falsetrue)
                            }
                            else if(
equal(szKey"HUDINFO_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))

                                for(
03i++)
                                {
                                    
g_eSettings[HUDINFO_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                                }
                            }
                            else if(
equal(szKey"HUDINFO_POSITION"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))

                                for(
02i++)
                                {
                                    
g_eSettings[HUDINFO_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.01.0)
                                }
                            }
                            else if(
equal(szKey"HUDINFO_POSITION_DEAD"))
                            {
                                
bHasDeadPosition true
                                parse
(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))

                                for(
02i++)
                                {
                                    
g_eSettings[HUDINFO_POSITION_DEAD][i] = _:floatclamp(str_to_float(szTemp[i]), -1.01.0)
                                }
                            }
                            else if(
equal(szKey"HUDINFO_USE_DHUD"))
                            {
                                
g_eSettings[HUDINFO_USE_DHUD] = _:clamp(str_to_num(szValue), falsetrue)

                                if(!
g_eSettings[HUDINFO_USE_DHUD])
                                {
                                    
g_iObject[OBJ_HUDINFO] = CreateHudSyncObj()
                                }
                            }
                            else if(
equal(szKey"HUDINFO_FORMAT"))
                            {
                                
copy(g_eSettings[HUDINFO_FORMAT], charsmax(g_eSettings[HUDINFO_FORMAT]), szValue)
                            }
                            else if(
equal(szKey"HUDINFO_FORMAT_FINAL"))
                            {
                                
copy(g_eSettings[HUDINFO_FORMAT_FINAL], charsmax(g_eSettings[HUDINFO_FORMAT_FINAL]), szValue)
                            }
                            else if(
equal(szKey"HUDINFO_INVALID_TEXT"))
                            {
                                
copy(g_eSettings[HUDINFO_INVALID_TEXT], charsmax(g_eSettings[HUDINFO_INVALID_TEXT]), szValue)
                            }
                            else if(
equal(szKey"XP_NOTIFIER_ENABLED"))
                            {
                                
g_eSettings[XP_NOTIFIER_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            }
                            else if(
equal(szKey"XP_NOTIFIER_COLOR_GET"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))

                                for(
03i++)
                                {
                                    
g_eSettings[XP_NOTIFIER_COLOR_GET][i] = clamp(str_to_num(szTemp[i]), -1255)
                                }
                            }
                            else if(
equal(szKey"XP_NOTIFIER_COLOR_LOSE"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))

                                for(
03i++)
                                {
                                    
g_eSettings[XP_NOTIFIER_COLOR_LOSE][i] = clamp(str_to_num(szTemp[i]), -1255)
                                }
                            }
                            else if(
equal(szKey"XP_NOTIFIER_POSITION"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))

                                for(
02i++)
                                {
                                    
g_eSettings[XP_NOTIFIER_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.01.0)
                                }
                            }
                            else if(
equal(szKey"XP_NOTIFIER_DURATION"))
                            {
                                
g_eSettings[XP_NOTIFIER_DURATION] = _:floatclamp(str_to_float(szValue), 0.0float(cellmax))
                            }
                            else if(
equal(szKey"XP_NOTIFIER_USE_DHUD"))
                            {
                                
g_eSettings[XP_NOTIFIER_USE_DHUD] = _:clamp(str_to_num(szValue), falsetrue)

                                if(!
g_eSettings[XP_NOTIFIER_USE_DHUD])
                                {
                                    
g_iObject[OBJ_XP_NOTIFIER] = CreateHudSyncObj()
                                }
                            }
                        }
                        case 
SECTION_RANKS:
                        {
                            
ArrayPushCell(g_aLevelsg_iMaxLevels == max(str_to_num(szValue), 0))
                            
ArrayPushString(g_aRankNamesszKey)
                            
g_iMaxLevels++
                        }
                        case 
SECTION_XP_REWARDS:
                        {
                            static 
szReward[2][16]
                            
szReward[1][0] = EOS

                            parse
(szValueszReward[0], charsmax(szReward[]), szReward[1], charsmax(szReward[]))
                            
TrieSetCell(g_tXPRewardsszKeystr_to_num(szReward[0]))

                            if(
szReward[1][0])
                            {
                                
TrieSetCell(g_tXPRewardsVIPszKeystr_to_num(szReward[1]))
                            }
                        }
                    }
                }
            }
        }

        if(!
bHasDeadPosition)
        {
            for(
02i++)
            {
                
g_eSettings[HUDINFO_POSITION_DEAD][i] = _:g_eSettings[HUDINFO_POSITION][i]
            }
        }

        
num_to_str(g_iMaxLevelsg_szMaxLevelscharsmax(g_szMaxLevels))
        
fclose(iFilePointer)
    }
}

public 
client_connect(id)
{
    
reset_player_stats(id)

    switch(
g_eSettings[SAVE_TYPE])
    {
        case 
SAVE_NICKNAMEget_user_name(idg_ePlayerData[id][SaveInfo], charsmax(g_ePlayerData[][SaveInfo]))
        case 
SAVE_IP:       get_user_ip(idg_ePlayerData[id][SaveInfo], charsmax(g_ePlayerData[][SaveInfo]), 1)
        case 
SAVE_STEAMID:  get_user_authid(idg_ePlayerData[id][SaveInfo], charsmax(g_ePlayerData[][SaveInfo]))
    }

    
save_or_load(idg_ePlayerData[id][SaveInfo], SL_LOAD_DATA)

    
g_ePlayerData[id][IsBot] = is_user_bot(id) != 0
    set_task
(DELAY_ON_CONNECT"update_vip_status"id)

    if(
g_eSettings[HUDINFO_ENABLED])
    {
        
set_task(HUD_REFRESH_FREQ"DisplayHUD"id TASK_HUD, .flags "b")
    }
}

public 
client_disconnected(id)
{
    if(
g_eSettings[SAVE_INTERVAL] != SAVE_ON_XP_CHANGE)
    {
        
save_or_load(idg_ePlayerData[id][SaveInfo], SL_SAVE_DATA)
    }

    
remove_task(id TASK_HUD)
}

public 
OnSayText(iMsgiDestinationiEntity)
{
    
g_fwdUserNameChanged register_forward(FM_ClientUserInfoChanged"OnNameChange"1)
}

public 
OnNameChange(id)
{
    if(!
is_user_connected(id))
    {
        return
    }

    new 
szName[MAX_NAME_LENGTH]
    
get_user_name(idszNamecharsmax(szName))

    if(
g_eSettings[SAVE_TYPE] == SAVE_NICKNAME)
    {
        
save_or_load(idg_ePlayerData[id][SaveInfo], SL_SAVE_DATA)
        
copy(g_ePlayerData[id][SaveInfo], charsmax(g_ePlayerData[][SaveInfo]), szName)

        if(
g_eSettings[USE_MYSQL])
        {
            
reset_player_stats(id)
        }

        
save_or_load(idszNameSL_LOAD_DATA)
        
update_hudinfo(id)
    }

    
update_vip_status(id)
    
unregister_forward(FM_ClientUserInfoChangedg_fwdUserNameChanged1)
}

public 
DisplayHUD(id)
{
    
id -= TASK_HUD

    
if(!g_ePlayerData[id][HudInfoEnabled])
    {
        return
    }

    new 
bool:bIsAliveiTarget

    bIsAlive 
is_user_alive(id) != 0
    iTarget 
id

    
if(bIsAlive)
    {
        switch(
g_eSettings[HUDINFO_VISIBILITY])
        {
            case 
VIS_ONLY_DEAD: return
            case 
VIS_DEAD_FREEZE_TIME:
            {
                if(!
g_bFreezeTime)
                {
                    return
                }
            }
        }
    }
    else
    {
        if(
g_eSettings[HUDINFO_VISIBILITY] == VIS_ONLY_ALIVE)
        {
            return
        }

        if(
g_eSettings[HUDINFO_OTHER_PLAYERS])
        {
            
iTarget pev(idpev_iuser2)
        }
    }

    if(!
iTarget)
    {
        return
    }

    if(
g_eSettings[TEAM_LOCK] && g_eSettings[HUDINFO_TEAM_LOCK] && get_user_team(iTarget) != g_eSettings[TEAM_LOCK])
    {
        return
    }

    if(
g_eSettings[HUDINFO_USE_DHUD])
    {
        if(
bIsAlive)
        {
            
set_dhudmessage(HUDINFO_PARAMS)
        }
        else
        {
            
set_dhudmessage(HUDINFO_PARAMS_DEAD)
        }

        
show_dhudmessage(idg_ePlayerData[iTarget][HUDInfo])
    }
    else
    {
        if(
bIsAlive)
        {
            
set_hudmessage(HUDINFO_PARAMS)
        }
        else
        {
            
set_hudmessage(HUDINFO_PARAMS_DEAD)
        }

        
ShowSyncHudMsg(idg_iObject[OBJ_HUDINFO], g_ePlayerData[iTarget][HUDInfo])
    }
}

public 
bomb_planted(id)
{
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_PLANTED), CRXRANKS_XPS_REWARD)
}

public 
bomb_defused(id)
{
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_DEFUSED), CRXRANKS_XPS_REWARD)
}

public 
bomb_explode(id)
{
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_EXPLODED), CRXRANKS_XPS_REWARD)
}

public 
Cmd_XP(id)
{
    if(
g_ePlayerData[id][Level] == g_iMaxLevels)
    {
        
CC_SendMessage(id"%L"id"CRXRANKS_RANKINFO_FINAL"g_ePlayerData[id][XP], g_ePlayerData[id][Level], g_ePlayerData[id][Rank])
    }
    else
    {
        
CC_SendMessage(id"%L"id"CRXRANKS_RANKINFO_NORMAL"g_ePlayerData[id][XP], g_ePlayerData[id][NextXP],\
        
g_ePlayerData[id][Level], g_ePlayerData[id][Rank], g_ePlayerData[id][NextRank])
    }

    return 
PLUGIN_HANDLED
}

public 
Cmd_XPList(idiLeveliCid)
{
    if(!
cmd_access(idiLeveliCid1))
    {
        return 
PLUGIN_HANDLED
    
}

    new 
szTitle[128]
    
formatex(szTitlecharsmax(szTitle), "%L"id"CRXRANKS_MENU_TITLE")

    new 
iPlayers[MAX_PLAYERS], iPnumiMenu menu_create(szTitle"XPList_Handler")
    
get_players(iPlayersiPnum); SortCustom1D(iPlayersiPnum"sort_players_by_xp")

    for(new 
szItem[128], szName[MAX_NAME_LENGTH], iPlayeriiPnumi++)
    {
        
iPlayer iPlayers[i]
        
get_user_name(iPlayerszNamecharsmax(szName))
        
formatex(szItemcharsmax(szItem), "%L"id"CRXRANKS_ITEM_FORMAT"g_ePlayerData[iPlayer][XP], szNameg_ePlayerData[iPlayer][Level], g_ePlayerData[iPlayer][Rank])
        
menu_additem(iMenuszItem)
    }

    
menu_display(idiMenu)
    return 
PLUGIN_HANDLED
}

public 
Cmd_HudInfo(idiLeveliCid)
{
    if(!
cmd_access(idiLeveliCid1))
    {
        return 
PLUGIN_HANDLED
    
}

    if(!
g_eSettings[HUDINFO_ENABLED])
    {
        
CC_SendMessage(id"%L"id"CRXRANKS_HUDINFO_UNAVAILABLE")
        return 
PLUGIN_HANDLED
    
}

    
g_ePlayerData[id][HudInfoEnabled] = !g_ePlayerData[id][HudInfoEnabled]
    
CC_SendMessage(id"%L"idg_ePlayerData[id][HudInfoEnabled] ? "CRXRANKS_HUDINFO_ENABLED" "CRXRANKS_HUDINFO_DISABLED")
    return 
PLUGIN_HANDLED
}

public 
XPList_Handler(idiMenuiItem)
{
    
menu_destroy(iMenu)
    return 
PLUGIN_HANDLED
}

public 
Cmd_GiveXP(idiLeveliCid)
{
    if(!
cmd_access(idiLeveliCid3))
    {
        return 
PLUGIN_HANDLED
    
}

    new 
szPlayer[MAX_NAME_LENGTH]
    
read_argv(1szPlayercharsmax(szPlayer))

    new 
iPlayer cmd_target(idszPlayer0)

    if(!
iPlayer)
    {
        return 
PLUGIN_HANDLED
    
}

    new 
szName[2][MAX_NAME_LENGTH], szAmount[CRXRANKS_MAX_XP_LENGTH]
    
read_argv(2szAmountcharsmax(szAmount))
    
get_user_name(idszName[0], charsmax(szName[]))
    
get_user_name(iPlayerszName[1], charsmax(szName[]))

    new 
szKey[MAX_NAME_LENGTH], iXP str_to_num(szAmount)
    
give_user_xp(iPlayeriXPCRXRANKS_XPS_ADMIN)

    if(
iXP >= 0)
    {
        
copy(szKeycharsmax(szKey), "CRXRANKS_GIVE_XP")
    }
    else
    {
        
copy(szKeycharsmax(szKey), "CRXRANKS_TAKE_XP")
        
iXP *= -1
    
}

    
CC_LogMessage(0_"%L"idszKeyszName[0], iXPszName[1])
    return 
PLUGIN_HANDLED
}

public 
Cmd_ResetXP(idiLeveliCid)
{
    if(!
cmd_access(idiLeveliCid2))
    {
        return 
PLUGIN_HANDLED
    
}

    new 
szPlayer[MAX_NAME_LENGTH]
    
read_argv(1szPlayercharsmax(szPlayer))

    new 
iPlayer cmd_target(idszPlayerCMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF)

    if(!
iPlayer)
    {
        return 
PLUGIN_HANDLED
    
}

    new 
szName[2][MAX_NAME_LENGTH]
    
get_user_name(idszName[0], charsmax(szName[]))
    
get_user_name(iPlayerszName[1], charsmax(szName[]))

    
g_ePlayerData[iPlayer][XP] = 0
    check_level
(iPlayertrue)
    
CC_LogMessage(0_"%L"id"CRXRANKS_RESET_XP"szName[0], szName[1])

    if(
g_eSettings[SAVE_INTERVAL] == SAVE_ON_XP_CHANGE)
    {
        
save_or_load(iPlayerg_ePlayerData[iPlayer][SaveInfo], SL_SAVE_DATA)
    }

    return 
PLUGIN_HANDLED
}

public 
OnFreezeTimeStart()
{
    
g_bFreezeTime true
}

public 
OnRoundStart()
{
    
g_bFreezeTime false
}

public 
OnRoundEnd()
{
    new 
iPlayers[32], iPnum
    get_players
(iPlayersiPnum)

    for(new 
iiPlayeriPnumi++)
    {
        
iPlayer iPlayers[i]
        
save_or_load(iPlayerg_ePlayerData[iPlayer][SaveInfo], SL_SAVE_DATA)
    }
}

public 
OnTeamWin()
{
    new 
szTeam[MAX_TEAM_LENGTH], szWinTeam[MAX_TEAM_LENGTH], szLoseTeam[MAX_TEAM_LENGTH]
    
read_data(2szTeamcharsmax(szTeam))
    
copy(szWinTeamcharsmax(szWinTeam),   szTeam[7] == 'c' "CT" "TERRORIST")
    
copy(szLoseTeamcharsmax(szLoseTeam), szTeam[7] == 'c' "TERRORIST" "CT")

    if(
xp_reward_is_set(XPREWARD_TEAM_WIN))
    {
        
reward_team(szWinTeamXPREWARD_TEAM_WIN)
    }

    if(
xp_reward_is_set(XPREWARD_TEAM_LOSE))
    {
        
reward_team(szLoseTeamXPREWARD_TEAM_LOSE)
    }

    if(
szWinTeam[0] == 'C')
    {
        if(
xp_reward_is_set(XPREWARD_TEAM_WIN_CT))
        {
            
reward_team(szWinTeamXPREWARD_TEAM_WIN_CT)
        }

        if(
xp_reward_is_set(XPREWARD_TEAM_LOSE_T))
        {
            
reward_team(szLoseTeamXPREWARD_TEAM_LOSE_T)
        }
    }
    else
    {
        if(
xp_reward_is_set(XPREWARD_TEAM_WIN_T))
        {
            
reward_team(szWinTeamXPREWARD_TEAM_WIN_T)
        }

        if(
xp_reward_is_set(XPREWARD_TEAM_LOSE_CT))
        {
            
reward_team(szLoseTeamXPREWARD_TEAM_LOSE_CT)
        }
    }
}

public 
OnPlayerKilled()
{
    new 
szWeapon[16], iAttacker read_data(1), iVictim read_data(2), iXP
    read_data
(4szWeaponcharsmax(szWeapon))

    if(!
is_user_connected(iVictim))
    {
        return
    }

    if(
g_eSettings[SAVE_INTERVAL] == SAVE_ON_DEATH)
    {
        
save_or_load(iVictimg_ePlayerData[iVictim][SaveInfo], SL_SAVE_DATA)
    }

    if(
iAttacker == iVictim || equal(szWeapon"worldspawn") || equal(szWeapon"door"4) || equal(szWeapon"trigger_hurt"))
    {
        
iXP get_xp_reward(iVictimXPREWARD_SUICIDE)

        if(
g_eSettings[USE_COMBINED_EVENTS])
        {
            
iXP += get_xp_reward(iVictimXPREWARD_DEATH)
        }

        
give_user_xp(iVictimiXPCRXRANKS_XPS_REWARD)

        if(
should_send_kill_message(iXP))
        {
            
CC_SendMessage(iVictim"%L"iVictimiXP "CRXRANKS_NOTIFY_SUICIDE_GET" "CRXRANKS_NOTIFY_SUICIDE_LOSE"abs(iXP))
        }

        return
    }

    if(!
is_user_connected(iAttacker))
    {
        return
    }

    new 
iRewardiTemp

    
if(iAttacker == iVictim)
    {
        
iTemp get_xp_reward(iAttackerXPREWARD_SUICIDE)
        
iReward += iTemp

        
if(should_skip(iTemp))
        {
            goto @
GIVE_REWARD
        
}
    }
    else if(
get_user_team(iAttacker) == get_user_team(iVictim))
    {
        
iTemp get_xp_reward(iAttackerXPREWARD_TEAMKILL)
        
iReward += iTemp

        
if(should_skip(iTemp))
        {
            goto @
GIVE_REWARD
        
}
    }
    else
    {
        
iTemp get_xp_reward(iAttackerszWeapon)
        
iReward += iTemp

        
if(should_skip(iTemp))
        {
            goto @
GIVE_REWARD
        
}

        if(
read_data(3))
        {
            
iTemp get_xp_reward(iAttackerXPREWARD_HEADSHOT)
            
iReward += iTemp

            
if(should_skip(iTemp))
            {
                goto @
GIVE_REWARD
            
}
        }

        
iReward += get_xp_reward(iAttackerXPREWARD_KILL)
    }

    @
GIVE_REWARD:
    
iXP give_user_xp(iAttackeriRewardCRXRANKS_XPS_REWARD)

    if(
should_send_kill_message(iXP))
    {
        new 
szName[MAX_NAME_LENGTH]
        
get_user_name(iVictimszNamecharsmax(szName))
        
CC_SendMessage(iAttacker"%L"iAttackeriXP "CRXRANKS_NOTIFY_KILL_GET" "CRXRANKS_NOTIFY_KILL_LOSE"abs(iXP), szName)
    }

    
iXP give_user_xp(iVictimget_xp_reward(iVictimXPREWARD_DEATH), CRXRANKS_XPS_REWARD)

    if(
should_send_kill_message(iXP))
    {
        
CC_SendMessage(iVictim"%L"iVictimiXP "CRXRANKS_NOTIFY_DEATH_GET" "CRXRANKS_NOTIFY_DEATH_LOSE"abs(iXP))
    }
}

public 
sort_players_by_xp(id1id2)
{
    return 
g_ePlayerData[id2][XP] - g_ePlayerData[id1][XP]
}

public 
QueryHandler(iFailStateHandle:iQueryszError[], iErrorCode)
{
    
check_and_log_query_error(iFailStateszErroriErrorCode)
}

check_and_log_query_error(iFailState, const szError[], iErrorCode)
{
    switch(
iFailState)
    {
        case 
TQUERY_CONNECT_FAILEDlog_amx("[SQL Error] Connection failed (%i): %s"iErrorCodeszError)
        case 
TQUERY_QUERY_FAILED:   log_amx("[SQL Error] Query failed (%i): %s"iErrorCodeszError)
    }
}

bool:xp_reward_is_set(const szReward[])
{
    return 
TrieKeyExists(g_tXPRewardsszReward)
}

reward_team(const szTeam[], const szReward[])
{
    new 
iPlayers[MAX_PLAYERS], iPnum
    get_players
(iPlayersiPnum"e"szTeam)

    for(new 
iiPlayeriPnumi++)
    {
        
iPlayer iPlayers[i]
        
give_user_xp(iPlayerget_xp_reward(iPlayerszReward), CRXRANKS_XPS_REWARD)
    }
}

save_or_load(const id, const szInfo[], const iType)
{
    if(!
szInfo[0])
    {
        return
    }

    switch(
iType)
    {
        case 
SL_SAVE_DATA:
        {
            if(
g_eSettings[USE_MYSQL])
            {
                new 
szQuery[MAX_QUERY_LENGTH], szPlayer[MAX_SQL_PLAYER_LENGTH], szRank[MAX_SQL_RANK_LENGTH], szNextRank[MAX_SQL_RANK_LENGTH]

                
SQL_QuoteString(Empty_HandleszPlayercharsmax(szPlayer), szInfo)
                
SQL_QuoteString(Empty_HandleszRankcharsmax(szRank), g_ePlayerData[id][Rank])
                
SQL_QuoteString(Empty_HandleszNextRankcharsmax(szNextRank), g_ePlayerData[id][NextRank])

                
formatex(szQuerycharsmax(szQuery), "REPLACE INTO `%s` (`Player`, `XP`, `Level`, `Next XP`, `Rank`, `Next Rank`) VALUES ('%s', '%i', '%i', '%i', '%s', '%s');",\
                
g_eSettings[SQL_TABLE], szPlayerg_ePlayerData[id][XP], g_ePlayerData[id][Level], g_ePlayerData[id][NextXP], szRankszNextRank)
                
SQL_ThreadQuery(g_iSqlTuple"QueryHandler"szQuery)
            }
            else
            {
                new 
szData[CRXRANKS_MAX_XP_LENGTH]
                
num_to_str(g_ePlayerData[id][XP], szDatacharsmax(szData))
                
nvault_set(g_iVaultszInfoszData)
            }
        }
        case 
SL_LOAD_DATA:
        {
            if(
g_eSettings[USE_MYSQL])
            {
                new 
szPlayer[MAX_SQL_PLAYER_LENGTH]
                
SQL_QuoteString(Empty_HandleszPlayercharsmax(szPlayer), szInfo)

                new 
szQuery[MAX_QUERY_LENGTH]
                
formatex(szQuerycharsmax(szQuery), "SELECT XP FROM `%s` WHERE Player = '%s';"g_eSettings[SQL_TABLE], szPlayer)

                new 
iData[1]; iData[0] = id
                SQL_ThreadQuery
(g_iSqlTuple"QueryLoadData"szQueryiDatasizeof(iData))
            }
            else
            {
                new 
iData nvault_get(g_iVaultszInfo)
                
g_ePlayerData[id][XP] = iData clamp(iData0) : 0
                check_level
(idfalse)
            }
        }
    }
}

public 
QueryLoadData(iFailStateHandle:iQueryszError[], iErrorCodeiData[], iSize)
{
    new 
id iData[0]

    if(
SQL_NumResults(iQuery))
    {
        
g_ePlayerData[id][XP] = SQL_ReadResult(iQuery0)
    }
    
    
check_level(idfalse)
}

get_xp_reward(const id, const szKey[])
{
    new 
iReward

    
if(g_ePlayerData[id][IsVIP])
    {
        if(
TrieKeyExists(g_tXPRewardsVIPszKey))
        {
            
TrieGetCell(g_tXPRewardsVIPszKeyiReward)
            return 
iReward
        
}
    }

    if(
TrieKeyExists(g_tXPRewardsszKey))
    {
        
TrieGetCell(g_tXPRewardsszKeyiReward)
        return 
iReward
    
}

    return 
0
}

give_user_xp(const idiXPCRXRanks_XPSources:iSource CRXRANKS_XPS_PLUGIN)
{
    if(!
iXP)
    {
        return 
0
    
}

    if(
g_eSettings[IGNORE_BOTS] && g_ePlayerData[id][IsBot])
    {
        return 
0
    
}

    if(
iSource == CRXRANKS_XPS_REWARD)
    {
        if(
g_eSettings[MINIMUM_PLAYERS] && get_playersnum() < g_eSettings[MINIMUM_PLAYERS])
        {
            return 
0
        
}

        if(
g_eSettings[TEAM_LOCK] && get_user_team(id) != g_eSettings[TEAM_LOCK])
        {
            return 
0
        
}
    }
    
    
update_vip_status(id)

    new 
iReturn
    ExecuteForward
(g_fwdUserReceiveXPiReturnidiXPiSource)

    switch(
iReturn)
    {
        case 
CRXRANKS_HANDLED: return 0
        
case CRXRANKS_CONTINUE: { }
        default:
        {
            if(
iReturn != 0)
            {
                
iXP iReturn
            
}
        }
    }

    
g_ePlayerData[id][XP] += iXP

    
if(g_ePlayerData[id][XP] < 0)
    {
        
g_ePlayerData[id][XP] = 0
    
}

    if(
g_eSettings[SAVE_INTERVAL] == SAVE_ON_XP_CHANGE)
    {
        
save_or_load(idg_ePlayerData[id][SaveInfo], SL_SAVE_DATA)
    }

    
check_level(idtrue)
    
ExecuteForward(g_fwdUserXPUpdatediReturnidg_ePlayerData[id][XP], iSource)

    if(
g_eSettings[XP_NOTIFIER_ENABLED])
    {
        new 
szKey[MAX_NAME_LENGTH], bool:bPositive
        bPositive 
iXP >= 0

        copy
(szKeycharsmax(szKey), bPositive "CRXRANKS_XP_NOTIFIER_GET" "CRXRANKS_XP_NOTIFIER_LOSE")

        if(
g_eSettings[XP_NOTIFIER_USE_DHUD])
        {
            if(
bPositive)
            {
                
set_dhudmessage(XP_NOTIFIER_PARAMS_GET)
            }
            else
            {
                
set_dhudmessage(XP_NOTIFIER_PARAMS_LOSE)
            }

            
show_dhudmessage(id"%L"idszKeyabs(iXP))
        }
        else
        {
            if(
bPositive)
            {
                
set_hudmessage(XP_NOTIFIER_PARAMS_GET)
            }
            else
            {
                
set_hudmessage(XP_NOTIFIER_PARAMS_LOSE)
            }

            
ShowSyncHudMsg(idg_iObject[OBJ_XP_NOTIFIER], "%L"idszKeyabs(iXP))
        }
    }

    return 
iXP
}

precache_sound_if_found(const szValue[])
{
    new 
szSound[MAX_SOUND_LENGTH]
    
format(szSoundcharsmax(szSound), "sound/%s"szValue)

    if(
file_exists(szSound))
    {
        
precache_sound(szValue)
    }
    else
    {
        
log_amx("ERROR: sound file ^"%s^" not found"szValue)
    }
}

reset_player_stats(const id)
{
    
g_ePlayerData[id][XP] = 0
    g_ePlayerData
[id][Level] = 0
    g_ePlayerData
[id][NextXP] = 0
    g_ePlayerData
[id][Rank][0] = EOS
    g_ePlayerData
[id][NextRank][0] = EOS
    g_ePlayerData
[id][HUDInfo][0] = EOS
    g_ePlayerData
[id][HudInfoEnabled] = true
    g_ePlayerData
[id][IsOnFinalLevel] = false
    g_ePlayerData
[id][IsVIP] = false
    g_ePlayerData
[id][IsBot] = false
}

bool:has_argument(const szMessage[], const szArg[])
{
    return 
contain(szMessageszArg) != -1
}

bool:should_skip(const iNum)
{
    return (
iNum != && !g_eSettings[USE_COMBINED_EVENTS])
}

bool:should_send_kill_message(const iXP)
{
    return (
g_eSettings[NOTIFY_ON_KILL] && iXP != 0)
}

update_hudinfo(const id)
{
    if(!
g_eSettings[HUDINFO_ENABLED])
    {
        return
    }

    new 
szMessage[CRXRANKS_MAX_HUDINFO_LENGTH], szPlaceHolder[MAX_NAME_LENGTH], bool:bIsOnFinal

    bIsOnFinal 
g_ePlayerData[id][IsOnFinalLevel]
    
copy(szMessagecharsmax(szMessage), g_eSettings[bIsOnFinal HUDINFO_FORMAT_FINAL HUDINFO_FORMAT])

    if(
has_argument(szMessageARG_CURRENT_XP))
    {
        
num_to_str(g_ePlayerData[id][XP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_string(szMessagecharsmax(szMessage), ARG_CURRENT_XPszPlaceHolder)
    }

    if(
has_argument(szMessageARG_NEXT_XP))
    {
        
num_to_str(g_ePlayerData[id][NextXP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_string(szMessagecharsmax(szMessage), ARG_NEXT_XPszPlaceHolder)
    }

    if(
has_argument(szMessageARG_XP_NEEDED))
    {
        
num_to_str(g_ePlayerData[id][NextXP] - g_ePlayerData[id][XP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_string(szMessagecharsmax(szMessage), ARG_XP_NEEDEDszPlaceHolder)
    }

    if(
has_argument(szMessageARG_LEVEL))
    {
        
num_to_str(g_ePlayerData[id][Level], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_string(szMessagecharsmax(szMessage), ARG_LEVELszPlaceHolder)
    }

    if(
has_argument(szMessageARG_NEXT_LEVEL))
    {
        
num_to_str(g_ePlayerData[id][bIsOnFinal Level Level 1], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_string(szMessagecharsmax(szMessage), ARG_NEXT_LEVELszPlaceHolder)
    }

    
replace_string(szMessagecharsmax(szMessage), ARG_MAX_LEVELSg_szMaxLevels)

    if(
has_argument(szMessageARG_NAME))
    {
        
get_user_name(idszPlaceHoldercharsmax(szPlaceHolder))
        
replace_string(szMessagecharsmax(szMessage), ARG_NAMEszPlaceHolder)
    }

    
replace_string(szMessagecharsmax(szMessage), ARG_RANKg_ePlayerData[id][Rank])
    
replace_string(szMessagecharsmax(szMessage), ARG_NEXT_RANKg_ePlayerData[id][NextRank])
    
replace_string(szMessagecharsmax(szMessage), ARG_LINE_BREAK"^n")
    
copy(g_ePlayerData[id][HUDInfo], charsmax(g_ePlayerData[][HUDInfo]), szMessage)
}

check_level(const id, const bool:bNotify)
{
    new 
iLeveli

    
for(1g_iMaxLevels 1i++)
    {
        if(
g_ePlayerData[id][XP] >= ArrayGetCell(g_aLevelsi))
        {
            
iLevel++
        }
    }

    if(
iLevel != g_ePlayerData[id][Level])
    {
        new 
bool:bLevelUpiReturn
        bLevelUp 
iLevel g_ePlayerData[id][Level]
        
g_ePlayerData[id][Level] = iLevel
        ArrayGetString
(g_aRankNamesiLevelg_ePlayerData[id][Rank], charsmax(g_ePlayerData[][Rank]))

        if(
iLevel g_iMaxLevels)
        {
            
g_ePlayerData[id][IsOnFinalLevel] = false
            g_ePlayerData
[id][NextXP] = ArrayGetCell(g_aLevelsiLevel 1)
            
ArrayGetString(g_aRankNamesiLevel 1g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]))
        }
        else
        {
            
g_ePlayerData[id][IsOnFinalLevel] = true
            g_ePlayerData
[id][NextXP] = ArrayGetCell(g_aLevelsiLevel)
            
copy(g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]), g_eSettings[HUDINFO_INVALID_TEXT])

            if(
g_eSettings[FINAL_LEVEL_FLAGS])
            {
                
set_user_flags(idg_eSettings[FINAL_LEVEL_FLAGS_BIT])
                
remove_user_flags(idg_iFlagZ)
            }
        }

        
ExecuteForward(g_fwdUserLevelUpdatediReturnidiLevelbLevelUp)

        if(
bNotify && g_eSettings[LEVELUP_MESSAGE_TYPE])
        {
            new 
szName[MAX_NAME_LENGTH]
            
get_user_name(idszNamecharsmax(szName))

            if(
g_eSettings[LEVELUP_MESSAGE_TYPE] == 2)
            {
                new 
iPlayers[MAX_PLAYERS], iPlayeriPnum
                get_players
(iPlayersiPnum)

                for(
0iPnumi++)
                {
                    
iPlayer iPlayers[i]
                    
CC_SendMessage(iPlayer"%L"iPlayerbLevelUp "CRXRANKS_LEVEL_REACHED" "CRXRANKS_LEVEL_LOST"szNameg_ePlayerData[id][Level], g_ePlayerData[id][Rank])
                }
            }
            else
            {
                
CC_SendMessage(id"%L"idbLevelUp "CRXRANKS_LEVEL_REACHED" "CRXRANKS_LEVEL_LOST"szNameg_ePlayerData[id][Level], g_ePlayerData[id][Rank])
            }

            if(
bLevelUp && g_eSettings[LEVELUP_SOUND][0])
            {
                
emit_sound(idCHAN_AUTOg_eSettings[LEVELUP_SOUND], 1.0ATTN_NORM0PITCH_NORM)
            }
            else if(!
bLevelUp && g_eSettings[LEVELDN_SOUND][0])
            {
                
emit_sound(idCHAN_AUTOg_eSettings[LEVELDN_SOUND], 1.0ATTN_NORM0PITCH_NORM)
            }

            if(
g_eSettings[bLevelUp LEVELUP_SCREEN_FADE_ENABLED LEVELDN_SCREEN_FADE_ENABLED])
            {
                
message_begin(MSG_ONEg_iScreenFade, {000}, id)
                
write_short(1<<10)
                
write_short(1<<10)
                
write_short(0)

                if(
bLevelUp)
                {
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][0]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][1]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][2]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][3]))
                }
                else
                {
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][0]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][1]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][2]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][3]))
                }

                
message_end()
            }
        }
    }

    
update_hudinfo(id)
}

public 
update_vip_status(id)
{
    if(
is_user_connected(id) && g_eSettings[VIP_FLAGS_BIT] != ADMIN_ALL)
    {
        
g_ePlayerData[id][IsVIP] = bool:((get_user_flags(id) & g_eSettings[VIP_FLAGS_BIT]) == g_eSettings[VIP_FLAGS_BIT])
    }
}

public 
plugin_natives()
{
    
register_library("crxranks")
    
register_native("crxranks_get_chat_prefix",         "_crxranks_get_chat_prefix")
    
register_native("crxranks_get_final_flags",         "_crxranks_get_final_flags")
    
register_native("crxranks_get_hudinfo_format",      "_crxranks_get_hudinfo_format")
    
register_native("crxranks_get_max_levels",          "_crxranks_get_max_levels")
    
register_native("crxranks_get_rank_by_level",       "_crxranks_get_rank_by_level")
    
register_native("crxranks_get_save_type",           "_crxranks_get_save_type")
    
register_native("crxranks_get_setting",             "_crxranks_get_setting")
    
register_native("crxranks_get_user_hudinfo",        "_crxranks_get_user_hudinfo")
    
register_native("crxranks_get_user_level",          "_crxranks_get_user_level")
    
register_native("crxranks_get_user_next_rank",      "_crxranks_get_user_next_rank")
    
register_native("crxranks_get_user_next_xp",        "_crxranks_get_user_next_xp")
    
register_native("crxranks_get_user_rank",           "_crxranks_get_user_rank")
    
register_native("crxranks_get_user_xp",             "_crxranks_get_user_xp")
    
register_native("crxranks_get_vault_name",          "_crxranks_get_vault_name")
    
register_native("crxranks_get_vip_flags",           "_crxranks_get_vip_flags")
    
register_native("crxranks_get_xp_for_level",        "_crxranks_get_xp_for_level")
    
register_native("crxranks_get_xp_reward",           "_crxranks_get_xp_reward")
    
register_native("crxranks_give_user_xp",            "_crxranks_give_user_xp")
    
register_native("crxranks_has_user_hudinfo",        "_crxranks_has_user_hudinfo")
    
register_native("crxranks_is_hi_using_dhud",        "_crxranks_is_hi_using_dhud")
    
register_native("crxranks_is_hud_enabled",          "_crxranks_is_hud_enabled")
    
register_native("crxranks_is_sfdn_enabled",         "_crxranks_is_sfdn_enabled")
    
register_native("crxranks_is_sfup_enabled",         "_crxranks_is_sfup_enabled")
    
register_native("crxranks_is_user_on_final",        "_crxranks_is_user_on_final")
    
register_native("crxranks_is_user_vip",             "_crxranks_is_user_vip")
    
register_native("crxranks_is_using_mysql",          "_crxranks_is_using_mysql")
    
register_native("crxranks_is_xpn_enabled",          "_crxranks_is_xpn_enabled")
    
register_native("crxranks_is_xpn_using_dhud",       "_crxranks_is_xpn_using_dhud")
    
register_native("crxranks_set_user_xp",             "_crxranks_set_user_xp")
    
register_native("crxranks_using_comb_events",       "_crxranks_using_comb_events")
    
register_native("crxranks_xp_reward_is_set",        "_crxranks_xp_reward_is_set")
}

public 
_crxranks_get_chat_prefix(iPluginiParams)
{
    
set_string(1CC_PREFIXget_param(2))
}

public 
_crxranks_get_final_flags(iPluginiParams)
{
    
set_string(1g_eSettings[FINAL_LEVEL_FLAGS], get_param(2))
    return 
g_eSettings[FINAL_LEVEL_FLAGS_BIT]
}

public 
_crxranks_get_hudinfo_format(iPluginiParams)
{
    
set_string(2g_eSettings[get_param(1) ? HUDINFO_FORMAT_FINAL HUDINFO_FORMAT], get_param(3))
}

public 
_crxranks_get_max_levels(iPluginiParams)
{
    return 
g_iMaxLevels
}

public 
_crxranks_get_rank_by_level(iPluginiParams)
{
    new 
iLevel get_param(1)

    if(
iLevel || iLevel g_iMaxLevels)
    {
        return 
0
    
}

    new 
szRank[CRXRANKS_MAX_RANK_LENGTH]
    
ArrayGetString(g_aRankNamesiLevelszRankcharsmax(szRank))
    
set_string(2szRankget_param(3))
    return 
1
}

public 
_crxranks_get_save_type(iPluginiParams)
{
    return 
g_eSettings[SAVE_TYPE]
}

public 
bool:_crxranks_get_setting(iPluginiParams)
{
    new 
szKey[MAX_NAME_LENGTH], szValue[CRXRANKS_MAX_HUDINFO_LENGTH], bool:bReturn
    get_string
(1szKeycharsmax(szKey))

    
bReturn TrieGetString(g_tSettingsszKeyszValuecharsmax(szValue))
    
set_string(2szValueget_param(3))
    return 
bReturn
}

public 
_crxranks_get_user_hudinfo(iPluginiParams)
{
    
set_string(2g_ePlayerData[get_param(1)][HUDInfo], get_param(3))
}

public 
_crxranks_get_user_level(iPluginiParams)
{
    return 
g_ePlayerData[get_param(1)][Level]
}

public 
_crxranks_get_user_next_rank(iPluginiParams)
{
    
set_string(2g_ePlayerData[get_param(1)][NextRank], get_param(3))
}

public 
_crxranks_get_user_next_xp(iPluginiParams)
{
    return 
g_ePlayerData[get_param(1)][NextXP]
}

public 
_crxranks_get_user_rank(iPluginiParams)
{
    
set_string(2g_ePlayerData[get_param(1)][Rank], get_param(3))
}

public 
_crxranks_get_user_xp(iPluginiParams)
{
    return 
g_ePlayerData[get_param(1)][XP]
}

public 
_crxranks_get_vault_name(iPluginiParams)
{
    
set_string(1g_eSettings[VAULT_NAME], get_param(2))
}

public 
_crxranks_get_vip_flags(iPluginiParams)
{
    
set_string(1g_eSettings[VIP_FLAGS], get_param(2))
    return 
g_eSettings[VIP_FLAGS_BIT]
}

public 
_crxranks_get_xp_for_level(iPluginiParams)
{
    new 
iLevel get_param(1)

    if(
iLevel || iLevel g_iMaxLevels)
    {
        return -
1
    
}

    return 
ArrayGetCell(g_aLevelsiLevel)
}

public 
_crxranks_get_xp_reward(iPluginiParams)
{
    new 
szReward[CRXRANKS_MAX_XP_REWARD_LENGTH]
    
get_string(2szRewardcharsmax(szReward))
    return 
get_xp_reward(get_param(1), szReward)
}

public 
_crxranks_give_user_xp(iPluginiParams)
{
    new 
szReward[CRXRANKS_MAX_XP_REWARD_LENGTH], iRewardid get_param(1)
    
get_string(3szRewardcharsmax(szReward))

    if(
szReward[0])
    {
        
iReward get_xp_reward(idszReward)

        if(
iReward)
        {
            
give_user_xp(idiRewardCRXRanks_XPSources:get_param(4))
        }

        return 
iReward
    
}

    
iReward get_param(2)
    
give_user_xp(idiRewardCRXRanks_XPSources:get_param(4))
    return 
iReward
}

public 
bool:_crxranks_has_user_hudinfo(iPluginiParams)
{
    return 
g_ePlayerData[get_param(1)][HudInfoEnabled]
}

public 
bool:_crxranks_is_hi_using_dhud(iPluginiParams)
{
    return 
g_eSettings[HUDINFO_USE_DHUD]
}

public 
bool:_crxranks_is_hud_enabled(iPluginiParams)
{
    return 
g_eSettings[HUDINFO_ENABLED]
}

public 
bool:_crxranks_is_sfdn_enabled(iPluginiParams)
{
    return 
g_eSettings[LEVELDN_SCREEN_FADE_ENABLED]
}

public 
bool:_crxranks_is_sfup_enabled(iPluginiParams)
{
    return 
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED]
}

public 
bool:_crxranks_is_user_on_final(iPluginiParams)
{
    return 
g_ePlayerData[get_param(1)][IsOnFinalLevel]
}

public 
bool:_crxranks_is_user_vip(iPluginiParams)
{
    return 
g_ePlayerData[get_param(1)][IsVIP]
}

public 
bool:_crxranks_is_using_mysql(iPluginiParams)
{
    return 
g_eSettings[USE_MYSQL]
}

public 
bool:_crxranks_is_xpn_enabled(iPluginiParams)
{
    return 
g_eSettings[XP_NOTIFIER_ENABLED]
}

public 
bool:_crxranks_is_xpn_using_dhud(iPluginiParams)
{
    return 
g_eSettings[XP_NOTIFIER_USE_DHUD]
}


public 
bool:_crxranks_set_user_xp(iPluginiParams)
{
    new 
iReturnid get_param(1), CRXRanks_XPSources:iSource CRXRanks_XPSources:get_param(3)
    
g_ePlayerData[id][XP] = clamp(get_param(2), 0)

    if(
g_eSettings[SAVE_INTERVAL] == SAVE_ON_XP_CHANGE)
    {
        
save_or_load(idg_ePlayerData[id][SaveInfo], SL_SAVE_DATA)
    }

    
check_level(idtrue)
    
ExecuteForward(g_fwdUserXPUpdatediReturnidg_ePlayerData[id][XP], iSource)
}

public 
bool:_crxranks_using_comb_events(iPluginiParams)
{
    return 
g_eSettings[USE_COMBINED_EVENTS]
}

public 
bool:_crxranks_xp_reward_is_set(iPluginiParams)
{
    new 
szReward[CRXRANKS_MAX_XP_REWARD_LENGTH]
    
get_string(1szRewardcharsmax(szReward))
    return 
xp_reward_is_set(szReward)



thebest24 07-28-2021 12:44

Re: Base Builder Zombies with level system help
 
no solution?

amirwolf 07-28-2021 15:48

Re: Base Builder Zombies with level system help
 
https://forums.alliedmods.net/showthread.php?t=170968

diegodarknes 08-03-2021 22:30

Re: Base Builder Zombies with level system help
 
3 Attachment(s)
hola una pregunta alguiem puede decopilarme estos tres archivos de .sma a .amxx por favor soy nuevo me gustaria que me den unos tipos de tips por favor me alegraria mucho si me lo copilan asi como estan se los agradeceria un monon pero yo lo trate de copilar pero me marcan errores de seguro algunos de ustedes no les salfdran ningun error por favor el me me pueda pasar estos archivos sma a amxx se lo agradeceria un monton


All times are GMT -4. The time now is 02:41.

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