• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

TFS 0.X 0.4 8.60 - Advanced Poll System error HELP

Enderlop

Banned User
Joined
Jan 10, 2024
Messages
93
Reaction score
16
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>
 
Yes....table.unserialize is probably the older way to unserialize json, but it appears he doesn't have the table method. Whether or not he has the JSON lib is a different question.. xD
 
I use these commands and none of them worked

XML:
<talkaction log="yes" words="/newpoll;/endpoll" access="5" event="script" value="pollsystem.lua"/>
<talkaction words="/vote;/poll" event="script" value="pollsystem.lua"/>
 

/poll

[13/03/2024 19:59:33] [Error - TalkAction Interface]
[13/03/2024 19:59:33] data/talkactions/scripts/pollsystem.lua:onSay
[13/03/2024 19:59:33] Description:
[13/03/2024 19:59:33] data/talkactions/scripts/pollsystem.lua:86: attempt to call field 'unserialize' (a nil value)
[13/03/2024 19:59:33] stack traceback:
[13/03/2024 19:59:33]     data/talkactions/scripts/pollsystem.lua:86: in function <data/talkactions/scripts/pollsystem.lua:27>
 


/endpoll

[13/03/2024 19:54:26] [Error - TalkAction Interface]
[13/03/2024 19:54:26] data/talkactions/scripts/pollsystem.lua:onSay
[13/03/2024 19:54:26] Description:
[13/03/2024 19:54:26] data/talkactions/scripts/pollsystem.lua:15: attempt to call field 'unserialize' (a nil value)
[13/03/2024 19:54:26] stack traceback:
[13/03/2024 19:54:26]     data/talkactions/scripts/pollsystem.lua:15: in function 'getMostVotedOption'
[13/03/2024 19:54:26]     data/talkactions/scripts/pollsystem.lua:103: in function <data/talkactions/scripts/pollsystem.lua:27>
 

/vote

[13/03/2024 19:56:24] [Error - TalkAction Interface]
[13/03/2024 19:56:24] data/talkactions/scripts/pollsystem.lua:onSay
[13/03/2024 19:56:24] Description:
[13/03/2024 19:56:24] data/talkactions/scripts/pollsystem.lua:61: attempt to call field 'unserialize' (a nil value)
[13/03/2024 19:56:24] stack traceback:
[13/03/2024 19:56:24]     data/talkactions/scripts/pollsystem.lua:61: in function <data/talkactions/scripts/pollsystem.lua:27>




This script is from Mateus Robeerto but there are these errors

XML:
local POLL_STORAGE = 80000
local OPTIONS_STORAGE = 80001
local PLAYER_STORAGE = 80000

local function unserialize(s)
    local func = loadstring("return " .. s)
    if func then
        return func()
    else
        return nil, "unserialize error: string could not be deserialized."
    end
end

local function getTotalVotes()
   local options, err = unserialize(getStorage(OPTIONS_STORAGE))
   if not options then
       error(err)
   end
   local amount = 0
   for _, option in ipairs(options) do
       amount = amount + option[2]
   end
   return amount
end

local function getMostVotedOption()
   local options, err = unserialize(getStorage(OPTIONS_STORAGE))
   if not options then
       error(err)
   end
   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, err = unserialize(getStorage(OPTIONS_STORAGE))
       if not options then
           error(err)
       end

       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
           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, err = unserialize(getStorage(OPTIONS_STORAGE))
       if not options then
           error(err)
       end

       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:
/endpoll

 

[14/03/2024 11:33:46] [Error - TalkAction Interface]
[14/03/2024 11:33:46] data/talkactions/scripts/pollsystem.lua:onSay
[14/03/2024 11:33:46] Description:
[14/03/2024 11:33:46] data/talkactions/scripts/pollsystem.lua:32: bad argument #1 to 'ipairs' (table expected, got number)
[14/03/2024 11:33:46] stack traceback:
[14/03/2024 11:33:46]     [C]: in function 'ipairs'
[14/03/2024 11:33:46]     data/talkactions/scripts/pollsystem.lua:32: in function 'getMostVotedOption'
[14/03/2024 11:33:46]     data/talkactions/scripts/pollsystem.lua:122: in function <data/talkactions/scripts/pollsystem.lua:41>

 

/poll

 

[14/03/2024 11:33:47] [Error - TalkAction Interface]
[14/03/2024 11:33:47] data/talkactions/scripts/pollsystem.lua:onSay
[14/03/2024 11:33:47] Description:
[14/03/2024 11:33:47] data/talkactions/scripts/pollsystem.lua:112: bad argument #1 to 'ipairs' (table expected, got number)
[14/03/2024 11:33:47] stack traceback:
[14/03/2024 11:33:47]     [C]: in function 'ipairs'
[14/03/2024 11:33:47]     data/talkactions/scripts/pollsystem.lua:112: in function <data/talkactions/scripts/pollsystem.lua:41>
 
Last edited:
Back
Top