Ir para conteúdo
  • 0

[Talkactions] Fly System [Help]


Flaah

Pergunta

Ola amigos do Xtibia, eu tenho esse Fly System que eu fiz, mais eu queria que ele não funcionasse caso estivesse um piso ou teto acima do player, caso tenha, apareceria uma mensagem falando que não pode uzar o Fly.

 

Script:

local aar = {

							[2] = {lookType = 367}, -- Teste
							[24] = {lookType = 367}, -- Shino
							[39] = {lookType = 367}, -- Shino
							[54] = {lookType = 367}, -- Shino
							[109] = {lookType = 330} -- Deidara



}

local aterra = {

							[2] = {lookType = 160}, -- Teste
							[24] = {lookType = 367}, -- Shino
							[39] = {lookType = 367}, -- Shino
							[54] = {lookType = 367}, -- Shino
							[109] = {lookType = 160} -- Deidara

}  

	function onSay(cid, words, param, channel)  

	local oar = getCreaturePosition(cid)
	local oterra = getCreaturePosition(cid)

	if getTilePzInfo(getCreaturePosition(cid)) then
	return doPlayerSendCancel(cid, "O item nao tem poder em Protection Zones.")

	elseif getPlayerStorageValue(cid, 1635215) <= 0 then
	local voc_id = getPlayerVocation(cid)
	doSetCreatureOutfit(cid, aar[voc_id], -1)


					 noar = {x=oar.x, y=oar.y, z=oar.z}
			   noar.y = noar.y - 0
			   noar.z = noar.z - 2
			   doTeleportThing(cid,noar)

	doPlayerSendCancel(cid, "Você está voando, tome cuidado.")
	doSendMagicEffect(noar, CONST_ME_WATERSPLASH)
	setPlayerStorageValue(cid, 1635215, 1)

	else

	if getPlayerVocation(cid) > 0 then
	local voc_id = getPlayerVocation(cid)
	doSetCreatureOutfit(cid, aterra[voc_id], -1)

					 naterra = {x=oterra.x, y=oterra.y, z=oterra.z}
			   naterra.y = naterra.y - 0
			   naterra.z = naterra.z + 2
			   doTeleportThing(cid,naterra)

	doPlayerSendCancel(cid, "Você saiu do ar.")
	doSendMagicEffect(naterra, CONST_ME_POFF)
	setPlayerStorageValue(cid, 1635215, -1)

	end
	end
	return true
	end

 

 

VALENDO +REP

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

15 respostass a esta questão

Posts Recomendados

  • 0

~Edited

Tente usar este script:

local aar = {

														    [2] = {lookType = 367}, -- Teste
														    [24] = {lookType = 367}, -- Shino
														    [39] = {lookType = 367}, -- Shino
														    [54] = {lookType = 367}, -- Shino
														    [109] = {lookType = 330} -- Deidara



}

local aterra = {

														    [2] = {lookType = 160}, -- Teste
														    [24] = {lookType = 367}, -- Shino
														    [39] = {lookType = 367}, -- Shino
														    [54] = {lookType = 367}, -- Shino
														    [109] = {lookType = 160} -- Deidara

}  

		    function onSay(cid, words, param, channel)  

		    local oar = getCreaturePosition(cid)
		    local oterra = getCreaturePosition(cid)

		    local pos = getThingPos(cid)
		    pos.z = pos.z-1
		    pos.stackpos = 0

		    if getTileThingByPos(pos).itemid >= 1 or getTileItemById(getThingPos(cid), 1386).itemid >= 1 then
		    doPlayerSendCancel(cid, "You can\'t fly through constructions.")
		    return false
		    end

		    if getTilePzInfo(getCreaturePosition(cid)) then
		    return doPlayerSendCancel(cid, "O item nao tem poder em Protection Zones.")

		    elseif getPlayerStorageValue(cid, 1635215) <= 0 then
		    local voc_id = getPlayerVocation(cid)
		    doSetCreatureOutfit(cid, aar[voc_id], -1)


											 noar = {x=oar.x, y=oar.y, z=oar.z}
							   noar.y = noar.y - 0
							   noar.z = noar.z - 2
							   doTeleportThing(cid,noar)

		    doPlayerSendCancel(cid, "Você está voando, tome cuidado.")
		    doSendMagicEffect(noar, CONST_ME_WATERSPLASH)
		    setPlayerStorageValue(cid, 1635215, 1)

		    else

		    if getPlayerVocation(cid) > 0 then
		    local voc_id = getPlayerVocation(cid)
		    doSetCreatureOutfit(cid, aterra[voc_id], -1)

											 naterra = {x=oterra.x, y=oterra.y, z=oterra.z}
							   naterra.y = naterra.y - 0
							   naterra.z = naterra.z + 2
							   doTeleportThing(cid,naterra)

		    doPlayerSendCancel(cid, "Você saiu do ar.")
		    doSendMagicEffect(naterra, CONST_ME_POFF)
		    setPlayerStorageValue(cid, 1635215, -1)

		    end
		    end
		    return true
		    end

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

  • 0

Deu esse erro no console:

 

[11/12/2012 00:14:09] [Error - TalkAction Interface]

[11/12/2012 00:14:09] data/talkactions/scripts/players\fly.lua:onSay

[11/12/2012 00:14:09] Description:

[11/12/2012 00:14:09] attempt to index a nil value

[11/12/2012 00:14:09] stack traceback:

[11/12/2012 00:14:09] [C]: in function 'getTileThingByPos'

[11/12/2012 00:14:09] data/talkactions/scripts/players\fly.lua:28: in function <data/talkactions/scripts/players\fly.lua:23>

Link para o comentário
Compartilhar em outros sites

  • 0

Po esta show, mais teria como coloca, uma técnica que não precise colocar o piso invisivel em todo o mapa?!

 

Tipo, quando o cara de o fly, automaticamente ira criar o title invisivel, sem precisar que eu coloque em toodo o mapa..

 

Teria como?!

 

============================================================

 

E outra, teria como esconder o comando: !fly , quando o fly não der certo por causa do You can\'t fly through constructions.

 

É que eu queria que so aparecesse a mensagem: You can\'t fly through constructions.

 

Não a palavra !fly no chat junto com a mensagem... teria como isso tbm? :D

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

  • 0

Para não aparecer o !fly durante as mensagens das construções, mude a parte:

doPlayerSendCancel(cid, "You can\'t fly through constructions.")
return false
end

por:

doPlayerSendCancel(cid, "You can\'t fly through constructions.")
return true
end

 

Agora sobre esse "piso/title invisivel", não entendi o que quis dizer. Qual o ID dele e qual a função dele ?

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

  • 0

Tipo, o do piso invisivel, seria q nem aqueles de fly de pokemon... que n precisa coloca o piso invisivel pra poder uzar o fly.

 

ID do piso é: 460

 

A função não tem no script, por esse motivo tenho q coloca no mapa o piso 460 pra da fly, se tivese, n precisaria coloca o piso 460 no mapa, pois a função no script iria cria sozinho.

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

  • 0

~Edited

Subistitua seu script por esse:

local lower = {'460'}
local aar = {
																														[2] = {lookType = 367}, -- Teste
																														[24] = {lookType = 367}, -- Shino
																														[39] = {lookType = 367}, -- Shino
																														[54] = {lookType = 367}, -- Shino
																														[109] = {lookType = 330} -- Deidara


}
local aterra = {
																														[2] = {lookType = 160}, -- Teste
																														[24] = {lookType = 367}, -- Shino
																														[39] = {lookType = 367}, -- Shino
																														[54] = {lookType = 367}, -- Shino
																														[109] = {lookType = 160} -- Deidara
}

						function onSay(cid, words, param, channel)

						local oar = getCreaturePosition(cid)
						local oterra = getCreaturePosition(cid)
						local pos = getThingPos(cid)
						pos.z = pos.z-1
						pos.stackpos = 0
						if isInArray({460}, getTileInfo(getThingPos(cid)).itemid) then
						doPlayerSendCancel(cid, "You can\'t stop flying at this height!")
						return true
						end
						if getTileThingByPos(pos).itemid >= 1 or getTileItemById(getThingPos(cid), 1386).itemid >= 1 then
						doPlayerSendCancel(cid, "You can\'t fly through constructions.")
						return false
						end
						if getTilePzInfo(getCreaturePosition(cid)) then
						return doPlayerSendCancel(cid, "O item nao tem poder em Protection Zones.")
						elseif getPlayerStorageValue(cid, 1635215) <= 0 then
						local voc_id = getPlayerVocation(cid)
						doSetCreatureOutfit(cid, aar[voc_id], -1)

																							 noar = {x=oar.x, y=oar.y, z=oar.z}
															   noar.y = noar.y - 0
															   noar.z = noar.z - 2
															   doTeleportThing(cid,noar)
						doPlayerSendCancel(cid, "Você está voando, tome cuidado.")
						doSendMagicEffect(noar, CONST_ME_WATERSPLASH)
						setPlayerStorageValue(cid, 1635215, 1)
						else
						if getPlayerVocation(cid) > 0 then
						local voc_id = getPlayerVocation(cid)
						doSetCreatureOutfit(cid, aterra[voc_id], -1)
																							 naterra = {x=oterra.x, y=oterra.y, z=oterra.z}
															   naterra.y = naterra.y - 0
															   naterra.z = naterra.z + 2
															   doTeleportThing(cid,naterra)
						doPlayerSendCancel(cid, "Você saiu do ar.")
						doSendMagicEffect(naterra, CONST_ME_POFF)
						setPlayerStorageValue(cid, 1635215, -1)
						end
						end
						return true
						end

Agora vá a pasta data/movements/scripts e crie um arquivo chamado fly.lua

Adicione o script:

local del = {'460'}
function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
position.stackpos = 0
if getPlayerStorageValue(cid, 17000) <= 0 then
doTeleportThing(cid, fromPosition, false)
doRemoveItem(getTileThingByPos(position).uid, 1)
doPlayerSendCancel(cid, "You can't fly.")
return true
end
doAreaCombatHealth(cid, FLYSYSTEMDAMAGE, getThingPos(cid), splash, 0, 0, 255)
local pos = getThingPos(cid)
if pos.z == 7 then return true end
pos.z = pos.z + 1
for i = 0, 255 do
pos.stackpos = i
local tile = getTileThingByPos(pos)
if tile.itemid ~= 0 and not isCreature(tile.uid) then
end
end
return true
end
function onStepOut(cid, item, position, lastPosition, fromPosition, toPosition, actor)
local effect = 2
if toPosition.z == fromPosition.z and getCreatureOutfit(cid).lookType ~= 316 and getCreatureOutfit(cid).lookType ~= 648 then
doSendMagicEffect(fromPosition, effect)
end
local oldtpos = fromPosition
oldtpos.stackpos = STACKPOS_GROUND
if getTileThingByPos(oldtpos).itemid >= 1 then
doRemoveItem(getTileThingByPos(oldtpos).uid, 1)
end
return true
end

Agora em data/movements abra o arquivo movements.xml

Adicione as tags:

<movevent type="StepIn" itemid="460" event="script" value="fly.lua"/>
<movevent type="StepOut" itemid="460" event="script" value="fly.lua"/>

Veja se resolve.

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

  • 0

Quando tento da fly em qualquer area, com ou sem o piso 460 em cima, ele da essa mensagem: You can\'t go lower.

 

E não consigo da o fly

 

OBS: O andar principal do meu mapa é o 6.. não o 7.. sera que tem algo a ver?

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

  • 0

Amigo eu estava pensando... como meu mapa é dividido em 2.. não sera possivel vc só coloca essas duas condiçoes nesse script de fly abaixo e ignorar o pedido de antes?

 

Condição Um: Se o player não tive a vocation para uzar o fly aparese a mensagem: Você não pode uzar o Fly

 

Condição Dois: O player só pode da fly se tive o piso 460 em cima dele, se não aparese a mensagem: Você não pode uzar o fly aqui.

 

PS: Sobre criar o piso invisivel como pedido antes, pensei bem e não daria certo pois meu mapa é dividido em dois, e com isso poderia da algum bug talves, por isso é melhor eu ter a opção de coloca o piso, pois fica melhor, porq ai posso escolher aonde o player pode da o fly e evitaria muuitos problemas pra vc editar o script.

 

SCRIPT:

 

local aar = {

															[2] = {lookType = 367}, -- Teste
															[24] = {lookType = 367}, -- Shino
															[39] = {lookType = 367}, -- Shino
															[54] = {lookType = 367}, -- Shino
															[109] = {lookType = 330} -- Deidara



}

local aterra = {

															[2] = {lookType = 160}, -- Teste
															[24] = {lookType = 367}, -- Shino
															[39] = {lookType = 367}, -- Shino
															[54] = {lookType = 367}, -- Shino
															[109] = {lookType = 160} -- Deidara

}  

	   	 function onSay(cid, words, param, channel)  

	   	 local oar = getCreaturePosition(cid)
	   	 local oterra = getCreaturePosition(cid)

	   	 local pos = getThingPos(cid)
	   	 pos.z = pos.z-1
	   	 pos.stackpos = 0

	   	 if getTileThingByPos(pos).itemid >= 1 or getTileItemById(getThingPos(cid), 1386).itemid >= 1 then
	   	 doPlayerSendCancel(cid, "You can\'t fly through constructions.")
	   	 return false
	   	 end

	   	 if getTilePzInfo(getCreaturePosition(cid)) then
	   	 return doPlayerSendCancel(cid, "O item nao tem poder em Protection Zones.")

	   	 elseif getPlayerStorageValue(cid, 1635215) <= 0 then
	   	 local voc_id = getPlayerVocation(cid)
	   	 doSetCreatureOutfit(cid, aar[voc_id], -1)


											 noar = {x=oar.x, y=oar.y, z=oar.z}
							   noar.y = noar.y - 0
							   noar.z = noar.z - 2
							   doTeleportThing(cid,noar)

	   	 doPlayerSendCancel(cid, "Você está voando, tome cuidado.")
	   	 doSendMagicEffect(noar, CONST_ME_WATERSPLASH)
	   	 setPlayerStorageValue(cid, 1635215, 1)

	   	 else

	   	 local poss = getThingPos(cid)
	   	 poss.z = poss.z+1
	   	 poss.stackpos = 0

	   	 if getTileThingByPos(poss).itemid >= 1 or getTileItemById(getThingPos(cid), 1386).itemid >= 1 then
	   	 doPlayerSendCancel(cid, "You can\'t fly through constructions.")
	   	 return false
	   	 end

	   	 if getTilePzInfo(getCreaturePosition(cid)) then
	   	 return doPlayerSendCancel(cid, "O item nao tem poder em Protection Zones.")

	   	 elseif getPlayerVocation(cid) > 0 then
	   	 local voc_id = getPlayerVocation(cid)
	   	 doSetCreatureOutfit(cid, aterra[voc_id], -1)

											 naterra = {x=oterra.x, y=oterra.y, z=oterra.z}
							   naterra.y = naterra.y - 0
							   naterra.z = naterra.z + 2
							   doTeleportThing(cid,naterra)

	   	 doPlayerSendCancel(cid, "Você saiu do ar.")
	   	 doSendMagicEffect(naterra, CONST_ME_POFF)
	   	 setPlayerStorageValue(cid, 1635215, -1)

	   	 end
	   	 end
	   	 return true
	   	 end

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

  • 0

Certo amigo, teste esse script:

local vocation = 5
local aar = {
																														    [2] = {lookType = 367}, -- Teste
																														    [24] = {lookType = 367}, -- Shino
																														    [39] = {lookType = 367}, -- Shino
																														    [54] = {lookType = 367}, -- Shino
																														    [109] = {lookType = 330} -- Deidara


}
local aterra = {
																														    [2] = {lookType = 160}, -- Teste
																														    [24] = {lookType = 367}, -- Shino
																														    [39] = {lookType = 367}, -- Shino
																														    [54] = {lookType = 367}, -- Shino
																														    [109] = {lookType = 160} -- Deidara
} 

					 function onSay(cid, words, param, channel) 

					 local oar = getCreaturePosition(cid)
					 local oterra = getCreaturePosition(cid)
					 local pos = getThingPos(cid)
					 pos.z = pos.z-1
					 pos.stackpos = 0
					 if getPlayerVocation(cid) ~= vocation then
					 doPlayerSendCancel(cid, "You can\'t use the fly.")
					 return false
					 end
					 if getTileThingByPos(pos).itemid >= 1 or getTileItemById(getThingPos(cid), 406).itemid <= 0 then
					 doPlayerSendCancel(cid, "You can\'t use the fly here.")
					 return true
					 end
					 if getThingPos(cid).z == 0 then
					 doPlayerSendCancel(cid, "You can\'t go higher!")
					 return true
					 end
					 if getTileThingByPos(pos).itemid >= 1 or getTileItemById(getThingPos(cid), 1386).itemid >= 1 then
					 doPlayerSendCancel(cid, "You can\'t fly through constructions.")
					 return false
					 end
					 if getTilePzInfo(getCreaturePosition(cid)) then
					 return doPlayerSendCancel(cid, "You may not use the fly in protection zones.")
					 elseif getPlayerStorageValue(cid, 1635215) <= 0 then
					 local voc_id = getPlayerVocation(cid)
					 doSetCreatureOutfit(cid, aar[voc_id], -1)

																							 noar = {x=oar.x, y=oar.y, z=oar.z}
															   noar.y = noar.y - 0
															   noar.z = noar.z - 2
															   doTeleportThing(cid,noar)
					 doPlayerSendCancel(cid, "You\'re flying, be careful.")
					 doSendMagicEffect(noar, CONST_ME_WATERSPLASH)
					 setPlayerStorageValue(cid, 1635215, 1)
					 else
					 local poss = getThingPos(cid)
					 poss.z = poss.z+1
					 poss.stackpos = 0
					 if getPlayerVocation(cid) ~= vocation then
					 doPlayerSendCancel(cid, "You can\'t use the fly.")
					 return false
					 end
					 if getTileThingByPos(pos).itemid >= 1 or getTileItemById(getThingPos(cid), 406).itemid <= 0 then
					 doPlayerSendCancel(cid, "You can\'t use the fly here.")
					 return true
					 end
					 if getThingPos(cid).z == 0 then
					 doPlayerSendCancel(cid, "You can\'t go higher!")
					 return true
					 end
					 if getTileThingByPos(poss).itemid >= 1 or getTileItemById(getThingPos(cid), 1386).itemid >= 1 then
					 doPlayerSendCancel(cid, "You can\'t fly through constructions.")
					 return false
					 end
					 if getTilePzInfo(getCreaturePosition(cid)) then
					 return doPlayerSendCancel(cid, "You may not use the fly in protection zones.")
					 elseif getPlayerVocation(cid) > 0 then
					 local voc_id = getPlayerVocation(cid)
					 doSetCreatureOutfit(cid, aterra[voc_id], -1)
																							 naterra = {x=oterra.x, y=oterra.y, z=oterra.z}
															   naterra.y = naterra.y - 0
															   naterra.z = naterra.z + 2
															   doTeleportThing(cid,naterra)
					 doPlayerSendCancel(cid, "You went off the air.")
					 doSendMagicEffect(naterra, CONST_ME_POFF)
					 setPlayerStorageValue(cid, 1635215, -1)
					 end
					 end
					 return true
					 end

Apenas configure o local vocation = 5 pelo ID da vocation que poderá usar o fly.

Link para o comentário
Compartilhar em outros sites

  • 0

Mano deu um probleminha.. mesmo eu colocando a vocation.. o player q tem a vocation n consegue da fly, fica com a mensagem: You can\'t use the fly.

 

 

@EDIT:

 

Agora q vi, eu tinha colocado a vocation errada, e tinha me confundido com as frases, na verdade o problema é naquele que reconhese o piso 460.. mesmo eu estando 2 floor abaixo do piso, ele n reconhese o piso 460 em cima dele.

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

  • 0

Oh me desculpe, esqueci um detalhe.

Mude a parte:

if getTileThingByPos(pos).itemid >= 1 or getTileItemById(getThingPos(cid), 406).itemid <= 0 then
doPlayerSendCancel(cid, "You can\'t use the fly here.")
return true
end

por:

if getTileThingByPos(pos).itemid >= 1 or getTileItemById(getThingPos(cid), 406).itemid <= 0 then
doPlayerSendCancel(cid, "You can\'t use the fly here.")
return false
end

PS:duas dessas partes no script, portanto modifique-as.

Tente agora.

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

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...