User
Pass
2FA
 
 

zombie_xp

 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Freakz Forum Index -> Trash Bin -> CS 2006-2019 (Archived) -> Resources
Author Message2225
mitrilarobert

[Raw 3>Freakz.]



Status: Offline
(since 30-01-2019 17:42)
Joined: 22 Jul 2010
Posts: 628, Topics: 65
Location: Targoviste

Reputation: -0.6
Votes: 26

Post Posted: 18-08-2013, 15:08:31 | Translate post to: ... (Click for more languages)

Cine are un zombie_xp fara buguri?
0 0
  
Back to top
View user's profile Send private message
Happy =]]

[I'm in your mind !]



Status: Offline
(since 02-05-2020 11:17)
Joined: 17 Mar 2012
Posts: 10538, Topics: 450
Location: In mintea ta !

Reputation: 553
Votes: 204

         
Post Posted: 18-08-2013, 17:50:46 | Translate post to: ... (Click for more languages)

1
2
3
4






Pentru orice problema PM.
Nu ofer asistenta in privat.

0 0
  
Back to top
View user's profile Send private message Yahoo! Messenger ID
mitrilarobert

[Raw 3>Freakz.]



Status: Offline
(since 30-01-2019 17:42)
Joined: 22 Jul 2010
Posts: 628, Topics: 65
Location: Targoviste

Reputation: -0.6
Votes: 26

Post Posted: 18-08-2013, 18:08:48 | Translate post to: ... (Click for more languages)

Care zici cai cel mai bun dintre toate si nu are buguri?
0 0
  
Back to top
View user's profile Send private message
Happy =]]

[I'm in your mind !]



Status: Offline
(since 02-05-2020 11:17)
Joined: 17 Mar 2012
Posts: 10538, Topics: 450
Location: In mintea ta !

Reputation: 553
Votes: 204

         
Post Posted: 18-08-2013, 18:27:35 | Translate post to: ... (Click for more languages)

Cele de pe alien sunt cele mai de incredere, oricum daca au bug-uri au toate .sma si se pot rezolva [ poate ] .





Pentru orice problema PM.
Nu ofer asistenta in privat.

0 0
  
Back to top
View user's profile Send private message Yahoo! Messenger ID
mitrilarobert

[Raw 3>Freakz.]



Status: Offline
(since 30-01-2019 17:42)
Joined: 22 Jul 2010
Posts: 628, Topics: 65
Location: Targoviste

Reputation: -0.6
Votes: 26

Post Posted: 20-08-2013, 21:50:14 | Translate post to: ... (Click for more languages)

Altul daca se poate ce mi-ai dat acolo au buguri.
0 0
  
Back to top
View user's profile Send private message
Khajiit

[Away]



Status: Offline
(since 01-04-2019 20:33)
Joined: 19 Jun 2013
Posts: 3428, Topics: 110
Location: Away for a long time.

Reputation: 48.4
Votes: 145

          Battletag: postrow.ID_BATTLE_NET}  am-nevoie-de-iconite-la-profil 
Post Posted: 20-08-2013, 22:05:32 | Translate post to: ... (Click for more languages)

Nu inteleg de ce folosesti porcaria aia de sistem XP pe addon-ul tau. Incearca si tu, LEVEL XP NORMAL, si e mai simplu + fara buguri.
0 0
  
Back to top
View user's profile Send private message Yahoo! Messenger ID
mitrilarobert

[Raw 3>Freakz.]



Status: Offline
(since 30-01-2019 17:42)
Joined: 22 Jul 2010
Posts: 628, Topics: 65
Location: Targoviste

Reputation: -0.6
Votes: 26

Post Posted: 20-08-2013, 22:09:43 | Translate post to: ... (Click for more languages)

Si pot avea clase de zm si om ?
0 0
  
Back to top
View user's profile Send private message
mitrilarobert

[Raw 3>Freakz.]



Status: Offline
(since 30-01-2019 17:42)
Joined: 22 Jul 2010
Posts: 628, Topics: 65
Location: Targoviste

Reputation: -0.6
Votes: 26

Post Posted: 21-08-2013, 15:11:58 | Translate post to: ... (Click for more languages)

Imi puteti da careva un zombie xp bun sau sa creati voi unul daca va pricepeti...
0 0
  
Back to top
View user's profile Send private message
mitrilarobert

[Raw 3>Freakz.]



Status: Offline
(since 30-01-2019 17:42)
Joined: 22 Jul 2010
Posts: 628, Topics: 65
Location: Targoviste

Reputation: -0.6
Votes: 26

Post Posted: 21-08-2013, 20:22:10 | Translate post to: ... (Click for more languages)

Code:
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <fakemeta>
#include <zombieplague>
#include <hamsandwich>
#include <dhudmessage>
#include <fun>

/*================================================================================
   Info
==================================================================================

Zombie XP Mode by redomin8
MeRcyLeZZ coded a huuuuge portion of the code, and I learned
from his genius and maybe made some changes (some was perfect)

Also, I'd very much like to thank G-Dog for all the help with creating
ZP Bank, I used his code to learn nvault. Good job guys!

Thanks to AssKicR and xeroblood for making ExplodeString.

Enjoy it, take it apart, make a better one. Have fun!

================================================================================
   Editable Section follows
================================================================================*/

// Uncomment to have an item added to zp's extra menu
#define TRIGGER_ZP_ITEM

// Uncomment to use say commands like "xp", "levels", "class", etc
#define TRIGGER_SAYMENU

// Uncomment if you have redomin8's [ZP] Bank - With Autosave installed (fixes spending spree bug)
//#define ZP_BANK_AUTOSAVE

// Uncomment to allow experimental menu alignment
//#define ZP_ALIGN_TEXT

//Uncomment to give levels to people
//#define ZP_GAMERUINER

//Uncomment to automatically bind a letter to show our menu
#define ZP_BINDMENU "j"

/*================================================================================
   End Editable Section
================================================================================*/

#if defined TRIGGER_ZP_ITEM
new g_TriggerItem
#endif
#if defined ZP_BANK_AUTOSAVE
//compatibility with zp_banks spending spree mode
native zp_bank_get_packs(id)
native zp_bank_set_packs(id, value)
#endif

// Plugin info
static const PLUGIN_NAME[] = "ZP XP by redomin8"
static const PLUGIN_VERSION[] = "0.8"

// Forwards for our zombie plugins
new g_fwRoundStart, g_fwDummyResult

// nVault parameters
new gvault;
#define VAULT_LEVEL 0
#define VAULT_HCLASS 1
#define VAULT_ZCLASS 2

// Internal variables
enum pcvar
{
   enable = 0,
   packslevelup //(current level) * packslevelup = price to level up
}
new pcvars[pcvar];
new userLevel[33], username[33][32], userNeededPacks[33]
new g_modname[32] // for formating the mod name
new g_maxplayers // max players counter

/*================================================================================
   Required Code from zombie_plague (modified to suite the plugin)
================================================================================*/

const MAX_CLASSSES = 40

// Note: keep g_zclass_name and g_hclass_name the same array size!
// Zombie Classes vars
new g_zclass_name[MAX_CLASSSES][32] // name
new g_zclass_info[MAX_CLASSSES][32] // description
new g_zclass_model[MAX_CLASSSES][32] // player model
new g_zclass_clawmodel[MAX_CLASSSES][32] // claw model
new g_zclass_hp[MAX_CLASSSES] // health
new g_zclass_spd[MAX_CLASSSES] // speed
new g_zclass_lvl[40] // level
new Float:g_zclass_grav[MAX_CLASSSES] // gravity
new Float:g_zclass_kb[MAX_CLASSSES] // knockback
new g_zclass_load[MAX_CLASSSES][40] // loading identifier
new g_zclass_i // loaded zombie classes counter

// Human Classes vars
new g_hclass_name[MAX_CLASSSES][32] // name
new g_hclass_info[MAX_CLASSSES][32] // description
new g_hclass_model[MAX_CLASSSES][32] // player model
new g_hclass_weapons[MAX_CLASSSES][32] // claw model
new g_hclass_hp[MAX_CLASSSES] // health
new g_hclass_spd[MAX_CLASSSES] // speed
new g_hclass_lvl[40] // level
new Float:g_hclass_grav[MAX_CLASSSES] // gravity
new g_hclass_load[MAX_CLASSSES][40] // loading identifier
new g_hclass_i // loaded zombie classes counter

// For menu handlers
#define ZCLASSES_STARTID g_menu_data[id][0]
#define ZCLASSES_SELECTION (g_menu_data[id][0]+key)
#define HCLASSES_STARTID g_menu_data[id][1]
#define HCLASSES_SELECTION (g_menu_data[id][1]+key)
new g_menu_data[33][8] // data for various menus
const MENU_KEY_BACK = 7
const MENU_KEY_NEXT = 8
const MENU_KEY_EXIT = 9
const KEYSMENU = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)

// Cvars
new cvar_welcomemsg, cvar_removeweapons, cvar_removexp, cvar_removezombie;

// Vars
new g_zombieclassnext[33] // zombie class for next infection
new g_humanclassnext[33] // zombie class for next infection
new g_zombieclass[33] // zombie class
new g_humanclass[33] // zombie class
new g_resetparams[33] // reset params?
new bool:g_hclass_showmenu[33]
new bool:g_zclass_showmenu[33]

const OFFSET_CSTEAMS = 114
const OFFSET_LINUX = 5 // offsets 5 higher in Linux builds
enum
{
   CS_TEAM_UNASSIGNED = 0,
   CS_TEAM_T,
   CS_TEAM_CT,
   CS_TEAM_SPECTATOR
}
new g_freezetime; // whether it's freeze time
new bool:g_human[33]; // is zombie
new bool:loadedZombies //bugfix for cvar_removezombies being enabled after it was disabled first (and no zombies loaded)
/* --- FOR OUR HUD --- */
// Tasks for events
enum (+= 100)
{
   TASK_SHOWHUD
}

// IDs inside tasks
#define ID_SHOWHUD (taskid - TASK_SHOWHUD)

// Message sync object
new g_MsgSync2

// Message IDs vars
new g_msgSayText

// Constants
const PEV_SPEC_TARGET = pev_iuser2
new const textHeader[] = "[ZPXP]"
new const textHeaderOrig[] = "[ZP]" //imitate Zombie Plague alerts

// HUD messages
const Float:HUD_EVENT_X = -1.0
const Float:HUD_EVENT_Y = 0.17
const Float:HUD_INFECT_X = 0.05
const Float:HUD_INFECT_Y = 0.45
const Float:HUD_SPECT_X = 0.6
const Float:HUD_SPECT_Y = 0.85
const Float:HUD_STATS_X = 1.005 //changed to right align
const Float:HUD_STATS_Y = 0.9

/*================================================================================
   Constants JUST for giving guns
================================================================================*/

// CS Offsets
#if cellbits == 32
const OFFSET_CSTEAMS = 114
const OFFSET_CSMONEY = 115
const OFFSET_NVGOGGLES = 129
const OFFSET_ZOOMTYPE = 363
const OFFSET_CSDEATHS = 444
const OFFSET_AWM_AMMO  = 377
const OFFSET_SCOUT_AMMO = 378
const OFFSET_PARA_AMMO = 379
const OFFSET_FAMAS_AMMO = 380
const OFFSET_M3_AMMO = 381
const OFFSET_USP_AMMO = 382
const OFFSET_FIVESEVEN_AMMO = 383
const OFFSET_DEAGLE_AMMO = 384
const OFFSET_P228_AMMO = 385
const OFFSET_GLOCK_AMMO = 386
const OFFSET_FLASH_AMMO = 387
const OFFSET_HE_AMMO = 388
const OFFSET_SMOKE_AMMO = 389
const OFFSET_C4_AMMO = 390
const OFFSET_CLIPAMMO = 51
#else
const OFFSET_CSTEAMS = 139
const OFFSET_CSMONEY = 140
const OFFSET_NVGOGGLES = 155
const OFFSET_ZOOMTYPE = 402
const OFFSET_CSDEATHS = 493
const OFFSET_AWM_AMMO  = 426
const OFFSET_SCOUT_AMMO = 427
const OFFSET_PARA_AMMO = 428
const OFFSET_FAMAS_AMMO = 429
const OFFSET_M3_AMMO = 430
const OFFSET_USP_AMMO = 431
const OFFSET_FIVESEVEN_AMMO = 432
const OFFSET_DEAGLE_AMMO = 433
const OFFSET_P228_AMMO = 434
const OFFSET_GLOCK_AMMO = 435
const OFFSET_FLASH_AMMO = 46
const OFFSET_HE_AMMO = 437
const OFFSET_SMOKE_AMMO = 438
const OFFSET_C4_AMMO = 439
const OFFSET_CLIPAMMO = 65
#endif

// Buy Menu: Primary and Secondary Weapons
new const g_primary_items[][] = { "weapon_galil", "weapon_famas", "weapon_m4a1", "weapon_ak47", "weapon_sg552", "weapon_aug", "weapon_scout",
            "weapon_m3", "weapon_xm1014", "weapon_tmp", "weapon_mac10", "weapon_ump45", "weapon_mp5navy", "weapon_p90" }
new const g_secondary_items[][] = { "weapon_glock18", "weapon_usp", "weapon_p228", "weapon_deagle", "weapon_fiveseven", "weapon_elite" }


// Max BP ammo for weapons
new const MAXBPAMMO[] = { -1, 52, -1, 90, 1, 32, 32, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120,
         30, 120, 200, 32, 90, 120, 90, 2, 35, 90, 90, -1, 100 }

// Additional Items to give after buying all weapons (e.g. grenades)
new const g_additional_items[][] = { "weapon_hegrenade", "weapon_flashbang", "weapon_smokegrenade" }

// Weapon bitsums
const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
const SECONDARY_WEAPONS_BIT_SUM = (1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE)

const PEV_ADDITIONAL_AMMO = pev_iuser1

/*================================================================================
   The code starts here
================================================================================*/

public plugin_precache()
{
   // Register all our cvars
   cvar_welcomemsg = register_cvar("zp_xp_welcomemsg", "1");
   cvar_removeweapons = register_cvar("zp_xp_removeweapons", "0");
   cvar_removexp = register_cvar("zp_xp_removexp", "0");
   cvar_removezombie = register_cvar("zp_xp_removezombie", "0");
}

public plugin_init()
{
   // Register the plugin
   register_plugin(PLUGIN_NAME, PLUGIN_VERSION, "Huh?")
   
   // Language files
   register_dictionary("zombie_xp.txt")

   // Register the menus
   register_menu("Game Menu", KEYSMENU, "menu_game")
   register_menu("Zombie Class Menu", KEYSMENU, "menu_zclass")
   register_menu("Human Class Menu", KEYSMENU, "menu_hclass")
   
   // For setting human's skills
   register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
   
   // For setting the user human on connecting
   RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
   
   // For setting humans speed also
   register_logevent("logevent_round_start",2, "1=Round_Start")
   
   // Register event round start for humans
   register_event("HLTV", "event_round_start", "a", "1=0", "2=0");
   
   // Register forward for our plugins
   g_fwRoundStart = CreateMultiForward("zp_round_started_human", ET_IGNORE, FP_CELL)
      
   // Set our vars to disable zombie plague functions
   set_task(1.0, "set_cvars")
   
   // Register variables
   pcvars[enable] = register_cvar("zp_xp_enable", "1")
   pcvars[packslevelup] = 15
   
   // Register client commands
   register_clcmd("zp_xp_costscale", "SetPacksLevelUp")
   register_clcmd("zp_xp_set_level", "SetLevel")
   register_clcmd("zp_xp_removexp", "RemoveXP")
   register_clcmd("zp_xp_removezombies", "RemoveZombies")
   register_clcmd("zp_xp_removeweapons", "RemoveWeapons")
   
   //trigger for handling the menu
   #if defined TRIGGER_ZP_ITEM
   g_TriggerItem = zp_register_extra_item("Zombie XP Menu", 0, 0)
   #endif
   #if defined TRIGGER_SAYMENU
   register_clcmd("say xp", "handle_say_xp")
   register_clcmd("say level", "handle_say_level")
   register_clcmd("say class", "handle_say_class")
   register_clcmd("say xpmenu", "handle_say_xpmenu")
   #endif
      
   //Settings variables
   g_msgSayText = get_user_msgid("SayText")
   
   // Format mod name
   formatex(g_modname, sizeof g_modname - 1, "Zombie XP %s", PLUGIN_VERSION)
   
   // Get Max Players
   g_maxplayers = get_maxplayers()
   
   //nVault
   gvault = nvault_open(PLUGIN_NAME);
   
   //for our HUD (shows level on screen)
   g_MsgSync2 = CreateHudSyncObj()
}

public set_cvars()
{
   // Disable zombie_plague's zombie auto menu
   if( get_pcvar_num(cvar_removezombie) == 0) set_cvar_num("zp_zombie_classes", 0);
   if( get_pcvar_num(cvar_removeweapons) == 0) set_cvar_num("zp_buy_custom", 0);
}

public plugin_natives()
{
   //natives
   register_native("zpxp_register_extra_item", "native_register_extra_item", 1)
   register_native("zpxp_register_human_class", "native_register_human_class", 1)
   register_native("zpxp_register_zombie_class", "native_register_zombie_class", 1)
   register_native("zp_get_user_human_class", "native_get_user_human_class", 1)
}

public plugin_end()
{
   if( get_pcvar_num(cvar_removexp) == 0)
   {
      // Save everyone's data first
      server_print("%s Saving your clients XP.", textHeader);
   
      for( new o = 1; o < 33; o++)
      {
         //if ( !is_user_connected(o) || is_user_bot(o) ) continue;
         if ( !is_user_connected(o) ) continue;
         if ( is_user_bot(o) ) continue;
         
         save_data(o);
      }
   }

   nvault_close(gvault)
   
   //Bugfix:
   if( (loadedZombies == false) && ( get_pcvar_num(cvar_removezombie) == 0 ))
   {
      set_pcvar_num(cvar_removezombie, 0);
      set_cvar_num("zp_zombie_classes", 0)   
   }
}

#if defined TRIGGER_SAYMENU
public handle_say_xp(id)
{
   
   #if defined ZP_BINDMENU
   new strLetter[2];
   copy(strLetter, sizeof strLetter - 1, ZP_BINDMENU);
   strtoupper(strLetter);
   strtoupper(ZP_BINDMENU);
   
   zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "SAY_INFO_KEY", strLetter)
   #else
   zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "SAY_INFO")   
   #endif
   zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "SAY_XP", pcvars[packslevelup] * userLevel[id], userLevel[id])
   return PLUGIN_HANDLED
}
public handle_say_level(id)
{
   //return level
   zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "SAY_LEVEL", userLevel[id])   
   return PLUGIN_HANDLED
}
public handle_say_class(id)
{
   //return class
   zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "SAY_CLASS", g_hclass_name[g_humanclass[id]], g_zclass_name[g_zombieclass[id]])
   return PLUGIN_HANDLED
}
public handle_say_xpmenu(id)
{
   show_menu_game(id);
   return PLUGIN_HANDLED
}
#endif

#if defined TRIGGER_ZP_ITEM
public zp_extra_item_selected(player, itemid)
{
   if(itemid == g_TriggerItem)
   {
      //show the menu
      show_menu_game(player);
   }
}
#endif

#if defined ZP_BANK_AUTOSAVE
public getAmmoPacks(id)
{
   return zp_bank_get_packs(id);
}
public setAmmoPacks(id, value)
{
   return zp_bank_set_packs(id, value);
}
#else
public getAmmoPacks(id)
{
   return zp_get_user_ammo_packs(id);
}
public setAmmoPacks(id, value)
{
   return zp_set_user_ammo_packs(id, value);
}
#endif


public SetLevel(id)
{   
   //Multilang is not enabled here since I plan to remove this funtionality once this leaves BETA
   #if defined ZP_GAMERUINER
   if ( read_argc() > 3 ) return PLUGIN_HANDLED;
      
   new arg1[32], arg2[10], amount;
   read_argv(1, arg1, sizeof(arg1) - 1);
   read_argv(2, arg2, sizeof(arg2) - 1);
   
   amount = str_to_num(arg2);
   if( amount <= 0) amount = 1;
   new target = cmd_target(0, arg1, 2);

   if ( target == 0 )
   {
      //couldnt find them
      zp_colored_print(id, "^x04%s^x01 Could not find the requested user.", textHeader);
      
      return PLUGIN_HANDLED;

   } else {

      //we found them!
      userLevel[id] = amount
      ShowHUD(id)
      
      if(id == target)
      {
         zp_colored_print(id, "^x04%s^x01 You have set yourself to level %d!", textHeader, amount );
      } else {
         new targetName[64];
         get_user_name(target, targetName, 63);

         zp_colored_print(id, "^x04%s^x01 You have set %s to level %d!", textHeader , targetName, amount );
         zp_colored_print(target, "^x04%s^x01 You have been set to level %d!", textHeader , amount );
      }
      return PLUGIN_HANDLED;
   }
   #else
   zp_colored_print(id, "^x04%s^x01 This functionality has been disabled.", textHeader);
   client_print(id, print_console, "^x04%s^x01 This functionality has been disabled.", textHeader);
   #endif
   return PLUGIN_HANDLED;
   
}

public getNeededPacks(id)
{
   //return the packs needed for leveling up
   return pcvars[packslevelup] * userLevel[id]
}

public SetPacksLevelUp(id, value)
{
   //this allows the user to change the multiplier for ammo cost
   new arg[10], arg2
   read_argv(1, arg, sizeof arg - 1)
   
   arg2 = str_to_num(arg)
   if(arg2 > 0)
   {
      client_print(id, print_console, "%s %L", textHeader, id, "ADMIN_CONFIRM")
      pcvars[packslevelup] = arg2;
      
      //go through each player and change the amount required to level up
      for( new o = 1; o < 33; o++)
      {
         if ( !is_user_connected(o) ) continue;
         userNeededPacks[id] = getNeededPacks(id)
      }
   } else {
      //must be a positive number - PRINTS TO CONSOLE, LEAVE ALONE!
      zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ERR_NEGATIVE");
      client_print(id, print_console, "%s %L", textHeader, id, "ERR_NEGATIVE")
   }
   
   return PLUGIN_HANDLED;
}


//-----------------------CVAR Handlers--------------------------

public RemoveXP(id)
{
   //this allows the user to enable or disable XP
   new arg[10], arg2
   read_argv(1, arg, sizeof arg - 1)
   
   arg2 = str_to_num(arg)
   if(arg2 >= 0)
   {
      if(arg2 == 1) {
         // Disable the XP
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ADMIN_CONFIRM");
         client_print(id, print_console, "%s %L", textHeader, id, "ADMIN_CONFIRM")
         set_pcvar_num(cvar_removexp, arg2);
         
      } else if (arg2 == 0) {
         // Enable the XP
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ADMIN_CONFIRM");
         client_print(id, print_console, "%s %L", textHeader, id, "ADMIN_CONFIRM")
         set_pcvar_num(cvar_removexp, arg2);
         
      } else {
         // They typed something wrong
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ERR_INVALIDENTRY");
         client_print(id, print_console, "%s %L", textHeader, id, "ERR_INVALIDENTRY");
         return PLUGIN_HANDLED;
      }
   } else {
      //must be a positive number - PRINTS TO CONSOLE, LEAVE ALONE!
      zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ERR_NEGATIVE");
      client_print(id, print_console, "%s %L", textHeader, id, "ERR_NEGATIVE")
   }
   
   return PLUGIN_HANDLED;
   
}

public RemoveZombies(id)
{
   //this allows the user to enable or disable zombie classes
   new arg[10], arg2
   read_argv(1, arg, sizeof arg - 1)
   
   arg2 = str_to_num(arg)
   if(arg2 >= 0)
   {
      if (arg2 == 0) {
         // Enable the zombie classes
         
         if( loadedZombies == true )
         {
            zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ADMIN_CONFIRM");
            client_print(id, print_console, "%s %L", textHeader, id, "ADMIN_CONFIRM")
            set_pcvar_num(cvar_removezombie, 0);
            set_cvar_num("zp_zombie_classes", 0)
         } else {
            zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ADMIN_CONFIRM_NEXTROUND");
            client_print(id, print_console, "%s %L", textHeader, id, "ADMIN_CONFIRM_NEXTROUND")
            //set_pcvar_num(cvar_removezombie, 0);
            //set_cvar_num("zp_zombie_classes", 0)         
         }
      } else if (arg2 == 1) {
         // Disable the zombie classes
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ADMIN_CONFIRM");
         client_print(id, print_console, "%s %L", textHeader, id, "ADMIN_CONFIRM")
         set_pcvar_num(cvar_removezombie, 1);
         set_cvar_num("zp_zombie_classes", 1)
         
      } else if (arg2 == 2) {
         // Disable, and dont add zombies to zombie plague
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ADMIN_CONFIRM_NEXTROUND");
         client_print(id, print_console, "%s %L", textHeader, id, "ADMIN_CONFIRM_NEXTROUND")
         set_pcvar_num(cvar_removezombie, 1);
         set_cvar_num("zp_zombie_classes", 2)
         
      } else {
         // They typed something wrong
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ERR_INVALIDENTRY");
         client_print(id, print_console, "%s %L", textHeader, id, "ERR_INVALIDENTRY");
         return PLUGIN_HANDLED;
         
      }
   } else {
      //must be a positive number - PRINTS TO CONSOLE, LEAVE ALONE!
      zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ERR_NEGATIVE");
      client_print(id, print_console, "%s %L", textHeader, id, "ERR_NEGATIVE")
   }
   
   return PLUGIN_HANDLED;
   
}

public RemoveWeapons(id)
{
   //this allows the user to enable or disable zombie classes
   new arg[10], arg2
   read_argv(1, arg, sizeof arg - 1)
   
   arg2 = str_to_num(arg)
   if(arg2 >= 0)
   {
      if(arg2 == 1) {
         // Disable the custom human weapons
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ADMIN_CONFIRM");
         client_print(id, print_console, "%s %L", textHeader, id, "ADMIN_CONFIRM")
         set_pcvar_num(cvar_removeweapons, 1);
         set_cvar_num("zp_buy_custom", 1);
         
      } else if (arg2 == 0) {
         // Enable the custom human weapons
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ADMIN_CONFIRM");
         client_print(id, print_console, "%s %L", textHeader, id, "ADMIN_CONFIRM")
         set_pcvar_num(cvar_removeweapons, 0);
         set_cvar_num("zp_buy_custom", 0);
         
      } else {
         // They typed something wrong
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ERR_INVALIDENTRY");
         client_print(id, print_console, "%s %L", textHeader, id, "ERR_INVALIDENTRY");
         return PLUGIN_HANDLED;
      }
   } else {
      //must be a positive number - PRINTS TO CONSOLE, LEAVE ALONE!
      zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ERR_NEGATIVE");
      client_print(id, print_console, "%s %L", textHeader, id, "ERR_NEGATIVE")
   }
   
   return PLUGIN_HANDLED;
   
}

public show_menu_game(id)
{
   // Show our menu
   static menu[250], len, index;
   len = 0
   index = 1;
   
   // Title
   len += formatex(menu[len], sizeof menu - 1 - len, "\y%s^n^n", g_modname)
   
   if( get_pcvar_num(cvar_removexp) == 0 )
   {
      // 1. Buy a level up
      if(getAmmoPacks(id) >= getNeededPacks(id))
      {
         len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %L", index, id, "MENU_BUY_XP")
         len += formatex(menu[len], sizeof menu - 1 - len, " \y%d %L^n", getNeededPacks(id), id, "AMMO_PACKS_XP")
      } else {
         len += formatex(menu[len], sizeof menu - 1 - len, "\d%d. %L", index, id, "MENU_BUY_XP")
         len += formatex(menu[len], sizeof menu - 1 - len, " \d%d %L^n", getNeededPacks(id), id, "AMMO_PACKS_XP")
      }

      index++;
   }

   //Human class
   len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %L^n", index, id,"MENU_HCLASS")
   
   if (get_pcvar_num(cvar_removezombie) == 0)
   {
      //Zombie class
      index++;
      len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %L^n", index, id,"MENU_ZCLASS")
   }

   // 0. Exit
   len += formatex(menu[len], sizeof menu - 1 - len, "^n^n\r0.\w %L", id, "MENU_EXIT")
   
   show_menu(id, KEYSMENU, menu, -1, "Game Menu")
}

public save_data(id)
{
   new vaultkey[40],vaultData[256];
      
   new g_selected_zclass[sizeof g_zclass_load[]] , g_selected_hclass[sizeof g_hclass_load[]] //bug fix for not showing menu if the user hasnt picked a zombie
   if( g_hclass_showmenu[id] == true) { g_selected_hclass = "-1"; } else { formatex(g_selected_hclass, sizeof g_selected_hclass - 1, g_hclass_load[g_humanclassnext[id]]); }
   if( g_zclass_showmenu[id] == true) { g_selected_zclass = "-1"; } else { formatex(g_selected_zclass, sizeof g_selected_zclass -1, g_zclass_load[g_zombieclassnext[id]]); }
   
   formatex( vaultkey, sizeof vaultkey - 1, "%s_stats", username[id]);
   formatex( vaultData, sizeof vaultData - 1, "0=%i;1=%s;2=%s;", userLevel[id], g_selected_hclass, g_selected_zclass);
   
   nvault_set(gvault, vaultkey, vaultData);
}

public load_data(id)
{
   if( get_pcvar_num(cvar_removexp) != 0)
   {
      // Do not load or save data
      g_hclass_showmenu[id] = true;
      g_zclass_showmenu[id] = true;
      return;
   }
   
   new vaultkey[40], vaultReturn[256];
   new vaultData[4][40], vaultResults[3][40];
   
   // Get the Level
   format(vaultkey, sizeof vaultkey - 1, "%s_stats", username[id]);
   nvault_get(gvault, vaultkey, vaultReturn, sizeof vaultReturn - 1);
   
   new Count = ExplodeString(vaultData, sizeof vaultData - 1, sizeof vaultData[] - 1, vaultReturn, ';')
      
   if(Count == sizeof vaultResults - 1)
   {
      new ivaultLevel, i_hclass_id = -1, i_zclass_id = -1;
      
      for( new i = 0; i < sizeof vaultData - 1; i++)
      {
         ExplodeString(vaultResults, sizeof vaultResults - 1, sizeof vaultResults[] - 1, vaultData[i], '=');
         
         // We now have our items
         switch (str_to_num(vaultResults[0]))
         {
            case VAULT_LEVEL:
            {   
               ivaultLevel = str_to_num(vaultResults[1]);
               
               if (ivaultLevel == 0) ivaultLevel = 1;
               userLevel[id] = ivaultLevel
            }
            
            case VAULT_HCLASS:
            {
               // Look for our human class
               if( !equali(vaultResults[1], "-1") )
               {
                  for (new i2 = 0; i2 < g_hclass_i; i2++)
                  {
                     if( equali(vaultResults[1], g_hclass_load[i2]) )
                     {
                        i_hclass_id = i2;
                        break;
                     }
                  }
               }
            
               if ( i_hclass_id == -1)
               {
                  // Couldnt find them
                  g_hclass_showmenu[id] = true;
               } else {
                  // We found their zombie class
                  g_humanclassnext[id] = i_hclass_id;
                  g_hclass_showmenu[id] = false;
               }
            }
            
            case VAULT_ZCLASS:
            {
               if( !equali(vaultResults[1], "-1") )
               {
                  for (new i2 = 0; i2 < g_zclass_i; i2++)
                  {
                     if( equali(vaultResults[1], g_zclass_load[i2]) )
                     {
                        i_zclass_id = i2;
                        break;
                     }
                  }
               }
               
               if ( i_zclass_id == -1)
               {
                  g_zclass_showmenu[id] = true;
               } else {
                  g_zombieclassnext[id] = i_zclass_id;
                  g_zclass_showmenu[id] = false;
                  zp_set_user_zombie_class(id, i_zclass_id);
               }
            }
         }
      }
   } else {
      g_hclass_showmenu[id] = true;
      g_zclass_showmenu[id] = true;

   }   
}

public client_connect(id)
{
   // Do we bind a key
   #if defined ZP_BINDMENU
   client_cmd(id,"bind %s ^"say xpmenu^"", ZP_BINDMENU);
   #endif
}
public client_putinserver(id)
{
   // Reset vars
   resetvars(id)
      
   // Make sure zombieplague doesnt load the last plugin as the default zombie
   zp_set_user_zombie_class(id, 0)
   
   // Load their data
   load_data(id);
   
   // Set amount of levels to level up (called after load_data)
   userNeededPacks[id] = getNeededPacks(id)
   
   // Set the custom HUD display task
   set_task(1.0, "ShowHUD", id+TASK_SHOWHUD, _, _, "b")
}

public client_disconnect(id)
{
   // Save the data
   save_data(id);
   
   // Remove tasks
   remove_task(id+TASK_SHOWHUD)
}

public fw_PlayerSpawn_Post(id)
{
   // Both humans and zombies spawn and call this
   // Zombies can respawn if deathmatch is enabled
   
   //TODO: Check if this works
   if (zp_get_user_zombie(id))
      return FMRES_IGNORED;
   
   if (!is_user_alive(id)) // you could also use is_user_connected()
      return FMRES_IGNORED;
      
   // Set selected human and zombie class
   g_humanclass[id] = g_humanclassnext[id]
   g_zombieclass[id] = g_zombieclassnext[id]
   
   // Change the default human variables
   humanme(id)
         
   // We know for sure they are a human, only give guns+speed+grav if they've picked a class
   if (( g_hclass_showmenu[id] == false ) && (get_pcvar_num(cvar_removeweapons) == 0))
   {   
      setHumanParameters(id)
      giveWeapons(id) //give weapons
   }

   return FMRES_IGNORED;
}

public event_round_start()
{
   static team;
   
   // Set our humans hp, speed, etc
   for( new o = 1; o < 33; o++)
   {
      // Not connected
      if ( !is_user_connected(o) ) continue;
      
      // Not playing
      team = fm_get_user_team(o)
      if (team == CS_TEAM_SPECTATOR || team == CS_TEAM_UNASSIGNED) continue;
      
      // Set our human vars
      //humanme(o)
      
      // Our next vars are now current
      //g_humanclass[o] = g_humanclassnext[o]
      //g_zombieclass[o] = g_zombieclassnext[o]
      
      // The round has started
      ExecuteForward(g_fwRoundStart, g_fwDummyResult, o);
   }
   
   // Set our vars
   g_freezetime = true
   
   // Do we show a welcome message?
   if( get_pcvar_num(cvar_welcomemsg) )
      set_task(2.0, "welcome_msg")
}

public zp_user_infected_pre(id, infector)
{
   // Make sure he is not a human
   g_human[id] = false
   
   // Strip his guns (so they dont fall on the floor)
   strip_weapons(id);
}

public zp_user_infected_post(id, infector)
{
   // Do we show the menu?
   if ((g_zclass_showmenu[id] == true) && get_pcvar_num(cvar_removezombie) ==0) show_menu_zclass(id);

}
         
public zp_user_humanized_pre(id)
{   
   // Set selected human class, incase he buys antidote
   g_humanclass[id] = g_humanclassnext[id];
   g_zombieclass[id] = g_zombieclassnext[id];
}

public zp_user_humanized_post(id)
{   
   // Hes become human again, set our vars
   if( !zp_get_user_survivor(id) )
   {
      humanme(id)      
      setHumanParameters(id)
      if( get_pcvar_num(cvar_removeweapons) == 0) giveWeapons(id) //give weapons
   } else {
      // He has become a survivor
      g_human[id] = false
   }
   
   ShowHUD(id)
}




enum
{
   WEAPON_GALIL = 0,
   WEAPON_FAMAS,
   WEAPON_M4A1,
}

public humanme(id)
{
   // Set our human's height, jump, etc
   
   if( g_hclass_showmenu[id] == true)
   {
      // They just entered, and no data was loaded for them
      // Show the menu (despite the fact that they are automatically lvl. 1)
      if (get_pcvar_num(cvar_removezombie) == 0)
      { set_task(0.1, "show_menu_hclass", id); } else { set_task(0.5, "show_menu_hclass", id); }
   }
   
   // They are human
   g_human[id] = true;
}

public giveWeapons(id)
{
   // Strip weapons first
   strip_weapons(id);
   
   // Give all weapons (everything is in g_hclass_weapons)
   static i, weaponid;
   for (i = 0; i < sizeof g_hclass_weapons; i++)
   {
      weaponid = g_hclass_weapons[g_humanclass[id]][i];
      
      if (weaponid >= 1 && weaponid <= 14) {
         // Give main weapon
         give_primary_weapon(id, weaponid - 1);
   
      } else if ( weaponid >= 15 && weaponid <= 20)  {
         // Give secondary gun
         give_secondary_weapon(id, weaponid - 15);
         
      } else if ( weaponid >= 21 && weaponid <=23) {
         // Give grenades
         fm_give_item(id, g_additional_items[weaponid - 21]);
         
      } else {
         // We have given them all their item, or they dont have any
         return;
      }
   }   
}

public setHumanParameters(id)
{
   set_pev(id, pev_gravity, g_hclass_grav[g_humanclass[id]])
   fm_set_user_health(id, g_hclass_hp[g_humanclass[id]])
}

public resetvars(id)
{
   // This should only be called whenever a person connects!
   // Otherwise it erases a persons choices
   // Reset our human's variables
   g_zombieclassnext[id] = 0;
   g_humanclassnext[id] = 0;
   g_zombieclass[id] = 0;
   g_humanclass[id] = 0;
   
   g_hclass_showmenu[id] = false;
   g_zclass_showmenu[id] = false;
   
   userLevel[id] = 1;
   
   get_user_name(id, username[id], 31)
   g_resetparams[id] = false
}

/*================================================================================
Begin Functions from the internet
================================================================================*/

//http://forums.alliedmods.net/showthread.php?p=67207#post67207
stock ExplodeString( Output[][], Max, Size, Input[], Delimiter )
{
    new Idx, l = strlen(Input), Len;
    do Len += (1 + copyc( Output[Idx], Size, Input[Len], Delimiter ));
    while( (Len < l) && (++Idx < Max) )
    return Idx;
}


/*================================================================================
Begin Code from zombie_plague (modified to suit the plugin)
================================================================================*/

// Set player's health (from fakemeta_util)
stock fm_set_user_health(id, health)
{
   (health > 0) ? set_pev(id, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, id);
}


// Forward Player PreThink
public fw_PlayerPreThink(id)
{
   // Not alive
   if (!is_user_alive(id)) return;
   
   // Not human, survivor will count as not a human
   if(!g_human[id]) return;
   
   // Set Player MaxSpeed
   if (!g_freezetime)
   {
      if (g_human[id])
      {
         set_pev(id, pev_maxspeed, float(g_hclass_spd[g_humanclass[id]]))
         return
      }
   }
}

public show_menu_zclass(id)
{   
   // Player disconnected
   if (!is_user_connected(id))
      return;
   
   // Bots pick default classes
   if (is_user_bot(id))
   {
      g_zombieclassnext[id] = 0 //basic zombie
      return;
   }
   
   static menu[800], len, class, removexp;
   new curClassIcon[2];
   
   len = 0
   removexp = get_pcvar_num(cvar_removexp);
   
   // Title
   len += formatex(menu[len], sizeof menu - 1 - len, "\y%L \r [%d-%d]^n^n", id, "MENU_ZCLASS_TITLE", ZCLASSES_STARTID+1, min(ZCLASSES_STARTID+7, g_zclass_i))
   
   #if defined ZP_ALIGN_TEXT
   // Align text
   new spacers[400], g_zclass_spacers1, g_zclass_spacers2
   new maxSpace1, maxSpace2, curSpace1[32], curSpace2[32]

   // Get max width first
   for (class = ZCLASSES_STARTID; class < min(ZCLASSES_STARTID+7, g_zclass_i); class++)
   {
      formatex(spacers, sizeof spacers - 1, "%d. %s", class-ZCLASSES_STARTID+1, g_zclass_name[class])
      
      g_zclass_spacers1 = strlen(spacers)
      g_zclass_spacers2 = strlen(g_zclass_info[class])
      
      if(g_zclass_spacers1 > maxSpace1) maxSpace1 = g_zclass_spacers1
      if(g_zclass_spacers2 > maxSpace2) maxSpace2 = g_zclass_spacers2
   }
      
   // 1-7. Class List
   for (class = ZCLASSES_STARTID; class < min(ZCLASSES_STARTID+7, g_zclass_i); class++)
   {
      formatex(spacers, sizeof spacers - 1, "%d. %s", class-ZCLASSES_STARTID+1, g_zclass_name[class])
      
      g_zclass_spacers1 = maxSpace1 - strlen(spacers)
      g_zclass_spacers2 = maxSpace2 - strlen(g_zclass_info[class])
      
      arrayset(curSpace1, '^0', sizeof curSpace1 - 1)
      arrayset(curSpace2, '^0', sizeof curSpace2 - 1)
      
      if(g_zclass_spacers1 != 0) arrayset(curSpace1, '^t', g_zclass_spacers1)
      if(g_zclass_spacers2 != 0) arrayset(curSpace2, '^t', g_zclass_spacers2)
   
      if (((class == g_zombieclassnext[id] && g_zclass_showmenu[id] == false) || (userLevel[id] < g_zclass_lvl[class])) && (removexp == 0))
      {   
         if (class == g_zombieclassnext[id]) { curClassIcon = "*"; } else { curClassIcon = ""; }

         len += formatex(menu[len], sizeof menu - 1 - len, "\d%s%d. %s %s %s %s %L %d^n", curClassIcon, class-ZCLASSES_STARTID+1, g_zclass_name[class], curSpace1, g_zclass_info[class], curSpace2, id, "BOTH_ATTRIB_LEVEL", g_zclass_lvl[class])
      } else if (removexp == 1) {
         len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %s\y %s %s^n", class-ZCLASSES_STARTID+1, g_zclass_name[class], curSpace1, g_zclass_info[class])
      } else {
         len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %s\y %s %s\w %s %L %d^n", class-ZCLASSES_STARTID+1, g_zclass_name[class], curSpace1, g_zclass_info[class], curSpace2, id, "BOTH_ATTRIB_LEVEL", g_zclass_lvl[class])
      }
   }
   #else
   for (class = ZCLASSES_STARTID; class < min(ZCLASSES_STARTID+7, g_zclass_i); class++)
   {
      if (((class == g_zombieclassnext[id] && g_zclass_showmenu[id] == false) || (userLevel[id] < g_zclass_lvl[class])) && (removexp == 0))
      {   
         if (class == g_zombieclassnext[id]) { curClassIcon = "*"; } else { curClassIcon = ""; }
         
         len += formatex(menu[len], sizeof menu - 1 - len, "\d%s%d. %s - %s - %L %d^n", curClassIcon, class-ZCLASSES_STARTID+1, g_zclass_name[class], g_zclass_info[class], id, "BOTH_ATTRIB_LEVEL", g_zclass_lvl[class])
      } else if (removexp == 1) {
         len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %s -\y %s^n", class-ZCLASSES_STARTID+1, g_zclass_name[class], g_zclass_info[class]);
      } else {
         len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %s -\y %s\w - %L %d^n", class-ZCLASSES_STARTID+1, g_zclass_name[class], g_zclass_info[class], id, "BOTH_ATTRIB_LEVEL", g_zclass_lvl[class]);
      }
   }
   #endif
   
   // 8. Back - 9. Next - 0. Exit
   len += formatex(menu[len], sizeof menu - 1 - len, "^n\r8.\w %L^n\r9.\w %L^n^n\r0.\w %L", id, "MENU_BACK", id, "MENU_NEXT", id, "MENU_EXIT")
   
   show_menu(id, KEYSMENU, menu, -1, "Zombie Class Menu")
}


public show_menu_hclass(id)
{
   // Player disconnected
   if (!is_user_connected(id))
      return;
   
   // Bots pick default classes
   if (is_user_bot(id))
   {
      g_humanclassnext[id] = 0
      return;
   }
   
   static menu[800], len, class, removexp
   new curClassIcon[2]
   len = 0
   removexp = get_pcvar_num(cvar_removexp);
   
   // Title
   len += formatex(menu[len], sizeof menu - 1 - len, "\y%L \r[%d-%d]^n^n", id, "MENU_HCLASS_TITLE", HCLASSES_STARTID+1, min(HCLASSES_STARTID+7, g_hclass_i))
   
   #if defined ZP_ALIGN_TEXT
   // Align text
   new spacers[400], g_hclass_spacers1, g_hclass_spacers2
   new maxSpace1, maxSpace2, curSpace1[32], curSpace2[32]

   // Get max width first
   for (class = HCLASSES_STARTID; class < min(HCLASSES_STARTID+7, g_hclass_i); class++)
   {
      formatex(spacers, sizeof spacers - 1, "%d. %s", class-HCLASSES_STARTID+1, g_hclass_name[class])
      
      g_hclass_spacers1 = strlen(spacers)
      g_hclass_spacers2 = strlen(g_hclass_info[class])
      
      if(g_hclass_spacers1 > maxSpace1) maxSpace1 = g_hclass_spacers1
      if(g_hclass_spacers2 > maxSpace2) maxSpace2 = g_hclass_spacers2
   }
      
   // 1-7. Class List
   for (class = HCLASSES_STARTID; class < min(HCLASSES_STARTID+7, g_hclass_i); class++)
   {
      formatex(spacers, sizeof spacers - 1, "%d. %s", class-HCLASSES_STARTID+1, g_hclass_name[class])
      
      g_hclass_spacers1 = maxSpace1 - strlen(spacers)
      g_hclass_spacers2 = maxSpace2 - strlen(g_hclass_info[class])
         
      arrayset(curSpace1, '^0', sizeof curSpace1 - 1)
      arrayset(curSpace2, '^0', sizeof curSpace2 - 1)
      
      if(g_hclass_spacers1 != 0) arrayset(curSpace1, '^t', g_hclass_spacers1)
      if(g_hclass_spacers2 != 0) arrayset(curSpace2, '^t', g_hclass_spacers2)
      
      if (((class == g_humanclassnext[id] && g_hclass_showmenu[id] == false) || (userLevel[id] < g_hclass_lvl[class])) && (removexp == 0))
      {   
         if (class == g_humanclassnext[id]) { curClassIcon = "*"; } else { curClassIcon = ""; }
         
         len += formatex(menu[len], sizeof menu - 1 - len, "\d%s%d. %s %s %s %s %L %d^n", curClassIcon, class-HCLASSES_STARTID+1, g_hclass_name[class], curSpace1, g_hclass_info[class], curSpace2, id, "BOTH_ATTRIB_LEVEL", g_hclass_lvl[class])
      } else if (removexp == 1) {
         len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %s\y %s %s^n", class-HCLASSES_STARTID+1, g_hclass_name[class], curSpace1, g_hclass_info[class])
      } else {
         len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %s\y %s %s\w %s %L %d^n", class-HCLASSES_STARTID+1, g_hclass_name[class], curSpace1, g_hclass_info[class], curSpace2, id, "BOTH_ATTRIB_LEVEL", g_hclass_lvl[class])
      }
   }
   
   #else
   for (class = HCLASSES_STARTID; class < min(HCLASSES_STARTID+7, g_hclass_i); class++)
   {
      if (((class == g_humanclassnext[id] && g_hclass_showmenu[id] == false) || (userLevel[id] < g_hclass_lvl[class])) && (removexp == 0))
      {
         if (class == g_humanclassnext[id]) { curClassIcon = "*"; } else { curClassIcon = ""; }
         
         len += formatex(menu[len], sizeof menu - 1 - len, "\d%s%d. %s - %s - %L %d^n", curClassIcon, class-HCLASSES_STARTID+1, g_hclass_name[class], g_hclass_info[class], id, "BOTH_ATTRIB_LEVEL", g_hclass_lvl[class])
      } else if (removexp == 1) {
         len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %s -\y %s^n", class-HCLASSES_STARTID+1, g_hclass_name[class], g_hclass_info[class]);
      } else {
         len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %s -\y %s\w - %L %d^n", class-HCLASSES_STARTID+1, g_hclass_name[class], g_hclass_info[class], id, "BOTH_ATTRIB_LEVEL", g_hclass_lvl[class])
      }
   }
   #endif
   
   // 8. Back - 9. Next - 0. Exit
   len += formatex(menu[len], sizeof menu - 1 - len, "^n\r8.\w %L^n\r9.\w %L^n^n\r0.\w %L", id, "MENU_BACK", id, "MENU_NEXT", id, "MENU_EXIT")
   
   show_menu(id, KEYSMENU, menu, -1, "Human Class Menu")
}

/* ----------------------- Menu Handlers -------------------------*/

// Game Menu
public menu_game(id, key)
{
   if(get_pcvar_num(cvar_removexp) == 1) key++;
   
   switch (key)
   {
      case 0: // Buy a level up
      {
         if(getAmmoPacks(id) >= getNeededPacks(id))
         {
            setAmmoPacks(id, getAmmoPacks(id) - getNeededPacks(id))
            userLevel[id] += 1
            save_data(id)
            
            // Inform the user they leveled up
            zp_colored_print(id, "^x04%s^x01 %L %d", textHeader, id ,"MENU_BUY_LEVEL", userLevel[id])
            ShowHUD(id)
         } else {
            zp_colored_print(id, "^x04%s^x01 %L", textHeader, id ,"ERR_NOTENOUGHPACKS")
         }
         
         // Return to the main xp menu
         show_menu_game(id);
         
      }
      
      case 1: // Human Classes
      {
         // Restrict it here if we wanted to
         show_menu_hclass(id)
      }
      
      case 2: // Zombie Classes
      {
         if (get_pcvar_num(cvar_removezombie) == 0)
         {
            // Restrict it here if we wanted to
            show_menu_zclass(id)
         }
      }
   }
   
   return PLUGIN_HANDLED;
}

// Zombie Class Menu
public menu_zclass(id, key)
{
   // Special keys / items list exceeded
   if (key >= MENU_KEY_BACK || ZCLASSES_SELECTION >= g_zclass_i)
   {
      switch (key)
      {
         case MENU_KEY_BACK: // back
         {
            if (ZCLASSES_STARTID-7 >= 0) ZCLASSES_STARTID -= 7
         }
         case MENU_KEY_NEXT: // next
         {
            if (ZCLASSES_STARTID+7 < g_zclass_i) ZCLASSES_STARTID += 7
         }
         case MENU_KEY_EXIT: // exit
         {
            return PLUGIN_HANDLED;
         }
      }
      
      // Show extra items menu again
      show_menu_zclass(id)
      return PLUGIN_HANDLED;
   }
   
   // They selected their own class
   if (ZCLASSES_SELECTION == g_zombieclassnext[id])
   {
      //Plugin continues if this is false (sets class info on connect)
      if( g_zclass_showmenu[id] == false) //when a client first connects, the menu shows all zombies as a choice even the one the client defaults to (index of 0)
      {
         // Alert them they already have chosen a zombie
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ERR_ALREADYSELECTED")
         show_menu_zclass(id)
         
         // They had already chosen this zombie, dont rerun the command
         return PLUGIN_HANDLED;
      }
   }
   
   if (get_pcvar_num(cvar_removexp) == 0)
   {
      if (g_zclass_lvl[HCLASSES_SELECTION] > userLevel[id])
      {
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ERR_NOTLEVEL")
         show_menu_zclass(id)
         return PLUGIN_HANDLED;
      }
   }
   
   // Store selection for the next infection
   g_zombieclassnext[id] = ZCLASSES_SELECTION;
   
   // Disable showing menu since theyve chosen
   g_zclass_showmenu[id] = false;
      
   // Show selected zombie class info and stats
   zp_colored_print(id, "^x04%s^x01 %L: %s", textHeader, id, "ZOMBIE_SELECT_XP", g_zclass_name[g_zombieclassnext[id]])
   zp_colored_print(id, "^x04%s^x01 %L: %d %L: %d %L: %d %L: %d%%", textHeader, id, "ZOMBIE_ATTRIB1_XP", g_zclass_hp[g_zombieclassnext[id]], id, "ZOMBIE_ATTRIB2_XP", g_zclass_spd[g_zombieclassnext[id]],
   id, "ZOMBIE_ATTRIB3_XP", floatround(g_zclass_grav[g_zombieclassnext[id]]*800), id, "ZOMBIE_ATTRIB4_XP", floatround(g_zclass_kb[g_zombieclassnext[id]]*100))
   
   // Set the class for zombie plague
   zp_set_user_zombie_class(id, g_zombieclassnext[id])
   
   return PLUGIN_HANDLED;
}

// Human Class Menu
public menu_hclass(id, key)
{
   // Special keys / items list exceeded
   if (key >= MENU_KEY_BACK || HCLASSES_SELECTION >= g_hclass_i)
   {
      switch (key)
      {
         case MENU_KEY_BACK: // back
         {
            if (HCLASSES_STARTID-7 >= 0) HCLASSES_STARTID -= 7
         }
         case MENU_KEY_NEXT: // next
         {
            if (HCLASSES_STARTID+7 < g_hclass_i) HCLASSES_STARTID += 7
         }
         case MENU_KEY_EXIT: // exit
         {
            return PLUGIN_HANDLED;
         }
      }
      
      // Show human list again
      show_menu_hclass(id)
      return PLUGIN_HANDLED;
   }
   
   if (HCLASSES_SELECTION == g_humanclassnext[id])
   {
      // When a client first connects, the menu shows all zombies as a choice even the one the client defaults to (index of 0)
      if( g_hclass_showmenu[id] == false)
      {
         // Alert them they alaerdy have chosen a zombie
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ERR_ALREADYSELECTED")
         show_menu_hclass(id)
         return PLUGIN_HANDLED; //they had already chosen this zombie, dont rerun the command
      }
   }
   
   if (get_pcvar_num(cvar_removexp) == 0)
   {
      if (g_hclass_lvl[HCLASSES_SELECTION] > userLevel[id])
      {
         zp_colored_print(id, "^x04%s^x01 %L", textHeader, id, "ERR_NOTLEVEL")
         show_menu_hclass(id)
         return PLUGIN_HANDLED;
      }
   }

   // Store selection for the next infection
   g_humanclassnext[id] = HCLASSES_SELECTION;
   
   // Disable showing menu since theyve chosen
   g_hclass_showmenu[id] = false;
   
   // Show selected human class info and stats
   zp_colored_print(id, "^x04%s^x01 %L: %s", textHeader, id, "HUMAN_SELECT_XP", g_hclass_name[g_humanclassnext[id]])
   zp_colored_print(id, "^x04%s^x01 %L: %d %L: %d %L: %d", textHeader, id, "HUMAN_ATTRIB1_XP", g_hclass_hp[g_humanclassnext[id]], id, "HUMAN_ATTRIB2_XP", g_hclass_spd[g_humanclassnext[id]],
   id, "HUMAN_ATTRIB3_XP", floatround(g_hclass_grav[g_humanclassnext[id]]*800), id)
   
   return PLUGIN_HANDLED;
}

public ShowHUD(taskid)
{
   //if (get_pcvar_num(cvar_removexp) == 1 ) return;
   
   static id;
   
   // Our ID
   id = ID_SHOWHUD;
   
   // Player died?
   if (!is_user_alive(id))
   {
      // Get spectating target
      id = pev(id, PEV_SPEC_TARGET) //other persons ID
      
      // Target not alive
      if (!is_user_alive(id)) return;
   }
   
   // Format the classname
   static red, green, blue, g_name[sizeof g_hclass_name]; // Hopefully g_zclass_name and g_zclass_name will be left the same array size
   
   if ( g_human[id] == false ) // zombies
   {
      red = 200
      green = 250
      blue = 0
      
      formatex(g_name, sizeof g_name - 1, "%L", id, "HUD_ZOMBIE");      
   }
   else // humans
   {
      red = 0
      green = 0
      blue = 255
      
      copy(g_name, sizeof g_name - 1, g_hclass_name[g_humanclass[id]]);
   }
   
   if (id != ID_SHOWHUD)
   {
      if (get_pcvar_num(cvar_removexp) == 0 )
      {
         // Set our HUD in position for spectating
         set_dhudmessage(255, 255, 255, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1);
         show_dhudmessage(ID_SHOWHUD, "%L: %s - %L: %d", ID_SHOWHUD, "HUD_CLASS", g_name, ID_SHOWHUD, "HUD_LEVEL", userLevel[id]);
      } else {
         // Just show the class information
         set_dhudmessage(255, 255, 255, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1);
         show_dhudmessage(ID_SHOWHUD, "%L: %s", ID_SHOWHUD, "HUD_CLASS", g_name);
      }
   } else {
      if (get_pcvar_num(cvar_removexp) == 0 )
      {
         // Set our HUD in position for the player
         set_dhudmessage(red, green, blue, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1);
         show_dhudmessage(id, "%L: %s - %L: %d^t^t^t", id, "HUD_CLASS", g_name, id, "HUD_LEVEL", userLevel[id]);
      } else {
         // Just show the class information
         set_dhudmessage(red, green, blue, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1);
         show_dhudmessage(id, "%L: %s^t^t^t", id, "HUD_CLASS", g_name);   
      }
   }
}

// Native: native_get_user_human_class
public native_get_user_human_class(id)
{
   return g_humanclass[id];
}

// Native: zpxp_register_human_class
public native_register_human_class(const name[], const info[], const model[], const weapons[], hp, speed, Float:gravity, level)
{
   // Reached human classes limit
   if (g_hclass_i >= sizeof g_hclass_name)
      return -1;
   
   // Strings passed byref
   param_convert(1)
   param_convert(2)
   param_convert(3)
   param_convert(4)
   
   // Add the class
   copy(g_hclass_name[g_hclass_i], sizeof g_hclass_name[] - 1, name)
   copy(g_hclass_info[g_hclass_i], sizeof g_hclass_info[] - 1, info)
   copy(g_hclass_model[g_hclass_i], sizeof g_hclass_model[] - 1, model)
   copy(g_hclass_weapons[g_hclass_i], sizeof g_hclass_weapons[] - 1, weapons)
   g_hclass_hp[g_hclass_i] = hp
   g_hclass_spd[g_hclass_i] = speed
   g_hclass_grav[g_hclass_i] = gravity
   g_hclass_lvl[g_hclass_i] = level
   
   
   // For the load_data and save_data
   new tSave[40]
   formatex(tSave, sizeof tSave - 1, "%s%s", name, info);
   replace_all(tSave, sizeof tSave - 1, ";", "")
   replace_all(tSave, sizeof tSave - 1, " ", "")
   g_hclass_load[g_hclass_i] =  tSave;
      
   // Increase registered classes counter
   g_hclass_i++
   
   // Return id under which we registered the class
   return g_hclass_i-1;
}

// Native: zpxp_register_zombie_class
public native_register_zombie_class(const name[], const info[], const model[], const clawmodel[], hp, speed, Float:gravity, Float:knockback, level)
{   
   // Dont return -1, we wil get lots of server window print errors from the plugins
   if( get_pcvar_num(cvar_removezombie) == 2) return 0;
   
   //Bugfix for loading zombies
   loadedZombies = true;
   
   // Strings passed byref
   param_convert(1)
   param_convert(2)
   param_convert(3)
   param_convert(4)
   
   // Save the name, level required, and classid
   copy(g_zclass_name[g_zclass_i], sizeof g_zclass_name[] - 1, name)
   copy(g_zclass_info[g_zclass_i], sizeof g_zclass_info[] - 1, info)
   copy(g_zclass_model[g_zclass_i], sizeof g_zclass_model[] - 1, model)
   copy(g_zclass_clawmodel[g_zclass_i], sizeof g_zclass_clawmodel[] - 1, clawmodel)
   
   g_zclass_hp[g_zclass_i] = hp
   g_zclass_spd[g_zclass_i] = speed
   g_zclass_grav[g_zclass_i] = gravity
   g_zclass_kb[g_zclass_i] = knockback
   g_zclass_lvl[g_zclass_i] = level
   
   // For the load_data and save_data
   new tSave[40]
   formatex(tSave, sizeof tSave - 1, "%s%s", name, info);
   replace_all(tSave, sizeof tSave - 1, ";", "")
   replace_all(tSave, sizeof tSave - 1, " ", "")
   g_zclass_load[g_zclass_i] =  tSave;
   
   // Get the classid from zombie plague
   new g_returnclass_id;
   g_returnclass_id = zp_register_zombie_class(g_zclass_name[g_zclass_i], g_zclass_info[g_zclass_i], g_zclass_model[g_zclass_i], g_zclass_clawmodel[g_zclass_i], g_zclass_hp[g_zclass_i] / 2, g_zclass_spd[g_zclass_i], g_zclass_grav[g_zclass_i], g_zclass_kb[g_zclass_i]);
   
   // Make sure there was no error
   if( g_returnclass_id == -1 )
   {
      server_print("%s %L", textHeader, LANG_PLAYER, "ERR_BADRETURN");
      return -1
   }
   
   // Increase registered classes counter
   g_zclass_i++
   
   // Return id under which we registered the class
   return g_zclass_i-1;
}

public native_register_extra_item(const name[], cost, team)
{
   //TO DO
   
}

/*================================================================================
--The following are copied directly from zombie_plague, no reinventing wheels...
[Shared Functions]
=================================================================================*/

// Welcome Message Task
public welcome_msg()
{
   // Show mod info
   zp_colored_print(0, "^x04%s^x01 %L", textHeaderOrig, LANG_PLAYER, "NOTICE_INFO_XP")
}

// Log Event Round Start
public logevent_round_start()
{
   // Freezetime ends
   g_freezetime = false
}

// Get User Team
stock fm_get_user_team(id)
{
   return get_pdata_int(id, OFFSET_CSTEAMS, OFFSET_LINUX);
}

zp_colored_print(target, const message[], any:...)
{
   static buffer[512], i, argscount
   argscount = numargs()
   
   // Send to everyone
   if (!target)
   {
      static player
      for (player = 1; player <= g_maxplayers; player++)
      {
         // Not connected
         if (!is_user_connected(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, sizeof buffer - 1, message, 3)
         
         // Send it
         message_begin(MSG_ONE, 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
   {
      // Replace LANG_PLAYER with player id
      for (i = 2; i < argscount; i++)
      {
      if (getarg(i) == LANG_PLAYER)
         setarg(i, 0, target)
      }
      
      // Format message for player
      vformat(buffer, sizeof buffer - 1, message, 3)
      
      // Send it
      message_begin(MSG_ONE, g_msgSayText, _, target)
      write_byte(target)
      write_string(buffer)
      message_end()
   }
}

/*================================================================================
   Code JUST for giving guns
================================================================================*/

// Drop primary/secondary weapons
stock drop_weapons(id, dropwhat)
{
   // Get user weapons
   static weapons[32], num, i, weaponid
   num = 0 // reset passed weapons count (bugfix)
   get_user_weapons(id, weapons, num)
   
   // Loop through them and drop primaries or secondaries
   for (i = 0; i < num; i++)
   {
      // Prevent re-indexing the array
      weaponid = weapons[i]
      
      if ((dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)) || (dropwhat == 2 && ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM)))
      {
         // Get the weapon entity
         static wname[32], weapon_ent
         get_weaponname(weaponid, wname, sizeof wname - 1)
         weapon_ent = fm_find_ent_by_owner(-1, wname, id);
         
         // Hack: store weapon bpammo on PEV_ADDITIONAL_AMMO
         set_pev(weapon_ent, PEV_ADDITIONAL_AMMO, fm_get_user_bpammo(id, weaponid))
         
         // Player drops the weapon and looses his bpammo
         engclient_cmd(id, "drop", wname)
         fm_set_user_bpammo(id, weaponid, 0)
      }
   }
}

// Set User BP Ammo
stock fm_set_user_bpammo(id, weapon, amount)
{
   static offset
   
   switch(weapon)
   {
      case CSW_AWP: offset = OFFSET_AWM_AMMO;
      case CSW_SCOUT,CSW_AK47,CSW_G3SG1: offset = OFFSET_SCOUT_AMMO;
      case CSW_M249: offset = OFFSET_PARA_AMMO;
      case CSW_M4A1,CSW_FAMAS,CSW_AUG,CSW_SG550,CSW_GALI,CSW_SG552: offset = OFFSET_FAMAS_AMMO;
      case CSW_M3,CSW_XM1014: offset = OFFSET_M3_AMMO;
      case CSW_USP,CSW_UMP45,CSW_MAC10: offset = OFFSET_USP_AMMO;
      case CSW_FIVESEVEN,CSW_P90: offset = OFFSET_FIVESEVEN_AMMO;
      case CSW_DEAGLE: offset = OFFSET_DEAGLE_AMMO;
      case CSW_P228: offset = OFFSET_P228_AMMO;
      case CSW_GLOCK18,CSW_MP5NAVY,CSW_TMP,CSW_ELITE: offset = OFFSET_GLOCK_AMMO;
      case CSW_FLASHBANG: offset = OFFSET_FLASH_AMMO;
      case CSW_HEGRENADE: offset = OFFSET_HE_AMMO;
      case CSW_SMOKEGRENADE: offset = OFFSET_SMOKE_AMMO;
      case CSW_C4: offset = OFFSET_C4_AMMO;
      default: return;
   }
   
   set_pdata_int(id, offset, amount, OFFSET_LINUX)
}

// Get User BP Ammo
stock fm_get_user_bpammo(id, weapon)
{
   static offset
   
   switch(weapon)
   {
      case CSW_AWP: offset = OFFSET_AWM_AMMO;
      case CSW_SCOUT,CSW_AK47,CSW_G3SG1: offset = OFFSET_SCOUT_AMMO;
      case CSW_M249: offset = OFFSET_PARA_AMMO;
      case CSW_M4A1,CSW_FAMAS,CSW_AUG,CSW_SG550,CSW_GALI,CSW_SG552: offset = OFFSET_FAMAS_AMMO;
      case CSW_M3,CSW_XM1014: offset = OFFSET_M3_AMMO;
      case CSW_USP,CSW_UMP45,CSW_MAC10: offset = OFFSET_USP_AMMO;
      case CSW_FIVESEVEN,CSW_P90: offset = OFFSET_FIVESEVEN_AMMO;
      case CSW_DEAGLE: offset = OFFSET_DEAGLE_AMMO;
      case CSW_P228: offset = OFFSET_P228_AMMO;
      case CSW_GLOCK18,CSW_MP5NAVY,CSW_TMP,CSW_ELITE: offset = OFFSET_GLOCK_AMMO;
      case CSW_FLASHBANG: offset = OFFSET_FLASH_AMMO;
      case CSW_HEGRENADE: offset = OFFSET_HE_AMMO;
      case CSW_SMOKEGRENADE: offset = OFFSET_SMOKE_AMMO;
      case CSW_C4: offset = OFFSET_C4_AMMO;
      default: return -1;
   }
   
   return get_pdata_int(id, offset, OFFSET_LINUX);
}

// Give an item to a player (from fakemeta_util)
stock fm_give_item(id, const item[])
{
   static ent
   ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item))
   if (!pev_valid(ent)) return;
   
   static Float:originF[3]
   pev(id, pev_origin, originF)
   set_pev(ent, pev_origin, originF)
   set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN)
   dllfunc(DLLFunc_Spawn, ent)
   
   static save
   save = pev(ent, pev_solid)
   dllfunc(DLLFunc_Touch, ent, id)
   if (pev(ent, pev_solid) != save)
      return;
   
   engfunc(EngFunc_RemoveEntity, ent)
}

// Strip user weapons (from fakemeta_util)
stock fm_strip_user_weapons(id)
{
   static ent
   ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
   if (!pev_valid(ent)) return;
   
   dllfunc(DLLFunc_Spawn, ent)
   dllfunc(DLLFunc_Use, ent, id)
   engfunc(EngFunc_RemoveEntity, ent)
}


// Find entity by its owner (from fakemeta_util)
stock fm_find_ent_by_owner(entity, const classname[], owner)
{
   while ((entity = engfunc(EngFunc_FindEntityByString, entity, "classname", classname)) && pev(entity, pev_owner) != owner) {}
   
   return entity;
}

strip_weapons (id)
{
   if( !get_pcvar_num(cvar_removeweapons) )
   {   
      // Drop previous weapons
      drop_weapons(id, 1)
      drop_weapons(id, 2)
   }

   // Strip off from weapons
   fm_strip_user_weapons(id)
   fm_give_item(id, "weapon_knife")   
}

// Buy Primary Weapon
give_primary_weapon(id, key)
{   
   // Get weapon index
   static weaponid
   weaponid = get_weaponid(g_primary_items[key])
   
   // Give the new weapon
   fm_give_item(id, g_primary_items[key])
   fm_set_user_bpammo(id, weaponid, MAXBPAMMO[key])
   
   /*
   // Give additional items
   static i
   for (i = 0; i < sizeof g_additional_items; i++)
      fm_give_item(id, g_additional_items[i])
   */
}

give_secondary_weapon(id, key)
{   
   // Get weapon index
   static weaponid
   weaponid = get_weaponid(g_secondary_items[key])
   
   // Give the new weapon with full ammo
   fm_give_item(id, g_secondary_items[key])
   fm_set_user_bpammo(id, weaponid, MAXBPAMMO[weaponid])
}

/*================================================================================
   End Code just for giving guns
================================================================================*/



Cine imi poate rezolva si mie bugul dau 20 reputatie , de exmplu cei care au lv 1 pe prima pagina isi pot selecta lv 8 de pe 2 doua pagina dau 20 reputatie cerui care rezolva problema,daca reusiti trimitetimi sursa prin pm.

0 0
  
Back to top
View user's profile Send private message
mitrilarobert

[Raw 3>Freakz.]



Status: Offline
(since 30-01-2019 17:42)
Joined: 22 Jul 2010
Posts: 628, Topics: 65
Location: Targoviste

Reputation: -0.6
Votes: 26

Post Posted: 24-08-2013, 10:17:35 | Translate post to: ... (Click for more languages)

Up
0 0
  
Back to top
View user's profile Send private message
-P!C@-

[Simply Normal]



Status: Offline
(since 21-04-2022 19:07)
Joined: 28 May 2012
Posts: 21086, Topics: 1601
Location: Constanta

Reputation: 1870.3
Votes: 781

Post Posted: 24-08-2013, 16:24:51 | Translate post to: ... (Click for more languages)

Mitrilarobert incearca acest add-ons, vezi daca merge. Click



0 0
  
Back to top
View user's profile Send private message
mitrilarobert

[Raw 3>Freakz.]



Status: Offline
(since 30-01-2019 17:42)
Joined: 22 Jul 2010
Posts: 628, Topics: 65
Location: Targoviste

Reputation: -0.6
Votes: 26

Post Posted: 24-08-2013, 22:32:54 | Translate post to: ... (Click for more languages)

Are bug, orcum mersi de ajutor alcineva?
0 0
  
Back to top
View user's profile Send private message
mitrilarobert

[Raw 3>Freakz.]



Status: Offline
(since 30-01-2019 17:42)
Joined: 22 Jul 2010
Posts: 628, Topics: 65
Location: Targoviste

Reputation: -0.6
Votes: 26

Post Posted: 26-08-2013, 12:44:14 | Translate post to: ... (Click for more languages)

Am rezolvat puteti da T.C.
0 0
  
Back to top
View user's profile Send private message

  Topic locked


Topic is closed, you cannot post any messages in it anymore

Locked by Happy =]], 26 August 2013 11:00



 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Freakz Forum Index -> Trash Bin -> CS 2006-2019 (Archived) -> Resources  


The time now is 07-08-2025, 02:00:04
Copyright info

Based on phpBB ro/com
B

 
 
 







I forgot my password