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
info
Grupo: Visconde
Registrado: 11/08/10
Posts: 477
Reputação: +175
Gênero: Masculino

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
info
Grupo: Campones
Registrado: 30/06/10
Posts: 31
Reputação: +2

@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"?
Editado Julho 9 por eduardo0001
Explicando melhor
info
Grupo: Herói
Registrado: 25/02/07
Posts: 859
Reputação: +331
Gênero: Masculino

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"?
Você ta comparando número com algo nulo... o que a linha 147 faz?
Editado Julho 15 por Skulls
info
Grupo: Campones
Registrado: 30/06/10
Posts: 31
Reputação: +2

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:
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 ?
info
Grupo: Herói
Registrado: 25/02/07
Posts: 859
Reputação: +331
Gênero: Masculino

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.
info
Grupo: Campones
Registrado: 30/06/10
Posts: 31
Reputação: +2

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?
Citarfor _, 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?
Editado Agosto 1 por eduardo0001
info
Grupo: Herói
Registrado: 07/03/16
Posts: 1.4k
Reputação: +385
Gênero: Masculino

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.
info
Grupo: Campones
Registrado: 30/06/10
Posts: 31
Reputação: +2

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:
Citarif 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
info
Grupo: Campones
Registrado: 30/06/10
Posts: 31
Reputação: +2

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
<action itemid="2422" script="refinamento.lua"/>
salvo em -> action/refinamento.lua
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.
info
Grupo: Herói
Registrado: 07/03/16
Posts: 1.4k
Reputação: +385
Gênero: Masculino

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:
Citarif 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).
info
Grupo: Campones
Registrado: 30/06/10
Posts: 31
Reputação: +2

@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:
Citarfunction 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.
Citarif 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:
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:
Editado Agosto 2 por eduardo0001
info
Grupo: Herói
Registrado: 07/03/16
Posts: 1.4k
Reputação: +385
Gênero: Masculino

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.
info
Grupo: Campones
Registrado: 30/06/10
Posts: 31
Reputação: +2

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.
info
Grupo: Administrador
Registrado: 08/07/05
Posts: 5.8k
Reputação: +1.4k
Gênero: Outro

@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.
Editado Agosto 3 por Daniel
info
Grupo: Campones
Registrado: 30/06/10
Posts: 31
Reputação: +2
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:
IMAGEM COM ERRO:
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.
Editado Agosto 3 por Daniel