Skocz do zawartości

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

zbugowane resetowanie zmiennych co rundę


Najlepsza odpowiedź _McHappy, 14.12.2017 13:17

Po podstawieniu przykładowych danych do Twojego kodu:

// Pusta pętla - 12 graczy na serwerze: (i=0 >= 12 <==> false)
public Poczatek_Rundy()
    for(new i=0;i>=12;i++)
       g_times_bought[i]=0;
        

// Pętla nieskończona - 0 graczy na serwerze (i=0 >= 0 <==> true), potem (i=1 >= 0 <==> true) i tak w eter.
public Poczatek_Rundy()
    for(new i=0;i>=0;i++)
       g_times_bought[i]=0;

Uwzględnianie i=0 w pętli też nie ma większego sensu, czyli:

public Poczatek_Rundy() 
	for(new i=0;i>=get_maxplayers();i++) 
		g_times_bought[i]=0;

->

public Poczatek_Rundy()
    for(new i=1;i<=get_maxplayers();i++)
        g_times_bought[i]=0;

Zaleca się dodatkowo utworzyć - tuż przed pętlą - zmienną w stylu: iMaxPlayers = get_maxplayers(); - pozwala to zoptymalizować działanie pętli:

public Poczatek_Rundy() 
{
	new iMaxPlayers = get_maxplayers();
	
	for(new i=1;i<=iMaxPlayers;i++) 
		g_times_bought[i]=0;
}
Przejdź do postu


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
4 odpowiedzi w tym temacie

#1 Robiin

    Godlike

  • Support Team

Reputacja: 1 107
Super Hero

  • Postów:2 051
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 14.12.2017 10:17

Od pewnego momentu (niestety nie jestem w stanie wskazać kiedy konkretnie, bo gdyby tak było, to zapewne sam bym doszedł do rozwiązania) zmienne (lub cały public?) od początku rundy się nie zerują. Przykładowo;

register_logevent("Poczatek_Rundy", 2, "1=Round_Start")
public Poczatek_Rundy() for(new i=0;i>=get_maxplayers();i++) g_times_bought[i]=0;

Nie zapominając, że jest to zombie 4.3, co (z tego co wiem) wpływa na koniec/początek rundy przez tworzenie swojego MultiForwarda

g_fwRoundStart = CreateMultiForward("zp_round_started", ET_IGNORE, FP_CELL, FP_CELL)
g_fwRoundEnd = CreateMultiForward("zp_round_ended", ET_IGNORE, FP_CELL)

Co do pętli z g_times_bought[i]=0:

#define MAX_BUYS 3
if(g_times_bought[id] >= MAX_BUYS){
			ColorChat(id, GREEN, "[%s] %s^x01 kupiles juz^x04 %i^x01/^x04%i^x01 granatow.",forum,name,g_times_bought[id],MAX_BUYS);
			return ZP_PLUGIN_HANDLED
		} else if(!g_has_pumpkin[id]){
			g_times_bought[id]++
			emit_sound(id, CHAN_ITEM, sound_buyammo, 1.0, ATTN_NORM, 0, PITCH_NORM)
		}

Ten sam problem występuje z innymi Extra Itemami.

 

- Próbówałem wyłączać pluginy odpowiadające za wszystkie dodatki (extra itemy, addony, klasy) poza silnikiem i wymaganymi standardowymi klasami zombie - nie rozwiązało to problemu, być może leży w silniku.

- Mniej więcej od tego samego czasu pojawił się błąd z respawnem zombie, który dokładniej opisałem na alliedach: https://forums.allie...ad.php?t=303535 - szukałem fixa, lub też istniejącego już tematu związanego z respawnem, ale (przynajmniej do wersji fixa zp 4.3 5.a) autor nie wspomniał o respawnie.

 


  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#2 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 14.12.2017 10:33

public Poczatek_Rundy() for(new i=0;i>=get_maxplayers();i++) g_times_bought[i]=0;

Ta pętla będzie miała sens, gdy na serwerze nie będzie graczy - wtedy stanie się pętlą nieskończoną, a amxx wyrzuci błąd wykroczenia poza rozmiar tablicy.

Co do bugu odradzania, zalecałbym prosty test warunków (jeżeli odradzanie nie działa za każdym razem, gdy zombie zginie). Przed każdym warunkiem funkcji 'fw_PlayerKilled_Post' wyświetl w konsoli dowolną, rozróżnialną wiadomość i sprawdź, do którego momentu kod jest realizowany.

Użytkownik _McHappy edytował ten post 14.12.2017 10:53

  • +
  • -
  • 0

#3 Robiin

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 107
Super Hero

  • Postów:2 051
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 14.12.2017 11:47

public Poczatek_Rundy() for(new i=0;i>=get_maxplayers();i++) g_times_bought[i]=0;

Ta pętla będzie miała sens, gdy na serwerze nie będzie graczy - wtedy stanie się pętlą nieskończoną, a amxx wyrzuci błąd wykroczenia poza rozmiar tablicy.

Co do bugu odradzania, zalecałbym prosty test warunków (jeżeli odradzanie nie działa za każdym razem, gdy zombie zginie). Przed każdym warunkiem funkcji 'fw_PlayerKilled_Post' wyświetl w konsoli dowolną, rozróżnialną wiadomość i sprawdź, do którego momentu kod jest realizowany.

 

Chyba nie rozumiem, funkcja get_maxplayers() zwraca maksymalną możliwą ilość graczy (jednoznaczne z ilością slotów), zamysłem pętli miało być uniknięcie wykonywania się 32 razy, a ilość razy, jaką serwer może mieć maksymalnie na sobie - ilość slotów.

https://amxx.pl/doku.../get_maxplayers

 

Za chwilę sprawdzę printowanie w konsoli


  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#4 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 14.12.2017 13:17   Najlepsza odpowiedź

Po podstawieniu przykładowych danych do Twojego kodu:

// Pusta pętla - 12 graczy na serwerze: (i=0 >= 12 <==> false)
public Poczatek_Rundy()
    for(new i=0;i>=12;i++)
       g_times_bought[i]=0;
        

// Pętla nieskończona - 0 graczy na serwerze (i=0 >= 0 <==> true), potem (i=1 >= 0 <==> true) i tak w eter.
public Poczatek_Rundy()
    for(new i=0;i>=0;i++)
       g_times_bought[i]=0;

Uwzględnianie i=0 w pętli też nie ma większego sensu, czyli:

public Poczatek_Rundy() 
	for(new i=0;i>=get_maxplayers();i++) 
		g_times_bought[i]=0;

->

public Poczatek_Rundy()
    for(new i=1;i<=get_maxplayers();i++)
        g_times_bought[i]=0;

Zaleca się dodatkowo utworzyć - tuż przed pętlą - zmienną w stylu: iMaxPlayers = get_maxplayers(); - pozwala to zoptymalizować działanie pętli:

public Poczatek_Rundy() 
{
	new iMaxPlayers = get_maxplayers();
	
	for(new i=1;i<=iMaxPlayers;i++) 
		g_times_bought[i]=0;
}

Użytkownik _McHappy edytował ten post 14.12.2017 13:26

  • +
  • -
  • 1

#5 Robiin

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 107
Super Hero

  • Postów:2 051
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 14.12.2017 14:52

Nawet nie zauważyłem tego :P Rzeczywiście, masz rację, dziękuję ;)

 

A co do respów to zaraz napiszę jak to wyszło.


  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.





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

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