Skocz do zawartości

Ranking


Popularna zawartość

Zawartość, która uzyskała najwyższe oceny od 10.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. 4 punkty
    Beata_Szydlo_2015

    Pawn a przyszłość

    pawn != przyszłość.
  3. 2 punkty
    Beata_Szydlo_2015

  4. 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.
  5. 2 punkty
    Bartcislaw

    LS-RP | Los Santos RolePlay - Powraca!

    I wy chcieliście współpracować z Compton? Porażka.
  6. 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.
  7. 2 punkty
    PrzMas

    random z bazy danych

    Jeśli już to: if (response) { mysql_query( "SELECT * FROM `bays`;"); mysql_store_result(); new idx= random(mysql_num_rows()); // idx to indeks wylosowanego pola mysql_free_result(); } W pluginie, którego używam da się pobierać rekordy i pola po indeksie, a w StrickenKid-ie nie da się inaczej jak po nazwie pola. SELECT * FROM bays ORDER BY RAND() LIMIT 1; SELECT * FROM table WHERE id >= (SELECT FLOOR(MAX(id)*RAND()) FROM table) ORDER BY id LIMIT 1; Powyższe dwa zapytania zwrócą tylko jeden wylosowany rekord z tabeli. Ta druga kwerenda jest dla tabeli z kluczem głównym.
  8. 1 punkt
    CloudMTA

    [Reklama] CloudMTA

    Poszukujesz alternatywnego, swobodnego miejsca rozgrywki? Miejsca, do którego śmiało możesz zaprosić znajomych i wspólnie z nimi stworzyć własny kącik do gry? Masz już dość projektów, które usilnie walczą o tytuł RPG roku? My wiemy, że poszukujesz lepszego miejsca do gry - gwarantujemy, że tutaj znajdziesz coś dla siebie. CloudMTA to z pewnością niepowtarzalne miejsce, które ideą nawiązuje do czasów świetności polskiej sceny role play. To miejsce dla graczy zdeterminowanych, kreatywnych, poszukujących niecodziennych wrażeń - dokładnie takich jak Ty! Miejscem rozgrywki - oferującym klimat jak za dawnych lat - jest Los Santos. Warto podkreślić, że akcja nie toczy się w Kalifornii, a we współczesnym San Andreas (więcej informacji). Taki krok pozwala na kreowanie własnego świata z odpowiednio dostosowanymi zasadami In Character. W procesie tworzenia postaci przywita Cię intuicyjny kreator, w którym ustalisz dane kreowanej postaci oraz jej cechy, jak: płeć, kolor oczu, karnacja skóry i wzrost. Ostatnim krokiem jest wybranie początkowego miejsca rozgrywki spośród 20 dostępnych! W tym procesie dokładnie zastanów się, jakiego pochodzenia będzie Twoja postać. CloudMTA oferuje możliwość gry prawowitego obywatela, a także nielegalnego imigranta (kliknij po więcej), który pojawia się w mieście z czystą kartą i nic o nim nie wiadomo - wybór należy do Ciebie. Twoja przygoda z rozgrywką dopiero się zaczyna? Nie martw się! Dla osób w podobnej sytuacji przygotowaliśmy specjalny program Szkółki Role Play, który bez wstydu ułatwi stawianie pierwszych kroków pod okiem doświadczonych mentorów, wystarczy wybrać tylko odpowiednią opcję w samym kreatorze. No dobrze, zapewne z niecierpliwością czekasz na ten punkt, w którym zaczerpniesz informacji na temat samej rozgrywki. CloudMTA jest miejscem szczególnie otwartym dla graczy pomysłowych, chcących zainicjować własne miejsce do gry. Tylko u nas bez żadnych barier, aplikacji, czy innych zbędnych podań, możesz założyć grupę (kliknij po szczegółowe informacje), której nadasz wybrany przez siebie status. Może to być świeżo upieczona organizacja przestępcza, rodzina, dzięki której wraz ze znajomymi będziesz mógł dzielić się wspólnymi dobrami, a nawet raczkująca korporacja - w tej kwestii nie mamy nic do gadania, to Ty wykuwasz los swojej postaci. Więc jeśli również stawiasz na rozgrywkę, odetchnij i zamknij swój edytor tekstowy. Zbierz gromadę znajomych i zaplanuj, w jaki sposób zagospodarujecie swój zaoszczędzony czas. Specjalnie dla Ciebie przygotowaliśmy wiele wariantów rozgrywki. Przyjemność i swobodę znajdą nie tylko osoby zainteresowane półświatkiem przestępczym. CloudMTA świetnie zadbało o sympatyków frakcji publicznych. Na serwerze znajdzie się miejsce dla polityków, ratowników medycznych, strażaków, funkcjonariuszy służb porządkowych i reporterów. Dla każdego z tych zawodów robimy ukłon, abyś mógł cieszyć się przyjemnością rozgrywki gdzie tylko zapragniesz. Głównym zamysłem władzy hrabstwa jest Rada Nadzorcza złożona z demokratycznie wybranych radnych przez legalnych obywateli. To na jej barkach będzie spoczywała odpowiedzialność rozdzielania budżetu, ponieważ zyski wszystkich organizacji publicznych będą wpływały na konto rządu. Organy sprawujące władzę w poszczególnych frakcjach będą zmuszone prezentować plany budżetowe podczas przeznaczonych do tego obrad. Więcej o działalności Rady Nadzorczej: Mało tego, jeśli należysz do grona ochotników na to stanowisko, będziesz mógł reprezentować swój region hrabstwa. To właśnie delegaci poszczególnych okręgów odpowiadają za rozporządzanie budżetu, dlatego tak ważne jest wybranie właściwych osób, jako radnych. Możesz również wybrać ścieżkę funkcjonariusza służb publicznych. Działania departamentu obejmują całe hrabstwo, nie ograniczając się wyłącznie do miasta. Co ważniejsze, zamierzamy we współpracy z liderem frakcji rozpocząć działalność County Jail, miejsca w którym zagościsz jeśli nagminnie złamiesz przepisy prawa. Frakcja została zaopatrzona we wszelkie podstawowe, a zarazem niezbędne systemy - począwszy od zwykłych kajdanek, przez przyrządy do rejestrowania prędkości lub identyfikatorów tablic rejestracyjnych, a kończąc na kartotece. Developerzy CMTA stale rozwijają kryminalistykę, na początek odciski palców i kody genetyczne, całość znacznie rozbudowana podsyci zapomniany charakter tej organizacji. W kwestii tej frakcji nasz ukłon jest najniższy. Na wielu konkurencyjnych projektach możesz doczytać o licznych niedociągnięciach względem struktury straży pożarnej, czy też skryptu, którym dysponuje, a raczej jego brakiem. Jak już wspominaliśmy CloudMTA jest czymś więcej niż drobną kroplą w środku oceanu, jest kwintesencją dobrego smaku role play. Meritum Fire Departament jest odpowiednio przygotowany system pożarów, niestandardowa remiza strażacka spod ręki naszych developerów, a nawet unikalne pojazdy służbowe. Wszystko to zapewnia należyty byt jaki powinna od dawna mieć organizacja. Lokalna stacja radiowa to z pewnością miejsce dla najwybitniejszych reporterów z całego stanu. Jeśli jednak uważasz, że to nie Twoja domena, nie przejmuj się! Przygotowaliśmy dla Ciebie wiele niespodzianek z innych dziedzin rozgrywki, co najmniej jedna bez wątpienia Cię zaciekawi. Z kolei nie zapomnieliśmy o osobach, które podejmą się tego wyzwania i czują, że praca w radiu to ich żywioł. Każda wiadomość - oficjalnie wyemitowana przez Los Santos News - synchronizuje się z naszym forumowym paskiem LSN Live, funkcja ta pozwala w czasie rzeczywistym, podczas czynnego przeglądania forum śledzić bieżące wydarzenia ze świata In Character. Audycje, wywiady, bloki reklamowe nabierają nowego znaczenia. Należysz do grona przedsiębiorców naszego hrabstwa? To jedna ze skuteczniejszych form budowania wirtualnej marki. Czy wiesz, że smartfon stał się głównym środkiem komunikacji in character, a jego projekt wzorowany jest realnymi odpowiednikami kilku światowych marek, po których przejął parę kluczowych funkcji, dokładniej rozmowy telefoniczne i SMSy? Dzięki możliwościom, które daje nam platforma MTA, maksymalnie wykorzystujemy potencjał naszych telefonów. Zastosowany został bowiem dźwięk przestrzenny, który zmienia głośność dźwięku wydobywającego się z telefonu w zależności od odległości w której się znajdujemy od urządzenia. Całość została ubrana w przejrzysty interfejs, a używanie jest bajecznie proste. Urządzenie oferuje Wam takie możliwości jak: wybieranie numeru, dzwonienie, zapisywanie i usuwanie kontaktów, wysyłanie wiadomości SMS (gdy Wasz telefon jest wyłączony to wiadomość otrzymacie od razu po jego włączeniu) czy zmiana domyślnego dzwonka. Chcesz przekonać się na własne oczy jak działa system telefonu? Nie zwlekaj i już teraz zawitaj na nasze forum! Starzy wyjadacze nadal mogą pamiętać pierwsze, historyczne odprawy policyjne na których najczęściej byliśmy zmuszani do zainstalowania radaru, który był arcyważny do prowadzenia normalnej rozgrywki! Najczęściej musieliśmy ucinać dłuższą chwilę z naszego cennego czasu, żeby poszukać danej modyfikacji, a następnie ją zainstalować. Nie u nas! Na serwer wprowadziliśmy radar, który obecnie możecie podejrzeć w miniaturce zamieszczonej w grafice. Czas, który byście stracili na instalacje możecie poświęcić na grę na naszym serwerze, a obie strony na tym jednocześnie zyskają! Inteligentny radar na bieżąco daje znać w której dzielnicy obecnie się znajdujemy, a dodatkowo na bieżąco wskazuje kierunek północny. Na owym dodatku będziemy mogli dowiedzieć się po jakiej ulicy obecnie jedziemy, a dzięki owej opcji łatwo będzie dać znać koledze gdzie ma wpaść na grilla! Jesteśmy pewni, że on z równą łatwością na niego przyjedzie. Stare, a można nawet powiedzieć, że zakurzone oferty, które były opierane na przejedzonym już przez użytkowników podstawowym systemie idą w zapomnienie. Postanowiliśmy wykorzystać nasz autorski HUD, który po otrzymaniu oferty rozwinie się a następnie ją tam wyświetli. Koniec z zajmowaniem połowy ekranu podczas wyświetlania oferty na samym środku. Propozycję przedmiotu/przywitania itd. będziecie mogli akceptować lub przeciwnie odrzucać następującymi przyciskami: [, ], a dla wzrokowców będzie wyświetlana miniaturka przedmiotu (tak jak na zdjęciu pizza). Jesteśmy pewni, że przyda Wam się to w rozgrywce! FORUM: http://cmta.pl/ FACEBOOK: https://www.facebook.com/cloudmtapl/?fref=ts DISCORD: https://discordapp.com/invite/0zaodSgPghjrPzRL STEAM: http://steamcommunity.com/groups/CloudMTA
  9. 1 punkt
    PrzMas

    [warning] client exceeded 'ackslimit'

    DoS albo słaby internet.
  10. 1 punkt
    PrzMas

    rand text

    new rand_texts[][]= { {"rand"}, {"random"}, {"los"}, {"losowo"}, {"losowy"}, {"losowanie"} };
  11. 1 punkt
    Abyss Morgan

    Radiostacje.

    może zadziałać jak usuniesz ?dl=0 z linku, bo link zawiera .mp3, też musisz zamienić % na %% jak się nie mylę by samp to łyknoł, polecam ci stosować proste nazwy A-Z, a-z, 0-9, kreska dolna _ zamiast spacji i oszczędzisz sobie trudu
  12. 1 punkt
    Abyss Morgan

    Radiostacje.

    new radia[][]={ "Radio Party","http://radioparty.pl/play/glowny_24aac.m3u", "RMF FM","http://www.miastomuzyki.pl/n/rmffm.pls", "RMF Maxx","http://www.miastomuzyki.pl/n/rmfmaxxx.pls", "Radio ZET","http://91.121.179.221:8050/listen.pls", "ESKA Warszawa","http://poznan6.radio.pionier.net.pl:8000/eska-warszawa.mp3", "ESKA Lublin","http://gramy01.eska.fm:8000/eska_lublin.mp3.m3u", "DI.FM LiquidDNB","http://listen.di.fm/public2/liquiddnb.pls", "DJ TOP-50","http://polskastacja.pl/play/aac_djtop50.pls", "Planeta FM","http://www.planeta.fm/content/stream/planeta_krakow.pls", "PolskaStacja disco polo","http://www.polskastacja.pl/play/aac_discopolo.pls", "PolskaStacja DNB","http://www.polskastacja.pl/play/aac_drumbass.pls", "PolskaStacja polski HipHop","http://www.polskastacja.pl/play/aac_polskihh.pls", "PolskaStacja polskie przeboje","http://www.polskastacja.pl/play/aac_tpp.pls", "PolskaStacja przeboje na lato","http://178.33.55.20:80/", "PolskaStacja - HOT 100 - Goraca Setka Nowosci","http://www.polskastacja.pl/play/aac_hot100.pls", "PolskaStacja -Tylko ROCK","http://www.polskastacja.pl/play/aac_rock.pls", "Polskie Radio - Jedynka","http://www.polskieradio.pl/st/program1M.asx", "Polskie Radio - Dwójka","http://www.polskieradio.pl/st/program2.asx", "Polskie Radio - Trójka","http://www.polskieradio.pl/st/program3M.asx", "Antyradio Katowice","http://94.23.88.162:9200/listen.pls", "Top HitZ","http://listen.slotex.pl/7596.pls", "Black Metal Domain","http://panel9.serverhostingcenter.com/tunein.php/abarnard/playlist.pls", "DEATH.FM","http://community.loudcity.com/stations/death-fm/files/show/MP3-hi.pls", "Violent Forces Radio","http://69.175.13.130:8080/", "Club Hits","http://www.polskastacja.pl/playgwp/aac_clubhits.pls" }; może kilka ci ułatwi zadanie
  13. 1 punkt
    http://pastebin.com/n21QZdbN stock msg_SendClientMessageEx(playerid, color, text[]) { //printf("elo %s", text); if(strlen(text) > 144) { new msg_string3[145]; strmid(msg_string3, text, 0, 140); strins(msg_string3, "...", 0); strdel(text, 0, 140); SendClientMessage(playerid, color, msg_string3); return SendClientMessage(playerid, color, text); } else return SendClientMessage(playerid, color, text); } stare ale dziala moge ci dac nowsza wersje ktora zmienia wiele lini ale w cpp i bys musial sobie na pawn przerobic.
  14. 1 punkt
    PrzMas

    Pojazdy

    Trailer to jest przyczepa, a on chce przyczepić pojazd od pojazdu.
  15. 1 punkt
    xBBBay ☆

    W mysql nie tworzą się tabele

    Jak nie działa automatycznie, to sam wklej i zobacz czy działa.
  16. 1 punkt
    PrzMas

    [ROZWIĄZANY]Czas, GUI i zmiana koloru w środku zdania

    Zastąp symbole \n (LF) i \t (HT) jakimiś pojedynczymi znakami, których wiesz, że nie będziesz używał w tekście (np | i >) po czym prześlij całość do bazy danych, natomiast po pobraniu zamień z powrotem w pętli odpowiednio na \n i \t. stock mysql_spchrp(str[], str_sz= sizeof str) // mysql special chars replace { for(new i= 0; i < str_sz; i++) { if (str[i] == 0x00) break; // NULL, end of string else if (str[i] == '>') str[i]= 0x09; // HT else if (str[i] == '|') str[i]= 0x0a; // LF else if (str[i] == 0x09) str[i]= '>'; else if (str[i] == 0x0a) str[i]= '|'; } }
  17. 1 punkt
    Dejv

    [ROZWIĄZANY]wczytywanie pojazdów z pliku .txt

    W oryginalnej mapie grandlarceny masz pokazane jak to zrobić. Można znaleźć w paczce serwerowej.
  18. 1 punkt
    Nergosu

    Opinia o serwerze

    Grałem od 0.2a bodajże, na początku było super, ale po latach w skład administracji dostały się osoby, które nie interesowały się losami serwera i w ten sposób serwer stracił wielu zwolenników, oraz rozgłos na większą skalę, gamemod jeden z lepszych jaki widziałem, można o nim przeczytać /about na serwerze, nie wchodziłem tam od dawno, bo skończyłem z SA-MP'em, ale jeśli ktoś poszukuję zajęcia to polecam tam wejść, jest sporo rzeczy do robienia. W skrócie gamemode i potencjał jest ogromny, ale "polityka administracji" jest na zupełnie innym poziomie.
  19. 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
  20. 1 punkt
    DaGaXeR

    Czy ten VPS wystarczy?

    Skoro stawiasz forum na IP Board gdzie wydałeś 175$ nie wiem dlaczego chcesz oszczędzać 15zł. "Czy wystarczy" zależy od wielu czynników. Chociażby ilość graczy, Twoje aplikacje na forum itd.
  21. 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'];
  22. 1 punkt
    CeKa

    Obrazek ze zmienną treścią.

    http://php.net/manual/en/function.imagejpeg.php Są tam przykłady
  23. 1 punkt
    Nergosu

    Problem z BW

    W timerze po 5 minutach zrób to co chciałeś czyli clear animations itd. Pamiętaj, że pozycje gracza to Float: I warto też TogglePlayerControllable(playerid, 0); żeby sam sobie nie przerwał animacji
  24. 1 punkt
    Michalec

    [ROZWIĄZANY]Kodowanie znaków

    Spróbuj mysql_set_charset("cp1250", mysql); Problem w tym, że plik .pwn jest zapisywany w Windows-1250. Zmiana na UTF nic nie da, ponieważ w grze nie będzie wtedy polskich znaków.
  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.
×