Jump to content
  • 0

bug mover Pokemon (Canary - Version 3.1.2)


joshiie25

Question

Boa tarde.
Estou tentando reproduzir o script Pokémon Move de "pota".

mas estou com um problema, pois os monstros podem passar por tudo.


8f1c0eb1dca34957b8e3d285d5a117ef.gif

 

Código:

function pokemonWalk(summon, position, maxDistance, extra)
    local path = summon:getPathTo(position, 0, maxDistance, false, false, 15)
    if not path then
        return false
    end

    setCreatureIdle(summon:getId(), #path * 500 + 10000)
    walkToPosition(summon:getId(), path, 1, extra)
    return true
end

function walkToPosition(cid, path, count, extra)
    local creature = Creature(cid)
    if not creature then
        return true
    end
    if creature:getCondition(CONDITION_MOVING) == nil then
        return true
    end

    local dir = path[count]
    creature:move(dir)
    count = count + 1
    addEvent(walkToPosition, creature:getWalkDelay(dir), cid, path, count, extra)
end

function setCreatureIdle(cid, time)
    local creature = Creature(cid)
    if not creature then
        return true
    end
    local condition = Condition(CONDITION_MOVING)
    condition:setParameter(CONDITION_PARAM_TICKS, time)
    creature:addCondition(condition)
end

 

Edited by joshiie25
Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

O problema está nos parâmetros passados para getPathTo, onde os parâmetros que controlam a passagem por obstáculos estão definidos como false. Isso permite que a criatura atravesse elementos bloqueantes. Além disso, podemos ajustar alguns detalhes para garantir um movimento mais seguro e fluido.

Script Ajustado
 

function pokemonWalk(summon, position, maxDistance, extra)
    -- Tenta encontrar um caminho para a posição desejada
    local path = summon:getPathTo(position, 0, maxDistance, true, false, 15)
    -- O terceiro parâmetro (true) indica que a criatura não pode atravessar bloqueios (como paredes).
    -- O quarto parâmetro (false) indica que a criatura pode atravessar outros monstros.
    
    if not path or #path == 0 then
        return false
    end

    setCreatureIdle(summon:getId(), #path * 500 + 10000)
    walkToPosition(summon:getId(), path, 1, extra)
    return true
end

function walkToPosition(cid, path, count, extra)
    local creature = Creature(cid)
    if not creature then
        return true
    end
    if creature:getCondition(CONDITION_MOVING) == nil then
        return true
    end

    local dir = path[count]
    creature:move(dir)
    count = count + 1
    if count <= #path then
        addEvent(walkToPosition, creature:getWalkDelay(dir), cid, path, count, extra)
    end
end

function setCreatureIdle(cid, time)
    local creature = Creature(cid)
    if not creature then
        return true
    end
    local condition = Condition(CONDITION_MOVING)
    condition:setParameter(CONDITION_PARAM_TICKS, time)
    creature:addCondition(condition)
end


 

Mudanças Feitas:

  1. Parâmetro de Caminho:

    • getPathTo(position, 0, maxDistance, true, false, 15)
    • O terceiro parâmetro (true) agora assegura que a criatura não atravessará obstáculos sólidos como paredes ou itens que bloqueiam a passagem.
  2. Verificação de Caminho:

    • Agora verificamos se path é válido e se contém direções antes de continuar com a função walkToPosition.
  3. Execução Recursiva de Movimento:

    • A função walkToPosition só continua se houver mais direções a seguir no caminho (count <= #path).

Como Funciona Agora:

  • O Pokémon vai calcular um caminho válido para a posição alvo, evitando obstáculos como paredes.
  • O movimento é executado passo a passo, verificando se há condições que podem interromper o movimento (como uma condição de movimento já existente).
  • O movimento continua até que o Pokémon tenha atingido a posição final, sem atravessar paredes ou objetos intransponíveis.
Link to comment
Share on other sites

  • 0
Em 03/09/2024 em 17:52, Holograma disse:

O problema está nos parâmetros passados para getPathTo, onde os parâmetros que controlam a passagem por obstáculos estão definidos como false. Isso permite que a criatura atravesse elementos bloqueantes. Além disso, podemos ajustar alguns detalhes para garantir um movimento mais seguro e fluido.

Script Ajustado
 

function pokemonWalk(summon, position, maxDistance, extra)
    -- Tenta encontrar um caminho para a posição desejada
    local path = summon:getPathTo(position, 0, maxDistance, true, false, 15)
    -- O terceiro parâmetro (true) indica que a criatura não pode atravessar bloqueios (como paredes).
    -- O quarto parâmetro (false) indica que a criatura pode atravessar outros monstros.
    
    if not path or #path == 0 then
        return false
    end

    setCreatureIdle(summon:getId(), #path * 500 + 10000)
    walkToPosition(summon:getId(), path, 1, extra)
    return true
end

function walkToPosition(cid, path, count, extra)
    local creature = Creature(cid)
    if not creature then
        return true
    end
    if creature:getCondition(CONDITION_MOVING) == nil then
        return true
    end

    local dir = path[count]
    creature:move(dir)
    count = count + 1
    if count <= #path then
        addEvent(walkToPosition, creature:getWalkDelay(dir), cid, path, count, extra)
    end
end

function setCreatureIdle(cid, time)
    local creature = Creature(cid)
    if not creature then
        return true
    end
    local condition = Condition(CONDITION_MOVING)
    condition:setParameter(CONDITION_PARAM_TICKS, time)
    creature:addCondition(condition)
end


 

Mudanças Feitas:

  1. Parâmetro de Caminho:

    • getPathTo(position, 0, maxDistance, true, false, 15)
    • O terceiro parâmetro (true) agora assegura que a criatura não atravessará obstáculos sólidos como paredes ou itens que bloqueiam a passagem.
  2. Verificação de Caminho:

    • Agora verificamos se path é válido e se contém direções antes de continuar com a função walkToPosition.
  3. Execução Recursiva de Movimento:

    • A função walkToPosition só continua se houver mais direções a seguir no caminho (count <= #path).

Como Funciona Agora:

  • O Pokémon vai calcular um caminho válido para a posição alvo, evitando obstáculos como paredes.
  • O movimento é executado passo a passo, verificando se há condições que podem interromper o movimento (como uma condição de movimento já existente).
  • O movimento continua até que o Pokémon tenha atingido a posição final, sem atravessar paredes ou objetos intransponíveis.

Em primeiro lugar, muito obrigado por responder.

Tentei sua solução mas obtive o mesmo resultado, a convocação continua atravessando paredes

68d0edee92842a3bbd08c5a3edc9d01f.gif

 

code: 

71f7d18a748feeeb453df7114751a0f2.png

Link to comment
Share on other sites

  • 0
function pokemonWalk(summon, position, maxDistance, extra)
    -- Tenta encontrar um caminho para a posição desejada
    local path = summon:getPathTo(position, 0, maxDistance, true, true, 15)
    -- O terceiro parâmetro (true) indica que a criatura não pode atravessar bloqueios (como paredes).
    -- O quarto parâmetro (true) indica que a criatura pode atravessar outros monstros.
    
    if not path or #path == 0 then
        return false
    end

    -- Define um estado de inatividade após o monstro se mover
    setCreatureIdle(summon:getId(), #path * 500 + 10000)
    
    -- Inicia o movimento ao longo do caminho
    walkToPosition(summon:getId(), path, 1, extra)
    return true
end

function walkToPosition(cid, path, count, extra)
    local creature = Creature(cid)
    if not creature then
        return true
    end

    -- Verifica se a criatura ainda está se movendo
    if creature:getCondition(CONDITION_MOVING) == nil then
        return true
    end

    -- Pega a direção do próximo movimento
    local dir = path[count]
    
    -- Move a criatura para a próxima direção
    creature:move(dir)
    count = count + 1

    -- Continua o movimento enquanto houver caminho
    if count <= #path then
        addEvent(walkToPosition, creature:getWalkDelay(dir), cid, path, count, extra)
    end
end

function setCreatureIdle(cid, time)
    local creature = Creature(cid)
    if not creature then
        return true
    end

    -- Aplica a condição de inatividade à criatura
    local condition = Condition(CONDITION_MOVING)
    condition:setParameter(CONDITION_PARAM_TICKS, time)
    creature:addCondition(condition)
end


 

O que foi ajustado:

  1. getPathTo:

    • O terceiro parâmetro foi alterado para true, para impedir que os monstros atravessem paredes ou bloqueios. Isso deve resolver o problema principal.
  2. Continuação do Caminho:

    • A movimentação só continua enquanto houver um caminho válido (count <= #path), garantindo que o monstro siga o caminho até o final.
  3. Movimento entre Criaturas:

    • A função permite que o monstro atravesse outros monstros, mas você pode ajustar isso alterando o quarto parâmetro da função getPathTo para false, caso queira que eles evitem outros monstros também.

Teste essas modificações para ver se resolve o problema dos monstros passando por obstáculos!

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...