Code: Select all
L 12/23/2013 - 16:25:16: [FAKEMETA] Invalid entity
L 12/23/2013 - 16:25:16: [AMXX] Displaying debug trace (plugin "snowball_war304.amxx")
L 12/23/2013 - 16:25:16: [AMXX] Run time error 10: native error (native "pev")
L 12/23/2013 - 16:25:16: [AMXX] [0] snowball_war304.sma::fw_Touch (line 64
Primesc eroarea aceasta in consola dupa care urmeaza crash ... Uitati sma :
- | Afiseaza codul
/* 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) * * */ #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 ;)] =================================================================================*/ 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)) { 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) }
Mersi :)