[Actions] Cassino/slot machine - paulim78 - 17-08-2025
Resumo:
- O jogador paga 250 Event Coins para jogar.
- São sorteados 3 itens com base em probabilidades diferentes (peso).
- Se os 3 itens saírem iguais → o jogador ganha aquele item e o servidor anuncia o prêmio em broadcast.
- Caso contrário → o jogador perde a aposta.
- Inclui efeitos visuais no chão, animações e cooldown (para evitar spam).
- O sistema remove as moedas automaticamente e mostra os itens sorteados em tiles definidos no mapa.
Codigo:
Show Content
Spoiler
local positions = {
{x = 1529, y = 1883, z = 9},
{x = 1531, y = 1883, z = 9},
{x = 1533, y = 1883, z = 9}
}
local price = 250 -- Preço em Event Coins para jogar
local eventcoins = 2160 -- ID do Event Coin
-- Itens com pesos diferentes (probabilidades personalizadas)
local weightedItems = {
{id = 2006, weight = 80, name = "Vial"}, -- 50% de chance (comum)
{id = 1987, weight = 70, name = "Bag"}, -- 20% de chance (pouco raro)
{id = 2036, weight = 52, name = "Watch"}, -- 15% de chance (raro)
{id = 1974, weight = 45, name = "Book"}, -- 10% de chance (muito raro)
{id = 2145, weight = 40, name = "Small Diamound"}, -- 5% de chance (ultra raro)
{id = 12638, weight = 30, name = "dragonfruit"},
{id = 2157, weight = 20, name = "Gold Nugget"},
{id = 12640, weight = 5, name = "Penaut"}
}
-- Função para sortear um item baseado no peso
local function getRandomWeightedItem()
local totalWeight = 0
for _, item in ipairs(weightedItems) do
totalWeight = totalWeight + item.weight
end
local randomValue = math.random(1, totalWeight)
local currentWeight = 0
for _, item in ipairs(weightedItems) do
currentWeight = currentWeight + item.weight
if randomValue <= currentWeight then
return item.id, item.name
end
end
return weightedItems[1].id, weightedItems[1].name -- Fallback (nunca deve acontecer)
end
local function cleanTile(pos)
local tile = Tile(pos)
if not tile then return end
for _, item in ipairs(tile:getItems() or {}) do
-- Garante que não remova criaturas ou outros objetos inválidos
if item and item:isItem() then
item:remove()
end
end
end
function onUse(cid, item, fromPosition, itemEx, toPosition)
-- Verifica se o jogador pode apostar
if getGlobalStorageValue(722404) > os.time() then
doPlayerSendCancel(cid, "Aguarde um pouco para apostar.")
return true
end
-- Verifica se tem Event Coins suficientes
if getPlayerItemCount(cid, eventcoins) < price then
doPlayerSendCancel(cid, "Você precisa de " .. price .. " Event Coins para jogar.")
return true
end
-- Cooldown individual do jogador
if getPlayerStorageValue(cid, 722406) > os.time() then
doPlayerSendCancel(cid, "Aguarde um pouco para jogar novamente.")
return true
end
doPlayerSetStorageValue(cid, 722406, os.time() + 6)
-- Cooldown global (evita spam)
setGlobalStorageValue(722404, os.time() + 6)
-- Efeitos visuais antes do sorteio
for i = 1, #positions do
doSendMagicEffect(positions[i], 22)
end
-- Remove as Event Coins
doPlayerRemoveItem(cid, eventcoins, price)
doTransformItem(item.uid, item.itemid == 9825 and 9826 or 9825)
-- Sorteia os 3 itens (com probabilidades diferentes)
local first, firstName = getRandomWeightedItem()
local second, secondName = getRandomWeightedItem()
local third, thirdName = getRandomWeightedItem()
local tab = {}
-- Cria e mostra os itens sorteados
doCreateItem(first, 1, positions[1])
doSendMagicEffect(positions[1], 26)
addEvent(doSendMagicEffect, 100, positions[1], 31)
table.insert(tab, first)
addEvent(function()
doCreateItem(second, 1, positions[2])
doSendMagicEffect(positions[2], 26)
addEvent(doSendMagicEffect, 100, positions[2], 31)
table.insert(tab, second)
end, 1700)
addEvent(function()
doCreateItem(third, 1, positions[3])
doSendMagicEffect(positions[3], 26)
addEvent(doSendMagicEffect, 100, positions[3], 31)
table.insert(tab, third)
end, 2000)
-- Verifica se ganhou (3 itens iguais)
addEvent(function()
-- Limpa os itens do chão
cleanTile(positions[1])
cleanTile(positions[2])
cleanTile(positions[3])
doSendMagicEffect(positions[1], 54)
doSendMagicEffect(positions[2], 54)
doSendMagicEffect(positions[3], 54)
if tab[1] == tab[2] and tab[1] == tab[3] then
-- Ganhou! Recebe o item.
doPlayerAddItem(cid, tab[1], 1)
doPlayerSendTextMessage(cid, 27, "Você ganhou um(a) " .. firstName .. "! Parabéns!")
doBroadcastMessage("O jogador " .. getCreatureName(cid) .. " ganhou um(a) " .. firstName .. " no cassino!", MESSAGE_EVENT_ADVANCE)
-- Efeitos de vitória
doSendAnimatedText(getThingPos(cid), "GANHOU!", 215)
doSendMagicEffect(getThingPos(cid), CONST_ME_FIREWORK_BLUE)
doSendMagicEffect(positions[1], CONST_ME_FIREWORK_YELLOW)
doSendMagicEffect(positions[2], CONST_ME_FIREWORK_RED)
doSendMagicEffect(positions[3], CONST_ME_FIREWORK_GREEN)
else
-- Perdeu
doSendAnimatedText(getThingPos(cid), "PERDEU!", TEXTCOLOR_RED)
doSendMagicEffect(getThingPos(cid), CONST_ME_POFF)
end
end, 4200)
return true
end
Foto:
![[Imagem: Captura-de-tela-2025-08-17-144206.png]](https://i.ibb.co/bj3PHyJg/Captura-de-tela-2025-08-17-144206.png)
Como Configurar.
1- Posições dos itens exibidos.
Citação:local positions = {
{x = 1529, y = 1883, z = 9},
{x = 1531, y = 1883, z = 9},
{x = 1533, y = 1883, z = 9}
}
Onde os 3 itens do sorteio vão aparecer no chão.
2- Preço para jogar e moeda usada.
Citação:local price = 250 -- Preço em Event Coins
local eventcoins = 2160 -- ID do item usado como moeda
Você define quanto custa jogar e qual item será usado como moeda (pode trocar por gold, tokens, etc).
3- Itens e probabilidades (peso).
Citação:local weightedItems = {
{id = 2006, weight = 80, name = "Vial"},
{id = 1987, weight = 70, name = "Bag"},
{id = 2036, weight = 52, name = "Watch"},
{id = 1974, weight = 45, name = "Book"},
{id = 2145, weight = 40, name = "Small Diamond"},
{id = 12638, weight = 30, name = "Dragonfruit"},
{id = 2157, weight = 20, name = "Gold Nugget"},
{id = 12640, weight = 5, name = "Peanut"}
}
Cada item tem um peso (probabilidade).- Quanto maior o weight, mais fácil de sair.
- Quanto menor, mais raro.
Exemplo: weight = 80 é bem comum, weight = 5 é super raro.
4- Cooldowns.
Citação:-- Global cooldown (todos os players): 6 segundos
setGlobalStorageValue(722404, os.time() + 6)
-- Cooldown individual (por player): 6 segundos
doPlayerSetStorageValue(cid, 722406, os.time() + 6)
Tempo mínimo entre apostas para evitar flood.
Em resumo: você consegue configurar onde aparece, quanto custa, qual moeda usar, quais itens podem sair e suas chances de sorteio.
Creditos:
Fiapo
|