boa tarde TK estou com um problema para adicionar um sistema de rowlet no meu servidor 8.60 OTX2 erro abaixo se puderem ajudar tmj
local config = {
actionId = 1495, -- ID DA LAVANCA
lever = {
left = 1945,
right = 1946
},
playItem = {
itemId = 2160, -- item necessário para puxar a alavanca
count = 10
},
rouletteOptions = {
rareItemChance_broadcastThreshold = 500,
ignoredItems = {1617,1485}, -- se você tiver mesas/contadores/outros itens nas peças da roleta, adicione-os aqui
winEffects = {CONST_ANI_FIRE, CONST_ME_SOUND_YELLOW, CONST_ME_SOUND_PURPLE, CONST_ME_SOUND_BLUE, CONST_ME_SOUND_WHITE}, -- o primeiro efeito precisa ser o efeito de distância
effectDelay = 33,
spinTime = {min = 8, max = 12}, -- segundos
spinSlowdownRamping = 5,
rouletteStorage = 48550 -- storage necessário para evitar abuso do jogador (se ele sair/morrer antes do final da roleta.. eles podem girar novamente de graça)
},
prizePool = {
{itemId = 2160, count = {1, 10}, chance = 100}, -- {itemId = itemid, count = {min, max}, chance = chance/10000} (crystal coins)
{itemId = 13752, count = {1, 1}, chance = 9000 }, -- crown legs
{itemId = 13753, count = {1, 1}, chance = 8500 }, -- boots of haste
{itemId = 13754, count = {1, 1}, chance = 7500 }, -- royal helmet
{itemId = 13755, count = {1, 1}, chance = 6500 }, -- old sudden death rune -- runes are given as stackable items, even tho they have 'charges'
{itemId = 13756, count = {1, 100}, chance = 5000 }, -- loot seller chest -- items with 'charges' and have 'showCharges' in items.xml will be given charges
{itemId = 13749, count = {1, 3}, chance = 4000 }, -- roulette token
{itemId = 13751, count = {1, 1}, chance = 3000 }, -- golden legs
{itemId = 13600, count = {1, 1}, chance = 1500 }, -- magic plate armor
{itemId = 13604, count = {1, 1}, chance = 500 }, -- golden boots
{itemId = 13604, count = {1, 1}, chance = 500 }, -- golden boots
{itemId = 13604, count = {1, 1}, chance = 500 } -- golden boots
},
roulettePositions = { -- 7 positions.
Position(72, 168, 8),
Position(73, 168, 8),
Position(74, 168, 8),
Position(78, 168, 8), --a posição 4 nesta lista é codificada para ser o local da recompensa, que é o item dado ao jogador
Position(75, 168, 8),
Position(76, 168, 8),
Position(77, 168, 8),
Position(78, 168, 8),
Position(79, 168, 8),
Position(80, 168, 8),
Position(81, 168, 8),
Position(82, 168, 8),
}
}
local chancedItems = {} -- used for broadcast. don't edit
local function resetLever(position)
local lever = Tile(position):getItemById(config.lever.right)
lever:transform(config.lever.left)
end
local function updateRoulette(newItemInfo)
local positions = config.roulettePositions
for i = #positions, 1, -1 do
local item = Tile(positions[i]):getTopVisibleThing()
if item and item:getId() ~= Tile(positions[i]):getGround():getId() and not table.contains(config.rouletteOptions.ignoredItems, item:getId()) then
if i ~= 12 then
item:moveTo(positions[i + 1])
else
item:remove()
end
end
end
if ItemType(newItemInfo.itemId):hasShowCharges() then
local item = Game.createItem(newItemInfo.itemId, 1, positions[1])
item:setAttribute("charges", newItemInfo.count)
else
Game.createItem(newItemInfo.itemId, newItemInfo.count, positions[1])
end
end
local function clearRoulette(newItemInfo)
local positions = config.roulettePositions
for i = #positions, 1, -1 do
local item = Tile(positions[i]):getTopVisibleThing()
if item and item:getId() ~= Tile(positions[i]):getGround():getId() and not table.contains(config.rouletteOptions.ignoredItems, item:getId()) then
item:remove()
end
if newItemInfo == nil then
positions[i]:sendMagicEffect(CONST_ME_POFF)
else
if ItemType(newItemInfo.itemId):hasShowCharges() then
local item = Game.createItem(newItemInfo.itemId, 1, positions[i])
item:setAttribute("charges", newItemInfo.count)
else
Game.createItem(newItemInfo.itemId, newItemInfo.count, positions[i])
end
end
end
end
local function chanceNewReward()
local newItemInfo = {itemId = 0, count = 0}
local rewardTable = {}
while #rewardTable < 1 do
for i = 1, #config.prizePool do
if config.prizePool[i].chance >= math.random(10000) then
rewardTable[#rewardTable + 1] = i
end
end
end
local rand = math.random(#rewardTable)
newItemInfo.itemId = config.prizePool[rewardTable[rand]].itemId
newItemInfo.count = math.random(config.prizePool[rewardTable[rand]].count[1], config.prizePool[rewardTable[rand]].count[2])
chancedItems[#chancedItems + 1] = config.prizePool[rewardTable[rand]].chance
return newItemInfo
end
local function initiateReward(leverPosition, effectCounter)
if effectCounter < #config.rouletteOptions.winEffects then
effectCounter = effectCounter + 1
if effectCounter == 1 then
config.roulettePositions[1]:sendDistanceEffect(config.roulettePositions[4], config.rouletteOptions.winEffects[1])
config.roulettePositions[7]:sendDistanceEffect(config.roulettePositions[4], config.rouletteOptions.winEffects[1])
else
for i = 1, #config.roulettePositions do
config.roulettePositions[i]:sendMagicEffect(config.rouletteOptions.winEffects[effectCounter])
end
end
if effectCounter == 2 then
local item = Tile(config.roulettePositions[4]):getTopVisibleThing()
local newItemInfo = {itemId = item:getId(), count = item:getCount()}
clearRoulette(newItemInfo)
end
addEvent(initiateReward, config.rouletteOptions.effectDelay, leverPosition, effectCounter)
return
end
resetLever(leverPosition)
end
local function rewardPlayer(playerId, leverPosition)
local player = Player(playerId)
if not player then
return
end
local item = Tile(config.roulettePositions[4]):getTopVisibleThing()
if ItemType(item:getId()):hasShowCharges() then
local addedItem = player:addItem(item:getId(), 1, true)
addedItem:setAttribute("charges", item:getCharges())
else
player:addItem(item:getId(), item:getCount(), true)
end
player:setStorageValue(config.rouletteOptions.rouletteStorage, -1)
if chancedItems[#chancedItems - 3] <= config.rouletteOptions.rareItemChance_broadcastThreshold then
Game.broadcastMessage("The player " .. player:getName() .. " has won " .. item:getName() .. " from the roulette!", MESSAGE_EVENT_ADVANCE)
end
end
local function roulette(playerId, leverPosition, spinTimeRemaining, spinDelay)
local player = Player(playerId)
if not player then
resetLever(leverPosition)
return
end
local newItemInfo = chanceNewReward()
updateRoulette(newItemInfo)
if spinTimeRemaining > 0 then
spinDelay = spinDelay + config.rouletteOptions.spinSlowdownRamping
addEvent(roulette, spinDelay, playerId, leverPosition, spinTimeRemaining - (spinDelay - config.rouletteOptions.spinSlowdownRamping), spinDelay)
return
end
initiateReward(leverPosition, 0)
rewardPlayer(playerId, leverPosition)
end
local casinoRoulette = Action()
function casinoRoulette.onUse(player, item, fromPosition, target, toPosition, isHotkey)
if item:getId() == config.lever.right then
player:sendTextMessage(MESSAGE_STATUS_SMALL, "A Roleta do Cassino está em andamento. Por favor, aguarde.")
return true
end
if player:getItemCount(config.playItem.itemId) < config.playItem.count then
if player:getStorageValue(config.rouletteOptions.rouletteStorage) < 1 then
player:sendTextMessage(MESSAGE_STATUS_SMALL, "A Roleta do Cassino requer " .. config.playItem.count .. " " .. (ItemType(config.playItem.itemId):getName()) .. " usar.")
return true
end
-- player:sendTextMessage(MESSAGE_STATUS_SMALL, "Free Spin being used due to a previous unforeseen error.")
end
item:transform(config.lever.right)
clearRoulette()
chancedItems = {}
player:removeItem(config.playItem.itemId, config.playItem.count)
player:setStorageValue(config.rouletteOptions.rouletteStorage, 1)
local spinTimeRemaining = math.random((config.rouletteOptions.spinTime.min * 1000), (config.rouletteOptions.spinTime.max * 1000))
roulette(player:getId(), toPosition, spinTimeRemaining, 100)
return true
end
casinoRoulette:aid(config.actionId)
casinoRoulette:register()
local disableMovingItemsToRoulettePositions = EventCallback
disableMovingItemsToRoulettePositions.onMoveItem = function(self, item, count, fromPosition, toPosition, fromCylinder, toCylinder)
for v, k in pairs(config.roulettePositions) do
if toPosition == k then
return false
end
end
return true
end
disableMovingItemsToRoulettePositions:register()