Post by Gaspatcho on Dec 4, 2021 19:26:41 GMT
Note: :residentsleeper:
/*================================================================================
-------------------------------
-*- [ZP] Game Mode: The Hunting -*-
-------------------------------
This plugin is part of Zombie Plague Mod and is distributed under the
terms of the GNU General Public License. Check ZP_ReadMe.txt for details.
================================================================================*/
#include <amxmodx>
#include <amx_settings_api>
#include <cs_teams_api>
#include <cs_maxspeed_api>
#include <zp50_gamemodes>
#include <zp50_class_nightcrawler>
#include <zp50_deathmatch>
#include <fun>
#include <dhudmessage>
#include <zp50_grenade_frost>
#include <zp50_grenade_fire>
#include <zp50_ammopacks>
#include <hamsandwich>
#include <colorchat>
#include <engine>
// Settings file
new const ZP_SETTINGS_FILE[] = "zombieplague.ini"
// Default sounds
new const sound_nemesis[][] = { "zombie_plague/nemesis1.wav" , "zombie_plague/nemesis2.wav" }
#define SOUND_MAX_LENGTH 64
new Array:g_sound_nemesis
// HUD messages
#define HUD_EVENT_X -1.0
#define HUD_EVENT_Y 0.17
#define HUD_EVENT_R 255
#define HUD_EVENT_G 20
#define HUD_EVENT_B 20
new g_MaxPlayers
new g_HudSync
new g_TargetPlayer
new cvar_nemesis_chance, cvar_nemesis_min_players
new cvar_nemesis_show_hud, cvar_nemesis_sounds, iMainHunter[33]
new cvar_nemesis_allow_respawn, g_Hunting, gCount, kBlocked[33]
new hLose, gBlocked, gCvarSpeed
new Float:pCooldown[33]
public plugin_precache()
{
// Register game mode at precache (plugin gets paused after this)
register_plugin("[ZP] Game Mode: The Hunting", ZP_VERSION_STRING, "ZP Dev Team")
zp_gamemodes_register("The Hunting Mode")
register_clcmd("say /check", "check")
// Create the HUD Sync Objects
g_HudSync = CreateHudSyncObj()
g_MaxPlayers = get_maxplayers()
cvar_nemesis_chance = register_cvar("zp_nemesis_chance", "20")
cvar_nemesis_min_players = register_cvar("zp_nemesis_min_players", "0")
cvar_nemesis_show_hud = register_cvar("zp_nemesis_show_hud", "1")
cvar_nemesis_sounds = register_cvar("zp_nemesis_sounds", "1")
cvar_nemesis_allow_respawn = register_cvar("zp_nemesis_allow_respawn", "0")
gCvarSpeed = register_cvar("zp_hunter_speed", "1.1")
register_clcmd("drop","FreezingLight")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled", 1)
// Initialize arrays
g_sound_nemesis = ArrayCreate(SOUND_MAX_LENGTH, 1)
// Load from external file
amx_load_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "ROUND NEMESIS", g_sound_nemesis)
// If we couldn't load custom sounds from file, use and save default ones
new index
if (ArraySize(g_sound_nemesis) == 0)
{
for (index = 0; index < sizeof sound_nemesis; index++)
ArrayPushString(g_sound_nemesis, sound_nemesis[index])
// Save to external file
amx_save_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "ROUND NEMESIS", g_sound_nemesis)
}
// Precache sounds
new sound[SOUND_MAX_LENGTH]
for (index = 0; index < ArraySize(g_sound_nemesis); index++)
{
ArrayGetString(g_sound_nemesis, index, sound, charsmax(sound))
if (equal(sound[strlen(sound)-4], ".mp3"))
{
format(sound, charsmax(sound), "sound/%s", sound)
precache_generic(sound)
}
else
precache_sound(sound)
}
}
// Deathmatch module's player respawn forward
public zp_fw_deathmatch_respawn_pre(id)
{
// Respawning allowed?
if (!get_pcvar_num(cvar_nemesis_allow_respawn))
return PLUGIN_HANDLED;
return PLUGIN_CONTINUE;
}
public zp_fw_grenade_fire_pre(id)
{
if(iMainHunter[id] == 1)
return PLUGIN_HANDLED;
}
public zp_fw_grenade_frost_pre(id)
{
if(iMainHunter[id] == 1)
return PLUGIN_HANDLED;
}
public zp_fw_core_spawn_post(id)
{
// Always respawn as human on nemesis rounds
zp_core_respawn_as_zombie(id, false)
set_user_rendering(id)
kBlocked[id] = 0
}
public zp_fw_gamemodes_choose_pre(game_mode_id, skipchecks)
{
if (!skipchecks)
{
// Random chance
if (random_num(1, get_pcvar_num(cvar_nemesis_chance)) != 1)
return PLUGIN_HANDLED;
// Min players
if (GetAliveCount() < get_pcvar_num(cvar_nemesis_min_players))
return PLUGIN_HANDLED;
}
// Game mode allowed
return PLUGIN_CONTINUE;
}
public DealDamage(id)
{
if(g_Hunting == 0)
return;
if(gCount < 12)
{
gCount++
}
else
{
gCount = 0
gBlocked = 0
set_dhudmessage(255, 0, 0, -1.0, 0.4)
show_dhudmessage(0, "The Hunter is released!^nRun for your lives!")
}
Hurt_Humans(id)
set_task(15.0, "DealDamage", id)
}
public Hurt_Humans(id)
{
if(g_Hunting == 0)
return;
new iPlayer
for (iPlayer = 1; iPlayer <= 32; iPlayer++)
{
hLose = random_num(3,6)
if(!is_user_connected(iPlayer))
continue;
if(iMainHunter[iPlayer] == 1)
continue;
//set_user_health(iPlayer, get_user_health(iPlayer) - hLose)
if(get_user_health(iPlayer) > 10 && is_user_alive(iPlayer))
{
set_user_health(iPlayer, get_user_health(iPlayer) - hLose)
set_dhudmessage(255, 0, 0, -1.0, 0.01)
show_dhudmessage(iPlayer, "The Poision is killing you!")
}
else
{
if(is_user_alive(iPlayer))
{
user_silentkill(iPlayer)
make_deathmsg(id, iPlayer, 1, "Biggy Biggy Cock")
}
}
}
}
public zp_fw_gamemodes_choose_post(game_mode_id, target_player)
{
// Pick player randomly?
g_TargetPlayer = (target_player == RANDOM_TARGET_PLAYER) ? GetRandomAlive(random_num(1, GetAliveCount())) : target_player
}
public FreeHuman(id)
if(is_user_connected(id)) zp_grenade_frost_set(id, false)
public free_humans()
{
new id
for (id = 1; id <= g_MaxPlayers; id++)
{
// Not alive
if (!is_user_alive(id))
continue;
// This is our Nemesis
if (zp_core_is_zombie(id))
continue;
zp_grenade_frost_set(id, false)
}
}
public make_mini_hunter(g_Target)
{
zp_core_infect(g_Target, g_TargetPlayer)
set_user_health(g_Target, GetAliveCount() * 25)
set_user_rendering(g_Target, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 10)
}
public zp_fw_gamemodes_start()
{
// Turn player into nemesis
zp_core_force_infect(g_TargetPlayer)
g_Hunting = 1
set_task(15.0,"DealDamage",g_TargetPlayer)
set_user_rendering(g_TargetPlayer, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 5)
set_user_health(g_TargetPlayer, GetAliveCount() * 50)
msg_create_fog(150, 255, 150, 3)
next_health(g_TargetPlayer)
kBlocked[g_TargetPlayer] = 1
gCount++
gBlocked = 1
iMainHunter[g_TargetPlayer] = 1
cs_set_player_maxspeed_auto(g_TargetPlayer, 1.25)
set_user_gravity(g_TargetPlayer, 0.35)
ColorChat(g_TargetPlayer,GREEN,"[DS]^3 Press ^4G(drop)^3 to use your ability")
// Remaining players should be humans (CTs)
set_task(10.0,"free_humans")
new id
for (id = 1; id <= g_MaxPlayers; id++)
{
// Not alive
if (!is_user_alive(id))
continue;
// This is our Nemesis
if (zp_core_is_zombie(id))
continue;
// Switch to CT
cs_set_player_team(id, CS_TEAM_CT)
zp_grenade_frost_set(id, true)
ScreenFade(id, 2, {255,255,255}, 255)
}
// Play Nemesis sound
if (get_pcvar_num(cvar_nemesis_sounds))
{
new sound[SOUND_MAX_LENGTH]
ArrayGetString(g_sound_nemesis, random_num(0, ArraySize(g_sound_nemesis) - 1), sound, charsmax(sound))
PlaySoundToClients(sound)
}
if (get_pcvar_num(cvar_nemesis_show_hud))
{
// Show Nemesis HUD notice
new name[32]
get_user_name(g_TargetPlayer, name, charsmax(name))
set_hudmessage(HUD_EVENT_R, HUD_EVENT_G, HUD_EVENT_B, HUD_EVENT_X, HUD_EVENT_Y, 1, 0.0, 15.0, 1.0, 1.0, -1)
ShowSyncHudMsg(0, g_HudSync, "The Hunter is %s!^nHe is invisable & can't attack you right now!^nuse your grenades to catch it!^nHumans have 2 minutes to kill the hunter or everyone dies!", name)
}
}
public fw_PlayerKilled(victim, attacker, shouldgib)
{
if(!is_user_connected(attacker) || !is_user_connected(victim) || attacker == victim || !attacker)
return HAM_IGNORED
new Name[32]
if(zp_core_is_zombie(victim) && !zp_core_is_zombie(attacker))
{
get_user_name(attacker, Name, charsmax(Name))
ColorChat(0,GREEN,"[DS]^03 %s has gotten 25 Points for killing a hunter", Name)
zp_ammopacks_set(attacker, zp_ammopacks_get(attacker) + 25)
set_user_health(attacker, GetAliveCount() * 2)
}
return HAM_IGNORED
}
public zp_fw_gamemodes_end()
{
msg_create_fog(0, 0, 0, 0)
g_Hunting = 0
gCount = 0
new Name[32]
server_cmd("zp_nemesis_damage 250.0")
if(!zp_core_get_human_count())
{
set_dhudmessage(255, 0, 0, -1.0, -1.0)
show_dhudmessage(0, "Hunters have gotten 25 Points for winning the round", Name)
}
new id
for (id = 1; id <= g_MaxPlayers; id++)
{
if(is_user_connected(id)) kBlocked[id] = 0
if(is_user_connected(id)) set_user_rendering(id)
if(is_user_alive(id))
{
get_user_name(id, Name, charsmax(Name))
zp_ammopacks_set(id, zp_ammopacks_get(id) + 25)
}
iMainHunter[id] = 0
}
}
// Plays a sound on clients
PlaySoundToClients(const sound[])
{
if (equal(sound[strlen(sound)-4], ".mp3"))
client_cmd(0, "mp3 play ^"sound/%s^"", sound)
else
client_cmd(0, "spk ^"%s^"", sound)
}
// Get Alive Count -returns alive players number-
GetAliveCount()
{
new iAlive, id
for (id = 1; id <= g_MaxPlayers; id++)
{
if (is_user_alive(id))
iAlive++
}
return iAlive;
}
// Get Random Alive -returns index of alive player number target_index -
GetRandomAlive(target_index)
{
new iAlive, id
for (id = 1; id <= g_MaxPlayers; id++)
{
if (is_user_alive(id))
iAlive++
if (iAlive == target_index)
return id;
}
return -1;
}
// Ham Take Damage Forward
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
// Non-player damage or self damage
if (victim == attacker || !is_user_alive(attacker))
return HAM_IGNORED;
if(kBlocked[attacker] > 0 && gBlocked > 0)
{
print(attacker)
return HAM_SUPERCEDE;
}
if(!zp_core_is_last_human(victim) && iMainHunter[attacker] == 1 && gBlocked == 0)
{
zp_core_infect(victim, attacker)
make_mini_hunter(victim)
return HAM_IGNORED;
}
return HAM_IGNORED;
}
public next_health(id)
{
new gHealth = get_user_health(id)
new cHealth = GetAliveCount() * 25
new eHealth = GetAliveCount() * 3
new Float:nHeal = random_float(1.0,8.0)
if(!is_user_connected(id))
return;
if(!is_user_alive(id))
return;
if(gHealth <= cHealth)
{
set_user_health(id, gHealth + eHealth)
set_dhudmessage(255, 0, 0, -1.0, 0.01)
show_dhudmessage(id, "+ %d health", eHealth)
}
set_task(nHeal, "next_health", id)
}
public check(id)
{
set_dhudmessage(255, 0, 0, -1.0, 0.01)
show_dhudmessage(0, "gCount0 %d, gHunting0 %d, kBlocked0 %d", gCount, g_Hunting, kBlocked[id])
}
public print(id)
{
set_dhudmessage(255, 255, 255, -1.0, 0.01, 2, 6.0, 1.0)
show_dhudmessage(id, "You can't attack right now!^nHide and avoid getting killed by humans!")
}
stock msg_create_fog( iRed, iGreen, iBlue, iDensity )
{
// Fog density offsets [Thnx to DA]
new const fog_density[ ] = { 0, 0, 0, 0, 111, 18, 3, 58, 111, 18, 125, 58, 66, 96, 27, 59, 90, 101, 60, 59, 90,
101, 68, 59, 10, 41, 95, 59, 111, 18, 125, 59, 111, 18, 3, 60, 68, 116, 19, 60 }
// Get the amount of density
new dens
dens = ( 4 * iDensity )
// The fog message
message_begin( MSG_BROADCAST, get_user_msgid( "Fog" ), { 0,0,0 }, 0 )
write_byte( iRed ) // Red
write_byte( iGreen ) // Green
write_byte( iBlue ) // Blue
write_byte( fog_density[ dens ] ) // SD
write_byte( fog_density[ dens + 1 ] ) // ED
write_byte( fog_density[ dens + 2 ] ) // D1
write_byte( fog_density[ dens + 3 ] ) // D2
message_end( )
}
public FreezingLight(id)
{
if(!is_user_connected(id))
return;
if(!is_user_alive(id))
return;
if(!zp_core_is_zombie(id))
return;
if(iMainHunter[id] != 1)
return;
static Float:gTime, Float:cTime, Float:dTime, Float:pRange
gTime = get_gametime()
cTime = 25.0
pRange = random_float(500.0,1000.0)
if(gTime - cTime >= pCooldown[id])
{
for(new i = 1; i < get_maxplayers(); i++)
{
if(is_user_alive(i) && entity_range(i, id) <= pRange && !zp_core_is_zombie(i))
{
ScreenFade(i, 2, {255,255,255}, 255)
zp_grenade_frost_set(i,true)
set_task(5.0,"FreeHuman",i)
}
}
pCooldown[id] = gTime
}
}
stock ScreenFade(id, Timer, Colors[3], Alpha) {
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), _, id);
write_short((1<<12) * Timer)
write_short(1<<12)
write_short(0)
write_byte(Colors[0])
write_byte(Colors[1])
write_byte(Colors[2])
write_byte(Alpha)
message_end()
}