Ir para conteúdo
  • 0

[Ajuda] Action - Teleport [Ajuda]


Flaah

Pergunta

Boa Tarde amigos do XTibia, to om um pequeno problema nessa action, que seria:

 

O player pode se teleporta entre as paredes, teria como arruma isso?!

 

function onUse(cid, item, frompos, item2, topos)
if item2.itemid == 0 then
doPlayerSendCancel(cid,"Você não pode fazer isso.")
else

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

if  getTileHouseInfo(getCreaturePosition(cid)) then
return doPlayerSendCancel(cid, "O item nao tem poder em Casas.")
else

if getPlayerAccess(cid) >= 0 then
local playerpos = getPlayerPosition(cid)
doTeleportThing(cid,topos)
doSendMagicEffect(playerpos,2)
doSendMagicEffect(topos,10)
doSendAnimatedText(playerpos,"Teleport",35)
doPlayerAddMana(cid, -1500)
else
doPlayerSendCancel(cid,"Você não pode usar esta runa.")
end
end
end
end
return 1
end

 

ALGUEM AJUDA PORFAVOR, VALENDO +REP

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

function onUse(cid, item, frompos, item2, topos)
if item2.itemid == 0 then
   doPlayerSendCancel(cid,"Você não pode fazer isso.")
else
   if getTilePzInfo(getCreaturePosition(cid)) then
       return doPlayerSendCancel(cid, "O item nao tem poder em Protection Zones.")
   elseif  getTileHouseInfo(getCreaturePosition(cid)) then
       return doPlayerSendCancel(cid, "O item nao tem poder em Casas.")
   elseif getPlayerAccess(cid) >= 0 then
       local playerpos = getPlayerPosition(cid)
       local check = true
       for i=playerpos.x, topos.x do
           for j=playerpos.y, topos.y do
               local pos = {x=i,y=j,z=playerpos.z}
               if not isWalkable(pos) then
                   check = false
               end
           end
       end
       if check then
           doTeleportThing(cid,topos)
           doSendMagicEffect(playerpos,2)
           doSendMagicEffect(topos,10)
           doSendAnimatedText(playerpos,"Teleport",35)
           doPlayerAddMana(cid, -1500)
       else
           doPlayerSendCancel(cid,"Você não pode atravessar isso.")
       end
   else
       doPlayerSendCancel(cid,"Você não pode usar esta runa.")
   end
end
return true
end

function isWalkable(pos, creature, pz, proj) -- nord
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
    local creature = getTopCreature(pos)
    if creature.type > 0 then	   return false end
    if getTilePzInfo(pos) and not pz then return false end
    local n = not proj and 3 or 2
    for i = 0, 255 do
				    pos.stackpos = i
				    local tile = getTileThingByPos(pos)
				    if tile.itemid ~= 0 and not isCreature(tile.uid) then
								    if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
												    return false
								    end
				    end
    end
return true
end

 

Obs: nem testei happy.png

Link para o comentário
Compartilhar em outros sites

  • 0

Refiz e testei.

 

function onUse(cid, item, frompos, item2, topos)
if item2.itemid == 0 then
   doPlayerSendCancel(cid,"Você não pode fazer isso.")
else
   if getTilePzInfo(getCreaturePosition(cid)) then
    return doPlayerSendCancel(cid, "O item nao tem poder em Protection Zones.")
   elseif  getTileHouseInfo(getCreaturePosition(cid)) then
    return doPlayerSendCancel(cid, "O item nao tem poder em Casas.")
   elseif getPlayerAccess(cid) >= 0 then
    local playerpos = getPlayerPosition(cid)
    local check = true
       local menorX = 0
       local maiorX = 0
       if playerpos.x > topos.x then
           maiorX = playerpos.x
           menorX = topos.x
       else
           maiorX = topos.x
           menorX = playerpos.x
       end
       local menorY = 0
       local maiorY = 0
       if playerpos.y > topos.y then
           maiorY = playerpos.y
           menorY = topos.y
       else
           maiorY = topos.y
           menorY = playerpos.y
       end
    for i=menorX, maiorX do        
           for j=menorY, maiorY do
	    local pos = {x=i,y=j,z=playerpos.z}
		    if not isWalkable(pos) then
                   pos.stackpos = 253
                   if getThingfromPos(pos).uid ~= cid then
                       check = false
                   end
		   end
	   end
    end
    if check then
	    doTeleportThing(cid,topos)
	    doSendMagicEffect(playerpos,2)
	    doSendMagicEffect(topos,10)
	    doSendAnimatedText(playerpos,"Teleport",35)
	    doPlayerAddMana(cid, -1500)
    else
	    doPlayerSendCancel(cid,"Você não pode atravessar isso.")
       end
   else
    doPlayerSendCancel(cid,"Você não pode usar esta runa.")
   end
end
return true
end

function isWalkable(pos, creature, pz, proj) -- nord
	    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
	    local creature = getTopCreature(pos)
	    if creature.type > 0 then	  return false end
	    if getTilePzInfo(pos) and not pz then return false end
	    local n = not proj and 3 or 2
	    for i = 0, 255 do
									    pos.stackpos = i
									    local tile = getTileThingByPos(pos)
									    if tile.itemid ~= 0 and not isCreature(tile.uid) then
																	    if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
																									    return false
																	    end
									    end
	    end
return true
end

Link para o comentário
Compartilhar em outros sites

  • 0

Cara fiz de um jeito mais simpleszinho:

 

 

function onUse(cid, item, frompos, item2, topos)

if item2.uid <= 1 then
return doPlayerSendCancel(cid,"Você não pode fazer isso.")
end

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

if getTileHouseInfo(getCreaturePosition(cid)) then
return doPlayerSendCancel(cid, "O item nao tem poder em Casas.")
end

if getTileHouseInfo(topos) then
return doPlayerSendCancel(cid, "Você não pode entrar em houses com o item.")
end

if getPlayerMana(cid) < 1500 then
return doPlayerSendCancel(cid, "Você não tem mana suficiente (1500).")
end

if not isSightClear(frompos, topos, false) then
return doPlayerSendCancel(cid, "Você não pode alcançar esse lugar.")
end

if doTileQueryAdd(cid, topos) ~= 1 then
return doPlayerSendCancel(cid, "Você não pode ir para este lugar.")
end

local playerpos = getPlayerPosition(cid)
doPlayerAddMana(cid, -1500)
doTeleportThing(cid, topos)
doSendMagicEffect(playerpos, 2)
doSendMagicEffect(topos, 10)
doSendAnimatedText(playerpos, "Teleport", 35)

return 1
end

 

 

Estava faltando checar se o player tinha mana suficiente.

Alguns detalhes:

1) O player não pode usar em PZ nem dentro de Houses o item, mas se ele tentar se teletransportar para dentro de PZ ele vai conseguir. Antes ele também poderia entrar em Houses com esse item, mas ele poderia ficar preso dentro da house e roubar elas também. Por isso impedi que fosse possível entrar em houses com esse script.

2) Eu tirei a checagem pelo access, pois estava maior ou igual a 0, todos os players tem o access maior ou igual a zero, então iria sempre retornar true (inútil).

3) O teletransporte é instantâneo, se quiser fazer ele mais bonitinho (jogar um efeito na posição, e quando o efeito chegar lá teletransportar) é só pedir.

4) O item não está sendo removido ao ser utilizado (não sei como você deseja).

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

  • 0

@Jhon992

 

Seu script esta perfeito, mais so que o player pode se teleportar de uma area normal para um PZ ooou de uma area normal para dentro de uma casa.

 

@brun123

 

Seu script esta bom, mais quando tento uzar ele, aparece a mensagem:

 

Você não pode alcançar esse lugar

 

ALGUEM AJUDA PORFAVOR, VALENDO +REP

Link para o comentário
Compartilhar em outros sites

  • 0

Teste assim:

 

 

function onUse(cid, item, frompos, item2, topos)

    if item2.uid <= 1 then
    return doPlayerSendCancel(cid,"Você não pode fazer isso.")
    end

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

    if getTilePzInfo(topos) then
    return doPlayerSendCancel(cid, "Você não pode ir para Protection Zones.")
    end

    if getTileHouseInfo(getCreaturePosition(cid)) then
    return doPlayerSendCancel(cid, "O item nao tem poder em Casas.")
    end

    if getTileHouseInfo(topos) then
    return doPlayerSendCancel(cid, "Você não pode entrar em houses com o item.")
    end

    if getPlayerMana(cid) < 1500 then
    return doPlayerSendCancel(cid, "Você não tem mana suficiente (1500).")
    end

    --if not isSightClear(frompos, topos, false) then
    --return doPlayerSendCancel(cid, "Você não pode alcançar esse lugar.")
    --end

    if doTileQueryAdd(cid, topos) ~= 1 then
    return doPlayerSendCancel(cid, "Você não pode ir para este lugar.")
    end

    local playerpos = getPlayerPosition(cid)
    doPlayerAddMana(cid, -1500)
    doTeleportThing(cid, topos)
    doSendMagicEffect(playerpos, 2)
    doSendMagicEffect(topos, 10)
    doSendAnimatedText(playerpos, "Teleport", 35)

return 1
end

 

 

Você falou em atravessar paredes, então eu coloque ia função que caso tenha alguma parede que bloqueie o caminho até onde o player quer se teletransporatar, ele não vai conseguir...

Link para o comentário
Compartilhar em outros sites

  • 0

Espero que ajude.

function onUse(cid, item, frompos, item2, topos)

local manaNeed = 1500 -- mana necessario para usar.
local LvlNeed = 150 -- level necessario para usar.
local vocationsUse = {1,2,3,4,5,6,7,8} -- vocações que podem usar.

if item2.itemid == 0 then
   doPlayerSendCancel(cid,"Você não pode fazer isso.")
else
   if isInArray(vocationsUse, getPlayerVocation(cid)) then
       if getPlayerLevel(cid) >= LvlNeed then
           if getCreatureMana(cid) >= manaNeed then
               if not getTilePzInfo(getCreaturePosition(cid)) or not getTilePzInfo(topos) then
                   local playerpos = getPlayerPosition(cid)
                   local check = true
                   local menorX = 0
                   local maiorX = 0
                   if playerpos.x > topos.x then
                       maiorX = playerpos.x
                       menorX = topos.x
                   else
                       maiorX = topos.x
                       menorX = playerpos.x
                   end
                   local menorY = 0
                   local maiorY = 0
                   if playerpos.y > topos.y then
                       maiorY = playerpos.y
                       menorY = topos.y
                   else
                       maiorY = topos.y
                       menorY = playerpos.y
                   end
                   for i=menorX, maiorX do	    
                       for j=menorY, maiorY do
                           local pos = {x=i,y=j,z=playerpos.z}
                           if not isWalkable(pos) then
                               pos.stackpos = 253
                               if getThingfromPos(pos).uid ~= cid then
                                   check = false
                               end
                           end
                       end
                   end
                   if check then
                       doTeleportThing(cid,topos)
                       doSendMagicEffect(playerpos,2)
                       doSendMagicEffect(topos,10)
                       doSendAnimatedText(playerpos,"Teleport",35)
                       doPlayerAddMana(cid, manaNeed)
                   else
                       doPlayerSendCancel(cid,"Você não pode atravessar isso.")
                   end
               else
                   doPlayerSendCancel(cid,"Você não pode utilizar em protection zone.")
               end
           else
               doPlayerSendCancel(cid,"Você não tem mana necessaria para usar.")
           end
       else
           doPlayerSendCancel(cid,"Você não tem level suficiente para usar.")
       end
   else
       doPlayerSendCancel(cid,"Você não possui a vocação necessaria para usar.")
   end
end
return true
end

function isWalkable(pos, creature, pz, proj) -- nord
   if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
   local creature = getTopCreature(pos)
   if creature.type > 0 then	 return false end
   if getTilePzInfo(pos) and not pz then return false end
   local n = not proj and 3 or 2
   for i = 0, 255 do
    pos.stackpos = i
    local tile = getTileThingByPos(pos)
    if tile.itemid ~= 0 and not isCreature(tile.uid) then
	    if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
		    return false
	    end
    end
   end
return true
end

Link para o comentário
Compartilhar em outros sites

  • 0

@brun123 Seu script esta ótimo, e o seu tbm @Jhon992.

 

+REP PROS 2 :D

 

---------- @EDIT ----------

 

@Jhon992 vc conseguiria montar 2 script em base desse que vc fez?!

 

 

function onUse(cid, item, frompos, item2, topos)

local manaNeed = 1500 -- mana necessario para usar.

local LvlNeed = 150 -- level necessario para usar.

local vocationsUse = {1,2,3,4,5,6,7,8} -- vocações que podem usar.

if item2.itemid == 0 then

doPlayerSendCancel(cid,"Você não pode fazer isso.")

else

if isInArray(vocationsUse, getPlayerVocation(cid)) then

if getPlayerLevel(cid) >= LvlNeed then

if getCreatureMana(cid) >= manaNeed then

if not getTilePzInfo(getCreaturePosition(cid)) or not getTilePzInfo(topos) then

local playerpos = getPlayerPosition(cid)

local check = true

local menorX = 0

local maiorX = 0

if playerpos.x > topos.x then

maiorX = playerpos.x

menorX = topos.x

else

maiorX = topos.x

menorX = playerpos.x

end

local menorY = 0

local maiorY = 0

if playerpos.y > topos.y then

maiorY = playerpos.y

menorY = topos.y

else

maiorY = topos.y

menorY = playerpos.y

end

for i=menorX, maiorX do

for j=menorY, maiorY do

local pos = {x=i,y=j,z=playerpos.z}

if not isWalkable(pos) then

pos.stackpos = 253

if getThingfromPos(pos).uid ~= cid then

check = false

end

end

end

end

if check then

doTeleportThing(cid,topos)

doSendMagicEffect(playerpos,2)

doSendMagicEffect(topos,10)

doSendAnimatedText(playerpos,"Teleport",35)

doPlayerAddMana(cid, manaNeed)

else

doPlayerSendCancel(cid,"Você não pode atravessar isso.")

end

else

doPlayerSendCancel(cid,"Você não pode utilizar em protection zone.")

end

else

doPlayerSendCancel(cid,"Você não tem mana necessaria para usar.")

end

else

doPlayerSendCancel(cid,"Você não tem level suficiente para usar.")

end

else

doPlayerSendCancel(cid,"Você não possui a vocação necessaria para usar.")

end

end

return true

end

function isWalkable(pos, creature, pz, proj) -- nord

if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end

local creature = getTopCreature(pos)

if creature.type > 0 then return false end

if getTilePzInfo(pos) and not pz then return false end

local n = not proj and 3 or 2

for i = 0, 255 do

pos.stackpos = i

local tile = getTileThingByPos(pos)

if tile.itemid ~= 0 and not isCreature(tile.uid) then

if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then

return false

end

end

end

return true

end

 

 

Primeiro: Quando o player é teleportado, sai um efeito na posição anterior do player e uma na atual posição.

 

Segundo: Quando o player é teleportado, sai um efeito e cria um tronco de uma arvore, na posição anterior do player e sair um efeito quando o player chega no local escolido.

 

OBS: São 2 scripts, VALENDO ++REP.

Link para o comentário
Compartilhar em outros sites

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