Po prostu chłopak nie myśli albo nie czyta wszystkiego :)
Wersja do druku
Po prostu chłopak nie myśli albo nie czyta wszystkiego :)
@LGTK Do czego jest ten skrypt? Runemaker?
Btw. Czy mógłby ktoś podać adresy do klienta Tibii 7.4? Dzieki z góry ;]
To jest unit! gdzie masz najpotrzebniejsze funkcje i procedury do tibii od hooka, lh, dll inject, levelspy, do znajdowania itemu w bp szukania gracza na liście przesuwania itemów mówienia write/read string byte bytes integer itp
Mam małe pytanie, otóż staram się nie spisywać całego kodu, tylko sam go pisać, a ten artykuł ma być tylko drobną pomocą więc:
Na czerwono zaznaczyłem części kodu, które mnie interesują. Co oznacza $0F, że jeżeli on zostanie wyciągnięty to następuje wyjście z pętli? Jeszcze interesuje mnie zaznaczony 1 fragment kodu, po co opróżniać rezultat, skoro on jeszcze jest "pusty"?Kod:function ReadMemoryString(Address : Integer) : String;
var
IDProc, IDProcess : Cardinal;
Bufor : Array[1..255] of byte;
Number : LongWord;
I : Byte;
begin
GetWindowThreadProcessId(FindWindow('TibiaClient',nil), @IDProc);
IDProcess := OpenProcess(Process_all_access, false, IDProc);
Result := '';
ReadProcessMemory(IDProcess, Ptr(Address), @Bufor[1], 255, Number);
for I := 1 to 255 do
begin
if (Bufor[1] = 0) or (Bufor[1] = $0F) then
break;
Result := Result + CHR(Bufor[i]);
end;
end;
Nie wiem po co jest to "0F", chociaż fakt - takiego znaku nie zobaczysz normalnie na ekranie.
Swoją drogą rezultat nie jest pusty. Delphi nie zeruje zmiennych, jeśli nie są one globalne.
Ja natomiast zamieniłbym powyższy fragment kodu na:
Kod:function ReadMemoryString(Address : Integer) : String;
var
IDProc, IDProcess : Cardinal;
Bufor : Array[1..255] of byte;
Number : LongWord;
begin
GetWindowThreadProcessId(FindWindow('TibiaClient',nil), @IDProc);
IDProcess := OpenProcess(Process_all_access, false, IDProc);
ReadProcessMemory(IDProcess, Ptr(Address), @Bufor[1], 255, Number);
result:=pchar(@bufor);
end;
Dzięki za odpowiedź, mam jeszcze jedno pytanie, otóż:
Jak moge "wymusić" pojawienie się tego białego komunikatu, tylko że z własną treścią. Bo tibia wyswietla takie komunikaty np. You are Full, Sorry Not Possible. Zmiana treści jest prosta, tylko problem tkwi w kontrolowanym wyświetleniu napisu.
#edit1
mam jeszcze pytanie, czy trenowanie many "od-do" będzie wykrywalne przez ten cały system? Może niezbyt precyzyjnie się wyraziłem, ale tu jest kod:
Kod:var
Mniejsza : integer;
Wieksza : integer;
Wynik : integer;
begin
Wieksza := StrToInt(Edit6.Text);
Mniejsza := StrToInt(Edit5.Text);
Wynik := wieksza - mniejsza;
Randomize;
if Player_Mana >= Random(Wynik) + Mniejsza then
Say(Edit4.Text);
end;
Po coś dałem ten unit było chociaż sprawdzić co tam jest
a jest tam coś takiego
To chodzi bardziej o pakiety a nie to czy dokładnie co x wysyłasz pakietKod:Procedure WhiteText(Text:String);
begin
WriteMemStr(Status_Text,Text);
WriteMemByte(Status_Time,50);
end;
@Edit
te up a nie lepiej
Kod:var
mana: integer;
begin
mana:= np. 100?
if Player_Mana >= mana then
Say(Edit4.Text);
end;
ja nie rozumiem poco odejmujesz te dwie wartości
Kambel:
Cały czas nie wiadomo na jakiej zasadzie działa system wykrywania botów. Dlatego nawet jeśli uzyskasz jakąś odpowiedź nie traktuj jej jako pewnej.
I jeszcze wnioski na temat Twojego kodu:
Randomize jest procedurą, którą wystarczy wywołać raz. W tym miejscu wygląda dziwnie.
Dla Twojej własnej wygody polecam zrobić sobie funkcję losującą liczbę z danego przedziału. Unikniesz dodawania i odejmowania w miejscach gdzie nie powinno tego być.
I ostatnia rada, choć nie koniecznie trafna - nie znam całego kodu. Natomiast wygląda na to, że jest to jakaś procedura, która wywołuje się co jakiś czas (zgaduję, że timer albo po otrzymaniu pakietu z ilością many). Zauważ, że przy każdym wywołaniu po raz kolejny losujesz nową ilość many potrzebnej by rzucić zaklęcie - tym samym zwiększasz prawdopodobieństwo, że zostanie rzucone wcześniej. Random(Wynik) powinieneś zapisywać w momencie rzucenia zaklęcia (nie zapomnij zainicjować przy uruchomieniu programu) faktycznie działało tak jak to prawdopodobnie planowałeś.
Tak, masz racje :)
Dzięki za rade.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A co do Pana LGTK to:
Najpierw użytkownik programu wpisuje pierwszą liczbę(minimalną), na której ma rzucać czar, a później drugą liczbę(maksymalną).
Odejmując od liczby maksymalnej, liczbe minimalną otrzmam różnicę dwóch liczb.
Kolejnym krokiem - co wynika z kodu różnica liczb podlega losowaniu, po czym dodaję liczbę mniejszą.
Czyli, jak liczba liczba mniejsza wynosi 50, a większa 80 to różnica 30. 30 poddam losowaniu - może wyjść liczba np. 15. 50 + 15 = 65.
Chyba już rozumiesz?
No tak panie tylko nie wiem poco i tak prościej by było dodawać losową liczbę do timera albo opóźnienia wątku zresztą coś mi się wydaje że to nie oto chodzi w tym całym auto banie
Zresztą co robi wiedziałem tylko nie wiedziałem po jakiego to
Wszystko jasne ( ;
Jak by ktoś był zainteresowany funkcją, która ukrywa i wyświetla Tibie(coś w stylu NG):
Ukrywanie:
Wyświetlanie ukrytej Tibii:Kod:Uchwyt := FindWindow('TibiaClient', nil);
ShowWindow(Uchwyt, SW_Hide);
Kod:Uchwyt := FindWindow('TibiaClient', nil);
ShowWindow(Uchwyt, SW_Show);
Ma ktos moze pajcket.dll pod Tibie 8.54? :/ Szukalem nigdzie nie moge znalesc... ;s
Dzieki za pomoc.
Proszę bardzo, oto packet.dll pod 8.54:
Kod:speedyshare.com/files/21007003/packet.dll
Hmm.. A jaki adress do mojego nicku? Bo ciągle jak sprawdzam CE albo WH to mi inny wyskakuje..? Może ma ktoś jakiś? Bo przecież w botach typu Elfbot/NG/Proxy wyświetlał się nick zalogowanego playera. I właśnie to ja potrzebuje !
Wystarczy przeczytać dokładnie artykuł, żeby wiedzieć, że żeby przeczytać swój nick, musisz znaleźć swoją pozycję na battle liście i dopiero potem przeczytać nick, bo twoja pozycja po zalogowaniu do gry jest za każdym razem inna.
#edit, down:
A bez gotowca to już nie potrafimy?
pomyśl trochę...
Tam wszystko jest napisane. Łącznie z nickiem.
Tak? To gdzie jest ta procedurka?
To jest battle list :
BATTLELIST_START = $635F70;
BATTLELIST_END = BATTLELIST_START + (StepCreatures * MaxCreatures);
A na nick?
Halo?
Niech ktoś pomoże.
Halo? Jak ktoś jest w potrzebie, to nikt nie pomoże, masakra.
Ktos wie moze jak zrobic przezroczyste drzewka bez przerabiania Tibia.spr?? Jezeli tak to prosze o jakis kierunek w tym celu...
Mam napisane to w vb.net nie mam przy sobie źródeł potem napisze
Widać,że duzo sie napracowałeś. Troszke nie przejzyscie to napisales,w mniejwiecej srodku sie pogubiłem :x
Biore sie do roboty wlasnego macro :-) Nudy :P
Aaaa,i jeszcze ocena,bylbym zapomnial - 9/10, bo troszke chaotycznie napisane. TROSZKE :).
Dobra opowiem komuś tam o zmianie drzewek ok?
Musisz odczytać id spr a potem gdy na mapce będziesz miał duże drzewka to zamieniasz je na małe proste co :D (tylko w teorii)
Sorry za post pod postem ale 24h mineły
Packet.dll pod 8.55
AdresyKod:tpforums.org/forum/attachment.php?aid=624
Kod:case "8.55":
BattleList.Start = 0x63D350;
BattleList.StepCreatures = 0xA8;
BattleList.MaxCreatures = 250;
BattleList.End = BattleList.Start + (BattleList.StepCreatures * BattleList.MaxCreatures);
Client.StartTime = 0x7DDCB8;
Client.XTeaKey = Client.RecvStream + 0x10;
Client.SocketStruct = 0x796DB8;
Client.RecvPointer = 0x5B75DC;
Client.SendPointer = 0x5B7608;
Client.FrameRatePointer = 0x79AF9C;
Client.FrameRateCurrentOffset = 0x60;
Client.FrameRateLimitOffset = 0x58;
Client.MultiClient = 0x50B874;
Client.Status = 0x79A450;
Client.SafeMode = 0x79720C;
Client.FollowMode = Client.SafeMode + 4;
Client.AttackMode = Client.FollowMode + 4;
Client.ActionState = 0x79A4B0;
Client.ActionStateFreezer = 0x51CBB4;
Client.LastMSGText = 0x7DDF28;
Client.LastMSGAuthor = Client.LastMSGText - 0x28;
Client.StatusbarText = 0x7DDCD8;
Client.StatusbarTime = Client.StatusbarText - 4;
Client.ClickId = 0x79A4F0;
Client.ClickCount = Client.ClickId + 4;
Client.ClickZ = Client.ClickId - 0x68;
Client.SeeId = Client.ClickId + 12;
Client.SeeCount = Client.SeeId + 4;
Client.SeeZ = Client.SeeId - 0x68;
Client.ClickContextMenuItemId = 0x79A4FC;
Client.ClickContextMenuItemGroundId = 0x79A500;
Client.ClickContextMenuCreatureId = 0x79A4F8;
Client.LoginServerStart = 0x791D20;
Client.StepLoginServer = 112;
Client.DistancePort = 100;
Client.MaxLoginServers = 10;
Client.RSA = 0x5B7610;
Client.LoginCharList = 0x79A404;
Client.LoginCharListLength = 0x79A408;
Client.LoginSelectedChar = 0x79A400;
Client.GameWindowRectPointer = 0x649784;
Client.GameWindowBar = 0x7DDCCC;
Client.DatPointer = 0x796E04;
Client.EventTriggerPointer = 0x51EC50;
Client.DialogPointer = 0x64CAEC;
Client.DialogLeft = 0x14;
Client.DialogTop = 0x18;
Client.DialogWidth = 0x1C;
Client.DialogHeight = 0x20;
Client.DialogCaption = 0x50;
Client.LastRcvPacket = 0x792598;
Client.DecryptCall = 0x45C1B5;
Client.LoginAccountNum = 0;
Client.LoginPassword = 0x79A40C;
Client.LoginAccount = Client.LoginPassword + 32;
Client.LoginPatch = 0;
Client.LoginPatch2 = 0;
Client.LoginPatchOrig = new byte[] { 0xE8, 0x0D, 0x1D, 0x09, 0x00 };
Client.LoginPatchOrig2 = new byte[] { 0xE8, 0xC8, 0x15, 0x09, 0x00 };
Client.ParserFunc = 0x45C180;
Client.GetNextPacketCall = 0x45C1B5;
Client.RecvStream = 0x796DD4;
Container.Start = 0x64A238;
Container.StepContainer = 492;
Container.StepSlot = 12;
Container.MaxContainers = 16;
Container.MaxStack = 100;
Container.DistanceIsOpen = 0;
Container.DistanceId = 4;
Container.DistanceName = 16;
Container.DistanceVolume = 48;
Container.DistanceAmount = 56;
Container.DistanceItemId = 60;
Container.DistanceItemCount = 64;
Container.End = Container.Start + (Container.MaxContainers * Container.StepContainer);
ContextMenus.AddContextMenuPtr = 0x4520F0;
ContextMenus.OnClickContextMenuPtr = 0x44E700;
ContextMenus.OnClickContextMenuVf = 0x5BCBD0;
ContextMenus.AddSetOutfitContextMenu = 0x453022;
ContextMenus.AddPartyActionContextMenu = 0x45349C;
ContextMenus.AddCopyNameContextMenu = 0x45354D;
ContextMenus.AddTradeWithContextMenu = 0x452C99;
ContextMenus.AddLookContextMenu = 0x452B4F;
Creature.DistanceId = 0;
Creature.DistanceType = 3;
Creature.DistanceName = 4;
Creature.DistanceX = 36;
Creature.DistanceY = 40;
Creature.DistanceZ = 44;
Creature.DistanceScreenOffsetHoriz = 48;
Creature.DistanceScreenOffsetVert = 52;
Creature.DistanceIsWalking = 76;
Creature.DistanceWalkSpeed = 140;
Creature.DistanceDirection = 80;
Creature.DistanceIsVisible = 144;
Creature.DistanceBlackSquare = 132;
Creature.DistanceLight = 120;
Creature.DistanceLightColor = 124;
Creature.DistanceHPBar = 136;
Creature.DistanceSkull = 148;
Creature.DistanceParty = 152;
Creature.DistanceWarIcon = 160;
Creature.DistanceIsBlocking = 164;
Creature.DistanceOutfit = 96;
Creature.DistanceColorHead = 100;
Creature.DistanceColorBody = 104;
Creature.DistanceColorLegs = 108;
Creature.DistanceColorFeet = 112;
Creature.DistanceAddon = 116;
DatItem.Width = 0;
DatItem.Height = 4;
DatItem.Unknown1 = 8;
DatItem.Layers = 12;
DatItem.PatternX = 16;
DatItem.PatternY = 20;
DatItem.PatternDepth = 24;
DatItem.Phase = 28;
DatItem.Sprite = 32;
DatItem.Flags = 36;
DatItem.CanLookAt = 40;
DatItem.WalkSpeed = 44;
DatItem.TextLimit = 48;
DatItem.LightRadius = 52;
DatItem.LightColor = 56;
DatItem.ShiftX = 60;
DatItem.ShiftY = 64;
DatItem.WalkHeight = 68;
DatItem.Automap = 72;
DatItem.LensHelp = 76;
DrawItem.DrawItemFunc = 0x4B4CF0;
DrawSkin.DrawSkinFunc = 0x4B8BE0;
Hotkey.SendAutomaticallyStart = 0x797408;
Hotkey.SendAutomaticallyStep = 0x01;
Hotkey.TextStart = 0x797430;
Hotkey.TextStep = 0x100;
Hotkey.ObjectStart = 0x797378;
Hotkey.ObjectStep = 0x04;
Hotkey.ObjectUseTypeStart = 0x797258;
Hotkey.ObjectUseTypeStep = 0x04;
Hotkey.MaxHotkeys = 36;
Map.MapPointer = 0x651640;
Map.StepTile = 168;
Map.StepTileObject = 12;
Map.DistanceTileObjectCount = 0;
Map.DistanceTileObjects = 4;
Map.DistanceObjectId = 0;
Map.DistanceObjectData = 4;
Map.DistanceObjectDataEx = 8;
Map.MaxTileObjects = 10;
Map.MaxX = 18;
Map.MaxY = 14;
Map.MaxZ = 8;
Map.MaxTiles = 2016;
Map.ZAxisDefault = 7;
Map.NameSpy1 = 0x4F2119;
Map.NameSpy2 = 0x4F2123;
Map.NameSpy1Default = 19061;
Map.NameSpy2Default = 16501;
Map.LevelSpy1 = 0x4F3FCA;
Map.LevelSpy2 = 0x4F40CF;
Map.LevelSpy3 = 0x4F4150;
Map.LevelSpyPtr = 0x649784;
Map.LevelSpyAdd1 = 28;
Map.LevelSpyAdd2 = 0x2A88;
Map.FullLightNop = 0x4EA8B9;
Map.FullLightAdr = 0x4EA8BC;
Map.FullLightNopDefault = new byte[] { 0x7E, 0x05 };
Map.FullLightNopEdited = new byte[] { 0x90, 0x90 };
Map.FullLightAdrDefault = 0x80;
Map.FullLightAdrEdited = 0xFF;
Player.Exp = 0x63D2E4;
Player.Flags = Player.Exp - 108;
Player.Id = Player.Exp + 12;
Player.HP = Player.Exp + 8;
Player.HPMax = Player.Exp + 4;
Player.Level = Player.Exp - 4;
Player.MagicLevel = Player.Exp - 8;
Player.LevelPercent = Player.Exp - 12;
Player.MagicLevelPercent = Player.Exp - 16;
Player.Mana = Player.Exp - 20;
Player.ManaMax = Player.Exp - 24;
Player.Soul = Player.Exp - 28;
Player.Stamina = Player.Exp - 32;
Player.Cap = Player.Exp - 36;
Player.FistPercent = 0x63D27C;
Player.ClubPercent = Player.FistPercent + 4;
Player.SwordPercent = Player.FistPercent + 8;
Player.AxePercent = Player.FistPercent + 12;
Player.DistancePercent = Player.FistPercent + 16;
Player.ShieldingPercent = Player.FistPercent + 20;
Player.FishingPercent = Player.FistPercent + 24;
Player.Fist = Player.FistPercent + 28;
Player.Club = Player.FistPercent + 32;
Player.Sword = Player.FistPercent + 36;
Player.Axe = Player.FistPercent + 40;
Player.Distance = Player.FistPercent + 44;
Player.Shielding = Player.FistPercent + 48;
Player.Fishing = Player.FistPercent + 52;
Player.SlotHead = 0x64A1C0;
Player.SlotNeck = Player.SlotHead + 12;
Player.SlotBackpack = Player.SlotHead + 24;
Player.SlotArmor = Player.SlotHead + 36;
Player.SlotRight = Player.SlotHead + 48;
Player.SlotLeft = Player.SlotHead + 60;
Player.SlotLegs = Player.SlotHead + 72;
Player.SlotFeet = Player.SlotHead + 84;
Player.SlotRing = Player.SlotHead + 96;
Player.SlotAmmo = Player.SlotHead + 108;
Player.MaxSlots = 11;
Player.DistanceSlotCount = 4;
Player.CurrentTileToGo = 0x63D2F8;
Player.TilesToGo = 0x63D2FC;
Player.GoToX = Player.Exp + 80;
Player.GoToY = Player.GoToX - 4;
Player.GoToZ = Player.GoToX - 8;
Player.RedSquare = 0x63D2BC;
Player.GreenSquare = Player.RedSquare - 4;
Player.WhiteSquare = Player.GreenSquare - 8;
Player.AccessN = 0;
Player.AccessS = 0;
Player.TargetID = Player.RedSquare;
Player.TargetBListID = Player.TargetID - 8;
Player.TargetBListType = Player.TargetID - 5;
Player.TargetType = Player.TargetID + 3;
Player.Z = 0x64CB28;
TextDisplay.PrintName = 0x4F5133;
TextDisplay.PrintFPS = 0x45A058;
TextDisplay.ShowFPS = 0x63AF94;
TextDisplay.PrintTextFunc = 0x4B4130;
TextDisplay.NopFPS = 0x459F94;
Vip.Start = 0x63B010;
Vip.StepPlayers = 0x2C;
Vip.MaxPlayers = 200;
Vip.DistanceId = 0;
Vip.DistanceName = 4;
Vip.DistanceStatus = 34;
Vip.DistanceIcon = 40;
Vip.End = Vip.Start + (Vip.StepPlayers * Vip.MaxPlayers);
Czesc chcial bym sie dowiedziec jak rozroznic przy atakowaniu potwora czy jest on osiagalny (widac go na ekranie i mozna do niego podejsc) czy tez (widac go na ekranie ale jest za sciana i nie mozna podejsc) bo z tym mam problem ?
to jest mniej więcej tak
w cliencie jest func która sprawdza czy x,y,z jest osiągalny więc można tego użyć ona zwraca albo 1 albo 0 więc można tego użyć
Tak domyslam sie ze jest taka funkcja tylko zapomnialem dopisac ze chodzi mi o to jak znalesc jej adres w pamieci chyba ze ktos juz znalazl to prosil bym :)
Hm, ja nie mam pojęcia jak znaleźć ten adres jednak odeślę Cię na strone, która może Ci się przydać:
http://code.google.com/p/tibiaapi/source/browse/trunk/tibiaapi/Addresses/
Do tego cza debugera pozdro :D
Witam czy jest mozliwosc napisania bota pod klienta linuxowego ?
tak są różnice w biblioteczkach itp. najlepiej bota pod linuxa pisać w c\c++
Kod:NoNameProxy sprawdź obowiązkowo ;p
code google . com / p / nonameproxy
Kod:Na temat języka najlepszego dla Linuxa
tpforums . org / forum / thread-6249-page-1 . html
Kod:skaner pamięci dla linuxa
www . tpforums . org / forum / thread-4371 . html
skaner przetestowalem (: wylapuje akcje klienta linuxowego :D co do języka prubuje zrobic cos w Lazarusie (delphi 7 po polskiemu i w dodatku za free :D )
@up
Lazarus nie wiem jak na linuxie ale na windzie prosta aplikacja to jakieś 5-6 mb dokładnie nie pamiętam ile
Chce zrobic bota pod tibie 7.4 mam w sumie wszyskie informacje, wiem co gdzie i jak zrobic, iumiem pisac aplikacje w delphim, tylko nie wiem jak przechwycic pakiety wysylane z clienta do servera, program freeproxy nie dziala dlatego iż jest dostepny od tibi 7.6 /\.
Jakieś pomysły w czym to przechwycic?
jeśli freeproxy jest open-s to zaaktualizuj addresy. z drugiej strony one nie powinny ulec zmiane tz pakiety
Jak już wszyscy piszą w tym temacie to i ja zapytam, jak odczytać ilosc hp potwora, którego właśnie atakuje ?
Czekam na informację, dzięki z góry :)
Siema. Mam mały problem z procedurą Say. Sama procedura działa elegancko, ale pojawia się tylko pierwsza litera całego wyrazu. Nie mam zielonego pojęcia, czym może to być spowodowane.
Kod:procedure SendPacket(ProcessID: Cardinal; Packet: Pointer); stdcall; external 'packet.dll';
Kod:procedure Say(Text: String);
var
PacketBuffer: array [0..200] of byte;
ProcessID: Cardinal;
begin
GetWindowThreadProcessId(FindWindow('TibiaClient', Nil), @ProcessID); //pobranie id procesu Tibii
PacketBuffer[0] := Byte(Length(text) + 4); //tu okreslana jest dlugosc pakietu bez 0 i 1
PacketBuffer[1] := $00;
PacketBuffer[2] := $96;
PacketBuffer[3] := $01;
PacketBuffer[4] := Byte(Length(text));
PacketBuffer[5] := $00;
CopyMemory(@PacketBuffer[6], @text[1], Length(text));
SendPacket(ProcessID, @PacketBuffer); // tu program wysyla pakiet do programu z proces id = ProcessID
end;
Gdy naciskam button na ekranie widzę tylko "H". Próbowałem bawić się długością pakietu, ale bez skutku. Jakieś pomysły?Kod:procedure TForm1.Button1Click(Sender: TObject);
begin
Say('Hello!');
end;
Możesz odczytać z clienta tylko % hp najpierw cza znaleść go na bl potem proste
Stare ale może podziałaKod: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;
W jaki sposób napisać exp counter? Nie chcę gotowca, tylko podpowiedź.
/\ Tak jak chciałeś, ogólne założenia.
Możesz sobie zrobić 2 buttony start i stop.
Po naciśnięciu start do zmiennej poczatkowy_exp zapisujesz aktualną ilość zdobytego doświadczenia przez gracza. Po naciśnięciu stop pobierasz aktualny exp (np.: do zmiennej aktualny_exp) i wyświetlasz (w labelu czy tam gdzie chcesz) wartość (aktualny_exp - poczatkowy_exp).
To taki najprostszy przykład, możesz też zrobić coś podobnego za pomocą timeru, który będzie aktualizował dane.
To tak w skrócie, myślę, że załapiesz o co chodzi :).
Czy mógłby mi ktoś pomóc zabrałem się za pisanie bota pod tibię 8.61
ale to co napisał yaboo nie bardzo pomogło.chciałbym dodać do mojego bota pare udogodnień np rune maker,light,spell caster,zmiane outfitów??Moje gg:10180836
zrobiłem narazie tyle:
unit Wlazelko;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
StaticText1: TStaticText;
Label1: TLabel;
Button1: TButton;
StaticText2: TStaticText;
Label2: TLabel;
Label3: TLabel;
StaticText4: TStaticText;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
const
//adresy wartosci postaci
Player_ClubPerc = $634BCC - 100;
Player_SwordPerc = $634BCC - 96;
Player_AxePerc = $634BCC - 92;
Player_DistnacePerc = $634BCC - 88;
Player_ShieldingPerc = $634BCC - 84;
Player_FishingPerc = $634BCC - 80;
Player_FistPerc = $634BCC - 104;
//koniec procenty
Player_Fist = $634BCC - 76;
Player_Club = $634BCC - 72;
Player_Sword = $634BCC - 68;
Player_Axe = $634BCC - 68;
Player_Distance = $634BCC - 60;
Player_Shielding = $634BCC - 56;
Player_Fishing = $634BCC - 52;
//koniec skile
Player_Cap = $634BCC - 36;
Player_Stamina = $634BCC - 32;
Player_Soul = $634BCC - 28;
//koniec eq
Player_ManaMax = $634BCC - 24;
Player_Mana = $634BCC - 20;
//koniec mana
Player_MagicLevelPerc = $634BCC - 16;
Player_LevelPerc = $634BCC - 12;
Player_MagicLevel = $634BCC - 8;
Player_Level = $634BCC - 4;
//koniec poziomy
Player_Experience = $634BCC;
Player_HpMax = $634BCC + 4;
Player_Hp = $634BCC + 8;
Player_ID = $634BCC + 12;
//koniec - adresy wartosci postaci
BATTLELIST_START = $634C38 + 4;
BATTLELIST_END = $634C38 + 4 + ($A8 * 250);
StepCreatures = $A8;
MaxCreatures = 250;
//koniec battlelist
DistanceId = 0;
DistanceType = 3;
DistanceName = 4;
DistanceX = 36;
DistanceY = 40;
DistanceZ = 44;
DistanceScreenOffsetHoriz = 48;
DistanceScreenOffsetVert = 52;
DistanceIsWalking = 76;
DistanceWalkSpeed = 140;
DistanceDirection = 80;
DistanceIsVisible = 144;
DistanceBlackSquare = 132;
DistanceLight = 120;
DistanceLightColor = 124;
DistanceHPBar = 136;
DistanceSkull = 148;
DistanceParty = 152;
DistanceWarIcon = 160;
DistanceIsBlocking = 164;
DistanceOutfit = 96;
DistanceColorHead = 100;
DistanceColorBody = 104;
DistanceColorLegs = 108;
DistanceColorFeet = 112;
DistanceAddon = 116;
implementation
{$R *.dfm}
// Funkcje czytające
function ReadMemInteger(Address: Cardinal): Cardinal; //Read adress:value
var
ProcId: Cardinal;
tProc: THandle;
NBR: Cardinal;
value:integer;
begin
GetWindowThreadProcessId(FindWindow('TibiaClient', Nil), @ProcId);
tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcId);
ReadProcessMemory(tProc, Ptr(Address), @value, 4, NBR);
CloseHandle(tProc);
Result:=value;
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;
// Koniec - Funkcje czytające
//battlelist czytanie
function pozycja:integer;
var
i,id_battle,id:integer;
begin
id:=readmeminteger($634BCC + 12);
for i:=1 to 149 do
Begin
id_battle:=Readmeminteger($634C38 + 4 + (i*160)-4);
if id_battle=ID then
Begin
Result :=i;
exit;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
label1.Caption:=inttostr(ReadMeminteger($634BCC - 4));
label2.Caption:=inttostr(ReadMeminteger($634BCC - 8));
label3.Caption:=inttostr(ReadMeminteger($634BCC - 20));
end;
procedure MemWriteInteger(Address: Integer; buf: Integer; Length: DWORD);
var ProcID, THandle: Integer;
e: DWORD;
begin
GetWindowThreadProcessId(FindWindow('TibiaClient', Nil), @ProcID);
THandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
WriteProcessMemory(THandle, Ptr(Address), @buf, Length, e);
CloseHandle(THandle);
end;
procedure MemWriteString(Address: Integer; buf: String; Length: DWORD);
var ProcID: Integer;
THandle: hWnd;
e: DWORD;
begin
GetWindowThreadProcessId(FindWindow('TibiaClient', Nil), @ProcID);
THandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
WriteProcessMemory(THandle, Pointer(Address), PChar(buf), Length, e);
CloseHandle(THandle);
end;
procedure SendPacket(ProcessID: Cardinal; Packet: Pointer; Encrypt: Boolean; SafeArray: Boolean); stdcall; external 'packet.dll';
end.
A jak napisać bota do innego klienta niż orginalny klient Tibi, chodzi mi o własnego klienta OTS.
cheat engine - szukasz zmiennych i podstawiasz do programu. ot co
to jest taki program window-title-changer
Moglby mi ktos podac adresy do odczytania pozycji gracza z tibi 8.61? Znalazlem pare, ale okazaly sie bledne, poniewaz albo wychodzily 7-9 cyfrowe liczby albo poprostu 0.
Mam tez problem z odczytaniem nicku postaci poniewaz kiedy jestem sam na ekranie jest wszystko ok, ale kiedy na battle list pojawia sie ktos to bot wyswietla jego nick. Wydaje mi sie, ze odczytywanie nicku pod 8.61 poprostu sie zmienilo i nigdzie nie moge tego znalesc
p_Z = $644260;
p_x = p_Z+8;
p_y = p_Z+4;