Ir para conteúdo
  • 0

Adicionar Item Com Tempo


eduardo190696

Pergunta

Opa, gostaria de saber o porque esse script que eu e um amigo fizemos junta o tempo de todos os player, tipo, a cada vez que ele da use ele soma o novo tempo de espera com o de cada player que deu use, acho que deu de intender.

 

Vou Explicar como era para funcionar, Era para o player da use uma vez, ai a chance de 1 a 100 dele ganhar o item, e só depois de 5 dias ele pudesse dar use de novo, mesmo ganhando ou não o item, E sim, eu percebi que do jeito que ta o player pode dar use até ganhar o item, e só depois adiciona o storage, por isso quero ajuda de vocês para me corrigir e me explicar no que eu errei para aprender '-'

 

Script


local AddItem = {
[2650] = {chance = 100, id = 2547, time = 3600*24*5, storage = 8123},
}
function onUse(cid, item)
for i,x in pairs(AddItem) do
if item.itemid == i then

if getPlayerStorageValue(cid, 8125) - os.time() > 0 then
return doPlayerSendCancel(cid, "You need wait [ " .. getPlayerStorageValue(cid, x.storage) - os.time() .. " ] seconds.")
else
if math.random(1, 100) == x.chance then
doPlayerAddItem(cid, 2547, 1)
setPlayerStorageValue(cid, x.storage, os.time() + x.time)
return true
end
end

end
end
return true
end

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

2 respostass a esta questão

Posts Recomendados

  • 0

vamos ao tutorial:

 

primeiro declaramos a tabela addItem e já que é uma action, deixamos a linha function onUse também:

 

local AddItem = {
[2650] = {chance = 100, id = 2547, time = 3600*24*5, storage = 8123},
}

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

end

 

Primeira coisa: você usou um for pra achar o id do item usado na tabela, não precisa usar repetições para isso, basta fazer assim:

 

local AddItem = {
[2650] = {chance = 100, id = 2547, time = 3600*24*5, storage = 8123},
}

function onUse(cid, item, frompos, item2, topos)
   local info = AddItem[item.itemid]
end

 

Pronto, já temos informações de chance/id/delay/storage, pois dessa forma já encontra na hora tal index na tabela.

Agora verificaremos se o player pode usar novamente o item desde a última vez que executou, usando o método de os.time() em storage:

No seu script inicial, não sei se você percebeu, mas essa checagem você fez usando um storage, e depois o player ao receber o item ganha outra storage, portanto o player ia poder usar indefinidamente o item

 

local AddItem = {
[2650] = {chance = 100, id = 2547, time = 3600*24*5, storage = 8123},
}

function onUse(cid, item, frompos, item2, topos)
   local info = AddItem[item.itemid]
   if getPlayerStorageValue(cid, info.storage) - os.time() > 0 then
   return doPlayerSendCancel(cid, "You have to wait "..(getPlayerStorageValue(cid, info.storage) - os.time()).." seconds to use this item again.")
   end
end

 

Agora, entenda a lógica: se o player passar pela checagem da última vez que ele usou, já adicionamos logo em seguida o storage nele para ter certeza de que ele só usará uma vez, e já tornando tudo mais rápido, o resto do script na parte de adicionar o item. Uma outra coisa que achei curioso, foi o fato de você fazer o random da seguinte maneira: "if math.random(1, 100) == x.chance then", não sei se você percebeu, mas dessa forma, independente do valor que você configurar na tabela AddItem, a chance é de 1%...

Eu particularmente gosto do método "if math.random(X) == math.random(X) then", dessa forma vocÇe obtem esse resultado:

 

math.random(1) == math.random(1) -> 100% chance de ocorrer
math.random(5) == math.random(5) -> 20% chance de ocorrer
math.random(10) == math.random(10) -> 10% chance de ocorrer
math.random(100) == math.random(100) -> 1% chance de ocorrer
math.random(1000) == math.random(1000) -> 0.1% chance de ocorrer

 

Claro que nesse método você não consegue ter tanta precisão, por exemplo colocar 35% de chance de ocorrer, só se desenvolver uma funçãozinha mais avançada, aqui o script:

 

local AddItem = {
[2650] = {chance = 100, id = 2547, time = 3600*24*5, storage = 8123},
}

function onUse(cid, item, frompos, item2, topos)
   local info = AddItem[item.itemid]
   if getPlayerStorageValue(cid, info.storage) - os.time() > 0 then
   return doPlayerSendCancel(cid, "You have to wait "..(getPlayerStorageValue(cid, info.storage) - os.time()).." seconds to use this item again.")
   end
   setPlayerStorageValue(cid, info.storage, os.time() + info.time)
   if math.random(info.chance) == math.random(info.chance) then
    doPlayerAddItem(cid, info.id, 1)
   end
return true
end

Link para o comentário
Compartilhar em outros sites

  • 0

@brun123, muito obrigado, a parte dos storages foi na hora de postar, que eu fiz burrada, mais quando testei tava certinho os 2 storages iguais.

 

Quanto a parte do math.random, eu não sabia disso, pois quando usava 100 na tabela ele sempre adicionava o item e quando botei 1 na tabela, ele começo a demorar mais para dar o item, então eu quando comecei a mexer com script, eu li em um script do matheusMkalo essa função" math.random" exatamente assim como eu escrevi ela, por isso achava que tava certo.

 

Quanto ao seu rep, eu passei do limite hoje, mais assim que der eu te dou ele.

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

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