I made this plugin to fix that blocking door opening. It doesn't work. Can you make my plugin as I want as. Thanks for helping
PHP Code:
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
new entities[][] = {
"func_door",
"func_door_rotating",
"func_rotating",
"momentary_door",
"env_laser",
"env_beam",
"env_explosion",
"func_breakable"
}
new bool:g_semiclip[33], semiclip;
new bool:g_semiclip_block;
public plugin_init() {
register_plugin("Semiclip", "1.0", "PurposeLess");
register_forward(FM_StartFrame, "fwStartFrame", 0);
register_forward(FM_AddToFullPack, "fwFullPack", 1);
register_forward(FM_ShouldCollide, "FwdShouldCollide");
for(new i=0; i<sizeof entities; i++)
{
RegisterHam(Ham_Blocked, entities[i], "Ham_Block");
}
bind_pcvar_num(create_cvar("semiclip", "1", FCVAR_NONE, "Semiclip", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0), semiclip);
}
public Ham_Block(id, ent)
{
if(!semiclip) return HAM_IGNORED;
g_semiclip_block = true;
return HAM_IGNORED;
}
public fwFullPack(es, e, ent, host, flags, player, set)
{
if(!semiclip) return FMRES_IGNORED;
if(player && g_semiclip[ent] && g_semiclip[host])
{
set_es(es, ES_Solid, SOLID_NOT);
set_es(es, ES_RenderMode, kRenderTransAlpha);
set_es(es, ES_RenderAmt, 100);
}
return FMRES_IGNORED;
}
public fwStartFrame()
{
if(!semiclip) return FMRES_IGNORED;
new team[33] = {-1, ...};
arrayset(g_semiclip, 0, sizeof(semiclip));
for(new id=1; id<=32; id++)
{
if(!is_user_alive(id)) continue;
for(new Uid=1; Uid<=32; Uid++)
{
if(id == Uid || !is_user_alive(Uid)) continue;
static Float:vOrigin1[3], Float:vOrigin2[3];
pev(id, pev_origin, vOrigin1);
pev(Uid, pev_origin, vOrigin2);
if(vector_distance(vOrigin1, vOrigin2) < 96)
{
if(team[id] == -1)
team[id] = get_user_team(id);
if(team[Uid] == -1)
team[Uid] = get_user_team(Uid);
if(team[id] == team[Uid])
{
g_semiclip[id] = true;
g_semiclip[Uid] = true;
}
}
}
set_pev(id, pev_solid, g_semiclip[id] ? SOLID_NOT:SOLID_SLIDEBOX);
}
return FMRES_IGNORED;
}
#define IsPlayer(%1) (1 <= %1 <= get_maxplayers())
public FwdShouldCollide(const touched, const other)
{
if(!semiclip) return FMRES_IGNORED;
if(g_semiclip_block)
{
new iTeams[33] = {-1, ...};
if(IsPlayer(touched) && IsPlayer(other)) {
iTeams[touched] = get_user_team(touched);
iTeams[other] = get_user_team(other);
if(iTeams[touched] == iTeams[other]) {
forward_return(FMV_CELL, 0)
return FMRES_SUPERCEDE;
}
}
g_semiclip_block = false;
}
return FMRES_IGNORED;
}