Optei por fazer uma premiação justa - assim, é possível que haja mais de um ganhador em alguma(s) colocação(ões). Se isto ocorrer, o prêmio em dinheiro será dividido automaticamente entre os ganhadores.
Ex.:
Número sorteado: 48
Jogadores participando do evento: {Fulano, escolheu número 32}, {Ciclano, número 47}, {Error, número 49}, {Troglodita, número 30}, {zipter, número 29}.
Assim, a colocação ficará:
[1 lugar] = Ciclano e Error (o dinheiro será dividido entre ambos)
[2 lugar] = Fulano
[3 lugar] = Troglodita
A configuração, como pode ver, é simples:
winners = {
[colocação] = {cash = prêmio_em_dinheiro, items = {ID do item prêmio, quantidade do item prêmio}},
},
Enfim, vamos ao código:
Talkaction:
local storages = {8932, 8931}
local price = 100000 --Preço para participar do sorteio.
function onSay(cid, words, param)
if getGlobalStorageValue(storages[1]) < 1 then
return doPlayerSendCancel(cid, "Event is not on.")
elseif getPlayerStorageValue(cid, storages[2]) > -1 then
return doPlayerSendCancel(cid, "You already chose your number.")
elseif param == "" or not tonumber(param) or tonumber(param) < 1 or tonumber(param) > 100 then
return doPlayerSendCancel(cid, "/sorteio 1-100")
elseif getPlayerMoney(cid) < price then
return doPlayerSendCancel(cid, "You do not have enough money ("..price..").")
end
setPlayerStorageValue(cid, storages[2], tonumber(param))
doPlayerRemoveMoney(cid, price)
doPlayerSendTextMessage(cid, 27, "Agora você está participando do evento, seu número: "..param..", Aguarde o resultado, Boa sorte!")
return true
end
Tag:
<talkaction words="/sorteio" event="script" value="nome_do_arquivo.lua"/>
Globalevent:
local config = {
days = {"Monday", "Tuesday", "Saturday"}, --Dias que o evento ocorrerá.
time = 5, --Tempo para o sorteio ocorrer.
winners = {
--[place] = {cash = xxx, items = {itemid, count}},
},
storages = {8931, 8932},
}
function getRuffleNumbers(a)
local z = {}
local c = {}
for _, cid in pairs(getPlayersOnline()) do
if getPlayerStorageValue(cid, config.storages[1]) > -1 then
table.insert(z, math.abs(getPlayerStorageValue(cid, config.storages[1]) - a))
end
end
for i = 1, #config.winners do
for j = 1, #z do
if not table.find(c, z[j]) then
if not c[i] then
c[i] = z[j]
else
if z[j] < c[i] then
c[i] = z[j]
end
end
end
end
end
return c
end
function onTime()
if isInArray(config.days, os.date("%A")) then
broadcastMessage("O evento do sorteio iniciou, diga /sorteio numero(de 1 a 100) para escolher seu numero, em aproximadamente 5 minutos saira o resultado!")
setGlobalStorageValue(config.storages[2], 1)
addEvent(function()
local a = math.random(1, 100)
if #getRuffleNumbers(a) < 1 then
broadcastMessage("Ninguém participou do sorteio. :/")
setGlobalStorageValue(config.storages[2], -1)
else
broadcastMessage("E o número sorteado foi... "..a.."! Os ganhadores foram:")
local c = getRuffleNumbers(a)
for i = 1, #c do
local players, p, gold = {}, "", 0
gold = config.winners[i].cash
for _, cid in pairs(getPlayersOnline()) do
if getPlayerStorageValue(cid, config.storages[1]) > -1 then
if getPlayerStorageValue(cid, config.storages[1]) == math.abs(c[i] - a) or getPlayerStorageValue(cid, config.storages[1]) == math.abs(c[i] + a) then
table.insert(players, cid)
doPlayerAddItem(cid, config.winners[i].items[1], config.winners[i].items[2])
end
setPlayerStorageValue(cid, config.storages[1], -1)
end
end
for j = 1, #players do
gold = math.floor(config.winners[i].cash / #players)
doPlayerAddMoney(players[j], gold)
if p == "" then
p = getCreatureName(players[j])
else
p = p..(j == #players and " and" or ",").." "..getCreatureName(players[j])
end
end
broadcastMessage(i.." lugar: "..p.." - cash: "..gold.." - item: "..config.winners[i].items[2].."x "..getItemNameById(config.winners[i].items[1])..".")
end
end
local query = db.getResult("SELECT id, online FROM players")
if query:getID() == -1 then
return true
end
repeat
local online = query:getDataInt("online")
local i = query:getDataInt("id")
if online < 1 then
db.executeQuery("UPDATE player_storage SET value = -1 WHERE key = "..config.storages[1].." AND value > -1 AND player_id = "..i)
end
until not query:next()
query:free()
end, config.time * 60 * 1000)
end
return true
end
Tag:
<!-- Coloque, em time, o horário 5 minutos antes do sorteio ser realizado. -->
<!-- Por exemplo, se colocar 19:55, o sorteio vai ser realizado as 20:00. -->
<globalevent name="Sorteio" time="19:55" event="script" value="nome_do_arquivo.lua"/>
OBS: Testei o código apenas em situações hipotéticas (como aquele exemplo no começo do post) num depurador de lua.