mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
525 lines
15 KiB
Lua
525 lines
15 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/
|
|
--]]
|
|
|
|
local PLUGIN = PLUGIN
|
|
|
|
PLUGIN.name = "Willard UI"
|
|
PLUGIN.author = "Fruity"
|
|
PLUGIN.description = "The UI for Willard Industries."
|
|
PLUGIN.menuBackgrounds = PLUGIN.menuBackgrounds or {}
|
|
PLUGIN.logoData = PLUGIN.logoData or {}
|
|
PLUGIN.buttonColors = PLUGIN.buttonColors or {}
|
|
|
|
ix.util.Include("sh_fonts.lua")
|
|
ix.util.Include("sh_hud.lua")
|
|
ix.util.Include("cl_overrides.lua")
|
|
ix.util.Include("sv_plugin.lua")
|
|
ix.util.IncludeDir("helix/plugins/willardinterface/editablequiz", true)
|
|
ix.util.IncludeDir("helix/plugins/willardinterface/mainmenu-manager", true)
|
|
ix.util.IncludeDir("helix/plugins/willardinterface/editablequiz/derma", true)
|
|
ix.util.IncludeDir("helix/plugins/willardinterface/mainmenu-manager/derma", true)
|
|
|
|
CAMI.RegisterPrivilege({
|
|
Name = "Helix - Character Creation Bypass",
|
|
MinAccess = "admin"
|
|
})
|
|
|
|
ix.config.Add("CharCreationDisabled", false, "Si la création de caractères est activée ou non.", nil, {
|
|
category = "Personnages"
|
|
})
|
|
|
|
ix.config.Add("IntroTextLong", "", "Le long texte affiché dans l'intro.", nil, {
|
|
category = "Apparence",
|
|
type = ix.type.string
|
|
})
|
|
|
|
ix.lang.AddTable("english", {
|
|
optDisableAutoScrollChat = "Désactiver le chat à défilement automatique",
|
|
optdDisableAutoScrollChat = "Si oui ou non la chatbox ne doit PAS défiler automatiquement."
|
|
})
|
|
|
|
ix.lang.AddTable("spanish", {
|
|
optDisableAutoScrollChat = "Desactiva el Auto Scroll del Chat"
|
|
})
|
|
|
|
ix.option.Add("disableAutoScrollChat", ix.type.bool, false, {
|
|
category = "Chat"
|
|
})
|
|
|
|
ix.config.Add("ShowCPsOnScoreboard", true, "Que les unités PC apparaisse ou non sur le tableau de bord.", nil, {
|
|
category = "Personnages"
|
|
})
|
|
|
|
ix.config.Add("CheckCrimeAmountNeeded", 4,
|
|
"Combien d'unités PC doivent être en ligne avant que la commande CheckCrime n'autorise le crime.", nil, {
|
|
data = {min = 1, max = 10},
|
|
category = "Personnages"
|
|
})
|
|
|
|
ix.config.Add("CheckPettyAmountNeeded", 2,
|
|
"How many CP's are required to be online before the CheckPetty command allows petty crime.", nil, {
|
|
data = {min = 1, max = 5},
|
|
category = "Characters"
|
|
})
|
|
|
|
ix.config.Add("CheckOverwatchAmountNeeded", 4,
|
|
"How many CCG or OTA are required to be online before the CheckOverwatch command allows crime.", nil, {
|
|
data = {min = 1, max = 8},
|
|
category = "Characters"
|
|
})
|
|
|
|
ix.config.Add("CheckPettyAmountNeeded", 2,
|
|
"How many CP's are required to be online before the CheckPetty command allows petty crime.", nil, {
|
|
data = {min = 1, max = 5},
|
|
category = "Characters"
|
|
})
|
|
|
|
ix.config.Add("CheckOverwatchAmountNeeded", 4,
|
|
"How many CCG or OTA are required to be online before the CheckOverwatch command allows crime.", nil, {
|
|
data = {min = 1, max = 8},
|
|
category = "Characters"
|
|
})
|
|
|
|
ix.command.Add("CheckCrime", {
|
|
description = "Voyez s'il y a suffisamment de PC en ligne pour commettre un crime.",
|
|
OnRun = function(self, client)
|
|
local count = 0
|
|
for _, v in pairs(player.GetAll()) do
|
|
if !IsValid(v) then continue end
|
|
--luacheck: ignore 1
|
|
if v:Team() != FACTION_CP then continue end
|
|
|
|
count = count + 1
|
|
end
|
|
|
|
if count >= ix.config.Get("CheckCrimeAmountNeeded", 4) then
|
|
client:Notify("Il y a suffisamment d'unité PC en ligne pour commettre un crime.")
|
|
else
|
|
client:Notify("Pas assez d'unité PC en ligne pour commettre des crimes.")
|
|
end
|
|
end
|
|
})
|
|
|
|
ix.command.Add("CheckPetty", {
|
|
description = "See if there are enough CP's online to commit a petty crime.",
|
|
OnRun = function(self, client)
|
|
local count = 0
|
|
for _, v in pairs(player.GetAll()) do
|
|
if !IsValid(v) then continue end
|
|
--luacheck: ignore 1
|
|
if v:Team() != FACTION_CP then continue end
|
|
|
|
count = count + 1
|
|
end
|
|
|
|
if count >= ix.config.Get("CheckPettyAmountNeeded", 2) then
|
|
client:Notify("There are enough CPs online to commit petty crime.")
|
|
else
|
|
client:Notify("Not enough CPs online to commit petty crimes.")
|
|
end
|
|
end
|
|
})
|
|
|
|
ix.command.Add("CheckOverwatch", {
|
|
description = "See if there are enough CCG or OTA online to commit a major crime on Nexus or Administrative functions.",
|
|
OnRun = function(self, client)
|
|
local count = 0
|
|
for _, v in pairs(player.GetAll()) do
|
|
if !IsValid(v) then continue end
|
|
--luacheck: ignore 1
|
|
if v:Team() != FACTION_OTA then continue end
|
|
|
|
count = count + 1
|
|
end
|
|
|
|
if count >= ix.config.Get("CheckOverwatchAmountNeeded", 4) then
|
|
client:Notify("There are enough OTA online to commit an assault on Overwatch.")
|
|
else
|
|
client:Notify("Not enough OTA online to commit an assault on Overwatch.")
|
|
end
|
|
end
|
|
})
|
|
|
|
ix.command.Add("CheckPetty", {
|
|
description = "See if there are enough CP's online to commit a petty crime.",
|
|
OnRun = function(self, client)
|
|
local count = 0
|
|
for _, v in pairs(player.GetAll()) do
|
|
if !IsValid(v) then continue end
|
|
--luacheck: ignore 1
|
|
if v:Team() != FACTION_CP then continue end
|
|
|
|
count = count + 1
|
|
end
|
|
|
|
if count >= ix.config.Get("CheckPettyAmountNeeded", 2) then
|
|
client:Notify("There are enough CPs online to commit petty crime.")
|
|
else
|
|
client:Notify("Not enough CPs online to commit petty crimes.")
|
|
end
|
|
end
|
|
})
|
|
|
|
ix.command.Add("CheckOverwatch", {
|
|
description = "See if there are enough CCG or OTA online to commit a major crime on Nexus or Administrative functions.",
|
|
OnRun = function(self, client)
|
|
local count = 0
|
|
for _, v in pairs(player.GetAll()) do
|
|
if !IsValid(v) then continue end
|
|
--luacheck: ignore 1
|
|
if v:Team() != FACTION_OTA then continue end
|
|
|
|
count = count + 1
|
|
end
|
|
|
|
if count >= ix.config.Get("CheckOverwatchAmountNeeded", 4) then
|
|
client:Notify("There are enough OTA online to commit an assault on Overwatch.")
|
|
else
|
|
client:Notify("Not enough OTA online to commit an assault on Overwatch.")
|
|
end
|
|
end
|
|
})
|
|
|
|
if (SERVER) then
|
|
function PLUGIN:CanPlayerCreateCharacter(client)
|
|
if (ix.config.Get("CharCreationDisabled") and !CAMI.PlayerHasAccess(client, "Helix - Création de personnage Bypass")) then
|
|
return false
|
|
end
|
|
end
|
|
else
|
|
local genDescColor = Color(255, 255, 255)
|
|
function PLUGIN:PopulateCharacterInfo(client, character, tooltip)
|
|
if (character) then
|
|
local faction = ix.faction.Get(client:Team())
|
|
if (faction.noGenDesc) then return end
|
|
|
|
local geneticDesc = {}
|
|
local bMask = client:GetNetVar("ixMaskEquipped")
|
|
if (!faction.noAge and !bMask and character:GetAge() != "N/A") then
|
|
geneticDesc[#geneticDesc + 1] = character:GetAge()
|
|
end
|
|
if (!faction.noEyeColor and !bMask and character:GetEyeColor() != "N/A") then
|
|
geneticDesc[#geneticDesc + 1] = "Yeux " .. character:GetEyeColor()
|
|
end
|
|
if (!faction.noHeight and character:GetHeight() != "N/A") then
|
|
table.insert(geneticDesc, math.min(2, #geneticDesc + 1), character:GetHeight()..(#geneticDesc > 0 and "" or ""))
|
|
end
|
|
|
|
if (#geneticDesc > 0) then
|
|
local genDesc = tooltip:AddRow("geneticDesc")
|
|
genDesc:SetBackgroundColor(genDescColor)
|
|
genDesc:SetText(string.utf8upper(table.concat(geneticDesc, " | ")))
|
|
genDesc:SizeToContents()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
ix.char.RegisterVar("background", {
|
|
field = "background",
|
|
fieldType = ix.type.string,
|
|
default = "",
|
|
isLocal = true,
|
|
bNoDisplay = true
|
|
})
|
|
|
|
ix.char.RegisterVar("age", {
|
|
field = "age",
|
|
fieldType = ix.type.string,
|
|
default = "N/A",
|
|
bNoDisplay = true
|
|
})
|
|
|
|
ix.char.RegisterVar("height", {
|
|
field = "height",
|
|
fieldType = ix.type.string,
|
|
default = "N/A",
|
|
bNoDisplay = true
|
|
})
|
|
|
|
ix.char.RegisterVar("eyeColor", {
|
|
field = "eyeColor",
|
|
fieldType = ix.type.string,
|
|
default = "N/A",
|
|
bNoDisplay = true
|
|
})
|
|
|
|
ix.char.RegisterVar("hairColor", {
|
|
field = "hairColor",
|
|
fieldType = ix.type.string,
|
|
default = "N/A",
|
|
bNoDisplay = true
|
|
})
|
|
|
|
function PLUGIN:AdjustCreationPayload(client, payload, newPayload)
|
|
if (newPayload.data.background) then
|
|
newPayload.background = newPayload.data.background
|
|
newPayload.data.background = nil
|
|
end
|
|
|
|
if (newPayload.data.age) then
|
|
newPayload.age = newPayload.data.age
|
|
newPayload.data.age = nil
|
|
end
|
|
|
|
if (newPayload.data.height) then
|
|
newPayload.height = newPayload.data.height
|
|
newPayload.data.height = nil
|
|
end
|
|
|
|
if (newPayload.data["couleur des yeux"]) then
|
|
newPayload.eyeColor = newPayload.data["couleur des yeux"]
|
|
newPayload.data["couleur des yeux"] = nil
|
|
end
|
|
end
|
|
|
|
if (CLIENT) then
|
|
hook.Add("CreateMenuButtons", "ixConfig", function(tabs)
|
|
if (!CAMI.PlayerHasAccess(LocalPlayer(), "Helix - Manage Config", nil)) then
|
|
return
|
|
end
|
|
|
|
tabs["Admin"] = {
|
|
|
|
Width = 16,
|
|
|
|
Height = 17,
|
|
|
|
Right = true,
|
|
|
|
Icon = "willardnetworks/tabmenu/navicons/admin.png",
|
|
|
|
Create = function(info, container)
|
|
local settings = container:Add("ixSettings")
|
|
settings:SetSearchEnabled(true)
|
|
|
|
if settings.settingsTitle then
|
|
settings.settingsTitleIcon:SetImage("willardnetworks/tabmenu/navicons/admin.png")
|
|
settings.settingsTitleIcon:SetSize(SScaleMin(16 / 3), SScaleMin(17 / 3))
|
|
|
|
settings.settingsTitle:SetFont("TitlesFontNoClamp")
|
|
settings.settingsTitle:SetText("Admin")
|
|
settings.settingsTitle:SetPos(SScaleMin(26 / 3))
|
|
settings.settingsTitle:SizeToContents()
|
|
settings.settingsTitle:SetPos(SScaleMin(26 / 3), settings.settingsTitleIcon:GetTall()
|
|
* 0.5 - settings.settingsTitle:GetTall() * 0.5)
|
|
end
|
|
|
|
-- gather categories
|
|
local categories = {}
|
|
local categoryIndices = {}
|
|
|
|
for k, v in pairs(ix.config.stored) do
|
|
local index = v.data and v.data.category or "misc"
|
|
|
|
categories[index] = categories[index] or {}
|
|
categories[index][k] = v
|
|
end
|
|
|
|
-- sort by category phrase
|
|
for k, _ in pairs(categories) do
|
|
categoryIndices[#categoryIndices + 1] = k
|
|
end
|
|
|
|
table.sort(categoryIndices, function(a, b)
|
|
return L(a) < L(b)
|
|
end)
|
|
|
|
-- add panels
|
|
for _, category in ipairs(categoryIndices) do
|
|
local categoryPhrase = L(category)
|
|
settings:AddCategory(categoryPhrase)
|
|
|
|
-- we can use sortedpairs since configs don't have phrases to account for
|
|
for k, v in SortedPairs(categories[category]) do
|
|
if (isfunction(v.hidden) and v.hidden()) then
|
|
continue
|
|
end
|
|
|
|
local data = v.data.data
|
|
local type = v.type
|
|
local value = ix.util.SanitizeType(type, ix.config.Get(k))
|
|
|
|
-- @todo check ix.gui.properties
|
|
local row = settings:AddRow(type, categoryPhrase)
|
|
row:SetText(ix.util.ExpandCamelCase(k))
|
|
row:Populate(v.data.key, v.data)
|
|
|
|
-- type-specific properties
|
|
if (type == ix.type.number) then
|
|
row:SetMin(data and data.min or 0)
|
|
row:SetMax(data and data.max or 1)
|
|
row:SetDecimals(data and data.decimals or 0)
|
|
end
|
|
|
|
row:SetValue(value, true)
|
|
row:SetShowReset(value != v.default, k, v.default)
|
|
|
|
row.OnValueChanged = function(panel)
|
|
local newValue = ix.util.SanitizeType(type, panel:GetValue())
|
|
|
|
panel:SetShowReset(newValue != v.default, k, v.default)
|
|
|
|
net.Start("ixConfigSet")
|
|
net.WriteString(k)
|
|
net.WriteType(newValue)
|
|
net.SendToServer()
|
|
end
|
|
|
|
row.OnResetClicked = function(panel)
|
|
panel:SetValue(v.default, true)
|
|
panel:SetShowReset(false)
|
|
|
|
net.Start("ixConfigSet")
|
|
net.WriteString(k)
|
|
net.WriteType(v.default)
|
|
net.SendToServer()
|
|
end
|
|
|
|
row:GetLabel():SetHelixTooltip(function(tooltip)
|
|
local title = tooltip:AddRow("name")
|
|
title:SetImportant()
|
|
title:SetText(k)
|
|
title:SizeToContents()
|
|
title:SetMaxWidth(math.max(title:GetMaxWidth(), ScrW() * 0.5))
|
|
|
|
local description = tooltip:AddRow("description")
|
|
description:SetText(v.description)
|
|
description:SizeToContents()
|
|
end)
|
|
end
|
|
end
|
|
|
|
settings:SizeToContents()
|
|
container.panel = settings
|
|
|
|
if settings.titlePanel then
|
|
local pluginManager = settings.titlePanel:Add("DButton")
|
|
pluginManager:Dock(RIGHT)
|
|
pluginManager:SetWide(SScaleMin(100 / 3))
|
|
pluginManager:SetFont("TitlesFontNoClamp")
|
|
pluginManager:SetText("PLUGINS")
|
|
pluginManager:DockMargin(0, 0, 0, settings.titlePanel:GetTall() - SScaleMin(26 / 3))
|
|
pluginManager.Paint = function(self, w, h)
|
|
surface.SetDrawColor(ColorAlpha(color_white, 100))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
end
|
|
|
|
pluginManager.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
for _, v in pairs(container.panel:GetChildren()) do
|
|
v:SetVisible(false)
|
|
end
|
|
|
|
ix.gui.pluginManager = container.panel:Add("ixPluginManager")
|
|
|
|
if ix.gui.pluginManager.settingsTitle then
|
|
ix.gui.pluginManager.settingsTitle:SetText("Plugins")
|
|
|
|
local configManager = ix.gui.pluginManager.titlePanel:Add("DButton")
|
|
configManager:Dock(RIGHT)
|
|
configManager:SetWide(SScaleMin(100 / 3))
|
|
configManager:SetFont("TitlesFontNoClamp")
|
|
configManager:SetText("CONFIG")
|
|
configManager:DockMargin(0, 0, 0, settings.titlePanel:GetTall() - SScaleMin(26 / 3))
|
|
configManager.Paint = function(self, w, h)
|
|
surface.SetDrawColor(ColorAlpha(color_white, 100))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
end
|
|
|
|
configManager.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
for _, v in pairs(container.panel:GetChildren()) do
|
|
v:SetVisible(true)
|
|
end
|
|
|
|
ix.gui.pluginManager:Remove()
|
|
end
|
|
end
|
|
end
|
|
|
|
local quizManager = settings.titlePanel:Add("DButton")
|
|
quizManager:Dock(RIGHT)
|
|
quizManager:SetWide(SScaleMin(150 / 3))
|
|
quizManager:SetFont("TitlesFontNoClamp")
|
|
quizManager:SetText("QUIZ MANAGER")
|
|
quizManager:DockMargin(0, 0, SScaleMin(10 / 3), settings.titlePanel:GetTall() - SScaleMin(26 / 3))
|
|
quizManager.Paint = function(self, w, h)
|
|
surface.SetDrawColor(ColorAlpha(color_white, 100))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
end
|
|
|
|
quizManager.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
vgui.Create("QuizPanel")
|
|
end
|
|
|
|
local mainMenuManager = settings.titlePanel:Add("DButton")
|
|
mainMenuManager:Dock(RIGHT)
|
|
mainMenuManager:SetWide(SScaleMin(220 / 3))
|
|
mainMenuManager:SetFont("TitlesFontNoClamp")
|
|
mainMenuManager:SetText("MAIN MENU MANAGER")
|
|
mainMenuManager:DockMargin(0, 0, SScaleMin(10 / 3), settings.titlePanel:GetTall() - SScaleMin(26 / 3))
|
|
mainMenuManager.Paint = function(self, w, h)
|
|
surface.SetDrawColor(ColorAlpha(color_white, 100))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
end
|
|
|
|
mainMenuManager.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
vgui.Create("MainMenuManager")
|
|
end
|
|
end
|
|
end,
|
|
|
|
OnSelected = function(info, container)
|
|
container.panel.searchEntry:RequestFocus()
|
|
end,
|
|
|
|
RowNumber = 6
|
|
}
|
|
end)
|
|
|
|
hook.Add("Think", "F1Menu", function()
|
|
if input.IsKeyDown( KEY_F1 ) then
|
|
if ix.gui.menu and ix.gui.menu:IsVisible() then
|
|
return
|
|
end
|
|
|
|
if ix.gui.characterMenu and ix.gui.characterMenu:IsVisible() then
|
|
return
|
|
end
|
|
|
|
if ix.gui.protectionTeams and ix.gui.protectionTeams:IsVisible() then
|
|
return
|
|
end
|
|
|
|
if LocalPlayer():GetCharacter() then
|
|
if ix.gui.F1Menu and ix.gui.F1Menu:IsVisible() then
|
|
return
|
|
end
|
|
|
|
ix.gui.F1Menu = vgui.Create("ixF1Menu")
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
function PLUGIN:LoadData()
|
|
local loaded = ix.data.Get("menuData", {})
|
|
self.menuBackgrounds = loaded[1] or {}
|
|
self.logoData = loaded[2] or {}
|
|
self.buttonColors = loaded[3] or {}
|
|
end
|
|
|
|
function PLUGIN:SaveData()
|
|
ix.data.Set("menuData", {self.menuBackgrounds, self.logoData, self.buttonColors})
|
|
end
|