#include <amxmodx>
#include <reapi>
#include <fakemeta>
new g_iSpriteBeam;
public plugin_precache()
{
g_iSpriteBeam = precache_model("sprites/zbeam4.spr");
}
public plugin_init()
{
register_plugin("Bullets trace debug", "2.0", "RMZ / Gemini");
RegisterHookChain(RG_IsPenetrableEntity, "OnIsPenetrableEntity_Post", .post = true);
}
public OnIsPenetrableEntity_Post(const Float:vecSrc[3], const Float:vecEnd[3], const pAttacker, const iEnt)
{
if (!is_user_connected(pAttacker))
return HC_CONTINUE;
new Float:v_angle[3], Float:punchangle[3], Float:angles[3];
get_entvar(pAttacker, var_v_angle, v_angle);
get_entvar(pAttacker, var_punchangle, punchangle);
angles[0] = v_angle[0] + punchangle[0];
angles[1] = v_angle[1] + punchangle[1];
angles[2] = v_angle[2] + punchangle[2];
new Float:vecAimDir[3];
engfunc(EngFunc_MakeVectors, angles);
global_get(glb_v_forward, vecAimDir);
new Float:vecAimEnd[3];
vecAimEnd[0] = vecSrc[0] + vecAimDir[0] * 8192.0;
vecAimEnd[1] = vecSrc[1] + vecAimDir[1] * 8192.0;
vecAimEnd[2] = vecSrc[2] + vecAimDir[2] * 8192.0;
new tr = create_tr2();
engfunc(EngFunc_TraceLine, vecSrc, vecAimEnd, DONT_IGNORE_MONSTERS, pAttacker, tr);
new Float:vecCrosshairHit[3];
get_tr2(tr, TR_vecEndPos, vecCrosshairHit);
free_tr2(tr);
new Float:flDeviation = get_distance_f(vecCrosshairHit, vecEnd);
DrawBeam(vecSrc, vecCrosshairHit, 0, 0, 255);
DrawBeam(vecSrc, vecEnd, 0, 255, 0);
client_print(pAttacker, print_console, "[DEBUG] Отклонение: %.4f юнитов | Прицел: %.1f, %.1f, %.1f | Пуля: %.1f, %.1f, %.1f",
flDeviation, vecCrosshairHit[0], vecCrosshairHit[1], vecCrosshairHit[2], vecEnd[0], vecEnd[1], vecEnd[2]);
return HC_CONTINUE;
}
stock DrawBeam(const Float:Start[3], const Float:End[3], r, g, b)
{
message_begin_f(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_BEAMPOINTS);
write_coord_f(Start[0]);
write_coord_f(Start[1]);
write_coord_f(Start[2]);
write_coord_f(End[0]);
write_coord_f(End[1]);
write_coord_f(End[2]);
write_short(g_iSpriteBeam);
write_byte(0);
write_byte(0);
write_byte(100);
write_byte(3);
write_byte(0);
write_byte(r);
write_byte(g);
write_byte(b);
write_byte(255);
write_byte(0);
message_end();
}