Ir para conteúdo
  • Cadastre-se

(Resolvido)Spell com posição heelp


Ir para solução Resolvido por marcot,

Posts Recomendados

estou começando com scripts , porem queria aprender sobre posições 

eu fiz essa script como um exercício que eu sabia que não ia dar certo(mentira tinha uma esperança asuhasuhsa)

oque eu tentei fazer = se eu tiver um target e ele estiver na posição determinada retornar no combat1 se não tiver target retornar no combat

 

 

se alguém puder me mostrar o caminho certo agradeço abrçs

 

 

function onCastSpell(pos, target, targetpos, posdireita, cid)

local pos = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local targetpos = getCreaturePosition(target)
local posdireita = {x=pos.x+1, y=pos.y+1, z=7}

if target == false then
   doCombat(cid, combat1, var

else

if targetpos == posdireita then

 doCombat(cid, combat, var)
end
return true
end
 

Link para o post
Compartilhar em outros sites

Primeiro , sempre que for colocar um código no fórum , utilize a ferramenta Code.

 

Segundo , não há necessidade dessas variáveis todas na function , somente as principais ( No caso cid e var)

function onCastSpell(pos, target, targetpos, posdireita, cid) 

Terceiro , você não declarou o valor das variáveis Combat e Combat1

Quarto , você errou nessa parte

else

if targetpos == posdireita then
  
      bloco 
  
end

O correto é

 

elseif targetpos == posdireita then

bloco

end

 

o código ficaria assim do jeito correto ; 

 

function onCastSpell(cid, var)

local pos = getCreaturePosition(cid)

local target = variantToNumber(var)

local targetpos = getCreaturePosition(target)

local posdireita = {x= pos.x + 1, y= pos.y + 1, z = pos.z}

         if not target then 
         
         return doCombat(cid, combat1, var)
         
         elseif targetpos == posdireita then

         return doCombat(cid, combat, var)
         
         end
end

 

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

Acho que os principais pontos que você teria que trabalhar nesse script são a posição, já que a posição modificada é esta diagonal do personagem:

6c32a495465e99706a093915648aca1c.png

Para ser a posição à direita do personagem você incrementa somente a coordenada X.

Outro pronto é trabalhar no retorno dos callbacks LUA, quando você utiliza getPlayerTarget, caso o jogador tenha um target ele receberá um objeto, que no caso é o que ele está targetando, seja uma criatura, um player, etc. e você fez a seguinte comparação:

if target == false then

Caso o jogador não tenha um target, a função retorna 0. Caso você tenha dúvidas sobre o que a função te retorna, dê um print para aparecer no console o que você possui na variável, isso também é bem útil no debug, pra saber se uma determinada parte do script está sendo utilizada ou não.

Exemplo :

107335bed96f2e79badf577b70304680.png

No teste acima o jogador não tinha um target

 

Sempre que você abrir uma função/if/etc. deixe tudo que está dentro alinhado para a direita e certifique-se que o end está alinhado com com seu respectivo if ou function, isso facilita MUITO a leitura de um código. Exemplo tirado de uma source:

35ba5d40349ae4c9fafd63cd7c91e92c.png

No código acima você consegue identificar claramente onde começa e termina um bloco, além de saber o que faz parte de cada um

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

Vlw aos 2 , agora irei estudar isso ..  rep :D

5 minutos atrás, marcot disse:

criatura

 

15 minutos atrás, marcot disse:

 


if target == false then

Caso o jogador não tenha um target, a função retorna 0. Caso você tenha dúvidas sobre o que a função te retorna, dê um print para aparecer no console o que você possui na variável, isso também é bem útil no debug, pra saber se uma determinada parte do script está sendo utilizada ou não.

 

 print?

Link para o post
Compartilhar em outros sites
23 minutos atrás, Jeanzim disse:

Vlw aos 2 , agora irei estudar isso ..  rep :D

 

 print?

print é uma função fora dos callbacks do OTserver, uma função do LUA para imprimir no console (que no caso é o seu executável do servidor).

Por exemplo:

print ("Olá mundo!")

Colocar isso em algo script seu fará com que, ao executá-lo aparaça uma mensagem "Olá mundo!" no console do seu OTServer, geralmente queremos imprimir acompanhado de alguma variável pra checar o valor e conferir se tudo está indo conforme o esperado. Vamos supor que você queira imprimir a posição do target por você achar que ele não está reconhecendo o target, então tentaríamos algo do tipo:

pos = getCreatureTarget (cid)
print ("POS DO TARGET: X = " .. pos.x .. ", Y = " .. pos.y .. ", Z = " .. pos.z)

Isso faria com que aparecesse algo do tipo no seu console:

POS DO TARGET: X = 100, Y = 120, Z = 10

Caso estivesse errado pode ser que aparecesse algo do tipo:

POS DO TARGET: X = nil, Y = nil, Z = nil

nil em LUA é a representação de NULL, ou seja, pos.x/y/z não possuem nenhum conteúdo, por isso em muitos erros ele inclui o "nil value" como mensagem de erro, é quando tentamos fazer uso de uma variável com valor nulo.

 

Outra coisa importante é a presença de "..",  print é uma função que recebe uma STRING (um conjunto de caracteres) e a imprime, então o ".." em LUA é o operador responsável por concatenar uma string a um valor.

 

Outra coisa importante para quando estiver começando é sempre abrir tópicos como este quando for fazer scripts:

Assim você saberá tudo que pode ser feito e conhecer os limites do que pode ser feito sem mexer na source.

Editado por marcot (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
20 minutos atrás, Jeanzim disse:

Vlw aos 2 , agora irei estudar isso ..  rep :D

 

 print?


Ele se refere a função print ; geralmente é usada para retornar um valor no executável ;

 

function onCastSpell(cid, var)

print(var) -- a function printa o valor da variaval var e a retorna na distro

end 

 

Link para o post
Compartilhar em outros sites

tentei tentei e nao consegui

 

local combat = createCombatObject()

setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)

setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA)

setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE)

setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 1, 2)


local area = createCombatArea(AREA_WAVE4, AREADIAGONAL_WAVE4)

setCombatArea(combat, area)


local combat1 = createCombatObject()

setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)

setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA)

setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE)

setAttackFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 1, 2)


function onCastSpell(cid, var)


local pos = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local targetpos = getCreaturePosition(target)
local posdireita = {x= pos.x, y= pos.y + 1, z = pos.z}
print (posdireita = {x=, " ..pos.x.. " y=, " ..pos.y1.. ", ..z =," ..pos.z.. "})

         if target == false then 
         
         return doCombat(cid, combat1, var)
         
         elseif targetpos == posdireita then

         return doCombat(cid, combat, var)
         
         end
print (")
return true
end

 

 

 

tem como arrumar a spell pra mim ?

 @Sttorm @marcot 

Link para o post
Compartilhar em outros sites
1 hora atrás, Jeanzim disse:

tentei tentei e nao consegui

 

local combat = createCombatObject()

setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)

setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA)

setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE)

setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 1, 2)


local area = createCombatArea(AREA_WAVE4, AREADIAGONAL_WAVE4)

setCombatArea(combat, area)


local combat1 = createCombatObject()

setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)

setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA)

setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE)

setAttackFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 1, 2)


function onCastSpell(cid, var)


local pos = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local targetpos = getCreaturePosition(target)
local posdireita = {x= pos.x, y= pos.y + 1, z = pos.z}
print (posdireita = {x=, " ..pos.x.. " y=, " ..pos.y1.. ", ..z =," ..pos.z.. "})

         if target == false then 
         
         return doCombat(cid, combat1, var)
         
         elseif targetpos == posdireita then

         return doCombat(cid, combat, var)
         
         end
print (")
return true
end

 

 

 

tem como arrumar a spell pra mim ?

 @Sttorm @marcot 


Qual erro retorna ?

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