No to fajnie, wiadomo już, że packet.dll pod 7.6 nie ma. W takim razie jak napisać swój packet.dll byle by tylko z najprostszą funkcją (by powiedział "exura").
Wersja do druku
No to fajnie, wiadomo już, że packet.dll pod 7.6 nie ma. W takim razie jak napisać swój packet.dll byle by tylko z najprostszą funkcją (by powiedział "exura").
Pakiet.dll jest pod tibie 7.6 a mpa bot ?
Ogólnie to wysyłanie pakietów do tibi 7.6 rożni się trochę od wysyłania do nowszych wersji.I dlatego mam pytanie:
Kto wie jak odpowiednio zmienić procedurę send packet pod tibie 7.6 ?
Wie tylko tyle ze tibia 7.6 nie koduje pakietów przez Xtea
Cos odemnie.
Ktos napisal moze juz Cave Bota pod Delphiego? ;xx
Co to za pokeball?
Odnośnie pytania o packet.dll to napisac można pod assemblerem, każda wersja packet.dll różni się niewiele (adresami z tego co pamiętam). Sciagnij źródła packet.dll i ogarnij sobie starsze adresy (napewno XTea jest potrzebny).
@Up
To Pokemon Online OTS
@Shothic
TProgramming Forums - tam masz rozne adresy + packet.dll tylko trzeba odpowiednio poszukac.
Btw. packet.dll mozesz wziasc z innego bota pod 7.6 z tego co wiem.
a ja mam pytanie , czy terazniejszy system tibi "anty bot" nie wykryje czasami naszego programu ? i ewentualnie od razu prosil bym o wyjasnienie na jakiej zasadzie oni dowiaduja sie ze ktos uzywa bota :)
Ps mam pytanie odnosnie tej Battle listy , nie rozumiem tego co to jest ta battle lista i z czym to sie je , ewentualnie na jakiej zasadzie sa obliczane te numery np to:
Experience = $635F04;
Im_Attackin= Experience-40;
Player_Level= Experience-4;
Player_CurrentHP= Experience+8;
Player_Mana= Experience-20;
Player_MagicLevel= Experience-8;
Player_Percent_MagicLevel= Experience-16;
Player_MaxHP= Experience+4;
skad akurat wie ze Im tacking bedzie -40 ? chyba nie strzelal ?
hp / mp itp jestem w stanie wyczytac z tsearchera , bo wystarczy ze jak spada mi hp to tam sie zmieniaja dane , ale jak mam odczytac pozycje np , swojego mięsa w plecaku ? badz wędki na pasku albo cos w tym stylu ?
tak samo jak odczytac nick postaci , co nam da ze bedziemy wiedziec jakie miejsce mamy na battle liscie ?
function pozycja:integer;
var
i,id_battle,id:integer;
begin
id:=readmeminteger(Player_id); //odczytanie naszego id z adresu
for i:=1 to 149 do //przeszukanie wszystkich pozycji na battle list (minimalna 1 maxymanlna 149
Begin
id_battle:=Readmeminteger(Battlelist_start + (i*160)-4); //czytanie id z pozycji
if id_battle=ID then //jezeli id z battle list zgadza sie z id z adresu
Begin
Result :=i; //wtedy wynikiem funkcji jest nasza pozycja na battle
exit;
end;
end;
end;
Jak odczytac 1 miejsce w battleliscie mam :
BLStart = $4A12AC
BattleMin=$4A12A0
BattleMax=$4A129C
na tprogramming nie mogę nic znajść.
a ta funkcjia cos nie działa
id := MemReadInt(address+i*156);
Ludzie to jest nieaktualne -.-
Obecnie battle lista ma rozmiar 168 a nie 160.
Pozycja
Odczytanie nicku:Kod:function pozycja:integer;
var
i,id_battle,id:integer;
begin
id:=readMemInteger(PlayerID);
for i:=1 to 250 do
begin
id_battle:=readMemInteger(BattlelistStart + (i*168));
if id_battle=ID then
begin
Result :=i;
exit;
end;
end;
end;
To też wam się przyda:Kod:MemReadString(BattlelistStart+pozycja*168+4)
Wszystko na 8.54.Kod:BattlelistStart = $635F70;
BattlelistEnd = $63BD30;
PlayerID = $635F10;
Teraz możecie mi dziękować :)
a powiedz mi co mi po pozycji na battle liscie ? bo mam w programie i tu w poradniku byla opcja do wyszukiwania wlasnej pozycji na battle liscie ? i nie rozumiem co mi to daje ? i tak samo nie rozumiem do czego sluzy poczatek battle listy i koniec , co sie tam w niej miesci
Yaboo wszystko wytłumaczył w poradniku. Nobo np. twój outfit nie jest zapisany pod jakiś konkretnym adresem tylko na którejś pozycji na battleliście.
czyli ma sie rozumiec ze kazda pozycja w grze nie ma swojego adresu ?
bo ja wczesniej myslalem , ze kazda pozycja w tibi ma swoj adres a ta battle lista jest tylko pomocnicza , zeby ominac ten adres.
w takim badz razie jak odpowiednio przeszukac battle liste zeby uzyskac numer outfitu , i od jakiego adresu mierzyc odleglosc
Nie nie nie. Np. hp masz zapisane pod jakimś stałym adresem. To samo z Levelem i maną. Ale np. Nick, outfit, addony, światło (kolor itp) NIE są zapisane pod jakimiś adresami (cały czas się zmieniają) tylko na BattleLiście. I wyobraź sobie, że masz:
Coś takiego.Kod:|-------------------|
tam gdzie masz dane sa zapisane różne potwory i gracze. czyliKod:|początek battlelisty - Dane - koniec|
Ale może być też takKod:|początek - Twoj char - dane twojego chara - Dragon - dane o dragu - elf scout - dane o elfie - koniec battlelisty|
I dane maja na 8.54 rozmiar 168. Pod kazdym takim "klockiem" (1 - 168 czyli masz 168 klockow) masz cos zapisane np. nick, outfit itp. Ale klocki maja rozne rozmiary, jeden ma 4, drugi 2, inny zas 8 bo np. zeby zapisac kolor swiatla wystarcza 2 klocki a zeby zapisac nick np 8. Nie wiem czy dobrze mowie jesli cos to wytykac palcami. Anyways jesli odczytasz swoj nick z jakiegos adresu i na battleliste wejdzie ci dragon to adres z twoim nickiem sie zmieni.Kod:|początek - Dragon - dane o dragu - Twoj char - dane twojego chara - elf scout - dane o elfie - koniec battlelisty|
Understand?
no dobra to rozumiem teraz powiedz mi skad mam wiedziec jak pozyskac numer np "blank runy" od jakiego adresu i co mam odjac , skad mam to wiedziec , skad wiedziec z jakiego adresu i z jaka wartoscia odejmowac od danych rzeczy. bo hp mp i cos co jest zwiazane z liczbami jest latwo znalesc , a jak znalesc rzeczy ktore nie maja liczb ? np tak jak pisalem wyrzej "blank rune"
okej a nastepna sprawa jest taka , ze jak juz znajde np adres od hp i teraz skad mam wiedziec np ze -30 to jest odczytanie czegos tam
Nie przypuszczałbym, że ktoś w ogóle czyta tego arta jeszcze, pisałem go za czasów gdy wydawało mi się, że potrafię programować. Dużo się w Tibii od tamtego czasu zmieniło.
Jeżeli nikt tego nie napisał to teraz rozmiar struktury "Creature" z której zbudowana jest battle lista wynosi 168 bajtów. Doszło kilka rzeczy takich jak informacja czy postać uczestniczy w wojnie albo czy można przez nią przejść.
wszystkie przedmioty w Tibii mają jakieś unikalne stałe ID. Istnieje wiele metod aby je sprawdzić ale na początek polecam polecam TibiaApi jako źródło informacji o adresach, przedmiotach i innych ciekawych rzeczach.
code.google.com/p/tibiaapi/source/browse/trunk/tibiaapi
Dodatkowo nie zaszkodziłaby przynajmniej podstawowa wiedza z zakresu engineeringu ;P
@Yaboomaster
To moze teraz cos o TibiaApi?
Dla leniwych:
code.google.com/p/tibiaapi/source/browse/trunk/tibiaapi
@Yaboo
Ale dobrze opisałem to z battlelistą? ;ddddd
Nawet dobrze, tyle tylko, że to klocki to nic innego jak pola w strukturze ^^
Ich różne rozmiary zależą od typów danych jakie przechowują.
Przykładowo ID to 4 bajty, czyli integer.
Nick to 32 bajty ponieważ tyle liter może mieć nazwa naszej postaci a każda litera to 1 bajt.
I z takich pól składa się struktura, a z 250 takich struktur ułożonych w tablicę składa się Battle List.
no wlasnie o to chodzi , nie chcialem isc na latwizne i czytac all z tibia.api , tylko po prostu wiedziec jak wyciagnac dane informacje , tyle pisalem a w dalszym ciagu nie uzyskalem jasnej odpowiedzi :/
moje pytania to :
1. jak wyciagnac adres blank runy , albo po prostu jak odmierzyc odleglosc , i od czego
2. w jaki sposob to skonwertowac , aby moc napisac z tego procedure ktora bedzie zakladala mi blank rune na miejsce reki.
zrobilem to co miales w poradniku (wpisujesz liczbe many i czar a on wpisuje ci to w grze) ale nie rozumiem tej procedury , jak skonwertowac juz wyciagniete te adresy z tej battle listy.
z tego co zrozumialem z tych wszystkich waszych wypowiedzi to to:
ze:
1. w tibi jest 168 pozycji na battle liscie , (nie wiem jakie to sa te elementy)
2. od kazdego elementu na tej battle liscie sa odmierzane odleglosci do odpowiednich itemow czy rzeczy czyt. np outfit chodzeni itp (nie wiem jakie odleglosci i od czego odejmowac , i w gruncie rzeczy jak przeszukac cala battle liste)
Rzeczy nie. Np. armor masz zapisany pod konkretnym adresem. I on się nie zmienia niezależnie od ilości potworów na battleliście itp (tylko po update ale to wszystkie adresy się zmieniają)
Jeśli blankę masz w prawej ręce wtedy będzie to adres prawej ręki. Kiedy zamienisz blankę z np. crimson swordem wtedy pod tym adresem będzie crimson sword (jego wartość się zmieni). Adres będzie ten sam. Jeśli chodzi Ci o runemakera to musisz bawić się w pakiety. Sorry ale tego jeszcze sam nie pojąłem xdd
@Yaboo
Aby wysłać dowolny pakiet, trzeba użyć packet.dll? Czy jest to po prostu gotowa biblioteka zawierająca gotowe funkcje?
Update plx?
@top
Muj boot ma jusz lajtchaka i adon czendżera!!11oneone
http://img37.imageshack.us/img37/4589/avibot.png
Na wysyłanie pakietów jest wiele sposób.
Oto kilka z nich
Stworzenie proxy
Wykorzystanie packet.dll (dość prymitywna metoda, chociaż do napisania tej biblioteki wymagana była niemała wiedza :P).
Dll Injection - skorzystanie z wewnętrznej funkcji Tibii, która wysyła pakiety
CreteRemotThread - zdalny wątek, który wykorzysta wewnętrzną funkcję Tibii do wysyłania pakietów
Hook na API
Moim zdaniem wysyłanie pakietów przy wykorzystaniu wewnętrznych funkcji klienta, jest najlepsze. Dlaczego?
Po pierwsze nie trzeba się męczyć z kodowaniem.
Po drugie, kiedyś istniała teoria, że puste bajty, które uzupełniały pakiet aby mógł być podzielny przez 8 (wymagane przez xtea), nie są do końca losowe.
Niedawno przyjrzałem się bliżej funkcji tworzącej pakiety i faktycznie okazało się, że te bajty nie są do końca takie losowe jak się wszystkim przedtem wydawało (czy jest to ten ich cały antyban?:>).
Jednak do skorzystania z tej funkcji do wysyłania pakietów trzeba znać chociaż podstawy asemblera i mieć jakąkolwiek wiedzę na temat procesów w Windowsie ;P
Yyy. A mógłbyś być tak uprzejmy i opisać resztę sposobów? :>
Pewnie bym mógł ale większą satysfakcją jest dojście to tego samemu ;]
Napisałeś kiedyś jakikolwiek program, który korzysta z socketów?
Wiesz cokolwiek na temat dll injection i o zakładaniu hooków?
Jeżeli nie to lepiej najpierw o tym trochę poczytaj, bo nie trudno jest zrobić program, którego się nie rozumie w oparciu o czyjeś źródło, trudniej jest coś takiego samemu napisać ;P
no ale jak pozyckac wlasnie numer TEJ REKI z chate engingn , jaki numer mam wpisac w tych kryteriach!!! chodzi mi tylko o to jak wyciagac poszczegolne adresy i ewentualnie odleglosci od odpowiedniej battle listy , do reszty dojde sam , tylko nie wiem co wpisac w kryteriach wyszukiwania jezeli chcem np odnalezc nick postaci , adres armora czy tym podobnych rzeczy , kiedy np exp mane hp sie latwo znajduje bo jest ona w integer , i wiadomo ze wystarczy liczbe wpisac
Wiedząc, że ID 1 gp jest równy = 3031, używając funkcji z Cheat Engine:
-Extract Value,
-Changed Value,
jesteś w stanie w 3-4 ruchach znaleźć Arrow Slota :) Teraz wymyśl jak to zrobić, a jak nie dasz rady, to może w przyszłości pojawi się spoil ;d (ale to już by było przykre...)
a jak pozyskac wlasnie ID gp ?
edit:
okej gp jeszcze wyciagne bo tam tez jest numer :)
a jak wyciagnac id blanki ?
edit , dobra wiem , wiem juz w sumie (tak mi sie wydaje) jak pozyskac numer np blank runy czy plecaka , teraz tylko powiedzcie mi
edit 2:
za jednym zamachem od razu powiedz jak wyciagnac id itemy ktory nie ma numeracji , takiej jak np gold czy inne rzeczy ktore mozna polaczyc ze soba, chodzi mi tu jak wyciagnac numer blank runy
i od razu opisz jak pozyskac potem za pomoca gp numer strzal
edit 3: no i mam problem :/ bp np tam jak daje "memory view" i w kryteriach wpisuje np wand of inferno ,to mi go znajduje , tylko np skad mam wiedziec jak ten komentarz ciagnie sie przez 3 nastepne kody , skad mam wiedziec ktory jest prawidlowy ? , wkleic linka nie moge zeby wam powiedziec o co dokladnie mi chodzi ;/ tak ps , po proboje moze blackd proxy bedzie latwiej wyciagnac , albo chociazby zrozumiec to (ps wie ktos jak pobrac wersje tego blackd free ?) bo niby jest napisane ze w free wersji jest ta opcja do znajdowania proxy , ale ta strona jest tak pojebana , ze nie wiem jak z tamtad sciagnac ta free wersje ; o bo ta co jest tu na forum dziala tylko do tibi 8.4 ?
Witam
ma taki problem z battle listą i z atakowaniem potworów
Adressy do 7.6
lengthCreature" value="156"
maxCreatures" value="150"
bl_start = $4A12AC
AttackedCreature" value="0x4A1214"
Funkcja czytająca z battle listy :
Button przypisujący wartość ataku z edit :Cytuj:
function IDByName(nickname : string): integer;
var
b :byte;
ID_szuk : string;
Begin
for B:=0 to 150 do
Begin
ID_szuk:=MemReadString($4A12AC + (B*156));
if (ID_szuk = nickname) and (MemReadSmallInt($4A12AC + (B*156) + 128) <> 0) then // czy widoczny potwór
Begin
Result := MemReadInt($4A12AC + (B*156) - 4);
exit;
End;
end;
end;
Cytuj:
procedure TForm1.Button1Click(Sender: TObject);
var
s:String;
begin
s := IntToStr(idbyname(edit1.Text));
MemWriteInt($4A1214, strtoint(s));
end;
Procedura atakująca :
Cytuj:
procedure AttackID;
var
buffer : Array[0..7] of Byte;
target : integer;
ProcessID: Cardinal;
begin
target := MemReadInt($4A1214);
GetWindowThreadProcessId(FindWindow('TibiaClient', Nil), @ProcessID);
buffer[0] := $05;
buffer[1] := $00;
buffer[2] := $A1;
CopyMemory(@Buffer[3],@target,4);
buffer[6] := $40;
SendPacket(ProcessID, @buffer);
end;
Wszystko jest dobrze gdy np. wpisze nick gracza albo swój
ale przy jakimś potworze jest tak ze czasami zaatakuje tylko wtedy gdy jest jeden i pierwszy raz atakowany,
a potem to wogule nic ,nie szuka następnych tylko cały czas jest ta sama wartość.
Wie ktoś czemu tak jest?
@Yaboo
Wiesz moze jak wczytac plik za pomoca OpneDialog oraz jak go zapisac z ListBox?
Witam serdecznie
Mam pytanie odnośnie wyciągania adresów. Wiem jak, np wyciągnąć adres loginu/hasła , niestety nie wiem skąd wziąć przykładowo adres, gdzie jest zapisana ilość many/życia. Prosiłbym o pomoc.
Pozdrawiam, Arek.
Masz 150 życia. Szukasz 4 bajtowej wartości 150. Dostajesz hita - masz 146. W poprzednich wynikach szukasz wartości 146. I tak tak długo, aż zostanie Ci 1 lub max. kilka wyników. Potem zmieniasz każdy z nich aby odkryć który/upewnić się czy wynik to ta cyferka hp na ekranie.
Witam
Robiłem wszystko od początku według instrukcji i jak skompilowałem wystąpiły takie błędy:
ht tp://img35.imageshack.us/img35/7614/delphij.png
Proszę o pomoc.
Kurs Delphi
Program używa 5 labeli - stwórz je.
Ponadto ostatni end nie powinien kończyć się średnikiem, a kropką.
Teraz już zrozumiałem,zrobiłem wszystko według 1 części instrukcji.Ale bot nie chce odczytywać levelu itp. tylko pokazuje sie coś takiego:
htt p://img526.imageshack.us/img526/5080/delphifail.png
Prosze o poomoc.
Ten "artykuł" to moja największa życiowa porażka ;d
Weźcie się ludzie najpierw za podstawy delphi albo jakiegokolwiek inne języka a dopiero później za pisanie botów :)
Napisalem aplikacje w Delphi, ktora sama za nas dodaje wpt pod Tibie 8.54.
He, mysle ze sie przyda.
Domyslnie dodaje na 'S' czyli South
Pierw 'Enblade' pozniej 'Learn On'
i45.tinypic.com/x2o2g7.png
i49.tinypic.com/344cea1.png
speedyshare.com/files/20636679/Elf.exe
I skan
virustotal.com/pl/analisis/3e30b1d0c206d0c2fec4794c7d2785b672f0e907c2877d8730 47c687abd7a1d3-1264793166
Wiem,że źle sie za to biore ale ma ktoś adresy pamięci do Tibi 8.54?
I jak je wstawić w WriteProcessMemory.
Plz to ważne.
@Up
Czytales 1 post w tym temacie? -.-
Chyba jednak nie... Wiec preferuje abys zaczol od 1 postu krok, po kroku a dojdziesz do tego co chcesz...
Masz adresy...Cytuj:
const
//adresy postaci
Player_Experience = $635F04;
Player_Fist = Player_Experience - 76;
Player_Club = Player_Experience - 72;
Player_Sword = Player_Experience - 68;
Player_Axe = Player_Experience - 64;
Player_Distance = Player_Experience - 60;
Player_Shielding = Player_Experience - 56;
Player_Fishing = Player_Experience - 52;
Player_Cap = Player_Experience - 36;
Player_Stamina = Player_Experience - 32;
Player_Soul = Player_Experience - 28;
Player_ManaMax = Player_Experience - 24;
Player_Mana = Player_Experience - 20;
Player_MagicLevel = Player_Experience - 8;
Player_Level = Player_Experience - 4;
Player_HpMax = Player_Experience + 4;
Player_Hp = Player_Experience + 8;
Player_ID = Player_Experience + 12;
//Perc
Player_ClubPerc = Player_Experience - 100;
Player_SwordPerc = Player_Experience - 96;
Player_AxePerc = Player_Experience - 92;
Player_DistancePerc = Player_Experience - 88;
Player_ShieldingPerc = Player_Experience - 84;
Player_FishingPerc = Player_Experience - 80;
Player_MagicLevelPerc = Player_Experience - 16;
Player_LevelPerc = Player_Experience - 12;
//Perc
//Różne
Framerate = $630B34;
StepCreatures = $A8;
MaxCreatures = 250;
BATTLELIST_START = $635F70;
BATTLELIST_END = BATTLELIST_START + (StepCreatures * MaxCreatures);
Connection = $792E50; //8 - tak, 0 - nie
Map = $64A048;
//Pos
Z = $645530;
Y = Z + 4;
X = Z + 8;
//koniec - adresy postaci
//disant
Distance_ID= 0;
Distance_Type = 3;
Distance_Name= 4;
Distance_X = 36;
Distance_Y = 40;
Distance_Z = 44;
Distance_HorizScreenOffset = 48;
Distance_VertScreenOffset = 52;
Distance_Chameleon = 60;
Distance_Chameleon2 = 92;
Distance_IsWalking = 76;
Distance_Direction = 80;
Distance_Outfit = 96;
Distance_OutfitHead = 100;
Distance_OutfitBody = 104;
Distance_OutfitLegs = 108;
Distance_OutfitFeet = 112;
Distance_OutfitAddon = 116;
Distance_BlackSquare = 132;
Distance_HP = 136;
Distance_WalkSpeed = 140;
Distance_IsVisible = 144;
Distance_Skull = 148;
Distance_Party = 152;
Distance_Between_Chars = 168;
DISTANCE_LIGHT = $74;
DISTANCE_LIGHTCOLOR = $78;
//distant
A tu moje drogie napki coś dla was ale adresy musicie sami uzupełnić
Ja tam teraz wole Vb.net pozdro jak się zna delphi to nie jest problemem a programy są chyba szybszeKod:unit Tibia;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Menus, OleCtrls, Math;
type
TChar = record
ID,X,Y,Z,Speed: Integer;
Moving,Dir,Outfit,Head,Body,Legs,Feet,Addon,Light,Light_Color,HPBar,Visible,Skull,Party,BL:Byte;
Found: Boolean;
Name:String;
end;
type
TPos = record
X,Y,Z,Tile,Stack: Integer;
end;
type
TStatus = record
Battle,Haste,Paralyze,MShield,Drunk,Energy,Fire,Poison:Boolean
end;
type
TItem = record
ID,X,Y,Z: Integer;
Count, BP, Slot: Byte;
Found: Boolean;
end;
var
Map_Start:Integer;
THandle:HWND;
IDProcess,NBR,PID:cardinal;
Gold:TItem;
Player:TChar;
Target:TChar;
SD:TItem;
UH:TItem;
MF:TItem;
MW:TItem;
SSA:TItem;
Levelspied:Boolean;
const
//Runes
SD_ID = 3155;
UH_ID = 3160;
MF_ID = 2874;
SSA_ID = 3081;
MW_ID = 3180;
//Target
Target_ID = $60EA9C;
Target_Type = $60DA9F;
Follow_ID = $60EA98;
//BattleList
Player_ID = $60EAD0;
BattleList_Start = $46A30;
BL_Dist_ID = 0;
BL_Dist_Name = 4;
BL_Dist_X = 36;
BL_Dist_Y = 40;
BL_Dist_Z = 44;
BL_Dist_Moving = 76;
BL_Dist_Dir = 80;
BL_Dist_Outfit = 96;
BL_Dist_Head = 100;
BL_Dist_Body = 104;
BL_Dist_Legs = 108;
BL_Dist_Feet = 112;
BL_Dist_Addon = 116;
BL_Dist_Light = 74;
BL_Dist_Light_Color = 78;
BL_Dist_HPBar = 136;
BL_Dist_Speed = 140;
BL_Dist_Visible = 144;
BL_Dist_Skull = 148;
BL_Dist_Party = 152;
BL_Size = 160;
BL_Max = 150;
//Status
Status_Text = $5EFD98;
Status_Time = $5EFD94;
//BP
BackPack_Start = $617000;
BP_Dist_Open = 0;
BP_Dist_Icon = 4;
BP_Dist_Name = 16;
BP_Dist_Size = 48;
BP_Dist_Items = 56;
BP_Dist_Item = 60;
BP_Dist_Item_Amount = 64;
BP_Size = 492;
BP_Item_Size = 12;
BP_Max = 16;
//Map
Map_Pointer = $61E408;
Map_Dist_TileID = 4;
Map_Dist_Count = 0;
Map_Dist_ItemID = 0;
Map_Dist_ItemData = 4;
Map_Dist_Item = 12;
Map_Size = 172;
Map_Max = 2015;
//Self
Look_ID = $766EA0;
Player_HP = $49A014;
Player_MP = $499FF8;
Player_LVL = $49A008;
Player_XP = $49A00C;
Player_Neck = $616F94;
Player_Right = $616FB8;
Player_Status = $60EA58;
//Namespy
Nop = 37008;
Namespy_1 = $4DD2D7;
Namespy_2 = $4DD2E1;
Namespy_1_Default = 19573;
Namespy_2_Default = 17013;
Levelspy_Above = $4C431C;
Levelspy_Above_Default = 7;
Levelspy_Below = $4C4324;
Levelspy_Below_Default = 2;
Levelspy_Nop = $4C4320;
Levelspy_Nop_Default = 49451;
Levelspy_Max = 7;
Levelspy_Min = 0;
RSA='1091201329673994292788609605089955415282375029027981291234687579372662914925764463307396960011106039'+
'0723088861007265581882535850342905759282762943641310856602909362821263595383668656267584972062078627'+
'9431090218017681061521755056710823876476444260558147179707119674283982419152118103759076030616683978'+
'566631413';
RsaAdr = $593610;
IPFirst = $5e8908;
IPFirst1= $5e8978;
IPFirst2= $5e89e8;
IPFirst3= $5e8a58;
procedure SendPacket(ProcessID: Cardinal; Packet: Pointer; Encrypt: Boolean; SafeArray: Boolean); stdcall; external 'packet.dll';
procedure WriteMemStr(Address: Integer; Value:String);
function ReadMemStr(Address: Integer): String;
procedure WriteMemInt(Address: Integer; Value: Integer);
function ReadMemInt(Address: Integer): Integer;
procedure WriteMemByte(Address: Integer; Value: Byte);
procedure WriteMemBytes(Address: Integer; Value: Integer; Bytes: Integer);
function ReadMemByte(Address: Integer): Byte;
Procedure Hook;
Function FindPlayerByID(TPlayer:TChar) : TChar;
Function FindPlayerByName(TPlayer:TChar) : TChar;
Procedure Light(Strength:Byte; Color:Byte);
Procedure WhiteText(Text:String);
procedure Packet_Shoot_XYZ(Rune:TItem; Target:TChar; Tile:TPos);
procedure Packet_Say(Text: String; SoundType: Integer);
Function FindItem(TIT:TItem): TItem;
Procedure Attack(TPlayer:TChar);
procedure Packet_Target(TPlayer:TChar);
Function Map_GetAdr: Integer;
procedure Packet_Stop;
Function Map_GetPlayerTile(MapStart:Integer;TPlayer:TChar): Integer;
Function Map_GetTileID(MapStart:Integer; Pos:TPos):TPos;
Function GetHP: Integer;
Function GetMP: Integer;
Procedure Namespy(Enabled:Boolean);
procedure Packet_Use(Item:TItem);
procedure Packet_Shoot_Rune(Rune:TItem; Target:TChar);
Procedure LevelSpyToggle(Player:TChar; Enabled:Boolean);
Procedure Packet_Move(Dir: Char);
Procedure LevelSpy(Player:TChar; Up:Boolean);
Procedure Packet_ContainerToGround(Item:TItem; Pos:TPos);
function GetStatus: TStatus;
Function Map_GetXYZ(Tile:Integer):TPos;
Function Map_AddX(TTile:TPos;Value:Integer):TPos;
Function Map_AddY(TTile:TPos;Value:Integer):TPos;
function HealParty(Health:Integer; UH:TItem):String;
procedure Packet_Move_Item(Item:TItem;Slot:Integer);
function Map_NewTileNr(TTile:TPos):TPos;
function Exp: Integer;
procedure ChangeIP(IP:String);
implementation
procedure WriteMemStr(Address: Integer; Value:String);
var
TVal : Byte;
i: integer;
begin
for i:=1 to Length(Value) do
begin
TVal:=ord(Value[i]);
WriteProcessMemory(IDProcess, Ptr(Address+i-1),@TVal,1,NBR);
if i = Length(Value) then
begin
TVal:=0;
WriteProcessMemory(IDPRocess, Ptr(Address+i),@TVal,1,NBR);
end;
end;
end;
function MemReadString(Address: Integer): String;
var
NB : LongWord;
Temp : ARRAY [1..255] OF Byte;
I : Byte;
IDProcess, proc_ID : Cardinal;
begin
GetWindowThreadProcessID(FindWindow('TibiaClient', nil), @proc_ID);
IDProcess := OpenProcess(PROCESS_ALL_ACCESS, false, proc_ID);
Result := '';
ReadProcessMemory(IDProcess, Ptr(Address), @Temp[1], 255, NB);
for I := 1 to 255 do
begin
if ((Temp[i] = 0) or (Temp[i] = $0F)) then
Break;
Result := Result + Chr(Temp[i]);
end;
end;
procedure WriteMemInt(Address: Integer; Value: Integer);
begin
WriteProcessMemory(IDProcess, Ptr(Address), @Value, 4, NBR);
end;
function ReadMemInt(Address: Integer): Integer;
var
value:integer;
begin
ReadProcessMemory(IDProcess, Ptr(Address), @Value, 4, NBR);
Result:=value;
end;
procedure WriteMemByte(Address: Integer; Value: Byte);
begin
WriteProcessMemory(IDProcess, Ptr(Address), @Value, 1, NBR);
end;
procedure WriteMemBytes(Address: Integer; Value: Integer; Bytes: Integer);
begin
WriteProcessMemory(IDProcess, Ptr(Address), @Value, Bytes, NBR);
end;
function ReadMemByte(Address: Integer): Byte;
var
value:integer;
begin
ReadProcessMemory(IDProcess, Ptr(Address), @Value, 1, NBR);
Result:=value;
end;
Procedure Hook;
begin
Thandle := FindWindow('TibiaClient', nil);
GetWindowThreadProcessID(Thandle, @PID);
IDProcess := OpenProcess(PROCESS_ALL_ACCESS, false, PID);
end;
Procedure Packet_Move(Dir: Char);
var
Buffer: array [0..255] of Byte;
begin
Case Dir of
'N': Begin
Buffer[2] :=$65;
end;
'S': Begin
Buffer[2] :=$67;
end;
'E': Begin
Buffer[2] :=$66;
end;
'W': Begin
Buffer[2] :=$68;
end;
end;
Buffer[0] :=$01;
Buffer[1] :=$00;
SendPacket(PID, @buffer, TRUE, FALSE);
end;
procedure Packet_Say(Text: String; SoundType: Integer);
//Say Something
var
Buffer: array [0..255] of Byte;
begin
Buffer[0] := Byte(Length(Text) + 4);
Buffer[1] := $00;
Buffer[2] := $96;
Buffer[3] := SoundType;
Buffer[4] := Length(Text);
Buffer[5] := $00;
CopyMemory(@Buffer[6], @Text[1], Length(Text));
SendPacket(PID, @buffer, TRUE, FALSE);
end;
procedure Packet_Shoot_Rune(Rune:TItem; Target:TChar);
//Shoots Rune
var
buffer : Array[0..14] of Byte;
begin
buffer[0] := $0D;
buffer[1] := $00;
buffer[2] := $84;
buffer[3] := $FF;
buffer[4] := $FF;
buffer[5] := $00;
buffer[6] := $00;
buffer[7] := $00;
buffer[8] := Lo(Rune.ID);
buffer[9] := Hi(Rune.ID);
buffer[10] := $00;
CopyMemory(@Buffer[11],@Target.ID,4);
if Rune.ID = MF_ID then buffer[10] := $0A;
SendPacket(PID, @buffer, TRUE, FALSE);
end;
procedure Packet_Shoot_XYZ(Rune:TItem; Target:TChar; Tile:TPos);
var
buffer : Array[0..18] of Byte;
begin
buffer[0] := $11;
buffer[1] := $00;
buffer[2] := $83;
buffer[3] := $FF;
buffer[4] := $FF;
buffer[5] := $00;
buffer[6] := $00;
buffer[7] := $00;
buffer[8] := Lo(Rune.ID);
buffer[9] := Hi(Rune.ID);
buffer[10] := $00;
buffer[11] := Lo(Target.X);
buffer[12] := Hi(Target.X);
buffer[13] := Lo(Target.Y);
buffer[14] := Hi(Target.Y);
buffer[15] := Lo(Target.Z);
buffer[16] := $63;
buffer[17] := $00;
buffer[18] := Lo(Tile.Tile);
SendPacket(PID, @buffer, TRUE, FALSE);
end;
procedure Packet_Stop;
var
buffer: Array[0..2] of Byte;
begin
buffer[0] := $01;
buffer[1] := $00;
buffer[2] := $BE;
SendPacket(PID, @buffer, TRUE, FALSE);
end;
procedure Packet_Use(Item:TItem);
var
buffer: Array[0..11] of Byte;
begin
buffer[0] := $0A;
buffer[1] := $00;
buffer[2] := $82;
buffer[3] := $FF;
buffer[4] := $FF;
buffer[5] := Lo(Item.BP);
buffer[6] := $00;
buffer[7] := Lo(Item.Slot);
buffer[8] := Lo(Item.ID);
buffer[9] := Hi(Item.ID);
buffer[10] := Lo(Item.Slot);
buffer[11] := $00;
SendPacket(PID, @buffer, TRUE, FALSE);
end;
procedure Packet_Move_Item(Item:TItem;Slot:Integer);
var
buffer : Array[0..16] of Byte;
begin
buffer[0] := $0F;
buffer[1] := $00;
buffer[2] := $78;
buffer[3] := $FF;
buffer[4] := $FF;
buffer[5] := Lo(Item.BP+64);
buffer[6] := $00;
buffer[7] := Lo(Item.Slot);
buffer[8] := Lo(Item.ID);
buffer[9] := Hi(Item.ID);
buffer[10] := Hi(Item.Slot);
buffer[11] := $FF;
buffer[12] := $FF;
buffer[13] := Lo(Slot);
buffer[14] := $00;
buffer[15] := $00;
buffer[16] := Lo(Item.Count);
SendPacket(PID, @buffer, TRUE, FALSE);
end;
procedure Packet_Target(TPlayer:TChar);
//Targets a ID
var
Buffer: array [0..6] of Byte;
begin
Buffer[0] := $05;
Buffer[1] := $00;
Buffer[2] := $A1;
CopyMemory(@Buffer[3], @TPlayer.ID, 4);
SendPacket(PID, @buffer, TRUE, FALSE);
end;
Procedure Packet_ContainerToGround(Item:TItem; Pos:TPos);
var
Buffer: array [0..16] of Byte;
begin
buffer[0] := $0F;
buffer[1] := $00;
buffer[2] := $78;
buffer[3] := $FF;
buffer[4] := $FF;
buffer[5] := Lo(Item.BP+64);
buffer[6] := $00;
buffer[7] := Lo(Item.Slot);
buffer[8] := Lo(Item.ID);
buffer[9] := HI(Item.ID);
buffer[10] := Lo(Item.Slot);
buffer[11] := Lo(Pos.X);
buffer[12] := Hi(Pos.X);
buffer[13] := Lo(Pos.Y);
buffer[14] := Hi(Pos.Y);
buffer[15] := Lo(Pos.Z);
buffer[16] := Lo(Item.Count);
SendPacket(PID, @buffer, TRUE, FALSE);
end;
Function FindPlayerByID(TPlayer:TChar) : TChar;
var
Current: Integer;
begin
Result.Found:=False;
for Current := 0 to BL_Max do
begin
if ( ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_ID) = TPlayer.ID ) then
begin
Result.X := ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_X);
Result.Y := ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_Y);
Result.Z := ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_Z);
Result.ID := ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_ID);
Result.Speed := ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_Speed);
Result.Moving := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Moving);
Result.Dir := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Dir);
Result.Outfit := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Outfit);
Result.Head := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Head);
Result.Body := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Body);
Result.Legs := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Legs);
Result.Feet := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Feet);
Result.Addon := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Addon);
Result.Light := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Light);
Result.Light_Color := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Light_Color);
Result.HPBar := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_HPBar);
Result.Visible := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Visible);
Result.Skull := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Skull);
Result.Party := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Party);
Result.Name := ReadMemStr(BattleList_Start+(Current*BL_Size)+BL_Dist_Name);
Result.BL := Current;
Result.Found := True;
exit;
end;
end;
end;
Function FindPlayerByName(TPlayer:TChar) : TChar;
var
Current: Integer;
begin
Result.Found:=False;
for Current := 0 to BL_Max do
begin
if ( ReadMemStr(BattleList_Start+(Current*BL_Size)+BL_Dist_Name) = TPlayer.Name ) then
begin
Result.X := ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_X);
Result.Y := ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_Y);
Result.Z := ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_Z);
Result.ID := ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_ID);
Result.Speed := ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_Speed);
Result.Moving := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Moving);
Result.Dir := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Dir);
Result.Outfit := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Outfit);
Result.Head := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Head);
Result.Body := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Body);
Result.Legs := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Legs);
Result.Feet := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Feet);
Result.Addon := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Addon);
Result.Light := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Light);
Result.Light_Color := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Light_Color);
Result.HPBar := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_HPBar);
Result.Visible := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Visible);
Result.Skull := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Skull);
Result.Party := ReadMemByte(BattleList_Start+(Current*BL_Size)+BL_Dist_Party);
Result.Name := ReadMemStr(BattleList_Start+(Current*BL_Size)+BL_Dist_Name);
Result.BL := Current;
Result.Found := True;
exit;
end;
end;
end;
Procedure Light(Strength:Byte; Color:Byte);
begin
WriteMemByte(BattleList_Start+(0*BL_Size)+BL_Dist_Light,Strength);
WriteMemByte(BattleList_Start+(0*BL_Size)+BL_Dist_Light_Color,Color);
end;
Procedure WhiteText(Text:String);
begin
WriteMemStr(Status_Text,Text);
WriteMemByte(Status_Time,50);
end;
Function FindItem(TIT:TItem): TItem;
var
CurrentBP:Integer;
CurrentItem: Integer;
CurrentSlot: Integer;
BPItemCount: Byte;
begin
Result.Found := False;
Result.ID := TIT.ID;
for CurrentBP := 0 to BP_Max do
begin
if ReadMemByte(BackPack_Start+(CurrentBP*BP_Size)+BP_Dist_Open)=1 then
begin
BPItemCount := ReadMemByte(BackPack_Start+(CurrentBP*BP_Size)+BP_Dist_Items);
for CurrentSlot := 0 to BPItemCount-1 do
begin
CurrentItem := ReadMemInt((BackPack_Start+(CurrentBP*BP_Size))+(CurrentSlot*BP_Item_Size)+60);
If CurrentItem = TIT.ID then
begin
Result.BP := CurrentBP;
Result.Slot := CurrentSlot;
Result.Count := ReadMemByte((BackPack_Start+(CurrentBP*BP_Size))+(CurrentSlot*BP_Item_Size)+64);
Result.Found := True;
exit;
end;
end;
end;
end;
end;
Procedure Attack(TPlayer:TChar);
begin
WriteMemInt(Target_ID,TPlayer.ID);
Packet_Target(TPlayer);
end;
Function GetHP: Integer;
begin
Result := ReadMemInt(Player_HP);
end;
Function GetMP: Integer;
begin
Result :=ReadMemInt(Player_MP);
end;
Procedure Namespy(Enabled:Boolean);
begin
if Enabled then
begin
WriteMemBytes(Namespy_1, Nop, 2);
WriteMemBytes(Namespy_2, Nop, 2);
end
else
begin
WriteMemBytes(Namespy_1, Namespy_1_Default, 2);
WriteMemBytes(Namespy_2, Namespy_2_Default, 2);
end;
end;
Procedure LevelSpyToggle(Player:TChar; Enabled:Boolean);
begin
if Enabled then
begin
WriteMemBytes(Levelspy_Nop,Nop,2);
if Player.Z <= 7 then
begin
WriteMemBytes(Levelspy_Above, 7-Player.Z,1);
WriteMemBytes(Levelspy_Below, Levelspy_Below_Default,1);
end
else
begin
WriteMemBytes(Levelspy_Above, Levelspy_Above_Default,1);
WriteMemBytes(Levelspy_Below, Levelspy_Below_Default,1);
end;
Levelspied:=True;
end
else
begin
WriteMemBytes(Levelspy_Nop,Levelspy_Nop_Default,2);
WriteMemByte(Levelspy_Above,Levelspy_Above_Default);
WriteMemByte(Levelspy_Below,Levelspy_Below_Default);
Levelspied:=False;
end;
end;
Procedure LevelSpy(Player:TChar; Up:Boolean);
var
GLevel, CLevel: Integer;
begin
If Up then
begin
If Player.Z <= 7 then GLevel:=LevelSpy_Above else GLevel:=LevelSpy_Below;
CLevel:=ReadMemByte(GLevel);
if CLevel >= Levelspy_Max then WriteMemByte(GLevel, Levelspy_Min) else WriteMemByte(GLevel, CLevel+1);
end
else
begin
If Player.Z <= 7 then GLevel:=LevelSpy_Above else GLevel:=LevelSpy_Below;
CLevel:=ReadMemByte(GLevel);
if CLevel <= Levelspy_Min then WriteMemByte(GLevel, Levelspy_Max) else WriteMemByte(GLevel, CLevel-1);
end;
end;
function Exp: Integer;
var
Level:Integer;
TTNL:Extended;
Tibia: hwnd;
TXP:Integer;
begin
TXP:=ReadMemInt(Player_XP);
Level:=ReadMemInt(Player_LVL);
TTNL:= (50 * (Level+1) * ((Level+1) * ((Level+1) / 3 - 2) + 17 / 3) - 200);
Result:=Round( TTNL-TXP );
Tibia:= FindWindow('TibiaClient',nil);
SetWindowText(tibia,pchar('ClassicaBot| Your Lv: '+inttostr(ReadMemInt(player_lvl))+ ' Exp Left: '+inttostr(Result)));
end;
function GetStatus: TStatus;
var
Status:Integer;
begin
Status:=ReadMemInt(Player_Status);
if Status >= 128 then
begin
Result.Battle:=True;
Status:=Status-128;
end;
if Status >= 64 then
begin
Result.Haste:=True;
Status:=Status-64;
end;
if Status >= 32 then
begin
Result.Paralyze:=True;
Status:=Status-32;
end;
if Status >= 16 then
begin
Result.MShield:=True;
Status:=Status-16;
end;
if Status >= 8 then
begin
Result.Drunk:=True;
Status:=Status-8;
end;
if Status >= 4 then
begin
Result.Energy:=True;
Status:=Status-4;
end;
if Status >= 2 then
begin
Result.Fire:=True;
Status:=Status-2;
end;
if Status >= 1 then
begin
Result.Poison:=True;
end;
end;
function HealParty(Health:Integer; UH:TItem):String;
var
Friend: TChar;
Current: Integer;
begin
Result:='';
for Current := 0 to BL_Max do
begin
if ( ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_Party) > 2 ) then
begin
if ( ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_Visible) = 1 ) then
begin
if (ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_HPBar) < Health ) then
begin
Friend.ID:=ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_ID);
Friend:=FindPlayerByID(Friend);
Packet_Shoot_Rune(UH,Friend);
Result:=Friend.Name;
exit;
end;
end;
end;
end;
end;
Function Map_GetAdr: Integer;
begin
Result:= ReadMemInt(Map_Pointer);
end;
Function Map_GetPlayerTile(MapStart:Integer;TPlayer:TChar): Integer;
var
CurrentTile,x:Integer;
begin
for CurrentTile := 0 to Map_Max do
begin
if ReadMemInt((MapStart+(CurrentTile*Map_Size))+Map_Dist_Count) > 1 then
begin
for x:= 0 to 10 do
begin
if (ReadMemInt((MapStart+(CurrentTile*Map_Size)+Map_Dist_TileID)+(x*Map_Dist_Item)+Map_Dist_ItemID)=99) then
begin
if(ReadMemInt((MapStart+(CurrentTile*Map_Size)+Map_Dist_TileID)+(x*Map_Dist_Item)+Map_Dist_ItemData)=TPlayer.ID) then
begin
Result:=CurrentTile;
exit;
end;
end;
end;
end;
end;
end;
Function Map_GetZ(Tile:Integer):Integer;
var
TVal:Extended;
begin
TVal:=Tile/(14*18);
Result:=trunc(TVal);
end;
Function Map_GetY(Tile:Integer):Integer;
var
TVal:Extended;
begin
TVal:=(Tile-Map_GetZ(Tile)*14*18)/18;
Result:=trunc(TVal);
end;
Function Map_GetX(Tile:Integer):Integer;
var
TVal:Extended;
begin
TVal:=(Tile-Map_GetZ(Tile)*14*18-Map_GetY(Tile)*18);
Result:=trunc(TVal);
end;
Function Map_GetXYZ(Tile:Integer):TPos;
begin
Result.X:=Map_GetX(Tile);
Result.Y:=Map_GetY(Tile);
Result.Z:=Map_GetZ(Tile);
end;
Function Map_AddX(TTile:TPos;Value:Integer):TPos;
var
TVar:Integer;
begin
Result:=TTile;
Result.X:=TTile.X+Value;
if (Result.X >= 0) and (Result.X <= 17) then
begin
Exit;
end
else
if Result.X < 0 then
begin
TVar:=0-Result.X;
Result.X:=18-TVar;
end
else
begin
TVar:=Result.X-17;
Result.X:=-1+TVar;
end;
end;
Function Map_AddY(TTile:TPos;Value:Integer):TPos;
var
TVar:Integer;
begin
Result:=TTile;
Result.Y:=TTile.Y+Value;
if (Result.Y >= 0) and (Result.Y <= 13) then
begin
Exit;
end
else
if Result.Y < 0 then
begin
TVar:=0-Result.Y;
Result.Y:=14-TVar;
end
else
begin
TVar:=Result.Y-13;
Result.Y:=-1+TVar;
end;
end;
function Map_NewTileNr(TTile:TPos):TPos;
begin
Result.Tile:=TTile.X+(TTile.Z*14*18)+(TTile.Y*18);
end;
Function Map_GetTileID(MapStart:Integer; Pos:TPos):TPos;
begin
Result.Tile:=ReadMemInt(MapStart+(Pos.Tile*Map_Size)+Map_Dist_TileID);
end;
procedure ChangeIP(IP:String);
var
Current: Integer;
oldp: cardinal;
begin
VirtualProtectEx(IDProcess,Ptr(RsaAdr),Length(RSA),PAGE_EXECUTE_READWRITE,oldp);
// WriteMemStr(RsaAdr,RSA+#0);
WriteMemStr(IPFirst,IP+#0);
WriteMemStr(IPFirst1,IP+#0);
WriteMemStr(IPFirst2,IP+#0);
WriteMemStr(IPFirst3,IP+#0);
end;
end.
Pe Es. Zapiszcie jako Tibia.pas wrzucie do folderu z błotem :) i dodajcie tibia do uses
Dobra wszystko już mam i działa .Działa nawet MemWriteInteger,normalnie mi zapisuje nowy level itp.Ale jak chce nadpisać sobie światło lub outfit i pisze coś takiego:
To nie ma żadnego erroru ani nic ale nie działa.. Próbowałem też pisać zamiast 168 160 ale nic z tego.Kod PHP:MemWriteInteger(battlelist_start+pozycja*168+distance_lightcolor,250,3); MemWriteInteger(battlelist_start+pozycja*168+distance_light,15,2);
A mója battle lista wygląda tak:
Kod PHP:function pozycja:integer; var i,id_battle,id:integer; begin id:=readMemInteger(Player_ID); for i:=1 to 250 do begin id_battle:=readMemInteger(Battlelist_Start + (i*168)); if id_battle=ID then begin Result :=i; exit; end; end; end;
Prosze o pomoc
@Up
od 8.54
Cytuj:
0xA8 = 168 - 8.5+?
0xA4 = 164 - 8.4?
0xA0 = 160 - to juz chyba 8.1
No fajnie 168 jest pod 8.54,ale nawet jak tak wpisuje to nie działa..
A sprawdz
A jak nie zadziala to sprawdzKod PHP:MemWriteInteger(battlelist_start+pozycja*Distance_Between_Chars+distance_lightcolor,250,3); MemWriteInteger(battlelist_start+pozycja*Distance_Between_Chars+distance_light,15,2);
Kod PHP://Battlelist - czytanie function pozycja:integer; var i,id_battle,id:integer; begin id:=readmeminteger(Player_id); //odczytanie naszego id z adresu for i:=1 to 149 do //przeszukanie wszystkich pozycji na battle list (minimalna 1 maxymanlna 149 Begin id_battle:=Readmeminteger(Battlelist_start + (i*164)); //czytanie id z pozycji if id_battle=ID then //jezeli id z battle list zgadza sie z id z adresu Begin Result :=i; //wtedy wynikiem funkcji jest nasza pozycja na battle exit; end; end; end; //Battlelist - czytanie
@up Dzięki za to,ale jak wpisałem to zmieniło mi na 2 addony przy outficie ;p czyli zamiast światla ci wyszedł addon changer.Ale dzięki ;p
Albo mam źle zapisane światło.. 0.0 ale sam mi je tak podałeś parę postów up ;p
użyj mojego unitu lh powinien działać tz wpisujesz Light(15,250) czy jakoś tak
@up
O co ci chodzi, wogle cie nie ogarniam.. Wyjasnij bardziej szczegolwo