Skriptovanie v Injection - dummies edition

Z Moriawiki

Přejít na: navigace, hledání

Obsah

Úvod

Na tejto stránke sa budem snažiť podať stručný návod základov skriptovania v Injection skripte. Injection je jediný silný podporný program pre UO klienta na Morii.

Základná otázka je - Prečo? A základných odpovedí je viac. Dnes je veľký nepomer medzi hráčmi, ktorí si dokážu pre PvP, PvM, alebo pre kraftenie vyrobiť užitočný skript. Pritom už jednoduché skripty dokážu človeku uľahčiť hru. Naviac, sám základy injection skriptu už ovládam. Tieto znalosti chcem posunúť ďalej. Injection skript môže hráča prinútiť rozmýšľať, rozvíjať aj dalšie schopnosti, ponúknuť inú formu zábavy s Moriou a možno niekoho privedie na cestu programovania... :)

Návod bude vychádzať po lekciách na pokračovanie ako občasník. Pokojne mi posielajte komentáre a opravujte chyby. Cieľom je, aby návod obsahoval vysvetlenie pojmov ako funkcia, premenná, globálna premenná, kľúčové slová, postup ako vytvoriť jednoduché algoritmy (a čo to vlastne je, že? :), jednoduché príklady, možno testíky, zoznam podporovaných funkcií a rady. Všetko jednoduchou, a hádam zrozumiteľnou formou. K tomu mi dúfam pomôžete aj vy. Cieľom je aj, aby táto stránka odkazovala na stránku otázok, preto sa pýtajte, bude vám (možno) odpovedané. :P

PS: Ako ste si všimli, bude to v slovenčine. Tešte sa. :) Možno ho raz prepíšem aj do angličtiny, ale... to je len veľké možno.

PS2: Záškodníkov, prepisujúcich toto do češtiny, budem tvrdo trestať označením mongol. ]:-)

Zlá a škodolibá bohyně 17:22, 1. 6. 2010 (Central Europe Daylight Time)

Lekcia 1

...alebo čo to je Inject, kde si to stiahnem a ako to nastavím?

Ilaunch panel
Ovládaci panel Injection

Injection alebo 'inject' je program, ktorý sa dokáže 'napichnúť' na komunikáciu medzi klientom (client.exe) a servrom (Moria). A dokáže tohoto klienta nejako ovplyvňovať. Nebudem tu podrobne rozoberat ako, lebo... to sám netuším a lebo je to pre hráča vlastne úplne nepodstatné :). Nakoniec koho to zaujíma keď to funguje, že? Podstatné je, ako to 'nainštalovat' a 'rozbehať'.

Injection má množstvo verzií a nie je mojim cieľom popísať ich. Je voľne prístupný a môžete si ho stiahnut na [webe]. Takisto existuje x rôznych stránok o injecte [1], [2], [3], [4]...

Verzia, ktorá je odskúšaná a kompatibilná s morijskými klientmi je na [Jandorových stránkach] v sekcii UO Software, Makrovací + pomocné, Injection. Obsahuje aj ignition a rôznych klientov. Takže stiahnuť a rozbaliť niekde do podadresára inštalácie UO.

Spúšťa sa to celé cez ilaunch.exe, teda 'Spúšťač Injectu' - Injection Launcher. Tento program spúšťa klienta UO (client.exe) s injectom. To je dosť dôležité. Jednoducho nebudete spúšťať klient a inject oddelene. Ilaunch to vybaví. Je ho ale potreba nastaviť, konkrétne:

Client dir – nastavte na adresár, kde sa nachádza váš client.exe
Server – ilaunch môže podporovať zoznam rôznych servrov, môžete ho nejako nazvat (Name) a zadefinovať jeho adresu a port. Pre Moriu je to moria.kec.cz,2593, prípadne čokolvek je práve teraz v najnovšej verzii login.cfg.
Client – ilaunch môže takisto podporovať zoznam rôznych klientov, odporúčam si nastaviť viacero verzií klientov. Aspoň zo začiatku, kým budete skúšať ktorý najlepšie s injectom beží.
Executable – to je len výpis klienta, čo je práve vybraný zo zoznamu.
Ignition.cfg – vyberiete si verziu ignition.cfg. Ak používate verziu od Jandora, tak jednoducho vyberte tú verziu, ktorá je priložená pri injecte.

Zaškrtnete Use Injection a Exit after launch aby ste naozaj používali inject a aby sa ilaunch ukončil po spustení klienta a injectu. No... nalejme si čistého vína. On sa furt korektne nezavrie… :) Ak toto všetko nastavíte, zapíše sa to do ilaunch.xml. To je konfiguračný súbor ilaunch. Ako ste si všimli, pri kliente je možné zadať aj meno accountu a heslo... POZOR – toto sa zapisuje do ilaunch.xml. Nikdy tento súbor nikomu neposielajte. Ľudia sú rôzni...

Launch!

Pri troche šťastia a pochopenia úskalí nastavenia ilaunch.exe to pôjde (nie je to najpriateľskejší program). Spustí sa klient spolu s injectom. Má 7 záložiek a nebudem zatiaľ všetky podrobne popisovať. Podstatné je, že má x ďalších nastavení. A tie sa ukladajú do injection.xml.

Nastavenia sa ukladajú pomocou Save v záložke Main. Skripty sa obsluhujú v (prekvapivo) Script záložke a Rýchle / horúce klávesy sa nastavujú v Hotkeys. Táto verzia obsahuje ale malú zradu v injection.xml súbore. A to je aj vašou prvou domácou úlohou. Čo s tým, lamky? :)

Zlá a škodolibá bohyně 22:08, 1. 6. 2010 (Central Europe Daylight Time)

Lekcia 2

...alebo čo je to script? Kde, čo, ako sa to píše?

Injection záložka Script

Najprv ale riešenie domácej úlohy. Niekto, kto si myslí že je ohromne vtipný, si dal tú námahu a zmenil injection.xml súbor. Nastavil tam parameter InjectionWindowPosX="-310". To znamená, že pozícia injection okna je mimo obrazovky. Otvorte súbor v textovom editore (napríklad notepad), odstráňte znak mínus, uložte súbor, a môžte fungovať.

Nazad k téme! Mal by som asi trochu opísať najdôležitejšiu záložku pre skriptovanie (skriptovanie je tá činnosť keď píšete a upravujete skript :) – záložku Script. Load tlačidlo je pre načítanie skriptu zo súboru. Keď teda chceme nahrať skript, tak inject hľadá hlavne súbory s príponou .sc. Save je pre uloženie aktuálneho skriptu do súboru (tiež .sc). Pokiaľ máte nejaký skript načítaný, injection zistí jeho funkcie a potom si môžte nejakú vybrať tlačidlom Spusť funkciu - Run function. Osobne to nepoužívam a spúšťam skripty ináč ale o tom niekedy nabudúce. Pre editáciu aktuálne nahraného skriptu je tlačidlo Edit current script – uprav aktuálny skript. Ak ale nie je žiaden načítaný, otvorí to autoload.sc. Zatiaľ nebudem vysvetľovať čo je to autoload.

Ak už nejaký skript spustíte, zapíše sa do zoznamu bežiacich funkcií - List of running functions ako práve bežiaci skript. Nakoniec, pre vytváranie skriptov je podstatné vidieť zoznam tých, ktoré práve teraz bežia. Na predčasné ukončenie je tu tlačidlo Terminate selected – ukonči vybraný skript.

Na tomto mieste si musíme vysvetliť základné pojmy. Varovanie – tuto nasleduje kúsok "teórie". Skript je program. To znamená že je to nejakou formou napísaný postup, čo má počítač robiť. Každý inject script je postup napísaný človekom (najčastejšie nejakým UO závislákom), ktorý hovorí injectu a klientovi UO, čo má robiť. Podstatné je vedieť, že keďže je to script, je napísaný v textovej forme a tak sa aj vykonáva (to znamená, že to nemusí byť .exe a inject to počítaču prekladá z textu). Fyzicky je to ale len textový súbor na disku, konkrétne súbor s príponou .sc. Možno ho upravovať pomocou hociktorého slušného textového editora (notepad nie je slušný ale lepší ako hrdzavým drôtom do oka). Ale je to len program – teda nič práve nerobí, len si tak leží na disku. Skript ktorý beží, teda je spustený a práve sa vykonáva, by bolo možné nazvať proces. Teda živý program (program je to predchádzajúce). Tento už len tak neleží, ale aj práve teraz niečo robí (najlepšie ked práve looti v PvP, že?). Keď už som napísal, čo som napísal, mal by som teda v budúcnosti v každej lekcii rozlišovať medzi skriptom a bežiacim skriptom – medzi programom a procesom. Nemôžem to ale sľúbiť. Hádam sa vysomárite.

Dosť bolo drístov. Poďme si teda niečo spustiť, nech vidíme či to celé vôbec beží.

1) Otorte si notepad, deťúrence, napíšte tam:

Sub Lekcia2()
UO.Say("TY JOOO, VONO TO JEDEEE!!!")
Endsub

Uložte si tento súbor do adresára injectu ako pokus.sc

2) Spustite klienta a inject cez ilaunch. Prihláste sa do hry. V inject okne Script otvorte súbor pokus.sc

3) V hre napíšte ,exec lekcia2

4) ENTER!

PS: Pre vychytralých aj domáca úloha. Ako nastavím rýchle tlačidlo (hotkey) na tento skript?

Zlá a škodolibá bohyně 11:23, 6. 6. 2010 (Central Europe Daylight Time)

Lekcia 3

...alebo čo je to funkcia?

Riešenie domácej úlohy. Hotkey nastavíme takto:

1) V záložke Hotkey klikneme do políčka Hotkey
2) Stlačíme požadovanú klávesu alebo ich kombináciu (napríklad Alt + F4... ale nie, to nie je dobrý nápad, fakt nie:)
3) Do políčka Command vpíšeme príkaz (napríklad ten ,exec lekcia2) a klikneme Add new hotkey. Pridali sme novú skratku a je ju vidno v zozname
4) Potom v záložke Main ešte potvrdíme celé nastavenie Save-nutím

Dnes sa znova nevyhneme teórii. Fakt je mi to ľúto ale bez toho to asi nepôjde. A ja rád robím ľuďom zle. Inject script sa skladá z príkazov. Príkaz je poväčšine nejaká menšia časť programu, ktorou prikazujeme aby injektu aby urobil niečo malé a konkrétne, kúsok postupu alebo skladačky ak chcete. Inject skript je sekvenčný. Znamená to, že sa takéto príkazy píšu za sebou a potom sa aj v takom poradí vykonávajú. Ak je teda v skripte napísané, že má vaša postava povedať Som velký macher, a potom je tam daľší príkaz aby povedala Fakt hustý macher som, tak to skript urobí za sebou. Jedno po druhom.

Použité príkazy sú v skripte vždy súčasťou nejakej funkcie. Funkcia by sa dala teda popísať ako zoznam príkazov (pre začiatok). Taká funkcia má meno, môže (ale nemusí) mať vstupy a výstupy. O tých inokedy. Funkcia ako taká má množstvo výhod a dôvodov preto aby vôbec existovala. Som si istý, že ich časom pochopíte, teraz si ale jednoducho ukážeme ako sa taká funkcia robí. Otvoríme si poznámkový blok, detičky a napíšeme si:

Sub Moja_funkcia_123()

UO.Say("Toto je prikaz ktory sluzi na to aby vasa postava rozpravala")
Wait(2000)
UO.Print("Toto je prikaz ktorym sa pise do zurnalu ale nerozprava sa. Nikto to nevidi, len vy.")

Endsub

Svoju vlastnú funkciu si môžte nazvať ako chcete, napríklad Moja_funkcia_123. Meno môže obsahovať veľké a male písmená, číslice, podrtžítka, bodky a možno ešte pár znakov, ale nebude ich veľa. Nesmie to byť číslo, a nesmie číslom začínať, ale môže ho obsahovať, ak obsahuje aj iné abecedné znaky. Musí to byť jedno slovo (podtržítkami môžte nahradiť želané medzery), a nesmie to byť meno rovnaké ako už použité.

Slovíčko Sub pred jej menom je kľúčové slovo. Klúčové znamená, že sa používa na označenie začiatku zápisu funkcie – presnejšie na definíciu funkcie. Žiadna funkcia ani nič iné sa nesmie volať Sub, ani SUB. Jej meno nesmie byť rovnaké ako ktorékoľvek kľúčové slovo, aj keď celý názov kľúcové slovo môže obsahovať.

Radšej si dame príklady povolených mien (okrem vyššie uvedených obmedzení, vás neviaže nič, len fantázia):

subMarine
asf167_juchuu
aldghsdgsdgpoko4mhmo034t4n
_Cokolvek____asfasfgh
_123

Inject script nie je case sensitive a preto SUB, sub, Sub, sUb, sUB a všetky ostatné kombinácie veľkých a malých písmen preň nie sú rozdielne. Všetky znamenajú to isté. Toto platí všade, nie len pri menách funkcií. Kľúčových slov je veľa, a zaoberať sa nimi budeme postupne. Nateraz je potrebné vedieť, že kľúčové slovo nesmie byť použité na nič iné okrem toho, na čo je vyhradené.

Endsub je tiež takéto kľúčové slovo. Dúfam, že ste sa už dovtípili, že Sub a Endsub označujú začiatok a koniec tela akejkoľvek funkcie. Ak túto funkciu spustíme (zavoláme) tak sa vykoná to, čo je medzi Sub (s názvom funkcie) a Endsub. A to sekvenčne. Teda poporiadku od hora dolu.

UO.Say, Wait a UO.Print sú príkazy. Prvý je na hovorenie, druhým poviete injectu aby čakal presne daný počet milisekúnd a tretí je na písanie poznámok pre seba do žurnálu. Všimnite si, že v zátvorkách majú niečo napísané. Asi nie je ťažké dovtípiť sa, čo to je. Hovorí sa tomu parametre a v tomto prípade určujú čo má postavička povedať, napísať do žurnálu, alebo ako dlho má inject čakať.

Vtip je v tom, že aj tieto tri príkazy, a aj veľké množstvo ďaľšich, sú tiež len funkcie. Akurát nevidíme kde sú definované. Ale definované sú, to sa môžete staviť. V našom príklade sú len volané. Vidno, že rôzne funkcie môžu volať rôzne iné funkcie a to isté platí aj pre tie, ktoré si zadefinujete sami. Je to vlastne taká skladačka. V jednom súbore možno definovať teoreticky neobmedzené množstvo funkcií. Príklad. Zapíšme si do súboru lekcia3.sc príklady z oboch doterajších lekcií:

Sub Lekcia2() 
UO.Say("TY JOOO, VONO TO JEDEEE!!!") 
Endsub 

Sub Moja_funkcia_123()

UO.Say("Toto je prikaz ktory sluzi na to aby vasa postava rozpravala")
Wait(2000)
UO.Print("Toto je prikaz ktorym sa pise do žurnálu ale nerozprava sa. Nikto to nevidi, len vy.")

Endsub

Definície funkcií sa nesmú prekrývať. Zapíšme si pod nich alebo nad ne ešte jednu funkciu.

Sub Lekcia3() 
UO.Say("Teraz si zavolame dve funkcie") 
Lekcia2()
Moja_funkcia_123()
Endsub

Ak zavoláme cez klienta ,exec lekcia3. Malo by sa stať nasledovné: Vaša postava povie Teraz si zavolame dve funkcie. Zavolá sa Lekcia2 a vaša postava povie TY JOOO, VONO TO JEDEEE!!! a ukončí sa Lekcia2. Následne sa zavolá Moja_funkcia_123 a vaša postava okamžite povie aj Toto je prikaz ktory sluzi na to aby vasa postava rozpravala. Inject počká 2 sekundy a do žurnálu sa vypíše Toto je prikaz ktorym sa pise do zurnalu ale nerozprava sa. Nikto to nevidi, len vy. Ukončí sa Moja_funkcia_123 a po nej sa ukončí aj Lekcia3.

A keď vravím že ukončí tak ukončí. Dnes to bude bez domácej úlohy.

Poznámky pre zvedavcov. Zátvorky za menom funkcie nepatria k menu, ale označujú množinu vstupov funkcie. Moja_funkcia_123 nemá žiadne vstupy, preto je zátvorka prázdna. Nebudeme si to predsa zo začiatku komplikovať. Táto funkcia takisto nič nevracia. Prázdne riadky inject ignoruje. Medzera medzi riadkom s menom funkcie a prvým príkazom je len pre prehľadnosť a vôbec tam nemusí byť.

Zlá a škodolibá bohyně 13:48, 8. 6. 2010 (Central Europe Daylight Time)

Lekcia 4

...alebo čo je to premenná?

Premennú si môžme predstaviť ako krabičku, alebo poličku. Do premenných si v programe môžme ukladať hodnoty, aby si ich program pamätal. Obidve slová su dosť dôležité, premenná aj hodnota. Premenná je to miesto, kam si niečo môžme uložiť, jej hodnota je tá vec, čo na tom mieste práve je. Napríklad si tam môžme uložiť údaj o hráčovi, na ktorého chceme práve teraz útočiť. Alebo si tam môžeme uložiť údaj o type mäsa ktoré chceme variť pomocou cooking scriptu. Prvá podstatná vlastnosť premennej je, že môže meniť hodnotu počas behu programu. To sa celkom hodí ak chceme napríklad zmeniť cieľ útoku. Alebo ak chceme zmeniť typ mäsa na varenie. Bez premenných použiteľné skripty písať nemožno.

Premennú je potreba deklarovať. Podobne ako pri funkcii, vravíme skriptu: toto je nová premenná s takýmto menom. Premennú potom môžme definovať, teda priradiť jej hodnotu. A to koľkokrát chceme.

Var moja_premenna

Pre meno premennej platia rovnaké obmedzenia ako pre meno funkcie. Žiadna premenná sa nesmie volať rovnako ako nejaká iná premenná alebo funkcia, alebo naopak. Tomu budeme hovoriť unikátnosť (jedinečnosť) mena.

Skúsime si príklad:

Sub primitivne_varenie()

     Var maso
     maso='0x09F1'
     UO.Usetype(maso)
     UO.WaitTargetObject('lasttarget')

Endsub

Toto je veľmi primitívny skript a nerobí nič viac ako jednoduché macro vyrobené v klientovi. Ako premennú sme si deklarovali maso a v nasledujúcom riadku sme jej priradili hodnotu – definovali sme ju. (Tá hodnota vás teraz nemusí presne zaujímať, ale je to unikátne číslo pre typ surového rybacieho steaku. Ako ho zistiť si povieme neskôr.) Skript následne spustí funkciu UO.Usetype – skúsi nájsť a použije to, čo je jej parametrom. To je naša premenná maso, a teda skúsi nájsť a použije rybací steak (dvakrát naň klikne). Funkcia UO.WaitTargetObject počká na zameriavací terčík klienta a keď sa objaví (čo sa stane skoro bezprostredne po dvojkliku), zameria teto terčík na 'lasttarget'. Lasttarget je systémová premenná posledného targetu. Nie je potrebné ju deklarovať a ani sa nedá definovať. Injekt si ju pametá podľa toho čo klient zameral ako posledné. Tieto dve funkcie, ktoré sme použili sú práve krásne príklady na volanie funkcie s parametrom.

Ak teda manuálne uvaríte jeden steak na ohníku, po spustení tejto funkcie vám inject uvarí ďalší, pri ďalšom spustení znova a znova a znova. Jednoducho to funguje podobne ako LastObject, LastTarget makro v klientovi. Nič prevratné, žiadna pridaná hodnota.

Ak by to ešte nebolo niekomu jasné tak priraďovanie hodnoty premenným sa deje pomocou operátora =. Operátorov je samozrejme veľa a môžu mať rôzne využitie. Asi nie je potreba príliš veľa intelektu na to, aby sme si vedeli domyslieť, že asi existujú aj iné operátory, napríklad +, -, *, /.

Ak máme niekde v skripte definované

Var A, B, C, D

(Áno môžme premenné deklarovať aj takto, oddeliť ich čiarkami a nemusíme ich vypisovať všetky pod seba do jednotlivých riadkov)..tak môžme robiť jednoducé aritmetické operácie:

A=B+C*D - B/A

Toto nie je rovnica. Tento príkaz priradí novú hodnotu premennej A podľa výpočtu. Parameter = je priradenie, nie porovnanie. Pravidlá o prednosti pri aritmetických operáciách sa samozrejme zachovávajú. Teda najprv sa vynásobí C*D a vydelí B/A, až potom sa to celé sčíta a odčíta. Možno použiť aj zátvorky:

A=(B+C)*(D-B)/A

Potom to ale už je iný výpočet. Pozor hlavne na delenie nulou. Premenná A musí mať v tomto prípade nenulovú hodnotu. Bolo by tiež fajn, keby všetky premenné boli čísla :).

Prvá domáca úloha. Akú hodnotu bude mať A? Akú hodnotu budú mať B, C, D?

Sub Hracka_s_cislami()

     Var A, B, C, D
	
     A=2
     B=3.47
     C=4
     D=5.2689
     A=B+C*D - B/A
     A=(B+C)*(D-B)/A
	
Endsub

Pomôcka - na záver funkcie môžte nechať vypísať hodnotu A cez funkciu UO.Print() volaním UO.Print(Str(A)). Čo je to Str si povieme hneď.

Pred chvíľou som vravel, že by bolo fajn aby všetky premenné, ktoré sme použili v predchádzajúcom príklade boli čísla. Čo iné by vlastne mohli byť? Injekt pozná rôzne typy premenných.

Číslo, deklaruje sa ako Var cislo, definuje sa jeho hondota ako cislo=31347.878545 Priznám sa, že neviem aká je maximálna hodnota, ale tipujem, že podobne ako float v C to bude 2 na pätnástu.

Reťazec znakov, deklaruje sa ako Var retazec, definuje sa jeho hodnota ako retazec=jk345h345j alebo bezpečnejšie ako retazec=’asdgsdgsdg’ alebo retazec=”asdgsdgsdg”

Pole hodnôt, deklaruje sa ako Dim pole[x], pričom x je celé nezáporné číslo, napríklad Dim pole[10] má 10 hodnôt od pole[1] po pole[10] (nie ako v C, kde existuje pole[0]).

Systémová premenná - nedeklaruje ani nedefinuje sa. Možno ju rovno používať a jej meno je kľúčové slovo.

Tu by sa hodilo spomenúť to Str. Str je funkcia, ktorá vracia reťazcnovú hodnotu číselného parametra. UO.Print by vám nefungovalo keby ste chceli vypísať číslo. Musí to číslo zmeniť na znak toho čísla, pre výpis.

To by na dnes aj stačilo. Minule nebola domáca úloha, tak dnes budú dve, alebo radšej tri.

Druhá: ako zmeniť funkciu primitivne_varenie zo začiatku lekcie tak, aby uvarila po sebe dva steaky s použitím toho, čo už vieme?

Tretia: zmení sa hodnota premennej A po volaní vo funkcie UO.Print(Str(A)) vo funkcii Hracka_s_cislami?

Lekcia 5

...ak, tak potom, inak...

Riešenie domácich úloh:
Prvá – radšej si to celé dôkladne rozpíšeme aby to bolo krištáľovo jasné. A=2, B=3.47, C=4, D=5.2689

Najprv sa vypočíta pravá strana nasledujúceho príkazu:
B+C*D - B/A = 3.47 + 4 * 5.2689 - 3.47 / 2 = 24.5456 - 1.735 = 22.8106 ...a teraz sa táto hodnota priradí do A. A sa odteraz rovná 22.8106 a uz nie 2.

Teraz sa znova vypočíta pravá strana nasledujúceho príkazu
(B+C)*(D-B)/A = (3.47 + 4)*(5.2689 - 3.47) / 22.8106 = 13.437783/22.8106 = 0.58910256635073167737806107686777 ...a teraz sa táto hodnota priradí do A. Akurát, že nie úplne presne. Je to iracionálne číslo a tak ako kalkulačka nevie napísať nekonečný výpis čísla, tak to nevie ani počítač. Preto sa hodnota A oreže a zaokrúhli.

Nakoniec teda hodnota A je približne 0.5891 a ostatné premenné ostali nezmenené. Vypísať ich môžte takto:

UO.Print(Str(A))
UO.Print(Str(B))
UO.Print(Str(C))
UO.Print(Str(D))

Druhá - riešenie môže byť napríklad nasledujúce:

Sub primitivne_varenie()

     Var maso
     maso='0x09F1'
     UO.Usetype(maso)
     UO.WaitTargetObject('lasttarget')
     Wait(3500)
     UO.Usetype(maso)
     UO.WaitTargetObject('lasttarget')
Endsub

Tretia - tým, že takto použijeme Str sa nezmení, zmenila by sa keby sme niekde v kóde napísali A=Str(A). Vtedy by sa A zmenilo z čísla na reťazec znakov reprezentujúcich toto číslo. Už by s ním nešlo počítať, bol by to len "nápis" 0.5891.

Späť k téme. Logicky nastáva otázka - no dobre, a čo keď chcem aby skript kopal len v bani? Čo ak to chcem riadiť podľa toho čo sa deje v hre? Kľúč odpovedi je slovo riadiť. Každý normálny skriptovací jazyk má úplne základné kľúčové slová pre riadenie algorytmu. Prvá skupina je na Podmienky a druhá na Cykly. Dnes o tých prvých.

Podmienka je taká časť kódu funkcie, ktorá sa vykoná len ak je "niečo" pravda, ak "niečo" práve teraz platí, ak je "niečo" splnené. Príkaz alebo ak chcete zápis takej podmienky má presnú konštrukciu. Najprv len pre vysvetlenie takto schematicky:
AK "niečo je pravda" POTOM "urob to a to" KONIEC. Alebo druhá základná možnosť: AK "niečo je pravda" POTOM "urob to a to" INAK "urob niečo iné" KONIEC.
V prvom prípade logicky, ak niečo práve vtedy nie je pravda, tak je rovno koniec a telo podmienky nič neurobí. V druhom prípade, sa vždy vykoná práve jedna z dvoch možností, urobí sa to a to alebo sa urobí niečo iné. Nikdy nie obidve a nikdy nie žiadna.

Podmienky sa píšu s anglickými kľúčovými slovami IF, THEN, ELSE, a ENDIF. Znovu pripomeniem - je to kľúčové slovo, takže funguje aj If, if, iF, Then, THeN, tHEN, else, elsE, EnDiF... a všetky ostatné kombinácie EMO hlúpostí. Takisto sú celkom nápomocné klúčové slová AND a OR. Teraz by som mohol v krátkosti spomenúť, ako podmienka zistí, či je niečo pravda. Na to používa reprezentáciu cez číselné hodnoty. Nula je nepravda = FALSE, zatiať čo akékoľvek nenulové číslo (1, 5, alebo 100) je pravda = TRUE. To "niečo" v konštrukcii podmienky je vždy hodnota, buď premennej alebo vrátená od nejakej funkcie. Ja viem, ide z toho hlava prasknúť. Tak skúsime príklady, hádam to bude jasnejšie:

SUB Lekcia_5_podmienka1()

     IF UO.inJournal("AFK kontrola") THEN
          UO.Print("VSTAAAAAAAAAAAAAVAAAAAAAAAAAAAAAAAJ JEEEEEEEEEEEEEE TUUUUUUUUUUUUUUUUUUUU GM")
	  UO.DeleteJournal()
     ENDIF
ENDSUB

Keď spustíte túto funkciu, tak sa UO.inJournal pozrie do žurnálu, či tam vidí niekde nápis "AFK kontrola". Ak vidí, vráti 1, ak nevidí, vráti 0. Podľa toho naša podmienka zareaguje a vypíše do žurnálu to nenápadné upozornenie alebo ho nevypíše. V prvom prípade ešte po sebe zmaže celý žurnál. V druhom prípade už neurobí nič a funkcia sa ukončí. Problém je, že to urobí len raz, vtedy keď ju spustíte.

Poznámka - injection si celý čas uchováva kópiu žurnálu a vždy, keď ho zmažete pomocou UO.DeleteJournal(), tak sa zmaže len jeho kópia, nie to, čo vidíte v hre. Injection pritom hľadá pomocou UO.inJournal len vo svojej kópii ale v celej, nie len poslednú vetu. To je dobré na množstvo vecí. Keby ste to nemazali, inject by hľadal v riadnej histórii.

Ďaľší príklad:

SUB Lekcia_5_podmienka2()

     IF UO.inJournal("AFK") OR UO.inJournal("afk") OR UO.inJournal("GM") OR UO.inJournal("Stin") OR UO.inJournal("Mandos") OR UO.inJournal("Cerna Vdova") THEN
          UO.Print("VSTAVAJ JE TU GM")
	  UO.DeleteJournal()
     ENDIF
ENDSUB

Rozdiel je len v tom, že sme použili slovo OR - teda alebo. Stačí, že jedna z tých podmienok bude splnená a podmienka sa spustí

Ďaľší príklad:

SUB Lekcia_5_podmienka3()

     IF UO.inJournal("AFK") OR UO.inJournal("afk") OR UO.inJournal("GM") AND UO.inJournal("Stin") AND UO.inJournal("Mandos") AND UO.inJournal("Cerna Vdova") THEN
          UO.Print("VSTAVAJ JE TU GM")
	  UO.DeleteJournal()
     ENDIF
ENDSUB

Tuto máme už aj AND a naša podmienka sa preto spustí len ak sa vyskytne niekde slovo AFK alebo afk alebo ak prídu všetci GM Stin, GM Mandos aj GM Cerna Vdova. Stačí aby si jeden z nich zmenil meno a je to v kýbli. Nevravím, že je to realistický príklad, ale nejaký musel byť.

Ďaľší príklad:

SUB Lekcia_5_podmienka4()

     IF UO.inJournal("AFK") THEN
          UO.Print("VSTAVAJ JE TU GM")
	  UO.DeleteJournal()
     ELSE
	  Uo.Print("Klud, nikto nikde")
	  UO.DeleteJournal()
     ENDIF

ENDSUB

Je dúfam jasné, že takáto funkcia vypíše buď jedno, alebo druhé.

Tieto podmienky môžme aj zreťazovať, podobne ako funkcie:

SUB Lekcia_5_podmienka5()

     IF UO.inJournal("AFK") THEN
          UO.Print("VSTAVAJ JE TU GM")
	  UO.DeleteJournal()
     ELSE
	  IF UO.inJournal("Jsi tu?") THEN
               UO.Print("Vstavaj niekto ta hlada")
               UO.DeleteJournal()
	  ELSE
	       Uo.Print("Klud, nikto nikde")
	       UO.DeleteJournal()
	  ENDIF
     ENDIF

ENDSUB

Takto si môžete byt istí, že sa vypíše práve jedna z týchto vecí. Takto možno pokračovať.

Všetky tieto funkcie sú len pre potreby tohto tutorialu, a nebudú fungovať ako afk monitor na Morii ale ani nikde inde. Na to sú strašne primitívne. Odporúčam prečítať si pravidlá, konkrétne piate všeobecné o AFK kontrole.

Domáca úloha - čo ak príde GM a povie AFk Kontrola, Jsi tu ? Čo spraví Lekcia_5_podmienka5()? A čo ak napíšeme len

IF THEN 
   UO.Print("VSTAVAJ JE TU GM")
ENDIF

Zlá a škodolibá bohyně 17:07, 22. 7. 2010 (Central Europe Daylight Time)

Súvisiace články