Skocz do zawartości

Ranking


Popularna zawartość

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

    rand text

    new rand_texts[][]= { {"rand"}, {"random"}, {"los"}, {"losowo"}, {"losowy"}, {"losowanie"} };
  10. 1 punkt
    CeKa

    Koordy X Y Z, każdy zapisuje się w innym pliku.

    djCreateFile(DOCK_PATH"zlecenia.ini");
  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
    PrzMas

    Zbyt długie SendClientMessageToAll, nie wyświetla się

    Maksymalna długość tekstu na czacie to 144 znaki. Możesz rozdzielić na 2 linie
  14. 1 punkt
    PrzMas

    Pojazdy

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

    Radiostacje.

    Po co chcesz cokolwiek gdziekolwiek wrzucać? Przecież nie ma znaczenia skąd ten plik PLS ładujesz, np ja mam jeden plik MP3 na dropbox'ie.
  16. 1 punkt
    Wint3R

    [REKLAMA]MultiServer.pl - RPG/RP

    Ta reklama zachęciła mnie to zainstalowania MTA i sprawdzenia serwera. Wchodzę na serwis, witam się a tam jedna/jeden(?) z moderatorów zadaje mi takie pytanie: Może to się wydawać dziwne, ale przez 6 lat gry w sampa i sprawdzeniu setek projektów żaden z administratorów nie zadał mi takiego pytania przy wejściu na serwer, Mała rzecz, a tak uszczęśliwia. Wszystko wygląda bardzo ładnie. Trzymam kciuki za was, żebyście się jeszcze bardziej rozwinęli, zarabiali oraz mieli setki graczy. Mogę polecić w 100 procentach.
  17. 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))
  18. 1 punkt
    xBBBay ☆

    W mysql nie tworzą się tabele

    Jak nie działa automatycznie, to sam wklej i zobacz czy działa.
  19. 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.
  20. 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.
  21. 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
  22. 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'];
  23. 1 punkt
    Nergosu

    Problem z BW

    ApplyAnimation(playerid,"PED","FLOOR_hit_f",4.0,0,1,1,1,0,1); Spróbuj tego
  24. 1 punkt
    PrzMas

    Systemy liczbowe

    W niniejszym temacie publikuję zestaw funkcji do przeliczania liczby całkowitej na dowolny system liczbowy (2-36) i z dowolnego systemu liczbowego (2-36) na liczbę całkowitą. Wymagana biblioteka (plik uint.inc) do operacji na liczbach nieujemnych (unsigned integer): [pastebin] Implementacje (i makrodefinicje) przedmiotowych w temacie funkcji: Sposób użycia: Objaśnienie: Potrzeba zastosowania powyższych rozwiązań bierze się stąd, że wartości liczbowe mają swoje ograniczenia, są zapisane na 32-bitach ze znakiem lub bez (signed/unsigned): signed integer: 0x80000000 (-2147483648) - 0x7fffffff (2147483647) unsigned integer: 0x00000000 (0) - 0xffffffff (4294967295) oraz dlatego, że nie dostarczono takich funkcji ze środowiskiem SA-MP, natomiast funkcje strval i valstr są "dziurawe" - mają ograniczone możliwości i są niezabezpieczone. Jeśli zależy nam na wartościach ujemnych to pozostajemy przy zwykłych liczbach Pawn, deklarowanych następująco: new val= 1234; // signed jednak mają one ograniczony przedział liczbowy (patrz wyżej). Natomiast jeżeli wiemy, że dla danej liczby nie chcemy wartości ujemnych i zachodzi potrzeba zastosowania większego zakresu liczbowego, to w tym celu zmienną przechowującą duże wartości, którą będziemy traktować jak nieujemną, należy oznaczyć następująco: new uint: val1= 1234; // unsigned new unsigned val2= 1234; // unsigned Plik uint.inc najlepiej wkleić do folderu pawno\include, a w pliku gdzie znajdują się implementacje powyższych funkcji należy dopisać: #include <uint> a jeśli niniejszy plik został wklejony do folderu include, znajdującym się w głównym katalogu serwera to: #include "..\include\uint.inc"
  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.
×