Błędy/możliwości optymalizacje znalezione przeze mnie:
W lekkim wsparciu:
• Ta zmienna:
new Float:redukcja_obrazen_gracza[33];
nie musi być globalna a nawet wcale nie musi jej być
• Jeśli tworzysz zmienną:
new ma_klase[33]
w której chcesz przetrzymywać tylko dwie możliwe wartości to polecam by ta zmienna posiadała odpowiedni typ tzn. przedrostek
bool: przy tworzeniu:
new bool:ma_klase[33]
• Poczytaj sobie o możliwych wartościach w 3 parametrze
register_event bo nie wiem czy wiesz co zrobiłeś:
register_event("DeathMsg", "Death", "ade")
• Jeśli zmieniasz wartość jednego z argumentów w hamsandwichu to powinnieneś zwrócić
HAM_HANDLED
W marszalku:
• tak jak
Wielkie Jol
napisał nie wychwytujesz kiedy gracz będzie grał daną klasą
• Stała:
#define DMG_BULLET (1<<1)
jest już zdefiniowana w pliku nagłówkowym
• Nie ma sensu łapać 2x dokładnie ten sam event:
RegisterHam(Ham_TakeDamage, "player", "TakeDamage");
RegisterHam(Ham_TakeDamage, "player", "DMG");
• Przestraszyłem się:
public DMG(this, idinflictor, idattacker, Float:damage, damagebits)
{
if(!ma_klase[idattacker])
return HAM_IGNORED;
// Najpierw sprawdzaj czy gracz jest podłączony bo jeśli jakiś byt (nie gracz) zabije gracza
// to wyskoczy log index out of bounds tzn. bo zmienna "ma_klase" ma tylko 33 kamórki (ale index ostatniej to 32 bo pierwszej == 0) a ten byt będzie posiadał id > 32 :(
if(!is_user_connected(this))
return HAM_IGNORED;
if(damage<=0)
return HAM_IGNORED;
//To akurat nie ma sensu bo załóżmy że jakiś inny plugin zmodyfikował dmg tak że jest mniejsze od 0
//myśląc logicznie dmg nie ma prawa być mniejsze od zera a nawet więcej powinno byc większe od zera
//bo przestało by być obrażeniami!!
if(random_num(1, 1)!=1)
return HAM_IGNORED;
//to tak samo jak bym zrobił tak:
// if(!true) return HAM_IGNORED
//Nigdy się nie spełni warunek
if(get_user_team(this)==get_user_team(idattacker) && get_user_weapon(idattacker) == CSW_USP && damagebits & DMG_BULLET)
cod_inflict_damage(idattacker, this, damage*2.0, 0.0, idinflictor, damagebits);
//zacznijmy od tego że robiąc tak nie podwojisz graczy dmg a potrojisz!! Bo funkcja: cod_inflict_damage
//nie zwiększa dmg a je zadaje czyli jeśli gracz zada 10 dmg to dodatkowo jeszcze 20 a zatem łącznie zada 30 dmg!!
//Ponadto tej funkcji nie powinno sie stosować do (pseudo)zwiększania dmg bo te dmg nie będzie wykrywane przez Ham_TakeDamage
//a zatem inne pluginy kożystające z tego eventu nie będą mogły wychwycić tego dmg!!!
return HAM_IGNORED;
}
• Twoja funkcja na 1/4 z he ma 99.(9)% że zadzaiła nie wtedy kiedy powinna!! Dlaczego? Przypatrz się:
if(get_user_team(this) != get_user_team(idattacker) && get_user_weapon(idattacker) == CSW_HEGRENADE && damagebits & DMG_HEGRENADE && random_num(1, 4) == 1)
Pomińmy zbędne rzeczy:
if(get_user_weapon(idattacker) == CSW_HEGRENADE)
Teraz pytanie kiedy funkcja
get_user_weapon zwraca
CSW_HEGRENADE a no wtedy i tylko wtedy gdy gracz
trzyma w ręce HE czyli kiedy go rzuci to zmienia wartość a trzeba pamiętać iż zanim HE wybuchnie musimy go puścić czyli
get_user_weapon nie przyda nam się do sprawdzenia czy dmg było spowodowane z he
• Używając tego:
cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits)
nie zabijesz gracza a jedynie zadasz mu dmg które
może(nie musi!!) go zabić. Funkcja na zabijanie gracza:
http://amxx.pl/topic...nie-gracza-zarządzanie-broniami/
Naprawione klasy: