Files
wnsrc/gamemodes/darkrp/schema/cl_hooks.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

426 lines
12 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/
--]]
function Schema:PopulateCharacterInfo(client, character, tooltip)
if (client:IsRestricted()) then
local panel = tooltip:AddRowAfter("name", "ziptie")
panel:SetBackgroundColor(derma.GetColor("Warning", tooltip))
panel:SetText(L("tiedUp"))
panel:SizeToContents()
elseif (client:GetNetVar("tying")) then
local panel = tooltip:AddRowAfter("name", "ziptie")
panel:SetBackgroundColor(derma.GetColor("Warning", tooltip))
panel:SetText(L("beingTied"))
panel:SizeToContents()
elseif (client:GetNetVar("untying")) then
local panel = tooltip:AddRowAfter("name", "ziptie")
panel:SetBackgroundColor(derma.GetColor("Warning", tooltip))
panel:SetText(L("beingUntied"))
panel:SizeToContents()
end
end
function Schema:ShouldShowPlayerOnScoreboard(client)
local faction = LocalPlayer():Team()
if (faction == FACTION_SERVERADMIN) then return true end
if (client:Team() == FACTION_OTA or client:Team() == FACTION_OVERWATCH) then
return (faction == FACTION_OTA
or (faction == FACTION_CP and client:Team() == FACTION_OVERWATCH)
or faction == FACTION_ADMIN
or faction == FACTION_OVERWATCH)
end
end
function Schema:CanPlayerJoinClass(client, class, info)
return false
end
function Schema:PlayerFootstep(client, position, foot, soundName, volume)
return true
end
function Schema:RenderScreenspaceEffects()
if (ix.option.Get("ColorModify", true)) then
local colorModify = {}
colorModify["$pp_colour_colour"] = 0.77 + ix.option.Get("ColorSaturation", 0)
if (system.IsWindows()) then
colorModify["$pp_colour_brightness"] = -0.02
colorModify["$pp_colour_contrast"] = 1.2
else
colorModify["$pp_colour_brightness"] = 0
colorModify["$pp_colour_contrast"] = 1
end
DrawColorModify(colorModify)
end
end
-- creates labels in the status screen
function Schema:CreateCharacterInfo(panel)
if (LocalPlayer():Team() == FACTION_CITIZEN or LocalPlayer():Team() == FACTION_WORKERS or LocalPlayer():Team() == FACTION_MEDICAL) then
panel.cid = panel:Add("ixListRow")
panel.cid:SetList(panel.list)
panel.cid:Dock(TOP)
panel.cid:DockMargin(0, 0, 0, 8)
end
end
-- populates labels in the status screen
function Schema:UpdateCharacterInfo(panel)
if (LocalPlayer():Team() == FACTION_CITIZEN or LocalPlayer():Team() == FACTION_WORKERS or LocalPlayer():Team() == FACTION_MEDICAL) then
panel.cid:SetLabelText(L("citizenid"))
panel.cid:SetText(string.format("##%s", LocalPlayer():GetCharacter():GetCid() or "INCONNU"))
panel.cid:SizeToContents()
end
end
function Schema:BuildBusinessMenu(panel)
local bHasItems = false
for k, _ in pairs(ix.item.list) do
if (hook.Run("CanPlayerUseBusiness", LocalPlayer(), k) != false) then
bHasItems = true
break
end
end
return bHasItems
end
function Schema:PopulateHelpMenu(tabs)
tabs["Voix"] = function(container)
local classes = {}
for k, v in pairs(Schema.voices.classes) do
if (v.condition(LocalPlayer())) then
classes[#classes + 1] = k
end
end
if (#classes < 1) then
local info = container:Add("DLabel")
info:SetFont("MenuFontNoClamp")
info:SetText("Vous n'avez accès à aucune ligne vocale !")
info:SetContentAlignment(5)
info:SetTextColor(color_white)
info:SetExpensiveShadow(1, color_black)
info:Dock(TOP)
info:DockMargin(0, 0, 0, SScaleMin(8 / 3))
info:SizeToContents()
info:SetTall(info:GetTall() + SScaleMin(16 / 3))
info.Paint = function(_, width, height)
surface.SetDrawColor(ColorAlpha(derma.GetColor("Error", info), 160))
surface.DrawRect(0, 0, width, height)
end
return
end
table.sort(classes, function(a, b)
return a < b
end)
local function FillList(query)
for _, class in ipairs(classes) do
local category = container:Add("Panel")
category:Dock(TOP)
category:DockMargin(0, 0, 0, SScaleMin(8 / 3))
category:DockPadding(SScaleMin(8 / 3), SScaleMin(8 / 3), SScaleMin(8 / 3), SScaleMin(8 / 3))
category.Paint = function(_, width, height)
surface.SetDrawColor(Color(0, 0, 0, 66))
surface.DrawRect(0, 0, width, height)
end
local categoryLabel = category:Add("DLabel")
categoryLabel:SetFont("MenuFontLargerNoClamp")
categoryLabel:SetText(class:utf8upper())
categoryLabel:Dock(FILL)
categoryLabel:SetTextColor(color_white)
categoryLabel:SetExpensiveShadow(1, color_black)
categoryLabel:SizeToContents()
category:SizeToChildren(true, true)
for command, info in SortedPairs(self.voices.stored[class]) do
if (query and !(command:find(query) or info.text:find(query))) then
continue
end
local title = container:Add("DLabel")
title:SetFont("MenuFontLargerNoClamp")
title:SetText(command:utf8upper())
title:Dock(TOP)
title:SetTextColor(ix.config.Get("color"))
title:SetExpensiveShadow(1, color_black)
title:SetMouseInputEnabled(true)
title:SizeToContents()
title.DoClick = function()
SetClipboardText(command:utf8upper())
LocalPlayer():Notify("Commande vocale copiée dans le presse-papiers.")
end
local description = container:Add("DLabel")
description:SetFont("MenuFontNoClamp")
description:SetText(info.text)
description:Dock(TOP)
description:SetTextColor(color_white)
description:SetExpensiveShadow(1, color_black)
description:SetWrap(true)
description:SetAutoStretchVertical(true)
description:SetMouseInputEnabled(true)
description:SizeToContents()
description:DockMargin(0, 0, 0, SScaleMin(8 / 3))
description.DoClick = function()
SetClipboardText(command:utf8upper())
LocalPlayer():Notify("Commande vocale copiée dans le presse-papiers.")
end
end
end
end
local search = container:GetParent():Add("DTextEntry")
search:Dock(TOP)
search:SetFont("MenuFontNoClamp")
search:SetTall(SScaleMin(30 / 3))
search:DockMargin(SScaleMin(8 / 3), 0, SScaleMin(8 / 3), SScaleMin(8 / 3))
search:SetPlaceholderText("Taper le texte de la ligne vocale...")
search:SetTextColor(Color(200, 200, 200, 255))
search:SetCursorColor(Color(200, 200, 200, 255))
search:SetFont("MenuFontNoClamp")
search:SetText(value or "")
search.Paint = function(panel, w, h)
surface.SetDrawColor(Color(0, 0, 0, 100))
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
surface.DrawOutlinedRect(0, 0, w, h)
if ( panel.GetPlaceholderText and panel.GetPlaceholderColor and panel:GetPlaceholderText() and
panel:GetPlaceholderText():Trim() != "" and panel:GetPlaceholderColor() and ( !panel:GetText() or panel:GetText() == "" ) ) then
local oldText = panel:GetText()
local str = panel:GetPlaceholderText()
if ( str:StartWith( "#" ) ) then str = str:sub( 2 ) end
str = language.GetPhrase( str )
panel:SetText( str )
panel:DrawTextEntryText( panel:GetPlaceholderColor(), panel:GetHighlightColor(), panel:GetCursorColor() )
panel:SetText( oldText )
return
end
panel:DrawTextEntryText( panel:GetTextColor(), panel:GetHighlightColor(), panel:GetCursorColor() )
end
search.OnChange = function(self)
local text = self:GetValue()
container:Clear()
FillList(text:utf8lower())
end
search.Think = function(pnl)
if (pnl:IsVisible() and !IsValid(container) or !container:IsVisible()) then
pnl:SetVisible(false)
end
end
container.Think = function(pnl)
if (!search:IsVisible()) then
search:SetVisible(true)
end
end
FillList()
end
end
netstream.Hook("PlaySound", function(sound)
surface.PlaySound(sound)
end)
netstream.Hook("ViewObjectives", function(data)
if (IsValid(ix.gui.combine)) then
ix.gui.combine:AddLine("@cViewObjectives")
end
vgui.Create("ixViewObjectives"):Populate(data)
end)
local blocked = {}
netstream.Hook("SearchRequest", function(client)
if (blocked[client]) then
netstream.Start("SearchDecline")
return
end
local name = hook.Run("GetCharacterName", client, "ic") or client:GetName()
local panel = Derma_Query(name.." essaie de vous fouiller. Le laisserez-vous faire ?", "Demande de recherche d'inventaire",
"Autoriser", function()
netstream.Start("SearchAllow")
end,
"Refuser", function()
netstream.Start("SearchDecline")
end,
"Bloquer", function()
netstream.Start("SearchDecline")
blocked[client] = true
end)
timer.Simple(30, function()
if (IsValid(panel)) then
panel:Remove()
netstream.Start("SearchTimeout")
end
end)
end)
function Schema:AllowMessage(panel)
panel.OnKeyCodePressed = function(this, keyCode)
-- Allow to open chat while playing
if (input.LookupKeyBinding(keyCode) == "messagemode") then
hook.Run("PlayerBindPress", LocalPlayer(), "messagemode", true, keyCode)
end
end
end
local sentences = {
["Short"] = {
"hi01",
"hi02",
"ok01",
"ok02",
"no01",
"no02",
"ow01",
"ow02"
},
["Med"] = {
"question20",
"question21",
"question25",
"question27",
"question29",
"question30",
"question01",
"question07",
"question08",
"question12",
"question13",
"question15",
"question18",
"question19"
},
["Long"] = {
"question02",
"question04",
"question06",
"question09",
"question10",
"question11",
"question14",
"gordead_ques15",
"abouttime02"
}
}
local function PlaySentence(client, length)
if (length < 10) then
client:EmitSound("vo/npc/male01/" .. table.Random(sentences["Short"]) .. ".wav", 1, 100)
elseif (length < 30 ) then
client:EmitSound("vo/npc/male01/" .. table.Random(sentences["Med"]) .. ".wav", 1, 100)
else
client:EmitSound("vo/npc/male01/" .. table.Random(sentences["Long"]) .. ".wav", 1, 100)
end
end
local chatTypes = {
["ic"] = true,
["w"] = true,
["wd"] = true,
["y"] = true,
["radio"] = true,
["radio_eavesdrop"] = true,
["radio_eavesdrop_yell"] = true,
["dispatch"] = true,
["dispatch_radio"] = true,
["overwatch_radio"] = true,
["dispatchota_radio"] = true,
["dispatchcp_radio"] = true,
["scanner_radio"] = true,
["request"] = true
}
function Schema:MessageReceived(speaker, info)
if (!speaker or !info or !info.chatType or !info.text) then return end
if (chatTypes[info.chatType]) then
PlaySentence(speaker, #info.text)
end
end
function GAMEMODE:KeyRelease(client, key)
if (!IsFirstTimePredicted()) then
return
end
if (key == IN_USE) then
local weapon = client:GetActiveWeapon()
if (weapon and IsValid(weapon) and weapon:GetClass() == "weapon_physgun") then return false end
if (!ix.menu.IsOpen()) then
local data = {}
data.start = client:GetShootPos()
data.endpos = data.start + client:GetAimVector() * 96
data.filter = client
local entity = util.TraceLine(data).Entity
if (IsValid(entity) and isfunction(entity.GetEntityMenu)) then
hook.Run("ShowEntityMenu", entity)
end
end
timer.Remove("ixItemUse")
client.ixInteractionTarget = nil
client.ixInteractionStartTime = nil
end
end
function Schema:CreateExtraCharacterTabInfo(character, informationSubframe, CreatePart)
if (LocalPlayer():IsCombine()) then
local editBodygroupsButton = informationSubframe:Add("DButton")
editBodygroupsButton:Dock(BOTTOM)
editBodygroupsButton:DockMargin(0, SScaleMin(25 / 3), 0, 0)
editBodygroupsButton:SetText("Modifier les groupes de corps")
editBodygroupsButton:SetFont("MenuFontBoldNoClamp")
editBodygroupsButton:SetTall(SScaleMin(16.666666666667))
editBodygroupsButton.Paint = function(_, w, h)
surface.SetDrawColor(0, 0, 0, 100)
surface.DrawRect(0, 1, w - 2, h - 1)
surface.SetDrawColor(Color(111, 111, 136, 255 / 100 * 30))
surface.DrawOutlinedRect(0, 0, w, h)
end
editBodygroupsButton.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
local panel = vgui.Create("ixBodygroupView")
panel:SetViewModel(LocalPlayer():GetModel())
panel:SetTarget(LocalPlayer(), LocalPlayer():GetCharacter():GetProxyColors())
end
end
end