Gengo 19 #1 Postado 18 Março, 2019 Eai, galera, blz! Hoje vim trazer um tutorial sobre Opcodes, sei que hoje em dia tem muitos tutorias falando sobre isso, porém é sempre bom dar uma atualizada, afinal um tutorial nunca será "igual" a o outro e quanto mais tutorias sobre o assunto, melhor o entendimento. Primeiro vamos conhecer o que é esse tal de Opcodes, uma breve explicação que vemos por ai. O que são Opcodes?R: Opcodes é a comunicação entre o cliente e o servidor. Na source do servidor muitos poderiam utilizar sockets, que são pacotes de informação, diretamente sem usar funcionalidades do jogo como meio de comunicação, já o Opcode utiliza-se recursos in-game para fazer essa comunicação. Spoiler local window = nil local lblName = nil local Opcodes = 110 function init() ProtocolGame.registerExtendedOpcode(Opcodes, function(protocol, opcode, buffer) lblName:setText('Name: '..buffer) print(buffer) end) window = g_ui.displayUI('teste') window:hide() lblName = window:getChildById('lblName') g_keyboard.bindKeyPress('Ctrl+X', toggle) end function terminate() disconnect(g_game, { onGameEnd = offline }) ProtocolGame.unregisterExtendedOpcode(Opcodes) window:destroy() g_keyboard.unbindKeyPress('Ctrl+X') end function toggle() if window:isVisible() then window:setFocusable(false) window:hide() else window:show() end end function getName() g_game.getProtocolGame():sendExtendedOpcode(Opcodes, '') end Vamos analisar o código do módulo acima? Vamos ver qual é a funcionalidade dessas funções e o que ela espera nos seus respectivos parâmetros. Vamos por etapa: 1 - ProtocolGame.registerExtendedOpcode(Opcode, function(protocol, opcode, buffer) end) Essa função tem a funcionalidade de registrar um Opcode, como vemos o nome já é autoexplicativo. Parâmetros: Opcodes É um numero(Identificador) qualquer que vai do 0 ao 255, no caso desse módulo foi utilizado o numero 110. Function: Esse segundo parâmetro é uma função que fica esperando uma resposta do servidor, vemos que o eperado é que servidor nos envie um buffer qualquer, neste caso esperamos que seja enviado o nome do player. 2 - ProtocolGame.unregisterExtendedOpcode(Opcode) Essa função tem a funcionalidade de desregistrar um Opcode, como vemos o nome já é autoexplicativo. Parâmetro: Opcode: É o mesmo numero(Identificador) que utilizamos para registrar, assim a propria função saberá qual Opcode deve ser desfeita, digamos assim. 3- g_game.getProtocolGame():sendExtendedOpcode(Opcode, '') Essa função tem o intuito de solicitar/executar uma ação no servidor, nesse caso do módulo de exemplo, essa ação fará com que o otClient solicite ao servidor uma responsta no qual foi designada a ser feito, me retornar o nome do player. Parâmetros: Opcode: É o mesmo numero(Identificador) que utilizamos para registrar. buffer: Dados que poderam ser enviados ao servidor. Exemplo: Enviar uma pos, e verificar se contem uma creatura, nesse exemplo não foi enviado nada. Também temos na parte do servidor e é algo simples que dê para entender. Spoiler local OPCODES = { GET_NAME = 110 } function onExtendedOpcode(cid, opcode, buffer) if opcode == OPCODES.GET_NAME then doSendPlayerExtendedOpcode(cid, OPCODES.GET_NAME, getCreatureName(cid)) end end Spoiler <event type="extendedopcode" name="Opcodes" event="script" value="opcodes.lua"/> Obs: Não esquecer de registrar no onlogin.lua Essa função espera que o client solicite/execute uma ação para o servidor possa processar e se preciso retornar algo que é esperado.Parâmetros: cid: Cid identificar do player, não vem ao caso explicar com o maior detalhe. opcode: É o mesmo numero(Identificador) que utilizamos para registrar na parte do client, assim o servidor sabe qual ação deve ser executada. buffer: Dados que o client enviou para o servidor. Podemos analisar com calma essa função, obersevem cada detalhe que é utilizado podemos ver que se a opcode for a mesma opcode registrada no client que nesse caso é o 110, solicitamos ao servidor que nos envie o nome da creatura que executou a ação, atraves da função: doSendPlayerExtendedOpcode doSendPlayerExtendedOpcode(cid, Opcode, buffer) Essa função tem o intuito de enviar informações para o client, e ao executar essa função, podemos perceber que lá quando registramos o Opcode ProtocolGame.registerExtendedOpcode na parte do módulo, o segundo parâmetro é executado. Parâmetros: cid: Cid identificar do player, não vem ao caso explicar com o maior detalhe. opcode: É o mesmo numero(Identificador) que utilizamos para registrar na parte do client, assim o servidor sabe qual ação deve ser executada. buffer: Dados que o servidor envia para client, nesse caso foi enviado o nome da creatura. Então vamos reforçar o tutorial e vermos o que aprendemos, vamos-lá. 1º Vemos que para registrar um Opcode, utilizamos a função: ProtocolGame.registerExtendedOpcode(Opcodes, function(protocol, opcode, buffer) end) na maioria das vezes utilizamos dentro da função init.2º Vemos que precisamos também desregistrar a Opcode, e utilizamos a função: ProtocolGame.unregisterExtendedOpcode(Opcodes), mais utilizado na função do módulo em terminate.3º Vemos que podemos fazer com que o client solicite uma ação ao servidor utilizando a função: g_game.getProtocolGame():sendExtendedOpcode(Opcodes, Buffer).4º Vemos também que na parte do servidor, a função: onExtendedOpcode(cid, opcode, buffer) espera que o client solicite/execute algo que possa ser processado e se preciso enviar alguma responsta esperada com a função: doSendPlayerExtendedOpcode(cid, Opcodes, Buffer) Bom, espero que dê para entender com o exemplo e uma breve explicação de cada função. Desculpem-me de qualquer erro, se falei algo errado ou se precisava dizer algo a mais; podem me chamar no privado que estarei lendo e aceitando qualquer tipo de sugestão ou alteração, afinal estamos todos aqui para aprender e o importante é que todos entendam como tudo funciona, aprendam e pratiquem. Download do módulo: Spoiler Scan: https://www.virustotal.com/gui/file/21261174294a8c834c175ebc004eca4ee7e6d314ee6663a296381359a63087b4/detection Download: https://mega.nz/#!5K52FKaQ!XzXtp-tvr_wy5V6OF4vC14jzVDz1lbGX-ifwmcJ8198 5 2 TEKADON, Ayron5, koete e 4 outros reagiu a isto Compartilhar este post Link para o post
Majesty 1755 #2 Postado 18 Março, 2019 Muito obrigado pela sua contribuição, seu tópico de conteúdo foi aprovado! Nós do OTServ Brasil agradecemos, seu conteúdo com certeza ajudará a muitos outros. Você recebeu +1 REP! Compartilhar este post Link para o post