ED
resolvido

Private Hunting - Sistema

Por EddyHavaiano, 06 de jan. de 2016 em Scripts

script
33
6.5k
SkullsS
07 de janeiro de 2016 às 21:24

Acho que o que ele ta falando é que é um pouco injusto, caso eu precise logar e acabei de entrar na hunt, eu perdê-la.

DanihcvD
07 de janeiro de 2016 às 21:27

Sim. Acaba sendo um pouco injusto, exatamente como o @@Skulls falou.

 

*edit: se ngm postar um script mais "justo", eu acho que posto em breve.

Editado Janeiro 7 por Danihcv

jvcasarinJ
07 de janeiro de 2016 às 21:32

Tenho quase certeza que é só trocar aquela tag do login.lua por:

if getCreatureStorage(cid, 5834) == -1 then
	doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
end

Quase certeza ^^

DanihcvD
07 de janeiro de 2016 às 21:40

@, na vdd não... Pois quando o player deslogar, ele vai interromper/cancelar o addEvent. E então ele ficará com a storage em 1 para sempre ao relogar.

SkullsS
07 de janeiro de 2016 às 21:47

acho que tneho uma solução

Editado Janeiro 7 por Skulls

jvcasarinJ
07 de janeiro de 2016 às 21:55

Não sei então como.. Mas o que eu postei ele apenas checaria se estivesse como -1, e então teleportava pro templo, não?

SkullsS
07 de janeiro de 2016 às 22:06

@

Sim, mas a partir do momento que ele loga o addevent para de valer, então quando ele voltar ele ainda vai ter o storage value 1, ou seja, acesso à hunt, mas sem a contagem regressiva que faria com que ele fosse retirado de lá ao final do tempo.

 

Faz o seguinte, cria um storage pra controlar o tempo.

local position = {x = 123, y = 456, z = 7}
local templepos = {x = 123, y = 456, z = 7}
local tempo = 10 * 60

function reduceTime()
doCreatureSetStorage(cid, 5835, getCreatureStorage(cid, 5835) - 1)
addEvent(reduceTime, 1000)
end
function onUse(cid)
doTeleportThing(cid, position)
doCreatureSetStorage(cid, 5834, 1)
doCreatureSetStorage(cid, 5835, tempo)
addEvent( function() 
doTeleportThing(cid, templepos) 
doPlayerSendTextMessage(cid, 22, "Seu tempo acabou, e foi transportado de volta ao templo!") 
doCreatureSetStorage(cid, 5834, -1) 
end, 1000 * tempo)

addEvent(reduceTime, 1000)
return true 
end

E la em login você altera pra isso:

tempo = getCreatureStorage(cid, 5834)

if getCreatureStorage(cid, 5834) == 1 then
addEvent( function()
doTeleportThing(cid, templepos)
doPlayerSendTextMessage(cid, 22, "Seu tempo acabou, e foi transportado de volta ao templo!")
doCreatureSetStorage(cid, 5834, -1)
end, 1000 * tempo)

addEvent(reduceTime, 1000)
end

Não testei, mas isso deve dar, acredito eu.

Editado Janeiro 7 por Skulls

DanihcvD
07 de janeiro de 2016 às 23:06

Na vdd... Nem precisa complicar tanto.. sahusahuasuh

 

É só usar os.time:

script:

local position = {x = 123, y = 456, z = 7}
local templepos = {x = 123, y = 456, z = 7}
local tempo = 10

function onUse(cid)

    doTeleportThing(cid, position)
    doCreatureSetStorage(cid, 5834, os.time()+tempo)
    addEvent(    function()
                    doTeleportThing(cid, templepos)
                    doPlayerSendTextMessage(cid, 22, "Seu tempo acabou, e foi transportado de volta ao templo!")
                    doCreatureSetStorage(cid, 5834, -1)
                end, 1000 * tempo)
    return true
end

parte do login.lua:

local tempo = 10 --tem que ser o mesmo tempo usado na script da action
if os.time() >= getCreatureStorage(cid, 5834) then
    doCreatureSetStorage(cid, 5834, -1)
    doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
end

#edit: correção na logica...

Editado Janeiro 7 por Danihcv

jvcasarinJ
07 de janeiro de 2016 às 23:12

Dani, tem como vc me explicar oq significa os.time e como usa? Pq eu não achei NENHUM tutorial que me ajuda viu.. Pqp NENHUM

DanihcvD
07 de janeiro de 2016 às 23:14

@, ao usar os.time(), o comando retorna a quantidade de segundos que se passaram desde o dia 1 de janeiro de 1970 até o presente momento (em que o comando foi requisitado)

Editado Janeiro 7 por Danihcv

CaronteC
07 de janeiro de 2016 às 23:19

Não sei para que isso tudo, o player que deslogar não tem nenhuma intenção em fazer a hunt.

se ele clicou no item é porque ele quer fazer a hunt..., fiz isso só para ninguém burlar.

 

 

@@Danihcv, não se esqueça que a variável tempo não está no login.lua

 

 

 

#edit: correção na logica...

 

huehehueehu, já ia falar.

 

 

 

Dani, tem como vc me explicar oq significa os.time e como usa? Pq eu não achei NENHUM tutorial que me ajuda viu.. Pqp NENHUM

 

Bom como meu nome é Daniel, vou responder essa: o os.time() é uma função que quando você chama ela sem parametros ela retornar números que significam uma data, só que codificados, e mudam a cada segundo...

 

Veja aqui:

http://www.lua.org/pil/22.1.html

Night WolfN
08 de janeiro de 2016 às 00:49

editado: não tinha lido a ultima página.. já falaram do os.time(). foi mal.

Editado Janeiro 8 por Night Wolf

SkullsS
08 de janeiro de 2016 às 08:51

Não sei para que isso tudo, o player que deslogar não tem nenhuma intenção em fazer a hunt.

se ele clicou no item é porque ele quer fazer a hunt..., fiz isso só para ninguém burlar.

 

 

@@Danihcv, não se esqueça que a variável tempo não está no login.lua

 

 

 

 

huehehueehu, já ia falar.

 

 

 

 

Bom como meu nome é Daniel, vou responder essa: o os.time() é uma função que quando você chama ela sem parametros ela retornar números que significam uma data, só que codificados, e mudam a cada segundo...

 

Veja aqui:

http://www.lua.org/pil/22.1.html

Caronte, eu entendo seu lado. Se o cara usou o trem que esteja apto a fazê-lo naquele momento.

Mas por outro lado, imagina você em um jogo que você curte pra caramba, realizou uma tarefa difícil e ganhou 15 minutos em um respaw único.

Ai, por infelicidade, 2 minutos após entrar no respaw o transformador da sua rua explode. Seria legal se conseguissem recuperar os 13 minutos restantes pra você, né?

 

Na vdd... Nem precisa complicar tanto.. sahusahuasuh

 

É só usar os.time:

script:

local position = {x = 123, y = 456, z = 7}
local templepos = {x = 123, y = 456, z = 7}
local tempo = 10

function onUse(cid)

    doTeleportThing(cid, position)
    doCreatureSetStorage(cid, 5834, os.time()+tempo)
    addEvent(    function()
                    doTeleportThing(cid, templepos)
                    doPlayerSendTextMessage(cid, 22, "Seu tempo acabou, e foi transportado de volta ao templo!")
                    doCreatureSetStorage(cid, 5834, -1)
                end, 1000 * tempo)
    return true
end

parte do login.lua:

local tempo = 10 --tem que ser o mesmo tempo usado na script da action
if os.time() >= getCreatureStorage(cid, 5834) then
    doCreatureSetStorage(cid, 5834, -1)
    doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
end

#edit: correção na logica...

hauehuaehuae Eu imaginei mesmo que tinha um jeito mais fácil.

7 anos sem mexer, jamais lembraria do os.time

Me ajuda a relembrar aqui, eu uso ele pra comparar 2 instantes de tempo, correto? A diferença entre o instante 1 e o instante 2 é a diferença, em segundos, dos dois instantes de tempo. É isso mesmo?

 

Editado: Se eu me lembro direito do os.time, acho que tem algumas inconsistências no script que você passou.

1. doCreatureSetStorage(cid, 5834, os.time()+tempo) deveria ser doCreatureSetStorage(cid, 5834, os.time()+tempo*1000)

2. O que você fez na verdade não devolve o tempo ao player, só garante que ele vai ter 15 minutos corridos de hunt após usar o item. Então, caso a casa dele exploda e ele queira fazer a hunt amanhã, ele perdeu o tempo do mesmo jeito, correto?

 

Acho que um jeito simples de resolver isso seria fazer quando o player deslogar a verificação do storage. Se ele não for -1, sinal que o tempo não acabou, então ao deslogar ele faz a comparação entre o storage armazenado e o os.time no instante de logout e encontra o tempo restante, altera o storage para esse tempo. Quando ele logar novamente, ele verifica que o storage não é -1, logo esta em uso, pega o os.time daquele instante soma ao valor do storage (que é o valor em segundos do tempo restante), altera novamente o storage para esse novo valor e chama um novo evento com o novo valor de tempo (o que foi guardado no logout).

 

Basicamente:

 

onLogout()

if getCreatureStorage(cid, 5834) ~= -1 then

doCreatureSetStorage(cid, 5834, getCreatureStorage(cid, 5834) - os.time())

end

 

onLogin()

if getCreatureStorage(cid, 5834) ~= -1 then

tempoRestante = getCreatureStorage(cid, 5834)

doCreatureSetStorage(cid, 5834, tempoRestante + os.time())

 

addEvent( function()

doTeleportThing(cid, templepos)

doPlayerSendTextMessage(cid, 22, "Seu tempo acabou, e foi transportado de volta ao templo!")

doCreatureSetStorage(cid, 5834, -1)

end, tempoRestante)

end

 

Acredito que algo assim funcione. Caso eu tenha entendido errado, por favor me explique! :p

Editado Janeiro 8 por Skulls

DanihcvD
08 de janeiro de 2016 às 14:29

@@Skulls, sobre multiplicar por 1000, isso não é necessario, pois o os.time retorna o valor em segundos e não em milissegundos. Sobre uma certa injustiça permanecer no meu script, isso está correto. Não havia pensado na possibilidade de "pausar" o tempo de uso... hehehehe

Seus scripts me parecem ter uma certa inconsistência tb (acredito que pela falta de pratica, que tb é o meu caso :p). Segue os novos codigos:


@[member=Sekk],

Adicione uma tag ao arquivo creaturescripts.xml:


<event type="logout" name="questLogout" event="script" value="arquivo.lua"/>

Agora crie um arquivo.lua em creaturescripts\scripts:

function onLogout(cid)

   if getCreatureStorage(cid, 5834) ~= -1 then
       doCreatureSetStorage(cid, 5834, getCreatureStorage(cid, 5834)-os.time())
   end
return true
end

parte para por no login.lua:

if getCreatureStorage(cid, 5834) ~= -1 then
    tempoRestante = getCreatureStorage(cid, 5834)
    doCreatureSetStorage(cid, 5834, tempoRestante + os.time())

 addEvent(    function()
                    doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
                    doPlayerSendTextMessage(cid, 22, "Seu tempo acabou, e foi transportado de volta ao templo!")
                    doCreatureSetStorage(cid, 5834, -1)
                end, tempoRestante*1000)
end

#edit: correção na logica...

Editado Janeiro 8 por Danihcv

SkullsS
08 de janeiro de 2016 às 15:19

 

@@Skulls, sobre multiplicar por 1000, isso não é necessario, pois o os.time retorna o valor em segundos e não em milissegundos. Sobre uma certa injustiça permanecer no meu script, isso está correto. Não havia pensado na possibilidade de "pausar" o tempo de uso... hehehehe

 

Seus scripts me parecem ter uma certa inconsistência tb (acredito que pela falta de pratica, que tb é o meu caso :p). Segue os novos codigos:

 

 

@[member=Sekk],

 

Adicione uma tag ao arquivo creaturescripts.xml:

<event type="logout" name="questLogout" event="script" value="arquivo.lua"/>

Agora crie um arquivo.lua em creaturescripts\scripts:

function onLogout(cid)

   if getCreatureStorage(cid, 5834) ~= -1 then
       doCreatureSetStorage(cid, 5834, os.time()-getCreatureStorage(cid, 5834))
   end
return true
end

parte para por no login.lua:

if getCreatureStorage(cid, 5834) ~= -1 then
    tempoRestante = getCreatureStorage(cid, 5834)
    doCreatureSetStorage(cid, 5834, tempoRestante + os.time())

 addEvent(    function()
                    doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
                    doPlayerSendTextMessage(cid, 22, "Seu tempo acabou, e foi transportado de volta ao templo!")
                    doCreatureSetStorage(cid, 5834, -1)
                end, tempoRestante*1000)
end

Ah, bem pontuado. Não sabia que era em miliseconds.

Obrigado por ajustar bonitinho e colocar a tag do logout. Tenho um pouco de preguiça, mas acho que passei a ideia que queria, falta de prática é triste rs. Com relação a mudança que você fez, acredito que seja o storage - os.time mesmo, pois se o tempo não acabou (isto é, storage diferente de -1) então significa que o os.time atual é menor do que o valor do storage, o que resultaria num valor negativo se realizarmos os.time - storage, não?