poniedziałek, 23 lutego 2009

Finditem, czyli szukanie przedmiotów

Dzisiaj chciałem opisać polecenie finditem oraz wszystkie związane z tym zmienne. Postaram się dość szczegółowo omówić zagadnienie, gdyż jest to chyba jedno z najważniejszych zagadnień.

Składania brzmi:
findItem {{id} | {type} | *} [index] [[G] | [G_{dist}] | [C] | [C_{container id}]]

może teraz po kolei wytłumaczę co i jak bo domyślam się czytelniku, że patrząc na to, zastanawiasz się o co tutaj w ogóle chodzi.


Zacznijmy od tego co robi samo finditem.
Finditem szuka przedmioty. Jakie przedmioty? Takie i w takich miejscach jakie podamy jako parametry, czyli to co jest po słówku finditem.

Pierwsze musimy podać jedną z 3 rzeczy:

id - jest to id przedmiotu, unikalna dla każdej rzeczy w Ultimie. Jeżeli nie wiesz jak sprawdzić id przedmiotu już spieszę z pomocą. Klikamy 2 razy na dany przedmiot, a następnie w easyUO po prawej stronie, w zakładce Last Action szukamy zmiennej #lobjectid. Tam właśnie znajduje się id przedmiotu, który "użyliśmy" ostatnio.

typ - są to 2-3 litery które określają typ przedmiotu. Typ przedmiotu sprawdzamy tak samo jak id, jednak patrzymy na zmienną #lobjecttype. Dla przykładu na MW, serwerze na którym ja gram bandaże mają typ ZLF.

* - gwiazdka wyszukuje wszystkie przedmioty. Po prostu szuka wszystkiego.

Kolejnymi argumentami są argumenty, które określają gdzie chcemy szukać danych przedmiotów. Do wyboru mamy 2 różne rzeczy.

C - czyli container. Przedmioty będą szukany tylko i wyłącznie w plecakach, pojemnikach oraz w naszym paperdolu (jedynie w tych, które są aktualnie otwarte)
Dodatkowo możemy dokładnie określić w jakim pojemniku chcemy szukać. Wygląda to wtedy tak:
finditem * C_idpojemnika
lub
finditem * C_ , %zmienna
gdzie zmienna przechowuje id pojemnika. Ta druga składnia jest dość często stosowana. W tym przypadku, który widzimy wyżej, będą wyszukiwane wszystkie przedmioty z plecaka o podanym idpojemnika.

Przykładowo:
finditem * C_ , #backpackid
szuka wszystkich przedmiotów w naszym plecaku głównym.

G - druga opcja czyli ground. Ground czyli ziemia. Wyszukiwane są wszystkie przedmioty leżące na ziemi. Ale również i postacie i NPC. Dodatkowo możemy określić zasięg w jakim chcemy szukać przedmiotów poprzez podanie liczby po _ tak jak w przypadku wyżej.
Przykład:
finditem * G_5
szuka wszystkich przedmiotów, które znajdują się w promieniu 5 od naszej postaci.

Dodatkowo:
Z tego co wyczytałem w dokumentacji, można używać jeszcze 2 opcji, nie tylko C i G.
Są to:
A - szuka ukrytych przedmiotów. Ale są to przedmioty ukryte przez komendę hideitem
CA_pojemnik - szuka ukrytych przedmiotów w pojemniku. Tak jak w przypadku samego C, można podać id pojemnika.


Zmienne find item
Teraz koniecznie trzeba powiedzieć, gdzie znajdziemy informacje o tym co finditem znalazł, w końcu o to dokładnie nam chodzi.
Wszystkie te zmienne znajdują się w zakładce find item.
Postaram się teraz po kolei omówić każdą z tych zmiennych.

#FINDID - jest to ID znalezionego przedmiotu. Jest unikalne i niepowtarzalne dla danego przedmiotu.

#FINDTYPE - jest to typ przedmiotu, który został znaleziony. Określa grupę obiektów o tych samych właściwościach, czasami tylko grafice. Np butle nie maja rozróżnienia na duże i małe. Do ich odróżniania trzeba już używać property.

#FINDX, #FINDY, #FINDZ - są to 3 zmienne, które określają położenie przedmiotu.

#FINDDIST - określa odległość w jakiej znajdujemy się od przedmiotu

#FINDKIND - w zmiennej tej znajduje się gdzie znajduje się obiekt. Przyjmuje on 3 wartości.
0 - gdy obiekt znajduje się w pojemniku
1 - gdy obiekt znajduje się na ziemi
-1 - gdy obiekt nie został znaleziony
Z tego co można wyczytać w dokumentacji, nie jest zalecane sprawdzanie czy został znaleziony przedmiot przez sprawdanie if #findkind = -1 (aczkolwiek ja osobiscie spotykam sie najczęsciej z takim przypadkiem sprawdzania czy został znaleziony przedmiot). Tłumaczą to tym, że dla człowieka ciężej zrozumieć o co chodzi. Bardziej zalecane jest sprawdzanie zmiennej #findcnt

#FINDSTACK - zmienna ta przechowuje ile jednostek znajduje się w kupce. Jeżeli mamy przedmioty które sie grupują (stackują) to wtedy zmienna ta mówi nam ile jest rzeczy w danej kupce. Np: złoto, zioła. W przeciwnym wypadku jak łatwo sie domyslić zmienna ta ma wartość 1.

#FINDBAGID - zmienna ta przechowuje ID pojemnika, w którym znaleziony został przedmiot.

#FINDMOD - przechowuje X i Y znalezionego przedmiotu w formie: X_Y. Szczerze nigdy nie używałem.

#FINDREP - zwraca reputacje. Jeżeli szukamy osoby, NPCa to wtedy zmienna ta przechowuje reputacje, czyli jedną z 7 wartości:
1 - Niewinny (Niebieski)
2 - Przyjaciel (Zielony)
3 - Zwierzęta (Szary)
4 - Kryminalista (Szary)
5 - Wróg (Pomarańczowy)
6 - Morderca (Czerwony)
7 - Invulnerable (nietykalny) (żółty)

#FINDCOL - zwraca kolor znalezionego przedmiotu. Warto zobaczyć to na systemie rudy, gdy mamy takie samo #FINDTYPE. Różne rudy róznią się właśnie kolorem.

#FINDINDEX - jest to index znalezionego przedmiotu. Jeżeli szukamy przedmiotów po np typie, możemy znaleźć ich więcej niż tylko jedną. Zmieniając wartość tej zmiennej, możemy dostać się do informacji o kolejnych przedmiotach. Może mieć wartości od 0 do #findcnt

Przyklad:

Finditem *
for %i 1 #findcnt
{
event sysmessage Znalazlem przedmiot o id: #findid
wait 5
}

#FINDCNT - zmienna ta przechowuje ile przedmiotów zostało znalezionych. Jeżeli nie zostało nic znalezione to mamy wartość 0.


W sumie tyle na dziś. Dla ciekawskich chciałbym dać jeszcze tylko jeden przykład, dość żartobliwy. Można dać swoim kolegom.

finditem *
for %i 1 #findcnt
{
hideitem #findid
}

sami domyślcie się lub sprawdzcie co ten skrypt robi.

W przypadku jakichkolwiek niejasności proszę o pytania w komentarzach

poniedziałek, 16 lutego 2009

Last action, last object

Dziś pomówimy już trochę na temat sterowania postacią, czyli wykonywania przez nią jakiś czynności. W końcu o to chodzi w całym easyUO.

Last object
czyli wykonanie użycie ostatnio używanego przedmiotu. W easyUO realizowane jest to przez komendę event macro 17. Co robi ona dokładnie? Dokładnie bierze wartość #lobjectid ze zmiennych systemowych a następnie symuluje podwójne kliknięcie (czyli użycie) na dany przedmiot.

Last target
czyli wskazanie ostatnio wskazywanego przedmiotu.
Komenda: event macro 22
Opis: Dokładnie pobierana jest wartość ze zmiennej #ltargetid a następnie jest wybierany przedmiot o takim ID. Jeżeli nie można wybrać przedmiotu o takim ID, dość często dochodzi do zawieszenia klienta.
Oczywiście, aby wszystko dobrze działało poprawnie, powinniśmy mieć w kliencie celownik.

Do czekania na celownik można wykorzystać 2 sposoby:
Komenda target czas
Opis: komenda ta czeka określoną ilość czasu. Jeżeli kursor jest celownikiem to przechodzi dalej, w przeciwnym wypadku, gdy po upłynięciu czasu celownik się nie pojawi również przechodzi dalej.
Ja osobiście stosuję tę komendę bardzo często, ale tylko wtedy gdy mam pewność, że celownik się pojawi i w czasie czekania na celownik nie potrzebuję sprawdzać innych warunków.

Sposób drugi to pętla z warunkiem sprawdzającym zmienną #TARGCURS. Jeżeli zmienna ta ustawiona jest na wartość 1, wtedy kursor jest celownikiem.
Przykład:
repeat
{
...
tutaj można sprawdzać jakieś warunki
}
until #TARGCURS = 1

Pragę oczywiście powiedzieć, że zmienne #LTARGETID oraz #LOBJECTID można ustawiać komenda set.

piątek, 13 lutego 2009

Debugowanie oraz pare komend

Tak jak pisałem i obiecałem w poprzedniej lekcji chciałbym dziś przybliżyć problem debugowania czyli szukania błędów. Sposobów jest kilka a sam program easyUO, który interpretuje nasze skrypty ma bardzo przydatne do tego narzędzie. Nazywają się "step over", "step into" oraz "step out". Jak można domyślić się po nazwach wykonują nasze skrypty linijka po linijce w takiej szybkości i tak jak chcemy. Wszystkie je można znaleźć w zakładce control na górze.

Step over (f8)
Czyli wykonanie kolejnej linii. Wciskając f8 klient wykonuje kolejna linijkę po czym zatrzymuje skrypt. My w tym czasie możemy spokojnie zobaczyć efekty, co się stało, oraz gdzie znajdujemy się w tym momencie. Trzeba tutaj powiedzieć coś na temat subów. Czyli wydzielonych bloków w kodzie programu do których można skoczyć czy nawet przekazać im parametry. Step over nie pokazuje co dokładnie dzieje się w takich subach. Jeżeli natrafi na linijkę gosub xxx to wykona całość zawartości suba i przejdzie do kolejnej linijki. To w sumie odróżnia step over od step into

Step into (f7)
Tak jak pisałem wyżej, ta komenda również wykonuje skrypt linijka po linijce, jednak jeżeli natrafia na fragment dotyczący suba, to skacze do miejsca w kodzie, gdzie on się znajduje i możemy dokładnie widzieć co dzieje się w danej chwili w subie do którego skoczyliśmy. O subach, które są odpowiednikami funkcji z innych języków programowania opowiem później, gdyż warto jednak omówić to szerzej.

Step out (f6)
Na samym początku myślałem, że działa to nieco inaczej, lecz jak się przekonałem myliłem się. A dokładnie step over powoduje wyjście z suba. Czyli, jeżeli używaliśmy step into przy naszym szukaniu błędów, to gdy znajdujemy się w jakimś subie, step over wykonuje go do końca i wychodzi, tak iż w następnym kroku jesteśmy już poza subem

Polecam bardzo przetestowanie samemu jak dokładnie działają te 3 proste rzeczy w praktyce. Zamieszczam poniżej bardzo prosty skrypt, na którym dobrze widać czym różnią sie od siebie te 3 funkcjonalności.

start:
wait 1
event sysmessage b
wait 1
gosub a
wait 1
goto start

sub a
event sysmessage a
wait 1
return


Na temat debugowania słów kilka
Chciałem jeszcze napisać jak ja szukam błędów w moich skryptach. Zazwyczaj umieszczam w ważnych miejscach linijkę event sysmessage 1 lub inny numer. Bardzo przydatne to jest gdy chcemy sprawdzać szybkość reakcji skryptu (chociaż tutaj można zastosować lesze techniki związane z czasem) oraz czy dany skrypt wchodzi do jakiejś pętli lub spełniony jest jakiś warunek. Myślę, że sam podczas pisania skryptów, oraz szukania w nich błędu znajdziesz jak Tobie najlepiej się ich szuka. Jednak step over lub step into są chyba najlepszą metodą, ponieważ możemy śledzić powoli linijka po linijce w trakcie wykonywania pliku kod i widzimy na bierząco co się dzieje. Gorąco polecam zaznajomienie się z tym tematem w praktyce.

Parę innych przydatnych komend
Zanim przejdę do konkretnych komend, które sprawiają, że nasze postacie zaczynają robić coś w Ultimie, chcę jeszcze przedstawić komendy, które służą do zarządzania wykonywaniem skryptu.

exit - komenda ta użyta w skrypcie powoduje zakończenie wykonywania skryptu.
halt - dokładnie to samo co exit. Nie wiem dlaczego są 2 komendy do tego samego

call - powoduje wykonanie skryptu w podanej lokalizacji
dokładnie składnia wygląda:
call plik parametry
Jak można przeczytać w dokumentacji plik musi być podany w formacie C:\MyDocu~\blabla.txt a nie C:\My Documents\blabla.txt
Można również przekazywać parametry (tak jak w gosub)

pasue - powoduje zatrzymanie skryptu. Jeżeli damy po tej komendzie play to zacznie ona od miejsca w którym skończyło się wykonywanie.

tym sposobem omówiłem wszystkie komendy (oprócz subów, czyli sub oraz gosub), które zaliczane są do grupy komend zwanej "Flow Control". Nie wiem jak dobrze przetłumaczyć na język polski tą frazę, gdyż przepływ kontroli ani kontrola przepływu jakoś do mnie nie przemawiają.

Jeżeli chcesz, możesz poczytać w dokumentacji angielskiej. Z tego co własnie patrze, niestety dokumentacja Polska nie obejmuje tego fragmentu.

I jeszcze raz zachęcam wszystkich czytających tego bloga do pisania komentarzy oraz pytania, gdy coś jest niezrozumiałe.

środa, 11 lutego 2009

Dokumentacja po polsku

Spieszę z wiadomością, że jeden z czytelników znalazł część przetłumaczonej na język polski dokumentacji z easyUO. Możecie ją znaleźć pod adresem http://euo.wikidot.com/category:dokumentacja

Pętle

dziś coś na temat pętli czyli chyba jednych z najbardziej użytecznych instrukcji jakie są w programowaniu. Czym są pętle? Są to instrukcje, które pozwalają nam wykonać jakaś instrukcję lub blok instrukcji pewną ilość razy przy pisaniu nie wielkiej ilości kodu.
W easyUO mamy 3 rodzaje pętli z czego praktycznie każdą można zastosować do każdego rozwiązania. Jednak niektóre są lepsze dla danych zastosowań.

Pętla for
Podobno najczęściej używana pętla w programowaniu, ale raczej nie w easyUO, ja sam nie spotkałem się zbyt często z jej użyciem. Nadaje się świetnie do wykonania czegoś parę razy, gdy wiemy wcześniej ile razy chcemy to wykonać.
Składnia:
for %i %start %end
{
instrukcje
}

I już spieszę z wyjaśnieniem co się tutaj dzieje.
for jest słówkiem kluczowym, zmienna %i jest tak zwanym iteratorem, czyli zmienną, która zmienia swoją wartość podczas przebiegu pętli. Na początku %i przyjmuje wartość podaną w start i po każdym przebiegu pętli (czyli wykonaniu instrukcji) jej wartość zwiększana jest o 1 aż do osiągnięcia wartości podanej w miejscu %end.
Przykład:
Jako przykład pokażę Ci również jak można zmieniać kolor tekstu.
for %i 1 20
{
set #SYSMSGCOL %i
event sysmessage Kolor: %i
}
halt


Pętla while
Pętla ta jest o wiele częściej stosowana podczas pisania skryptów. Wykonywana jest dopóki warunek przy słówku while jest prawdziwy. Jednak w przeciwieństwie do pętli for nie mamy tutaj żadnego iteratora. Przykład będzie taki sam jak przy pętli for
Składnia:
while warunek
{
instrukcje
}

Przykład:
set %i 1
while %i <= 20 {
set #SYSMSGCOL %i
event sysmessage Kolor: %i
set %i %i + 1
}

i może drugi przykład, taki bardziej życiowy i bardziej przydatny:
while #hits = #maxhist
{
}
gosub leczenie



Pętla repeat ... until
I to właśnie najczęściej stosowanai spotykana pętla w skryptach easyUO. Przrywana jest, jeśli warunek przy słówku until jest PRAWDZIWY. Warto zaznaczyć w tym miejscu, że pętla ta wykona się przynajmniej raz, gdyż warunek sprawdzany jest dopiero po wykonaniu instrukcji zawartych w pętli
Składnia:
repeat
{
instrukcje
}
until warunek

Przykład:
set %i 1
repeat
{
set #SYSMSGCOL %i
event sysmessage Kolor: %i
set %i %i + 1
}
until %i > 20

I przykład bardziej z życia
set %time %scnt + 10
repeat
{
if #sysmsg = Przestalas_sie_leczyc.
break
}
until %time > #scnt || #hits = #maxhits

Słówko break i continue
Przy okazji omawiania pętli warto wspomnieć w słówkach break oraz continue.
Słówko break powoduje natychmiastowe wyjście z pętli.
Przykład:
for %i 1 10
{
event sysmessage %i
if %i = 3
break
}

jeżeli wszystko co omawialiśmy do tej pory rozumiesz, to pętla powinna wykonać się 5 razy. Czyli na ekranie powinniśmy zobaczyć
1
2
3

gdyż przy wykonaniu 3 pętli warunek w if jest spełniony i następuje natrafienie na instrukcję break, czyli wyjście z pętli

Co do słówka continue, powoduje ona przerwanie danej iteracji i skoczenie do następnej. Czyli pomijamy to co jest po continue i zaczynamy kolejny przebieg pętli

Przykład:
for %i 1 20
{
if %i % 3 <> 0
continue
event sysmessage %i
}
mam nadzieję, że wiesz już co otrzymamy jako wynik wykonania takiej instrukcji.
Są to oczywiście liczby
3 6 9 12 15 18

Prześledźmy dokładnie co się dzieje w bloku instrukcji pętli
jeżeli reszta z dzielenia %i przez 3 jest różna od 0 to przechodzimy do kolejnej iteracji (czyli przechodzimy na początek pętli zwiększając %i o jeden)
jeżeli %i % 3 jest równe 0 to zostanie wyświetlona liczba wartość %i

Podsumowanie
Jako podsumowanie chcę napisać drogi czytelniku żebyś dobrze się nauczył pętli oraz wiedział co dzieje się w ich wnętrzu. Powód. Nie znam człowieka piszącego skrypty czy programy, który nie napisał jeszcze nigdy nie kończącej się pętli. Nic trudnego, na prawdę. Pokażę przykład jak można się zastanawiać "DLACZEGO TO #$%@#$ NIE DZIAŁA":
set %i 1
while %i <> 5
{
if %i % 3 = 0
continue
set %i %i + 1
}
dlaczego ta pętla będzie wykonywała się w nieskończoność. No sam spójrz. Gdy %i osiągnie wartość 3 wtedy przejdziemy na początek pętli, ale w pętli while %i nie zwiększa się automatycznie, czyli dalej będzie miało wartość 3. I tak aż się nie zdenerwujemy i nie wyłączymy tego skryptu.

Zapewne zastanawiasz się jak mam sprawdzać co dzieje się w skrypcie. Postaram się napisać o tym w następnej lekcji czyli jak debugować (szukać błędów) skrypty.

niedziela, 8 lutego 2009

instrukcje warunkowe oraz operatory

Instrukcje warunkowe
W easyUO występuje tylko jeden typ instrukcji warunkowych. Jest to blok if(){} else {}
Już spieszę wytłumaczyć czym są i dlaczego są takie ważne te instrukcje warunkowe. A mianowicie służą one do podejmowania decyzji przez skrypt na podstawie pewnych warunków co powinien wykonać. Przykład z "życia": skrypt na łowienie ryb, jeżeli skończyły się ryby, to trzeba zmienić miejsce. Przejdźmy do konkretu. Blok if() wygląda tak:
if warunek
{
...
instrukcje
}

proste, prawda?
Jeżeli warunek jest spełniony, to skrypt wykona instrukcje zawartą w nawiasach klamrowych. Można również pominąć nawiasy klamrowe. W takim przypadku zostanie wykonana tylko instrukcja, która znajduje się w następnej linii. Przykład
if %sila = 10
event sysmessage Ale masz malo sily!

Istnieje również instrukcja else czyli rozwiniecie zwykłego if'a. Wygląda to tak:
if warunek
{
instrukcje1
}
else
{
instrukcje2
}
Co się stanie w takim przypadku? Mam nadzieje ze już potrafisz się domyślić.
Jeżeli warunek jest spełniony to wykonana zostanie instukcja1, ale nie zostanie wykonana instrukcja2. W przypadku gdy warunek nie jest spełniony, zostaje wykonana tylko instrukcja2 a nie instrukcja1. Mam nadzieję, że jest to zrozumiałe. Teraz nauczymy się tworzyć warunki, czyli coś o operatorach.
Ah, no i oczywiście jeżeli ktoś chce więcej na temat instrukcji warunkowej if - else to odsyłam do dokumentacji.

Operatory
W easyUO jak w większości (o ile nie wszystkich) języków programowania mamy operatory: arytmetyczne, porównania oraz logiczne. Dodatkowo jest jeszcze operator konketenacji, kontynuacji linii i tablicowy (tutaj niestety twórcy języka się nie popisali tworząc tablice)

Operatory arytmetyczne
Czyli operatory znane wszystkim z matematyki oraz jeden zapewne nie znany.
%a + %b Dodawanie - Wynikiem jest dodawanie 2 liczb
%a - %b Odejmowanie - Wynikiem jest różnica wartości zmiennej a i b
%a * %b Mnożenie - Wynikiem jest mnożenie 2 liczb
%a / %b Dzielenie - Wynikiem jest wynik z dzielenia liczby a przez b. Warto tutaj powiedzieć, że dzielenie jest tylko całkowitoliczbowe. Co to znaczy? Że nie mamy liczb po przecinku jeżeli %a równa się 1 a %b równa się 2 to wynik będzie 0. Normalnie mamy 0.5 jednak w easyUO część ułamkowa jest odrzucana. Dlaczego tak jest? Ponieważ w easyUO nie ma typu zmiennoprzecinkowego, wszystko jest typu całkowitego. Jeżeli Cię to bardzo ciekawi, polecam lekturę reprezentacji liczb w systemach komputerowych.
%a % %b Dzielenie modulo - Wynikiem jest reszta z dzielenia liczby %a przez %b. Jak to rozumieć? Może przykład 7 % 2 wynosi 1. Bo 7/2=3 i 1 reszty.
sprawdz sam siebie wykonując te zadania:
13 % 3
15 % 5
-1 % 2

wyniki to: 1 , 0 , -1
ABS %b Wartość bezwzględna - Wynikiem jest liczba dodatnia. Jeżeli liczba jest mniejsza od zera to zwracana jest jej wartość dodatnia. Np: ABS -5 wynosi 5


Operatory porównania
Bardzo przydatne właśnie w instrukcjach warunkowych. Zwracają prawdę, lub fałsz.

%a = %b Porównanie - prawda jeśli wartości są równe
%a <> %b Różne - prawda jeśli wartości są różne
%a < %b Mniejszość - prawda jeśli %a mniejsze od %b
%a > %b Większość -prawda jeśli %a większe od %b
%a <= %b Mniejszość lub równość - prawda jeśli %a mniejsze lub równe od %b
%a => %b Większość lub równość - prawda jeśli %a większe lub równe od %b%a in %b Zawieranie - prawda jeśli wartość %a zawiera się w wartości %b (głównie w łańcuchach znakowych np: if Zywioł in #journal )
%a notIn %b Nie zawieranie - przeciwność in. Czyli prawda jeżeli się nie zawiera


Operatory logiczne
Służą do łączenia warunków w instrukcjach warunkowych

%a && %b koniunkcja (i)- prawda jeśli obie wartości są równe
%a|| %b alternatywa (lub) - prawda kiedy przynajmniej jedna jest równa
! %a Negacja (nie) - prawda jeśli %a jest fałszem


Operatory różne
event sysmessage to jest
+ jedna
+ linia

czyli operator kontynuacji linii

%a , %b konkatenacja czyli dołączenie wartości do łańcucha znaków. Przykład:
set %a A
set %b B
set %c %a , %b
event sysmessage %c
w wyniku zobaczymy na ekranie AB. Mam nadzieje, że operator ten jest jasny. Jeżeli zrobilibyśmy
event sysmessage %a %b
to w wyniku otrzymamy AB, dlatego stosuje się konkatenację.

%a . %btablice szczerze powiedziawszy jest to temat na osoby artykulik bądź lekcję. Ja sam miałem na początku problemy ze zrozumieniem tego operatora, ale przedstawię przykład. Jeśli ktoś zrozumie to bardzo dobrze.

set %a tablica
set %b 1
set %tablica1 tekst
set %test %a . %b

tak właśnie wygląda i tak się stosuje operator tablicowy. Jak to działa? Zwracana jest wartość, która znajduje się w zmiennej, której nazwa jest sklejeniem 2 wartości ze zmiennych %a i %b
W naszym przypadku %a . %b zwraca wartość znajdującą się w zmiennej %tablica1.
Wg mnie bardziej nie dało się skomplikować tak prostego pojęcia jak tablice. Ale tak jak pisałem to temat na osobną lekcję.


Chciałbym wszystkich czytających zachęcić do pisania komentarzy, piszcie co wam się podoba, co się nie podoba. Czy mieliście lub macie jakieś wątpliwości lub problemy z daną lekcją. Jeżeli problemy są inne proszę o kontakt simet[at]poczta.fm

sobota, 7 lutego 2009

Zmienne

Podstawa
czym są zmienne?
W EasyUO mamy zmienne, jak w każdym języku programowania. Czym są zmienne? To są elementy, którym możemy przypisać jakąś wartość.
Wyróżniamy 4 różne typy zmiennych: standardowe, namespace, systemowe oraz globalne (Persistent) ja omówię jedynie 3 z nich.

Zmienne standardowe
Zmienne standardowe zaczynają się od znaku % a następnie występuje nazwa zmiennej. (np. %zmienna). Wielkość liter ma znaczenie, więc zmienne %cos i %COS to dwie różne zmienne

Zmienne systemowe
Zmienne systemowe to wszystkie zmienne, które przechowują dane z klienta Ultimy. Rozpoczynają się od znaku # a następnie nazwa zmiennej. (np. #CHARNAME).
Wszystkie zmienne oraz ich wartości możemy zobaczyć w oknie EasyUO po prawej stronie, pogrupowane w zakładkach. Jeżeli chcesz dowiedzieć się, która zmienna za co odpowiada zachęcam do odwiedzenia dokumentacji. lub odwiedzania mojego tutoriala.

Zmienne globalne
Zmienne globalne, to takie zmienne, które mają tą samą wartość pomiędzy różnymi skryptami. Dzięki nim możemy stworzyć komunikację między dwoma różnymi skryptami. Zaczynają się one od znaku * a następnie nazwa. Ja np bardzo często używam w swoich skryptach zmiennej *_STOP. Może zastanawiasz się dlaczego na początku jest podkreślenie. To jest moje przyzwyczajenie, do wyróżniania zmiennych, które mają bardzo duży zasięg.


Ustawianie wartości zmiennej
Do ustawiania wartości zmiennej służy komenda set. Przykłady:
set %minimalna_sila 60 ;ustawia zmienną %minimalna_sila na wartosc 60
set %tekst Witaj! ;ustawia zmienną tekst na Witaj!
set #targcurs 1 ;ustawia zmienna systemową targcurs na 1 (powoduje pojawienie się celownika)
Proste prawda.

Komentarze
W easyUO występują również komentarze. Zaczynają się one znakiem ; (średnik) a po nich następuje komentarz. (jak widać, klient EasyUO powoduje, że tekst komentarza jest jasno szary)
Taka część tekstu nie jest wykonywana. Służy ona programiście do robienia notatek i opisywania co bardziej zwiłych kawałków kodu. Polecam używać :)

Hello world!
Jak zawsze na końcu pierwszej lekcji pisze się prosty program wypisujący coś na ekran. A więc proszę bardzo, nawet bardziej rozbudowany:

wersja 1:
event sysmessage Hello World!

wersja 2:
set %test Hello World!
event sysmessage %test
To tyle jak na pierwszą lekcję. Chętnie usłyszę komentarze oraz informacje na temat kursu.

piątek, 6 lutego 2009

Start

Z racji, że wiele osób pyta mnie o skryptowanie w EasyUO chciałem zacząć pisać tego bloga, tworząc jednocześnie tutorial.

EasyUO jest prostym programem do pisania skryptów, makr dla Ultimy Online.

Potrzebować będziemy: EasyUO, dokumentacja EasyUO, Ultima Online duża dawka zapału i cierpliwości :)

Dokumentacja pod linkiem: http://wiki.easyuo.com/