Skocz do zawartości
l0nger

[LUA Coding, e02] Tworzenie skryptu opartego o MySQL

Rekomendowane odpowiedzi

w4ZP12S.png


Wprowadzenie
W pierwszym epizodzie zajeliśmy się opisem podstawy LUA, dzisiaj wkroczymy w bardziej mroczne progi.
A mianowicie osiągnieciemy pierwszy stopień ciemnej mocy! Plan na dzisiejszą część:
1) Stworzenie pierwszego zasobu, 2) Konfigurowanie serwera, 3) Odpalenie serwera.

A więc do dzieła drogie milordy!

Nasz pierwszy zasób
Zasób (ang. resource) jest to zbiór danych. Zwykle są podzielone na kod - skrypty, inne elementy typu zdjęcia, audio, pliki tekstur.
Ich mistrzem a zarazem królem jest plik metadanych. To on przekazuje serwerowi, które skrypty ma wczytać, po jakiej stronie ma to zinterpretować i jakie pliki ma przesłać klientowi.

Wchodzimy w katalogu resources, poniżej ścieżka gdzie ten katalog się znajduje.
Główna ścieżka, w której umieszczamy nasze zasoby: ../MTAServer/mods/deathmatch/resources/
o75dihT.jpg
Tak powinien wyglądać katalog resources (wyżej zdjęcie). Znajdziemy w nim kilka gotowych zasobow, np. na panel administracyjny (zasób admin), zarządzanie z poziomu WWW (zasób web).

Okej! A więc do roboty, stwórzmy pierwszy katalog. Z własną nazwą - ja w celach tego poradnika nazwę swój zasób "tutorial", wy możecie inaczej.
Tworzymy katalog, i nadajemy mu nasza nazwę na początku nazwy dodajmy [ i na końcu ]. Ta operacja jest ważna, bez tego serwer może nie wykryć Waszego zasobu przy odświeżaniu zasóbow (o tym poźniej).
Mniej więcej tak powinno to wyglądać
kjdz2ag.jpg

Gdy to mamy za sobą, możemy przejść do następnego kroku, a mianowicie stworzenie naszego pierwszego zasobu.
Tworzymy katalog z nazwą własną (w poradniku wykorzystalem nazwe tut-core), oraz pliki jak na zdjęciu
PpaxGnN.jpg

TfbjkA0.jpg

Dlaczego nazwałem katalog zasobu tut-core? Odpowiedz na to pytanie jest proste. Tut to inaczej skrót od tutorial, a core to po prostu nazwa modułu.
W core będziemy przechowywać najważniejsze dane, inicjować połączenie z bazą danych z tego modułu, i tym podobne.
Otwórzmy plik s_core.lua i zakodźmy wiadomość powitalną dla wchodzącego gracza.
Aby nasz plik wyglądał w miarę estetycznie zakomentujmy sobie strefy, w których będzie umieszczać poszczególne warstwy kodu.
Do podziału idą: 1) Zmienne 2) Funkcje 3) Eventy.

jzPYMe0.jpg

Okeeej, co my tu mamy... Opiszmy co nieco o kodzie, który widzimy u góry. Jest tutaj addEventHandler, czyli przechwytywacz eventu, który zostanie wywołany.
Na wypadek zajrzyjmy na WIKI i sprawdźmy, czy ten event posiada jakieś argument.
Argumenty to inaczej Parameters, w tym evencie niestety nie ma, ale w innych np. onResourceStart tak.
Warto też sprawdzić, co zwraca argument source potocznie mówiąc źródło zdarzenia. Widzimy:



The source of this event is the player who joined.

Można wywnioskować, że argument source to inaczej element gracza, który wszedł właśnie na serwer.

Ok, wróćmy do analizy kodu, znajduje się też funkcja anonimowa.
Funkcje anonimowe można stosować wszędzie. W pierwszej części poradnika pisałem, o tym, że zmienna może deklarować funkcje. Tak - deklarować.
Funkcja anonimowa od funkcji zwykłej cechuje się szybkością jej wywołania. A prócz tego, mamy solidny porządek w naszym kodzie.
Możecie sobie sami zobaczyć różnicę...
-- wykorzystanie funkcji zwyklej
function onResourceStart(res)
	-- cos
end

addEventHandler("onResourceStart", resourceRoot, onResourceStart)

-- wykorzystanie funkcji anonimowej
addEventHandler("onResourceStart", resourceRoot,
	function(res)
		-- cos
end)
Jest różnica, prawda? :-)

Dobra, chciałbym teraz napisać kod, który wyświetli informacje o załadowaniu naszego zasobu. Jak to zrobić?
Znowu musimy wejść na WIKI i szukamy onResourceStart...
Gdy znajdziemy, klikamy. I co widzimy? Jest argument startResource - czyli aktualnie startowany zasób.
To może się przydać, co jeszcze? Ah, tak... Potrzebna jeszcze funkcja outputDebugString, żeby wyświetlić do w konsoli serwera.
Gdy mamy wszystko, zabieramy się do pracy. Przechwyćmy event onResourceStart, wykorzystując funkcje anonimową oraz wykorzystując argument startResource - tutaj można dać własną nazwę - ja dałem resource.
Zapomniałbym... Chciałbym jeszcze, aby wyświetlało mi informacje o wyłączeniu tego zasobu. Tak jak wcześniej szukamy, ale teraz onResourceStop.
Całość aktualnie wygląda tak:

rf3WOSs.jpg
hm, momencik. Mamy tam zadeklarowaną zmienna niewiadomą SCRIPT_VERSION. Weźmy ją zadeklarujmy, oraz napiszmy pomocniczą funkcje zwracającą nam wersje skryptu, którą w przyszłości w udostępnimy dla innych zasobów.
Okej - wygląda to tak
41YijPb.jpg

Teraz otwieramy plik metadanych (meta.xml) i wpisujemy do niego poniższą treść:
<meta>
   <script src="s_core.lua" type="server" />
</meta>
W linijce <script src="s_core.lua" type="server" /> mówimy serwerowi, żeby wczytał plik s_core.lua po stronie serwera. Dostępne strony: 1) server, 2) client
+ taka ciekawostka, możemy pominąć deklaracje typu, jeżeli typ będzie tylko na serwer.
<script src="s_core.lua" />
Gdy zasób mamy już gotowy.
Możemy pomówić z deczka o elementach stosowanych w MTA. Elementy to inaczej gracz, pojazd, obiekt, dzwiek, gui, strefa, woda, tekstura, shader i inne. Więcej elementów znajdziemy tutaj
Do tego dochodzi jeszcze element główny ROOT czyli tak jakby admin wszystkich elementów, ponadto istnieje także resourceRoot - wykorzystywane do przechwytu eventu podczas startowania/stopowania zasobu (onResourceStart/Stop).
Są także ukryte zmienne, wspomniane wcześniej source. A poza tym - client, this, eventName, guiRoot, localPlayer.

Przejdźmy zatem do konfiguracji serwera.

Konfiguracja serwera MTA
Żeby skonfigurować serwer MTA, trzeba otworzyć plik mtaserver.conf, znajduje się on w /mtaserver/mods/deathmatch/
Widzimy tam pełno zmiennych, które można w przyszłości wykorzystać w dobrym celu. My zajmiemy się tylko paroma.
Opiszmy te najważniejsze:
servername = nazwa serwera,
serverip = zbindowany adres IP
maxplayers = sloty serwera,
ase = udostępnianie informacji o serwerze klientom w wyszukiwarce,
password = haslo serwera, domyślnie brak,
fpslimit = maksymalna ilość FPSów u klienta,
bullet_sync = synchronizacja pocisków
Teraz zjeżdzamy na sam dół i widzimy nastepujące linijki...
<resource src="parachute" startup="1" protected="0" />
<resource src="resourcebrowser" startup="1" protected="1" default="true" />
<resource src="resourcemanager" startup="1" protected="1" />
<resource src="webadmin" startup="1" protected="0" />
Taki zapis oznacza, że te zasoby mają zostać uruchomione podczas włączenia serwera.
W taki sam sposób dodajemy swoje własne zasoby, które mają zostać uruchomione. Oczywiście można to zrobić za pomocą konsoli.
Wpisując odpowiednie komendy, ale dla zautomatyzowania wpisujemy sobie nazwę zasobu. W poniższy sposób:
<resource src="tut-core" startup="1" protected="0" />
Wpisując powyższą linijkę mówimy serwerowi, że ma uruchomić zasób o nazwie podanej w "src=".

Uruchamianie serwera MTA
Przechodzimy do końcowej części poradnika - odpalanie naszego serwera. Wchodzimy w katalog z naszym serwerem MTA i go odpalamy.
Wyglada to tak:
CsiLR8Q.jpg

Gdy nie znamy komend serwera, wpisujemy --help. wyskakuje nam lista z komendami, ktore możemy użyć.
A poniżej lista z przydanymi nam funkcjami:
start nazwa_zasobu = startujemy zasób
restart nazwa_zasobu = resetujemy zasób
stop nazwa_zasobu = zatrzymujemy zasób
upgrade nazwa_zasobu = aktualizujemy zasób
refresh (opcjonalnie nazwa_zasobu) = odswiezamy liste z wszystkimi zasobami, przydatne, gdy serwer chodzi, a my stworzylismy nowy zasob i chcemy go uruchomic bez ponownego uruchamiania serwera. 
refreshall = spowoduje odswiezenie wszystkich zasobow
A na koniec, wpiszmy sobie taka kombinacje:
stop tut-core
start tut-core
Powinnismy otrzymac:
4PhSzqy.jpg

Zadanie domowe:
- Stwórz zasób (może być skrypt), który będzie miał za zadanie wyświetlić graczowi wiadomość przy połaczeniu i wyjściu z serwerem. Do pomocy wykorzystaj WIKI.

Na tym konczymy dzisiejszy poradnik. W przyszlym poradniku stworzymy zasób łączący z bazą danych, odczytywanie danych konfiguracyjnych z metydanych i może wykonamy szkielet logowania-rejestracji!
Poradnik pisany specjalnie pod serwis Pawno.PL. Zakaz rozpowszechniania poradniku na innne fora lub zmiany jego autora.




Uwaga! Informuje, że z dniem 25 października bieżącego roku tj. 2014-go poradnik pod tytułem Lua Coding zostaje wstrzymana. Edytowane przez l0nger

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Bo chciał bym się dowiedzieć jak zrobić takie coś w lua

	if(dialogid == gui_login+1)
	{
		if(response == 0)
		{
			Kick(playerid);
		}
		else
		{
			if(strlen(inputtext) >= 6)
			{
				new str[312];
				new hashex[128];
				new password[32];
				
				mysql_real_escape_string(inputtext, password);
				format(hashex, sizeof(hashex), "%s%s", MD5_Hash(AccInfo[playerid][accSalt]), MD5_Hash(password));
				format(str, sizeof(str), "SELECT `username` FROM `mybb_users` WHERE `uid` = '%d' AND `password` = md5('%s') LIMIT 1", AccInfo[playerid][accID], hashex);
				mysql_query(str);
				mysql_store_result();
				new numrows = mysql_num_rows();
				mysql_free_result();
				if(numrows != 0)
				{
					LoadCharacterList(playerid, AccInfo[playerid][accID]);
					SetPVarInt(playerid, "ACCLOGGED", 1);
					DeletePVar(playerid, "LOGTRIES");
					return 1;
				}
				else
				{
					SetPVarInt(playerid,"LOGTRIES",GetPVarInt(playerid, "LOGTRIES")+1);
					format(ministring, sizeof(ministring),"{ff0033}Próba: %d/3\n{ffffff}Wpisałeś złe hasło, spróbój ponownie!\nWpisz swoje hasło",GetPVarInt(playerid, "LOGTRIES"));
					ShowPlayerDialog(playerid, gui_login+1, DIALOG_STYLE_PASSWORD, "{33cc33}Logowanie", ministring, "Zaloguj", "Wyjdź");
					if(GetPVarInt(playerid,"LOGTRIES") == 3)
					{
						format(ministring, sizeof(ministring), "{ff0033}Próba: %d/3\n{ffffff}Nie udało ci się zalogować\nspróbój za jakiś czas.", GetPVarInt(playerid, "LOGTRIES"));
						ShowPlayerDialog(playerid, gui_info+1, DIALOG_STYLE_MSGBOX, "{33cc33}Logowanie", ministring, "Zamknij","");
						DeletePVar(playerid, "LOGTRIES");
					}
					return 1;
				}
			}
			else
			{
				SetPVarInt(playerid,"LOGTRIES",GetPVarInt(playerid, "LOGTRIES")+1);
				format(ministring, sizeof(ministring),"{ff0033}Próba: %d/3\n{ffffff}Nieprawidłowa ilość znaków!\nWpisz swoje hasło",GetPVarInt(playerid, "LOGTRIES"));
				ShowPlayerDialog(playerid, gui_login+1, DIALOG_STYLE_PASSWORD, "{33cc33}Logowanie", ministring, "Zaloguj", "Wyjdź");
				if(GetPVarInt(playerid,"LOGTRIES") == 3)
				{
					format(ministring, sizeof(ministring), "{ff0033}Próba %d/3\n{ffffff}Nie udało ci się zalogować\nspróbój za jakiś czas.", GetPVarInt(playerid, "LOGTRIES"));
					ShowPlayerDialog(playerid, gui_info+1, DIALOG_STYLE_MSGBOX, "{33cc33}Logowanie", ministring, "Zamknij","");
					DeletePVar(playerid, "LOGTRIES");
				}
				return 1;
			}
		}
	}
Edytowane przez Plajcyt

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×