Этот раздел, как вы могли заметить по названию, предназначен для решения вопросов по поводу уже существующих модов и плагинов. Пожалуйста, если у вас проблема с написанием плагина, не путайте этот раздел с разделом по скриптингу. Для поиска плагинов и модов существует соответствующий раздел.
Название темы должно соответствовать содержанию. Темы с названием типа "Помогите", "Вопрос", "парни подскажите..." - будут удалены. Все темы, не относящиеся к "Вопросам по модам и плагинам", будут удалены или перемещены в соответствующий раздел.
Правила оформления темы: 1. Помимо заголовка не забудьте верно сформулировать свой вопрос. 2. Выложите исходник (в тег кода + ) или ссылку на плагин который вызывает у вас вопросы. 3. Выложите лог с ошибками (если имеется) под спойлер
ZombiePlague v4.3 Fix5a
, Баг с моделями под флагом прописанными через ZombiePlague
Добрый вечер, кто может помочь исправить баг с моделями прописанными через Главный Мод "ZombiePlague v4.3 Fix5a"?
Ссылка на видео (Суть бага):
Сразу хочу предупредить, не пишите что баг с моделью или с моделью оружия. Если вдруг кто то знает как решить проблему, отпишите пожалуйста или скиньте свой Skype.
new const ZP_CUSTOMIZATION_FILE[] = "zombieplague.ini" new const ZP_EXTRAITEMS_FILE[] = "zp_extraitems.ini" new const ZP_ZOMBIECLASSES_FILE[] = "zp_zombieclasses.ini"
// Limiters for stuff not worth making dynamic arrays out of (increase if needed) const MAX_CSDM_SPAWNS = 128 const MAX_STATS_SAVED = 64
new const buy_zombie_hp[] = "exhealth/zm_buyhealth.wav" new g_iExplo, m_iExplo1 new cvar_explodamage new g_countdown
new g_knife[33] new g_chain_hp[33], bool:g_has_chainsaw[33], g_last_pev_body[33] new cvar_pattack_rate, cvar_sattack_rate, cvar_pattack_recoil, cvar_sattack_recoil new cvar_dropflags
new g_Restart, g_Seconds new const Restart_Sound[] = "zp_cso/mp3/start.mp3"
// Linux diff's const OFFSET_LINUX = 5 // offsets 5 higher in Linux builds const OFFSET_LINUX_WEAPONS = 4 // weapon offsets are only 4 steps higher on Linux
// Allowed weapons for zombies (added grenades/bomb for sub-plugin support, since they shouldn't be getting them anyway) const ZOMBIE_ALLOWED_WEAPONS_BITSUM = (1<<CSW_KNIFE)|(1<<CSW_HEGRENADE)|(1<<CSW_FLASHBANG)|(1<<CSW_SMOKEGRENADE)|(1<<CSW_C4)
// Classnames for separate model entities new const MODEL_ENT_CLASSNAME[] = "player_model" new const WEAPON_ENT_CLASSNAME[] = "weapon_model"
// Menu keys const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MEN U_KEY_8|MENU_KEY_9|MENU_KEY_0
// Player vars new g_zombie[33] // is zombie new g_nemesis[33] // is nemesis new g_survivor[33] // is survivor new g_firstzombie[33] // is first zombie new g_lastzombie[33] // is last zombie new g_lasthuman[33] // is last human new g_frozen[33] // is frozen (can't move) new Float:g_frozen_gravity[33] // store previous gravity when frozen new g_nodamage[33] // has spawn protection/zombie madness new g_respawn_as_zombie[33] // should respawn as zombie new g_nvision[33] // has night vision new g_nvisionenabled[33] // has night vision turned on new g_zombieclass[33] // zombie class new g_zombieclassnext[33] // zombie class for next infection new g_flashlight[33] // has custom flashlight turned on new g_flashbattery[33] = { 100, ... } // custom flashlight battery new g_canbuy[33] // is allowed to buy a new weapon through the menu new g_ammopacks[33] // ammo pack count new g_damagedealt_human[33] // damage dealt as human (used to calculate ammo packs reward) new g_damagedealt_zombie[33] // damage dealt as zombie (used to calculate ammo packs reward) new Float:g_lastleaptime[33] // time leap was last used new Float:g_lastflashtime[33] // time flashlight was last toggled new g_playermodel[33][32] // current model's short name [player][model] new g_menu_data[33][8] // data for some menu handlers new g_ent_playermodel[33] // player model entity new g_ent_weaponmodel[33] // weapon model entity new g_burning_duration[33] // burning task duration new Float:g_buytime[33] // used to calculate custom buytime new g_zombiecl[33]
// Game vars new g_pluginenabled // ZP enabled new g_newround // new round starting new g_endround // round ended new g_nemround // nemesis round new g_survround // survivor round new g_swarmround // swarm round new g_plagueround // plague round new g_modestarted // mode fully started new g_lastmode // last played mode new g_scorezombies, g_scorehumans, g_gamecommencing // team scores new g_spawnCount, g_spawnCount2 // available spawn points counter new Float:g_spawns[MAX_CSDM_SPAWNS][3], Float:g_spawns2[MAX_CSDM_SPAWNS][3] // spawn points data new g_lights_i // lightning current lights counter new g_lights_cycle[32] // current lightning cycle new g_lights_cycle_len // lightning cycle length new Float:g_models_targettime // for adding delays between Model Change messages new Float:g_teams_targettime // for adding delays between Team Change messages new g_trailSpr, g_exploSpr, g_flameSpr, g_smokeSpr, g_glassSpr // grenade sprites new g_modname[32] // for formatting the mod name new g_freezetime // whether CS's freeze time is on new g_maxplayers // max players counter new g_czero // whether we are running on a CZ server new g_hamczbots // whether ham forwards are registered for CZ bots new g_fwSpawn, g_fwPrecacheSound // spawn and precache sound forward handles new g_infbombcounter, g_antidotecounter, g_madnesscounter // to limit buying some items new g_arrays_created // to prevent stuff from being registered before initializing arrays new g_lastplayerleaving // flag for whenever a player leaves and another takes his place new g_switchingteam // flag for whenever a player's team change emessage is sent new g_buyzone_ent // custom buyzone entity
// Some forward handlers new g_fwRoundStart, g_fwRoundEnd, g_fwUserInfected_pre, g_fwUserInfected_post, g_fwUserHumanized_pre, g_fwUserHumanized_post, g_fwUserInfect_attempt, g_fwUserHumanize_attempt, g_fwExtraItemSelected, g_fwUserUnfrozen, g_fwUserLastZombie, g_fwUserLastHuman, g_fwDummyResult
// Temporary Database vars (used to restore players stats in case they get disconnected) new db_name[MAX_STATS_SAVED][32] // player name new db_ammopacks[MAX_STATS_SAVED] // ammo pack count new db_zombieclass[MAX_STATS_SAVED] // zombie class new db_slot_i // additional saved slots counter (should start on maxplayers+1)
// Extra Items vars new Array:g_extraitem_name // caption new Array:g_extraitem_cost // cost new Array:g_extraitem_team // team new g_extraitem_i // loaded extra items counter
// For extra items file parsing new Array:g_extraitem2_realname, Array:g_extraitem2_name, Array:g_extraitem2_cost, Array:g_extraitem2_team, Array:g_extraitem_new
// Zombie Classes vars new Array:g_zclass_name // caption new Array:g_zclass_info // description new Array:g_zclass_modelsstart // start position in models array new Array:g_zclass_modelsend // end position in models array new Array:g_zclass_playermodel // player models array new Array:g_zclass_modelindex // model indices array new Array:g_zclass_clawmodel // claw model new Array:g_zclass_hp // health new Array:g_zclass_spd // speed new Array:g_zclass_grav // gravity new Array:g_zclass_kb // knockback new g_zclass_i // loaded zombie classes counter new Array:g_zclass_bombmodel, Array:g_zclass2_bombmodel
// For zombie classes file parsing new Array:g_zclass2_realname, Array:g_zclass2_name, Array:g_zclass2_info, Array:g_zclass2_modelsstart, Array:g_zclass2_modelsend, Array:g_zclass2_playermodel, Array:g_zclass2_modelindex, Array:g_zclass2_clawmodel, Array:g_zclass2_hp, Array:g_zclass2_spd, Array:g_zclass2_grav, Array:g_zclass2_kb, Array:g_zclass_new
// Customization vars new g_access_flag[MAX_ACCESS_FLAGS], Array:model_nemesis, Array:model_survivor, Array:model_human, Array:model_admin_zombie, Array:model_admin_human, Array:model_vip_human, Array:model_boss_human, Array:g_modelindex_human,
// Cached stuff for players new g_isconnected[33] // whether player is connected new g_isalive[33] // whether player is alive new g_isbot[33] // whether player is a bot new g_currentweapon[33] // player's current weapon id new g_playername[33][32] // player's name new Float:g_zombie_spd[33] // zombie class speed new Float:g_zombie_knockback[33] // zombie class knockback new g_zombie_classname[33][32] // zombie class name #define is_user_valid_connected(%1) (1 <= %1 <= g_maxplayers && g_isconnected[%1]) #define is_user_valid_alive(%1) (1 <= %1 <= g_maxplayers && g_isalive[%1]) #define is_user_valid(%1) (1 <= %1 <= g_maxplayers)
public plugin_precache() { // Register earlier to show up in plugins list properly after plugin disable/error at loading register_plugin("Zombie Plague", PLUGIN_VERSION, "MeRcyLeZZ") /*-----BossManager(start)-----*/ Map_Boss = zl_boss_map() /*-----BossManager(End)-----*/
// To switch plugin on/off register_concmd("zp_toggle", "cmd_toggle", _, "<1/0> - Enable/Disable Zombie Plague (will restart the current map)", 0) cvar_toggle = register_cvar("zp_on", "1")
// Plugin disabled? if (!get_pcvar_num(cvar_toggle)) return; g_pluginenabled = true
// Allow registering stuff now g_arrays_created = true
// Load customization data load_customization_from_files()
new i, buffer[100]
// Load up the hard coded extra items native_register_extra_item2("NightVision", g_extra_costs2[EXTRA_NVISION], ZP_TEAM_HUMAN) native_register_extra_item2("T-Virus Antidote", g_extra_costs2[EXTRA_ANTIDOTE], ZP_TEAM_ZOMBIE) native_register_extra_item2("Zombie Madness", g_extra_costs2[EXTRA_MADNESS], ZP_TEAM_ZOMBIE) native_register_extra_item2("Infection Bomb", g_extra_costs2[EXTRA_INFBOMB], ZP_TEAM_ZOMBIE) native_register_extra_item2("HP 1500", 5, ZP_TEAM_ZOMBIE) native_register_extra_item2("chainsaw", 0, ZP_TEAM_HUMAN)
// Extra weapons for (i = 0; i < ArraySize(g_extraweapon_names); i++) { ArrayGetString(g_extraweapon_names, i, buffer, charsmax(buffer)) native_register_extra_item2(buffer, ArrayGetCell(g_extraweapon_costs, i), ZP_TEAM_HUMAN) }
// Custom player models for (i = 0; i < ArraySize(model_human); i++) { ArrayGetString(model_human, i, buffer, charsmax(buffer)) format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer) ArrayPushCell(g_modelindex_human, engfunc(EngFunc_PrecacheModel, buffer)) if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer) if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer) // Precache modelT.mdl files too copy(buffer[strlen(buffer)-4], charsmax(buffer) - (strlen(buffer)-4), "T.mdl") if (file_exists(buffer)) engfunc(EngFunc_PrecacheModel, buffer) } for (i = 0; i < ArraySize(model_nemesis); i++) { ArrayGetString(model_nemesis, i, buffer, charsmax(buffer)) format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer) ArrayPushCell(g_modelindex_nemesis, engfunc(EngFunc_PrecacheModel, buffer)) if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer) if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer) // Precache modelT.mdl files too copy(buffer[strlen(buffer)-4], charsmax(buffer) - (strlen(buffer)-4), "T.mdl") if (file_exists(buffer)) engfunc(EngFunc_PrecacheModel, buffer) } for (i = 0; i < ArraySize(model_survivor); i++) { ArrayGetString(model_survivor, i, buffer, charsmax(buffer)) format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer) ArrayPushCell(g_modelindex_survivor, engfunc(EngFunc_PrecacheModel, buffer)) if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer) if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer) // Precache modelT.mdl files too copy(buffer[strlen(buffer)-4], charsmax(buffer) - (strlen(buffer)-4), "T.mdl") if (file_exists(buffer)) engfunc(EngFunc_PrecacheModel, buffer) } for (i = 0; i < ArraySize(model_admin_zombie); i++) { ArrayGetString(model_admin_zombie, i, buffer, charsmax(buffer)) format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer) ArrayPushCell(g_modelindex_admin_zombie, engfunc(EngFunc_PrecacheModel, buffer)) if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer) if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer) // Precache modelT.mdl files too copy(buffer[strlen(buffer)-4], charsmax(buffer) - (strlen(buffer)-4), "T.mdl") if (file_exists(buffer)) engfunc(EngFunc_PrecacheModel, buffer) } for (i = 0; i < ArraySize(model_admin_human); i++) { ArrayGetString(model_admin_human, i, buffer, charsmax(buffer)) format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer) ArrayPushCell(g_modelindex_admin_human, engfunc(EngFunc_PrecacheModel, buffer)) if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer) if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer) // Precache modelT.mdl files too copy(buffer[strlen(buffer)-4], charsmax(buffer) - (strlen(buffer)-4), "T.mdl") if (file_exists(buffer)) engfunc(EngFunc_PrecacheModel, buffer) } for (i = 0; i < ArraySize(model_vip_human); i++) { ArrayGetString(model_vip_human, i, buffer, charsmax(buffer)) format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer) ArrayPushCell(g_modelindex_vip_human, engfunc(EngFunc_PrecacheModel, buffer)) if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer) if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer) } for (i = 0; i < ArraySize(model_boss_human); i++) { ArrayGetString(model_boss_human, i, buffer, charsmax(buffer)) format(buffer, charsmax(buffer), "models/player/%s/%s.mdl", buffer, buffer) ArrayPushCell(g_modelindex_boss_human, engfunc(EngFunc_PrecacheModel, buffer)) if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, buffer) if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, buffer) }
// Custom sounds for (i = 0; i < ArraySize(sound_win_zombies); i++) { ArrayGetString(sound_win_zombies, i, buffer, charsmax(buffer)) if (ArrayGetCell(sound_win_zombies_ismp3, i)) { format(buffer, charsmax(buffer), "sound/%s", buffer) engfunc(EngFunc_PrecacheGeneric, buffer) } else { engfunc(EngFunc_PrecacheSound, buffer) } } for (i = 0; i < ArraySize(sound_win_humans); i++) { ArrayGetString(sound_win_humans, i, buffer, charsmax(buffer)) if (ArrayGetCell(sound_win_humans_ismp3, i)) { format(buffer, charsmax(buffer), "sound/%s", buffer) engfunc(EngFunc_PrecacheGeneric, buffer) } else { engfunc(EngFunc_PrecacheSound, buffer) } } for (i = 0; i < ArraySize(sound_win_no_one); i++) { ArrayGetString(sound_win_no_one, i, buffer, charsmax(buffer)) if (ArrayGetCell(sound_win_no_one_ismp3, i)) { format(buffer, charsmax(buffer), "sound/%s", buffer) engfunc(EngFunc_PrecacheGeneric, buffer) } else { engfunc(EngFunc_PrecacheSound, buffer) } } for (i = 0; i < ArraySize(sound_nemesis); i++) { ArrayGetString(sound_nemesis, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(sound_survivor); i++) { ArrayGetString(sound_survivor, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(sound_swarm); i++) { ArrayGetString(sound_swarm, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(sound_multi); i++) { ArrayGetString(sound_multi, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(sound_plague); i++) { ArrayGetString(sound_plague, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(grenade_infect); i++) { ArrayGetString(grenade_infect, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(grenade_infect_player); i++) { ArrayGetString(grenade_infect_player, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(grenade_fire); i++) { ArrayGetString(grenade_fire, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(grenade_fire_player); i++) { ArrayGetString(grenade_fire_player, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(grenade_frost); i++) { ArrayGetString(grenade_frost, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(grenade_frost_player); i++) { ArrayGetString(grenade_frost_player, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(grenade_frost_break); i++) { ArrayGetString(grenade_frost_break, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(grenade_flare); i++) { ArrayGetString(grenade_flare, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(sound_antidote); i++) { ArrayGetString(sound_antidote, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(sound_thunder); i++) { ArrayGetString(sound_thunder, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(nemesis_pain); i++) { ArrayGetString(nemesis_pain, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(nemesis_hit_normal); i++) { ArrayGetString(nemesis_hit_normal, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) }
for (i = 0; i < ArraySize(nemesis_hit_stab); i++) { ArrayGetString(nemesis_hit_stab, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) }
for (i = 0; i < ArraySize(nemesis_miss_slash); i++) { ArrayGetString(nemesis_miss_slash, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) }
for (i = 0; i < ArraySize(nemesis_miss_wall); i++) { ArrayGetString(nemesis_miss_wall, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) }
for (i = 0; i < ArraySize(nemesis_die); i++) { ArrayGetString(nemesis_die, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) }
for (i = 0; i < ArraySize(nemesis_idle); i++) { ArrayGetString(nemesis_idle, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } // Knifes for (i = 0; i < ArraySize(g_draw_combat); i++) { ArrayGetString(g_draw_combat, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_miss_combat); i++) { ArrayGetString(g_hit_miss_combat, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_wall_combat); i++) { ArrayGetString(g_hit_wall_combat, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_stab_combat); i++) { ArrayGetString(g_hit_stab_combat, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_normal_combat); i++) { ArrayGetString(g_hit_normal_combat, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) }
for (i = 0; i < ArraySize(g_draw_strong); i++) { ArrayGetString(g_draw_strong, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_miss_strong); i++) { ArrayGetString(g_hit_miss_strong, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_wall_strong); i++) { ArrayGetString(g_hit_wall_strong, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_stab_strong); i++) { ArrayGetString(g_hit_stab_strong, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_normal_strong); i++) { ArrayGetString(g_hit_normal_strong, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) }
for (i = 0; i < ArraySize(g_draw_axe); i++) { ArrayGetString(g_draw_axe, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_miss_axe); i++) { ArrayGetString(g_hit_miss_axe, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_wall_axe); i++) { ArrayGetString(g_hit_wall_axe, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_stab_axe); i++) { ArrayGetString(g_hit_stab_axe, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_normal_axe); i++) { ArrayGetString(g_hit_normal_axe, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) }
for (i = 0; i < ArraySize(g_draw_hammer); i++) { ArrayGetString(g_draw_hammer, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_miss_hammer); i++) { ArrayGetString(g_hit_miss_hammer, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_wall_hammer); i++) { ArrayGetString(g_hit_wall_hammer, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_stab_hammer); i++) { ArrayGetString(g_hit_stab_hammer, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_normal_hammer); i++) { ArrayGetString(g_hit_normal_hammer, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) }
for (i = 0; i < ArraySize(g_draw_skullfire); i++) { ArrayGetString(g_draw_skullfire, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_miss_skullfire); i++) { ArrayGetString(g_hit_miss_skullfire, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_wall_skullfire); i++) { ArrayGetString(g_hit_wall_skullfire, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_stab_skullfire); i++) { ArrayGetString(g_hit_stab_skullfire, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_normal_skullfire); i++) { ArrayGetString(g_hit_normal_skullfire, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) }
for (i = 0; i < ArraySize(g_draw_saxe); i++) { ArrayGetString(g_draw_saxe, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_miss_saxe); i++) { ArrayGetString(g_hit_miss_saxe, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_wall_saxe); i++) { ArrayGetString(g_hit_wall_saxe, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_stab_saxe); i++) { ArrayGetString(g_hit_stab_saxe, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_normal_saxe); i++) { ArrayGetString(g_hit_normal_saxe, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_draw_chainsaw); i++) { ArrayGetString(g_draw_chainsaw, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_miss_chainsaw); i++) { ArrayGetString(g_hit_miss_chainsaw, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_wall_chainsaw); i++) { ArrayGetString(g_hit_wall_chainsaw, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_stab_chainsaw); i++) { ArrayGetString(g_hit_stab_chainsaw, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(g_hit_normal_chainsaw); i++) { ArrayGetString(g_hit_normal_chainsaw, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } // Knifes // Class Sound for (i = 0; i < ArraySize(class_sound_infect); i++) { ArrayGetString(class_sound_infect, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(class_sound_pain); i++) { ArrayGetString(class_sound_pain, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(class_sound_die); i++) { ArrayGetString(class_sound_die, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(class_sound_madness); i++) { ArrayGetString(class_sound_madness, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(class_sound_miss_slash); i++) { ArrayGetString(class_sound_miss_slash, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(class_sound_miss_wall); i++) { ArrayGetString(class_sound_miss_wall, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(class_sound_hit_normal); i++) { ArrayGetString(class_sound_hit_normal, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(class_sound_hit_stab); i++) { ArrayGetString(class_sound_hit_stab, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(class_sound_idle); i++) { ArrayGetString(class_sound_idle, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } for (i = 0; i < ArraySize(class_sound_burn); i++) { ArrayGetString(class_sound_burn, i, buffer, charsmax(buffer)) engfunc(EngFunc_PrecacheSound, buffer) } // Class Sound
// Ambience Sounds if (g_ambience_sounds[AMBIENCE_SOUNDS_INFECTION]) { for (i = 0; i < ArraySize(sound_ambience1); i++) { ArrayGetString(sound_ambience1, i, buffer, charsmax(buffer))
if (ArrayGetCell(sound_ambience1_ismp3, i)) { format(buffer, charsmax(buffer), "sound/%s", buffer) engfunc(EngFunc_PrecacheGeneric, buffer) } else { engfunc(EngFunc_PrecacheSound, buffer) } } } if (g_ambience_sounds[AMBIENCE_SOUNDS_NEMESIS]) { for (i = 0; i < ArraySize(sound_ambience2); i++) { ArrayGetString(sound_ambience2, i, buffer, charsmax(buffer))
if (ArrayGetCell(sound_ambience2_ismp3, i)) { format(buffer, charsmax(buffer), "sound/%s", buffer) engfunc(EngFunc_PrecacheGeneric, buffer) } else { engfunc(EngFunc_PrecacheSound, buffer) } } } if (g_ambience_sounds[AMBIENCE_SOUNDS_SURVIVOR]) { for (i = 0; i < ArraySize(sound_ambience3); i++) { ArrayGetString(sound_ambience3, i, buffer, charsmax(buffer))
if (ArrayGetCell(sound_ambience3_ismp3, i)) { format(buffer, charsmax(buffer), "sound/%s", buffer) engfunc(EngFunc_PrecacheGeneric, buffer) } else { engfunc(EngFunc_PrecacheSound, buffer) } } } if (g_ambience_sounds[AMBIENCE_SOUNDS_SWARM]) { for (i = 0; i < ArraySize(sound_ambience4); i++) { ArrayGetString(sound_ambience4, i, buffer, charsmax(buffer))
if (ArrayGetCell(sound_ambience4_ismp3, i)) { format(buffer, charsmax(buffer), "sound/%s", buffer) engfunc(EngFunc_PrecacheGeneric, buffer) } else { engfunc(EngFunc_PrecacheSound, buffer) } } } if (g_ambience_sounds[AMBIENCE_SOUNDS_PLAGUE]) { for (i = 0; i < ArraySize(sound_ambience5); i++) { ArrayGetString(sound_ambience5, i, buffer, charsmax(buffer))
// Set a random skybox? /*-----BossManager(start)-----*/ if (g_sky_enable && !Map_Boss/*Block Sky*/) /*-----BossManager(End)-----*/ { new sky[32] ArrayGetString(g_sky_names, random_num(0, ArraySize(g_sky_names) - 1), sky, charsmax(sky)) set_cvar_string("sv_skyname", sky) }
// Disable sky lighting so it doesn't mess with our custom lighting set_cvar_num("sv_skycolor_r", 0) set_cvar_num("sv_skycolor_g", 0) set_cvar_num("sv_skycolor_b", 0)
// Get Max Players g_maxplayers = get_maxplayers()
// Reserved saving slots starts on maxplayers+1 db_slot_i = g_maxplayers+1
// Check if it's a CZ server new mymod[6] get_modname(mymod, charsmax(mymod)) if (equal(mymod, "czero")) g_czero = 1 }
public plugin_cfg() { // Plugin disabled? if (!g_pluginenabled) return;
// Get configs dir new cfgdir[32] get_configsdir(cfgdir, charsmax(cfgdir))
if (!g_Restart) { // Show welcome message and T-Virus notice remove_task(TASK_WELCOMEMSG) set_task(2.0, "welcome_msg", TASK_WELCOMEMSG)
static count = 1;
if(count > 3) count = 1;
switch(count) { case 1: client_cmd(0,"spk zp_cso/countdown/zombi_start") case 2: client_cmd(0,"spk zp_cso/countdown/zombi_three") case 3: client_cmd(0,"spk zp_cso/countdown/zombi_two") }
count++;
// Set a new "Make Zombie Task" remove_task(TASK_MAKEZOMBIE)
// Log Event Round End public logevent_round_end() { // Prevent this from getting called twice when restarting (bugfix) static Float:lastendtime, Float:current_time current_time = get_gametime() if (current_time - lastendtime < 0.5) return; lastendtime = current_time
// Temporarily save player stats? if (get_pcvar_num(cvar_statssave)) { static id, team for (id = 1; id <= g_maxplayers; id++) { // Not connected if (!g_isconnected[id]) continue;
team = fm_cs_get_user_team(id)
// Not playing if (team == FM_CS_TEAM_SPECTATOR || team == FM_CS_TEAM_UNASSIGNED) continue;
save_stats(id) } }
// Round ended g_endround = true
// Stop old tasks (if any) remove_task(TASK_WELCOMEMSG) remove_task(TASK_MAKEZOMBIE) remove_task(TASK_COUNTDOWN)
// BP Ammo update public event_ammo_x(id) { // Humans only if (g_zombie[id]) return;
// Get ammo type static type type = read_data(1)
// Unknown ammo type if (type >= sizeof AMMOWEAPON) return;
// Get weapon's id static weapon weapon = AMMOWEAPON[type]
// Primary and secondary only if (MAXBPAMMO[weapon] <= 2) return;
// Get ammo amount static amount amount = read_data(2)
// Unlimited BP Ammo? if (g_survivor[id] ? get_pcvar_num(cvar_survinfammo) : get_pcvar_num(cvar_infammo)) { if (amount < MAXBPAMMO[weapon]) { // The BP Ammo refill code causes the engine to send a message, but we // can't have that in this forward or we risk getting some recursion bugs. // For more info see: static args[1] args[0] = weapon set_task(0.1, "refill_bpammo", id, args, sizeof args) } } }
// Entity Spawn Forward public fw_Spawn(entity) { // Invalid entity if (!pev_valid(entity)) return FMRES_IGNORED;
// Get classname new classname[32], objective[32], size = ArraySize(g_objective_ents) pev(entity, pev_classname, classname, charsmax(classname))
// Check whether it needs to be removed for (new i = 0; i < size; i++) { ArrayGetString(g_objective_ents, i, objective, charsmax(objective))
if (equal(classname, objective)) { engfunc(EngFunc_RemoveEntity, entity) return FMRES_SUPERCEDE; } }
return FMRES_IGNORED; }
// Sound Precache Forward public fw_PrecacheSound(const sound[]) { // Block all those unneeeded hostage sounds if (equal(sound, "hostage", 7)) return FMRES_SUPERCEDE;
return FMRES_IGNORED; }
// Ham Player Spawn Post Forward public fw_PlayerSpawn_Post(id) { // Not alive or didn't join a team yet if (!is_user_alive(id) || !fm_cs_get_user_team(id)) return;
// Spawn at a random location? if (get_pcvar_num(cvar_randspawn)) do_random_spawn(id)
// Hide money? if (get_pcvar_num(cvar_removemoney)) set_task(0.4, "task_hide_money", id+TASK_SPAWN)
// Respawn player if he dies because of a worldspawn kill? // Respawn player if he dies because of a worldspawn kill? /*-----BossManager(start)-----*/ if (get_pcvar_num(cvar_respawnworldspawnkill) && !Map_Boss /*Fix SpawnKill*/) /*-----BossManager(End)-----*/ set_task(2.0, "respawn_player_check_task", id+TASK_SPAWN)
// Spawn as zombie? if (g_respawn_as_zombie[id] && !g_newround) { reset_vars(id, 0) // reset player vars zombieme(id, 0, 0, 0, 0) // make him zombie right away return; }
// Reset player vars reset_vars(id, 0) g_buytime[id] = get_gametime()
// Show custom buy menu? if (get_pcvar_num(cvar_buycustom)) set_task(0.2, "show_menu_buy1", id+TASK_SPAWN)
// Set health and gravity if (!Map_Boss){ if(!g_has_chainsaw[id]) fm_set_user_health(id, get_pcvar_num(cvar_humanhp)) else fm_set_user_health(id, g_chain_hp[id])
// Switch to CT if spawning mid-round if (!g_newround && fm_cs_get_user_team(id) != FM_CS_TEAM_CT) // need to change team? { remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_CT) fm_user_team_update(id) }
if (g_handle_models_on_separate_ent) { // Set the right model if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS])) { iRand = random_num(0, ArraySize(model_admin_human) - 1) ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_human, iRand))
// Set model on player model entity fm_set_playermodel_ent(id)
// Remove glow on player model entity fm_set_rendering(g_ent_playermodel[id]) } else { // Get current model for comparing it with the current one fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
// Set the right model, after checking that we don't already have it if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS])) { size = ArraySize(model_admin_human) for (i = 0; i < size; i++) { ArrayGetString(model_admin_human, i, tempmodel, charsmax(tempmodel)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 0 : 3)) if (equal(currentmodel, tempmodel)) already_has_model = true }
if (!already_has_model) { iRand = random_num(0, size - 1) ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_human, iRand)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 0 : 3)) } } else if (get_user_flags(id) & VIP_MODEL_HUMAN) { size = ArraySize(model_vip_human) for (i = 0; i < size; i++) { ArrayGetString(model_vip_human, i, tempmodel, charsmax(tempmodel)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 4 : 3)) if (equal(currentmodel, tempmodel)) already_has_model = true }
if (!already_has_model) { iRand = random_num(0, size - 1) ArrayGetString(model_vip_human, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_vip_human, iRand)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 4 : 3)) } } else if (get_user_flags(id) & BOSS_MODEL_HUMAN) { size = ArraySize(model_boss_human) for (i = 0; i < size; i++) { ArrayGetString(model_boss_human, i, tempmodel, charsmax(tempmodel)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 4 : 3)) if (equal(currentmodel, tempmodel)) already_has_model = true }
if (!already_has_model) { iRand = random_num(0, size - 1) ArrayGetString(model_boss_human, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_boss_human, iRand)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 4 : 3)) } } else { size = ArraySize(model_human) for (i = 0; i < size; i++) { ArrayGetString(model_human, i, tempmodel, charsmax(tempmodel)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? random_num(1, 2) : 3)) if (equal(currentmodel, tempmodel)) already_has_model = true }
// Need to change the model? if (!already_has_model) { // An additional delay is offset at round start // since SVC_BAD is more likely to be triggered there if (g_newround) set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL) else fm_user_model_update(id+TASK_MODEL) }
// Remove glow fm_set_rendering(id) }
// Bots stuff if (g_isbot[id]) { // Turn off NVG for bots cs_set_user_nvg(id, 0)
// Automatically buy extra items/weapons after first zombie is chosen if (get_pcvar_num(cvar_extraitems)) { if (g_newround) set_task(10.0 + get_pcvar_float(cvar_warmup), "bot_buy_extras", id+TASK_SPAWN) else set_task(10.0, "bot_buy_extras", id+TASK_SPAWN) } }
// Enable spawn protection for humans spawning mid-round if (!g_newround && get_pcvar_float(cvar_spawnprotection) > 0.0) { // Do not take damage g_nodamage[id] = true
// Make temporarily invisible set_pev(id, pev_effects, pev(id, pev_effects) | EF_NODRAW)
// Set task to remove it set_task(get_pcvar_float(cvar_spawnprotection), "remove_spawn_protection", id+TASK_SPAWN) }
// Turn off his flashlight (prevents double flashlight bug/exploit) turn_off_flashlight(id)
// Set the flashlight charge task to update battery status if (g_cached_customflash) set_task(1.0, "flashlight_charge", id+TASK_CHARGE, _, _, "b")
// Ham Player Killed Forward public fw_PlayerKilled(victim, attacker, shouldgib) { // Player killed g_isalive[victim] = false // Disable nodamage mode after we die to prevent spectator nightvision using zombie madness colors bug g_nodamage[victim] = false
// Enable dead players nightvision set_task(0.1, "spec_nvision", victim)
// Zombie/nemesis killed human, reward ammo packs if (g_zombie[attacker] && (!g_nemesis[attacker] || !get_pcvar_num(cvar_nemignoreammo))) g_ammopacks[attacker] += get_pcvar_num(cvar_ammoinfect)
// Human killed zombie, add up the extra frags for kill if (!g_zombie[attacker] && get_pcvar_num(cvar_fragskill) > 1) UpdateFrags(attacker, victim, get_pcvar_num(cvar_fragskill) - 1, 0, 0)
// Zombie killed human, add up the extra frags for kill if (g_zombie[attacker] && get_pcvar_num(cvar_fragsinfect) > 1) UpdateFrags(attacker, victim, get_pcvar_num(cvar_fragsinfect) - 1, 0, 0) }
// Ham Player Killed Post Forward public fw_PlayerKilled_Post(victim, attacker, shouldgib) { // Last Zombie Check fnCheckLastZombie()
// Determine whether the player killed himself static selfkill selfkill = (victim == attacker || !is_user_valid_connected(attacker)) ? true : false
// Respawn if deathmatch is enabled /*-----BossManager(start)-----*/ if (get_pcvar_num(cvar_deathmatch) && !Map_Boss /*Block Respawn*/) /*-----BossManager(End)-----*/ { // Respawn on suicide? if (selfkill && !get_pcvar_num(cvar_respawnonsuicide)) return;
a_lot_of_blood(victim) } else if(g_survivor[attacker]) SetHamParamFloat(4, damage * g_damage_saxe) else switch (g_knife[attacker]) { case 0: SetHamParamFloat(4, damage * g_damage_axe) case 1: SetHamParamFloat(4, damage * g_damage_strong) case 2: SetHamParamFloat(4, damage * g_damage_combat) case 3: SetHamParamFloat(4, damage * g_damage_hammer) case 4: SetHamParamFloat(4, damage * g_damage_skullfire) } }
return HAM_IGNORED; }
// Attacker is zombie...
// Prevent infection/damage by HE grenade (bugfix) if (damage_type & DMG_HEGRENADE) return HAM_SUPERCEDE;
// Nemesis? if (g_nemesis[attacker]) { // Ignore nemesis damage override if damage comes from a 3rd party entity // (to prevent this from affecting a sub-plugin's rockets e.g.) if (inflictor == attacker) { // Set nemesis damage SetHamParamFloat(4, get_pcvar_float(cvar_nemdamage)) }
return HAM_IGNORED; }
// Reward ammo packs to zombies for damaging humans? if (get_pcvar_num(cvar_ammodamage_zombie) > 0) { // Store damage dealt g_damagedealt_zombie[attacker] += floatround(damage)
// Reward ammo packs for every [ammo damage] dealt while (g_damagedealt_zombie[attacker] > get_pcvar_num(cvar_ammodamage_zombie)) { g_ammopacks[attacker]++ g_damagedealt_zombie[attacker] -= get_pcvar_num(cvar_ammodamage_zombie) } }
// Last human or not an infection round if (g_survivor[victim] || g_nemround || g_swarmround || g_plagueround || fnGetHumans() == 1) return HAM_IGNORED; // human is killed
// Does human armor need to be reduced before infecting? if (get_pcvar_num(cvar_humanarmor)) { // Get victim armor static Float:armor pev(victim, pev_armorvalue, armor)
// If he has some, block the infection and reduce armor instead if (armor > 0.0) { emit_sound(victim, CHAN_BODY, sound_armorhit, 1.0, ATTN_NORM, 0, PITCH_NORM) if (armor - damage > 0.0) set_pev(victim, pev_armorvalue, armor - damage) else cs_set_user_armor(victim, 0, CS_ARMOR_NONE) return HAM_SUPERCEDE; } }
// Ham Take Damage Post Forward public fw_TakeDamage_Post(victim) { // --- Check if victim should be Pain Shock Free ---
// Check if proper CVARs are enabled if (g_zombie[victim]) { if (g_nemesis[victim]) { if (!get_pcvar_num(cvar_nempainfree)) return; } else { switch (get_pcvar_num(cvar_zombiepainfree)) { case 0: return; case 2: if (!g_lastzombie[victim]) return; case 3: if (!g_firstzombie[victim]) return; } } } else { if (g_survivor[victim]) { if (!get_pcvar_num(cvar_survpainfree)) return; } else return; }
// Prevent server crash if entity's private data not initalized if (pev_valid(victim) != PDATA_SAFE) return;
// Ham Trace Attack Forward public fw_TraceAttack(victim, attacker, Float:damage, Float:direction[3], tracehandle, damage_type) { // Non-player damage or self damage if (victim == attacker || !is_user_valid_connected(attacker)) return HAM_IGNORED;
// New round starting or round ended if (g_newround || g_endround) return HAM_SUPERCEDE;
// Victim shouldn't take damage or victim is frozen if (g_nodamage[victim] || g_frozen[victim]) return HAM_SUPERCEDE;
// Prevent friendly fire if (g_zombie[attacker] == g_zombie[victim]) return HAM_SUPERCEDE;
// Victim isn't a zombie or not bullet damage, nothing else to do here if (!g_zombie[victim] || !(damage_type & DMG_BULLET)) return HAM_IGNORED;
// If zombie hitzones are enabled, check whether we hit an allowed one if (get_pcvar_num(cvar_hitzones) && !g_nemesis[victim] && !(get_pcvar_num(cvar_hitzones) & (1<<get_tr2(tracehandle, TR_iHitgroup)))) return HAM_SUPERCEDE;
// Knockback disabled, nothing else to do here if (!get_pcvar_num(cvar_knockback)) return HAM_IGNORED;
// Nemesis knockback disabled, nothing else to do here if (g_nemesis[victim] && get_pcvar_float(cvar_nemknockback) == 0.0) return HAM_IGNORED;
// Get whether the victim is in a crouch state static ducking ducking = pev(victim, pev_flags) & (FL_DUCKING | FL_ONGROUND) == (FL_DUCKING | FL_ONGROUND)
// Zombie knockback when ducking disabled if (ducking && get_pcvar_float(cvar_knockbackducking) == 0.0) return HAM_IGNORED;
// Get distance between players static origin1[3], origin2[3] get_user_origin(victim, origin1) get_user_origin(attacker, origin2)
// Max distance exceeded if (get_distance(origin1, origin2) > get_pcvar_num(cvar_knockbackdist)) return HAM_IGNORED;
// Get victim's velocity static Float:velocity[3] pev(victim, pev_velocity, velocity)
// Use damage on knockback calculation if (get_pcvar_num(cvar_knockbackdamage)) xs_vec_mul_scalar(direction, damage, direction)
// Use weapon power on knockback calculation if (get_pcvar_num(cvar_knockbackpower) && kb_weapon_power[g_currentweapon[attacker]] > 0.0) xs_vec_mul_scalar(direction, kb_weapon_power[g_currentweapon[attacker]], direction)
// Apply ducking knockback multiplier if (ducking) xs_vec_mul_scalar(direction, get_pcvar_float(cvar_knockbackducking), direction)
// Add up the new vector xs_vec_add(velocity, direction, direction)
// Should knockback also affect vertical velocity? if (!get_pcvar_num(cvar_knockbackzvel)) direction[2] = velocity[2]
// Set the knockback'd victim's velocity set_pev(victim, pev_velocity, direction)
return HAM_IGNORED; }
// Ham Reset MaxSpeed Post Forward public fw_ResetMaxSpeed_Post(id) { // Freezetime active or player not alive if (g_freezetime || !g_isalive[id]) return;
set_player_maxspeed(id) }
// Ham Use Stationary Gun Forward public fw_UseStationary(entity, caller, activator, use_type) { // Prevent zombies from using stationary guns if (use_type == USE_USING && is_user_valid_connected(caller) && g_zombie[caller]) return HAM_SUPERCEDE;
return HAM_IGNORED; }
// Ham Use Stationary Gun Post Forward public fw_UseStationary_Post(entity, caller, activator, use_type) { // Someone stopped using a stationary gun if (use_type == USE_STOPPED && is_user_valid_connected(caller)) replace_weapon_models(caller, g_currentweapon[caller]) // replace weapon models (bugfix) }
// Ham Use Pushable Forward public fw_UsePushable() { // Prevent speed bug with pushables? if (get_pcvar_num(cvar_blockpushables)) return HAM_SUPERCEDE;
return HAM_IGNORED; }
// Ham Weapon Touch Forward public fw_TouchWeapon(weapon, id) { // Not a player if (!is_user_valid_connected(id)) return HAM_IGNORED;
// Dont pickup weapons if zombie or survivor (+PODBot MM fix) if (g_zombie[id] || (g_survivor[id] && !g_isbot[id])) return HAM_SUPERCEDE;
return HAM_IGNORED; }
// Ham Weapon Pickup Forward public fw_AddPlayerItem(id, weapon_ent) { // HACK: Retrieve our custom extra ammo from the weapon static extra_ammo extra_ammo = pev(weapon_ent, PEV_ADDITIONAL_AMMO)
// If present if (extra_ammo) { // Get weapon's id static weaponid weaponid = cs_get_weapon_id(weapon_ent)
// Ham Weapon Deploy Forward public fw_Item_Deploy_Post(weapon_ent) { // Get weapon's owner static owner owner = fm_cs_get_weapon_ent_owner(weapon_ent)
// Valid owner? if (!pev_valid(owner)) return;
// Get weapon's id static weaponid weaponid = cs_get_weapon_id(weapon_ent)
// Store current weapon's id for reference g_currentweapon[owner] = weaponid
// Replace weapon models with custom ones replace_weapon_models(owner, weaponid)
// Zombie not holding an allowed weapon for some reason if (g_zombie[owner] && !((1<<weaponid) & ZOMBIE_ALLOWED_WEAPONS_BITSUM)) { // Switch to knife g_currentweapon[owner] = CSW_KNIFE engclient_cmd(owner, "weapon_knife") } }
// WeaponMod bugfix //forward wpn_gi_reset_weapon(id); public wpn_gi_reset_weapon(id) { // Replace knife model replace_weapon_models(id, CSW_KNIFE) }
// Client joins the game public client_putinserver(id) { // Plugin disabled? if (!g_pluginenabled) return;
// Player joined g_isconnected[id] = true
g_knife[id] = 0
// Cache player's name get_user_name(id, g_playername[id], charsmax(g_playername[]))
// Initialize player vars reset_vars(id, 1)
// Load player stats? if (get_pcvar_num(cvar_statssave)) load_stats(id)
// Set some tasks for humans only if (!is_user_bot(id)) { // Set the custom HUD display task if enabled if (get_pcvar_num(cvar_huddisplay)) set_task(1.0, "ShowHUD", id+TASK_SHOWHUD, _, _, "b")
// Disable minmodels for clients to see zombies properly set_task(5.0, "disable_minmodels", id) } else { // Set bot flag g_isbot[id] = true
// CZ bots seem to use a different "classtype" for player entities // (or something like that) which needs to be hooked separately if (!g_hamczbots && cvar_botquota) { // Set a task to let the private data initialize set_task(0.1, "register_ham_czbots", id) } } }
// Client leaving public fw_ClientDisconnect(id) { // Check that we still have both humans and zombies to keep the round going if (g_isalive[id]) check_round(id)
// Temporarily save player stats? if (get_pcvar_num(cvar_statssave)) save_stats(id)
// Forward Set ClientKey Value -prevent CS from changing player models- public fw_SetClientKeyValue(id, const infobuffer[], const key[]) { // Block CS model changes if (key[0] == 'm' && key[1] == 'o' && key[2] == 'd' && key[3] == 'e' && key[4] == 'l') return FMRES_SUPERCEDE;
return FMRES_IGNORED; }
// Forward Client User Info Changed -prevent players from changing models- public fw_ClientUserInfoChanged(id) { // Cache player's name get_user_name(id, g_playername[id], charsmax(g_playername[]))
if (!g_handle_models_on_separate_ent) { // Get current model static currentmodel[32] fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
// If they're different, set model again if (!equal(currentmodel, g_playermodel[id]) && !task_exists(id+TASK_MODEL)) fm_cs_set_user_model(id+TASK_MODEL) } }
// Forward Get Game Description public fw_GetGameDescription() { // Return the mod name so it can be easily identified forward_return(FMV_STRING, g_modname)
return FMRES_SUPERCEDE; }
// Forward Set Model public fw_SetModel(entity, const model[]) { // We don't care if (strlen(model) < 8) return FMRES_IGNORED
// Remove weapons? if (get_pcvar_float(cvar_removedropped) > 0.0) { // Get entity's classname static classname[10] pev(entity, pev_classname, classname, charsmax(classname))
// Check if it's a weapon box if (equal(classname, "weaponbox")) { // They get automatically removed when thinking set_pev(entity, pev_nextthink, get_gametime() + get_pcvar_float(cvar_removedropped)) return FMRES_IGNORED } }
// Narrow down our matches a bit if (model[7] != 'w' || model[8] != '_') return FMRES_IGNORED
// Get damage time of grenade static Float:dmgtime pev(entity, pev_dmgtime, dmgtime)
new id = pev(entity, pev_owner)
// Grenade not yet thrown if (dmgtime == 0.0) return FMRES_IGNORED
if (model[9] == 'h' && model[10] == 'e') // Napalm Grenade { // Give it a glow fm_set_rendering(entity, kRenderFxGlowShell, 200, 0, 0, kRenderNormal, 16);
// And a colored trail message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_BEAMFOLLOW) // TE id write_short(entity) // entity write_short(g_trailSpr) // sprite write_byte(10) // life write_byte(10) // width write_byte(200) // r write_byte(0) // g write_byte(0) // b write_byte(200) // brightness message_end()
// Set grenade type on the thrown grenade entity set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_NAPALM)
engfunc(EngFunc_SetModel, entity, model_wgrenade_fire) return FMRES_SUPERCEDE } else if (model[9] == 'f' && model[10] == 'l') // Frost Grenade { // Give it a glow fm_set_rendering(entity, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 16);
// And a colored trail message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_BEAMFOLLOW) // TE id write_short(entity) // entity write_short(g_trailSpr) // sprite write_byte(10) // life write_byte(10) // width write_byte(0) // r write_byte(100) // g write_byte(200) // b write_byte(200) // brightness message_end()
// Set grenade type on the thrown grenade entity set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_FROST)
engfunc(EngFunc_SetModel, entity, model_wgrenade_frost) return FMRES_SUPERCEDE } else if (model[9] == 's' && model[10] == 'm') // Flare { if (!g_zombie[id]) { // Give it a glow fm_set_rendering(entity, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 16);
// And a colored trail message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_BEAMFOLLOW) // TE id write_short(entity) // entity write_short(g_trailSpr) // sprite write_byte(10) // life write_byte(10) // width write_byte(255) // r write_byte(0) // g write_byte(0) // b write_byte(200) // brightness message_end()
// Set grenade type on the thrown grenade entity set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_FLARE)
// Ham Grenade Think Forward public fw_ThinkGrenade(entity) { // Invalid entity if (!pev_valid(entity)) return HAM_IGNORED;
// Get damage time of grenade static Float:dmgtime, Float:current_time pev(entity, pev_dmgtime, dmgtime) current_time = get_gametime()
// Check if it's time to go off if (dmgtime > current_time) return HAM_IGNORED;
// Check if it's one of our custom nades switch (pev(entity, PEV_NADE_TYPE)) { case NADE_TYPE_INFECTION: // Infection Bomb { infection_explode(entity) return HAM_SUPERCEDE; } case NADE_TYPE_NAPALM: // Napalm Grenade { fire_explode(entity) return HAM_SUPERCEDE; } case NADE_TYPE_FROST: // Frost Grenade { frost_explode(entity) return HAM_SUPERCEDE; } case NADE_TYPE_FLARE: // Flare { explo_explode(entity) return HAM_SUPERCEDE; } }
return HAM_IGNORED; }
// Forward CmdStart public fw_CmdStart(id, handle) { // Not alive if (!g_isalive[id]) return;
// This logic looks kinda weird, but it should work in theory... // p = g_zombie[id], q = g_survivor[id], r = g_cached_customflash // ¬(p v q v (¬p ^ r)) <==> ¬p ^ ¬q ^ (p v ¬r) if (!g_zombie[id] && !g_survivor[id] && (g_zombie[id] || !g_cached_customflash)) return;
// Check if it's a flashlight impulse if (get_uc(handle, UC_Impulse) != IMPULSE_FLASHLIGHT) return;
// Block it I say! set_uc(handle, UC_Impulse, 0)
// Should human's custom flashlight be turned on? if (!g_zombie[id] && !g_survivor[id] && g_flashbattery[id] > 2 && get_gametime() - g_lastflashtime[id] > 1.2) { // Prevent calling flashlight too quickly (bugfix) g_lastflashtime[id] = get_gametime()
// Set the flashlight charge task set_task(1.0, "flashlight_charge", id+TASK_CHARGE, _, _, "b")
// Call our custom flashlight task if enabled if (g_flashlight[id]) set_task(0.1, "set_user_flashlight", id+TASK_FLASH, _, _, "b") } }
// Forward Player PreThink public fw_PlayerPreThink(id) { // Not alive if (!g_isalive[id]) return;
// Enable custom buyzone for player during buytime, unless zombie or survivor or time expired if (g_cached_buytime > 0.0 && !g_zombie[id] && !g_survivor[id] && (get_gametime() < g_buytime[id] + g_cached_buytime)) { if (pev_valid(g_buyzone_ent)) dllfunc(DLLFunc_Touch, g_buyzone_ent, id) }
// Silent footsteps for zombies? if (g_cached_zombiesilent && g_zombie[id] && !g_nemesis[id]) set_pev(id, pev_flTimeStepSound, STEPTIME_SILENT)
// Player frozen? if (g_frozen[id]) { set_pev(id, pev_velocity, Float:{0.0,0.0,0.0}) // stop motion return; // shouldn't leap while frozen }
// --- Check if player should leap ---
// Don't allow leap during freezetime if (g_freezetime) return;
// Check if proper CVARs are enabled and retrieve leap settings static Float:cooldown, Float:current_time if (g_zombie[id]) { if (g_nemesis[id]) { if (!g_cached_leapnemesis) return; cooldown = g_cached_leapnemesiscooldown } else { switch (g_cached_leapzombies) { case 0: return; case 2: if (!g_firstzombie[id]) return; case 3: if (!g_lastzombie[id]) return; } cooldown = g_cached_leapzombiescooldown } } else { new flags = pev(id, pev_flags) new waterlvl = pev(id, pev_waterlevel) new Float:fVelocity[3]
// Fix for AMXX custom menus if (pev_valid(id) == PDATA_SAFE) set_pdata_int(id, OFFSET_CSMENUCODE, 0, OFFSET_LINUX)
show_menu(id, KEYSMENU, menu, -1, "Game Menu") }
// Buy Menu 1 public show_menu_buy1(taskid) { // Get player's id static id (taskid > g_maxplayers) ? (id = ID_SPAWN) : (id = taskid);
// Player dead? if (!g_isalive[id]) return;
// Zombies or survivors get no guns if (g_zombie[id] || g_survivor[id]) return;
// Bots pick their weapons randomly / Random weapons setting enabled if (get_pcvar_num(cvar_randweapons) || g_isbot[id]) { buy_primary_weapon(id, random_num(0, ArraySize(g_primary_items) - 1)) menu_buy2(id, random_num(0, ArraySize(g_secondary_items) - 1)) return; }
// Automatic selection enabled for player and menu called on spawn event if (WPN_AUTO_ON && taskid > g_maxplayers) { buy_primary_weapon(id, WPN_AUTO_PRI) menu_buy2(id, WPN_AUTO_SEC) return; }
// Class List for (class = 0; class < g_zclass_i; class++) { // Retrieve name and info ArrayGetString(g_zclass_name, class, buffer, charsmax(buffer)) ArrayGetString(g_zclass_info, class, buffer2, charsmax(buffer2))
// Add to menu if (class == g_zombieclassnext[id]) formatex(menu, charsmax(menu), "\d%s %s", buffer, buffer2) else formatex(menu, charsmax(menu), "%s \y%s", buffer, buffer2)
buffer[0] = class buffer[1] = 0 menu_additem(menuid, menu, buffer) }
// Strip off from weapons fm_strip_user_weapons(id) fm_give_item(id, "weapon_knife")
// Get weapon's id and name static weaponid, wname[32] weaponid = ArrayGetCell(g_primary_weaponids, selection) ArrayGetString(g_primary_items, selection, wname, charsmax(wname))
// Give the new weapon and full ammo fm_give_item(id, wname) ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[weaponid], AMMOTYPE[weaponid], MAXBPAMMO[weaponid])
// Weapons bought g_canbuy[id] = false
/*-----BossManager(start)-----*/ // Give additional items if(!Map_Boss) { static i for (i = 0; i < ArraySize(g_additional_items); i++) { ArrayGetString(g_additional_items, i, wname, charsmax(wname)) fm_give_item(id, wname) } } /*-----BossManager(end)-----*/ }
// Buy Menu 2 public menu_buy2(id, key) { // Player dead? if (!g_isalive[id]) return PLUGIN_HANDLED;
// Zombies or survivors get no guns if (g_zombie[id] || g_survivor[id]) return PLUGIN_HANDLED;
// Special keys / weapon list exceeded if (key >= ArraySize(g_secondary_items)) { // Toggle autoselect if (key == MENU_KEY_AUTOSELECT) WPN_AUTO_ON = 1 - WPN_AUTO_ON
// Reshow menu unless user exited if (key != MENU_KEY_EXIT) show_menu_buy2(id)
return PLUGIN_HANDLED; }
// Store selected weapon WPN_AUTO_SEC = key
// Drop secondary gun again, in case we picked another (bugfix) drop_weapons(id, 2)
// Get weapon's id static weaponid, wname[32] weaponid = ArrayGetCell(g_secondary_weaponids, key) ArrayGetString(g_secondary_items, key, wname, charsmax(wname))
// Give the new weapon and full ammo fm_give_item(id, wname) ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[weaponid], AMMOTYPE[weaponid], MAXBPAMMO[weaponid])
return PLUGIN_HANDLED; }
// Extra Items Menu public menu_extras(id, menuid, item) { // Player disconnected? if (!is_user_connected(id)) { menu_destroy(menuid) return PLUGIN_HANDLED; }
// Menu was closed if (item == MENU_EXIT) { menu_destroy(menuid) return PLUGIN_HANDLED; }
// Dead players are not allowed to buy items if (!g_isalive[id]) { zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT") menu_destroy(menuid) return PLUGIN_HANDLED; }
// Retrieve extra item id static buffer[2], dummy, itemid menu_item_getinfo(menuid, item, dummy, buffer, charsmax(buffer), _, _, dummy) itemid = buffer[0]
// Attempt to buy the item buy_extra_item(id, itemid) menu_destroy(menuid) return PLUGIN_HANDLED; }
// Buy Extra Item buy_extra_item(id, itemid, ignorecost = 0) { // Retrieve item's team static team team = ArrayGetCell(g_extraitem_team, itemid)
// Ignore item's cost? if (!ignorecost) { // Check that we have enough ammo packs if (g_ammopacks[id] < ArrayGetCell(g_extraitem_cost, itemid)) { zp_colored_print(id, "^x04[ZP]^x01 %L", id, "NOT_ENOUGH_AMMO") return; }
static pointers[10], end static sound[64] ArrayGetArray(pointer_class_sound_madness, g_zombieclass[id], pointers)
for (new i; i < 10; i++) { if (pointers[i] != -1) end = i }
ArrayGetString(class_sound_madness, random_num(pointers[0], pointers[end]), sound, charsmax(sound)) emit_sound(id, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM) } case EXTRA_INFBOMB: // Infection Bomb { // Increase infection bomb purchase count for this round g_infbombcounter++
// Already own one if (user_has_weapon(id, CSW_HEGRENADE)) { // Increase BP ammo on it instead cs_set_user_bpammo(id, CSW_HEGRENADE, cs_get_user_bpammo(id, CSW_HEGRENADE) + 1)
// Flash ammo in hud message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id) write_byte(AMMOID[CSW_HEGRENADE]) // ammo id write_byte(1) // ammo amount message_end()
if (pev_valid(weapon_ent)) ExecuteHamB(Ham_Item_Deploy, weapon_ent)
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeapPickup"), _, id) write_byte(CSW_KNIFE) message_end() } default: { if (itemid >= EXTRA_WEAPONS_STARTID && itemid <= EXTRAS_CUSTOM_STARTID-1) // Weapons { // Get weapon's id and name static weaponid, wname[32] ArrayGetString(g_extraweapon_items, itemid - EXTRA_WEAPONS_STARTID, wname, charsmax(wname)) weaponid = cs_weapon_name_to_id(wname)
// If we are giving a primary/secondary weapon if (MAXBPAMMO[weaponid] > 2) { // Make user drop the previous one if ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM) drop_weapons(id, 1) else drop_weapons(id, 2)
// Give full BP ammo for the new one ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[weaponid], AMMOTYPE[weaponid], MAXBPAMMO[weaponid]) } // If we are giving a grenade which the user already owns else if (user_has_weapon(id, weaponid)) { // Increase BP ammo on it instead cs_set_user_bpammo(id, weaponid, cs_get_user_bpammo(id, weaponid) + 1)
// Flash ammo in hud message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id) write_byte(AMMOID[weaponid]) // ammo id write_byte(1) // ammo amount message_end()
// Zombie Class Menu public menu_zclass(id, menuid, item) { // Player disconnected? if (!is_user_connected(id)) { menu_destroy(menuid) return PLUGIN_HANDLED; }
// Admin Menu public menu_admin(id, key) { // Player disconnected? if (!g_isconnected[id]) return PLUGIN_HANDLED;
static userflags userflags = get_user_flags(id)
switch (key) { case ACTION_ZOMBIEFY_HUMANIZE: // Zombiefy/Humanize command { if (userflags & (g_access_flag[ACCESS_MODE_INFECTION] | g_access_flag[ACCESS_MAKE_ZOMBIE] | g_access_flag[ACCESS_MAKE_HUMAN])) { // Show player list for admin to pick a target PL_ACTION = ACTION_ZOMBIEFY_HUMANIZE show_menu_player_list(id) } else { zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS") show_menu_admin(id) } } case ACTION_MAKE_NEMESIS: // Nemesis command { if (userflags & (g_access_flag[ACCESS_MODE_NEMESIS] | g_access_flag[ACCESS_MAKE_NEMESIS])) { // Show player list for admin to pick a target PL_ACTION = ACTION_MAKE_NEMESIS show_menu_player_list(id) } else { zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS") show_menu_admin(id) } } case ACTION_MAKE_SURVIVOR: // Survivor command { if (userflags & (g_access_flag[ACCESS_MODE_SURVIVOR] | g_access_flag[ACCESS_MAKE_SURVIVOR])) { // Show player list for admin to pick a target PL_ACTION = ACTION_MAKE_SURVIVOR show_menu_player_list(id) } else { zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS") show_menu_admin(id) } } case ACTION_RESPAWN_PLAYER: // Respawn command { if (userflags & g_access_flag[ACCESS_RESPAWN_PLAYERS]) { // Show player list for admin to pick a target PL_ACTION = ACTION_RESPAWN_PLAYER show_menu_player_list(id) } else { zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS") show_menu_admin(id) } } case ACTION_MODE_SWARM: // Swarm Mode command { if (userflags & g_access_flag[ACCESS_MODE_SWARM]) { if (allowed_swarm()) command_swarm(id) else zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT") } else zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
show_menu_admin(id) } case ACTION_MODE_MULTI: // Multiple Infection command { if (userflags & g_access_flag[ACCESS_MODE_MULTI]) { if (allowed_multi()) command_multi(id) else zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT") } else zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
show_menu_admin(id) } case ACTION_MODE_PLAGUE: // Plague Mode command { if (userflags & g_access_flag[ACCESS_MODE_PLAGUE]) { if (allowed_plague()) command_plague(id) else zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT") } else zp_colored_print(id, "^x04[ZP]^x01 %L", id, "CMD_NOT_ACCESS")
show_menu_admin(id) } }
return PLUGIN_HANDLED; }
// Player List Menu public menu_player_list(id, menuid, item) { // Player disconnected? if (!is_user_connected(id)) { menu_destroy(menuid) return PLUGIN_HANDLED; }
// zp_toggle [1/0] public cmd_toggle(id, level, cid) { // Check for access flag - Enable/Disable Mod if (!cmd_access(id, g_access_flag[ACCESS_ENABLE_MOD], cid, 2)) return PLUGIN_HANDLED;
// Retrieve arguments new arg[2] read_argv(1, arg, charsmax(arg))
// Mod already enabled/disabled if (str_to_num(arg) == g_pluginenabled) return PLUGIN_HANDLED;
// Retrieve map name new mapname[32] get_mapname(mapname, charsmax(mapname))
// Restart current map server_cmd("changelevel %s", mapname)
return PLUGIN_HANDLED; }
// zp_zombie [target] public cmd_zombie(id, level, cid) { // Check for access flag depending on the resulting action if (g_newround) { // Start Mode Infection if (!cmd_access(id, g_access_flag[ACCESS_MODE_INFECTION], cid, 2)) return PLUGIN_HANDLED; } else { // Make Zombie if (!cmd_access(id, g_access_flag[ACCESS_MAKE_ZOMBIE], cid, 2)) return PLUGIN_HANDLED; }
// Retrieve arguments static arg[32], player read_argv(1, arg, charsmax(arg)) player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
// Invalid target if (!player) return PLUGIN_HANDLED;
// Target not allowed to be zombie if (!allowed_zombie(player)) { client_print(id, print_console, "[ZP] %L", id, "CMD_NOT") return PLUGIN_HANDLED }
command_zombie(id, player)
return PLUGIN_HANDLED; }
// zp_human [target] public cmd_human(id, level, cid) { // Check for access flag - Make Human if (!cmd_access(id, g_access_flag[ACCESS_MAKE_HUMAN], cid, 2)) return PLUGIN_HANDLED;
// Retrieve arguments static arg[32], player read_argv(1, arg, charsmax(arg)) player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
// Invalid target if (!player) return PLUGIN_HANDLED;
// Target not allowed to be human if (!allowed_human(player)) { client_print(id, print_console, "[ZP] %L", id, "CMD_NOT") return PLUGIN_HANDLED; }
command_human(id, player)
return PLUGIN_HANDLED; }
// zp_survivor [target] public cmd_survivor(id, level, cid) { // Check for access flag depending on the resulting action if (g_newround) { // Start Mode Survivor if (!cmd_access(id, g_access_flag[ACCESS_MODE_SURVIVOR], cid, 2)) return PLUGIN_HANDLED; } else { // Make Survivor if (!cmd_access(id, g_access_flag[ACCESS_MAKE_SURVIVOR], cid, 2)) return PLUGIN_HANDLED; }
// Retrieve arguments static arg[32], player read_argv(1, arg, charsmax(arg)) player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
// Invalid target if (!player) return PLUGIN_HANDLED;
// Target not allowed to be survivor if (!allowed_survivor(player)) { client_print(id, print_console, "[ZP] %L", id, "CMD_NOT") return PLUGIN_HANDLED; }
command_survivor(id, player)
return PLUGIN_HANDLED; }
// zp_nemesis [target] public cmd_nemesis(id, level, cid) { // Check for access flag depending on the resulting action if (g_newround) { // Start Mode Nemesis if (!cmd_access(id, g_access_flag[ACCESS_MODE_NEMESIS], cid, 2)) return PLUGIN_HANDLED; } else { // Make Nemesis if (!cmd_access(id, g_access_flag[ACCESS_MAKE_NEMESIS], cid, 2)) return PLUGIN_HANDLED; }
// Retrieve arguments static arg[32], player read_argv(1, arg, charsmax(arg)) player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
// Invalid target if (!player) return PLUGIN_HANDLED;
// Target not allowed to be nemesis if (!allowed_nemesis(player)) { client_print(id, print_console, "[ZP] %L", id, "CMD_NOT") return PLUGIN_HANDLED; }
command_nemesis(id, player)
return PLUGIN_HANDLED; }
// zp_respawn [target] public cmd_respawn(id, level, cid) { // Check for access flag - Respawn if (!cmd_access(id, g_access_flag[ACCESS_RESPAWN_PLAYERS], cid, 2)) return PLUGIN_HANDLED;
// Retrieve arguments static arg[32], player read_argv(1, arg, charsmax(arg)) player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
// Invalid target if (!player) return PLUGIN_HANDLED;
// Target not allowed to be respawned if (!allowed_respawn(player)) { client_print(id, print_console, "[ZP] %L", id, "CMD_NOT") return PLUGIN_HANDLED; }
command_respawn(id, player)
return PLUGIN_HANDLED; }
// zp_swarm public cmd_swarm(id, level, cid) { // Check for access flag - Mode Swarm if (!cmd_access(id, g_access_flag[ACCESS_MODE_SWARM], cid, 1)) return PLUGIN_HANDLED;
// Swarm mode not allowed if (!allowed_swarm()) { client_print(id, print_console, "[ZP] %L", id, "CMD_NOT") return PLUGIN_HANDLED; }
command_swarm(id)
return PLUGIN_HANDLED; }
// zp_multi public cmd_multi(id, level, cid) { // Check for access flag - Mode Multi if (!cmd_access(id, g_access_flag[ACCESS_MODE_MULTI], cid, 1)) return PLUGIN_HANDLED;
// Multi infection mode not allowed if (!allowed_multi()) { client_print(id, print_console, "[ZP] %L", id, "CMD_NOT") return PLUGIN_HANDLED; }
command_multi(id)
return PLUGIN_HANDLED; }
// zp_plague public cmd_plague(id, level, cid) { // Check for access flag - Mode Plague if (!cmd_access(id, g_access_flag[ACCESS_MODE_PLAGUE], cid, 1)) return PLUGIN_HANDLED;
// Plague mode not allowed if (!allowed_plague()) { client_print(id, print_console, "[ZP] %L", id, "CMD_NOT") return PLUGIN_HANDLED; }
// Current Weapon info public message_cur_weapon(msg_id, msg_dest, msg_entity) { // Not alive or zombie if (!g_isalive[msg_entity] || g_zombie[msg_entity]) return;
// Not an active weapon if (get_msg_arg_int(1) != 1) return;
// Unlimited clip disabled for class if (g_survivor[msg_entity] ? get_pcvar_num(cvar_survinfammo) <= 1 : get_pcvar_num(cvar_infammo) <= 1) return;
// Get weapon's id static weapon weapon = get_msg_arg_int(2)
// Unlimited Clip Ammo for this weapon? if (MAXBPAMMO[weapon] > 2) { // Max out clip ammo static weapon_ent weapon_ent = fm_cs_get_current_weapon_ent(msg_entity) if (pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent, MAXCLIP[weapon])
// HUD should show full clip all the time set_msg_arg_int(3, get_msg_argtype(3), MAXCLIP[weapon]) } }
// Take off player's money public message_money(msg_id, msg_dest, msg_entity) { // Remove money setting enabled? if (!get_pcvar_num(cvar_removemoney)) return PLUGIN_CONTINUE;
// Fix for the HL engine bug when HP is multiples of 256 public message_health(msg_id, msg_dest, msg_entity) { // Get player's health static health health = get_msg_arg_int(1)
// Don't bother if (health < 256) return;
// Check if we need to fix it if (health % 256 == 0) fm_set_user_health(msg_entity, pev(msg_entity, pev_health) + 1)
// HUD can only show as much as 255 hp set_msg_arg_int(1, get_msg_argtype(1), 255) }
// Block flashlight battery messages if custom flashlight is enabled instead public message_flashbat() { if (g_cached_customflash) return PLUGIN_HANDLED;
return PLUGIN_CONTINUE; }
// Flashbangs should only affect zombies public message_screenfade(msg_id, msg_dest, msg_entity) { if (get_msg_arg_int(4) != 255 || get_msg_arg_int(5) != 255 || get_msg_arg_int(6) != 255 || get_msg_arg_int(7) < 200) return PLUGIN_CONTINUE;
// Nemesis shouldn't be FBed if (g_zombie[msg_entity] && !g_nemesis[msg_entity]) { // Set flash color to nighvision's set_msg_arg_int(4, get_msg_argtype(4), get_pcvar_num(cvar_nvgcolor[0])) set_msg_arg_int(5, get_msg_argtype(5), get_pcvar_num(cvar_nvgcolor[1])) set_msg_arg_int(6, get_msg_argtype(6), get_pcvar_num(cvar_nvgcolor[2])) return PLUGIN_CONTINUE; }
return PLUGIN_HANDLED; }
// Prevent spectators' nightvision from being turned off when switching targets, etc. public message_nvgtoggle() { return PLUGIN_HANDLED; }
// Set correct model on player corpses public message_clcorpse() { set_msg_arg_string(1, g_playermodel[get_msg_arg_int(12)]) }
// Prevent zombies from seeing any weapon pickup icon public message_weappickup(msg_id, msg_dest, msg_entity) { if (g_zombie[msg_entity]) return PLUGIN_HANDLED;
return PLUGIN_CONTINUE; }
// Prevent zombies from seeing any ammo pickup icon public message_ammopickup(msg_id, msg_dest, msg_entity) { if (g_zombie[msg_entity]) return PLUGIN_HANDLED;
return PLUGIN_CONTINUE; }
// Block hostage HUD display public message_scenario() { if (get_msg_args() > 1) { static sprite[8] get_msg_arg_string(2, sprite, charsmax(sprite))
if (equal(sprite, "hostage")) return PLUGIN_HANDLED; }
return PLUGIN_CONTINUE; }
// Block hostages from appearing on radar public message_hostagepos() { return PLUGIN_HANDLED; }
// Block some text messages public message_textmsg() { static textmsg[22] get_msg_arg_string(2, textmsg, charsmax(textmsg))
// Game restarting, reset scores and call round end to balance the teams if (equal(textmsg, "#Game_will_restart_in")) { logevent_round_end() g_scorehumans = 0 g_scorezombies = 0 } // Game commencing, reset scores only (round end is automatically triggered) else if (equal(textmsg, "#Game_Commencing")) { g_gamecommencing = true g_scorehumans = 0 g_scorezombies = 0 } // Block round end related messages else if (equal(textmsg, "#Hostages_Not_Rescued") || equal(textmsg, "#Round_Draw") || equal(textmsg, "#Terrorists_Win") || equal(textmsg, "#CTs_Win")) { return PLUGIN_HANDLED; }
return PLUGIN_CONTINUE; }
// Block CS round win audio messages, since we're playing our own instead public message_sendaudio() { static audio[17] get_msg_arg_string(2, audio, charsmax(audio))
// Send actual team scores (T = zombies // CT = humans) public message_teamscore() { static team[2] get_msg_arg_string(1, team, charsmax(team))
switch (team[0]) { // CT case 'C': set_msg_arg_int(2, get_msg_argtype(2), g_scorehumans) // Terrorist case 'T': set_msg_arg_int(2, get_msg_argtype(2), g_scorezombies) } }
// Team Switch (or player joining a team for first time) public message_teaminfo(msg_id, msg_dest) { // Only hook global messages if (msg_dest != MSG_ALL && msg_dest != MSG_BROADCAST) return;
// Don't pick up our own TeamInfo messages for this player (bugfix) if (g_switchingteam) return;
// Get player's id static id id = get_msg_arg_int(1)
// Invalid player id? (bugfix) if (!(1 <= id <= g_maxplayers)) return;
// Enable spectators' nightvision if not spawning right away set_task(0.2, "spec_nvision", id)
// Round didn't start yet, nothing to worry about if (g_newround) return;
// Get his new team static team[2] get_msg_arg_string(2, team, charsmax(team))
// Perform some checks to see if they should join a different team instead switch (team[0]) { case 'C': // CT { if (g_survround && fnGetHumans()) // survivor alive --> switch to T and spawn as zombie { g_respawn_as_zombie[id] = true; remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_T) set_msg_arg_string(2, "TERRORIST") } else if (!fnGetZombies()) // no zombies alive --> switch to T and spawn as zombie { g_respawn_as_zombie[id] = true; remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_T) set_msg_arg_string(2, "TERRORIST") } } case 'T': // Terrorist { if ((g_swarmround || g_survround) && fnGetHumans()) // survivor alive or swarm round w/ humans --> spawn as zombie { g_respawn_as_zombie[id] = true; } else if (fnGetZombies()) // zombies alive --> switch to CT { remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_CT) set_msg_arg_string(2, "CT") } } } }
// Make sure there are alive players on both teams (BUGFIX) if (!fnGetAliveTs()) { // Move random player to T team id = fnGetRandomAlive(random_num(1, iPlayersnum)) remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_T) fm_user_team_update(id) } else if (!fnGetAliveCTs()) { // Move random player to CT team id = fnGetRandomAlive(random_num(1, iPlayersnum)) remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_CT) fm_user_team_update(id) }
// Turn every T into a zombie for (id = 1; id <= g_maxplayers; id++) { // Not alive if (!g_isalive[id]) continue;
// Not a Terrorist if (fm_cs_get_user_team(id) != FM_CS_TEAM_T) continue;
// iMaxZombies is rounded up, in case there aren't enough players iMaxZombies = floatround(iPlayersnum*get_pcvar_float(cvar_multiratio), floatround_ceil) iZombies = 0
// Randomly turn iMaxZombies players into zombies while (iZombies < iMaxZombies) { // Keep looping through all players if (++id > g_maxplayers) id = 1
// Dead or already a zombie if (!g_isalive[id] || g_zombie[id]) continue;
// Random chance if (random_num(0, 1)) { // Turn into a zombie zombieme(id, 0, 0, 1, 0) iZombies++ } }
// Turn the remaining players into humans for (id = 1; id <= g_maxplayers; id++) { // Only those of them who aren't zombies if (!g_isalive[id] || g_zombie[id]) continue;
// Switch to CT if (fm_cs_get_user_team(id) != FM_CS_TEAM_CT) // need to change team? { remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_CT) fm_user_team_update(id) } }
// Play multi infection sound ArrayGetString(sound_multi, random_num(0, ArraySize(sound_multi) - 1), sound, charsmax(sound)) PlaySound(sound);
// iMaxZombies is rounded up, in case there aren't enough players iMaxZombies = floatround((iPlayersnum-(get_pcvar_num(cvar_plaguenemnum)+get_pcvar_num(cvar_plaguesurvnum)))*get_pcvar_ float(cvar_plagueratio), floatround_ceil) iZombies = 0
// Randomly turn iMaxZombies players into zombies while (iZombies < iMaxZombies) { // Keep looping through all players if (++id > g_maxplayers) id = 1
// Dead or already a zombie or survivor if (!g_isalive[id] || g_zombie[id] || g_survivor[id]) continue;
// Random chance if (random_num(0, 1)) { // Turn into a zombie zombieme(id, 0, 0, 1, 0) iZombies++ } }
// Turn the remaining players into humans for (id = 1; id <= g_maxplayers; id++) { // Only those of them who arent zombies or survivor if (!g_isalive[id] || g_zombie[id] || g_survivor[id]) continue;
// Switch to CT if (fm_cs_get_user_team(id) != FM_CS_TEAM_CT) // need to change team? { remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_CT) fm_user_team_update(id) } }
// Turn player into nemesis zombieme(id, 0, 1, 0, 0) } else { // Single Infection Mode g_lastmode = MODE_INFECTION
// Turn player into the first zombie zombieme(id, 0, 0, 0, 0) }
// Remaining players should be humans (CTs) for (id = 1; id <= g_maxplayers; id++) { // Not alive if (!g_isalive[id]) continue;
// First zombie/nemesis if (g_zombie[id]) continue;
// Switch to CT if (fm_cs_get_user_team(id) != FM_CS_TEAM_CT) // need to change team? { remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_CT) fm_user_team_update(id) } }
if (g_nemround) { // Play Nemesis sound ArrayGetString(sound_nemesis, random_num(0, ArraySize(sound_nemesis) - 1), sound, charsmax(sound)) PlaySound(sound);
// Zombie Me Function (player id, infector, turn into a nemesis, silent mode, deathmsg and rewards) zombieme(id, infector, nemesis, silentmode, rewards) { // User infect attempt forward ExecuteForward(g_fwUserInfect_attempt, g_fwDummyResult, id, infector, nemesis)
// One or more plugins blocked the infection. Only allow this after making sure it's // not going to leave us with no zombies. Take into account a last player leaving case. // BUGFIX: only allow after a mode has started, to prevent blocking first zombie e.g. if (g_fwDummyResult >= ZP_PLUGIN_HANDLED && g_modestarted && fnGetZombies() > g_lastplayerleaving) return;
// Pre user infect forward ExecuteForward(g_fwUserInfected_pre, g_fwDummyResult, id, infector, nemesis)
// Show zombie class menu if they haven't chosen any (e.g. just connected) if (g_zombieclassnext[id] == ZCLASS_NONE && get_pcvar_num(cvar_zclasses)) set_task(0.2, "show_menu_zclass", id)
// Set selected zombie class g_zombieclass[id] = g_zombieclassnext[id] // If no class selected yet, use the first (default) one if (g_zombieclass[id] == ZCLASS_NONE) g_zombieclass[id] = 0
// Show deathmsg and reward infector? if (rewards && infector) { // Send death notice and fix the "dead" attrib on scoreboard SendDeathMsg(infector, id) FixDeadAttrib(id)
// Cache speed, knockback, and name for player's class g_zombie_spd[id] = float(ArrayGetCell(g_zclass_spd, g_zombieclass[id])) g_zombie_knockback[id] = Float:ArrayGetCell(g_zclass_kb, g_zombieclass[id]) ArrayGetString(g_zclass_name, g_zombieclass[id], g_zombie_classname[id], charsmax(g_zombie_classname[]))
// Set zombie attributes based on the mode static sound[64] if (!silentmode) { if (nemesis) { // Nemesis g_nemesis[id] = true
// Set health [0 = auto] if (get_pcvar_num(cvar_nemhp) == 0) { if (get_pcvar_num(cvar_nembasehp) == 0) fm_set_user_health(id, ArrayGetCell(g_zclass_hp, 0) * fnGetAlive()) else fm_set_user_health(id, get_pcvar_num(cvar_nembasehp) * fnGetAlive()) } else fm_set_user_health(id, get_pcvar_num(cvar_nemhp))
// Set gravity, if frozen set the restore gravity value instead if (!g_frozen[id]) set_pev(id, pev_gravity, get_pcvar_float(cvar_nemgravity)) else g_frozen_gravity[id] = get_pcvar_float(cvar_nemgravity)
// Set nemesis maxspeed ExecuteHamB(Ham_Player_ResetMaxSpeed, id) } else if (fnGetZombies() == 1) { // First zombie g_firstzombie[id] = true
// Set health fm_set_user_health(id, floatround(float(ArrayGetCell(g_zclass_hp, g_zombieclass[id])) * get_pcvar_float(cvar_zombiefirsthp)))
// Set gravity, if frozen set the restore gravity value instead if (!g_frozen[id]) set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])) else g_frozen_gravity[id] = Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])
// Set zombie maxspeed ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
// Infection sound static pointers[10], end ArrayGetArray(pointer_class_sound_infect, g_zombieclass[id], pointers)
for (new i; i < 10; i++) { if (pointers[i] != -1) end = i }
// Set health fm_set_user_health(id, ArrayGetCell(g_zclass_hp, g_zombieclass[id]))
// Set gravity, if frozen set the restore gravity value instead if (!g_frozen[id]) set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])) else g_frozen_gravity[id] = Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])
// Set zombie maxspeed ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
// Infection sound static pointers[10], end ArrayGetArray(pointer_class_sound_infect, g_zombieclass[id], pointers)
for (new i; i < 10; i++) { if (pointers[i] != -1) end = i }
if (infector) // infected by someone? show_dhudmessage(0, "%L", LANG_PLAYER, "NOTICE_INFECT2", g_playername[id], g_playername[infector]) else show_dhudmessage(0, "%L", LANG_PLAYER, "NOTICE_INFECT", g_playername[id]) } } else { // Silent mode, no HUD messages, no infection sounds
// Set health fm_set_user_health(id, ArrayGetCell(g_zclass_hp, g_zombieclass[id]))
// Set gravity, if frozen set the restore gravity value instead if (!g_frozen[id]) set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])) else g_frozen_gravity[id] = Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])
// Set zombie maxspeed ExecuteHamB(Ham_Player_ResetMaxSpeed, id) }
// Switch to T if (fm_cs_get_user_team(id) != FM_CS_TEAM_T) // need to change team? { remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_T) fm_user_team_update(id) }
if (g_handle_models_on_separate_ent) { // Set the right model if (g_nemesis[id]) { iRand = random_num(0, ArraySize(model_nemesis) - 1) ArrayGetString(model_nemesis, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_nemesis, iRand)) } else { if (get_pcvar_num(cvar_adminmodelszombie) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS])) { iRand = random_num(0, ArraySize(model_admin_zombie) - 1) ArrayGetString(model_admin_zombie, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_zombie, iRand)) } else { iRand = random_num(ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]), ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]) - 1) ArrayGetString(g_zclass_playermodel, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_zclass_modelindex, iRand)) } }
// Set model on player model entity fm_set_playermodel_ent(id)
// Nemesis glow / remove glow on player model entity, unless frozen if (!g_frozen[id]) { if (g_nemesis[id] && get_pcvar_num(cvar_nemglow)) fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25) else fm_set_rendering(g_ent_playermodel[id]) } } else { // Get current model for comparing it with the current one fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
// Set the right model, after checking that we don't already have it if (g_nemesis[id]) { size = ArraySize(model_nemesis) for (i = 0; i < size; i++) { ArrayGetString(model_nemesis, i, tempmodel, charsmax(tempmodel)) if (equal(currentmodel, tempmodel)) already_has_model = true }
if (!already_has_model) { iRand = random_num(0, size - 1) ArrayGetString(model_nemesis, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_nemesis, iRand)) } } else { if (get_pcvar_num(cvar_adminmodelszombie) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS])) { size = ArraySize(model_admin_zombie) for (i = 0; i < size; i++) { ArrayGetString(model_admin_zombie, i, tempmodel, charsmax(tempmodel)) if (equal(currentmodel, tempmodel)) already_has_model = true }
if (!already_has_model) { iRand = random_num(0, size - 1) ArrayGetString(model_admin_zombie, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_zombie, iRand)) } } else { for (i = ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]); i < ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]); i++) { ArrayGetString(g_zclass_playermodel, i, tempmodel, charsmax(tempmodel)) if (equal(currentmodel, tempmodel)) already_has_model = true }
// Need to change the model? if (!already_has_model) { // An additional delay is offset at round start // since SVC_BAD is more likely to be triggered there if (g_newround) set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL) else fm_user_model_update(id+TASK_MODEL) }
// Remove CS nightvision if player owns one (bugfix) if (cs_get_user_nvg(id)) { cs_set_user_nvg(id, 0) if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION) else if (g_nvisionenabled[id]) set_user_gnvision(id, 0) }
// Give Zombies Night Vision? if (get_pcvar_num(cvar_nvggive)) { g_nvision[id] = true
if (!g_isbot[id]) { // Turn on Night Vision automatically? if (get_pcvar_num(cvar_nvggive) == 1) { g_nvisionenabled[id] = true
// Custom nvg? if (get_pcvar_num(cvar_customnvg)) { remove_task(id+TASK_NVISION) set_task(0.1, "set_user_nvision", id+TASK_NVISION, _, _, "b") } else set_user_gnvision(id, 1) } // Turn off nightvision when infected (bugfix) else if (g_nvisionenabled[id]) { if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION) else set_user_gnvision(id, 0) g_nvisionenabled[id] = false } } else cs_set_user_nvg(id, 1); // turn on NVG for bots } // Disable nightvision when infected (bugfix) else if (g_nvision[id]) { if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION) else if (g_nvisionenabled[id]) set_user_gnvision(id, 0) g_nvision[id] = false g_nvisionenabled[id] = false }
// Turn off zombie's flashlight turn_off_flashlight(id)
// Post user infect forward ExecuteForward(g_fwUserInfected_post, g_fwDummyResult, id, infector, nemesis)
// Last Zombie Check fnCheckLastZombie() }
// Function Human Me (player id, turn into a survivor, silent mode) humanme(id, survivor, silentmode) { // User humanize attempt forward ExecuteForward(g_fwUserHumanize_attempt, g_fwDummyResult, id, survivor)
// One or more plugins blocked the "humanization". Only allow this after making sure it's // not going to leave us with no humans. Take into account a last player leaving case. // BUGFIX: only allow after a mode has started, to prevent blocking first survivor e.g. if (g_fwDummyResult >= ZP_PLUGIN_HANDLED && g_modestarted && fnGetHumans() > g_lastplayerleaving) return;
// Pre user humanize forward ExecuteForward(g_fwUserHumanized_pre, g_fwDummyResult, id, survivor)
// Remove CS nightvision if player owns one (bugfix) if (cs_get_user_nvg(id)) { cs_set_user_nvg(id, 0) if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION) else if (g_nvisionenabled[id]) set_user_gnvision(id, 0) }
// 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")
// Set human attributes based on the mode if (survivor) { // Survivor g_survivor[id] = true
// Set Health [0 = auto] if (get_pcvar_num(cvar_survhp) == 0) { if (get_pcvar_num(cvar_survbasehp) == 0) fm_set_user_health(id, get_pcvar_num(cvar_humanhp) * fnGetAlive()) else fm_set_user_health(id, get_pcvar_num(cvar_survbasehp) * fnGetAlive()) } else fm_set_user_health(id, get_pcvar_num(cvar_survhp))
// Set gravity, if frozen set the restore gravity value instead if (!g_frozen[id]) set_pev(id, pev_gravity, get_pcvar_float(cvar_survgravity)) else g_frozen_gravity[id] = get_pcvar_float(cvar_survgravity)
// Set survivor maxspeed ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
// Give survivor his own weapon static survweapon[32] get_pcvar_string(cvar_survweapon, survweapon, charsmax(survweapon)) fm_give_item(id, survweapon) ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[cs_weapon_name_to_id(survweapon)], AMMOTYPE[cs_weapon_name_to_id(survweapon)], MAXBPAMMO[cs_weapon_name_to_id(survweapon)])
// Turn off his flashlight turn_off_flashlight(id)
// Give the survivor a bright light if (get_pcvar_num(cvar_survaura)) set_pev(id, pev_effects, pev(id, pev_effects) | EF_BRIGHTLIGHT)
// Survivor bots will also need nightvision to see in the dark if (g_isbot[id]) { g_nvision[id] = true cs_set_user_nvg(id, 1) } } else { // Human taking an antidote
// Set health fm_set_user_health(id, get_pcvar_num(cvar_humanhp))
// Set gravity, if frozen set the restore gravity value instead if (!g_frozen[id]) set_pev(id, pev_gravity, get_pcvar_float(cvar_humangravity)) else g_frozen_gravity[id] = get_pcvar_float(cvar_humangravity)
// Set human maxspeed ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
// Show custom buy menu? if (get_pcvar_num(cvar_buycustom)) set_task(0.2, "show_menu_buy1", id+TASK_SPAWN)
// Switch to CT if (fm_cs_get_user_team(id) != FM_CS_TEAM_CT) // need to change team? { remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_CT) fm_user_team_update(id) }
if (g_handle_models_on_separate_ent) { // Set the right model if (g_survivor[id]) { iRand = random_num(0, ArraySize(model_survivor) - 1) ArrayGetString(model_survivor, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_survivor, iRand)) } else { if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS])) { iRand = random_num(0, ArraySize(model_admin_human) - 1) ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_human, iRand)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 0 : 3)) } else if (get_user_flags(id) & VIP_MODEL_HUMAN) { iRand = random_num(0, ArraySize(model_vip_human) - 1) ArrayGetString(model_vip_human, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_vip_human, iRand)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 4 : 3)) } else if (get_user_flags(id) & BOSS_MODEL_HUMAN) { iRand = random_num(0, ArraySize(model_boss_human) - 1) ArrayGetString(model_boss_human, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_boss_human, iRand)) } else { iRand = random_num(0, ArraySize(model_human) - 1) ArrayGetString(model_human, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_human, iRand)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? random_num(1, 2) : 3)) } }
// Set model on player model entity fm_set_playermodel_ent(id)
// Set survivor glow / remove glow on player model entity, unless frozen if (!g_frozen[id]) { if (g_survivor[id] && get_pcvar_num(cvar_survglow)) fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25) else fm_set_rendering(g_ent_playermodel[id]) } } else { // Get current model for comparing it with the current one fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
// Set the right model, after checking that we don't already have it if (g_survivor[id]) { size = ArraySize(model_survivor) for (i = 0; i < size; i++) { ArrayGetString(model_survivor, i, tempmodel, charsmax(tempmodel)) if (equal(currentmodel, tempmodel)) already_has_model = true }
if (!already_has_model) { iRand = random_num(0, size - 1) ArrayGetString(model_survivor, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_survivor, iRand)) } } else { if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS])) { size = ArraySize(model_admin_human) for (i = 0; i < size; i++) { ArrayGetString(model_admin_human, i, tempmodel, charsmax(tempmodel)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 0 : 3)) if (equal(currentmodel, tempmodel)) already_has_model = true }
if (!already_has_model) { iRand = random_num(0, size - 1) ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_human, iRand)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 0 : 3)) } } else if (get_user_flags(id) & VIP_MODEL_HUMAN) { size = ArraySize(model_vip_human) for (i = 0; i < size; i++) { ArrayGetString(model_vip_human, i, tempmodel, charsmax(tempmodel)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 4 : 3)) if (equal(currentmodel, tempmodel)) already_has_model = true }
if (!already_has_model) { iRand = random_num(0, size - 1) ArrayGetString(model_vip_human, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_vip_human, iRand)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 4 : 3)) } } else if (get_user_flags(id) & BOSS_MODEL_HUMAN) { size = ArraySize(model_boss_human) for (i = 0; i < size; i++) { ArrayGetString(model_boss_human, i, tempmodel, charsmax(tempmodel)) if (equal(currentmodel, tempmodel)) already_has_model = true }
if (!already_has_model) { iRand = random_num(0, size - 1) ArrayGetString(model_boss_human, iRand, g_playermodel[id], charsmax(g_playermodel[])) if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_boss_human, iRand)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? 4 : 3)) } } else { size = ArraySize(model_human) for (i = 0; i < size; i++) { ArrayGetString(model_human, i, tempmodel, charsmax(tempmodel)) // set_pev(id, pev_body, (!g_has_chainsaw[id] ? random_num(1, 2) : 3)) if (equal(currentmodel, tempmodel)) already_has_model = true }
// Need to change the model? if (!already_has_model) { // An additional delay is offset at round start // since SVC_BAD is more likely to be triggered there if (g_newround) set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL) else fm_user_model_update(id+TASK_MODEL) }
// Set survivor glow / remove glow, unless frozen if (!g_frozen[id]) { if (g_survivor[id] && get_pcvar_num(cvar_survglow)) fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25) else fm_set_rendering(id) } }
// Parse if present if (file_exists(path)) { // Open zombie classes file for reading file = fopen(path, "rt")
while (file && !feof(file)) { static pos, temparr[64] // Read one line at a time fgets(file, linedata, charsmax(linedata))
// Replace newlines with a null character to prevent headaches replace(linedata, charsmax(linedata), "^n", "")
// Blank line or comment if (!linedata[0] || linedata[0] == ';') continue;
// New class starting if (linedata[0] == '[') { // Remove first and last characters (braces) linedata[strlen(linedata) - 1] = 0 copy(linedata, charsmax(linedata), linedata[1])
// Store its real name for future reference ArrayPushString(g_zclass2_realname, linedata) continue; }
// Get key and value(s) strtok(linedata, key, charsmax(key), value, charsmax(value), '=')
// Trim spaces trim(key) trim(value)
if (equal(key, "NAME")) ArrayPushString(g_zclass2_name, value) else if (equal(key, "INFO")) ArrayPushString(g_zclass2_info, value) else if (equal(key, "MODELS")) { // Set models start index ArrayPushCell(g_zclass2_modelsstart, ArraySize(g_zclass2_playermodel))
// Parse class models while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ',')) { // Trim spaces trim(key) trim(value)
// Add to class models array ArrayPushString(g_zclass2_playermodel, key) ArrayPushCell(g_zclass2_modelindex, -1) }
// Set models end index ArrayPushCell(g_zclass2_modelsend, ArraySize(g_zclass2_playermodel)) } else if (equal(key, "CLAWMODEL")) ArrayPushString(g_zclass2_clawmodel, value) else if (equal(key, "BOMBMODEL")) ArrayPushString(g_zclass2_bombmodel, value) else if (equal(key, "HEALTH")) ArrayPushCell(g_zclass2_hp, str_to_num(value)) else if (equal(key, "SPEED")) ArrayPushCell(g_zclass2_spd, str_to_num(value)) else if (equal(key, "GRAVITY")) ArrayPushCell(g_zclass2_grav, str_to_float(value)) else if (equal(key, "KNOCKBACK")) ArrayPushCell(g_zclass2_kb, str_to_float(value)) else if (equal(key, "INFECT")) { pos = 0 arrayset(temparr, -1, sizeof(temparr)) while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ',')) { // Trim spaces trim(key) trim(value)
// Parse if present if (file_exists(path)) { // Open extra items file for reading file = fopen(path, "rt")
while (file && !feof(file)) { // Read one line at a time fgets(file, linedata, charsmax(linedata))
// Replace newlines with a null character to prevent headaches replace(linedata, charsmax(linedata), "^n", "")
// Blank line or comment if (!linedata[0] || linedata[0] == ';') continue;
// New item starting if (linedata[0] == '[') { // Remove first and last characters (braces) linedata[strlen(linedata) - 1] = 0 copy(linedata, charsmax(linedata), linedata[1])
// Store its real name for future reference ArrayPushString(g_extraitem2_realname, linedata) continue; }
// Get key and value(s) strtok(linedata, key, charsmax(key), value, charsmax(value), '=')
// Trim spaces trim(key) trim(value)
if (equal(key, "NAME")) ArrayPushString(g_extraitem2_name, value) else if (equal(key, "COST")) ArrayPushCell(g_extraitem2_cost, str_to_num(value)) else if (equal(key, "TEAMS")) { // Clear teams bitsum teams = 0
// Parse teams while (value[0] != 0 && strtok(value, key, charsmax(key), value, charsmax(value), ',')) { // Trim spaces trim(key) trim(value)
if (equal(key, ZP_TEAM_NAMES[ZP_TEAM_ZOMBIE])) teams |= ZP_TEAM_ZOMBIE else if (equal(key, ZP_TEAM_NAMES[ZP_TEAM_HUMAN])) teams |= ZP_TEAM_HUMAN else if (equal(key, ZP_TEAM_NAMES[ZP_TEAM_NEMESIS])) teams |= ZP_TEAM_NEMESIS else if (equal(key, ZP_TEAM_NAMES[ZP_TEAM_SURVIVOR])) teams |= ZP_TEAM_SURVIVOR }
// Add to teams array ArrayPushCell(g_extraitem2_team, teams) } } if (file) fclose(file) } }
// Open zombie classes file for appending data new file = fopen(path, "at"), size = ArraySize(g_zclass_name)
// Add any new zombie classes data at the end if needed for (i = 0; i < size; i++) { if (ArrayGetCell(g_zclass_new, i)) { // Add real name ArrayGetString(g_zclass_name, i, buffer, charsmax(buffer)) format(buffer, charsmax(buffer), "^n[%s]", buffer) fputs(file, buffer)
// Open extra items file for appending data file = fopen(path, "at") size = ArraySize(g_extraitem_name)
// Add any new extra items data at the end if needed for (i = EXTRAS_CUSTOM_STARTID; i < size; i++) { if (ArrayGetCell(g_extraitem_new, i)) { // Add real name ArrayGetString(g_extraitem_name, i, buffer, charsmax(buffer)) format(buffer, charsmax(buffer), "^n[%s]", buffer) fputs(file, buffer)
// Register Ham Forwards for CZ bots public register_ham_czbots(id) { // Make sure it's a CZ bot and it's still connected if (g_hamczbots || !g_isconnected[id] || !get_pcvar_num(cvar_botquota)) return;
// Ham forwards for CZ bots succesfully registered g_hamczbots = true
// If the bot has already spawned, call the forward manually for him if (is_user_alive(id)) fw_PlayerSpawn_Post(id) }
// Disable minmodels task public disable_minmodels(id) { if (!g_isconnected[id]) return; client_cmd(id, "cl_minmodels 0") }
// Bots automatically buy extra items public bot_buy_extras(taskid) { // Nemesis or Survivor bots have nothing to buy by default if (!g_isalive[ID_SPAWN] || g_survivor[ID_SPAWN] || g_nemesis[ID_SPAWN]) return;
if (!g_zombie[ID_SPAWN]) // human bots { // Attempt to buy Night Vision buy_extra_item(ID_SPAWN, EXTRA_NVISION)
// Attempt to buy a weapon buy_extra_item(ID_SPAWN, random_num(EXTRA_WEAPONS_STARTID, EXTRAS_CUSTOM_STARTID-1)) } else // zombie bots { // Attempt to buy an Antidote buy_extra_item(ID_SPAWN, EXTRA_ANTIDOTE) } }
// Refill BP Ammo Task public refill_bpammo(const args[], id) { // Player died or turned into a zombie if (!g_isalive[id] || g_zombie[id]) return;
// First, set everyone to CT for (id = 1; id <= g_maxplayers; id++) { // Skip if not connected if (!g_isconnected[id]) continue;
team[id] = fm_cs_get_user_team(id)
// Skip if not playing if (team[id] == FM_CS_TEAM_SPECTATOR || team[id] == FM_CS_TEAM_UNASSIGNED) continue;
// Set team remove_task(id+TASK_TEAM) fm_cs_set_user_team(id, FM_CS_TEAM_CT) team[id] = FM_CS_TEAM_CT }
// Then randomly set half of the players to Terrorists while (iTerrors < iMaxTerrors) { // Keep looping through all players if (++id > g_maxplayers) id = 1
// Skip if not connected if (!g_isconnected[id]) continue;
// Skip if not playing or already a Terrorist if (team[id] != FM_CS_TEAM_CT) continue;
// Random chance if (random_num(0, 1)) { fm_cs_set_user_team(id, FM_CS_TEAM_T) team[id] = FM_CS_TEAM_T iTerrors++ } } }
// Welcome Message Task public welcome_msg() { // Show mod info zp_colored_print(0, "^x01**** ^x04%s^x01 ****", g_modname) zp_colored_print(0, "^x04[ZP]^x01 %L", LANG_PLAYER, "NOTICE_INFO1") if (!get_pcvar_num(cvar_infammo)) zp_colored_print(0, "^x04[ZP]^x01 %L", LANG_PLAYER, "NOTICE_INFO2")
// Respawn Player Task (deathmatch) public respawn_player_task(taskid) { // Already alive or round ended if (g_isalive[ID_SPAWN] || g_endround) return;
// Get player's team static team team = fm_cs_get_user_team(ID_SPAWN)
// Player moved to spectators if (team == FM_CS_TEAM_SPECTATOR || team == FM_CS_TEAM_UNASSIGNED) return;
// Respawn player automatically if allowed on current round if ((!g_survround || get_pcvar_num(cvar_allowrespawnsurv)) && (!g_swarmround || get_pcvar_num(cvar_allowrespawnswarm)) && (!g_nemround || get_pcvar_num(cvar_allowrespawnnem)) && (!g_plagueround || get_pcvar_num(cvar_allowrespawnplague))) { // Infection rounds = none of the above if (!get_pcvar_num(cvar_allowrespawninfection) && !g_survround && !g_nemround && !g_swarmround && !g_plagueround) return;
// Respawn if only the last human is left? (ignore this setting on survivor rounds) if (!g_survround && !get_pcvar_num(cvar_respawnafterlast) && fnGetHumans() <= 1) return;
// Override respawn as zombie setting on nemesis and survivor rounds if (g_survround) g_respawn_as_zombie[ID_SPAWN] = true else if (g_nemround) g_respawn_as_zombie[ID_SPAWN] = false
respawn_player_manually(ID_SPAWN) } }
// Respawn Player Check Task (if killed by worldspawn) public respawn_player_check_task(taskid) { // Successfully spawned or round ended if (g_isalive[ID_SPAWN] || g_endround) return;
// Get player's team static team team = fm_cs_get_user_team(ID_SPAWN)
// Player moved to spectators if (team == FM_CS_TEAM_SPECTATOR || team == FM_CS_TEAM_UNASSIGNED) return;
// If player was being spawned as a zombie, set the flag again if (g_zombie[ID_SPAWN]) g_respawn_as_zombie[ID_SPAWN] = true else g_respawn_as_zombie[ID_SPAWN] = false
respawn_player_manually(ID_SPAWN) }
// Respawn Player Manually (called after respawn checks are done) respawn_player_manually(id) { // Set proper team before respawning, so that the TeamInfo message that's sent doesn't confuse PODBots if (g_respawn_as_zombie[id]) fm_cs_set_user_team(id, FM_CS_TEAM_T) else fm_cs_set_user_team(id, FM_CS_TEAM_CT)
// Respawning a player has never been so easy ExecuteHamB(Ham_CS_RoundRespawn, id) }
// Check Round Task -check that we still have both zombies and humans on a round- check_round(leaving_player) { // Round ended or make_a_zombie task still active if (g_endround || task_exists(TASK_MAKEZOMBIE)) return;
// Get alive players count static iPlayersnum, id iPlayersnum = fnGetAlive()
// Last alive player, don't bother if (iPlayersnum < 2) return;
// Last zombie disconnecting if (g_zombie[leaving_player] && fnGetZombies() == 1) { // Only one CT left, don't bother if (fnGetHumans() == 1 && fnGetCTs() == 1) return;
// Pick a random one to take his place while ((id = fnGetRandomAlive(random_num(1, iPlayersnum))) == leaving_player ) { /* keep looping */ }
// Show last zombie left notice zp_colored_print(0, "^x04[ZP]^x01 %L", LANG_PLAYER, "LAST_ZOMBIE_LEFT", g_playername[id])
// Set player leaving flag g_lastplayerleaving = true
// Turn into a Nemesis or just a zombie? if (g_nemesis[leaving_player]) zombieme(id, 0, 1, 0, 0) else zombieme(id, 0, 0, 0, 0)
// Remove player leaving flag g_lastplayerleaving = false
// If Nemesis, set chosen player's health to that of the one who's leaving if (get_pcvar_num(cvar_keephealthondisconnect) && g_nemesis[leaving_player]) fm_set_user_health(id, pev(leaving_player, pev_health)) }
// Last human disconnecting else if (!g_zombie[leaving_player] && fnGetHumans() == 1) { // Only one T left, don't bother if (fnGetZombies() == 1 && fnGetTs() == 1) return;
// Pick a random one to take his place while ((id = fnGetRandomAlive(random_num(1, iPlayersnum))) == leaving_player ) { /* keep looping */ }
// Show last human left notice zp_colored_print(0, "^x04[ZP]^x01 %L", LANG_PLAYER, "LAST_HUMAN_LEFT", g_playername[id])
// Set player leaving flag g_lastplayerleaving = true
// Turn into a Survivor or just a human? if (g_survivor[leaving_player]) humanme(id, 1, 0) else humanme(id, 0, 0)
// Remove player leaving flag g_lastplayerleaving = false
// If Survivor, set chosen player's health to that of the one who's leaving if (get_pcvar_num(cvar_keephealthondisconnect) && g_survivor[leaving_player]) fm_set_user_health(id, pev(leaving_player, pev_health)) } }
// Lighting Effects Task public lighting_effects() { // Cache some CVAR values at every 5 secs cache_cvars()
// Get lighting style static lighting[2] get_pcvar_string(cvar_lighting, lighting, charsmax(lighting)) strtolower(lighting)
// Lighting disabled? ["0"] if (lighting[0] == '0') return;
// Set thunderclap tasks if not existant if (thunder > 0.0 && !task_exists(TASK_THUNDER_PRE) && !thunderclap_in_progress) { g_lights_i = 0 ArrayGetString(lights_thunder, random_num(0, ArraySize(lights_thunder) - 1), g_lights_cycle, charsmax(g_lights_cycle)) g_lights_cycle_len = strlen(g_lights_cycle) set_task(thunder, "thunderclap", TASK_THUNDER_PRE) }
// Set lighting only when no thunderclaps are going on if (!thunderclap_in_progress) engfunc(EngFunc_LightStyle, 0, lighting) } else { // Remove thunderclap tasks remove_task(TASK_THUNDER_PRE) remove_task(TASK_THUNDER)
// Set lighting engfunc(EngFunc_LightStyle, 0, lighting) } }
// Thunderclap task public thunderclap() { // Play thunder sound if (g_lights_i == 0) { static sound[64] ArrayGetString(sound_thunder, random_num(0, ArraySize(sound_thunder) - 1), sound, charsmax(sound)) PlaySound(sound) }
// Turn Off Flashlight and Restore Batteries turn_off_flashlight(id) { // Restore batteries for the next use fm_cs_set_user_batteries(id, 100)
// Check if flashlight is on if (pev(id, pev_effects) & EF_DIMLIGHT) { // Turn it off set_pev(id, pev_impulse, IMPULSE_FLASHLIGHT) } else { // Clear any stored flashlight impulse (bugfix) set_pev(id, pev_impulse, 0) }
// Turn off custom flashlight if (g_cached_customflash) { // Turn it off g_flashlight[id] = false g_flashbattery[id] = 100
// Get attacker static attacker attacker = pev(ent, pev_owner)
// Infection bomb owner disconnected? (bugfix) if (!is_user_valid_connected(attacker)) { // Get rid of the grenade engfunc(EngFunc_RemoveEntity, ent) return; }
// Collisions static victim victim = -1
while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, NADE_EXPLOSION_RADIUS)) != 0) { // Only effect alive non-spawnprotected humans if (!is_user_valid_alive(victim) || g_zombie[victim] || g_nodamage[victim]) continue;
// Last human is killed if (fnGetHumans() == 1) { ExecuteHamB(Ham_Killed, victim, attacker, 0) continue; }
while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, NADE_EXPLOSION_RADIUS)) != 0) { // Only effect alive zombies if (!is_user_valid_alive(victim) || !g_zombie[victim] || g_nodamage[victim]) continue;
// Heat icon? if (get_pcvar_num(cvar_hudicons)) { message_begin(MSG_ONE_UNRELIABLE, g_msgDamage, _, victim) write_byte(0) // damage save write_byte(0) // damage take write_long(DMG_BURN) // damage type write_coord(0) // x write_coord(0) // y write_coord(0) // z message_end() }
if (g_nemesis[victim]) // fire duration (nemesis is fire resistant) g_burning_duration[victim] += get_pcvar_num(cvar_fireduration) else g_burning_duration[victim] += get_pcvar_num(cvar_fireduration) * 5
// Set burning task on victim if not present if (!task_exists(victim+TASK_BURN)) set_task(0.2, "burning_flame", victim+TASK_BURN, _, _, "b") }
// Get rid of the grenade engfunc(EngFunc_RemoveEntity, ent) }
// Glass shatter message_begin(MSG_PVS, SVC_TEMPENTITY, origin2) write_byte(TE_BREAKMODEL) // TE id write_coord(origin2[0]) // x write_coord(origin2[1]) // y write_coord(origin2[2]+24) // z write_coord(16) // size x write_coord(16) // size y write_coord(16) // size z write_coord(random_num(-50, 50)) // velocity x write_coord(random_num(-50, 50)) // velocity y write_coord(25) // velocity z write_byte(10) // random velocity write_short(g_glassSpr) // model write_byte(10) // count write_byte(25) // life write_byte(BREAK_GLASS) // flags message_end()
continue; }
// Freeze icon? if (get_pcvar_num(cvar_hudicons)) { message_begin(MSG_ONE_UNRELIABLE, g_msgDamage, _, victim) write_byte(0) // damage save write_byte(0) // damage take write_long(DMG_DROWN) // damage type - DMG_FREEZE write_coord(0) // x write_coord(0) // y write_coord(0) // z message_end() }
// Light blue glow while frozen if (g_handle_models_on_separate_ent) fm_set_rendering(g_ent_playermodel[victim], kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 25) else fm_set_rendering(victim, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 25)
// Add a blue tint to their screen message_begin(MSG_ONE, g_msgScreenFade, _, victim) write_short(0) // duration write_short(0) // hold time write_short(FFADE_STAYOUT) // fade type write_byte(0) // red write_byte(50) // green write_byte(200) // blue write_byte(100) // alpha message_end()
// Set the frozen flag g_frozen[victim] = true
// Save player's old gravity (bugfix) pev(victim, pev_gravity, g_frozen_gravity[victim])
// Prevent from jumping if (pev(victim, pev_flags) & FL_ONGROUND) set_pev(victim, pev_gravity, 999999.9) // set really high else set_pev(victim, pev_gravity, 0.000001) // no gravity
// Prevent from moving ExecuteHamB(Ham_Player_ResetMaxSpeed, victim)
// Set a task to remove the freeze set_task(get_pcvar_float(cvar_freezeduration), "remove_freeze", victim) }
// Get rid of the grenade engfunc(EngFunc_RemoveEntity, ent) }
// Remove freeze task public remove_freeze(id) { // Not alive or not frozen anymore if (!g_isalive[id] || !g_frozen[id]) return;
// Restore rendering if (g_handle_models_on_separate_ent) { // Nemesis or Survivor glow / remove glow on player model entity if (g_nemesis[id] && get_pcvar_num(cvar_nemglow)) fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25) else if (g_survivor[id] && get_pcvar_num(cvar_survglow)) fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25) else fm_set_rendering(g_ent_playermodel[id]) } else { // Nemesis or Survivor glow / remove glow if (g_nemesis[id] && get_pcvar_num(cvar_nemglow)) fm_set_rendering(id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25) else if (g_survivor[id] && get_pcvar_num(cvar_survglow)) fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25) else fm_set_rendering(id) }
// Gradually remove screen's blue tint message_begin(MSG_ONE, g_msgScreenFade, _, id) write_short(UNIT_SECOND) // duration write_short(0) // hold time write_short(FFADE_IN) // fade type write_byte(0) // red write_byte(50) // green write_byte(200) // blue write_byte(100) // alpha message_end()
// Get player's origin static origin2[3] get_user_origin(id, origin2)
// Glass shatter message_begin(MSG_PVS, SVC_TEMPENTITY, origin2) write_byte(TE_BREAKMODEL) // TE id write_coord(origin2[0]) // x write_coord(origin2[1]) // y write_coord(origin2[2]+24) // z write_coord(16) // size x write_coord(16) // size y write_coord(16) // size z write_coord(random_num(-50, 50)) // velocity x write_coord(random_num(-50, 50)) // velocity y write_coord(25) // velocity z write_byte(10) // random velocity write_short(g_glassSpr) // model write_byte(10) // count write_byte(25) // life write_byte(BREAK_GLASS) // flags message_end()
// Remove Stuff Task public remove_stuff() { static ent
// Remove rotating doors if (get_pcvar_num(cvar_removedoors) > 0) { ent = -1; while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "func_door_rotating")) != 0) engfunc(EngFunc_SetOrigin, ent, Float:{8192.0 ,8192.0 ,8192.0}) }
// Remove all doors if (get_pcvar_num(cvar_removedoors) > 1) { ent = -1; while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "func_door")) != 0) engfunc(EngFunc_SetOrigin, ent, Float:{8192.0 ,8192.0 ,8192.0}) }
// Triggered lights if (!get_pcvar_num(cvar_triggered)) { ent = -1 while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "light")) != 0) { dllfunc(DLLFunc_Use, ent, 0); // turn off the light set_pev(ent, pev_targetname, 0) // prevent it from being triggered } } }
// Set spectators nightvision public spec_nvision(id) { // Not connected, alive, or bot if (!g_isconnected[id] || g_isalive[id] || g_isbot[id]) return;
// Give Night Vision? if (get_pcvar_num(cvar_nvggive)) { g_nvision[id] = true
// Turn on Night Vision automatically? if (get_pcvar_num(cvar_nvggive) == 1) { g_nvisionenabled[id] = true
// Spectating someone else? if (id != ID_SHOWHUD) { // Show name, health, class, and ammo packs set_dhudmessage(255, 255, 255, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, false) show_dhudmessage(ID_SHOWHUD, "%L %s^nHP: %d - %L %s", ID_SHOWHUD, "SPECTATING", g_playername[id], pev(id, pev_health), ID_SHOWHUD, "CLASS_CLASS", class) } else { // Show health, class and ammo packs set_dhudmessage(red, blue, green, HUD_STATS_X, -0.04, 0, 6.0, 1.1, 0.0, 0.0, false) show_dhudmessage(ID_SHOWHUD, "%L: %d - %L %s ^nУровень: %d | Опыт: %d/%d", id, "ZOMBIE_ATTRIB1", pev(ID_SHOWHUD, pev_health), ID_SHOWHUD, "CLASS_CLASS", class, zp_get_user_level(ID_SHOWHUD), zp_get_user_exp(ID_SHOWHUD), zp_get_exp_current(ID_SHOWHUD)) } }
// Play idle zombie sounds public zombie_play_idle(taskid) { // Round ended/new one starting if (g_endround || g_newround || !g_zombie[ID_BLOOD]) return;
// Madness Over Task public madness_over(taskid) { g_nodamage[ID_BLOOD] = false }
// Place user at a random spawn do_random_spawn(id, regularspawns = 0) { static hull, sp_index, i
// Get whether the player is crouching hull = (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN
// Use regular spawns? if (!regularspawns) { // No spawns? if (!g_spawnCount) return;
// Choose random spawn to start looping at sp_index = random_num(0, g_spawnCount - 1)
// Try to find a clear spawn for (i = sp_index + 1; /*no condition*/; i++) { // Start over when we reach the end if (i >= g_spawnCount) i = 0
// Free spawn space? if (is_hull_vacant(g_spawns[i], hull)) { // Engfunc_SetOrigin is used so ent's mins and maxs get updated instantly engfunc(EngFunc_SetOrigin, id, g_spawns[i]) break; }
// Loop completed, no free space found if (i == sp_index) break; } } else { // No spawns? if (!g_spawnCount2) return;
// Choose random spawn to start looping at sp_index = random_num(0, g_spawnCount2 - 1)
// Try to find a clear spawn for (i = sp_index + 1; /*no condition*/; i++) { // Start over when we reach the end if (i >= g_spawnCount2) i = 0
// Free spawn space? if (is_hull_vacant(g_spawns2[i], hull)) { // Engfunc_SetOrigin is used so ent's mins and maxs get updated instantly engfunc(EngFunc_SetOrigin, id, g_spawns2[i]) break; }
// Loop completed, no free space found if (i == sp_index) break; } } }
// Get Zombies -returns alive zombies number- fnGetZombies() { static iZombies, id iZombies = 0
for (id = 1; id <= g_maxplayers; id++) { if (g_isalive[id] && g_zombie[id]) iZombies++ }
return iZombies; }
// Get Humans -returns alive humans number- fnGetHumans() { static iHumans, id iHumans = 0
for (id = 1; id <= g_maxplayers; id++) { if (g_isalive[id] && !g_zombie[id]) iHumans++ }
return iHumans; }
// Get Nemesis -returns alive nemesis number- fnGetNemesis() { static iNemesis, id iNemesis = 0
for (id = 1; id <= g_maxplayers; id++) { if (g_isalive[id] && g_nemesis[id]) iNemesis++ }
return iNemesis; }
// Get Survivors -returns alive survivors number- fnGetSurvivors() { static iSurvivors, id iSurvivors = 0
for (id = 1; id <= g_maxplayers; id++) { if (g_isalive[id] && g_survivor[id]) iSurvivors++ }
return iSurvivors; }
// Get Alive -returns alive players number- fnGetAlive() { static iAlive, id iAlive = 0
for (id = 1; id <= g_maxplayers; id++) { if (g_isalive[id]) iAlive++ }
return iAlive; }
// Get Random Alive -returns index of alive player number n - fnGetRandomAlive(n) { static iAlive, id iAlive = 0
for (id = 1; id <= g_maxplayers; id++) { if (g_isalive[id]) iAlive++
if (iAlive == n) return id; }
return -1; }
// Get Playing -returns number of users playing- fnGetPlaying() { static iPlaying, id, team iPlaying = 0
for (id = 1; id <= g_maxplayers; id++) { if (g_isconnected[id]) { team = fm_cs_get_user_team(id)
if (team != FM_CS_TEAM_SPECTATOR && team != FM_CS_TEAM_UNASSIGNED) iPlaying++ } }
return iPlaying; }
// Get CTs -returns number of CTs connected- fnGetCTs() { static iCTs, id iCTs = 0
for (id = 1; id <= g_maxplayers; id++) { if (g_isconnected[id]) { if (fm_cs_get_user_team(id) == FM_CS_TEAM_CT) iCTs++ } }
return iCTs; }
// Get Ts -returns number of Ts connected- fnGetTs() { static iTs, id iTs = 0
for (id = 1; id <= g_maxplayers; id++) { if (g_isconnected[id]) { if (fm_cs_get_user_team(id) == FM_CS_TEAM_T) iTs++ } }
return iTs; }
// Get Alive CTs -returns number of CTs alive- fnGetAliveCTs() { static iCTs, id iCTs = 0
for (id = 1; id <= g_maxplayers; id++) { if (g_isalive[id]) { if (fm_cs_get_user_team(id) == FM_CS_TEAM_CT) iCTs++ } }
return iCTs; }
// Get Alive Ts -returns number of Ts alive- fnGetAliveTs() { static iTs, id iTs = 0
for (id = 1; id <= g_maxplayers; id++) { if (g_isalive[id]) { if (fm_cs_get_user_team(id) == FM_CS_TEAM_T) iTs++ } }
return iTs; }
// Last Zombie Check -check for last zombie and set its flag- fnCheckLastZombie() { static id for (id = 1; id <= g_maxplayers; id++) { // Last zombie if (g_isalive[id] && g_zombie[id] && !g_nemesis[id] && fnGetZombies() == 1) { if (!g_lastzombie[id]) { // Last zombie forward ExecuteForward(g_fwUserLastZombie, g_fwDummyResult, id); } g_lastzombie[id] = true } else g_lastzombie[id] = false
// Last human if (g_isalive[id] && !g_zombie[id] && !g_survivor[id] && fnGetHumans() == 1) { if (!g_lasthuman[id]) { // Last human forward ExecuteForward(g_fwUserLastHuman, g_fwDummyResult, id);
// Reward extra hp fm_set_user_health(id, pev(id, pev_health) + get_pcvar_num(cvar_humanlasthp)) } g_lasthuman[id] = true } else g_lasthuman[id] = false } }
// Save player's stats to database save_stats(id) { // Check whether there is another record already in that slot if (db_name[id][0] && !equal(g_playername[id], db_name[id])) { // If DB size is exceeded, write over old records if (db_slot_i >= sizeof db_name) db_slot_i = g_maxplayers+1
// Move previous record onto an additional save slot copy(db_name[db_slot_i], charsmax(db_name[]), db_name[id]) db_ammopacks[db_slot_i] = db_ammopacks[id] db_zombieclass[db_slot_i] = db_zombieclass[id] db_slot_i++ }
// Now save the current player stats copy(db_name[id], charsmax(db_name[]), g_playername[id]) // name db_ammopacks[id] = g_ammopacks[id] // ammo packs db_zombieclass[id] = g_zombieclassnext[id] // zombie class }
// Load player's stats from database (if a record is found) load_stats(id) { // Look for a matching record static i for (i = 0; i < sizeof db_name; i++) { if (equal(g_playername[id], db_name[i])) { // Bingo! g_ammopacks[id] = db_ammopacks[i] g_zombieclass[id] = db_zombieclass[i] g_zombieclassnext[id] = db_zombieclass[i] return; } } }
// Checks if a player is allowed to be zombie allowed_zombie(id) { if ((g_zombie[id] && !g_nemesis[id]) || g_endround || !g_isalive[id] || task_exists(TASK_WELCOMEMSG) || (!g_newround && !g_zombie[id] && fnGetHumans() == 1)) return false;
return true; }
// Checks if a player is allowed to be human allowed_human(id) { if ((!g_zombie[id] && !g_survivor[id]) || g_endround || !g_isalive[id] || task_exists(TASK_WELCOMEMSG) || (!g_newround && g_zombie[id] && fnGetZombies() == 1)) return false;
return true; }
// Checks if a player is allowed to be survivor allowed_survivor(id) { if (g_endround || g_survivor[id] || !g_isalive[id] || task_exists(TASK_WELCOMEMSG) || (!g_newround && g_zombie[id] && fnGetZombies() == 1)) return false;
return true; }
// Checks if a player is allowed to be nemesis allowed_nemesis(id) { if (g_endround || g_nemesis[id] || !g_isalive[id] || task_exists(TASK_WELCOMEMSG) || (!g_newround && !g_zombie[id] && fnGetHumans() == 1)) return false;
return true; }
// Checks if a player is allowed to respawn allowed_respawn(id) { static team team = fm_cs_get_user_team(id)
if (g_endround || team == FM_CS_TEAM_SPECTATOR || team == FM_CS_TEAM_UNASSIGNED || g_isalive[id]) return false;
return true; }
// Checks if swarm mode is allowed allowed_swarm() { if (g_endround || !g_newround || task_exists(TASK_WELCOMEMSG)) return false;
return true; }
// Checks if multi infection mode is allowed allowed_multi() { if (g_endround || !g_newround || task_exists(TASK_WELCOMEMSG) || floatround(fnGetAlive()*get_pcvar_float(cvar_multiratio), floatround_ceil) < 2 || floatround(fnGetAlive()*get_pcvar_float(cvar_multiratio), floatround_ceil) >= fnGetAlive()) return false;
return true; }
// Checks if plague mode is allowed allowed_plague() { if (g_endround || !g_newround || task_exists(TASK_WELCOMEMSG) || floatround((fnGetAlive()-(get_pcvar_num(cvar_plaguenemnum)+get_pcvar_num(cvar_plaguesurvnum)))*get_pcvar_ float(cvar_plagueratio), floatround_ceil) < 1 || fnGetAlive()-(get_pcvar_num(cvar_plaguesurvnum)+get_pcvar_num(cvar_plaguenemnum)+floatround(( fnGetAlive()-(get_pcvar_num(cvar_plaguenemnum)+get_pcvar_num(cvar_plaguesurvnum)))*get_pcvar_ float(cvar_plagueratio), floatround_ceil)) < 1) return false;
// New round? if (g_newround) { // Set as first zombie remove_task(TASK_MAKEZOMBIE) make_a_zombie(MODE_INFECTION, player) } else { // Just infect zombieme(player, 0, 0, 0, 0) } }
// New round? if (g_newround) { // Set as first survivor remove_task(TASK_MAKEZOMBIE) make_a_zombie(MODE_SURVIVOR, player) } else { // Turn player into a Survivor humanme(player, 1, 0) } }
// New round? if (g_newround) { // Set as first nemesis remove_task(TASK_MAKEZOMBIE) make_a_zombie(MODE_NEMESIS, player) } else { // Turn player into a Nemesis zombieme(player, 0, 1, 0, 0) } }
// Override respawn as zombie setting on nemesis and survivor rounds if (g_survround) g_respawn_as_zombie[player] = true else if (g_nemround) g_respawn_as_zombie[player] = false
// Native: zp_get_user_batteries public native_get_user_batteries(id) { if (!is_user_valid(id)) { log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id) return -1; }
return g_flashbattery[id]; }
// Native: zp_set_user_batteries public native_set_user_batteries(id, value) { // ZP disabled if (!g_pluginenabled) return false;
if (!is_user_valid_connected(id)) { log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id) return false; }
g_flashbattery[id] = clamp(value, 0, 100);
if (g_cached_customflash) { // Set the flashlight charge task to update battery status remove_task(id+TASK_CHARGE) set_task(1.0, "flashlight_charge", id+TASK_CHARGE, _, _, "b") } return true; }
// Native: zp_get_user_nightvision public native_get_user_nightvision(id) { if (!is_user_valid(id)) { log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id) return -1; }
return g_nvision[id]; }
// Native: zp_set_user_nightvision public native_set_user_nightvision(id, set) { // ZP disabled if (!g_pluginenabled) return false;
if (!is_user_valid_connected(id)) { log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id) return false; }
if (set) { g_nvision[id] = true
if (!g_isbot[id]) { g_nvisionenabled[id] = true
// Custom nvg? if (get_pcvar_num(cvar_customnvg)) { remove_task(id+TASK_NVISION) set_task(0.1, "set_user_nvision", id+TASK_NVISION, _, _, "b") } else set_user_gnvision(id, 1) } else cs_set_user_nvg(id, 1) } else { // Remove CS nightvision if player owns one (bugfix) cs_set_user_nvg(id, 0)
if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION) else if (g_nvisionenabled[id]) set_user_gnvision(id, 0) g_nvision[id] = false g_nvisionenabled[id] = false } return true; }
// Native: zp_infect_user public native_infect_user(id, infector, silent, rewards) { // ZP disabled if (!g_pluginenabled) return false;
if (!is_user_valid_alive(id)) { log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id) return false; }
// Not allowed to be zombie if (!allowed_zombie(id)) return false;
// New round? if (g_newround) { // Set as first zombie remove_task(TASK_MAKEZOMBIE) make_a_zombie(MODE_INFECTION, id) } else { // Just infect (plus some checks) zombieme(id, is_user_valid_alive(infector) ? infector : 0, 0, (silent == 1) ? 1 : 0, (rewards == 1) ? 1 : 0) } return true; }
// Native: zp_disinfect_user public native_disinfect_user(id, silent) { // ZP disabled if (!g_pluginenabled) return false;
if (!is_user_valid_alive(id)) { log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id) return false; }
// Not allowed to be human if (!allowed_human(id)) return false;
// Turn to human humanme(id, 0, (silent == 1) ? 1 : 0) return true; }
// Native: zp_make_user_nemesis public native_make_user_nemesis(id) { // ZP disabled if (!g_pluginenabled) return false;
if (!is_user_valid_alive(id)) { log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id) return false; }
// Not allowed to be nemesis if (!allowed_nemesis(id)) return false;
// New round? if (g_newround) { // Set as first nemesis remove_task(TASK_MAKEZOMBIE) make_a_zombie(MODE_NEMESIS, id) } else { // Turn player into a Nemesis zombieme(id, 0, 1, 0, 0) } return true; }
// Native: zp_make_user_survivor public native_make_user_survivor(id) { // ZP disabled if (!g_pluginenabled) return false;
if (!is_user_valid_alive(id)) { log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id) return false; }
// Not allowed to be survivor if (!allowed_survivor(id)) return false;
// New round? if (g_newround) { // Set as first survivor remove_task(TASK_MAKEZOMBIE) make_a_zombie(MODE_SURVIVOR, id) } else { // Turn player into a Survivor humanme(id, 1, 0) }
return true; }
// Native: zp_respawn_user public native_respawn_user(id, team) { // ZP disabled if (!g_pluginenabled) return false;
if (!is_user_valid_connected(id)) { log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id) return false; }
// Respawn not allowed if (!allowed_respawn(id)) return false;
if (g_handle_models_on_separate_ent) { // Set the right model copy(g_playermodel[id], charsmax(g_playermodel[]), newmodel) if (g_set_modelindex_offset && modelindex) fm_cs_set_user_model_index(id, modelindex)
// Set model on player model entity fm_set_playermodel_ent(id) } else { // Get current model for comparing it with the current one fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
// Set the right model, after checking that we don't already have it if (!equal(currentmodel, newmodel)) { copy(g_playermodel[id], charsmax(g_playermodel[]), newmodel) if (g_set_modelindex_offset && modelindex) fm_cs_set_user_model_index(id, modelindex)
// An additional delay is offset at round start // since SVC_BAD is more likely to be triggered there if (g_newround) set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL) else fm_user_model_update(id+TASK_MODEL) } } return true; }
// Native: zp_has_round_started public native_has_round_started() { if (g_newround) return 0; // not started if (g_modestarted) return 1; // started return 2; // starting }
// Native: zp_is_nemesis_round public native_is_nemesis_round() { return g_nemround; }
// Native: zp_is_survivor_round public native_is_survivor_round() { return g_survround; }
// Native: zp_is_swarm_round public native_is_swarm_round() { return g_swarmround; }
// Native: zp_is_plague_round public native_is_plague_round() { return g_plagueround; }
// Native: zp_get_zombie_count public native_get_zombie_count() { return fnGetZombies(); }
// Native: zp_get_human_count public native_get_human_count() { return fnGetHumans(); }
// Native: zp_get_nemesis_count public native_get_nemesis_count() { return fnGetNemesis(); }
// Native: zp_get_survivor_count public native_get_survivor_count() { return fnGetSurvivors(); }
// Native: zp_register_extra_item public native_register_extra_item(const name[], cost, team) { // ZP disabled if (!g_pluginenabled) return -1;
// Strings passed byref param_convert(1)
// Arrays not yet initialized if (!g_arrays_created) { log_error(AMX_ERR_NATIVE, "[ZP] Can't register extra item yet (%s)", name) return -1; }
if (strlen(name) < 1) { log_error(AMX_ERR_NATIVE, "[ZP] Can't register extra item with an empty name") return -1; }
new index, extraitem_name[32] for (index = 0; index < g_extraitem_i; index++) { ArrayGetString(g_extraitem_name, index, extraitem_name, charsmax(extraitem_name)) if (equali(name, extraitem_name)) { log_error(AMX_ERR_NATIVE, "[ZP] Extra item already registered (%s)", name) return -1; } }
// For backwards compatibility if (team == ZP_TEAM_ANY) team = (ZP_TEAM_ZOMBIE|ZP_TEAM_HUMAN)
// Add the item ArrayPushString(g_extraitem_name, name) ArrayPushCell(g_extraitem_cost, cost) ArrayPushCell(g_extraitem_team, team)
// Set temporary new item flag ArrayPushCell(g_extraitem_new, 1)
// Override extra items data with our customizations new i, buffer[32], size = ArraySize(g_extraitem2_realname) for (i = 0; i < size; i++) { ArrayGetString(g_extraitem2_realname, i, buffer, charsmax(buffer))
// Check if this is the intended item to override if (!equal(name, buffer)) continue;
// Remove new item flag ArraySetCell(g_extraitem_new, g_extraitem_i, 0)
// Replace caption ArrayGetString(g_extraitem2_name, i, buffer, charsmax(buffer)) ArraySetString(g_extraitem_name, g_extraitem_i, buffer)
// Return id under which we registered the item return g_extraitem_i-1; }
// Function: zp_register_extra_item (to be used within this plugin only) native_register_extra_item2(const name[], cost, team) { // Add the item ArrayPushString(g_extraitem_name, name) ArrayPushCell(g_extraitem_cost, cost) ArrayPushCell(g_extraitem_team, team)
// Set temporary new item flag ArrayPushCell(g_extraitem_new, 1)
// Set temporary new class flag ArrayPushCell(g_zclass_new, 1)
// Override zombie classes data with our customizations new i, k, buffer[32], Float:buffer2, nummodels_custom, nummodels_default, prec_mdl[100], size = ArraySize(g_zclass2_realname) for (i = 0; i < size; i++) { ArrayGetString(g_zclass2_realname, i, buffer, charsmax(buffer))
// Check if this is the intended class to override if (!equal(name, buffer)) continue;
// Remove new class flag ArraySetCell(g_zclass_new, g_zclass_i, 0)
// Replace caption ArrayGetString(g_zclass2_name, i, buffer, charsmax(buffer)) ArraySetString(g_zclass_name, g_zclass_i, buffer)
// Replace info ArrayGetString(g_zclass2_info, i, buffer, charsmax(buffer)) ArraySetString(g_zclass_info, g_zclass_i, buffer)
// Replace models, unless using same models for all classes if (!g_same_models_for_all) { nummodels_custom = ArrayGetCell(g_zclass2_modelsend, i) - ArrayGetCell(g_zclass2_modelsstart, i) nummodels_default = ArrayGetCell(g_zclass_modelsend, g_zclass_i) - ArrayGetCell(g_zclass_modelsstart, g_zclass_i)
// Replace each player model and model index for (k = 0; k < min(nummodels_custom, nummodels_default); k++) { ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer)) ArraySetString(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_zclass_i) + k, buffer)
// Precache player model and replace its modelindex with the real one formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer) ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_zclass_i) + k, engfunc(EngFunc_PrecacheModel, prec_mdl)) if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, prec_mdl) if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, prec_mdl) // Precache modelT.mdl files too copy(prec_mdl[strlen(prec_mdl)-4], charsmax(prec_mdl) - (strlen(prec_mdl)-4), "T.mdl") if (file_exists(prec_mdl)) engfunc(EngFunc_PrecacheModel, prec_mdl) }
// We have more custom models than what we can accommodate, // Let's make some space... if (nummodels_custom > nummodels_default) { for (k = nummodels_default; k < nummodels_custom; k++) { ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer)) ArrayInsertStringAfter(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_zclass_i) + k - 1, buffer)
// Precache player model and retrieve its modelindex formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer) ArrayInsertCellAfter(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_zclass_i) + k - 1, engfunc(EngFunc_PrecacheModel, prec_mdl)) if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, prec_mdl) if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, prec_mdl) // Precache modelT.mdl files too copy(prec_mdl[strlen(prec_mdl)-4], charsmax(prec_mdl) - (strlen(prec_mdl)-4), "T.mdl") if (file_exists(prec_mdl)) engfunc(EngFunc_PrecacheModel, prec_mdl) }
// Fix models end index for this class ArraySetCell(g_zclass_modelsend, g_zclass_i, ArrayGetCell(g_zclass_modelsend, g_zclass_i) + (nummodels_custom - nummodels_default)) }
/* --- Not needed since classes can't have more than 1 default model for now --- // We have less custom models than what this class has by default, // Get rid of those extra entries... if (nummodels_custom < nummodels_default) { for (k = nummodels_custom; k < nummodels_default; k++) { ArrayDeleteItem(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_zclass_i) + nummodels_custom) }
// Fix models end index for this class ArraySetCell(g_zclass_modelsend, g_zclass_i, ArrayGetCell(g_zclass_modelsend, g_zclass_i) - (nummodels_default - nummodels_custom)) } */ }
// Replace clawmodel ArrayGetString(g_zclass2_clawmodel, i, buffer, charsmax(buffer)) ArraySetString(g_zclass_clawmodel, g_zclass_i, buffer)
// If class was not overriden with customization data if (ArrayGetCell(g_zclass_new, g_zclass_i)) { // If not using same models for all classes if (!g_same_models_for_all) { // Precache default class model and replace modelindex with the real one formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", model, model) ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_zclass_i), engfunc(EngFunc_PrecacheModel, prec_mdl)) if (g_force_consistency == 1) force_unmodified(force_model_samebounds, {0,0,0}, {0,0,0}, prec_mdl) if (g_force_consistency == 2) force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, prec_mdl) // Precache modelT.mdl files too copy(prec_mdl[strlen(prec_mdl)-4], charsmax(prec_mdl) - (strlen(prec_mdl)-4), "T.mdl") if (file_exists(prec_mdl)) engfunc(EngFunc_PrecacheModel, prec_mdl) }
// Return id under which we registered the class return g_zclass_i-1; }
// Native: zp_get_extra_item_id public native_get_extra_item_id(const name[]) { // ZP disabled if (!g_pluginenabled) return -1;
// Strings passed byref param_convert(1)
// Loop through every item (not using Tries since ZP should work on AMXX 1.8.0) static i, item_name[32] for (i = 0; i < g_extraitem_i; i++) { ArrayGetString(g_extraitem_name, i, item_name, charsmax(item_name))
// Check if this is the item to retrieve if (equali(name, item_name)) return i; }
return -1; }
// Native: zp_get_zombie_class_id public native_get_zombie_class_id(const name[]) { // ZP disabled if (!g_pluginenabled) return -1;
// Strings passed byref param_convert(1)
// Loop through every class (not using Tries since ZP should work on AMXX 1.8.0) static i, class_name[32] for (i = 0; i < g_zclass_i; i++) { ArrayGetString(g_zclass_name, i, class_name, charsmax(class_name))
// Check if this is the class to retrieve if (equali(name, class_name)) return i; }
return -1; }
// Native: zp_get_zombie_class_info public native_get_zombie_class_info(classid, info[], len) { // ZP disabled if (!g_pluginenabled) return false;
// Invalid class if (classid < 0 || classid >= g_zclass_i) { log_error(AMX_ERR_NATIVE, "[ZP] Invalid zombie class id (%d)", classid) return false; }
// Strings passed byref param_convert(2)
// Fetch zombie class info ArrayGetString(g_zclass_info, classid, info, len) return true; }
// Custom Night Vision public set_user_nvision(taskid) { // Get player's origin static origin[3] get_user_origin(ID_NVISION, origin)
// Nightvision message message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, ID_NVISION) write_byte(TE_DLIGHT) // TE id write_coord(origin[0]) // x write_coord(origin[1]) // y write_coord(origin[2]) // z write_byte(get_pcvar_num(cvar_nvgsize)) // radius
// Nemesis / Madness / Spectator in nemesis round if (g_nemesis[ID_NVISION] || (g_zombie[ID_NVISION] && g_nodamage[ID_NVISION]) || (!g_isalive[ID_NVISION] && g_nemround)) { write_byte(get_pcvar_num(cvar_nemnvgcolor[0])) // r write_byte(get_pcvar_num(cvar_nemnvgcolor[1])) // g write_byte(get_pcvar_num(cvar_nemnvgcolor[2])) // b } // Human / Spectator in normal round else if (!g_zombie[ID_NVISION] || !g_isalive[ID_NVISION]) { write_byte(get_pcvar_num(cvar_humnvgcolor[0])) // r write_byte(get_pcvar_num(cvar_humnvgcolor[1])) // g write_byte(get_pcvar_num(cvar_humnvgcolor[2])) // b } // Zombie else { write_byte(get_pcvar_num(cvar_nvgcolor[0])) // r write_byte(get_pcvar_num(cvar_nvgcolor[1])) // g write_byte(get_pcvar_num(cvar_nvgcolor[2])) // b }
write_byte(2) // life write_byte(0) // decay rate message_end() }
// Custom Flashlight public set_user_flashlight(taskid) { // Get player and aiming origins static Float:originF[3], Float:destoriginF[3] pev(ID_FLASH, pev_origin, originF) fm_get_aim_origin(ID_FLASH, destoriginF)
// Max distance check if (get_distance_f(originF, destoriginF) > get_pcvar_float(cvar_flashdist)) return;
// Send to all players? if (get_pcvar_num(cvar_flashshowall)) engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, destoriginF, 0) else message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, ID_FLASH)
// Flashlight write_byte(TE_DLIGHT) // TE id engfunc(EngFunc_WriteCoord, destoriginF[0]) // x engfunc(EngFunc_WriteCoord, destoriginF[1]) // y engfunc(EngFunc_WriteCoord, destoriginF[2]) // z write_byte(get_pcvar_num(cvar_flashsize)) // radius write_byte(get_pcvar_num(cvar_flashcolor[0])) // r write_byte(get_pcvar_num(cvar_flashcolor[1])) // g write_byte(get_pcvar_num(cvar_flashcolor[2])) // b write_byte(3) // life write_byte(0) // decay rate message_end() }
// Infection special effects infection_effects(id) { // Screen fade? (unless frozen) if (!g_frozen[id] && get_pcvar_num(cvar_infectionscreenfade)) { message_begin(MSG_ONE_UNRELIABLE, g_msgScreenFade, _, id) write_short(UNIT_SECOND) // duration write_short(0) // hold time write_short(FFADE_IN) // fade type if (g_nemesis[id]) { write_byte(get_pcvar_num(cvar_nemnvgcolor[0])) // r write_byte(get_pcvar_num(cvar_nemnvgcolor[1])) // g write_byte(get_pcvar_num(cvar_nemnvgcolor[2])) // b } else { write_byte(get_pcvar_num(cvar_nvgcolor[0])) // r write_byte(get_pcvar_num(cvar_nvgcolor[1])) // g write_byte(get_pcvar_num(cvar_nvgcolor[2])) // b } write_byte (255) // alpha message_end() }
// Infection icon? if (get_pcvar_num(cvar_hudicons)) { message_begin(MSG_ONE_UNRELIABLE, g_msgDamage, _, id) write_byte(0) // damage save write_byte(0) // damage take write_long(DMG_NERVEGAS) // damage type - DMG_RADIATION write_coord(0) // x write_coord(0) // y write_coord(0) // z message_end() }
// Get player's origin static origin[3] get_user_origin(id, origin)
// Tracers? if (get_pcvar_num(cvar_infectiontracers)) { message_begin(MSG_PVS, SVC_TEMPENTITY, origin) write_byte(TE_IMPLOSION) // TE id write_coord(origin[0]) // x write_coord(origin[1]) // y write_coord(origin[2]) // z write_byte(128) // radius write_byte(20) // count write_byte(3) // duration message_end() }
// Particle burst? if (get_pcvar_num(cvar_infectionparticles)) { message_begin(MSG_PVS, SVC_TEMPENTITY, origin) write_byte(TE_PARTICLEBURST) // TE id write_coord(origin[0]) // x write_coord(origin[1]) // y write_coord(origin[2]) // z write_short(50) // radius write_byte(70) // color write_byte(3) // duration (will be randomized a bit) message_end() }
// Light sparkle? if (get_pcvar_num(cvar_infectionsparkle)) { message_begin(MSG_PVS, SVC_TEMPENTITY, origin) write_byte(TE_DLIGHT) // TE id write_coord(origin[0]) // x write_coord(origin[1]) // y write_coord(origin[2]) // z write_byte(20) // radius write_byte(get_pcvar_num(cvar_nvgcolor[0])) // r write_byte(get_pcvar_num(cvar_nvgcolor[1])) // g write_byte(get_pcvar_num(cvar_nvgcolor[2])) // b write_byte(2) // life write_byte(0) // decay rate message_end() } }
// Nemesis/madness aura task public zombie_aura(taskid) { // Not nemesis, not in zombie madness if (!g_nemesis[ID_AURA] && !g_nodamage[ID_AURA]) { // Task not needed anymore remove_task(taskid); return; }
// Get player's origin static origin[3] get_user_origin(ID_AURA, origin)
// Colored Aura message_begin(MSG_PVS, SVC_TEMPENTITY, origin) write_byte(TE_DLIGHT) // TE id write_coord(origin[0]) // x write_coord(origin[1]) // y write_coord(origin[2]) // z write_byte(20) // radius write_byte(get_pcvar_num(cvar_nemnvgcolor[0])) // r write_byte(get_pcvar_num(cvar_nemnvgcolor[1])) // g write_byte(get_pcvar_num(cvar_nemnvgcolor[2])) // b write_byte(2) // life write_byte(0) // decay rate message_end() }
// Make zombies leave footsteps and bloodstains on the floor public make_blood(taskid) { // Only bleed when moving on ground if (!(pev(ID_BLOOD, pev_flags) & FL_ONGROUND) || fm_get_speed(ID_BLOOD) < 80) return;
// Get user origin static Float:originF[3] pev(ID_BLOOD, pev_origin, originF)
// If ducking set a little lower if (pev(ID_BLOOD, pev_bInDuck)) originF[2] -= 18.0 else originF[2] -= 36.0
// Send the decal message engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, originF, 0) write_byte(TE_WORLDDECAL) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z write_byte(ArrayGetCell(zombie_decals, random_num(0, ArraySize(zombie_decals) - 1)) + (g_czero * 12)) // random decal number (offsets +12 for CZ) message_end() }
// Burning Flames public burning_flame(taskid) { // Get player origin and flags static origin[3], flags get_user_origin(ID_BURN, origin) flags = pev(ID_BURN, pev_flags)
// Madness mode - in water - burning stopped if (g_nodamage[ID_BURN] || (flags & FL_INWATER) || g_burning_duration[ID_BURN] < 1) { // Smoke sprite message_begin(MSG_PVS, SVC_TEMPENTITY, origin) write_byte(TE_SMOKE) // TE id write_coord(origin[0]) // x write_coord(origin[1]) // y write_coord(origin[2]-50) // z write_short(g_smokeSpr) // sprite write_byte(random_num(15, 20)) // scale write_byte(random_num(10, 20)) // framerate message_end()
// Task not needed anymore remove_task(taskid); return; }
// Randomly play burning zombie scream sounds (not for nemesis) if (!g_nemesis[ID_BURN] && !random_num(0, 20)) { static pointers[10], end static sound[64] ArrayGetArray(pointer_class_sound_burn, g_zombieclass[ID_BURN], pointers)
for (new i; i < 10; i++) { if (pointers[i] != -1) end = i }
// Get player's health static health health = pev(ID_BURN, pev_health)
// Take damage from the fire if (health - floatround(get_pcvar_float(cvar_firedamage), floatround_ceil) > 0) fm_set_user_health(ID_BURN, health - floatround(get_pcvar_float(cvar_firedamage), floatround_ceil))
// Flame sprite message_begin(MSG_PVS, SVC_TEMPENTITY, origin) write_byte(TE_SPRITE) // TE id write_coord(origin[0]+random_num(-5, 5)) // x write_coord(origin[1]+random_num(-5, 5)) // y write_coord(origin[2]+random_num(-10, 10)) // z write_short(g_flameSpr) // sprite write_byte(random_num(5, 10)) // scale write_byte(200) // brightness message_end()
// Infection Bomb: Green Blast create_blast(const Float:originF[3]) { // Smallest ring engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[2]+385.0) // z axis write_short(g_exploSpr) // sprite write_byte(0) // startframe write_byte(0) // framerate write_byte(4) // life write_byte(60) // width write_byte(0) // noise write_byte(0) // red write_byte(200) // green write_byte(0) // blue write_byte(200) // brightness write_byte(0) // speed message_end()
// Medium ring engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[2]+470.0) // z axis write_short(g_exploSpr) // sprite write_byte(0) // startframe write_byte(0) // framerate write_byte(4) // life write_byte(60) // width write_byte(0) // noise write_byte(0) // red write_byte(200) // green write_byte(0) // blue write_byte(200) // brightness write_byte(0) // speed message_end()
// Largest ring engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[2]+555.0) // z axis write_short(g_exploSpr) // sprite write_byte(0) // startframe write_byte(0) // framerate write_byte(4) // life write_byte(60) // width write_byte(0) // noise write_byte(0) // red write_byte(200) // green write_byte(0) // blue write_byte(200) // brightness write_byte(0) // speed message_end() }
// Fire Grenade: Fire Blast create_blast2(const Float:originF[3]) { // Smallest ring engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[2]+385.0) // z axis write_short(g_exploSpr) // sprite write_byte(0) // startframe write_byte(0) // framerate write_byte(4) // life write_byte(60) // width write_byte(0) // noise write_byte(200) // red write_byte(100) // green write_byte(0) // blue write_byte(200) // brightness write_byte(0) // speed message_end()
// Medium ring engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[2]+470.0) // z axis write_short(g_exploSpr) // sprite write_byte(0) // startframe write_byte(0) // framerate write_byte(4) // life write_byte(60) // width write_byte(0) // noise write_byte(200) // red write_byte(50) // green write_byte(0) // blue write_byte(200) // brightness write_byte(0) // speed message_end()
// Largest ring engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[2]+555.0) // z axis write_short(g_exploSpr) // sprite write_byte(0) // startframe write_byte(0) // framerate write_byte(4) // life write_byte(60) // width write_byte(0) // noise write_byte(200) // red write_byte(0) // green write_byte(0) // blue write_byte(200) // brightness write_byte(0) // speed message_end() }
// Frost Grenade: Freeze Blast create_blast3(const Float:originF[3]) { // Smallest ring engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[2]+385.0) // z axis write_short(g_exploSpr) // sprite write_byte(0) // startframe write_byte(0) // framerate write_byte(4) // life write_byte(60) // width write_byte(0) // noise write_byte(0) // red write_byte(100) // green write_byte(200) // blue write_byte(200) // brightness write_byte(0) // speed message_end()
// Medium ring engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[2]+470.0) // z axis write_short(g_exploSpr) // sprite write_byte(0) // startframe write_byte(0) // framerate write_byte(4) // life write_byte(60) // width write_byte(0) // noise write_byte(0) // red write_byte(100) // green write_byte(200) // blue write_byte(200) // brightness write_byte(0) // speed message_end()
// Largest ring engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[2]+555.0) // z axis write_short(g_exploSpr) // sprite write_byte(0) // startframe write_byte(0) // framerate write_byte(4) // life write_byte(60) // width write_byte(0) // noise write_byte(0) // red write_byte(100) // green write_byte(200) // blue write_byte(200) // brightness write_byte(0) // speed message_end() }
// Fix Dead Attrib on scoreboard FixDeadAttrib(id) { message_begin(MSG_BROADCAST, g_msgScoreAttrib) write_byte(id) // id write_byte(0) // attrib message_end() }
// Send Death Message for infections SendDeathMsg(attacker, victim) { message_begin(MSG_BROADCAST, g_msgDeathMsg) write_byte(attacker) // killer write_byte(victim) // victim write_byte(1) // headshot flag write_string("infection") // killer's weapon message_end() }
// Update Player Frags and Deaths UpdateFrags(attacker, victim, frags, deaths, scoreboard) { // Set attacker frags set_pev(attacker, pev_frags, float(pev(attacker, pev_frags) + frags))
// Set victim deaths fm_cs_set_user_deaths(victim, cs_get_user_deaths(victim) + deaths)
// Update scoreboard with attacker and victim info if (scoreboard) { message_begin(MSG_BROADCAST, g_msgScoreInfo) write_byte(attacker) // id write_short(pev(attacker, pev_frags)) // frags write_short(cs_get_user_deaths(attacker)) // deaths write_short(0) // class? write_short(fm_cs_get_user_team(attacker)) // team message_end()
// Plays a sound on clients PlaySound(const sound[]) { if (equal(sound[strlen(sound)-4], ".mp3")) client_cmd(0, "mp3 play ^"sound/%s^"", sound) else client_cmd(0, "spk ^"%s^"", sound) }
// Prints a colored message to target (use 0 for everyone), supports ML formatting. // Note: I still need to make something like gungame's LANG_PLAYER_C to avoid unintended // argument replacement when a function passes -1 (it will be considered a LANG_PLAYER) 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 (!g_isconnected[player]) continue;
// Replace LANG_PLAYER with player id for (i = 2; i < argscount; i++) { if (getarg(i) == LANG_PLAYER) { setarg(i, 0, player) changed[changedcount] = i changedcount++ } }
// Format message for player vformat(buffer, charsmax(buffer), message, 3)
// Send it message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player) write_byte(player) write_string(buffer) message_end()
// Replace back player id's with LANG_PLAYER for (i = 0; i < changedcount; i++) setarg(changed[i], 0, LANG_PLAYER) } } // Send to specific target else { /* // Not needed since you should set the ML argument // to the player's id for a targeted print message
// 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, charsmax(buffer), message, 3)
// 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 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;
// get spawn point data parse(linedata,csdmdata[0],5,csdmdata[1],5,csdmdata[2],5,csdmdata[3],5,csdmdata[ 4],5,csdmdata[5],5,csdmdata[6],5,csdmdata[7],5,csdmdata[8],5,csdmdata[9],5)
// Hack: store weapon bpammo on PEV_ADDITIONAL_AMMO set_pev(weapon_ent, PEV_ADDITIONAL_AMMO, cs_get_user_bpammo(id, weaponid))
// Player drops the weapon and looses his bpammo engclient_cmd(id, "drop", wname) cs_set_user_bpammo(id, weaponid, 0) } } }
// Stock by (probably) Twilight Suzuka -counts number of chars in a string stock str_count(const str[], searchchar) { new count, i, len = strlen(str)
for (i = 0; i <= len; i++) { if(str[i] == searchchar) count++ }
return count; }
// Checks if a space is vacant (credits to VEN) stock is_hull_vacant(Float:origin[3], hull) { engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, 0)
// Simplified get_weaponid (CS only) stock cs_weapon_name_to_id(const weapon[]) { static i for (i = 0; i < sizeof WEAPONENTNAMES; i++) { if (equal(weapon, WEAPONENTNAMES[i])) return i; }
return 0; }
// Get User Current Weapon Entity stock fm_cs_get_current_weapon_ent(id) { // Prevent server crash if entity's private data not initalized if (pev_valid(id) != PDATA_SAFE) return -1;
// Get Weapon Entity's Owner stock fm_cs_get_weapon_ent_owner(ent) { // Prevent server crash if entity's private data not initalized if (pev_valid(ent) != PDATA_SAFE) return -1;
// Set User Deaths stock fm_cs_set_user_deaths(id, value) { // Prevent server crash if entity's private data not initalized if (pev_valid(id) != PDATA_SAFE) return;
// Get User Team stock fm_cs_get_user_team(id) { // Prevent server crash if entity's private data not initalized if (pev_valid(id) != PDATA_SAFE) return FM_CS_TEAM_UNASSIGNED;
// Set a Player's Team stock fm_cs_set_user_team(id, team) { // Prevent server crash if entity's private data not initalized if (pev_valid(id) != PDATA_SAFE) return;
// Set User Money stock fm_cs_set_user_money(id, value) { // Prevent server crash if entity's private data not initalized if (pev_valid(id) != PDATA_SAFE) return;
// Set User Flashlight Batteries stock fm_cs_set_user_batteries(id, value) { // Prevent server crash if entity's private data not initalized if (pev_valid(id) != PDATA_SAFE) return;
// Send User Team Message public fm_cs_set_user_team_msg(taskid) { // Note to self: this next message can now be received by other plugins
// Set the switching team flag g_switchingteam = true
// Tell everyone my new team emessage_begin(MSG_ALL, g_msgTeamInfo) ewrite_byte(ID_TEAM) // player ewrite_string(CS_TEAM_NAMES[fm_cs_get_user_team(ID_TEAM)]) // team emessage_end()
// Done switching team g_switchingteam = false }
// Set the precached model index (updates hitboxes server side) stock fm_cs_set_user_model_index(id, value) { // Prevent server crash if entity's private data not initalized if (pev_valid(id) != PDATA_SAFE) return;
// Set Player Model on Entity stock fm_set_playermodel_ent(id) { // Make original player entity invisible without hiding shadows or firing effects fm_set_rendering(id, kRenderFxNone, 255, 255, 255, kRenderTransTexture, 1)
// Format model string static model[100] formatex(model, charsmax(model), "models/player/%s/%s.mdl", g_playermodel[id], g_playermodel[id])
// Set model on entity or make a new one if unexistant if (!pev_valid(g_ent_playermodel[id])) { g_ent_playermodel[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")) if (!pev_valid(g_ent_playermodel[id])) return;
// Set Weapon Model on Entity stock fm_set_weaponmodel_ent(id) { // Get player's p_ weapon model static model[100] pev(id, pev_weaponmodel2, model, charsmax(model))
// Set model on entity or make a new one if unexistant if (!pev_valid(g_ent_weaponmodel[id])) { g_ent_weaponmodel[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")) if (!pev_valid(g_ent_weaponmodel[id])) return;
// Remove Custom Model Entities stock fm_remove_model_ents(id) { // Remove "playermodel" ent if present if (pev_valid(g_ent_playermodel[id])) { engfunc(EngFunc_RemoveEntity, g_ent_playermodel[id]) g_ent_playermodel[id] = 0 } // Remove "weaponmodel" ent if present if (pev_valid(g_ent_weaponmodel[id])) { engfunc(EngFunc_RemoveEntity, g_ent_weaponmodel[id]) g_ent_weaponmodel[id] = 0 } }
// Set User Model public fm_cs_set_user_model(taskid) { set_user_info(ID_MODEL, "model", g_playermodel[ID_MODEL]) }
// Get User Model -model passed byref- stock fm_cs_get_user_model(player, model[], len) { get_user_info(player, "model", model, len) }
// Update Player's Model on all clients (adding needed delays) public fm_user_model_update(taskid) { static Float:current_time current_time = get_gametime()
public fw_Knife_PrimaryAttack_Post(knife) { // Get knife owner static id id = get_pdata_cbase(knife, m_pPlayer, 4)
// has a Chainsaw if(is_user_connected(id) && g_has_chainsaw[id]) { // Get new fire rate static Float:flRate flRate = get_pcvar_float(cvar_pattack_rate)
// Set new rates set_pdata_float(knife, m_flNextPrimaryAttack, flRate, 4) set_pdata_float(knife, m_flNextSecondaryAttack, flRate, 4) set_pdata_float(knife, m_flTimeWeaponIdle, flRate, 4)
// Get new recoil static Float:flPunchAngle[3] flPunchAngle[0] = get_pcvar_float(cvar_pattack_recoil)
// Punch their angles entity_set_vector(id, EV_VEC_punchangle, flPunchAngle)
}
return HAM_IGNORED }
public fw_Knife_SecondaryAttack_Post(knife) { // Get knife owner static id id = get_pdata_cbase(knife, m_pPlayer, 4)
// has a Chainsaw if(is_user_connected(id) && g_has_chainsaw[id]) { // Get new fire rate static Float:flRate flRate = get_pcvar_float(cvar_sattack_rate)
// Set new rates set_pdata_float(knife, m_flNextPrimaryAttack, flRate, 4) set_pdata_float(knife, m_flNextSecondaryAttack, flRate, 4) set_pdata_float(knife, m_flTimeWeaponIdle, flRate, 4)
// Get new recoil static Float:flPunchAngle[3] flPunchAngle[0] = get_pcvar_float(cvar_sattack_recoil)
// Punch their angles entity_set_vector(id, EV_VEC_punchangle, flPunchAngle) }
return HAM_IGNORED }
public touch_chainsaw(chainsaw, id) { if(!is_valid_ent(chainsaw)) return PLUGIN_CONTINUE
for (new i = 1; i <= g_maxplayers; i++) set_pev(i, pev_gravity, 1.0) } }
public client_command(id) { new arg[13]; read_argv(0, arg , 12);
if (g_Restart) { for (new a = 0; a < 34; a++) { if(equal("buy", arg)||equal("buyequip", arg)||equal("autobuy", arg)) { print_col_chat(id, "^4[BuyMenu] ^1Меню не доступно во время ^3Авто-Рестарта ^1!") return PLUGIN_HANDLED; } } } return PLUGIN_CONTINUE; }
stock print_col_chat(const id, const input[], any:...) { new count = 1, players[32]; static msg[191]; vformat(msg, 190, input, 3); replace_all(msg, 190, "!g", "^4"); replace_all(msg, 190, "!y", "^1"); replace_all(msg, 190, "!team", "^3"); if (id) players[0] = id; else get_players(players, count, "ch"); { for ( new i = 0; i < count; i++ ) { if ( is_user_connected(players[i]) ) { message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText") , _, players[i]); write_byte(players[i]); write_string(msg); message_end(); } } } } /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par } */
Поблагодарили 0 раз Поблагодарили 0 раз
MrLegiongame
9.7.2016, 22:12
Сообщение
Стаж: 11 лет
Сообщений: 110
Благодарностей: 3
Полезность: < 0
Villi123, на какой именно модельке есть баг ? вы устанавливали новую модельку ? если да, напишите ее название в исходники плагина пожалуйста.
Поблагодарили 0 раз Поблагодарили 0 раз
Villi123
9.7.2016, 22:56
Сообщение
Стаж: 12 лет
Сообщений: 65
Благодарностей: 14
Полезность: 129
Цитата(MrLegiongame @ 9.7.2016, 23:12)
Villi123, на какой именно модельке есть баг ? вы устанавливали новую модельку ? если да, напишите ее название в исходники плагина пожалуйста.
1. На моделях прописанных под Флаг (Для Админа, VIP'а, BOSS'а). 2. Да, прописывал модели по образцу ADMIN модели. 3. Ctrl+F ищите "vip_human" и "boss_human".
//Прописываем сюда модели для закачки new const nModel[][] = { "models/player/StichVipCT/StichVipCT.mdl", "models/player/StichVipTT/StichVipTT.mdl" } public plugin_precache(){ static i for(i = 0; i < sizeof(nModel); i++) precache_model(nModel[i])
precache_generic("sound/misc/bomb_defuse.mp3")
} public plugin_init() { RegisterHam(Ham_Spawn, "player", "player_spawn", 1) register_event("BarTime", "event_defuse_started", "be", "1=5", "1=10") } public event_defuse_started() client_cmd(0, "mp3 play sound/misc/bomb_defuse");
public player_spawn(id){ if(!is_user_connected(id)) return HAM_IGNORED; static team team = get_user_team(id) switch(team){ case 1:{ //Террористы if(get_user_flags(id) & ADMIN_LEVEL_H) cs_set_user_model(id, "StichVipTT"); //флаг b //else if(get_user_flags(id) & ADMIN_LEVEL_B) cs_set_user_model(id, "Carlito"); //флаг n //else if(get_user_flags(id) & ADMIN_LEVEL_G) cs_set_user_model(id, "VIP_TT_S.mdl"); //флаг s //else if(get_user_flags(id) & ADMIN_LEVEL_D) cs_set_user_model(id, "pirategirl"); //флаг p //else if(get_user_flags(id) & ADMIN_LEVEL_H) cs_set_user_model(id, "AdminDevTT_o"); //флаг i //else if(get_user_flags(id) & ADMIN_LEVEL_C) cs_set_user_model(id, "AdminDevTT_o"); //флаг o
} case 2:{ //Контр-террористы if(get_user_flags(id) & ADMIN_LEVEL_H) cs_set_user_model(id, "StichVipCT"); //флаг b //else if(get_user_flags(id) & ADMIN_LEVEL_B) cs_set_user_model(id, "marineboy"); //флаг n //else if(get_user_flags(id) & ADMIN_LEVEL_G) cs_set_user_model(id, "VIP_CT_S"); //флаг s //else if(get_user_flags(id) & ADMIN_LEVEL_D) cs_set_user_model(id, "Koshcka"); //флаг p //else if(get_user_flags(id) & ADMIN_LEVEL_H) cs_set_user_model(id, "Modelka_Vika_g"); //флаг i //else if(get_user_flags(id) & ADMIN_LEVEL_C) cs_set_user_model(id, "AdminDevCT_o"); //флаг o
} } return HAM_IGNORED } /*sbinop ; a - иммунитет от киков , банов , слапов и т.д ; b - резервированный слот (игрок может зайти на зарезервировынаый слот) ; c - использывания команды amx_kick ; d - использывания команд amx_ban и amx_unban ; e - использывания команд amx_slay и amx_slap ; f - использывания команды amx_map ; g - использывания команды amx_cvar (не все cvar'ы будут доступны) ; h - использывания команды amx_cfg ; i - использывания команды amx_chat и других команд для чата ; j - использывания команды amx_vote и других команд для голосования ; k - доступ к команде sv_password (через команду amx_cvar) ; l - доступ к командам amx_rcon и rcon_password (через команду amx_cvar) ; m - левел А (для дополнительных плагинов) amx ; n - левел B rope ; o - левел C xyk ; p - левел D Grab ; q - левел E v ; r - левел F sv ; s - левел G girl ; t - левел H ; u - доступ к меню ; z - простой юзер (не админ)*/