Esse tipo de função deve ser colocada na libs para os arquivos poderem identificar. Vai em data/lib/ duplica um arquivo e renomeia para qualquer coisa, depois sóh abre e cola a função drainSpell. Acho que isso resolvera teu problema.
- Fórum
- xTibia - Notícias e Suporte
- Soluções
- Archived
- Erro Ao Separar Funções Em Diferentes Scripts
Erro Ao Separar Funções Em Diferentes Scripts
Por luishg, 17 de jan. de 2012 em Archived
info
Grupo: Conde
Registrado: 30/06/11
Posts: 631
Reputação: +371
Char no Tibia: Warrior of Mort

Esse tipo de função deve ser colocada na libs para os arquivos poderem identificar. Vai em data/lib/ duplica um arquivo e renomeia para qualquer coisa, depois sóh abre e cola a função drainSpell. Acho que isso resolvera teu problema.
Bom, na distro OTServ 0.6.3 não há a pasta data/lib. Eu já havia tentado colocar na pasta data/spells/lib, que por lógica deveria fazer com que fosse aberta antes dos scripts, mas o erro continua a acontecer.
Baixei o TFS, e nele há a pasta data/lib, colocando ali funciona 100%.
Embora não tenha achado solução para a distro OTServ 0.6.3, pode fechar o tópico, pois passarei a utilizar o TFS mesmo e nele está funcionando de acordo com o que o Jhon falou.
Obg,
Luís.
info
Grupo: Infante
Registrado: 13/10/08
Posts: 1.6k
Reputação: +420
Char no Tibia: Demonbholder

tenta criar um arquivo dentro da pasta data, mas fora das outras pastas que tem la e colocar as funções.
se não funcionar a gente tenta outra coisa.
info
Grupo: Visconde
Registrado: 23/02/08
Posts: 273
Reputação: +101
Char no Tibia: Foxx Rookslayer

Você pode tentar criar uma LIB para as mesmas em data/lib/xxx-standspells.lua com o seguinte conteúdo:
function startSpell(cid)
doSendMagicEffect(getCreaturePosition(cid), 2)
doCreatureChangeOutfit(cid, {lookType = 28})
end
function stopSpell(cid)
setPlayerStorageValue(cid, 11000, 0)
doRemoveCondition(cid, CONDITION_OUTFIT)
doCreatureChangeOutfit(cid, {lookType = 29})
end
function drainSpell(cid)
if isPlayer(cid) then
if getPlayerStorageValue(cid, 11000) == 1 and getPlayerMana(cid) > 0 then
doPlayerAddMana(cid, -1)
addEvent(drainSpell, 3000, cid)
elseif getPlayerMana(cid) == 0 then
doSendMagicEffect(getCreaturePosition(cid), 2)
stopSpell(cid)
doPlayerSendCancel(cid, "Spell has been interrupted. You're out of mana.")
end
end
end
E colocar na primeira linha (de preferência) do arquivo que quiser usar tais funções isto:
dofile("./data/lib/xxx-standspells.lua")





info
Grupo: Campones
Registrado: 13/04/07
Posts: 3
Reputação: 0
Informações Gerais:
Server: OTServ 0.6.3
Versão: 8.60
Erro: "attempt to call global 'drainSpell'(a nil value)"
Introdução:
Bom eu sou programador C++ e C#, iniciei há pouco tempo com LUA, então estou tendo alguns probleminhas.
Eu desenvolvi uma Spell que funciona perfeitamente. O Código está abaixo:
spellCompleta.lua
-- Arquivo spells/scripts/spellCompleta.lua - funcionando - OK. local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) function onCastSpell(cid, var) if getPlayerStorageValue(cid, 11000) == 1 then stopSpell(cid) end addEvent(startSpell, 3000, cid) setPlayerStorageValue(cid, 11000, 1) drainSpell(cid) return doCombat(cid, combat, var) end function startSpell(cid) doSendMagicEffect(getCreaturePosition(cid), 2) doCreatureChangeOutfit(cid, {lookType = 28}) end function stopSpell(cid) setPlayerStorageValue(cid, 11000, 0) doRemoveCondition(cid, CONDITION_OUTFIT) doCreatureChangeOutfit(cid, {lookType = 29}) end function drainSpell(cid) if isPlayer(cid) then if getPlayerStorageValue(cid, 11000) == 1 and getPlayerMana(cid) > 0 then doPlayerAddMana(cid, -1) addEvent(drainSpell, 3000, cid) elseif getPlayerMana(cid) == 0 then doSendMagicEffect(getCreaturePosition(cid), 2) stopSpell(cid) doPlayerSendCancel(cid, "Spell has been interrupted. You're out of mana.") end end endSituação:
Eu pretendo desenvolver a Spell1, Spell2, Spell3 e assim por diante, e todas elas são no mesmo modelo, pois todas elas precisam ter o mesmo: startSpell, StopSpell e drainSpell.
Então por lógica, criei um Script separado para deixar tais funções, ele se chama standardSpell.
Neste exemplo eu removo a function "drainSpell" do arquivo "spell1.lua", e coloco ela somente no arquivo standardSpell.
spell1.lua
-- Arquivo spells/scripts/spell1.lua local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) function onCastSpell(cid, var) if getPlayerStorageValue(cid, 11000) == 1 then stopSpell(cid) end addEvent(startSpell, 3000, cid) setPlayerStorageValue(cid, 11000, 1) drainSpell(cid) return doCombat(cid, combat, var) end function startSpell(cid) doSendMagicEffect(getCreaturePosition(cid), 2) doCreatureChangeOutfit(cid, {lookType = 28}) end function stopSpell(cid) setPlayerStorageValue(cid, 11000, 0) doRemoveCondition(cid, CONDITION_OUTFIT) doCreatureChangeOutfit(cid, {lookType = 29}) endstandardSpell.lua
Ao remover o drainSpell do arquivo "spell1.lua" e adicioná-lo no "standardSpell.lua" eu passo a receber o seguinte erro: "attempt to call global 'drainSpell'(a nil value)".
Conclusão:
Gostaria de saber o porquê deste erro e como fazer para criar e utilizar funções "genéricas", que serão chamados/utilizadas por diversos scripts.
Obs: O código está um pouco menor e simplificado por Spell1, Spell2 para ser mais prático e objetivo.
Obs2: Coloquei em anexo o código com a spell normal funcionando, e o código com ela dividida em "spell1.lua" e "standardSpell.lua".
Obg e att,
Luís.
Editado Janeiro 17 por Luishg