Code:
/*
Thread Link: https://forums.alliedmods.net/showthread.php?p=1130946#post1130946
Jail Cells Opener
v1.6
Wrecked
Changelog:
1.0 - Released
1.1 - Config file added with method to get custom maps / button ids
1.2 - Replaced button ID with targetname since ID's aren't static (thanks xPaw and joropito for feedback)
1.3 - Auto button detector added in with a big thanks to jorpito for the code!
1.4 - Now functions with maps that have more than one cell opener.
1.5 - Manual push task removal, thanks to D.Skript for reporting
1.6 - Multilingual added (crazyeffect) / commented the code
*/
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>
//#include <cstrike>
//#include <fun>
new const VERSION[] = "1.6"
new found[10]
public plugin_init()
{
register_plugin( "Auto Cells Opener", VERSION, "Wrecked" )
register_clcmd( "say !open", "CMD_PushButton", ADMIN_LEVEL_E )
register_event( "HLTV", "OnRoundStart" "a", "1=0", "2=0" );
}
publoc OnRoundStart( )
Push_Button( ); // Reset doors
public CMD_PushButton( id, level, cid )
{
if( !cmd_access( id, level, cid, 1 ) )
{
return PLUGIN_HANDLED
}
else
{
new name[32]
get_user_name( id, name, 31 )
client_print( 0, print_chat, "%s has released the prisoners!", name )
Push_Button() // open cells
}
return PLUGIN_HANDLED
}
public Push_Button()
{
new ent = 1
new ent3
new Float:origin[3]
new Float:radius = 200.0
new class[32]
new name[32]
new pos
while((pos <= sizeof(found)) && (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "info_player_deathmatch"))) // info_player_deathmatch = tspawn
{
new ent2 = 1
pev(ent, pev_origin, origin)
while((ent2 = engfunc(EngFunc_FindEntityInSphere, ent2, origin, radius))) // find doors near T spawn
{
if(!pev_valid(ent2))
continue
pev(ent2, pev_classname, class, charsmax(class))
if(!equal(class, "func_door")) // if it's not a door, move on to the next iteration
continue
pev(ent2, pev_targetname, name, charsmax(name))
ent3 = engfunc(EngFunc_FindEntityByString, 0, "target", name) // find button that opens this door
if(pev_valid(ent3) && (in_array(ent3, found, sizeof(found)) < 0))
{
ExecuteHamB(Ham_Use, ent3, 0, 0, 1, 1.0) // zomg poosh it
found[pos] = ent3
pos++ // next
break // break from current while loop
}
}
}
return pos
}
stock in_array(needle, data[], size)
{
for(new i = 0; i < size; i++)
{
if(data[i] == needle)
return i
}
return -1
}