Ir para conteúdo
  • 0

[Resolvido] Opcode e função


Ayron5

Pergunta

Estou tentando enviar uma função do servidor para o cliente usando opcodes, mas não manjo muito .-. 

Tenho o opcode do BananaFight  só não sei usar mesmo kkkk 

Estou tentando algo aqui vendo alguns tópicos antigos do fórum, mas nada de sucesso até agora.

Se algum MAGO do otc poder me ajudar eu deixo seu rep! ^^

 

Função do servidor 

Spoiler
function onSangue(mode, text)
if not g_game.isOnline() then return end
if mode == MessageModes.Failure then
if string.find(text, '#ph#,') then
local t = text:explode(',')
local hp, maxHp = tonumber(t[2]), tonumber(t[3])
pokeHealthBar:setText(hp .. ' / ' .. maxHp)
barWindow:recursiveGetChildById("pokeHealthIcon"?setTooltip(tr( hp, maxHp))
pokeHealthBar:setValue(hp, 0, maxHp)
end
end
end

 

O lua do modules otc

 

Spoiler
-- Local variables
local barWindow = nil
local barPanel = nil
local barButton = nil
local healthBar = nil
local pokeHealthBar = nil
 
local pbs = {}
local path = '/images/ui/pxg/topMenu_icons/'
 
local fightModeRadioGroup = nil
local fightOffensiveBox = nil
local fightBalancedBox = nil
local fightDefensiveBox = nil
 
local InventorySlotStyles = {
[InventorySlotHead] = "HeadSlot",
[InventorySlotNeck] = "NeckSlot",
[InventorySlotBack] = "BackSlot",
[InventorySlotBody] = "BodySlot",
[InventorySlotRight] = "RightSlot",
[InventorySlotLeft] = "LeftSlot",
[InventorySlotLeg] = "LegSlot",
[InventorySlotFeet] = "FeetSlot",
[InventorySlotFinger] = "FingerSlot",
[InventorySlotAmmo] = "AmmoSlot"
}
-- End local variables


 
-- Public functions
function init()
barWindow = g_ui.loadUI('HealthBar', modules.game_interface.getRightPanel())
barWindow:disableResize()
barPanel = barWindow:getChildById('contentsPanel')
 
barButton = modules.client_topmenu.addCustomRightButton('barButton', 'Pokemon', path..'pokemon_icon_apagado', toggle, true)
barButton:setVisible(false)
 
healthBar = barWindow:recursiveGetChildById("healthBar")
pokeHealthBar = barWindow:recursiveGetChildById("pokeHealthBar")
 
 
 
 
 
connect(LocalPlayer, { onInventoryChange = onInventoryChange,
onHealthChange = onHealthChange,
onManaChange = onManaChange,
onStatesChange = onStatesChange})
connect(g_game, 'onTextMessage', onSangue)
connect(g_game, { onGameStart = refresh,
onGameEnd = hide,
})
 
 
 
createPbs()
barWindow:setup()
--barWindow:open()
end
 
function terminate()
disconnect(LocalPlayer, { onInventoryChange = onInventoryChange,
onHealthChange = onHealthChange,
onManaChange = onManaChange,
onStatesChange = onStatesChange})
disconnect(g_game, 'onTextMessage', onSangue)
disconnect(g_game, { onGameStart = refresh,
onGameEnd = hide,
})
 
barPanel:destroy()
barWindow:destroy()
end
 
function onManaChange(localPlayer, mana, maxMana)
for i = 1, 6 do
if i > tonumber(mana) then
pbs:setImageSource('/images/ui/pxg/pb_apagada')
else
pbs:setImageSource('/images/ui/pxg/pb_acessa')
end
end
end
 
function onInventoryChange(player, slot, item, oldItem)
if slot >= InventorySlotPurse then return end
local itemWidget = barPanel:getChildById('slot' .. slot)
if itemWidget then
if item then
itemWidget:setStyle(InventorySlotStyles[slot])
itemWidget:setItem(item)
else
itemWidget:setStyle(InventorySlotStyles[slot])
itemWidget:setItem(nil)
end
end
end
 
function onStatesChange(localPlayer, now, old)
if now == old then return end
 
local bitsChanged = bit32.bxor(now, old)
for i = 1, 32 do
local pow = math.pow(2, i-1)
if pow > bitsChanged then break end
local bitChanged = bit32.band(bitsChanged, pow)
if bitChanged ~= 0 then
if bitChanged == 128 then
 
end
end
end
end
 
function toggle()
if barWindow:isVisible() then
barButton:setIcon(path..'pokemon_icon_apagado')
barWindow:close()
else
barButton:setIcon(path..'pokemon_icon')
barWindow:open()
end
end
 
function refresh()
if barWindow:isVisible() then
barButton:setIcon(path..'pokemon_icon')
end
 
local player = g_game.getLocalPlayer()
for i=InventorySlotFirst,InventorySlotLast do
if g_game.isOnline() then
onInventoryChange(player, i, player:getInventoryItem(i))
else
onInventoryChange(player, i, nil)
end
end
end
 
function hide()
barButton:setVisible(false)
end
 
if g_game.isOnline() then
barButton:setVisible(true)
end
 
function createPbs()
for i = 1, 6 do
pbs = g_ui.createWidget((i == 1 and 'pbButtonIni' or 'pbButton'), barWindow)
pbs:setId('pb'..i)
end
end
 
function onMiniWindowClose()
end
-- End public functions

 

lua do opcode/creaturescripts

 

Spoiler
OPCODE_LANGUAGE = 1
 
function onExtendedOpcode(cid, opcode, buffer)
if opcode == OPCODE_LANGUAGE then
-- otclient language
if buffer == 'en' or buffer == 'pt' then
 
 
-- example, setting player language, because otclient is multi-language...
--doCreatureSetStorage(cid, CREATURE_STORAGE_LANGUAGE, buffer)
end
else
-- other opcodes can be ignored, and the server will just work fine...
end
end

 

Editado por Sepulturaa
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Para enviar do servidor para o client cê usa a função

 

doSendPlayerExtendedOpcode(cid, ID_DO_OPCODE, TEXTO_DO_OPCODE)

ID tem que ser um número único para evitar conflitos, o texto é onde você digita o que quer enviar.

 

Para receber no client você usa

ProtocolGame.registerExtendedOpcode(ID_DO_OPCODE, FUNÇÃO_QUE_VAI_RODAR)

Exemplo: 

ProtocolGame.registerExtendedOpcode(123, printOpcode)

function printOpcode(buffer)
print(buffer)
end

Também tem que desregistrar o opcode:

ProtocolGame.unregisterExtendedOpcode(ID)

Aconselho desregistrar na função terminate do modulo, e registrar na init.

Link para o comentário
Compartilhar em outros sites

  • 0
10 horas atrás, Refe disse:

Para enviar do servidor para o client cê usa a função

 


doSendPlayerExtendedOpcode(cid, ID_DO_OPCODE, TEXTO_DO_OPCODE)

ID tem que ser um número único para evitar conflitos, o texto é onde você digita o que quer enviar.

 

Para receber no client você usa


ProtocolGame.registerExtendedOpcode(ID_DO_OPCODE, FUNÇÃO_QUE_VAI_RODAR)

Exemplo: 


ProtocolGame.registerExtendedOpcode(123, printOpcode)

function printOpcode(buffer)
print(buffer)
end

Também tem que desregistrar o opcode:


ProtocolGame.unregisterExtendedOpcode(ID)

Aconselho desregistrar na função terminate do modulo, e registrar na init.

Fiz assim...

 

HealthBar.lua

Spoiler

-- Local variables
local barWindow = nil
local barPanel = nil
local barButton = nil
local healthBar = nil
local pokeHealthBar = nil


local pbs = {}
local path = '/images/ui/pxg/topMenu_icons/'

local fightModeRadioGroup = nil
local fightOffensiveBox = nil
local fightBalancedBox = nil
local fightDefensiveBox = nil

local InventorySlotStyles = {
  [InventorySlotHead] = "HeadSlot",
  [InventorySlotNeck] = "NeckSlot",
  [InventorySlotBack] = "BackSlot",
  [InventorySlotBody] = "BodySlot",
  [InventorySlotRight] = "RightSlot",
  [InventorySlotLeft] = "LeftSlot",
  [InventorySlotLeg] = "LegSlot",
  [InventorySlotFeet] = "FeetSlot",
  [InventorySlotFinger] = "FingerSlot", 
  [InventorySlotAmmo] = "AmmoSlot"
}
-- End local variables



-- Public functions
function init()
   barWindow = g_ui.loadUI('HealthBar', modules.game_interface.getRightPanel())  
   barWindow:disableResize()
   barPanel = barWindow:getChildById('contentsPanel')
   
   barButton = modules.client_topmenu.addCustomRightButton('barButton', 'Pokemon', path..'pokemon_icon_apagado', toggle, true)
   barButton:setVisible(false) 

   ProtocolGame.registerExtendedOpcode(55, onSangue)

   healthBar = barWindow:recursiveGetChildById("healthBar")
   pokeHealthBar = barWindow:recursiveGetChildById("pokeHealthBar")
   
   
   
   
   
   connect(LocalPlayer, { onInventoryChange = onInventoryChange,
                          --onHealthChange = onHealthChange,
                          onManaChange = onManaChange,
                          onStatesChange = onStatesChange})
   connect(g_game, 'onTextMessage', onSangue)
   connect(g_game, { onGameStart = refresh,
                     onGameEnd = hide,
                      })
   
   
   
                      createPbs()
   barWindow:setup()
   --barWindow:open()
end

function terminate()
   disconnect(LocalPlayer, { onInventoryChange = onInventoryChange,
                             --onHealthChange = onHealthChange,
                             onManaChange = onManaChange,
                             onStatesChange = onStatesChange})
                             ProtocolGame.unregisterExtendedOpcode(55)
   disconnect(g_game, 'onTextMessage', onSangue)
   disconnect(g_game, { onGameStart = refresh,
                     onGameEnd = hide,
                      })  
   
   barPanel:destroy()
   barWindow:destroy()
end

ProtocolGame.registerExtendedOpcode(55, onSangue)

function onSangue(buffer)
print(buffer)
end

function onManaChange(localPlayer, mana, maxMana)
   for i = 1, 6 do
       if i > tonumber(mana) then
          pbs[i]:setImageSource('/images/ui/pxg/pb_apagada')
       else
          pbs[i]:setImageSource('/images/ui/pxg/pb_acessa')
       end
   end
 end   

function onInventoryChange(player, slot, item, oldItem)
  if slot >= InventorySlotPurse then return end
  local itemWidget = barPanel:getChildById('slot' .. slot)
  if itemWidget then
     if item then
        itemWidget:setStyle(InventorySlotStyles[slot])
        itemWidget:setItem(item)
     else
        itemWidget:setStyle(InventorySlotStyles[slot])
        itemWidget:setItem(nil)
     end
  end
end

function onStatesChange(localPlayer, now, old)
if now == old then return end

  local bitsChanged = bit32.bxor(now, old)
  for i = 1, 32 do
    local pow = math.pow(2, i-1)
    if pow > bitsChanged then break end
    local bitChanged = bit32.band(bitsChanged, pow)
    if bitChanged ~= 0 then
      if bitChanged == 128 then 
         
      end
    end
  end
end

function toggle()
   if barWindow:isVisible() then
      barButton:setIcon(path..'pokemon_icon_apagado')
      barWindow:close()
   else
      barButton:setIcon(path..'pokemon_icon')
      barWindow:open()
   end
end

function refresh()
  if barWindow:isVisible() then
     barButton:setIcon(path..'pokemon_icon')
  end
  
  local player = g_game.getLocalPlayer()
  for i=InventorySlotFirst,InventorySlotLast do
    if g_game.isOnline() then
      onInventoryChange(player, i, player:getInventoryItem(i))
    else
      onInventoryChange(player, i, nil)
    end
  end
end

function hide()
   barButton:setVisible(false)
end

  if g_game.isOnline() then
     barButton:setVisible(true)
  end
  
  function createPbs()
   for i = 1, 6 do
       pbs[i] = g_ui.createWidget((i == 1 and 'pbButtonIni' or 'pbButton'), barWindow)
       pbs[i]:setId('pb'..i)
   end 
end


function onMiniWindowClose()
end
-- End public functions

 

 

Função do servidor... lib/106-main functions.lua

Spoiler

function onSangue(mode, text)
    doSendPlayerExtendedOpcode(cid, 55, onsangue)
    if not g_game.isOnline() then return end
    if mode == MessageModes.Failure then
    if string.find(text, '#ph#,') then
    local t = text:explode(',')
    local hp, maxHp = tonumber(t[2]), tonumber(t[3])
    pokeHealthBar:setText(hp .. ' / ' .. maxHp)
    barWindow:recursiveGetChildById("pokeHealthIcon"):setTooltip(tr( hp, maxHp))
    pokeHealthBar:setValue(hp, 0, maxHp)
    end
    end
    end

 

Fiz assim no lua do opcode/creaturescripts

Spoiler

OPCODE_LANGUAGE = 1
OPCODE_SANGUE = 55

function onExtendedOpcode(cid, opcode, buffer)
       if opcode == OPCODE_LANGUAGE then
         -- otclient language
         if buffer == 'en' or buffer == 'pt' then

            
                 -- example, setting player language, because otclient is multi-language...
                 --doCreatureSetStorage(cid, CREATURE_STORAGE_LANGUAGE, buffer)
         end
        elseif opcode == OPCODE_SANGUE then
        
        doSendPlayerExtendedOpcode(cid, 55, onsangue)
       
         -- other opcodes can be ignored, and the server will just work fine...
        end
end

 

Aí recebi esse erro no terminal do OTC

Spoiler


ERROR: Unable to load module 'HealthBar': LUA ERROR:
/gamelib/protocolgame.lua:35: Invalid callback.
stack traceback:
    [C]: ?
    [C]: in function 'error'
    /gamelib/protocolgame.lua:35: in function 'registerExtendedOpcode'
    /game_health/HealthBar.lua:82: in main chunk
    [C]: in function 'autoLoadModules'
    /init.lua:49: in main chunk

Achoque está falando algo .-. kkk 

Link para o comentário
Compartilhar em outros sites

  • 0
-- Local variables
local barWindow = nil
local barPanel = nil
local barButton = nil
local healthBar = nil
local pokeHealthBar = nil


local pbs = {}
local path = '/images/ui/pxg/topMenu_icons/'

local fightModeRadioGroup = nil
local fightOffensiveBox = nil
local fightBalancedBox = nil
local fightDefensiveBox = nil

local InventorySlotStyles = {
  [InventorySlotHead] = "HeadSlot",
  [InventorySlotNeck] = "NeckSlot",
  [InventorySlotBack] = "BackSlot",
  [InventorySlotBody] = "BodySlot",
  [InventorySlotRight] = "RightSlot",
  [InventorySlotLeft] = "LeftSlot",
  [InventorySlotLeg] = "LegSlot",
  [InventorySlotFeet] = "FeetSlot",
  [InventorySlotFinger] = "FingerSlot", 
  [InventorySlotAmmo] = "AmmoSlot"
}
-- End local variables



-- Public functions
function init()
   barWindow = g_ui.loadUI('HealthBar', modules.game_interface.getRightPanel())  
   barWindow:disableResize()
   barPanel = barWindow:getChildById('contentsPanel')
   
   barButton = modules.client_topmenu.addCustomRightButton('barButton', 'Pokemon', path..'pokemon_icon_apagado', toggle, true)
   barButton:setVisible(false) 

   ProtocolGame.registerExtendedOpcode(55, onSangue)

   healthBar = barWindow:recursiveGetChildById("healthBar")
   pokeHealthBar = barWindow:recursiveGetChildById("pokeHealthBar")
   
   
   
   
   
   connect(LocalPlayer, { onInventoryChange = onInventoryChange,
                          --onHealthChange = onHealthChange,
                          onManaChange = onManaChange,
                          onStatesChange = onStatesChange})
   connect(g_game, 'onTextMessage', onSangue)
   connect(g_game, { onGameStart = refresh,
                     onGameEnd = hide,
                      })
   
   
   
                      createPbs()
   barWindow:setup()
   --barWindow:open()
end

function terminate()
   disconnect(LocalPlayer, { onInventoryChange = onInventoryChange,
                             --onHealthChange = onHealthChange,
                             onManaChange = onManaChange,
                             onStatesChange = onStatesChange})
                             ProtocolGame.unregisterExtendedOpcode(55)
   disconnect(g_game, 'onTextMessage', onSangue)
   disconnect(g_game, { onGameStart = refresh,
                     onGameEnd = hide,
                      })  
   
   barPanel:destroy()
   barWindow:destroy()
end


function onSangue(protocol, opcode, buffer)
print(buffer)
end

function onManaChange(localPlayer, mana, maxMana)
   for i = 1, 6 do
       if i > tonumber(mana) then
          pbs[i]:setImageSource('/images/ui/pxg/pb_apagada')
       else
          pbs[i]:setImageSource('/images/ui/pxg/pb_acessa')
       end
   end
 end   

function onInventoryChange(player, slot, item, oldItem)
  if slot >= InventorySlotPurse then return end
  local itemWidget = barPanel:getChildById('slot' .. slot)
  if itemWidget then
     if item then
        itemWidget:setStyle(InventorySlotStyles[slot])
        itemWidget:setItem(item)
     else
        itemWidget:setStyle(InventorySlotStyles[slot])
        itemWidget:setItem(nil)
     end
  end
end

function onStatesChange(localPlayer, now, old)
if now == old then return end

  local bitsChanged = bit32.bxor(now, old)
  for i = 1, 32 do
    local pow = math.pow(2, i-1)
    if pow > bitsChanged then break end
    local bitChanged = bit32.band(bitsChanged, pow)
    if bitChanged ~= 0 then
      if bitChanged == 128 then 
         
      end
    end
  end
end

function toggle()
   if barWindow:isVisible() then
      barButton:setIcon(path..'pokemon_icon_apagado')
      barWindow:close()
   else
      barButton:setIcon(path..'pokemon_icon')
      barWindow:open()
   end
end

function refresh()
  if barWindow:isVisible() then
     barButton:setIcon(path..'pokemon_icon')
  end
  
  local player = g_game.getLocalPlayer()
  for i=InventorySlotFirst,InventorySlotLast do
    if g_game.isOnline() then
      onInventoryChange(player, i, player:getInventoryItem(i))
    else
      onInventoryChange(player, i, nil)
    end
  end
end

function hide()
   barButton:setVisible(false)
end

  if g_game.isOnline() then
     barButton:setVisible(true)
  end
  
  function createPbs()
   for i = 1, 6 do
       pbs[i] = g_ui.createWidget((i == 1 and 'pbButtonIni' or 'pbButton'), barWindow)
       pbs[i]:setId('pb'..i)
   end 
end


function onMiniWindowClose()
end
-- End public functions

 

Link para o comentário
Compartilhar em outros sites

  • 0
48 minutos atrás, Refe disse:

-- Local variables
local barWindow = nil
local barPanel = nil
local barButton = nil
local healthBar = nil
local pokeHealthBar = nil


local pbs = {}
local path = '/images/ui/pxg/topMenu_icons/'

local fightModeRadioGroup = nil
local fightOffensiveBox = nil
local fightBalancedBox = nil
local fightDefensiveBox = nil

local InventorySlotStyles = {
  [InventorySlotHead] = "HeadSlot",
  [InventorySlotNeck] = "NeckSlot",
  [InventorySlotBack] = "BackSlot",
  [InventorySlotBody] = "BodySlot",
  [InventorySlotRight] = "RightSlot",
  [InventorySlotLeft] = "LeftSlot",
  [InventorySlotLeg] = "LegSlot",
  [InventorySlotFeet] = "FeetSlot",
  [InventorySlotFinger] = "FingerSlot", 
  [InventorySlotAmmo] = "AmmoSlot"
}
-- End local variables



-- Public functions
function init()
   barWindow = g_ui.loadUI('HealthBar', modules.game_interface.getRightPanel())  
   barWindow:disableResize()
   barPanel = barWindow:getChildById('contentsPanel')
   
   barButton = modules.client_topmenu.addCustomRightButton('barButton', 'Pokemon', path..'pokemon_icon_apagado', toggle, true)
   barButton:setVisible(false) 

   ProtocolGame.registerExtendedOpcode(55, onSangue)

   healthBar = barWindow:recursiveGetChildById("healthBar")
   pokeHealthBar = barWindow:recursiveGetChildById("pokeHealthBar")
   
   
   
   
   
   connect(LocalPlayer, { onInventoryChange = onInventoryChange,
                          --onHealthChange = onHealthChange,
                          onManaChange = onManaChange,
                          onStatesChange = onStatesChange})
   connect(g_game, 'onTextMessage', onSangue)
   connect(g_game, { onGameStart = refresh,
                     onGameEnd = hide,
                      })
   
   
   
                      createPbs()
   barWindow:setup()
   --barWindow:open()
end

function terminate()
   disconnect(LocalPlayer, { onInventoryChange = onInventoryChange,
                             --onHealthChange = onHealthChange,
                             onManaChange = onManaChange,
                             onStatesChange = onStatesChange})
                             ProtocolGame.unregisterExtendedOpcode(55)
   disconnect(g_game, 'onTextMessage', onSangue)
   disconnect(g_game, { onGameStart = refresh,
                     onGameEnd = hide,
                      })  
   
   barPanel:destroy()
   barWindow:destroy()
end


function onSangue(protocol, opcode, buffer)
print(buffer)
end

function onManaChange(localPlayer, mana, maxMana)
   for i = 1, 6 do
       if i > tonumber(mana) then
          pbs[i]:setImageSource('/images/ui/pxg/pb_apagada')
       else
          pbs[i]:setImageSource('/images/ui/pxg/pb_acessa')
       end
   end
 end   

function onInventoryChange(player, slot, item, oldItem)
  if slot >= InventorySlotPurse then return end
  local itemWidget = barPanel:getChildById('slot' .. slot)
  if itemWidget then
     if item then
        itemWidget:setStyle(InventorySlotStyles[slot])
        itemWidget:setItem(item)
     else
        itemWidget:setStyle(InventorySlotStyles[slot])
        itemWidget:setItem(nil)
     end
  end
end

function onStatesChange(localPlayer, now, old)
if now == old then return end

  local bitsChanged = bit32.bxor(now, old)
  for i = 1, 32 do
    local pow = math.pow(2, i-1)
    if pow > bitsChanged then break end
    local bitChanged = bit32.band(bitsChanged, pow)
    if bitChanged ~= 0 then
      if bitChanged == 128 then 
         
      end
    end
  end
end

function toggle()
   if barWindow:isVisible() then
      barButton:setIcon(path..'pokemon_icon_apagado')
      barWindow:close()
   else
      barButton:setIcon(path..'pokemon_icon')
      barWindow:open()
   end
end

function refresh()
  if barWindow:isVisible() then
     barButton:setIcon(path..'pokemon_icon')
  end
  
  local player = g_game.getLocalPlayer()
  for i=InventorySlotFirst,InventorySlotLast do
    if g_game.isOnline() then
      onInventoryChange(player, i, player:getInventoryItem(i))
    else
      onInventoryChange(player, i, nil)
    end
  end
end

function hide()
   barButton:setVisible(false)
end

  if g_game.isOnline() then
     barButton:setVisible(true)
  end
  
  function createPbs()
   for i = 1, 6 do
       pbs[i] = g_ui.createWidget((i == 1 and 'pbButtonIni' or 'pbButton'), barWindow)
       pbs[i]:setId('pb'..i)
   end 
end


function onMiniWindowClose()
end
-- End public functions

 

Não deu erros mas tbm não fez nada .-. kkk

Link para o comentário
Compartilhar em outros sites

  • 0
38 minutos atrás, Sepulturaa disse:

Não deu erros mas tbm não fez nada .-. kkk

É pq você tem que enviar o opcode, o extendedopcodes.lua só funciona para receber, faz uma action com o send que você botou lá para testar

Ou seja, ponha a função

doSendPlayerExtendedOpcode(cid, 55, onsangue)

em uma action qualquer, ou talkaction e testa.

Link para o comentário
Compartilhar em outros sites

  • 0
10 horas atrás, Refe disse:

É pq você tem que enviar o opcode, o extendedopcodes.lua só funciona para receber, faz uma action com o send que você botou lá para testar

Ou seja, ponha a função


doSendPlayerExtendedOpcode(cid, 55, onsangue)

em uma action qualquer, ou talkaction e testa.

Mano consegui! ^^ 

Vlw pode fechar o top. 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...