Thread Rating:
  • 1 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PL]2.Skryptuj z Danielem- Role-Play.
#1
RolePlay, czyli "jeśli nie możesz czegoś stworzyć, to sobie to wymyśl". To stwierdzenie okazało się tak samo zbawieniem, jak i gwoździem do trumny. Ale nie o tym mamy pisać, przecież stanowimy świeży nurt, który najlepiej wie "czego graczom potrzeba" Smile Może najpierw nauczmy się kilku rzeczy, mianowicie:
Tworzenie komend.
Zapisywania danych do pliku
Odczytywania tych danych
I kilka innych szczegółów między innymi rozwiążemy tajemnicę funkcji sscanf. Do roboty!

1. /me pisze skrypty na serwer.
W zasadzie wszędzie mamy takie komendy do wpisywania na czacie, prawda? Czasami zmieniamy nimi wygląd, czasami wysyłamy prywatną wiadomość. My zrobimy to drugie, ponieważ wydaje mi się ze strony skryptów ciekawsze.
Pamiętacie jak używaliśmy onCommand w naszych pierwszych skryptach? Zróbmy teraz to samo, w case wpisując pm czy też pw.

Code:
addEvent("onCommand", function(cmd, params)
{...}

LUB

Code:
function onCommand(cmd, params)
{...}

cmd w sumie oznacza funkcję, którą będziemy wywoływali. Przyjęło się, że zaczynamy odwoływaną funkcję od skrótu CMD czyli na przykład CMD_MESSAGE czy też CMD_VISUAL.
params jest tutaj zdecydowanie najciekawsze. Działa jak argumenty w callbackach i pobiera nam to, co wpiszemy po danej komendzie! Teraz pewnie wam też wydaje się to łatwe Smile
I prawie tak jest, chociaż my sobie to utrudniliśmy. Skoro mamy wysłać do kogoś PW to musimy mieć.
ID
Treść wiadomości.
Mało tego, że są to dwie "wartości", to jeszcze jedna jest integerem, a druga stringiem. Tutaj przychodzi nam z pomocą sscanf.
http://gothic-online.com.pl/wiki/index.php?title=Sscanf
Ta ciekawa funkcja z której istnieje spotkałem się dzięki G2O po raz pierwszy, pozwala nam "podzielić" params i wpisac do tablicy jego elementy. Mało tego, możemy wygodnie sobie oznaczyć, które pole jaki ma mieć format. Cytując:

Quote:   d: integer value. Example 123532.
   f: float value. Example 56.2353.
   s: string. Example "Gothic 2 Online Smile".

Jeszcze zanim zastosujemy ją w praktyce, wróćmy do onCommand. Możemy podać kod bezpośrednio w case


Code:
local health=getHealth();
local maxhealth=getMaxHealth();
function onCommand(cmd, params)
{
   switch(cmd)
   {
   case "heal":
       if(health<maxhealth)
       {
       setHeatlh(maxhealth);
       }
       break;
   }
}


Quote:Zwróćcie uwagę gdzie zdefiniowałem zmienne health oraz maxhealth! To bardzo ważne. Nie możemy ich umieści w switchu, bo po prostu nie będą działały, a cała funkcja nam się "popsuje"!


Ale na dłuższą metę jest to mało przejrzyste. Takie coś jest dobre, gdy chcemy coś potestować. Dużo ładniejszy jest taki "ciąg"


Code:
function onCommand(cmd, params)
{
   switch(cmd)
   {
   case "heal":
       CMD_HEAL(params)
       break;
       
   case "tp":
       CMD_TP(params)
       break;
   }
}


I teraz z wieloma komendami sobie poradzicie. Ale przy wysyłaniem prywatnej wiadomości musimy zastosować pewną zmianę. No i wykonać skrypt po stronie serwera.
W sumie możnaby zrobić callServerFunc, ale po co? onCommand może być jednoczesnie i skryptach klienta i w skryptach serwera.

Poza samym sscanf, musimy pobrać id gracza, żeby wyświetlić odbiorcy kto do niego piszę. Zrobimy to, używaną już przy skrypcie DMu, zmienną pid. Wpiszemy ją do nawiasu za onCommand. Co do sscanf, utworzymy jakąś zmienną, która będzie nazwą naszej tablicy. Na przykład msg. przypiszemy do niej sscanf, pierwszy argument będzie integerem(id), reszta stringiem(treść). Szereg warunków jak na przykład, ID wysyłającego musi być różny od ID odbiorcy, musicie stworzyć sobie sami.


Code:
function onCommand(pid,cmd, params)
{
   switch(cmd)
   {
   case "pw":
       CMD_PW(params)
       break;        
   }
};

CMD_PW(pid,cmd, params)
{
local msg=sscanf("ds",params);
local tresc="["+getPlayerName(pid)+"]:"+msg[1];
sendMessage(msg[0],0,255,0,tresc);
sendMessage(pid,0,255,0,tresc);
};


Nie możemy zapomnieć o wysłaniu wiadomości przez serwer, także do gracza który pisze tą wiadomość. Bez tego rozmowa byłaby dość...dziwna, prawda?
Ze strony skryptów pamiętajcie, żeby wpisać odpowiednie argumenty w nawias przy onCommand oraz nazwie wywoływanej funkcji. Tym sposobem wskazujemy, co przekazujemy.

I to by było wszystko. Niesamowite, tyle ważnych informacji w tak krótkim podpunkcie. Aż się boję ruszać z fileloaderem, tam to jest dopiero treści do opisania Smile No, ale tego nie przeskoczymy, a potrzebne nam tam umiejętności nie są już tak "pospolite" i poza logiką, trzeba znać kilka zasad.


2. File loader
Hmm...co sobie zapiszemy? Coś takiego, żeby wyczerpać temat, ale żebym nie odwalił za was najbrudniejszej roboty.
Dobra, to zrobimy zapisywanie hasła. A dokładnie zapisanie jakiegoś słowa w grze do pliku, potem odczytanie go i porównanie z wpisanym w grze słowem.
Garśc informacji na początek:
Link: http://gothic-online.com.pl/forum/showthread.php?tid=9
W CHWILI GDY PISZĘ TEN PORADNIK, G2O jest w wersji 0.1b dev 6. Jeśli w tej wersji macie serwer, to pobierzcie File loader jeszcze raz i podmieńcie go w /modules, ponieważ wyszła nowa wersja.
Moduł dodajemy oczywiście w GO_Config.xml.
Nazwy dostepnych funkcji sa w zasadzie oczywiste. Jeśli ktoś chciałby dowiedzieć się trochę więcej samemu, polecam zapoznać się na przykład z funkcją fopen() i podobnymi w PHP.
Jesli ktoś jeszcze nie wie, Fileloader pozwala na TWORZENIE, USUWANIE i EDYCJĘ plików. W zasadzie w dowolnym formacie ("w zasadzie", bo raczej nie stworzycie obrazka w .png, chociaż możecie takiego formatu użyć).

Na początek zróbcie komendę /loguj, która pobierze słowo wpisane po tej komendzie. Odwołajcie się do funkcji CMD_LOGUJ() i wyślijcie wpisane słowo do funkcji rejestracja() na SERWER. Zmienną wpisanego słowa będzie haslo.
Teraz utworzymy plik, który będzie odpowiadał nickowi gracza.
Jeśli używacie mózgów ucząc się ze mną wiecie, że musimy pobrać jeszcze ID Big Grin
Sam plik stworzymy przez
fileOpen("nazwa pliku", "instrukcja otwarcia")
Nazwałem to po swojemu Big Grin nazwa pliku, to nazwa pliku, tutaj będzie wstawiony nick gracza. Wasza sprawa, czy dacie .txt, .doc czy nic nie dacie.
Instrukcja otwarcia. Tego musicie się nauczyć sami. Ponownie polecam poczytać o fopen().
Gdy chcecie stworzyć plik jeśli nie istnieje, a jeśli istnieje to chcemy go otworzyć, to musicie użyć instrukcji W. Jeśli chcemy go edytować, musimy użyć + (razem z W czy inną literką). Jeśli nie ma plusa, plik jest otwarty "tylko do odczytu". My będziemy go edytowali, czyli użyjemy w z +.

WAŻNE! W usuwa nam wszystkie dane z pliku przy otwarciu. Wydaje to się głupie, a jest zazwyczaj niezbędne. Obsługa plików w Squirrelu, PHP i innych, chociaż dość łatwa, jest sztuczna i mało intuicyjna. Jeśli będziemy np. zapisywali czyjś wygląd. Gracz za pierwszym razem go ustawi, utworzy się plik z jego nickiem. Później będzie chciał go zmienić, więc przy zapisie musimy wywalić stary wygląd i wrzucić nowy. Przy odczytywaniu zaś, nie możemy niczego wskazać. Nie ma żądnych zmiennych ani...nic. Musimy pobierać dane "po linijce" przez fileRead po kilka razy. Sami zobaczycie.

Po otwarciu pliku, jak w przykładzie, piszemy if(file). Co to konkretnie oznacza. Przecież to nie jest żadna konkretna deklaracja prawda? Chodzi po prostu o to, jeśli to coś w nawiasie wykona się. Czy jeśli ten plik jest, albo się utworzył. W innych przypadkach możemy tu wpisać na przykład nazwę funkcji.
Później mamy fileWrite. Podajemy nazwę pliku i tekst, albo zmienną którą chcemy wpisać do pliku.
Bardzo ważne jest fileClose! Nie możemy zostawić otwartego pliku gdzieś w jakimś buforze. Musimy go zamykać. Może nie wywali nam jakiś błąd, ale to sprawa optymalizacji kodu.

Quote:Wskazówka: Jeśli używacie kilku warunków (if,else if, else if) wstawcie fileClose po nich wszystkich. Wtedy, nie ważne który się wykona i tak skrypt pójdzie dalej (zazwyczaj, sami to ocenicie) i wykona fileClose




Code:
function rejestracja(pid,haslo)
{
local file = fileOpen(getPlayerName(pid), "w+");
if(file)
{
fileWrite(file,haslo);
}
fileClose(file);
};


No i wszystko. Sprawdźcie teraz kod w praktyce.


Na jeden temat wystarczy. Dalsze sposoby na wykorzystanie Fille Loadera, łącznie z odczytaniem naszego hasła, podam w kolejnej części.
Nie będzie mnie do sierpnia, jestem w Szkocji i zarabiam na studia. Do zobaczenia.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [PL]1.Skryptuj z Danielem - DeatchMatch Ignisio 11 9,284 15.03.2016, 21:49
Last Post: Bimbol
  [PL]2.Ucz się z Danielem - wyświetlanie i odliczanie. Ignisio 12 9,594 31.01.2016, 13:26
Last Post: Son Goku
  [PL]1. Ucz się z Danielem - pierwsze zmiany w skryptach serwera. Ignisio 4 6,840 21.01.2016, 15:58
Last Post: Ignisio
  [PL]1.Ucz się z Danielem - pierwsze zmiany w skryptach serwera. 2 Ignisio 5 4,812 19.01.2016, 20:48
Last Post: Quarchodron

Forum Jump:


Users browsing this thread: 1 Guest(s)