Ir para conteúdo
  • 0

Refinamento com problema


eduardo0001

Pergunta

Gostaria que me dessem uma mão nesse código, estou adaptando para TFS 1.2 e algumas funções não ajudam rsrs.
Vou postar os seguintes erros na imagem abaixo.
Preciso trocar essa função "getItemInfo" do código por outra que existe no TFS 1.2 mas não tenho ideia qual eu posso usar.

Código original:

Spoiler
--- Sistema de Upgrade de itens feito por Killua.--- Sistema feito com base no do Bronson Server.local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itenslocal ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinadoslocal controle = {    {level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso    {level = 1, quantOre = 2, chance = 90},    {level = 2, quantOre = 3, chance = 80},    {level = 3, quantOre = 4, chance = 70},    {level = 4, quantOre = 5, chance = 60},    {level = 5, quantOre = 6, chance = 50},    {level = 6, quantOre = 7, chance = 40},    {level = 7, quantOre = 8, chance = 30},    {level = 8, quantOre = 9, chance = 20},    {level = 9, quantOre = 10, chance = 10}}function getItemLevel(uid)    if uid > 0 then        return getItemAttribute(uid, "lvl") or 0    end    return falseendfunction doItemAddLevel(uid, count)    if uid > 0 and tonumber(count) > 0 then        return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count)    end    return falseendfunction onUse(cid, item, fromPosition, itemEx, toPosition)    if not isInArray(vocations, getPlayerVocation(cid)) then        return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.")    elseif isInArray(ids_bloqueados, itemEx.uid) then        return doPlayerSendCancel(cid, "Este item nao pode ser refinado.")    end         if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then        for _, upgrade in pairs(controle) do            local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack            local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense            local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor            local chance = math.random(1, 100)            if getItemLevel(itemEx.uid) == upgrade.level then               if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then                   doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS)                  if chance <= upgrade.chance then                      if getItemLevel(itemEx.uid) == 0 then                          doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por" ..getCreatureName(cid))                      end                      doItemAddLevel(itemEx.uid, 1)                      doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid))                      if getItemInfo(itemEx.itemid).attack > 0 then                          doItemSetAttribute(itemEx.uid, "attack", atk + 1)                          return true                      elseif getItemInfo(itemEx.itemid).armor > 0 then                          doItemSetAttribute(itemEx.uid, "armor", arm + 1)                          return true                      elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then                          doItemSetAttribute(itemEx.uid, "defense", def + 1)                          return true                      end                  else                      doTransformItem(itemEx.uid, 2256)                      doItemSetAttribute(itemEx.uid, 'name', "metal trash")                      doItemSetAttribute(itemEx.uid, 'attack', 0)                      doItemSetAttribute(itemEx.uid, 'armor', 0)                      doItemSetAttribute(itemEx.uid, 'defense', 0)                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.")                      return true                  end              else                  doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.")              end          end      end  else      doPlayerSendCancel(cid, "Esse item nao pode ser refinado.")  end  return trueend   

 

IMAGEM COM ERRO:

Spoiler

Sem título.png

Lembrando esse erro acontece após eu clicar no martelo e clicar no escudo como exemplo! Pode ser qualquer item com atributos ,todos dão o mesmo erro.

577fd3ca2b69b_Semttulo.png.892e3a5a94decf477ce3d9d04f3fa97b.png

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

tentei criar a funçao pra vc n ter q substituir em todo lugar que tem ela, então só coloca no seu script:

 

function getItemInfo(id)local it = ItemType(id)return {attack = it.getAttack(), defense = it.getDefense(), armor = it.getArmor()}end

 

Link para o comentário
Compartilhar em outros sites

  • 0

@Eskylo Adicionei no arquivo refinamento.lua perto de outras "function" só que  da um erro nas linhas acima da função getItemInfo, observe na imagem.

 O que significa quando fala "attempt to compare number with nil stack traceback"?

Spoiler

Sem título.png

 

57800c96ada1a_Semttulo.png.04003bd5c5f806cef6b63056abba773e.png

Editado por eduardo0001
Explicando melhor
Link para o comentário
Compartilhar em outros sites

  • 0
Em 7/8/2016 at 23:16, eduardo0001 disse:

@Eskylo Adicionei no arquivo refinamento.lua perto de outras "function" só que  da um erro nas linhas acima da função getItemInfo, observe na imagem.

 O que significa quando fala "attempt to compare number with nil stack traceback"?

  Ocultar conteúdo

Sem título.png

 

Você ta comparando número com algo nulo... o que a linha 147 faz?

Link para o comentário
Compartilhar em outros sites

  • 0
Em 15/07/2016 at 16:33, Skulls disse:

Você ta comparando número com algo nulo... o que a linha 147 faz?

@Skulls

O erro está aqui an função onUse:

Spoiler

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if not isInArray(vocations, getPlayerVocation(cid)) then
        return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.")
    elseif isInArray(ids_bloqueados, itemEx.uid) then
        return doPlayerSendCancel(cid, "Este item nao pode ser refinado.")
    end 
    
    if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then
        for _, upgrade in pairs(controle) do
            local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack
            local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense
            local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor

Não entendo, número nulo? Talvez ele está pegando esse ">0" e não conseguindo fazer leitura ?

Link para o comentário
Compartilhar em outros sites

  • 0

Uma ou mais dessa comparações está acontecendo entre um objeto vazio e um número. Verifica se esses 3 atributos dp item realmente existem e se estão preenchidos com algum valor quando vc busca o item. Faz um broadcast com eles, ou printa de alguma outra forma.

Link para o comentário
Compartilhar em outros sites

  • 0
9 horas atrás, Skulls disse:

Uma ou mais dessa comparações está acontecendo entre um objeto vazio e um número. Verifica se esses 3 atributos dp item realmente existem e se estão preenchidos com algum valor quando vc busca o item. Faz um broadcast com eles, ou printa de alguma outra forma.

@Skulls Você sabe me dizer o que significa isso?

Citar

for _, upgrade in pairs(controle) do

 

Estou enviando também a imagem do item que eu usei como exemplo.

Veja na linha 132, eu adicionei essa função de acordo com o @Eskylo falou pra fazer, aí começou a dar esse problema na imagem abaixo.

Na linha 144 tentei mudar os valores e mesmo assim não funciona.

 

Tem alguma ideia?

 

Sem título.png

579f713fe4443_Semttulo.thumb.png.2f6b6451d6c187cfc3ddaaa2151d2f88.png

Editado por eduardo0001
Link para o comentário
Compartilhar em outros sites

  • 0

Na propria linha 144 uma das condicoes esta retornando nulo e voce esta comparando com um numero.

Exemplo:

Getiteminfo.numero > nao existe esse parametro numero, logo ele retorna nil.

Se eu colocar isso em uma condicao, vai gerar esse erro, pois nil nao pode ser comparado com numeros.

Link para o comentário
Compartilhar em outros sites

  • 0
5 horas atrás, Poccnn disse:

Na propria linha 144 uma das condicoes esta retornando nulo e voce esta comparando com um numero.

Exemplo:

Getiteminfo.numero > nao existe esse parametro numero, logo ele retorna nil.

Se eu colocar isso em uma condicao, vai gerar esse erro, pois nil nao pode ser comparado com numeros.

@Poccnn Certo, então ficou assim:

 

Citar

  if getItemInfo(itemEx.itemid).attack  or getItemInfo(itemEx.itemid).defense  or getItemInfo(itemEx.itemid).armor  then

aí para de dar erro na distro, porém no game fala " esse item nao pode ser refinado " ou seja, ele não ta reconhecendo que é um item de ataque/defesa/armor

Link para o comentário
Compartilhar em outros sites

  • 0

Vou deixar meu código aqui caso alguém saiba resolver, lembrando estou adaptando para a versão 10.90 TFS 1.2.

adicionado em -> action.xml
 

Spoiler

<action itemid="2422" script="refinamento.lua"/>


salvo em -> action/refinamento.lua

Spoiler

local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itens

local ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinados

local controle = {
    {level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso
    {level = 1, quantOre = 2, chance = 90},
    {level = 2, quantOre = 3, chance = 80},
    {level = 3, quantOre = 4, chance = 70},
    {level = 4, quantOre = 5, chance = 60},
    {level = 5, quantOre = 6, chance = 50},
    {level = 6, quantOre = 7, chance = 40},
    {level = 7, quantOre = 8, chance = 30},
    {level = 8, quantOre = 9, chance = 20},
    {level = 9, quantOre = 10, chance = 10}
}

function getItemLevel(uid)
    if uid > 0 then
        return getItemAttribute(uid, "lvl") or 0
    end
    return false
end

function doItemAddLevel(uid, count)
    if uid > 0 and tonumber(count) > 0 then
        return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count)
    end
    return false
end

function getItemInfo(id)
    local it = ItemType(id)
    return {attack = it.getAttack(), defense = it.getDefense(), armor = it.getArmor()}
end

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if not isInArray(vocations, getPlayerVocation(cid)) then
        return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.")
    elseif isInArray(ids_bloqueados, itemEx.uid) then
        return doPlayerSendCancel(cid, "Este item nao pode ser refinado.")
    end 
    
    if getItemInfo(itemEx.itemid).attack  or getItemInfo(itemEx.itemid).defense  or getItemInfo(itemEx.itemid).armor then
        for _, upgrade in pairs(controle) do
            local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack
            local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense
            local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor
            local chance = math.random(1, 100)
            if getItemLevel(itemEx.uid) == upgrade.level then
               if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then
                   doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS)
                  if chance <= upgrade.chance then
                      if getItemLevel(itemEx.uid) == 0 then
                          doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por " ..getCreatureName(cid))
                      end
                      doItemAddLevel(itemEx.uid, 1)
                      doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))
                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid))
                      if getItemInfo(itemEx.itemid).attack > 0 then
                          doItemSetAttribute(itemEx.uid, "attack", atk + 3)
                          return true
                      elseif getItemInfo(itemEx.itemid).armor > 0 then
                          doItemSetAttribute(itemEx.uid, "armor", arm + 3)
                          return true
                      elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then
                          doItemSetAttribute(itemEx.uid, "defense", def + 3)
                          return true
                      end

                  end
              else
                  doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.")
              end
          end
      end
  else
      doPlayerSendCancel(cid, "Esse item nao pode ser refinado.")
  end
  return true
end  


Pra facilitar aí está o código, vou dar rep+ para toda ajuda no final. 

Link para o comentário
Compartilhar em outros sites

  • 0

Nao faça isso; nao é preciso mudar o condicional para tentar fazer funcionar o sistema, senao o sistema vai funcionar de modo nao planejado.

Mude a linha do if por essa:

Citar

if tonumber(getItemInfo(itemEx.itemid).attack) and  getItemInfo(itemEx.itemid).attack > 0 or tonumber(getItemInfo(itemEx.itemid).defense) and getItemInfo(itemEx.itemid).defense > 0  or tonumber(getItemInfo(itemEx.itemid).armor) and getItemInfo(itemEx.itemid).armor > 0 then

 

Dessa forma, ele impoe que o valor tenha que ser numero e entao ele faz a verificacao se é maior que 0 (zero).

Link para o comentário
Compartilhar em outros sites

  • 0

 

@Poccnn Certo, fiz a alteração mas ainda continua falando que não não pode refinar o item. E não aparece nenhum erro na distro. Ahh quando substitui essa linha
no "if" se eu remover essa função que o Eskylo passou a distro não mostra erros que mostrava antes, porém se eu tirar essa função:

Citar
function getItemInfo(id)	local it = ItemType(id)	return {attack = it.getAttack(), defense = it.getDefense(), armor = it.getArmor()}end

 

e voltar como era antes o "if" vai mostrar o erro na distro falando que não reconhece o getItemInfo.

Citar

if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then

Então pode ser que o "if" que você me passou pode ter alguma coisa errada...é uma pena não estarmos conseguindo consertar :/ é um bom sistema, funcionava bem na versão 8.60.
Código alterado:

Spoiler


local vocations = {1, 2, 3, 4, 5, 6, 7, 8} -- Vocações que podem refinar itens

local ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinados

local controle = {
    {level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso
    {level = 1, quantOre = 2, chance = 90},
    {level = 2, quantOre = 3, chance = 80},
    {level = 3, quantOre = 4, chance = 70},
    {level = 4, quantOre = 5, chance = 60},
    {level = 5, quantOre = 6, chance = 50},
    {level = 6, quantOre = 7, chance = 40},
    {level = 7, quantOre = 8, chance = 30},
    {level = 8, quantOre = 9, chance = 20},
    {level = 9, quantOre = 10, chance = 10}
}


function getItemLevel(uid)
    if uid > 0 then
        return getItemAttribute(uid, "lvl") or 0
    end
    return false
end

function doItemAddLevel(uid, count)
    if uid > 0 and tonumber(count) > 0 then
        return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count)
    end
    return false
end

function getItemInfo(id)
    local it = ItemType(id)
    return {attack = it.getAttack(), defense = it.getDefense(), armor = it.getArmor()}
end


function onUse(cid, item, fromPosition, itemEx, toPosition)
    if not isInArray(vocations, getPlayerVocation(cid)) then
        return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.")
    elseif isInArray(ids_bloqueados, itemEx.uid) then
        return doPlayerSendCancel(cid, "Este item nao pode ser refinado.")
    end 
    

    if tonumber(getItemInfo(itemEx.itemid).attack) and  getItemInfo(itemEx.itemid).attack > 0 or tonumber(getItemInfo(itemEx.itemid).defense) and getItemInfo(itemEx.itemid).defense > 0  or tonumber(getItemInfo(itemEx.itemid).armor) and getItemInfo(itemEx.itemid).armor > 0 then
        for _, upgrade in pairs(controle) do
            local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack
            local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense
            local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor
            local chance = math.random(1, 100)
            if getItemLevel(itemEx.uid) == upgrade.level then
               if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then
                   doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS)
                  if chance <= upgrade.chance then
                      if getItemLevel(itemEx.uid) == 0 then
                          doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por " ..getCreatureName(cid))
                      end
                      doItemAddLevel(itemEx.uid, 1)
                      doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))
                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid))
                      if getItemInfo(itemEx.itemid).attack > 0 then
                          doItemSetAttribute(itemEx.uid, "attack", atk + 3)
                          return true
                      elseif getItemInfo(itemEx.itemid).armor > 0 then
                          doItemSetAttribute(itemEx.uid, "armor", arm + 3)
                          return true
                      elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then
                          doItemSetAttribute(itemEx.uid, "defense", def + 3)
                          return true
                      end

                  end
              else
                  doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.")
              end
          end
      end
  else
      doPlayerSendCancel(cid, "Esse item nao pode ser refinado.")
  end
  return true
end  

Observe a imagem:

Sem título.png

57a1238edc213_Semttulo.png.7df8ee3b9b701d4d1236f6ca909daed9.png

Editado por eduardo0001
Link para o comentário
Compartilhar em outros sites

  • 0

Eu nao conheco a versao 0.4 mas, essa funcao itemtype existe? E o que ela retorna? Uma tabela? Se for, qual o conteudo dela?

Isso tem que ser verificado.

Link para o comentário
Compartilhar em outros sites

  • 0
37 minutos atrás, Poccnn disse:

Eu nao conheco a versao 0.4 mas, essa funcao itemtype existe? E o que ela retorna? Uma tabela? Se for, qual o conteudo dela?

Isso tem que ser verificado.

@Poccnn Não sei dizer o que ela retorna, pois na versão 0.4 não precisava dessa função com itemtype, se você olhar no primeiro post tem o código original e funcionava sem problemas.
Na versão 1.2 tem algumas funções dela na lib/compat, vou enviar o arquivo pra facilitar a pesquisa.

compat.lua

Link para o comentário
Compartilhar em outros sites

  • 0
  • Administrador

@eduardo0001, editei o prefixo do seu tópico para tfs 1.2. Os prefixos identificam melhor os tópicos e fazem com que você tenha respostas mais rapidamente. Entretanto, se você utilizar uma tag igual ao prefixo, o prefixo irá se esconder. =): (removi a tag tfs 1.2)

 

Qualquer dúvida estou a disposição.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...