Well, technically we can just block every damage from before the trace attack to after the trace attack. This solve the problem. (To make sure I will check this in more situations.)
After all this still be a problem or a bug. I think something is wrong in the general amxmodx. As soon as I can I will check the cpp files to find solution but i don't promise. My view is that the bug should be connected to the global trace attack. For some unknow reason the addon can't empty the trace puffer or something like that. Maybe it is all bullsh*t but who knows?
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>
#include <fakemeta_util>
new g_beam_sprite, g_log[128], bool: g_block_damage;
public plugin_init() {
register_clcmd("att", "cmd_att");
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage_Post", 1)
RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Post", 1);
}
public plugin_precache() {
g_beam_sprite = precache_model("sprites/laserbeam.spr")
}
public cmd_att(id) {
new Float: origin[3], Float: view_ofs[3], Float: v_angle[3], Float: direction[3], Float: end_origin[3];
pev(id, pev_origin, origin);
pev(id, pev_view_ofs, view_ofs);
xs_vec_add(origin, view_ofs, origin);
pev(id, pev_v_angle, v_angle);
angle_vector(v_angle, ANGLEVECTOR_FORWARD, v_angle);
xs_vec_add_scaled(origin, v_angle, 200.0, end_origin);
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_BEAMPOINTS);
write_coord_f(origin[0]);
write_coord_f(origin[1]);
write_coord_f(origin[2]);
write_coord_f(end_origin[0]);
write_coord_f(end_origin[1]);
write_coord_f(end_origin[2]);
write_short(g_beam_sprite);
write_byte(0);
write_byte(0);
write_byte(10);
write_byte(10);
write_byte(0);
write_byte(255);
write_byte(255);
write_byte(80);
write_byte(170);
write_byte(0);
message_end();
new trace = create_tr2();
engfunc(EngFunc_TraceLine, origin, end_origin, DONT_IGNORE_MONSTERS, id, trace);
new victim_id = get_tr2(trace, TR_pHit);
if ( victim_id == -1 ) {
victim_id = 0
set_tr2(trace, TR_pHit, victim_id);
}
new Float: damage = 50.0;
formatex(g_log, charsmax(g_log), "CMD ATT! FROM %n TO %n WITH %.2f", id, victim_id, damage);
client_print(0, print_chat, g_log);
log_to_file("att.log", g_log);
g_block_damage = true;
ExecuteHamB(Ham_TraceAttack, victim_id, id, damage, direction, trace, DMG_NEVERGIB|DMG_BULLET);
g_block_damage = false;
// TAKE DAMAGE WILL BE HERE
free_tr2(trace);
}
public fw_TakeDamage(victim_id, inflictor, attacker_id, Float:damage, bits) {
if ( g_block_damage )
return HAM_SUPERCEDE;
formatex(g_log, charsmax(g_log), "TAKE DAMAGE PRE! FROM %n TO %n WITH %.2f", attacker_id, victim_id, damage);
client_print(0, print_chat, g_log);
log_to_file("att.log", g_log);
return HAM_IGNORED;
}
public fw_TakeDamage_Post(victim_id, inflictor, attacker_id, Float:damage, bits) {
if ( g_block_damage )
return HAM_SUPERCEDE;
formatex(g_log, charsmax(g_log), "TAKE DAMAGE POST! FROM %n TO %n WITH %.2f", attacker_id, victim_id, damage);
client_print(0, print_chat, g_log);
log_to_file("att.log", g_log);
return HAM_IGNORED;
}
public fw_TraceAttack_Post(victim_id, attacker_id, Float: damage, Float: direction[3], trace, damagebits) {
formatex(g_log, charsmax(g_log), "TRACE ATTACK! FROM %n TO %n WITH %.2f", attacker_id, victim_id, damage);
client_print(0, print_chat, g_log);
log_to_file("att.log", g_log);
return HAM_IGNORED;
}
Thanks for all the thinking I won't close this topic so if you have any information or idea don't keep it back.