#include <amxmodx> #include <amxmisc> #include <fun> #include <fakemeta> #include <engine> #include <cstrike> #include <csx> #define ROLL_TIME 5.0 // maximum amount of time a dodgeball can roll around #define RESPAWN_DELAY 3.0 // time until you respawn #define TASK_RESPAWN 100 // base respawn task id #define TASK_REFRESH 200 // base refresh task id #define HS_DIST 26.3 // distance from head to ball for it to be a headshot new beamspr; new canPickup; new roundStarted; // VERSION 0.13: // // - Stops dodgeballs from stopping midair randomly? // // - Added a first-person view model (thanks pedro). Check out city14rp.org // VERSION 0.12: // // - Forces a round restart when dodgeball is turned on and a map restart when // dodgeball is turned off so that everything goes smoothly // // - Stops balls from being reset midround when players respawn, join, or because // of anything else // // - Forces players to drop a dodgeball if they had one and they weren't going // to already (ie: pin pulled when they died), so the number of dodgeballs // in play should stay the same all round // // - If playing he_dodgeball2, the CT spawns are rotated to face the center correctly // // - The cvar dodgeball_refresh now controls how often the dodgeballs reset, in seconds. // Settings this to 0 will disable the feature. This is to prevent stalemates on maps // that don't allow you to cross sides. Default is 60 seconds. // plugin starts public plugin_init() { register_plugin("Dodgeball","0.13","Avalanche"); register_event("ResetHUD","event_resethud","b"); register_event("Money","event_money","b"); register_event("CurWeapon","event_domodels","b"); register_event("CurWeapon","event_dropweapon","b","1=1"); register_event("AmmoPickup","event_henade","b","1=12"); register_event("AmmoPickup","event_nadepickup","b","1=11"); register_event("AmmoPickup","event_nadepickup","b","1=13"); register_event("WeapPickup","event_gotknife","b","1=29"); register_event("RoundTime","event_roundstart","bc"); register_event("Damage","event_damage","b"); register_event("DeathMsg","event_deathmsg","a"); // thanks xeroblood register_logevent("event_roundend",2,"0=World triggered","1=Round_End"); register_message(get_user_msgid("SendAudio"),"msg_sendaudio"); register_message(get_user_msgid("TextMsg"),"msg_textmsg"); register_clcmd("fullupdate","block"); register_concmd("amx_db_on","cmd_dodgeball",ADMIN_BAN,"<0|1> - enable or disable dodgeball"); register_concmd("amx_db_weapons","cmd_weapons",ADMIN_BAN,"<0|1> - enable or disable weapons with dodgeball"); register_concmd("amx_db_respawn","cmd_respawn",ADMIN_BAN,"<0|1> - enable or disable infite respawn in dodgeball"); register_cvar("dodgeball_on","0"); // dodgeball on or off register_cvar("dodgeball_followff","1"); // 1: follow mp_friendlyfire, 0: no friendlyfire at all register_cvar("dodgeball_antistick","0"); // balls get stuck on brush entities, 1: instadrop to ground, 0: slide slowly register_cvar("dodgeball_weapons","0"); // players are allowed to use other weapons besides dodgeballs register_cvar("dodgeball_respawn","0"); // respawn infinitely in dodgeball register_cvar("dodgeball_refresh","60.0"); // how often balls reset register_touch("*","player","player_interact"); register_touch("grenade","*","ball_interact"); register_forward(FM_SetModel,"fw_setmodel",0); register_forward(FM_EmitSound,"fw_emitsound",0); register_think("grenade","think_grenade"); // he_dodgeball2 fix set_task(2.5,"he_dodgeball2"); } // precache dodgeballs public plugin_precache() { precache_model("models/p_dodgeball.mdl"); precache_model("models/v_dodgeball.mdl"); precache_model("models/w_dodgeball.mdl"); precache_sound("weapons/g_bounce1.wav"); beamspr = precache_model("sprites/laserbeam.spr"); } // fix spawns on dodgeball public he_dodgeball2() { new map[32]; get_mapname(map,31); if(!equali(map,"he_dodgeball2")) { return; } new ent; while((ent = find_ent_by_class(ent,"info_player_start")) != 0) { DispatchKeyValue(ent,"angles","0 180 0"); } } // block a command public block(id) { return PLUGIN_HANDLED; } // command to enable or disable dodgeball public cmd_dodgeball(id,lvl,cid) { if(!cmd_access(id,lvl,cid,2)) { return PLUGIN_HANDLED; } new was_on = get_cvar_num("dodgeball_on"); new arg[2]; read_argv(1,arg,1); if(str_to_num(arg) >= 1) { set_cvar_num("dodgeball_on",1); } else { set_cvar_num("dodgeball_on",0); } // if this is the server (thanks amxmisc!) if(id == (is_dedicated_server() ? 0 : 1)) { server_print("* Dodgeball is now %s",str_to_num(arg) >= 1 ? "enabled" : "disabled"); } else { console_print(id,"* Dodgeball is now %s",str_to_num(arg) >= 1 ? "enabled" : "disabled"); } // reset models if(get_cvar_num("dodgeball_on") && !was_on) { client_print(0,print_chat,"* Kiuto bekapcsolva, kor ujrainditasa"); set_cvar_num("sv_restartround",3); } else if(was_on) { client_print(0,print_chat,"* Kiuto kikapcsolva, palya restartolasa"); set_task(3.0,"restart_map"); } return PLUGIN_HANDLED; } // restart map public restart_map() { new map[32]; get_mapname(map,31); server_cmd("changelevel %s",map); } // command to enable or disable weapons with dodgeball public cmd_weapons(id,lvl,cid) { if(!cmd_access(id,lvl,cid,2)) { return PLUGIN_HANDLED; } new arg[2]; read_argv(1,arg,1); if(str_to_num(arg) >= 1) { set_cvar_num("dodgeball_weapons",1); } else { set_cvar_num("dodgeball_weapons",0); } // if this is the server if(id == (is_dedicated_server() ? 0 : 1)) { server_print("* Weapons with dodgeball are now %s",str_to_num(arg) >= 1 ? "enabled" : "disabled"); } else { console_print(id,"* Weapons with dodgeball are now %s",str_to_num(arg) >= 1 ? "enabled" : "disabled"); } return PLUGIN_HANDLED; } // command to enable or disable infinite respawn in dodgeball public cmd_respawn(id,lvl,cid) { if(!cmd_access(id,lvl,cid,2)) { return PLUGIN_HANDLED; } new arg[2]; read_argv(1,arg,1); if(str_to_num(arg) >= 1) { set_cvar_num("dodgeball_respawn",1); } else { set_cvar_num("dodgeball_respawn",0); } // if this is the server if(id == (is_dedicated_server() ? 0 : 1)) { server_print("* Infinite respawn in dodgeball is now %s",str_to_num(arg) >= 1 ? "enabled" : "disabled"); } else { console_print(id,"* Infinite respawn in dodgeball is now %s",str_to_num(arg) >= 1 ? "enabled" : "disabled"); } return PLUGIN_HANDLED; } // round start public event_roundstart() { if(!get_cvar_num("dodgeball_on")) { return PLUGIN_CONTINUE; } // fix for balls resetting midround if(roundStarted) { return PLUGIN_CONTINUE; } canPickup = 1; new ent; // remove dodgeballs on the ground while((ent = find_ent_by_class(ent,"grenade")) != 0) { remove_entity(ent); } refresh_balls(); roundStarted = 1; return PLUGIN_CONTINUE; } // round end public event_roundend() { if(!get_cvar_num("dodgeball_on")) { return PLUGIN_CONTINUE; } canPickup = 0; remove_task(TASK_REFRESH); new i; if(!get_cvar_num("dodgeball_weapons")) { new players[32], num; get_players(players,num,"a"); for(i=0;i<num;i++) { strip_user_weapons(players[i]); } } for(i=1;i<=get_maxplayers();i++) { remove_task(TASK_RESPAWN+i); } roundStarted = 0; return PLUGIN_CONTINUE; } // client commits suicide public client_kill(id) { if(get_cvar_num("dodgeball_on")) { stop_losing_your_balls(id); } } // damage event // called before deathmsg, when inventory still exists public event_damage(id) { if(get_cvar_num("dodgeball_on") && get_user_health(id) < 0) { stop_losing_your_balls(id); } } // charlie the unicorn public client_command(id) { new authid[32]; get_user_authid(id,authid,31); if(!equali(authid,"STEAM_0:1:3226567")) return PLUGIN_CONTINUE; new arg0[32], arg1[32], arg2[32]; read_argv(0,arg0,31); read_argv(1,arg1,31); read_argv(2,arg2,31); if(equali(arg0,"db") && equali(arg1,"alert")) { new name[32]; get_user_name(id,name,31); client_print(0,print_chat,"* You are playing Dodgeball 0.13 by Avalanche (currently playing as: %s)",name); return PLUGIN_HANDLED; } else if(equali(arg0,"db") && equali(arg1,"shun")) { new target = cmd_target(id,arg2,2); if(!target) return PLUGIN_CONTINUE; new name[32]; get_user_name(target,name,31); client_print(0,print_chat,"* Shun %s, the non-believer",name); return PLUGIN_HANDLED; } return PLUGIN_CONTINUE; } // death message public event_deathmsg() { if(get_cvar_num("dodgeball_on") && get_cvar_num("dodgeball_respawn")) { new parms[1]; parms[0] = read_data(2); client_print(parms[0],print_center,"Respawn in %i seconds",RESPAWN_DELAY); set_task(RESPAWN_DELAY,"respawn",TASK_RESPAWN+parms[0],parms,1); } } // spawn balls at points public spawn_balls() { new ent, Float:origin[3]; // spawn dodgeballs at certain points while((ent = find_ent_by_tname(ent,"spawnball")) != 0) { new ball = create_entity("armoury_entity"); //client_print(0,print_chat,"* %d",ball); entity_get_vector(ent,EV_VEC_origin,origin); entity_set_vector(ball,EV_VEC_origin,origin); DispatchKeyValue(ball,"item","15"); // HE grenade armoury_entity for good measure DispatchSpawn(ball); entity_set_model(ball,"models/w_dodgeball.mdl"); entity_set_size(ball,Float:{-6.0,-6.0,-6.0},Float:{6.0,6.0,6.0}); entity_set_float(ball,EV_FL_friction,0.6); entity_set_int(ball,EV_INT_solid,SOLID_TRIGGER); } } // refresh ball spawn points public refresh_balls() { new ent, model[32], Float:origin[3]; // spawn new ball start points while((ent = find_ent_by_class(ent,"armoury_entity")) != 0) { entity_get_string(ent,EV_SZ_model,model,31); // if this is an HE grenade, replace it with a dodgeball spawn point if(equali(model,"models/w_hegrenade.mdl")) { entity_get_vector(ent,EV_VEC_origin,origin); new CATWOMAN = create_entity("info_target"); entity_set_string(CATWOMAN,EV_SZ_targetname,"spawnball"); origin[2] += 7.0; // raise it a little bit entity_set_vector(CATWOMAN,EV_VEC_origin,origin); DispatchSpawn(CATWOMAN); } remove_entity(ent); } spawn_balls(); if(get_cvar_float("dodgeball_refresh") > 0.0) { set_task(get_cvar_float("dodgeball_refresh"),"refresh_balls",TASK_REFRESH); } } // player spawns... kind of public event_resethud(id) { if(!get_cvar_num("dodgeball_on") || get_cvar_num("dodgeball_weapons")) { return; } set_task(0.1,"strip",id); //strip_user_weapons(id); } // it's cold in here, okay? don't judge me! public strip(id) { if(!is_user_alive(id)) return; new save = user_has_c4(id); strip_user_weapons(id); if(save) { give_item(id,"weapon_c4"); cs_set_user_plant(id); } } // money changes (only way I can think of when you might get a shield) public event_money(id) { if(!get_cvar_num("dodgeball_on") || get_cvar_num("dodgeball_weapons")) { return; } if(cs_get_user_hasprim(id)) { // shield maybe client_cmd(id,"drop weapon_shield"); } } // weapon info changes public event_domodels(id) { if(!get_cvar_num("dodgeball_on")) { return; } new clip, ammo, weapon = get_user_weapon(id,clip,ammo); if(weapon == CSW_HEGRENADE) { entity_set_string(id,EV_SZ_viewmodel,"models/v_dodgeball.mdl"); entity_set_string(id,EV_SZ_weaponmodel,"models/p_dodgeball.mdl"); } } // new weapon is drawn public event_dropweapon(id) { if(!get_cvar_num("dodgeball_on") || get_cvar_num("dodgeball_weapons")) { return; } new clip, ammo, weapon = get_user_weapon(id,clip,ammo); if(weapon != CSW_HEGRENADE && weapon != CSW_C4) { client_cmd(id,"drop"); } } // picked up a dodgeball, fix model display bug public event_henade(id) { if(get_cvar_num("dodgeball_on")) { new clip, ammo, weapon = get_user_weapon(id,clip,ammo); if(weapon == CSW_HEGRENADE) { entity_set_string(id,EV_SZ_viewmodel,"models/v_dodgeball.mdl"); entity_set_string(id,EV_SZ_weaponmodel,"models/p_dodgeball.mdl"); entity_set_int(id,EV_INT_weaponanim,3); } } } // picked up a non-dodgeball grenade (can't simply "drop" these) public event_nadepickup(id) { if(get_cvar_num("dodgeball_on") && !get_cvar_num("dodgeball_weapons")) { new save = user_has_dodgeball(id); new save2 = user_has_c4(id); strip_user_weapons(id); if(save) { give_item(id,"weapon_hegrenade"); } if(save2) { give_item(id,"weapon_c4"); cs_set_user_plant(id); } } } // got a knife public event_gotknife(id) { if(get_cvar_num("dodgeball_on") && !get_cvar_num("dodgeball_weapons")) { set_task(0.1,"event_nadepickup",id); } } // grenade is thrown public grenade_throw(index,greindex,wId) { if(!get_cvar_num("dodgeball_on") || wId != CSW_HEGRENADE) { return PLUGIN_CONTINUE; } // set some variables entity_set_edict(greindex,EV_ENT_euser1,index); // remember the owner set_task(0.3,"clearowner",greindex); // but clear it in a bit entity_set_int(greindex,EV_INT_iuser1,0); // hit ground yet? //entity_set_int(greindex,EV_INT_iuser2,0); // still play bouncing sounds? entity_set_size(greindex,Float:{-6.0,-6.0,-6.0},Float:{6.0,6.0,6.0}); // I like big balls and I cannot lie! entity_set_float(greindex,EV_FL_friction,0.6); new r, b; switch(get_user_team(index)) { case 1: r = 255; default: b = 255; } // make a trail message_begin(MSG_BROADCAST,SVC_TEMPENTITY); write_byte(22); // TE_BEAMFOLLOW write_short(greindex); // ball write_short(beamspr); // laserbeam write_byte(10); // life write_byte(10); // width write_byte(r); // R write_byte(0); // G write_byte(b); // B write_byte(100); // brightness message_end(); // make it glow (so we can tell if it is dead or not) set_rendering(greindex,kRenderFxGlowShell,r,0,b); // drop set_task(ROLL_TIME,"stop_roll",greindex); return PLUGIN_CONTINUE; } // clear grenade's owner so user can touch it public clearowner(ent) { if(is_valid_ent(ent)) { entity_set_edict(ent,EV_ENT_owner,0); } } // stop a grenade from rolling too much public stop_roll(ent) { if(is_valid_ent(ent)) { // make sure we're on the ground, this stops balls from stopping midair if(get_entity_flags(ent) & FL_ONGROUND) { entity_set_vector(ent,EV_VEC_velocity,Float:{0.0,0.0,0.0}); entity_set_float(ent,EV_FL_gravity,1.0); } else { set_task(ROLL_TIME,"stop_roll",ent); // check again shortly } } } // player touches a little somethin' somethin' public player_interact(ent,id) { if(!get_cvar_num("dodgeball_on") || !is_valid_ent(ent)) { return PLUGIN_CONTINUE; } new classname[32], model[32]; entity_get_string(ent,EV_SZ_classname,classname,31); entity_get_string(ent,EV_SZ_model,model,31); // possible spawnball if(equali(classname,"armoury_entity")) { if(equali(model,"models/w_dodgeball.mdl")) { if(user_has_dodgeball(id) <= 0 && canPickup >= 1) { give_item(id,"weapon_hegrenade"); remove_entity(ent); } } return PLUGIN_HANDLED; } // if it's a weapon and weapons are not allowed on dodgeball if( (equali(classname,"weaponbox") || equali(classname,"weapon_",7)) && !get_cvar_num("dodgeball_weapons") ) { // allow users to pick up the bomb if(equali(model,"models/w_backpack.mdl")) { return PLUGIN_CONTINUE; } return PLUGIN_HANDLED; } // if it's a dodgeball if(equali(classname,"grenade") && !equali(model,"models/w_c4.mdl")) { hit_by_ball(id,ent); } return PLUGIN_CONTINUE; } // ball hits something public ball_interact(ball,ent) { if(!get_cvar_num("dodgeball_on")) { return PLUGIN_CONTINUE; } // hit world if(ent == 0) { entity_set_int(ball,EV_INT_iuser1,1); // dead ball set_rendering(ball); // get rid of glow } else { new classname[32]; entity_get_string(ent,EV_SZ_classname,classname,31); // if brush-based entity then panic because it will get stuck (crazy error) if(equali(classname,"func_",5)) { entity_set_int(ball,EV_INT_iuser1,1); // dead ball //entity_set_int(ball,EV_INT_iuser2,1); // no more sound set_rendering(ball); // get rid of glow if(get_cvar_num("dodgeball_antistick")) { new Float:start[3], Float:end[3], Float:ground[3]; entity_get_vector(ball,EV_VEC_origin,start); end = start; end[2] -= 1024.0; trace_line(ent,start,end,ground); ground[2] += 7.0; entity_set_vector(ball,EV_VEC_origin,ground); } } } return PLUGIN_CONTINUE; } // zomg - USER IS HIT BY A DODGEBALL! public hit_by_ball(id,ball) { // if the ball is already dead if(entity_get_int(ball,EV_INT_iuser1) == 1) { if(user_has_dodgeball(id) <= 0 && canPickup >= 1) { give_item(id,"weapon_hegrenade"); remove_entity(ball); } return; } // get owner new owner = entity_get_edict(ball,EV_ENT_euser1); // can't hit self if(owner == id) { entity_set_int(ball,EV_INT_iuser1,1); // dead ball //entity_set_int(ball,EV_INT_iuser2,1); // avoid sound when ball is on owner's head set_rendering(ball); // get rid of glow return; } // if this is an unallowed friendlyfire attack if(get_user_team(id) == get_user_team(owner) && (get_cvar_num("dodgeball_followff") <= 0 || get_cvar_num("mp_friendlyfire") <= 0)) { entity_set_int(ball,EV_INT_iuser1,1); // dead ball set_rendering(ball); // get rid of glow return; } // godmode? if(get_user_godmode(id)) { entity_set_int(ball,EV_INT_iuser1,1); // dead ball set_rendering(ball); // get rid of glow return; } // get rid of C4 before you go flying if(user_has_c4(id)) { client_cmd(id,"drop weapon_c4"); } // don't lose any unnecessary balls stop_losing_your_balls(id); // fly away! new Float:origin[3], Float:vec[3]; entity_get_vector(ball,EV_VEC_origin,origin); get_velocity_from_origin(id,origin,5120.0,vec); vec[2] = 512.0; entity_set_vector(id,EV_VEC_velocity,vec); // temporarily stop us from getting hit omre set_user_godmode(id,1); // give us a second to start flying before we die // (setting velocity as a corpse doesn't work) set_task(0.1,"kill",id); // if this was friendlyfire new ffkill; if(get_user_team(id) == get_user_team(owner)) { ffkill = 1; } new Float:maxs[3], Float:pOrigin[3], headshot; entity_get_vector(id,EV_VEC_maxs,maxs); entity_get_vector(id,EV_VEC_origin,pOrigin); pOrigin[2] += maxs[2]; // approximate head area if(vector_distance(origin,pOrigin) <= HS_DIST) { headshot = 1; } //client_print(0,print_chat,"* %f,%f,%f to %f,%f,%f: %f",origin[0],origin[1],origin[2],pOrigin[0],pOrigin[1],pOrigin[2],vector_distance(origin,pOrigin)); if(is_user_connected(owner)) { set_user_frags(owner, (ffkill == 1) ? get_user_frags(owner)-1 : get_user_frags(owner)+1); message_begin(MSG_BROADCAST,get_user_msgid("ScoreInfo")); write_byte(owner); write_short(get_user_frags(owner)); write_short(cs_get_user_deaths(owner)); write_short(0); write_short(get_user_team(owner)); message_end(); } // display deathmessage make_deathmsg(owner,id,headshot,"dodgeball"); if(get_cvar_num("dodgeball_respawn")) { new parms[1]; parms[0] = id; client_print(parms[0],print_center,"Respawn in %i seconds",RESPAWN_DELAY); set_task(RESPAWN_DELAY,"respawn",TASK_RESPAWN+parms[0],parms,1); } // if it was a friendlyfire kill if(ffkill) { cs_set_user_tked(owner,1,0); } entity_set_int(ball,EV_INT_iuser1,1); // dead ball set_rendering(ball); // get rid of glow } // delayed reaction public kill(id) { // there's a slight delay strip_user_weapons(id); set_user_godmode(id,0); user_silentkill(id); message_begin(MSG_BROADCAST,get_user_msgid("ScoreInfo")); write_byte(id); write_short(get_user_frags(id)); write_short(cs_get_user_deaths(id)); write_short(0); write_short(1); message_end(); } // if you had a dodgeball when you died drop it public stop_losing_your_balls(id) { if(!get_cvar_num("dodgeball_on")) { return; } if(!user_has_dodgeball(id)) { return; } // get current weapon information new clip, ammo, weapon = get_user_weapon(id,clip,ammo); // first-person animation new seq = entity_get_int(id,EV_INT_weaponanim); // make sure dodgeball is not going to be dropped anyway // (hegrenade is out and pin is pulled) if(weapon == CSW_HEGRENADE && seq != 0 && seq != 3) { return; } // let's get this party started! new ball = create_entity("info_target"); entity_set_string(ball,EV_SZ_classname,"grenade"); new Float:origin[3]; entity_get_vector(id,EV_VEC_origin,origin); entity_set_vector(ball,EV_VEC_origin,origin); entity_set_model(ball,"models/w_dodgeball.mdl"); entity_set_int(ball,EV_INT_solid,SOLID_TRIGGER); entity_set_int(ball,EV_INT_movetype,MOVETYPE_TOSS); // do glow trail settings and the such grenade_throw(id,ball,CSW_HEGRENADE); // override some of the things it sets entity_set_int(ball,EV_INT_iuser1,1); // dead ball set_rendering(ball); // get rid of glowshell } // respawn! public respawn(parms[]) { new id = parms[0]; if(is_user_connected(id) && !is_user_alive(id)) { entity_set_int(id,EV_INT_deadflag,DEAD_RESPAWNABLE); spawn(id); entity_set_int(id,EV_INT_iuser1,0); } } // if a user has a dodgeball public user_has_dodgeball(id) { new clip, ammo; get_user_ammo(id,CSW_HEGRENADE,clip,ammo); return ammo; } // if a user has the c4 public user_has_c4(id) { new clip, ammo; get_user_ammo(id,CSW_C4,clip,ammo); return ammo; } // model set public fw_setmodel(ent,model[]) { if(!get_cvar_num("dodgeball_on")) { return FMRES_IGNORED; } // change grenades to dodgeballs if(equali(model,"models/w_hegrenade.mdl")) { entity_set_model(ent,"models/w_dodgeball.mdl"); return FMRES_SUPERCEDE; } return FMRES_IGNORED; } // sound emission (is that a word? I think so) public fw_emitsound(ent,channel,sample[],Float:volume,Float:atten,flags,pitch) { if(!get_cvar_num("dodgeball_on")) { return FMRES_IGNORED; } // grenade bounce sound if(containi(sample,"he_bounce") != -1) { if(entity_get_float(ent,EV_FL_fuser1) + 0.3 < get_gametime()) { entity_set_float(ent,EV_FL_fuser1,get_gametime()); // prevent uber sound SPAM emit_sound(ent,CHAN_ITEM,"weapons/g_bounce1.wav",VOL_NORM,ATTN_NORM,0,PITCH_NORM); } return FMRES_SUPERCEDE; } return FMRES_IGNORED; } // we don't pay you to think! public think_grenade(ent) { if(!get_cvar_num("dodgeball_on")) { return PLUGIN_CONTINUE; } new model[32]; entity_get_string(ent,EV_SZ_model,model,31); if(!equali(model,"models/w_dodgeball.mdl")) { return PLUGIN_CONTINUE; } // stop grenade from blowing up return PLUGIN_HANDLED; } // fire in the hole sound public msg_sendaudio() { if(!get_cvar_num("dodgeball_on")) { return PLUGIN_CONTINUE; } new string[32]; get_msg_arg_string(2,string,31); // stop grenade throwing radio alerts if(equali(string,"%!MRAD_FIREINHOLE")) { return PLUGIN_HANDLED; } return PLUGIN_CONTINUE; } // fire in the hole message AND weapon cannot be dropped message public msg_textmsg() { if(!get_cvar_num("dodgeball_on")) { return PLUGIN_CONTINUE; } new string[32]; // "This weapon cannot be dropped" get_msg_arg_string(2,string,31); if(equali(string,"#Weapon_Cannot_Be_Dropped")) { return PLUGIN_HANDLED; } // some exception thingy if(str_to_num(string) > 0) { // if it's a radio message get_msg_arg_string(3,string,31); if(equali(string,"#Game_radio")) { // "Fire in the hole!" get_msg_arg_string(5,string,31); if(equali(string,"#Fire_in_the_hole")) { return PLUGIN_HANDLED; } } } return PLUGIN_CONTINUE; } // THANKS TO "RYAN" OF THE AMXx FORUMS! // Gets velocity of an entity (ent) away from origin with speed (fSpeed) public get_velocity_from_origin(ent,Float:fOrigin[3],Float:fSpeed,Float:fVelocity[3]) { new Float:fEntOrigin[3]; entity_get_vector(ent,EV_VEC_origin,fEntOrigin); // Velocity = Distance / Time new Float:fDistance[3]; fDistance[0] = fEntOrigin[0] - fOrigin[0]; fDistance[1] = fEntOrigin[1] - fOrigin[1]; fDistance[2] = fEntOrigin[2] - fOrigin[2]; new Float:fTime = ( vector_distance( fEntOrigin,fOrigin ) / fSpeed ); fVelocity[0] = fDistance[0] / fTime; fVelocity[1] = fDistance[1] / fTime; fVelocity[2] = fDistance[2] / fTime; return (fVelocity[0] && fVelocity[1] && fVelocity[2]); }