#include <amxmodx>
#include <cstrike>
#include <csx>
#include <fakemeta>
#define NO_CSDM_TASK_ID 199
#define STACK_SIZE 16
new g_pcvarWall
new g_pcvarWait
new g_Planters[STACK_SIZE]
public plugin_precache()
CreateBombTarget();
public plugin_init()
{
register_plugin("Plant Anywhere 2", "1.2", "Av3ngeR");
register_event("HLTV", "eventNewRound", "a", "1=0", "2=0");
register_event("23", "eventBombExplode", "a", "1=17", "6=-105", "7=17");
register_logevent("eventRoundStart", 2, "1=Round_Start");
register_logevent("eventBombPlanted", 3, "2=Planted_The_Bomb");
register_forward(FM_CmdStart, "forwardCmdStart");
g_pcvarWall = register_cvar("c4_wall", "1");
g_pcvarWait = register_cvar("c4_wait", "20");
}
public forwardCmdStart(id, ucHandle, Seed)
{
if(is_user_alive(id) && (get_user_weapon(id) == CSW_C4))
{
// Disable planting till amx_c4Wait seconds
if(task_exists(id) || task_exists(NO_CSDM_TASK_ID))
{
// DevconeS's Code
new buttons = get_uc(ucHandle,UC_Buttons)
if(buttons & IN_ATTACK)
{
buttons &= ~IN_ATTACK
set_uc(ucHandle,UC_Buttons,buttons)
}
}
}
}
public eventNewRound()
{
// Clear all plants
for(new i=0; i < STACK_SIZE; i++)
{
g_Planters[i] = 0;
}
}
public eventRoundStart()
{
new id, Max;
static Players[32];
get_players(Players, Max, "ae", "TERRORIST");
for(new i=0; i<Max; i++)
{
// Cache
id = Players[i];
if(user_has_weapon(id, CSW_C4))
{
if(get_pcvar_num(g_pcvarWait) < 1)
break;
client_print(id, print_chat, "You are allowed to plant after %d seconds", get_pcvar_num(g_pcvarWait));
}
}
if(task_exists(NO_CSDM_TASK_ID)) remove_task(NO_CSDM_TASK_ID);
set_task(get_pcvar_float(g_pcvarWait), "AllowPlanting", NO_CSDM_TASK_ID);
}
public eventBombPlanted()
{
new id = get_loguser_index();
if(!get_pcvar_num(g_pcvarWall))
return;
new Float:Origin[3], Float:Normal[3];
if(!fm_get_aim_origin_normal(id, Origin, Normal))
return;
new c4;
while((c4 = fm_find_ent_by_model(c4, "grenade", "models/w_c4.mdl")))
{
if(pev(c4, pev_movetype) == MOVETYPE_FLY || (pev(c4, pev_flags) & FL_ONGROUND))
continue;
set_pev(c4, pev_movetype, MOVETYPE_FLY);
Origin[1] -= 0.7;
engfunc(EngFunc_SetOrigin, c4, Origin);
new Float:Angles[3];
vector_to_angle(Normal, Angles);
Angles[1] -= 90.0;
Angles[2] -= 90.0;
set_pev(c4, pev_angles, Angles);
}
}
public eventBombExplode()
{
for(new i=0; i < STACK_SIZE; i++)
{
if(g_Planters[i] > 0)
{
g_Planters[i] = g_Planters[++i];
g_Planters[++i] = 0;
break;
}
}
}
public AllowPlanting() {}
public CreateBombTarget()
{
new NewBombTarget = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_bomb_target"))
if(NewBombTarget > 0)
{
dllfunc(DLLFunc_Spawn, NewBombTarget)
engfunc(EngFunc_SetSize, NewBombTarget, Float:{-100000.0,-100000.0,-100000.0}, Float:{100000.0,100000.0,100000.0})
}
}
stock get_loguser_index()
{
new Log[80], Name[32];
read_logargv(0, Log, 79);
parse_loguser(Log, Name, 31);
return get_user_index(Name);
}
// From fakemeta_util
stock fm_find_ent_by_model(index, const classname[], const model[])
{
new ent = index, mdl[72];
while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)))
{
pev(ent, pev_model, mdl, sizeof mdl - 1);
if (equal(mdl, model))
return ent;
}
return 0;
}
// From fakemeta_util (Combined 2 functions)
stock fm_get_aim_origin_normal(index, Float:origin[3], Float:normal[3]) {
new Float:start[3], Float:view_ofs[3];
pev(index, pev_origin, start);
pev(index, pev_view_ofs, view_ofs);
start[0] += view_ofs[0];
start[1] += view_ofs[1];
start[2] += view_ofs[2];
new Float:dest[3];
pev(index, pev_v_angle, dest);
engfunc(EngFunc_MakeVectors, dest);
global_get(glb_v_forward, dest);
dest[0] *= 54.0;
dest[1] *= 54.0;
dest[2] *= 54.0;
dest[0] += start[0];
dest[1] += start[1];
dest[2] += start[2];
engfunc(EngFunc_TraceLine, start, dest, 0, index, 0);
get_tr2(0, TR_vecEndPos, origin);
get_tr2(0, TR_vecPlaneNormal, normal);
new Float:fraction;
get_tr2(0, TR_flFraction, fraction);
if (fraction >= 1.0)
return 0;
return 1;
}