Files
2026-03-15 14:54:49 +03:00

431 lines
14 KiB
Lua

local function updateAgenda(ply, agenda, text)
local txt = hook.Run("agendaUpdated", ply, agenda, text)
agenda.text = txt or text
local phrase = DarkRP.getPhrase("agenda_updated")
for _, v in ipairs(player.GetAll()) do
if v:getAgendaTable() ~= agenda then continue end
v:setSelfDarkRPVar("agenda", agenda.text)
DarkRP.notify(v, 2, 4, phrase)
end
end
local function CreateAgenda(ply, args)
local agenda = ply:getAgendaTable()
if not agenda or not agenda.ManagersByKey[ply:Team()] then
DarkRP.notify(ply, 1, 6, DarkRP.getPhrase("incorrect_job", DarkRP.getPhrase("agenda")))
return ""
end
updateAgenda(ply, agenda, args)
return ""
end
DarkRP.defineChatCommand("agenda", CreateAgenda, 0.1)
local function addAgenda(ply, args)
local agenda = ply:getAgendaTable()
if not agenda or not agenda.ManagersByKey[ply:Team()] then
DarkRP.notify(ply, 1, 6, DarkRP.getPhrase("incorrect_job", DarkRP.getPhrase("agenda")))
return ""
end
agenda.text = agenda.text or ""
args = args or ""
updateAgenda(ply, agenda, agenda.text .. '\n' .. args)
return ""
end
DarkRP.defineChatCommand("addagenda", addAgenda, 0.1)
--[[---------------------------------------------------------
Mayor stuff
---------------------------------------------------------]]
local LotteryPeople = {}
local LotteryON = false
local LotteryAmount = 0
local CanLottery = CurTime()
local function EnterLottery(answer, ent, initiator, target, TimeIsUp)
local hasEntered = table.HasValue(LotteryPeople, target)
if tobool(answer) and not hasEntered then
if not target:canAfford(LotteryAmount) then
DarkRP.notify(target, 1, 4, DarkRP.getPhrase("cant_afford", DarkRP.getPhrase("lottery")))
return
end
table.insert(LotteryPeople, target)
target:addMoney(-LotteryAmount)
DarkRP.notify(target, 0,4, DarkRP.getPhrase("lottery_entered", DarkRP.formatMoney(LotteryAmount)))
hook.Run("playerEnteredLottery", target)
elseif IsValid(target) and answer ~= nil and not hasEntered then
DarkRP.notify(target, 1,4, DarkRP.getPhrase("lottery_not_entered", target:Nick()))
end
if TimeIsUp then
LotteryON = false
CanLottery = CurTime() + 60
for i = #LotteryPeople, 1, -1 do
if not IsValid(LotteryPeople[i]) then table.remove(LotteryPeople, i) end
end
if table.IsEmpty(LotteryPeople) then
DarkRP.notifyAll(1, 4, DarkRP.getPhrase("lottery_noone_entered"))
hook.Run("lotteryEnded", LotteryPeople)
return
end
local chosen = LotteryPeople[math.random(1, #LotteryPeople)]
local amt = #LotteryPeople * LotteryAmount
hook.Run("lotteryEnded", LotteryPeople, chosen, amt)
chosen:addMoney(amt)
DarkRP.notifyAll(0, 10, DarkRP.getPhrase("lottery_won", chosen:Nick(), DarkRP.formatMoney(amt)))
end
end
local function DoLottery(ply, amount)
if not ply:isMayor() then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("incorrect_job", "/lottery"))
return ""
end
if not GAMEMODE.Config.lottery then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("disabled", "/lottery", ""))
return ""
end
if player.GetCount() <= 2 then
DarkRP.notify(ply, 1, 6, DarkRP.getPhrase("too_few_players_for_lottery", 2))
return ""
end
if LotteryON then
DarkRP.notify(ply, 1, 6, DarkRP.getPhrase("lottery_ongoing"))
return ""
end
if CanLottery > CurTime() then
DarkRP.notify(ply, 1, 5, DarkRP.getPhrase("have_to_wait", tostring(CanLottery - CurTime()), "/lottery"))
return ""
end
amount = DarkRP.toInt(amount)
if not amount then
DarkRP.notify(ply, 1, 5, DarkRP.getPhrase("lottery_please_specify_an_entry_cost", DarkRP.formatMoney(GAMEMODE.Config.minlotterycost), DarkRP.formatMoney(GAMEMODE.Config.maxlotterycost)))
return ""
end
LotteryAmount = math.Clamp(amount, GAMEMODE.Config.minlotterycost, GAMEMODE.Config.maxlotterycost)
hook.Run("lotteryStarted", ply, LotteryAmount)
LotteryON = true
LotteryPeople = {}
local phrase = DarkRP.getPhrase("lottery_has_started", DarkRP.formatMoney(LotteryAmount))
for k, v in ipairs(player.GetAll()) do
if v ~= ply then
DarkRP.createQuestion(phrase, "lottery_" .. tostring(k), v, 30, EnterLottery, ply, v)
end
end
timer.Create("Lottery", 30, 1, function() EnterLottery(nil, nil, nil, nil, true) end)
return ""
end
DarkRP.defineChatCommand("lottery", DoLottery, 1)
local lastLockdown = -math.huge
function DarkRP.lockdown(ply)
local show = ply:EntIndex() == 0 and print or fp{DarkRP.notify, ply, 1, 4}
if GetGlobalBool("DarkRP_LockDown") then
show(DarkRP.getPhrase("unable", "/lockdown", DarkRP.getPhrase("stop_lockdown")))
return ""
end
if ply:EntIndex() ~= 0 and not ply:isMayor() then
show(DarkRP.getPhrase("incorrect_job", "/lockdown", ""))
return ""
end
if not GAMEMODE.Config.lockdown then
show(ply, 1, 4, DarkRP.getPhrase("disabled", "lockdown", ""))
return ""
end
if lastLockdown > CurTime() - GAMEMODE.Config.lockdowndelay then
show(DarkRP.getPhrase("wait_with_that"))
return ""
end
for _, v in ipairs(player.GetAll()) do
v:ConCommand("play " .. GAMEMODE.Config.lockdownsound .. "\n")
end
DarkRP.printMessageAll(HUD_PRINTTALK, DarkRP.getPhrase("lockdown_started"))
SetGlobalBool("DarkRP_LockDown", true)
DarkRP.notifyAll(0, 3, DarkRP.getPhrase("lockdown_started"))
hook.Run("lockdownStarted", ply)
return ""
end
DarkRP.defineChatCommand("lockdown", DarkRP.lockdown)
function DarkRP.unLockdown(ply)
local show = ply:EntIndex() == 0 and print or fp{DarkRP.notify, ply, 1, 4}
if not GetGlobalBool("DarkRP_LockDown") then
show(DarkRP.getPhrase("unable", "/unlockdown", DarkRP.getPhrase("lockdown_ended")))
return ""
end
if ply:EntIndex() ~= 0 and not ply:isMayor() then
show(DarkRP.getPhrase("incorrect_job", "/unlockdown", ""))
return ""
end
DarkRP.printMessageAll(HUD_PRINTTALK, DarkRP.getPhrase("lockdown_ended"))
DarkRP.notifyAll(0, 3, DarkRP.getPhrase("lockdown_ended"))
SetGlobalBool("DarkRP_LockDown", false)
lastLockdown = CurTime()
hook.Run("lockdownEnded", ply)
return ""
end
DarkRP.defineChatCommand("unlockdown", DarkRP.unLockdown)
--[[---------------------------------------------------------
License
---------------------------------------------------------]]
local function GrantLicense(answer, Ent, Initiator, Target)
Initiator.LicenseRequested = nil
if tobool(answer) then
DarkRP.notify(Initiator, 0, 4, DarkRP.getPhrase("gunlicense_granted", Target:Nick(), Initiator:Nick()))
DarkRP.notify(Target, 0, 4, DarkRP.getPhrase("gunlicense_granted", Target:Nick(), Initiator:Nick()))
Initiator:setDarkRPVar("HasGunlicense", true)
else
DarkRP.notify(Initiator, 1, 4, DarkRP.getPhrase("gunlicense_denied", Target:Nick(), Initiator:Nick()))
end
end
local function RequestLicense(ply)
if ply:getDarkRPVar("HasGunlicense") or ply.LicenseRequested then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("unable", "/requestlicense", ""))
return ""
end
local LookingAt = ply:GetEyeTrace().Entity
local ismayor--first look if there's a mayor
local ischief-- then if there's a chief
local iscop-- and then if there's a cop to ask
for _, v in ipairs(player.GetAll()) do
if v:isMayor() and not v:getDarkRPVar("AFK") then
ismayor = true
break
end
end
if not ismayor then
for _, v in ipairs(player.GetAll()) do
if v:isChief() and not v:getDarkRPVar("AFK") then
ischief = true
break
end
end
end
if not ischief and not ismayor then
for _, v in ipairs(player.GetAll()) do
if v:isCP() then
iscop = true
break
end
end
end
if not ismayor and not ischief and not iscop then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("unable", "/requestlicense", ""))
return ""
end
local mayors, chiefs, cops = {}, {}, {}
for teamNr, jobTable in pairs(RPExtraTeams) do
if jobTable.mayor then
table.insert(mayors, jobTable.name)
end
if jobTable.chief then
table.insert(chiefs, jobTable.name)
end
if GAMEMODE.CivilProtection[teamNr] then
table.insert(cops, jobTable.name)
end
end
mayors = table.concat(mayors, ", ")
chiefs = table.concat(chiefs, ", ")
cops = table.concat(cops, ", ")
if not IsValid(LookingAt) or not LookingAt:IsPlayer() or LookingAt:GetPos():DistToSqr(ply:GetPos()) > 10000 then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("must_be_looking_at", cops))
return ""
end
if ismayor and not LookingAt:isMayor() then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("must_be_looking_at", mayors))
return ""
elseif ischief and not LookingAt:isChief() then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("must_be_looking_at", chiefs))
return ""
elseif iscop and not LookingAt:isCP() then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("must_be_looking_at", cops))
return ""
end
ply.LicenseRequested = true
DarkRP.notify(ply, 3, 4, DarkRP.getPhrase("gunlicense_requested", ply:Nick(), LookingAt:Nick()))
DarkRP.createQuestion(DarkRP.getPhrase("gunlicense_question_text", ply:Nick()), "Gunlicense" .. ply:EntIndex(), LookingAt, 20, GrantLicense, ply, LookingAt)
return ""
end
DarkRP.defineChatCommand("requestlicense", RequestLicense)
local function GiveLicense(ply)
local LookingAt = ply:GetEyeTrace().Entity
if not IsValid(LookingAt) or not LookingAt:IsPlayer() or LookingAt:GetPos():DistToSqr(ply:GetPos()) > 10000 then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("must_be_looking_at", DarkRP.getPhrase("player")))
return ""
end
local canGive, cantGiveReason = hook.Call("canGiveLicense", DarkRP.hooks, ply, LookingAt)
if canGive == false then
cantGiveReason = isstring(cantGiveReason) and cantGiveReason or DarkRP.getPhrase("unable", "/givelicense", "")
DarkRP.notify(ply, 1, 4, cantGiveReason)
return ""
end
DarkRP.notify(LookingAt, 0, 4, DarkRP.getPhrase("gunlicense_granted", ply:Nick(), LookingAt:Nick()))
DarkRP.notify(ply, 0, 4, DarkRP.getPhrase("gunlicense_granted", ply:Nick(), LookingAt:Nick()))
LookingAt:setDarkRPVar("HasGunlicense", true)
hook.Run("playerGotLicense", LookingAt, ply)
return ""
end
DarkRP.defineChatCommand("givelicense", GiveLicense)
local function rp_GiveLicense(ply, arg)
local target = DarkRP.findPlayer(arg)
if not target then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("could_not_find", tostring(arg)))
return
end
target:setDarkRPVar("HasGunlicense", true)
local nick, steamID
if ply:EntIndex() ~= 0 then
nick = ply:Nick()
steamID = ply:SteamID()
else
nick = "Console"
steamID = "Console"
end
DarkRP.notify(target, 0, 4, DarkRP.getPhrase("gunlicense_granted", nick, target:Nick()))
if ply ~= target then
DarkRP.notify(ply, 0, 4, DarkRP.getPhrase("gunlicense_granted", nick, target:Nick()))
end
DarkRP.log(nick .. " (" .. steamID .. ") force-gave " .. target:Nick() .. " a gun license", Color(30, 30, 30))
end
DarkRP.definePrivilegedChatCommand("setlicense", "DarkRP_SetLicense", rp_GiveLicense)
local function rp_RevokeLicense(ply, arg)
local target = DarkRP.findPlayer(arg)
if not target then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("could_not_find", tostring(arg)))
return
end
target:setDarkRPVar("HasGunlicense", nil)
local nick, steamID
if ply:EntIndex() ~= 0 then
nick = ply:Nick()
steamID = ply:SteamID()
else
nick = "Console"
steamID = "Console"
end
DarkRP.notify(target, 1, 4, DarkRP.getPhrase("gunlicense_denied", nick, target:Nick()))
if ply ~= target then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("gunlicense_denied", nick, target:Nick()))
end
DarkRP.log(nick .. " (" .. steamID .. ") force-removed " .. target:Nick() .. "'s gun license", Color(30, 30, 30))
end
DarkRP.definePrivilegedChatCommand("unsetlicense", "DarkRP_SetLicense", rp_RevokeLicense)
local function FinishRevokeLicense(vote, win)
if win == 1 then
vote.target:setDarkRPVar("HasGunlicense", nil)
vote.target:StripWeapons()
gamemode.Call("PlayerLoadout", vote.target)
DarkRP.notifyAll(0, 4, DarkRP.getPhrase("gunlicense_removed", vote.target:Nick()))
else
DarkRP.notifyAll(0, 4, DarkRP.getPhrase("gunlicense_not_removed", vote.target:Nick()))
end
end
local function VoteRemoveLicense(ply, args)
if #args == 1 then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("vote_specify_reason"))
return ""
end
local reason = ""
for i = 2, #args, 1 do
reason = reason .. " " .. args[i]
end
reason = string.sub(reason, 2)
if string.len(reason) > 22 then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("unable", "/demotelicense", "<23"))
return ""
end
local p = DarkRP.findPlayer(args[1])
if p then
if CurTime() - ply.LastVoteCop < 80 then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("have_to_wait", math.ceil(80 - (CurTime() - ply:GetTable().LastVoteCop)), "/demotelicense"))
return ""
end
if ply:getDarkRPVar("HasGunlicense") then
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("unable", "/demotelicense", ""))
else
local voteInfo = DarkRP.createVote(p:Nick() .. ":\n" .. DarkRP.getPhrase("gunlicense_remove_vote_text2", reason), "removegunlicense", p, 20, FinishRevokeLicense, {
[p] = true,
[ply] = true
}, nil, nil, {
source = ply
})
if voteInfo then
-- Vote has started
DarkRP.notifyAll(0, 4, DarkRP.getPhrase("gunlicense_remove_vote_text", ply:Nick(), p:Nick()))
end
ply.LastVoteCop = CurTime()
end
return ""
else
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("could_not_find", tostring(args[1])))
return ""
end
end
DarkRP.defineChatCommand("demotelicense", VoteRemoveLicense)