←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

CoD Nowy
[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:
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ą sad.png

• 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 kwasny.gif

• 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
Zablokowany

kakus002 - zdjęcie 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

Odpowiedz

rMentos - zdjęcie 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.

Odpowiedz

kakus002 - zdjęcie 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 ??

Odpowiedz

rMentos - zdjęcie rMentos 06.07.2014

w masz wgrany silnik COD'a ? + klasy dopisane do plugins.ini albo plugins-cod.ini ?

Odpowiedz

kakus002 - zdjęcie kakus002 06.07.2014

Taaak! ; /

Odpowiedz

  • +
  • -
Wielkie Jol - zdjęcie 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,

Odpowiedz

  • +
  • -
Najlepsza odpowiedź BlackPerfum - zdjęcie BlackPerfum 06.07.2014

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ą sad.png

• 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 kwasny.gif

• 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

Odpowiedz

kakus002 - zdjęcie kakus002 06.07.2014

@UP dziekuje, jestem zielony w tych sprawach :}]


Użytkownik kakus002 edytował ten post 06.07.2014 18:42
Odpowiedz
Zablokowany