NewWars 875 Posted July 11, 2013 Atenção!PEÇO QUE IGNOREM O TOPICO ENQUANTO AINDA NÃO ESTÁ COMPLETO, TIVE QUE CRIAR SÓ O TITULO E ETC E IR EDITANDO AOS POUCOS PORQUE O MEU BROWSER AS VEZES DEIXA DE RESPONDER E DESLIGA-SE, ASSIM EU VOU GRAVANDO AOS POUCOS! Bem Vindos a mais uma aula/tutorial de VB! Desta vez temos conosco o nosso fiel companheiro Python que nos vai ajudar neste projeto! O que vamos precisar? Visual Basic 2008/10(Obvious) Cliente Metin2 local ou dedicado Projeto Completo(Menu Login) Download Projeto: Quando terminar o topico eu meto Então vamos la ao Menu Login! E o que temos aqui? Bem, eu chamei-lhe de Menu Login porque é uma aplicação que pode ser melhorada e usada como um menu com mais features, basta melhoralo. Ela é bem simples, é um "replica" do login do cliente de M2, o som e tudo, até adicionei um som no conheçido "Processo de login em progresso.." para dar um ar mais "pro" kkkkkk. O que contêm? Login Cliente M2 com o status "CLOSED" adicionado, tabela na account que define se o servidor está em manuntenção, com um codigo que só os administradores sabem é que podem entrar. Sub delmix(): Bem, eu vou depois explicar o que contem cada Sub ou Function do programa, mas para saberem já o que tem este, o delmix têm a função de apagar o "packIndex" e substituir por um gravado no programa, para evitar modding, add de ficheiros que podem não ser bons para o cliente, como hacks, o delmix apaga todos os .mix do cliente antes de abrir o M2. Se forem encontrados "mix" no cliente, o estado da string "existed" muda para 1, ou seja, existia mix no cliente, e um timer é ativado, depois de 5 segundos, fecha o M2 e fecha o Menu Login loginInfo.py: loginInfo.py - Bem normalmente muitas pessoas usam o loginInfo para fazer import aos seus bots/hacks, e devo já referir que, se vão usar este programa em um cliente de M2, ele vai ser quase dedicado, ou seja, servers caseiros não funcionam, só com uma diff e um comando, o cliente com isto será dedicado, só dara para dedicado ou local(server no mesmo PC que o cliente). Vai estár protegido contra modificações assim não poderam fazer "import" nele. PS: Aconselho que tirem a "loginBoard" do introLogin, assim não a troca de id/pw e tirem tambem "connectBoard". PS2: introLogin.py CTRL + F "__OpenLoginBoard" e na ultima linha adicionem:self.loginBoard.Hide()self.connectBoard.Hide()Após isso, temos que desligar tambem no loading do loginInfo.py:introLogin.py CTRL + F "self.loginInfo = loginInfo" e na linha abaixo metem o mesmo:self.loginBoard.Hide()self.connectBoard.Hide() Moeda Rotativa: Bem ela não faz nada só diz os creditos do tutorial(podem retirar a vontade, é open source, nunca iria dar para dizer que fui eu que fiz o programa depois mudassem xD) contudo, podem meter ele para fazer o que quiserem, só achei bonito '-' MySql.Data: Bem até podem dizer que eu sou pato por usar este 'add' mas eu acho bem mais simples e gosto dele, não gosto muito de como tem o VB.NET de origem, complica mais(Isto é se algum pro em .NET esteja a ler o topico xD) Aqui têm um videozinho de como esta app funciona: Well, agora vou dizer o que faz cada Sub, Function, Region e a Class "SC" que é usada para proteger a password da MySQL do server. Region "lgnbtn Design Funcs": Esta Região é os efeitos do butão lgnbtn, quanda passamos o rato por cima dele ele muda de imagem, quando saimos, quando clicamos,etc Aqui têm um sub "MouseHover" que é quando passamos o rato por cima: Private Sub lgnbtn_MouseHover(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lgnbtn.MouseHover lgnbtn.BackgroundImage = My.Resources.button_hover End Sub Private Sub lgnbtn_MouseHover(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lgnbtn.MouseHover: Declara um private sub "lgnbtn_MouseHover" que é ativado quando passamos o rato por cima, "lgnbtn.MouseHover" lgnbtn.BackgroundImage = My.Resources.button_hover: Vai buscar uma imagem aos "Resources" e aplica na BackgrondImage deste butão(muda a imagem para quando o rato está em cima do butão) End Sub End Sub é para fechar o Sub que foi declarado. Tudo o que é aberto tem que ser fechado por exemplo: If XXXX.qualquercoisa = True Then End If Abrimos um "If" fechamos com "End If" para terminar ele #Region "Isto é uma Região, vou fechala abaixo" #End Region Public Class PauloGayEAHUEAHUEAHU End Class Fechamos a classe com "End Class" e assim e diante... Region "outbtn Design Funcs" é igual ao lgnbtn mas mudando só o butão onde acontençem os eventos Region "board_Cancel Design Funcs" é igual ao lgnbtn mas mudando só o butão onde acontençem os eventos Explicação detalhada: Sub delmix(): Esta sub como foi dito antes apaga os .mix e .pyc e substitui o Index para o Original, mesmo que tenha sido mudado ou não. (Fui buscar esta parte a net ja não me lembrava de como fazer e poupou-me tempo a pensar kkkk) Dim folderInfo As New IO.DirectoryInfo(CurDir() & "")Dim arrFilesInFolder() As IO.FileInfoDim fileInFolder As IO.FileInfo Declara neste caso 3 classes, 2 delas IO(NameSpace).FileInfo(Informação de um ficheiro, tamanho, data, versão etc) IO.DirectoryInfo é a informação da diretoria declarada, a pasta declarada que eu meti como CurDir()(Caminho do programa) & "" ( para fechar) [/center] arrFilesInFolder = folderInfo.GetFiles("*.mix")Aqui pegamos os ficheiros com a extensão ".mix" da pasta que escolhemos For Each fileInFolder In arrFilesInFolderAqui pega cada ficheiro encontrado curfiles.Items.Add(fileInFolder.Name)Aqui adiciona o nome do ficheiro que contem a tal extensão ".mix" a uma listBox(lista) NextO Next é como um End If, imaginemos que For é um if então temos que fechalo tambem mas aqui é com "Next" For Each item In curfiles.ItemsPara cada ficheiro que existe na nossa lista de ".mix" My.Computer.FileSystem.DeleteFile(CurDir() & "" & item.ToString)Apaga o ficheiro ".mix" existed = 1Define existed = 1 para o programa saber que houve pelo menos 1 mix no cliente NextIf Not FileIO.FileSystem.DirectoryExists(CurDir() & "pack") Then _ FileIO.FileSystem.CreateDirectory(CurDir() & "pack")Se não existir a pasta 'pack' então ele cria essa pasta(Acho desnecessario porque sem pack é sem cliente mas prontos podem até vçes terem mudado...) If FileIO.FileSystem.FileExists(CurDir() & "packIndex") ThenSe existir Index na pack FileIO.FileSystem.DeleteFile(CurDir() & "packIndex")Ele apaga a que existe FileIO.FileSystem.WriteAllBytes(CurDir() & "packIndex", My.Resources.Index, False) Escreve uma nova Index(Copia) do que existe nos recursos, a suposta original(Nesta linha de codigo eu podia meter o False para True, assim não metia o codigo de apagar o ficheiro la em cima, ele escreviaautomaticamente por cima do que existisse mas prontos, é so para dizer que sou pato xD) ElseSe não existir FileIO.FileSystem.WriteAllBytes(CurDir() & "packIndex", My.Resources.Index, False)Ele simplesmente faz uma Copia do que está nos Recursos End IfFechar o If FileIO.FileSystem.File...p = Process.Start(CurDir() & "metin2.exe")O p é igual ao metin2.exe que vai ser executado.O "p" ja tinha sido declarado antes, depois da Class principal mas eu vou meter aqui como se declara na mesma:Dim p as ProcessO p é igual a um processo, assim podemos controlar o processo do metin exitlabel.Text = 0Mete uma label a 0 para usar como contagem de segundos(Eu uso labels) If existed = 0 Then EndSe não foram encontrados mix no cliente, o Menu Login fecha-se. Else Me.Hide() pcheck.Enabled = TrueSe foram encontras mix no cliente, o Menu Login esconde-se e ativa um timer que irá eliminar o Metin em 5 segundos End If[center]Fechar o If existed = 0 ...[/center][center] Public Shared Function Crypt Usagem: Crypt("Esta é a string que queremos tornar numa password em MySQL5") Esta Function encripta uma string que é transformada em bytes, 2 vezes em SHA1, retira todos os "-" da string por ""(nada, vazio), metendo o * no inicio, e no final transforma de novo os bytes em string dando assim a password encriptada. (Quem me ensinou esta encriptação foi um professional da codeproject xD) Public Shared Function Crypt(ByVal str As String) Public Shared Function Crypt(Função Publica Partilhada como Crypt)(ByVal[Valor] str as string(str como String)) ' Classe de Crypt Dim sha1crypto As New SHA1CryptoServiceProvider Novo serviço de encriptação em SHA1 Dim encoding As New System.Text.UTF8Encoding() Encriptação(Tem outro nome mais correto em PT mas eu digo encriptação a mesma xD) de Texto UTF8(Texto mais regular) Dim streturn As String = "" streturn como String(Para quem não sabe o que é String, string é uma linha de texto, String = Linha) ' Obtem os bytes e faz o processo, duas vezes Dim byteHash() As Byte = sha1crypto.ComputeHash(encoding.GetBytes(str)) byteHash como Byte = string que vai ser transformada em bytes e processada para SHA1 byteHash = sha1crypto.ComputeHash(byteHash) byteHash já encriptado 1x agora encriptado denovo, ficando assim 2x encriptado streturn += ("*" & BitConverter.ToString(byteHash).Replace("-", "")) streturn = Metemos o "*" da password em MySQL5 e convertemos o byteHash que é Bytes para string outra vez e tiramos todos os "-" da password que encriptamos Return streturn Devolvemos a password(Uma Function tem que sempre devolver um valor, i think) End Function Fim da Função Private Function conn Usagem: Invoca uma nova classe chamada sc renomeada como _enctype que depois usamos um Public Shared Function dela que devolve a info do servidor Private Function conn(ByVal db As String) Função Privada conn(ByVal db as string(db como linha) Dim classcn As String classcn como string _enctype = New sc _enctype como novo SC classcn = _enctype.encconn(db) classcn = é chamada uma função do SC(db = dar a Database que vamos usar) que devolve o ID, IP, Password e mais informação sobe a ligação a MySQL Return classcn Devolve a linha End Function Fecha/Termina a Função Private Sub board_msg Usagem: Isto é a caixa com o tal texto e butão que dá informação do tipo "Vais ser ligado ao Servidor","Falha de Conexão ao servidor" Tentei imitar mais ou menos o metodo da caixa do metin e isto foi o melhor que fiz, acho que ficou bastante bom e é simples PS: Normalmente, se estivermos uma caixa desta a nossa frente no metin se fizermos ALT + F4 não tem efeito, eu imitei isso tambem e algumas mais features que têm a janela do metin para ficar o mais parecido possivel. Private Sub board_msg(ByVal msg As String, ByVal btn As String, ByVal type As String) exitbutton.Enabled = False loginimg.Enabled = False idbox.Enabled = False pwbox.Enabled = False lgnbtn.Enabled = False outbtn.Enabled = False board.Visible = True board.BringToFront() boardlbl.Text = msg board_cancel.Text = btn board_cancel.Focus() Desativamos a aplicação só deixamos a board, aquela mensagem de "Vais ser ligado.." e o butão de Cancelar ativado e trazemos ela para a frente board.BringToFront() Asseguir, fazemos focus no butão, selecionamos ele; board_cancel.Focus() If type = "CONNECT" Then ElseIf type = "CONNECTED" Then My.Computer.Audio.Play(My.Resources.loginok, AudioPlayMode.Background) ElseIf type = "USEROK" Then My.Computer.Audio.Play(My.Resources.sucess, AudioPlayMode.Background) ElseIf type = "WRONG" Then My.Computer.Audio.Play(My.Resources.loginfail, AudioPlayMode.Background) ElseIf type = "NOT" Then ElseIf type = "SAVE" Then My.Settings.sid = idbox.Text My.Settings.spw = pwbox.Text My.Settings.Save() My.Computer.Audio.Play(My.Resources.open, AudioPlayMode.Background) ElseIf type = "CLOSED" Then xy.X = inputcd.Location.X xy.Y = 41 inputcd.Visible = True inputcd.Location = xy xy.X = boardlbl.Location.X xy.Y = 10 boardlbl.Location = xy xy.X = board_cancel.Location.X xy.Y = 65 board_cancel.Location = xy End If End Sub Isto é quando invocamos a tal board e para fazer cada coisa que queremos, exemplo: Como Invocamos isto? Private Sub board_msg(ByVal msg As String, ByVal btn As String, ByVal type As String); Chamamos assim: board_msg("Mensagem que mandamos para o a label para mostrar","Texto do Butão","Isto é o tipo da board que sera" O type(tipo) da board é o que definos para ele fazer, do genero: ElseIf type = "CLOSED" Then Se o type metermos "CLOSED" então ele faz uma ação, tal e qual como "SAVE" faz outra xD, somos nós que definimos as ações. Exemplo Simples de "Vais ser ligado ao servidor": board_msg("Vais ser ligado ao servidor.","Cancelar","CONNECT") lgnBoard Keydown Funcs 7 SINVAL o.O, SharPT, morfo2 and 4 others reacted to this Share this post Link to post Share on other sites
quenii 981 Posted July 11, 2013 Não li mas dei um positivo <3 Uma dica bota as funções sempre entre [ /code] fica mais legivel :D Share this post Link to post Share on other sites
morfo2 4,680 Posted July 11, 2013 Não li mas dei um positivo <3Same shit in here ^^ Share this post Link to post Share on other sites
Zeraw 144 Posted July 11, 2013 Eu li, mas não percebi muito x) Mas é algo onde se pode aprender, mas continua o belo trabalho tens o meu apoio, parabéns :Dhttp://cyber-gamers.org/public/style_emoticons/default/451960.gif Share this post Link to post Share on other sites
NewWars 875 Posted July 12, 2013 Agora, como fazer funcionar com cliente de M2? Primeiro vão a root e procurem por: self.__LoadLoginInfo("loginInfo.py") E substituão por: open_file=open('loginInfo.py','r')file_lines=open_file.readlines()file = file_lines[0].strip()if file == "import serverInfo":self.__LoadLoginInfo("loginInfo.py")else:import dbg, exceptiondbg.LogBox('Foi detetada uma mudança em um dos ficheiros de arranque do cliente.',"Não é possivel continuar")exception.Abort("Internal file was modified, possible moding for cheat import.") Asseguir procurem por: id=loginInfo.get("id", "")pwd=loginInfo.get("pwd", "") E selecionem até : slot=0isAutoLogin=1isAutoSelect=0 E substituam por: id=loginInfo.get("id", "")pwd=loginInfo.get("pwd", "")count = len(open('loginInfo.py').readlines( ))if not count == 3:import dbg, exceptiondbg.LogBox('Foi detetada uma mudança em um dos ficheiros de arranque do cliente.',"Não é possivel continuar")exception.Abort("Internal file was modified, possible moding for cheat import.")if self.IS_TEST:try:addr=loginInfo["addr"]port=loginInfo["port"]account_addr=addraccount_port=portnet.SetMarkServer(addr, port)self.__SetServerInfo(locale.CHANNEL_TEST_SERVER_ADDR % (addr, port))except:try:addr=serverInfo.TESTADDR["ip"]port=serverInfo.TESTADDR["tcp_port"]net.SetMarkServer(addr, port)self.__SetServerInfo(locale.CHANNEL_TEST_SERVER)except:import exceptionexception.Abort("LoginWindow.__LoadLoginInfo - Å×½ºÆ®¼¹ö ÁÖ¼Ò°¡ ¾ø½À´Ï´Ù")else:addr_new = serverInfo.REGION_DICT[0][1]["channel"][1]["ip"]port_new = serverInfo.REGION_DICT[0][1]["channel"][1]["tcp_port"]addr=addr_newport=port_newaccount_addr = serverInfo.REGION_AUTH_SERVER_DICT[0][1]["ip"]account_port = serverInfo.REGION_AUTH_SERVER_DICT[0][1]["port"]locale = loginInfo.get("locale", "")if addr and port:net.SetMarkServer(addr, port)if locale == "ymir" :net.SetServerInfo("õ¸¶ ¼¹ö")self.serverInfo.SetText("Y:"+addr+":"+str(port))else:net.SetServerInfo(addr+":"+str(port))self.serverInfo.SetText("Server - Desc")slot=0isAutoLogin=1isAutoSelect=0 Mudem o self.serverInfo.SetText("Server - Desc") onde diz Server - Desc metam o nome do server e o que quiserem mais... Agora vamos ao programa! 1- Abrir o projeto Ir a classe SC e onde tem IP e user Metem no IP o IP da base de dados do server e no User metem o User normalmente é o root 2- Onde diz http://site.com.pt/site/MLCSK/LMSD32XX voçes substituei o site.com.pt e metem o vosso site exemplo: metin2.com.pt e metem no vosso site a passe encriptada da Base de Dados lá, usem este programa que eu fiz 3- Onde diz pref voçes metem o Salt que meteram no programa que usaram para encriptar a password 4- Vão a mainForm e fazem CTRL + F Curdir & "metin2.exe" e mudão o metin2.exe para o nome do executavel do vosso cliente 5- Onde tem o ficheiro Index nos Resources editam ele e metem o que o vosso Index do vosso cliente têm 6-Carregam ca em cima em Build -&--#62; Build NomeDoProjeto 7- Vão até a pasta do Projeto -&--#62; [VB + M2 + PY + CG]Menu Login -&--#62; bin -&--#62; Release -&--#62; [VB + M2 + PY + CG]Menu Login.exe e MySQL.Data.dll e metem no cliente 8- Quem sabe juntar varios ficheiros em um só sabe o que fazer quem não sabe, aconselho a usar o BoxedApp Packer e metem o vosso .exe, root.eix,epk e a MySQL.Data.dll dentro do [VB + M2 + PY + CG]Menu Login! 9- Sejam felizes e espero que tenham gostado! Share this post Link to post Share on other sites
NewWars 875 Posted July 12, 2013 Alguem que tire este bot do meu topico Share this post Link to post Share on other sites