save level

Categoria cu cereri de pluginuri si nu numai.

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

Forum rules
Accesează link-ul pentru a putea vedea regulile forumului

Daca doriti sa vi se modifice un plugin, va rugam postati aici .
Post Reply
bloodrainzmo
Membru, skill 0
Membru, skill 0
Posts: 8
Joined: 23 Sep 2018, 13:15
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Detinator server CS: 89.34.25.182:27015
Fond eXtream: 0
Contact:

30 Sep 2018, 19:44

Salut , cum pot face ca acest plugin sa salveze level in mysql ?
Acum salveaza in nvault...

| Afiseaza codul
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <fakemeta>
#include <zombie_plague_special>
#include <hamsandwich>
#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[] = "1.1"

// 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], userAuthID[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[MAX_CLASSSES] // 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[MAX_CLASSSES] // 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[] = "[ZMOXP]"
new const textHeaderOrig[] = "[ZMOXP]" //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] = 800 
	
	// 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 ZMOXP %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", 1);
}

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", 1);
			
		} 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", userAuthID[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", userAuthID[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, '=');
			
			// 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]];
		
		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_authid(id, userAuthID[id], 31)
	g_resetparams[id] = false
}

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

//http://forums.alliedmods.net/showthread ... #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_hudmessage(255, 255, 255, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1);
			ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync2, "%L: %s - %L: %d", ID_SHOWHUD, "HUD_CLASS", g_name, ID_SHOWHUD, "HUD_LEVEL", userLevel[id]);
		} else {
			// Just show the class information
			set_hudmessage(255, 255, 255, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1);
			ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync2, "%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_hudmessage(red, green, blue, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1);
			ShowSyncHudMsg(id, g_MsgSync2, "%L: %s - %L: %d^t^t^t", id, "HUD_CLASS", g_name, id, "HUD_LEVEL", userLevel[id]);
		} else {
			// Just show the class information
			set_hudmessage(red, green, blue, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1);
			ShowSyncHudMsg(id, g_MsgSync2, "%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, 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
		
		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)
	*/
}

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
================================================================================*/
RoyalServer
bloodrainzmo
Membru, skill 0
Membru, skill 0
Posts: 8
Joined: 23 Sep 2018, 13:15
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Detinator server CS: 89.34.25.182:27015
Fond eXtream: 0
Contact:

03 Oct 2018, 22:51

up!
User avatar
Ionut Ghita
Membru, skill 0
Membru, skill 0
Posts: 40
Joined: 08 Sep 2018, 21:10
Detinator Steam: Da
CS Status: CS1.6 will always remain in my heart <3
Detinator server CS: ZP.LALEAGANE.RO
SteamID: Private
Fond eXtream: 0
Location: Bucureşti
Discord: Ionut#2518
Contact:

03 Oct 2018, 23:44

Uite aici un tutorial : Click !
bloodrainzmo
Membru, skill 0
Membru, skill 0
Posts: 8
Joined: 23 Sep 2018, 13:15
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Detinator server CS: 89.34.25.182:27015
Fond eXtream: 0
Contact:

04 Oct 2018, 16:59

Nu stiu limbajul pawn.
Vreau doar sa modifice cineva asta din nvault in sql.
User avatar
Ionut Ghita
Membru, skill 0
Membru, skill 0
Posts: 40
Joined: 08 Sep 2018, 21:10
Detinator Steam: Da
CS Status: CS1.6 will always remain in my heart <3
Detinator server CS: ZP.LALEAGANE.RO
SteamID: Private
Fond eXtream: 0
Location: Bucureşti
Discord: Ionut#2518
Contact:

04 Oct 2018, 17:27

Testeaza : Click!
bloodrainzmo
Membru, skill 0
Membru, skill 0
Posts: 8
Joined: 23 Sep 2018, 13:15
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Detinator server CS: 89.34.25.182:27015
Fond eXtream: 0
Contact:

05 Oct 2018, 18:15

L-am testat , nu functioneaza..
*Or!g!naL*
Fost moderator
Fost moderator
Posts: 1367
Joined: 16 Feb 2014, 16:28
Detinator Steam: Nu
CS Status: N-avem!
Detinator server CS: Zm.Darkcs.ro
Reputatie: Fost moderator ajutator
Has thanked: 3 times
Been thanked: 1 time

16 Oct 2018, 19:50

ti-l pot vinde eu. il am si ruleaza perfect + reglate cateva buguri
Image
User avatar
levin
Scripter eXtreamCS
Scripter eXtreamCS
Posts: 3844
Joined: 24 Aug 2011, 12:24
Detinator Steam: Da
CS Status:
Detinator server CS: ☯∴
SteamID: riseofevo
Reputatie: Scripter eXtreamCS
Nume anterior: Adryyy
Location: ҳ̸Ҳ̸ҳ
Discord: devilclass
Has thanked: 36 times
Been thanked: 594 times
Contact:

16 Oct 2018, 22:11

off:
*Or!g!naL* wrote:ti-l pot vinde eu. il am si ruleaza perfect + reglate cateva buguri
:') :') :') :') :') :') :')

on: vrei să salveze doar level-ul?
Pentru ajutor, faceți cerere bine detaliată, completând și respectând modelul corespunzător.
Nu-mi mai dați cereri doar pentru a mă avea în lista de prieteni.
Dacă te ajut, și mă ignori/etc > te adaug în „foe”.
Aveți grijă la cei ce încearcă să mă copieze sau să dea drept mine..Puteți lua legătura cu mine prin STEAM dacă aveți o problemă/nelămurire în acest caz! Cont de forum am doar aici.
În cazul în care utilizați ceva din ce am postat(ex: aici), e bine să fiți la curent cu modificările aduse și de aici, iar dacă sunt ceva probleme nu ezitați să luați legătura cu mine. Actualizarea unor coduri nu se vor afișa public, doar dacă se găsește ceva critic/urgent de remediat, unele fiind coduri vechi iar unele refăcute chiar recent dar private.
* Nume pe cs1.6: eVoLuTiOn \ Nume vechi: eVo
* Atelierul meu - post2819572.html#p2819572 (închis, click link ca să vedeți de ce)
bloodrainzmo
Membru, skill 0
Membru, skill 0
Posts: 8
Joined: 23 Sep 2018, 13:15
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Detinator server CS: 89.34.25.182:27015
Fond eXtream: 0
Contact:

14 Nov 2018, 18:59

Nu mai am nevoie , multumesc de ajutor .

Se poate da T/C
Post Reply

Return to “Cereri”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 21 guests