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

[ROZWIĄZANE] Pytania o get_maxplayers(), szanse na perk, if(random(x))...


Najlepsza odpowiedź sebul, 08.11.2013 21:29

1.1. Nie.
1.2. Nie słyszałem nic o tym, ale na pewno nie, zresztą u mnie przez to problemów nie ma.
1.3. Nie da się w taki sposób utworzyć zmiennej, jak już to poprzez zdefiniowanie stałej.
2. Ponownie losuje, żeby w ogóle nie dawało perku, to trzeba w silniku to ustawić.
3. Prawdą logiczną jest wszystko inne od 0, a nie tylko 1.
4. X razy. Przejdź do postu


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

#1 Lacostii

    Profesjonalista

  • Użytkownik

Reputacja: 40
Pomocny

  • Postów:172
  • Lokalizacja:Poland
Offline

Napisano 08.11.2013 21:22

Witam mam kilka pytań, a mianowicie:

 

1.1 Czy ID gracza ma szansę kiedykolwiek być większe od get_maxplayers()?

1.2 get_maxplayers() nie ma problemu z ukrytym slotem poprzez amx_hideslots?

1.2 Czy używanie zmiennej z get_maxplayers()+1 do określenia maksymalnej liczby graczy w tablicy jest dobrym nawykiem optymalizacyjnym czy może nie ma dużej różnicy czy użyjemy tablicy [33] ?

 

2. Czy sposób na rzadsze wypadanie perku opisane w tym temacie: http://amxx.pl/topic...padania-perków/ . Odbywa się poprzez ponowne wylosowanie perku gdy dojdzie do "return COD_STOP" czy po prostu po zabiciu osoby nie dostajemy perku w ogóle?

 

3. if(random(x)) - Czy kod pod takim warunkiem zostanie wykonany tylko gdy z random'a wyjdzie 1? Pytam o taką oczywistość, bo zawsze mi się wydawało, że wystarczy większe od 0, a niedawno spotkałem się z kodem na forum, z którego wynika inaczej.

 

4. Moje pytanie wtrącone w inny temat, które nie doczekało się odpowiedzi, a nadal mnie ciekawi:

Gdy mam X pluginów wywołujących funkcję od "Ham_TakeDamage" w tym samym momencie i każda funkcja zaczyna się od warunku is_user_connected(id) to czy to zapytanie zostanie wykonane X razy, czy może silnik zdaje sobie sprawę, że otrzyma X tych samych zapytań i załatwia to w jednej odpowiedzi?

 

Dziękuję za jakiekolwiek odpowiedzi.

Pozdrawiam.


  • +
  • -
  • 0

Zapraszam na forum Classic-Zone.pl . ;)


#2 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 08.11.2013 21:29   Najlepsza odpowiedź

1.1. Nie.
1.2. Nie słyszałem nic o tym, ale na pewno nie, zresztą u mnie przez to problemów nie ma.
1.3. Nie da się w taki sposób utworzyć zmiennej, jak już to poprzez zdefiniowanie stałej.
2. Ponownie losuje, żeby w ogóle nie dawało perku, to trzeba w silniku to ustawić.
3. Prawdą logiczną jest wszystko inne od 0, a nie tylko 1.
4. X razy.
  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#3 Lacostii

    Profesjonalista

  • Autor tematu
  • Użytkownik

Reputacja: 40
Pomocny

  • Postów:172
  • Lokalizacja:Poland
Offline

Napisano 08.11.2013 22:05

1.3 Miałem na myśli bodajże zmienną globalną (nie orientuję się najlepiej jak wszystko dokładnie się nazywa, istnieje jakiś słowniczek/tutorial?  ;> ) utworzoną poza funkcjami z wartością przypisaną w public plugin_cfg(). Teraz zaczynam rozumieć mój błąd, bo globalna tablica nie zdążyłaby by przyjąć wartości od tej "zmiennej" z get_maxplayers(), bo ona aktualnie byłaby zerem.  Czyli rozumiem, że jedynym wyjściem jest przykładowo takie coś?

#define SLOTS 23

new tablica[SLOTS+1]

A jak się ma to teraz do optymalizacji, jak nie żal mi czasu to warto tak nawet robić dla jednej tablicy w pluginie?

 

3. Czyli tak jak myślałem, dlatego zadziwia mnie kod w tym temacie: http://amxx.pl/topic...między-klasami/

if(random(19))
{
cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);
}

Oni to mają za 1/20 (19) , natomiast ja to widzę jako 18/19, a niby im działa, więc ja jestem lekko zdezorientowany co jest teraz właściwe.


  • +
  • -
  • 0

Zapraszam na forum Classic-Zone.pl . ;)


#4 Aemiksowy

    Banned

  • Zbanowany

Reputacja: 34
Życzliwy

  • Postów:222
  • Lokalizacja::)
Offline

Napisano 08.11.2013 22:37

1.2 nie. Nawet jak ustawisz hideslot 1, to pobierana wartość jest z "linii startowej". Może nie do końca dobrze mówię, bo nie wiem czy tak rzeczywiście jest, ale mam nadzieję, że sens będzie zrozumiały. Zwróć uwagę, że wpisując "status" w konsoli wyświetla Ci się poprawna wartość slotów (nie bierze pod uwagę ukryte). Funkcja get_maxplayers też będzie poprawnie zwracać to, bez względu na to czy masz ukryte. Mimo, że nie ma tu dużego związku, to chodzi o sam sens przekazu. Przynajmniej ja zawsze testując to nie zauważyłem, aby hideslot był brany pod uwagę w tej funkcji.

 

1.3 Sama nazwa wskazuje co to jest zmienna globalna. Nie potrzeba filozofii czy tutków do tego.

To, czy zrobisz:

 

new tablica[24] lub new tablica[33] (od razu) bądź tak, jak wyżej nie zrobi dużej różnicy, bo to nie o ten sens chodzi. Chodzi o to, że czasem niepotrzebnie jest tworzenie dla zmiennej takiej wielkości tablicy. Polecam poczytać też: http://darkgl.amxx.p...amieci-pluginu/


Użytkownik Aemiksowy edytował ten post 08.11.2013 22:38


#5 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 08.11.2013 22:54

3. Czyli tak jak myślałem, dlatego zadziwia mnie kod w tym temacie: http://amxx.pl/topic...między-klasami/

if(random(19))
{
cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);
}
Oni to mają za 1/20 (19) , natomiast ja to widzę jako 18/19, a niby im działa, więc ja jestem lekko zdezorientowany co jest teraz właściwe.

if(!random(19))

I będzie 1/19.
  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#6 Lacostii

    Profesjonalista

  • Autor tematu
  • Użytkownik

Reputacja: 40
Pomocny

  • Postów:172
  • Lokalizacja:Poland
Offline

Napisano 08.11.2013 23:04

1.3 Nie chcę się jedynie opierać na domysłach, a chodziło mi o moją niewiedzę w nazewnictwie na większą skalę niż sama "zmienna globalna".

Raczej nie zrozumiałem o co chodzi: o_O

"Chodzi o to, że czasem niepotrzebnie jest tworzenie dla zmiennej takiej wielkości tablicy"

 

Z linku wynikałoby, że dobrze by było zrobić

new slots=25
new tablica[slots+1]

Jednak sprawdziłem i kompilator tego nie przyjmie. Wiem, że trochę za dużo gadania jak na taką pierdółkę, ale chce wiedzieć jak najlepiej to robić, w przypadku gdy np. jest sporo tablic(gdy jedna to faktycznie jak piszesz można dać "new tablica[24]" nie bawiąc się w #define), bo mnie głównie się rozchodzi o optymalne działanie pluginu.

 

5. Jeszcze jedna rzecz mnie ciekawi, którą niedawno miałem okazję widzieć, a nie wiem czy jest błędem czy nieznaną mi metodą:

new tablica[10] = 111

Czy to sprawi, że w tej tablicy na start każda wartość wynosi 111 zamiast 0 ?


Użytkownik Lacostii edytował ten post 08.11.2013 23:06

  • +
  • -
  • 0

Zapraszam na forum Classic-Zone.pl . ;)


#7 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 08.11.2013 23:58

5. Jeszcze jedna rzecz mnie ciekawi, którą niedawno miałem okazję widzieć, a nie wiem czy jest błędem czy nieznaną mi metodą:

new tablica[10] = 111
Czy to sprawi, że w tej tablicy na start każda wartość wynosi 111 zamiast 0 ?

Nie.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#8 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 09.11.2013 14:57

Sprostowanie do 1.1, TAK, MOŻE WYSTĄPIĆ ID WIĘKSZE!!!

 

Jest to ogólny bug HLDS, gdy ktoś wychodzi z serwera ID jest zwalniane, ale jeśli nastąpi timeout może się zdarzyć tak, że HLDS dalej ID gracza zajmuje, jednak ogólną liczbę graczy na serwerze zmniejsza. Mamy wtedy do czynienia z zamrożonym modelem na respie (jak zabijemy gracza to zamiast upaść tak dziwnie drży) lub nawet niewidzialnym modelem na respie, co jest jeszcze gorsze, bo runda się nie kończy i nie wiadomo gdzie strzelać, żeby ten model zabić...

 

AMX jednak nie dostaje już żadnych informacji o tym graczu, dostaje nawet informację, że opuścił serwer. Jednak wchodzący nowy gracz dostanie ID następne, gdyż to ID HLDS uważa za zajęte nadal. W ten sposób ID może osiągnąć większą wartość..

 

Co ciekawe, id gracza może w takim przypadku osiągnąć nawet 33 albo i więcej. Jednak nie należy się tym przejmować, AMX wewnętrznie posiada mechanizm identyfikujący gracza jako gracza po ID. Każde ID większe od 32 dla AMX oznacza entity i gracz z większym numerem nawet nie wywoła forwardu client_putinserver i tym podobnych... po prostu dla AMX będzie niewidoczny :)

 

Dlatego najlepszą praktyką co do tablic jest wpisywanie wielkości 33, ni mniej, ni więcej.


  • +
  • -
  • 1

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#9 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 09.11.2013 15:24

Sprostowanie do 1.1, TAK, MOŻE WYSTĄPIĆ ID WIĘKSZE!!!
 
Jest to ogólny bug HLDS, gdy ktoś wychodzi z serwera ID jest zwalniane, ale jeśli nastąpi timeout może się zdarzyć tak, że HLDS dalej ID gracza zajmuje, jednak ogólną liczbę graczy na serwerze zmniejsza. Mamy wtedy do czynienia z zamrożonym modelem na respie (jak zabijemy gracza to zamiast upaść tak dziwnie drży) lub nawet niewidzialnym modelem na respie, co jest jeszcze gorsze, bo runda się nie kończy i nie wiadomo gdzie strzelać, żeby ten model zabić...
 
AMX jednak nie dostaje już żadnych informacji o tym graczu, dostaje nawet informację, że opuścił serwer. Jednak wchodzący nowy gracz dostanie ID następne, gdyż to ID HLDS uważa za zajęte nadal. W ten sposób ID może osiągnąć większą wartość..
 
Co ciekawe, id gracza może w takim przypadku osiągnąć nawet 33 albo i więcej. Jednak nie należy się tym przejmować, AMX wewnętrznie posiada mechanizm identyfikujący gracza jako gracza po ID. Każde ID większe od 32 dla AMX oznacza entity i gracz z większym numerem nawet nie wywoła forwardu client_putinserver i tym podobnych... po prostu dla AMX będzie niewidoczny :)
 
Dlatego najlepszą praktyką co do tablic jest wpisywanie wielkości 33, ni mniej, ni więcej.

Na diablo mam tworzone tablice z maksymalnej ilości graczy + 1 i jeszcze nigdy nie wyskoczył mi błąd, że coś odwoływało się do tablicy o nieistniejącym indeksie. Co prawda teraz nie mam zbyt dużo graczy, ale kiedyś serwer często był pełny, a wtedy także nie tworzyłem tablic 33-elementowych.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#10 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 09.11.2013 15:34

Problem występuje dość rzadko, ale naprawdę wystąpić może... Spotykałem się z tym problemem już kilka razy, więc po prostu jestem już na to uczulony. Być może w nowszych wersjach HLDSa to naprawili, ale kiedyś na 100% występowało.


  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#11 Aemiksowy

    Banned

  • Zbanowany

Reputacja: 34
Życzliwy

  • Postów:222
  • Lokalizacja::)
Offline

Napisano 09.11.2013 15:52

Teoretycznie można wziąć ten problem pod uwagę, tu ma rację GwynBleidD. Jednak występuje on dość rzadko jak wspomniałeś i zgadzam się z sebulem. Ani razu nie wystąpił problem z nieistniejącym ID, zatem można uznać, że nie może wystąpić ID większe. 


Użytkownik Aemiksowy edytował ten post 09.11.2013 15:52





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

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