Initial commit
This commit is contained in:
183
gamemodes/darkrp/gamemode/modules/chat/sv_chat.lua
Normal file
183
gamemodes/darkrp/gamemode/modules/chat/sv_chat.lua
Normal file
@@ -0,0 +1,183 @@
|
||||
local function registerCommandDefinition(cmd, callback)
|
||||
local chatcommands = DarkRP.getChatCommands()
|
||||
|
||||
chatcommands[cmd] = chatcommands[cmd] or {}
|
||||
chatcommands[cmd].callback = callback
|
||||
chatcommands[cmd].command = chatcommands[cmd].command or cmd
|
||||
end
|
||||
|
||||
function DarkRP.defineChatCommand(cmd, callback)
|
||||
cmd = string.lower(cmd)
|
||||
local detour = function(ply, arg, ...)
|
||||
local canChatCommand = gamemode.Call("canChatCommand", ply, cmd, arg, ...)
|
||||
if not canChatCommand then
|
||||
return ""
|
||||
end
|
||||
|
||||
local ret = {callback(ply, arg, ...)}
|
||||
local overrideTxt, overrideDoSayFunc = hook.Run("onChatCommand", ply, cmd, arg, ret, ...)
|
||||
|
||||
if overrideTxt then return overrideTxt, overrideDoSayFunc end
|
||||
return unpack(ret)
|
||||
end
|
||||
|
||||
registerCommandDefinition(cmd, detour)
|
||||
end
|
||||
|
||||
function DarkRP.definePrivilegedChatCommand(cmd, priv, callback, extraInfoTbl)
|
||||
cmd = string.lower(cmd)
|
||||
|
||||
local function onCAMIResult(ply, arg, hasAccess, reason)
|
||||
if hasAccess then return callback(ply, arg) end
|
||||
|
||||
local notify = ply:EntIndex() == 0 and print or fp{DarkRP.notify, ply, 1, 4}
|
||||
notify(DarkRP.getPhrase("no_privilege"))
|
||||
end
|
||||
|
||||
local function callbackdetour(ply, arg, ...)
|
||||
local canChatCommand = gamemode.Call("canChatCommand", ply, cmd, arg)
|
||||
if not canChatCommand then
|
||||
return ""
|
||||
end
|
||||
|
||||
CAMI.PlayerHasAccess(ply, priv, fp{onCAMIResult, ply, arg}, nil, extraInfoTbl)
|
||||
|
||||
local overrideTxt, overrideDoSayFunc = hook.Run("onChatCommand", ply, cmd, arg, {""})
|
||||
|
||||
if overrideTxt then return overrideTxt, overrideDoSayFunc end
|
||||
return ""
|
||||
end
|
||||
|
||||
registerCommandDefinition(cmd, callbackdetour)
|
||||
end
|
||||
|
||||
local function RP_PlayerChat(ply, text, teamonly)
|
||||
DarkRP.log(ply:Nick() .. " (" .. ply:SteamID() .. "): " .. text)
|
||||
local callback = ""
|
||||
local DoSayFunc
|
||||
local groupSay = DarkRP.getChatCommand("g")
|
||||
|
||||
-- Extract the chat command
|
||||
local tblCmd = fn.Compose{
|
||||
DarkRP.getChatCommand,
|
||||
string.lower,
|
||||
fn.Curry(fn.Flip(string.sub), 2)(2), -- extract prefix
|
||||
fn.Curry(fn.GetValue, 2)(1), -- Get the first word
|
||||
fn.Curry(string.Explode, 2)(' ') -- split by spaces
|
||||
}(text)
|
||||
|
||||
if string.sub(text, 1, 1) == GAMEMODE.Config.chatCommandPrefix and tblCmd then
|
||||
local args = string.sub(text, string.len(tblCmd.command) + 3, string.len(text))
|
||||
args = tblCmd.tableArgs and DarkRP.explodeArg(args) or args
|
||||
|
||||
ply.DrpCommandDelays = ply.DrpCommandDelays or {}
|
||||
if tblCmd.delay and ply.DrpCommandDelays[tblCmd.command] and ply.DrpCommandDelays[tblCmd.command] > CurTime() - tblCmd.delay then
|
||||
return ""
|
||||
end
|
||||
|
||||
ply.DrpCommandDelays[tblCmd.command] = CurTime()
|
||||
|
||||
callback, DoSayFunc = tblCmd.callback(ply, args)
|
||||
if callback == "" then
|
||||
return "", "", DoSayFunc
|
||||
end
|
||||
text = string.sub(text, string.len(tblCmd.command) + 3, string.len(text))
|
||||
elseif teamonly and groupSay then
|
||||
callback, DoSayFunc = groupSay.callback(ply, text)
|
||||
return text, "", DoSayFunc
|
||||
end
|
||||
|
||||
if callback ~= "" then
|
||||
callback = callback or "" .. " "
|
||||
end
|
||||
|
||||
return text, callback, DoSayFunc;
|
||||
end
|
||||
|
||||
local function RP_ActualDoSay(ply, text, callback)
|
||||
callback = callback or ""
|
||||
if text == "" then return "" end
|
||||
local col = team.GetColor(ply:Team())
|
||||
local col2 = color_white
|
||||
if not ply:Alive() then
|
||||
col2 = Color(255, 200, 200, 255)
|
||||
col = col2
|
||||
end
|
||||
|
||||
if GAMEMODE.Config.alltalk then
|
||||
local name = ply:Nick()
|
||||
for _, v in ipairs(player.GetAll()) do
|
||||
DarkRP.talkToPerson(v, col, callback .. name, col2, text, ply)
|
||||
end
|
||||
else
|
||||
DarkRP.talkToRange(ply, callback .. ply:Nick(), text, GAMEMODE.Config.talkDistance)
|
||||
end
|
||||
return ""
|
||||
end
|
||||
|
||||
function GM:canChatCommand(ply, cmd, ...)
|
||||
if not ply.DarkRPUnInitialized then return true end
|
||||
|
||||
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("data_not_loaded_one"))
|
||||
DarkRP.notify(ply, 1, 4, DarkRP.getPhrase("data_not_loaded_two"))
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
g_DarkRPOldHookCall = g_DarkRPOldHookCall or hook.Call
|
||||
|
||||
local GM = GM
|
||||
function hook.Call(name, gm, ply, text, teamonly, ...)
|
||||
if name == "PlayerSay" then
|
||||
local dead = not ply:Alive()
|
||||
|
||||
local text2 = text
|
||||
local callback
|
||||
local DoSayFunc
|
||||
|
||||
text2 = g_DarkRPOldHookCall(name, gm, ply, text, teamonly, dead) or text2
|
||||
|
||||
text2, callback, DoSayFunc = RP_PlayerChat(ply, text2, teamonly)
|
||||
if tostring(text2) == " " then text2, callback = callback, text2 end
|
||||
if not GM.Config.deadtalk and dead then return "" end
|
||||
|
||||
if game.IsDedicated() then
|
||||
ServerLog("\"" .. ply:Nick() .. "<" .. ply:UserID() .. ">" .. "<" .. ply:SteamID() .. ">" .. "<" .. team.GetName(ply:Team()) .. ">\" say \"" .. text .. "\"\n" .. "\n")
|
||||
end
|
||||
|
||||
if DoSayFunc then DoSayFunc(text2) return "" end
|
||||
RP_ActualDoSay(ply, text2, callback)
|
||||
|
||||
hook.Call("PostPlayerSay", nil, ply, text2, teamonly, dead)
|
||||
return ""
|
||||
end
|
||||
|
||||
return g_DarkRPOldHookCall(name, gm, ply, text, teamonly, ...)
|
||||
end
|
||||
|
||||
local function ConCommand(ply, _, args)
|
||||
if not args[1] then return end
|
||||
local cmd = string.lower(args[1])
|
||||
local tbl = DarkRP.getChatCommand(cmd)
|
||||
|
||||
if not tbl then return end
|
||||
|
||||
table.remove(args, 1) -- Remove subcommand
|
||||
local arg = tbl.tableArgs and args or table.concat(args, ' ')
|
||||
local time = CurTime()
|
||||
|
||||
if not tbl then return end
|
||||
|
||||
ply.DrpCommandDelays = ply.DrpCommandDelays or {}
|
||||
|
||||
if IsValid(ply) then -- Server console isn't valid
|
||||
if tbl.delay and ply.DrpCommandDelays[cmd] and ply.DrpCommandDelays[cmd] > time - tbl.delay then
|
||||
return
|
||||
end
|
||||
|
||||
ply.DrpCommandDelays[cmd] = time
|
||||
end
|
||||
|
||||
tbl.callback(ply, arg)
|
||||
end
|
||||
concommand.Add("darkrp", ConCommand)
|
||||
Reference in New Issue
Block a user