ploneer157 436 Postado 11 de Outubro Compartilhar Postado 11 de Outubro 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) 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 Mais opções de compartilhamento...
Noob 10 Postado 11 de Outubro Compartilhar Postado 11 de Outubro 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) 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 1 Link para o comentário https://tibiadevs.com/forums/topic/1278-pokedex-pmonster-erro-bytes-8000/#findComment-6595 Compartilhar em outros sites Mais opções de compartilhamento...
Xzan 63 Postado 11 de Outubro Compartilhar Postado 11 de Outubro 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. 1 Link para o comentário https://tibiadevs.com/forums/topic/1278-pokedex-pmonster-erro-bytes-8000/#findComment-6596 Compartilhar em outros sites Mais opções de compartilhamento...
ploneer157 436 Postado 11 de Outubro Autor Compartilhar Postado 11 de Outubro 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 Mais opções de compartilhamento...
Moderador Sollix 169 Postado 11 de Outubro Moderador Compartilhar Postado 11 de Outubro 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 Mais opções de compartilhamento...
ploneer157 436 Postado 11 de Outubro Autor Compartilhar Postado 11 de Outubro topico resolvido Link para o comentário https://tibiadevs.com/forums/topic/1278-pokedex-pmonster-erro-bytes-8000/#findComment-6600 Compartilhar em outros sites Mais opções de compartilhamento...
faelp13 0 Postado 13 de Outubro Compartilhar Postado 13 de Outubro o que voce fez para arrumar e não causar lag? Link para o comentário https://tibiadevs.com/forums/topic/1278-pokedex-pmonster-erro-bytes-8000/#findComment-6608 Compartilhar em outros sites Mais opções de compartilhamento...
hisokafail 74 Postado 14 de Outubro Compartilhar Postado 14 de Outubro 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 Mais opções de compartilhamento...
Administrador The Baker 5015 Postado 16 de Outubro Administrador Compartilhar Postado 16 de Outubro 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) 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 Mais opções de compartilhamento...
Posts Recomendados
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 contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora