Już spieszę ci z wyjaśnieniem w czym leży problem.
Przedstawię ci kod natywu cod_inflict_damage
public ZadajObrazenia(atakujacy, ofiara, Float:obrazenia, Float:czynnik_inteligencji, byt_uszkadzajacy, dodatkowe_flagi)
ExecuteHam(Ham_TakeDamage, ofiara, byt_uszkadzajacy, atakujacy, obrazenia+PobierzInteligencje(atakujacy, 1, 1, 1)*czynnik_inteligencji, /*1<<31 |*/ dodatkowe_flagi);
Co na temat ExecuteHam mówi nam dokumentacja ?
Cytuję: "Wywołuje zdarzenie (z ham_const) ale nie jest ono wychwytywane przez RegisterHam." Więc znasz już przyczynę dlaczego gracz z tym perkiem może zabijać graczy nie będących jako pierwszy w kolejce. No bo w końcu jak zablokować coś czego nie da się uchwycić ?
Dlatego dobrym rozwiązaniem była by zmiana :
cod_inflict_damage(idattacker, this, float(wartosc_perku[idattacker]), 0.0, idinflictor, damagebits);
na funckję ExecuteHamB ( ExecuteHamB ), która w odróżnieniu od w/w jest przechwytywana.
Funkcja wywołuje wydarzenie kanapki (czyli wydarzenia z ham_const).
W przeciwieństwie do ExecuteHam ta funkcja dodatkowo jest wychwytywana przez RegisterHam/RegisterHamFromEntity
Niestety, tutaj rodzi nam się kolejny problem. Bo w/w funkcja wywoła nam zdarzenie, które z kolei wywoła to samo zdarzenie, zakreślając błędne koło. Dlatego musimy przechytrzyć ten mechanizm, np. definiując sobie nowy dmgbits bądź nowy byt zadający dmg ( idinflictor ).
Musimy przerwać tę operację, wiedząc, że otrzymane obrażenia pochodzą od naszego perku.
#define perk_DMGiD 2849
[...]
public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
if(!is_user_connected(idattacker))
return HAM_IGNORED;
if(idinflictor == perk_DMGiD)
return HAM_IGNORED;
if(ma_perk[idattacker])
ExecuteHamB(Ham_TakeDamage, this, perk_DMGiD, idattacker, float(wartosc_perku[idattacker]), damagebits)
return HAM_IGNORED;
}
Skoro już nasze zdarzenie jest przechwytywane to całą brudną robotę powinien zrobić już za nas plugin od kolejki blokując zadawane obrażenia osobom nie będącym liderem listy.
Enjoy