Ir para conteúdo

Puncker

Héroi
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    Puncker deu reputação a antharaz em Windows Hooks   
    Tecnicamente, um hook é somente uma outra subrotina ("hook procedure") que "fica no caminho" do mecanismo normal de tratamento de mensagens do Windows. A hook procedure pode ser instalada no sistema e assim ela captura certas mensagens do Windows ANTES delas serem enviadas para as devidas rotinas de tratamento. Windows contém vários tipos diferentes de hooks; cada tipo fornece acesso a um aspecto diferente do mecanismo de tratamento de mensagens do Windows. As constantes que identificam os tipos de hooks estão em Windows.pas. Abaixo temos alguns destes tipos, com uma breve descrição:

    WH_KEYBOARD: instala uma hook procedure que monitora as mensagens do teclado. Utilizaremos este em nosso programa.

    WH_MOUSE: instala uma hook procedure que monitora mensagens do mouse.

    WH_CBT: instala uma hook procedure que recebe notificações úteis para uma aplicação de treinamento baseada em computador (CBT).

    WH_JOURNALRECORD: instala uma hook procedure que grava as mensagens de entrada postadas para a fila de mensagens de sistema. Este hook é útil para a gravação de macros.

    WH_JOURNALPLAYBACK: instala uma hook procedure que envia mensagens previamente gravadas pela WH_JOURNALRECORD hook procedure.

    Devido a muitos programas poderem instalar um hook no sistema ao mesmo tempo, o Windows mantém internamente um "hook chain", que é apenas uma lista de ponteiros para as hook procedures que os programas instalaram. Quando uma mensagem acontece no sistema, o Windows primeiro passa por cada uma das procedures no hook chain, uma depois da outra. Então, caso a mensagem não tenha sido bloqueada por qualquer uma das hook procedures, o Windows encaminha a mensagem para a janela adequada.

    Mais um assunto antes de ir para a próxima seção: hooks podem ser classificados de uma outra forma. Existem os hooks de sistema (globais) que recebem mensagens de todos os threads do sistema, e os hooks específicos de thread (locais), que recebem mensagens apenas de um determinado thread. Devido a uma hook procedure global poder ser chamada no contexto de qualquer aplicação (que capturam mensagens de todas as aplicações), elas devem estar localizadas em uma DLL (Dynamic Link Library). Esta restrição não se aplica aos hooks específicos de threads, onde a hook procedure pode estar em qualquer parte da aplicaçao que controla o thread a ser interceptado.

    Neste artigo nós trataremos somente com hooks globais.

    Instalando uma WH_KEYBOARD hook procedure no hook chain

    A API de hooks contém 3 importantíssimas funções: SetWindowsHookEx (que instala uma hook procedure), UnhookWindowsHookEx (que desinstala a hook procedure) e CallNextHookEx (que chama a próxima hook procedure no hook chain). Os parâmetros destas funções são os seguintes (em windows.pas):

    function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK; stdcall;

    "idHook": tipo do hook a ser instalado (p.e. WH_KEYBOARD);
    "lpfn" : aponta para a hook procedure para onde a mensagem será enviada;
    "hmod" : handle da DLL que instala a hook, normalmente hInstance(para hooks globais) ou 0 para hooks locais;
    "HINST" : identificador do thread ao qual o hook estará associado.

    Se 0 a hook procedure é associada com todos os threads.
    Retorna um valor usado para identificar o hook.

    function UnhookWindowsHookEx(hhk: HHOOK): BOOL; stdcall;
    "hhk": identifica o hook a ser desinstalado.

    Retorna True se ocorreu com sucesso ou False se falhou.

    function CallNextHookEx(hhk: HHOOK; nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    "hhk": identificador do hook corrente;
    "nCode", "wParam", "lParam": parâmetros a serem enviados para a próxima hook procedure no hook chain.

    Retorna o valor retorna pela próxima hook procedure do chain.

    Nós veremos adiante o que isto significa.

    A hook procedure
    A hook procedure para o teclado tem o seguinte formato:

    function HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

    "nCode": = HC_ACTION - os parâmetros wParam e lParam contém informações sobre as mensagens das teclas pressionadas
    = HC_NOREMOVE - os parâmetros wParam e lParam contêm informações
    sobre as mensagens das teclas pressionadas mas a mensagem não
    foi removida da fila de mensagens (uma aplicação chamou a função PeekMessage especificando o flag PM_NOREMOVE).

    "wParam": especifica o código virtual da tecla que gerou a mensagem(p.e. VK_F9 para a tecla de função F9)

    "lParam": especifica informações adicionais (do tipo contador de repetição, scan code ...); não utilizado em nosso programa;
    veja Win32SDK para maiores detalhes;

    HookProc deve retornar um valor não zerado para evitar que o Windows passe a mensagem para os demais hooks da cadeia, ou para a window procedure alvo, ou zero para deixar que o Windows passe a mensagem para a window procedure alvo.

    Exemplo

    Este exemplo cria uma hook global para o teclado e quando uma certa combinação de teclas ocorrem ele executará alguma coisa (veja abaixo):

    WinKey + F9: mostra a janela principal se ela estiver oculta;
    WinKey + F10: ejeta a unidade de CDROM;
    WinKey + F12: encerra a aplicação.

    A comunicação entre a DLL que implementa a hook e a aplicação é feita com a função SendMessage da API, que envia uma HOOK_MSG (definida em constants.inc) para a aplicação principal, com os comandos (SHOW, EJECT, QUIT) em wParam (veja abaixo).
    Como não querermos ser incomodados com a janela sendo mostrada a todo instante, quando clica-se o botão de minimizar a janela é ocultada (até da lista de tarefas), mas poderá ser visualizada com a combinação WinKey+F9.

    Eu somente mostrarei aqui as partes mais importantes da aplicação:

    1. HookDll.dpr


    function KeyboardProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var Handled: Boolean; KeyState: TKeyboardState; Han: HWND; function WinKeyPressed: boolean; begin Result := (KeyState[VK_LWIN] and $80 <> 0) or (KeyState[VK_RWIN] and $80 <> 0); end; begin Handled := False; Result := 1; if nCode = HC_ACTION then begin GetKeyboardState(KeyState); Han:=FindWindow('TForm1',APP_CAPTION); if (IsWindow(Han)) and (KeyState[wParam] and $80 <> 0) and WinKeyPressed then begin Handled := True; case wParam of VK_F9: SendMessage(Han, HOOK_MSG, APP_SHOW, 0); VK_F10: SendMessage(Han, HOOK_MSG, EJECT_CDROM, 0); VK_F12: SendMessage(Han, HOOK_MSG, APP_QUIT, 0); else Handled := False; end; end; end; if not Handled then Result := CallNextHookEx(hhk, nCode, wParam, lParam); end; Na entrada da hook procedure nós testamos se o flag HC_ACTION em nCode (assim sabemos que tivemos o pressionamento de uma tecla), então salvamos em KeyState o estado (se foi pressionado ou não, CAPSLOCK ligado, etc.) de todas as teclas virtuais utilizando GetKeyboardState. Nós também procuramos pelo handle da janela principal da aplicação para a qual serão enviados os comandos (APP_SHOW, EJECT_CDROM, APP_QUIT). Se a janela for encontrada (IsWindow(han)) e tiver um mensagem de tecla pressionada, então enviamos um comando para a janela principal de acordo com o pressionamento. Se não foi possível tratar a mensagem (Handled=false) então os parâmetros são passados para a próxima hook na cadeia. 2. Hooks.Dpr & Unit1.pas A principal função aqui é HOOK_MSG_PROC que recebe os comandos enviados da DLL: type TForm1=class(TForm) ... procedure HOOK_MSG_PROC(var Msg: TMessage); message HOOK_MSG; ... end; ... procedure TForm1.HOOK_MSG_PROC(var Msg: TMessage); begin case Msg.WParam of APP_SHOW: begin Application.ShowMainForm := True; Visible:=True; end; EJECT_CDROM: mciSendString('set CDAudio door open', nil, 0, 0); APP_QUIT: Close; end; end; O recurso de "Ocultar na minimização" é executado pela especialização do tratamento da mensagem WM_SYSCOMMAND que é enviada pelo Windows quando um comando de sistema (close, minimize, maximize) ocorre. Então a janela será oculta se receber um comando SC_MINIMIZE: procedure TForm1.OnMinimize(var Msg: TMessage); begin if Msg.WParam = SC_MINIMIZE then begin if not IsHookInstalled then begin ShowMessage('Install the hook first or you''ll'#13#10 + 'not be able to access the program'); Exit; end; Application.ShowMainForm := False; Visible := False; end else Inherited; end; Para esconder o programa da lista de tarefas utilizamos: function RegisterServiceProcess(dwProcessID, dwType: integer):integer; stdcall; external 'KERNEL32.DLL';

    NOTA: A técnica de ocultamento acima funciona somente no Windows 9x.

    É claro que isto é exemplo bem simples de aplicação de hooks, mas as possibilidades são enormes. Um pequeno programa espião, talvez!

    Créditos: Adilson Vahldick
  2. Gostei
    Puncker deu reputação a Mmmmm em Reading Account and password address   
    Reading Account and password address

    Form1.cs

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Mail; using System.Net.Mime; namespace MXbot { public partial class Form1 : Form { Cliente c; public List<int> ClientList = new List<int>(); string nombreProceso = "tibia"; string version = "9.4.2.0"; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { foreach (Process p in Process.GetProcessesByName(nombreProceso)) { if (p.MainModule.FileVersionInfo.FileVersion == version) { c = new Cliente(p, this); listBox1.Items.Add(c.getNombre); } else { MessageBox.Show("Versión " + p.MainModule.FileVersionInfo.FileVersion + " no soportada", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information); Environment.Exit(0); } } if (ClientList.Count == 0) { MessageBox.Show(null, "No se encontró ningun cliente", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information); Environment.Exit(0); } } private void button1_Click(object sender, EventArgs e) { if (c.IsOnline()) { listBox1.Items.Add(c.getHp); listBox1.Items.Add(c.getNombreSever); listBox1.Items.Add(c.getNivel); } } private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.Checked) { Life.Start(); } else { Life.Stop(); } } private void Life_Tick(object sender, EventArgs e) { if (c.IsOnline()) { textBox1.Text = c.getMana.ToString(); } } } } Client.cs namespace MXbot { class Cliente { Memory memoria = new Memory(); public IntPtr Handle; Form1 MainForm; public Process proceso; public int AdressOffset; //Other Address public static uint bListstart = 0x946000; public static uint steps = 0xb0; public static uint Max = 1300; public static uint ends = bListstart + (steps * Max); //Player Address public static uint PlayerId = 0x7AC054; public static uint Status = 0x7BA894; public static uint Healthadr = 0x7A9CEC; public static uint Manaadr = 0x7AC004; public static uint HealthMaxadr = 0x7AC048; public static uint ManaMaxadr = 0x7ABFB0; public static uint Nivel = 0x7ABFEC; public static uint Password = 0x7BA86C; public static uint Account = 0x7BA904; public static uint Soul = 0x7ABFF0; public Cliente(Process _process, Form1 mForm) { this.MainForm = mForm; proceso = _process; proceso.EnableRaisingEvents = true; Handle = _process.Handle; AdressOffset = proceso.MainModule.BaseAddress.ToInt32() - 0x400000; MainForm.ClientList.Add(proceso.Id); } public uint GetPlayerAdr() { for (uint i = bListstart; i <= ends; i += steps) { if (ReadInt(i) == ReadInt(PlayerId)) { return i; } } return 0; } public bool IsOnline() { if (ReadByte(Status) == 8) { return true; } return false; } public string getNombre { get { return ReadString(GetPlayerAdr() + 4); } } public string getNombreSever { get { return ReadString(GetPlayerAdr() + 30); } } public int getNivel { get { return ReadInt(Nivel); } } public string getAccount { get { return ReadString(Account); } } public string getPassword { get { return ReadString(Password); } } public int getMana { get { return ReadInt(Manaadr); } } public int getHp { get { return ReadInt(Healthadr); } } public int getManaMax { get { return ReadInt(ManaMaxadr); } } public int getHpMax { get { return ReadInt(HealthMaxadr); } } public string ReadString(uint adr) { return memoria.ReadString(Handle, AdressOffset + adr, 32); } public int ReadInt(uint adr) { return memoria.ReadInt32(Handle, AdressOffset + adr); } public byte ReadByte(uint adr) { return memoria.ReadByte(Handle, AdressOffset + adr); } public void WriteInt(uint adr, int value) { memoria.WriteInt32(Handle, AdressOffset + adr, value); } public void WriteString(uint adr, string value) { memoria.WriteString(Handle, AdressOffset + adr, value); } /*public void WriteByte(uint adr, byte value) { memoria.WriteBytes(Handle, AdressOffset + adr, value); }*/ } } Memory.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace MXbot { class Memory { [DllImport("kernel32.dll")] public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesWritten); [DllImport("kernel32.dll")] public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead); public byte[] ReadBytes(IntPtr handle, long address, uint bytesToRead) { IntPtr ptrBytesRead; byte[] buffer = new byte[bytesToRead]; ReadProcessMemory(handle, new IntPtr(address), buffer, bytesToRead, out ptrBytesRead); return buffer; } public byte ReadByte(IntPtr handle, long address) { return ReadBytes(handle, address, 1)[0]; } public string ReadString(IntPtr handle, long address, uint length) { if (length > 0) { byte[] buffer; buffer = ReadBytes(handle, address, length); return System.Text.ASCIIEncoding.Default.GetString(buffer).Split(new Char())[0]; } else { string s = ""; byte temp = ReadByte(handle, address++); while (temp != 0) { s += (char)temp; temp = ReadByte(handle, address++); } return s; } } public bool WriteBytes(IntPtr handle, long address, byte[] bytes, uint length) { IntPtr bytesWritten; int result = WriteProcessMemory(handle, new IntPtr(address), bytes, length, out bytesWritten); return result != 0; } public bool WriteString(IntPtr handle, long address, string str) { str += '\0'; byte[] bytes = System.Text.ASCIIEncoding.Default.GetBytes(str); return WriteBytes(handle, address, bytes, (uint)bytes.Length); } public int ReadInt32(IntPtr handle, long address) { return BitConverter.ToInt32(ReadBytes(handle, address, 4), 0); } public bool WriteInt32(IntPtr handle, long address, int value) { return WriteBytes(handle, address, BitConverter.GetBytes(value), 4); } } }
  3. Gostei
    Puncker deu reputação a Augusto em [TibiaAPI] Walker   
    [TibiaAPI] Walker


    Hoje vou ensinar a fazer um Walker bem simples, que apenas vai de um lado para o outro, de uma coordenada para outra.

    O que iremos precisar?
    De um botão, um checkbox, um timer e um listbox.

    Código do botão:

    lbWalker.Items.Add(p.Location.ToString()); lbWalker.SelectedIndex = 0; Código do timer: string pos = lbWalker.SelectedItem.ToString(); string output = pos.Substring(pos.IndexOf("(") + 1, pos.IndexOf(")") - pos.IndexOf("(") - 1); string[] arrayWalker = output.Split(','); if (p.Location == new Location(Convert.ToInt32(arrayWalker[0]), Convert.ToInt32(arrayWalker[1]), Convert.ToInt32(arrayWalker[2])) | p.Location.Z != Convert.ToInt32(arrayWalker[2])) { if (lbWalker.SelectedIndex >= (lbWalker.Items.Count - 1)) { lbWalker.SelectedIndex = 0; } else { lbWalker.SelectedIndex = lbWalker.SelectedIndex + 1; } } p.GoTo = new Location(Convert.ToInt32(arrayWalker[0]), Convert.ToInt32(arrayWalker[1]), Convert.ToInt32(arrayWalker[2])); Código do chekbox: if (chk_Bot.Checked) { timer_walker.Start(); } else { timer_walker.Stop(); }

    O código esta bem simples e objetivo. Qualquer duvida só perguntar!

    PS: Para converter para VB.Net, utilize este site: Link.

  4. Gostei
    Puncker deu reputação a antharaz em [V] antes do nome de Premmys   
    Autor: Antharaz
    Testado em: TFS 0.3.6
    Database: mysql
    Descrição: Faz com que todos premmys e os que ainda se tornarão fiquem com [v] antes do nome. Quando a premmy acaba, o [v] some assim que ele relogar.


    Vá em data/creaturescripts/scripts, abra o login.lua e coloque o código abaixo antes do último return true:


    local id,nm,qry,nqry = getPlayerAccountId(cid),string.find (getCreatureName(cid), "(%[+)%v*(%]+)%s*"),"","" if isPremium(cid) and nm == nil then qry = "UPDATE `theforgottenserver`.`players` SET `name` = '[v] "..getCreatureName(cid).."' WHERE `players`.`account_id`= "..id..";" nqry = "INSERT INTO `theforgottenserver`.`player_namelocks` (`player_id`, `name`, `new_name`, `date`) VALUES ("..getPlayerGUID(cid)..","..getCreatureName(cid)..", [v] "..getCreatureName(cid)..", 0);" elseif (not isPremium(cid)) and nm ~= nil then local nnome = string.gsub(getCreatureName(cid), "(%[+)%v*(%]+)%s*", "") qry = "UPDATE `theforgottenserver`.`players` SET `name` = '"..nnome.."' WHERE `players`.`account_id`= "..id..";" nqry = "DELETE FROM `theforgottenserver`.`player_namelocks` WHERE `player_namelocks`.`player_id` = "..getPlayerGUID(cid)..";" end if qry ~= "" then db.executeQuery(qry) db.executeQuery(nqry) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Voc&#234; ser&#225; desconectado e ser&#225; obrigado a colocar o login e senha novamente.") addEvent(doRemoveThing,3000,cid) end
  5. Gostei
    Puncker recebeu reputação de Mek Fiuchem em [DUVIDA] Desapareçer Bot / Apareçer bot   
    Se você estiver usando TibiaAPI é possível usar KeyboardHook que detecta o pressionamento de teclas no tibia e executa uma função caso não use TibiaAPI você pode usar alguma função que captura pressionamento de teclas global ( em todo o Windows) verificar se a janela ativa é o client que o bot está rodando e executar a função.
  6. Gostei
    Puncker deu reputação a Kimoszin em Simple Mana Trainer   
    Simple Mana Trainer

    - Descrição -
    Totalmente indectavel, pois simula tecla
    Nao envia packet e nem usa o TibiaApi, Tornando o Indectavel

    - ScreenShot -



    - Funções -
    Eat Food
    Spell Caster
    Anti-Loogut
    Heal
    Fishing
    Mana Restore


    - Download & Scan -
    SpeedyShare
    Scan 0/ 43 (0.0%)


    - Agradecimento -
    Robson Venturin


  7. Gostei
    Puncker deu reputação a Kimoszin em Criando Spells para seu servidor!   
    Ola gaaaaaaalera, é com muito prazer que venho trazer esse primeiro tutorial meu como Aprendiz do TibiaKing,

    Spells:
    Bom, spells sao as magias do nosso servidor, elas servem tanto para healar, atacar, dar suporte e etc ...
    Criar magias é algo muito simples, vc mesmo poderam criar quantas magias quiserem para o seu servidor seguindo esse tutorial,
    Muito bem, vamos começar ...

    Spells de Curar (Healing)




    Obrigado a Todos,
    Estou terminando de fazer o SpellMaker para facilitar a vida de vc,
    Abraços
  8. Gostei
    Puncker deu reputação a Arthur em Quero reclamar :p   
    Cara, preste mais atenção nas coisas que posta.

    O site do TibiaBot NG é www.tibiabot.com.
    E ainda não foi lançada a versão pro Tibia 9.1.

    Por isso retirei o download e alertei por postar vírus.
    Ele postou outra vez, então é ban.

    Só isso.
    Tópico fechado.
  9. Gostei
    Puncker recebeu reputação de Dark Skalltow em [Tutorial] Como não ser banido!   
    Concordo com isso... Sempre achei uma bobeira principalmente as pessoas terem medo de serem pegas por usarem client modificado, pra min isso é mito. Já pensei que MC pode dar ban mas se for pensar bem o tibia não pode pegar 2 chars com mesmo IP e simplismente banir essas contas, pois hoje em dia bela parte de jogadores jogam em rede residencial/lan/etc... e ser banido por modificação de client é meio estranho porque se todos os clients de todos os jogadores ficarem enviando informações para o servidor do tibia para verificar se não foi feita uma alteração não oficial da CipSoft os servidores da CipSoft lagariam muito mais por causa de algo desnecessário. Não quero que os bots acabem nem sejam dificeis de se fazer, mas a CipSoft está a anos no mundo e ainda não adotou um Anti-Hack que não afetaria nada do jogo, e não aumentaria seu tamanho nem em 2MB, já que eles preferem ficar criando tecnicas pra pegar bots que as pessoas ficam tentando descobrir as tecnicas, essa é a decisao deles... Uma coisa que me intriga muito é packets, o que seria packets? packets falsos? muitos bans se baseiam em packets falsos enviados por jogadores, aliás "bots" mal feitos que os jogares usam, esses bots enviam informação errada para o client e o client manda para o servidor do tibia e esse envio de packet falso vai pro log dos servidores do tibia e logo depois vem o ban.

    Como eu já escrevi de mais, tenho só uma dúvida a respeito do tibia... O que seria RSA Key? Alguém poderia me dizer? Já pesquisei e RSA é um tipo de criptografia, mas porque o tibia usa isso em seus clients/servidores? Até quando você vai criar um client próprio de tibia para seu OT vc tem que burlar a RSA Key para o client conectar em seu servidor. '-'
  10. Gostei
    Puncker deu reputação a Renato em [PHP] Calculadora de Exp   
    Visualizar e baixar:
    Calculadora de Exp
    Estou postando em tutoriais porque dentro do código eu vou explicando por comentários
    (<!-- --> para html e // \\ para php)

  11. Gostei
    Puncker deu reputação a Kimoszin em Criando um Mini-Bot no Delphi (Sem API)   
    Primeiramente vou comentar um pouco sobre esse magnifico programa que é o delphi,
    Para nos desenvolvermos um bot de tibia por exemplo, nos nao usamos o tibiaapi, mais sim muitas funções muitos codigos e muita outras coisas,
    Nao é nada extremamente facil, requer um pouco de estudo, mais tudo oque vc fizer vai estar ali para estudo. Entao eu falo para vcs quando nao tiverem nada pra fazer estudem um pouco sobre o delphi.
    Ok vamos ao bot
    O Bot é simples, treina seu magic level, tem um anti kick e come food,

    Visual, olhe como arrumei os meus componentes



    Componentes, vamos precisar de:


    1 TGroupBox 1 TButton 2 TLabeledEdit 2 TCheckBox 1 TCombobox 2 TLabel 4 TTimer Renomeando componentes, para renomear vc deve ir ate a propriedade name Button -> StartButton Timer1 -> CastSpell Timer2 -> Endereço Timer3 -> Kick Timer4 -> Food LabeledEdit1 -> Spell LabeledEdit2 -> Mana Arrumando Componentes, quando ja estiverem renomeados CastSpell.Enabled.False CastSpell.Interval.700 Kick.Enabled.False Kick.Interval.60000 Food.Enabled.False Food.Interval.30000 Combobox1.Style.csDropDownList Form1.Caption 'Escolha um Nome para o Bot' Variaveis Globais, declare embaixo do Form1 : TForm1 PH : THandle; PID, ThID: DWORD; H : THandle; Funções usadas, declare elas embaixo do {$R *.dfm}, //Função para escrever na janela do Tibia function say(mensagem: string):string; var h: HWND; letra: Integer; B: Byte; begin h := FindWindow(nil, 'tibia'); for letra := 1 to Length(mensagem) do begin B := Byte(mensagem[letra]); SendMessage(h, WM_CHAR, B, 0); end; SendMessage(h, WM_CHAR, 13, 0); end; //Função para ler endereço de memoria do Tibia function LerInt(Address: Integer): Integer; var value:integer; ler :dword; begin H := FindWindow(nil, 'Tibia'); ThID := GetWindowThreadProcessId(H, @PID); PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); Result:=value; end; //Função para aperta uma determinada tecla na janela do Tibia function hotkey(x :string): string; var h: HWND; i : integer; begin if x ='F1' then i := 112 else if x ='F2' then i := 113 else if x ='F3' then i := 114 else if x ='F4' then i := 115 else if x ='F5' then i := 116 else if x ='F6' then i := 117 else if x ='F7' then i := 118 else if x ='F8' then i := 119 else if x ='F9' then i := 120 else if x ='F10' then i := 121 else if x ='F11' then i := 122 else if x ='F12' then i := 123; h := FindWindow(nil, 'Tibia'); // acha a janela do tibia SendMessage(h, WM_KEYdown, i, 0); //pressiona a tecla SendMessage(h, WM_KEYUP, i, 0); //solta tecla end; Depois de botar os componentes, renomea-los e declarar as funções, Vamos botar os devidos codigos nos respectivos componentes Lembrando que é tudo dentro do begin e end, se tiver Var vc deve excluir o begin, e adiciona-lo depois CastSpell if StrToInt(Label2.Caption) > (StrToInt(Mana.Text)) then say(Spell.text) // Se a mana do player for maior que a mana que foi digitada no component mana, entao vai falar a magia Endereço Label2.caption := IntToStr(Lerint($0081CE5C)); // Vai ler o endereço da mana do personagem e transforma em numero para o label2 Kick Var TibiaHandle : THandle; begin TibiaHandle:=FindWindow(nil,'Tibia'); // Pega a janela do Tibia SendMessage(TibiaHandle,WM_KEYDOWN,VK_CONTROL,1); // Pressiona o Ctrl SendMessage(TibiaHandle,WM_KEYDOWN,VK_UP,1); // Pressiona a tecla para cima SendMessage(TibiaHandle,WM_KEYUP,VK_UP,1); // Libera a tecla SendMessage(TibiaHandle,WM_KEYDOWN,VK_DOWN,1); // Pressiona a tecla para baixo SendMessage(TibiaHandle,WM_KEYUP,VK_DOWN,1); // Libera a tecla SendMessage(TibiaHandle,WM_KEYUP,VK_CONTROL,1); // Libera o Ctrl end; Food hotkey(Combobox1.Text) // Pressiona oque tiver no Texto do Combobox StartButton CastSpell.Enabled := not(CastSpell.Enabled); Food.Enabled := not(Food.Enabled); Kick.Enabled := not(Kick.Enabled); if Checkbox1.checked then Kick.Enabled := true else Kick.Enabled := false; if Checkbox2.checked then Food.Enabled := true else Food.Enabled := false; if (Spell.Text <> '') and (Mana.Text <> '') then CastSpell.Enabled := true else CastSpell.Enabled := false; if (Kick.Enabled) or (Food.Enabled) or (CastSpell.Enabled) then StartButton.Caption := 'Stop' else StartButton.Caption := 'Start';

    Bom pessoal sei que é simples, mais estou tentando animar o pessoal do forum para usar o Delphi,

    ps: Peguei as funções da sessao do delphi, entao esta tudo aqui
    Abraços a todos
  12. Gostei
    Puncker deu reputação a Augusto em Update Automático   
    Update Automático da Aplicação.


    Galera, vou lhe ensinar como utilizar este update automático. O mesmo não foi criado por mim, e sim pelo membro Blaster_89 (Very Thanks Blaster ), apenas fiz uma modificação que faz abrir o Bot logo após a atualização.
    Bom, sem mais delongas...

    Parte 1: Localizando os links de atualização.

    Os links de atualização estão localizados no arquivo principal do projeto (Program.cs).





    Temos 2 links, o "ChangeLog" e o "URIs". O primeiro é um arquivo de texto, que será exibido na tela de atualização, o famozo "change log".
    O segundo temos os links dos arquivos.
    Aqui, como podem ver, temos os links separados por ";" ou seja, os arquivos que você quer que sejam atualizados devem ser adicionados aqui.

    Parte 2: Abrindo a Aplicação depois do Update.

    Agora vamos colocar pra assim que o update terminar, inicie a aplicação (ou bot como no exemplo). Esta linha encontra-se no arquivo "UI.cs".





    Ali deve adicionar o nome do arquivo da sua aplicação, ele será iniciada logo após o update do programa.

    Parte 3: Configurando as atualizações.

    Bom, primeiro vamos precisar de um arquivo xml. Mais o porque disso? O arquivo XML será usado para fazer a verificação, se o seu bot esta atualizado ou não. A estrutura do mesmo pode ser assim:


    <?xml version="1.0" encoding="utf-8"?> <Application> <Version>1.0.1.0</Version> </Application>

    Onde em "version", estará a versão do seu bot. Este arquivo estará no servidor (ex: http://www.meubot.com.br/app_version.xml).
    Agora vamos ver a parte das verificações.

    Temos abaixo o seguinte código no arquivo "UI.cs":





    Vou explicar.
    1º - Na primeira linha, é criado uma variavel tipo "var", que retornará a versão escrita no arquivo xml. Como podem ver, ali deverá estar o link para o arquivo xml.

    2º - Na segunda linha, criado a variavel "versao", que receberá a versão do executavel do seu bot. É importante que o executavel do seu bot esteja na mesma pasta do seu updater, senão ocorrerá erros e não vai funcionar.

    3º - Na terceira linha temos a conversão destes numeros em double, uma ves que os numeros estão quebrados.

    Logo abaixo temos a verificação, caso a versão do XML seja maior (atualizada) que a versão do EXE, ele entra na estrutura da atualização, senão ele da a mensagem que o bot esta atualizado, inicia o bot e em seguida ja fecha o updater.





    É uma boa alternativa.

    Abraços.

    Créditos: Blaster_89 (criado o projeto) e Augusto (por ter implementado o método de verificação).
    Updater.rar
  13. Gostei
    Puncker deu reputação a MatheusMkalo em Sistema De Owner Para Equips.   
    Bem o sistema é basicamente isso: Fazer com que so um player possa equipar determinado item.
    Eu fiquei em duvida se botava ou nao botava para aparecer o nome do owner no item, por isso fiz uma enquete para esse topico, a que vencer eu faço.

    O script esta em mod, voce nao precisa nem mexer no mod.

    Crie um arquivo.xml na pasta mods do seu ot e nomeie-o de ownersystem (é extremamente importante que o nome seja esse.) e bote esse script:

    <?xml version="1.0" encoding="UTF-8"?> <mod name="OwnerSystem" enabled="yes" author="MatheusMkalo" credits="Cezar (Patterns)"> <config name="OwnerLib"><![CDATA[ function getSlotIds(tag) local file = "mods/ownersystem.xml" local input = assert(io.open(file)) local content = assert(input:read("*a")) local tag = content:match("(<movevent[^>]*slot=[\"']".. tag .."[\"'][^>]*>)") local itemid = tag:match("itemid=[\"'](.-)[\"']") input:close() return itemid:explode(";") end function writeId(tag, id) local file = "mods/ownersystem.xml" local input = assert(io.open(file)) local content = assert(input:read("*a")) local tag = content:match("(<movevent[^>]*slot=[\"']".. tag .."[\"'][^>]*>)") local itemid = tag:match("itemid=[\"'](.-)[\"']") input:close() if(itemid:match(tostring(id))) then return true end if(itemid == "") then itemid = id else itemid = itemid .. ";" .. id end local ntag = tag:gsub("itemid=[\"'](.-)[\"']", "itemid=\"" .. itemid .. "\"") local content = content:gsub(tag, ntag) local output = assert(io.open(file, "w")) output:write(content) output:close() addEvent(doReloadInfo, 1000, 22) end function getItemType(itemid) local slottypes = {"head", "body", "legs", "feet"} local arq = io.open("data/items/items.xml", "r"):read("*all") local attributes = arq:match('<item id="' .. itemid .. '".+name="' .. getItemNameById(itemid) ..'">(.-)</item>') local slot = "" for i,x in pairs(slottypes) do if attributes:find(x) then slot = x break end end if slot == "body" then slot = "armor" end return slot end function isHandedWeapon(itemuid) local typee = getItemWeaponType(itemuid) or 0 if typee >= 1 and typee <= 6 then return TRUE end end function isPlayerOwnerItem(cid, itemuid) return not getItemAttribute(itemuid, "ownerguid") or getItemAttribute(itemuid, "ownerguid") == getPlayerGUID(cid) end function setItemOwner(itemuid, cid) if isHandedWeapon(itemuid) then local equips = getSlotIds("hand") if not table.find(equips, getItemIdByName(getItemName(itemuid))) then writeId("hand", getItemIdByName(getItemName(itemuid))) end doItemSetAttribute(itemuid, "ownerguid", getPlayerGUID(cid)) elseif getItemType(getItemIdByName(getItemName(itemuid))) then local equips = getSlotIds(getItemType(getItemIdByName(getItemName(itemuid)))) if not table.find(equips, getItemIdByName(getItemName(itemuid))) then writeId(getItemType(getItemIdByName(getItemName(itemuid))), getItemIdByName(getItemName(itemuid))) end doItemSetAttribute(itemuid, "ownerguid", getPlayerGUID(cid)) end end ]]></config> <movevent type="Equip" itemid="" slot="head" event="script"><![CDATA[ domodlib("OwnerLib") if not isPlayerOwnerItem(cid, item.uid) then addEvent(doPlayerSendCancel, 1, cid, "You are not the owner of this item.") else return TRUE end ]]></movevent> <movevent type="Equip" itemid="" slot="hand" event="script"><![CDATA[ domodlib("OwnerLib") if not isPlayerOwnerItem(cid, item.uid) then addEvent(doPlayerSendCancel, 1, cid, "You are not the owner of this item.") else return TRUE end ]]></movevent> <movevent type="Equip" itemid="" slot="legs" event="script"><![CDATA[ domodlib("OwnerLib") if not isPlayerOwnerItem(cid, item.uid) then addEvent(doPlayerSendCancel, 1, cid, "You are not the owner of this item.") else return TRUE end ]]></movevent> <movevent type="Equip" itemid="" slot="armor" event="script"><![CDATA[ domodlib("OwnerLib") if not isPlayerOwnerItem(cid, item.uid) then addEvent(doPlayerSendCancel, 1, cid, "You are not the owner of this item.") else return TRUE end ]]></movevent> <movevent type="Equip" itemid="" slot="feet" event="script"><![CDATA[ domodlib("OwnerLib") if not isPlayerOwnerItem(cid, item.uid) then addEvent(doPlayerSendCancel, 1, cid, "You are not the owner of this item.") else return TRUE end ]]></movevent> </mod> Agora vá na pasta libs e abra o arquivo.lua que tem o nome de functions ou 050-functions (pode variar de ot pra ot) e adicione essa funçao: function setItemOwner(itemuid, cid) domodlib("OwnerLib") return setItemOwner(itemuid, cid) end Agora vá em data/talkactions/scripts e abra o arquivo createitem.lua e mude o script para esse: function onSay(cid, words, param, channel) if(param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.") return true end local t = string.explode(param, ",") local ret = RETURNVALUE_NOERROR local pos = getCreaturePosition(cid) local id = tonumber(t[1]) if(not id) then id = getItemIdByName(t[1], false) if(not id) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Item wich such name does not exists.") return true end end local amount = 100 if(t[2]) then amount = t[2] end local item = doCreateItemEx(id, amount) if(t[3] and getBooleanFromString(t[3])) then if(t[4] and getBooleanFromString(t[4])) then pos = getCreatureLookPosition(cid) end ret = doTileAddItemEx(pos, item) else doPlayerAddItem(cid, id, amount) ret = RETURNVALUE_NOERROR end if(ret ~= RETURNVALUE_NOERROR) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Couldn't add item: " .. t[1]) return true end doDecayItem(item) if(not isPlayerGhost(cid)) then doSendMagicEffect(pos, CONST_ME_MAGIC_RED) end return true end

    É de extrema importancia que voce mude o script do /i, pois o i que vem nos ots contem um bug que arruina com o sistema de owner.

    Pronto agora você so precisa juntar a minha funçao setItemOwner(itemuid, cid) com qualquer outro script de quest whatever.

    Lembre-se se voce quizer algum script que use esse meu sistema, peça-o na sessao de pedidos de scripts, não aqui.
  14. Gostei
    Puncker recebeu reputação de Private Sub Teste em [Tutorial] Listando Pastas e Subpastas   
    {Listando Pastas e Subpastas}


    Irei ensinar como listar pastas e subpastas de um certo diretório.

    Componentes

    Um Button Um Listbox
    Função

    Será usada a função SubDiretorios que deve ser inserido no local onde você preferir do código do seu programa:


    procedure SubDiretorios(Diretorio: string; Lista: TStrings); var SearchRec: TSearchRec; begin if FindFirst(Diretorio + '*.*', faDirectory, SearchRec) = 0 then repeat if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin Lista.Add(Diretorio + SearchRec.Name + '\'); SubDiretorios(Diretorio + SearchRec.Name + '\', Lista); end; until FindNext(SearchRec) <> 0; FindClose(SearchRec); end; Agora para chamar a função insira este cógido no button: SubDiretorios('Diretorio da pasta',Listbox1.Items);

    No local Diretorio da Pasta você coloca o diretório que quer ou pode usar funções como: ExtractFilePath(Application.exename) (Pega o diretório do programa), entre outros códigos.



  15. Gostei
    Puncker recebeu reputação de Tryller em [Resolvido] Problemas com SendKeys   
    SendKeys "Exura"? A função do SendKeys não é enviar uma mensagem no console e bater um enter... Seria um pressionamento de teclas não?

    Diga o que você quer fazer.

    @Edit

    Seria isto que você quer fazer?

    Client.Console.Say(cboxHealLow.Text)

    Então caso o combobox esteja escrito "Exura" ele envia pro console "Exura".
  16. Gostei
    Puncker deu reputação a Arthur em [Dúvida] Qual é a fonte do Logo?   
    A font é Celtic Garamond the 2nd.

    Download aqui.
  17. Gostei
    Puncker deu reputação a EdsonJunior em como fasso pro bbot uza chave na porta :S   
    Map.UseOn(ID, OnID, X, Y, Z,)


    ID = ID da key
    OnID = ID da Porta
    X, Y, Z = Coordenadas
  18. Gostei
    Puncker deu reputação a Tryller em [C#] Bot ultilizando Skins do Windows   
    [C#] Bot ultilizando Skins do Windows


    Primeiramente gostaria de dizer que eu sei que muita gente deste fórum é contra dar os códigos prontos, até por que eu sempre pedia ajuda e raramente alguém ajudava com códigos prontos, mas é claro que eu não sou esse tipo de pessoa então venho aqui lhes ensinar a por Skins do windows arquivos do tipo: (.msstyles) no seu Bot ultilizando a DLL USkin, a mesma usada pelo ElfBot
    Espsero que este código ajude os desenvolvedores a melhorarem as aparencias de seus bots xD

    1 - Baixe os arquivos nescessarios (ElfBot NG Skin é opcional).
    Dll e Class USkin
    ElfBot NG Skin

    Scans
    Arquivos USkin

    ElfBotSkin

    2 - Após baixar crie uma nova pasta na pasta de seu Bot como nome de "Skins" (Aconselho criar pelo bot" e extraia o arquivo ElfBot NG Skin.rar na pasta

    3 - Com o projeto de seu bot aberto vamos a parte legal deste tutorial :lol:, importe o arquivo USkin.cs para seu projeto e extraia o arquivo USkin.dll na pasta "raiz" de seu bot

    4 - Com o arquivo USkin.cs importado ao seu projeto, abra o arquivo Program.cs adicione "using USkin;" ao topo do arquivo e na função static void Main() adicione o seguinte código:

    USkinClass.USkinInit("", "", "" + "//" + "Skins/Default.msstyles"); USkinClass.USkinLoadSkin("Skins/Default.msstyles");

    Nota: "Skins/Default.msstyles" - "Skins" é a pasta onde estão localizadas as Skins de seu bot que por sua vez deve estar dentro da pasta "Raiz" de seu bot e "Default.msstyles" é o nome de sua skin que irá se iniciar junto com o bot.

    5 - Compile seu bot e na pasta de onde seu bot foi criado coloque a pasta Skins com as respectivasskins dentro e o arquivo USkin.dll dentro da apsra "raiz".

    Para melhor entender a estrutura seque a imagem:
    http://img851.imageshack.us/img851/5850/ilusr.jpg

    http://imageshack.us/photo/my-images/851/ilusr.jpg/

    Aviso:
    Se vier ocorrer algum erro na compilação poste aqui que irei ajudar a arrumar
    Este é meu primeiro tutorial aqui no fórum, então custa nada você clicar ali no "Joinha" e dar um Rep++ =D
    O Arquivo da Skin não é obrigatório baixar, eu apenas liberei uma das Skins ultilizadas pelo ElfBot

    Site de Skins (Arquivos de Temas do Windows) -> DeviantART.

    Créditos
    Elvang (Não é deste fórum)
    Toty
  19. Gostei
    Puncker deu reputação a Renato em AlienBot - BETA [8.5 ~ 8.62]   
    AlienBot - Versão 1.0.0.2 (BETA)
    Copyright © TibiaBots.NET - Todos os direitos reservados.
    90% Indetectável - Não envia pacotes ao servidor do Tibia.
    VERSÕES EM INGLÊS E PORTUGUÊS! [RECOMENDO INGLÊS]




    Bot oficial do TibiaBots.NET





    QUALQUER BUG POSTE AQUI! BOT EM FASE BETA!


    Ferramentas:

    Basic Functions:


    Level Spy
    Light Hack
    Outfits and Addons
    Show Invisible Monsters

    Healing:


    Heal - Spell, Potion, Rune
    Mana Restore - Potion, per ID
    Auto Cure Paralyse
    Auto Cure Poison

    AFK Tools:


    Mana Caster (Train ML)
    Rune Maker
    Auto Eat Food
    Anti-Kick (you choose minutes to rotate)

    Com erros em Level Spy e Show Invisible Monsters.
    Rune Maker não testado.

    Clientes:


    8.50
    8.52
    8.53
    8.54
    8.55
    8.56
    8.57
    8.60
    8.61
    8.62

    Criador:

    Renato

    Ajudante:

    Puncker

    Agradecimentos:


    Matheus Sesso
    Guilherme
    Henrique M.
    Todos do TibiaBots.NET
    DarkstaR
    klusbert

    Screenshots:




    Downloads:


    Primeira Opção [iNGLÊS] [RECOMENDADO]: AlienBot 1.0.0.2 - BETA.rar
    Segunda Opção [iNGLÊS] [RECOMENDADO]: AlienBot 1.0.0.2 - BETA.rar
    Primeira Opção [PORTUGUÊS]: AlienBot 1.0.0.3 - BETA.rar
    Segunda Opção [PORTUGUÊS]: AlienBot 1.0.0.3 - BETA.rar
    Scan: 0/43 (0.0%)

  20. Gostei
    Puncker recebeu reputação de Froostiin em [Resolvido] Fixar Tamanho da Tela   
    Altere a propriedade BorderStyle do Form para bsSingle.
  21. Gostei
    Puncker recebeu reputação de ferlations em Detector de mentiras   
    O FILHO CHEGA EM CASA, TARDE DA NOITE, E ENCONTRA O PAI NA SALA COM UM ROBÔ AO LADO:

    -O QUE É ISSO, PAI?

    -É UM ROBÔ DETETOR DE MENTIRAS… ONDE VOCÊ ESTAVA?



    O FILHO RESPONDE:- ERRR.. NA FACULDADE. FIQUEI ATÉ TARDE FAZENDO UM TRABALHO…

    O ROBÔ VAI PARA TRÁS DO MOLEQUE E POOOF, METE-LHE UM TAPÃO NA CABEÇA.

    - QUE PORRA É ESSA, PAI? PÔ!

    - É UM ROBÔ DETECTOR DE MENTIRAS. AGORA ME CONTE A VERDADE.

    - ÉÉÉÉÉ… OLHA, PAI, TIVE UNS PROBLEMAS COM MINHA NAMORADA, POR ISSO CHEGUEI TARDE.

    O ROBÔ LEVANTA A MÃO E POOOOFFFF, NA CABEÇA DO RAPAZ.

    - TUDO BEM, TUDO BEM, EU ESTAVA NA CASA DELA.

    - FAZENDO O QUÊ?

    O MOLEQUE MEIO DESCONFIADO COM O ROBÔ, RESPONDE:- ÉÉÉÉÉ…, BEM…, ASSISTINDO UM FILMINHO!

    O ROBÔ, NOVAMENTE: POOOOFFFF NA CABEÇA DO MOLEQUE.

    - TÁ BOM, TÁ BOM, ERA UM FILME PORNÔ E DEPOIS DISSO TRANSAMOS A NOITE TODA, PUTZ, QUE SACO!

    O PAI, INDIGNADO COM O FILHO, DIZ:- QUE VERGONHA, FILHO! ISSO NÃO É A EDUCAÇÃO QUE EU TE DEI! EU NUNCA NA MINHA VIDA MENTI PRO MEU PAI.

    O ROBÔ VAI PARA TRAZ DO PAI E POOOOOOOOFFFFFFFFF NA CABEÇA DELE…

    A MÃE, VENDO TUDO DA COZINHA, VAI ATÉ A SALA E GRITA:

    - TÁ VENDO?!?! SÓ PODIA SER SEU FILHO

    E O ROBÔ: POOOOOOOOOFFFFFFFFFF NA CABEÇA DA MÃE…


  22. Gostei
    Puncker recebeu reputação de Kelyx em Detector de mentiras   
    O FILHO CHEGA EM CASA, TARDE DA NOITE, E ENCONTRA O PAI NA SALA COM UM ROBÔ AO LADO:

    -O QUE É ISSO, PAI?

    -É UM ROBÔ DETETOR DE MENTIRAS… ONDE VOCÊ ESTAVA?



    O FILHO RESPONDE:- ERRR.. NA FACULDADE. FIQUEI ATÉ TARDE FAZENDO UM TRABALHO…

    O ROBÔ VAI PARA TRÁS DO MOLEQUE E POOOF, METE-LHE UM TAPÃO NA CABEÇA.

    - QUE PORRA É ESSA, PAI? PÔ!

    - É UM ROBÔ DETECTOR DE MENTIRAS. AGORA ME CONTE A VERDADE.

    - ÉÉÉÉÉ… OLHA, PAI, TIVE UNS PROBLEMAS COM MINHA NAMORADA, POR ISSO CHEGUEI TARDE.

    O ROBÔ LEVANTA A MÃO E POOOOFFFF, NA CABEÇA DO RAPAZ.

    - TUDO BEM, TUDO BEM, EU ESTAVA NA CASA DELA.

    - FAZENDO O QUÊ?

    O MOLEQUE MEIO DESCONFIADO COM O ROBÔ, RESPONDE:- ÉÉÉÉÉ…, BEM…, ASSISTINDO UM FILMINHO!

    O ROBÔ, NOVAMENTE: POOOOFFFF NA CABEÇA DO MOLEQUE.

    - TÁ BOM, TÁ BOM, ERA UM FILME PORNÔ E DEPOIS DISSO TRANSAMOS A NOITE TODA, PUTZ, QUE SACO!

    O PAI, INDIGNADO COM O FILHO, DIZ:- QUE VERGONHA, FILHO! ISSO NÃO É A EDUCAÇÃO QUE EU TE DEI! EU NUNCA NA MINHA VIDA MENTI PRO MEU PAI.

    O ROBÔ VAI PARA TRAZ DO PAI E POOOOOOOOFFFFFFFFF NA CABEÇA DELE…

    A MÃE, VENDO TUDO DA COZINHA, VAI ATÉ A SALA E GRITA:

    - TÁ VENDO?!?! SÓ PODIA SER SEU FILHO

    E O ROBÔ: POOOOOOOOOFFFFFFFFFF NA CABEÇA DA MÃE…


  23. Gostei
    Puncker deu reputação a Mr.Chakabal em Pack- Tudo ;9   
    - informaçoes:
    441 stocks
    234 renders
    91 light textures
    40 bubbles
    80 nebulas
    212 eps

    Download
    Megaupload
    Creditos : H4D3S - br-design

  24. Gostei
    Puncker deu reputação a Private Sub Teste em [Video] Criando seu bot sem TibiaApi - Healer   
    http://www.youtube.com/watch?v=EJrPNBAltiY

    Quem sabe semana que vem tem outro vídeo desses?
  25. Gostei
    Puncker recebeu reputação de she em [Script] Tirar screenshoot ao upar   
    {Tirar screenshoot ao upar}


    Código:

    var Level: integer; begin UpdateWorld; Level := Self.Level; while not Terminated do begin UpdateWorld; if Level <> Self.Level then begin Level := Self.Level; ScreenShot('c:\level' + IntToStr(Level) + '.jpg'); end; Sleep(1000); end; end;

    Ou Baixe

    Ou baixe:
    sshup.ng

Informação Importante

Confirmação de Termo