Ir para conteúdo
  • 0

Teleport com storage que muda a posição.


Elias Palermo

Pergunta

Bom dia!

 

Estou precisando muito de um teleport que funcione da seguinte maneira:

 

Ao passa nesse tp ele me da um storage que mudará a posição que serei movido caso eu passe nele novamente.

 

Explicando melhor.

 

Eu uso um sistema no meu client que me da a chance de por imagens na tela em certos lugares que eu passo, e disso me aproveito para montar uma historia mais elaborada.

Logo tendo esse teleport eu teria melhor proveito para fazer cenas em certos momentos da historia do game, tendo em vista que eu veria aquela determinada situação apenas uma vez já que esse tp mudaria o local que iria me mandar após ser adquirido o storage.

 

Resumo:

 

Funcionaria assim. Quando eu passar nesse tp ele me deslocará para "x" local, e neste local terá o enredo de uma parte da historia. (Um local fantasma assim digamos, já que o player passará apenas uma vez). Esse mesmo tp me dará uma storage para quando eu for passar NELE novamente ele irá me mover para outro "x" local( Que seria o mesmo local só que sem a situação da historia acontecendo).

 

Eu preciso MUITO disso, se alguém puder me ajudar ficarei totalmente grato.

Minha base é PDA.

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

@Elias Palermo, se eu entendi direito, acho q isso deve ser o que vc quer:

 

Vá em data\movements e adicione essa tag ao arquivo movements.xml:

<movevent type="StepIn" actionid="ACTION-ID-DO-TP" event="script" value="teleportstorage.lua" />

 

Agora vá na pasta data\movements\scripts e crie um arquivo chamado teleportstorage.lua e coloque isso dentro:

local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)local teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[1] = {pos = {x=1578, y=1687, z=7}, newValue = 2},[2] = {pos = {x=1578, y=1687, z=7}, newValue = 3},[3] = {pos = {x=1578, y=1687, z=7}, newValue = 1},}function onStepIn(cid, item, pos)	for v, t in pairs(teleports) do		if getPlayerStorageValue(cid, str) == v then			doTeleportThing(cid, t.pos)			setPlayerStorageValue(cid, str, t.newValue)		end	end	return trueend

 

Caso não tenha entendido como funciona essa tabela/script me diz o que vc não entendeu exatamente q eu tento explicar.

Link para o comentário
Compartilhar em outros sites

  • 0
17 horas atrás, Danihcv disse:

@Elias Palermo, se eu entendi direito, acho q isso deve ser o que vc quer:

 

Vá em data\movements e adicione essa tag ao arquivo movements.xml:

<movevent type="StepIn" actionid="ACTION-ID-DO-TP" event="script" value="teleportstorage.lua" />

 

Agora vá na pasta data\movements\scripts e crie um arquivo chamado teleportstorage.lua e coloque isso dentro:

local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)local teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[1] = {pos = {x=1578, y=1687, z=7}, newValue = 2},[2] = {pos = {x=1578, y=1687, z=7}, newValue = 3},[3] = {pos = {x=1578, y=1687, z=7}, newValue = 1},}function onStepIn(cid, item, pos)	for v, t in pairs(teleports) do		if getPlayerStorageValue(cid, str) == v then			doTeleportThing(cid, t.pos)			setPlayerStorageValue(cid, str, t.newValue)		end	end	return trueend

 

Caso não tenha entendido como funciona essa tabela/script me diz o que vc não entendeu exatamente q eu tento explicar.

O que fiquei sem entender, é porque o script tem 3 posições, se no caso eu usaria duas tlg?

Uma local pra caso não tenha o storage

E uma pra caso tenha.

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

  • 0

@Elias Palermo, essa quantidade de posições vc pode alterar. Botar quantas quiser.

Mas agora que vc disse que só existem 2 possibilidades (ter ou não) a tabela ficaria assim:

 

local teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},}

*explicação: quando uma pessoa não possui uma storage X, aí no script usa-se a função getPlayerStorageValue aí o resultado é o valor -1 (então por padrão o valor -1 em uma storage significa que o player não tem ela, basicamente). E aí o valor 1 (que eu coloquei na tabela acima) significa que o player tem a storage e seu valor é 1.

 

Situação-exemplo-prático: Um player P pisa no teleport pela primeira vez, ele será teleportado para a posição presente na tabela dessa linha:

[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},

*pois como o player não tem a storage, o valor dela no player é -1. Aí dps que o player for teleportado, ele receberá o valor (newValue) contido na linha, que no caso será 1.

Então, ao pisar uma segunda vez no teleport, o valor atual da sua storage será 1 (newValue da linha mencionada acima). Aí o player será teleportado para a posição da linha respectiva:

[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},

*e aí dps de ser teleportado para essa posição, a storage receberá o valor presente em newValue dessa linha, que no caso será -1. E aí inicia-se o loop. Se vc ñ quiser que essa loop ocorra, basta colocar um newValue que não tenha linha correspondente na tabela (como 2, por exemplo, ou mesmo 100, 50, 39, 897, etc)

Link para o comentário
Compartilhar em outros sites

  • 0
6 horas atrás, Danihcv disse:

@Elias Palermo, essa quantidade de posições vc pode alterar. Botar quantas quiser.

Mas agora que vc disse que só existem 2 possibilidades (ter ou não) a tabela ficaria assim:

 

local teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},}

*explicação: quando uma pessoa não possui uma storage X, aí no script usa-se a função getPlayerStorageValue aí o resultado é o valor -1 (então por padrão o valor -1 em uma storage significa que o player não tem ela, basicamente). E aí o valor 1 (que eu coloquei na tabela acima) significa que o player tem a storage e seu valor é 1.

 

Situação-exemplo-prático: Um player P pisa no teleport pela primeira vez, ele será teleportado para a posição presente na tabela dessa linha:

[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},

*pois como o player não tem a storage, o valor dela no player é -1. Aí dps que o player for teleportado, ele receberá o valor (newValue) contido na linha, que no caso será 1.

 

Então, ao pisar uma segunda vez no teleport, o valor atual da sua storage será 1 (newValue da linha mencionada acima). Aí o player será teleportado para a posição da linha respectiva:

[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},

*e aí dps de ser teleportado para essa posição, a storage receberá o valor presente em newValue dessa linha, que no caso será -1. E aí inicia-se o loop. Se vc ñ quiser que essa loop ocorra, basta colocar um newValue que não tenha linha correspondente na tabela (como 2, por exemplo, ou mesmo 100, 50, 39, 897, etc)

Entendi mano, mas seguinte não funcionou. Eu passo pelo tp e não sou teleportado, e não da erro algum também.

Link para o comentário
Compartilhar em outros sites

  • 0
local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)local teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},}function onStepIn(cid, position)	for v, t in pairs(teleports) do		if getPlayerStorageValue(cid, str) == v then  			print("Chegou até aqui")			doTeleportThing(cid, t.pos)			setPlayerStorageValue(cid, str, t.newValue)  		else  			print("valor da storage: "..getPlayerStorageValue(cid, str))		end	end	return trueend

 

@Elias Palermo, põe assim e vê o que aparece na distro.

Link para o comentário
Compartilhar em outros sites

  • 0
9 horas atrás, Danihcv disse:
local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)local teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},}function onStepIn(cid, position)	for v, t in pairs(teleports) do		if getPlayerStorageValue(cid, str) == v then  			print("Chegou até aqui")			doTeleportThing(cid, t.pos)			setPlayerStorageValue(cid, str, t.newValue)  		else  			print("valor da storage: "..getPlayerStorageValue(cid, str))		end	end	return trueend

 

@Elias Palermo, põe assim e vê o que aparece na distro.

 

1.png

1.png.0680f33d1000cdacbd5be951018b8ea7.png

Link para o comentário
Compartilhar em outros sites

  • 0

@Elias Palermo, parece que sua distro tem como padrão o valor 0 para storages (ao invés de -1).

Então, basta acrescentar uma linha para o valor 0 na tabela:

local teleports =[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[0] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},}

*recomendo manter a linha do -1. Aí vc tem que deixar a linha do -1 e do 0 iguais (levando para o mesmo destino e com o mesmo newValue).

 

Segue o script atualizado (otimizado):

local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)local teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[0] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},}function onStepIn(cid, position)	doTeleportThing(cid, teleports[getPlayerStorageValue(cid, str)].pos)	setPlayerStorageValue(cid, str, teleports[getPlayerStorageValue(cid, str)].newValue)	return trueend

 

 

 

Agradecimento ao membro @Poccnn, por me dar um toque para simplificar o script.

Link para o comentário
Compartilhar em outros sites

  • 0
8 horas atrás, Danihcv disse:

@Elias Palermo, parece que sua distro tem como padrão o valor 0 para storages (ao invés de -1).

Então, basta acrescentar uma linha para o valor 0 na tabela:

local teleports =[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[0] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},}

*recomendo manter a linha do -1. Aí vc tem que deixar a linha do -1 e do 0 iguais (levando para o mesmo destino e com o mesmo newValue).

 

Segue o script atualizado (otimizado):

local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)local teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[0] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},}function onStepIn(cid, position)	doTeleportThing(cid, teleports[getPlayerStorageValue(cid, str)].pos)	setPlayerStorageValue(cid, str, teleports[getPlayerStorageValue(cid, str)].newValue)	return trueend

 

 

 

Agradecimento ao membro @Poccnn, por me dar um toque para simplificar o script.

Tinha dado um erro aqui, mas foi bobiada minha na hora de configurar.

Funcionou perfeitamente mano, muito obrigado. Você não sabe o quanto esse sistema é importante pro meu servidor <3

Se eu pudesse te dava 1000 rep+ kkkkk valeu mesmo!

 

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

  • 0

huahuahua, de boa cara. ^^

 

---------------------------------------------------------

Tópico movido para dúvidas / pedidos resolvidos.

Link para o comentário
Compartilhar em outros sites

  • 0
22 horas atrás, Danihcv disse:

huahuahua, de boa cara. ^^

 

---------------------------------------------------------

Tópico movido para dúvidas / pedidos resolvidos.

Brother seguinte, apareceu um bug.

 

Se eu faço outro script pra outro tp da erro erro na distro e o player não é teleportado (E sim, eu mudei as storages, e o action id)

1.png

1.png.577faea31a38884afe27c2364e69377b.png

Link para o comentário
Compartilhar em outros sites

  • 0

@Elias Palermo, isso ocorreu pq o player pisou no teleport e o valor da storage dele não estava configurado na tabela. Por exemplo: na tabela eu pus 3 linhas, para os valores -1, 0 e 1. O player que pisou no teleport tinha um valor diferente desses na storage.

 

Vê se assim já resolve:

local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)local msgErro = "Você não é digno de entrar aqui." --mensagem de erro ao tentar entrar no teleport mas não ter um valor configurado na tabelalocal teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[0] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},}function onStepIn(cid, position, fromPosition)valor = getPlayerStorageValue(cid, str)	if isInArray(teleports, valor) then		doTeleportThing(cid, teleports[valor].pos)		setPlayerStorageValue(cid, str, teleports[valor].newValue)	else		doTeleportThing(cid, fromPosition)		doPlayerSendCancel(cid, msgErro)	end	return trueend

 

Link para o comentário
Compartilhar em outros sites

  • 0
16 minutos atrás, Danihcv disse:

@Elias Palermo, isso ocorreu pq o player pisou no teleport e o valor da storage dele não estava configurado na tabela. Por exemplo: na tabela eu pus 3 linhas, para os valores -1, 0 e 1. O player que pisou no teleport tinha um valor diferente desses na storage.

 

Vê se assim já resolve:

local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)local msgErro = "Você não é digno de entrar aqui." --mensagem de erro ao tentar entrar no teleport mas não ter um valor configurado na tabelalocal teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[0] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},}function onStepIn(cid, position, fromPosition)valor = getPlayerStorageValue(cid, str)	if isInArray(teleports, valor) then		doTeleportThing(cid, teleports[valor].pos)		setPlayerStorageValue(cid, str, teleports[valor].newValue)	else		doTeleportThing(cid, fromPosition)		doPlayerSendCancel(cid, msgErro)	end	return trueend

 

Ai mesmo que não entra em nenhum tp kkkkk

E aparece a msg que você colocou, mas não teleporta.

Link para o comentário
Compartilhar em outros sites

  • 0

@Elias Palermo, põe assim e manda o que aparecer na distro:

local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)local msgErro = "Você não é digno de entrar aqui." --mensagem de erro ao tentar entrar no teleport mas não ter um valor configurado na tabelalocal teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[0] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},}function onStepIn(cid, position, fromPosition)valor = getPlayerStorageValue(cid, str)print("valor: "..valor)	if isInArray(teleports, valor) then		doTeleportThing(cid, teleports[valor].pos)		setPlayerStorageValue(cid, str, teleports[valor].newValue)	else		doTeleportThing(cid, fromPosition)		doPlayerSendCancel(cid, msgErro)	end	return trueend

 

Link para o comentário
Compartilhar em outros sites

  • 0
8 minutos atrás, Danihcv disse:

@Elias Palermo, põe assim e manda o que aparecer na distro:

local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)local msgErro = "Você não é digno de entrar aqui." --mensagem de erro ao tentar entrar no teleport mas não ter um valor configurado na tabelalocal teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[-1] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[0] = {pos = {x=1578, y=1687, z=7}, newValue = 1},[1] = {pos = {x=1578, y=1687, z=7}, newValue = -1},}function onStepIn(cid, position, fromPosition)valor = getPlayerStorageValue(cid, str)print("valor: "..valor)	if isInArray(teleports, valor) then		doTeleportThing(cid, teleports[valor].pos)		setPlayerStorageValue(cid, str, teleports[valor].newValue)	else		doTeleportThing(cid, fromPosition)		doPlayerSendCancel(cid, msgErro)	end	return trueend

 

Aparece valor: -1

 

Outra coisa que esqueci de te avisar, foi que eu tive que adicionar mais uma linha de local para que pudesse teleportar na segunda vez com a segunda storage, sem essa linha só teleportava 1 uma vez.

 

Citar

local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)

local msgErro = "Você não é digno de entrar aqui." --mensagem de erro ao tentar entrar no teleport mas não ter um valor configurado na tabela

local teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}

[-1] = {pos = {x=1024, y=652, z=9}, newValue = 300031},

[0] = {pos = {x=1024, y=652, z=9}, newValue = 300031},

[300031] = {pos = {x=1025, y=662, z=9}, newValue = 300032},

[300032] = {pos = {x=1025, y=662, z=9}, newValue = 300031},

}

function onStepIn(cid, position, fromPosition)

valor = getPlayerStorageValue(cid, str)

print("valor: "..valor)

    if isInArray(teleports, valor) then

        doTeleportThing(cid, teleports[valor].pos)

        setPlayerStorageValue(cid, str, teleports[valor].newValue)

    else

        doTeleportThing(cid, fromPosition)

        doPlayerSendCancel(cid, msgErro)

    end

    return true

end

 

Link para o comentário
Compartilhar em outros sites

  • 0

@Elias Palermo, vê agr:

local str = "storageTeleport" --storage que receberá os valores (para controlar o local para onde levará o player)local msgErro = "Você não é digno de entrar aqui." --mensagem de erro ao tentar entrar no teleport mas não ter um valor configurado na tabelalocal teleports = { --[valorDaStorage] = {pos = {POSIÇÃO-QUE-LEVARÁ,-CASO-TENHA-O-VALOR-NA-STORAGE}, newValue = NOVO-VALOR-QUE-A-STORAGE-RECEBERÁ}[-1] = {pos = {x=1024, y=652, z=9}, newValue = 300031},[0] = {pos = {x=1024, y=652, z=9}, newValue = 300031},[300031] = {pos = {x=1025, y=662, z=9}, newValue = 300032},[300032] = {pos = {x=1025, y=662, z=9}, newValue = 300031},}function onStepIn(cid, position, fromPosition)vs = {}for k, v in pairs(teleports) dotable.insert(vs, k)endvalor = getPlayerStorageValue(cid, str)	if isInArray(vs, valor) then		doTeleportThing(cid, teleports[valor].pos)		setPlayerStorageValue(cid, str, teleports[valor].newValue)	else		doTeleportThing(cid, fromPosition)		doPlayerSendCancel(cid, msgErro)	end	return trueend

 

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...