/**
История изменений:
1.0 (16.03.2022) by b0t.
- Первый релиз;
2.0 (16.03.2022) by b0t.
- Отказ от старой проверки в пользу 'RG_IsPenetrableEntity';
- Блокировать прострел сквозь объекты, которые нельзя разрушить;
*Исключение: двери;
*/
new const VERSION[] = "2.0";
#include <amxmodx>
#include <fakemeta>
#include <reapi>
#define IsPlayer(%0) (1<=%0<=MaxClients)
enum _: { IGNORE = 0xA723, COLLISION, BREAKABLE }
new g_iFwdEntSpawn;
public plugin_precache() {
g_iFwdEntSpawn = register_forward(FM_Spawn, "fw_Spawn", true);
}
public fw_Spawn(eEnt) {
if(is_nullent(eEnt))
return;
if(FClassnameIs(eEnt,"func_door_rotating") || FClassnameIs(eEnt,"func_door"))
set_entvar(eEnt, var_impulse, IGNORE);
else if(FClassnameIs(eEnt,"func_wall"))
set_entvar(eEnt, var_impulse, COLLISION);
else if(FClassnameIs(eEnt,"func_breakable"))
set_entvar(eEnt, var_impulse, BREAKABLE);
}
public plugin_init() {
register_plugin("WallShotBlocking",VERSION,"b0t.");
RegisterHookChain(RG_IsPenetrableEntity,"RG_IsPenetrableEntity_Pre", .post = false);
unregister_forward(FM_Spawn, g_iFwdEntSpawn, true)
}
public RG_IsPenetrableEntity_Pre(const Float:fVecStart[3],const Float:fVecEnd[3],const pAttacker,const iEnt) {
client_print_color(pAttacker, print_team_default, "[%i]", Is_ShootThrough(iEnt));
if(!Is_ShootThrough(iEnt))
return HC_CONTINUE;
SetHookChainReturn(ATYPE_BOOL,false);
return HC_SUPERCEDE;
}
stock bool:Is_ShootThrough(const eEnt) {
if(IsPlayer(eEnt))
return false;
switch(get_entvar(eEnt, var_impulse))
{
case IGNORE: return false;
case COLLISION: return true;
case BREAKABLE: if(Float:get_entvar(eEnt,var_takedamage) == DAMAGE_NO) return true;
}
return false;
}