←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] is_user_connected(id) - Konie...


Najlepsza odpowiedź GwynBleidD 31.10.2013 11:51

if(0<id<33 && ma_perk[id] && is_user_connected(id))

 

Pomysł dobry, ale powinno to wyglądać tak:

if(0<id && id<33 && ma_perk[id] && is_user_connected(id))

 

w praktyce opłaca się sprawdzać tylko 2 warunek, mniej niż zero być nie może, a samo zero jeszcze się w tablicy mieści.

Przejdź do postu
Zablokowany

  • +
  • -
Lacostii - zdjęcie Lacostii 29.10.2013

Witam,

mam taki problem, bo chcę stworzyć jak najlepiej działający plugin oszczędzający zasoby maszyny.

Jak wiadomo lepiej wpierw dawać w warunkowych krokach te, które nie wykonują zapytań do silnika HLDS, dlatego utworzyłem takie zapytanie,

(ma_perk[id] = true/false jest określane w innych funkacjach, a ta tablica jest globalną)

if(ma_perk[id] && is_user_connected(id))
{

W takim utworzeniu warunków wszystko działa, ale otrzymuję error logi:

[AMXX] Run time error 4: index out of bounds 

Domyślam się, że id, które otrzymuje ma_perk[33] wykracza poza zdefiniowane czyli jest mniejsze od zera albo większe od 32, tym zawsze zajmowało się is_user_connected(id), ale z racji że ono pyta HLDS nie chce umieszaczać go na pierwszym miejscu. Więc czy dodanie warunku jeszcze jednego sprawdzającego czy id jest w normie załatwiło by sprawę i sprawiło, że plugin by działał oszczędnej dla maszyny? Wyglądałoby to tak:

if(0<id<33 && ma_perk[id] && is_user_connected(id))
{

Proszę o odpowiedź tylko osoby co mają pojęcie o tym.

Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 29.10.2013

a kiedy ustawiasz ma_perk i kiedy wywoływane są forwardy w których ustawiasz wartość ma_perk[ identyfikator ] ( domyślam się że to cod )

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 29.10.2013

Może inaczej, gdzie podany przez Ciebie warunek siedzi? W jakiej funkcji/handlerze/evencie?

Odpowiedz

  • +
  • -
Lacostii - zdjęcie Lacostii 29.10.2013

Przykładowy plugin,w którym zastosowałem taką kolejność warunków, a otrzymuję error logi.

Spoiler

Również problem jest przy evencie:

register_event("Damage", "Damage", "b", "2!=0");	

I moje pytania brzmią czy ten dodatkowy warunek z przodu załatwi problem oraz czy jest w ogóle sens takiego kombinowania? Bo jak zauważyliście tworzę pluginy na COD'a gdzie będzie razem kilkadziesiąt perków i klas, dlatego takie detale się dla mnie liczą, a za cel postawiłem sobie jak najlepsze działanie takich dodatków.

Odpowiedz

  • +
  • -
Jak się nazwać - zdjęcie Jak się nazwać 29.10.2013

Możesz też sam utworzyć system sprawdzania czy gracz jest połączony, żywy itp za pomocą forwardów csa i registerham

Odpowiedz

  • +
  • -
sebacs2 - zdjęcie sebacs2 29.10.2013

Mówiąc inaczej, warunek czy gracz jest podłączony (is_user_connected) daj na sam początek funkcji TakeDamage

Odpowiedz

  • +
  • -
Lacostii - zdjęcie Lacostii 29.10.2013

Możesz też sam utworzyć system sprawdzania czy gracz jest połączony, żywy itp za pomocą forwardów csa i registerham

Nie wiem czy dobrze zrozumiałem, masz na myśli osobny plugin co będzie już z góry odrzucał wszystkie sygnały dla wybranych eventów zanim one trafią do reszty pluginów, gdy gracz nie będzie podłączony/żywy? Jest to rozwiązanie, ale wtedy rodzi się u mnie kolejne pytanie:

 

Gdy mam X pluginów wywołujących funkcje 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?

 

 

Mówiąc inaczej, warunek czy gracz jest podłączony (is_user_connected) daj na sam początek funkcji TakeDamage

Nie mów mi proszę szablonowych zwrotów, w tym temacie chcę właśnie spróbować uniknąć tego zapytania na początku.

 

Coś nie możecie mi chyba przewidzieć co się stanie gdy dam taki kod, dlatego przetestuję go i dam odpowiedź:

if(0<id<33 && ma_perk[id] && is_user_connected(id))

Jednak oczekiwałbym odpowiedzi jeśli by nie było już error logów czy tak ułożone warunki byłyby lepsze niż standardowe:

(zaznaczam, że perków jest kilkadziesiąt, więc szansa, że "ma_perk[id] = true" nie jest duża.)

if(is_user_connected(id) && ma_perk[id])

?

 

Dziękuję za zainteresowanie tematem ;).


Użytkownik Lacostii edytował ten post 29.10.2013 23:18
Odpowiedz

  • +
  • -
Lacostii - zdjęcie Lacostii 30.10.2013

Minął prawie cały dzień na zaludnionym serwerze i nie ma error logów. Mogę się cieszyć z wynalezienia lepszego ułożenia warunków pod kątem oszczędności zasobów serwera czy jednak i tak stary sposób jest lepszy, ktoś jest to w stanie ocenić?

Odpowiedz

  • +
  • -
Najlepsza odpowiedź GwynBleidD - zdjęcie GwynBleidD 31.10.2013

if(0<id<33 && ma_perk[id] && is_user_connected(id))

 

Pomysł dobry, ale powinno to wyglądać tak:

if(0<id && id<33 && ma_perk[id] && is_user_connected(id))

 

w praktyce opłaca się sprawdzać tylko 2 warunek, mniej niż zero być nie może, a samo zero jeszcze się w tablicy mieści.

Odpowiedz

GT Team - zdjęcie GT Team 31.10.2013

Czemu zamiast tego:
if(0 < id <33)
lepiej jest, żeby było tak:
if(0 < id && id < 33 )
To chyba to samo? I kod jest dłuższy?
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 01.11.2013

Sorki, nawyk z innych języków programowania, w których taki zapis był niepoprawny. Zwracam honor.

Odpowiedz
Zablokowany