Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.

  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie
CoD Nowy

[ROZWIĄZANE] Klasy - Czy są dobrze napisane?

cod nowy

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


  • Zamknięty Temat jest zamknięty
7 odpowiedzi w tym temacie

#1 kakus002

    (-.(-.(-.-).-).-)

  • Zbanowany

Reputacja: 164
Profesjonalista

  • Postów:209
  • Lokalizacja:OS
Offline

Napisano 06.07.2014 17:00

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



#2 rMentos

    Życzliwy

  • Zbanowany

Reputacja: -2
Mniej niż zer0.

  • Postów:24
  • Lokalizacja:Warszawa
Offline

Napisano 06.07.2014 17:07

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.



#3 kakus002

    (-.(-.(-.-).-).-)

  • Autor tematu
  • Zbanowany

Reputacja: 164
Profesjonalista

  • Postów:209
  • Lokalizacja:OS
Offline

Napisano 06.07.2014 17:20

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 ??



#4 rMentos

    Życzliwy

  • Zbanowany

Reputacja: -2
Mniej niż zer0.

  • Postów:24
  • Lokalizacja:Warszawa
Offline

Napisano 06.07.2014 17:35

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



#5 kakus002

    (-.(-.(-.-).-).-)

  • Autor tematu
  • Zbanowany

Reputacja: 164
Profesjonalista

  • Postów:209
  • Lokalizacja:OS
Offline

Napisano 06.07.2014 17:42

Taaak! ; /



#6 Wielkie Jol

    REPREZENTUJE SIEBIE I CAŁĄ GALAKTYKĘ

  • Support Team

Reputacja: 678
Wszechmogący

  • Postów:1258
  • GG:
  • Lokalizacja:AMXX
Offline

Napisano 06.07.2014 17:46

Z tego co w marszałku zauważyłem, nie ma funkcji cod_class_disabled/enabled tak na pierwszy rzut oka,


  • +
  • -
  • 0

"Żaden etyczny inżynier oprogramowania nie zgodzi się napisać procedury zniszczBagdad. Jego poczucie etyki domaga się, aby napisał procedurę zniszczMiasto, a Bagdad przekazał jako parametr" - Nathaniel Borenstein.


#7 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 06.07.2014 18:37   Najlepsza odpowiedź

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


  • +
  • -
  • 3
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#8 kakus002

    (-.(-.(-.-).-).-)

  • Autor tematu
  • Zbanowany

Reputacja: 164
Profesjonalista

  • Postów:209
  • Lokalizacja:OS
Offline

Napisano 06.07.2014 18:38

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


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






Również z jednym lub większą ilością słów kluczowych: cod nowy

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych