/* AMX Mod X
* Snowball war
*
* / \ / \ ___________________________
* / / \_/ \ \ / \
* \__/\ /\__/ / GIVE ME A CARROT OR I WILL \
* \O O/ \ BLOW UP YOUR HOUSE /
* ___/ ^ \___ / ___________________________/
* \___/ /_/
* _/ \_
* __// \\__
* /___\/_\/___\
*
* (c) Copyright 2008 by FakeNick
*
* This file is provided as is (no warranties)
*
* DESCRIPTION
* My plugin is changing an HE grenade for snowball. When player spawns he receives only
* knife and HE. When snowball hit's wall it will explode with nice spalt effect.
* In this mod there are two teams : blue (CT's) and red (T's). They must kill their opponents
* with snowball. When player gets hit, his health is decreasing and there's
* a chance that player will be chilled. In this mod target is to kill your opponents,soldier!
* Snowball war includes very simple deathmatch (default off). It is also changing players models
* to santa's (T's) and snow soldiers (CT's) - this model can be changed by plugin user.
* Snowball war enables snow effect on server (comment line 171 to disable).
*
* MODULES
* fakemeta
* hamsandwich
*
* CVARS
* sw_toggle - is mod on/off? (default ON - 1)
* sw_friendly - is friendly fire on/off? (default OFF - 0)
* sw_damage - damage done by snowball (default 100)
* sw_life - life of snowball splat (default 3.0)
* sw_dm - is deathmatch on/off? (defualt OFF - 0)
* sw_dm_time - time to respawn (default 2.0)
* sw_chill_chance - chance to chill player (from 0 - off, to 100 - maximum chance, default 30)
* sw_chill_duration - duration of chill (default 5.0)
* sw_chill_speed - percentage of speed that player receives when chilled (default 50.0)
* sw_snowball_gravity - gravity of snowball (default 0.3)
* sw_snowball_velocity - how many times snowball velocity will be multipied (default 2.0 times)
* sw_crosshair_remove - will be crosshair removed (default ON - 1)
* sw_spawn_protection - is spawn protection on? (default ON - 1)
* sw_spawn_protection_time - time of spawn protection (default 3.0)
*
*
* Changelog
* Version 3.0 :
* - Initial release
*
* Version 3.01 :
* - Added game description changer
*
* Version 3.02 :
* - Added change velocity of snowball
* - Added change gravity of snowball
* - Added crsoshair remover for more realism
*
* Version 3.03 :
* - Added breaking glass when unchilling player
* - Added random snow skybox generator
* - Added spawn protection
*
* Version 3.04 :
* - Fixed server crashing bug
*
* Version 3.05 :
* - Added support for bots (code from ZP)
*
* Fordította: BBk
*/
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>
#include <fakemeta_util>
/*================================================================================
[Plugin Customization]
=================================================================================*/
//Do not touch this!
new const model_nade_world[] = "models/sw/w_snowball.mdl"
new const model_nade_view[] = "models/sw/v_snowball.mdl"
new const model_nade_player[] = "models/sw/p_snowball.mdl"
new const model_splash[] = "sprites/bhit.spr"
//Randomly chosen models and sounds, add as many, as you want
new const model_red[][] = { "red1" }
new const model_blue[][] = { "blue1" }
new const sound_pain[][] = { "player/pl_pain2.wav","player/pl_pain4.wav","player/pl_pain5.wav","player/pl_pain6.wav","player/pl_pain7.wav" }
new const sound_hit[][] = { "player/pl_snow1.wav","player/pl_snow2.wav","player/pl_snow3.wav","player/pl_snow4.wav","player/pl_snow5.wav","player/pl_snow6.wav" }
new const sound_chill[][] = { "sw/chill.wav" }
new const sound_unchill[][] = { "sw/unchill.wav" }
new const sound_win_blue[][] = { "sw/blue1.wav" }
new const sound_win_red[][] = { "sw/red1.wav" }
new const sound_win_no_one[][] = { "sw/draw.wav" }
/*================================================================================
[CUSTOMIZATION ENDS HERE!]
=================================================================================*/
/*================================================================================
[Enums]
=================================================================================*/
enum(+=100)
{
TASK_WELCOME = 100,
TASK_AMMO,
TASK_RESPAWN,
TASK_UNCHILL,
TASK_MODEL,
TASK_GOD
}
enum
{
CS_TEAM_UNASSIGNED = 0,
CS_TEAM_T,
CS_TEAM_CT,
CS_TEAM_SPECTATOR
}
/*================================================================================
[Pcvars]
=================================================================================*/
new pcvar_on,pcvar_friendly,pcvar_dmg,pcvar_life,pcvar_dm,pcvar_dm_time,pcvar_chill_chance,
pcvar_chill_duration,pcvar_chill_speed,pcvar_gravity,pcvar_velocity,pcvar_crosshair,
pcvar_spawn,pcvar_spawn_duration,pcvar_bots
/*================================================================================
[Player variables]
=================================================================================*/
new g_red[33],g_blue[33],g_IsChilled[33],Float:g_maxspeed[33],Float:g_ChillySpeed[33],
g_has_custom_model[33],g_player_model[33][32],g_god[33],g_bots
/*================================================================================
[Global Variables]
=================================================================================*/
new g_money,g_weapon,g_crosshair,g_fwSpawn,g_sync,g_maxplayers,g_death,g_endround,
g_spray,g_glass,g_drop,gmsgScreenFade,Float:g_models_counter
//This can affect gameplay
new const g_not_needed[][] =
{
"weaponbox",
"armoury_entity",
"grenade",
"func_bomb_target",
"info_bomb_target",
"info_vip_start",
"func_vip_safetyzone",
"func_escapezone",
"hostage_entity",
"monster_scientist",
"func_hostage_rescue",
"info_hostage_rescue"
}
//Grenade bounce sounds
new const g_bouncelist[4][64] =
{
"weapons/grenade_hit1.wav",
"weapons/grenade_hit2.wav",
"weapons/grenade_hit3.wav",
"weapons/he_bounce-1.wav"
}
//Mod name
new const g_modname[] = "Snowball war"
//Skyboxes
new const g_skybox[][] = { "snow","office" }
/*================================================================================
[Offsets and Constants]
=================================================================================*/
#if cellbits == 32
const OFFSET_CSTEAMS = 114
const OFFSET_CSMONEY = 115
const OFFSET_HE_AMMO = 388
#else
const OFFSET_CSTEAMS = 139
const OFFSET_CSMONEY = 140
const OFFSET_HE_AMMO = 437
#endif
const OFFSET_LINUX = 5
//To hide money displaying
const HIDE_MONEY = (1<<5)
//To hide crosshair
const HIDE_CROSSHAIR = (1<<6)
//For screen fade
const FFADE_IN = 0x0000
//For break glass effect
const BREAK_GLASS = 0x01
//Snow effect on server. Comment this line to disable
#define EFFECT_SNOW
//If you experience many SVC_BAD kicks. increase this (for example set it to 0.5)
const Float:MODEL_DELAY = 0.2
//Version information
new const VERSION[] = "3.05"
/*================================================================================
[Code <!-- s;) --><img src=\"{SMILIES_PATH}/icon_e_wink.gif\" alt=\";)\" title=\"kacsintás\" /><!-- s;) -->]
=================================================================================*/
public plugin_precache()
{
new a,modelpath[200]
for(a = 0; a < sizeof sound_win_blue; a++)
engfunc(EngFunc_PrecacheSound,sound_win_blue[a])
for(a = 0; a < sizeof sound_win_blue; a++)
engfunc(EngFunc_PrecacheSound,sound_win_red[a])
for(a = 0; a < sizeof sound_win_blue; a++)
engfunc(EngFunc_PrecacheSound,sound_win_no_one[a])
for(a = 0; a < sizeof sound_pain; a++)
engfunc(EngFunc_PrecacheSound,sound_pain[a])
for(a = 0; a < sizeof sound_hit; a++)
engfunc(EngFunc_PrecacheSound,sound_hit[a])
for(a = 0; a < sizeof sound_chill; a++)
engfunc(EngFunc_PrecacheSound,sound_chill[a])
for(a = 0; a < sizeof sound_unchill; a++)
engfunc(EngFunc_PrecacheSound,sound_unchill[a])
for(a = 0;a < sizeof model_blue; a++)
{
formatex(modelpath, sizeof modelpath - 1, "models/player/%s/%s.mdl", model_blue[a], model_blue[a])
engfunc(EngFunc_PrecacheModel,modelpath)
}
for(a = 0;a < sizeof model_red; a++)
{
formatex(modelpath, sizeof modelpath - 1, "models/player/%s/%s.mdl", model_red[a], model_red[a])
engfunc(EngFunc_PrecacheModel,modelpath)
}
engfunc(EngFunc_PrecacheModel,model_nade_world)
engfunc(EngFunc_PrecacheModel,model_nade_view)
engfunc(EngFunc_PrecacheModel,model_nade_player)
engfunc(EngFunc_PrecacheModel,model_splash)
g_drop = engfunc(EngFunc_PrecacheModel,"sprites/blood.spr")
g_spray = engfunc(EngFunc_PrecacheModel,"sprites/bloodspray.spr")
g_glass = engfunc(EngFunc_PrecacheModel,"models/glassgibs.mdl")
#if defined EFFECT_SNOW
engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_snow"))
#endif
//Fake hostage to force round ending
new ent
ent = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"hostage_entity"))
if(pev_valid(ent))
{
engfunc(EngFunc_SetOrigin, ent, Float:{8192.0 ,8192.0 ,8192.0})
dllfunc(DLLFunc_Spawn, ent)
}
//Prevent some etnities form spawning
g_fwSpawn = register_forward(FM_Spawn,"fw_SpawnEntity")
}
public plugin_init()
{
register_plugin("Snowball war", VERSION, "FakeNick")
pcvar_on = register_cvar("sw_toggle","1")
//Make sure that plugin is on
if(!get_pcvar_num(pcvar_on))
return
//Register dictionary
register_dictionary("sw.txt")
//Events
register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
register_event("CurWeapon","event_modelchange","be","1=1")
register_logevent("logevent_round_end",2,"1=Round_End")
//Forwards
RegisterHam(Ham_Spawn,"player","fw_PlayerSpawn",1)
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
register_forward(FM_SetModel,"fw_SetModel")
register_forward(FM_Touch,"fw_Touch")
register_forward(FM_EmitSound,"fw_EmitSound")
register_forward(FM_Think,"fw_Think")
register_forward(FM_SetClientKeyValue, "fw_SetClientKeyValue")
register_forward(FM_ClientUserInfoChanged, "fw_ClientUserInfoChanged")
register_forward(FM_GetGameDescription,"fw_GameDesc")
unregister_forward(FM_Spawn,g_fwSpawn)
//Pcvars
pcvar_friendly = register_cvar("sw_friendly","0")
pcvar_dmg = register_cvar("sw_damage","100")
pcvar_life = register_cvar("sw_life","3.0")
pcvar_dm = register_cvar("sw_dm","0")
pcvar_dm_time = register_cvar("sw_dm_time","2.0")
pcvar_chill_chance = register_cvar("sw_chill_chance","30")
pcvar_chill_duration = register_cvar("sw_chill_duration","5.0")
pcvar_chill_speed = register_cvar("sw_chill_speed","50.0")
pcvar_gravity = register_cvar("sw_snowball_gravity","0.3")
pcvar_velocity = register_cvar("sw_snowball_velocity","2.0")
pcvar_crosshair = register_cvar("sw_crosshair_remove","1")
pcvar_spawn = register_cvar("sw_spawn_protection","1")
pcvar_spawn_duration = register_cvar("sw_spawn_protection_time","3.0")
pcvar_bots = get_cvar_pointer("bot_quota")
//For version recognize and see what server is running this plugin
register_cvar("sw_version",VERSION,FCVAR_SERVER | FCVAR_SPONLY)
//Set skybox
set_cvar_string("sv_skyname", g_skybox[random_num(0, sizeof g_skybox - 1)])
//Other stuff
g_money = get_user_msgid("Money")
g_weapon = get_user_msgid("HideWeapon")
g_crosshair = get_user_msgid("Crosshair")
g_death = get_user_msgid("DeathMsg")
gmsgScreenFade = get_user_msgid("ScreenFade")
g_sync = CreateHudSyncObj()
g_maxplayers = get_maxplayers()
//Messsages
register_message(get_user_msgid("TextMsg"), "message_textmsg")
register_message(get_user_msgid("SendAudio"),"message_audio")
register_message(get_user_msgid("HostagePos"), "message_hostagepos")
register_message(get_user_msgid("Scenario"), "message_scenario")
}
public plugin_cfg()
{
// Get configs dir
new cfgdir[32],file[192]
get_configsdir(cfgdir, sizeof cfgdir - 1)
formatex(file,sizeof file - 1,"%s/sw.cfg",cfgdir)
if(file_exists(file))
{
// Execute config file (sw.cfg)
server_cmd("exec %s", file)
}else{
log_amx("[SW] Snowball War config file doesn't exist!")
}
}
/*================================================================================
[Events]
=================================================================================*/
public event_round_start()
{
//It's not round end
g_endround = false
//Reset models counter
g_models_counter = 0.0
//Remove old welcome task and make a new one
remove_task(TASK_WELCOME)
set_task(2.5,"func_welcome",TASK_WELCOME)
}
public event_modelchange(id)
{
new weapon = read_data(2)
if(weapon == CSW_HEGRENADE)
{
//Set view model and player model
set_pev(id,pev_viewmodel2,model_nade_view)
set_pev(id,pev_weaponmodel2,model_nade_world)
//Remove crosshair
if(get_pcvar_num(pcvar_crosshair))
{
message_begin( MSG_ONE_UNRELIABLE, g_weapon, _, id )
write_byte(HIDE_CROSSHAIR)
message_end()
}
}
}
public logevent_round_end()
{
// Prevent this from getting called twice when restarting (bugfix)
static Float:last
if (get_gametime() - last < 0.5) return;
last = get_gametime()
g_endround = true
// Show HUD notice, play win sound
if (!sw_GetBlue())
{
//Red team wins
set_hudmessage(200, 0, 0, -1.0, 0.17, 0, 0.0, 3.0, 2.0, 1.0, -1)
ShowSyncHudMsg(0, g_sync, "%L", LANG_PLAYER, "WIN_RED")
// Play win sound
sw_sound(sound_win_red[random_num(0, sizeof sound_win_red -1)])
}
else if (!sw_GetRed())
{
//Blue team wins
set_hudmessage(0, 0, 200, -1.0, 0.17, 0, 0.0, 3.0, 2.0, 1.0, -1)
ShowSyncHudMsg(0, g_sync, "%L", LANG_PLAYER, "WIN_BLUE")
// Play win sound
sw_sound(sound_win_blue[random_num(0, sizeof sound_win_blue -1)])
}
else
{
// No one wins
set_hudmessage(0, 200, 0, -1.0, 0.17, 0, 0.0, 3.0, 2.0, 1.0, -1)
ShowSyncHudMsg(0, g_sync, "%L", LANG_PLAYER, "WIN_NO_ONE")
sw_sound(sound_win_no_one[random_num(0, sizeof sound_win_no_one -1)])
}
}
/*================================================================================
[Main Part]
=================================================================================*/
public func_welcome()
{
client_print(0,print_chat,"%L",LANG_PLAYER,"MSG_WELCOME",VERSION)
}
public client_connect(id)
{
if(!get_pcvar_num(pcvar_on))
return
#if defined EFFECT_SNOW
client_cmd(id, "cl_weather 1")
#endif
}
public client_putinserver(id)
{
// Plugin disabled?
if (!get_pcvar_num(pcvar_on))
return;
// Initialize player vars
g_IsChilled[id] = false
g_blue[id] = false
g_red[id]= false
g_god[id] = false
// CZ bots seem to use a different "classtype" for player entities
// (or something like that) which needs to be hooked separately
if (!g_bots && pcvar_bots && is_user_bot(id))
{
// Set a task to let the private data initialize
set_task(0.1, "task_bots", id)
}
}
public client_disconnect(id)
{
if(!get_pcvar_num(pcvar_on))
return
g_IsChilled[id] = false
g_blue[id] = false
g_red[id]= false
g_god[id] = false
}
/*================================================================================
[Forwards]
=================================================================================*/
public fw_PlayerSpawn(id)
{
if(!is_user_alive(id))
return
g_blue[id] = false
g_red[id] = false
g_IsChilled[id] = false
g_god[id] = false
//Strip player weapons
fm_strip_user_weapons(id)
//Give him knife and "snowball"
fm_give_item(id,"weapon_knife")
fm_give_item(id,"weapon_hegrenade")
//Reset his model
sw_reset_user_model(id)
//Strip his cash ;]
sw_set_user_money(id,0,0)
//Hide money displaying
sw_money(id)
//Set his team variable
switch(sw_get_user_team(id))
{
case CS_TEAM_CT : g_blue[id] = true
case CS_TEAM_T : g_red[id] = true
}
//Set his new model
remove_task(id + TASK_MODEL)
// Store our custom model in g_player_model[id]
if(g_blue[id])
{
copy(g_player_model[id], sizeof g_player_model[] - 1, model_blue[random_num(0, sizeof model_blue -1)])
}else if(g_red[id])
{
copy(g_player_model[id], sizeof g_player_model[] - 1, model_red[random_num(0, sizeof model_red -1)])
}
// Get the current model
new currentmodel[32]
sw_get_user_model(id, currentmodel, sizeof currentmodel - 1)
// Check whether it matches the custom model
if (!equal(currentmodel, g_player_model[id]))
{
// If not, set a task to change it
set_task(1.0 + g_models_counter, "task_set_model", id + TASK_MODEL)
// Add a delay between every model change
g_models_counter += MODEL_DELAY
}
//Check if spawn protection is on
if(get_pcvar_num(pcvar_spawn))
{
//Set god
g_god[id] = true
//Remove an old task and make a new one
remove_task(id + TASK_GOD)
set_task(get_pcvar_float(pcvar_spawn_duration),"task_UnGod",id + TASK_GOD)
//Set glow
switch(sw_get_user_team(id))
{
case CS_TEAM_CT : fm_set_user_rendering(id,kRenderFxGlowShell,0,0,255,kRenderNormal,25)
case CS_TEAM_T : fm_set_user_rendering(id,kRenderFxGlowShell,255,0,0,kRenderNormal,25)
}
}
}
public fw_SpawnEntity(entity)
{
// Invalid entity
if (!pev_valid(entity)) return FMRES_IGNORED
// Get classname
new classname[32]
pev(entity, pev_classname, classname, sizeof classname - 1)
// Check whether it needs to be removed
for (new i = 0; i < sizeof g_not_needed; i++)
{
if (equal(classname, g_not_needed[i]))
{
engfunc(EngFunc_RemoveEntity, entity)
return FMRES_SUPERCEDE
}
}
return FMRES_IGNORED
}
public fw_SetModel(ent,const model[])
{
//Check ent validity
if(!pev_valid(ent))
return FMRES_IGNORED
//If model is equal to HE model, change it to snowball model
if(equali(model,"models/w_hegrenade.mdl"))
{
//get owner to renew his ammo
new Float:velocity[3],owner = pev(ent,pev_owner)
//remove an old task an set a new one
remove_task(owner + TASK_AMMO)
set_task(0.01,"task_ammo",owner + TASK_AMMO)
//Set model
engfunc(EngFunc_SetModel,ent,model_nade_world)
//Block from exploding
set_pev(ent, pev_dmgtime, get_gametime() + 9999.0)
//Set less gravity, so it will be "real" snowball
set_pev(ent,pev_gravity,get_pcvar_float(pcvar_gravity))
//Get grenade velocity
pev(ent, pev_velocity, velocity)
//Calculate new velocity
velocity[0] *= get_pcvar_float(pcvar_velocity)
velocity[1] *= get_pcvar_float(pcvar_velocity)
velocity[2] *= get_pcvar_float(pcvar_velocity)
//Set new velocity
set_pev(ent, pev_velocity,velocity)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
public fw_Touch(ent,id)
{
if(!pev_valid(ent))
return FMRES_IGNORED
//Create some variables
new classname[20],classname2[20],Float:origin[3],owner = pev(ent,pev_owner)
pev(ent,pev_origin,origin)
pev(id,pev_classname,classname2,sizeof classname2 - 1)
pev(ent,pev_classname,classname,sizeof classname - 1)
//Player get's hit
if(equali(classname,"grenade") && equali(classname2,"player"))
{
if(is_user_alive(id))
{
//Check friendly fire
if (get_user_team(owner) == get_user_team(id))
if (!get_pcvar_num(pcvar_friendly))
return FMRES_IGNORED
//Check god mode
if(g_god[id])
return FMRES_IGNORED
if(get_user_health(id) > get_pcvar_float(pcvar_dmg))
{
//Players health is greater than snowball damage
//Calculate chill chance
if(random_num(0,100) <= get_pcvar_num(pcvar_chill_chance))
{
//Chill only non-chilled player
if(!g_IsChilled[id])
{
//Emit sound
engfunc(EngFunc_EmitSound,id,CHAN_AUTO,sound_chill[random_num(0, sizeof sound_chill - 1)],1.0,ATTN_NORM,0,PITCH_NORM)
//Make light effect
sw_light(origin)
//Chill him!
sw_ChillPlayer(id)
//Set unchill task
remove_task(id + TASK_UNCHILL)
set_task(get_pcvar_float(pcvar_chill_duration),"task_UnChill",id + TASK_UNCHILL)
}
}
//Create nice effect
sw_effect(origin)
//Emit pain sound
engfunc(EngFunc_EmitSound,id,CHAN_VOICE,sound_pain[random_num(0, sizeof sound_pain - 1)],1.0,ATTN_NORM,0,PITCH_NORM)
//Emit hit sound
engfunc(EngFunc_EmitSound,ent,CHAN_AUTO,sound_hit[random_num(0, sizeof sound_hit - 1)],1.0,ATTN_NORM,0,PITCH_NORM)
//Do damage to player
fm_set_user_health(id, get_user_health(id) - floatround(get_pcvar_float(pcvar_dmg)))
//Make white splash
sw_splash(ent,origin)
}else if(get_user_health(id) <= get_pcvar_float(pcvar_dmg))
{
//Players health is lower or equal to snowball damage
//Emit hit sound
engfunc(EngFunc_EmitSound,ent,CHAN_AUTO,sound_hit[random_num(0, sizeof sound_hit - 1)],1.0,ATTN_NORM,0,PITCH_NORM)
//Make nice effect
sw_effect(origin)
//Remove entity
engfunc(EngFunc_RemoveEntity,ent)
//Kill player
sw_kill(owner,id,"snowball",0)
}
}else{
//Snowball hits something (not player)
sw_splash(ent,origin)
}
}else if(equali(classname,"grenade"))
{
sw_effect(origin)
//Snowball hit's something, f.e. wall, etc.
sw_splash(ent,origin)
//Emit hit sound
engfunc(EngFunc_EmitSound,ent,CHAN_AUTO,sound_hit[random_num(0, sizeof sound_hit - 1)],1.0,ATTN_NORM,0,PITCH_NORM)
}
return FMRES_IGNORED
}
public fw_EmitSound(ent,channel,const sound[])
{
//Check if emited sound is equal to one for our list
for(new a; a < sizeof g_bouncelist;a++)
{
//If it's equal - block it
if(equali(sound,g_bouncelist[a]))
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
public fw_Think(ent)
{
//Check validity
if(!pev_valid(ent))
return FMRES_IGNORED
//Retrieve class
static class[20]
pev(ent,pev_classname,class,sizeof class - 1)
//If class is equal to snow_splash, remove entity
if(equali(class,"snow_splash"))
engfunc(EngFunc_RemoveEntity,ent)
return FMRES_IGNORED
}
public fw_SetClientKeyValue(id, const infobuffer[], const key[])
{
// Block CS model changes
if (g_has_custom_model[id] && equal(key, "model"))
return FMRES_SUPERCEDE
return FMRES_IGNORED
}
public fw_ClientUserInfoChanged(id)
{
// Player doesn't have a custom model
if (!g_has_custom_model[id])
return FMRES_IGNORED
// Get current model
static currentmodel[32]
sw_get_user_model(id, currentmodel, sizeof currentmodel - 1)
// Check whether it matches the custom model - if not, set it again
if (!equal(currentmodel, g_player_model[id]))
sw_set_user_model(id, g_player_model[id])
return FMRES_IGNORED
}
public fw_PlayerKilled(victim, attacker, shouldgib)
{
//Check if deathmatch is on
if(!get_pcvar_num(pcvar_dm))
return
//Make sure that it's not round end
if(!g_endround)
{
remove_task(victim + TASK_RESPAWN)
set_task(get_pcvar_float(pcvar_dm_time),"task_respawn",victim + TASK_RESPAWN)
}
}
//Block knife damage
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
// Non-player damage or self damage
if (victim == attacker || !is_user_connected(attacker))
return HAM_IGNORED
return HAM_SUPERCEDE
}
//Change game name
public fw_GameDesc()
{
forward_return(FMV_STRING,g_modname)
return FMRES_SUPERCEDE
}
/*================================================================================
[Messages]
=================================================================================*/
// Block some text messages
public message_textmsg()
{
static textmsg[22]
get_msg_arg_string(2, textmsg, sizeof textmsg - 1)
// Game restarting, reset scores and call round end to balance the teams
if (equal(textmsg, "#Game_will_restart_in"))
{
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
}
//Block "Fire in the hole!" text
if(get_msg_args() == 5)
{
if(get_msg_argtype(5) == ARG_STRING)
{
new value5[64]
get_msg_arg_string(5 ,value5 ,63)
if(equal(value5, "#Fire_in_the_hole"))
{
return PLUGIN_HANDLED
}
}
}
else if(get_msg_args() == 6)
{
if(get_msg_argtype(6) == ARG_STRING)
{
new value6[64]
get_msg_arg_string(6 ,value6 ,63)
if(equal(value6 ,"#Fire_in_the_hole"))
{
return PLUGIN_HANDLED
}
}
}
return PLUGIN_CONTINUE
}
//Block some audio messages
public message_audio()
{
//Create variable
static sample[20]
//Get message arguments
get_msg_arg_string(2, sample, sizeof sample - 1)
//Check argument, if it's equal - block it
if(equal(sample[1], "!MRAD_FIREINHOLE"))
return PLUGIN_HANDLED
if(equal(sample[7], "terwin") || equal(sample[7], "ctwin") || equal(sample[7], "rounddraw"))
return PLUGIN_HANDLED
return PLUGIN_CONTINUE
}
//Block hostage from appearing on the radar
public message_hostagepos()
{
return PLUGIN_HANDLED
}
// Block hostage HUD display
public message_scenario()
{
if (get_msg_args() > 1)
{
static sprite[8]
get_msg_arg_string(2, sprite, sizeof sprite - 1)
if (equal(sprite, "hostage"))
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
/*================================================================================
[TASKS]
=================================================================================*/
public task_ammo(id)
{
id -= TASK_AMMO
sw_set_user_bpammo(id,1)
}
public task_respawn(id)
{
id -= TASK_RESPAWN
ExecuteHamB(Ham_CS_RoundRespawn,id)
}
public task_UnChill(id)
{
id -= TASK_UNCHILL
new Float:origin[3]
pev(id,pev_origin,origin)
sw_UnChill(id,origin)
}
public task_set_model(id)
{
id -= TASK_MODEL
sw_set_user_model(id, g_player_model[id])
}
public task_UnGod(id)
{
id -= TASK_GOD
g_god[id] = false
fm_set_user_rendering(id,kRenderFxGlowShell,0,0,0,kRenderNormal,25)
}
public task_bots(id)
{
// Make sure it's a CZ bot and it's still connected
if (g_bots || !get_pcvar_num(pcvar_bots) || !is_user_connected(id) || !is_user_bot(id))
return;
RegisterHamFromEntity(Ham_Spawn, id, "fw_PlayerSpawn", 1)
RegisterHamFromEntity(Ham_Killed, id, "fw_PlayerKilled")
RegisterHamFromEntity(Ham_TakeDamage, id, "fw_TakeDamage")
// Ham forwards for CZ bots succesfully registered
g_bots = true
// If the bot has already spawned, call the forward manually for him
if (is_user_alive(id)) fw_PlayerSpawn(id)
}
/*================================================================================
[Stocks]
=================================================================================*/
//Set player money
stock sw_set_user_money(id,money,flash=1)
{
set_pdata_int(id,OFFSET_CSMONEY,money,OFFSET_LINUX)
message_begin(MSG_ONE,g_money,{0,0,0},id)
write_long(money)
write_byte(flash)
message_end()
}
// Get User Team
stock sw_get_user_team(id)
{
return get_pdata_int(id, OFFSET_CSTEAMS, OFFSET_LINUX)
}
//With this stock we can set player model
stock sw_set_user_model(player, const modelname[])
{
engfunc(EngFunc_SetClientKeyValue, player, engfunc(EngFunc_GetInfoKeyBuffer, player), "model", modelname)
g_has_custom_model[player] = true
}
//With this stock we can get player model
stock sw_get_user_model(player, model[], len)
{
engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, player), "model", model, len)
}
//With this stock we can reset player model
stock sw_reset_user_model(player)
{
g_has_custom_model[player] = false
dllfunc(DLLFunc_ClientUserInfoChanged, player, engfunc(EngFunc_GetInfoKeyBuffer, player))
}
//Set user snowballs
stock sw_set_user_bpammo(id,amount)
{
set_pdata_int(id, OFFSET_HE_AMMO, amount, OFFSET_LINUX)
}
//Make death msg
stock sw_kill(killer, victim, weapon[],headshot)
{
set_msg_block(g_death , BLOCK_SET)
user_kill(victim,1)
set_msg_block(g_death, BLOCK_NOT)
message_begin(MSG_ALL, g_death, {0,0,0}, 0)
write_byte(killer)
write_byte(victim)
write_byte(headshot)
write_string(weapon)
message_end()
if(get_user_team(killer)!= get_user_team(victim))
{
fm_set_user_frags(killer,get_user_frags(killer) + 1)
}else{
fm_set_user_frags(killer,get_user_frags(killer) - 1)
}
}
/*================================================================================
[Other stuff]
=================================================================================*/
sw_GetBlue()
{
static iCt, id
iCt = 0
for (id = 1; id <= g_maxplayers; id++)
{
if (is_user_connected(id))
{
if(is_user_alive(id) && g_blue[id])
iCt++
}
}
return iCt
}
sw_GetRed()
{
static iT, id
iT = 0
for (id = 1; id <= g_maxplayers; id++)
{
if (is_user_connected(id))
{
if(is_user_alive(id) && g_red[id])
iT++
}
}
return iT
}
sw_money(id)
{
message_begin(MSG_ONE,g_weapon,_,id)
write_byte(HIDE_MONEY)
message_end()
message_begin(MSG_ONE,g_crosshair,_,id)
write_byte(0)
message_end()
}
sw_sound(const sound[])
{
client_cmd(0, "spk ^"%s^"", sound)
}
sw_splash(ent,Float:origin[3])
{
set_pev(ent, pev_velocity, Float:{0.0, 0.0, 0.0})
set_pev(ent, pev_classname, "snow_splash")
set_pev(ent, pev_solid, SOLID_NOT)
set_pev(ent, pev_movetype, MOVETYPE_NONE)
engfunc(EngFunc_SetOrigin, ent, origin)
engfunc(EngFunc_SetModel, ent, model_splash)
set_pev(ent,pev_nextthink,get_gametime() + get_pcvar_float(pcvar_life))
fm_set_rendering(ent, kRenderFxNoDissipation, 255, 255, 255, kRenderGlow, 255)
}
sw_effect(Float:fOrigin[3])
{
new origin[3]
FVecIVec(fOrigin,origin)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_BLOODSPRITE)
write_coord(origin[0]+random_num(-20,20))
write_coord(origin[1]+random_num(-20,20))
write_coord(origin[2]+random_num(-20,20))
write_short(g_spray)
write_short(g_drop)
write_byte(255)
write_byte(15)
message_end()
}
sw_light(Float:originF[3])
{
new origin[3]
FVecIVec(originF,origin)
// light effect
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_DLIGHT)
write_coord(origin[0]) // x
write_coord(origin[1]) // y
write_coord(origin[2]) // z
write_byte(floatround(240.0/5.0)) // radius
write_byte(0) // r
write_byte(206)// g
write_byte(209) // b
write_byte(8) // life
write_byte(60) // decay rate
message_end()
}
sw_ChillPlayer(id)
{
//Set glow
fm_set_user_rendering(id,kRenderFxGlowShell,0,206,209,kRenderNormal,25)
//Set chill state
g_IsChilled[id] = true
//Retrieve player old maxspeed
pev(id,pev_maxspeed,g_maxspeed[id])
//Calculate his new maxspeed
g_ChillySpeed[id] = g_maxspeed[id] * get_pcvar_float(pcvar_chill_speed) / 100.0
//Set his new maxspeed
set_pev(id,pev_maxspeed,g_ChillySpeed[id])
//Add blue fade on players screen
message_begin(MSG_ONE,gmsgScreenFade,_,id)
write_short(floatround(4096.0 * get_pcvar_float(pcvar_chill_duration))) // duration
write_short(floatround(3072.0 * get_pcvar_float(pcvar_chill_duration))) // hold time
write_short(FFADE_IN) // flags
write_byte(0) // red
write_byte(206) // green
write_byte(209) // blue
write_byte(100) // alpha
message_end()
}
sw_UnChill(id,Float:fOrigin[3])
{
//Make some variables
new origin[3]
//Change origin from float to integer
FVecIVec(fOrigin,origin)
//Delete glow
fm_set_user_rendering(id,kRenderFxGlowShell,0,0,0,kRenderNormal,25)
//Restore his maxspeed
set_pev(id,pev_maxspeed,g_maxspeed[id])
//Set chill state
g_IsChilled[id] = false
// clear tint
message_begin(MSG_ONE,gmsgScreenFade,_,id)
write_short(0) // duration
write_short(0) // hold time
write_short(FFADE_IN) // flags
write_byte(0) // red
write_byte(0) // green
write_byte(0) // blue
write_byte(255)// alpha
message_end()
//Make glass effect
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_BREAKMODEL)
write_coord(origin[0]) // x
write_coord(origin[1]) // y
write_coord(origin[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_glass) // model
write_byte(10) // count
write_byte(25) // life
write_byte(BREAK_GLASS) // flags
message_end()
//Emit sound
engfunc(EngFunc_EmitSound,id,CHAN_AUTO,sound_unchill[random_num(0, sizeof sound_unchill - 1)],1.0,ATTN_NORM,0,PITCH_NORM)
}