JU
pedido

Teleport onde só um player pode passar, e liberar a entrada novamente depois de 3 min

Por juliok80, 22 de dez. de 2012 em Scripts

teleport
passar
um player
liberar
minutos
entrada
otserv
tibia
script
10
3.7k
juliok80J
22 de dezembro de 2012 às 11:47

E ae galera, joinha!?

 

Bom... estava eu procurando por ai um script para teleport, onde apenas um player pode entrar e depois de uns 3 minutos liberar a entrada novamente, porém não encontrei o script. Então estou aqui humildemente pedindo a ajuda de uma alma bondosa para que possa me ajudar.

 

Como eu havia falado, o script deve permitir a entrada de apenas 1 player por vez, e liberar a entrada novamente após 3 minutos. Caso outro player tentar entrar neste teleport, o player voltará para a posição anterior e será notificado com uma mensagem dizendo "Já existe um player nesta sala."

 

A versão do otserv é 8.6

 

@Edit

 

Também pode ser assim assim... o player entra no teleport, dai faz o que tem que fazer lá no lugar que foi teleportado, dai quando ele pisar em um tile especifico o teleport que ele havia passado é liberado para que outro player possa entrar... acho que assim fica até melhor!

 

Abraços, e um feliz ano novo a todos! positivo.gif

Editado Dezembro 26 por juliok80

SlicerS
22 de dezembro de 2012 às 11:55

ta diz uma coisa... vai ser soh um tile na entrada de uma sala eh isso?

e dai quando algum player passar vai precisar esperar 3min pra q outro player entre... mas e se passar os 3min e o 1* player ainda estiver la dentro?

juliok80J
26 de dezembro de 2012 às 09:38

ta diz uma coisa... vai ser soh um tile na entrada de uma sala eh isso?

e dai quando algum player passar vai precisar esperar 3min pra q outro player entre... mas e se passar os 3min e o 1* player ainda estiver la dentro?

 

Então, era pra ser um teleport, mas se quiser fazer um tile tudo bem... algo que teleporte a pessoa pra dentro de uma sala, e depois de 3 min liberaria a passagem novamente mesmo que tenha alguém lá dentro.

 

 

@Edit

 

Também pode ser assim assim... o player entra no teleport, dai faz o que tem que fazer lá no lugar que foi teleportado, dai quando ele pisar em um tile especifico o teleport que ele havia passado é liberado para que outro player possa entrar... acho que assim fica até melhor!

 

Preciso muito desse script sad.png

 

Valeu!

Editado Dezembro 26 por juliok80

StackMinuteS
26 de dezembro de 2012 às 19:07

local posentrar = {x=123, y=321, z=7} -- Posiçao que ele irá ao ser teleportado para dentro
local possair = {x=321, y=123, z=7} -- Posiçao que ele irá ao ser teleportado para fora
local mins = 30 -- Minutos que ele ficará na sala
local storagemundial = 10101 -- Não mexa
local hours = 3
function onSair(cid)
doTeleportThing(cid,possair)
setPlayerStorageValue(cid,20202,-1)
doPlayerSendTextMessage(cid,27,"Voce foi teleportado para fora da sala")
return true
end
function storageSair(cid)
setGlobalStorageValue(storagemundial, -1)
doBroadcastMessage("A Sala está aberta denovo.")
return true
end
function onUse(cid,item,item2,topos,frompos,pos)
if getGlobalStorageValue(storagemundial) <= 0 then
doTeleportThing(cid,posentrar)
addEvent(function() onSair(cid) end,mins*60)
doPlayerSendTextMessage(cid,27,"Voce foi teleportado para dentro da sala e ficara "..mins.." ai dentro")
setPlayerStorageValue(cid,20202,1)
setGlobalStorageValue(storagemundial, 1)
addEvent(function() storageSair(cid) end,hours*60*60)
else
doPlayerSendTextMessage(cid,27,"A Sala ainda não está aberta")
return true
end
end

 

Em Actions.xml adicione :

<action itemid ="XXXX" event="script" value="magicroom.lua"/>

 

Agora , para evitar bugs , ao player deslogar dentro da sala , vá em

 

Data/CreatureScript/Scripts . e crie um arquivo chamado (roomlogout.lua)

e dentro adicione :

 

local possair = {x=123, y=321, z=7}
function onLogout(cid)
if getPlayerStorageValue(cid,20202) >= 1 then
doTeleportThing(cid,possair)
addEvent(doRemoveCreature,1,cid)
end
end

 

Ainda em creaturescripts/scripts , vá em (login.lua) e lá dentro adicione:

registerCreatureEvent(cid, "RoomLogout")

 

Agora em creaturescripts.xml adicone

<event type="logout" name="RoomLogout" event="script" value="roomlogout.lua"/>

Editado Dezembro 26 por StackMinute

juliok80J
27 de dezembro de 2012 às 05:22

local posentrar = {x=123, y=321, z=7} -- Posiçao que ele irá ao ser teleportado para dentro
local possair = {x=321, y=123, z=7} -- Posiçao que ele irá ao ser teleportado para fora
local mins = 30 -- Minutos que ele ficará na sala
local storagemundial = 10101 -- Não mexa
local hours = 3
function onSair(cid)
doTeleportThing(cid,possair)
setPlayerStorageValue(cid,20202,-1)
doPlayerSendTextMessage(cid,27,"Voce foi teleportado para fora da sala")
return true
end
function storageSair(cid)
setGlobalStorageValue(storagemundial, -1)
doBroadcastMessage("A Sala está aberta denovo.")
return true
end
function onUse(cid,item,item2,topos,frompos,pos)
if getGlobalStorageValue(storagemundial) <= 0 then
doTeleportThing(cid,posentrar)
addEvent(function() onSair(cid) end,mins*60)
doPlayerSendTextMessage(cid,27,"Voce foi teleportado para dentro da sala e ficara "..mins.." ai dentro")
setPlayerStorageValue(cid,20202,1)
setGlobalStorageValue(storagemundial, 1)
addEvent(function() storageSair(cid) end,hours*60*60)
else
doPlayerSendTextMessage(cid,27,"A Sala ainda não está aberta")
return true
end
end

 

Em Actions.xml adicione :

<action itemid ="XXXX" event="script" value="magicroom.lua"/>

 

Agora , para evitar bugs , ao player deslogar dentro da sala , vá em

 

Data/CreatureScript/Scripts . e crie um arquivo chamado (roomlogout.lua)

e dentro adicione :

 

local possair = {x=123, y=321, z=7}
function onLogout(cid)
if getPlayerStorageValue(cid,20202) >= 1 then
doTeleportThing(cid,possair)
addEvent(doRemoveCreature,1,cid)
end
end

 

Ainda em creaturescripts/scripts , vá em (login.lua) e lá dentro adicione:

registerCreatureEvent(cid, "RoomLogout")

 

Agora em creaturescripts.xml adicone

<event type="logout" name="RoomLogout" event="script" value="roomlogout.lua"/>

 

 

Muitíssimo obrigado!

 

Só uma duvida... teria como eu criar uma action para um teleport de saida caso o player complete a quest... tipo, ele entra em um teleport dai remove o evento de teleportar ele pra fora da sala.

 

Será que daria certo se eu fizesse uma action usando o script de logout!?

 

Assim, em data/actions/actions.xml:

 

<action itemid ="XXXX" event="script" value="saidaroom.lua"/>

 

E em data/actions/scripts/saidaroom.lua

 

local possair = {x=123, y=321, z=7}
function onLogout(cid)
if getPlayerStorageValue(cid,20202) >= 1 then
doTeleportThing(cid,possair)
addEvent(doRemoveCreature,1,cid)
end
end

 

@Edit

 

Rapaz... acabei de testar aqui e não funcionou, queria saber se estou fazendo certo.

 

Eu criei um arquivo dentro de data/actions/scripts/magicroom.lua com o código abaixo:

 

local posentrar = {x=85, y=944, z=15} -- Posiçao que ele irá ao ser teleportado para dentro
local possair = {x=110, y=920, z=14} -- Posiçao que ele irá ao ser teleportado para fora
local mins = 1 -- Minutos que ele ficará na sala (coloquei 1 min pra testar)
local storagemundial = 10101 -- Não mexa
local hours = 3
function onSair(cid)
doTeleportThing(cid,possair)
setPlayerStorageValue(cid,20202,-1)
doPlayerSendTextMessage(cid,27,"Você foi teleportado para fora da sala.")
return true
end
function storageSair(cid)
setGlobalStorageValue(storagemundial, -1)
doBroadcastMessage("A Sala está aberta novamente.")
return true
end
function onUse(cid,item,item2,topos,frompos,pos)
if getGlobalStorageValue(storagemundial) <= 0 then
doTeleportThing(cid,posentrar)
addEvent(function() onSair(cid) end,mins*60)
doPlayerSendTextMessage(cid,27,"Você foi teleportado para dentro da sala e terá "..mins.." minutos para finalizar, senão você será teleportado para fora da sala.")
setPlayerStorageValue(cid,20202,1)
setGlobalStorageValue(storagemundial, 1)
addEvent(function() storageSair(cid) end,hours*60*60)
else
doPlayerSendTextMessage(cid,27,"A Sala ainda não está aberta.")
return true
end
end

 

Dai adicionei em data/actions/actions.xml

 

<action itemid ="9000" event="script" value="magicroom.lua"/>

 

Ai fui no Map Editor e adicionei o ActionID 9000 no teleport, também fiz as outras partes, porém acho que até aqui já deveria estar funcionando (parcialmente) não é mesmo!? ohmy.png

 

Não aparece nem as mensagens.

 

@Edit 2

 

Os players acabaram de me avisar de um bug que estava ocorrendo, quando eles tentavam deslogar usando CTRL+L ou CTRL+Q ou clicando no botão logout, não acontecia nada... dai lembrei que tinha alterado o script do login.lua, retirei aquela linha do arquivo e exclui o arquivo roomlogout.lua, reiniciei o ot e ai voltou a funcionar o logout.

 

Por favor Sensei, me diga o que eu fiz de errado, ou se está faltando alguma coisa...

 

Obrigado!

Editado Dezembro 27 por juliok80

brun123B
28 de dezembro de 2012 às 20:59

local bloqueado = 0

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)

if os.time() - bloqueado < 0 then
	doTeleportThing(cid, fromPosition, false)
	doPlayerSendCancel(cid, "Deve esperar "..math.abs(os.time() - bloqueado).." segundos para entrar aqui.")
return true
end

local teleportEntrada = {x = 1, y = 1, z = 1}
local tempo = 3 * 60 -- em segundos, isso equivale a 3 minutos

doTeleportThing(cid, teleportEntrada, false)
doSendMagicEffect(teleportEntrada, CONST_ME_TELEPORT)
bloqueado = os.time() + tempo

return true
end

 

Um player entra, e durante 3 minutos a entrada é bloqueada. Após os 3 minutos, mesmo que o player antigo continue no lugar onde ele foi teleportado, outro player poderá entrar e a entrada será novamente fechada por 3 minutos. Se o player que entrou sair antes do tempo ter passado, a passagem continuará bloqueada até que o tempo passe.

 

O problema do logout foi causado pela falta de um return true antes do último end no script do logout.

 

A script é um movements, o tipo é StepIn, basta ver outra tag no movements.xml e copiar.

Editado Dezembro 28 por brun123

juliok80J
28 de dezembro de 2012 às 22:31

local bloqueado = 0

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)

if os.time() - bloqueado < 0 then
	doTeleportThing(cid, fromPosition, false)
	doPlayerSendCancel(cid, "Deve esperar "..math.abs(os.time() - bloqueado).." segundos para entrar aqui.")
return true
end

local teleportEntrada = {x = 1, y = 1, z = 1}
local tempo = 3 * 60 -- em segundos, isso equivale a 3 minutos

doTeleportThing(cid, teleportEntrada, false)
doSendMagicEffect(teleportEntrada, CONST_ME_TELEPORT)
bloqueado = os.time() + tempo

return true
end

 

Um player entra, e durante 3 minutos a entrada é bloqueada. Após os 3 minutos, mesmo que o player antigo continue no lugar onde ele foi teleportado, outro player poderá entrar e a entrada será novamente fechada por 3 minutos. Se o player que entrou sair antes do tempo ter passado, a passagem continuará bloqueada até que o tempo passe.

 

O problema do logout foi causado pela falta de um return true antes do último end no script do logout.

 

A script é um movements, o tipo é StepIn, basta ver outra tag no movements.xml e copiar.

 

Rapaz... não deu certo, agora também não sei se fiz certo, veja só:

 

Eu adicionei essa linha em \data\movements\movements.xml

 

<movevent type="StepIn" actionid="13507" event="script" value="teleportarena.lua"/>

 

E em data\movements\scripts\teleportarena.lua

 

 

local bloqueado = 0


function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)

	if os.time() - bloqueado < 0 then
			doTeleportThing(cid, fromPosition, false)
			doPlayerSendCancel(cid, "Já existe um player fazendo essa quest.")
	return true
	end

	local teleportEntrada = {x = 95, y = 940, z = 15} -- localização do teleport de entrada
	local tempo = 1 * 60 -- em segundos, isso equivale a 1 minutos (coloquei 1 para testar)

	doTeleportThing(cid, teleportEntrada, false)
	doSendMagicEffect(teleportEntrada, CONST_ME_TELEPORT)
	bloqueado = os.time() + tempo

return true
end

 

E no map editor adicionei o actionID 13507 no teleport conforme imagem abaixo:

 

35929707.png

 

Por favor, você poderia me falar se fiz algo errado!?

 

Se alguém puder me ajudar eu ficarei eternamente grato e prometo que darei +rep durante 1 mes inteiro positive.gif

 

Até poderia dizer que eu daria +rep vitalicio, mas isso eu não posso prometer... rsrs

Editado Dezembro 28 por juliok80

AkatsukyiA
28 de dezembro de 2012 às 22:45

Tente pôr esse ActionId seu (13507) no tile(chão) e não no teleport

mas pode por o teleport em cima do chão pra disfarçar.

PS: Coloca o teleport sem destination, o destino você muda no script do brun

Editado Dezembro 28 por Manyzin

juliok80J
29 de dezembro de 2012 às 01:59

Tente pôr esse ActionId seu (13507) no tile(chão) e não no teleport

mas pode por o teleport em cima do chão pra disfarçar.

PS: Coloca o teleport sem destination, o destino você muda no script do brun

 

Rapaz... era isso mesmo!

 

Muito obrigado... brun123 serei eternamente grato, pode esperar muitos +rep de mim, você também Manyzin... assim que eu terminar de dar +rep pro brun123 eu dou o seu!

 

Agradeço a todos que tentaram me ajudar, um forte abraço!

 

heart.png brun123 oops.gif

SlicerS
29 de dezembro de 2012 às 09:39

sanado, movido