RO

[Tutorial] Cooldown com Storage

Por Roksas, 23 de abr. de 2013 em Tutoriais de Scripting

tibia
otserv
11
4.1k
RoksasR
23 de abril de 2013 às 16:51

Cooldown com Storage

 

 

divisor.png

Saudações caros XTibianos, neste tópico ensinarei á vocês como criar um sisteminha de cooldown, seja ele oque for, movements, actions, talkactions.

 

 

 

Começando

 

divisor.png

Primeiramente, vocês devem ter uma leve noção sobre storages. Apartir disto, vamos á uns exemplos:

 

function onUse(cid, item, frompos, item2, topos)
doCreatureAddMana(cid, 100)
return true
end

 

Nesse código, ao usarmos X item iremos healar 100 de mana. Mas o player pode ficar clicando 500x que não vai ter um intervalo, ele vai sempre ficar healando, isso prejudica o game.

 

Mas como podemos fazer para ele poder usar de X em Xtempo? Com esta simples lógica:

 

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

if getPlayerStorageValue(cid, 1234) < os.time () then
doCreatureAddMana(cid, 100)
setPlayerStorageValue(cid, 1234, os.time () + 10)
else
doPlayerSendCancel(cid, "Aguarde 10 segundos para utilizar novamente!")
end
return true
end

 

OU:

 

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

if getPlayerStorageValue(cid, 1234) > os.time () then
doPlayerSendCancel(cid, "Aguarde 10 segundos!")
return true
end

doCreatureAddMana(cid, 100)
setPlayerStorageValue(cid, 1234, os.time() + 10)

 

Oque entendemos disso? É como se fosse uma quest, vai ganhar uma storage ao usar o item.

Ok, mas e daí?

 

setPlayerStorageValue(cid, 1234, os.time () + 10)

 

Os valores das storages podem ser strings (letras e/ou palavras) e muitas outras coisas.

 

Vocês devem estar acostumados com:

 

setPlayerStorageValue(cid, 1234, 1)

 

Também é certo, mas no exemplo que usei, você vai pegar o os.time() e dar a ele +10.

 

Mas, oque é os.time?

 

O os.time() é uma função da biblioteca "OS", que pega os segundos no exato momento em que declarou ele, ou seja:

 

setPlayerStorageValue(cid, 1234, os.time () + 10)

 

os.time() vai pegar os segundos de AGORA, e dar + 10.

 

E então, os.time () + 10 vai ser como uma contagem regressiva, a cada segundo vai caindo 1, até chegar no 0, ou seja sobrar apenas o os.time()

 

E aí o player vai poder usar novamente o item. Legal né? Vamos a mais uns exemplos:

 

function onSay(cid, words, param)

if getPlayerStorageValue(cid, 3210) > os.time() then
doPlayerSendTextMessage(cid, 27, "Você ainda está com cooldown.")
return true
end

doPlayerAddItem(cid, 2160, 1)
setPlayerStorageValue(cid, 3210, os.time () + 10)
end

 

No começo do código verificamos se a storage 3210 do player que executou a talkaction é MAIOR (>) que o os.time().

 

Se for vai mandar uma mensagem avisando, se não for vai adicionar 1 crystal coin ao player.

Depois que adicionar vamos atribuir á ele a storage:

 

setPlayerStorageValue(cid, 3210, os.time () + 10)

 

E aí começa a contagem dos 10 segundos, até o os.time() estiver peladinho :)

 

 

 

Finalizações

 

divisor.png

Só isso galerinha, espero que tenham entendido, caso eu tenha esquecido de algo só avisar, demais dúvidas estou aqui para atendê-los, beijo grande!

LuckOakeL
23 de abril de 2013 às 17:12

Rapaz, não acha mais fácil usar exhaustion.set(cid, storage, time), exhaustion.check(cid, storage) e exhaustion.get(cid, storage)?

 

OBS: O tutorial não passou pela aprovação ainda.

Editado Abril 23 por LuckOake

RoksasR
23 de abril de 2013 às 17:13

Acho, mas, infelizmente nunca funciona comigo, rsrs.

FenixBorgesF
24 de abril de 2013 às 01:37

Roksas, sempre trazendo ótimos conteúdos e ajudando a galéra!

Intão né cara, eu acho que você deveria explicar no tutorial, como e onde adicionar

esse "Cooldown" em algum Iten, pois muitos iniciantes/e ou usuários nóvos não intende disso.

Bom, eu pelomenos que só me dou bem com Mapping, até que tenho uma noçãozinha

de Storages, por mexer com Ot servers por um "longo" tempo.

Por mim aprovado, mas ségue oque eu te falei que vai deixar o tutorial muito mais claro. (para quem ta começando)

Flw.

Editado Abril 24 por FenixBorges

RoksasR
24 de abril de 2013 às 12:56

Eu dei esse exemplo usando a função onUse, leia novamente o tópico.

Creio que para entender melhor isso deve ter uma certa noção com storages.

GearsG
24 de abril de 2013 às 12:59

Serio, eu acho que com exhaustion.set ficaria menorzin, talvez não funcione com você porque você um algum tipo de servidor que não tenha isso.

 

 

 

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

   if exhaustion.check(cid, 1234) then
       doPlayerSendCancel(cid, "Aguarde 10 segundos!")
       return true
   end
   doCreatureAddMana(cid, 100)
   exhaustion.set(cid, 1234, 100)
end
end

RoksasR
24 de abril de 2013 às 13:02

No caso ficaria do mesmo tamanho, são 2 linhas, uma a verificar a outra a setar.

Obrigado galerinha.

GearsG
24 de abril de 2013 às 13:05

No caso ficaria do mesmo tamanho, são 2 linhas, uma a verificar a outra a setar.

Obrigado galerinha.

Menor de se ler.

SlicerS
24 de abril de 2013 às 13:08

provavel q o roks teste o exhaustion com GOD kkk -querem apostar?-

RoksasR
24 de abril de 2013 às 13:09

Ainda não cheguei a este ponto.

kttallanK
24 de abril de 2013 às 16:41

Gostei Do Tutorial Por Mim Aprovado ;D