Lua:
local POLL_STORAGE = 80000
local OPTIONS_STORAGE = 80001
local PLAYER_STORAGE = 80000
local function getTotalVotes()
local options = table.unserialize(getStorage(OPTIONS_STORAGE))
local amount = 0
for _, option in ipairs(options) do
amount = amount + option[2]
end
return amount
end
local function getMostVotedOption()
local options = table.unserialize(getStorage(OPTIONS_STORAGE))
local value, ret = 0
for _, option in ipairs(options) do
if option[2] > value then
value = option[2]
ret = option[1]
end
end
return ret
end
function onSay(cid, words, param, channel)
param = param or ""
if param == "" and not words == "/poll" then
return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "The command ".. words .." need parameters.")
end
local parameters, vote = {}
if(words == "/newpoll") then
if getStorage(POLL_STORAGE) ~= -1 then
return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, but there is a poll in progress.\nIf you want to start a new poll, type /endpoll.")
end
parameters = string.explode(param, ",")
if #parameters < 3 then
return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "The command /newpoll needs a poll and at least two options.")
end
if parameters[1] then
local options = {}
for i = 2, #parameters do
table.insert(options, {parameters[i], 0})
end
if #options < 2 then
return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Insert at least two options after the poll")
end
doSetStorage(POLL_STORAGE, parameters[1])
options = table.serialize(options)
doSetStorage(OPTIONS_STORAGE, options)
doBroadcastMessage("A new poll is in progress with the title '".. getStorage(POLL_STORAGE) .."?'!\nSee the status with /poll and vote with /vote.")
end
elseif(words == "/vote") then
vote = tonumber(param) or -1
local options = table.unserialize(getStorage(OPTIONS_STORAGE))
if getStorage(POLL_STORAGE) == -1 then
return doPlayerSendCancel(cid, "There is not a poll in progress.")
end
if vote == -1 then
return doPlayerSendCancel(cid, "You need to choose a option to vote.")
end
if getCreatureStorage(cid, PLAYER_STORAGE) == 1 then
print(getCreatureStorage(cid, PLAYER_STORAGE))
return doPlayerSendCancel(cid, "You cannot vote two times.")
end
if vote > #options then
return doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE)
end
options[vote][2] = options[vote][2] + 1
doSetStorage(OPTIONS_STORAGE, table.serialize(options))
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have voted in the option ".. options[vote][1] .." successfully!")
doCreatureSetStorage(cid, PLAYER_STORAGE, 1)
elseif(words == "/poll") then
local options = table.unserialize(getStorage(OPTIONS_STORAGE))
if getStorage(POLL_STORAGE) == -1 then
return doPlayerSendCancel(cid, "There is not a poll in progress.")
end
local text = "ADVANCED poll SYSTEM\n\n".. getStorage(POLL_STORAGE) .."?\n"
local count = 1
for _, option in ipairs(options) do
text = text .."\n#".. count .." ".. option[1] .." ".. (getTotalVotes() == 0 and 0 or math.floor((option[2]/getTotalVotes()) * 100)) .."%\n"
count = count + 1
end
doPlayerPopupFYI(cid, text)
elseif(words == "/endpoll") then
if getStorage(POLL_STORAGE) == -1 then
return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "There is not a poll to be ended.")
end
if not getMostVotedOption() then
return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wait at least one vote to end this poll.")
end
doBroadcastMessage("The poll '".. getStorage(POLL_STORAGE) .."?' has been finished!\nThe most voted option was ".. getMostVotedOption() ..".")
doSetStorage(POLL_STORAGE, -1)
doSetStorage(OPTIONS_STORAGE, -1)
for _, player in ipairs(getPlayersOnline()) do
doCreatureSetStorage(player, PLAYER_STORAGE, -1)
end
db.executeQuery("UPDATE `player_storage` SET value = -1 WHERE `key` = ".. PLAYER_STORAGE ..";")
end
return true
end
XML:
[13/03/2024 15:04:59] [Error - TalkAction Interface]
[13/03/2024 15:04:59] data/talkactions/scripts/toptop.lua:onSay
[13/03/2024 15:04:59] Description:
[13/03/2024 15:04:59] data/talkactions/scripts/toptop.lua:15: attempt to call field 'unserialize' (a nil value)
[13/03/2024 15:04:59] stack traceback:
[13/03/2024 15:04:59] data/talkactions/scripts/toptop.lua:15: in function 'getMostVotedOption'
[13/03/2024 15:04:59] data/talkactions/scripts/toptop.lua:103: in function <data/talkactions/scripts/toptop.lua:27>