Ir para conteúdo

Oque achou 4 votos

  1. 1. Esse tutorial te ajudou?

    • Sim
      4
    • Não
      0

Por favor faça o login ou crie uma conta para votar nesta enquete.

Featured Replies

Postado
  • Administrador
  • Este é um post popular.

Tutorial: Criando um Sistema de Enviar efeito com OTClient.

2019283569_Animao.thumb.gif.4afd0f60972190ea155226ac8d4bd23f.gif
 

Neste tutorial, vamos criar um sistema simples de Enviar efeito no OTClient.
Este sistema permitirá que os jogadores ativem um efeito especial e vejam uma janela ao clicar em um botão específico.

Pré-requisitos:

  1. Ambiente de Desenvolvimento:

    • Certifique-se de ter um ambiente de desenvolvimento configurado com OTClient Edubart.
  2. Conhecimento Básico em Lua:

Familiaridade com a linguagem de script Lua.

 

Passo 1: Estrutura do projeto

 

Organize seu projeto conforme abaixo:

OTC / MODS
image.thumb.png.23c9085dd86380b93a7ccd9e2dd6e96a.png


Passo 2: Criando a Interface Gráfica (OTUI)

game_pass.otui
Repare que em nossa interface nossos botões de ação entram no caminho do module e iniciam uma função que esta disponivel em nosso game_pass.lua (Client-Side)

 

Spoiler












MainWindow
  id: gamePassMain
  !text: tr('Game Pass')
  size: 235 215
  @onEscape: modules.game_pass.closing()

  TabBar
    id: allTabs
    anchors.top: parent.top
    anchors.right: parent.right
    anchors.bottom: parent.bottom
    anchors.left: parent.left

  Panel
    id: optionsTabContent
    anchors.top: allTabs.top
    anchors.left: allTabs.left
    anchors.right: allTabs.right
    anchors.bottom: allTabs.bottom
    margin-top: 20
    margin-bottom: 20

  Button
    id: Recompensa
    !text: tr('Recompensa')
    width: 200
    anchors.left: parent.left
    anchors.top: Melon.bottom
    @onClick: modules.game_pass.effect()

  Button
    id: closeButton
    !text: tr('Close')
    width: 200
    anchors.left: parent.left
    anchors.bottom: parent.bottom
    @onClick: modules.game_pass.closing()

 

 




Passo 3: Criando funções Client-Side

Agora com as funções criada podemos chamar elas de acordo com a necessidade em nosso arquivo de interface.

Por exemplo a função effect() que foi chamada em nosso arquivo de interface.otui agora é criada aqui para mostrar o efeito ao jogador.

game_pass.lua
 

Spoiler










-- game_pass.lua Client side

gamepassButton = nil
gamepassWindow = nil

function init()
  print("Game Pass script initialized.")
  
  gamepassButton = modules.client_topmenu.addRightToggleButton('gamepassButton', tr('Game Pass'), '/game_pass/game_pass/game_pass', closing)
  gamepassButton:setOn(false)

  gamepassWindow = g_ui.displayUI('game_pass') -- OTUI FILE NAME TO LOAD AS INTERFACE
  gamepassWindow:setVisible(false)

  -- Get help values
  allTabs = gamepassWindow:recursiveGetChildById('allTabs')
  allTabs:setContentWidget(gamepassWindow:getChildById('optionsTabContent'))
end

-- MAJOR FUNCTIONS

function terminate()
  gamepassButton:destroy()
  gamepassWindow:destroy()
end

function closing()
  print("Mini window closed.")
  if gamepassButton:isOn() then
    gamepassWindow:setVisible(false)
    gamepassButton:setOn(false)
  else
    gamepassWindow:setVisible(true)
    gamepassButton:setOn(true)
  end
end

function onMiniWindowClose()
  print("Mini window closed.")
  gamepassButton:setOn(false)
end

function effect()
  print("Effect button clicked.")
  local player = g_game.getLocalPlayer()
  local protocolGame = g_game.getProtocolGame()

  if gamepassButton:isOn() and protocolGame then
    protocolGame:sendExtendedOpcode(14, "1")
  else
    gamepassWindow:setVisible(true)
    gamepassButton:setOn(true)
  end

end

 

 

 

Passo 4: Registrando o novo Mod

Agora podemos registrar e iniciar nosso modulo usando o arquivo de configuração

game_pass.otmod
 

Spoiler













Module
  name: game_pass
  description: Game Pass
  author: Tibiaking.com -> Underewar
  website: -
  version: 1

  autoload: true
  autoload-priority: 1000
  sandboxed: true
  dependencies: [ game_interface ]
  scripts: [ game_pass ]
  @onLoad: init()
  @onUnload: terminate()

 


Feito isso ja podemos ver nosso module no client e enviar opcodes através do gameprotocol e também receber o buffer para manipular os dados podemos utilizar :
protocolGame:sendExtendedOpcode(14, "1")
Basicamente oque estamos fazendo é armazenando o valor 1 na variaval 14 do ExtendedOpcode e futuramente podemos recuperar esse valor.

Recuperamos esse valor em nosso server side data/creatuerscript/otc/game_pass.lua

Verificando se o opcode é 14 se for 14 então fazemos x ação.

Show, tendo isso em mente para que o nosso client-side consiga receber com sucesso o efeito enviado ao jogador então utilizamos 

Passo 5: Criando o Server-side responsavel por enviar o efeito correto ao jogador dependendo do opcode selecionado no nosso cliente.

data/creaturescripts/otc/game_pass.lua
 

Spoiler













function parse(creature, opcode, buffer)
  print("Parse function called.")
  if opcode == 14 then
    onExtendedOpcode(creature, opcode, buffer)
  end
end

function onExtendedOpcode(creature, opcode, buffer)
  print("Extended Opcode function called.")
  if opcode == 14 then
    local buf = tonumber(buffer)
    if buf == 1 then
      creature:getPosition():sendMagicEffect(28)
    end
  end
end

 

Passo 6: Registrando o evento para evitar erros futuros!
Para que tudo funcione corretamente sem erros é  necessário registrar o evento no creaturescript.xml / login.lua

creaturescript.xml

<event type="extendedopcode" name="GamePass" script="otc/game_pass.lua" />


login.lua

   
 player:registerEvent("GamePass")

 



Ótimo agora ao selecionar o menu recompensa o jogador recebera um efeito.

Espero que tenha ficado claro como usar Opcodes/ExetendedOpcodes.

Arquivos usados no tutorrial:

OTC MODULE
game_pass.rar
Creaturescript
game_pass.lua

Vi muitos tutoriais desatualizado então resolvi trazer esse!

Reparem que nesse caso passamos creature como parametro do buffer isso porque precisamos enviar um efeito no player.

Melhorando a formatação com JSON Encoder

 

Spoiler

 

Porque os códigos de operação estendidos (extended op codes) aceitam apenas strings, usar JSON é muito útil para enviar mais dados. Baixe e coloque o arquivo json.lua na pasta otclient/modules/corelib. Em seguida, abra o arquivo corelib.otmod nessa pasta e, após o código:
 




dofile 'outputmessage'


adicione:
 




dofile 'json'

Agora vá para forgottenserver/data/lib/core e coloque o arquivo lá. Abra o arquivo core.lua e adicione:
 




dofile('data/lib/core/json.lua')


Uso: Em módulos do OTC:
 




function sendMyCode()
    local myData = {
        a = "string",
        b = 123,
        c = {
            x = "string na tabela",
            y = 456
        }
    }
    protocolGame.sendExtendedOpCode(14, json.encode(myData))
end


 




function onExtendedOpcode(player, opcode, buffer)
    local status, json_data =
        pcall(
            function()
                return json.decode(buffer)
            end
        )
    if not status then
        return false
    end
    
    print(json_data.a)
    print(json_data.b)
    print(json_data.c.x)
    print(json_data.c.y)
end



Modulo de efeito atualizado com JSON Encoder/Decoder.

hunter_panel.rar

 

 

  • Under mudou o título para [Tutorial Definitivo] Como usar ExtendedOpcodes OTC (Client-Side | Server-Side) + JSON Encoder
Postado
  • Autor
  • Administrador
56 minutos atrás, GM Vortex disse:

Muito obrigado, era isso que eu precisava para entender sobre opcode. Agora entendo muito bem. Obrigado e que Deus abençoe.

Também demorei a entender na verdade porque pegamos de fontes ruims e acaba que mais confundi do que ajuda a entender, no entanto esse simples sistema garante ao scripter a possiblidade de criar novas funcionalidades usando como base!

Fico feliz que tenha ajudado a entender melhor sobre o assunto!

 

Postado


Este tutorial é notável por sua clareza e abordagem passo a passo. Ele destaca a organização do projeto, explora a criação da interface gráfica (OTUI) e fornece uma implementação completa tanto no lado do cliente quanto do servidor. O autor demonstra cuidado ao incluir pré-requisitos e compartilha os arquivos usados no tutorial, tornando-o acessível e aplicável. Além disso, os toques finais sobre o registro de eventos e a melhoria da formatação com JSON Encoder contribuem para tornar este tutorial uma valiosa e compreensível contribuição para a comunidade de desenvolvimento.

  • 1 year later...
  • Under pinned e featured this tópico

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo