Files
wnsrc/gamemodes/darkrp/schema/sh_commands.lua
lifestorm 73479cff9e Upload
2024-08-04 22:55:00 +03:00

484 lines
13 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
do
local COMMAND = {}
COMMAND.arguments = ix.type.text
local lastDispatchCommand = 0
function COMMAND:OnRun(client, message)
if (!client:IsRestricted()) then
local doubleCommand = false
local curTime = CurTime()
local isVoiceCommand = false
-- This could probably be done a bit smarter but I'm sure it'll do.
if (string.Left(string.lower(message), 9) == "/dispatch") then
doubleCommand = true
message = string.Right(message, #message - 10)
elseif (string.Left(string.lower(message), 8) == "dispatch") then
doubleCommand = true
message = string.Right(message, #message - 9)
end
for voiceCommand, _ in pairs(Schema.voices.stored["dispatch"]) do
if (message:lower() == voiceCommand:lower()) then
isVoiceCommand = true
break
end
end
if (!isVoiceCommand) then
if (lastDispatchCommand < curTime) then
lastDispatchCommand = curTime + 5
return "@dispatchTypoWarning"
else
lastDispatchCommand = 0
end
end
if (doubleCommand) then
client:NotifyLocalized("textDoubleCommand", "/dispatch")
end
ix.chat.Send(client, "dispatch", message)
else
return "@notNow"
end
end
ix.command.Add("Dispatch", COMMAND)
end
do
local COMMAND = {}
COMMAND.arguments = ix.type.text
function COMMAND:OnRun(client, message)
if (!client:IsRestricted()) then
local doubleCommand = false
-- This could probably be done a bit smarter but I'm sure it'll do.
if (string.Left(string.lower(message), 10) == "/broadcast") then
doubleCommand = true
message = string.Right(message, #message - 11)
elseif (string.Left(string.lower(message), 9) == "broadcast") then
doubleCommand = true
message = string.Right(message, #message - 10)
end
if (doubleCommand) then
client:NotifyLocalized("textDoubleCommand", "/broadcast")
end
ix.chat.Send(client, "broadcast", message)
else
return "@notNow"
end
end
ix.command.Add("Broadcast", COMMAND)
end
ix.command.Add("Event", {
description = "@cmdEvent",
arguments = ix.type.text,
privilege = "Event",
OnRun = function(self, client, message)
local doubleCommand = false
-- This could probably be done a bit smarter but I'm sure it'll do.
if (string.Left(string.lower(message), 6) == "/event") then
doubleCommand = true
message = string.Right(message, #message - 7)
elseif (string.Left(string.lower(message), 5) == "event") then
doubleCommand = true
message = string.Right(message, #message - 6)
end
if (doubleCommand) then
client:NotifyLocalized("textDoubleCommand", "/Event")
end
ix.chat.Send(client, "event", message)
end
})
do
local COMMAND = {}
function COMMAND:OnRun(client, arguments)
if (!hook.Run("CanPlayerViewObjectives", client)) then
return "@noPerm"
end
netstream.Start(client, "ViewObjectives", Schema.CombineObjectives)
end
ix.command.Add("ViewObjectives", COMMAND)
end
do
ix.command.Add("CharSearch", {
description = "Recherchez le joueur que vous regardez. Cela demandera la permission de le faire s'il n'est pas encore lié.",
OnCheckAccess = function(self, client)
if (client:IsRestricted()) then
return false, "@notNow"
end
return true
end,
OnRun = function(self, client)
local data = {}
data.start = client:GetShootPos()
data.endpos = data.start + client:GetAimVector() * 96
data.filter = client
local target = util.TraceLine(data).Entity
local isRagdoll = false
if (target:IsRagdoll() and target.ixPlayer) then
target = target.ixPlayer
isRagdoll = true
end
if (IsValid(target) and target:IsPlayer()) then
if (target:IsRestricted() or isRagdoll) then
Schema:SearchPlayer(client, target)
elseif (!IsValid(target.ixSearchRequest)) then
-- first search
-- succesful searches or searching other target clears this
if (!client.ixLastSearchRequest or client.ixLastSearchRequest.target != target) then
client.ixLastSearchRequest = {target = target, time = 0, count = 1}
-- second search
elseif (count == 1) then
-- if it was within 15 seconds
if (os.time() < client.ixLastSearchRequest.time) then
client.ixLastSearchRequest.count = 2
end
-- third search
elseif (count == 2) then
-- again within 15 seconds -> deny it
if (os.time() < client.ixLastSearchRequest.time) then
client:NotifyLocalized("Veuillez attendre 15 secondes avant d'envoyer une troisième demande !")
return
end
end
client.ixLastSearchRequest.time = os.time() + 15
client:NotifyLocalized("Demande de recherche envoyée.")
netstream.Start(target, "SearchRequest", client)
target.ixSearchRequest = client
else
return "@notNow"
end
else
return "@plyNotValid"
end
end
})
end
local applyPhrases = {
"%s, CID #%s.",
"Mon nom est %s et mon CID est le #%s.",
"Je suis %s avec le CID #%s.",
"%s. Mon CID est %s."
}
local namePhrases = {
"%s.",
"Je suis %s.",
"My name is %s.",
"Name: %s"
}
ix.command.Add("apply", {
description = "@cmdApply",
OnRun = function(self, client, arguments)
local character = client:GetCharacter()
local cid = character:GetCid()
if (cid) then
ix.chat.Send(client, "ic", string.format(table.Random(applyPhrases), character:GetData("fakeName", client:GetName()), cid))
else
ix.chat.Send(client, "ic", string.format(table.Random(namePhrases), character:GetData("fakeName", client:GetName())))
end
end
})
ix.command.Add("CharFallOver", {
description = "@cmdCharFallOver",
arguments = bit.bor(ix.type.number, ix.type.optional),
OnRun = function(self, client, time)
-- Anti-Exploit measure. Just silently fail if near a door.
for _, entity in ipairs(ents.FindInSphere(client:GetPos(), 50)) do
if (entity:GetClass() == "func_door" or entity:GetClass() == "func_door_rotating" or entity:GetClass() == "prop_door_rotating") then return end
end
if (!client:Alive() or client:GetMoveType() == MOVETYPE_NOCLIP) then
return "@notNow"
end
if (hook.Run("PlayerCanFallOver", client) == false) then
return "@notNow"
end
if (time and time > 0) then
time = math.Clamp(time, 1, 60)
end
if (!IsValid(client.ixRagdoll)) then
client:SetRagdolled(true, time)
end
end
})
ix.command.Add("CharGetUp", {
description = "@cmdCharGetUp",
OnRun = function(self, client, arguments)
-- Anti-Exploit measure. Just silently fail if near a door.
for _, entity in ipairs(ents.FindInSphere(client:GetPos(), 50)) do
if (entity:GetClass() == "func_door" or entity:GetClass() == "func_door_rotating" or entity:GetClass() == "prop_door_rotating") then return end
end
local entity = client.ixRagdoll
if (IsValid(entity) and entity.ixGrace and entity.ixGrace < CurTime() and
entity:GetVelocity():Length2D() < 8 and !entity.ixWakingUp) then
entity.ixWakingUp = true
entity:CallOnRemove("CharGetUp", function()
client:SetAction()
end)
client:SetAction("@gettingUp", 5, function()
if (!IsValid(entity)) then
return
end
-- Anti-Exploit measure. Just silently fail if near a door.
for _, entity in ipairs(ents.FindInSphere(client:GetPos(), 50)) do
if (entity:GetClass() == "func_door" or entity:GetClass() == "func_door_rotating" or entity:GetClass() == "prop_door_rotating") then return end
end
hook.Run("OnCharacterGetup", client, entity)
entity:Remove()
end)
end
end
})
ix.command.Add("ListColors", {
description = "@cmdListColors",
OnRun = function(self, client)
client:SendLua([[for colorName, color in pairs(Schema.colors) do MsgC(color, "██████████ " .. colorName:upper() .. "\n") end]])
return "@ColorsPrinted" -- Bogos Binted
end
})
ix.command.Add("VisorMessage", {
description = "@cmdVisorMessage",
arguments = {
ix.type.string,
bit.bor(ix.type.string, ix.type.optional),
bit.bor(ix.type.bool, ix.type.optional)
},
OnCheckAccess = function(self, client)
local character = client:GetCharacter()
return character and character:GetFaction() == FACTION_OTA and (character:GetClass() == CLASS_ORD or character:GetClass() == CLASS_EOW)
end,
OnRun = function(self, client, visorMessage, messageColor, isImportant)
if (messageColor and Schema.colors[messageColor]) then
messageColor = Schema.colors[messageColor]
else
messageColor = Color(255, 255, 255)
end
local receivers = {}
for _, player in pairs(player.GetAll()) do
if (player:Team() == FACTION_OTA) then
receivers[#receivers + 1] = player
end
end
if (isImportant) then
ix.combineNotify:AddImportantNotification("MSG:// " .. visorMessage, messageColor, nil, nil, receivers)
else
ix.combineNotify:AddNotification("MSG:// " .. visorMessage, messageColor, nil, nil, receivers)
end
end
})
ix.command.Add("PlyNotify", {
description = "@cmdPlyNotify",
adminOnly = true,
arguments = {
ix.type.player,
ix.type.text
},
OnRun = function(self, client, target, notification)
target:Notify(notification)
return "@notificationSent"
end
})
ix.command.Add("WhisperDirect", {
alias = {"WD"},
description = "@cmdWD",
combineBeep = true,
arguments = {
ix.type.string,
ix.type.text
},
OnRun = function(self, client, target, text)
if (target == "@") then
local traceEnt = client:GetEyeTraceNoCursor().Entity
if (traceEnt and traceEnt:IsPlayer()) then
target = traceEnt
end
else
target = ix.util.FindPlayer(target)
end
if (!target or isstring(target)) then
return "@charNoExist"
end
if (target:GetPos():Distance(client:GetPos()) <= ix.config.Get("chatRange", 280) * 0.25) then
ix.chat.Send(client, "wd", text, false, {client, target}, {target = target})
else
return "@targetTooFar"
end
end
})
ix.command.Add("GetCWUFlags", {
description = "@cmdGetCWUFlags",
OnCheckAccess = function(self, client)
return client:Team() == FACTION_WORKERS or client:Team() == FACTION_MEDICAL
end,
OnRun = function(self, client) -- Just going to recycle the tempflags code.
local curTime = CurTime()
local nextCommandUse = client:GetLocalVar("nextCWUFlags", 0)
if (nextCommandUse > curTime) then return "@cwuFlagsCooldown" end
local flags = client:GetLocalVar("tempFlags", {})
local newTime = os.time() + 3600 -- 1 Hour
local character = client:GetCharacter()
local flagsToGive = "pet"
for i = 1, 3 do
local flag = flagsToGive[i]
local info = ix.flag.list[flag]
if (!flags[flag] and character:HasFlags(flag)) then continue end
flags[flag] = newTime
if (info.callback) then
info.callback(client, true)
end
end
client:SetLocalVar("tempFlags", flags)
for _, player in ipairs(player.GetAll()) do
if (player:IsAdmin()) then
player:ChatNotifyLocalized("cwuFlagsGivenAdmins", client:GetName(), client:SteamName())
end
end
client:NotifyLocalized("cwuFlagsGivenPlayer")
client:SetLocalVar("nextCWUFlags", curTime + 3600)
end
})
ix.command.Add("UnStuck", {
description = "@cmdUnstuck",
OnRun = function(self, client)
local curTime = CurTime()
local nextCommandUse = client:GetLocalVar("nextUnstuck", 0)
if (nextCommandUse > curTime) then return "@unstuckCooldown" end
local operators = {"+", "-", "*"}
local unstuckNumberOne = math.random(1, 100)
local unstuckNumberTwo = math.random(1, 100)
local unstuckOperator = operators[math.random(1, 3)]
-- sorry for the spaces
client:RequestString("A utiliser si vous êtes bloqué ou tué par un props. Le TP retourne au spawn et réinitialise les HP. Ne pas abuser.", "Pour continuer, veuillez résoudre le problème mathématique suivant : " .. unstuckNumberOne .. " " .. unstuckOperator .. " " .. unstuckNumberTwo .. " = ? ", function(text)
if (text) then text = tonumber(text) end
if (text and isnumber(text)) then
local answer = 0
if (unstuckOperator == "+") then
answer = unstuckNumberOne + unstuckNumberTwo
elseif (unstuckOperator == "-") then
answer = unstuckNumberOne - unstuckNumberTwo
else
answer = unstuckNumberOne * unstuckNumberTwo
end
if (text == answer) then
client:RequestString("Raison", "Donnez une raison valable. Les staffs la verront.", function(reasontext)
for _, player in ipairs(player.GetAll()) do
if (player:IsAdmin()) then
player:ChatNotifyLocalized("unstuckAdmins", client:GetName(), client:SteamName(), client:GetArea(), reasontext)
ix.log.Add(client, "command"," /UnStuck avec comme raison : "..reasontext)
end
end
client:NotifyLocalized("unstuckPlayer")
client:Spawn()
client:SetLocalVar("nextUnstuck", curTime + 3600)
end, "")
else
client:NotifyLocalized("unstuckAnswerIncorrect")
end
else
client:NotifyLocalized("unstuckAnswerInvalid")
end
end, "")
end
})
ix.command.Add("SetOwnName", {
description = "Set your own character's name, if allowed.",
arguments = ix.type.text,
OnRun = function(self, client, name)
if (client:Team() != FACTION_OTA) then
client:Notify("You are not allowed to set your own name!")
return
end
client:GetCharacter():SetName(name)
client:Notify("You have set your name to " .. name .. ".")
end
})