if(get_user_team(this) == get_user_team(idattacker))
return HAM_IGNORED;
Jeśli podłożysz bombę, to jesteś idattacker, a będą raniony tą bombą, jesteś this, więc ten warunek będzie prawdziwy, tym samym funkcja zwróci HAM_IGNORED, zamiast zablokować obrażenia.
Ja mam do Ciebie podstawowe pytanie: czy wiesz, za co odpowiadają parametry funkcji TakeDamage?
@edit: Napisałem prosty plugin, który pokazuje, jak wygląda zadawanie obrażeń przez C4 z niewielkiej odległości.
#include <amxmodx>
#include <hamsandwich>
public plugin_init(){
register_plugin("Test", "0.1", "benio101");
RegisterHam(Ham_TakeDamage, "player", "TakeDamage", 0);
}
public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
if(is_user_connected(this)){
client_print(this, print_console, "%i attacked %i by %i with %.f dmg", idattacker, this, idinflictor, damage);
}
}
C4 podłożyłem na środku BSa "B" na
dd2 i oddaliłem się ku drzwiom. Rezultat:
1 attacked 1 by 127 with 267 dmg
Trzeba także uwzględnić byty typu env_explosion, które towarzyszą obrażeniom bomby, które mogą nas skutecznie zabić jeszcze przed otrzymaniem obrażeń od C4, przykład:
125 attacked 1 by 125 with 37 dmg
126 attacked 1 by 126 with 42 dmg
130 attacked 1 by 130 with 56 dmg
Trzeba zatem wziąć to pod uwagę.
Najważniejsze jednak w Twoim przypadku będzie poznanie, czemu odpowiadają poszczególne argumenty funkcji.
this oznacza ofiarę, osobę, która otrzymuje obrażenia,
idinflictor to id bytu, zadającego obrażenia, np. id broni wroga, a
idattacker to id atakującego, np. wroga, najczęściej jest to właściciel broni, od której otrzymujemy obrażenia, choć nie zawsze,
damage to wartość obrażeń (float), a
damagebits to suma binarna typów otrzymywanych obrażeń (czyt. manual).