[ROZWIĄZANE] Klasy - Czy są dobrze napisane?
Najlepsza odpowiedź BlackPerfum 06.07.2014 18:37
Błędy/możliwości optymalizacje znalezione przeze mnie:
W lekkim wsparciu:
• Ta zmienna:
• Jeśli tworzysz zmienną:
• tak jak Wielkie Jol napisał nie wychwytujesz kiedy gracz będzie grał daną klasą
• Stała:
• Nie ma sensu łapać 2x dokładnie ten sam event:
• Używając tego:
Naprawione klasy: Przejdź do postu
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_HANDLEDW 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: Przejdź do postu
kakus002 06.07.2014
Witam, zrobiłem dwie klasy. Testując je na botach nic nie dziala ;x. Komplują sie bez błędów. Mógłby mi powiedzieć czy są dobrze napisane ?? Czy opis klasy zgadza z tym co jest w warunkach ?
Załączone pliki
rMentos 06.07.2014
co do klasy Lekkie Wsparcie - Opis +20 expa za zabójstwo a w pliku klasy .sma jest
cod_set_user_xp(attacker, cod_get_user_xp(attacker)+10000);
a co do klasy 2 to chyba jest dobrze.
kakus002 06.07.2014
Tak, wiem że jest 10000 ale zmieniłem to na 20 i tez nie dziala. Czy może to tylko nie działa na Botach ??
rMentos 06.07.2014
w masz wgrany silnik COD'a ? + klasy dopisane do plugins.ini albo plugins-cod.ini ?
Wielkie Jol
06.07.2014
Z tego co w marszałku zauważyłem, nie ma funkcji cod_class_disabled/enabled tak na pierwszy rzut oka,
Najlepsza odpowiedź
BlackPerfum
06.07.2014
Błędy/możliwości optymalizacje znalezione przeze mnie:
W lekkim wsparciu:
• Ta zmienna:
• Jeśli tworzysz zmienną:
• tak jak Wielkie Jol napisał nie wychwytujesz kiedy gracz będzie grał daną klasą
• Stała:
• Nie ma sensu łapać 2x dokładnie ten sam event:
• Używając tego:
Naprawione klasy:
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_HANDLEDW 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:
Załączone pliki
kakus002 06.07.2014
@UP dziekuje, jestem zielony w tych sprawach :}]
Użytkownik kakus002 edytował ten post 06.07.2014 18:42