Thread Rating:
  • 1 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PL]1. Ucz się z Danielem - pierwsze zmiany w skryptach serwera.
#1
Quote:Ta seria poradników będzie wyjątkowa - nie tylko dla tego, że jest pierwsza. Tym razem naprawdę będziecie uczyli się razem ze mną. To tak, jak gdybym ja poświęcił więcej czasu na próby, czytanie innych poradników czy wiki, a wy tylko poszli tą czystą drogą nauki. Nawet jeśli jesteście leniami, ja to za was nadrobię :Smile Ale ale. Jeśli macie zamiar przeczytać poradnik, przepisać ten sam skrypt, przejść do kolejnego i znów przepisać ten sam skrypt, to w zasadzie możemy się już pożegnać. Choćby ten poradnik napisał sam Bimbol czy inny Steve Jobs, nie nauczysz się zbyt wiele. Po takim poradniku musisz kombinować dalej, choćby tylko zmienić pozycję tekstury której wstawianie opisałem w poradniku, czy płeć bota, którego razem wstawimy. Jeśli masz już pliki serwera, odrobinę zapału i chęci, oraz jakikolwiek pomysł - zapraszam dalej.
Nie będę tutaj rozwodził się nad pętlami, ifami i innymi takimi. To nie to miejsce.

Używana wersja serwera: G2O Windows x32 Server




0. Wiki oraz pliki Serwerowe.
Na początku naszym przyjacielem i kierunkowskazem będzie Gothic Online Wiki . To tam znajdują się najważniejsze funkcje, których będziemy używali do opisu wszelkich zdarzeń.
Nie radzę jej jednak używać na ślepo. Jeśli użyjemy na przykład funkcji EnableGameNpcs() (Włączenie NPC z Singla), to możemy się zdziwić, bo nie da to żadnego efektu. Dlatego każdą nową funkcję sprawdzajmy od razu po wpisaniu.
Absolutnie niezawodnym i najlepszym sposobem nauki jest przeglądanie plików które sami pobraliśmy razem z serwerem, które znajdują się w folderach client-scripts oraz server-scripts. Do ich przeglądania, edytowania, oraz pisania własnych polecam program Notepad++.
Od razu widzimy, że te pliki są naprawdę przejrzyste. Mamy tutaj bloki oddzielone klamrami, każda ma swoją "nazwę" i zestaw "instrukcji". Szkoda tylko, że te nazwy i instrukcję nie do końca rozumiemy. Nie do końca, bo przecież to wszystko jest po angielsku i raczej nie problem domyśleć się, co robi funkcja exitGame().
No dobrze, mamy te kilka plików, ale spójrzmy tutaj:
http://gothic-online.com.pl/forum/showth...hp?tid=327
Sative napisał skrypt klikalnego menu animacji w jakimś innym pliku. Co teraz? Teraz wchodzimy w plik GO_Config.xml  znajdujący sie w głównym folderze i dopisujemy jego nazwę, zgodnie z podanym tam wzorem.

Quote:Błędem, który popełniłem na początku, było otworzenie losowego pliku i wpisanie tam przykładu użycia funkcji z GO-wiki. Rozdzielenie plików na 2 foldery (Server/Client) oraz utworzenie dla nich osobnych działów na wiki ma swój powód. Funkcji serwera używamy tylko w folderze server-scripts, a funkcji klienta tylko w folderze client_scripts.




1. Pierwsze zadanie - pasek na dole ekranu, jak w grach MMO.
A co się będziemy rozdrabniać :Big Grin Pierwsze co postanowiłem zrobić, to taki właśnie pasek. O co mi chodzi? O to.
[Image: 2647826800_1452946607.jpg]
Tylko, żeby to było jasne. Nie, nie będziemy mieli od razu wyświetlania rodzaju broni czy magii w odpowiednich slotach, albo wybierania broni myszką. To jest początek i to ma tylko wyglądać jak taki pasek. Mi z moim wątpliwym talentem graficznym wyszło to tak:
[Image: 4705036800_1452900105.jpg]

No dobrze, czyli przedstawmy co chcemy osiągnąć.
- Tworzymy teksturę dolnego panelu i wstawiamy ją do Gothica.
- Ustawiamy ją tam gdzie chcemy.
- Umieszczamy na niej paski życia/many.
Jeszcze jedno pytanie, czy będziemy aktywowali ten pasek przy wejściu do gry, po kliknięciu klawisza, a może przy wpisaniu komendy? To dobre miejsce, na omówienie tych trzech możliwości.
  • Aktywowanie danej funkcji przy starcie gry, jak możecie zobaczyć w wielu przykładach na wiki, polega na wpisaniu do któregoś pliku:
Code:
function onInit()
{    
   naszaFunkcja()
}

  • Żeby poznać, jak aktywować coś po wpisaniu komendy, zajrzymy do głównego pliku znajdującego się w client-scripts: main.nut. Chodzi mi konkretnie o ten fragment:
Code:
addEvent("onCommand", function(cmd, params)
{
    switch (cmd)
    {
        case "eq":
            local items = getEq();
            foreach (item in items)
                addMessage(255, 255, 0, item.instance + " " + item.amount + " " + item.synchronized);
            
            return 1; // Do not send to server
    
        case "time":
            local result = sscanf("dd", params);
            if (result)
            {
                addMessage(0, 255, 0,"Set time to " + result[0] + ":" + result[1]);
                setTime(result[0], result[1]);
            }
            else
                addMessage(0, 255, 0,"Type: /time hour min");
                
            return 1;
        
.
.
.           
    }
});


Mamy tu konstrukcję switch (przełącznik) case . Cały blok zaczyna się od addEvent, w którym widzimy magiczne "onCommand" które mówi samo za siebie.
A więc, wywołanie funkcji po wpisaniu komendy po / ukośniku na chacie polega, na dopisaniu w tym miejscu odpowiedniego słowa po case.
case "hpbar":
WAŻNE! Nie wpisujemy przed tym słowem ukośnika / on już tam tak jakby jest. Słowo musi być w " " cudzysłowie, a na samym końcu nie stawiamy średnika, tylko : dwukropek, co jest wstępem do instrukcji.

  • I ostatni sposób, wywołanie funkcji po kliknięciu klawisza. Nie musimy szukać daleko, przecież poniżej mamy prawie identyczny przykład.
Code:
addEvent("onKey", function(key, letter)
{
    switch (key)
    {
    case KEY_Q:
            local hp = getHealth();
            local hpall=getMaxHealth()
            setHealth(hp+hpall*0.1);
        break;
        
    case KEY_P:
            setCursorVisible(true);
            setFreeze(true);    
            local pos = getCursorPosition();
            print(pos.x+" "+pos.y);
        break;
    }
});


I co mamy po addEvent? "onKey". Prawda, że proste?
Wszystko jest tutaj tak samo, jak w przypadku komendy na czacie, poza tym, że nie wpisujemy słowa do wpisania, ale instancję klawisza. Ich lista znajduje się tutaj:
http://gothic-online.com.pl/wiki/index.p..._constants

A na końcu, zamiast return mamy break.

Wybierzcie sami. Ja osobiście wybrałem klawisz H na aktywowanie mojego "interefejsu" i tym się będę kierował.

2. Wiemy jak, nie wiemy co.
Najlepiej by było, gdyby obojętnie jaką teksturę, chociażby jakiś kwadrat każdy zrobił sobie sam, ale ponieważ to pierwsza nasza "lekcja", to na koniec poradnika wstawię ten panel (bez barów). Tutaj następuje część, przez którą ja cię nie przeprowadzę, bo poradników o podstawach podstaw modyfikacji Gothica jest milion w całym internecie w milionie języków. Chodzi tutaj o to, że taką teksturę zapisuje w formacie .tga, potem exportujemy do .tex (np. Gomanem, ale można też skompilować przez grę), później zazwyczaj dodajemy do archiwum .VDF.
Wracając do naszego planu, czyli:
Quote:- Tworzymy teksturę dolnego panelu i wstawiamy ją do Gothica.
- Ustawiamy ją tam gdzie chcemy.
- Umieszczamy na niej paski życia/many.


Teraz każdy otwiera wiki i szuka (podpowiem, że w funkcjach klienta) tworzenie tekstury.
.
.
.
.
.
.
.
.
Macie? Gdy wejdziemy do Client-side functions mamy ładne menu, przechodzimy do nagłówka "Texture" i widzimy wszystko co nam potrzebne. Konkretnie:
createTexture
Wchodzimy do naszego pliku. Jeśli chcecie, utwórzcie nowy, ja na razie piszę w main.nut i dopisuję do gotowych wzorów.
Znajduję
addEvent("onKey", function(key, letter)

I dopisuję

Code:
    case KEY_H:    
            local panel = createTexture(200, 7467, 7692, 700, "PANEL.TGA");        
            setTextureVisible(panel, true);  
Co nam to da?
local panel. To coś nowego. W większości języków skryptowych występuje stałe i zmienne, tutaj mamy taką właśnie zmienną lokalną, która w jednym słowie (tutaj: panel) "zapisuje" dane, w tym przypadku: nazwę tekstury, pozycję na ekranie, wysokość, szerokość (tak jest zresztą podane)
setTextureVisible tylko wywołuję, wyświetla tą teksturę, której wszystkie "argumenty" są zawarte w słowie "panel".

Quote:Parę uwag. Najpierw spójrzmy na to
createTexture
setTextureVisible
enableInterface
Tak. Wielkość liter ma znaczenie
Zmienna czy stała nie zawsze będzie dla nas tak łaskawa. Czasami nie wystarczy odwołać się do danego słowa, ponieważ np. w przypadku pozycji, skrypt zwraca nam tablicę. Postaram się to jeszcze w tym poradniku opisać.
Poco to true? Mamy dwie wartości logiczne true(prawda, 1) oraz false (fałsz, 0). Dzięki temu znacznikowi, w tym miejscu, umieszczając tam zmienną możemy wyłączać i włączać nasz panel. Nie podam tutaj tego, ponieważ nie jest nam to jeszcze potrzebne, ale radzę się nad tym zastanowić i pokombinować. Same poszukiwanie rozwiązań daje ogromną porcję doświadczenia.


Pierwszy myślnik mamy załatwiony. Drugi w pewnym sensie też, bo podałem już koordynaty które mi pasują, ale z podawaniem pozycji będziecie spotykali się na każdym kroku, więc muszę to opisać.

Ale ta część jest zdecydowanie zbyt długa. Nikt tego nie przeczyta. Nie długo (serio) ukaże się kolejna część poradnika.
Jak widzicie preferuję dość...lużne podejście do formy :Big Grin Do tej pory moje poradniki dotyczące modowania Gothica czy grania RP wszystkim się podobało.
Poza tym, jak pisałem, sam się jeszcze uczę. Czekam na wszelkie uwagi, wytykanie błędów, nie kłócę się jeśli ktoś mnie krytykuję tylko serio zastanawiam się nad zarzutami, więc piszcie poniżej co o tym myślicie.
Jeśli ktoś chciałby mi pomóc, zapraszam tutaj:
http://gothic-online.com.pl/forum/showth...hp?tid=389
Nie będzie mnie do sierpnia, jestem w Szkocji i zarabiam na studia. Do zobaczenia.
Reply
#2
(16.01.2016, 15:59)Ignisio Wrote: Macie? Gdy wejdziemy do Client-side functions mamy ładne menu, przechodzimy do nagłówka "Texture" i widzimy wszystko co nam potrzebne. Konkretnie:
createTexture
Wchodzimy do naszego pliku. Jeśli chcecie, utwórzcie nowy, ja na razie piszę w main.nut i dopisuję do gotowych wzorów.
Znajduję
addEvent("onKey", function(key, letter)

I dopisuję

Code:
   case KEY_H:    
           local panel = createTexture(200, 7467, 7692, 700, "PANEL.TGA");        
           setTextureVisible(panel, true);  
Co nam to da?
local panel. To coś nowego. W większości języków skryptowych występuje stałe i zmienne, tutaj mamy taką właśnie zmienną lokalną, która w jednym słowie (tutaj: panel) "zapisuje" dane, w tym przypadku: nazwę tekstury, pozycję na ekranie, wysokość, szerokość (tak jest zresztą podane)
setTextureVisible tylko wywołuję, wyświetla tą teksturę, której wszystkie "argumenty" są zawarte w słowie "panel".
Jakby co to w Squirrelu też mamy stałe Smile
Squirrel Script
  1. ZMIENNA_GLOBALNA <- "Gothic Online"; // Inaczej slot
  2. local ZMIENNA_LOKLANA = "Gothic Online";
  3. const STALA_ZMIENNA = 3.14;


Reply
#3
O właśnie. Trafiłem na spis stałych.
http://gothic-online.com.pl/wiki/index.p...=Constants
Ale nie wiedziałem jak zdefiniować własną. Przyda się.
Nie będzie mnie do sierpnia, jestem w Szkocji i zarabiam na studia. Do zobaczenia.
Reply
#4
Dziękuję za poradniki. Aktualnie zaczynam szkolenie Squirrela i zapewne przeczytam wszystkie twoje lekcje.
Reply
#5
Cieszę się, że tak szybko znalazłem odbiorcę. Pochwal się jak ci pójdzie Quest Big Grin
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
  Visual Studio Code - uruchamianie serwera i gry jednym kliknięciem marcinbar 1 2,378 17.06.2020, 14:56
Last Post: marcinbar
  [PL]1.Skryptuj z Danielem - DeatchMatch Ignisio 11 9,279 15.03.2016, 21:49
Last Post: Bimbol
  [PL]2.Skryptuj z Danielem- Role-Play. Ignisio 0 3,635 15.02.2016, 19:06
Last Post: Ignisio
  [PL]2.Ucz się z Danielem - wyświetlanie i odliczanie. Ignisio 12 9,589 31.01.2016, 13:26
Last Post: Son Goku
  [PL]1.Ucz się z Danielem - pierwsze zmiany w skryptach serwera. 2 Ignisio 5 4,807 19.01.2016, 20:48
Last Post: Quarchodron

Forum Jump:


Users browsing this thread: 1 Guest(s)