Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <amxmodx>
- #include <amxmisc>
- #include <nvault>
- #include <fakemeta>
- #include <zombieplague>
- #include <hamsandwich>
- #include <fun>
- #include <cstrike>
- /*================================================================================
- 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[] = ""
- // 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], userNameID[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 = 200
- // 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[] = "[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
- #endif
- #if defined TRIGGER_SAYMENU
- register_clcmd("say xp", "handle_say_xp")
- register_clcmd("say level", "handle_say_level")
- register_clcmd("say nivel", "handle_say_level")
- 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
- zp_colored_print(id, "[Clan nK]^x03 %s^x01 tiene^x04 %s^x01 niveles ", userNameID[id], 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", userNameID[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", userNameID[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, userNameID[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++)
- {
- if (g_zclass_lvl[id] >= g_zclass_lvl[class])
- {
- if (class == g_zombieclassnext[id])
- len += formatex(menu[len], sizeof menu - 1 - len, "\d%d. %s %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^n", class-ZCLASSES_STARTID+1, g_zclass_name[class], g_zclass_info[class])
- }
- else
- len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\d %s %s\r (Nivel Requerido: %d)^n", class-ZCLASSES_STARTID+1, g_zclass_name[class], g_zclass_info[class], 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 = 0
- green = 255
- blue = 0
- formatex(g_name, sizeof g_name - 1, "%L", id, "HUD_ZOMBIE");
- }
- else // humans
- {
- red = 0
- green = 255
- blue = 0
- 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[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
- ================================================================================*/
Add Comment
Please, Sign In to add comment