Ir para conteúdo
  • Cadastre-se

(Resolvido)getItemAttribute retornando null


Ir para solução Resolvido por Storm,

Posts Recomendados

Olá pessoal, utilizo a versão TFS 0.4 para meu Baiak

 

O problema é o seguinte, estava fazendo um código em weapons para fazer o dano de Paladin, e queria pegar o dano do Bow para ser somado junto com o dano da munição utilizada, porem a função getItemAttribute está me retornando null, se podem me ajudar, ficarei grato!

 

Não está surgindo nenhum erro de código, apenas retornando null. 

 

O código que estou utilizando em weapons/script/distance.lua

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 0)
setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 0)
setCombatParam(combat, COMBAT_PARAM_TYPE, 1)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 2)
 
 
function onGetFormulaValues(cid, level, skill, attack, factor)
    local arma = getPlayerSlotItem(cid, CONST_SLOT_LEFT).uid

    if arma ~= 0 then
        if getItemWeaponType(arma) ~= 4 then
            arma = getPlayerSlotItem(cid, CONST_SLOT_RIGHT).uid
        end
    else
        arma = getPlayerSlotItem(cid, CONST_SLOT_RIGHT).uid
    end
    danoArma = getItemAttribute(arma, 'attack') 
    print(type(danoArma)) -- print apenas para ver o que é retornado (null neste caso)
    
    min = -(((attack * 5) + (skill * 0.5) + (level * 0.04)) / factor)
    max = -(((attack * 5) + (skill * 0.8) + (level * 0.06)) / factor)
    return min, max
end
 
 
setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
 
 
function onUseWeapon(cid, var)
    local ret = doCombat(cid, combat, var)
    if(ret == LUA_ERROR) then
        return LUA_ERROR
    end
    return true
end 

REP+ para quem me dar essa luz! =D

 

Editado por Balkalima (veja o histórico de edições)

Ajudar os outros sobre o que se sabe não dói pois amanhã quem pode precisar de ajuda é você!  ;)

 

 

Só sei que nada sei. ~ Sócrates  :cool:

 

Link para o post
Compartilhar em outros sites

@Balkalima Tenta assim:

function onGetFormulaValues(cid, level, skill, attack, factor)
	local arma = getPlayerSlotItem(cid, CONST_SLOT_LEFT).uid
	
	if arma ~= 0 then
		if getItemWeaponType(arma) ~= 4 then
			local arma = getPlayerSlotItem(cid, CONST_SLOT_RIGHT).uid
		end
	else
		local arma = getPlayerSlotItem(cid, CONST_SLOT_RIGHT).uid
	end
	local danoArma = getItemAttribute(arma, 'attack') 
	print(type(danoArma)) -- print apenas para ver o que é retornado (null neste caso)
	
	min = -(((attack * 5) + (skill * 0.5) + (level * 0.04)) / factor)
	max = -(((attack * 5) + (skill * 0.8) + (level * 0.06)) / factor)
	return min, max
end

 

Link para o post
Compartilhar em outros sites

@Storm  continua retornando null.

 

Uma pergunta o uid não deve ser o ID do item, certo? Pois para eu conseguir o id do item eu teria que usar .itemid, ao inves de .udi, mas o método getItemAttribute aceita apenas uid.

 

O uid retornado é 70000 e o ID do item que estou utilizando para teste é 8858.

 

 

~ Edit 1

 

Acabei de ler sobre o uid, então creio estar certo utilizar o UID.

Editado por Balkalima (veja o histórico de edições)

Ajudar os outros sobre o que se sabe não dói pois amanhã quem pode precisar de ajuda é você!  ;)

 

 

Só sei que nada sei. ~ Sócrates  :cool:

 

Link para o post
Compartilhar em outros sites

@Balkalima Tenta usar aspas duplas ao invés de usar a aspa simples e vê se funciona.

 

Tava pesquisando aqui, vê se no seu servidor existe a função getItemAttack e usa ela no lugar do getItemAttribute

local danoArma = getItemAttack(arma)

 

Se não tiver a função, aqui está ela:

function getItemAttack(item)
	return getItemAttribute(item.uid, "attack") or getItemInfo(item.itemid).attack
end

 

Editado por Storm (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

@Storm com as aspas duplas permanece na mesma, retornando null.

 

Não tinha a função e adicionei no arquivo 050-function.lua. Qual serio o parâmetro? Apenas o item?

 

Aqui está o código editado para utilizar getItemAttack (Tinha tentado mandar um contêiner do item, também, mas não funcionou):

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 0)
setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 0)
setCombatParam(combat, COMBAT_PARAM_TYPE, 1)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 2)

function onGetFormulaValues(cid, level, skill, attack, factor)
	local arma = getPlayerSlotItem(cid, CONST_SLOT_LEFT).uid
	
	if arma ~= 0 then
		if getItemWeaponType(arma) ~= 4 then
			local arma = getPlayerSlotItem(cid, CONST_SLOT_RIGHT)
		end
	else
		local arma = getPlayerSlotItem(cid, CONST_SLOT_RIGHT)
	end
	local danoArma = getItemAttack(arma) 
	print(type(danoArma))
	
	min = -(((attack * 5) + (skill * 0.5) + (level * 0.04)) / factor)
	max = -(((attack * 5) + (skill * 0.8) + (level * 0.06)) / factor)
	return min, max
end
 
 
setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
 
 
function onUseWeapon(cid, var)
    local ret = doCombat(cid, combat, var)
    if(ret == LUA_ERROR) then
        return LUA_ERROR
    end
    return true
end

 

O erro gerado:

Citar

[15:5:25.963] [Error - Weapon Interface]
[15:5:25.967] In a callback: data/weapons/scripts/distance.lua:onGetFormulaValues
[15:5:25.971] (Unknown script file)
[15:5:25.973] Description:
[15:5:25.975] data/lib/050-function.lua:488: attempt to index local 'item' (a number value)

 

Editado por Balkalima (veja o histórico de edições)

Ajudar os outros sobre o que se sabe não dói pois amanhã quem pode precisar de ajuda é você!  ;)

 

 

Só sei que nada sei. ~ Sócrates  :cool:

 

Link para o post
Compartilhar em outros sites
  • Solução

@Balkalima Tirei aquele print(type) e mudei algumas outras coisas, tenta ai:

function onGetFormulaValues(cid, level, skill, attack, factor)
	local arma = getPlayerSlotItem(cid, CONST_SLOT_LEFT)
	
	if getItemWeaponType(arma.uid) ~= 4 then
		local danoArma = getItemInfo(arma.itemid).attack
	else
		local danoArma = getItemInfo(getPlayerSlotItem(cid, CONST_SLOT_RIGHT).itemid).attack
	end
	print(danoArma) -- print apenas para ver o que é retornado (null neste caso)
	
	min = -(((attack * 5) + (skill * 0.5) + (level * 0.04)) / factor)
	max = -(((attack * 5) + (skill * 0.8) + (level * 0.06)) / factor)
	return min, max
end

 

Link para o post
Compartilhar em outros sites

@Storm era esse getItemInfo que me faltava rsrsrs, tinha procurado os métodos do TFS 0.4 e pelo visto estava focando no errado, tinha até pensado em uma gambiarra para ter o dano da arma, mas este seu código é a melhor forma, editando o attack em um só lugar (items.xml) e aplicando em todo o servidor.

 

Funcionou perfeitamente o código cara, muito obrigado, estou lhe dando REP+.  ?

Só não sei se marco sua resposta como melhor resposta ou esta, onde estarei colocando o código final, corrigindo e explicando a lógica, pois tinha um pequeno problema:

 

weapons/script/distance.lua:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 0)
setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 0)
setCombatParam(combat, COMBAT_PARAM_TYPE, 1)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 2)
 
 
function onGetFormulaValues(cid, level, skill, attack, factor)
	local arma = getPlayerSlotItem(cid, CONST_SLOT_LEFT) -- Pego o item que ele está usando no lado esquerdo
    
    if arma.uid ~= 0 then -- checo se realmente tinha algum item do lado esquerdo (poderia estar utilizando do lado direito e não ter nada no slot esquerdo).
        if getItemWeaponType(arma.uid) == 4 then -- se estiver utilizando algo do lado esquerdo e for uma arma (bow, crosbow) o getItemWeaponType retorna 4.
            danoArma = getItemInfo(arma.itemid).attack
        else -- se a arma não estava no lado esquerdo, só pode estar do lado direito
            danoArma = getItemInfo(getPlayerSlotItem(cid, CONST_SLOT_RIGHT).itemid).attack
        end
    else -- caso a arma esteja no lado direito e o lado esquerdo está vazio, a arma só pode estar do lado direito
        danoArma = getItemInfo(getPlayerSlotItem(cid, CONST_SLOT_RIGHT).itemid).attack
    end
    
    attack = attack + danoArma

	min = -(((attack * 5) + (skill * 0.5) + (level * 0.04)) / factor)
	max = -(((attack * 5) + (skill * 0.8) + (level * 0.06)) / factor)
	return min, max
end
 
 
setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
 
 
function onUseWeapon(cid, var)
    local ret = doCombat(cid, combat, var)
    if(ret == LUA_ERROR) then
        return LUA_ERROR
    end
    return true
end 

Obs: Nota-se que a lógica que usei foi para deixar o mais genérico possível, funcionando para armas de uma e duas mão, você que escolhe, e também por não saber a ação do player, em qual mão ele pretende utilizar a arma se faz necessário o primeiro if.

 

weapons/weapons.xml:

<!-- Ammunition -->
<distance id="2352" level="120" event="script" value="distance.lua"/> <!-- Crystal Arrow -->

 

Editado por Balkalima
eliminar duplo sentido (veja o histórico de edições)

Ajudar os outros sobre o que se sabe não dói pois amanhã quem pode precisar de ajuda é você!  ;)

 

 

Só sei que nada sei. ~ Sócrates  :cool:

 

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo