mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
484 lines
13 KiB
Lua
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
|
|
})
|