/* Surf Tools - Extras by Hawk552 Description: More features to go along with the original surf tools plugin. Features: - Removing the "BOOM" button in surf maps - Removing weapons from spawn, and not allowing sniping from spawn point - Removing all weapons entirely - Makes it impossible for people to be killed by other players, but still get killed by hitting the bottom of a map See base plugin for more details (usually named "surftools.sma/amxx") Credits: Thanks to Freecode for a section that has een removed (asically thanks for him trying) Designed to work with Surf Management / Tools - Base, although it can work on its own. */ /******************************************************************************************************** * Changelog: * * 1.0 - Original Release * * 1.1 - Fixed button remover, abandoned passthrough * * 1.2 - Removed gun being useless, added gun removal, as well as HP setter * * 1.3 - Fixed spawn HP, added semiclip * * 1.4 - Fixed a lot of code, fixed button remover * * 1.5 - Removed spawn HP, added godmode, added respawn rather than dying * * 1.6 - Removed godmode, changed button remover to always work, changed semiclip to almost always work * * 1.7 - Cleaned up code, fixed a few things that were stupid, ported entirely to fakemeta * ********************************************************************************************************/ #include #include #include #include #define PLUGIN "Surf Management / Tools - Extras" #define VERSION "1.7" #define AUTHOR "Hawk552" new bool:g_SurfMap new p_On new p_RemoveDropped new p_RemoveButton new p_NoGuns new p_SpawnDist new p_Semiclip public plugin_init() { register_plugin(PLUGIN,VERSION,AUTHOR) register_cvar("surf_extras_version",VERSION,FCVAR_SERVER) // no, this will not override the base register_cvar("surf_on","1") // for some reason if it's already registered, it won't work p_On = get_cvar_pointer("surf_on") p_RemoveDropped = register_cvar("surf_remove_dropped","1") p_RemoveButton = register_cvar("surf_remove_button","1") p_NoGuns = register_cvar("surf_noguns","0") p_SpawnDist = register_cvar("surf_spawn_dist","500") p_Semiclip = register_cvar("surf_semiclip","0") register_forward(FM_SetModel,"ForwardSetModel") CheckSurf() CheckButton() } CheckButton() if(get_pcvar_num(p_RemoveButton) && get_pcvar_num(p_On) && g_SurfMap) { new Ent,Value[] = "classname",ClassName[] = "env_explosion" while((Ent = engfunc(EngFunc_FindEntityByString,Ent,Value,ClassName)) != 0) if(pev_valid(Ent)) set_pev(Ent,pev_flags,pev(Ent,pev_flags)|FL_KILLME) } CheckSurf() { new MapName[32] get_mapname(MapName,31) if(containi(MapName,"surf") != -1 || containi(MapName,"wurf") != -1 || equali(MapName,"tentical")) g_SurfMap = true } public client_PreThink(id) { if(!is_user_alive(id) || !get_pcvar_num(p_On) || !g_SurfMap) return new NoGuns = get_pcvar_num(p_NoGuns) if(NoGuns == 1) { new SpawnDistance = get_pcvar_num(p_SpawnDist) static Float:vOrigin[3] pev(id,pev_origin,vOrigin) new DeathMatch = engfunc(EngFunc_FindEntityByString,-1,"classname","info_player_deathmatch") new PlayerStart = engfunc(EngFunc_FindEntityByString,-1,"classname","info_player_start") if(!DeathMatch || !PlayerStart) return static Float:vDeathMatch_Origin[3] pev(DeathMatch,pev_origin,vDeathMatch_Origin) static Float:vPlayerStart_Origin[3] pev(PlayerStart,pev_origin,vPlayerStart_Origin) new Float:DeathMatch_Distance = get_distance_f(vOrigin,vDeathMatch_Origin) new Float:PlayerStart_Distance = get_distance_f(vOrigin,vPlayerStart_Origin) new Clip, Ammo, Weapon = get_user_weapon(id,Clip,Ammo) if(DeathMatch_Distance < SpawnDistance || PlayerStart_Distance < SpawnDistance) { if(Weapon != CSW_KNIFE && Weapon != CSW_C4 && Weapon != CSW_HEGRENADE && Weapon != CSW_FLASHBANG && Weapon != CSW_SMOKEGRENADE) client_cmd(id,"drop") } // Argh, stupid thing doesn't understand this if I don't add the brackets. else if(DeathMatch_Distance > SpawnDistance || PlayerStart_Distance > SpawnDistance) if(!user_has_weapon(id,CSW_SCOUT)) fm_give_item(id,"weapon_scout") } else if(NoGuns == 2) { new Clip, Ammo, Weapon = get_user_weapon(id,Clip,Ammo) if(Weapon != CSW_KNIFE && Weapon != CSW_C4 && Weapon != CSW_HEGRENADE && Weapon != CSW_FLASHBANG && Weapon != CSW_SMOKEGRENADE) client_cmd(id,"drop") } else if(NoGuns == 3) { new Clip, Ammo, Weapon = get_user_weapon(id,Clip,Ammo) if(Weapon != CSW_KNIFE && Weapon != CSW_C4) { fm_strip_user_weapons(id) fm_give_item(id,"weapon_knife") } } if(get_pcvar_num(p_Semiclip)) { new Ent,Float:Radius = 200.0,Float:vOrigin[3],Flag pev(id,pev_origin,vOrigin) while((Ent = engfunc(EngFunc_FindEntityInSphere,Ent,vOrigin,Radius)) != 0) { static ClassName[33] pev(Ent,pev_classname,ClassName,32) if(equali(ClassName,"trigger_teleport") || equali(ClassName,"trigger_hurt")) { set_pev(id,pev_solid,SOLID_BSP) Flag = true break } } if(!Flag) set_pev(id,pev_solid,SOLID_NOT) } } public ForwardSetModel(id,Model[]) { if(!pev_valid(id) || !strlen(Model) || !get_pcvar_num(p_RemoveDropped) || !g_SurfMap) return static ClassName[33] pev(id,pev_classname,ClassName,32) if(equali(ClassName,"weaponbox")) engfunc(EngFunc_RemoveEntity,id) } // no, VEN did not write this, I did (although I found out later that he wrote something like it) fm_give_item(id,Item[]) { if(containi(Item,"item_") == -1 && containi(Item,"weapon_") == -1 && containi(Item,"ammo_") == -1 && containi(Item,"tf_weapon_") == -1) return new Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, Item)),Float:vOrigin[3] if(!pev_valid(Ent)) return pev(id,pev_origin,vOrigin) set_pev(Ent,pev_origin,vOrigin) set_pev(Ent,pev_spawnflags,pev(Ent,pev_spawnflags)|(1<<30)) dllfunc(DLLFunc_Spawn,Ent) new Solid = pev(Ent,pev_solid) dllfunc(DLLFunc_Touch,Ent,id) if(pev(Ent,pev_solid) == Solid) engfunc(EngFunc_RemoveEntity,Ent) } // thanks to VEN for this stock from Fakemeta Utilities fm_strip_user_weapons(index) { new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip")) if (!pev_valid(ent)) return 0 dllfunc(DLLFunc_Spawn, ent) dllfunc(DLLFunc_Use, ent, index) engfunc(EngFunc_RemoveEntity, ent) return 1 }