Autor Téma: Výuka scriptování od Mrakoplashe/Arakira - související diskuze nad problémy  (Přečteno 8204 krát)

Hoyo

  • Novic
  • *
  • Příspěvků: 6
  • Karma: +0/-0
    • Zobrazit profil
Dovolil jsem si z již nefunkčního webu (přes webarchiv) Mrakoplashova pavučinka půjčit jeho výuku scriptování, kterou dávám níže.

Myslím, že tu něco podobného žalostně chybí, jelikož nováčci často vůbec neví a škemrají i o základní scripty, které si mohou napsat sami, přitom scriptování je (alespoň pro mě) radostná součást hry a funkční kód potěší.

Pokud byste měl někdo kontakt na Mrakoplashe/Arakira, zeptejte se ho, jestli mu nevadí místní zveřejnění.

__________________________

Lekce c. 1

V tehle lekcich vas budu postupne seznamovat se scriptovanim v yoko a to na priklade mining scriptu. Zacneme od uplne jednoduchého az po vcelku komplexni skript. Dnes si ale povime jen zaklady.

Datové typy, promene a neco navic:
Promene
Promene si predstavte jako krabicku se jmenem do ktere si pak vlozite papirek s nejakym textem (cislem). Treba do krabicky se jmenem "jmeno" si vlozite papirek s textem "Arakir". V yoku si takovou krabicku vytvorite takhle:

Kód:

var jmeno


Casti "var jmeno" rikate yoku ze retezec "jmeno" predstavuje promenou (nasi krabicku). Od teto chvile jakykoli vyskyt tohoto textu (retezce) yoko nahradi hodnout ji prirazenou.
Nazev promene nesmi obsahovat zadne specialni znaky, jako mezery, zavinace, mrizky, dolary, interpunkci a dalsi. Dale nazev nesmi zacinat cislici. Pamatujte si jen to ze funkce musi zacinat pismenem anglicke abecedy a muze obsahovat podtrzitko "_". Dale yoko nerozlisuje velke a male pismena, cili "var Jmeno" ("Jmeno")  je to same co "var jmeno" ("jmeno").
Promene hodnotu priradime nasledovne:
hned pri definici promene

Kód:

var jmeno = "Arakir"


nebo az po jeji definici:

Kód:

var jmeno
jmeno = "Arakir"


Nyni v promene "jmeno" mame ulozenu hodnotu "Arakir".

Datove typy
Tri zakladni:
integer -ciselna hodnota. Definice: var promena = 1
string -textovy retezec. Definice: var promena = "Ahoj"
array -pole hodnot. Predstavte si to jako velkou krabici v niz mate nekolik ocislovanych krabicek a az v techto krabickach mate vlozeny papirky s honotami. Definice:

Kód:

dim pole[3]
    pole[0] = "Prvni prvek pole"
    pole[1] = "Druhy prvek pole"
    pole[2] = "Treti prvek pole"


Jak vidite neni na tom nic sloziteho. "dim" rika ze se jedna o pole. "pole" je jeho nazev. "[3]" rika kolik prvku (krabicek) pole bude mit, v nasem pripade 3 prvky. Dale uz postupujete stejne jak u preddefinovanych promenych akorat za nazev pridate "[cislo]", ktere rika o jaky prvek se jedna. Prvky se cisluji od nuly. Prvky pole mohou nabyvat pouze hodnot integer a string.
Pridam sem jeste:
void -neni to teda datovy typ, protoze to je nic. Nechapete? Jednoduse, void je oznaceni pro "nic". Pouziva se u popisu funkce (i ja ho budu pouzivat), takze ve skriptu ho nikdy nenajdete. Priklad pouziti najdete na konci lekce.

Neco navic
Ted si povime neco malo o pojmech jako je ItemType, ItemID a Color. Jsou to hodnoty jakehokoli predmetu v UO, jak mozna tusite. Vsechny to jsou hexdecimalni cisla uvozene "0x". Tak ted co jednotlive hodnoty predstavuji:

ItemID: Jinak receno identifikacni cislo predmetu. Kazdy item ma sve jedinecne cislo, ktere ma osum cifer. Pr: 0x0100A5F6. V dokumentaci yoka se pro nej pouziva vyraz "object" (a ja jej budu pouzivat take).
ItemType: Toto hodnota rika o jaky typ objectu se jedna. Typ vlastne rika jakou grafiku object ma (pozor ne barvu). Napriklad PickAxe a FoolsPickAxe maji stejny ItemType, ale lisi se v barve (Color). Tato hodnota je 4 ciferna. Pr.: 0x1234. V dokumentaci yoka se pro nej pouziva vyraz "type" (a ja jej budu pouzivat take).
Color: V prekladu "barva". Ano, je to barva predmetu (neplest s grafikou). Tato hodnota rika ultime jakou barvou ma danou grafiku prebarvit. Pokud je tato hodnota nulova pouzije se neprebarvena grafika. Tato hodnota ja 4 ciferna. Pr: 0x1234. V dokumentaci yoka se pro nej pouziva vyraz "color" (a ja jej budu pouzivat take).

Vsechny tyto hodnoty jsou typu string.
Tyto hodnoty budete pri psani skriptu pouzivat dnes a denne. Jak je zjistit si povime v pristi lekci.

Funkce:
Funkce je vlastne nas vytouzeny skript (presneji skript je to co se nachazi ve funkci). Jeji zapis je nasledujici:

Kód:

sub Nazev()
    <telo funkce>
end sub


Jak vidite neni to nic sloziteho. sub rika yoku ze zacina nova funkce za ni nasleduje jeji jmeno (Nazev), ktere se ridi stejnymi pravidli jako nazvy promenych, a zavorky (maji tu svuj ucel, ale zatim se tim zabyvat nebudeme). Aby yoko vedelo kde funkce konci, musime mu to rict zapisem end sub. Priklad funkce, ktera vytiskne "Ahoj svete":

Kód:

sub Ahoj()
    UO.Print("Ahoj svete")
end sub


Tady je ta sama funkce, akorat vyuziva promene:

Kód:

sub Ahoj()
    var text = "Ahoj svete"
    UO.Print(text)
end sub


Seznam funkci:
V teto casti vam v kazde lekci sepisu seznam pouzitych funkci s jejich popisem. Popisovat je bude nasledovne:
<navratova_hodnota> <nazev_funkce>(<parametr>[, <nepoviny_parametr>]) - <popis>

<navratova_hodnota>: typ vracene hodnoty. Jsou to nase zname datove typy + void. Pokud nevite k cemu to je, tak se tim zatim netrapte, brzy pochopite.
<nazev_funkce>: nazev funkce. Mluvi samo za sebe.
<parametr>: pomoci parametru funkci sdelujete informace (hodnoty) ktere potrebuje ke svemu chodu. Zde se bude obevovat bud datovy typ, nebo napr type, object a dalsi.
<nepoviny_parametr>: to stejne co parametr. Od povineho parametru ho poznate tak ze je umisten v hranatych zavorkach [].
<popis>: popis co funkce dela.

void UO.Print(string) - funkce zadany text vypise v okne UO (vlevo dole). Pr: UO.Print("Ahoj")

To by pro dnesek stacilo. Priste se uz vrhneme na mining skript, ktery postupne vypracujeme k pomyslne dokonalosti.

Hoyo

  • Novic
  • *
  • Příspěvků: 6
  • Karma: +0/-0
    • Zobrazit profil
Re:Výuka scriptování od Mrakoplashe/Arakira - související diskuze nad problémy
« Odpověď #1 kdy: Srpen 20, 2017, 08:14:39 dopoledne »
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)

Hoyo

  • Novic
  • *
  • Příspěvků: 6
  • Karma: +0/-0
    • Zobrazit profil
Re:Výuka scriptování od Mrakoplashe/Arakira - související diskuze nad problémy
« Odpověď #2 kdy: Srpen 20, 2017, 08:15:03 dopoledne »
Lekce c. 3

Jiz uplynula dlouha doba od vydani posledni lekce, kde jsem predeslal ze v teto lekci si upravime skript tak aby nám vytezil policko.

Puvodni skript:

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


Jediny rozumny zpusob jak to udelat je pomoci smycky. Mame jich hned nekolik.

For ... Next
Tento typ smycky se pouziva tehdy kdyz vime kolikrat se ma danej kod opakovat.
Priklad zapisu:

Kód:

sub countdown()
    var i
    For i=10 to 1 Step -1
        Print(str(i))
        Wait(1000)
    Next
endsub


Zde vidite skript ktery odpocitava od 10 do 1. Ted si popiseme jednotlive casti:
i=10 - inicializace pocatecni hodnoty pocitadla
to 0 - konecna hodnota pocitadla
Step -1 - nastaveni kroku. Tato cast neni povina. Defaultni hodnota kroku je 1

While ... Wend
Tento typ smycky se pouziva tehdy kdyz chceme aby se danej kod provadel do doby dokud plati podminka, ktera je uvedena na zacatku. Kod v ni se nemusi spustit.
Priklad zapisu funkce "countdown":

Kód:

sub countdown()
    var i=10
    While i > 0
        Print(str(i))
        Wait(1000)
        i = i-1
    Wend
endsub


Sami uznate ze se tento typ smycky nehodi na tento pripad. While by se melo pouzivat az tehdy kdy nelze pouzit For. Blizsi popis zde neni nutny.

Repeat ... Until
Tato smycka je podobna predchozi (While ... Until). Smycka se provadi do doby dokud se nesplni podminka uvedena na konci. Kod v ni se spusti alespon jednou.
Priklad zapisu funkce "countdown":

Kód:

sub countdown()
    var i=10
    Repeat
        Print(str(i))
        Wait(1000)
        i = i-1
    Until i = 0
endsub


Stejne jako u While je pro tento pripad lepsi pouzit smycku For. Davajte si pozor na podminku! Smycka se ukonci tehdy kdy zacne platit podminka. (Until -> dokud ne)

Drive nez se rozhodneme kterou smycku pouzijeme v nasem skriptu si musime zjistit podle ceho se da zjistit kdy jsme policko vytezili. Nejlepsi zpusob je tezit rucne. Pote zjistime ze kdyz policko uz je prazdne oznami nam to nasledujicim textem: "There is no ore here to mine." Dale by jsme si jeste mohli zjistit co nam napise kdyz se pokusime tezit na policku kde se tezit neda, aby nedoslo k zaseknuti smycky: "Try mining in rock."

Pro zjisteni co za texty se na obrazovce zobrazilo slouzi funkce integer UO.InJournal(string), ktera vraci cislo radku na kterem se nachazi prvni vyskyt textu zadaneho jako parametr.

Tak a ted se rozhodneme kterou ze smycek pouzijeme. For v tomhle pripade pouzit nemuzeme, protoze nevime kolikrat musime kopnout, takze budeme muset pouzit While nebo Repeat. V tomhle pripade je lepsi pouzit Repeat, protoze text ktery nam rekne ze uz se na policku nic nenachazi se nam vypise az po kopnuti do zeme.
Skript upravime nasledovne:

Kód:

sub Kopej()
    var x = UO.GetX()
    var y = UO.GetY()
    var z = UO.GetZ()
   
    Repeat
        UO.WaitTargetTile("0", x, y, z)
        UO.UseType("0x0E85")
        Wait(1000)
    Until UO.InJournal("There is no ore here to mine.|Try mining in rock.")
endsub


!!!TED VELKY POZOR!!!
Pokazde kdyz pisete skript kde se nachazi smycka nezapomente dat na konec (ci zacatek) pauzu Wait(integer) kde jako parametr je pocet milisekund. Vyvarujete se tak zahlceni serveru prikazama (zalagovani) a mate lepsi kontolu nad tim jak skript probiha. Take si nezapomente nastavit na klavesu (treba na CTRL+PAUSE) prikaz ".terminate all", ktery ukonci vsechny bezici skripty.

Urcite jste si vsimly zapisu: UO.InJournal("There is no ore here to mine.|Try mining in rock.") Nekteri uz pochopili ze znak "|" (roura, oritko ci jinej me neznamej nazev) slouzi jako oddelovac hledanych vyrazu. Pokud se v journalu vyskytuje alespon jeden z hledaych vyrazu, vrati funkce cislo radku prvniho z nich.

Kdyz tenhle skript pustite zjistite ze kopne driv nez stihne dokoncit predchozi kopnuti. Dale je tu jeste jeden problem, a to ten ze pri dalsim spusteni skriptu kopne pouze jednou a skonci. Proc se to stane? Protoze text ktery kontrolujeme je uz v journalu (v journalu yoka). Cely journal se da smazat prikazem void UO.DeleteJournal(). Tak ho tam pridame:

Kód:

sub Kopej()
    var x = UO.GetX()
    var y = UO.GetY()
    var z = UO.GetZ()
   
    UO.DeleteJournal()
    Repeat
        UO.WaitTargetTile("0", x, y, z)
        UO.UseType("0x0E85")
        Wait(1000)
    Until UO.InJournal("There is no ore here to mine.|Try mining in rock.")
endsub


Dalsi problem byl ten ze kopne drive nez dokonci predchozi kopnuti. Da se to napravit dvema zpusoby:
1. Upravit pauzu (tady cca 2500)
2. Pouzit dynamicke pauzy (v pristi lekci)

Tak to by bylo pro tentokrat vse. Priste si povime neco o dynamickych pauzach a ukazeme si jak vyuzivat vice funkci.
   
Seznam prikazu:
integer UO.InJournal(string[|string]) -hleda prvni vyskyt hledaneho vyrazu ci jednoho z hledanych vyrazu v journalu, vraci cislo radku na kterem se nachazi prvni z nich
void UO.DeleteJournal() -smaze journal
void Wait(integer) -ceka tolik milisekund kolik zadate jako paramtr (1s = 1000ms)

Hoyo

  • Novic
  • *
  • Příspěvků: 6
  • Karma: +0/-0
    • Zobrazit profil
Re:Výuka scriptování od Mrakoplashe/Arakira - související diskuze nad problémy
« Odpověď #3 kdy: Srpen 25, 2017, 01:26:43 odpoledne »
Potřebuji poradit ohledně scriptu na fish.

Po spuštění scriptu bych chtěl, aby mi hodil do ruky prut a vytvořil zaměřovač na políčko, kde chci rybařit, ale nevím, jak to napsat...

Po napsání UO.UseType ani UO.Say(".usehand") nedokážu ten zaměřovač udržet ani pomocí

while UO.Targeting()              [což funguje například u UO.AddObject()]
   wait
wend

ani pomocí

repeat
   wait
until

a vždycky mi to něco targetne.

Nevíte, jak by se dalo vyřešit, abych udržel zaměřovač po dobu, dokud nějaké políčko nevyberu sám ručně?

SirGlorg

  • Game Master
  • Velmistr
  • *****
  • Příspěvků: 244
  • Karma: +8/-1
    • Zobrazit profil
Re:Výuka scriptování od Mrakoplashe/Arakira - související diskuze nad problémy
« Odpověď #4 kdy: Srpen 27, 2017, 10:27:47 dopoledne »
Hoyo pro Yoko je potreba si uvedomit, co se kdy deje a vykonava. Kdyz poklikas na prut, tak se nejdrive na server z tveho clienta odesle informace, ze jsi na to poklikal. Server vyhodnoti akci dvojkliku a vrati tvemu clientovi informaci o tom, ze to poklikani ma vyhodit target, kterym muzes neco zacilit. V tehle prodleve, mezi tvym poklikanim a informaci ze serveru, jeste tvuj client ve skutecnosti zadny target nema, takze pokud se ve svem kodu spolehas na to, ze hned pote, co na neco kliknes muzes cekat na target, tak ti to nebude fungovat.

Prave kvuli tehle mechanice cileni Injection pouziva ruzne formy prikazu WaitTarget -> ty zavolas napriklad UO.WaitTargetTile(<TYPE>,X,Y,Z), coz injectionu nastavi priznak, ze jakmile od serveru dostane informaci o tom, ze ma neco zacilit, tak ten target proklikne nad tou definovanou pozici X, Y, Z a dany tile type, ktery na tom miste lezi. Z tohodle duvodu se typicky volani UO.WaitTargetTile(...) vola jeste PREDTIM, nez zavolas samotny dvojklik na nejaky item, coz zajisti, ze se okamzite po ziskani targetu projevi jeho aplikovani na cil a nedojde k zadnymu predbehu (napr. ze by target prisel jeste predtim, nez se v injectionu proede nastaveni te reakce a podobne).

Ted k tvoji otazce -> pokud chces mit jistotu, ze uz jsi dostal ten target, byva lepsi pockat na nejakou zpravu v journalu, ktera se ti posila spolu s tim targetem - v tomhle pripade jde o hlasku "Where would you like to fish". Cely script pak vypada nejak takhle:

Kód: [Vybrat]
sub fish()
UO.DeleteJournal()
UO.UseType("0x0dbf")
repeat
wait(50)
until UO.InJournal("Where would you like to fish")
while UO.targeting()
wait(100)
wend
end sub

jinymi slovy -> nejdriv se musis ujistit, ze to targetovani vubec zacalo, a teprve potom muzes testovat, jestli jeste probiha, nebo uz skoncilo. Pokud neoveris zacatek, tak se ti muze stat, ze jsi prilis rychly, a otestujes "konec targetovani" jeste predtim, nez ten target vubec dostanes, coz pak nefunguje
« Poslední změna: Srpen 27, 2017, 10:35:27 dopoledne od SirGlorg »