Ir para conteúdo
  • Cadastre-se

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


Ir para solução Resolvido por marcot,

Posts Recomendados

Agora consegui consertar, estava bugando devido aos espaços na talkaction.

 

0e3171d49cd66713f2fedfc1746217a6.gif

Hotkeys usadas:

hiraishin ni no dan seal Test
hiraishin ni no dan

Testado em The Forgotten Server 0.4

 

Em data/talkactions/talkactions.xml insira a TAG:

<talkaction words = "hiraishin" event = "script" value = "hiraishin no jutsu.lua"/>

OBS.: Tenha atenção pois agora é só um script.

 

Em data/talkactions/scripts/ crie o script hiraishin no jutsu.lua e cole dentro dele:

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

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.",
	doesntExist = "Este jogador nao existe ou nao esta online.",
	noVocation = "Voce nao tem a vocation necessaria"
}

function onSay(cid, words, param)
	if getPlayerVocation(cid) ~= config.vocation then
		doPlayerSendCancel (cid, errorMsg.noVocation)
		return true
	end

	parametros = string.explode (param, " ")
	if #parametros == 3 then
		if parametros[1] == "ni" and parametros[2] == "no" and parametros[3] == "dan" then
			if getPlayerStorageValue (cid, config.storage) == 1 then
				setPlayerStorageValue(cid, config.storage, 2)
			else
				doPlayerSendTextMessage(cid,22, "Voce nao marcou nenhum jogador.")
			end
		end
		return true
	end

	if not parametros[1] == "ni" and not parametros[2] == "no" and not parametros[3] == "dan" and not parametros[4] == "seal" then
		return false
	end

	playerName = parametros[5]

	for i = 6, #parametros do
		playerName = playerName .. " " .. parametros[i]
	end

	caster = cid
	target = getPlayerByName (playerName)

	if target == nil then
		doPlayerSendCancel (cid, errorMsg.doesntExist)
		return false
	end

	if not getTilePzInfo(getThingPosition(cid)) and not getTilePzInfo(getThingPosition(target)) then
		if isPlayer (target) 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, getThingPosition(struct.target), true)
			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
10 horas atrás, hallanehallex disse:

ao invez de colocar o nome da pessoa como vc deu o exemplo hiraishin "Teste3  tem como colocar a vocation por exemplo hiraishin"230-246 para X vocation pode usar essa spell/talkaction ??

Acredito eu que isso dificulte um pouco as coisas, porque é uma margem enorme para bugs, como a possibilidade do jogador parar em lugares que bugue ou que não tenha como sair.

Mas aqui tem um script semelhante a esse que você pediu:

 

Editado por marcot (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Respostas 31
  • Created
  • Última resposta

Top Posters In This Topic

Top Posters In This Topic

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 no dan seal" lvl="12" mana="20" prem="1" range="5" casterTargetOrDirection="1" blockwalls="1" exhaustion="2000" needlearn="0" event="script" value="hiraishin.lua"> <vocation id="4"/> </instant> <instant name="Hiraishin no Jutsu" words="hiraishin ni no dan" lvl="18" mana="14

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.", nunca vai ser printada até onde eu sei. O mesmo vale para target em pz, a menos que a spell tivesse a tag agressive = "0", então vc podia excluir essa checagem e só colocar a tag na spells. Além disso, mesmo se ele executasse os prints, ele também ia executar o combat em ambos os casos pq vc nã

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 errorMsg = { pz = "Seu alvo nao pode estar fora do PZ.", playerOnly = "Voce so pode usar este jutsu em players.", alreadyMarked = "Voce ja marcou um jogador.", } local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFE

@marcot 

1 - quando você escreveu (hiraishin ni no dan test) invez de escrever assim eu posso escrever o nome de qualquer outra pessoa do otserver ??

2 - teria como fazer ela como spell ??

3 - se não der para fazer como spell como faz para deixar essa talkactions com letras em ORANGE ao falar o nome dela 

4 -  teria como deixar ela como exclusiva para X vocation ??

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

1) Dá pra colocar o nome de qualquer pessoa do server

2) O meu problema com spell é que não sei como posso pegar o nome do jogador target como parâmetro

3) Eu não estou sabendo porque o comando de marcar o jogador fala, enquanto o segundo o jogador nao fala

4) Ja esta exclusiva para vocation X, a definição está no config 

Link para o post
Compartilhar em outros sites
2 hours ago, marcot said:

1) Dá pra colocar o nome de qualquer pessoa do server

2) O meu problema com spell é que não sei como posso pegar o nome do jogador target como parâmetro

3) Eu não estou sabendo porque o comando de marcar o jogador fala, enquanto o segundo o jogador nao fala

4) Ja esta exclusiva para vocation X, a definição está no config 

2) para pegar o nome do jogador target vc pode fazer igual em talkaction, só precisa ativar param = "1" na tag no xml e aí pegar pelo nome, semelhante ao exura sio.
3) o que faz a fala não sair é o return false. Se tiver return true o texto sai, se tiver false ele não sai. Pra falar em laranja tu coloca return false e faz a mensagem sair por doCreatureSay.
Note que a função doCreatureSay tem um parametro que representa o tipo de texto, um dos tipos é o TALKTYPE_MONSTER (ou algo assim). Você pode ver todos os tipos dentro do arquivo data/lib/constant.lua e inclusive tem um tópico do Caronte sobre o constant.lua explicando várias coisas úteis lá.
4) Eu sugiro que vc troque a forma que vc fez para suportar mais de uma vocação permitida, é relativamente fácil vc só precisa mudar

vocation = 4 para vocation = {4}

e no check ao invés de fazer if getPlayerVocation(cid) == config.vocation then fazer if isInArray(config.vocation, getPlayerVocation(cid)) then.

Dessa forma ele vai procurar se o numero da sua vocação tá dentro daquele array/vetor/tabela que é o vocation. E aí você pode fazer vocation = {4,5,8,12,250} que ele vai aceitar todas essas vocações.

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)

Link para o post
Compartilhar em outros sites

@hallanehallex

Consegui fazer seguindo as dicas do Wolf.

Hiraishin no Jutsu 2.0:

Citar

Ao utilizar "hiraishin ni no dan seal" o player que o jogador targetou é marcado por X segundos. Ao usar "hiraishin ni no dan" o jogador é teleportado ao outro que está marcado após um pequeno delay.

 

Em data/spells/spells.xml cole:

	<instant name="Hiraishin No Jutsu" words="hiraishin ni no dan seal" lvl="12" mana="20" prem="1" range="5" casterTargetOrDirection="1" blockwalls="1" exhaustion="2000" needlearn="0" event="script" value="hiraishin.lua">
		<vocation id="4"/>
	</instant>
	
	
	<instant name="Hiraishin no Jutsu" words="hiraishin ni no dan" lvl="18" mana="140" prem="1" aggressive="0" params="1" exhaustion="2000" needlearn="0" event="script" value="hiraishinII.lua">
		<vocation id="4"/>
	</instant>

Em data/spells/scripts crie hiraishin.lua e cole:

local config = {
	storageID = 49609,
	mark_time = 6,
}

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

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1)


function onCastSpell(cid, var)
	--local target = getThingFromPosition(variantToPosition(var), 1)
	if isPlayer(getCreatureTarget(cid)) then
		if not getTilePzInfo(getThingPosition(getCreatureTarget(cid))) then
			if getPlayerStorageValue (cid, config.storageID) <= 0 then
				setPlayerStorageValue(cid, config.storageID, 1)
				doPlayerSendTextMessage(cid,22, "Voce marcou o player ".. getCreatureName(getCreatureTarget(cid)))
				local struct = {
					left = config.mark_time, 
					player = cid,
					target = target,
					var = var
				}
				addEvent(teleportIsTrue, 1000, struct)
			else
				doSendMagicEffect(getPlayerPosition(cid), 2)
				doPlayerSendCancel(cid, errorMsg.alreadyMarked)
			end
		else
			doSendMagicEffect(getPlayerPosition(cid), 2)
			doPlayerSendCancel(cid, errorMsg.pz)
		end
	else
		doSendMagicEffect(getPlayerPosition(cid), 2)
		doPlayerSendCancel(cid, errorMsg.playerOnly)		
	end
	return doCombat(cid, combat, var)
end

function teleportIsTrue (struct)
	if struct.left ~= 0 then
		if getPlayerStorageValue (struct.player, config.storageID) == 2 then
			doTeleportThing(struct.player, getThingPosition(getCreatureTarget(struct.player)), true)
			setPlayerStorageValue(struct.player, config.storageID, 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.storageID, 0)
	else
		return false
	end
end

E em hiraishinII.lua cole:

local config = {
	storageID = 49609,
	mark_time = 6,
}

function onCastSpell(cid, var)
	if getPlayerStorageValue (cid, config.storageID) == 1 then
		setPlayerStorageValue(cid, config.storageID, 2)
	else
		doPlayerSendTextMessage(cid,22, "Voce nao marcou nenhum jogador.")
	end

	return true
end

 

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.

  • Estatísticas dos Fóruns

    96847
    Tópicos
    519613
    Posts



×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo