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
 

Dimni - zdjęcie

Dimni

Rejestracja: 25.10.2009
Aktualnie: Nieaktywny
Poza forum Ostatnio: 11.03.2014 15:22
-----

#572623 Pukawka.pl

Napisane przez G[o]Q w 20.09.2013 19:27


ile otrzymuję sie FPS ( oferta starter )

 

odpowiem Ci jak pani z dziekanatu dla mojego kierunku - "wszystko jest na stronie, do widzenia" (pacz tickrate)

 


czy serwer 14 slotowy będzie sobie radzil ? jesli będzie rozkrecony

 

to zalezy czy się nie zatrzyma pod wpływem oporów powietrza jak mozna bylo zobaczyc na filmiku dark'a przy zbyt intenstywnym rozkręcaniu server'a unosi się on w góre i potem gwałtownie spada

 


jesli sie serwer rozkrecic to do ilu slotow zwiekszac aby nie bylo lagow ? czy lepiej zmienic oferte

 

lagi bd zalezec od tego co bedziesz tam mial jak nasrasz codmodow i modeli nie standardowych to nawet full nie pomoze aczkolwiek jak pojawia sie lagi to zmiana planu na wyzszy jest dobrą opcją

 


lub jaki inny hosting poleciacie aby nie był stosunkowo drogi i był dobry

 

pukawka jest na tyle dobra ze nawet najlepsze hostingi przy niej slabo wychodzą xD


  • +
  • -
  • 1


#555044 Generator Shop'a

Napisane przez Gość w 13.07.2013 16:50

A kto go napisze i będzie w stanie supportować oraz aktualizować w razie potrzeby?




#554575 Generator Shop'a

Napisane przez dasiek w 12.07.2013 08:42

ale bez hejtu.

 

generator menu w amxx studio jest już.


  • +
  • -
  • 1


#554295 Śmieszne, głupawe linki, kawały

Napisane przez K!113r w 11.07.2013 12:27

Duża firma organizuje dla swoich pracowników
bal maskowy.
-szef przychodzi w masce wilka,
-sekretarka przychodzi w masce kopciuszka,
-admin przychodzi w masce 255.255.255.0
  • +
  • -
  • 7


#551878 [ROZWIĄZANE] czym sie rozni && od &

Napisane przez GwynBleidD w 03.07.2013 19:39

Podwójne operatory (&& oraz ||) są to operatory logiczne (i oraz lub). Operatorem logicznym jest negacji jest !.

Pojedyncze (& oraz |) są operatorami bitowymi. Operatorem bitowym negacji jest ~.

 

Operatory logiczne traktują wszystko, co jest równe zero za fałsz, wszystko różne od zera jako prawdę (niektórzy mylnie uważają, że wszystko co dodatnie, a tak nie jest!) i zwracają 0 lub 1

Operator bitowy traktuje każdy bit z danych osobno, na każdym odpowiadającym bicie wykonuje dokładnie to samo, co logiczny na całej zmiennej, czyli dla a=0 i b=1 wynik operacji a | b i a || b będzie równy. Jednak dla a=0b0 i b = 0b11 otzymamy a | b = 0b11, a || b = 0b1. Dla a=0b10 i b = 0b1 otrzymamy a | b = 0b11 i a || b = 0b1

 

Na forum już to kilka razy było tłumaczone, jakbyś dobrze poszukał to być wiedział :)


  • +
  • -
  • 3


#551930 [ROZWIĄZANE] czym sie rozni && od &

Napisane przez Gość w 03.07.2013 22:39

Podsumowując, operatory różnią się przede wszystkim typem:

  • && jest typem logicznym
  • & jest typem binarnym

Zwracana wartość dla operatora logicznego && jest także logiczna i odpowiada koniunkcji wartości logicznych wyrażeń, przyjmując:

  • fałsz, jeśli przynajmniej jedna z wartości jest fałszem
  • prawdę, jest każda z wartości jest prawdą

Przy czym dana wartość jest logicznie:

  • prawdziwa, jeśli jest niezerowa
  • fałszywa, jeśli jest równa zero

Zwracana wartość dla operatora binarnego & jest wartością, będącą iloczynem binarnym tych wartości.

Iloczyn binarny & możemy odzwierciedlić jako koniunkcję logiczną && każdego z bitów binarnego zapisu liczby osobno.

 

Pozostając w tym odzwierciedleniu, możemy dojść do obrazowego wskazania absolutnej i ostatecznej różnicy między & a &&,

uznając, że & swym działaniem (jakkolwiek nie definiowanym) obejmuje pojedynczy bit, a && całą odzwierciedloną wartość binarną.

 

Idąc dalej tym krokiem rozumowania a za razem w ramach ciekawostki dodam, iż w niektórych językach programowania,

mamy do czynienia nie tylko z ograniczeniem działania danej operacji (w Twoim pytaniu iloczynu oznaczanego ampersandem &)

  • do pojedynczego bitu &, stawiając znak jednokrotnie i tworząc operator binarny
  • do wartości &&, stawiając znak dwukrotnie i tworząc operator logiczny

​ale także:

  • do całego wyrażenia &&&, stawiając znak trzykrotnie i tworząc operator współbieżny

używanego najczęściej przy wyjścia strumienia skryptu, czy przekierowaniu zwracanej wartości funkcji.

Jednakże z poyższych, w pawnie masz do dyspozycji jedynie operatory binarne (pojedyncze) i logiczne (podwójne).




#535476 Technikum

Napisane przez dasiek w 19.04.2013 14:49


jeżeli ty w ciągu roku nie potrafisz rozeznać się na czym stoisz to gratuluję

Bo dałem sobie radę w Technikum tak? Fajna teoria ^^,


jeżeli twoje "ambicje" to nic nie robienie przez 5 dni w tygodniu w szkole to nie wiem czy z takim podejściem coś w życiu osiągniesz.

 

To chyba technikum na wypizdóffku i w lewo.  :D

Proszę Cię- nie mów nic na tematy o których pojęcia nie masz bo wątpie żebyś w ten sposób "coś w życiu osiągnął". :&


  • +
  • -
  • 1


#519644 Dproto [0.9.187] - Instalacja i konfiguracja (NonSteam + Steam)

Napisane przez DarkGL w 26.02.2013 12:34

Prace trwają ;)

Załączone miniatury

  • post-6262-0-77099000-1361208653_thumb.jpg

  • +
  • -
  • 4


#515153 Wierszyk dla Steam suport

Napisane przez Portek w 14.02.2013 21:39

jeśli nie naprawicie powiesze się !!!!

Jedyny pozytywny akcent tego wiersza...
  • +
  • -
  • 8


#495185 Zarządzanie ciągami znaków w pamięci pluginu

Napisane przez DarkGL w 28.12.2012 21:58

Często w pluginach widać taką konstrukcję
#define SOME_TEXT "text"

jednak jest to bardzo złe podejście ale można je łatwo naprawić ;)

Najpierw co się dzieje przy użyciu define preprocesor podczas przeszukiwania naszego kodu każde wystąpienie SOME_TEXT podmieni na "text". Potem przychodzi etap kompilacji i teraz każde wystąpienie ciągu znaków nie przypisanego do żadnej zmiennej ( tak zwane hardcoded ) czyli w naszym przypadku "text" zostanie dodane do sekcji DAT ( tam trzymane są wszystkie zmienne globalne i właśnie ciągi znaków ) . Inaczej mówiąc jeśli użyjemy 20 razy SOME_TEXT to "text" zostanie dodane do sekcji DAT 20 razy. Kompilator w żaden sposób tego nie optymalizuje.

I tak jest z każdym ciągiem znaków który jest hardcoded. Tak jak mowiłem możemy to łatwo naprawić.
Jeśli zamiast define użyjemy
new const SOME_TEXT[] = "text";
i będziemy używać tej stałej zmiennej to wszystkie odwołania do niej będą polegały na odwołaniu się do tego samego adresu ( w pawn wszystkie tablice są przekazywane przez referencje )

Podsumowując ciąg znaków "text" wyląduje w sekcji DAT tylko raz i wszystkie odwołania do zmiennej SOME_TEXT będą działać na tym samym ciągu/miejscu w pamięci ;)

Zarządzanie ciągami znaków w pamięci pluginu | DarkGL Blog
  • +
  • -
  • 9


#302663 Minecraft Engine

Napisane przez diablix w 03.10.2011 15:31

Minecraft Engine 0.3
by diablix & DarkGL

opis
Jest to modyfikacja a w zasadzie spore narzędzie dla osób w miarę ogarniających PAWN'a
Dodaje do gry klocki i cały system z minecrafta. Wtajemniczeni mogą przerobić go
pod np. basebuildera czy inne mody :) Wygląda to naprawdę ciekawie,
i sporo pomysłów oraz pracy poświęciliśmy temu "silnikowi", więc zachęcam do testowania,
oraz tworzenia modów z jego wykorzystaniem :)

wymagane moduly
  • Fakemeta
  • Engine
  • Fun
instalacja
  • modele oraz dźwięki wrzucamy wg. reguły Folder sound -> cstrike/
  • minecraft.amxx do addons/amxmodx/plugins
  • dopisujemy minecraft.amxx na końcu pliku konfiguracyjnego plugins.ini (addons/amxmodx/configs/)
inne informacje



Zasmieszczam video z wersji 0.1 lekko pobugowanej :)

http://www.youtube.com/watch?v=FEDblaxhukw

Załączone pliki


  • +
  • -
  • 49


#472792 Plugin + baza danych

Napisane przez GwynBleidD w 30.10.2012 01:39

Na wstępie zaznaczę, że NIE jest to poradnik o używaniu MySQL w AMX, ale o DOBRYM jego używaniu. Kto czytał mój poradnik o dobrych nawykach tworzenia menu, ten wie o co chodzi :)

Powstaje coraz więcej pluginów z użyciem MySQL, ale czy są to dobrze napisane pluginy? Na pewno nie wszystkie. O ile w większości przypadków do samych realizacji funkcji pluginu na serwerze nie można się przyczepić, o tyle komunikacja z bazą danych pozostawia wiele do życzenia. Pół biedy, gdy mamy serwer SQL na tej samej maszynie, albo na maszynie w jednej sieci... Albo gdy używamy SQLite. Ale większość serwerów posiada bazę SQL w zupełnie innej lokalizacji. Często serwer gry jest w Polsce, a SQL we Francji, Niemczech... Czym to owocuje?

Popatrzmy.. Sami wiemy, że serwery zagraniczne do grania mixów się nie nadają raczej, zbyt wysoki ping. Podobny ping do takiego serwera ma dowolny serwer gry postawiony w Polsce, potrafi się on wahać od 100 do 500 milisekund, czyli aż do pół sekundy! To już całkiem sporo jak na przetworzenie zapytania... O ile samo przetworzenie nie zajmuje dużo, przy dobrze skonfigurowanym serwerze nie jest to nawet 1 milisekunda, o tyle wysłanie go i odebranie wyniku już trochę trwa...

Popatrzmy na taki prosty przykład (przyjmijmy średni ping na 150 ms do zagranicznych serwerów), AmxBans, dowolna ich wersja... Gracz wchodzi na serwer, wykonywane są po kolei następujące zapytania:
  • Sprawdzenie, czy gracz nie posiada bana.
  • Jeśli ban został znaleziony:
    • Jest aktywny: zwiększenie ilości kicków w danych o banie (dotyczy GmBans), dalsze zapytania niewykonywane
    • Jeśli nie jest aktywny: przesunięcie go do archiwum
  • Sprawdzenie, czy gracz nie został oflagowany
  • Sprawdzenie, czy gracz nie posiadał wcześniej żadnych banów
  • Jeśli używamy bazy sql zamiast users.ini - sprawdzenie, czy gracz nie jest adminem
W pesymistycznym przypadku - 5 zapytań SQL, w optymistycznym (aktywny ban) 2. W normalnym (brak aktywnych banów): 4. Dosyć sporo. A wszystkie, prócz ostatniego można ograniczyć do TYLKO jednego zapytania. Jakby się postarać to i ostatnie można podłączyć do tego zapytania, ale nie ma to sensu bo nie dalibyśmy wtedy użytkownikowi wyboru czy chce używać users.ini czy bazy danych do przechowywania adminów.

Założyliśmy, że średni ping wynosi 150ms, czyli w uproszczeniu daje nam to 150ms na jedno zapytanie (w rzeczywistości trwa to jednak dłużej), więc 750ms przy pesymistycznej wersji będzie trwało ustalenie z kim mamy do czynienia, prawie sekunda! a graczy możemy mieć nawet 32, przy zmianie mapy te wszystkie zapytania się wykonują! W tym artykule pomogę Wam takich koszmarków unikać...


Projekt bazy danych.
Pierwszą rzeczą, którą musimy uczynić przy tworzeniu pluginu wykorzystującego bazę danych, jest odpowiedni projekt samej bazy danych. Najpierw musimy wiedzieć co zapisujemy. Czy chcemy stworzyć exp moda? Może jakieś statystyki dla graczy zapisywać? A może wszystkie serwery sieci zebrać w jednej bazie danych na potrzeby pluginu takiego, jak xRedirect?

Gdy to już wiemy, następna rzecz to to, co chcemy na dany temat w bazie umieścić. Przyjmijmy dla przykładu, że tworzymy plugin zliczający czas gry na naszym serwerze każdego gracza, który nań wejdzie. Dla uproszczenia przyjmijmy również, że serwer jest Steam Only (nie mam zamiaru igrać z prawem tutaj :D), dzięki czemu każdego gracza po SteamID można rozpoznać.

Więc co musimy w bazie zapisać? Na pewno jego SteamID oraz czas gry na serwerze. Czyli mamy już 2 kolumny w bazie danych, dopiszemy jeszcze trzecią, id. Czym będzie ID? Identyfikatorem ułatwiającym nam operację na bazie danych :) Szybciej w bazie jest wyszukiwać po liczbach, niż po napisach. Więc będziemy mieli 3 kolumny:
  • `id` INT(11) NOT NULL auto_increment
  • `sid` VARCHAR(24) NOT NULL
  • `time` INT(11) NOT NULL
Przy ID dodajemy auto_increment. Dzięki temu każdy id będzie większy o 1 od poprzedniego dodanego do bazy. Dalej mamy string `sid` długości 24 znaków. 20 znaków zajmuje najdłuższy spotkany przeze mnie Steam ID. Dajmy dodatkowe znaki, jakby w przyszłości się rozrosły. Time jest typu INT, czyli liczbą. Wszak czas możemy zapisać w formie ilości sekund przegranej na serwerze. Tak najprościej go jest przechować i przetwarzać (dodawać, odejmować...)

Mamy 3 kolumny, ale to jeszcze nie wszystko. Dodamy klucze! Czym są klucze? Dają nam one unikalność danych w kolumnie, szybkość wyszukiwania i definiują również jaka kolumna jest indeksem w tabeli. Dodamy 2 klucze, ponieważ ID ma być indeksem tabeli (PRIMARY KEY), a sid musi być koniecznie unikalne. Możemy to pominąć, ale zobaczycie jak to ułatwi później budowę zapytania :) Więc indeksy:
  • PRIMARY KEY (`id`)
  • UNIQUE KEY `sid` (`sid`)
No dobrze, ale co gdy mamy sieć serwerów, a czas chcemy dla każdego serwera zapisywać osobno? Trzeba każdemu serwerowi nadać jakieś id (najlepiej w formie liczby i najlepiej też zapisać je po prostu w osobnej tabeli w bazie danych, w której będą dane odnośnie serwerów). Wtedy dodamy tylko kolumnę oznaczającą nasz serwer
`server` INT(11) NOT NULL
oraz zmodyfikujemy indeks `sid` na taki:
UNIQUE KEY `server_sid` (`server`, `sid`)
Jak ten indeks zadziała? Ano nie pozwoli on, aby w bazie znajdował się wpis z takim samym Steam ID oraz takim samym numerem serwera. Czyli gdy mamy 2 takie same Steam ID, ale inne serwery to wpisy te mogą istnieć, tak samo gdy 2 inne SteamID, a 2 takie same serwery.

Cała struktura tabeli, w języku SQL będzie wyglądała tak:
CREATE TABLE IF NOT EXISTS `godziny` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `server` int(11) NOT NULL,
  `sid` varchar(24) NOT NULL,
  `time` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `server_sid` (`server`,`sid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;


Wstawianie i aktualizacja danych
Teraz przejdziemy do tego, co na serwerze. Pomyślmy co musimy zrobić w naszym przykładzie od strony serwera? Otóż wstawić nowy rekord w bazie z danymi gracza, lub go aktualizować jeśli już istnieje. Jak można to zrobić? Sprawdzić czy rekord istnieje, jeśli tak to zaktualizować, jeśli nie to wstawić nowy... czyli 2 zapytania dla każdego gracza by się musiały wykonać, ale czy muszą? Pomyślmy... A jakby zapytanie samo zdecydowało czy wstawić, czy zaktualizować? A da się tak? A da :D

Ale pozostaje jeszcze problem przy aktualizacji. Musimy odpowiednio zwiększyć starą wartość czasu, a nie wstawiać nową bezmyślnie, podmieniając starą... Możemy pobrać po prostu starą wartość, dodać i wpisać nową... NIE, tak nie zrobimy! Bo to też oznacza 2 zapytania (co prawda niekoniecznie w ciągu, jedno po drugim, ale dwa!).

Więc mamy do wyboru: Odpowiedni warunek używając SELECT, UPDATE oraz INSERT INTO w jednym zapytaniu... Długie ono niestety wyjdzie i ciężko jest je skonstruować. Drugim rozwiązaniem jest REPLACE INTO. Działa ono tak, że stary rekord usuwa, gdy taki istnieje, a następnie tworzy nowy. Tutaj niestety nie możemy się do starej wartości odwołać. Mamy jeszcze jakieś rozwiązania?

Tak, mamy. Dzięki odpowiednio skonstruowanym kluczom możemy po prostu użyć INSERT INTO. No nie tak po prostu, dopiszemy na końcu ON DUPLICATE KEY UPDATE, co spowoduje, że gdy zapytanie INSERT się nie powiedzie, z powodu istniejących już wartości w polach unikalnych, zostanie wykonane UPDATE. Niestety to UPDATE, jest z pewnych powodów trochę uproszczone w porównaniu do klasycznego.

Najpierw skonstruujmy samego INSERTa:
INSERT INTO `czasy` (`server`, `sid`, `time`)
VALUES (%d, '%s', %d)

Jak widać proste zapytanie :) Dla czytelności podzieliłem na 2 linie. Teraz nasze UPDATE:
INSERT INTO `czasy` (`server`, `sid`, `time`)
VALUES (%d, '%s', %d)
ON DUPLICATE KEY UPDATE
`time` = `time`+%d
Oto i nasz update. Tak, tak się da, serwer SQL wtedy ładnie zwiększy `time` o wartość przez nas podaną. Jednakże napiszemy to troszkę inaczej.
INSERT INTO `czasy` (`server`, `sid`, `time`)
VALUES (%d, '%s', %d)
ON DUPLICATE KEY UPDATE
`time` = `time`+VALUES(`time`)
Ta funkcja spowoduje pobranie wartości, którą podaliśmy przy INSERT. Niby wychodzi troszkę większa ilość znaków, ale za chwilę zobaczycie dlaczego tak.


Odpowiednie umiejscowienie w kodzie pluginu
Teraz rzecz na której ludzie najczęściej się potykają. Kiedy wysyłać dane na serwer? Najprościej by było gdy gracz się rozłączy i pod koniec mapy, co sprowadza się do jednego: client_disconnect. A to jest błąd, duży błąd... Gdyż oznacza to przy pełnym 32 slotowym serwerze wysłanie 32 zapytań pod koniec mapy. Może i niedużo, ale jednak coś. Pytania nie są wysyłane na raz, ale po kolei. Nie mam tu na myśli, że zakończy się jedno, a wyśle drugie. Wysyłane są po kolei, a odbierane w kolejności wysłania. Więc jeśli np 15 zapytanie utknie, to reszta musi czekać. Jeśli odpowiedź z 7 utknie to znów reszta na odbiór musi czekać. Przydałoby się to upchnąć w plugin_end w jednym zbiorczym, np tak:
INSERT INTO `czasy` (`server`, `sid`, `time`) VALUES
(%d, '%s', %d),
(%d, '%s', %d),
(%d, '%s', %d),
(%d, '%s', %d)
ON DUPLICATE KEY UPDATE
`time` = `time`+VALUES(`time`)
Wszak można wrzucić od razu wszystkich graczy w ten sposób (tu jest tylko 4). Ale hmm.. Najpierw się wykonują wszystkie client_disconnect, a dopiero później plugin_end. Więc trzeba jakoś to "przechwycić". Dodatkowym problemem jest to, że będzie potrzebna bardzo duża tablica, aby to wszystko zmieścić. Najpierw poradźmy sobie z 2 problemem, co nam częściowo rozwiąże 1. Zauważasz pewnie tutaj dlaczego wcześniej polecilem użyć tego "magicznego" VALUES. Otóż gdy dodajemy kilka rekordów to nie mamy już możliwości wpisania tam konkretnej wartości, a ta funkcja zadba o to, aby dla każdego wpisu była użyta wartość podana przy próbie jego zainsertowania ;)

Otóż AMX ma to do siebie (jak duża część języków programowania), że lepiej przyjmuje duże tablice, gdy są one tablicami globalnymi, niż lokalnymi. Czyli zdefiniujmy sobie query na początku pliku sma, a nie w samej funkcji tej tablicy używającej. Wielkość query sobie trzeba policzyć. Tutaj mamy na pierwszą linię 53 znaki (wraz z enterem). Na lnii z danymi graczy mamy wstawione zmienne. trzeba policzyć jaką długość każda z nich zajmie. Znaczy liczyć nie trzeba, mamy to w bazie danych: 11, 24 i 11. W sumie jest to 46. do tego 2 przecinki, 2 nawiasy, 2 spacje (dla optymalizacji można je usunąć), 2 apostrofy, przecinek na końcu i enter. 10 znaków, czyli łącznie z tymi wstawionymi ze zmiennych mamy 56. Przemnóżmy to razy 32, wychodzi 1792. Teraz 2 ostatnie linie, mają one odopwiednio 24 i 31 znaków (łącznie z enterem i nullem na ich końcach). Sumujemy i wychodzi: 1900 (o, jaka równa liczba :D). Taką właśnie tablicę musimy sobie zadeklarować. To jest oczywiście przypadek pesymistyczny, więc pewnie do końca jej nigdy nie zapełnimy :)

Teraz problem numer 1. Jak go rozwiązać? W bardzo prosty sposób, w client_disconnect zamiast wykonywać zapytania, będziemy dopisywać do głównego naszego zapytania odpowiednie linie dla każdego "wychodzącego" gracza i wyślemy to zapytanie w plugin_end. Dodatkowo co jakiś czas (proponuję 60 sekund) będzie wykonywany task, który sprawdzi, czy jakiś gracz nie rozłączył się w trakcie trwania mapy i jeśli się rozłaczył (i dopisał do głównego zapytania) to to zapytanie wyślemy :) Pamiętać trzeba o kilku rzeczach: zanim zaczniemy zbierać do zapytania wartości, należy dodać początek, czyli pierwszą linię. Druga rzecz, tuż przed wysłaniem zapytania musimy skasować przecinek z ostatnio wpisanej pozycji (nie przewidzimy przecież wcześniej, że więcej już pozycji nie będzie, a jeśli precinek zostawimy to zapytanie się nie wykona, gdyż będzie błędne!) i dopisanie końcówki (ON DUPLICATE....). Początek najlepiej wpisać przy plugin_init oraz po każdym wysłaniu zapytania (oczywiście nadpisać nim cały napis, a nie dopisywać). Końcówkę tuż przy wysyłaniu :) Dodatkowo jeszcze musimy zadbać o to, aby nie wysyłać zapytania bez wstawionego żadnego wiersza. W tym celu najlepiej utworzyć sobie licznik, inkrementować go przy każdym dodaniu do zapytania wiersza, sprawdzić go przed wysłaniem zapytania, czy nie wynosi zero, a po wysłaniu wyzerować.

Dodatkowo możemy w tasku przejechać się pętlą po wszystkich graczach na serwerze i też wysłać ich dane, dzięki czemu przy crashu nie stracą oni dorobku z całej mapy, ale tylko najwyżej z ostatniej minuty (jeśli co minutę task się wykonuje oczywiście).

Jest jeszcze jedna rzecz. Twórcy AMX, a ściślej biblioteki sqlx przestrzegają przed używaniem ThreadedQuery w plugin_end. Dlatego polecam użyć tutaj tzw trybu liniowego (synchronicznego). Nie spowoduje to "widocznego" laga na serwerze, gdyż gracze w tym momencie będą czekać na zmianę mapy, a czas trwania tej zmiany tak samo się przez to wydłuży, jak przy ThreadedQuery (serwer przed zmianą mapy czeka, aż wszystkie zapytania ThreadedQuery zostaną zakończone).

Druga część poradnika w #12 poście w tym temacie.
  • +
  • -
  • 23


#471670 [ROZWIĄZANE] Runda na same HS

Napisane przez K!113r w 26.10.2012 18:56

Pytasz czy prosisz? Jeżeli pytasz to tak.
  • +
  • -
  • 2


#1148 Admin Listen

Napisane przez Gomez w 14.02.2008 17:23

Adminlisten

Przedstawiam wam plugin dzięki ktoremy admini widza wszystkie rozmowy w say,
nawet te ktorych nie powinni widziec np. gracza z przeciwnej druzyny albo zmarłego

Załączone pliki


  • +
  • -
  • 42


#304900 Skarga na administrację

Napisane przez Ortega w 09.10.2011 08:47

Ja sobie tutaj tak siedzę przed ekranem monitora i się uśmiecham, co wy do cholery ludzie tu robicie ? Czy ktoś mi wytłumaczy co ma na celu obrażanie się nawzajem, co ma na celu pokazanie kto ma więcej władzy lub kto zrobił najgorzej ? Po jaką cholerę całe to zamieszanie wprowadzające niepotrzebny zamęt na forum ? Jak mam być szczery to obaj panowie teraz spie***liliście sprawę równo. Dla ścisłości prawo działa w obie strony i prawo nie działa wstecz, naruszenie praw autorskich w przypadku obu własności i publikowanie niestety łamie prawo RP. Powiem od siebie, byłem nie raz administratorem lecz również byłem później osobą zaufaną na różnych forach, czasem mi odbijało ale do takich dziecinnych zabaw jak te tutaj nie śmiałem nawet podchodzić. Powiem szczerze, że nie wiem od czego dokładnie zaczęliście, bo tego nie śledzę na forum, nie mam czasu aczkolwiek jak widzę, że robi się taki burdel to jest już niefajne jak to się kończy. Najlepsze rozwiązanie jakie widzę: obie strony niech sobie przemyślą co im nie pasuje i o co im chodzi, następnie wyłóżcie kawę na ławę co zrobiliście źle i czego oczekujecie, wtedy patrząc, że obaj postąpiliście nieładnie polecam k**wa jak małym dzieciom przeprosić za złe zachowanie. Czy to jest takie trudne ? Możliwe nawet, że ta moja skromna wypowiedź nic nie zmieni, ponieważ nie wiem o co poszło, że tak zawzięcie się tutaj staracie pogryźć ale myślę, że trochę pomogłem. Jak się niepotrzebnie wtrącam można usunąć ten post :) A teraz idźcie i to rozwiążcie jak ludzie..

PS. Osobiście nie byłbym zadowolony z przerobienia mojej twarzy na Adolfa ale wy tu ewidentnie robicie sobie nawzajem krzywdę, więc nie płaczcie tyle.
  • +
  • -
  • 18