Ir para conteúdo

Featured Replies

Postado

TFS 1.2 PokeDash By Pota

OTCv8


Hello, i have question.
I've added tooltip to my OTCv8 and i want to add Image for this ToolTip, but what i need to do?

https://imgur.com/LdNZWm3
I added Items.otb/xml to OTCv8 but friend told me to not to do this. 

So what i need to send Images from items.otb/xml (server) to my client? When i Hover on some item i want to display Image of this item.

 

Like in this: https://imgur.com/qPSo0dD
i have Moltres 200lvl, i want to display "helds" etc.
Is there any chance to receive it from .spr?

(OTCv8 - pokeinfo.lua) in this script i want to Test Image from items.otb/xml (This could be any item for test)

pokemonLookWindow = nil

function init()
  pokemonLookWindow = g_ui.displayUI('pokeinfo')
  if not pokemonLookWindow then
    print("Error: Failed to load pokeinfo.otui")
    return
  end

  print("pokeinfo.otui loaded successfully")
  pokemonLookWindow:hide()

  ProtocolGame.registerExtendedOpcode(200, function(protocol, opcode, buffer) displayPokemonInformation(protocol, opcode, buffer) end)

  connect(g_game, {
    onGameStart = nothing,
    onGameEnd = offline
  })
end

function terminate()
  disconnect(g_game, {
    onGameStart = online,
    onGameEnd = offline
  })

  if pokemonLookWindow then
    pokemonLookWindow:destroy()
    pokemonLookWindow = nil
  end

  ProtocolGame.unregisterExtendedOpcode(200)
end

function online()
  if not g_ui.isLoaded() then
    return
  end

  if not pokemonLookWindow then
    pokemonLookWindow = g_ui.displayUI('pokeinfo')
    pokemonLookWindow:hide()
  end
end

function offline()
  if pokemonLookWindow then
    pokemonLookWindow:hide()
  end
end

function onClosePokemonInformation()
  pokemonLookWindow:hide()
end

function displayPokemonInformation(protocol, opcode, buffer)
  print("OTCv8 received opcode:", opcode)
  print("OTCv8 received buffer:", buffer)

  local pokemonData = buffer:explode("|")
  local name = pokemonData[2]
  local level = tonumber(pokemonData[3])
  local boost = tonumber(pokemonData[4])

  getPokemonInformation(name, level, boost)
end

function getPokemonInformation(name, level, boost)
  pokemonLookWindow:show()
  pokemonLookWindow:raise()
  pokemonLookWindow:focus()

  local infoPanel = pokemonLookWindow:getChildById('full_content'):getChildById('right_content')



  infoPanel:getChildById('pokemon_name'):setText(tr(name))
  infoPanel:getChildById('pokemon_level'):setText(tr("Level: " .. level))

  if boost and boost > 0 then
    infoPanel:getChildById('pokemon_boost'):setText(tr("Boost: " .. boost))
  else
    infoPanel:getChildById('pokemon_boost'):setText(tr("Boost: None"))
  end
end

 

Editado por Xaiierek (veja o histórico de edições)

Postado
  • Administrador
15 minutos atrás, Xaiierek disse:

TFS 1.2 PokeDash By Pota

OTCv8


Hello, i have question.
I've added tooltip to my TFS 1.2 and i want to add Image for this ToolTip, but what i need to do?

https://imgur.com/LdNZWm3
I added Items.otb/xml to OTCv8 but friend told me to not to do this. 

So what i need to send Images from items.otb/xml (server) to my client? When i Hover on some item i want to display Image of this item.

 

Like in this: https://imgur.com/qPSo0dD
i have Moltres 200lvl, i want to display "helds" etc.
Is there any chance to receive it from .spr?

(OTCv8 - pokeinfo.lua) in this script i want to Test Image from items.otb/xml



pokemonLookWindow = nil

function init()
  pokemonLookWindow = g_ui.displayUI('pokeinfo')
  if not pokemonLookWindow then
    print("Error: Failed to load pokeinfo.otui")
    return
  end

  print("pokeinfo.otui loaded successfully")
  pokemonLookWindow:hide()

  ProtocolGame.registerExtendedOpcode(200, function(protocol, opcode, buffer) displayPokemonInformation(protocol, opcode, buffer) end)

  connect(g_game, {
    onGameStart = nothing,
    onGameEnd = offline
  })
end

function terminate()
  disconnect(g_game, {
    onGameStart = online,
    onGameEnd = offline
  })

  if pokemonLookWindow then
    pokemonLookWindow:destroy()
    pokemonLookWindow = nil
  end

  ProtocolGame.unregisterExtendedOpcode(200)
end

function online()
  if not g_ui.isLoaded() then
    return
  end

  if not pokemonLookWindow then
    pokemonLookWindow = g_ui.displayUI('pokeinfo')
    pokemonLookWindow:hide()
  end
end

function offline()
  if pokemonLookWindow then
    pokemonLookWindow:hide()
  end
end

function onClosePokemonInformation()
  pokemonLookWindow:hide()
end

function displayPokemonInformation(protocol, opcode, buffer)
  print("OTCv8 received opcode:", opcode)
  print("OTCv8 received buffer:", buffer)

  local pokemonData = buffer:explode("|")
  local name = pokemonData[2]
  local level = tonumber(pokemonData[3])
  local boost = tonumber(pokemonData[4])

  getPokemonInformation(name, level, boost)
end

function getPokemonInformation(name, level, boost)
  pokemonLookWindow:show()
  pokemonLookWindow:raise()
  pokemonLookWindow:focus()

  local infoPanel = pokemonLookWindow:getChildById('full_content'):getChildById('right_content')



  infoPanel:getChildById('pokemon_name'):setText(tr(name))
  infoPanel:getChildById('pokemon_level'):setText(tr("Level: " .. level))

  if boost and boost > 0 then
    infoPanel:getChildById('pokemon_boost'):setText(tr("Boost: " .. boost))
  else
    infoPanel:getChildById('pokemon_boost'):setText(tr("Boost: None"))
  end
end

 

Você pode verificar as informações que estão sendo enviadas para o seu otclient na função 

 

displayPokemonInformation(protocol, opcode, buffer)

 

Essa função provavelmente deve estar em um arquivo na sua pasta data/creaturescript/scripts
Uma vez com essa função em mãos você pode ver o buffer que esta sendo retornado no otcliente, e ali você pode alterar ou adicionar informações, depois basta você referencialas.

Nesse caso o buffer esta sendo usado como 3 parametro dessa função você deverá encontrar algo como
 

local buffer = "resultado das informações do pokemon"


 

 

Postado
  • Autor
11 hours ago, Underewar said:

Você pode verificar as informações que estão sendo enviadas para o seu otclient na função 

 


displayPokemonInformation(protocol, opcode, buffer)

 

Essa função provavelmente deve estar em um arquivo na sua pasta data/creaturescript/scripts
Uma vez com essa função em mãos você pode ver o buffer que esta sendo retornado no otcliente, e ali você pode alterar ou adicionar informações, depois basta você referencialas.

Nesse caso o buffer esta sendo usado como 3 parametro dessa função você deverá encontrar algo como
 


local buffer = "resultado das informações do pokemon"


 

 

Okay, i understand that it goes by opcode from the server to the client, but how do i send entire table of items to the client and how to attach the img to them?

Postado
  • Administrador
13 horas atrás, Xaiierek disse:

Okay, i understand that it goes by opcode from the server to the client, but how do i send entire table of items to the client and how to attach the img to them?

Para identificar e modificar a string encontrada conforme o código que você deixou no tópico é possivel ver que a separação na string do buffer está sendo executada e ordenada aqui

 

  local pokemonData = buffer:explode("|")
  local name = pokemonData[2]
  local level = tonumber(pokemonData[3])
  local boost = tonumber(pokemonData[4])

No entanto, opcodes só aceitam strings, mas é possível melhorar esse retorno utilizando a lib abaixo.

Explicando
A função explode que esta sendo usada na primeira linha está sendo usada para separar essa grande string que esta sendo recebida.
Logo na segunda linha podemos identificar que a terceira posição do array pokemonData e o nome do pokemon.
Você pode estudar melhorar o seu código utilizando a função log.
Ja na terceira linha transformamos a 4 posição do array em numero e temos o level do pokemon.
Ja na quarta linha transformamos a 5 posição do array em numero e temos o boost do pokemon.

Seria valido você fazer um log da string pokemonData e ver oque esta retornando.

LIB JSON OTC
Como os opcodes estão aceitando apenas cadeias de caracteres, o uso de JSON é muito útil para enviar mais dados.
Baixe o arquivojson.lua coloque em otclient/modules/corelib, então abra corelib.otmod e procure por

Code:
    dofile 'outputmessage'

Adicione

Code:
    dofile 'json'


Agora va em forgottenserver\data\lib\core E adicione uma nova lib, abracore.lua e adicione

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


Usando no otc:
OTC modules

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

Usando no servidor.
TFS 1x

Lua:

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


Agora vamos ao seu problema:
Quando você da look em uma pokebola ela ja mostra os helds ?
Se sim você precisa enviar o valor dessa variavel via opcode para o otc.
Lembre-se: Sem a lib json o OTC sempre vai receber uma string gigante e você vai ter que tratala em todos os casos.

 

json.lua

Postado
  • Autor
15 hours ago, Underewar said:

Para identificar e modificar a string encontrada conforme o código que você deixou no tópico é possivel ver que a separação na string do buffer está sendo executada e ordenada aqui

 


  local pokemonData = buffer:explode("|")
  local name = pokemonData[2]
  local level = tonumber(pokemonData[3])
  local boost = tonumber(pokemonData[4])

No entanto, opcodes só aceitam strings, mas é possível melhorar esse retorno utilizando a lib abaixo.

Explicando
A função explode que esta sendo usada na primeira linha está sendo usada para separar essa grande string que esta sendo recebida.
Logo na segunda linha podemos identificar que a terceira posição do array pokemonData e o nome do pokemon.
Você pode estudar melhorar o seu código utilizando a função log.
Ja na terceira linha transformamos a 4 posição do array em numero e temos o level do pokemon.
Ja na quarta linha transformamos a 5 posição do array em numero e temos o boost do pokemon.

Seria valido você fazer um log da string pokemonData e ver oque esta retornando.

LIB JSON OTC
Como os opcodes estão aceitando apenas cadeias de caracteres, o uso de JSON é muito útil para enviar mais dados.
Baixe o arquivojson.lua coloque em otclient/modules/corelib, então abra corelib.otmod e procure por

Code:

    dofile 'outputmessage'

Adicione

Code:

    dofile 'json'


Agora va em forgottenserver\data\lib\core E adicione uma nova lib, abracore.lua e adicione

Lua:

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


Usando no otc:
OTC modules

Lua:

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

Usando no servidor.
TFS 1x

Lua:


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


Agora vamos ao seu problema:
Quando você da look em uma pokebola ela ja mostra os helds ?
Se sim você precisa enviar o valor dessa variavel via opcode para o otc.
Lembre-se: Sem a lib json o OTC sempre vai receber uma string gigante e você vai ter que tratala em todos os casos.

 

json.lua 10.15 kB · 0 downloads

I think u don't understand me, i want display pokeball Sprite in OTC.
Im trying something like this:
    imagePanel:setItem(Item.create(itemId, 1))
    imagePanel:setItemId(itemId)
When i click on pokeball "onlook" then display pokeball sprite.
Something like this: https://imgur.com/SRmSvJc

i tried print ClientID with this and it work, but i still wonder how i can get Sprite with this ID.
 

    if (mouseButton == MouseLeftButton or mouseButton == MouseRightButton) then
      local player = g_game.getLocalPlayer()
      print(""..useThing:getId().."")
  end

 

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