←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Problem Segmentation fault

  • +
  • -
Andrzejek - zdjęcie Andrzejek 31.07.2014

Witam, jest jakiś sposób na namierzenie Segmentation fault?? Nie chce namierzyć dokładnego pluginu, który powoduje ten błąd, ale może jaki trop mały, bo analize pluginów nie zrobię, równie dobrze bym mógł cały AMXMODX wyłączyć, bo pluginy są połączone natywami i forwardami, wiec ma ktoś jakiś sposób? Pisać.

 

Pozdrawiam

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 31.07.2014

http://amxx.pl/topic...zukania-crashy/

Dodatkowo większość przypadków złapie coś takiego:
Załączony plik  WykrywaczBledow.sma   1,73 KB   140 Ilość pobrań
Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 31.07.2014

"Blad ogolny (nieznany badz niezdefiniowany) - no to sie wkopales"

xD

 

A np. sprawdzanie każdej funkcji, co by mi dało? tzn. daje log_to_file i co mi to da?

 

@edit. namierzyłem funkcje, która wykonywała się kilka razy na sekundę, sprawdzę czy to rozwiązało problem.

Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 31.07.2014

Znalazłem drugą funkcję, którą głupio zrobiłem, bo dałem sprawdzanie graczy do client_PreThink, jak dałem debuga to mi cała konsole zaśmieciło, wiec jak proponujecie? dodać sprawdzanie do publicu rozłączenia gracza, oraz do publicu śmierć gracza ?

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 31.07.2014

A np. sprawdzanie każdej funkcji, co by mi dało? tzn. daje log_to_file i co mi to da?

Chodzi ci o metodę "na diodę" ?? Jak tak to ona jest dobra tylko wtedy gdy wiemy w jakiej funkcji wydarza się błąd.

Znalazłem drugą funkcję, którą głupio zrobiłem, bo dałem sprawdzanie graczy do client_PreThink, jak dałem debuga to mi cała konsole zaśmieciło, wiec jak proponujecie? dodać sprawdzanie do publicu rozłączenia gracza, oraz do publicu śmierć gracza ?

Sprecyzuj żadnie
Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 31.07.2014

Bo ja pod client_PreThink dodałem sprawdzanie graczy, czyli zostanie ostatni gracz z TT i coś się tam robi, to pomyślałem żeby zamiast robić tego w client_PreThink może by dodać do client_disconnect oraz i eventu DeathMsg, i to na pewno by wpłynęło na działanie serwera. Zgadza się ?

 

I jeszcze jedno pytanko, jak zarejestrować event(np. CurWeapon) i message? Bo ja np. odrodzenie gracza rejestruje tak:

//jest włączone
if(!hOdrodzenieGracza) {

            hOdrodzenieGracza = RegisterHam(Ham_Spawn, "player", "OdrodzenieGracza", 1);

        }

        else {

            EnableHamForward(hOdrodzenieGracza);

        }
//jest wyłączone
if(hOdrodzenieGracza) {

            DisableHamForward(hOdrodzenieGracza);

        }
Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 31.07.2014

Thinka najlepiej nie używaj do niczego. Niestety przez niedopracowanie silnika trzeba łapać przyciski w thinku, także przetwarzać niestandardowe animacje. Nic innego nie ma prawa bytu w nim być.

Bo ja pod client_PreThink dodałem sprawdzanie graczy, czyli zostanie ostatni gracz z TT i coś się tam robi, to pomyślałem żeby zamiast robić tego w client_PreThink może by dodać do client_disconnect oraz i eventu DeathMsg, i to na pewno by wpłynęło na działanie serwera. Zgadza się ?

Zależy co dokładnie robisz. Połowa modułów (np. csx, engine) uzywają thinków by poprawnie działać (zazwyczaj thinka serwera) i nie wpływa to na działanie serwera. Nadmierne działanie w thinku skutkuje lagami gdyż robimy coś nie potrzebnie (czasem wystarczy dużo rzadziej coś robić). ZAWSZE szukaj innego wyjścia niż think!!!


I jeszcze jedno pytanko, jak zarejestrować event(np. CurWeapon) i message? Bo ja np. odrodzenie gracza rejestruje tak:

Event CurWeapon jest niewydajny i nie ważne co chcesz w nim robic mozna użyć innego bardziej optymalnego eventu ale i tak pokażę jak można go zarejestrować (jeśli chodziło ci o wiadomość do klienta):
register_message(get_user_msgid("CurWeapon"),"CurWeapon")
I łapiemy ten event w publicznej funkcji CurWeapon
Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 01.08.2014

 

I jeszcze jedno pytanko, jak zarejestrować event(np. CurWeapon) i message? Bo ja np. odrodzenie gracza rejestruje tak:

Event CurWeapon jest niewydajny i nie ważne co chcesz w nim robic mozna użyć innego bardziej optymalnego eventu ale i tak pokażę jak można go zarejestrować (jeśli chodziło ci o wiadomość do klienta):
register_message(get_user_msgid("CurWeapon"),"CurWeapon")
I łapiemy ten event w publicznej funkcji CurWeapon

 

 

A dało by jakoś to wyłączyć, gdy tego nie potrzebujemy ??

 

 

Thinka najlepiej nie używaj do niczego. Niestety przez niedopracowanie silnika trzeba łapać przyciski w thinku, także przetwarzać niestandardowe animacje. Nic innego nie ma prawa bytu w nim być.
 

Bo ja pod client_PreThink dodałem sprawdzanie graczy, czyli zostanie ostatni gracz z TT i coś się tam robi, to pomyślałem żeby zamiast robić tego w client_PreThink może by dodać do client_disconnect oraz i eventu DeathMsg, i to na pewno by wpłynęło na działanie serwera. Zgadza się ?

Zależy co dokładnie robisz. Połowa modułów (np. csx, engine) uzywają thinków by poprawnie działać (zazwyczaj thinka serwera) i nie wpływa to na działanie serwera. Nadmierne działanie w thinku skutkuje lagami gdyż robimy coś nie potrzebnie (czasem wystarczy dużo rzadziej coś robić). ZAWSZE szukaj innego wyjścia niż think!!!

 

 

np. task ?, bo ja mam zrobione tak ze mam taska hud, który jest odświeżany co 1 sek, wiec to by było rozwiązanie ??

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 01.08.2014

A dało by jakoś to wyłączyć, gdy tego nie potrzebujemy ??

register_message + unregister_message

np. task ?, bo ja mam zrobione tak ze mam taska hud, który jest odświeżany co 1 sek, wiec to by było rozwiązanie ??

Task'u powinno się uzywać TYLKO gdy chcemy by coś sie stało za określony czas i nie zawsze podczas inego zdarzenia

Poszukaj sobie eventy który będzi ci najbardziej pasował bo jeszcze nie powiedziałeś co dokładnie chcesz w nim robić:
http://amxx.pl/dokum.../fakemeta-const (Te z przedrostkiem FM_)
http://amxx.pl/dokum...a/i73/ham-const
https://wiki.alliedm...e_1_Game_Events
Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 01.08.2014

 

np. task ?, bo ja mam zrobione tak ze mam taska hud, który jest odświeżany co 1 sek, wiec to by było rozwiązanie ??

Task'u powinno się uzywać TYLKO gdy chcemy by coś sie stało za określony czas i nie zawsze podczas inego zdarzenia

Poszukaj sobie eventy który będzi ci najbardziej pasował bo jeszcze nie powiedziałeś co dokładnie chcesz w nim robić:
http://amxx.pl/dokum.../fakemeta-const (Te z przedrostkiem FM_)
http://amxx.pl/dokum...a/i73/ham-const
https://wiki.alliedm...e_1_Game_Events

 

 

Pisałem wyżej, ale napisze jeszcze raz, potrzebuje go do tego żeby co 1 sek lub nawet mniej, sprawdzać funkcje, w której się znajdują warunki odpowiednie warunki, którymi sprawdzam ilość graczy, bo np. od iluś graczy może dopiero plugin działać, dwa gdy zostanie ostatni TT włącza się odpowiednia funkcja, trzy sprawdzanie graczy na zabawach, tzn. ostatni gracz, jeżeli się ktoś odrodzi będzie dwóch i się resetuje, zabija tego jednego TT i zostaje ostatni wiezień, nie wiem czy jest dobrze zrozumiale napisane ;x

Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 01.08.2014

Teraz mam taki problem, że wyskakuje mi to:

 

error 017: undefined symbol "unregister_message"

 

Ale dopisałem bibliotekę wiec o co chodzi ?

 

@Edit, miałem nie aktualną wersje ;x

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 01.08.2014

Mam dla ciebie parę uwag:
1. Po co:

co 1 sek lub nawet mniej, sprawdzać funkcje, w której się znajdują warunki odpowiednie warunki, którymi sprawdzam ilość graczy

?? Najgorsze możliwe rozwiązanie... Łap Ham_Killed/DeathMsg/client_death lub coś podobnego. Do czegoś takiego nie wolno używac thinków!!!

2. Twój poprzedni opis sytuacji nie był dokładny. I tak na wszelki wypadek zarzuc kodem

3. Zazwyczaj nie opłaca się odrejestrowywać eventów. Kolejny powód byś pokazał kod
Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 01.08.2014

Wiesz, ja mam moda JB zrobionego tak, że zabawy, życzenie, menu to osobny plugin, nie mówię o JB Cypisa, bo ja zrobiłem swojego Moda. Ale co do sprawdzania, już mam pomysł jak to zrobić, ale co do Thinków, czy mogę sprawdzić a potem zablokować dalsze sprawdzanie(tzn. mam tak zrobione, tylko się pytam czy mogę tak używać) lub lepiej użyć taska ?

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 01.08.2014

ale co do Thinków, czy mogę sprawdzić a potem zablokować dalsze sprawdzanie(tzn. mam tak zrobione, tylko się pytam czy mogę tak używać) lub lepiej użyć taska ?

Thinka najlepiej nie używaj do niczego. Niestety przez niedopracowanie silnika trzeba łapać przyciski w thinku, także przetwarzać niestandardowe animacje. Nic innego nie ma prawa bytu w nim być.

A ty chcesz robić z taska think...
Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 01.08.2014

Czego mam użyć do jedno razowego sprawdzania(blokada może się wyłączyć kilka razy na mapę)? client_PreThink czy set_task(0.1, "Sprawdzanie", _, _, _, "b"); w plugin_init()

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 01.08.2014

client_PreThink czy set_task(0.1, "Sprawdzanie", _, _, _, "b"); w plugin_init()

Podałeś dwa thinki (twój sposób korzystania z tasku sprawia że jest nie udolnym thinkiem) zarazem podałeś dwie najgorsze możliwości. Nadal nie opisałeś dokładnie kiedy chcesz by zdarzenie się wykonało a poza tym:
• jesli chodzi ci o ilośc żywych graczy to:

Ham_Killed/DeathMsg/client_death

• ilośc graczy client_putinserver

Najlepiej pokaż kod+nadmiernie opisz co chcesz osiągnać a pokażę jak to zrobić
Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 01.08.2014

Co do sprawdzania ostatniego gracza, zastosowałem to co mi wyżej napisałeś, czyli sprawdzanie ilości przy śmierci gracza rtc.

A taska potrzebuje po to, żeby sprawdzić czy jest wymagana ilość graczy na serwerze, żeby plugin zaczął pracować. Rozumiesz ?

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 01.08.2014

client_connect / client_putinserver + client_disconnect?

Przecież gracz Ci się nie pojawi "nagle" na serwerze, zawsze towarzyszy mu wywołanie kilku forwardów. Tak samo nie zniknie nagle, wywoła się client_disconnect...

W zależności od tego, co według Ciebie oznacza gracz będący na serwerze (zakończył łączenie z serwerem, rozpoczął łączenie z serwerem, wszedł do teamu, zostało mu przyznane steamid). Tak samo przy rozłączaniu, możesz nie tylko śledzić client_disconnect ale też to, czy gracz nie opuścił teamu...

Zawsze jeśli chcesz sprawdzać, czy jakiś warunek jest spełniony, pomyśl kiedy może się on zmienić i tylko w tych miejscach, gdy się zmienia, go badaj.
Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 01.08.2014

Dokładnie mi chodzi "co według Ciebie oznacza gracz będący na serwerze" wszedł do teamu

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 01.08.2014

Wysłów się proszę zrozumiale...
Odpowiedz