Skocz do zawartości

Ranking


Popularna zawartość

Zawartość, która uzyskała najwyższe oceny od 13.06.2016 uwzględniając wszystkie działy

  1. 4 punkty
    639

    LS-RP | Los Santos RolePlay - Powraca!

    Tak samo powraca jak i community roleplay powróciło. Domena podobna do oryginału Wam nie pomoże. PS. Gdyby administracja LS-RP.net była wścibska mogłaby Was pozwać za naruszenie praw autorskich dot. logo. Nie jest identyczne, ale każdy w temacie wie, że takie podobieństwo wystarczy to skasowania Was na kilka stów.
  2. 2 punkty
    Beata_Szydlo_2015

  3. 2 punkty
    TS3 i prosta strona na nginx - zużycie ramu na poziomie 70mb, CPU 0.5-5%. Co by tu postawić? Klan z WoTa nie wykorzysta potencjału tego VPS'a.
  4. 2 punkty
    Papa Smerf

    [DM]Polski Project X

    "Serwer także posiada własnoręcznie robiony ekran wybierałki. Nie jest monotonny jak na innych serwerach." No chyba nie, taką samą wybierałke można znaleźć na forum sampa
  5. 2 punkty
    Abyss Morgan

    PRV CAR

    1. Weź garnek. 2. Nalej do niego wody i oleju. 3. Ustaw garnek na podłodze. 4. Ustaw się przed garnkiem i stań na głowię.
  6. 2 punkty
    Bartcislaw

    LS-RP | Los Santos RolePlay - Powraca!

    I wy chcieliście współpracować z Compton? Porażka.
  7. 2 punkty
    PrzMas

    .ini kolejno w folderze (dfile) / losowanie

    W OnFilterScriptInit() sprawdź czy istnieje plik info0.ini, zawierający wartość dla ostatnio zapisanego pliku - jeśli nie istnieje to go utwórz i zapisz do niego wartość 0; Przy uruchomieniu skryptu wczytaj do zmiennej globalnej wartość z pliku info0.ini; Przy tworzeniu nowego pliku ustaw dla jego nazwy wartość zmiennej +1, następnie zapisz ją do pliku info0.ini.
  8. 2 punkty
    Beata_Szydlo_2015

    Pawn a przyszłość

    pawn != przyszłość.
  9. 1 punkt
    michalek97

    Panel Administratora w GUI!

    Witam, Mam do zaprezentowania panel administratora w GUI Dziala tylko jak jestesmy zalogowani na RCONie. KOD PWN: #include <a_samp> #pragma tabsize 0 public OnPlayerCommandText(playerid, cmdtext[]) { if(!strcmp("/adminpanel", cmdtext, true)) {if(IsPlayerAdmin(playerid)) { ShowPlayerDialog(playerid, 1, 2, "Panel Administratora", "Dodaj 100 hp \nDodaj armor \nTeleportuj na norm. spawn \nNapraw ten pojazd \nZrob GMX \nZrob burze \nZrob sloneczna pogode \nDodaj sobie miniguna \nWylacz server \nDodaj sobie noz", "Ok", "Anuluj"); } return 1; } return 0; } //------------------------------------------------------------------------------ public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 1 && response) { switch(listitem) { //------------------------------------------------------------------------------ case 0: { SetPlayerHealth(playerid, 100); } case 1: { SetPlayerArmour(playerid, 100.0); } case 2: { SetPlayerPos(playerid, 2231.80,2156.27,10.82); } case 3: { RepairVehicle(GetPlayerVehicleID(playerid)); } case 4: { SendRconCommand("gmx"); } case 5: { SetWeather(15); } case 6: { SetWeather(1); } case 7: { GivePlayerWeapon(playerid, 38, 20000); } case 8: { SendRconCommand("exit"); } case 9: { GivePlayerWeapon(playerid, 4, 1); } } } return 1; } Po wpisaniu /adminpanel pojawia się GUI, w którym są rózne opcje. Jest ich 10. Lista opcji: Dodaj 100 hp - Daje nam pelne zycie Dodaj armor - Daje nam pelny armor Teleportuj na norm. spawn - TUTAJ SPAWN SERVERA I-RP PL!!! Napraw ten pojazd - Naprawia pojazd w ktorym aktualnie jestes Zrob GMX - Restartuje server Zrob burze - Zmienia pogode na burze Zrob sloneczna pogode - Zmienia pogode na sloneczna Dodaj sobie miniguna - Daje Ci miniguna Wylacz server - Wylacza server Dodaj sobie noz - Daje Ci nóż Pozdrawiam. Komentujcie. Zycze milego administratorowania serverem. Jest to moj 1 skrypt w PAWNO :)
  10. 1 punkt
    Mistral26

    [DM]Polski Project X

    Zastanawia mnie czemu tylko elita PGX się odzywa w tym poście czyż by was bolało na PPX jest więcej graczy niż na PROOPGX . Czytając posty w innych działach to robicie jedynie za lizodupów nic więcej pozdrawiam 2 graczy na PGX :D:D
  11. 1 punkt
    hahacozatypXD

    sprite td

    Usuń - w
  12. 1 punkt
    Tak jak w temacie. Piszę skrypt od zera, będzie strona Internetowa połączona z serwerem, więc będzie można zarządzać kontem. Mam parę innowacyjnych pomysłów, poszukuję osób, które będą zainteresowane beta testami a w przyszłości pełnieniem funkcji w organizacjach i administrowania. Osoby zainteresowane proszę o kontakt na skype: alluhanzo , a jeśli będę nie dostępny to na adres email mcartick @ gmail . com
  13. 1 punkt
    Exive Group (c

    ysi

    Brak include v_version.inc w ścieżce:pawno/include/YSI/internal/. Spróbuj wgrać od nowa
  14. 1 punkt
    Virelox

    [REKLAMA]MultiServer.pl - RPG/RP

    Witaj! Witamy wszystkich serdecznie! Chcielibyśmy Wam przedstawić nowy serwer RPG na platformie Multi Theft Auto. Serwer w pełni autorski. Posiadamy innowacyjne systemy, co w dzisiejszych czasach jest rzadkością! Pragniemy zaprosić Was na nową przygodę na naszym serwerze! MultiServer to całkiem wyróżniający się serwer wśród innych serwerów. Postanowiliśmy zachować wspaniały klimat który jest nam znany z serii Grand Theft Auto San Andreas. Nasz serwer jest serwerem RPG z elementami RP, gdzie dla prawdziwych fanów odgrywania realnego życia znajdzie się miejsce, ale nie tylko! (ale dla tych co nie lubią odgrywać również). Trafiłeś tutaj, ponieważ szukasz serwera z przyszłością który zapewni ci rozrywkę przez długie lata? Świetny wybór! Nasz serwer posiada wiele systemów, które potęgują doznanie realizmu - chcesz dowiedzieć się wiecej? Czytaj dalej! System interakcji z otoczeniem: Dzięki autorskiemu systemowi interakcji z otoczeniem możemy w niesamowicie prosty sposób oddziaływać na wiele elementow, które nas otaczają. Systam działa we wspólpracy z każdym pojazdem, graczem, stacją benzynową, obiektami, przedmiotami z ekwipunku i botami w sklepach. Jego użycie jest niesamowicie intuicyjne, dlatego każdemu przypadnie do gustu. Nie musimy wpisywać żadnych komend wystarczy wycelować w obiekt i wybrać opcję podnieś. Ekwipunek: Każdy gracz na serwerze ma dostęp do swojego prywatnego ekwipunku. Bardzo to ułatwia rozgrywkę oraz handel, ponieważ w każdym momencie możemy otworzyć swój ekwipunek i wybrać interesujący nas przedmiot, który chcemy w danej chwili użyć. Przedmioty te można oferować graczom, wyrzucać, czy nawet handlować. Pojazdy: System pojazdów został zaprojektowany i wykonany z niezwykłą starannością. Wraz z systemem pojazdu został wprowadzony również system paliwa i brudzenia. Paliwo możemy zatankować na dostępnych stacjach, a samochód możemy doprowadzić do nowości w myjni. Szybkość brudzenia się naszego samochodu zależy od wielu czynników, np. po jakim gruncie się poruszamy. Czat głosowy: Dzięki dostępnemu czatowi głosowemu możemy w niesamowicie łatwy sposób skomunikować się z osobami z naszego bliskiego otoczenia w grze. Wystarczy nacisnąć jeden przycisk i zacząć mówić! Nie musimy wchodzić na żadne komunikatory głosowe. System wymiany przedmiotów: System wymiany przedmiotów to niezbędny element do systemy ekwipunku. Dzięki niemu możemy w niesamowicie łatwy sposób sprzedać swój przedmiot lub wymienić na inny z dowolnym graczem. Dlatego nie musimy się obawiać że ktoś nas oszuka, nasz system tego dopilnuje aby transakcja przebiegła prawidłowo. Dostawca pizzy: Jak sama nazwa wskazuje, stajemy się dostawcą pizzy, a naszym zadaniem jest dowiezienie specjalnie zaprojektowanym wozem pizzy w równie specjalnym pudełku do klientów. Kurier: Praca kuriera wymaga posiadania prawa jazdy. Twoim zadaniem jest przewiezienie paczki z bazy do firmy. Oferujemy atrakcyjne wynagrodzenie! Drwal: To praca dla prawdziwych twardzieli. Z momentem rozpoczęcia pracy otrzymujesz samochód, na którego musisz załadować drewno oraz piłę. Zetnij wszystkie drzewa, a następnie je dostarcz, aby otrzymać wynagrodzenie. Obsługa wózka widłowego: Wsiadaj do wózka widłowego i przewieź w wyznaczone miejsca 5 przygotowanych paczek. Uwaga, paczki lubią się ślizgać Magazynier: Zanieś ręcznie wszystkie 5 paczek do wyznaczonych miejsc. Musisz miec dużo siły, bo niektóre paczki bywają ciężkie! Górnik: To praca dla wytrwałych! Z momentem rozpoczęcia otrzymujesz kilof oraz latarkę. Użyj jej, aby rozjaśnić kopalnię, a kilofa użyj do łupania skał. Po zakończeniu pracy udaj się w wyznaczone miejsce, aby odebrać wypłatę. Los Santos Police Departament: Dostań się w szeregi dzielnych policjantów z Los Santos i ścigaj przestępcow oraz pilnuj porządku w mieście! Skuj przestępców, wlep mandat albo daj upomnienie! Uwielbiasz sprawiedliwość? To miejsce właśnie dla ciebie! Los Santos Medical Center: Nie ma lepszej pracy niż ratowanie życia innym. Zostań medykiem, odbierz zgłoszenie i jedź na miejsce czym prędzej! Tylko od ciebie zależy czy dana osoba przeżyje. To bardzo odpowiedzialna praca. Los Santos Taxi Corporation: Praca taksówkarza to praca odpowiedzialna. Odbierz zgłoszenie i jedź na miejsce, a następnie zawieź klienta tam gdzie potrzebuje. Pamiętaj o włączeniu taksometru! To czysta przyjemność usługiwać społeczności. Los Santos Roadside Assistance: Zostań mechanikiem i naprawiaj pojazdy! Odbierz zgłoszenie i jedź w wyznaczone miejsce, a następnie odholuj pojazd do naprawy lub napraw go na miejscu. Klient będzie na pewno bardzo wdzięczny! Los Santos News: Dołącz do szeregów reporterów. Zbieraj informacje z otoczenia, aby następnie przekazać je światu! Ogłaszaj wiadomości, reklamy od graczy i inne rzeczy. Trzymaj rękę na pulsie! Nazwa serwera: MultiServer Adres IP: 91.134.175.124:22003 Sloty: 100 Gamemode: RPG/RP WWW: http://multiserver.pl Jeżeli poszukujesz serwera, gdzie szukasz prawdziwego zycia i możliwosci pracy oraz rozwoju to MultiServer jest wlasnie dla ciebie! Wejdź i sam się przekonaj, a pozostaniesz z nami na dlużej i wciągniesz się w ten piękny świat, jaki chcemy ci zaoferować.
  15. 1 punkt
    PrzMas

    [warning] client exceeded 'ackslimit'

    Pewnie UFO... Niezidentyfikowane Latające Pakiety Może jakieś logi? W przeciwnym razie...
  16. 1 punkt
    Reus

    [Sprzedam] GPP v1 (Cały GM)

    Polecam XD
  17. 1 punkt
    xBBBay ☆

    W mysql nie tworzą się tabele

    To już nie wina tabelek mysql, nativechecker, crashdetect, pawno -d3 i pokaż logi.
  18. 1 punkt
    Abyss Morgan

    Odległość Koordynatów

    Float:GetDistanceBetweenPoints3D(Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2); #define GetDistanceBetweenPoints3D(%1,%2,%3,%4,%5,%6) VectorSize((%1)-(%4),(%2)-(%5),(%3)-(%6))
  19. 1 punkt
    DaGaXeR

    LS-RP | Los Santos RolePlay - Powraca!

    Nie powraca. Polski Los Santos Role Play było tylko jeden, ten z .net. Nie masz pomysłu na nazwę? Napisz SMS'a do Bongo. Żałosne jest wykorzystanie czyjejś sławy i podciąganie się pod coś. Tak samo jak zrobiła to jakaś laska rejestrując domenę c-games i pisała, że serwer powraca - gdzie ekipa i wszystko było nowe, tylko nie nazwa. Profesjonalny darmowy gamehub od Teez'a. Kamil Wesołowski - on nie robił fGaming czy fGameland, coś takiego? Coś tam z San Fierro? A w sumie tak, fgaming, nawet niezmieniony odnośnik w kodzie.. heh. Mnie jak najbardziej odrzuca. Tak jeszcze dodam, że w pełni na temat samej reklamy - jest tutaj tylko coś o obiektach. Dalej jest właściwie co to jest Role Play i kim można zostać. Słowa zachęty, obiecywanie, zero konkretów.
  20. 1 punkt
    PrzMas

    Stan SA:MPa?

    Tak... Zdecydowanie serwerów RP jest aż deficyt, bo nowe najszybciej upadają, jeszcze przed startem Nie lubię RP, bo jak można ze strzelanki zrobić Sims'y... Na dodatek Sims'ów nie ma jako multiplayer, a na serwerach RP multi trochę mija się z celem Co więcej panuje taka moda, że zamiast coś po prostu zorganizować to się ogranicza tak, jakby programista chciał się popisać, jednak niekoniecznie koncepcją na rozgrywkę. Chyba na singlu można więcej niż na niektórych serwerach. Nie wiem jak gdzie indziej, ale na tym forum mało kto robi start-up czegokolwiek innego niż RP czy Truck, także nie przebijesz się Do tego lament, że Kalcor nie dodał nowych czapek i nie ma o co uaktualnić gamemode'a, bo twórcy serwerów są tacy innowacyjni Sam już nie gram w SA-MP, bo nie ma gdzie, bo wszystkie serwery są jednakowe albo właściciele flugają sobie wzajemnie z jakimiś hejterami czy właścicielami innych serwerów. Inni zamiast wejść i sobie pograć to włażą bez wazeliny w d*y administratorów czy właścicieli albo żebrzą o rangę, bo przecież ona jest jedyną atrakcją na serwerze i takich ludzi też nie ma komu ogarnąć, a administratorom chyba to się podoba. Odpowiedzialne rangi mają ludzie, którzy po prostu nie nadają się do tego, w sumie to nikt nic nie ogarnia, głupi system banowania jest przestarzały, bo wycięty dawno temu z jakiejś mapy i przy uporczywych hejterach/szkodnikach właściciele rozkładają ręce, bo programista albo nie ma czasu albo pojęcia. System rang również jest zdecentralizowany i nikt nie wie dokładnie, która ranga jakie ma możliwości - jest rozproszony i składa się ze skryptów pociągniętych z neta na chybił/trafił, bo najważniejsze aby rang było dużo. Pewne uprawnienia dostępne są dopiero po zalogowaniu się na RCON, bo tak zostały napisane skrypty z neta, a komuś nie chciało się napisać czegoś samodzielnie i nie miał pojęcia o pisaniu modułowego gamemode'a albo ogarnął tylko IsPlayerAdmin(), przez co niekoniecznie powołane osoby mają przydzielony dostęp do czegoś, co jest niezbyt przydatne przy ich roli na serwerze. Ale najważniejsze jest oczojebne forum i panele - polskie serwery zakładają chyba jakieś cebulaki. Albo jest róbta co chceta, my wam dajemy czapki, domki i eventy albo tyle tutoriali i restrykcji, że jedyną swobodą w rozgrywce jest chyba tylko /quit.
  21. 1 punkt
    Taneno

    Obiekt który można zabić :)

    Ty mu podałeś funkcje od tworzenia i label który może przyczepić do obiektu, kolega wyżej się pytał jak takie coś zrobić. proszę: http://forum.sa-mp.com/showthread.php?t=488317
  22. 1 punkt
    Pr0f3ssi0n4LisT.

    .ini kolejno w folderze (dfile) / losowanie

    CMD:nowyplik(playerid) { new str[25],i; for(i = 1; i < MAX_PLIKOW; i++) { format(str,sizeof(str),"/folder/info%d.ini",i); if(!fexist(str)) { i = _:fopen(str, io_write); // if(!File:i) continue; fwrite(File:i,"Pawno.PL\r\n"); fclose(File:i); i = MAX_PLIKOW; } } if(i < MAX_PLIKOW) SendClientMessage(playerid,-1,"Juz jest max plikow w tym folderze ziomus."); else { // utworzono plik ktorego nazwa jest w tablicy str } return 1; } CMD:losuj(playerid) { new num[MAX_PLIKOW], cnt; new str[25],idx; for(idx = 1; idx < MAX_PLIKOW; idx++) { format(str,sizeof(str),"/folder/info%d.ini",idx); if(!fexist(str)) continue; num[cnt++] = idx; } if(cnt == 0) SendClientMessage(playerid,-1,"Nie ma zadnego pliku w tym folderze."); else { format(str,sizeof(str),"/folder/info%d.ini",num[random(cnt)]); cnt = _:fopen(str, io_read); while(fread(File:cnt, str)) { // pobieranie linijka po linijce } fclose(File:cnt); } return 1; } Chyba cos takiego o ile dobrze zrozumialem
  23. 1 punkt
    DaGaXeR

    Liczba graczy ipboard

    Chociażby taką zamiast tego. Gdzie później za </php> wstawiasz w szablon to swoje <p> uzywajac zmiennych $players & $slots echo "<p>Aktualny stan slotów: ". $row["graczy"] ."/". $row["slotow"] ."</p>" $players = $row['graczy']; $slots = $row['slotow'];
  24. 1 punkt
    DaGaXeR

    Liczba graczy ipboard

    Jak robisz to w szablonie to spróbuj zamiast echo dać zmienną, którą później wyświetlisz. Jak robisz to w aplikacji, to powinieneś ustawić szablon. For example: $template = $this->registry->output->getTemplate('game')->gameContent( $posts, $pages ); $this->registry->getClass('output')->addContent($template); $this->registry->output->setTitle('Strona główna'); $this->registry->output->addNavigation( 'Strona główna', '/home' ); $this->registry->getClass('output')->sendOutput();
  25. 1 punkt
    Kaz

    MySQL - poradnik.

    Poradnik dotyczący MySQL Spis treści: 1). Wprowadzenie 2). Wymagania 3). Transakcje: - omówienie - polecenia 3). Tworzenie tabel 4). Typy pól 5). Łączenie z bazą 6). Wysyłanie zapytania 7). Omówienie kilku funkcji dot. MySQL 8). Obsługa danymi: - stworzenie rekordu - pobranie rekordu - zapisanie danych 9). Rady, zakończenie Wprowadzenie: MySQL to inaczej wolnodostępny system zarządzania bazą danych. Jest obsługiwany przez wiele systemów, dzięki czemu nie mamy problemu z utrzymaniem kompatybilności. Dodatkowo jest wydany wersji źródłowej, co umożliwia skompilowanie go dla dowolnej platformy systemowej. Istnieje kilka typów mechanizmów każdy z nich służy do innego zastosowania: - MyISAM - domyślny mechanizm (nie obsługuje transakcji ani kluczy obcych, umożlwia wyszukiwanie pełnotekstowe) - InnoDB - także domyślna opcja (obsługuje transakcje, klucze obce oraz zakładanie blokad na poziomie wierszy) Jest jeszcze kilka typów, ale nimi się nie będziemy interesować, ponieważ zostały wycofane. Wymagania(informacje dla osób chcących założyć hosting baz mysql): Co prawda MySQL nie potrzebuje dużych wymagań z takiego powodu iż sam w trakcie wykonywania procesów, stara się je sam optymalizować. To także dotyczy się tabel oraz baz danych. Z doświadczenia nauczyłem się, że w teorii bazy potrzebują dużo pamięci RAM i szybkie dyski, można też trafić na to, że procesory też są brane pod uwagę. Głównie MySQL opiera się na cache'ch, bo ponad 90% wykonywanych zapytań trafia właśnie tam. Konfiguracja dla osób, które chcą w przyszłości otworzyć firmę oferująca bazy danych: - Procesor: sempron 3000+ - Pamięć: 2 GM RAM - Dysk twardy (główny): 2x250 GB (RE, 16 MB cache) z RAID - Dysk twardy (poboczny): 1x400 GB (wolniejsze dyski, dla przeprowadzanych backup'ów) Druga konfiguracja "optymalna" dla użytkownika: - Procesor: 1000+ - Pamięć: 256/512 MB RAM - Dysk twardy: 20 GB z (RE, 16 MB cache i RAID) Transakcje: Transakcja - co to w ogóle jest? Otóż jest to zbiór operacji na bazie danych, które stanowią w istocie pewną całość i jako takie powinny być wykonane wszystkie lub żadna z nich. Przykładem takiej transakcji jest bankowa - przelew. Muszą zostać spełnione 2 operacje - zabranie pieniędzy z jednego konta oraz dopisanie ich do drugiego. W przypadku niepowodzenia żadna z tych operacji nie powinna być zatwierdzona, gdyż zajście tylko jednej powodowałoby nieprawidłowości w bazie danych (pojawienie się lub zniknięcie pieniędzy). Transakcja składa się z trzech elementów: rozpoczęcia wykonania zamknięcia W systemach bazodanowych istotne jest, aby transakcja trwała jak najkrócej, ponieważ równolegle może być dokonywanych wiele transakcji. Każdy etap transakcji jest logowany, dzięki czemu w razie awarii systemu można odtworzyć stan bazy danych sprzed transakcji, która nie została zamknięta. Transakcje w SQL W systemach baz danych realizujących standard SQL następujące polecenia dotyczą transakcji: BEGIN lub BEGIN WORK - rozpoczęcie transakcji; COMMIT - zatwierdzenie zmian wykonanych w obrębie transakcji; ROLLBACK - odrzucenie zmian wykonanych w obrębie transakcji; SAVEPOINT nazwa - zdefiniowanie punktu pośredniego o określonej nazwie; RELEASE SAVEPOINT nazwa - skasowanie punktu pośredniego; ROLLBACK TO SAVEPOINT nazwa - wycofanie transakcji do stanu zapamiętanego; Tworzenie tabel: Jest to główny proces obsługi naszej bazy, wymaga utworzenia bazy i połączenia się, ale o łączeniu w następnym rozdziale. Możemy zacząć wprowadzać dane, najpierw jednak trzeba utworzyć tabele, robimy to według następującego schematu: CREATE TABLE nazwa_tabeli (nazwa_pola1 typ_pola1 [atrybuty], nazwa_pola2 typ_pola2 [atrybuty], nazwa_pola3 typ_pola3 [atrybuty], PRIMARY KEY(nazwa_polaX)) Przykład: CREATE TABLE NBA (id int NOT NULL AUTO_INCREMENT, imie char(30), lata char(3), punkty char(3), mistrzostwa char(3), PRIMARY KEY(id)) Każda tabela musi posiadać co najmniej jedno pole, dodatkowo co najmniej jedno pole, które będzie jednoznacznie identyfikuje wiersz w tabeli - tak zwany klucz główny. Jeśli jest masa danych, a Ty znasz klucz główny jednego z wierszy wtedy możesz bez problemu dostać się do tego wiersza. W naszym przypadku kluczem głównym jest pole pierwsze - id. Przeważnie nadaje jako klucz główny określa się pierwsze pole tabeli. Dodatkowo klucz główny posiada dwa atrybuty: pierwszy - NOT NULL - oznaczający, że wartość tego pola nigdy nie może być pusta; drugi - AUTO_INCREMENT* - oznaczający, że wartość pola będzie automatycznie zwiększania przez bazę danych przy dodaniu rekordu; * Atrybut AUTO_INCREMENT - możemy stosować tylko do pól typu całkowitoliczbowego. Typy pól: Dostępnych jest wiele typów pól, najpopularniejsze poniżej: - CHAR(x) / VARCHAR(x) - ciąg znaków o maksymalnej dł. X, gdzie X nie może być większy od 255; - BLOB - binarny ciąg znaków o dł. ograniczonej przez pamięc Twojego serwera; - TINYINT(ilość znaków) - liczby z zakresu od -128 do 127 lub liczby dodatnie od 0 do 255; - SMALLINT(ilość znaków) - liczby z zakresu od -32768 do 32767 lub liczby dodatnie od 0 do 65535; - MEDIUMINT(ilość znaków) - liczby z zakresu od -8388608 do 8388607 lub liczby dodatnie od 0 do 16777215; - INTEGER / INT - liczba całkowita z przedziału -2147483647 do 2147483647 lub liczby dodatnie od 0 do 4294967295; - TEXT - tekstowy ciąg znaków o dł. ograniczonej przez pamięć Twojego serwera; - DATE - data w formacie określonym przez ustawienia serwera; - ENUM - enumeracja (wyliczenie). W kolumnie może się znaleźć jedna z podanych wartości; - YEAR - rok, jeśli zostanie podany zły, jego wartość zmieni się w 0000; - DECIMAL(x, y) - liczba dziesiętna, gdzie X oznacza maksymalną liczbe cyfr, a Y maksymalną liczbę cyfr po przecinku; Łączenie z bazą: Za pomocą poniższego kodu połączymy się poprawnie z naszą bazą (plugin: MySQL StrickenKid): #define SQL_HOST "localhost" #define SQL_USER "user" #define SQL_PASSWORD "password" #define SQL_DB "datebase" new MySQL:sql_init; public OnFilterScriptInit() { sql_init = mysql_init(1); new sql_handle = mysql_connect(SQL_HOST, SQL_USER, SQL_PASSWORD, SQL_DB, sql_init, .auto_reconnect=1); if (sql_handle) // mysql_connect jeśli nastąpi poprawne połączenie z bazą zwróci nam wynik "true" { // jeśli warunek się wykona printf("Połączono z bazą danych, gratulacje!"); } else { // jeśli warunek się nie wykona printf("Niepołączono z bazą danych!!!"); SendRconCommand("exit"); // zamykamy serwer } return 1; } public OnFilterScriptExit() return mysql_close(sql_init); I tak oto poprawnie połączyliśmy się z naszą bazą! Wysyłanie zapytania: W tym kroku nauczymy się wykonywać polecenia/zapytania, które wyślemy do naszej bazy. Dla przykładu pobierzemy z naszej przykładowej tabeli lata oraz punkty, którego wyszukamy za pomocą imienia. new buffer[127], playerNick[MAX_PLAYER_NAME]; GetPlayerName(playerid, playerNick, MAX_PLAYER_NAME); mysql_real_escape_string(playerNick, playerNick); // sprawdzamy, czy nie ma zadnych podejrzanych znakow, ktore moga naszej bazie zaszkodzic format(buffer, 127, "SELECT lata, punkty FROM NBA WHERE imie='%s'", playerNick); if (mysql_query(buffer)) mysql_ping(); // Ta linijka pozwoli nam podtrzymać nasze połączenie mysql_store_result(); // zapisujemy do pamięci if (mysql_num_rows() && mysql_fetch_row(buffer, "|")) { new lata, punkty; sscanf(buffer, "p<|>dd", lata, punkty); format(buffer, 127, "Masz %d punktów i %d lat.", punkty, lata); SendClientMessage(playerid, -1, buffer); } mysql_free_result(); // czyścimy pamięć Jeśli nasz rekord będzie istniał otrzymamy wiadomość np. Masz 14 punktów i 19 lat. Jak widzimy bardzo łatwo jest pobrać informacje posiadając jedno z nich - tutaj imię. Omówienie kilku funkcji dot. MySQL: Ogólnie w MySQL posiadamy bardzo dużo funkcji, które przydają się nam w różnych problemach można znaleźć rozwiązania dzięki nim. Podam tylko te związane z datą, które mogą posłużyć nam do stworzenia systemu Premium: ------------------------------------------------- | Funkcja | Przykład użycia | Opis | ------------------------------------------------- HOUR() | HOUR(kolumna) | Zwraca samą godzine, ze wskazanej daty MINUTE() | MINUTE(kolumna) | Zwraca same minuty, ze wskazanej daty. SECOND() | SECOND(kolumna) | Zwraca same sekundy, ze wskazanej daty. DAYNAME() | DAYNAME(kolumna) | Zwraca nazwę dnia tygodnia. DAYOFMONTH() | DAYOFMONTH(kolumna) | Zwraca sam dzień miesiąca, ze wskazanej daty (wyrażone liczbą). MONTHNAME() | MONTHNAME(kolumna) | Zwraca nazwę miesiąca występującego we wskazanej dacie. MONTH() | MONTH(kolumna) | Zwraca sam miesiąc ze wskazanej daty (wyrażony liczbą). YEAR() | YEAR(kolumna) | Zwraca sam rok ze wskazanej daty. ADDDATE() | ADDDATE(kolumna INTERVAL x typ) | Dodaje do daty przechowywanej w kolumnie x jednostek i zwraca wynik SUBDATE() | SUBDATE(kolumna INTERVAL x typ) | Odejmuje od daty przechowywanej w kolumnie x jednostek i zwraca wynik. UNIX_TIMESTAMP()| UNIX_TIMESTAMP(data) | Zwraca liczbę sekund jaka upłynęła od początku tzw. epoki unixa lub od wskazanej daty. Obsługa danymi: - stworzenie rekordu W życiu codziennej pracy MySQL, przyjdzie taka pora, że trzeba będzie stworzyć REKORD. A więc napiszmy taką, sugerując się wcześniejszą tabelą Przykład 1). INSERT INTO NBA (imie, punkty, lata, mistrzostwa) VALUES ('Imie', '17', '2', '1'); Przykład 2). INSERT INTO NBA SET imie='Imie', punkty='17', lata='2', mistrzostwa='1'; Przykład 3). INSERT INTO NBA ('Imie', '17', '2', '1'); Jak widzimy, można zrobić to na wiele sposobów. Najlepszym (według mnie) rozwiązaniem jest przykład drugi, ponieważ możemy łatwo zobaczyć co i jak ustawiamy. W pierwszym przykładzie jest to o tyle utrudnione, że wszystko "leci" po kolei, a w ostatnim nie wiemy, czy dobrze stworzyliśmy rekord. - pobranie rekordu Ten krok pozwoli się nam przyjrzeć jak powinno wyglądać poprawne pobranie rekordu. Stwórzmy sobie funkcje, która wyśle zapytanie, czy dane konto o nicku np. 'Polak' istnieje... public OnPlayerConnect(playerid) { if (SprawdzCzyKontoIstnieje(playerid)) { SendClientMessage(playerid, -1, "Twoje konto istnieje w bazie danych!"); } else { SendClientMessage(playerid, -1, "Twoje konto nie istnieje w bazie danych!"); } return true; } SprawdzCzyKontoIstnieje(graczid) { new buffer[127], nick[24], bool: istnieje = false; GetPlayerName(graczid, nick, MAX_PLAYER_NAME); mysql_real_escape_string(nick, nick); format(buffer, 127, "SELECT 1 FROM NBA WHERE imie='%s'", nick); if (mysql_query(buffer)) mysql_ping(); mysql_store_result(); if (mysql_num_rows()) istnieje=true; mysql_free_result(); return istnieje; // jeśli znalazlo konto otrzymamy wynik true, jesli nie, to false } Proste, prawda? Według mnie nie trzeba tutaj nic tłumaczyć. - zapisanie danych Przyszła pora na zapisanie/aktualizację danych gracza Użyjemy SEPARATORA "UPDATE": enum p_info { bool: logged, imie[24], punkty, lata, mistrzostwa }; new pInfo[MAX_PLAYERS][p_info]; public OnPlayerDisconnect(playerid, reason) { if (pInfo[playerid][logged]) // Sprawdzamy czy zalogowany jest { new buffer[127]; GetPlayerName(playerid, pInfo[playerid][imie], MAX_PLAYER_NAME); pInfo[playerid][punkty] = GetPlayerScore(playerid); format(buffer, 127, "UPDATE NBA SET punkty='%d', lata='%d', mistrzostwa='%d' WHERE imie='%s'", pInfo[playerid][punkty], pInfo[playerid][lata], pInfo[playerid][mistrzostwa], pInfo[playerid][imie]); mysql_query(buffer); } return true; } I tak oto, zapisaliśmy dane gracza, gdy opuścił serwer. Użyłem 2 przykładu omówionego w poprzednich podpunktach, ponieważ jest najprostszy. Zakończenie: Nadszedł koniec tego poradnika. Omówimy tutaj trochę informacji o bezpieczeństwie zapytań. Najlepszym rozwiązaniem dotyczącym bezpieczeństwa jest przeczytanie tego klik! Należy pamiętać o SQL Injection, można się przed tym zabezpieczyć stosując w formatach tj. '%s', '%d', '%f'; Podałem możliwe przykłady stosując do tego PAWN, aby było prościej zrozumieć ich znaczenie. Pamiętaj MySQL nie odnosi się tylko do PAWN, w ten sam sposób można go użyć do innych języków programowania! :) Przez to, że wiele języków programowania używa MySQL można z łatwością pobrać rekord z bazy danych w PHP, a wcześniej stworzyć go np. w PAWN. © 2012, Górniczek. Szczególną pomoc dedykuję AXV.
×