Class: Hero
Description:
This is hero class. An addition class for zombie escape mod. This plugin chooses a player randomly and gives him extra features for 1 round. Some of the features are:
- Speed.
- Gravity.
- Extra damage.
- Different model.
- Parachute.
- Multijump.
- ze_hero_min_humans // Minimum players to start choosing random player to be hero? (D: 10).
- ze_hero_damage // How much damage does the hero get? (D: 1.5).
- ze_hero_speed // How much speed does the hero gain? (D: 300) (Note: Check 'ze_set_human_speed_factor' usage.
- ze_hero_gravity // How much will the hero's gravity be? (D: 1.2) (Note: The value you set will be the hero's gravity, no increase or decrease.
- ze_screen_fade // Allow screen fade on turning to hero? (0 = Disable || 1 = Enable) (D: 1).
- ze_screen_fade_red // How much the red color will be? (D: 0).
- ze_screen_fade_green // How much the green color will be? (D: 150).
- ze_screen_fade_blue // How much the blue color will be? (D: 0).
- Uncomment to use parachute.
- //#define PARACHUTE
- Uncomment to use multijump.
- //#define MULTIJUMP
- Red color value used in the hud appears to notify server's players who the hero is (D: 255).
- #define HUDMESSAGE_RED
- Green color value used in the hud appears to notify server's players who the hero is (D: 255).
- #define HUDMESSAGE_GREEN
- Blue color value used in the hud appears to notify server's players who the hero is (D: 255).
- #define HUDMESSAGE_BLUE
- Checks whether the player is hero or not (id is player's index).
- native ze_is_user_hero(id)
- Sets & unsets the player (id is player's index || if set = 1 --> set || if set = 0 --> unset).
- native ze_set_user_hero(id, set)
- Spoiler!
Code:
- // Uncomment to use parachute
- //#define PARACHUTE
- // Uncomment to use multijump
- //#define MULTIJUMP
- #include <zombie_escape>
- #if defined PARACHUTE
- #include <ze_parachute>
- #endif
- #if defined MULTIJUMP
- #include <ze_multijump>
- #endif
- #define TASK_MAKE_HERO 10014949
- #define HUDMESSAGE_RED 255
- #define HUDMESSAGE_GREEN 255
- #define HUDMESSAGE_BLUE 255
- #define FFADE_IN 0x0000
- #define UNIT_SECOND (1<<12)
- enum {
- Red = 0,
- Green,
- Blue
- }
- new const ZE_SETTING_RESOURCES[] = "zombie_escape.ini"
- new const szHeroModel[][] = { "vip" }
- new bool:g_bHero[33]
- new Array:g_szHeroModel
- new iHud, g_iMsgScreenFade
- new g_pCvarHeroMinHumans,
- g_pCvarHeroDamage,
- g_pCvarHeroGravity,
- g_pCvarHeroSpeed,
- g_pCvarScreenFade,
- g_pCvarScreenFadeColor[3]
- public plugin_natives()
- {
- register_native("ze_is_user_hero", "native_ze_is_user_hero", 1)
- register_native("ze_set_user_hero", "native_ze_set_user_hero", 1)
- }
- public plugin_precache()
- {
- g_szHeroModel = ArrayCreate(32, 1)
- amx_load_setting_string_arr(ZE_SETTING_RESOURCES, "Player Models", "HERO", g_szHeroModel)
- new iIndex, PlayerModel[32], Model_Path[128]
- if (ArraySize(g_szHeroModel) == 0)
- {
- for (iIndex = 0; iIndex < sizeof(szHeroModel); iIndex++)
- ArrayPushString(g_szHeroModel, szHeroModel[iIndex])
- amx_save_setting_string_arr(ZE_SETTING_RESOURCES, "Player Models", "HERO", g_szHeroModel)
- }
- for (iIndex = 0; iIndex < ArraySize(g_szHeroModel); iIndex++)
- {
- ArrayGetString(g_szHeroModel, iIndex, PlayerModel, charsmax(PlayerModel))
- formatex(Model_Path, charsmax(Model_Path), "models/player/%s/%s.mdl", PlayerModel, PlayerModel)
- precache_model(Model_Path)
- }
- }
- public plugin_init()
- {
- register_plugin("[ZE] Addons: Hero", "1.2", "Jack GamePlay")
- RegisterHookChain(RG_CBasePlayer_TakeDamage, "Fw_TakeDamage_Post", 1)
- g_pCvarHeroMinHumans = register_cvar("ze_hero_min_humans", "10")
- g_pCvarHeroDamage = register_cvar("ze_hero_damage", "1.5")
- g_pCvarHeroSpeed = register_cvar("ze_hero_speed", "300")
- g_pCvarHeroGravity = register_cvar("ze_hero_gravity", "1.2")
- g_pCvarScreenFade = register_cvar("ze_screen_fade", "1")
- g_pCvarScreenFadeColor[Red] = register_cvar("ze_screen_fade_red", "0")
- g_pCvarScreenFadeColor[Green] = register_cvar("ze_screen_fade_green", "150")
- g_pCvarScreenFadeColor[Blue] = register_cvar("ze_screen_fade_blue", "0")
- iHud = CreateHudSyncObj()
- g_iMsgScreenFade = get_user_msgid("ScreenFade")
- }
- public ze_zombie_appear()
- {
- set_task(2.5, "Make_Hero_Task", TASK_MAKE_HERO)
- }
- public Make_Hero_Task(taskid)
- {
- new id, Humans = ze_get_humans_number()
- if (Humans < get_pcvar_num(g_pCvarHeroMinHumans))
- {
- ze_colored_print(0, "!tThere must be at least !y[!g%i!y] !thumans to activate special class!y.", get_pcvar_num(g_pCvarHeroMinHumans))
- remove_task(taskid)
- return
- }
- id = GetRandomHero(random_num(1, Humans))
- Set_User_Hero(id)
- remove_task(taskid)
- return
- }
- public Set_User_Hero(id)
- {
- new HeroModel[32], HeroName[32]
- if (ze_is_user_zombie(id))
- ze_set_user_human(id)
- g_bHero[id] = true
- #if defined PARACHUTE
- ze_give_user_parachute(id)
- #endif
- #if defined MULTIJUMP
- ze_give_user_multijump(id)
- #endif
- if (get_pcvar_float(g_pCvarHeroGravity) > 0.0)
- {
- set_entvar(id, var_gravity, get_pcvar_float(g_pCvarHeroGravity))
- }
- if (get_pcvar_num(g_pCvarHeroSpeed) > 0.0)
- {
- ze_set_human_speed_factor(id, get_pcvar_num(g_pCvarHeroSpeed))
- }
- ArrayGetString(g_szHeroModel, random_num(0, ArraySize(g_szHeroModel) - 1), HeroModel, charsmax(HeroModel))
- rg_set_user_model(id, HeroModel)
- get_user_name(id, HeroName, charsmax(HeroName))
- set_hudmessage(HUDMESSAGE_RED, HUDMESSAGE_GREEN, HUDMESSAGE_BLUE, -1.0, 0.15, 1, 2.0, 2.0)
- ShowSyncHudMsg(0, iHud, "%s BECAME HERO!!!", HeroName)
- ze_colored_print(id, "!tYou became !gHero!y.")
- if (get_pcvar_num(g_pCvarScreenFade))
- {
- message_begin(MSG_ONE_UNRELIABLE, g_iMsgScreenFade, _, id)
- write_short(UNIT_SECOND) // duration
- write_short(0) // hold time
- write_short(FFADE_IN) // fade type
- write_byte(get_pcvar_num(g_pCvarScreenFadeColor[Red])) // r
- write_byte(get_pcvar_num(g_pCvarScreenFadeColor[Green])) // g
- write_byte(get_pcvar_num(g_pCvarScreenFadeColor[Blue])) // b
- write_byte (255) // alpha
- message_end()
- }
- }
- public Unset_User_Hero(id)
- {
- if (g_bHero[id])
- {
- g_bHero[id] = false
- if (get_pcvar_num(g_pCvarHeroSpeed) > 0.0)
- {
- ze_reset_human_speed(id)
- }
- #if defined PARACHUTE
- ze_remove_user_parachute(id)
- #endif
- #if defined MULTIJUMP
- ze_remove_user_multijump(id)
- #endif
- }
- }
- public client_disconnected(id)
- {
- Unset_User_Hero(id)
- remove_task(TASK_MAKE_HERO)
- }
- public ze_user_infected(victim)
- {
- if (!is_user_alive(victim))
- return
- Unset_User_Hero(victim)
- }
- public ze_user_humanized(id)
- {
- if (!is_user_alive(id))
- return
- Unset_User_Hero(id)
- }
- public Fw_TakeDamage_Post(victim, inflector, attacker, Float:Damage)
- {
- if (victim == attacker || !is_user_alive(victim) || !is_user_alive(attacker) || !attacker || ze_is_user_zombie(attacker))
- return HC_CONTINUE
- if (g_bHero[attacker])
- {
- if (inflector == attacker)
- {
- SetHookChainArg(4, ATYPE_FLOAT, Damage * get_pcvar_float(g_pCvarHeroDamage))
- return HC_CONTINUE
- }
- }
- return HC_SUPERCEDE
- }
- public ze_roundend()
- {
- for (new id = 0; id <= get_member_game(m_nMaxPlayers); id++)
- {
- if (!g_bHero[id])
- continue
- Unset_User_Hero(id)
- remove_task(TASK_MAKE_HERO)
- }
- }
- public native_ze_is_user_hero(id)
- {
- if (!is_user_connected(id))
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d)", id)
- return false
- }
- return g_bHero[id]
- }
- public native_ze_set_user_hero(id, set)
- {
- if (!is_user_connected(id))
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d).", id)
- return false
- }
- if (!set)
- {
- if (!g_bHero[id])
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Player isn't hero (%d).", id)
- return false
- }
- Unset_User_Hero(id)
- return true
- }
- if (set)
- {
- if (g_bHero[id])
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Player is hero (%d).", id)
- return false
- }
- Set_User_Hero(id)
- return true
- }
- return false
- }
- stock GetRandomHero(target_index)
- {
- new iAliveH, id
- for (id = 1; id <= get_member_game(m_nMaxPlayers); id++)
- {
- if (is_user_alive(id) && !ze_is_user_zombie(id))
- iAliveH++
- if (iAliveH == target_index)
- return id
- }
- return -1
- }