Ir para conteúdo

(Resolvido)[PEDIDO] Spells Hiraishin Ni No Dan Seal e Hiraishin Ni No Dan

Featured Replies

Postado
  • Autor
18 minutos atrás, zLockey9 disse:

 

Tenho um Spell similar a esse que está pedindo.

Depois que você "selar" essa magia no adversário passará 6 segundos ( configuravél )

e seu char irá teleportar para o player que você "selou" a magia

  Mostrar conteúdo oculto

local config = {
storage = 49608,
tempo = 6
}


function onCastSpell(cid, var)
if isPlayer(getCreatureTarget(cid)) then
local name = getCreatureName(getCreatureTarget(cid))


if getPlayerStorageValue(cid, config.storage) <= 0 then
doPlayerSetStorageValue(cid, config.storage, 1)
doSendMagicEffect(getThingPos(cid), 65)
doSendMagicEffect(getThingPos(getCreatureByName(name)), 65)
addEvent(function()
  if isCreature(cid) then
  doPlayerSetStorageValue(cid, config.storage, 0)
  doTeleportThing(cid, getThingPos(getCreatureByName(name)))
  end
 end, 1000*config.tempo)
elseif getPlayerStorageValue (cid, config.storage) > 0 then
doSendMagicEffect(getThingPos(cid), 2)
doPlayerSendCancel(cid, "Você marcou seu target.")
end
elseif(getTilePzInfo(aqui)) then
return doPlayerSendCancel(cid, "Não pode usar o teleport em casas ou areas protegidas.")
else
doPlayerSendCancel (cid, "Você só pode usar esse jutsu em players!.")
end
return true
end

 

  Mostrar conteúdo oculto

<instant name="Hiraishin Ni No Dan" words="Hiraishin Ni No Dan" lvl="1000" mana="9500" aggressive="1" needtarget="1" range="5" exhaustion="0" needlearn="0" blockwalls="1" event="script" value="minato/hiraishinnojutsu.lua">
<vocation id="16-"/>
</instant>

Aqui funcionou Perfeitamente , espero que aí também funcione. ;D

@zLockey9 ja vi essa spell em um topico em que o WhiteWolf respondeu mais eu queria igual a do Nto WoNo que no caso é igual o que eu disse la no começo do topico 1 spell e selamento e outra de teleport

  • Respostas 31
  • Visualizações 2.1k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • @hallanehallex Consegui fazer seguindo as dicas do Wolf. Hiraishin no Jutsu 2.0:   Em data/spells/spells.xml cole: <instant name="Hiraishin No Jutsu" words="hiraishin ni

  • Ficou muito bom, meus parabéns amigo :D Só tem 1 coisinha: as funções de param de spells só funcionam em players então essa mensagem de playerOnly = "Voce so pode usar este jutsu em players.",

  • Script sem o bug de tirar o target e sem damage: local config = { storageID = 49609, mark_time = 10 * 60, effectWhenTeleport = 339, -- Efeito ao teleportar effectWhenUsed = 152, } local error

Postado

Bom, eu tentei fazer o bruto, se faltar alguma coisa me dá o toque. Eu preferi fazer por talkaction pra deixar mais fácil o codigo, porque daria muito trampo negócio de guardar o nome do jogador que o player marcou fora do script.

 

Vá em data/talkactions/talkactions.xml e adicione as tags:

<talkaction words="hiraishin ni no dan seal" script="hiraishin no jutsu.lua" />
<talkaction words="hiraishin ni no dan" script="teleport hiraishin.lua" />

Agora em data/talkactions/scripts/ crie os arquivos hiraishin no jutsu.lua e teleport hiraishin.lua.

 

hiraishin no jutsu.lua

local config = {
	storage = 49608,
	time = 6
}

local errorMsg = {
	pz = "Voce so pode usar este jutsu fora do PZ.",
	playerOnly = "Voce so pode usar este jutsu em players.",
	alreadyMarked = "Voce ja marcou um jogador."
}

function onSay(cid, words, param)
	caster = cid
	target = getPlayerByName (param)
	
	if getTilePzInfo(getPlayerPosition(caster)) == FALSE and getTilePzInfo(getPlayerPosition(target)) == FALSE then
		if isPlayer (target) == TRUE then
			if getPlayerStorageValue (cid, config.storage) <= 0 then
				setPlayerStorageValue(cid, config.storage, 1)
				doPlayerSendTextMessage(cid,22, "Voce marcou o player ".. getPlayerName(target))
				local struct = {
					left = config.time, 
					player = cid,
					target = target
				}
				addEvent(teleportIsTrue, 1000, struct)
			elseif getPlayerStorageValue (cid, config.storage) > 0 then
				doSendMagicEffect(getPlayerPosition(cid), 2) 
				doPlayerSendCancel (cid, errorMsg.alreadyMarked)
			end
		else
			doPlayerSendCancel (cid, errorMsg.playerOnly)
		end
	else
		doPlayerSendCancel (cid, errorMsg.pz)
	end
end

function teleportIsTrue (struct)
	if struct.left ~= 0 then
		if getPlayerStorageValue (struct.player, config.storage) == 2 then
			doTeleportThing(struct.player, getThingPos(struct.target))
			setPlayerStorageValue(struct.player, config.storage, 0)
			doPlayerSendTextMessage(struct.player,22, "Voce perdeu sua marcacao.")
			return TRUE
		end
		doPlayerSendTextMessage(struct.player,22, struct.left .. " segundos restantes.")
		struct.left = struct.left - 1
		addEvent (teleportIsTrue, 1000, struct)
	elseif struct.left == 0 then
		doPlayerSendTextMessage(struct.player,22, "Voce perdeu sua marcacao.")
		setPlayerStorageValue(struct.player, config.storage, 0)
	else
		return FALSE
	end
end

 

hiraishin teleport.lua

local config = { 
	storage = 49608
}

function onSay (cid, words, param)
	if getPlayerStorageValue (cid, config.storage) == 1 then
		setPlayerStorageValue(cid, config.storage, 2)
	else
		doPlayerSendTextMessage(cid,22, "Voce nao marcou nenhum jogador.")
	end
end

Testei em Aries Server to Tibia 8.1 - Version 4.0 based on OTServ SVN Version 0.6.0 e funcionou normalmente, caso dê algum erro me envie o que houve no console.

Espero ter ajudado!

Postado

Antes de tudo @topic, me desculpa eu ando muito sem tempo ultimamente e fds eu costumo ficar sem pc então foi duplamente mais dificil arrumar um tempo pra abrir o sv e fazer os scripts.
Eu tentei entrar hoje para escrever pelo menos umas dicas de como alguém poderia fazer para te ajudar mas me deparei com a resposta do marcot q num olhar rápido aparenta estar funcional.

@marcot
você podia tanto ter salvo o nome do player no storage quanto salvar o uid dele (q é um numero). A unica preocupação é q dependendo do tamanho máximo q o storage está definido na sua source (e no seu banco de dados) o valor poderia ultrapassar mas isso é relativamente fácil de contornar (dividir o numero em 3 storages, por ex)

Eu gostei da forma q vc criou uma structure, isso mostra que você tem conhecimento em outras linguagens.
Vou testar seu código depois.

Geralmente os programadores q eu conheço não aceitam tão bem dicas, então espero q você não seja como eles e leve para o pessoal:

1- Use variaveis locais

        caster = cid
	target = getPlayerByName (param)

Principalmente com coisas que podem ser executadas ao mesmo tempo. Elas são mais rápidas!

2- TRUE e FALSE são variaveis, use true e false (minusculo)

3- Evite redundancias.

getTilePzInfo(getPlayerPosition(caster)) == FALSE

é muito mais fácil fazer if not getTilePzInfo(getPlayerPosition(caster))

Ou no caso de If X == 1 then use if X then (o mesmo pra X == true)


De resto, curti seu estilo, obrigado por atender ao pedido do tópico. ^^(y)

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Postado
20 minutos atrás, xWhiteWolf disse:

Antes de tudo @topic, me desculpa eu ando muito sem tempo ultimamente e fds eu costumo ficar sem pc então foi duplamente mais dificil arrumar um tempo pra abrir o sv e fazer os scripts.
Eu tentei entrar hoje para escrever pelo menos umas dicas de como alguém poderia fazer para te ajudar mas me deparei com a resposta do marcot q num olhar rápido aparenta estar funcional.

@marcot
você podia tanto ter salvo o nome do player no storage quanto salvar o uid dele (q é um numero). A unica preocupação é q dependendo do tamanho máximo q o storage está definido na sua source (e no seu banco de dados) o valor poderia ultrapassar mas isso é relativamente fácil de contornar (dividir o numero em 3 storages, por ex)

Eu gostei da forma q vc criou uma structure, isso mostra que você tem conhecimento em outras linguagens.
Vou testar seu código depois.

Geralmente os programadores q eu conheço não aceitam tão bem dicas, então espero q você não seja como eles e leve para o pessoal:

1- Use variaveis locais


        caster = cid
	target = getPlayerByName (param)

Principalmente com coisas que podem ser executadas ao mesmo tempo. Elas são mais rápidas!

2- TRUE e FALSE são variaveis, use true e false (minusculo)

3- Evite redundancias.


getTilePzInfo(getPlayerPosition(caster)) == FALSE

é muito mais fácil fazer if not getTilePzInfo(getPlayerPosition(caster))

Ou no caso de If X == 1 then use if X then (o mesmo pra X == true)


De resto, curti seu estilo, obrigado por atender ao pedido do tópico. ^^(y)

@xWhiteWolf,

Então, eu estou começando a mexer com LUA ainda, comecei pra valer na semana passada... Antigamente eu mexia com otserver (quando tinha uns 12 anos) mas eu sempre reutilizava scripts para tentar fazer outros e nunca sabia nada sobre a sintaxe de programação (como condicionais ou iteradores) o que me limitava muito. Agora já sei ou pouco mais, ai ajuda.

Obrigado pelas dicas.

 

Sobre a segunda eu tenho um pouco de medo porque ao menos na versão 8.1 o TRUE e FALSE são definidos no global.lua como 0 e 1, e não sabia se em lua é feito igual em C++ (0 = false e o restante = true). Sobre a redundancia na terceira acho que entra um pouco na segunda, no servidor 8.1 que tenho enfrentei problemas quando nao colocava a redundância em alguns scripts, mas eu vi que no outro source que tenho já não dava erro (TFS). Tipo, eu meio que sei sobre isso, mas tenho medo pelo desconhecimento ainda das sources e de LUA em si...

 

O storage eu nao consigo trocar ainda porque sou meio que fechado com 8.1 e se não me engano ele não aceita storage com strings (e ele não usa banco de dados, mas arquivos de texto para armazenar os personagens). (P.S.: Mt obrigado pela dica do uid do jogador, acho que ja da pra usar em uns scripts que eu estava pensando)

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

Postado

@marcot seu começo foi bem parecido com o meu, continue treinando e sucesso. Se tiver qualquer duvida pode chegar no privado :D

Lua entende nil e false como false. Qualquer outra coisa é considerado verdadeiro. Se souber um pouco de inglês aqui tá a definição de acordo com o wiki da linguagem:

 

Spoiler

An important point to note is that the value 0 is not a false test condition in Lua. In some languages, for example C, a test of:

if (0)
  printf("true");
else
  printf("false");
would display "false". In Lua,
> if 0 then
>>  print("true")
>> else
>>  print("false")
>> end
true
prints "true"! You should use false, or nil in place of 0:
> if false then print("true") else print("false") end
false
> if nil then print("true") else print("false") end
false
Why?
The reason for this is historical. Lua did not support boolean types (i.e. true and false) before version 5.0. Previous to version 5.0 a value of nil represented false. Now, both nil and false will act as a false condition in a test expression. E.g.,

> if nil then print("true") else print("false") end
false
> if 1 then print("true") else print("false") end
true
> if 0 then print("true") else print("false") end
true
> if 1==2 then print("true") else print("false") end
false
Another point to note is that true and false are not numerical values, e.g., 1 and 0 as they are in some languages.

> = true, false
true    false
> = 1 + true
stdin:1: attempt to perform arithmetic on a boolean value
stack traceback:
        stdin:1: in main chunk
        [C]: ?
Also, nil is coerced into a boolean value when used with a logical operator:

> = not nil
true
> = not 1
false
> = not 0
false

 



 

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

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

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo