Ir para conteúdo
Propaganda

Posts Recomendados

Fala pessoal, tudo tranquilo?
Então, estou estudando como fazer o envio de dados pro client v8 pra montar uma Pokédex no meu projeto. Mas acabei esbarrando num problema que ainda não consegui resolver. Já tentei de várias formas, até pensei em aumentar o limite do packet pra 120000.

O curioso é que, quando eu mando a lista pro client com apenas 10 Pokémon, tudo funciona direitinho (não reparem no visual kkk, é só um teste pra aprendizado).
Os 10 Pokémon chegam certinho, mas quando tento enviar listas maiores, começa a dar erro.

erro
ERROR: ProtocolGame parse message exception (7874 bytes, 0 unread, last opcode is 0x32 (50), prev opcode is 0xb4 (180)): InputMessage eof reached
Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 1098)

image.png.24a365ee342c5748ee65ccdb236fd0fd.png

mas quando tento enviar 20 ou mais, o client simplesmente para de receber.

E aí vem minha dúvida:
como posso fazer esse envio sem quebrar o client?

local function sendOpcodeJson(player, action, data)
    local MAX_PACKET_SIZE = 65000
 
    local buffer = json.encode({ action = action, data = data })
    local s = {}
    for i = 1, #buffer, MAX_PACKET_SIZE do
        s[#s + 1] = buffer:sub(i, i + MAX_PACKET_SIZE - 1)
    end
    local msg = NetworkMessage()
    if #s == 1 then
        msg:addByte(50)
        msg:addByte(OPCODE)
        msg:addString(s[1])
        msg:sendToPlayer(player)
        return
    end
    msg:addByte(50)
    msg:addByte(OPCODE)
    msg:addString("S" .. s[1])
    msg:sendToPlayer(player)
    for i = 2, #s - 1 do
        msg = NetworkMessage()
        msg:addByte(50)
        msg:addByte(OPCODE)
        msg:addString("P" .. s[i])
        msg:sendToPlayer(player)
    end
    msg = NetworkMessage()
    msg:addByte(50)
    msg:addByte(OPCODE)
    msg:addString("E" .. s[#s])
    msg:sendToPlayer(player)
end
 
function sendDexLists(player)
    if not reverse_pokemons["Bulbasaur"] then
        loadDexInfos()
    end
    local playerDexInfo = {}
 
    for id = 1, 10 do
        local pokemon = pokemons_send[id]
        if not pokemon then break end 
        local sto = player:getStorageValue(id + BASE_STORAGE_DEX)
        local name = pokemon
 
        local monsterType = MonsterType(name)
        if monsterType then
            local lookType = monsterType:getOutfit().lookType
            local type1 = monsterType:getRaceName()
            local type2 = monsterType:getRace2Name()
            playerDexInfo[id] = {
                name = name,
                found = sto == 1,
                outfit = {type = lookType},
                type = type1,
                type2 = type2
            }
        else
            print("ERROR - DEX: MONSTER NÃO EXISTE: " .. pokemon)
            playerDexInfo[id] = {name = "none", found = true, outfit = {type = 0}, type = "no type", type2 = "no type"}
        end
    end
 
    sendOpcodeJson(player, "lists", playerDexInfo)
end

CLIENT LUA 
function getOpCode(protocol, opcode, json_data)
    local action = json_data['action']
    local data = json_data['data']
    local status = json_data['status']
    if not action or not data then
        return false
    end
    if action == "sendInformation" then
        showInformation(data)
    end
 
    if action == "lists" then
        pokemons = data
    end
 
    if action == "updateList" then
        local id = data.id
        local pokename = capitalizeFirstLetter(pokemons[id].name)
        for _, child in ipairs(pokedexWindow.panelSearch:getChildren()) do
            local childId = capitalizeFirstLetter(child:getId())
            if childId == pokename then
                child.nome:setText(pokename)
                child.nome:setColor("green")
                child.pokemonImageSearch:setOutfit({ type = pokemons[id].outfit.type })
                break
            end
        end
        pokemons[id] = { name = pokemons[id].name, found = true, outfit = { type = pokemons[id].outfit.type } }
    end
end
Link para o comentário
https://tibiadevs.com/forums/topic/1278-pokedex-pmonster-erro-bytes-8000/
Compartilhar em outros sites

5 horas atrás, ploneer157 disse:

Fala pessoal, tudo tranquilo?
Então, estou estudando como fazer o envio de dados pro client v8 pra montar uma Pokédex no meu projeto. Mas acabei esbarrando num problema que ainda não consegui resolver. Já tentei de várias formas, até pensei em aumentar o limite do packet pra 120000.

O curioso é que, quando eu mando a lista pro client com apenas 10 Pokémon, tudo funciona direitinho (não reparem no visual kkk, é só um teste pra aprendizado).
Os 10 Pokémon chegam certinho, mas quando tento enviar listas maiores, começa a dar erro.

erro
ERROR: ProtocolGame parse message exception (7874 bytes, 0 unread, last opcode is 0x32 (50), prev opcode is 0xb4 (180)): InputMessage eof reached
Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 1098)

image.png.24a365ee342c5748ee65ccdb236fd0fd.png

mas quando tento enviar 20 ou mais, o client simplesmente para de receber.

E aí vem minha dúvida:
como posso fazer esse envio sem quebrar o client?

local function sendOpcodeJson(player, action, data)
    local MAX_PACKET_SIZE = 65000
 
    local buffer = json.encode({ action = action, data = data })
    local s = {}
    for i = 1, #buffer, MAX_PACKET_SIZE do
        s[#s + 1] = buffer:sub(i, i + MAX_PACKET_SIZE - 1)
    end
    local msg = NetworkMessage()
    if #s == 1 then
        msg:addByte(50)
        msg:addByte(OPCODE)
        msg:addString(s[1])
        msg:sendToPlayer(player)
        return
    end
    msg:addByte(50)
    msg:addByte(OPCODE)
    msg:addString("S" .. s[1])
    msg:sendToPlayer(player)
    for i = 2, #s - 1 do
        msg = NetworkMessage()
        msg:addByte(50)
        msg:addByte(OPCODE)
        msg:addString("P" .. s[i])
        msg:sendToPlayer(player)
    end
    msg = NetworkMessage()
    msg:addByte(50)
    msg:addByte(OPCODE)
    msg:addString("E" .. s[#s])
    msg:sendToPlayer(player)
end
 
function sendDexLists(player)
    if not reverse_pokemons["Bulbasaur"] then
        loadDexInfos()
    end
    local playerDexInfo = {}
 
    for id = 1, 10 do
        local pokemon = pokemons_send[id]
        if not pokemon then break end 
        local sto = player:getStorageValue(id + BASE_STORAGE_DEX)
        local name = pokemon
 
        local monsterType = MonsterType(name)
        if monsterType then
            local lookType = monsterType:getOutfit().lookType
            local type1 = monsterType:getRaceName()
            local type2 = monsterType:getRace2Name()
            playerDexInfo[id] = {
                name = name,
                found = sto == 1,
                outfit = {type = lookType},
                type = type1,
                type2 = type2
            }
        else
            print("ERROR - DEX: MONSTER NÃO EXISTE: " .. pokemon)
            playerDexInfo[id] = {name = "none", found = true, outfit = {type = 0}, type = "no type", type2 = "no type"}
        end
    end
 
    sendOpcodeJson(player, "lists", playerDexInfo)
end

CLIENT LUA 
function getOpCode(protocol, opcode, json_data)
    local action = json_data['action']
    local data = json_data['data']
    local status = json_data['status']
    if not action or not data then
        return false
    end
    if action == "sendInformation" then
        showInformation(data)
    end
 
    if action == "lists" then
        pokemons = data
    end
 
    if action == "updateList" then
        local id = data.id
        local pokename = capitalizeFirstLetter(pokemons[id].name)
        for _, child in ipairs(pokedexWindow.panelSearch:getChildren()) do
            local childId = capitalizeFirstLetter(child:getId())
            if childId == pokename then
                child.nome:setText(pokename)
                child.nome:setColor("green")
                child.pokemonImageSearch:setOutfit({ type = pokemons[id].outfit.type })
                break
            end
        end
        pokemons[id] = { name = pokemons[id].name, found = true, outfit = { type = pokemons[id].outfit.type } }
    end
end

TESTA ESSAS DUAS VERSAO E VE SE RESOLVE

local function sendOpcodeJson(player, action, data)
    local MAX_PACKET_SIZE = 8192  -- mais seguro que 65000

    local buffer = json.encode({ action = action, data = data })
    local chunks = {}
    for i = 1, #buffer, MAX_PACKET_SIZE do
        chunks[#chunks + 1] = buffer:sub(i, i + MAX_PACKET_SIZE - 1)
    end

    for index, chunk in ipairs(chunks) do
        local msg = NetworkMessage()
        msg:addByte(50)
        msg:addByte(OPCODE)
        local flag

        if #chunks == 1 then
            flag = "S" -- apenas um pacote
        elseif index == 1 then
            flag = "S" -- start
        elseif index == #chunks then
            flag = "E" -- end
        else
            flag = "P" -- partial
        end

        msg:addString(flag .. chunk)
        msg:sendToPlayer(player)
    end
end
 

--------------------------------------------------------------------------------------------------

local partialBuffer = ""

function getOpCode(protocol, opcode, json_data)
    -- Se for string (em vez de table), processar fragmentação
    if type(json_data) == "string" then
        local flag = json_data:sub(1,1)
        local content = json_data:sub(2)

        if flag == "S" then
            partialBuffer = content
            return
        elseif flag == "P" then
            partialBuffer = partialBuffer .. content
            return
        elseif flag == "E" then
            partialBuffer = partialBuffer .. content
            json_data = json.decode(partialBuffer)
            partialBuffer = ""
        else
            json_data = json.decode(json_data)
        end
    end

    local action = json_data.action
    local data = json_data.data
    if not action or not data then
        return false
    end

    if action == "sendInformation" then
        showInformation(data)
    elseif action == "lists" then
        pokemons = data
    elseif action == "updateList" then
        local id = data.id
        local pokename = capitalizeFirstLetter(pokemons[id].name)
        for _, child in ipairs(pokedexWindow.panelSearch:getChildren()) do
            if capitalizeFirstLetter(child:getId()) == pokename then
                child.nome:setText(pokename)
                child.nome:setColor("green")
                child.pokemonImageSearch:setOutfit({ type = pokemons[id].outfit.type })
                break
            end
        end
        pokemons[id].found = true
    end
end
 

  • Like 1
Link para o comentário
https://tibiadevs.com/forums/topic/1278-pokedex-pmonster-erro-bytes-8000/#findComment-6595
Compartilhar em outros sites

Se serve como dica, deixa as informações basicas no otclient, e dai o servidor fica responsavel pelas informações mais importantes e comprometedoras. Assim você otimiza o sistema, economiza banda, cpu e o sistema fica menos propicio a ocorrer bugs. Você precisa imaginar uns 100 - 300 players usando o sistema ao mesmo tempo, pode fazer testes de estress do sistema e somar com outros sistemas funcionando ao mesmo tempo, assim você terá certeza que o sistema está apto e não causará problemas, travamentos ou lag futuramente no seu servidor.

  • Like 1
Link para o comentário
https://tibiadevs.com/forums/topic/1278-pokedex-pmonster-erro-bytes-8000/#findComment-6596
Compartilhar em outros sites

6 horas atrás, Noob disse:

TESTA ESSAS DUAS VERSAO E VE SE RESOLVE

local function sendOpcodeJson(player, action, data)
    local MAX_PACKET_SIZE = 8192  -- mais seguro que 65000

    local buffer = json.encode({ action = action, data = data })
    local chunks = {}
    for i = 1, #buffer, MAX_PACKET_SIZE do
        chunks[#chunks + 1] = buffer:sub(i, i + MAX_PACKET_SIZE - 1)
    end

    for index, chunk in ipairs(chunks) do
        local msg = NetworkMessage()
        msg:addByte(50)
        msg:addByte(OPCODE)
        local flag

        if #chunks == 1 then
            flag = "S" -- apenas um pacote
        elseif index == 1 then
            flag = "S" -- start
        elseif index == #chunks then
            flag = "E" -- end
        else
            flag = "P" -- partial
        end

        msg:addString(flag .. chunk)
        msg:sendToPlayer(player)
    end
end
 

--------------------------------------------------------------------------------------------------

local partialBuffer = ""

function getOpCode(protocol, opcode, json_data)
    -- Se for string (em vez de table), processar fragmentação
    if type(json_data) == "string" then
        local flag = json_data:sub(1,1)
        local content = json_data:sub(2)

        if flag == "S" then
            partialBuffer = content
            return
        elseif flag == "P" then
            partialBuffer = partialBuffer .. content
            return
        elseif flag == "E" then
            partialBuffer = partialBuffer .. content
            json_data = json.decode(partialBuffer)
            partialBuffer = ""
        else
            json_data = json.decode(json_data)
        end
    end

    local action = json_data.action
    local data = json_data.data
    if not action or not data then
        return false
    end

    if action == "sendInformation" then
        showInformation(data)
    elseif action == "lists" then
        pokemons = data
    elseif action == "updateList" then
        local id = data.id
        local pokename = capitalizeFirstLetter(pokemons[id].name)
        for _, child in ipairs(pokedexWindow.panelSearch:getChildren()) do
            if capitalizeFirstLetter(child:getId()) == pokename then
                child.nome:setText(pokename)
                child.nome:setColor("green")
                child.pokemonImageSearch:setOutfit({ type = pokemons[id].outfit.type })
                break
            end
        end
        pokemons[id].found = true
    end
end
 

obrigado por responder mano entao usei oque voce mandou agora a pokedex nao abre sem erro sem nada apenas nao abre 

Link para o comentário
https://tibiadevs.com/forums/topic/1278-pokedex-pmonster-erro-bytes-8000/#findComment-6597
Compartilhar em outros sites

  • Moderador

O certo seria ou paginar a pokedex de forma que somente um grupo de pokemons fossem requisitados por página e aplicando um debounce na troca de página, ou manter informações genéricas dos pokemons como nome, numero, tipagem, descrição, etc no cliente e enviar apenas informações específicas do servidor, como moveset, level do move, cooldown, loot, etc.

Edit: eu faria os dois. Da forma com que esta atualmente esta pokedex da Monster, ele envia MUITA informação do servidor para o cliente de uma vez só e isso é um prato cheio para players mal intencionados. Além disso não é nada performático. Fora que como está sem paginação, ele carrega muita UICreature no mesmo widget, o que é um pouco mal otimizado principalmente no OTCv8 tornando a interface lagada e "esquisita" ou "travada" ao clicar e arrastar ela.

Link para o comentário
https://tibiadevs.com/forums/topic/1278-pokedex-pmonster-erro-bytes-8000/#findComment-6598
Compartilhar em outros sites

Seria mais interessante se tu conseguisse deixar todas essas infos cliente side e apenas atualiza-se com um launcher. Isso em questão de performace é claro 

Link para o comentário
https://tibiadevs.com/forums/topic/1278-pokedex-pmonster-erro-bytes-8000/#findComment-6613
Compartilhar em outros sites

  • Administrador
Em 10/10/2025 em 22:20, ploneer157 disse:

Fala pessoal, tudo tranquilo?
Então, estou estudando como fazer o envio de dados pro client v8 pra montar uma Pokédex no meu projeto. Mas acabei esbarrando num problema que ainda não consegui resolver. Já tentei de várias formas, até pensei em aumentar o limite do packet pra 120000.

O curioso é que, quando eu mando a lista pro client com apenas 10 Pokémon, tudo funciona direitinho (não reparem no visual kkk, é só um teste pra aprendizado).
Os 10 Pokémon chegam certinho, mas quando tento enviar listas maiores, começa a dar erro.

erro
ERROR: ProtocolGame parse message exception (7874 bytes, 0 unread, last opcode is 0x32 (50), prev opcode is 0xb4 (180)): InputMessage eof reached
Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 1098)

image.png.24a365ee342c5748ee65ccdb236fd0fd.png

mas quando tento enviar 20 ou mais, o client simplesmente para de receber.

E aí vem minha dúvida:
como posso fazer esse envio sem quebrar o client?

local function sendOpcodeJson(player, action, data)
    local MAX_PACKET_SIZE = 65000
 
    local buffer = json.encode({ action = action, data = data })
    local s = {}
    for i = 1, #buffer, MAX_PACKET_SIZE do
        s[#s + 1] = buffer:sub(i, i + MAX_PACKET_SIZE - 1)
    end
    local msg = NetworkMessage()
    if #s == 1 then
        msg:addByte(50)
        msg:addByte(OPCODE)
        msg:addString(s[1])
        msg:sendToPlayer(player)
        return
    end
    msg:addByte(50)
    msg:addByte(OPCODE)
    msg:addString("S" .. s[1])
    msg:sendToPlayer(player)
    for i = 2, #s - 1 do
        msg = NetworkMessage()
        msg:addByte(50)
        msg:addByte(OPCODE)
        msg:addString("P" .. s[i])
        msg:sendToPlayer(player)
    end
    msg = NetworkMessage()
    msg:addByte(50)
    msg:addByte(OPCODE)
    msg:addString("E" .. s[#s])
    msg:sendToPlayer(player)
end
 
function sendDexLists(player)
    if not reverse_pokemons["Bulbasaur"] then
        loadDexInfos()
    end
    local playerDexInfo = {}
 
    for id = 1, 10 do
        local pokemon = pokemons_send[id]
        if not pokemon then break end 
        local sto = player:getStorageValue(id + BASE_STORAGE_DEX)
        local name = pokemon
 
        local monsterType = MonsterType(name)
        if monsterType then
            local lookType = monsterType:getOutfit().lookType
            local type1 = monsterType:getRaceName()
            local type2 = monsterType:getRace2Name()
            playerDexInfo[id] = {
                name = name,
                found = sto == 1,
                outfit = {type = lookType},
                type = type1,
                type2 = type2
            }
        else
            print("ERROR - DEX: MONSTER NÃO EXISTE: " .. pokemon)
            playerDexInfo[id] = {name = "none", found = true, outfit = {type = 0}, type = "no type", type2 = "no type"}
        end
    end
 
    sendOpcodeJson(player, "lists", playerDexInfo)
end

CLIENT LUA 
function getOpCode(protocol, opcode, json_data)
    local action = json_data['action']
    local data = json_data['data']
    local status = json_data['status']
    if not action or not data then
        return false
    end
    if action == "sendInformation" then
        showInformation(data)
    end
 
    if action == "lists" then
        pokemons = data
    end
 
    if action == "updateList" then
        local id = data.id
        local pokename = capitalizeFirstLetter(pokemons[id].name)
        for _, child in ipairs(pokedexWindow.panelSearch:getChildren()) do
            local childId = capitalizeFirstLetter(child:getId())
            if childId == pokename then
                child.nome:setText(pokename)
                child.nome:setColor("green")
                child.pokemonImageSearch:setOutfit({ type = pokemons[id].outfit.type })
                break
            end
        end
        pokemons[id] = { name = pokemons[id].name, found = true, outfit = { type = pokemons[id].outfit.type } }
    end
end

Movido para a area correta, mais atenção !

Link para o comentário
https://tibiadevs.com/forums/topic/1278-pokedex-pmonster-erro-bytes-8000/#findComment-6624
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
  • Criar Novo...