Initial commit
This commit is contained in:
177
gamemodes/darkrp/gamemode/modules/voting/sv_votes.lua
Normal file
177
gamemodes/darkrp/gamemode/modules/voting/sv_votes.lua
Normal file
@@ -0,0 +1,177 @@
|
||||
local Vote = {}
|
||||
local Votes = {}
|
||||
|
||||
local function ccDoVote(ply, cmd, args)
|
||||
if ply:EntIndex() == 0 then
|
||||
print(DarkRP.getPhrase("cmd_cant_be_run_server_console"))
|
||||
return
|
||||
end
|
||||
|
||||
local vote = Votes[tonumber(args[1] or 0)]
|
||||
|
||||
if not vote then return end
|
||||
if args[2] ~= "yea" and args[2] ~= "nay" then return end
|
||||
|
||||
local canVote, message = hook.Call("canVote", GAMEMODE, ply, vote)
|
||||
|
||||
if vote.voters[ply] or vote.exclude[ply] or canVote == false then
|
||||
DarkRP.notify(ply, 1, 4, message or DarkRP.getPhrase("you_cannot_vote"))
|
||||
return
|
||||
end
|
||||
vote.voters[ply] = true
|
||||
|
||||
vote:handleNewVote(ply, args[2])
|
||||
end
|
||||
concommand.Add("vote", ccDoVote)
|
||||
|
||||
function Vote:handleNewVote(ply, choice)
|
||||
self[choice] = self[choice] + 1
|
||||
|
||||
local excludeCount = table.Count(self.exclude)
|
||||
local voteCount = table.Count(self.voters)
|
||||
|
||||
if voteCount >= player.GetCount() - excludeCount then
|
||||
self:handleEnd()
|
||||
end
|
||||
end
|
||||
|
||||
function Vote:handleEnd()
|
||||
local win = hook.Call("getVoteResults", nil, self, self.yea, self.nay)
|
||||
win = win or self.yea > self.nay and 1 or self.nay > self.yea and -1 or 0
|
||||
|
||||
umsg.Start("KillVoteVGUI", self:getFilter())
|
||||
umsg.String(self.id)
|
||||
umsg.End()
|
||||
|
||||
Votes[self.id] = nil
|
||||
timer.Remove(self.id .. "DarkRPVote")
|
||||
|
||||
self:callback(win)
|
||||
end
|
||||
|
||||
function Vote:getFilter()
|
||||
local filter = RecipientFilter()
|
||||
|
||||
for _, v in ipairs(player.GetAll()) do
|
||||
if self.exclude[v] then continue end
|
||||
local canVote = hook.Call("canVote", GAMEMODE, v, self)
|
||||
|
||||
if canVote == false then
|
||||
self.exclude[v] = true
|
||||
continue
|
||||
end
|
||||
|
||||
filter:AddPlayer(v)
|
||||
end
|
||||
|
||||
return filter
|
||||
end
|
||||
|
||||
function DarkRP.hooks:canStartVote(newvote)
|
||||
if player.GetCount() <= table.Count(newvote.exclude) then
|
||||
local ply = istable(newvote.info) and isentity(newvote.info.source) and newvote.info.source or newvote.target
|
||||
if ply and ply:IsPlayer() then
|
||||
DarkRP.notify(ply, 0, 4, DarkRP.getPhrase("vote_alone"))
|
||||
end
|
||||
return false, true
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function DarkRP.createVote(question, voteType, target, time, callback, excludeVoters, fail, extraInfo)
|
||||
excludeVoters = excludeVoters or {[target] = true}
|
||||
|
||||
local newvote = {}
|
||||
setmetatable(newvote, {__index = Vote})
|
||||
|
||||
newvote.id = table.insert(Votes, newvote)
|
||||
newvote.question = question
|
||||
newvote.votetype = voteType
|
||||
newvote.target = target
|
||||
newvote.time = time
|
||||
newvote.callback = callback
|
||||
newvote.fail = fail or function() end
|
||||
newvote.exclude = excludeVoters
|
||||
newvote.voters = {}
|
||||
newvote.info = extraInfo
|
||||
|
||||
newvote.yea = 0
|
||||
newvote.nay = 0
|
||||
|
||||
local ply = istable(extraInfo) and isentity(extraInfo.source) and extraInfo.source or target
|
||||
|
||||
local canStart, callSuccess, message = hook.Call("canStartVote", DarkRP.hooks, newvote)
|
||||
if not canStart then
|
||||
if callSuccess then
|
||||
newvote:callback(1)
|
||||
else
|
||||
if ply:IsPlayer() then
|
||||
DarkRP.notify(ply, 1, 4, message or DarkRP.getPhrase("unable", DarkRP.getPhrase("create_vote_for_job"), ""))
|
||||
end
|
||||
newvote:fail()
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
hook.Call("onVoteStarted", nil, newvote)
|
||||
|
||||
if ply:IsPlayer() then
|
||||
DarkRP.notify(ply, 0, 4, DarkRP.getPhrase("vote_started"))
|
||||
end
|
||||
|
||||
umsg.Start("DoVote", newvote:getFilter())
|
||||
umsg.String(question)
|
||||
umsg.Short(newvote.id)
|
||||
umsg.Float(time)
|
||||
umsg.End()
|
||||
|
||||
timer.Create(newvote.id .. "DarkRPVote", time, 1, function() newvote:handleEnd() end)
|
||||
|
||||
return newvote
|
||||
end
|
||||
|
||||
function DarkRP.destroyVotesWithEnt(ent)
|
||||
for k, v in pairs(Votes) do
|
||||
if v.target ~= ent then continue end
|
||||
|
||||
timer.Remove(v.id .. "DarkRPVote")
|
||||
umsg.Start("KillVoteVGUI", v:getFilter())
|
||||
umsg.Short(v.id)
|
||||
umsg.End()
|
||||
|
||||
v:fail()
|
||||
|
||||
Votes[k] = nil
|
||||
end
|
||||
end
|
||||
|
||||
function DarkRP.destroyLastVote()
|
||||
local lastVote = Votes[#Votes]
|
||||
|
||||
if not lastVote then return false end
|
||||
|
||||
timer.Remove(lastVote.id .. "DarkRPVote")
|
||||
umsg.Start("KillVoteVGUI", lastVote:getFilter())
|
||||
umsg.Short(lastVote.id)
|
||||
umsg.End()
|
||||
|
||||
lastVote:fail()
|
||||
|
||||
Votes[lastVote.id] = nil
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local function CancelVote(ply)
|
||||
local result = DarkRP.destroyLastVote()
|
||||
|
||||
if result then
|
||||
DarkRP.notifyAll(0, 4, DarkRP.getPhrase("x_cancelled_vote", ply:EntIndex() ~= 0 and ply:Nick() or "Console"))
|
||||
if ply:EntIndex() == 0 then
|
||||
print(DarkRP.getPhrase("x_cancelled_vote", "Console"))
|
||||
end
|
||||
else
|
||||
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("cant_cancel_vote"))
|
||||
end
|
||||
end
|
||||
DarkRP.definePrivilegedChatCommand("forcecancelvote", "DarkRP_AdminCommands", CancelVote)
|
||||
Reference in New Issue
Block a user