Lekce c. 2
Minule jsem rekl ze dnes zacneme uz s necim zajimavym. Jak sem rekl tak udelam.
Dnes zacneme s jednoduchym (pro nektere az moc) skriptem na mining (bude delan pro DP kde hraji), je psan pro Yoko verze 505.16. Pro zacatek si rekneme co nas skript bude delat:
1. Pouzije krumpac.
2. Kopne na misto kde stojite.
Co k tomu budeme potrebovat:
Budou nam stacit pouze dva prikazy. Pro pouziti krumpace mame na vyber z techto prikazu:
void UO.UseType(type[, color]) -pouzije predmet daneho typu (a barvy), ktery mame u sebe (na sobe).
void UO.UseObject(object) -pouzije konkretni predmet.
V nasem pripade pouzijeme ten prvni, protoze kdyz se nam krumpac rozbije budeme muset zjistovat ID noveho krumpace. UO.UseType pouzije prvni ID predmetu, u ktereho je stejny Type (a barva).
Pro druhou cast (targetnuti) pouzijeme prikaz:
void UO.WaitTargetTile("lasttile"/tilenum[, x, y, z]) - targetne bud posledni targetnutej tile (policko na mape) nebo tile number (grafika policka mapy) na pripadnych souradnicich. Vsechny parametry moho byt zadany jako integer nebo string (snad i jako hex, ale proc by to nekdo delal me nenapada).
lasttile - posledni targetnutej tile (policko mapy)
Tak ted si napiseme kostru kodu, kde jeste nebudu mit vsechny potrebne informace pro prikazy:
Kód:
sub Kopej()
UO.WaitTargetTile()
UO.UseType()
endsub
Prvni co vas mozna zarazi je ze se vola UO.WaitTargetTile drive nez pouziti predmetu (podle typu) UO.UseType(). Yoko totiz musi vedet dopredu co chcete targetnout. Jakekoli prikazy typu UO.WaitTarget...() reknou yoko asi toto: "Jakmile se objevi target cursor targetni tohle". Pokud by prikaz UO.WaitTarget...() byl volan az po pouziti predmetu, tak target cursor uz je vyvolan. Yoko vsak reaguje na jeho vyvolani (zmenu normalniho cursoru na target cursor, pro ty znalejsi: reaguje na prichozi packet). Pokud tohle moc nechapete pamatujte si ze prikazy UO.WaitTarget...() musi byt volany drive nez se provede akce ktera vyvola target cursor (jinak by vam makro nefungovalo tak jak by melo).
Tak, ale co dat za parametry prikazu UO.WaitTargetTile()?
Yoko promenna lasttile se nam moc nehodi (popis vyse), ci-li musime pouzit druhou variantu (tilenum[, x, y, z]).
tilenum -toto je neco jako ItemType u predmetu, avsak tato hodna je urcena pro policko mapy.
x y z -jsou souradnice x, y a z, ktere se zadavaji v integeru (desitkova ciselna soustava) nebo muze byt i jako string (string se musel pouzivat u starsich verzi).
Tak ale jak zjistit souradnice nasi postavy, aby jsme mohli targetnout tile na kterem stojime? Mame na to tyhle prikazy:
integer UO.GetX([object]) -ziska X souradnice vasi postavy, nebo souradnice objektu.
integer UO.GetY([object]) -ziska Y souradnice vasi postavy, nebo souradnice objektu.
integer UO.GetZ([object]) -ziska Z souradnice vasi postavy, nebo souradnice objektu.
Tak ted upravime nas skript nasledovne:
Kód:
sub Kopej()
var x = UO.GetX()
var y = UO.GetY()
var z = UO.GetZ()
UO.WaitTargetTile("0", x, y, z)
UO.UseType()
endsub
Tady mate ukazku definice promennych a jejich nasledne vyuziti. Stejna vec jde napsat i jednoduseji:
Kód:
sub Kopej()
UO.WaitTargetTile("0", UO.GetX(), UO.GetY(), UO.GetZ())
UO.UseType()
endsub
Za tilenum jsem dosadil nulu. Jiste se ptate proc. Ptate se opravnene. Po dlouhem zkouseni jsem prisel na tohle: 0 bude fungovat pro kazde policko mapy (trava, voda, ...). Pokud chcete targetnout treba strom ci jiny static (je napevno v mape) item, staci vam tilenum jakehokoliv stromu (funkce pracuje se skupinami). Podotykam ze jsem na to prisel zkousenim, tak by neco nemuselo fungovat tak jak pisi.
Tak a ted se naucime zjisti ItemType predmetu. V clientovy napiseme ",info" a odesleme. Vyskoci nam target cursor, kterym klikneme na predmet o kterem se chceme dozvedet vice. Jakmile na nej klikneme otevre se vam (pokud jiz neni otevreno) nove okno yoka s nazvem "Text", v nemz bude neco takoveho:
Kód:
ID=0x400DDDDA Type=0x0E85 WSBRLMD Name=a pickaxe
Quantity: 0 Colour: 0x0000 Layer: 1 Has: 1
X=65535 Y=65535 Z=0 C=0x00030CF1 F=0x00
ID=0x400DDDDA -je ItemID predmetu
Type=0x0E85 -je ItemType (type) predmetu
WSBRLMD -je ID ve tvaru pro EasyUO.
Name= -jmeno predmetu (neni vyplneno, protoze ho client jeste nezna, kdyz na predmet kliknete driv nez pouzijete ",info" bude tu take vyplneno)
Quantity: 0 -mnozstvi ve stacku (0 znaci ze item neni stackovatelnej)
Colour: 0x0000 -barva predmetu
Layer: 1 -pokud je equipnutej, tak tady je cislo vrstvy ve ktere se nachazi (popis bude v nekterem z lekci)
Has: 1 -netusim co je (nejsem vsevedouci :-P)
X=65535 -X-ova souradnice
Y=65535 -Y-ova souradnice
Z=0 -Z-ova souradnice
Pokud je item v jinem predmetu pouziji se souradnice tohoto predmetu.
C=0x00030CF1 -ID containeru ve kterem se predmet nachazi (0xFFFFFFFF pokud je na zemi)
F=0x00 -dalsi parametry (poisoned=?, hiddent=0x80, pois+hid=?, mozna dalsi, nikdy sem nepotreboval)
Type=0x0E85 je to co hledame, nyni uz vime ze krumpac ma type 0x0E85. Vlozime ho tedy do naseho skriptiku:
Kód:
sub Kopej()
var x = UO.GetX()
var y = UO.GetY()
var z = UO.GetZ()
UO.WaitTargetTile("0", x, y, z)
UO.UseType("0x0E85")
endsub
Tak ted kdyz nas skript spustime sam nam kopne do zeme pod sebou.
Na zaver vam povim jak si tento script hodit na klavesovou zkratku.
V okne yoka se prepnete na zalozku Hotkeys. Zde vidite seznam jiz prirazenych klaves. Pod timto seznamem najdete policko oznacene textem "Command:". Sem napiste "exec <nazevscriptu>", v nasem pripade "exec Kopej". Dale se presuneme az pod tlacitka "Change sel. command" a "Delete hotkey". Pod nimi najdete policko oznacene "Hotkey:". Klikneme do nej a zmackneme nasi pozadovanou klavesovou kombinaci (napr: CTR+Q, muzete ale i samotnou klavesu napr: F1). Nakonec klikneme na tlacitko hned vedle tohoto policka "[/b]Add new hotkey[/b]". Tak a je to. Nyni kdyz v clientovy zmacknete tuto kombinaci klaves (ci jen klavesu) spusti se vam vas skript.
Ostatni tlacitka:
Change sel. command - kdyz si chcete pro danou klavesovou kombinaci zmenit prikaz. Oznacite v seznamu pozadovany radek a v policku "Command:" zmenite prikaz, pak kliknete na toto tlacitko.
Delete hotkey - smaze oznacenou polozku v seznamu
Tak to by bylo pro tentokrat vse. Priste si script upravime tak, aby kopalo tak dlouho, dokud na policku bude nejaka ruda.
Seznam prikazu:
integer UO.GetX([object]) -ziska X souradnice vasi postavy, nebo souradnice objektu.
integer UO.GetY([object]) -ziska Y souradnice vasi postavy, nebo souradnice objektu.
integer UO.GetZ([object]) -ziska Z souradnice vasi postavy, nebo souradnice objektu.
void UO.UseObject(object) -pouzije konkretni predmet.
void UO.UseType(type[, color]) -pouzije predmet daneho typu (a barvy), ktery mame u sebe (na sobe).
void UO.WaitTargetTile("lasttile"/tilenum[, x, y, z]) - targetne bud posledni targetnutej tile (policko na mape) nebo tile number (grafika policka mapy) na pripadnych souradnicich. Vsechny parametry moho byt zadany jako integer nebo string.
Yoko promenne:
lasttile - posledni targetnutej tile (policko mapy)