Ir para conteúdo

[Encerrado] [Encerrado] Attempt to insert a child again into a UIWidget


maykeldoido

Posts Recomendados

Bom Dia gente, estou configurando os filtros de ordenação na BattleWindow do OTClient, porém por algum motivo está gerando muito erros consecutivos quando ele tenta adicionar o pokemon na BattleWindow, abaixo da pra ver na imagem, o problema é que isso se acumula e trava o cliente!

 

Segue aqui o código da função addCreature():

Spoiler

function addCreature(creature)
  local creatureId = creature:getId()
  local battleButton = battleButtonsByCreaturesList[creatureId]
        
         -- Register when creature is added to battlelist for the first time
        if not creatureAgeList[creatureId] then
            creatureAgeList[creatureId] = os.time()
        end
        if creature:getHealthPercent() <= 1 then
           battleButton:setVisible(false)
           return true
        end

  if not battleButton then
    battleButton = g_ui.createWidget('BattleButton')
    battleButton:setup(creature)

    battleButton.onHoverChange = onBattleButtonHoverChange
    battleButton.onMouseRelease = onBattleButtonMouseRelease

    battleButtonsByCreaturesList[creatureId] = battleButton

    if pokemonId and creatureId == pokemonId then
      battlePanel:insertChild(1, battleButton)
      battleButton:getChildById('myPokemon'):setImageColor('white')
    else
      battlePanel:addChild(battleButton)
    end

    if creature == g_game.getAttackingCreature() then
      onAttack(creature)
    end

    if creature == g_game.getFollowingCreature() then
      onFollow(creature)
    end
    
    local inserted = false
    local nameLower = creature:getName():lower()
    local healthPercent = creature:getHealthPercent()
    local playerPosition = g_game.getLocalPlayer():getPosition()
    local distance = getDistanceBetween(playerPosition, creature:getPosition())
    local age = creatureAgeList[creatureId]

    local childCount = battlePanel:getChildCount()
    for i = 1, childCount do
      local child = battlePanel:getChildByIndex(i)
      local childName = child:getCreature():getName():lower()
      local equal = false
      if getSortType() == 'age' then
        local childAge = creatureAgeList[child:getCreature():getId()]
        if (age < childAge and isSortAsc()) or (age > childAge and isSortDesc()) then
          battlePanel:insertChild(i, battleButton)
          inserted = true
          break
        elseif age == childAge then
          equal = true
        end
      elseif getSortType() == 'distance' then
        local childDistance = getDistanceBetween(child:getCreature():getPosition(), playerPosition)
        if (distance < childDistance and isSortAsc()) or (distance > childDistance and isSortDesc()) then
          battlePanel:insertChild(i, battleButton)
          inserted = true
          break
        elseif childDistance == distance then
          equal = true
        end
      elseif getSortType() == 'health' then
          local childHealth = child:getCreature():getHealthPercent()
          if (healthPercent < childHealth and isSortAsc()) or (healthPercent > childHealth and isSortDesc()) then
            battlePanel:insertChild(i, battleButton)
            inserted = true
            break
          elseif healthPercent == childHealth then
            equal = true
          end
      end

      -- If any other sort type is selected and values are equal, sort it by name also
      if getSortType() == 'name' or equal then
          local length = math.min(childName:len(), nameLower:len())
          for j=1,length do
            if (nameLower:byte(j) < childName:byte(j) and isSortAsc()) or (nameLower:byte(j) > childName:byte(j) and isSortDesc()) then
              battlePanel:insertChild(i, battleButton)
              inserted = true
              break
            elseif (nameLower:byte(j) > childName:byte(j) and isSortAsc()) or (nameLower:byte(j) < childName:byte(j) and isSortDesc()) then
              break
            elseif j == nameLower:len() and isSortAsc() then
              battlePanel:insertChild(i, battleButton)
              inserted = true
            elseif j == childName:len() and isSortDesc() then
              battlePanel:insertChild(i, battleButton)
              inserted = true
            end
          end
      end

      if inserted then
        break
      end
    end

Ele aponta erro na linha 444, está que está destacada:

battlePanel:insertChild(i, battleButton)

É justamente o momento que ele tenta inserir um filho na BattleWindow, provavelmente a lógica que invoca essa inserção está errada e entrando em loop, porém não consegui identificar.. Será que alguém pode me ajudar?


Imagem de erros no Terminal:

Spoiler


Capturar.PNG

 

 

Desde já, agradeço!

Capturar.thumb.PNG.94443668bfc9d4d0012e78c07e7b011b.PNG

Link para o comentário
Compartilhar em outros sites

Resolvido!

Se alguém tiver o mesmo problema, é uma mensagem de aviso normal da UIWidget, quando ela ja possui um "Child" e você adicionar outro, está configurado para mandar esse aviso.. Para corrigir basta ir em modules/cliente_terminal/terminal.lua, e onde está:

Spoiler

local function onLog(level, message, time)
  if disabled then return end
  -- avoid logging while reporting logs (would cause a infinite loop)
  if logLocked then return end

 

Dê um enter e adicione:

Spoiler

if string.find(message, "WARNING: attempt to insert a child again into a UIWidget") then 
    return 
  end

 

Pronto, essa mensagem não vai mais aparecer e em casos de spam dela como era o meu, vai deixar de travar o cliente!

Pode fechar o tópico.

Link para o comentário
Compartilhar em outros sites

  • 6 months later...
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...