/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#define PLUGIN "He-Grenade_Game"
#define AUTHOR "RauliTop"
#define VERSION "1.1"
// Task IDs
#define TASK_TIME 200
#define TASK_SHOWHUD 300
#define ID_SHOWHUD (taskid - TASK_SHOWHUD)
#define TASK_REMOVE_PROTECTION 400
#define ID_REMOVE_PROTECTION (taskid - TASK_REMOVE_PROTECTION)
/*================================================================================
[Plugin Customization]
=================================================================================*/
// Sounds when round start and finish
new const sound_start[][] = { "misc/hgg_start.wav" }
new const sound_finish[][] = { "misc/hgg_end.wav" }
#define MAX_LVL 12
new const required_frags[MAX_LVL] = { 0, 2, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 }
new const weapon_name[MAX_LVL][] = { "Füst Gránát", "Vakító Gránát", "USP", "Deagle", "Elite", "Mac10", "MP5", "M3 Super 90", "Galil", "M4A1", "Scout", "AWP" }
new const weapon_ent[MAX_LVL][] = { "weapon_smokegrenade", "weapon_flashbang", "weapon_usp", "weapon_deagle", "weapon_elite", "weapon_mac10", "weapon_mp5navy", "weapon_m3", "weapon_galil", "weapon_m4a1", "weapon_scout", "weapon_awp" }
/*================================================================================
[Constants, No Customization!]
=================================================================================*/
// Max BP ammo for weapons
new const MAXBPAMMO[] = { -1, 52, -1, 90, 1, 32, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120,
30, 120, 200, 32, 90, 120, 90, 2, 35, 90, 90, -1, 100 }
// Ammo Type Names for weapons
new const AMMOTYPE[][] = { "", "357sig", "", "762nato", "", "buckshot", "", "45acp", "556nato", "", "9mm", "57mm", "45acp",
"556nato", "556nato", "556nato", "45acp", "9mm", "338magnum", "9mm", "556natobox", "buckshot",
"556nato", "9mm", "762nato", "", "50ae", "556nato", "762nato", "", "57mm" }
// Entities to remove
new const g_EntitiesObjetives[][] = { "info_hostage_rescue", "func_hostage_rescue", "hostage_entity", "monster_scientist",
"info_bomb_target", "func_bomb_target", "info_vip_start", "func_vip_safetyzone", "func_escapezone", "func_vehicle" }
/*================================================================================
[CVAR pointers]
=================================================================================*/
new cvar_roundtime, cvar_ammo, cvar_spawndelay, cvar_spawnprotection
/*================================================================================
[Global variables]
=================================================================================*/
new g_fwSpawn
new g_minutes, g_seconds
new g_MsgSync, g_MsgSync2, g_MsgSync3
new g_weaponlevel[33], g_respawn_timeleft[33]
/*================================================================================
[Precache and Init]
=================================================================================*/
public plugin_precache()
{
// Sounds
new i
for (i = 0; i < sizeof sound_start; i++)
engfunc(EngFunc_PrecacheSound, sound_start[i])
for (i = 0; i < sizeof sound_finish; i++)
engfunc(EngFunc_PrecacheSound, sound_finish[i])
// Prevent some entities from spawning
g_fwSpawn = register_forward(FM_Spawn, "fw_Spawn", 0)
}
public plugin_init()
{
// Register plugin call
register_plugin(PLUGIN, VERSION, AUTHOR)
// Events
register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
register_logevent("logevent_round_start",2, "1=Round_Start")
register_logevent("logevent_round_end", 2, "1=Round_End")
register_event("CurWeapon" , "Event_CurWeapon" , "be" , "1=1")
// Forwards
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
register_forward(FM_GetGameDescription, "fw_GetGameDescription")
register_forward(FM_SetModel, "fw_SetModel")
unregister_forward(FM_Spawn, g_fwSpawn)
// Message hooks
set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET)
register_message(get_user_msgid("StatusIcon"), "message_statusicon")
register_message(get_user_msgid("Scenario"), "message_scenario")
register_message(get_user_msgid("HostagePos"), "message_hostagepos")
register_message(get_user_msgid("TextMsg"), "message_textmsg")
register_message(get_user_msgid("SendAudio"), "message_sendaudio")
// CVARS
cvar_roundtime = register_cvar("hgg_roundtime", "400")
cvar_ammo = register_cvar("hgg_wpn_ammo", "0")
cvar_spawndelay = register_cvar("hgg_spawndelay", "5")
cvar_spawnprotection = register_cvar("hgg_spawnprotection", "5")
// Create the HUD Sync Objects
g_MsgSync = CreateHudSyncObj()
g_MsgSync2 = CreateHudSyncObj()
g_MsgSync3 = CreateHudSyncObj()
}
public plugin_cfg()
{
set_task(0.5, "event_round_start")
set_task(0.5, "logevent_round_start")
}
/*================================================================================
[Main Events]
=================================================================================*/
// Event Round Start
public event_round_start()
{
// Start time task
g_minutes = 0
g_seconds = get_pcvar_num(cvar_roundtime)
while (g_seconds > 60)
{
g_seconds -= 60
g_minutes++
}
set_task(1.0, "CheckTime", TASK_TIME, _, _, "b")
}
// Check time task
public CheckTime()
{
g_seconds--
if (g_seconds < 1 && g_minutes > 0)
{
g_minutes--
g_seconds += 59
}
// Time over
if (g_minutes == 0 && g_seconds < 1) server_cmd("sv_restart 3")
}
// Log Event Round Start
public logevent_round_start()
{
// Play start round sound
PlaySound(sound_start[random_num(0, charsmax(sound_start))])
}
// 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
// Get players
static iPlayers[32], iNum, iBestPlayer, i, id
get_players(iPlayers, iNum)
for (i = 0; i < iNum; i++)
{
id = iPlayers[i]
// Reset vars
g_weaponlevel[id] = 1
g_respawn_timeleft[id] = 0
// Select best player
if (!iBestPlayer)
iBestPlayer = iPlayers[0]
if (get_user_frags(id) > get_user_frags(iBestPlayer))
iBestPlayer = id
}
// Get best player's name and frags
static szName[32], frags
get_user_name(iBestPlayer, szName, charsmax(szName))
frags = get_user_frags(iBestPlayer)
// Win print message
client_print(0, print_chat, "[HGG] %s nyert ebben a körben felszerelést.", szName, frags)
// Win HUD
set_hudmessage(200, 0, 0, -1.0, 0.17, 1, 6.0, 1.0, 0.1, 6.0)
ShowSyncHudMsg(0, g_MsgSync, "%s nyert ebben a körben %d felszerelést!", szName, frags)
// Remove time task
remove_task(TASK_TIME)
// Play finish round sound
PlaySound(sound_finish[random_num(0, charsmax(sound_finish))])
}
// Plays a sound on clients
PlaySound(const sound[])
{
client_cmd(0, "spk ^"%s^"", sound)
}
// Current Weapon Event
public Event_CurWeapon(id)
{
// Not alive
if (!is_user_alive(id)) return;
new get_weapon = read_data(2)
// Already has grenade?
if (get_weapon == CSW_HEGRENADE) return;
set_task(0.5, "givehe", id)
}
// Simple, Give a HE Grenade
public givehe(id)
{
// Not alive
if (!is_user_alive(id)) return;
give_item(id, "weapon_hegrenade")
}
/*================================================================================
[Main Forwards]
=================================================================================*/
// Client joins the game
public client_putinserver(id)
{
// Initialize player vars
g_weaponlevel[id] = 1
g_respawn_timeleft[id] = 0
// Set player HUD task
set_task(1.0, "ShowHUD", id+TASK_SHOWHUD, _, _, "b")
}
// Client disconnect
public client_disconnect(id)
{
// Remove tasks
remove_task(id+TASK_SHOWHUD)
remove_task(id+TASK_REMOVE_PROTECTION)
}
// Entity Spawn Forward
public fw_Spawn(entity)
{
// Invalid entity
if (!pev_valid(entity)) return FMRES_IGNORED;
// Get classname
new classname[32]
pev(entity, pev_classname, classname, charsmax(classname))
// Check whether it needs to be removed
for (new i = 0; i < sizeof g_EntitiesObjetives; i++)
{
if (equal(classname, g_EntitiesObjetives[i]))
{
engfunc(EngFunc_RemoveEntity, entity)
return FMRES_SUPERCEDE;
}
}
return FMRES_IGNORED;
}
// Ham Player Spawn Post Forward
public fw_PlayerSpawn_Post(id)
{
// Not alive
if (!is_user_alive(id)) return;
// Remove weapons
set_task(0.1, "remove_weapons", id)
// Give extra weapon
set_task(1.0, "give_extra_weapon", id)
}
// Ham Player Killed Forward
public fw_PlayerKilled(victim, killer)
{
// Respawn player died
begin_respawn(victim)
// Remove tasks
remove_task(victim+TASK_REMOVE_PROTECTION)
// Determine whether the player killed himself
static selfkill
selfkill = (victim == killer || !is_user_connected(killer)) ? true : false
// Killed by a non-player entity or self killed
if (selfkill) return;
// Check level killer
update_level(killer)
}
// Forward Get Game Description
public fw_GetGameDescription()
{
// Return the mod name
forward_return(FMV_STRING, "He-Grenade Game")
return FMRES_SUPERCEDE;
}
// Forward Set Model
public fw_SetModel(entity, model[])
{
// Get owner entity
new owner = pev(entity,pev_owner)
// No owner?
if (!is_user_connected(owner)) return FMRES_IGNORED;
// If owner is dead, remove it
if (get_user_health(owner) <= 0)
{
dllfunc(DLLFunc_Think,entity)
return FMRES_SUPERCEDE;
}
// Get entity's classname
static class[10]
pev(entity, pev_classname, class, charsmax(class))
// Check if it's a weapon box
if (equal(class, "weaponbox"))
{
// They get automatically removed when thinking
set_pev(entity, pev_nextthink, get_gametime())
}
return FMRES_IGNORED;
}
// Hud Task
public ShowHUD(taskid)
{
static id
id = ID_SHOWHUD
// Player died?
if (!is_user_alive(id))
{
// Get spectating target
id = pev(id, pev_iuser2)
// Target not alive
if (!is_user_alive(id)) return;
}
// Get minutes left
static minutes[4]
num_to_str(g_minutes, minutes, charsmax(minutes))
// Spectating someone else?
if (id != ID_SHOWHUD)
{
set_hudmessage(200, 200, 200, 0.03, 0.23, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(id, g_MsgSync2, "Szint: %d^nFelszerelés: %d^nExtra Fegyver: %s^nHátralévõ idõ: %s%s%d seconds", g_weaponlevel[id], get_user_frags(id), weapon_name[g_weaponlevel[id]-1], g_minutes > 0 ? minutes : "", g_minutes > 0 ? " minutes " : "", g_seconds)
}
else
{
set_hudmessage(200, 200, 200, 0.03, 0.23, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync2, "Szint: %d^nFelszerelés: %d^nExtra Fegyver: %s^nHátralévõ idõ: %s%s%d seconds", g_weaponlevel[ID_SHOWHUD], get_user_frags(ID_SHOWHUD), weapon_name[g_weaponlevel[ID_SHOWHUD]-1], g_minutes > 0 ? minutes : "", g_minutes > 0 ? " minutes " : "", g_seconds)
}
}
// Update level
update_level(id)
{
static level; level = g_weaponlevel[id]
// Gheck required frags to level up
while (get_user_frags(id) >= required_frags[g_weaponlevel[id]-1] && g_weaponlevel[id] < MAX_LVL)
{
// Level up
g_weaponlevel[id]++
// Update weapon
set_task(0.1, "remove_weapons", id)
set_task(0.5, "give_extra_weapon", id)
}
// Only show one message if level up more than one
if (g_weaponlevel[id] > level)
client_print(id, print_chat, "[HGG] Gratulálunk! Szintet léptél: %d", g_weaponlevel[id])
// Max. level
if (g_weaponlevel[id] >= MAX_LVL) server_cmd("sv_restart 3")
}
// Remove weapons
public remove_weapons(id)
{
// Not alive
if (!is_user_alive(id)) return;
strip_user_weapons(id)
give_item(id, "weapon_knife")
give_item(id, "weapon_hegrenade")
}
// Give extra weapon
public give_extra_weapon(id)
{
// Not alive
if (!is_user_alive(id)) return;
// Get the weapon level and id
new weapon = g_weaponlevel[id]-1
new weapon_id = get_weaponid(weapon_ent[weapon])
// Give weapon with ammo
give_item(id, weapon_ent[weapon])
if (get_pcvar_num(cvar_ammo)) ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[weapon_id], AMMOTYPE[weapon_id], MAXBPAMMO[weapon_id])
}
// Before respawn
begin_respawn(id)
{
// Not connected or already alive
if (!is_user_connected(id) || is_user_alive(id)) return;
// Get spawn delay cvar
new Float:delay = get_pcvar_float(cvar_spawndelay)
if (delay < 0.1) delay = 0.1
g_respawn_timeleft[id] = floatround(delay)
// Countdown message
respawn_countdown(id)
// Respawn player
set_task(delay, "respawn", id)
}
// Show respawn countdown to a player
public respawn_countdown(id)
{
// Not connected or already alive
if (!is_user_connected(id) || is_user_alive(id))
{
g_respawn_timeleft[id] = 0
return;
}
set_hudmessage(255, 255, 255, -1.0, 0.75, 0, 6.0, 1.0, 0.1, 0.5)
ShowSyncHudMsg(id, g_MsgSync3, "Újraéledés %d másodperc %s", g_respawn_timeleft[id], g_respawn_timeleft[id] > 1 ? "s" : "")
if (--g_respawn_timeleft[id] >= 1) set_task(1.0, "respawn_countdown", id)
}
// Make respawn
public respawn(id)
{
// Not connected or already alive
if (!is_user_connected(id) || is_user_alive(id)) return;
// Respawn player
ExecuteHamB(Ham_CS_RoundRespawn, id)
// Get spawn protection cvar
new Float:time = get_pcvar_float(cvar_spawnprotection)
// Spawn protection
if (time > 0.0)
{
set_user_godmode(id, 1)
set_rendering(id, kRenderFxGlowShell, 200, 200, 100, kRenderNormal, 8) // goldenish
set_task(time, "remove_spawn_protection", id+TASK_REMOVE_PROTECTION)
}
}
// Spawn protection effects
public remove_spawn_protection(taskid)
{
static id
id = ID_REMOVE_PROTECTION
// Not connected
if (!is_user_connected(id)) return;
// Stop protection
set_user_godmode(id, 0)
set_rendering(id)
}
/*================================================================================
[Message hooks]
=================================================================================*/
// Block some icons
public message_statusicon(msgid, msgdest, id)
{
static szIcon[8]
get_msg_arg_string(2, szIcon, charsmax(szIcon))
if (equal(szIcon, "buyzone") && get_msg_arg_int(1))
{
set_pdata_int(id, 235, get_pdata_int(id, 235) & ~(1<<0))
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 or commencing
if (equal(textmsg, "#Game_will_restart_in") || equal(textmsg, "#Game_Commencing"))
{
logevent_round_end()
}
// 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;
}
if (get_msg_args() != 5) return PLUGIN_CONTINUE;
get_msg_arg_string(5, textmsg, charsmax(textmsg))
// Block grenade messages
if (equal(textmsg, "#Fire_in_the_hole") || equal(textmsg, "%s (RÁDIÓ): MEGY A GRÁNÁT!"))
{
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
// Block CS round win and grenades audio messages
public message_sendaudio()
{
static audio[17], string[24]
get_msg_arg_string(2, audio, charsmax(audio))
get_msg_arg_string(2, string, charsmax(string))
if (equal(audio[7], "terwin") || equal(audio[7], "ctwin") || equal(audio[7], "rounddraw") || equal(string, "%!MRAD_FIREINHOLE"))
return PLUGIN_HANDLED;
return PLUGIN_CONTINUE;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
*/