Nome: Advanced Poll System
Tipo: Talkaction
Autor: Oneshot
Fala, meus queridos.
Peregrinando pela seção de Pedidos e Dúvidas, vi um pedido do membro sarioyana que despertou minha vontade de programar sistemas um pouco mais elaborados.
O pedido dele se trata de um sistema de votação, onde o responsável pelo servidor pode iniciar uma votação com quantas opções desejar.
Fiz algo bem simples, você só precisa configurar os storages no ínicio do script, caso você já esteja usando os que estão por padrão.
Abra seu arquivo talkactions.xml e adicione isso:
<talkaction log="yes" words="/newpoll;/endpoll" access="5" event="script" value="pollsystem.lua"/> <talkaction words="/vote;/poll" event="script" value="pollsystem.lua"/>
Crie um novo arquivo chamado pollsystem.lua em data/talkactions/scripts e adicione isso:
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
E pronto, o sistema está instalado. Basta agora no jogo com um GOD digitar:
/newpoll pergunta,opção1,opção2,opção3,...
E para finalizar a enquete
/endpoll
Jogadores podem usar os comandos abaixo para visualizar o estado da enquete e votar, respectivamente.
/poll /vote
O comando /vote deve ser seguido do número da opção que aparece no comando /poll
Irei postar em breve um vídeo, fiquem ligados.
Um grande abraço.
















,----------------