- 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.
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.
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.
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:
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
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
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!
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.
(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 :
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 :
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.
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)
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;
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.