Ołkej. A jest coś w stylu 'FreeProxy', żeby odczytywało pakiety z tibii 8.54? Bo Freeproxy jest do 8.4
Wersja do druku
Ołkej. A jest coś w stylu 'FreeProxy', żeby odczytywało pakiety z tibii 8.54? Bo Freeproxy jest do 8.4
Adresy dzialaja, ale nie wiem czy poprawnie. Wysokosc napewno tak, ale gdy sprawdzam pos w carlin to wychodzi ok 32k tak powinno byc czy trzeba cos zmienic? I co z odczytaniem nicku?
Mi działają poprawnie
A z nickiem
Zrób pętle od zera do bl_max -1
w pętli odczytaj z nr indeksu id stworka jak będzie równy twojemu id to w rezultacie daj name
Chodzi o cos takiego?Kod:for i:=0 to BattleList_MaxCreatures-1 do
Begin
if BattleList.StepCreatures=Player_Id then
??
end;
Nie wiem jak zrobic cos w miejscu "??"
Kod:for Current := 0 to BL_Max do
begin
if ( ReadMemInt(BattleList_Start+(Current*BL_Size)+BL_Dist_ID) = Player_id ) then
begin
result:=ReadMemStr(BattleList_Start+(Current*BL_Size)+BL_Dist_Name);
end;
Nie mam BL_Size, BL_Dist_Id i BL_Dist_Name podal bys adresy? Current nie trzeba nigdzie definiowac tak?
~~[200]POST~~
idź najpierw naucz się programować a potem bież się za boty bo noobisz...
current to ma być int
a addresy masz w tibi api
A ja tak sobie myślę, czy bot obliczający szczegółowo zdobywany exp (średnio, ile do następnego levela itd.), jest przez CipSoft zakazany? Chodzi o to, że nie ingerowałby poważnie w klienta (LH, Cave Bot itd.), tylko odczytywał potrzebne dane.
Witam wszystkich
Mam pytanie.
Czy wiecie jak wyświetlić kompletne okno Battle(wszystkie pozycje-Nicki...)
w komponencie np.: TMemo razem z paskiem życia „ %”.
Prosił bym o kompletny kod.
Macie dziewki
Kod:unit Addresses;
interface
const
BattleList_Start = $637CE0;
BattleList_StepCreatures = $A8;
BattleList_MaxCreatures = 250;
BattleList_End = BattleList_Start + (BattleList_StepCreatures * BattleList_MaxCreatures);
Client_StartTime = $8034E8;
Client_XTeaKey = $7BC6E4;
Client_SocketStruct = $7BC6B8;
Client_RecvPointer = $5B25E4;
Client_SendPointer = $5B2610;
Client_FrameRatePointer = $7C07CC;
Client_FrameRateCurrentOffset = $60;
Client_FrameRateLimitOffset = $58;
Client_MultiClient = $5079B4;
Client_Status = $7BFC84;
Client_SafeMode = $7BCB0C;
Client_FollowMode = Client_SafeMode + 4;
Client_AttackMode = Client_FollowMode + 4;
Client_ActionState = $7BFCE4;
Client_ActionStateFreezer = $518F90;
Client_LastMSGText = $789CF8;
Client_LastMSGAuthor = Client_LastMSGText - $28;
Client_StatusbarText = $803508;
Client_StatusbarTime = Client_StatusbarText - 4;
Client_ClickId = $7BFD24;
Client_ClickCount = Client_ClickId + 4;
Client_ClickZ = Client_ClickId - $68;
Client_SeeId = Client_ClickId + 12;
Client_SeeCount = Client_SeeId + 4;
Client_SeeZ = Client_SeeId - $68;
Client_ClickContextMenuItemId = $7BFD30;
//Client_ClickContextMenuItemGroundId = ?
Client_ClickContextMenuCreatureId = $7BFD34;
Client_LoginServerStart = $7B7620;
Client_StepLoginServer = 112;
Client_DistancePort = 100;
Client_MaxLoginServers = 10;
Client_RSA = $5B2980;
Client_LoginCharList = $7BFC38;
Client_LoginCharListLength = $7BFC3C;
Client_LoginSelectedChar = $7BFC34;
Client_GameWindowRectPointer = $66F080;
Client_GameWindowBar = $8034F8;
Client_DatPointer = $7BC704;
Client_EventTriggerPointer = $51AA90;
Client_DialogPointer = $6723EC;
Client_DialogLeft = $14;
Client_DialogTop = $18;
Client_DialogWidth = $1C;
Client_DialogHeight = $20;
Client_DialogCaption = $50;
Client_LastRcvPacket = $7B7E98;
Client_DecryptCall = $45A775;
Client_LoginAccountNum = 0;
Client_LoginPassword = $7BFC40;
Client_LoginAccount = Client_LoginPassword + 32;
Client_LoginPatch = 0;
Client_LoginPatch2 = 0;
// Client_LoginPatchOrig = new byte[] { $E8, $0D, $1D, $09, $00 };
// Client_LoginPatchOrig2 = new byte[] { $E8, $C8, $15, $09, $00 };
Client_ParserFunc = $45A740;
Client_GetNextPacketCall = $45A775;
Client_RecvStream = $7BC6D4;
Container_Start = $66FB38;
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 = $450C90;
ContextMenus_OnClickContextMenuPtr = $44D870;
ContextMenus_OnClickContextMenuVf = $5B7878;
ContextMenus_AddSetOutfitContextMenu = $451BAC;
ContextMenus_AddPartyActionContextMenu = $451BFD;
ContextMenus_AddCopyNameContextMenu = $451C14;
ContextMenus_AddTradeWithContextMenu = $451839;
ContextMenus_AddLookContextMenu = $4516EF;
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_StepItems = $4C;
DatItem_Width = 0;
DatItem_Height = 4;
DatItem_MaxSizeInPixels = 8;
DatItem_Layers = 12;
DatItem_PatternX = 16;
DatItem_PatternY = 20;
DatItem_PatternDepth = 24;
DatItem_Phase = 28;
DatItem_Sprite = 32;
DatItem_Flags = 36;
DatItem_CanLookAt = 0;
DatItem_WalkSpeed = 40;
DatItem_TextLimit = 44;
DatItem_LightRadius = 48;
DatItem_LightColor = 52;
DatItem_ShiftX = 56;
DatItem_ShiftY = 60;
DatItem_WalkHeight = 64;
DatItem_Automap = 68;
DatItem_LensHelp = 72;
DrawItem_DrawItemFunc = $4B1B30;
DrawSkin_DrawSkinFunc = $4B57A0;
Hotkey_SendAutomaticallyStart = $7BCD08;
Hotkey_SendAutomaticallyStep = $01;
Hotkey_TextStart = $7BCD30;
Hotkey_TextStep = $100;
Hotkey_ObjectStart = $7BCC78;
Hotkey_ObjectStep = $04;
Hotkey_ObjectUseTypeStart = $7BCB58;
Hotkey_ObjectUseTypeStep = $04;
Hotkey_MaxHotkeys = 36;
Map_MapPointer = $676F40;
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 = $4EE519;
Map_NameSpy2 = $4EE51D;
Map_NameSpy1Default = 19061;
Map_NameSpy2Default = 16501;
Map_LevelSpy1 = $4F038A;
Map_LevelSpy2 = $4F048F;
Map_LevelSpy3 = $4F0510;
Map_LevelSpyPtr = $66F080;
Map_LevelSpyAdd1 = 28;
Map_LevelSpyAdd2 = $2A88;
Map_FullLightNop = $4E6C29;
Map_FullLightAdr = $4E6C2C;
// Map_FullLightNopDefault = new byte[] { $7E, $05 };
// Map_FullLightNopEdited = new byte[] { $90, $90 };
Map_FullLightAdrDefault = $80;
Map_FullLightAdrEdited = $FF;
Player_Experience = $637C4C;
Player_Flags = Player_Experience - 108;
Player_Id = Player_Experience + 12;
Player_Health = Player_Experience + 8;
Player_HealthMax = Player_Experience + 4;
Player_Level = Player_Experience - 4;
Player_MagicLevel = Player_Experience - 8;
Player_LevelPercent = Player_Experience - 12;
Player_MagicLevelPercent = Player_Experience - 16;
Player_Mana = Player_Experience - 20;
Player_ManaMax = Player_Experience - 24;
Player_Soul = Player_Experience - 28;
Player_Stamina = Player_Experience - 32;
Player_Capacity = Player_Experience - 36;
Player_FistPercent = $637BFC;
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 = $66FAC0;
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 = $637C60;
Player_TilesToGo = $637C64;
Player_GoToX = Player_Experience + 80;
Player_GoToY = Player_GoToX - 4;
Player_GoToZ = Player_GoToX - 8;
Player_RedSquare = $637C24;
Player_GreenSquare = Player_RedSquare - 4;
Player_WhiteSquare = Player_GreenSquare - 8;
Player_AccessN = 0;
Player_AccessS = 0;
Player_TargetId = Player_RedSquare;
Player_TargetBattlelistId = Player_TargetId - 8;
Player_TargetBattlelistType = Player_TargetId - 5;
Player_TargetType = Player_TargetId + 3;
Player_Z = $672428;
Player_X = Player_Z+8;
Player_Y = Player_Z+4;
Player_AttackCount = $635800;
Player_FollowCount = Player_AttackCount + $20;
TextDisplay_PrintName = $4F14F3;
TextDisplay_PrintFPS = $458778;
TextDisplay_ShowFPS = $6358FC;
TextDisplay_PrintTextFunc = $4B0F70;
TextDisplay_NopFPS = $4586B4;
Vip_Start = $635978;
Vip_StepPlayers = $2C;
Vip_MaxPlayers = 200;
Vip_DistanceId = 0;
Vip_DistanceName = 4;
Vip_DistanceStatus = 34;
Vip_DistanceIcon = 40;
Vip_End = Vip_Start + (Vip_StepPlayers * Vip_MaxPlayers);
implementation
end.
Nie strugaj kozaka bo jeszcze za chudy w uszach jesteś synek a skopiować adresy z TibiaApi potrafi nawet upośledzone umysłowo dziecko.
Battlelista w pamięci jest reprezentowana przez tablicę bajtów o stałym rozmiarze.
Każda kreatura ma przydzieloną stała ilość bajtów na informację takie jak Nick, ID, HP itp..
Cała sztuka polega na tym aby odczytać sobie całą battelist'e do jakiejś swojej zmiennej tablicowej, podzielić sobie ją na odpowiednie części i przelecieć po niej pętelką.
Załóżmy, że jedna kreatura to 160 bajtów a na całej battleliście znajduje się 250 kreatur.
Proste działanie matematyczne (160*250 = 40000) daje nam rozmiar całej battlelisty.
Teraz pętla może wyglądać tak
w ten sposób na końcu otrzymamy ładną tablicę wszystkich kreatur znajdujących się na battleliście, którą później możemy pokazać w jakiejś formatce.Kod:$n = 0;
for($i=0;$i<=40000;$i+=160)
{
$creature[n] = copy($battleist,$i+160); //jakaś funkcja, ktora do tablicy $creature skopiuje nam 160 bajtów z tablicy battleist
$n++;
// wyciągamy sobie poszczególne wartości wiedząc, że ID to 4 bajty, nick 32 i tak dalej i tak dalej i tak dalej.
}
Oczywiście można to trochę poszerzyć robiąc np klasę Creature, która w konstruktorze z otrzymanej tablicy bajtów będzie wyciągała informację i zapisywała je do odpowiednich pól.
(wszystkie liczby są oczywiście z dupy wzięte i miały służyć tylko do zademonstrowania samej logiki tak samo jak funkcje)
Masz racje miałem trochę gorszy dzień... Jakie addresy? Na tpforums prosiłem cie o pomoc z onclick w contextmenu ale sobie poradziłem starczyło dać konwersje na ;stdcall
Myślisz nie dam rady tego napisać? A poprawiać? Pewnie masz więcej doświadczenia ale uwierz jestem w stanie napisać tego bota.
Spróbuj uaktualnić addresy z confingu blackd może da rady
Znalazlem ciekawy ots pod tibia 8.42 i chcialbym pod niego napisac bota i mam nadzieje, ze robiac to uda mi sie nauczyc czegos nowego. Adresy mam z tibiaapi, ale skad wzisc packet.dll pod 8.42? Czy moze packet.dll jest taki sam dla wszystkich wersji tibi? Kiedy uzywalem mojego pierwszego bota, posiadajacego tylko prosty spell caster w cliencie pojawial mi sie jakis pionowy pasek, jak temu zaradzic?
A co zrobic z migajacym pionowym paskiem? Nie wiem tez jak podpiac sie pod przerobionego clienta. Probowalem czegos takiego:bo tak jest w menadzerze zadan, ale ogarnolem, ze wczesniej bylo poprostu Tibia Client bez zadnego rozszezenia.Kod:GetWindowThreadProcessId(FindWindow('DBVictory - War (v1.50).exe',Nil), @ProcId);
Klubster na tpforums napisał coś takiego
Temat masz tuCytuj:
RE: Elfbot on own made ot client
hex editor and change CMainFrame to TIbiaclient
http://www.tpforums.org/forum/thread-7288-page-1.html
I źle użyłeś findwindow
Używa się go tak function FindWindow(lpClassName, lpWindowName: PChar): HWND;
lpClassName - nazwa klasy okna nie tego jak figuruje u ciebie w procesach (bo wątpie że tak klasa się nazywa)
lpWindowName - może być na nil to nazwa okna
A napisal bys jak to konkretnie dla tego clienta zrobic? Ja sie troche pogubilem juz, moze dlatego, ze jestem zmeczony po 9 lekcjach :( to przegiecie tyla nam dowalic w poniedzialek. Z ta poprawiona funkcja dalo by rade to zrobic bez edycji hexkow?
Jakby speedyshare nie dzialalKod:http://www.speedyshare.com/files/24313868/DBVictory_-_WAR_v1.50_.zip
Sciagnolem xvi32, ale chyba nie jest tak prosto :(Kod:http://www10.zippyshare.com/v/70950192/file.html
On działa na zasadzie PokemonOnline chyba zresztą w to się nie bawiłem
Uchwyt możesz pobrać też w taki sposób
dajesz h:= FindWindow(nil,'DBV WAR'); a potem zmieniaj nazwę okna na np
Bot - Player Name
Do tego służy SetWindowText(h,pchar(text));
h: to uchwyt okna który pobrałeś wcześniej możesz go dać do globalnej zmiennej i pobierać na starcie aplikacji wtedy nie będziesz musiał znajdować go przy każdej próbie doczytania adddresu z pamięci czy wysłania pakietu
text: to nowa nazwa okna
Powinno działać.
Dodajac to jako zmienna globalna mam to wsadzic podi ma to tak wygladac?Kod:implementation
{$R *.dfm}
h:= FindWindow(nil,'DBV WAR');
A np do timera dodac to:Nie moge teraz tego przetestowac, bo jestem na informatyce, na ktorej cisniemy worda...Kod:SetWindowText(h,pchar("Bot - "Player_Name ));
Tak powinienem to zrobic?
jak masz
Potem daj na form create h:= FindWindow(nil,'DBV WAR');Kod:var
Form1: TForm1;
tu daj
h: hwnd;
{$R *.dfm}
I do timera to co chcesz dać do timera
Zrobilem tak jak pisales, ale cos nie wyszlo. http://img811.imageshack.us/img811/8900/dephi.png
#up:
Nie, żebym się wtrącał w tę rozmowę, ale... umiesz wogóle pisać w Delphi?
Bo jeśli nie wiesz co zrobiłeś źle na tym screenie, to oznacza, że nie masz podstawowej.. kardynalnej wiedzy o tym języku.
Das opadły mi rency jak to das zobaczyłem...
Przeczytaj jeszcze raz to co napisałem w poprzednim pości i przemyśl jak nadal nie będziesz wiedział ocb (dobre blety) to poleć tutaj... Pamiętaj że jak będziesz pisał bardziej skomplikowane rzeczy będziesz musiał myśleć sam w sumie dobrze by było żebyś teraz też sam pomyślał...
@up genialnie powiedziane
Napisz ten kod w jakiejś procedurze.
PRZYKŁAD:
...wywołujesz przez nazwe funkcji, np:Kod:procedure Find;
var
H : HWND;
begin
H := FindWindow(nil, 'DBV WAR');
end;
Kod:procedure TForm1.Button1Click(Sender: TObject);
begin
Find;
end;
Awangarda w delphi, wywołanie procedury w sekcji deklaracji zmiennych.
Poza tym jak zwykle słuchacie przygłupa i jak zwykle nikt na tym dobrze nie wyjdzie. Dużo wydajniejszą metodą jest chociażby zrobienie sobie listy działających procesów i znalezienie tego, który jest na potrzebny.
Podstawowa wiedze chyba mam. Co oznacza to HWND? Czytalem jakies kursy, ale bylo to raczej podstawy. Znacie jakies dobre kursy online? Albo e-booki po polsku?
Sproboje zrobic tak jak pisal Kambel, teraz nie jestem w stanie bo siedze w szkole.
Yaboo, liste dzialajacych procesow mozna znalesc w menadzerze zadan, znalazlem dbvictory cos tam.exe, ale tak nie dziala. Pisalem o tym strone wczesniej.
Słuchaj tu masz spisaną książkę "Kompendium Programisty" Delphi 7 Adama Boducha.
CLICK
Zrobilem tak jak pisaliscie, ale nadal nie dziala. Poprawilem wczesnijsze procesy i nadal nic. Napewno powinno tam byc DBV War?
Tak zmienilem stare procesy, to jest zle czy nie jestes pewien LGTK?
Z reszta zrobilem tak jak pisaliscie. A FindWindow nie chcialem, ale stwierdziles, ze tak jest lepiej.Kod:GetWindowThreadProcessID(FindWindow('DBV WAR', nil), @proc_ID);
Nie wydaje mi sie zebym to haotycznie napisal. Mozliwe, ze poprostu jestes nie w temacie.
To dodalem przed funkcje czytajace:
To do jakiegos buttonaKod:procedure Find;
var
H : HWND;
begin
H := FindWindow(nil, 'DBV WAR');
end;
Czyli tak jak pisales, ale nadal nic nie dziala. Stwierdzilem, ze powodem tego sa zle ustawienia funkcji czytajacych.Kod:procedure TForm1.Button1Click(Sender: TObject);
begin
Find;
end;
Dlatego zmienilem to:
Na to:Kod:GetWindowThreadProcessId(FindWindow('TibiaClient',Nil), @ProcId);
Niestety nadal nie czyta ilosc hp itp. We wczesnijszym poscie spytalem sie LGTK czy jest pewien, ze ten proces to DBV WAR, ale jeszcze nie uzyskalem odpowiedzi. Jezeli moglbys sprawdzic jaki to proces, strone wczesniej podalem link do clienta.Kod:GetWindowThreadProcessId(FindWindow('DBV WAR',Nil), @ProcID);
Polaczenie z programem nie musi byc koniecznie przez FindWindow, ale takie opisal mi LGTK, wiec go uzylem, jezeli znasz jakies lepsze chetnie go urzyje. Mam nadzieje, ze nie jest tak haotycznie jak ostatnio, o ile wogole bylo tak napiasane.
Sam sprawdź :)
X - klasa.
Y - tytuł okna.
FindWindow(nil, Y); <- w drugim parametrze dajemy tytuł okna w ''.
FindWindow(X, nil); <- w pierwszym parametrze dodajemy klasę.
tu masz przykład:
Jeżeli jest uruchomione okno o nagłówku Unit1.pas to wyswietli sie wiadomosc, popróbuj tak z procesem klienta.Kod:var
H : HWND;
begin
H := findwindow(nil, 'Unit1.pas');
if H > 0 then
Showmessage('Okno jest uruchomione');
end;
Blyskawiczna odpowiedz :D
Juz tak probowalem. Sprawdzilem proces w menadzerze, dodalem go do procedury findwindow, ale cos bylo nie tak. Jezeli klasa jest rowna null, w delphi nil to tytulem okna moze byc tibia.exe albo tibiaclient?
Gdybym sam umial sprawdzic jak to jest zamiast tibiaclient nie bylo by pewnie paru moich postow.
to na 100% Ci pomoże:
Winspector - program za pomocą którego odczytamy klasę okna :)
1 link z google - http://www.softpedia.com/progDownloa...ad-117157.html
Linka nie musiales dawac, a poza tym i tak nie dziala. Sam troche poszukalem i znalazlem. Sprawdzilem i wychodzi cos takiego:
http://img204.imageshack.us/img204/9564/wsp.png
Probowalem juz DBV War, ale jak porownalem to ze zwykla tibia to wyszlo mi, ze proces to GuVaFeAdefI. Niestety nadal nie dziala :(
Dzieki mistrzu!
Zmiana nazwy dziala napewno, bo udalo mi sie to juz sprawdzic. Innych funkcji narazie nie zobacze bo wszystkie servery padly :(
Wczesniej robilem tak:
Czyli wystarczylo tylko zmienic kolejnosc. Odwiedzaj temat czesto, bo zapewne niedlugo bede potrzebowal pomocy jeszcze w czyms xDKod:FindWindow(nil, 'DBV WAR');
Jeszcze raz dzieki
Witam
Mam problem z moim botem od ostatniej zmiany w looterze mój bot po pewnym czasie przestaje działać , przestaje odczytywać wartości z tibi i funkcjonować nie wiem od czego może się tak robić, u mojego kumpla nawet zacina się cały ;/
Próbowałem zmniejszać czas timerów ale nic nie pomogło może to coś z pętlami ale dokładnie nie jestem pewny jeśli ktoś by wiedział od czego może się tak dziać to dzięki za odp.
Kambel to nie jest to dodałem tą procedurke w paru miejscach i dalej przestaje działać a u mojego kumpla się cały zacina. Nie chce mi się już kolejny raz tego poprawiać bo już siedzę nad tym już sporo czasu i nadal coś sie psuje ;/