Tibia Development Series #2

Status
Zamknięty.

Norbert

Forum friend
Przyjaciel forum
Dołączył
Listopad 8, 2009
Posty
1125
Liczba reakcji
31
Wiek
36
Witam.
Po ponad miesi?cznej przerwie postanowi?em napisa? drug? cz??? "Tibia Development Series". Pomimo stosunkowo ma?ego zainteresowania projektem wierz? w to, ?e chocia? jedna osoba wyniesie co? z tego kursu i rozpocznie przygod? z programowaniem bot?w co b?dzie dla mnie powodem do dumy.
W pierwszym odcinku zaprezentowa?em techniki odczytywania i zapisywania pami?ci. Maj?c ju? takie podstawy mo?emy zaj?? si? pisaniem prostego makra.

Logika pisania prostego makra do Tibii.

1. Cel zadania

Celem naszego zadania b?dzie napisanie prostego makra edytuj?cego nasz wygl?d, ?wiat?o i kilka innych rzeczy, kt?re po zapoznaniu si? z tekstem b?dziecie mogli sami napisa?.
Oczywi?cie bez podstawowej wiedzy odno?nie programowania w jakimkolwiek j?zyku nie ma mowy o powodzeniu dlatego te? ludzie, kt?rzy nie wiedz? czym s? wska?niki czy te? maja problemy z poprawnym skompilowaniem gotowego kodu powinni wyj?? na podw?rko i pobawi? si? w dragon balla, ich czas jeszcze nie nadszed? ;)

2. Narz?dzia

Standardowo b?dziemy potrzebowali Cheat Engine
Cheat Engine 5.5 - Download

Pos?u?ymy si? r?wnie? projektem TibiaApi, kt?ry zawiera adresy wszystkich wa?nych funkcji, struktur i zmiennych w Tibii.

TibiaApi - Browse Code

Wybieraj?c zak?adk? "Addresses" b?dziemy mogli zobaczy? wszystkie aktualne adresy, kt?rych potrzebujemy.
Chocia? moim zdaniem TibiaApi jest nieudanym projektem dzi?ki, kt?remu ograniczone umys?owo dzieci neo lansuj? si? swoimi "botami" je?eli si? go dobrze wykorzysta mo?na si? wiele nauczy?.

3. Teoria

Naszym pierwszym celem b?dzie zmiana wygl?du naszej postaci.
Gdzie powinni?my zacz???

Tibia posiada pewn? struktur?, kt?ra odpowiada za w?a?ciwo?ci ka?dej postaci jak? widzimy b?d? widzieli?my na ekranie.

Potocznie przyj??o si?, ?e tablica z?o?ona z takich struktur nazywana jest Battle List?.
Ow? struktur? nazwiemy sobie.

Kod:
TCreature

B?dzie ona przechowywa? pewne informacj? o postaci niezale?nie czy jest to NPC, potw?r czy gracz. S? to cechy wsp?lne takie jak po?o?enie na mapie (x,y,z), nazwa, procentowa ilo?? HP, outfit i kilka innych rzeczy.

Kod:
type
  TCreature  = record
    ID: integer;
    NameBuffer: array [1..32] of char;
    x: integer;
    Y: integer;
    Z: integer;
    ScreenX: integer;
    ScreenY: integer;
    UnknowData1: array[1..20] of Byte;
    Walking: integer;
    Direction: integer;
    UnknowData2: array[1..12] of byte;
    Outfit: integer;
    HeadColor: integer;
    BodyColor: integer;
    LegsColor: integer;
    FeetColor: integer;
    Addons: integer;
    Light: integer;
    LightColor: integer;
    UnknowData3: integer;
    BlackSquare: integer;
    HPBar: integer;
    Speed: integer;
    Visible: integer;
    Skull: integer;
    Party: integer;
    UnknowData4: integer;
    UnknowData6: array[1..3] of byte;
    UnknowData7: integer;
  end;

Tak mniej wi?cej przedstawia si? budowa tej struktury. Pola UnknowData nie b?d? nas interesowa? gdy? nie s? one praktycznie wykorzystywane przy pisaniu bot?w. Zawarte s? tam informacje o tym czy mo?na przej?? przez dan? posta? albo czy znajduje si? ona w fazie wojny.

Battle Lista to nic innego jak tablica sk?adaj?ca si? w?a?nie z takich struktur. Rozmiar tej tablicy do pewnego wydania wynosi? 150 pozycji. P??niej jednak sta? si? on nie wystarczaj?cy i zosta? zmieniony na 250.
(rozmiar battle list jak i adres pocz?tku mo?emy znale?? w tibiaapi).

Tak wi?c na podstawie informacji, kt?re posiadamy mo?emy sobie wyobrazi? jak to wszystko wygl?da przed skompilowaniem.


Kod:
const
BattleListMaxCreatures = 250;

var
BattleList : array[0..BattleListMaxCreatures] of TCreature;

Adres pocz?tku Battle Listy to nic innego jak ID (zauwa?cie, ?e w strukturze TCreature ID jest pierwszym polem) pierwszej kreatury, kt?ra pojawia si? na ekranie po zalogowaniu. Czasami jest to nasza posta? a czasami kto? inny. Klient Wczytuje postacie bodaj?e od lewej strony widzianego ekranu do prawej i od g?rnych pi?ter do dolnych. Dlatego nie zawsze jeste?my na pierwszy miejscu.

Dla klienta 8.54 adres pocz?tku to:

Kod:
BattleListStart = $635F70;

Jak wi?c odszukamy nasz? pozycje na Battle List?
Mo?na to zrobi? na kilka sposob?w, naj?atwiejszym b?dzie por?wnanie ID.
Klient Tibii przechowuje ID naszej postaci w kilku miejscach. Jednym z tych miejsc jest Battle Lista.

Adres zmiennej, kt?ra przechowuje nasze ID to

Kod:
PlayerID = 635F10;

Wystarczy odczyta? nasze ID, przelecie? po Battle List i sprawdza? czy ID kreatury nie r?wna si? naszemu ID. Je?eli tak si? stanie znajdziemy nasz? pozycj?.

Przy odczytywaniu Battle List b?dziemy pos?ugiwa? si? offsetami. S? to odleg?o?ci od pocz?tku struktury do danego pola. ID jest pierwszym polem dlatego offset (odleg?o??) od pocz?tku struktury b?dzie wynosi?a 0. Jako, ?e ID ma typ integer (4 bajty) tak wi?c kolejne pole b?dzie mia?o offset 4.
Znaj?c wi?c offsety (kt?re mo?emy sobie wyliczy?), pocz?tek Battle List oraz pozycje naszej postaci mo?emy odczyta? sobie wszystkie potrzebne informacje za pomoc? nieskomplikowanych dzia?a? matematycznych.

Za???my, ?e nasza pozycja na Battle List to 3. Czyli przed nami s? jeszcze 2 kreatury. Rozmiar ca?ej struktury wynosi 168 bajt?w (wiemy to po zsumowaniu rozmiar?w wszystkich p?l struktury TCreature). Tak wi?c pocz?tek struktury odpowiadaj?cej naszej postaci na Battle List mo?emy wyliczy? w nast?puj?cy spos?b

Kod:
BattleListStart + (168 * 3)
BattleListStart - adres pocz?tku Battle List
168 - rozmiar struktury TCreature
3 - nasza pozycja na Battle List

Odczytuj?c 4 bajty z tak uzyskanego adresu za pomoc? funkcji readprocessmemory o kt?rej mowa by?a w pierwszej cz??ci kursu dostaniemy ID naszej postaci.

Mamy ju? wszystko co b?dzie nam potrzebne do znalezienia naszej pozycji na Battle List, do dzie?a!

Kod:
function FindBLPosition(): byte;
var
i : integer;
ID : integer;
blID : integer;
adr : integer;
NRB : cardinal;

begin
result := 0;
readprocessmemory(hProcess,ptr(PlayerID),@ID,4,NRB);

for i := 0 to 250 do
  begin
    adr := BattleListStart + 168*i;
    readprocessmemory(hProcess,ptr(adr ),@blID,4,NRB);
    
    if blID = ID then
      begin
        result := i;
        break;
      end;
  end;
end;

Prawda, ?e prosty kodzik?
Tak wi?c co musimy zrobi? aby odczyta? rodzaj outfitu naszej postaci? Na pocz?tku musimy znale?? nasz? pozycje na battle list. P??niej powinni?my obliczy? odleg?o?? pola odpowiadaj?cego za outfit od pocz?tku struktury.

Kod:
OutfitOffset = 96;
(liczy?em w g?owie na szybko wi?c mog?em si? pomyli?)

Teraz z prostego wzoru obliczamy adres naszego outfitu i odczytujemy warto?? zawart? w czterech bajtach.

Obliczanie adresu :

Kod:
BattleListStart + 168*BlPosition + OutfitOffset

BlPosition - nasza pozycja na Battle List, kt?ra znajdziemy za pomoc? funkcji FindBlPosition;

W ten spos?b mo?emy post?pi? z wszystkimi warto?ciami struktury TCreature, odczytuj?c i zapisuj?c informacje o dowolnej kreaturze, kt?ra widzieli?my b?d? widzimy na ekranie.

4. Implementacja

Podstawowe funkcje :

Kod:
function FindBLPosition(): byte;
var
i : integer;
ID : integer;
blID : integer;
adr : integer;
NRB : cardinal;

begin
result := 0;
readprocessmemory(hProcess,ptr(PlayerID),@ID,4,NRB);

for i := 0 to 250 do
  begin
    adr := BattleListStart + 168*i;
    readprocessmemory(hProcess,ptr(adr ),@blID,4,NRB);
    
    if blID = ID then
      begin
        result := i;
        break;
      end;
  end;
end;

Kod:
function GetOutfit(): integer;
var
blPos : byte;
adr : integer;
NRB : Cardinal;
begin

blPos := FindBLPosition;
adr := BattleListStart + 168*blPos + OutfitOffset;

readprocessmemory(hProcess, ptr(adr), @result, 4, NRB);

end;

Kod:
procedure SetOutfit(value : integer);
var
blPos : byte;
adr : integer;
NRB : Cardinal;
begin

blPos := FindBLPosition;
adr := BattleListStart + 168*blPos + OutfitOffset;

readprocessmemory(hProcess, ptr(adr), @value, 4, NRB);

end;

5. Podsumowanie

Oto schemat jakim powinni?cie kierowa? si? pisz?c swoje proste makro do Tibii.
Za pomoc? informacji, kt?re tu przedstawi?em mo?ecie ju? napisa? prostego bocika zawieraj?cego alarmy czy te? zmian? ?wiat?a. To jak wykorzystacie informacje z Battle List zale?y ju? tylko od was.
 
Odp: Tibia Development Series #2

To by?o jeszcze do?? ?atwe....
W ko?cu za du?o to nam to nie daje...
Mo?emy sobie stworzy? jedynie co? na wygl?d "Smoke", albo jaki? programik do Fake' ?w ;/

Ja sobie troch? te funkcje usprawni?em, abym m?g? odczyta? lub nadpisa? ?atwiej jaki? offset ;]
Kod:
//Get Offset
function GetOffSet(offset : integer): integer;
var
blPos : byte;
adr : integer;
  begin
    blPos := FindBLPos;
  adr := BattleListStart + 156*blPos + offset;
    result := ReadMemInteger(adr);
end;
//Get Offset
//Set Offset
procedure SetOffSet(value, offset : integer);
var
blPos : byte;
adr : integer;
    begin
      blPos := FindBLPos;
        adr := BattleListStart + 156*blPos + offset;
  MemWriteInteger(adr, value, 4);
end;
//Set Offset
Teraz m?g?by? napisa? jak zrobi? hmm...Rune Maker Albo ?owienie Rybek, ale daj?c wskaz?wki (np.teraz trzeba si? dowiedzie? jaki adres, itp.), a nie podaj?c gotowy kod - bo to raczej niczego nie nauczy no chyba ?e obs?ugi klawiszy: c,v,control.


---------------------------
Jakby kto? pr?bowa? tego dla tibi 7.6 to rozmiar struktury TCreature wynosi 156 ;)

Pozdro

Jak tu si? dzi?kuje za post?
 
Status
Zamknięty.
Back
Do góry