Ir para conteúdo
  • 0

Erro em script (sem erro no distro)


Darkraus

Pergunta

Bom dia/tarde/noite.

pra ser direto ao ponto... Eu tive uma ideia de um sistema muito interessante para meu servidor.

após algum tempo estudando formas de faze-lo eu descobri uma forma (bem feia) de fazer.

Após algum tempo trabalhando no script cheguei a um resultado... porém não funcional vejamos:

 

Primeiro a ideia: esse script ,era pra ser bem simples, seria uma skill target que quando atingisse o inimigo deixaria nele um storage value por determinado tempo.

sairia um texto animado por puro capricho. passado o tempo esse storage value seria removido e sairia outro texto animado.

Esse sistema que pretendo fazer funcionaria somente se o player tivesse equipado com um item, mas tornou-se muito mais problematico do que eu imaginava.

 

vou postar os 2 pois acredito que o erro seja o mesmo então... não muda muito haha.

 

Verifica se X item está equipado:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2)


local inimigo = {}
local escudo = 2520
local slot1 = getPlayerSlotItem(getCreatureTarget(cid), 5)
local slot2 = getPlayerSlotItem(getCreatureTarget(cid), 6)
local storage = 199901

function onCastSpell(cid, var)
         table.insert(inimigo, getCreatureTarget(cid))
                 if isPlayer then
                   if slot1 or slot2 == 2520 then
           	       setPlayerStorageValue(#inimigo, storage, 1)
                   doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180)
                         else
                         return doCombat(cid, combar, var)
                   end
                       addEvent(function()
                           if isCreature(cid) then
                           setPlayerStorageValue(#inimigo, storage, 0)
                           doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180)
                           end
                   end,4000)
                return doCombat(cid, combat, var)
                 end
                end

 

Não verifica se item está equipado:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2)


local inimigo = {}
local storage = 199901

function onCastSpell(cid, var)
         table.insert(inimigo, getCreatureTarget(cid))
                 if isPlayer then
           	       setPlayerStorageValue(#inimigo, storage, 1)
                   doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180)
                         else
                         return doCombat(cid, combat, var)
                         end
            addEvent(function()
                 if isCreature(cid) then
                    setPlayerStorageValue(#inimigo, storage, 0)
                    doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180)
                 end
            end,4000)
return doCombat(cid, combat, var)
                 end

O que me intriga muito nos 2 scripts é o fato de não ter nenhum erro no debugger (OtScriptLive) e nem no distro do servidor.

o unico erro aparente é quano o player usa que aparece o erro avisando que o player está sem mana...

porém baixei o custo de mana da magia pra 0 e testei em 2 personagens com mais de 5k de mana...

eu sou um scripter iniciante (MUITO iniciante... NOVATO... NEWBA) portanto deve ser um erro ridiculo...

alguem tem alguma solução? haha

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

de cara o erro q se enxerga é vc utilizando a função isPlayer(uid) sem o parâmetro.. vc quer verificar se o inimigo é um player?

outra coisa.. setPlayerStorageValue(#inimigo, storage, 1) isso daqui não existe pois #inimigo retorna o numero de elementos numa tabela.

Link para o comentário
Compartilhar em outros sites

  • 0

não entendi bem o paramentro do isPlayer...

já a parte do #inimigo, eu procurei alguma forma de armazenar um dado no script pra usar no addevents,

pq se eu usasse getCreatureTarget(cid) no addevents se o player mudasse o target poderia gerar algum bug...

na verdade pode ter sido uma interpretação completamente errônea de um script q eu vi na seção de pedidos que inclusive é seu.

mas nele vc usava table.insert para que o script memorizasse uma posição...

se essa forma não funciona, qual outra forma eu poderia usar para que o player que recebeu a spell fosse memorizado no script podendo ser usado novamente?

Link para o comentário
Compartilhar em outros sites

  • 0

olha, vc não pode usar cid até ele ser declarado e ele só é declarado depois de function onCastSpell.. então nada disso daqui vai funcionar:

local slot1 = getPlayerSlotItem(getCreatureTarget(cid), 5)
local slot2 = getPlayerSlotItem(getCreatureTarget(cid), 6)

isCreature/isPlayer/isMonster verificam se determinado uid é criatura/player/monstro.. o parâmetro é o uid.

Pra quem executa os callbacks, nós chamamos o uid de cid, mas pode ser muito bem isPlayer(getCreatureTarget(cid).uid)
-- verifica se assim funciona.. vc só tem que colocar target = "1" na tag do spells.xml

variantToNumber(var) representa o target.
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2)

local escudo = 2520
local storage = 199901

function onCastSpell(cid, var)
	if isPlayer(variantToNumber(var)) then
		local slot1 = getPlayerSlotItem(variantToNumber(var), 5)
		local slot2 = getPlayerSlotItem(variantToNumber(var), 6)
		if slot1 or slot2 == escudo then
			setPlayerStorageValue(variantToNumber(var), storage, 1)
			doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180)
		end
		addEvent(function()
			if isCreature(cid) then
				setPlayerStorageValue(variantToNumber(var), storage, 0)
				doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180)
			end
		end,4000)		
	end
return doCombat(cid, combat, var)
end

 

Link para o comentário
Compartilhar em outros sites

  • 0

Poderia me explicar brevemente o que variantToNumber(var) faz exatamente?

 

porque eu fiz aquela tentativa porque se o player TROCAR o target no tempo do addevents ele poderia usar o target novo para remover o storage

fazendo com que o player anterior que recebeu o storage ficasse com ele pra sempre... configurando um bug.

mas eu não conheço nem de nome essa variantToNumber(var).

ficaria grato se pudesse me explicar.

 

olha, vc não pode usar cid até ele ser declarado e ele só é declarado depois de function onCastSpell.. então nada disso daqui vai funcionar:

local slot1 = getPlayerSlotItem(getCreatureTarget(cid), 5)
local slot2 = getPlayerSlotItem(getCreatureTarget(cid), 6)

de qualquer forma, essas poucas palavras já valeram o topico. algo que eu não sabia e provavelmente nunca ia desconfiar.

Link para o comentário
Compartilhar em outros sites

  • 0

eu tinha explicado ali:
variantToNumber(var) representa o target.
----- o var da spell pode me retornar o uid do target através dessa função variantToNumber(var)

Tem algumas discussões sobre isso aqui no xt, só procurar o tópico do @@Skulls

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

  • 0

hm, achei q ela se adequaria a essa função somente nesse scrit e semelhantes.

mas se é a função dela, é um otimo elemento no arsenal haha.

já dei rep em todos as respostas aqui, muito obrigado pela atenção e suporte :)

 

-edit

uma duvida rapida: qual distro você prefere programar? notei que a maioria dos scripters usam a 0.3.6 do tfs porém, ela parece bem limitada em relação ao 1.2... fico em duvida em relação a isso.

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

  • 0

Wolf, sem querer abusar da sua pessoa, se ainda estiver acompanhando este topico, poderia me esclarecer uma duvida?

seguinte :

 

quando uso a função onStatsChange


(cid, attacker, type, combat, value)

a função possui o parametro "attacker", este parametro pode ser usado posteriormente em algums funções no lugar do cid?

ou possui outra forma de vc declarar quem ataca o player?

Link para o comentário
Compartilhar em outros sites

  • 0

vc pode usar no lugar do cid pra fazer a função para quem te ataca, só lembra de dar if isCreature(attacker) pra checar se o attacker não é um uid de fire field por exemplo, porque esse callback é executado toda vez que o player tem vida/mana mudados. Aí é recomendável vc tb verificar o type pra garantir que seu código só vai executar em casos específicos (qnd perder vida ou mana, por ex)

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

  • 0

hm, se eu entendi bem... isso funcionaria :

            if isCreature(attacker) then
            doSendMagicEffect(getCreaturePosition(attacker), 9)
            doAddCondition(attacker, venom)
            end

certo?

 

verificar se o "atacante" é criatura, verificar a posição do atacante e até mesmo adicionar uma condição ao atacante.

desde claro que a função onStatsChange seja declarada antes, correto?

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...