Kaip aš kūriau World Of Warcraft Botą
Trumpas video skirtas apžvelgti gan seną, tačiau asmeniškai įdomų projektą
Santrauka
Turinys
Kaip tai veikia
Norint, kad programa sugebėtų žaisti
žaidimą, pirmas žingsnis - ji turi sugebėt orientuotis erdvėje.
Šį tikslą galima pasiekti skaitant kompiuterio atmintį. Turint visus reikalingus duomenis, tereikia tik suprogramuoti veikimą
Atminties skaitymas
Kiekvienas žaidimas savo būseną saugo RAM (Random Access Memory). Ji turi dvi esmines savybes:
1) Žinant kokiu adresu saugomi norimi duomenys, juos galima pasiekti iš kitos programos
2) Žodis Random
reiškia, kad duomenys laikomi atsitiktine tvarka. Dedami ten, kur tuo metu laisva. Vadinasi radus vieną kartą, antrą kartą reiks ieškoti jau kitur. Vadinasi reikalingas algoritmas sugebantis tuos adresus atrasti kiekvieną kartą įjungus žaidimą.
Adresų atradimas
Adresus atrasti galima naudojantis Cheat Engine
programa (arba alternatyva atliekančia tą pačią funkciją). Paprasčiausia metodika - susirasti skaičių kuris yra pakankamai stabilus, bet jį lengva pakeisti. Pvz. Armor
, arba Max Hp
. Paieškom adreso turinčio skaičių kuris nusako dabartinį kiekį, tada tą kiekį pakeičiam (buff'o pagalba, arba pasikeičiant ginklą) ir tarp rezultatų paieškom dar kartą, jau ieškodami naujo kiekio. Tikėtina, kad teliks pora adresų1 ir jie abu rodys tinkamą skaičių. Nors RAM duomenys yra atsitiktinai išdėlioti, susieti duomenys guli
šalia, taigi radus vieną, jis yra savotiškas atskaitos taškas nuo kurio galima išskaičiuoti visus likusius duomenis.
Tiesa, konkrečiai World of Warcraft
atveju, yra nusistovėjusios metodikos tam pirminiam taškui rasti, bet idėja lieka ta pati visų kitų žaidimų atveju.
[1] Adresų yra pora, nes žaidėjo duomenys egzistuoja dvejose struktūrose. Pirma struktūra - visi žaidimo objektai, tarp kurių egzistuoja ir pats žaidėjas. Antra - konkrečiai esamo žaidėjo duomenys. Baziniams duomenims abi struktūros yra tinkamos.
Boto valdymas
Valdome labai paprastai - imituodami klaviatūros mygtukų paspaudimus. Su pasisukimu norimu kampu šiek tiek subtiliau, bet mano atveju suveikė labai paprasta metodika - atsisukti į konkretų tašką ir apsisukti 360 laipsnių, paskaičiuojant kiek tai trunka (World Of Warcraft
atveju turime krypties koordinatę, kas leidžia supaprastintai ir labai tiksliai tai išmatuoti). Žinant kiek laipsnių norima pasusikti, užtenka tiesiog atlikti seną gerą skaičiavimą kryžmai
žinomą dar iš mokyklos laikų.
Boto medžiojimo
algoritmas
Primityvus, bet efektyvus būdas yra taip vadinami Waypoint
. Padedame nematomus taškus, t.y. tiesiog išsisaugojame koordinates faile ir suprogramuojame, kad jeigu botas neturi ką veikti (nėra priešų trumpu atstumu) judėtų link kito taško. Taškus išdėstome ratu, taigi botas gali amžinai lakstyti tuo ratu ir žudyti viską, kas pasitaiko pakeliui.