This commit is contained in:
lifestorm
2024-08-04 23:12:27 +03:00
parent 0e770b2b49
commit ba1fc01b16
7084 changed files with 2173495 additions and 14 deletions

View File

@@ -0,0 +1,325 @@
--[[
| 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/
--]]
ix.hud.appendixColors = {
["yellow"] = Color(255, 204, 0, 255),
["red"] = Color(255, 78, 69, 255),
["green"] = Color(128, 200, 97, 255),
["blue"] = Color(85, 194, 240, 255)
}
local function DrawAppendixTable(tooltip, data)
for color, text in pairs(data) do
text = tostring(text)
if (text != "" and text != " ") then
text = L(text)
end
local appendix = tooltip:Add("DLabel")
appendix:SetText(text or "NOAPPENDIXTEXT")
appendix:SetTextColor(ix.hud.appendixColors[color] or color_white)
appendix:SetTextInset(15, 0)
appendix:Dock(BOTTOM)
appendix:DockMargin(0, 0, 0, 5)
appendix:SetFont("ixSmallFont")
appendix:SizeToContents()
appendix:SetTall(appendix:GetTall() + 15)
end
end
function DFrameFixer(parent, bShouldNotPopup, bNoBackgroundBlur, bOverridePaint)
if !bShouldNotPopup then
parent:MakePopup()
end
if !bNoBackgroundBlur then
parent:SetBackgroundBlur(true)
end
parent:SetDeleteOnClose(true)
parent.PerformLayoutWindow = function(this)
local titlePush = 0
if (IsValid(this.imgIcon)) then
this.imgIcon:SetPos(SScaleMin(5 / 3), SScaleMin(5 / 3))
this.imgIcon:SetSize(SScaleMin(16 / 3), SScaleMin(16 / 3))
titlePush = SScaleMin(16 / 3)
end
this.btnClose:SetPos(this:GetWide() - SScaleMin(31 / 3) - (0 - SScaleMin(4 / 3)), 0)
this.btnClose:SetSize(SScaleMin(31 / 3), SScaleMin(24 / 3))
this.btnMaxim:SetPos(this:GetWide() - SScaleMin(31 / 3) * 2 - (0 - SScaleMin(4 / 3)), 0)
this.btnMaxim:SetSize(SScaleMin(31 / 3), SScaleMin(24 / 3))
this.btnMinim:SetPos(this:GetWide() - SScaleMin(31 / 3) * 3 - (0 - SScaleMin(4 / 3)), 0)
this.btnMinim:SetSize(SScaleMin(31 / 3), SScaleMin(24 / 3))
this.lblTitle:SetPos(SScaleMin(8 / 3) + titlePush, SScaleMin(2 / 3))
this.lblTitle:SetSize(this:GetWide() - SScaleMin(25 / 3) - titlePush, SScaleMin(20 / 3))
end
if (!bOverridePaint) then
parent.Paint = function(this, w, h)
if (this.m_bBackgroundBlur) then
Derma_DrawBackgroundBlur(this, this.m_fCreateTime)
end
surface.SetDrawColor(Color(40, 40, 40, 100))
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(Color(111, 111, 136, 255 / 100 * 30))
surface.DrawOutlinedRect(0, 0, w, h)
surface.DrawRect(0, 0, w, this.lblTitle:GetTall() + SScaleMin(5 / 3))
return true
end
end
parent.lblTitle:SetFont("MenuFontNoClamp")
parent.lblTitle:SizeToContents()
end
function ix.hud.PopulateItemTooltip(tooltip, item, bShowcase)
local labelName = item:GetData("labelName")
local labelDesc = item:GetData("labelDescription")
local name = tooltip:AddRow("name")
name:SetImportant()
name:SetText((labelName and ("\"" .. labelName .. "\"")) or (item.GetName and item:GetName()) or L(item.name))
name:SetMaxWidth(math.max(name:GetMaxWidth(), ScrW() * 0.5))
name:SizeToContents()
local description = tooltip:AddRow("description")
description:SetText(labelDesc and ("The label reads: \"" .. labelDesc .. "\"") or item:GetDescription() or "")
description:SizeToContents()
if item.invID or bShowcase then
if (item.GetColorAppendix) then
if (isfunction(item.GetColorAppendix) and istable(item:GetColorAppendix()) and item:GetColorAppendix() != false) then
DrawAppendixTable(tooltip, item:GetColorAppendix())
end
end
if (item.colorAppendix and istable(item.colorAppendix)) then
DrawAppendixTable(tooltip, item.colorAppendix)
end
end
if (item.PopulateTooltip) then
item:PopulateTooltip(tooltip)
end
hook.Run("PopulateItemTooltip", tooltip, item)
end
function Derma_Query( strText, strTitle, ... )
local Window = vgui.Create( "DFrame" )
Window:SetTitle( strTitle or "Message Title (First Parameter)" )
Window:SetDraggable( false )
Window:ShowCloseButton( false )
Window:SetDrawOnTop( true )
DFrameFixer(Window)
local InnerPanel = vgui.Create( "DPanel", Window )
InnerPanel:SetPaintBackground( false )
local Text = vgui.Create( "DLabel", InnerPanel )
Text:SetText( strText or "Message Text (Second Parameter)" )
Text:SetFont("MenuFontNoClamp")
Text:SizeToContents()
Text:SetContentAlignment( 5 )
Text:SetTextColor( color_white )
local ButtonPanel = vgui.Create( "DPanel", Window )
ButtonPanel:SetTall( SScaleMin(30 / 3) )
ButtonPanel:SetPaintBackground( false )
-- Loop through all the options and create buttons for them.
local NumOptions = 0
local x = 5
for k=1, 8, 2 do
local Text = select( k, ... )
if Text == nil then break end
local Func = select( k+1, ... ) or function() end
local Button = vgui.Create( "DButton", ButtonPanel )
Button:SetText( Text )
Button:SetFont("MenuFontNoClamp")
Button:SizeToContents()
Button:SetTall( SScaleMin(25 / 3) )
Button:SetWide( Button:GetWide() + SScaleMin(20 / 3) )
Button.DoClick = function() Window:Close() Func() end
Button:SetPos( x, SScaleMin(5 / 3) )
x = x + Button:GetWide() + SScaleMin(5 / 3)
ButtonPanel:SetWide( x )
NumOptions = NumOptions + 1
end
local w, h = Text:GetSize()
w = math.max( w, ButtonPanel:GetWide() )
Window:SetSize( w + SScaleMin(50 / 3), h + SScaleMin(25 / 3) + SScaleMin(45 / 3) + SScaleMin(10 / 3) )
Window:Center()
InnerPanel:StretchToParent( SScaleMin(5 / 3), SScaleMin(25 / 3), SScaleMin(5 / 3), SScaleMin(45 / 3) )
Text:StretchToParent( SScaleMin(5 / 3), SScaleMin(5 / 3), SScaleMin(5 / 3), SScaleMin(5 / 3) )
ButtonPanel:CenterHorizontal()
ButtonPanel:AlignBottom( 8 )
Window:DoModal()
if ( NumOptions == 0 ) then
Window:Close()
Error( "Derma_Query: Created Query with no Options!?" )
return nil
end
return Window
end
function Derma_StringRequest( strTitle, strText, strDefaultText, fnEnter, fnCancel, strButtonText, strButtonCancelText, fuckYouModal )
local Window = vgui.Create( "DFrame" )
Window:SetTitle( strTitle or "Message Title (First Parameter)" )
Window:SetDraggable( false )
Window:ShowCloseButton( false )
Window:SetDrawOnTop( true )
DFrameFixer(Window)
local InnerPanel = vgui.Create( "DPanel", Window )
InnerPanel:SetPaintBackground( false )
local Text = vgui.Create( "DLabel", InnerPanel )
Text:SetText( strText or "Message Text (Second Parameter)" )
Text:SetFont("MenuFontNoClamp")
Text:SizeToContents()
Text:SetContentAlignment( 5 )
Text:SetTextColor( color_white )
local TextEntry = vgui.Create( "DTextEntry", InnerPanel )
TextEntry:SetText( strDefaultText or "" )
TextEntry:SetFont("MenuFontNoClamp")
TextEntry.OnEnter = function() Window:Close() fnEnter( TextEntry:GetValue() ) end
TextEntry:SetTall(Text:GetTall())
local ButtonPanel = vgui.Create( "DPanel", Window )
ButtonPanel:SetTall( SScaleMin(30 / 3) )
ButtonPanel:SetPaintBackground( false )
local Button = vgui.Create( "DButton", ButtonPanel )
Button:SetText( strButtonText or "OK" )
Button:SetFont("MenuFontNoClamp")
Button:SizeToContents()
Button:SetTall( SScaleMin(25 / 3) )
Button:SetWide( Button:GetWide() + SScaleMin(20 / 3) )
Button:SetPos( SScaleMin(5 / 3), SScaleMin(5 / 3) )
Button.DoClick = function() Window:Close() fnEnter( TextEntry:GetValue() ) end
local ButtonCancel = vgui.Create( "DButton", ButtonPanel )
ButtonCancel:SetText( strButtonCancelText or "Cancel" )
ButtonCancel:SetFont("MenuFontNoClamp")
ButtonCancel:SizeToContents()
ButtonCancel:SetTall( SScaleMin(25 / 3) )
ButtonCancel:SetWide( Button:GetWide() + SScaleMin(20 / 3) )
ButtonCancel:SetPos( SScaleMin(5 / 3), SScaleMin(5 / 3) )
ButtonCancel.DoClick = function() Window:Close() if ( fnCancel ) then fnCancel( TextEntry:GetValue() ) end end
ButtonCancel:MoveRightOf( Button, SScaleMin(5 / 3) )
ButtonPanel:SetWide( Button:GetWide() + SScaleMin(5 / 3) + ButtonCancel:GetWide() + SScaleMin(10 / 3) )
local w, h = Text:GetSize()
w = math.max( w, SScaleMin(400 / 3) )
Window:SetSize( w + SScaleMin(50 / 3), h + SScaleMin(25 / 3) + SScaleMin(75 / 3) + SScaleMin(10 / 3) )
Window:Center()
InnerPanel:StretchToParent( SScaleMin(5 / 3), SScaleMin(25 / 3), SScaleMin(5 / 3), SScaleMin(45 / 3) )
Text:StretchToParent( SScaleMin(5 / 3), SScaleMin(5 / 3), SScaleMin(5 / 3), SScaleMin(35 / 3) )
TextEntry:StretchToParent( SScaleMin(5 / 3), nil, SScaleMin(5 / 3), nil )
TextEntry:AlignBottom( 5 )
TextEntry:RequestFocus()
TextEntry:SelectAllText( true )
ButtonPanel:CenterHorizontal()
ButtonPanel:AlignBottom( 8 )
if !fuckYouModal then
Window:DoModal()
end
return Window
end
function PLUGIN:StartChat()
if IsValid(ix.gui.chat) then
if (IsValid(self.disableAutoScroll)) then
self.disableAutoScroll:Remove()
end
self.disableAutoScroll = vgui.Create("DButton")
self.disableAutoScroll:SetText(ix.option.Get("disableAutoScrollChat", false) and "Enable Auto Scroll" or "Disable Auto Scroll")
self.disableAutoScroll:SetFont("DebugFixedRadio")
self.disableAutoScroll:SizeToContents()
self.disableAutoScroll.Paint = nil
self.disableAutoScroll.Think = function(this)
if IsValid(ix.gui.chat) then
if !ix.gui.chat.GetPos or !ix.gui.chat.GetWide then return end
if !IsValid(self.disableAutoScroll) or (IsValid(self.disableAutoScroll) and !self.disableAutoScroll.GetWide) then return end
local x, y = ix.gui.chat:GetPos()
y = y - SScaleMin(20 / 3)
x = x + ix.gui.chat:GetWide() - self.disableAutoScroll:GetWide()
self.disableAutoScroll:SetPos(x, y)
end
end
self.disableAutoScroll.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
if ix.option.Get("disableAutoScrollChat", false) then
ix.option.Set("disableAutoScrollChat", false)
else
ix.option.Set("disableAutoScrollChat", true)
end
self.disableAutoScroll:SetText(ix.option.Get("disableAutoScrollChat", false) and "Enable Auto Scroll" or "Disable Auto Scroll")
self.disableAutoScroll:SizeToContents()
end
end
end
function PLUGIN:FinishChat()
if self.disableAutoScroll and IsValid(self.disableAutoScroll) then
self.disableAutoScroll:Remove()
end
end

View File

@@ -0,0 +1,196 @@
--[[
| 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/
--]]
-- bar manager
-- this manages positions for bar panels
local PANEL = {}
AccessorFunc(PANEL, "padding", "Padding", FORCE_NUMBER)
function PANEL:Init()
self:SetSize(ScrW() * 0.35, ScrH())
self:SetPos(4, 4)
self:ParentToHUD()
self.bars = {}
self.padding = 2
-- add bars that were registered before manager creation
for _, v in ipairs(ix.bar.list) do
v.panel = self:AddBar(v.index, v.color, v.priority)
end
end
function PANEL:GetAll()
return self.bars
end
function PANEL:Clear()
for k, v in ipairs(self.bars) do
v:Remove()
table.remove(self.bars, k)
end
end
function PANEL:AddBar(index, color, priority)
local panel = self:Add("ixInfoBar")
panel:SetSize(self:GetWide(), BAR_HEIGHT)
panel:SetVisible(false)
panel:SetID(index)
panel:SetColor(color)
panel:SetPriority(priority)
self.bars[#self.bars + 1] = panel
self:Sort()
return panel
end
function PANEL:RemoveBar(panel)
local toRemove
for k, v in ipairs(self.bars) do
if (v == panel) then
toRemove = k
break
end
end
if (toRemove) then
table.remove(self.bars, toRemove)
end
panel:Remove()
self:Sort()
end
-- sort bars by priority
function PANEL:Sort()
table.sort(self.bars, function(a, b)
return a:GetPriority() < b:GetPriority()
end)
end
-- update target Y positions
function PANEL:Organize()
local currentY = 0
for _, v in ipairs(self.bars) do
if (!v:IsVisible()) then
continue
end
v:SetPos(0, currentY)
currentY = currentY + self.padding + v:GetTall()
end
self:SetSize(self:GetWide(), currentY)
end
function PANEL:Think()
local menu = (IsValid(ix.gui.characterMenu) and !ix.gui.characterMenu:IsClosing()) and ix.gui.characterMenu
or IsValid(ix.gui.menu) and ix.gui.menu
local fraction = menu and 1 - menu.currentAlpha / 255 or 1
self:SetAlpha(255 * fraction)
-- don't update bars when not visible
if (fraction == 0) then
return
end
local curTime = CurTime()
local bShouldHide = hook.Run("ShouldHideBars")
local bAlwaysShow = ix.option.Get("alwaysShowBars", false)
for _, v in ipairs(self.bars) do
v:SetVisible(false)
end
self:Organize()
end
function PANEL:OnRemove()
self:Clear()
end
vgui.Register("ixInfoBarManager", PANEL, "Panel")
PANEL = {}
AccessorFunc(PANEL, "index", "ID", FORCE_NUMBER)
AccessorFunc(PANEL, "color", "Color")
AccessorFunc(PANEL, "priority", "Priority", FORCE_NUMBER)
AccessorFunc(PANEL, "value", "Value", FORCE_NUMBER)
AccessorFunc(PANEL, "delta", "Delta", FORCE_NUMBER)
AccessorFunc(PANEL, "lifetime", "Lifetime", FORCE_NUMBER)
function PANEL:Init()
self.value = 0
self.delta = 0
self.lifetime = 0
self.bar = self:Add("DPanel")
self.bar:SetPaintedManually(true)
self.bar:Dock(FILL)
self.bar:DockMargin(2, 2, 2, 2)
self.bar.Paint = function(this, width, height)
width = width * math.min(self.delta, 1)
derma.SkinFunc("PaintInfoBar", self, width, height, self.color)
end
self.label = self:Add("DLabel")
self.label:SetFont("ixSmallFont")
self.label:SetContentAlignment(5)
self.label:SetText("")
self.label:SetTextColor(Color(240, 240, 240))
self.label:SetExpensiveShadow(2, Color(20, 20, 20))
self.label:SetPaintedManually(true)
self.label:SizeToContents()
self.label:Dock(FILL)
end
function PANEL:SetText(text)
self.label:SetText(text)
self.label:SizeToContents()
end
function PANEL:Think()
local value = math.Approach(self.delta, self.value, FrameTime())
-- fix for smooth bar changes (increase of 0.01 every 0.1sec for example)
if (value == self.value and self.delta != self.value and self.value != 0 and self.value != 1) then
value = self.delta
end
self.delta = value
end
function PANEL:Paint(width, height)
surface.SetDrawColor(230, 230, 230, 15)
surface.DrawRect(0, 0, width, height)
surface.DrawOutlinedRect(0, 0, width, height)
self.bar:PaintManual()
DisableClipping(true)
self.label:PaintManual()
DisableClipping(false)
end
vgui.Register("ixInfoBar", PANEL, "Panel")
if (IsValid(ix.gui.bars)) then
ix.gui.bars:Remove()
ix.gui.bars = vgui.Create("ixInfoBarManager")
end

View File

@@ -0,0 +1,474 @@
--[[
| 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 PANEL = {}
function PANEL:Init()
-- being relative.
local size = 120
self:SetSize(size, size * 1.4)
end
function PANEL:SetItem(itemTable)
self.itemName = L(itemTable.name):utf8lower()
self.price = self:Add("DLabel")
self.price:Dock(BOTTOM)
self.price:SetText(itemTable.price and ix.currency.Get(itemTable.price) or L"free":utf8upper())
self.price:SetContentAlignment(5)
self.price:SetTextColor(color_white)
self.price:SetFont("ixSmallFont")
self.price:SetExpensiveShadow(1, Color(0, 0, 0, 200))
self.name = self:Add("DLabel")
self.name:Dock(TOP)
self.name:SetText(itemTable.GetName and itemTable:GetName() or L(itemTable.name))
self.name:SetContentAlignment(5)
self.name:SetTextColor(color_white)
self.name:SetFont("ixSmallFont")
self.name:SetExpensiveShadow(1, Color(0, 0, 0, 200))
self.name.Paint = function(this, w, h)
surface.SetDrawColor(0, 0, 0, 75)
surface.DrawRect(0, 0, w, h)
end
self.icon = self:Add("SpawnIcon")
self.icon:SetZPos(1)
self.icon:SetSize(self:GetWide(), self:GetWide())
self.icon:Dock(FILL)
self.icon:DockMargin(5, 5, 5, 10)
self.icon:InvalidateLayout(true)
self.icon:SetModel(itemTable:GetModel(), itemTable:GetSkin())
self.icon:SetHelixTooltip(function(tooltip)
ix.hud.PopulateItemTooltip(tooltip, itemTable)
end)
self.icon.itemTable = itemTable
self.icon.DoClick = function(this)
if (!IsValid(ix.gui.checkout) and (this.nextClick or 0) < CurTime()) then
local parent = ix.gui.business
parent:BuyItem(itemTable.uniqueID)
surface.PlaySound("buttons/button14.wav")
this.nextClick = CurTime() + 0.5
end
end
self.icon.PaintOver = function(this)
if (itemTable and itemTable.PaintOver) then
local w, h = this:GetSize()
itemTable.PaintOver(this, itemTable, w, h)
end
end
if ((itemTable.iconCam and !ICON_RENDER_QUEUE[itemTable.uniqueID]) or itemTable.forceRender) then
local iconCam = itemTable.iconCam
iconCam = {
cam_pos = iconCam.pos,
cam_fov = iconCam.fov,
cam_ang = iconCam.ang,
}
ICON_RENDER_QUEUE[itemTable.uniqueID] = true
self.icon:RebuildSpawnIconEx(
iconCam
)
end
end
vgui.Register("ixBusinessItem", PANEL, "DPanel")
PANEL = {}
function PANEL:Init()
ix.gui.business = self
self:SetSize(self:GetParent():GetSize())
self.categories = self:Add("DScrollPanel")
self.categories:Dock(LEFT)
self.categories:SetWide(260)
self.categories.Paint = function(this, w, h)
surface.SetDrawColor(0, 0, 0, 150)
surface.DrawRect(0, 0, w, h)
end
self.categories:DockPadding(5, 5, 5, 5)
self.categories:DockMargin(0, 46, 0, 0)
self.categoryPanels = {}
self.scroll = self:Add("DScrollPanel")
self.scroll:Dock(FILL)
self.search = self:Add("DTextEntry")
self.search:Dock(TOP)
self.search:SetTall(36)
self.search:SetFont("ixMediumFont")
self.search:DockMargin(10 + self:GetWide() * 0.35, 0, 5, 5)
self.search.OnTextChanged = function(this)
local text = self.search:GetText():utf8lower()
if (self.selected) then
self:LoadItems(self.selected.category, text:find("%S") and text or nil)
self.scroll:InvalidateLayout()
end
end
self.search.PaintOver = function(this, cw, ch)
if (self.search:GetValue() == "" and !self.search:HasFocus()) then
ix.util.DrawText("V", 10, ch/2 - 1, color_black, 3, 1, "ixIconsSmall")
end
end
self.itemList = self.scroll:Add("DIconLayout")
self.itemList:Dock(TOP)
self.itemList:DockMargin(10, 1, 5, 5)
self.itemList:SetSpaceX(10)
self.itemList:SetSpaceY(10)
self.itemList:SetMinimumSize(128, 400)
self.checkout = self:Add("DButton")
self.checkout:Dock(BOTTOM)
self.checkout:SetTextColor(color_white)
self.checkout:SetTall(36)
self.checkout:SetFont("ixMediumFont")
self.checkout:DockMargin(10, 10, 0, 0)
self.checkout:SetExpensiveShadow(1, Color(0, 0, 0, 150))
self.checkout:SetText(L("checkout", 0))
self.checkout.DoClick = function()
if (!IsValid(ix.gui.checkout) and self:GetCartCount() > 0) then
vgui.Create("ixBusinessCheckout"):SetCart(self.cart)
end
end
self.cart = {}
local dark = Color(0, 0, 0, 50)
local first = true
for k, v in pairs(ix.item.list) do
if (hook.Run("CanPlayerUseBusiness", LocalPlayer(), k) == false) then
continue
end
if (!self.categoryPanels[L(v.category)]) then
self.categoryPanels[L(v.category)] = v.category
end
end
for category, realName in SortedPairs(self.categoryPanels) do
local button = self.categories:Add("DButton")
button:SetTall(36)
button:SetText(category)
button:Dock(TOP)
button:SetTextColor(color_white)
button:DockMargin(5, 5, 5, 0)
button:SetFont("ixMediumFont")
button:SetExpensiveShadow(1, Color(0, 0, 0, 150))
button.Paint = function(this, w, h)
surface.SetDrawColor(self.selected == this and ix.config.Get("color") or dark)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(0, 0, 0, 50)
surface.DrawOutlinedRect(0, 0, w, h)
end
button.DoClick = function(this)
if (self.selected != this) then
self.selected = this
self:LoadItems(realName)
timer.Simple(0.01, function()
self.scroll:InvalidateLayout()
end)
end
end
button.category = realName
if (first) then
self.selected = button
first = false
end
self.categoryPanels[realName] = button
end
if (self.selected) then
self:LoadItems(self.selected.category)
end
end
function PANEL:GetCartCount()
local count = 0
for _, v in pairs(self.cart) do
count = count + v
end
return count
end
function PANEL:BuyItem(uniqueID)
self.cart[uniqueID] = (self.cart[uniqueID] or 0) + 1
self.checkout:SetText(L("checkout", self:GetCartCount()))
end
function PANEL:LoadItems(category, search)
category = category or "misc"
local items = ix.item.list
self.itemList:Clear()
self.itemList:InvalidateLayout(true)
for uniqueID, itemTable in SortedPairsByMemberValue(items, "name") do
if (hook.Run("CanPlayerUseBusiness", LocalPlayer(), uniqueID) == false) then
continue
end
if (itemTable.category == category) then
if (search and search != "" and !L(itemTable.name):utf8lower():find(search, 1, true)) then
continue
end
self.itemList:Add("ixBusinessItem"):SetItem(itemTable)
end
end
end
function PANEL:SetPage()
end
function PANEL:GetPageItems()
end
vgui.Register("ixBusiness", PANEL, "EditablePanel")
DEFINE_BASECLASS("DFrame")
PANEL = {}
function PANEL:Init()
if (IsValid(ix.gui.checkout)) then
ix.gui.checkout:Remove()
end
ix.gui.checkout = self
self:SetTitle(L("checkout", 0))
self:SetSize(ScrW() / 4 > 200 and ScrW() / 4 or ScrW() / 2, ScrH() / 2 > 300 and ScrH() / 2 or ScrH())
self:MakePopup()
self:Center()
self:SetBackgroundBlur(true)
self:SetSizable(true)
self.items = self:Add("DScrollPanel")
self.items:Dock(FILL)
self.items.Paint = function(this, w, h)
surface.SetDrawColor(0, 0, 0, 100)
surface.DrawRect(0, 0, w, h)
end
self.items:DockMargin(0, 0, 0, 4)
self.buy = self:Add("DButton")
self.buy:Dock(BOTTOM)
self.buy:SetText(L"purchase")
self.buy:SetTextColor(color_white)
self.buy.DoClick = function(this)
if ((this.nextClick or 0) < CurTime()) then
this.nextClick = CurTime() + 0.5
else
return
end
if (self.preventBuy) then
self.finalGlow:SetText(self.final:GetText())
self.finalGlow:SetAlpha(255)
self.finalGlow:AlphaTo(0, 0.5)
return surface.PlaySound("buttons/button11.wav")
end
net.Start("ixBusinessBuy")
net.WriteTable(self.itemData)
net.SendToServer()
self.itemData = {}
self.items:Remove()
self.data:Remove()
self.buy:Remove()
self:ShowCloseButton(false)
if (IsValid(ix.gui.business)) then
ix.gui.business.cart = {}
ix.gui.business.checkout:SetText(L("checkout", 0))
end
self.text = self:Add("DLabel")
self.text:Dock(FILL)
self.text:SetContentAlignment(5)
self.text:SetTextColor(color_white)
self.text:SetText(L"purchasing")
self.text:SetFont("ixMediumFont")
net.Receive("ixBusinessResponse", function()
if (IsValid(self)) then
self.text:SetText(L"buyGood")
self.done = true
self:ShowCloseButton(true)
surface.PlaySound("buttons/button3.wav")
end
end)
timer.Simple(4, function()
if (IsValid(self) and !self.done) then
self.text:SetText(L"buyFailed")
self:ShowCloseButton(true)
surface.PlaySound("buttons/button11.wav")
end
end)
end
self.data = self:Add("DPanel")
self.data:Dock(BOTTOM)
self.data:SetTall(64)
self.data:DockMargin(0, 0, 0, 4)
self.current = self.data:Add("DLabel")
self.current:SetFont("ixSmallFont")
self.current:SetContentAlignment(6)
self.current:SetTextColor(color_white)
self.current:Dock(TOP)
self.current:SetTextInset(4, 0)
self.total = self.data:Add("DLabel")
self.total:SetFont("ixSmallFont")
self.total:SetContentAlignment(6)
self.total:SetTextColor(color_white)
self.total:Dock(TOP)
self.total:SetTextInset(4, 0)
local line = self.data:Add("DPanel")
line:SetTall(1)
line:DockMargin(128, 0, 4, 0)
line:Dock(TOP)
line.Paint = function(this, w, h)
surface.SetDrawColor(255, 255, 255, 150)
surface.DrawLine(0, 0, w, 0)
end
self.final = self.data:Add("DLabel")
self.final:SetFont("ixSmallFont")
self.final:SetContentAlignment(6)
self.final:SetTextColor(color_white)
self.final:Dock(TOP)
self.final:SetTextInset(4, 0)
self.finalGlow = self.final:Add("DLabel")
self.finalGlow:Dock(FILL)
self.finalGlow:SetFont("ixSmallFont")
self.finalGlow:SetTextColor(color_white)
self.finalGlow:SetContentAlignment(6)
self.finalGlow:SetAlpha(0)
self.finalGlow:SetTextInset(4, 0)
self:SetFocusTopLevel(true)
self.itemData = {}
self:OnQuantityChanged()
end
function PANEL:OnQuantityChanged()
local price = 0
local money = LocalPlayer():GetCharacter():GetMoney()
local valid = 0
for k, v in pairs(self.itemData) do
local itemTable = ix.item.list[k]
if (itemTable and v > 0) then
valid = valid + 1
price = price + (v * (itemTable.price or 0))
end
end
self.current:SetText(L"currentMoney"..ix.currency.Get(money))
self.total:SetText("- "..ix.currency.Get(price))
self.final:SetText(L"moneyLeft"..ix.currency.Get(money - price))
self.final:SetTextColor((money - price) >= 0 and Color(46, 204, 113) or Color(217, 30, 24))
self.preventBuy = (money - price) < 0 or valid == 0
end
function PANEL:SetCart(items)
self.itemData = items
for k, v in SortedPairs(items) do
local itemTable = ix.item.list[k]
if (itemTable) then
local slot = self.items:Add("DPanel")
slot:SetTall(36)
slot:Dock(TOP)
slot:DockMargin(5, 5, 5, 0)
slot.icon = slot:Add("SpawnIcon")
slot.icon:SetPos(2, 2)
slot.icon:SetSize(32, 32)
slot.icon:SetModel(itemTable:GetModel())
slot.icon:SetTooltip()
slot.name = slot:Add("DLabel")
slot.name:SetPos(40, 2)
slot.name:SetFont("ixChatFont")
slot.name:SetText(string.format(
"%s (%s)",
L(itemTable.GetName and itemTable:GetName() or L(itemTable.name)),
itemTable.price and ix.currency.Get(itemTable.price) or L"free":utf8upper()
))
slot.name:SetTextColor(color_white)
slot.name:SizeToContents()
slot.name:DockMargin(40, 0, 0, 0)
slot.name:Dock(FILL)
slot.quantity = slot:Add("DTextEntry")
slot.quantity:SetSize(32, 32)
slot.quantity:Dock(RIGHT)
slot.quantity:DockMargin(4, 4, 4, 4)
slot.quantity:SetContentAlignment(5)
slot.quantity:SetNumeric(true)
slot.quantity:SetText(v)
slot.quantity:SetFont("ixChatFont")
slot.quantity.OnTextChanged = function(this)
local value = tonumber(this:GetValue())
if (value) then
items[k] = math.Clamp(math.Round(value), 0, 10)
self:OnQuantityChanged()
else
this:SetValue(1)
end
end
else
items[k] = nil
end
end
self:OnQuantityChanged()
end
function PANEL:Think()
if (!self:HasFocus()) then
self:MakePopup()
end
BaseClass.Think(self)
end
vgui.Register("ixBusinessCheckout", PANEL, "DFrame")
hook.Add("CreateMenuButtons", "ixBusiness", function(tabs)
end)

View File

@@ -0,0 +1,669 @@
--[[
| 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 audioFadeInTime = 2
local animationTime = 0.5
-- character menu panel
DEFINE_BASECLASS("ixSubpanelParent")
local PANEL = {}
function PANEL:Init()
self:UpdateLocations()
self:SetSize(self:GetParent():GetSize())
self:SetPos(0, 0)
self:SetZPos(5)
self.childPanels = {}
self.subpanels = {}
self.activeSubpanel = ""
self.currentDimAmount = 0
self.currentY = 0
self.currentScale = 1
self.currentAlpha = 255
self.targetDimAmount = 0
self.targetScale = 0
end
function PANEL:Dim(length, callback)
length = length or animationTime
self.currentDimAmount = 0
self:CreateAnimation(length, {
target = {
currentDimAmount = self.targetDimAmount,
currentScale = self.targetScale,
OnComplete = callback
},
easing = "outCubic"
})
self:OnDim()
end
function PANEL:UpdateLocations()
for i = 1, #ix.characters do
local id = ix.characters[i]
local foundCharacter = ix.char.loaded[id]
if (!foundCharacter) then
continue
end
local location = foundCharacter.vars.location or false
local locationConfig = ix.config.Get("Location", false) or false
if location and locationConfig then
if location != locationConfig then
table.remove(ix.characters, i)
end
end
end
end
function PANEL:Undim(length, callback)
length = length or animationTime
self.currentDimAmount = self.targetDimAmount
self:CreateAnimation(length, {
target = {
currentDimAmount = 0,
currentScale = 1
},
easing = "outCubic",
OnComplete = callback
})
self:OnUndim()
end
function PANEL:OnDim()
end
function PANEL:OnUndim()
end
function PANEL:Paint(width, height)
local amount = self.currentDimAmount
local bShouldScale = self.currentScale != 1
local matrix
-- draw child panels with scaling if needed
if (bShouldScale) then
matrix = Matrix()
matrix:Scale(Vector(1, 1, 0.0001) * self.currentScale)
matrix:Translate(Vector(
ScrW() * 0.5 - (ScrW() * self.currentScale * 0.5),
ScrH() * 0.5 - (ScrH() * self.currentScale * 0.5),
1
))
cam.PushModelMatrix(matrix)
self.currentMatrix = matrix
end
BaseClass.Paint(self, width, height)
if (bShouldScale) then
cam.PopModelMatrix()
self.currentMatrix = nil
end
if (amount > 0) then
local color = Color(0, 0, 0, amount)
surface.SetDrawColor(color)
surface.DrawRect(0, 0, width, height)
end
end
vgui.Register("ixCharMenuPanel", PANEL, "ixSubpanelParent")
-- main character menu panel
PANEL = {}
AccessorFunc(PANEL, "bUsingCharacter", "UsingCharacter", FORCE_BOOL)
function PANEL:Init()
ix.gui.wnMainMenu = self
ix.panelCreationActive = false
self:SetSize(ScrW(), ScrH())
end
function PANEL:CreateMainPanel(logoData, buttonData)
local logoPanel = self:Add("Panel")
logoPanel:SetSize(self:GetSize())
local newHeight = 0
local logoMargin = SScaleMin(40 / 3)
local shouldDefault = logoData and (logoData.bDefault or !logoData.path) or false
local hasData = logoData.width and logoData.height and logoData.path and true
local panelName = ((shouldDefault or !hasData) and "ixWillardCreditsLogoSmall" or "DImage")
local logoImage = logoPanel:Add(panelName)
local logoW = SScaleMin(hasData and logoData.width / 3 or 125 / 3)
local logoH = SScaleMin(hasData and logoData.height / 3 or 128 / 3)
logoImage:SetSize(logoW, logoH)
logoImage:Dock(TOP)
if !shouldDefault and hasData then
logoImage:SetImage("willardnetworks/"..logoData.path..".png")
end
logoImage:DockMargin(logoPanel:GetWide() * 0.5 - logoImage:GetWide() * 0.5, 0, logoPanel:GetWide() * 0.5 -
logoImage:GetWide() * 0.5, logoMargin)
newHeight = newHeight + logoImage:GetTall() + (logoMargin)
local titleLabel = logoPanel:Add("DLabel")
titleLabel:SetTextColor(color_white)
titleLabel:SetFont("MainMenuNewTitleFont")
titleLabel:SetText(string.utf8upper(ix.config.Get("menuTitle") or "Willard Networks"))
titleLabel:SetContentAlignment(5)
titleLabel:SizeToContents()
titleLabel:Dock(TOP)
titleLabel:DockMargin(0, 0, 0, SScaleMin(15 / 3))
newHeight = newHeight + titleLabel:GetTall() + SScaleMin(15 / 3)
self.buttonList = logoPanel:Add("Panel")
self.buttonList:Dock(TOP)
self.buttonWidth = 0
self:CreateButtons(buttonData)
self.buttonList:SetSize(self.buttonWidth, SScaleMin(30 / 3))
self.buttonList:DockMargin(logoPanel:GetWide() * 0.5 - self.buttonList:GetWide() * 0.5, 0,
logoPanel:GetWide() * 0.5 - self.buttonList:GetWide() * 0.5, 0)
newHeight = newHeight + self.buttonList:GetTall()
logoPanel:SetTall(newHeight)
logoPanel:Center()
local x, y = logoPanel:GetPos()
logoPanel:SetPos(x, y - SScaleMin(100 / 3))
end
function PANEL:UpdateChildPanels(parent)
if parent.loadCharacterPanel then
parent.loadCharacterPanel.aFontColor = self.aFontColor
parent.loadCharacterPanel.aFontHoverColor = self.aFontHoverColor
parent.loadCharacterPanel.aFontLockedButtonColor = self.aFontLockedButtonColor
if parent.loadCharacterPanel.back then
parent.loadCharacterPanel.back:SetTextColor(self.aFontColor)
end
end
if parent.newCharacterPanel then
parent.newCharacterPanel.aFontColor = self.aFontColor
parent.newCharacterPanel.aFontHoverColor = self.aFontHoverColor
parent.newCharacterPanel.aFontLockedButtonColor = self.aFontLockedButtonColor
if parent.newCharacterPanel.factionBack then
parent.newCharacterPanel.factionBack:SetTextColor(self.aFontColor)
end
end
end
function PANEL:CreateButtons(buttonData)
local parent = self:GetParent()
local buttonHeight = SScaleMin(30 / 3)
local fontColor = buttonData["Font Color"] or Color(196, 196, 196, 255)
local fontHoverColor = buttonData["Font Hover Color"] or Color(255, 255, 255, 255)
local fontLockedButtonColor = buttonData["Font Locked Button Color"] or Color(90, 90, 90, 255)
self.aFontColor = Color(fontColor.r, fontColor.g, fontColor.b, fontColor.a)
self.aFontHoverColor = Color(fontHoverColor.r, fontHoverColor.g, fontHoverColor.b, fontHoverColor.a)
self.aFontLockedButtonColor = Color(fontLockedButtonColor.r, fontLockedButtonColor.g, fontLockedButtonColor.b, fontLockedButtonColor.a)
local bHasCharacter = #ix.characters > 0
self.bUsingCharacter = LocalPlayer().GetCharacter and LocalPlayer():GetCharacter()
local function PaintButton(this, text, boolLoad, charCreationDisabled, shouldMargin)
this:SetText(text)
this:SetFont("MainMenuNewButtonFont")
this:SetTextColor(self.aFontColor)
this:SetContentAlignment(5)
this:DockMargin(0, 0, (!shouldMargin and SScaleMin(30 / 3) or 0), 0)
self.buttonWidth = self.buttonWidth + (!shouldMargin and SScaleMin(30 / 3) or 0)
if (!bHasCharacter and boolLoad) or charCreationDisabled then
this:SetDisabled(true)
this:SetTextColor(self.aFontLockedButtonColor)
end
this.Paint = nil
end
local function OnCursor(name, boolLoad, charCreationDisabled)
name.OnCursorEntered = function()
if (!bHasCharacter and boolLoad) then
if self.loadButtonTitle and IsValid(self.loadButtonTitle) then
self.loadButtonTitle:SetTextColor(self.aFontLockedButtonColor)
end
return
end
if charCreationDisabled then
name:SetTextColor(self.aFontLockedButtonColor)
return
end
surface.PlaySound("helix/ui/rollover.wav")
name:SetTextColor(self.aFontHoverColor)
end
name.OnCursorExited = function()
if (!bHasCharacter and boolLoad) then
if self.loadButtonTitle and IsValid(self.loadButtonTitle) then
self.loadButtonTitle:SetTextColor(self.aFontLockedButtonColor)
end
return
end
if charCreationDisabled then
name:SetTextColor(self.aFontLockedButtonColor)
return
end
name:SetTextColor(self.aFontColor)
end
end
-- create character button
local createButton = self.buttonList:Add("DButton")
createButton:SetTall(buttonHeight)
createButton:Dock(LEFT)
local charCreation = ix.config.Get("CharCreationDisabled") and
!CAMI.PlayerHasAccess(LocalPlayer(), "Helix - Character Creation Bypass")
PaintButton(createButton, "NOWA POSTAĆ", nil, charCreation)
OnCursor(createButton, nil, charCreation)
createButton:SizeToContents()
self.buttonWidth = self.buttonWidth + createButton:GetWide()
createButton.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
if !LocalPlayer():GetData("QuizCompleted", false) then
if ix.gui.quizAnswering then
if ix.gui.quizAnswering.Remove then
ix.gui.quizAnswering:Remove()
end
end
vgui.Create("ixQuizMenu")
netstream.Start("RequestQuizzes", false)
return
end
local maximum = hook.Run("GetMaxPlayerCharacter", LocalPlayer()) or ix.config.Get("maxCharacters", 5)
-- don't allow creation if we've hit the character limit
if (#ix.characters >= maximum) then
self:GetParent():ShowNotice(3, L("maxCharacters"))
return
end
self:Dim()
parent.newCharacterPanel:SetActiveSubpanel("faction", 0)
parent.newCharacterPanel:SlideUp()
end
-- load character button
self.loadButton = self.buttonList:Add("DButton")
self.loadButton:SetTall(buttonHeight)
self.loadButton:Dock(LEFT)
PaintButton(self.loadButton, "POSTACIE", true)
OnCursor(self.loadButton, true)
self.loadButton:SizeToContents()
self.buttonWidth = self.buttonWidth + self.loadButton:GetWide()
self.loadButton.DoClick = function()
self:Dim()
parent.loadCharacterPanel:SlideUp()
surface.PlaySound("helix/ui/press.wav")
end
-- community button
local communityButton = self.buttonList:Add("DButton")
communityButton:SetTall(buttonHeight)
communityButton:Dock(LEFT)
PaintButton(communityButton, "INFO")
OnCursor(communityButton)
communityButton:SizeToContents()
self.buttonWidth = self.buttonWidth + communityButton:GetWide()
communityButton.DoClick = function()
gui.OpenURL("https://wnveles.pl/")
surface.PlaySound("helix/ui/press.wav")
end
-- content button
local contentButton = self.buttonList:Add("DButton")
contentButton:SetText("")
contentButton:SetTall(buttonHeight)
contentButton:Dock(LEFT)
PaintButton(contentButton, "ZAWARTOŚĆ")
OnCursor(contentButton)
contentButton:SizeToContents()
self.buttonWidth = self.buttonWidth + contentButton:GetWide()
contentButton.DoClick = function()
gui.OpenURL("https://steamcommunity.com/sharedfiles/filedetails/?id=2145501003")
surface.PlaySound("helix/ui/press.wav")
end
-- leave/return button
self.returnButton = self.buttonList:Add("DButton")
self.returnButton:SetTall(buttonHeight)
self.returnButton:Dock(LEFT)
PaintButton(self.returnButton, "", false, false, true)
OnCursor(self.returnButton)
self.returnButton:SizeToContents()
self:UpdateReturnButton()
self.buttonWidth = self.buttonWidth + self.returnButton:GetWide()
self.returnButton.DoClick = function()
if (self.bUsingCharacter) then
parent:Close()
else
RunConsoleCommand("disconnect")
end
surface.PlaySound("helix/ui/press.wav")
end
end
function PANEL:UpdateReturnButton(bValue)
if (bValue == nil) then
bValue = self.bUsingCharacter
end
if self.returnButton and IsValid(self.returnButton) then
self.returnButton:SetText(bValue and "POWRÓT" or "WYJŚCIE")
self.returnButton:SizeToContents()
end
end
function PANEL:OnDim()
-- disable input on this panel since it will still be in the background while invisible - prone to stray clicks if the
-- panels overtop slide out of the way
self:SetMouseInputEnabled(false)
self:SetKeyboardInputEnabled(false)
end
function PANEL:OnUndim()
self:SetMouseInputEnabled(true)
self:SetKeyboardInputEnabled(true)
-- we may have just deleted a character so update the status of the return button
self.bUsingCharacter = LocalPlayer().GetCharacter and LocalPlayer():GetCharacter()
self:UpdateReturnButton()
end
function PANEL:OnClose()
for _, v in pairs(self:GetChildren()) do
if (IsValid(v)) then
v:SetVisible(false)
end
end
end
vgui.Register("ixCharMenuMain", PANEL, "ixCharMenuPanel")
-- container panel
PANEL = {}
function PANEL:Init()
if (IsValid(ix.gui.loading)) then
ix.gui.loading:Remove()
end
if (IsValid(ix.gui.characterMenu)) then
if (IsValid(ix.gui.characterMenu.channel)) then
ix.gui.characterMenu.channel:Stop()
end
ix.gui.characterMenu:Remove()
end
self:SetSize(ScrW(), ScrH())
self:SetPos(0, 0)
-- main menu panel
self.mainPanel = self:Add("ixCharMenuMain")
self.mainPanel.avoidPadding = true
-- new character panel
self.newCharacterPanel = self:Add("ixCharMenuNew")
self.newCharacterPanel:SlideDown(0)
-- load character panel
self.loadCharacterPanel = self:Add("ixCharMenuLoad")
self.loadCharacterPanel:SlideDown(0)
net.Start("RequestMainMenuInfo")
net.SendToServer()
-- notice bar
self.notice = self:Add("ixNoticeBar")
-- finalization
self:MakePopup()
self.currentAlpha = 255
self.volume = 0
ix.gui.characterMenu = self
if (!IsValid(ix.gui.intro)) then
self:PlayMusic()
end
hook.Run("OnCharacterMenuCreated", self)
end
function PANEL:PlayMusic()
local path = "sound/" .. ix.config.Get("music")
local url = path:match("http[s]?://.+")
local play = url and sound.PlayURL or sound.PlayFile
path = url and url or path
play(path, "noplay", function(channel, error, message)
if (!IsValid(channel)) then
return
end
channel:SetVolume(self.volume or 0)
channel:Play()
if IsValid(self) then
self.channel = channel
self:CreateAnimation(audioFadeInTime, {
index = 10,
target = {volume = 1},
Think = function(animation, panel)
if (IsValid(panel.channel)) then
panel.channel:SetVolume(self.volume * 0.5)
end
end
})
end
end)
end
function PANEL:ShowNotice(type, text)
self.notice:SetType(type)
self.notice:SetText(text)
self.notice:Show()
end
function PANEL:HideNotice()
if (IsValid(self.notice) and !self.notice:GetHidden()) then
self.notice:Slide("up", 0.5, true)
end
end
function PANEL:OnCharacterDeleted(character)
if (#ix.characters == 0) then
self.mainPanel:Undim() -- undim since the load panel will slide down
end
self.loadCharacterPanel:OnCharacterDeleted(character)
end
function PANEL:OnCharacterLoadFailed(error)
self.loadCharacterPanel:SetMouseInputEnabled(true)
self.loadCharacterPanel:SlideUp()
self:ShowNotice(3, error)
end
function PANEL:IsClosing()
return self.bClosing
end
function PANEL:Close(bFromMenu)
self.bClosing = true
self.bFromMenu = bFromMenu
local fadeOutTime = animationTime * 8
self:CreateAnimation(fadeOutTime, {
index = 1,
target = {currentAlpha = 0},
Think = function(animation, panel)
panel:SetAlpha(panel.currentAlpha)
end,
OnComplete = function(animation, panel)
panel:Remove()
end
})
self:CreateAnimation(fadeOutTime - 0.1, {
index = 10,
target = {volume = 0},
Think = function(animation, panel)
if (IsValid(panel.channel)) then
panel.channel:SetVolume(self.volume * 0.5)
end
end,
OnComplete = function(animation, panel)
if (IsValid(panel.channel)) then
panel.channel:Stop()
panel.channel = nil
end
end
})
-- hide children if we're already dimmed
if (bFromMenu) then
for _, v in pairs(self:GetChildren()) do
if (IsValid(v)) then
v:SetVisible(false)
end
end
else
-- fade out the main panel quicker because it significantly blocks the screen
self.mainPanel.currentAlpha = 255
self.mainPanel:CreateAnimation(animationTime * 2, {
target = {currentAlpha = 0},
easing = "outQuint",
Think = function(animation, panel)
panel:SetAlpha(panel.currentAlpha)
end,
OnComplete = function(animation, panel)
panel:SetVisible(false)
end
})
end
-- relinquish mouse control
self:SetMouseInputEnabled(false)
self:SetKeyboardInputEnabled(false)
gui.EnableScreenClicker(false)
end
function PANEL:Paint(width, height)
if ix.gui.background_url then
local mat = Material(ix.gui.background_url)
local w, h = width, height
local x, y = 0, 0
local ratioW = width / mat:Width()
local ratioH = height / mat:Height()
if ratioW < 1 then
w = mat:Width() * ratioH
x = (w - width) / -2
else
h = mat:Height() * ratioW
y = (h - height) / -2
end
surface.SetMaterial(mat)
surface.SetDrawColor(255, 255, 255, 255)
surface.DrawTexturedRect(x, y, w, h)
else
surface.SetDrawColor(Color(63, 58, 115, 100))
surface.DrawRect(0, 0, width, height)
Derma_DrawBackgroundBlur( self, 1 )
end
--[[surface.SetDrawColor(0, 0, 0, 150)
surface.DrawTexturedRect(0, 0, width, height)
ix.util.DrawBlur(self, Lerp((255 - 100) / 255, 0, 10))]]--
end
function PANEL:PaintOver(width, height)
if (self.bClosing and self.bFromMenu) then
surface.SetDrawColor(color_black)
surface.DrawRect(0, 0, width, height)
end
end
vgui.Register("ixCharMenu", PANEL, "EditablePanel")
if (IsValid(ix.gui.characterMenu)) then
ix.gui.characterMenu:Remove()
--TODO: REMOVE ME
ix.gui.characterMenu = vgui.Create("ixCharMenu")
end
netstream.Hook("SendCharacterPanelNotify", function(error)
if ix.gui.characterMenu and IsValid(ix.gui.characterMenu) then
ix.gui.characterMenu:ShowNotice(3, error)
end
end)

View File

@@ -0,0 +1,265 @@
--[[
| 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 PANEL = {}
function PANEL:Init()
local titlePushDown = SScaleMin(30 / 3)
local padding = SScaleMin(30 / 3)
local margin = SScaleMin(10 / 3)
local iconSize = SScaleMin(18 / 3)
local topPushDown = SScaleMin(150 / 3)
local scale780 = SScaleMin(780 / 3)
local scale120 = SScaleMin(120 / 3)
self:SetWide(ScrW() - (topPushDown * 2))
local sizeXtitle, sizeYtitle = self:GetWide(), scale120
local sizeXcontent, sizeYcontent = self:GetWide(), scale780
self.titlePanel = self:Add("Panel")
self.titlePanel:SetSize(sizeXtitle, sizeYtitle)
self.titlePanel:SetPos(self:GetWide() * 0.5 - self.titlePanel:GetWide() * 0.5)
self:CreateTitleText()
self.contentFrame = self:Add("Panel")
self.contentFrame:SetSize(sizeXcontent, sizeYcontent)
self.contentFrame:SetPos(self:GetWide() * 0.5 - self.contentFrame:GetWide() * 0.5, titlePushDown)
self:SetTall(scale120 + scale780 + titlePushDown)
self:Center()
self.informationFrame = self.contentFrame:Add("Panel")
self.informationFrame:SetSize(self.contentFrame:GetWide() * 0.5 - padding, self.contentFrame:GetTall())
self.informationFrame:Dock(LEFT)
self.informationFrame:DockMargin(0, 0, padding, 0)
self.informationFrame.Paint = function( _, w, h )
surface.SetDrawColor(Color(255, 255, 255, 30))
surface.DrawOutlinedRect(0, 0, w, h)
end
local informationSubframe = self.informationFrame:Add("Panel")
informationSubframe:SetSize(self.informationFrame:GetSize())
informationSubframe:DockMargin(padding, padding, padding, padding)
informationSubframe:Dock(FILL)
local function CreatePart(parent, title, text, icon, boolLast, editButton, bWrap)
parent:Dock(TOP)
parent:SetSize(informationSubframe:GetWide(), SScaleMin(16.666666666667))
parent.Paint = function(_, w, h)
if boolLast then
return
end
surface.SetDrawColor(Color(255, 255, 255, 30))
surface.DrawLine(0, h - 1, w, h - 1)
end
local leftSide = parent:Add("Panel")
leftSide:Dock(LEFT)
leftSide:SetWide(parent:GetWide() * 0.25)
leftSide:DockMargin(0, 0, margin, 0)
local parentIcon = leftSide:Add("DImage")
parentIcon:SetImage("willardnetworks/tabmenu/charmenu/"..icon..".png")
parentIcon:SetSize(iconSize, iconSize)
parentIcon:Dock(LEFT)
parentIcon:DockMargin(0, parent:GetTall() * 0.5 - iconSize * 0.5, 0, parent:GetTall() * 0.5 - iconSize * 0.5)
local parentTitle = leftSide:Add("DLabel")
parentTitle:SetText(title)
parentTitle:SetFont("MenuFontLargerNoClamp")
parentTitle:Dock(LEFT)
parentTitle:DockMargin(margin, 0, 0, 0)
parentTitle:SetTextColor(Color(255, 255, 255, 255))
parentTitle:SizeToContents()
local parentTextPanel = parent:Add("Panel")
parentTextPanel:Dock(FILL)
parent.Text = parentTextPanel:Add("DLabel")
parent.Text:SetText(text)
parent.Text:SetFont("MenuFontLargerNoClamp")
parent.Text:SetTextColor(Color(220, 220, 220, 255))
parent.Text:SetContentAlignment(4)
if bWrap then
parent.Text:SetWrap(true)
parent.Text:SetWide(SScaleMin(467 / 3))
parent.Text:SetTall(SScaleMin(50 / 3))
else
parent.Text:Dock(LEFT)
parent.Text:SizeToContents()
end
local editButtonPanel = parent:Add("Panel")
editButtonPanel:Dock(RIGHT)
editButtonPanel:SetWide(iconSize)
editButtonPanel:DockMargin(padding, 0, 0, 0)
if editButton then
editButton:SetParent(editButtonPanel)
editButton:SetSize(iconSize, iconSize)
editButton:Dock(RIGHT)
editButton:DockMargin(0, parent:GetTall() * 0.5 - editButton:GetTall() * 0.5, 0, parent:GetTall() * 0.5 - editButton:GetTall() * 0.5)
end
end
-- Name
local namePanel = informationSubframe:Add("Panel")
CreatePart(namePanel, "Imię:", LocalPlayer():GetName(), "name")
-- Fake name
local fakeNamePanel = informationSubframe:Add("Panel")
local editfakenameIcon = fakeNamePanel:Add("DImageButton")
editfakenameIcon:SetImage("willardnetworks/tabmenu/charmenu/edit_desc.png")
local fakeName = LocalPlayer():GetCharacter():GetFakeName()
local displayFakeName = fakeName and (utf8.len(fakeName) <= 34 and fakeName or utf8.sub(fakeName, 1, 34).."...") or "--"
CreatePart(fakeNamePanel, "Fałszywe Imię:", displayFakeName, "fakename", false, editfakenameIcon)
editfakenameIcon.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
Derma_StringRequest(L("fakeNameTitle"), L("fakeNameText"), fakeName, function(text)
local minLength = ix.config.Get("minNameLength", 4)
local maxLength = ix.config.Get("maxNameLength", 32)
local nameLength = utf8.len(text)
if (text != "" and (nameLength > maxLength or nameLength < minLength)) then
ix.util.NotifyLocalized("fakeNameLength", minLength, maxLength)
return
end
net.Start("ixFakeName")
net.WriteString(text)
net.SendToServer()
if fakeNamePanel.Text then
fakeNamePanel.Text:SetText(text == "" and "--" or (nameLength <= 34 and text or utf8.sub(text, 1, 34).."..."))
fakeNamePanel.Text:SizeToContents()
end
end)
end
-- Genetics
local geneticAge = string.utf8lower(LocalPlayer():GetCharacter():GetAge())
local geneticHeight = string.utf8lower(LocalPlayer():GetCharacter():GetHeight())
local geneticEyecolor = string.utf8lower(LocalPlayer():GetCharacter():GetEyeColor())
local function firstUpper(str)
return str:gsub("^%l", string.utf8upper)
end
local geneticDescPanel = informationSubframe:Add("Panel")
local geneticDesc = hook.Run("GetCharacterGeneticDescription", LocalPlayer():GetCharacter())
if geneticDesc then
CreatePart(geneticDescPanel, "Cechy genetyczne:", geneticDesc, "genetics")
else
CreatePart(geneticDescPanel, "Cechy genetyczne:", firstUpper(geneticAge).." | "..firstUpper(geneticHeight).." | "..firstUpper(geneticEyecolor).." Oczy", "genetics")
end
-- Description
local description = LocalPlayer():GetCharacter():GetDescription()
if string.utf8len(description) > 34 then
description = string.utf8sub(description, 1, 34)
end
local descPanel = informationSubframe:Add("Panel")
local editdescIcon = descPanel:Add("DImageButton")
editdescIcon:SetImage("willardnetworks/tabmenu/charmenu/edit_desc.png")
CreatePart(descPanel, "Opis:", description, "description", false, editdescIcon)
editdescIcon.DoClick = function()
ix.command.Send("CharDesc")
end
local timerId = "ixCharacterTabUpdate"
timer.Create(timerId, 0.25, 0, function()
if (!IsValid(self) or !IsValid(descPanel)) then
timer.Remove(timerId)
elseif (LocalPlayer():GetCharacter()) then
description = LocalPlayer():GetCharacter():GetDescription()
if string.utf8len(description) > 34 then
description = string.utf8sub(description, 1, 34)
end
if (descPanel.Text:GetText() != description) then
descPanel.Text:SetText(description)
end
end
end)
-- Faction
local faction = ix.faction.indices[LocalPlayer():GetCharacter():GetFaction()]
local factionPanel = informationSubframe:Add("Panel")
CreatePart(factionPanel, "Frakcja:", faction.name, "faction")
hook.Run("CreateExtraCharacterTabInfo", LocalPlayer():GetCharacter(), informationSubframe, CreatePart)
self.contentFrame:Add("CharFrame")
local returnToMenuButton = informationSubframe:Add("DButton")
returnToMenuButton:Dock(BOTTOM)
returnToMenuButton:DockMargin(0, SScaleMin(25 / 5), 0, 0)
returnToMenuButton:SetText("Wyjdź z postaci i wróć do Menu Głównego")
returnToMenuButton:SetFont("MenuFontBoldNoClamp")
returnToMenuButton:SetTall(SScaleMin(16.666666666667))
returnToMenuButton.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
returnToMenuButton.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
net.Start("ixReturnToMenu")
net.SendToServer()
end
end
function PANEL:CreateTitleText()
local characterTitleIcon = self.titlePanel:Add("DImage")
characterTitleIcon:SetImage("willardnetworks/tabmenu/charmenu/name.png")
characterTitleIcon:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3))
local characterTitle = self.titlePanel:Add("DLabel")
characterTitle:SetFont("TitlesFontNoClamp")
characterTitle:SetText("Postać")
characterTitle:SizeToContents()
characterTitle:SetPos(SScaleMin(32 / 3), SScaleMin(20 / 3) * 0.5 - characterTitle:GetTall() * 0.5)
end
vgui.Register("CharacterTab", PANEL, "Panel")
hook.Add("CreateMenuButtons", "CharacterTab", function(tabs)
tabs["Postać"] = {
RowNumber = 1,
Width = 17,
Height = 19,
Icon = "willardnetworks/tabmenu/navicons/character.png",
Create = function(info, container)
local panel = container:Add("CharacterTab")
ix.gui.characterpanel = panel
end
}
end)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,156 @@
--[[
| 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 PANEL = {}
function PANEL:Init()
local margin = SScaleMin(10 / 3)
local smallerIconSize = SScaleMin(16 / 3)
local parent = self:GetParent()
self:SetSize(parent:GetWide() * 0.5, parent:GetTall())
self:Dock(LEFT)
local imgBackground = self:Add("DImage")
local invImage = LocalPlayer():GetFactionVar("inventoryImage", "materials/willardnetworks/tabmenu/inventory/backgrounds/street.png")
imgBackground:SetImage(invImage)
imgBackground:SetKeepAspect(true)
imgBackground:Dock(FILL)
imgBackground:SetWide(self:GetWide() * 0.65)
local statusArea = self:Add("Panel")
statusArea:Dock(RIGHT)
statusArea:SetWide(self:GetWide() * 0.35)
statusArea.Paint = function( this, w, h )
surface.SetDrawColor(Color(255, 255, 255, 10))
surface.DrawRect(0, 0, w, h )
end
local innerStatus = statusArea:Add("Panel")
innerStatus:SetSize(statusArea:GetWide() - (margin * 2), statusArea:GetTall())
innerStatus:Dock(FILL)
innerStatus:DockMargin(margin * 2, 0, margin * 2, 0)
local function CreateTitle(parent2, text)
parent2:Dock(TOP)
parent2:DockMargin(0, margin * 2 - (margin * 0.5), 0, margin * 0.5, 0)
parent2:SetText(text)
parent2:SetContentAlignment(4)
parent2:SetFont("MenuFontLargerNoClamp")
parent2:SizeToContents()
end
local function CreateSubBar(parent3, iconImage, title, text, iconW, iconH)
local SScaleMin25 = SScaleMin(25 / 3)
parent3:Dock(TOP)
parent3:DockMargin(0, margin * 0.5, 0, 0)
parent3:SetSize(innerStatus:GetWide(), SScaleMin25)
local leftSideSub = parent3:Add("Panel")
leftSideSub:Dock(LEFT)
leftSideSub:SetSize(parent3:GetWide() * 0.65, SScaleMin25)
local rightSideSub = parent3:Add("Panel")
rightSideSub:Dock(FILL)
rightSideSub:SetSize(parent3:GetWide() * 0.35, SScaleMin25)
local iconPanel = leftSideSub:Add("Panel")
iconPanel:Dock(LEFT)
iconPanel:SetSize(iconW, parent3:GetTall())
local icon = iconPanel:Add("DImage")
icon:SetSize(iconW, iconH)
icon:SetImage(iconImage)
icon:SetPos(0, iconPanel:GetTall() * 0.5 - icon:GetTall() * 0.5)
local leftTitle = leftSideSub:Add("DLabel")
leftTitle:SetFont("MenuFontLargerNoClamp")
leftTitle:SetText(title or "")
leftTitle:SetContentAlignment(4)
leftTitle:Dock(LEFT)
leftTitle:DockMargin(margin, 0, 0, 0)
leftTitle:SizeToContents()
local rightText = rightSideSub:Add("DLabel")
rightText:SetFont("MenuFontLargerNoClamp")
rightText:SetText(text or "")
rightText:SetContentAlignment(6)
rightText:Dock(RIGHT)
rightText:SizeToContents()
end
local statusTitle = innerStatus:Add("DLabel")
CreateTitle(statusTitle, "STATUS")
local hp = innerStatus:Add("Panel")
CreateSubBar(hp, "willardnetworks/hud/cross.png", "Punkty Życia", LocalPlayer():Health(), smallerIconSize, smallerIconSize)
local armor = innerStatus:Add("Panel")
CreateSubBar(armor, "willardnetworks/hud/shield.png", "Pancerz", LocalPlayer():Armor(), smallerIconSize, smallerIconSize)
hook.Run("AdjustInnerStatusPanel", innerStatus, CreateTitle, CreateSubBar)
self.model = imgBackground:Add("ixModelPanel")
self.model:Dock(FILL)
self.model:SetFOV(ScrW() > 1920 and 50 or 40)
self.model:SetModel(LocalPlayer():GetModel(), LocalPlayer():GetSkin(), true)
local rotatePanel = self:Add("Panel")
rotatePanel:Dock(BOTTOM)
rotatePanel:SetTall(SScaleMin(50 / 3))
self.rLeft = rotatePanel:Add("DButton")
self.rLeft:Dock(LEFT)
self.rLeft:SetWide(imgBackground:GetWide() / 2)
self.rLeft:SetText("")
self:CreateArrow(self.rLeft, imgBackground, "back_arrow")
self.rRight = rotatePanel:Add("DButton")
self.rRight:Dock(FILL)
self.rRight:SetText("")
self:CreateArrow(self.rRight, imgBackground, "right-arrow")
ix.gui.inventoryModel = self.model
end
function PANEL:CreateArrow(parent, imgBackground, path)
local s5 = SScaleMin(5 / 3)
local s40 = SScaleMin(40 / 3)
local imgbgWD2 = imgBackground:GetWide() / 2
local lrMargin = (imgbgWD2 - s40) * 0.5
local arrow = parent:Add("DImage")
arrow:Dock(FILL)
arrow:DockMargin(lrMargin, s5, lrMargin, s5)
arrow:SetImage("willardnetworks/mainmenu/"..path..".png")
end
function PANEL:Think()
if !istable(ix.gui.inventoryModel) then
ix.gui.inventoryModel = self.model
end
if !self.rLeft or self.rLeft and !IsValid(self.rLeft) then return end
if !self.rRight or self.rRight and !IsValid(self.rRight) then return end
if self.rLeft:IsDown() then
if IsValid(self.model.Entity) then
self.model.Entity:SetAngles(self.model.Entity:GetAngles() - Angle(0, 1, 0))
end
end
if self.rRight:IsDown() then
if IsValid(self.model.Entity) then
self.model.Entity:SetAngles(self.model.Entity:GetAngles() + Angle(0, 1, 0))
end
end
end
vgui.Register("CharFrame", PANEL, "Panel")

View File

@@ -0,0 +1,730 @@
--[[
| 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 errorModel = "models/error.mdl"
local PANEL = {}
AccessorFunc(PANEL, "animationTime", "AnimationTime", FORCE_NUMBER)
local function SetCharacter(self, character)
self.character = character
if (character) then
self:SetModel(character:GetModel())
self:SetSkin(character:GetData("skin", 0))
for i = 0, (self:GetNumBodyGroups() - 1) do
self:SetBodygroup(i, 0)
end
local bodygroups = character:GetData("groups", nil)
if (istable(bodygroups)) then
for k, v in pairs(bodygroups) do
self:SetBodygroup(k, v)
end
end
else
self:SetModel(errorModel)
end
end
local function GetCharacter(self)
return self.character
end
function PANEL:Init()
self.activeCharacter = ClientsideModel(errorModel)
self.activeCharacter:SetNoDraw(true)
self.activeCharacter.SetCharacter = SetCharacter
self.activeCharacter.GetCharacter = GetCharacter
self.animationTime = 0.5
self.shadeY = 0
self.shadeHeight = 0
self.cameraPosition = Vector(80, 0, 35)
self.cameraAngle = Angle(0, 180, 0)
self.lastPaint = 0
end
function PANEL:ResetSequence(model, lastModel)
local sequence = model:LookupSequence("reference")
if (sequence <= 0) then
sequence = model:SelectWeightedSequence(ACT_IDLE)
end
if (sequence > 0) then
model:ResetSequence(sequence)
else
local found = false
for _, v in ipairs(model:GetSequenceList()) do
if ((v:utf8lower():find("idle") or v:utf8lower():find("fly")) and v != "idlenoise") then
model:ResetSequence(v)
found = true
break
end
end
if (!found) then
model:ResetSequence(4)
end
end
model:SetIK(false)
-- copy cycle if we can to avoid a jarring transition from resetting the sequence
if (lastModel) then
model:SetCycle(lastModel:GetCycle())
end
end
function PANEL:RunAnimation(model)
model:FrameAdvance((RealTime() - self.lastPaint) * 0.5)
end
function PANEL:LayoutEntity(model)
model:SetIK(false)
self:RunAnimation(model)
if self.activeCharacter:GetModel() == "models/willardnetworks/vortigaunt.mdl" then
if model:LookupBone("ValveBiped.head") then
local headpos = model:GetBonePosition(model:LookupBone("ValveBiped.head"))
model:SetEyeTarget(headpos-Vector(-15, 0, 0))
return
end
end
for i = 2, 7 do
model:SetFlexWeight( i, 0 )
end
for i = 0, 1 do
model:SetFlexWeight( i, 1 )
end
end
function PANEL:SetActiveCharacter(character)
self.shadeY = self:GetTall()
self.shadeHeight = self:GetTall()
-- set character immediately if we're an error (something isn't selected yet)
if (self.activeCharacter:GetModel() == errorModel) then
self.activeCharacter:SetCharacter(character)
self:ResetSequence(self.activeCharacter)
return
end
end
function PANEL:Paint(width, height)
local x, y = self:LocalToScreen(0, 0)
cam.Start3D(self.cameraPosition, self.cameraAngle, 70, x, y, width, height)
render.SetColorMaterial()
render.SetColorModulation(1, 1, 1)
render.SuppressEngineLighting(true)
render.SetLightingOrigin(self.activeCharacter:GetPos())
-- setup lighting
render.SetModelLighting(0, 1.5, 1.5, 1.5)
for i = 1, 4 do
render.SetModelLighting(i, 0.4, 0.4, 0.4)
end
render.SetModelLighting(5, 0.04, 0.04, 0.04)
-- clip anything out of bounds
local curparent = self
local rightx = self:GetWide()
local leftx = 0
local topy = 0
local bottomy = self:GetTall()
local previous = curparent
while (curparent:GetParent() != nil) do
local lastX, lastY = previous:GetPos()
curparent = curparent:GetParent()
topy = math.Max(lastY, topy + lastY)
leftx = math.Max(lastX, leftx + lastX)
bottomy = math.Min(lastY + previous:GetTall(), bottomy + lastY)
rightx = math.Min(lastX + previous:GetWide(), rightx + lastX)
previous = curparent
end
ix.util.ResetStencilValues()
render.SetStencilWriteMask(1)
render.SetStencilTestMask(1)
render.SetStencilReferenceValue(1)
render.SetStencilFailOperation(STENCIL_KEEP)
render.SetStencilZFailOperation(STENCIL_KEEP)
self:LayoutEntity(self.activeCharacter)
render.SetScissorRect(leftx, topy + self.shadeHeight, rightx, bottomy, true)
self.activeCharacter:DrawModel()
render.SetScissorRect(leftx, topy, rightx, bottomy, true)
render.SetStencilCompareFunction(STENCIL_EQUAL)
render.SetStencilPassOperation(STENCIL_KEEP)
render.SetStencilEnable(false)
render.SetScissorRect(0, 0, 0, 0, false)
render.SuppressEngineLighting(false)
cam.End3D()
self.lastPaint = RealTime()
end
function PANEL:OnRemove()
self.activeCharacter:Remove()
end
vgui.Register("ixCharMenuCarousel", PANEL, "Panel")
-- character load panel
PANEL = {}
AccessorFunc(PANEL, "animationTime", "AnimationTime", FORCE_NUMBER)
AccessorFunc(PANEL, "backgroundFraction", "BackgroundFraction", FORCE_NUMBER)
function PANEL:Init()
local parent = self:GetParent()
self.animationTime = 1
self.backgroundFraction = 1
-- main panel
self.panel = self:AddSubpanel("main")
self.panel:SetSize(parent:GetSize())
self.panel:SetTitle("")
self.panel.OnSetActive = function()
self:CreateAnimation(self.animationTime, {
index = 2,
target = {backgroundFraction = 1},
easing = "outQuint",
})
end
self.aFontColor = parent.mainPanel.aFontColor or Color(196, 196, 196, 255)
self.aFontHoverColor = parent.mainPanel.aFontHoverColor or Color(255, 255, 255, 255)
self.aFontLockedButtonColor = parent.mainPanel.aFontLockedButtonColor or Color(90, 90, 90, 255)
self.panel.avoidPadding = true
-- Character Count
local Count = 0
for _, _ in pairs(ix.characters) do
Count = Count + 1
end
self.CharacterCount = Count
local charImageH = SScaleMin(500 / 3)
local charPanelW = SScaleMin(300 / 3)
local charTextH = SScaleMin(80 / 3)
local margin = SScaleMin(20 / 3)
local panelLoad = self.panel:Add("Panel")
local titleLabel = panelLoad:Add("DLabel")
titleLabel:SetTextColor(color_white)
titleLabel:SetFont("MainMenuNewTitleFont")
titleLabel:SetText(string.utf8upper("Postacie"))
titleLabel:SizeToContents()
titleLabel:SetContentAlignment(5)
titleLabel:Dock(TOP)
titleLabel:DockMargin(0, 0, 0, SScaleMin(50 / 3))
local panelLoadWBelowEqual4 = (self.CharacterCount) * charPanelW + ((self.CharacterCount - 1) * margin)
local panelLoad4 = (4) * charPanelW + ((4 - 1) * margin)
if panelLoadWBelowEqual4 < titleLabel:GetWide() then panelLoadWBelowEqual4 = titleLabel:GetWide() end
if panelLoad4 < titleLabel:GetWide() then panelLoad4 = titleLabel:GetWide() end
if self.CharacterCount <= 4 then
panelLoad:SetSize(panelLoadWBelowEqual4, titleLabel:GetTall() + SScaleMin(50 / 3) + SScaleMin(590 / 3) + (margin * 3) + SScaleMin(30 / 3))
else
panelLoad:SetSize(panelLoad4, titleLabel:GetTall() + SScaleMin(50 / 3) + SScaleMin(590 / 3) + (margin * 3) + SScaleMin(30 / 3))
end
panelLoad:Center()
self.charactersPanel = panelLoad:Add("Panel")
self.charactersPanel:SetSize(panelLoad:GetWide(), SScaleMin(590 / 3))
self.charactersPanel:Dock(TOP)
self.characterImages = self.charactersPanel:Add("Panel")
self.characterText = self.charactersPanel:Add("Panel")
if self.CharacterCount == 1 then
self.characterImages:SetSize(charPanelW, charImageH)
self.characterText:SetSize(charPanelW, charTextH + margin)
else
self.characterImages:SetSize((self.CharacterCount) * charPanelW + ((self.CharacterCount - 1) * margin), charImageH)
self.characterText:SetSize((self.CharacterCount) * charPanelW + ((self.CharacterCount - 1) * margin), charTextH + margin + (margin * 0.5) + SScaleMin(10 / 3))
end
self.characterImages:Center()
local x, y = self.characterImages:GetPos()
self.characterImages:SetPos(x, 0)
self.characterText:Center()
x, y = self.characterText:GetPos()
self.characterText:SetPos(x, self.characterImages:GetTall())
if self.CharacterCount > 4 then
self.characterText:SetPos(0, self.characterImages:GetTall())
self.characterImages:SetPos(0, 0)
self.nextButton = self.panel:Add("DImageButton")
self.nextButton:SetSize(SScaleMin(32 / 3), SScaleMin(32 / 3))
self.nextButton:SetImage("willardnetworks/charselect/arrow_right.png")
self.nextButton:Center()
x, y = self.nextButton:GetPos()
self.nextButton:MoveRightOf(panelLoad)
local x2, y2 = self.nextButton:GetPos()
self.nextButton:SetPos(x2 + margin, y)
self.nextButton.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
self.nextButton:SetColor( Color( 210, 210, 210, 255 ) )
end
self.nextButton.OnCursorExited = function()
self.nextButton:SetColor( Color( 255, 255, 255, 255 ) )
end
self.nextButton.DoClick = function()
x, y = self.characterImages:GetPos()
x2, y2 = self.characterText:GetPos()
local pos1, pos2 = math.Round(math.abs( x )), math.Round(((self.CharacterCount - 5) * (charPanelW + margin)))
if pos1 == pos2 or math.abs(pos1 - pos2) <= charPanelW - 10 then
self.nextButton:SetVisible(false)
end
self.characterImages:MoveTo( x - (charPanelW + margin), y, 0.1, 0, 1 )
self.characterText:MoveTo( x2 - (charPanelW + margin), y2, 0.1, 0, 1 )
surface.PlaySound("helix/ui/press.wav")
if IsValid(self.previousButton) then
return
else
self.previousButton = self.panel:Add("DImageButton")
self.previousButton:SetSize(SScaleMin(32 / 3), SScaleMin(32 / 3))
self.previousButton:SetImage("willardnetworks/charselect/arrow_left.png")
self.previousButton:Center()
x, y = self.previousButton:GetPos()
self.previousButton:MoveLeftOf(panelLoad)
x2, y2 = self.previousButton:GetPos()
self.previousButton:SetPos(x2 - margin, y)
self.previousButton.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
self.previousButton:SetColor( Color( 210, 210, 210, 255 ) )
end
self.previousButton.OnCursorExited = function()
self.previousButton:SetColor( Color( 255, 255, 255, 255 ) )
end
self.previousButton.DoClick = function()
x, y = self.characterImages:GetPos()
x2, y2 = self.characterText:GetPos()
if IsValid(self.nextButton) then
self.nextButton:SetVisible(true)
end
surface.PlaySound("helix/ui/press.wav")
self.characterImages:MoveTo( x + (charPanelW + margin), y, 0.1, 0, 1 )
self.characterText:MoveTo( x2 + (charPanelW + margin), y2, 0.1, 0, 1 )
if IsValid(self.previousButton) then
pos1, pos2 = math.Round(x, 0), math.Round((0 - (charPanelW + margin)), 0)
if pos1 == pos2 or math.abs(pos1 - pos2) <= charPanelW - 10 then
self.previousButton:Remove()
end
end
end
end
end
end
for i = 1, #ix.characters do
local id = ix.characters[i]
local character = ix.char.loaded[id]
if (!character) then
continue
end
local index = character:GetFaction()
local faction = ix.faction.indices[index]
local image = self.characterImages:Add("DImageButton")
image:SetKeepAspect(true)
image:SetImage(faction.selectImage or "willardnetworks/charselect/citizen2.png")
image:Dock(LEFT)
if i == 1 then
image:DockMargin(0, 0, 0, 0)
else
image:DockMargin(0, 0, margin, 0)
end
image.id = character:GetID()
image:MoveToBack()
image:SetSize( charPanelW, charImageH )
image.PaintOver = function(self, w, h)
surface.SetDrawColor(Color(73, 82, 87, 255))
surface.DrawOutlinedRect(0, 0, w, h)
end
local model = image:Add("ixCharMenuCarousel")
model:SetActiveCharacter(character)
model:SetSize(SScaleMin(649 / 3), SScaleMin(540 / 3))
model:SetPos(0 - SScaleMin(169 / 3))
self.characterTextPanel = self.characterText:Add("Panel")
self.characterTextPanel:Dock(RIGHT)
self.characterTextPanel:SetWide(charPanelW)
self.characterTextPanel.id = character:GetID()
if i == 1 then
self.characterTextPanel:DockMargin(0, 0, 0, 0)
else
self.characterTextPanel:DockMargin(0, 0, margin, 0)
end
local nameText = self.characterTextPanel:Add("DLabel")
nameText:SetFont("WNMenuFontNoClamp")
if string.utf8len( character:GetName() ) > 17 then
nameText:SetText(string.utf8upper(string.utf8sub(character:GetName(), 1, 16) .."..."))
else
nameText:SetText(string.utf8upper(character:GetName()))
end
nameText:SizeToContents()
nameText:Dock(TOP)
nameText:DockMargin(0, SScaleMin(10 / 3), 0, 0)
nameText:SetContentAlignment(5)
local factionText = self.characterTextPanel:Add("DLabel")
factionText:SetFont("WNMenuFontNoClamp")
if (faction.name) == "Overwatch Transhuman Arm" then
factionText:SetText("ŻOŁNIERZ OVERWATCH")
else
factionText:SetText(string.utf8upper(faction.name))
end
factionText:SizeToContents()
factionText:Dock(TOP)
factionText:SetContentAlignment(5)
factionText:SetTextColor(Color(200, 200, 200, 200))
local buttons = self.characterTextPanel:Add("Panel")
buttons:SetSize(self.characterTextPanel:GetWide(), margin)
buttons:Dock(TOP)
buttons:DockMargin(0, margin * 0.5, 0, 0)
local centerButtons = buttons:Add("Panel")
centerButtons:SetSize((margin * 2) + SScaleMin(15 / 3), buttons:GetTall())
centerButtons:Center()
local loadChar = centerButtons:Add("DImageButton")
loadChar:SetSize(margin, margin)
loadChar:SetImage("willardnetworks/charselect/check.png")
loadChar:Dock(LEFT)
loadChar.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
loadChar:SetColor( Color( 210, 210, 210, 255 ) )
end
loadChar.OnCursorExited = function()
loadChar:SetColor( Color( 255, 255, 255, 255 ) )
end
loadChar.DoClick = function()
self.character = character
self:SetMouseInputEnabled(false)
self:Slide("down", self.animationTime, function()
net.Start("ixCharacterChoose")
net.WriteUInt(self.character:GetID(), 32)
net.SendToServer()
end, true)
end
local deleteButton = centerButtons:Add("DImageButton")
deleteButton:SetSize(margin, margin)
deleteButton:SetImage("willardnetworks/charselect/delete.png")
deleteButton:Dock(RIGHT)
deleteButton.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
deleteButton:SetColor( Color( 210, 210, 210, 255 ) )
end
deleteButton.OnCursorExited = function()
deleteButton:SetColor( Color( 255, 255, 255, 255 ) )
end
deleteButton.DoClick = function()
self.character = character
self:SetActiveSubpanel("delete")
if self.deleteModel and IsValid(self.deleteModel) then
self.deleteModel.overrideProxyColors = character:GetProxyColors()
end
end
end
if (ix.config.Get("CharCreationDisabled", false) and !CAMI.PlayerHasAccess(LocalPlayer(), "Helix - Character Creation Bypass") and #ix.characters == 0) then
Derma_Query( "Czy chcesz połączyć się z serwerem miasta?", "Nie masz żadnych postaci w tej lokalizacji.", "TAK", function()
RunConsoleCommand("connect", 'hl2rp.willard.network')
end, "NIE")
end
local backPanel = panelLoad:Add("Panel")
backPanel:Dock(TOP)
backPanel:SetSize(panelLoad:GetWide(), SScaleMin(30 / 3))
backPanel:DockMargin(0, margin * 2, 0, 0)
self.back = backPanel:Add("DButton")
self.back:SetText(string.utf8upper("Wróć"))
self.back:SetContentAlignment(6)
self.back:SetSize(SScaleMin(90 / 3), SScaleMin(30 / 3))
self.back:SetTextColor(self.aFontColor)
self.back:SetFont("MainMenuNewButtonFont")
self.back:Center()
self.back:SetTextInset(SScaleMin(10 / 3), 0)
self.back.Paint = function( self, w, h )
surface.SetDrawColor(Color(255, 255, 255, 255))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/mainmenu/back_arrow.png"))
surface.DrawTexturedRect(SScaleMin(10 / 3), (SScaleMin(30 / 3) * 0.5) - (margin * 0.5), margin, margin)
end
self.back.OnCursorEntered = function()
surface.PlaySound("helix/ui/rollover.wav")
self.back:SetTextColor(self.aFontHoverColor)
end
self.back.OnCursorExited = function()
self.back:SetTextColor(self.aFontColor)
end
self.back.DoClick = function()
self:SlideDown()
parent.mainPanel:Undim()
end
-- character deletion panel
self.delete = self:AddSubpanel("delete")
self.delete:SetTitle(nil)
self.delete.OnSetActive = function()
self.delete.avoidPadding = true
self.deleteModel:SetModel(self.character:GetModel())
if self.character:GetData("skin") then
self.deleteModel.Entity:SetSkin(self.character:GetData("skin"))
end
local bodygroups = self.character:GetData("groups", nil)
if (istable(bodygroups)) then
for k, v in pairs(bodygroups) do
if self.deleteModel.Entity then
self.deleteModel.Entity:SetBodygroup(k, v)
end
end
end
self:CreateAnimation(self.animationTime, {
index = 2,
target = {backgroundFraction = 0},
easing = "outQuint"
})
end
local deleteInfo = self.delete:Add("Panel")
deleteInfo:SetSize(parent:GetWide() * 0.5, parent:GetTall())
deleteInfo:Dock(LEFT)
self.deleteModel = deleteInfo:Add("ixModelPanel")
self.deleteModel:Dock(FILL)
self.deleteModel:SetModel(errorModel)
self.deleteModel:SetFOV(78)
self.deleteModel.PaintModel = self.deleteModel.Paint
local deleteNag = self.delete:Add("Panel")
deleteNag:SetTall(parent:GetTall() * 0.6)
deleteNag:Dock(BOTTOM)
local deleteTitle = deleteNag:Add("DLabel")
deleteTitle:SetFont("WNMenuTitleNoClamp")
deleteTitle:SetText(string.utf8upper("czy na pewno?"))
deleteTitle:SetTextColor(Color(243, 69, 42, 255))
deleteTitle:SizeToContents()
deleteTitle:Dock(TOP)
local deleteText = deleteNag:Add("DLabel")
deleteText:SetFont("WNSmallerMenuTitleNoClamp")
deleteText:SetText("Ta postać zostanie nieodwracalnie usunięta!")
deleteText:SetTextColor(color_white)
deleteText:SetContentAlignment(7)
deleteText:Dock(TOP)
deleteText:SizeToContents()
local yesnoPanel = deleteNag:Add("Panel")
yesnoPanel:Dock(TOP)
yesnoPanel:SetTall(SScaleMin(60 / 3))
yesnoPanel:DockMargin(0, margin, 0, 0)
local yes = yesnoPanel:Add("DButton")
yes:Dock(LEFT)
yes:SetWide(SScaleMin(100 / 3))
yes:DockMargin(0, 0, SScaleMin(40 / 3), 0)
yes:SetFont("WNSmallerMenuTitleNoClamp")
yes:SetText(string.utf8upper("tak"))
yes.Paint = function(self, w, h) end
yes:SetContentAlignment(4)
yes.DoClick = function()
self.CharacterCount = self.CharacterCount - 1
local id = self.character:GetID()
parent:ShowNotice(1, L("deleteComplete", self.character:GetName()))
self:SetActiveSubpanel("main")
net.Start("ixCharacterDelete")
net.WriteUInt(id, 32)
net.SendToServer()
for k, v in pairs(self.characterImages:GetChildren()) do
if v.id == id then
v:Remove()
end
end
for k, v in pairs(self.characterText:GetChildren()) do
if v.id == id then
v:Remove()
end
end
if self.CharacterCount == 1 then
self.characterImages:SetSize(charPanelW, charImageH)
self.characterText:SetSize(charPanelW, charTextH + margin)
else
self.characterImages:SetSize((self.CharacterCount) * charPanelW + ((self.CharacterCount - 1) * margin), charImageH)
self.characterText:SetSize((self.CharacterCount) * charPanelW + ((self.CharacterCount - 1) * margin), charTextH + margin)
end
if self.CharacterCount > 4 then
self.characterImages:SetPos(0, 0)
self.characterText:SetPos(0, self.characterImages:GetTall())
else
if IsValid(self.nextButton) then
self.nextButton:Remove()
end
if IsValid(self.previousButton) then
self.previousButton:Remove()
end
self.characterImages:Center()
local x, y = self.characterImages:GetPos()
self.characterImages:SetPos(x, 0)
self.characterText:Center()
local x, y = self.characterText:GetPos()
self.characterText:SetPos(x, self.characterImages:GetTall())
end
if IsValid(self.characterTextPanel) then
if self.CharacterCount == 1 then
self.characterTextPanel:DockMargin(0, 0, 0, 0)
end
end
end
local no = yesnoPanel:Add("DButton")
no:Dock(LEFT)
no:SetWide(SScaleMin(100 / 3))
no:SetFont("WNSmallerMenuTitleNoClamp")
no:SetText(string.utf8upper("nie"))
no:SetContentAlignment(6)
no.Paint = function(self, w, h) end
no.DoClick = function()
self:SetActiveSubpanel("main")
end
-- finalize setup
self:SetActiveSubpanel("main", 0)
end
function PANEL:OnCharacterDeleted(character)
local parent = self:GetParent()
local bHasCharacter = #ix.characters > 0
if (self.bActive and #ix.characters == 0) then
self:SlideDown()
parent.mainPanel.loadButton:SetDisabled(true)
parent.mainPanel.loadButton:SetTextColor(self.aFontLockedButtonColor)
parent.mainPanel.loadButton.OnCursorEntered = function()
if (!bHasCharacter) then
parent.mainPanel.loadButton:SetTextColor(self.aFontLockedButtonColor)
return
end
end
parent.mainPanel.loadButton.OnCursorExited = function()
if (!bHasCharacter) then
parent.mainPanel.loadButton:SetTextColor(self.aFontLockedButtonColor)
return
end
end
end
end
function PANEL:OnSlideUp()
self.bActive = true
end
function PANEL:OnSlideDown()
self.bActive = false
end
function PANEL:Paint(width, height)
end
vgui.Register("ixCharMenuLoad", PANEL, "ixCharMenuPanel")

View File

@@ -0,0 +1,223 @@
--[[
| 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 animationTime = 1
local padding = 32
-- entity menu button
DEFINE_BASECLASS("ixMenuButton")
local PANEL = {}
AccessorFunc(PANEL, "callback", "Callback")
function PANEL:Init()
self:SetTall(ScrH() * 0.1)
self:Dock(TOP)
self:SetFont("MenuFontBoldNoClamp")
self.Paint = function(self, 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.DrawLine(0, h - 1, w, h - 1)
if self:IsHovered() then
self:SetTextColor(Color(230, 230, 230, 255))
else
self:SetTextColor(color_white)
end
end
end
function PANEL:DoClick()
local bStatus = true
local parent = ix.menu.panel
local entity = parent:GetEntity()
if (parent.bClosing) then
return
end
if (isfunction(self.callback)) then
bStatus = self.callback()
end
if (bStatus != false) then
ix.menu.NetworkChoice(entity, self.originalText, bStatus)
end
parent:Remove()
end
function PANEL:SetText(text)
self.originalText = text
BaseClass.SetText(self, text)
end
vgui.Register("ixEntityMenuButton", PANEL, "ixMenuButton")
-- entity menu list
DEFINE_BASECLASS("EditablePanel")
PANEL = {}
function PANEL:Init()
self.list = {}
self.titleBar = self:Add("Panel")
self.titleBar:SetTall(SScaleMin(20 / 3))
self.titleBar:Dock(TOP)
self.titleBar.Paint = function(self, w, h)
surface.SetDrawColor(Color(255, 78, 69, 255))
surface.DrawRect(0, 0, w, h)
end
self.title = self.titleBar:Add("DLabel")
self.title:Dock(FILL)
self.title:SetFont("MenuFontLargerBoldNoFix")
self.title:SetContentAlignment(5)
self.title:SizeToContents()
self.title:SetText("Interakcje")
self.Paint = function(self, 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)
end
end
function PANEL:AddOption(text, callback)
local panel = self:Add("ixEntityMenuButton")
panel:SetText(text)
panel:SetCallback(callback)
panel:Dock(TOP)
self.list[#self.list + 1] = panel
end
function PANEL:SizeToContents()
local height = 0
for i = 1, #self.list do
height = height + self.list[i]:GetTall()
end
height = height + self.titleBar:GetTall()
self:SetSize(SScaleMin(200 / 3), height)
end
vgui.Register("ixEntityMenuList", PANEL, "EditablePanel")
-- entity menu
DEFINE_BASECLASS("EditablePanel")
PANEL = {}
AccessorFunc(PANEL, "entity", "Entity")
AccessorFunc(PANEL, "bClosing", "IsClosing", FORCE_BOOL)
AccessorFunc(PANEL, "desiredHeight", "DesiredHeight", FORCE_NUMBER)
function PANEL:Init()
if (IsValid(ix.menu.panel)) then
self:Remove()
return
end
-- close entity tooltip if it's open
if (IsValid(ix.gui.entityInfo)) then
ix.gui.entityInfo:Remove()
end
ix.menu.panel = self
self:SetSize(ScrW(), ScrH())
self:SetPos(0, 0)
self.list = self:Add("ixEntityMenuList")
self.desiredHeight = 0
self.blur = 0
self.alpha = 1
self.bClosing = false
self.lastPosition = vector_origin
self:CreateAnimation(animationTime, {
target = {blur = 1},
easing = "outQuint"
})
self:MakePopup()
end
function PANEL:SetOptions(options)
for k, v in SortedPairs(options) do
self.list:AddOption(k, v)
end
self.list:SizeToContents()
self.list:Center()
end
function PANEL:Think()
local entity = self.entity
local distance = 0
if (IsValid(entity)) then
local position = entity:GetPos()
distance = LocalPlayer():GetShootPos():DistToSqr(position)
if (distance > 65536) then
self:Remove()
return
end
self.lastPosition = position
end
end
function PANEL:GetOverviewInfo(origin, angles)
return angles
end
function PANEL:OnMousePressed(code)
if (code == MOUSE_LEFT) then
self:Remove()
end
end
function PANEL:Remove()
if (self.bClosing) then
return
end
self.bClosing = true
self:SetMouseInputEnabled(false)
self:SetKeyboardInputEnabled(false)
gui.EnableScreenClicker(false)
self:CreateAnimation(animationTime * 0.5, {
target = {alpha = 0},
index = 2,
easing = "outQuint",
Think = function(animation, panel)
panel:SetAlpha(panel.alpha * 255)
end,
OnComplete = function(animation, panel)
ix.menu.panel = nil
BaseClass.Remove(self)
end
})
end
vgui.Register("ixEntityMenu", PANEL, "EditablePanel")

View File

@@ -0,0 +1,356 @@
--[[
| 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 animationTime = 1
DEFINE_BASECLASS("ixSubpanelParent")
local PANEL = {}
function PANEL:Init()
if IsValid(ix.gui.F1Menu) then
ix.gui.F1Menu:Remove()
end
ix.gui.F1Menu = self
-- properties
self.noAnchor = CurTime() + 0.4
self.anchorMode = true
self.currentAlpha = 0
self.currentBlur = 0
gui.EnableScreenClicker( true )
self:SetSize(ScrW(), ScrH())
local function FramePaint( self, w, h)
surface.SetDrawColor(Color(0, 0, 0, 50))
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(Color(100, 100, 100, 150))
surface.DrawOutlinedRect(0, 0, w, h)
end
local mainFrame = self:Add("DPanel")
mainFrame:SetSize( SScaleMin(1020 / 3), SScaleMin(372 / 3) )
mainFrame:SetPos(ScrW() * 0.5 - mainFrame:GetWide() * 0.5, ScrH() * 0.5 - mainFrame:GetTall() * 0.5)
mainFrame.Paint = function( self, w, h ) end
-- Main frame (invisible)
local rightFrame = vgui.Create( "DPanel", mainFrame )
rightFrame:SetSize( SScaleMin(800 / 3), 0 )
rightFrame:Dock(RIGHT)
rightFrame.Paint = function( self, w, h ) end
local leftFrame = vgui.Create( "DPanel", mainFrame)
leftFrame:SetSize( SScaleMin(200 / 3), 0 )
leftFrame:Dock(LEFT)
leftFrame:DockMargin(0, SScaleMin(11 / 3), 0, 0)
leftFrame.Paint = function( self, w, h )
FramePaint(self, w, h)
surface.SetDrawColor(Color(150, 150, 150, 20))
surface.SetMaterial(Material("willardnetworks/tabmenu/crafting/box_pattern.png", "noclamp"))
surface.DrawTexturedRectUV( 0, 0, w, h, 0, 0, w / SScaleMin(414 / 3), h / SScaleMin(677 / 3) )
end
-- Character model
self.icon = vgui.Create( "ixModelPanel", leftFrame )
self.icon:Dock(TOP)
self.icon:SetTall(SScaleMin(372 / 3))
self.icon:DockMargin(0, 0 - SScaleMin(20 / 3), 0, 0)
self.icon:SetFOV(38)
self.icon:SetModel( LocalPlayer():GetModel(), LocalPlayer():GetSkin(), true )
local title = rightFrame:Add("DLabel")
title:SetFont("WNSmallerMenuTitleNoClamp")
title:SetTextColor(Color(255, 255, 255, 255))
title:SetExpensiveShadow(1, Color(0, 0, 0, 150))
title:SetText(string.utf8upper("Informacje o postaci i odgrywanej roli"))
title:SizeToContents()
title:Dock(TOP)
-- Date, time
local format = "%A, %B %d, %Y. %H:%M:%S"
local timetext = rightFrame:Add("DLabel")
timetext:SetFont("WNSmallerMenuTitleNoBoldNoClamp")
timetext:SetTextColor(Color(255, 255, 255, 255))
timetext:SetExpensiveShadow(1, Color(0, 0, 0, 150))
--luacheck: read globals StormFox2
if (StormFox2) then
timetext:SetText(ix.date.GetFormatted("%A, %B %d, %Y. ")..StormFox2.Time.TimeToString())
else
timetext:SetText(ix.date.GetFormatted(format))
end
timetext:SizeToContents()
timetext:Dock(TOP)
timetext:DockMargin(0, 0, 0, SScaleMin(10 / 3))
timetext.Think = function(this)
if ((this.nextTime or 0) < CurTime()) then
if (StormFox2) then
this:SetText(ix.date.GetFormatted("%A, %B %d, %Y. ")..StormFox2.Time.TimeToString())
else
this:SetText(ix.date.GetFormatted(format))
end
this.nextTime = CurTime() + 0.5
end
end
local charInfoFrame = rightFrame:Add("DPanel")
charInfoFrame:SetSize(rightFrame:GetWide(), SScaleMin(170 / 3))
charInfoFrame:Dock(TOP)
charInfoFrame:DockMargin(0, 0, 0, SScaleMin(20 / 3))
local boxPattern = Material("willardnetworks/tabmenu/crafting/box_pattern.png", "noclamp")
charInfoFrame.Paint = function( self, w, h )
FramePaint(self, w, h)
surface.SetDrawColor(Color(150, 150, 150, 20))
surface.SetMaterial(boxPattern)
surface.DrawTexturedRectUV( 0, 0, w, h, 0, 0, w / SScaleMin(414 / 3), h / SScaleMin(677 / 3) )
end
local function GetPartColor(name)
if LocalPlayer():GetNetVar(name) and LocalPlayer():GetNetVar("fullHealth") == false then
return Color(255, 129, 122, 255)
else
return Color(255, 255, 255, 255)
end
end
local bodyParts = {
{Image = "willardnetworks/f1menu/chest.png", Name = "ChestDamaged"},
{Image = "willardnetworks/f1menu/head.png", Name = "HeadDamaged"},
{Image = "willardnetworks/f1menu/larm.png", Name = "LArmDamaged"},
{Image = "willardnetworks/f1menu/lleg.png", Name = "LLegDamaged"},
{Image = "willardnetworks/f1menu/rarm.png", Name = "RArmDamaged"},
{Image = "willardnetworks/f1menu/rleg.png", Name = "RLegDamaged"},
{Image = "willardnetworks/f1menu/stomach.png", Name = "StomachDamaged"}
}
-- Body
local bodyFrame = charInfoFrame:Add("DPanel")
bodyFrame:SetWide( SScaleMin(100 / 3) )
bodyFrame:Dock(LEFT)
bodyFrame.Paint = function(self, w, h) end
local body = bodyFrame:Add("DImage")
local w, h = SScaleMin(64 / 3), SScaleMin(128 / 3)
local x, y = bodyFrame:GetWide() * 0.5 - w * 0.5, charInfoFrame:GetTall() * 0.5 - h * 0.5
body:SetSize( w, h )
body:SetPos(x, y)
body:SetImage( "willardnetworks/f1menu/body.png" )
for k, v in pairs(bodyParts) do
local bodypart = bodyFrame:Add("DImage")
bodypart:SetSize( w, h )
bodypart:SetPos(x, y)
bodypart:SetImage( v.Image )
bodypart:SetImageColor( GetPartColor(v.Name) )
end
local textFrame = charInfoFrame:Add("DPanel")
textFrame:SetWide( SScaleMin( 500 / 3) )
textFrame:Dock(LEFT)
textFrame.Paint = function(self, w, h) end
local name = textFrame:Add("DLabel")
name:SetFont("TitlesFontNoClamp")
name:SetTextColor(Color(254, 200, 0, 255))
name:SetExpensiveShadow(1, Color(0, 0, 0, 50))
name:SetText(LocalPlayer():Name())
name:SizeToContents()
name:Dock(TOP)
name:DockMargin(0, SScaleMin(23 / 3), 0, 0)
local faction = textFrame:Add("DLabel")
local factionTable = ix.faction.Get(LocalPlayer():Team())
faction:SetFont("TitlesFontNoClamp")
faction:SetTextColor(Color(254, 200, 0, 255))
faction:SetExpensiveShadow(1, Color(0, 0, 0, 50))
faction:SetText(factionTable.name)
faction:SizeToContents()
faction:Dock(TOP)
faction:DockMargin(0, SScaleMin(9 / 3), 0, 0)
local citizenid = textFrame:Add("DLabel")
local cidtext = LocalPlayer():GetCharacter():GetCid() or "N/A"
citizenid:SetFont("TitlesFontNoClamp")
citizenid:SetTextColor(Color(255, 255, 255, 255))
citizenid:SetExpensiveShadow(1, Color(0, 0, 0, 50))
citizenid:SetText("Citizen ID: #"..cidtext or "N/A")
citizenid:SizeToContents()
citizenid:Dock(TOP)
citizenid:DockMargin(0, SScaleMin(9 / 3), 0, 0)
local tokens = textFrame:Add("DLabel")
tokens:SetFont("TitlesFontNoClamp")
tokens:SetTextColor(Color(255, 255, 255, 255))
tokens:SetExpensiveShadow(1, Color(0, 0, 0, 50))
tokens:SetText("Żetony: "..LocalPlayer():GetCharacter():GetMoney())
tokens:SizeToContents()
tokens:Dock(TOP)
tokens:DockMargin(0, SScaleMin(9 / 3), 0, 0)
local description = vgui.Create("DButton", rightFrame)
description:SetFont("MenuFontNoClamp")
description:SetText( "Opis" )
description:Dock(TOP)
description:DockMargin(0, 0, 0, 0 - SScaleMin(1 / 3))
description:SetSize( rightFrame:GetWide(), SScaleMin(30 / 3) )
description.Paint = function( self, w, h ) FramePaint(self, w, h) end
description.DoClick = function ( btn )
Derma_StringRequest(LocalPlayer():Name(), "Ustaw swój opis", LocalPlayer():GetCharacter():GetDescription(), function(desc)
ix.command.Send("CharDesc", desc)
end)
end
local detDesc = vgui.Create("DButton", rightFrame)
detDesc:SetFont("MenuFontNoClamp")
detDesc:SetText( "Animacje" )
detDesc:Dock(TOP)
detDesc:DockMargin(0, 0, 0, 0 - SScaleMin(1 / 3))
detDesc:SetSize( rightFrame:GetWide(), SScaleMin(30 / 3) )
detDesc.Paint = function( self, w, h ) FramePaint(self, w, h) end
detDesc.DoClick = function ( btn )
local MenuButtonOptions = DermaMenu() -- Creates the menu
MenuButtonOptions:AddOption("Areszt (actarrest)", function() ix.command.Send("actarrest") end ) -- Add options to the menu
MenuButtonOptions:AddOption("Ranny (actinjured)", function() ix.command.Send("actinjured") end )
MenuButtonOptions:AddOption("Wiwat (actcheer)", function() ix.command.Send("actcheer") end )
MenuButtonOptions:AddOption("Opieranie się (actlean)", function() ix.command.Send("actlean") end )
MenuButtonOptions:AddOption("Zadyszka (actpant)", function() ix.command.Send("actpant") end )
MenuButtonOptions:AddOption("Siedzenie (actsit)", function() ix.command.Send("actsit") end )
MenuButtonOptions:AddOption("Siedzenie pod Ścianą (actsitwall)", function() ix.command.Send("actsitwall") end )
MenuButtonOptions:AddOption("Stanie (actstand)", function() ix.command.Send("actstand") end )
MenuButtonOptions:AddOption("Machanie (actwave)", function() ix.command.Send("actwave") end )
MenuButtonOptions:AddOption("Okno (actwindow)", function() ix.command.Send("actwindow") end )
MenuButtonOptions:AddOption("Pisanie (acttype)", function() ix.command.Send("acttype") end )
MenuButtonOptions:AddOption("Siedzenie na Krześle (actsitchair)", function() ix.command.Send("actsitchair") end)
MenuButtonOptions:AddOption("Siedzenie pochylone (actsitlean)", function() ix.command.Send("actsitlean") end)
MenuButtonOptions:Open() -- Open the menu AFTER adding your options
for _, v in pairs(MenuButtonOptions:GetChildren()[1]:GetChildren()) do
if v:GetClassName() == "Label" then
v:SetFont("MenuFontNoClamp")
end
end
end
local fallover = vgui.Create("DButton", rightFrame)
fallover:SetFont("MenuFontNoClamp")
fallover:SetText( "Upadnij" )
fallover:Dock(TOP)
fallover:DockMargin(0, 0, 0, 0 - SScaleMin(1 / 3))
fallover:SetSize( rightFrame:GetWide(), SScaleMin(30 / 3) )
fallover.Paint = function( self, w, h ) FramePaint(self, w, h) end
fallover.DoClick = function ( btn )
ix.command.Send("CharFallover")
end
hook.Run("F1MenuCreated", self, mainFrame, leftFrame, rightFrame)
self:MakePopup()
self:OnOpened()
end
function PANEL:OnOpened()
self:SetAlpha(0)
self:CreateAnimation(animationTime, {
target = {currentAlpha = 255},
easing = "outQuint",
Think = function(animation, panel)
panel:SetAlpha(panel.currentAlpha)
end
})
end
function PANEL:OnKeyCodePressed(key)
self.noAnchor = CurTime() + 0.5
if (key == KEY_F1) then
self:Remove()
end
end
function PANEL:Think()
if (self.bClosing) then
return
end
local bF1Down = input.IsKeyDown(KEY_F1)
if (bF1Down and (self.noAnchor or CurTime() + 0.4) < CurTime() and self.anchorMode) then
self.anchorMode = false
end
if ((!self.anchorMode and !bF1Down) or gui.IsGameUIVisible()) then
self:Remove()
end
end
function PANEL:Paint(width, height)
surface.SetDrawColor(Color(63, 58, 115, 220))
surface.DrawRect(0, 0, width, height)
Derma_DrawBackgroundBlur( self, 0 )
BaseClass.Paint(self, width, height)
end
function PANEL:Remove()
self.bClosing = true
self:SetMouseInputEnabled(false)
self:SetKeyboardInputEnabled(false)
if IsValid(self.icon) then
self.icon:Remove()
end
CloseDermaMenus()
gui.EnableScreenClicker(false)
self:CreateAnimation(animationTime * 0.5, {
index = 2,
target = {currentBlur = 0},
easing = "outQuint"
})
self:CreateAnimation(animationTime * 0.5, {
target = {currentAlpha = 0},
easing = "outQuint",
-- we don't animate the blur because blurring doesn't draw things
-- with amount < 1 very well, resulting in jarring transition
Think = function(animation, panel)
panel:SetAlpha(panel.currentAlpha)
end,
OnComplete = function(animation, panel)
BaseClass.Remove(panel)
end
})
end
vgui.Register("ixF1Menu", PANEL, "ixSubpanelParent")
if (IsValid(ix.gui.F1Menu)) then
ix.gui.F1Menu:Remove()
end

View File

@@ -0,0 +1,702 @@
--[[
| 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/
--]]
-- generic panels that are applicable anywhere
-- used for prominent text entries
DEFINE_BASECLASS("DTextEntry")
local PANEL = {}
AccessorFunc(PANEL, "backgroundColor", "BackgroundColor")
function PANEL:Init()
self:SetPaintBackground(false)
self:SetTextColor(color_white)
self.backgroundColor = Color(255, 255, 255, 25)
end
function PANEL:SetFont(font)
surface.SetFont(font)
local _, height = surface.GetTextSize("W@")
self:SetTall(height)
BaseClass.SetFont(self, font)
end
function PANEL:Paint(width, height)
derma.SkinFunc("DrawImportantBackground", 0, 0, width, height, self.backgroundColor)
BaseClass.Paint(self, width, height)
end
vgui.Register("ixTextEntry", PANEL, "DTextEntry")
-- similar to a frame, but is mainly used for grouping panels together in a list
PANEL = {}
AccessorFunc(PANEL, "text", "Text", FORCE_STRING)
AccessorFunc(PANEL, "color", "Color")
function PANEL:Init()
self.text = ""
self.paddingTop = SScaleMin(32 / 3)
local skin = self:GetSkin()
if (skin and skin.fontCategoryBlur) then
surface.SetFont("TitlesFontNoClamp")
self.paddingTop = select(2, surface.GetTextSize("W@")) + SScaleMin(6 / 3)
end
self:DockPadding(SScaleMin(1 / 3), self.paddingTop, SScaleMin(1 / 3), SScaleMin(1 / 3))
end
function PANEL:SizeToContents()
local height = self.paddingTop + SScaleMin(1 / 3)
for _, v in ipairs(self:GetChildren()) do
if (IsValid(v) and v:IsVisible()) then
local _, top, _, bottom = v:GetDockMargin()
height = height + v:GetTall() + top + bottom
end
end
self:SetTall(height)
end
function PANEL:Paint(width, height)
text = self.text or ""
color = self.color or ix.config.Get("color")
surface.SetFont("TitlesFontNoClamp")
local textHeight = select(2, surface.GetTextSize(text)) + SScaleMin(6 / 3)
local width, height = self:GetSize()
surface.SetDrawColor(0, 0, 0, 100)
surface.DrawRect(0, textHeight, width, height - textHeight)
surface.SetDrawColor(Color(0, 0, 0, 0))
surface.DrawRect(0, 0, width, textHeight)
surface.SetFont("TitlesFontNoClamp")
surface.SetTextColor(color_white)
surface.SetTextPos(0, SScaleMin(1 / 3))
surface.DrawText(text)
return SScaleMin(1 / 3), textHeight, SScaleMin(1 / 3), SScaleMin(1 / 3)
end
vgui.Register("ixCategoryPanel", PANEL, "EditablePanel")
-- segmented progress bar
PANEL = {}
AccessorFunc(PANEL, "font", "Font", FORCE_STRING)
AccessorFunc(PANEL, "barColor", "BarColor")
AccessorFunc(PANEL, "textColor", "TextColor")
AccessorFunc(PANEL, "progress", "Progress", FORCE_NUMBER)
AccessorFunc(PANEL, "padding", "Padding", FORCE_NUMBER)
AccessorFunc(PANEL, "animationTime", "AnimationTime", FORCE_NUMBER)
AccessorFunc(PANEL, "easingType", "EasingType", FORCE_STRING)
function PANEL:Init()
self.segments = {}
self.padding = ScrH() * 0.01
self.fraction = 0
self.animationTime = 0.5
self.easingType = "outQuint"
self.progress = 0
end
function PANEL:AddSegment(text)
local id = #self.segments + 1
if (text:utf8sub(1, 1) == "@") then
text = L(text:utf8sub(2))
end
self.segments[id] = text
return id
end
function PANEL:AddSegments(...)
local segments = {...}
for i = 1, #segments do
self:AddSegment(segments[i])
end
end
function PANEL:GetSegments()
return self.segments
end
function PANEL:SetProgress(segment)
self.progress = math.Clamp(segment, 0, #self.segments)
self:CreateAnimation(self.animationTime, {
target = {fraction = self.progress / #self.segments},
easing = self.easingType
})
end
function PANEL:IncrementProgress(amount)
self:SetProgress(self.progress + (amount or 1))
end
function PANEL:DecrementProgress(amount)
self:SetProgress(self.progress - (amount or 1))
end
function PANEL:GetFraction()
return self.fraction
end
function PANEL:SizeToContents()
self:SetTall(draw.GetFontHeight(self.font or self:GetSkin().fontSegmentedProgress) + self.padding)
end
function PANEL:Paint(width, height)
derma.SkinFunc("PaintSegmentedProgressBackground", self, width, height)
if (#self.segments > 0) then
derma.SkinFunc("PaintSegmentedProgress", self, width, height)
end
end
vgui.Register("ixSegmentedProgress", PANEL, "Panel")
-- list of labelled information
PANEL = {}
AccessorFunc(PANEL, "labelColor", "LabelColor")
AccessorFunc(PANEL, "textColor", "TextColor")
AccessorFunc(PANEL, "list", "List")
AccessorFunc(PANEL, "minWidth", "MinimumWidth", FORCE_NUMBER)
function PANEL:Init()
self.label = self:Add("DLabel")
self.label:SetFont("TitlesFontNoClamp")
self.label:SetExpensiveShadow(1)
self.label:SetTextColor(color_white)
self.label:SetText("Label")
self.label:SetContentAlignment(5)
self.label:Dock(LEFT)
self.label:DockMargin(0, 0, SScaleMin(4 / 3), 0)
self.label:SizeToContents()
self.label.Paint = function(this, width, height)
derma.SkinFunc("PaintListRow", this, width, height)
end
self.text = self:Add("DLabel")
self.text:SetFont("TitlesFontNoBoldNoClamp")
self.text:SetTextColor(color_white)
self.text:SetText("Text")
self.text:SetTextInset(SScaleMin(8 / 3), 0)
self.text:Dock(FILL)
self.text:DockMargin(SScaleMin(4 / 3), 0, 0, 0)
self.text:SizeToContents()
self.text.Paint = function(this, width, height)
derma.SkinFunc("PaintListRow", this, width, height)
end
self:DockMargin(0, 0, 0, SScaleMin(8 / 3))
self.list = {}
self.minWidth = SScaleMin(100 / 3)
end
function PANEL:SetRightPanel(panel)
self.text:Remove()
self.text = self:Add(panel)
self.text:Dock(FILL)
self.text:DockMargin(SScaleMin(8 / 3), SScaleMin(4 / 3), SScaleMin(4 / 3), SScaleMin(4 / 3))
self.text:SizeToContents()
end
function PANEL:SetList(list, bNoAdd)
if (!bNoAdd) then
list[#list + 1] = self
end
self.list = list
end
function PANEL:UpdateLabelWidths()
local maxWidth = self.label:GetWide()
for i = 1, #self.list do
maxWidth = math.max(self.list[i]:GetLabelWidth(), maxWidth)
end
maxWidth = math.max(self.minWidth, maxWidth)
for i = 1, #self.list do
self.list[i]:SetLabelWidth(maxWidth)
end
end
function PANEL:SetLabelColor(color)
self.label:SetTextColor(color)
end
function PANEL:SetTextColor(color)
self.text:SetTextColor(color)
end
function PANEL:SetLabelText(text)
self.label:SetText(text)
self.label:SizeToContents()
self:UpdateLabelWidths()
end
function PANEL:SetText(text)
self.text:SetText(text)
self.text:SizeToContents()
end
function PANEL:SetLabelWidth(width)
self.label:SetWide(width)
end
function PANEL:GetLabelWidth(bWithoutMargin)
if (!bWithoutMargin) then
return self.label:GetWide()
end
local left, _, right, _ = self.label:GetDockMargin()
return self.label:GetWide() + left + right
end
function PANEL:SizeToContents()
self:SetTall(math.max(self.label:GetTall(), self.text:GetTall()) + SScaleMin(8 / 3))
end
vgui.Register("ixListRow", PANEL, "Panel")
-- alternative checkbox
PANEL = {}
AccessorFunc(PANEL, "bChecked", "Checked", FORCE_BOOL)
AccessorFunc(PANEL, "animationTime", "AnimationTime", FORCE_NUMBER)
AccessorFunc(PANEL, "labelPadding", "LabelPadding", FORCE_NUMBER)
PANEL.GetValue = PANEL.GetChecked
function PANEL:Init()
self:SetMouseInputEnabled(true)
self:SetCursor("hand")
self.labelPadding = SScaleMin(8 / 3)
self.animationOffset = 0
self.animationTime = 0.5
self.bChecked = false
surface.SetFont("TitlesFontNoBoldNoClamp")
self:SetWide(math.max(surface.GetTextSize(L("yes")), surface.GetTextSize(L("no"))) + self.labelPadding)
end
-- can be overidden to change audio params
function PANEL:GetAudioFeedback()
return "weapons/ar2/ar2_empty.wav", 75, self.bChecked and 150 or 125, 0.25
end
function PANEL:EmitFeedback()
LocalPlayer():EmitSound(self:GetAudioFeedback())
end
function PANEL:SetChecked(bChecked, bInstant)
self.bChecked = tobool(bChecked)
self:CreateAnimation(bInstant and 0 or self.animationTime, {
index = 1,
target = {
animationOffset = bChecked and 1 or 0
},
easing = "outElastic"
})
if (!bInstant) then
self:EmitFeedback()
end
end
function PANEL:OnMousePressed(code)
if (code == MOUSE_LEFT) then
self:SetChecked(!self.bChecked)
self:DoClick()
end
end
function PANEL:DoClick()
end
function PANEL:Paint(width, height)
surface.SetDrawColor(derma.GetColor("DarkerBackground", self))
surface.DrawRect(0, 0, width, height)
local offset = self.animationOffset
surface.SetFont("TitlesFontNoBoldNoClamp")
local text = L("no"):utf8upper()
local textWidth, textHeight = surface.GetTextSize(text)
local y = offset * -textHeight
surface.SetTextColor(250, 60, 60, 255)
surface.SetTextPos(width * 0.5 - textWidth * 0.5, y + height * 0.5 - textHeight * 0.5)
surface.DrawText(text)
text = L("yes"):utf8upper()
y = y + textHeight
textWidth, textHeight = surface.GetTextSize(text)
surface.SetTextColor(30, 250, 30, 255)
surface.SetTextPos(width * 0.5 - textWidth * 0.5, y + height * 0.5 - textHeight * 0.5)
surface.DrawText(text)
end
vgui.Register("ixCheckBox", PANEL, "EditablePanel")
-- alternative num slider
PANEL = {}
AccessorFunc(PANEL, "labelPadding", "LabelPadding", FORCE_NUMBER)
function PANEL:Init()
self.labelPadding = SScaleMin(8 / 3)
surface.SetFont("TitlesFontNoBoldNoClamp")
local totalWidth = surface.GetTextSize("999") -- start off with 3 digit width
self.label = self:Add("DLabel")
self.label:Dock(RIGHT)
self.label:SetWide(totalWidth + self.labelPadding)
self.label:SetContentAlignment(5)
self.label:SetFont("TitlesFontNoBoldNoClamp")
self.label.Paint = function(panel, width, height)
surface.SetDrawColor(derma.GetColor("DarkerBackground", self))
surface.DrawRect(0, 0, width, height)
end
self.label.SizeToContents = function(panel)
surface.SetFont(panel:GetFont())
local textWidth = surface.GetTextSize(panel:GetText())
if (textWidth > totalWidth) then
panel:SetWide(textWidth + self.labelPadding)
elseif (panel:GetWide() > totalWidth + self.labelPadding) then
panel:SetWide(totalWidth + self.labelPadding)
end
end
self.slider = self:Add("ixSlider")
self.slider:Dock(FILL)
self.slider:DockMargin(0, 0, SScaleMin(4 / 3), 0)
self.slider.OnValueChanged = function(panel)
self:OnValueChanged()
end
self.slider.OnValueUpdated = function(panel)
self.label:SetText(tostring(panel:GetValue()))
self.label:SizeToContents()
self:OnValueUpdated()
end
end
function PANEL:GetLabel()
return self.label
end
function PANEL:GetSlider()
return self.slider
end
function PANEL:SetValue(value, bNoNotify)
value = tonumber(value) or self.slider:GetMin()
self.slider:SetValue(value, bNoNotify)
self.label:SetText(tostring(self.slider:GetValue()))
self.label:SizeToContents()
end
function PANEL:GetValue()
return self.slider:GetValue()
end
function PANEL:GetFraction()
return self.slider:GetFraction()
end
function PANEL:GetVisualFraction()
return self.slider:GetVisualFraction()
end
function PANEL:SetMin(value)
self.slider:SetMin(value)
end
function PANEL:SetMax(value)
self.slider:SetMax(value)
end
function PANEL:GetMin()
return self.slider:GetMin()
end
function PANEL:GetMax()
return self.slider:GetMax()
end
function PANEL:SetDecimals(value)
self.slider:SetDecimals(value)
end
function PANEL:GetDecimals()
return self.slider:GetDecimals()
end
-- called when changed by user
function PANEL:OnValueChanged()
end
-- called when changed while dragging bar
function PANEL:OnValueUpdated()
end
vgui.Register("ixNumSlider", PANEL, "Panel")
-- alternative slider
PANEL = {}
AccessorFunc(PANEL, "bDragging", "Dragging", FORCE_BOOL)
AccessorFunc(PANEL, "min", "Min", FORCE_NUMBER)
AccessorFunc(PANEL, "max", "Max", FORCE_NUMBER)
AccessorFunc(PANEL, "decimals", "Decimals", FORCE_NUMBER)
function PANEL:Init()
self.min = 0
self.max = 10
self.value = 0
self.visualValue = 0
self.decimals = 0
self:SetCursor("hand")
end
function PANEL:SetValue(value, bNoNotify)
self.value = math.Clamp(math.Round(tonumber(value) or self.min, self.decimals), self.min, self.max)
self:ValueUpdated(bNoNotify)
if (!bNoNotify) then
self:OnValueChanged()
end
end
function PANEL:GetValue()
return self.value
end
function PANEL:GetFraction()
return math.Remap(self.value, self.min, self.max, 0, 1)
end
function PANEL:GetVisualFraction()
return math.Remap(self.visualValue, self.min, self.max, 0, 1)
end
function PANEL:OnMousePressed(key)
if (key == MOUSE_LEFT) then
self.bDragging = true
self:MouseCapture(true)
self:OnCursorMoved(self:CursorPos())
end
end
function PANEL:OnMouseReleased(key)
if (self.bDragging) then
self:OnValueChanged()
end
self.bDragging = false
self:MouseCapture(false)
end
function PANEL:OnCursorMoved(x, y)
if (!self.bDragging) then
return
end
x = math.Clamp(x, 0, self:GetWide())
local oldValue = self.value
self.value = math.Clamp(math.Round(
math.Remap(x / self:GetWide(), 0, 1, self.min, self.max), self.decimals
), self.min, self.max)
self:CreateAnimation(0.5, {
index = 1,
target = {visualValue = self.value},
easing = "outQuint"
})
if (self.value != oldValue) then
self:ValueUpdated()
end
end
function PANEL:OnValueChanged()
end
function PANEL:ValueUpdated(bNoNotify)
self:CreateAnimation(bNoNotify and 0 or 0.5, {
index = 1,
target = {visualValue = self.value},
easing = "outQuint"
})
if (!bNoNotify) then
self:OnValueUpdated()
end
end
function PANEL:OnValueUpdated()
end
function PANEL:Paint(width, height)
derma.SkinFunc("PaintHelixSlider", self, width, height)
end
vgui.Register("ixSlider", PANEL, "EditablePanel")
-- label with custom kerning
PANEL = {}
AccessorFunc(PANEL, "text", "Text", FORCE_STRING)
AccessorFunc(PANEL, "color", "TextColor")
AccessorFunc(PANEL, "kerning", "Kerning", FORCE_NUMBER) -- in px
AccessorFunc(PANEL, "font", "Font", FORCE_STRING)
AccessorFunc(PANEL, "bCentered", "Centered", FORCE_BOOL)
AccessorFunc(PANEL, "bDrawShadow", "ExpensiveShadow")
function PANEL:Init()
self.text = ""
self.color = color_white
self.kerning = 2
self.font = "DermaDefault"
self.bCentered = false
self.shadowDistance = 0
self.color = color_black
end
function PANEL:SetText(text)
self.text = tostring(text)
self:GetContentSize(true)
end
function PANEL:SetExpensiveShadow(distance, color) -- we'll retain similar naming to the DLabel shadow
self.shadowDistance = distance or 1
self.shadowColor = ix.util.DimColor(self.color, 0.5)
end
function PANEL:Paint(width, height)
surface.SetFont(self.font)
local x = self.bCentered and (width * 0.5 - self:GetContentSize() * 0.5) or 0
for i = 1, #self.text do
local character = self.text[i]
local textWidth, _ = surface.GetTextSize(character)
local kerning = i == 1 and 0 or self.kerning
local shadowDistance = self.shadowDistance
-- shadow
if (self.shadowDistance > 0) then
surface.SetTextColor(self.shadowColor)
surface.SetTextPos(x + kerning + shadowDistance, shadowDistance)
surface.DrawText(character)
end
-- character
surface.SetTextColor(self.color)
surface.SetTextPos(x + kerning, 0)
surface.DrawText(character)
x = x + textWidth + kerning
end
end
function PANEL:GetContentSize(bCalculate)
if (bCalculate or !self.contentSize) then
local width = 0
surface.SetFont(self.font)
for i = 1, #self.text do
local textWidth, _ = surface.GetTextSize(self.text[i])
width = width + textWidth + self.kerning
end
self.contentSize = {width, draw.GetFontHeight(self.font)}
end
return self.contentSize[1], self.contentSize[2]
end
function PANEL:SizeToContents()
self:SetSize(self:GetContentSize(true))
end
vgui.Register("ixKLabel", PANEL, "Panel")
-- text entry with icon
DEFINE_BASECLASS("ixTextEntry")
PANEL = {}
AccessorFunc(PANEL, "icon", "Icon", FORCE_STRING)
AccessorFunc(PANEL, "iconColor", "IconColor")
function PANEL:Init()
self:SetIcon("V")
self:SetFont("ixSmallTitleFont")
self.iconColor = Color(200, 200, 200, 160)
end
function PANEL:SetIcon(newIcon)
surface.SetFont("ixSmallTitleIcons")
self.iconWidth, self.iconHeight = surface.GetTextSize(newIcon)
self.icon = newIcon
self:DockMargin(self.iconWidth + 2, 0, 0, 8)
end
function PANEL:Paint(width, height)
BaseClass.Paint(self, width, height)
-- there's no inset for text entries so we'll have to get creative
DisableClipping(true)
surface.SetDrawColor(self:GetBackgroundColor())
surface.DrawRect(-self.iconWidth - 2, 0, self.iconWidth + 2, height)
surface.SetFont("ixSmallTitleIcons")
surface.SetTextColor(self.iconColor)
surface.SetTextPos(-self.iconWidth, 0)
surface.DrawText("V")
DisableClipping(false)
end
vgui.Register("ixIconTextEntry", PANEL, "ixTextEntry")

View File

@@ -0,0 +1,355 @@
--[[
| 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 backgroundColor = Color(0, 0, 0, 66)
local titlePushDown = 30
local PANEL = {}
AccessorFunc(PANEL, "maxWidth", "MaxWidth", FORCE_NUMBER)
function PANEL:Init()
self:SetWide(SScaleMin(180 / 3))
self:Dock(LEFT)
self.maxWidth = ScrW() * 0.2
end
function PANEL:Paint(width, height)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, width, height)
end
function PANEL:SizeToContents()
local width = 0
for _, v in ipairs(self:GetChildren()) do
width = math.max(width, v:GetWide())
end
self:SetSize(math.max(SScaleMin(32 / 3), math.min(width, self.maxWidth)), self:GetParent():GetTall())
end
vgui.Register("ixHelpMenuCategories", PANEL, "EditablePanel")
-- help menu
PANEL = {}
function PANEL:Init()
local titlePushDown = SScaleMin(30 / 3)
local topPushDown = SScaleMin(150 / 3)
local scale780 = SScaleMin(780 / 3)
local scale120 = SScaleMin(120 / 3)
self:SetWide(ScrW() - (topPushDown * 2))
local sizeXtitle, sizeYtitle = self:GetWide(), scale120
local sizeXcontent, sizeYcontent = self:GetWide(), (scale780)
self.titlePanel = self:Add("Panel")
self.titlePanel:SetSize(sizeXtitle, sizeYtitle)
self.titlePanel:SetPos(self:GetWide() * 0.5 - self.titlePanel:GetWide() * 0.5)
self:CreateTitleText()
self.contentFrame = self:Add("Panel")
self.contentFrame:SetSize(sizeXcontent, sizeYcontent)
self.contentFrame:SetPos(self:GetWide() * 0.5 - self.contentFrame:GetWide() * 0.5, titlePushDown)
self:SetTall(scale120 + scale780 + titlePushDown)
self:Center()
self.categories = {}
self.categorySubpanels = {}
self.categoryPanel = self.contentFrame:Add("ixHelpMenuCategories")
self.canvasPanel = self.contentFrame:Add("EditablePanel")
self.canvasPanel:Dock(FILL)
self.idlePanel = self.canvasPanel:Add("Panel")
self.idlePanel:Dock(FILL)
self.idlePanel:DockMargin(SScaleMin(8 / 3), 0, 0, 0)
self.idlePanel.Paint = function(_, width, height)
local curTime = CurTime()
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, width, height)
surface.SetDrawColor(Color(255, 255, 255, 255))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_base.png"))
surface.DrawTexturedRect(width * 0.5 - SScaleMin(195 / 3) * 0.5, height * 0.5 - SScaleMin(196 / 3) * 0.5, SScaleMin(195 / 3), SScaleMin(196 / 3))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_circle1.png"))
surface.DrawTexturedRectRotated((width * 0.5) + 2, (height * 0.5) - 2, SScaleMin(195 / 3), SScaleMin(196 / 3), curTime * -15)
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_circle2.png"))
surface.DrawTexturedRectRotated((width * 0.5) - 2, (height * 0.5) + 2, SScaleMin(195 / 3), SScaleMin(196 / 3), curTime * -15)
end
local categories = {}
hook.Run("PopulateHelpMenu", categories)
for k, v in SortedPairs(categories) do
if (!isstring(k)) then
ErrorNoHalt("expected string for help menu key\n")
continue
elseif (!isfunction(v)) then
ErrorNoHalt(string.format("expected function for help menu entry '%s'\n", k))
continue
end
self:AddCategory(k)
self.categories[k] = v
end
self.categoryPanel:SizeToContents()
if (ix.gui.lastHelpMenuTab) then
self:OnCategorySelected(ix.gui.lastHelpMenuTab)
end
end
function PANEL:AddCategory(name)
local button = self.categoryPanel:Add("ixMenuButton")
button:SetText(L(name))
if (L(name)) == "credits" then
button:SetText("Podziękowania")
end
-- @todo don't hardcode this but it's the only panel that needs docking at the bottom so it'll do for now
button:Dock(name == "credits" and BOTTOM or TOP)
button.DoClick = function()
self:OnCategorySelected(name)
end
local panel = self.canvasPanel:Add("DScrollPanel")
panel:SetVisible(false)
panel:Dock(FILL)
panel:DockMargin(SScaleMin(8 / 3), 0, 0, 0)
panel:GetCanvas():DockPadding(SScaleMin(8 / 3), SScaleMin(8 / 3), SScaleMin(8 / 3), SScaleMin(8 / 3))
panel.Paint = function(_, width, height)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, width, height)
end
-- reverts functionality back to a standard panel in the case that a category will manage its own scrolling
panel.DisableScrolling = function()
panel:GetCanvas():SetVisible(false)
panel:GetVBar():SetVisible(false)
panel.OnChildAdded = function() end
end
self.categorySubpanels[name] = panel
end
function PANEL:OnCategorySelected(name)
local panel = self.categorySubpanels[name]
if (!IsValid(panel)) then
return
end
if (!panel.bPopulated) then
self.categories[name](panel)
panel.bPopulated = true
end
if (IsValid(self.activeCategory)) then
self.activeCategory:SetVisible(false)
end
panel:SetVisible(true)
self.idlePanel:SetVisible(false)
self.activeCategory = panel
ix.gui.lastHelpMenuTab = name
end
function PANEL:CreateTitleText()
local informationTitleIcon = self.titlePanel:Add("DImage")
informationTitleIcon:SetImage("willardnetworks/tabmenu/navicons/info.png")
informationTitleIcon:SetSize(SScaleMin(17 / 3), SScaleMin(17 / 3))
local informationTitle = self.titlePanel:Add("DLabel")
informationTitle:SetFont("TitlesFontNoClamp")
informationTitle:SetText("Informacje")
informationTitle:SizeToContents()
informationTitle:SetPos(SScaleMin(28 / 3), informationTitleIcon:GetTall() * 0.5 - informationTitle:GetTall() * 0.5)
end
vgui.Register("ixHelpMenu", PANEL, "EditablePanel")
hook.Add("CreateMenuButtons", "ixHelpMenu", function(tabs)
tabs["Informacje"] = {
RowNumber = 4,
Width = 17,
Height = 17,
Icon = "willardnetworks/tabmenu/navicons/info.png",
Create = function(info, container)
local helpMenu = container:Add("ixHelpMenu")
end
}
end)
hook.Add("PopulateHelpMenu", "ixHelpMenu", function(tabs)
tabs["commands"] = function(container)
-- info text
local info = container:Add("DLabel")
info:SetFont("MenuFontLargerNoClamp")
info:SetText(L("helpCommands"))
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(Color(0, 0, 0, 50))
surface.DrawRect(0, 0, width, height)
end
-- commands
for uniqueID, command in SortedPairs(ix.command.list) do
if (command.OnCheckAccess and !command:OnCheckAccess(LocalPlayer())) then
continue
end
local bIsAlias = false
local aliasText = ""
-- we want to show aliases in the same entry for better readability
if (command.alias) then
local alias = istable(command.alias) and command.alias or {command.alias}
for _, v in ipairs(alias) do
if (v:utf8lower() == uniqueID) then
bIsAlias = true
break
end
aliasText = aliasText .. ", /" .. v
end
if (bIsAlias) then
continue
end
end
-- command name
local title = container:Add("DLabel")
title:SetFont("TitlesFontNoBoldNoClamp")
title:SetText("/" .. command.name .. aliasText)
title:Dock(TOP)
title:SetTextColor(Color(211, 86, 89, 255))
title:SetExpensiveShadow(1, color_black)
title:SizeToContents()
-- syntax
local syntaxText = command.syntax
local syntax
if (syntaxText != "" and syntaxText != "[none]") then
syntax = container:Add("DLabel")
syntax:SetFont("TitlesFontNoBoldNoClamp")
syntax:SetText(syntaxText)
syntax:Dock(TOP)
syntax:SetTextColor(color_white)
syntax:SetExpensiveShadow(1, color_black)
syntax:SetWrap(true)
syntax:SetAutoStretchVertical(true)
syntax:SizeToContents()
end
-- description
local descriptionText = command:GetDescription()
if (descriptionText != "") then
local description = container:Add("DLabel")
description:SetFont("MenuFontLargerNoClamp")
description:SetText(descriptionText)
description:Dock(TOP)
description:SetTextColor(color_white)
description:SetExpensiveShadow(1, color_black)
description:SetWrap(true)
description:SetAutoStretchVertical(true)
description:SizeToContents()
description:DockMargin(0, 0, 0, SScaleMin(8 / 3))
elseif (syntax) then
syntax:DockMargin(0, 0, 0, SScaleMin(8 / 3))
else
title:DockMargin(0, 0, 0, SScaleMin(8 / 3))
end
end
end
tabs["flags"] = function(container)
-- info text
local info = container:Add("DLabel")
info:SetFont("MenuFontLargerNoClamp")
info:SetText(L("helpFlags"))
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(Color(0, 0, 0, 50))
surface.DrawRect(0, 0, width, height)
end
-- flags
for k, v in SortedPairs(ix.flag.list) do
local background = ColorAlpha(
LocalPlayer():GetCharacter():HasFlags(k) and derma.GetColor("Success", info) or derma.GetColor("Error", info), 88
)
local panel = container:Add("Panel")
panel:Dock(TOP)
panel:DockMargin(0, 0, 0, SScaleMin(8 / 3))
panel:DockPadding(SScaleMin(4 / 3), SScaleMin(4 / 3), SScaleMin(4 / 3), SScaleMin(4 / 3))
panel.Paint = function(_, width, height)
derma.SkinFunc("DrawImportantBackground", 0, 0, width, height, background)
end
local flag = panel:Add("DLabel")
flag:SetFont("TitlesFontNoBoldNoClamp")
flag:SetText(string.format("[%s]", k))
flag:Dock(LEFT)
flag:SetTextColor(color_white)
flag:SetExpensiveShadow(1, color_black)
flag:SetTextInset(SScaleMin(4 / 3), 0)
flag:SizeToContents()
flag:SetTall(flag:GetTall() + SScaleMin(8 / 3))
local description = panel:Add("DLabel")
description:SetFont("TitlesFontNoBoldNoClamp")
description:SetText(v.description)
description:Dock(FILL)
description:SetTextColor(color_white)
description:SetExpensiveShadow(1, color_black)
description:SetTextInset(SScaleMin(8 / 3), 0)
description:SizeToContents()
description:SetTall(description:GetTall() + SScaleMin(8 / 3))
panel:SizeToChildren(false, true)
end
end
end)

View File

@@ -0,0 +1,12 @@
--[[
| 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/
--]]
hook.Add("CreateMenuButtons", "ixCharInfo", function(tabs)
end)

View File

@@ -0,0 +1,275 @@
--[[
| 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/
--]]
DEFINE_BASECLASS("EditablePanel")
local PANEL = {}
function PANEL:Init()
end
function PANEL:SetText(text)
self.text = text
self:Clear()
-- Some calculations
local temp = self:Add("DLabel")
temp:SetText(self.text)
temp:SetFont("SmallerTitleFontNoBoldNoClampLessWeight")
temp:Dock(TOP)
temp:SetContentAlignment(5)
temp:SizeToContents()
temp:SetVisible(false)
surface.SetFont("SmallerTitleFontNoBoldNoClampLessWeight")
local tempW, _ = surface.GetTextSize(self.text)
local textWidth = tempW
local letterCount = string.len(text)
local letterChunks = math.floor(letterCount / (textWidth / self.width) - SScaleMin(10 / 3))
local iters = math.ceil(letterCount / letterChunks)
local _, replaces = text:gsub("\\n", "\n")
-- Add new line breaks
iters = iters + replaces
-- Split string into lines
self.height = 0
local last = 1
local lines = 1
for i = 1, iters do
local part = text:sub(last, last + letterChunks - 1)
local lastSpace = 0
local len = string.len(part)
local startStr = string.find(part, "\\n")
if startStr then
lastSpace = startStr - 1
last = last + 2
end
if lastSpace == 0 then
-- Finding last space
for i2 = 1, len do
if part:find(" ", -i2) then
lastSpace = ((len - i2) + 1)
break
end
end
end
if lastSpace > 0 and i ~= iters then
last = last + lastSpace
part = part:sub(1, lastSpace)
else
last = last + letterChunks
end
local line = self:Add("DLabel")
line:SetText(part)
line:SetFont("SmallerTitleFontNoBoldNoClampLessWeight")
line:Dock(TOP)
line:SetContentAlignment(5)
line:SizeToContents()
line:SetTextColor(self.color or color_white)
lines = lines + 1
self.height = self.height + line:GetTall()
end
self:SetSize(self.width, self.height)
return self.width, self.height, lines - 1
end
vgui.Register("ixCenterWrappedText", PANEL, "Panel")
PANEL = {}
function PANEL:Init()
if (IsValid(ix.gui.intro)) then
ix.gui.intro:Remove()
end
ix.gui.intro = self
self:SetSize(ScrW(), ScrH())
self:SetPos(0, 0)
self:SetZPos(99999)
self:MakePopup()
self.volume = 1
self.backgroundPanel = self:Add("Panel")
self.backgroundPanel:SetSize(self:GetSize())
self.backgroundPanel.Paint = function(this, w, h)
surface.SetDrawColor(0, 0, 0, 255)
surface.DrawRect(0, 0, w, h)
end
self.firstText = self.backgroundPanel:Add("DLabel")
self.firstText:SetText("Veles Half-Life Roleplay")
self.firstText:SetFont("WNSmallerMenuTitleNoBold")
self.firstText:SizeToContents()
self.firstText:SetAlpha(0)
self.firstText:Center()
local sText = ix.config.Get("IntroTextLong", "")
self.secondText = self.backgroundPanel:Add("ixCenterWrappedText")
self.secondText.width = ScrW() / 2
self.secondText:SetText(sText)
self.secondText:Center()
self.secondText:SetY(self.secondText:GetY() - SScaleMin(25 / 3))
self.secondText:SetAlpha(0)
if sText == "" then
timer.Simple(10, function()
if IsValid(self.secondText) then
self.secondText:SetText(ix.config.Get("IntroTextLong", ""))
self.secondText:Center()
self.secondText:SetY(self.secondText:GetY() - SScaleMin(25 / 3))
self.continueText:Center()
self.continueText:SetY(self.continueText:GetY() + self.secondText:GetTall() / 2 + SScaleMin(25 / 3))
end
end)
end
self.continueText = self.backgroundPanel:Add("DLabel")
self.continueText:SetText("Naciśnij spację, aby kontynuować")
self.continueText:SetFont("CharCreationBoldTitle")
self.continueText:SizeToContents()
self.continueText:SetAlpha(0)
self.continueText:Center()
self.continueText:SetY(self.continueText:GetY() + self.secondText:GetTall() / 2 + SScaleMin(25 / 3))
self:SetTimers()
end
function PANEL:SetTimers()
timer.Simple(8, function() -- 8
self.firstText:AlphaTo( 255, 3, 0 )
end)
timer.Simple(11, function() -- 11
self.firstText:AlphaTo( 0, 3, 0 )
end)
timer.Simple(14, function() -- 14
self.secondText:AlphaTo( 255, 3, 0 )
end)
timer.Simple(17, function() -- 17
self.continueText:AlphaTo( 255, 1, 0 )
end)
end
-- @todo h a c k
function PANEL:Think()
if (IsValid(LocalPlayer())) then
self:BeginIntro()
self.Think = nil
end
end
function PANEL:BeginIntro()
-- something could have errored on startup and invalidated all options, so we'll be extra careful with setting the option
-- because if it errors here, the sound will play each tick and proceed to hurt ears
local bLoaded = false
if (ix and ix.option and ix.option.Set) then
local bSuccess, _ = pcall(ix.option.Set, "showIntro", true)
bLoaded = bSuccess
end
if (!bLoaded) then
self:Remove()
if (ix and ix.gui and IsValid(ix.gui.characterMenu)) then
ix.gui.characterMenu:Remove()
end
ErrorNoHalt(
"[Helix] Something has errored and prevented the framework from loading correctly - check your console for errors!\n")
return
end
self:MoveToFront()
self:RequestFocus()
sound.PlayFile("sound/buttons/combine_button2.wav", "", function()
timer.Create("ixIntroStart", 2, 1, function()
sound.PlayFile("sound/willardnetworks/intro.mp3", "", function(channel, status, error)
if (IsValid(channel)) then
channel:SetVolume(self.volume)
self.channel = channel
end
end)
end)
end)
end
function PANEL:OnKeyCodePressed(key)
if (key == KEY_SPACE and self.continueText:GetAlpha() == 255) then
self:Remove()
end
end
function PANEL:OnRemove()
timer.Remove("ixIntroStart")
if (IsValid(self.channel)) then
self.channel:Stop()
end
if (IsValid(ix.gui.characterMenu)) then
ix.gui.characterMenu:PlayMusic()
end
end
function PANEL:Remove(bForce)
if (bForce) then
BaseClass.Remove(self)
return
end
if (self.bClosing) then
return
end
self.bClosing = true
self.bBackground = nil
self.backgroundPanel:AlphaTo( 0, 2, 0 )
self.continueText:AlphaTo( 0, 2, 0 )
-- audio
self:CreateAnimation(2, {
index = 1,
target = {volume = 0},
Think = function(anim, panel)
if (IsValid(panel.channel)) then
panel.channel:SetVolume(panel.volume)
end
end,
OnComplete = function()
timer.Simple(0, function()
BaseClass.Remove(self)
end)
end
})
end
vgui.Register("ixIntro", PANEL, "EditablePanel")

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,318 @@
--[[
| 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 CREDITS = {
{"Alex Grist", "76561197979205163", {"creditLeadDeveloper", "creditManager"}},
{"Igor Radovanovic", "76561197990111113", {"creditLeadDeveloper", "creditUIDesigner"}},
{"Jaydawg", "76561197970371430", {"creditTester"}}
}
local SPECIALS = {
{
{"Luna", "76561197988658543"},
{"Rain GBizzle", "76561198036111376"}
},
{
{"Black Tea", "76561197999893894"}
}
}
local MISC = {
{"nebulous", "Staff members finding bugs and providing input"},
{"Contributors", "Ongoing support from various developers via GitHub"},
{"NutScript", "Providing the base framework to build upon"}
}
local url = "https://gethelix.co/"
local padding = 32
-- logo
local PANEL = {}
function PANEL:Init()
self:SetTall(ScrH() * 0.60)
self:Dock(TOP)
end
function PANEL:Paint(width, height)
derma.SkinFunc("DrawHelixCurved", width * 0.5, height * 0.5, width * 0.15)
-- title
surface.SetFont("ixIntroSubtitleFont")
local text = L("helix"):lower()
local textWidth, textHeight = surface.GetTextSize(text)
surface.SetTextColor(color_white)
surface.SetTextPos(width * 0.5 - textWidth * 0.5, height * 0.5 - textHeight * 0.5)
surface.DrawText(text)
-- version
surface.SetFont("ixMenuMiniFont")
surface.SetTextColor(200, 200, 200, 255)
surface.SetTextPos(width * 0.5 + textWidth * 0.5, height * 0.5 - textHeight * 0.5)
surface.DrawText(GAMEMODE.Version)
end
vgui.Register("ixCreditsLogo", PANEL, "Panel")
-- nametag
PANEL = {}
function PANEL:Init()
self.name = self:Add("DLabel")
self.name:SetFont("ixMenuButtonFontThick")
self.avatar = self:Add("AvatarImage")
end
function PANEL:SetName(name)
self.name:SetText(name)
end
function PANEL:SetAvatar(steamid)
self.avatar:SetSteamID(steamid, 64)
end
function PANEL:PerformLayout(width, height)
self.name:SetPos(width - self.name:GetWide(), 0)
self.avatar:MoveLeftOf(self.name, padding * 0.5)
end
function PANEL:SizeToContents()
self.name:SizeToContents()
local tall = self.name:GetTall()
self.avatar:SetSize(tall, tall)
self:SetSize(self.name:GetWide() + self.avatar:GetWide() + padding * 0.5, self.name:GetTall())
end
vgui.Register("ixCreditsNametag", PANEL, "Panel")
-- name row
PANEL = {}
function PANEL:Init()
self:DockMargin(0, padding, 0, 0)
self:Dock(TOP)
self.nametag = self:Add("ixCreditsNametag")
self.tags = self:Add("DLabel")
self.tags:SetFont("ixMenuButtonFont")
self:SizeToContents()
end
function PANEL:SetName(name)
self.nametag:SetName(name)
end
function PANEL:SetAvatar(steamid)
self.nametag:SetAvatar(steamid)
end
function PANEL:SetTags(tags)
for i = 1, #tags do
tags[i] = L(tags[i])
end
self.tags:SetText(table.concat(tags, "\n"))
end
function PANEL:Paint(width, height)
surface.SetDrawColor(ix.config.Get("color"))
surface.DrawRect(width * 0.5 - 1, 0, 1, height)
end
function PANEL:PerformLayout(width, height)
self.nametag:SetPos(width * 0.5 - self.nametag:GetWide() - padding, 0)
self.tags:SetPos(width * 0.5 + padding, 0)
end
function PANEL:SizeToContents()
self.nametag:SizeToContents()
self.tags:SizeToContents()
self:SetTall(math.max(self.nametag:GetTall(), self.tags:GetTall()))
end
vgui.Register("ixCreditsRow", PANEL, "Panel")
PANEL = {}
function PANEL:Init()
self.left = {}
self.right = {}
end
function PANEL:AddLeft(name, steamid)
local nametag = self:Add("ixCreditsNametag")
nametag:SetName(name)
nametag:SetAvatar(steamid)
nametag:SizeToContents()
self.left[#self.left + 1] = nametag
end
function PANEL:AddRight(name, steamid)
local nametag = self:Add("ixCreditsNametag")
nametag:SetName(name)
nametag:SetAvatar(steamid)
nametag:SizeToContents()
self.right[#self.right + 1] = nametag
end
function PANEL:PerformLayout(width, height)
local y = 0
for _, v in ipairs(self.left) do
v:SetPos(width * 0.25 - v:GetWide() * 0.5, y)
y = y + v:GetTall() + padding
end
y = 0
for _, v in ipairs(self.right) do
v:SetPos(width * 0.75 - v:GetWide() * 0.5, y)
y = y + v:GetTall() + padding
end
if (IsValid(self.center)) then
self.center:SetPos(width * 0.5 - self.center:GetWide() * 0.5, y)
end
end
function PANEL:SizeToContents()
local heightLeft, heightRight, centerHeight = 0, 0, 0
if (#self.left > #self.right) then
local center = self.left[#self.left]
centerHeight = center:GetTall()
self.center = center
self.left[#self.left] = nil
elseif (#self.right > #self.left) then
local center = self.right[#self.right]
centerHeight = center:GetTall()
self.center = center
self.right[#self.right] = nil
end
for _, v in ipairs(self.left) do
heightLeft = heightLeft + v:GetTall() + padding
end
for _, v in ipairs(self.right) do
heightRight = heightRight + v:GetTall() + padding
end
self:SetTall(math.max(heightLeft, heightRight) + centerHeight)
end
vgui.Register("ixCreditsSpecials", PANEL, "Panel")
PANEL = {}
function PANEL:Init()
self:Add("ixCreditsLogo")
local link = self:Add("DLabel", self)
link:SetFont("ixMenuMiniFont")
link:SetTextColor(Color(200, 200, 200, 255))
link:SetText(url)
link:SetContentAlignment(5)
link:Dock(TOP)
link:SizeToContents()
link:SetMouseInputEnabled(true)
link:SetCursor("hand")
link.OnMousePressed = function()
gui.OpenURL(url)
end
for _, v in ipairs(CREDITS) do
local row = self:Add("ixCreditsRow")
row:SetName(v[1])
row:SetAvatar(v[2])
row:SetTags(v[3])
row:SizeToContents()
end
local specials = self:Add("ixLabel")
specials:SetFont("ixMenuButtonFont")
specials:SetText(L("creditSpecial"):utf8upper())
specials:SetTextColor(ix.config.Get("color"))
specials:SetDropShadow(1)
specials:SetKerning(16)
specials:SetContentAlignment(5)
specials:DockMargin(0, padding * 2, 0, padding)
specials:Dock(TOP)
specials:SizeToContents()
local specialList = self:Add("ixCreditsSpecials")
specialList:DockMargin(0, padding, 0, 0)
specialList:Dock(TOP)
for _, v in ipairs(SPECIALS[1]) do
specialList:AddLeft(v[1], v[2])
end
for _, v in ipairs(SPECIALS[2]) do
specialList:AddRight(v[1], v[2])
end
specialList:SizeToContents()
-- less more padding if there's a center column nametag
if (IsValid(specialList.center)) then
specialList:DockMargin(0, padding, 0, padding)
end
for _, v in ipairs(MISC) do
local title = self:Add("DLabel")
title:SetFont("ixMenuButtonFontThick")
title:SetText(v[1])
title:SetContentAlignment(5)
title:SizeToContents()
title:DockMargin(0, padding, 0, 0)
title:Dock(TOP)
local description = self:Add("DLabel")
description:SetFont("ixSmallTitleFont")
description:SetText(v[2])
description:SetContentAlignment(5)
description:SizeToContents()
description:Dock(TOP)
end
self:Dock(TOP)
self:SizeToContents()
end
function PANEL:SizeToContents()
local height = padding
for _, v in pairs(self:GetChildren()) do
local _, top, _, bottom = v:GetDockMargin()
height = height + v:GetTall() + top + bottom
end
self:SetTall(height)
end
vgui.Register("ixCredits", PANEL, "Panel")
hook.Add("PopulateHelpMenu", "ixCredits", function(tabs)
tabs["IX Credits"] = function(container)
container:Add("ixCredits")
end
end)

View File

@@ -0,0 +1,405 @@
--[[
| 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 animationTime = 1
DEFINE_BASECLASS("ixSubpanelParent")
local PANEL = {}
AccessorFunc(PANEL, "bCharacterOverview", "CharacterOverview", FORCE_BOOL)
function PANEL:Init()
if (IsValid(ix.gui.menu)) then
ix.gui.menu:Remove()
end
ix.gui.menu = self
-- properties
self.manualChildren = {}
self.noAnchor = CurTime() + 0.4
self.anchorMode = true
self.currentAlpha = 0
self.currentBlur = 0
-- setup
self:SetSize(ScrW(), ScrH())
self:SetPos(0, 0)
-- Main panel
self.topbar = self:Add("Panel")
self.topbar:SetSize(ScrW(), ScreenScale(50 / 3))
self.topbar.Paint = function( panel, width, height )
-- background dim
surface.SetDrawColor(0, 0, 0, 130)
surface.DrawRect(0, 0, self.topbar:GetWide(), self.topbar:GetTall())
end
local arrow = self.topbar:Add("DImageButton")
arrow:SetImage("willardnetworks/tabmenu/navicons/left_arrow.png")
arrow:SetSize(ScreenScale(20 / 3), ScreenScale(20 / 3))
arrow:Dock(LEFT)
arrow:DockMargin(ScreenScale(50 / 3), ScreenScale(15 / 3), math.Clamp(ScreenScale(100 / 3), 0, 100), ScreenScale(15 / 3))
arrow.DoClick = function()
self:Remove()
surface.PlaySound("helix/ui/press.wav")
vgui.Create("ixCharMenu")
end
local exit = self.topbar:Add("DImageButton")
exit:SetImage("willardnetworks/tabmenu/navicons/exit.png")
exit:SetSize(ScreenScale(20 / 3), ScreenScale(20 / 3))
exit:Dock(RIGHT)
exit:DockMargin(ScreenScale(100 / 3), ScreenScale(15 / 3), ScreenScale(50 / 3), ScreenScale(15 / 3))
exit.DoClick = function()
self:Remove()
surface.PlaySound("helix/ui/press.wav")
end
local l, _, r, _ = arrow:GetDockMargin()
local l2, _, r2, _ = exit:GetDockMargin()
local arrowWide = arrow:GetWide()
local exitWide = exit:GetWide()
-- tabs
self.tabs = self.topbar:Add("Panel")
self.tabs.buttons = {}
self.tabs:Dock(LEFT)
self.tabs:SetSize(self.topbar:GetWide() - l - r - l2 - r2 - arrowWide - exitWide, ScreenScale(50 / 3))
self:PopulateTabs()
self:MakePopup()
self:OnOpened()
end
function PANEL:OnOpened()
self:SetAlpha(0)
self:CreateAnimation(animationTime, {
target = {currentAlpha = 255},
easing = "outQuint",
Think = function(animation, panel)
panel:SetAlpha(panel.currentAlpha)
end
})
end
function PANEL:GetActiveTab()
return (self:GetActiveSubpanel() or {}).subpanelName
end
function PANEL:TransitionSubpanel(id)
local lastSubpanel = self:GetActiveSubpanel()
-- don't transition to the same panel
if (IsValid(lastSubpanel) and lastSubpanel.subpanelID == id) then
return
end
local subpanel = self:GetSubpanel(id)
if (IsValid(subpanel)) then
if (!subpanel.bPopulated) then
local info = subpanel.info
subpanel.Paint = nil
if (istable(info) and info.Create) then
info:Create(subpanel)
elseif (isfunction(info)) then
info(subpanel)
end
hook.Run("MenuSubpanelCreated", subpanel.subpanelName, subpanel)
subpanel.bPopulated = true
end
self:SetActiveSubpanel(id)
end
subpanel = self:GetActiveSubpanel()
local info = subpanel.info
local bHideBackground = istable(info) and (info.bHideBackground != nil and info.bHideBackground or false) or false
if (bHideBackground) then
self:HideBackground()
else
self:ShowBackground()
end
-- call hooks if we've changed subpanel
if (IsValid(lastSubpanel) and istable(lastSubpanel.info) and lastSubpanel.info.OnDeselected) then
lastSubpanel.info:OnDeselected(lastSubpanel)
end
if (IsValid(subpanel) and istable(subpanel.info) and subpanel.info.OnSelected) then
subpanel.info:OnSelected(subpanel)
end
ix.gui.lastMenuTab = id
end
function PANEL:HideBackground()
self:CreateAnimation(animationTime, {
index = 2,
target = {currentBlur = 0},
easing = "outQuint"
})
end
function PANEL:ShowBackground()
self:CreateAnimation(animationTime, {
index = 2,
target = {currentBlur = 1},
easing = "outQuint"
})
end
function PANEL:PopulateTabs()
local default
local tabs = {}
hook.Run("CreateMenuButtons", tabs)
for name, info in SortedPairsByMemberValue(tabs, "RowNumber", false) do
local bTable = istable(info)
local buttonColor = (bTable and info.buttonColor) or Color(163, 57, 59, 255)
local bDefault = (bTable and info.bDefault) or false
-- setup subpanels without populating them so we can retain the order
local subpanel = self:AddSubpanel(name, true)
local id = subpanel.subpanelID
subpanel.info = info
subpanel:SetPaintedManually(true)
subpanel:SetTitle(nil)
subpanel:SetSize(ScrW(), ScrH())
-- this is called while the subpanel has not been populated
subpanel.Paint = function(panel, width, height)
end
local button = self.tabs:Add("ixMenuSelectionButton")
button:SetText("")
if (info.Right) then
button:Dock(RIGHT)
else
button:Dock(LEFT)
end
button:SetButtonList(self.tabs.buttons)
button:SetBackgroundColor(buttonColor)
button.id = id
button.OnSelected = function()
self:TransitionSubpanel(id)
end
local icon = button:Add("DImage")
icon:SetImage(tostring(info.Icon))
icon:SetSize(ScreenScale(info.Width / 3), ScreenScale(info.Height / 3))
local iconWidth = ScreenScale(info.Width / 3) or 0
local iconHeight = ScreenScale(info.Height / 3) or 0
local title = button:Add("DLabel")
title:SetFont("MenuFontNoClamp")
title:SetText(L(name))
title:SizeToContents()
title:SetPos(button:GetWide() * 0.5 - title:GetWide() * 0.5 + iconWidth * 0.5 + ScreenScale(4 / 3), button:GetTall() * 0.5 - title:GetTall() * 0.5)
icon:MoveLeftOf(title)
local x, y = icon:GetPos()
icon:SetPos(x - ScreenScale(8 / 3), button:GetTall() * 0.5 - iconHeight * 0.5)
if (bTable and info.PopulateTabButton) then
info:PopulateTabButton(button)
end
if (bDefault) then
default = button
end
end
if (ix.gui.lastMenuTab) then
for i = 1, #self.tabs.buttons do
local button = self.tabs.buttons[i]
if (button.id == ix.gui.lastMenuTab) then
default = button
break
end
end
end
if (!IsValid(default) and #self.tabs.buttons > 0) then
default = self.tabs.buttons[1]
end
if (IsValid(default)) then
default:SetSelected(true)
self:SetActiveSubpanel(default.id, 0)
end
self.topbar:MoveToFront()
end
function PANEL:AddManuallyPaintedChild(panel)
panel:SetParent(self)
panel:SetPaintedManually(panel)
self.manualChildren[#self.manualChildren + 1] = panel
end
function PANEL:OnKeyCodePressed(key)
self.noAnchor = CurTime() + 0.5
if (key == KEY_TAB) then
self:Remove()
end
end
function PANEL:Think()
if (self.bClosing) then
return
end
local bTabDown = input.IsKeyDown(KEY_TAB)
if (bTabDown and (self.noAnchor or CurTime() + 0.4) < CurTime() and self.anchorMode) then
self.anchorMode = false
end
if ((!self.anchorMode and !bTabDown) or gui.IsGameUIVisible()) then
self:Remove()
end
end
function PANEL:Paint(width, height)
surface.SetDrawColor(Color(63, 58, 115, 220))
surface.DrawRect(0, 0, width, height)
Derma_DrawBackgroundBlur( self, self.startTime )
BaseClass.Paint(self, width, height)
self:PaintSubpanels(width, height)
for i = 1, #self.manualChildren do
self.manualChildren[i]:PaintManual()
end
if (IsValid(ix.gui.inv1) and ix.gui.inv1.childPanels) then
for i = 1, #ix.gui.inv1.childPanels do
local panel = ix.gui.inv1.childPanels[i]
if (IsValid(panel)) then
panel:PaintManual()
end
end
end
if (bShouldScale) then
cam.PopModelMatrix()
end
end
function PANEL:Remove()
local id = ix.gui.lastMenuTab
if self:GetSubpanel(id) then
if self:GetSubpanel(id).info.model then
self:GetSubpanel(id).info.model:Remove()
end
end
if IsValid(ix.gui.characterpanel) then
if ix.gui.characterpanel.model then
ix.gui.characterpanel.model:Remove()
end
end
if IsValid(ix.gui.inventoryModel) then
ix.gui.inventoryModel:Remove()
end
if IsValid(ix.gui.craftingpanel) then
if ix.gui.craftingpanel.model then
ix.gui.craftingpanel.model:Remove()
end
end
if IsValid(ix.gui.barteringpanel) then
if ix.gui.barteringpanel.model then
ix.gui.barteringpanel.model:Remove()
end
end
if IsValid(ix.gui.medicalpanel) then
if ix.gui.medicalpanel.model then
ix.gui.medicalpanel.model:Remove()
end
end
self.bClosing = true
self:SetMouseInputEnabled(false)
self:SetKeyboardInputEnabled(false)
-- remove input from opened child panels since they grab focus
if (IsValid(ix.gui.inv1) and ix.gui.inv1.childPanels) then
for i = 1, #ix.gui.inv1.childPanels do
local panel = ix.gui.inv1.childPanels[i]
if (IsValid(panel)) then
panel:SetMouseInputEnabled(false)
panel:SetKeyboardInputEnabled(false)
end
end
end
CloseDermaMenus()
gui.EnableScreenClicker(false)
self:CreateAnimation(animationTime * 0.5, {
index = 2,
target = {currentBlur = 0},
easing = "outQuint"
})
self:CreateAnimation(animationTime * 0.5, {
target = {currentAlpha = 0},
easing = "outQuint",
-- we don't animate the blur because blurring doesn't draw things
-- with amount < 1 very well, resulting in jarring transition
Think = function(animation, panel)
panel:SetAlpha(panel.currentAlpha)
end,
OnComplete = function(animation, panel)
if (IsValid(panel.projectedTexture)) then
panel.projectedTexture:Remove()
end
BaseClass.Remove(panel)
end
})
end
vgui.Register("ixMenu", PANEL, "ixSubpanelParent")
if (IsValid(ix.gui.menu)) then
ix.gui.menu:Remove()
end
ix.gui.lastMenuTab = nil

View File

@@ -0,0 +1,183 @@
--[[
| 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 buttonPadding = ScreenScale(14) * 0.5
-- base menu button
DEFINE_BASECLASS("DButton")
local PANEL = {}
AccessorFunc(PANEL, "backgroundColor", "BackgroundColor")
AccessorFunc(PANEL, "backgroundAlpha", "BackgroundAlpha")
function PANEL:Init()
self:SetFont("MenuFontNoClamp")
self:SetTextColor(color_white)
self:SetPaintBackground(false)
self:SetContentAlignment(5)
self:SetTextInset(buttonPadding, 0)
self.backgroundColor = Color(0, 0, 0)
self.backgroundAlpha = 128
self.currentBackgroundAlpha = 0
end
function PANEL:SetText(text, noTranslation)
surface.SetFont("MenuFontNoClamp")
BaseClass.SetText(self, noTranslation and text or L(text))
self:SetSize(ScreenScale(125 / 3), ScreenScale(50 / 3))
end
function PANEL:PaintBackground(width, height)
surface.SetDrawColor(ColorAlpha(self.backgroundColor, self.currentBackgroundAlpha))
surface.DrawRect(0, 0, width, height)
end
function PANEL:Paint(width, height)
self:PaintBackground(width, height)
BaseClass.Paint(self, width, height)
end
function PANEL:SetTextColorInternal(color)
BaseClass.SetTextColor(self, color)
self:SetFGColor(color)
end
function PANEL:SetTextColor(color)
self:SetTextColorInternal(color)
self.color = color
end
function PANEL:SetDisabled(bValue)
local color = self.color
if (bValue) then
self:SetTextColorInternal(Color(math.max(color.r - 60, 0), math.max(color.g - 60, 0), math.max(color.b - 60, 0)))
else
self:SetTextColorInternal(color)
end
BaseClass.SetDisabled(self, bValue)
end
function PANEL:OnCursorEntered()
if (self:GetDisabled()) then
return
end
local color = self:GetTextColor()
self:CreateAnimation(0.15, {
target = {currentBackgroundAlpha = self.backgroundAlpha}
})
LocalPlayer():EmitSound("Helix.Rollover")
end
function PANEL:OnCursorExited()
if (self:GetDisabled()) then
return
end
self:CreateAnimation(0.15, {
target = {currentBackgroundAlpha = 0}
})
end
function PANEL:OnMousePressed(code)
if (self:GetDisabled()) then
return
end
if (self.color) then
self:SetTextColor(self.color)
else
self:SetTextColor(ix.config.Get("color"))
end
LocalPlayer():EmitSound("Helix.Press")
if (code == MOUSE_LEFT and self.DoClick) then
self:DoClick(self)
elseif (code == MOUSE_RIGHT and self.DoRightClick) then
self:DoRightClick(self)
end
end
function PANEL:OnMouseReleased(key)
if (self:GetDisabled()) then
return
end
if (self.color) then
self:SetTextColor(self.color)
else
self:SetTextColor(color_white)
end
end
vgui.Register("ixMenuButton", PANEL, "DButton")
-- selection menu button
DEFINE_BASECLASS("ixMenuButton")
PANEL = {}
AccessorFunc(PANEL, "backgroundColor", "BackgroundColor")
AccessorFunc(PANEL, "selected", "Selected", FORCE_BOOL)
AccessorFunc(PANEL, "buttonList", "ButtonList")
function PANEL:Init()
self.backgroundColor = color_white
self.selected = false
self.buttonList = {}
end
function PANEL:PaintBackground(width, height)
local alpha = self.selected and 255 or self.currentBackgroundAlpha
color = ColorAlpha(self.backgroundColor, alpha)
surface.SetDrawColor(color)
surface.DrawRect(0, 0, width, height, ColorAlpha(self.backgroundColor, alpha))
end
function PANEL:SetSelected(bValue)
self.selected = bValue
if (bValue) then
self:OnSelected()
end
end
function PANEL:SetButtonList(list, bNoAdd)
if (!bNoAdd) then
list[#list + 1] = self
end
self.buttonList = list
end
function PANEL:OnMousePressed(key)
for _, v in pairs(self.buttonList) do
if (IsValid(v)) then
v:SetSelected(false)
end
end
self:SetSelected(true)
BaseClass.OnMousePressed(self, key)
end
function PANEL:OnSelected()
end
vgui.Register("ixMenuSelectionButton", PANEL, "ixMenuButton")

View File

@@ -0,0 +1,189 @@
--[[
| 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/
--]]
DEFINE_BASECLASS("DModelPanel")
local PANEL = {}
local MODEL_ANGLE = Angle(0, 45, 0)
function PANEL:Init()
self.brightness = 1
self:SetCursor("none")
end
function PANEL:SetModel(model, skin, bodygroups)
if (IsValid(self.Entity)) then
self.Entity:Remove()
self.Entity = nil
end
if (!ClientsideModel) then
return
end
local entity = ClientsideModel(model, RENDERGROUP_OPAQUE)
if (!IsValid(entity)) then
return
end
entity:SetNoDraw(true)
entity:SetIK(false)
if (skin) then
entity:SetSkin(skin)
end
if bodygroups == true then
for _, v in ipairs(LocalPlayer():GetBodyGroups() or {}) do
entity:SetBodygroup(v.id, LocalPlayer():GetBodygroup(v.id))
end
end
local sequence = entity:LookupSequence("idle_unarmed")
if (sequence <= 0) then
sequence = entity:SelectWeightedSequence(ACT_IDLE)
end
if (sequence > 0) then
entity:ResetSequence(sequence)
else
local found = false
for _, v in ipairs(entity:GetSequenceList()) do
if ((v:utf8lower():find("idle") or v:utf8lower():find("fly")) and v != "idlenoise") then
entity:ResetSequence(v)
found = true
break
end
end
if (!found) then
entity:ResetSequence(4)
end
end
entity.GetProxyColors = function()
local char = LocalPlayer().GetCharacter and LocalPlayer():GetCharacter()
local proxyColors = char and char.GetProxyColors and char:GetProxyColors() or {}
if self.overrideProxyColors and istable(self.overrideProxyColors) then
proxyColors = self.overrideProxyColors
end
return proxyColors
end
entity:SetAngles(MODEL_ANGLE)
self.Entity = entity
end
function PANEL:SetCorrectHair(oldHair)
if !self.Entity or self.Entity and !IsValid(self.Entity) then return end
if !self.Entity.GetNumBodyGroups then return end
if !self.Entity.GetModel then return end
if !self.Entity:GetModel():find("models/willardnetworks/citizens/") then return end
local hairBG = self.Entity:FindBodygroupByName( "hair" )
local curHeadwearBG = self.Entity:GetBodygroup(self.Entity:FindBodygroupByName( "headwear" ))
local curHairBG = self.Entity:GetBodygroup(hairBG)
local hairBgLength = 0
for _, v in pairs(self.Entity:GetBodyGroups()) do
if v.name != "hair" then continue end
if !v.submodels then continue end
if !istable(v.submodels) then continue end
hairBgLength = #v.submodels
break
end
if (curHeadwearBG != 0) then
if curHairBG != 0 then
self.Entity:SetBodygroup(hairBG, hairBgLength)
end
else
if oldHair then
self.Entity:SetBodygroup(hairBG, oldHair)
end
end
end
function PANEL:LayoutEntity()
local scrW, scrH = ScrW(), ScrH()
local xRatio = gui.MouseX() / scrW
local yRatio = gui.MouseY() / scrH
local x, _ = self:LocalToScreen(self:GetWide() / 2)
local xRatio2 = x / scrW
local entity = self.Entity
entity:SetPoseParameter("head_pitch", yRatio*90 - 30)
entity:SetPoseParameter("head_yaw", (xRatio - xRatio2)*90 - 5)
entity:SetIK(false)
if (self.copyLocalSequence) then
entity:SetSequence(LocalPlayer():GetSequence())
entity:SetPoseParameter("move_yaw", 360 * LocalPlayer():GetPoseParameter("move_yaw") - 180)
end
self:RunAnimation()
local character = LocalPlayer():GetCharacter()
if (character) then
local otherbone = hook.Run("CharacterAdjustModelPanelLookupBone", character)
if otherbone and entity:LookupBone(otherbone) then
local headpos = entity:GetBonePosition(entity:LookupBone(otherbone))
entity:SetEyeTarget(headpos-Vector(-15, 0, 0))
return
end
end
for i = 2, 7 do
entity:SetFlexWeight( i, 0 )
end
for i = 0, 1 do
entity:SetFlexWeight( i, 1 )
end
end
function PANEL:DrawModel()
local brightness = self.brightness * 0.4
local brightness2 = self.brightness * 1.5
render.SetStencilEnable(false)
render.SetColorMaterial()
render.SetColorModulation(1, 1, 1)
render.SetModelLighting(0, brightness2, brightness2, brightness2)
for i = 1, 4 do
render.SetModelLighting(i, brightness, brightness, brightness)
end
local fraction = (brightness / 1) * 0.1
render.SetModelLighting(5, fraction, fraction, fraction)
-- Excecute Some stuffs
if (self.enableHook) then
hook.Run("DrawHelixModelView", self, self.Entity)
end
self.Entity:DrawModel()
end
function PANEL:OnMousePressed()
end
vgui.Register("ixModelPanel", PANEL, "DModelPanel")

View File

@@ -0,0 +1,284 @@
--[[
| 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 animationTime = 0.75
-- notice manager
-- this manages positions/animations for notice panels
local PANEL = {}
AccessorFunc(PANEL, "padding", "Padding", FORCE_NUMBER)
function PANEL:Init()
self:SetSize(ScrW() * 0.4, ScrH())
self:SetZPos(-99999)
self:SetMouseInputEnabled(false)
self:SetKeyboardInputEnabled(false)
self.notices = {}
self.padding = 4
end
function PANEL:GetAll()
return self.notices
end
function PANEL:Clear()
for _, v in ipairs(self.notices) do
self:RemoveNotice(v)
end
end
function PANEL:AddNotice(text, bError)
if (IsValid(ix.gui.characterMenu) and !ix.gui.characterMenu.bClosing) then
return
end
local panel = self:Add("ixNotice")
panel:SetText(text)
panel:SetError(bError or text:utf8sub(#text, #text) == "!")
panel:SizeToContents()
panel.currentY = -panel:GetTall()
panel:SetPos(self.padding, panel.currentY)
-- setup duration timer
panel:CreateAnimation(ix.option.Get("noticeDuration", 8), {
index = 2,
target = {duration = 1},
bIgnoreConfig = true,
OnComplete = function(animation, this)
self:RemoveNotice(this)
end
})
table.insert(self.notices, 1, panel)
self:Organize()
-- remove old notice if we've hit the limit of notices
if (#self.notices > ix.option.Get("noticeMax", 4)) then
for i = #self.notices, 1, -1 do
local notice = self.notices[i]
if (IsValid(notice) and !notice.bClosing) then
self:RemoveNotice(notice)
break
end
end
end
return panel
end
function PANEL:RemoveNotice(panel)
panel.bClosing = true
panel:CreateAnimation(animationTime, {
index = 3,
target = {outAnimation = 0},
easing = "outQuint",
OnComplete = function(animation, this)
local toRemove
for k, v in ipairs(self.notices) do
if (v == this) then
toRemove = k
break
end
end
if (toRemove) then
table.remove(self.notices, toRemove)
end
this:SetText("") -- (hack) text remains for a frame after remove is called, so let's make sure we don't draw it
this:Remove()
end
})
end
-- update target Y positions and animations
function PANEL:Organize()
local currentTarget = self.padding
for _, v in ipairs(self.notices) do
v:CreateAnimation(animationTime, {
index = 1,
target = {currentY = currentTarget},
easing = "outElastic",
Think = function(animation, panel)
panel:SetPos(
self:GetWide() - panel:GetWide() - self.padding,
math.min(panel.currentY + 1, currentTarget) -- easing eventually hits subpixel movement so we level it off
)
end
})
currentTarget = currentTarget + self.padding + v:GetTall()
end
end
function PANEL:Think()
if IsValid(ix.gui.menu) and ix.gui.menu:IsVisible() then
self:SetPos(ScrW() - ScrW() * 0.4, SScaleMin(50 / 3))
else
self:SetPos(ScrW() - ScrW() * 0.4, 0)
end
end
vgui.Register("ixNoticeManager", PANEL, "Panel")
-- notice panel
-- these do not manage their own enter/exit animations or lifetime
DEFINE_BASECLASS("DLabel")
PANEL = {}
AccessorFunc(PANEL, "bError", "Error", FORCE_BOOL)
AccessorFunc(PANEL, "padding", "Padding", FORCE_NUMBER)
function PANEL:Init()
self:SetSize(256, 36)
self:SetContentAlignment(5)
self:SetExpensiveShadow(1, Color(0, 0, 0, 150))
self:SetFont("ixNoticeFont")
self:SetTextColor(color_white)
self:SetDrawOnTop(true)
self:DockPadding(0, 0, 0, 0)
self:DockMargin(0, 0, 0, 0)
self.bError = false
self.bHovered = false
self.errorAnimation = 0
self.padding = 8
self.currentY = 0
self.duration = 0
self.outAnimation = 1
self.alpha = 255
LocalPlayer():EmitSound("Helix.Notify")
end
function PANEL:SetError(bValue)
self.bError = tobool(bValue)
if (bValue) then
self.errorAnimation = 1
self:CreateAnimation(animationTime, {
index = 5,
target = {errorAnimation = 0},
easing = "outQuint"
})
end
end
function PANEL:SizeToContents()
local contentWidth, contentHeight = self:GetContentSize()
contentWidth = contentWidth + self.padding * 2
contentHeight = contentHeight + self.padding * 2
local manager = ix.gui.notices
local maxWidth = math.min(IsValid(manager) and (manager:GetWide() - manager:GetPadding() * 2) or ScrW(), contentWidth)
if (contentWidth > maxWidth) then
self:SetWide(maxWidth)
self:SetTextInset(self.padding * 2, 0)
self:SetWrap(true)
self:SizeToContentsY()
self:SetWide(self:GetContentSize())
else
self:SetSize(contentWidth, contentHeight)
end
end
function PANEL:SizeToContentsY()
BaseClass.SizeToContentsY(self)
self:SetTall(self:GetTall() + self.padding * 2)
end
function PANEL:OnMouseHover()
self:CreateAnimation(animationTime * 0.5, {
index = 4,
target = {alpha = 0},
easing = "outQuint",
Think = function(animation, panel)
panel:SetAlpha(panel.alpha)
end
})
end
function PANEL:OnMouseLeave()
self:CreateAnimation(animationTime * 0.5, {
index = 4,
target = {alpha = 255},
easing = "outQuint",
Think = function(animation, panel)
panel:SetAlpha(panel.alpha)
end
})
end
function PANEL:Paint(width, height)
if (self.outAnimation < 1) then
local x, y = self:LocalToScreen(0, 0)
render.SetScissorRect(x, y, x + self:GetWide(), y + (self:GetTall() * self.outAnimation), true)
end
local x, y = self:LocalToScreen(0, 0)
local mouseX, mouseY = gui.MousePos()
if (mouseX >= x and mouseX <= x + width and
mouseY >= y and mouseY <= y + height) then
if (!self.bHovered) then
self.bHovered = true
self:OnMouseHover()
end
elseif (self.bHovered) then
self.bHovered = false
self:OnMouseLeave()
end
ix.util.DrawBlur(self)
if (self.errorAnimation > 0) then
local color = derma.GetColor("Error", self)
surface.SetDrawColor(
color.r * self.errorAnimation,
color.g * self.errorAnimation,
color.b * self.errorAnimation,
self.errorAnimation * 255 + ((1 - self.errorAnimation) * 66)
)
else
surface.SetDrawColor(0, 0, 0, 66)
end
surface.DrawRect(0, 0, width, height)
surface.SetDrawColor(self.bError and derma.GetColor("Error", self) or ix.config.Get("color"))
surface.DrawRect(0, height - 1, width * self.duration, 1)
end
function PANEL:PaintOver(width, height)
render.SetScissorRect(0, 0, 0, 0, false)
end
vgui.Register("ixNotice", PANEL, "DLabel")
if (IsValid(ix.gui.notices)) then
ix.gui.notices:Remove()
ix.gui.notices = vgui.Create("ixNoticeManager")
else
ix.gui.notices = vgui.Create("ixNoticeManager")
end

View File

@@ -0,0 +1,108 @@
--[[
| 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/
--]]
-- plugin manager
PANEL = {}
function PANEL:Init()
self:Dock(FILL)
self:SetSearchEnabled(true)
self.loadedCategory = L("loadedPlugins")
self.unloadedCategory = L("unloadedPlugins")
if (!ix.gui.bReceivedUnloadedPlugins) then
net.Start("ixConfigRequestUnloadedList")
net.SendToServer()
end
self:Populate()
end
function PANEL:OnPluginToggled(uniqueID, bEnabled)
net.Start("ixConfigPluginToggle")
net.WriteString(uniqueID)
net.WriteBool(bEnabled)
net.SendToServer()
end
function PANEL:Populate()
self:AddCategory(self.loadedCategory)
self:AddCategory(self.unloadedCategory)
-- add loaded plugins
for k, v in SortedPairsByMemberValue(ix.plugin.list, "name") do
local row = self:AddRow(ix.type.bool, self.loadedCategory)
row.id = k
row.setting:SizeToContents()
-- if this plugin is not in the unloaded list currently, then it's queued for an unload
row:SetValue(!ix.plugin.unloaded[k], true)
row:SetText(v.name)
row.OnValueChanged = function(panel, bEnabled)
self:OnPluginToggled(k, bEnabled)
end
row:GetLabel():SetHelixTooltip(function(tooltip)
local title = tooltip:AddRow("name")
title:SetImportant()
title:SetText(v.name)
title:SizeToContents()
title:SetMaxWidth(math.max(title:GetMaxWidth(), ScrW() * 0.5))
local description = tooltip:AddRow("description")
description:SetText(v.description)
description:SizeToContents()
end)
end
self:UpdateUnloaded(true)
self:SizeToContents()
end
function PANEL:UpdatePlugin(uniqueID, bEnabled)
for _, v in pairs(self:GetRows()) do
if (v.id == uniqueID) then
v:SetValue(bEnabled, true)
end
end
end
-- called from Populate and from the ixConfigUnloadedList net message
function PANEL:UpdateUnloaded(bNoSizeToContents)
for _, v in pairs(self:GetRows()) do
if (ix.plugin.unloaded[v.id]) then
v:SetValue(false, true)
end
end
for k, _ in SortedPairs(ix.plugin.unloaded) do
if (ix.plugin.list[k]) then
-- if this plugin is in the loaded plugins list then it's queued for an unload - don't display it in this category
continue
end
local row = self:AddRow(ix.type.bool, self.unloadedCategory)
row:SetText(k)
row:SetValue(false, true)
row.OnValueChanged = function(panel, bEnabled)
self:OnPluginToggled(k, bEnabled)
end
end
if (!bNoSizeToContents) then
self:SizeToContents()
end
end
vgui.Register("ixPluginManager", PANEL, "ixSettings")

View File

@@ -0,0 +1,148 @@
--[[
| 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 PANEL = {}
local PLUGIN = PLUGIN
function PANEL:Init()
ix.gui.quizAnswering = self
self.comboboxes = {}
self:SetSize(SScaleMin(700 / 3), SScaleMin(700 / 3))
self:Center()
self:SetTitle("Quiz - Aby stworzyć postać, musisz odpowiedzieć na kilka pytań.")
DFrameFixer(self, false, true, true)
self.quizContent = self:Add("DScrollPanel")
self.quizContent:Dock(FILL)
self.loadingLabel = self:Add("DLabel")
self.loadingLabel:SetText("Wczytywanie pytań quizu...")
self.loadingLabel:SetFont("TitlesFontNoClamp")
self.loadingLabel:SizeToContents()
self.loadingLabel:Center()
end
function PANEL:Think()
self:MoveToFront()
end
function PANEL:Paint(w, h)
if (self.m_bBackgroundBlur) then
Derma_DrawBackgroundBlur(self, self.m_fCreateTime)
end
surface.SetDrawColor(Color(40, 40, 40, 240))
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(Color(111, 111, 136, 255 / 100 * 30))
surface.DrawOutlinedRect(0, 0, w, h)
surface.DrawRect(0, 0, w, self.lblTitle:GetTall() + SScaleMin(5 / 3))
end
function PANEL:CreateQuizContent()
if self.loadingLabel then
self.loadingLabel:Remove()
end
for k, table in pairs(PLUGIN.quizlist) do
local question = table[1] or "NO QUESTION"
local answers = table[2] or {}
local questionTitle = self.quizContent:Add("DLabel")
questionTitle:SetFont("TitlesFontNoClamp")
questionTitle:Dock(TOP)
questionTitle:SetText(question or "")
questionTitle:SetContentAlignment(5)
questionTitle:DockMargin(SScaleMin(20 / 3), k == 1 and SScaleMin(20 / 3) or 0, SScaleMin(20 / 3), SScaleMin(10 / 3))
questionTitle:SetWrap(true)
questionTitle:SetAutoStretchVertical(true)
local answerPanel = self.quizContent:Add("DComboBox")
answerPanel:Dock(TOP)
answerPanel:SetTall(SScaleMin(30 / 3))
answerPanel:SetValue("Wybierz odpowiedź")
answerPanel:SetFont("SmallerTitleFontNoBoldNoClamp")
answerPanel.question = k
answerPanel:SetContentAlignment(5)
answerPanel.Paint = function(self, w, h)
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
surface.DrawOutlinedRect(0, 0, w, h)
end
answerPanel.Think = function(self)
if IsValid(self.Menu) then
self.Menu:MoveToFront()
end
end
answerPanel:DockMargin(SScaleMin(20 / 3), 0, SScaleMin(20 / 3), SScaleMin(20 / 3))
for _, answer in pairs(table[2]) do
answerPanel:AddChoice(answer or "")
end
self.comboboxes[#self.comboboxes + 1] = answerPanel
end
local textPanel = self.quizContent:Add("Panel")
textPanel:Dock(TOP)
textPanel:SetTall(SScaleMin(20 / 3))
local warningIcon = textPanel:Add("DImage")
warningIcon:SetSize(SScaleMin(12 / 3), SScaleMin(20 / 3))
warningIcon:Dock(LEFT)
warningIcon:DockMargin(0, 0, SScaleMin(8 / 3), 0)
warningIcon:SetImage("willardnetworks/mainmenu/charcreation/warning.png")
local panelText = textPanel:Add("DLabel")
panelText:SetText("Nie jesteś pewien odpowiedzi? Sprawdź nasze forum, aby uzyskać więcej informacji. ")
panelText:SetFont("WNBackFontNoClamp")
panelText:SetTextColor(Color(255, 204, 0, 255))
panelText:Dock(LEFT)
panelText:SetContentAlignment(4)
panelText:SizeToContents()
local lrMargins = (self:GetWide() * 0.5) - ((warningIcon:GetWide() + SScaleMin(8 / 3)) * 0.5) - (panelText:GetWide() * 0.5)
textPanel:DockMargin(lrMargins, 0, lrMargins, 0)
local finish = self:Add("DButton")
finish:Dock(BOTTOM)
finish:SetFont("TitlesFontNoClamp")
finish:SetText("UKOŃCZ")
finish:DockMargin(0, SScaleMin(20 / 3), 0, 0)
finish:SetTall(SScaleMin(50 / 3))
finish.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
self:GetAnswers()
end
end
function PANEL:GetAnswers()
local answers = {}
for _, v in pairs(self.comboboxes) do
if v:GetSelected() and v:GetSelected() != "" and v:GetSelected() != "Wybierz odpowiedź" then
answers[v.question] = v:GetSelected()
end
end
netstream.Start("CompleteQuiz", answers)
end
vgui.Register("ixQuizMenu", PANEL, "DFrame")
netstream.Hook("RemoveQuizUI", function()
if ix.gui.quizAnswering and IsValid(ix.gui.quizAnswering) then
ix.gui.quizAnswering:Remove()
end
end)

View File

@@ -0,0 +1,587 @@
--[[
| 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 rowPaintFunctions = {
function(width, height)
end,
function(width, height)
surface.SetDrawColor(0, 0, 0, 80)
surface.DrawRect(0, 0, width, height)
surface.SetDrawColor(50, 50, 50, 255)
surface.DrawOutlinedRect(0, -1, width, height + 1)
end
}
-- character icon
-- we can't customize the rendering of ModelImage so we have to do it ourselves
local PANEL = {}
AccessorFunc(PANEL, "model", "Model", FORCE_STRING)
AccessorFunc(PANEL, "bHidden", "Hidden", FORCE_BOOL)
function PANEL:Init()
self:SetSize(SScaleMin(43 / 3), SScaleMin(50 / 3))
self.bodygroups = "000000000"
end
function PANEL:SetModel(model, skin, bodygroups)
model = model:gsub("\\", "/")
if (isstring(bodygroups) and bodygroups:utf8len() != 9) then
self.bodygroups = "000000000"
end
self.model = model
self.skin = skin
self.path = "materials/spawnicons/" ..
model:utf8sub(1, #model - 4) .. -- remove extension
((isnumber(skin) and skin > 0) and ("_skin" .. tostring(skin)) or "") .. -- skin number
(self.bodygroups != "000000000" and ("_" .. self.bodygroups) or "") .. -- bodygroups
".png"
local material = Material(self.path, "smooth")
-- we don't have a cached spawnicon texture, so we need to forcefully generate one
if (material:IsError()) then
self.id = "ixScoreboardIcon" .. self.path
self.renderer = self:Add("ModelImage")
self.renderer:SetVisible(false)
self.renderer:SetModel(model, skin, self.bodygroups)
self.renderer:RebuildSpawnIcon()
-- this is the only way to get a callback for generated spawn icons, it's bad but it's only done once
hook.Add("SpawniconGenerated", self.id, function(lastModel, filePath, modelsLeft)
filePath = filePath:gsub("\\", "/"):utf8lower()
if (filePath == self.path) then
hook.Remove("SpawniconGenerated", self.id)
self.material = Material(filePath, "smooth")
self.renderer:Remove()
end
end)
else
self.material = material
end
end
function PANEL:SetBodygroup(k, v)
if (k < 0 or k > 9 or v < 0 or v > 9) then
return
end
self.bodygroups = self.bodygroups:SetChar(k + 1, v)
end
function PANEL:GetModel()
return self.model or "models/error.mdl"
end
function PANEL:GetSkin()
return self.skin or 1
end
function PANEL:DoClick()
end
function PANEL:DoRightClick()
end
function PANEL:OnMouseReleased(key)
if (key == MOUSE_LEFT) then
self:DoClick()
elseif (key == MOUSE_RIGHT) then
self:DoRightClick()
end
end
function PANEL:Paint(width, height)
if (!self.material) then
return
end
surface.SetMaterial(self.material)
surface.SetDrawColor(color_white)
surface.DrawTexturedRect(0, 0, width, height)
end
function PANEL:Remove()
if (self.id) then
hook.Remove("SpawniconGenerated", self.id)
end
end
vgui.Register("ixScoreboardIcon", PANEL, "Panel")
-- player row
PANEL = {}
AccessorFunc(PANEL, "paintFunction", "BackgroundPaintFunction")
function PANEL:Init()
self:SetTall(SScaleMin(64 / 3))
self.icon = self:Add("ixScoreboardIcon")
self.icon:Dock(LEFT)
self.icon:DockMargin(SScaleMin(20 / 3), SScaleMin(10 / 3), 0, SScaleMin(10 / 3))
local topPushDown = SScaleMin(150 / 3)
self.leftSideFrame = self:Add("Panel")
self.leftSideFrame:SetWide((ScrW() - (topPushDown * 2)) * 0.5)
self.leftSideFrame:Dock(LEFT)
self.leftSideFrame.Paint = nil
self.name = self.leftSideFrame:Add("DLabel")
self.name:Dock(TOP)
self.name:DockMargin(SScaleMin(20 / 3), SScaleMin(12 / 3), 0, 0)
self.name:SetTextColor(color_white)
self.name:SetFont("MenuFontBoldNoClamp")
self.description = self.leftSideFrame:Add("DLabel")
self.description:Dock(TOP)
self.description:DockMargin(SScaleMin(21 / 3), 0, 0, 0)
self.description:SetTextColor(Color(230, 230, 230, 255))
self.description:SetFont("MenuFontNoClamp")
self.rightSideFrame = self:Add("Panel")
self.rightSideFrame:SetWide((ScrW() - (topPushDown * 2)) * 0.5)
self.rightSideFrame:Dock(RIGHT)
self.rightSideFrame.Paint = nil
self.ping = self.rightSideFrame:Add("DLabel")
self.ping:Dock(RIGHT)
self.ping:DockMargin(SScaleMin(30 / 3), 0, SScaleMin(30 / 3), 0)
self.ping:SetTextColor(color_white)
self.ping:SetFont("ixSmallFont")
self.pictureFrame = self.rightSideFrame:Add("Panel")
self.pictureFrame:Dock(RIGHT)
self.pictureFrame:DockMargin(SScaleMin(30 / 3), SScaleMin(8 / 3), 0, 0)
self.pictureFrame:SetSize(SScaleMin(48 / 3), SScaleMin(32 / 3))
self.pictureFrame.Paint = nil
self.steamImage = self.pictureFrame:Add("AvatarImage")
self.steamImage:SetSize( SScaleMin(48 / 3), SScaleMin(48 / 3) )
self.steamImage.OnMouseReleased = function(pnl, key)
if (key != MOUSE_RIGHT) then return end
local client = self.player
if (!IsValid(client)) then
return
end
local menu = DermaMenu()
menu:AddOption(L("viewProfile"), function()
client:ShowProfile()
end)
menu:AddOption(L("copySteamID"), function()
SetClipboardText(client:IsBot() and client:EntIndex() or client:SteamID())
end)
hook.Run("PopulateScoreboardPlayerMenu", client, menu)
for _, v in pairs(menu:GetChildren()[1]:GetChildren()) do
v:SetFont("MenuFontNoClamp")
end
menu:Open()
end
self.steamImage:SetHelixTooltip(function(tooltip)
local client = self.player
if (IsValid(self) and IsValid(client)) then
ix.hud.PopulatePlayerTooltip(tooltip, client)
end
end)
self.steamName = self.rightSideFrame:Add("DLabel")
self.steamName:Dock(RIGHT)
self.steamName:DockMargin(SScaleMin(30 / 3), 0, 0, 0)
self.steamName:SetTextColor(color_white)
self.steamName:SetFont("ixSmallFont")
self.paintFunction = rowPaintFunctions[1]
self.nextThink = CurTime() + 1
end
function PANEL:Update()
local client = self.player
local model = client:GetModel()
local skin = client:GetSkin()
local name = hook.Run("GetCharacterName", client, "scoreboard") or client:GetName()
local steamName = client:SteamName()
local ping = client:Ping()
local description = hook.Run("GetCharacterDescription", client) or
(client:GetCharacter() and client:GetCharacter():GetDescription()) or ""
local bRecognize = false
local localCharacter = LocalPlayer():GetCharacter()
local character = IsValid(self.player) and self.player:GetCharacter()
if (localCharacter and character) then
bRecognize = hook.Run("IsCharacterRecognized", localCharacter, character:GetID())
or hook.Run("IsPlayerRecognized", self.player)
end
self.icon:SetHidden(!bRecognize)
if (!bRecognize) then
self.icon.material = ix.util.GetMaterial("willardnetworks/tabmenu/scoreboard/question.png", "smooth nocull")
end
self:SetZPos(bRecognize and 1 or 2)
if (bRecognize and (self.icon:GetModel() != model or self.icon:GetSkin() != skin)) then
self.icon:SetModel(model, skin)
self.icon:SetTooltip(nil)
end
-- no easy way to check bodygroups so we'll just set them anyway
for _, v in pairs(client:GetBodyGroups()) do
self.icon:SetBodygroup(v.id, client:GetBodygroup(v.id))
end
if (self.name:GetText() != name) then
self.name:SetText(bRecognize and name or L("unknown"))
self.name:SizeToContents()
end
if (self.description:GetText() != description) then
if string.utf8len( description ) > 80 then
local shortenedDesc = string.utf8sub(description, 1, 80)
self.description:SetText(shortenedDesc.."...")
else
self.description:SetText(description)
end
self.description:SizeToContents()
end
if (self.ping:GetText() != ping) then
self.ping:SetText(ping)
self.ping:SizeToContents()
end
if (self.steamName:GetText() != steamName) then
self.steamName:SetText(steamName)
self.steamName:SizeToContents()
end
self.steamImage:SetPlayer( self.player, SScaleMin(54 / 3) )
end
function PANEL:Think()
if (CurTime() >= self.nextThink) then
self.nextThink = CurTime() + 1
if (!IsValid(self.player)) then return end
local client = self.player
local team = client:Team()
local hasActiveCombineSuit = client:GetNetVar("combineMaskEquipped")
if team == FACTION_CP and !hasActiveCombineSuit then
team = FACTION_CITIZEN
end
if (!IsValid(client) or !client:GetCharacter() or self.character != client:GetCharacter() or self.team != team) then
if team == FACTION_CP and !hasActiveCombineSuit then
return
else
self:Remove()
self:GetParent():SizeToContents()
end
end
end
end
function PANEL:SetPlayer(client)
self.player = client
self.team = client:Team()
if self.team == FACTION_CP and !client:GetNetVar("combineMaskEquipped") then
self.team = FACTION_CITIZEN
end
self.character = client:GetCharacter()
self:Update()
end
function PANEL:Paint(width, height)
self.paintFunction(width, height)
end
vgui.Register("ixScoreboardRow", PANEL, "EditablePanel")
-- faction grouping
PANEL = {}
AccessorFunc(PANEL, "faction", "Faction")
function PANEL:Init()
self:DockMargin(0, 0, 0, 0)
self:SetTall(SScaleMin(32 / 3))
self:DockPadding(0, SScaleMin(31 / 3), 0, 0)
self.nextThink = 0
end
function PANEL:AddPlayer(client, index)
if (!IsValid(client) or !client:GetCharacter() or hook.Run("ShouldShowPlayerOnScoreboard", client, self) == false) then
return false
end
local id = index == 0 and 1 or 2
local panel = self:Add("ixScoreboardRow")
panel:SetPlayer(client)
panel:Dock(TOP)
panel:SetZPos(2)
panel:SetBackgroundPaintFunction(rowPaintFunctions[id])
self:SizeToContents()
client.ixScoreboardSlot = panel
return true
end
function PANEL:SetFaction(faction)
self:SetColor(faction.color)
local scoreboardTitle = self:Add("DLabel")
scoreboardTitle:SetText(L(faction.name))
scoreboardTitle:SetFont("MenuFontLargerBoldNoFix")
scoreboardTitle:SetPos(SScaleMin(50 / 3), SScaleMin(5 / 3))
scoreboardTitle:SizeToContents()
self.faction = faction
self.Paint = function(this, w, h)
surface.SetDrawColor(ColorAlpha(faction.color, 40))
surface.DrawRect(1, 0, this:GetWide() - 2, SScaleMin(31 / 3))
end
end
function PANEL:Update()
local faction = self.faction
local players = team.GetPlayers(faction.index)
for _, v in pairs(player.GetAll()) do
if faction.index == FACTION_CP then
if !v:GetNetVar("combineMaskEquipped") and v:Team() == FACTION_CP then
table.RemoveByValue(players, v)
end
if !ix.config.Get("ShowCPsOnScoreboard", false) then
if LocalPlayer():Team() != FACTION_ADMIN and LocalPlayer():Team() != FACTION_SERVERADMIN and LocalPlayer():Team() != FACTION_MCP and !LocalPlayer():IsCombine() then
table.RemoveByValue(players, v)
end
end
end
if faction.index == FACTION_CITIZEN then
if !v:GetNetVar("combineMaskEquipped") and v:Team() == FACTION_CP then
table.insert(players, v)
end
end
end
local ownChar = LocalPlayer().GetCharacter and LocalPlayer():GetCharacter()
for _, v in pairs(player.GetAll()) do
local targetChar = v.GetCharacter and v:GetCharacter()
if (targetChar) then
local playerFaction = ix.faction.Get(v:Team())
if !v:GetNetVar("combineMaskEquipped") and v:Team() == FACTION_CP then
playerFaction = ix.faction.Get(FACTION_CITIZEN)
end
if playerFaction and playerFaction.index == FACTION_CP and !ix.config.Get("ShowCPsOnScoreboard", false) then
if LocalPlayer():Team() != FACTION_ADMIN and LocalPlayer():Team() != FACTION_SERVERADMIN and LocalPlayer():Team() != FACTION_MCP and !LocalPlayer():IsCombine() then
continue
end
end
if !playerFaction then playerFaction = ix.faction.Get(FACTION_CITIZEN) end
if !playerFaction then continue end
local separateTab = playerFaction.separateUnknownTab
if !ownChar then continue end
local doesRecognizeTarget = ownChar.DoesRecognize and ownChar:DoesRecognize(targetChar)
v.unknown = !separateTab and !doesRecognizeTarget
if (self.unknown and v.unknown) then
table.insert(players, v)
end
end
end
if (self.group) then
players = {}
for _, v in pairs(self.faction:GetOnlineMembers()) do
if (v:GetCharacter() and LocalPlayer():GetCharacter():DoesRecognize(v:GetCharacter())) then
v.group = faction
table.insert(players, v)
end
end
end
if (table.IsEmpty(players) or (self.group and faction.hidden)) then
self:SetVisible(false)
self:GetParent():InvalidateLayout()
else
local bHasPlayers
for k, v in ipairs(players) do
if (!self.unknown and v.unknown) then continue end
if (!self.group and v.group and !v.group.hidden and !faction.separateUnknownTab) then continue end
if (!IsValid(v.ixScoreboardSlot)) then
if (self:AddPlayer(v, k)) then
bHasPlayers = true
end
else
v.ixScoreboardSlot:Update()
bHasPlayers = true
end
end
self:SetVisible(bHasPlayers)
end
end
vgui.Register("ixScoreboardFaction", PANEL, "ixCategoryPanel")
-- main scoreboard panel
PANEL = {}
function PANEL:Init()
if (IsValid(ix.gui.scoreboard)) then
ix.gui.scoreboard:Remove()
end
local titlePushDown = SScaleMin(30 / 3)
local topPushDown = SScaleMin(150 / 3)
local scale780 = SScaleMin(780 / 3)
local scale120 = SScaleMin(120 / 3)
self:SetWide(ScrW() - (topPushDown * 2))
local sizeXtitle, sizeYtitle = self:GetWide(), scale120
local sizeXcontent, sizeYcontent = self:GetWide(), (scale780)
self.titlePanel = self:Add("Panel")
self.titlePanel:SetSize(sizeXtitle, sizeYtitle)
self.titlePanel:SetPos(self:GetWide() * 0.5 - self.titlePanel:GetWide() * 0.5)
self:CreateTitleText()
self.contentFrame = self:Add("DScrollPanel")
self.contentFrame:SetSize(sizeXcontent, sizeYcontent)
self.contentFrame:SetPos(self:GetWide() * 0.5 - self.contentFrame:GetWide() * 0.5, titlePushDown)
self:SetTall(scale120 + scale780 + titlePushDown)
self:Center()
self:Update()
ix.gui.scoreboard = self
end
function PANEL:Update()
self.contentFrame:Clear()
self.factions = {}
self.groups = {}
self.nextThink = 0
local groups = hook.Run("GetGroups")
if (groups) then
for _, v in pairs(groups) do
if (self.groups[v:GetID()]) then continue end
if (!v.active) then continue end
local panel = self.contentFrame:Add("ixScoreboardFaction")
panel:SetFaction(v)
panel:Dock(TOP)
panel.group = true
table.insert(self.factions, panel)
self.groups[v:GetID()] = true
end
end
for i = 1, #ix.faction.indices do
local faction = ix.faction.indices[i]
local panel = self.contentFrame:Add("ixScoreboardFaction")
panel:SetFaction(faction)
panel:Dock(TOP)
table.insert(self.factions, panel)
end
local unknownFaction = self.contentFrame:Add("ixScoreboardFaction")
unknownFaction.unknown = true
unknownFaction:SetFaction({
color = Color(200, 200, 200),
name = "unknown"
})
unknownFaction:Dock(TOP)
table.insert(self.factions, unknownFaction)
end
function PANEL:CreateTitleText()
local scoreboardIcon = self.titlePanel:Add("DImage")
scoreboardIcon:SetImage("willardnetworks/tabmenu/navicons/scoreboard.png")
scoreboardIcon:SetSize(SScaleMin(23 / 3), SScaleMin(17 / 3))
local scoreboardTitle = self.titlePanel:Add("DLabel")
scoreboardTitle:SetFont("TitlesFontNoClamp")
scoreboardTitle:SetText("Tabela Graczy")
scoreboardTitle:SizeToContents()
scoreboardTitle:SetPos(SScaleMin(30 / 3), scoreboardIcon:GetTall() * 0.5 - scoreboardTitle:GetTall() * 0.5)
end
function PANEL:Think()
if (CurTime() >= self.nextThink) then
for _, v in pairs(self.factions) do
v:Update()
end
self.nextThink = CurTime() + 0.5
end
end
vgui.Register("ixScoreboard", PANEL, "EditablePanel")
hook.Add("CreateMenuButtons", "ixScoreboard", function(tabs)
tabs["scoreboard"] = {
RowNumber = 3,
Width = 23,
Height = 17,
Icon = "willardnetworks/tabmenu/navicons/scoreboard.png",
Create = function(info, container)
container:Add("ixScoreboard")
end
}
end)

View File

@@ -0,0 +1,813 @@
--[[
| 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 panelMap = {
[ix.type.bool] = "ixSettingsRowBool",
[ix.type.array] = "ixSettingsRowArray",
[ix.type.string] = "ixSettingsRowString",
[ix.type.number] = "ixSettingsRowNumber",
[ix.type.color] = "ixSettingsRowColor"
}
local function EmitChange(pitch)
LocalPlayer():EmitSound("weapons/ar2/ar2_empty.wav", 75, pitch or 150, 0.25)
end
-- color setting
local PANEL = {}
AccessorFunc(PANEL, "padding", "Padding", FORCE_NUMBER)
function PANEL:Init()
self.color = table.Copy(color_white)
self.padding = SScaleMin ( 4 / 3 )
self.panel = self:Add("Panel")
self.panel:SetCursor("hand")
self.panel:SetMouseInputEnabled(true)
self.panel:Dock(RIGHT)
self.panel.Paint = function(panel, width, height)
local padding = self.padding
surface.SetDrawColor(derma.GetColor("DarkerBackground", self))
surface.DrawRect(0, 0, width, height)
surface.SetDrawColor(self.color)
surface.DrawRect(padding, padding, width - padding * 2, height - padding * 2)
end
self.panel.OnMousePressed = function(panel, key)
if (key == MOUSE_LEFT) then
self:OpenPicker()
end
end
end
function PANEL:OpenPicker()
if (IsValid(self.picker)) then
self.picker:Remove()
return
end
self.picker = vgui.Create("ixSettingsRowColorPicker")
self.picker:Attach(self)
self.picker:SetValue(self.color)
self.picker.OnValueChanged = function(panel)
local newColor = panel:GetValue()
if (newColor != self.color) then
self.color = newColor
self:OnValueChanged(newColor)
end
end
self.picker.OnValueUpdated = function(panel)
self.color = panel:GetValue()
self:OnValueChanged(self.color)
end
end
function PANEL:SetValue(value)
self.color = Color(value.r or 255, value.g or 255, value.b or 255, value.a or 255)
end
function PANEL:GetValue()
return self.color
end
function PANEL:PerformLayout(width, height)
surface.SetFont("TitlesFontNoBoldNoClamp")
local totalWidth = surface.GetTextSize("999")
self.panel:SetSize(totalWidth + self.padding * 2, height)
end
vgui.Register("ixSettingsRowColor", PANEL, "ixSettingsRow")
-- color setting picker
DEFINE_BASECLASS("Panel")
PANEL = {}
AccessorFunc(PANEL, "bDeleteSelf", "DeleteSelf", FORCE_BOOL)
function PANEL:Init()
self.m_bIsMenuComponent = true
self.bDeleteSelf = true
self.realHeight = SScaleMin ( 200 / 3 )
self.height = SScaleMin ( 200 / 3 )
self:SetSize(SScaleMin ( 250 / 3 ), SScaleMin ( 200 / 3 ))
self:DockPadding(SScaleMin ( 4 / 3 ), SScaleMin ( 4 / 3 ), SScaleMin ( 4 / 3 ), SScaleMin ( 4 / 3 ))
self.picker = self:Add("DColorMixer")
self.picker:Dock(FILL)
self.picker.ValueChanged = function()
self:OnValueUpdated()
end
self:MakePopup()
RegisterDermaMenuForClose(self)
end
function PANEL:SetValue(value)
self.picker:SetColor(Color(value.r or 255, value.g or 255, value.b or 255, value.a or 255))
end
function PANEL:GetValue()
return self.picker:GetColor()
end
function PANEL:Attach(panel)
self.attached = panel
end
function PANEL:Think()
local panel = self.attached
if (IsValid(panel)) then
local width, height = self:GetSize()
local x, y = panel:LocalToScreen(0, 0)
self:SetPos(
math.Clamp(x + panel:GetWide() - width, 0, ScrW() - width),
math.Clamp(y + panel:GetTall(), 0, ScrH() - height)
)
end
end
function PANEL:Paint(width, height)
surface.SetDrawColor(derma.GetColor("DarkerBackground", self))
surface.DrawRect(0, 0, width, height)
end
function PANEL:OnValueChanged()
end
function PANEL:OnValueUpdated()
end
function PANEL:Remove()
if (self.bClosing) then
return
end
self:OnValueChanged()
-- @todo open/close animations
self.bClosing = true
self:SetMouseInputEnabled(false)
self:SetKeyboardInputEnabled(false)
BaseClass.Remove(self)
end
vgui.Register("ixSettingsRowColorPicker", PANEL, "EditablePanel")
-- number setting
PANEL = {}
function PANEL:Init()
self.setting = self:Add("ixNumSlider")
self.setting.nextUpdate = 0
self.setting:Dock(RIGHT)
self.setting.OnValueChanged = function(panel)
self:OnValueChanged(self:GetValue())
end
self.setting.OnValueUpdated = function(panel)
local fraction = panel:GetFraction()
if (fraction == 0) then
EmitChange(75)
return
elseif (fraction == 1) then
EmitChange(120)
return
end
if (SysTime() > panel.nextUpdate) then
EmitChange(85 + fraction * 15)
panel.nextUpdate = SysTime() + 0.05
end
end
local panel = self.setting:GetLabel()
panel:SetCursor("hand")
panel:SetMouseInputEnabled(true)
panel.OnMousePressed = function(_, key)
if (key == MOUSE_LEFT) then
self:OpenEntry()
end
end
end
function PANEL:OpenEntry()
if (IsValid(self.entry)) then
self.entry:Remove()
return
end
self.entry = vgui.Create("ixSettingsRowNumberEntry")
self.entry:Attach(self)
self.entry:SetValue(self:GetValue(), true)
self.entry.OnValueChanged = function(panel)
local value = math.Round(panel:GetValue(), self:GetDecimals())
if (value != self:GetValue()) then
self:SetValue(value, true)
self:OnValueChanged(value)
end
end
end
function PANEL:SetValue(value, bNoNotify)
self.setting:SetValue(value, bNoNotify)
end
function PANEL:GetValue()
return self.setting:GetValue()
end
function PANEL:SetMin(value)
self.setting:SetMin(value)
end
function PANEL:SetMax(value)
self.setting:SetMax(value)
end
function PANEL:SetDecimals(value)
self.setting:SetDecimals(value)
end
function PANEL:GetDecimals()
return self.setting:GetDecimals()
end
function PANEL:PerformLayout(width, height)
self.setting:SetWide(width * 0.5)
end
vgui.Register("ixSettingsRowNumber", PANEL, "ixSettingsRow")
-- number setting entry
DEFINE_BASECLASS("Panel")
PANEL = {}
AccessorFunc(PANEL, "bDeleteSelf", "DeleteSelf", FORCE_BOOL)
function PANEL:Init()
surface.SetFont("TitlesFontNoBoldNoClamp")
local width, height = surface.GetTextSize("999999")
self.m_bIsMenuComponent = true
self.bDeleteSelf = true
self.realHeight = SScaleMin ( 200 / 3 )
self.height = SScaleMin ( 200 / 3 )
self:SetSize(width, height)
self:DockPadding(SScaleMin ( 4 / 3 ), SScaleMin ( 4 / 3 ), SScaleMin ( 4 / 3 ), SScaleMin ( 4 / 3 ))
self.textEntry = self:Add("ixTextEntry")
self.textEntry:SetNumeric(true)
self.textEntry:SetFont("TitlesFontNoBoldNoClamp")
self.textEntry:Dock(FILL)
self.textEntry:RequestFocus()
self.textEntry.OnEnter = function()
self:Remove()
end
self:MakePopup()
RegisterDermaMenuForClose(self)
end
function PANEL:SetValue(value, bInitial)
value = tostring(value)
self.textEntry:SetValue(value)
if (bInitial) then
self.textEntry:SetCaretPos(value:utf8len())
end
end
function PANEL:GetValue()
return tonumber(self.textEntry:GetValue()) or 0
end
function PANEL:Attach(panel)
self.attached = panel
end
function PANEL:Think()
local panel = self.attached
if (IsValid(panel)) then
local width, height = self:GetSize()
local x, y = panel:LocalToScreen(0, 0)
self:SetPos(
math.Clamp(x + panel:GetWide() - width, 0, ScrW() - width),
math.Clamp(y + panel:GetTall(), 0, ScrH() - height)
)
end
end
function PANEL:Paint(width, height)
surface.SetDrawColor(derma.GetColor("DarkerBackground", self))
surface.DrawRect(0, 0, width, height)
end
function PANEL:OnValueChanged()
end
function PANEL:OnValueUpdated()
end
function PANEL:Remove()
if (self.bClosing) then
return
end
self:OnValueChanged()
-- @todo open/close animations
self.bClosing = true
self:SetMouseInputEnabled(false)
self:SetKeyboardInputEnabled(false)
BaseClass.Remove(self)
end
vgui.Register("ixSettingsRowNumberEntry", PANEL, "EditablePanel")
-- string setting
PANEL = {}
function PANEL:Init()
self.setting = self:Add("ixTextEntry")
self.setting:Dock(RIGHT)
self.setting:SetFont("TitlesFontNoBoldNoClamp")
self.setting:SetBackgroundColor(derma.GetColor("DarkerBackground", self))
self.setting.OnEnter = function()
self:OnValueChanged(self:GetValue())
end
end
function PANEL:SetValue(value)
self.setting:SetValue(tostring(value))
end
function PANEL:GetValue()
return self.setting:GetValue()
end
function PANEL:PerformLayout(width, height)
self.setting:SetWide(width * 0.5)
end
vgui.Register("ixSettingsRowString", PANEL, "ixSettingsRow")
-- bool setting
PANEL = {}
function PANEL:Init()
self.setting = self:Add("ixCheckBox")
self.setting:Dock(RIGHT)
self.setting.DoClick = function(panel)
self:OnValueChanged(self:GetValue())
end
end
function PANEL:SetValue(bValue)
bValue = tobool(bValue)
self.setting:SetChecked(bValue, true)
end
function PANEL:GetValue()
return self.setting:GetChecked()
end
vgui.Register("ixSettingsRowBool", PANEL, "ixSettingsRow")
-- array setting
PANEL = {}
function PANEL:Init()
self.array = {}
self.setting = self:Add("DComboBox")
self.setting:Dock(RIGHT)
self.setting:SetFont("TitlesFontNoBoldNoClamp")
self.setting:SetTextColor(color_white)
self.setting.OnSelect = function(panel)
self:OnValueChanged(self:GetValue())
panel:SizeToContents()
panel:SetWide(panel:GetWide() + SScaleMin ( 12 / 3 )) -- padding for arrow (nice)
if (!self.bInitial) then
EmitChange()
end
end
end
function PANEL:Populate(key, info)
if (!isfunction(info.populate)) then
ErrorNoHalt(string.format("expected populate function for array option '%s'", key))
return
end
local entries = info.populate()
local i = 1
for k, v in pairs(entries) do
self.setting:AddChoice(v, k)
self.array[k] = i
i = i + 1
end
end
function PANEL:SetValue(value)
--quick fix
if (!self.array[value]) then return end
self.bInitial = true
self.setting:ChooseOptionID(self.array[value])
self.bInitial = false
end
function PANEL:GetValue()
return select(2, self.setting:GetSelected())
end
vgui.Register("ixSettingsRowArray", PANEL, "ixSettingsRow")
-- settings row
PANEL = {}
AccessorFunc(PANEL, "backgroundIndex", "BackgroundIndex", FORCE_NUMBER)
AccessorFunc(PANEL, "bShowReset", "ShowReset", FORCE_BOOL)
function PANEL:Init()
self:DockPadding(SScaleMin ( 10 / 3 ), SScaleMin ( 4 / 3 ), SScaleMin ( 4 / 3 ), SScaleMin ( 4 / 3 ))
self.text = self:Add("DLabel")
self.text:Dock(LEFT)
self.text:SetFont("TitlesFontNoBoldNoClamp")
self.text:SetExpensiveShadow(1, color_black)
self.backgroundIndex = 0
end
function PANEL:SetShowReset(value, name, default)
value = tobool(value)
if (value and !IsValid(self.reset)) then
self.reset = self:Add("DButton")
self.reset:SetFont("TitlesFontNoBoldNoClamp")
self.reset:SetText("Resetuj")
self.reset:SetTextColor(ColorAlpha(derma.GetColor("Warning", self), 100))
self.reset:Dock(LEFT)
self.reset:DockMargin(SScaleMin ( 4 / 3 ), 0, 0, 0)
self.reset:SizeToContents()
self.reset.Paint = nil
self.reset.DoClick = function()
self:OnResetClicked()
end
self.reset:SetHelixTooltip(function(tooltip)
local title = tooltip:AddRow("title")
title:SetImportant()
title:SetText(L("resetDefault"))
title:SetBackgroundColor(derma.GetColor("Warning", self))
title:SizeToContents()
local description = tooltip:AddRow("description")
description:SetText(L("resetDefaultDescription", tostring(name), tostring(default)))
description:SizeToContents()
end)
elseif (!value and IsValid(self.reset)) then
self.reset:Remove()
end
self.bShowReset = value
end
function PANEL:Think()
if (IsValid(self.reset)) then
self.reset:SetVisible(self:IsHovered() or self:IsOurChild(vgui.GetHoveredPanel()))
end
end
function PANEL:OnResetClicked()
end
function PANEL:GetLabel()
return self.text
end
function PANEL:SetText(text)
self.text:SetText(text)
self:SizeToContents()
end
function PANEL:GetText()
return self.text:GetText()
end
-- implemented by row types
function PANEL:GetValue()
end
function PANEL:SetValue(value)
end
-- meant for array types to populate combo box values
function PANEL:Populate(key, info)
end
-- called when value is changed by user
function PANEL:OnValueChanged(newValue)
end
function PANEL:SizeToContents()
local _, top, _, bottom = self:GetDockPadding()
self.text:SizeToContents()
self:SetTall(self.text:GetTall() + top + bottom)
self.ixRealHeight = self:GetTall()
self.ixHeight = self.ixRealHeight
end
function PANEL:Paint(width, height)
derma.SkinFunc("PaintSettingsRowBackground", self, width, height)
end
vgui.Register("ixSettingsRow", PANEL, "EditablePanel")
-- settings panel
PANEL = {}
function PANEL:Init()
local titlePushDown = SScaleMin(30 / 3)
local topPushDown = SScaleMin(150 / 3)
local scale780 = SScaleMin(780 / 3)
local scale120 = SScaleMin(120 / 3)
self:SetWide(ScrW() - (topPushDown * 2))
local sizeXtitle, sizeYtitle = self:GetWide(), scale120
local sizeXcontent, sizeYcontent = self:GetWide(), (scale780)
self.titlePanel = self:Add("Panel")
self.titlePanel:SetSize(sizeXtitle, sizeYtitle)
self.titlePanel:SetPos(self:GetWide() * 0.5 - self.titlePanel:GetWide() * 0.5)
self:CreateTitleText()
self.contentFrame = self:Add("Panel")
self.contentFrame:SetSize(sizeXcontent, sizeYcontent)
self.contentFrame:SetPos(self:GetWide() * 0.5 - self.contentFrame:GetWide() * 0.5, titlePushDown)
self:SetTall(scale120 + scale780 + titlePushDown)
self:Center()
self.rows = {}
self.categories = {}
-- scroll panel
DEFINE_BASECLASS("DScrollPanel")
self.canvas = self.contentFrame:Add("DScrollPanel")
self.canvas:Dock(FILL)
self.canvas.PerformLayout = function(panel)
BaseClass.PerformLayout(panel)
if (!panel.VBar.Enabled) then
panel.pnlCanvas:SetWide(panel:GetWide() - panel.VBar:GetWide())
end
end
end
function PANEL:CreateTitleText()
self.settingsTitleIcon = self.titlePanel:Add("DImage")
self.settingsTitleIcon:SetImage("willardnetworks/tabmenu/navicons/settings.png")
self.settingsTitleIcon:SetSize(SScaleMin(20 / 3), SScaleMin(16 / 3))
self.settingsTitle = self.titlePanel:Add("DLabel")
self.settingsTitle:SetFont("TitlesFontNoClamp")
self.settingsTitle:SetText("Ustawienia")
self.settingsTitle:SizeToContents()
self.settingsTitle:SetPos(SScaleMin(32 / 3), self.settingsTitleIcon:GetTall() * 0.5 - self.settingsTitle:GetTall() * 0.5)
end
function PANEL:GetRowPanelName(type)
return panelMap[type] or "ixSettingsRow"
end
function PANEL:AddCategory(name)
local panel = self.categories[name]
if (!IsValid(panel)) then
panel = self.canvas:Add("ixCategoryPanel")
panel:SetText(name)
panel:Dock(TOP)
panel:DockMargin(0, SScaleMin(8 / 3), 0, 0)
self.categories[name] = panel
return panel
end
end
function PANEL:AddRow(type, category)
category = self.categories[category]
local id = panelMap[type]
if (!id) then
ErrorNoHalt("attempted to create row with unimplemented type '" .. tostring(ix.type[type]) .. "'\n")
id = "ixSettingsRow"
end
local panel = (IsValid(category) and category or self.canvas):Add(id)
panel:Dock(TOP)
panel:SetBackgroundIndex(#self.rows % 2)
self.rows[#self.rows + 1] = panel
return panel
end
function PANEL:GetRows()
return self.rows
end
function PANEL:Clear()
for _, v in ipairs(self.rows) do
if (IsValid(v)) then
v:Remove()
end
end
self.rows = {}
end
function PANEL:SetSearchEnabled(bValue)
if (!bValue) then
if (IsValid(self.searchEntry)) then
self.searchEntry:Remove()
end
return
end
-- search entry
self.searchEntry = self.contentFrame:Add("ixIconTextEntry")
self.searchEntry:Dock(TOP)
self.searchEntry:SetEnterAllowed(false)
self.searchEntry.OnChange = function(entry)
self:FilterRows(entry:GetValue())
end
end
function PANEL:FilterRows(query)
query = string.PatternSafe(query:utf8lower())
local bEmpty = query == ""
for categoryName, category in pairs(self.categories) do
category.size = 0
category:CreateAnimation(0.5, {
index = 21,
target = {size = 1},
Think = function(animation, panel)
panel:SizeToContents()
end
})
for _, row in ipairs(category:GetChildren()) do
local bFound = bEmpty or row:GetText():utf8lower():find(query) or categoryName:utf8lower():find(query)
row:SetVisible(true)
row:CreateAnimation(0.5, {
index = 21,
target = {ixHeight = bFound and row.ixRealHeight or 0},
easing = "outQuint",
Think = function(animation, panel)
panel:SetTall(bFound and math.min(panel.ixHeight + SScaleMin ( 2 / 3 ), panel.ixRealHeight) or math.max(panel.ixHeight - SScaleMin ( 2 / 3 ), 0))
end,
OnComplete = function(animation, panel)
panel:SetVisible(bFound)
-- need this so categories are sized properly when animations are disabled - there is no guaranteed order
-- that animations will think so we SizeToContents here. putting it here will result in redundant calls but
-- I guess we have the performance to spare
if (ix.option.Get("disableAnimations", false)) then
category:SizeToContents()
end
end
})
end
end
end
function PANEL:Paint(width, height)
end
function PANEL:SizeToContents()
for _, v in pairs(self.categories) do
v:SizeToContents()
end
end
vgui.Register("ixSettings", PANEL, "Panel")
hook.Add("CreateMenuButtons", "ixSettings", function(tabs)
tabs["settings"] = {
RowNumber = 5,
Width = 20,
Height = 16,
Right = true,
Icon = "willardnetworks/tabmenu/navicons/settings.png",
Create = function(info, container)
local panel = container:Add("ixSettings")
panel:SetSearchEnabled(true)
for category, options in SortedPairs(ix.option.GetAllByCategories(true)) do
category = L(category)
panel:AddCategory(category)
-- sort options by language phrase rather than the key
table.sort(options, function(a, b)
return L(a.phrase) < L(b.phrase)
end)
for _, data in pairs(options) do
local key = data.key
local row = panel:AddRow(data.type, category)
local value = ix.util.SanitizeType(data.type, ix.option.Get(key))
row:SetText(L(data.phrase))
row:Populate(key, data)
-- type-specific properties
if (data.type == ix.type.number) then
row:SetMin(data.min or 0)
row:SetMax(data.max or 10)
row:SetDecimals(data.decimals or 0)
end
row:SetValue(value, true)
row:SetShowReset(value != data.default, key, data.default)
row.OnValueChanged = function()
local newValue = row:GetValue()
row:SetShowReset(newValue != data.default, key, data.default)
ix.option.Set(key, newValue)
end
row.OnResetClicked = function()
row:SetShowReset(false)
row:SetValue(data.default, true)
ix.option.Set(key, data.default)
end
row:GetLabel():SetHelixTooltip(function(tooltip)
local title = tooltip:AddRow("name")
title:SetImportant()
title:SetText(key)
title:SizeToContents()
title:SetMaxWidth(math.max(title:GetMaxWidth(), ScrW() * 0.5))
local description = tooltip:AddRow("description")
description:SetText(L(data.description))
description:SizeToContents()
end)
end
end
panel:SizeToContents()
container.panel = panel
end,
OnSelected = function(info, container)
container.panel.searchEntry:RequestFocus()
end
}
end)

View File

@@ -0,0 +1,184 @@
--[[
| 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 PANEL = {}
function PANEL:Init()
self:SetSize(ScrW(), ScrH())
self:SetAlpha(0)
self:AlphaTo(255, 0.5, 0)
self.Paint = function(self, w, h)
surface.SetDrawColor(Color(63, 58, 115, 220))
surface.DrawRect(0, 0, w, h)
Derma_DrawBackgroundBlur( self, 1 )
end
self.innerContent = self:Add("Panel")
self.innerContent:SetSize(460, 360)
self.innerContent:Center()
self.innerContent:MakePopup()
self.innerContent.Paint = function(self, w, h)
surface.SetDrawColor(0, 0, 0, 130)
surface.DrawRect(0, 0, w, h)
end
local topbar = self.innerContent:Add("Panel")
topbar:SetSize(self.innerContent:GetWide(), 50)
topbar:Dock(TOP)
topbar.Paint = function( self, w, h )
surface.SetDrawColor(0, 0, 0, 130)
surface.DrawRect(0, 0, w, h)
end
local titleText = topbar:Add("DLabel")
titleText:SetFont("CharCreationBoldTitle")
titleText:Dock(LEFT)
titleText:SetText("Shipment")
titleText:DockMargin(10, 0, 0, 0)
titleText:SetContentAlignment(4)
titleText:SizeToContents()
local exit = topbar:Add("DImageButton")
exit:SetImage("willardnetworks/tabmenu/navicons/exit.png")
exit:SetSize(20, 20)
exit:DockMargin(0, 15, 10, 15)
exit:Dock(RIGHT)
exit.DoClick = function()
self:Close()
surface.PlaySound("helix/ui/press.wav")
end
self.scroll = self.innerContent:Add("DScrollPanel")
self.scroll:Dock(FILL)
self.list = self.scroll:Add("DListLayout")
self.list:Dock(FILL)
end
function PANEL:SetItems(entity, items)
self.entity = entity
self.items = true
self.itemPanels = {}
for k, v in SortedPairs(items) do
local itemTable = ix.item.list[k]
if (itemTable) then
local function ButtonPaint(self, 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)
end
local item = self.list:Add("Panel")
item:SetTall(36)
item:Dock(TOP)
item:DockMargin(4, 4, 4, 0)
item.Paint = function(self, w, h)
surface.SetDrawColor(Color(0, 0, 0, 100))
surface.DrawRect(0, 0, w, h)
end
item.icon = item:Add("SpawnIcon")
item.icon:SetPos(5, 2)
item.icon:SetSize(32, 32)
item.icon:SetModel(itemTable:GetModel())
item.icon:SetHelixTooltip(function(tooltip)
ix.hud.PopulateItemTooltip(tooltip, itemTable)
end)
item.quantity = item.icon:Add("DLabel")
item.quantity:SetSize(32, 32)
item.quantity:SetContentAlignment(3)
item.quantity:SetTextInset(0, 0)
item.quantity:SetText(v)
item.quantity:SetFont("DermaDefaultBold")
item.quantity:SetExpensiveShadow(1, Color(0, 0, 0, 150))
item.name = item:Add("DLabel")
item.name:SetPos(45, 0)
item.name:SetSize(200, 36)
item.name:SetFont("ixSmallFont")
item.name:SetText(L(itemTable.name))
item.name:SetContentAlignment(4)
item.name:SetTextColor(color_white)
item.take = item:Add("DButton")
item.take:Dock(RIGHT)
item.take:SetText(L"take")
item.take:SetWide(48)
item.take:DockMargin(3, 3, 3, 3)
item.take:SetTextColor(color_white)
item.take.Paint = function(self, w, h) ButtonPaint(self, w, h) end
item.take.DoClick = function(this)
net.Start("ixShipmentUse")
net.WriteString(k)
net.WriteBool(false)
net.SendToServer()
items[k] = items[k] - 1
item.quantity:SetText(items[k])
if (items[k] <= 0) then
item:Remove()
items[k] = nil
end
if (table.IsEmpty(items)) then
self:Remove()
end
end
item.drop = item:Add("DButton")
item.drop:Dock(RIGHT)
item.drop:SetText(L"drop")
item.drop:SetWide(48)
item.drop:DockMargin(3, 3, 0, 3)
item.drop:SetTextColor(color_white)
item.drop.Paint = function(self, w, h) ButtonPaint(self, w, h) end
item.drop.DoClick = function(this)
net.Start("ixShipmentUse")
net.WriteString(k)
net.WriteBool(true)
net.SendToServer()
items[k] = items[k] - 1
item.quantity:SetText(items[k])
if (items[k] <= 0) then
item:Remove()
end
end
self.itemPanels[k] = item
end
end
end
function PANEL:Close()
net.Start("ixShipmentClose")
net.SendToServer()
self:Remove()
end
function PANEL:Think()
if (self.items and !IsValid(self.entity)) then
self:Remove()
end
end
vgui.Register("ixShipment", PANEL, "Panel")

View File

@@ -0,0 +1,532 @@
--[[
| 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 gradient = surface.GetTextureID("vgui/gradient-d")
local gradientUp = surface.GetTextureID("vgui/gradient-u")
local gradientLeft = surface.GetTextureID("vgui/gradient-l")
local gradientRadial = ix.util.GetMaterial("helix/gui/radial-gradient.png")
local defaultBackgroundColor = Color(30, 30, 30, 200)
local SKIN = {}
derma.DefineSkin("helix", "The base skin for the Helix framework.", SKIN)
SKIN.fontCategory = "ixMediumLightFont"
SKIN.fontCategoryBlur = "ixMediumLightBlurFont"
SKIN.fontSegmentedProgress = "ixMediumLightFont"
SKIN.Colours = table.Copy(derma.SkinList.Default.Colours)
SKIN.Colours.Info = Color(100, 185, 255)
SKIN.Colours.Success = Color(64, 185, 85)
SKIN.Colours.Error = Color(255, 100, 100)
SKIN.Colours.Warning = Color(230, 180, 0)
SKIN.Colours.MenuLabel = color_white
SKIN.Colours.DarkerBackground = Color(0, 0, 0, 77)
SKIN.Colours.SegmentedProgress = {}
SKIN.Colours.SegmentedProgress.Bar = Color(64, 185, 85)
SKIN.Colours.SegmentedProgress.Text = color_white
SKIN.Colours.Area = {}
SKIN.Colours.Window.TitleActive = color_white
SKIN.Colours.Window.TitleInactive = color_white
SKIN.Colours.Button.Normal = color_white
SKIN.Colours.Button.Hover = color_white
SKIN.Colours.Button.Down = Color(180, 180, 180)
SKIN.Colours.Button.Disabled = Color(0, 0, 0, 100)
SKIN.Colours.Label.Default = color_white
function SKIN.tex.Menu_Strip(x, y, width, height, color)
surface.SetDrawColor(0, 0, 0, 200)
surface.DrawRect(x, y, width, height)
surface.SetDrawColor(ColorAlpha(color or ix.config.Get("color"), 175))
surface.SetTexture(gradient)
surface.DrawTexturedRect(x, y, width, height)
surface.SetTextColor(color_white)
end
hook.Add("ColorSchemeChanged", "ixSkin", function(color)
SKIN.Colours.Area.Background = color
end)
function SKIN:DrawHelixCurved(x, y, radius, segments, barHeight, fraction, color)
radius = radius or math.min(ScreenScale(72), 128) * 2
segments = segments or 76
barHeight = barHeight or 64
color = color or ix.config.Get("color")
fraction = fraction or 1
surface.SetTexture(-1)
for i = 1, math.ceil(segments) do
local angle = math.rad((i / segments) * -360)
local barX = x + math.sin(angle + (fraction * math.pi * 2)) * radius
local barY = y + math.cos(angle + (fraction * math.pi * 2)) * radius
local barOffset = math.sin(SysTime() + i * 0.5)
if (barOffset > 0) then
surface.SetDrawColor(color)
else
surface.SetDrawColor(color.r * 0.5, color.g * 0.5, color.b * 0.5, color.a)
end
surface.DrawTexturedRectRotated(barX, barY, 4, barOffset * (barHeight * fraction), math.deg(angle))
end
end
function SKIN:DrawHelix(x, y, width, height, segments, color, fraction, speed)
segments = segments or width * 0.05
color = color or ix.config.Get("color")
fraction = fraction or 0.25
speed = speed or 1
for i = 1, math.ceil(segments) do
local offset = math.sin((SysTime() + speed) + i * fraction)
local barHeight = height * offset
surface.SetTexture(-1)
if (offset > 0) then
surface.SetDrawColor(color)
else
surface.SetDrawColor(color.r * 0.5, color.g * 0.5, color.b * 0.5, color.a)
end
surface.DrawTexturedRectRotated(x + (i / segments) * width, y + height * 0.5, 4, barHeight, 0)
end
end
function SKIN:PaintFrame(panel)
if (!panel.bNoBackgroundBlur) then
ix.util.DrawBlur(panel, 10)
end
surface.SetDrawColor(30, 30, 30, 150)
surface.DrawRect(0, 0, panel:GetWide(), panel:GetTall())
if (panel:GetTitle() != "" or panel.btnClose:IsVisible()) then
surface.SetDrawColor(ix.config.Get("color"))
surface.DrawRect(0, 0, panel:GetWide(), 24)
if (panel.bHighlighted) then
self:DrawImportantBackground(0, 0, panel:GetWide(), 24, ColorAlpha(color_white, 22))
end
end
surface.SetDrawColor(ix.config.Get("color"))
surface.DrawOutlinedRect(0, 0, panel:GetWide(), panel:GetTall())
end
function SKIN:PaintBaseFrame(panel, width, height)
if (!panel.bNoBackgroundBlur) then
ix.util.DrawBlur(panel, 10)
end
surface.SetDrawColor(30, 30, 30, 150)
surface.DrawRect(0, 0, width, height)
surface.SetDrawColor(ix.config.Get("color"))
surface.DrawOutlinedRect(0, 0, width, height)
end
function SKIN:DrawImportantBackground(x, y, width, height, color)
color = color or defaultBackgroundColor
surface.SetDrawColor(color)
surface.DrawRect(x, y, width, height)
end
function SKIN:DrawCharacterStatusBackground(panel, fraction)
surface.SetDrawColor(0, 0, 0, fraction * 100)
surface.DrawRect(0, 0, ScrW(), ScrH())
ix.util.DrawBlurAt(0, 0, ScrW(), ScrH(), 5, nil, fraction * 255)
end
function SKIN:PaintPanel(panel)
if (panel.m_bBackground) then
local width, height = panel:GetSize()
if (panel.m_bgColor) then
surface.SetDrawColor(panel.m_bgColor)
else
surface.SetDrawColor(30, 30, 30, 100)
end
surface.DrawRect(0, 0, width, height)
surface.SetDrawColor(0, 0, 0, 150)
surface.DrawOutlinedRect(0, 0, width, height)
end
end
function SKIN:PaintMenuBackground(panel, width, height, alphaFraction)
alphaFraction = alphaFraction or 1
surface.SetDrawColor(ColorAlpha(color_black, alphaFraction * 255))
surface.SetTexture(gradient)
surface.DrawTexturedRect(0, 0, width, height)
ix.util.DrawBlur(panel, alphaFraction * 15, nil, 200)
end
function SKIN:PaintPlaceholderPanel(panel, width, height, barWidth, padding)
local size = math.max(width, height)
barWidth = barWidth or size * 0.05
local segments = size / barWidth
for i = 1, segments do
surface.SetTexture(-1)
surface.SetDrawColor(0, 0, 0, 88)
surface.DrawTexturedRectRotated(i * barWidth, i * barWidth, barWidth, size * 2, -45)
end
end
function SKIN:PaintCategoryPanel(panel, text, color)
text = text or ""
color = color or ix.config.Get("color")
surface.SetFont(self.fontCategoryBlur)
local textHeight = select(2, surface.GetTextSize(text)) + 6
local width, height = panel:GetSize()
surface.SetDrawColor(0, 0, 0, 100)
surface.DrawRect(0, textHeight, width, height - textHeight)
self:DrawImportantBackground(0, 0, width, textHeight, color)
surface.SetTextColor(color_black)
surface.SetTextPos(4, 4)
surface.DrawText(text)
surface.SetFont(self.fontCategory)
surface.SetTextColor(color_white)
surface.SetTextPos(4, 4)
surface.DrawText(text)
surface.SetDrawColor(color)
surface.DrawOutlinedRect(0, 0, width, height)
return 1, textHeight, 1, 1
end
function SKIN:PaintButton(panel)
if (panel.m_bBackground) then
local w, h = panel:GetWide(), panel:GetTall()
local alpha = 50
if (panel:GetDisabled()) then
alpha = 10
elseif (panel.Depressed) then
alpha = 180
elseif (panel.Hovered) then
alpha = 75
end
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)
end
end
function SKIN:PaintEntityInfoBackground(panel, width, height)
ix.util.DrawBlur(panel, 1)
surface.SetDrawColor(self.Colours.DarkerBackground)
surface.DrawRect(0, 0, width, height)
end
function SKIN:PaintTooltipBackground(panel, width, height)
ix.util.DrawBlur(panel, 1)
surface.SetDrawColor(self.Colours.DarkerBackground)
surface.DrawRect(0, 0, width, height)
end
function SKIN:PaintTooltipMinimalBackground(panel, width, height)
surface.SetDrawColor(0, 0, 0, 150 * panel.fraction)
surface.SetMaterial(gradientRadial)
surface.DrawTexturedRect(0, 0, width, height)
end
function SKIN:PaintSegmentedProgressBackground(panel, width, height)
end
function SKIN:PaintSegmentedProgress(panel, width, height)
local font = panel:GetFont() or self.fontSegmentedProgress
local textColor = panel:GetTextColor() or self.Colours.SegmentedProgress.Text
local barColor = panel:GetBarColor() or self.Colours.SegmentedProgress.Bar
local segments = panel:GetSegments()
local segmentHalfWidth = width / #segments * 0.5
surface.SetDrawColor(barColor)
surface.DrawRect(0, 0, panel:GetFraction() * width, height)
for i = 1, #segments do
local text = segments[i]
local x = (i - 1) / #segments * width + segmentHalfWidth
local y = height * 0.5
draw.SimpleText(text, font, x, y, textColor, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
end
function SKIN:PaintCharacterCreateBackground(panel, width, height)
surface.SetDrawColor(40, 40, 40, 255)
surface.SetTexture(gradient)
surface.DrawTexturedRect(0, 0, width, height)
end
function SKIN:PaintCharacterLoadBackground(panel, width, height)
surface.SetDrawColor(40, 40, 40, panel:GetBackgroundFraction() * 255)
surface.SetTexture(gradient)
surface.DrawTexturedRect(0, 0, width, height)
end
function SKIN:PaintCharacterTransitionOverlay(panel, x, y, width, height, color)
color = color or ix.config.Get("color")
surface.SetDrawColor(color)
surface.DrawRect(x, y, width, height)
end
function SKIN:PaintAreaEntry(panel, width, height)
local color = ColorAlpha(panel:GetBackgroundColor() or self.Colours.Area.Background, panel:GetBackgroundAlpha())
self:DrawImportantBackground(0, 0, width, height, color)
end
function SKIN:PaintListRow(panel, width, height)
surface.SetDrawColor(0, 0, 0, 150)
surface.DrawRect(0, 0, width, height)
end
function SKIN:PaintSettingsRowBackground(panel, width, height)
local index = panel:GetBackgroundIndex()
local bReset = panel:GetShowReset()
if (index == 0) then
surface.SetDrawColor(30, 30, 30, 45)
surface.DrawRect(0, 0, width, height)
end
if (bReset) then
surface.SetDrawColor(self.Colours.Warning)
surface.DrawRect(0, 0, 2, height)
end
end
function SKIN:PaintVScrollBar(panel, width, height)
end
function SKIN:PaintScrollBarGrip(panel, width, height)
local parent = panel:GetParent()
local upButtonHeight = parent.btnUp:GetTall()
local downButtonHeight = parent.btnDown:GetTall()
DisableClipping(true)
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
surface.DrawRect(4, -upButtonHeight, width - 8, height + upButtonHeight + downButtonHeight)
DisableClipping(false)
end
function SKIN:PaintButtonUp(panel, width, height)
end
function SKIN:PaintButtonDown(panel, width, height)
end
function SKIN:PaintComboBox(panel, width, height)
end
function SKIN:PaintComboDownArrow(panel, width, height)
local alpha = (panel.ComboBox:IsMenuOpen() or panel.ComboBox.Hovered) and 200 or 100
surface.SetDrawColor(ColorAlpha(Color(255, 255, 255, 255), alpha))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/mainmenu/charcreation/combodownarrow.png"))
surface.DrawTexturedRect(0, height * 0.5 - 5 * 0.5, 9, 5)
end
function SKIN:PaintMenu(panel, width, height)
ix.util.DrawBlur(panel)
surface.SetDrawColor(30, 30, 30, 150)
surface.DrawRect(0, 0, width, height)
end
function SKIN:PaintMenuOption(panel, width, height)
if (panel.m_bBackground and (panel.Hovered or panel.Highlight)) then
self:DrawImportantBackground(0, 0, width, height, ix.config.Get("color"))
end
end
function SKIN:PaintHelixSlider(panel, width, height)
surface.SetDrawColor(self.Colours.DarkerBackground)
surface.DrawRect(0, 0, width, height)
surface.SetDrawColor(self.Colours.Success)
surface.DrawRect(0, 0, panel:GetVisualFraction() * width, height)
end
function SKIN:PaintChatboxTabButton(panel, width, height)
if (panel:GetActive()) then
surface.SetDrawColor(ix.config.Get("color"))
surface.DrawRect(0, 0, width, height)
else
surface.SetDrawColor(0, 0, 0, 100)
surface.DrawRect(0, 0, width, height)
end
end
function SKIN:PaintChatboxTabs(panel, width, height, alpha)
surface.SetDrawColor(0, 0, 0, 33)
surface.DrawRect(0, 0, width, height)
surface.SetDrawColor(0, 0, 0, 100)
surface.SetTexture(gradient)
surface.DrawTexturedRect(0, height * 0.5, width, height * 0.5)
end
function SKIN:PaintChatboxBackground(self, w, h)
local matBlurScreen = Material( "pp/blurscreen" )
local function Derma_DrawBackgroundBlurInside( panel )
local x, y = panel:LocalToScreen( 0, 0 )
surface.SetMaterial( matBlurScreen )
surface.SetDrawColor( 255, 255, 255, 255 )
for i=0.33, 1, 0.33 do
matBlurScreen:SetFloat( "$blur", 5 * i ) -- Increase number 5 for more blur
matBlurScreen:Recompute()
if ( render ) then render.UpdateScreenEffectTexture() end
surface.DrawTexturedRect( x * -1, y * -1, ScrW(), ScrH() )
end
-- The line below gives the background a dark tint
surface.SetDrawColor( 10, 10, 10, 150 )
surface.DrawRect( x * -1, y * -1, ScrW(), ScrH() )
end
Derma_DrawBackgroundBlurInside( self )
end
function SKIN:PaintChatboxEntry(panel, width, height)
surface.SetDrawColor(0, 0, 0, 66)
surface.DrawRect(0, 0, width, height)
panel:DrawTextEntryText(color_white, ix.config.Get("color"), color_white)
end
function SKIN:DrawChatboxPreviewBox(x, y, text, color)
color = color or ix.config.Get("color")
local textWidth, textHeight = surface.GetTextSize(text)
local width, height = textWidth + SScaleMin(8 / 3), textHeight + SScaleMin( 8 / 3 )
-- background
surface.SetDrawColor(color)
surface.DrawRect(x, y, width, height)
-- text
surface.SetTextColor(color_white)
surface.SetTextPos(x + width * 0.5 - textWidth * 0.5, y + height * 0.5 - textHeight * 0.5)
surface.DrawText(text)
return width
end
function SKIN:DrawChatboxPrefixBox(panel, width, height)
local color = panel:GetBackgroundColor()
-- background
surface.SetDrawColor(color)
surface.DrawRect(0, 0, width, height)
-- outline
surface.SetDrawColor(color.r * 0.5, color.g * 0.5, color.b * 0.5, 255)
surface.DrawOutlinedRect(0, 0, width, height)
end
function SKIN:PaintChatboxAutocompleteEntry(panel, width, height)
-- selected background
if (panel.highlightAlpha > 0) then
self:DrawImportantBackground(0, 0, width, height, ColorAlpha(ix.config.Get("color"), panel.highlightAlpha * 66))
end
-- lower border
surface.SetDrawColor(200, 200, 200, 33)
surface.DrawRect(0, height - 1, width, 1)
end
function SKIN:PaintWindowMinimizeButton(panel, width, height)
end
function SKIN:PaintWindowMaximizeButton(panel, width, height)
end
do
-- check if sounds exist, otherwise fall back to default UI sounds
local bWhoosh = file.Exists("sound/helix/ui/whoosh1.wav", "GAME")
local bRollover = file.Exists("sound/helix/ui/rollover.wav", "GAME")
local bPress = file.Exists("sound/helix/ui/press.wav", "GAME")
local bNotify = file.Exists("sound/helix/ui/REPLACEME.wav", "GAME") -- @todo
sound.Add({
name = "Helix.Whoosh",
channel = CHAN_STATIC,
volume = 0.4,
level = 80,
pitch = bWhoosh and {90, 105} or 100,
sound = bWhoosh and {
"helix/ui/whoosh1.wav",
"helix/ui/whoosh2.wav",
"helix/ui/whoosh3.wav",
"helix/ui/whoosh4.wav",
"helix/ui/whoosh5.wav",
"helix/ui/whoosh6.wav"
} or ""
})
sound.Add({
name = "Helix.Rollover",
channel = CHAN_STATIC,
volume = 0.5,
level = 80,
pitch = {95, 105},
sound = bRollover and "helix/ui/rollover.wav" or "ui/buttonrollover.wav"
})
sound.Add({
name = "Helix.Press",
channel = CHAN_STATIC,
volume = 0.5,
level = 80,
pitch = bPress and {95, 110} or 100,
sound = bPress and "helix/ui/press.wav" or "ui/buttonclickrelease.wav"
})
sound.Add({
name = "Helix.Notify",
channel = CHAN_STATIC,
volume = 0.35,
level = 80,
pitch = 140,
sound = bNotify and "helix/ui/REPLACEME.wav" or "weapons/grenade/tick1.wav"
})
end
derma.RefreshSkins()

View File

@@ -0,0 +1,492 @@
--[[
| 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 PANEL = {}
AccessorFunc(PANEL, "money", "Money", FORCE_NUMBER)
function PANEL:Init()
self:DockPadding(1, 1, 1, 1)
self:SetTall(SScaleMin(64 / 3))
local textPanel = self:Add("EditablePanel")
textPanel:Dock(TOP)
textPanel:SetTall(SScaleMin(18 / 3))
self.moneyLabel = textPanel:Add("DLabel")
self.moneyLabel:SetFont("MenuFontNoClamp")
self.moneyLabel:SetText("")
self.moneyLabel:SetTextInset(SScaleMin(2 / 3), 0)
self.creditText = textPanel:Add("DLabel")
self.creditText:Dock(LEFT)
self.creditText:SetFont("MenuFontNoClamp")
self.creditText:SetText(string.utf8upper(" Żetonów"))
self.creditText:SetTextInset(SScaleMin(2 / 3), 0)
self.creditText:SizeToContents()
local amountPanel = self:Add("EditablePanel")
amountPanel:Dock(FILL)
amountPanel.Paint = function(this, w, h)
surface.SetDrawColor(35, 35, 35, 85)
surface.DrawRect(1, 1, w - 2, h - 2)
surface.SetDrawColor(80, 80, 80, 255)
surface.DrawOutlinedRect(1, 1, w - 2, h - 2)
end
self.amountEntry = amountPanel:Add("DTextEntry")
self.amountEntry:SetFont("MenuFontNoClamp")
self.amountEntry:Dock(FILL)
self.amountEntry:SetNumeric(true)
self.amountEntry:SetValue("0")
self.amountEntry.Paint = function(this, w, h)
this:DrawTextEntryText( Color(255, 255, 255, 255), this:GetHighlightColor(), this:GetCursorColor() )
end
self.transferButton = amountPanel:Add("DButton")
self.transferButton:SetFont("ixIconsMedium")
self.transferButton:Dock(LEFT)
self.transferButton:SetWide(SScaleMin(50 / 3))
self:SetLeft(false)
self.transferButton.DoClick = function()
local amount = math.max(0, math.Round(tonumber(self.amountEntry:GetValue()) or 0))
self.amountEntry:SetValue("0")
if (amount != 0) then
self:OnTransfer(amount)
end
end
self.bNoBackgroundBlur = true
self.transferButton.Paint = nil
end
function PANEL:SetLeft(bValue)
if (bValue) then
self.transferButton:Dock(RIGHT)
self.transferButton:SetText("t")
else
self.transferButton:Dock(LEFT)
self.amountEntry:DockMargin(SScaleMin(10 / 3), 0, 0, 0)
self.transferButton:SetText("s")
end
end
function PANEL:SetMoney(money)
self.money = math.max(math.Round(tonumber(money) or 0), 0)
self.moneyLabel:SetText(money)
self.moneyLabel:Dock(LEFT)
self.moneyLabel:SizeToContents()
self.moneyLabel:SetTextColor(Color(255, 204, 0, 255))
end
function PANEL:OnTransfer(amount)
end
vgui.Register("ixStorageMoney", PANEL, "EditablePanel")
DEFINE_BASECLASS("EditablePanel")
PANEL = {}
AccessorFunc(PANEL, "fadeTime", "FadeTime", FORCE_NUMBER)
AccessorFunc(PANEL, "frameMargin", "FrameMargin", FORCE_NUMBER)
AccessorFunc(PANEL, "storageID", "StorageID", FORCE_NUMBER)
local dividerWidth = SScaleMin(1920 / 3)
local dividerHeight = SScaleMin(1080 / 3)
local halfWidth = dividerWidth * 0.5
function PANEL:Init()
if (IsValid(ix.gui.openedStorage)) then
ix.gui.openedStorage:Remove()
end
ix.gui.openedStorage = self
self:SetSize(ScrW(), ScrH())
self:SetFadeTime(0.25)
self:SetFrameMargin(4)
local background = self:Add("EditablePanel")
background:SetSize(ScrW(), ScrH())
background.Paint = function(this, w, h)
surface.SetDrawColor(Color(63, 58, 115, 220))
surface.DrawRect(0, 0, w, h)
Derma_DrawBackgroundBlur( this, 1 )
end
background:MakePopup()
self.dividerPanel = background:Add("EditablePanel")
self.dividerPanel:SetSize(dividerWidth, dividerHeight)
self.dividerPanel:Center()
self.leftSide = self.dividerPanel:Add("EditablePanel")
self.leftSide:Dock(LEFT)
self.leftSide:SetSize(self.dividerPanel:GetWide() * 0.5, dividerHeight)
self.leftSide.Paint = function(this, w, h)
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
surface.DrawLine(w - 1, SScaleMin(50 / 3), w - 1, h)
end
self.storageIcon = self.dividerPanel:Add("DImage")
self.storageIcon:SetSize(SScaleMin(90 / 3), SScaleMin(90 / 3))
self.storageIcon:SetImage("willardnetworks/storage/icon.png")
self.storageIcon:Center()
local topbar = background:Add("EditablePanel")
topbar:SetSize(background:GetWide(), SScaleMin(50 / 3))
topbar:Dock(TOP)
topbar.Paint = function( this, w, h )
surface.SetDrawColor(0, 0, 0, 130)
surface.DrawRect(0, 0, w, h)
end
self.titleText = topbar:Add("DLabel")
self.titleText:SetFont("CharCreationBoldTitleNoClamp")
self.titleText:SetText("Zawartość schowka")
self.titleText:SetContentAlignment(5)
self.titleText:SizeToContents()
self.titleText:Center()
local exit = topbar:Add("DImageButton")
exit:SetImage("willardnetworks/tabmenu/navicons/exit.png")
exit:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3))
exit:DockMargin(0, SScaleMin(15 / 3), SScaleMin(20 / 3), SScaleMin(15 / 3))
exit:Dock(RIGHT)
exit.DoClick = function()
self:Remove()
surface.PlaySound("helix/ui/press.wav")
end
end
function PANEL:CreateContents(data, entity)
local isEquipSlots = data and data.vars and data.vars.equipSlots or false
self.storageInventory = self.dividerPanel:Add(isEquipSlots and "ixEquipSlots" or "ixInventory")
self.storageInventory.bNoBackgroundBlur = true
self.storageInventory:MoveToBack()
self.storageInventory.Close = function(this)
net.Start("ixStorageClose")
net.SendToServer()
self:Remove()
end
hook.Run("CreateStoreViewContents", self, data, entity)
if entity and IsValid(entity) then
if ix.plugin.list["inventoryslots"] and entity.GetCharacter then
if entity:GetCharacter() and ix.plugin.list["inventoryslots"].noEquipFactions[entity:GetCharacter():GetFaction()] then
self.storageInventory.isNoEquipFaction = true
end
end
end
if !isEquipSlots then
self.storageMoney = self.dividerPanel:Add("ixStorageMoney")
self.storageMoney:SetVisible(false)
self.storageMoney.OnTransfer = function(_, amount)
net.Start("ixStorageMoneyTake")
net.WriteUInt(self.storageID, 32)
net.WriteUInt(amount, 32)
net.SendToServer()
end
if (self.storageMoney.creditText) then
self.storageMoney.creditText:SetText(" ŻETONÓW W SCHOWKU")
self.storageMoney.creditText:SizeToContents()
self.storageMoney.creditText:Dock(LEFT)
end
end
ix.gui.inv1 = self.leftSide:Add("ixInventory")
ix.gui.inv1.bNoBackgroundBlur = true
ix.gui.inv1.Close = function(this)
net.Start("ixStorageClose")
net.SendToServer()
self:Remove()
end
ix.gui.equipSlots = self.leftSide:Add("ixEquipSlots")
self.localMoney = ix.gui.inv1:Add("ixStorageMoney")
self.localMoney:SetVisible(false)
self.localMoney:SetLeft(true)
self.localMoney.OnTransfer = function(_, amount)
net.Start("ixStorageMoneyGive")
net.WriteUInt(self.storageID, 32)
net.WriteUInt(amount, 32)
net.SendToServer()
end
self:SetAlpha(0)
self:AlphaTo(255, self:GetFadeTime())
end
function PANEL:Think()
if self.bagFrame and IsValid(self.bagFrame) then
self.bagFrame:MoveToFront()
end
end
function PANEL:OnChildAdded(panel)
panel:SetPaintedManually(true)
end
function PANEL:OnKeyCodePressed(key)
if (key == KEY_TAB and IsValid(self)) then
self:Remove()
end
end
function PANEL:SetLocalInventory(inventory)
if (IsValid(ix.gui.inv1) and !IsValid(ix.gui.menu)) then
ix.gui.inv1:SetInventory(inventory)
ix.gui.inv1:Center()
local x2, y2 = ix.gui.inv1:GetPos()
self.localMoney:Dock(NODOCK)
self.localMoney:SetWide(ix.gui.inv1:GetWide())
self.localMoney:SetPos(0, ix.gui.inv1:GetTall() + SScaleMin(10 / 3))
local padding = SScaleMin(10 / 3)
ix.gui.inv1.invTitleIcon = self.dividerPanel:Add("DImage")
ix.gui.inv1.invTitleIcon:SetImage("willardnetworks/tabmenu/navicons/inventory.png")
ix.gui.inv1.invTitleIcon:SetSize(SScaleMin(19 / 3), SScaleMin(17 / 3))
ix.gui.inv1.invTitleIcon:SetPos(x2, y2 - ix.gui.inv1.invTitleIcon:GetTall() - padding)
ix.gui.inv1.invTitle = self.dividerPanel:Add("DLabel")
ix.gui.inv1.invTitle:SetFont("TitlesFontNoClamp")
ix.gui.inv1.invTitle:SetText("Ekwipunek")
ix.gui.inv1.invTitle:SizeToContents()
ix.gui.inv1.invTitle:SetPos(x2 + SScaleMin(27 / 3), y2 - (ix.gui.inv1.invTitle:GetTall() * 0.8) - padding)
ix.gui.inv1:MoveToBack()
self.changeInv = self.dividerPanel:Add("DButton")
self.changeInv:SetFont("MenuFontNoClamp")
self.changeInv:SetText("WYŚWIETL WYPOSAŻENIE")
self.changeInv:SizeToContents()
self.changeInv:SetWide(self.changeInv:GetWide() + (padding * 2))
self.changeInv:SetPos(x2 + ix.gui.inv1:GetWide() - self.changeInv:GetWide(), y2 - (ix.gui.inv1.invTitle:GetTall() * 0.8) - padding)
self.changeInv.DoClick = function()
if !ix.gui.inv1 or ix.gui.inv1 and !IsValid(ix.gui.inv1) then return end
if !ix.gui.equipSlots or ix.gui.equipSlots and !IsValid(ix.gui.equipSlots) then return end
if ix.gui.inv1:IsVisible() then
ix.gui.inv1:SetVisible(false)
ix.gui.inv1.invTitleIcon:SetVisible(false)
ix.gui.inv1.invTitle:SetVisible(false)
ix.gui.equipSlots:SetVisible(true)
ix.gui.equipSlots.invTitleIcon:SetVisible(true)
ix.gui.equipSlots.invTitle:SetVisible(true)
local _, y3 = ix.gui.equipSlots:GetPos()
self.changeInv:SetText("WYŚWIETL EKWIPUNEK")
self.changeInv:SizeToContents()
self.changeInv:SetWide(self.changeInv:GetWide() + (padding * 2))
-- Get the new pos if we need the button in the alternate position
if (self.changeInv.altPos) then
x2, y2 = ix.gui.inv1:GetPos()
end
self.changeInv:SetPos(x2 + ix.gui.inv1:GetWide() - self.changeInv:GetWide(), y3 - (ix.gui.inv1.invTitle:GetTall() * 0.8) - padding)
else
ix.gui.equipSlots:SetVisible(false)
ix.gui.equipSlots.invTitleIcon:SetVisible(false)
ix.gui.equipSlots.invTitle:SetVisible(false)
ix.gui.inv1:SetVisible(true)
ix.gui.inv1.invTitleIcon:SetVisible(true)
ix.gui.inv1.invTitle:SetVisible(true)
self.changeInv:SetText("WYŚWIETL WYPOSAŻENIE")
self.changeInv:SizeToContents()
self.changeInv:SetWide(self.changeInv:GetWide() + (padding * 2))
-- Get the new pos if we need the button in the alternate position
if (self.changeInv.altPos) then
x2, y2 = ix.gui.inv1:GetPos()
end
self.changeInv:SetPos(x2 + ix.gui.inv1:GetWide() - self.changeInv:GetWide(), y2 - (ix.gui.inv1.invTitle:GetTall() * 0.8) - padding)
end
end
end
end
function PANEL:SetEquipInv(inventory)
if (IsValid(ix.gui.equipSlots) and !IsValid(ix.gui.menu)) then
ix.gui.equipSlots:SetInventory(inventory)
ix.gui.equipSlots:PaintParts()
ix.gui["inv" .. inventory.id] = ix.gui.equipSlots
ix.gui.equipSlots:Center()
local x2, y2 = ix.gui.equipSlots:GetPos()
local padding = SScaleMin(10 / 3)
ix.gui.equipSlots.invTitleIcon = self.dividerPanel:Add("DImage")
ix.gui.equipSlots.invTitleIcon:SetImage("willardnetworks/tabmenu/navicons/inventory.png")
ix.gui.equipSlots.invTitleIcon:SetSize(SScaleMin(19 / 3), SScaleMin(17 / 3))
ix.gui.equipSlots.invTitleIcon:SetPos(x2, y2 - ix.gui.equipSlots.invTitleIcon:GetTall() - padding)
ix.gui.equipSlots.invTitle = self.dividerPanel:Add("DLabel")
ix.gui.equipSlots.invTitle:SetFont("TitlesFontNoClamp")
ix.gui.equipSlots.invTitle:SetText("Wyposażenie")
ix.gui.equipSlots.invTitle:SizeToContents()
ix.gui.equipSlots.invTitle:SetPos(x2 + SScaleMin(27 / 3), y2 - (ix.gui.equipSlots.invTitle:GetTall() * 0.8) - padding)
ix.gui.equipSlots:MoveToBack()
ix.gui.equipSlots:SetVisible(false)
ix.gui.equipSlots.invTitleIcon:SetVisible(false)
ix.gui.equipSlots.invTitle:SetVisible(false)
end
end
function PANEL:SetLocalMoney(money)
if (!self.localMoney:IsVisible()) then
self.localMoney:SetVisible(true)
ix.gui.inv1:SetTall(ix.gui.inv1:GetTall() + self.localMoney:GetTall() + SScaleMin(10 / 3))
end
self.localMoney:SetMoney(money)
end
function PANEL:SetStorageTitle(title)
end
function PANEL:SetStorageInventory(inventory)
local isEquipSlots = inventory and inventory.vars and inventory.vars.equipSlots or false
local isStash = inventory and inventory.vars and inventory.vars.isStash or false
local isBag = inventory and inventory.vars and inventory.vars.noEquipInv or false
local isCardDeck = inventory and inventory.w == 13 and inventory.h == 4 and true or false -- I know this is dumb, but helix has forced my hand.
self.storageInventory:SetInventory(inventory)
if (isEquipSlots) then
self.storageInventory:PaintParts()
if self.changeInv then self.changeInv:SetVisible(false) end
end
self.storageInventory:SetPos(halfWidth + (halfWidth * (isCardDeck and 0.335 or 0.5)) - self.storageInventory:GetWide() * 0.5, dividerHeight * 0.5 - self.storageInventory:GetTall() * 0.5)
if (!isEquipSlots) then
local x2, y2 = self.storageInventory:GetPos()
self.storageMoney:Dock(NODOCK)
self.storageMoney:SetWide(self.storageInventory:GetWide())
self.storageMoney:SetPos(x2, y2 + self.storageInventory:GetTall() + SScaleMin(10 / 3))
end
if (isCardDeck) then -- Force some things to move around.
self.leftSide:SetSize(self.dividerPanel:GetWide() * 0.335, dividerHeight)
ix.gui.inv1:Center()
ix.gui.equipSlots:Center()
local x2, y2 = ix.gui.inv1:GetPos()
local padding = SScaleMin(10 / 3)
ix.gui.inv1.invTitleIcon:SetPos(x2, y2 - ix.gui.inv1.invTitleIcon:GetTall() - padding)
ix.gui.inv1.invTitle:SetPos(x2 + SScaleMin(27 / 3), y2 - (ix.gui.inv1.invTitle:GetTall() * 0.8) - padding)
self.changeInv.altPos = true
self.changeInv:SetPos(x2 + ix.gui.inv1:GetWide() - self.changeInv:GetWide(), y2 - (ix.gui.inv1.invTitle:GetTall() * 0.8) - padding)
x2, y2 = ix.gui.equipSlots:GetPos()
ix.gui.equipSlots.invTitleIcon:SetPos(x2, y2 - ix.gui.equipSlots.invTitleIcon:GetTall() - padding)
ix.gui.equipSlots.invTitle:SetPos(x2 + SScaleMin(27 / 3), y2 - (ix.gui.equipSlots.invTitle:GetTall() * 0.8) - padding)
self.storageIcon:SetX(self.dividerPanel:GetWide() * 0.335 - (SScaleMin(90 / 3) * 0.5))
end
local x, y = self.storageInventory:GetPos()
local padding = SScaleMin(10 / 3)
local invTitleIcon = self.dividerPanel:Add("DImage")
invTitleIcon:SetImage("willardnetworks/mainmenu/content.png")
invTitleIcon:SetSize(SScaleMin(16 / 3), SScaleMin(16 / 3))
invTitleIcon:SetPos(x, y - invTitleIcon:GetTall() - padding)
local invTitle = self.dividerPanel:Add("DLabel")
invTitle:SetFont("TitlesFontNoClamp")
invTitle:SetText("Schowek")
invTitle:SizeToContents()
invTitle:SetPos(x + SScaleMin(27 / 3), y - (invTitle:GetTall() * 0.8) - padding)
ix.gui["inv" .. inventory:GetID()] = self.storageInventory
if (inventory.owner and !isStash and !isBag) then
self.changeStorageInv = self.dividerPanel:Add("DButton")
self.changeStorageInv:SetFont("MenuFontNoClamp")
self.changeStorageInv:SetText(!isEquipSlots and "WYŚWIETL WYPOSAŻENIE" or "WYŚWIETL EKWIPUNEK")
self.changeStorageInv:SizeToContents()
self.changeStorageInv:SetWide(self.changeStorageInv:GetWide() + (padding * 2))
self.changeStorageInv:SetPos(x + self.storageInventory:GetWide() - self.changeStorageInv:GetWide(), y - (invTitle:GetTall() * 0.8) - padding)
self.changeStorageInv.DoClick = function()
if (!IsValid(ix.gui.menu)) then
self.shouldntRunStorage = true
BaseClass.Remove(self)
self.storageInventory:Remove()
ix.gui.inv1:Remove()
net.Start("ixSwitchPlayerInv")
net.SendToServer()
end
end
end
end
function PANEL:SetStorageMoney(money)
if !self.storageMoney then return end
if (!self.storageMoney:IsVisible()) then
self.storageMoney:SetVisible(true)
self.storageInventory:SetTall(self.storageInventory:GetTall() + self.storageMoney:GetTall() + SScaleMin(2 / 3))
end
self.storageMoney:SetMoney(money)
end
function PANEL:Paint(width, height)
ix.util.DrawBlurAt(0, 0, width, height)
for _, v in ipairs(self:GetChildren()) do
v:PaintManual()
end
end
function PANEL:Remove()
self:SetAlpha(255)
self:AlphaTo(0, self:GetFadeTime(), 0, function()
BaseClass.Remove(self)
end)
end
function PANEL:OnRemove()
if (!IsValid(ix.gui.menu) and !self.shouldntRunStorage) then
self.storageInventory:Remove()
ix.gui.inv1:Remove()
net.Start("ixStorageClose")
net.SendToServer()
end
end
vgui.Register("ixStorageView", PANEL, "EditablePanel")

View File

@@ -0,0 +1,314 @@
--[[
| 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 DEFAULT_PADDING = 0
local DEFAULT_ANIMATION_TIME = 1
local DEFAULT_SUBPANEL_ANIMATION_TIME = 0.5
-- parent subpanel
local PANEL = {}
function PANEL:Init()
self:SetSize(ScrW(), ScrH())
end
function PANEL:SetTitle(text, bNoTranslation, bNoUpper)
if (text == nil) then
if (IsValid(self.title)) then
self.title:Remove()
end
return
elseif (!IsValid(self.title)) then
self.title = self:Add("DLabel")
self.title:SetFont("ixTitleFont")
self.title:SizeToContents()
self.title:SetTextColor(ix.config.Get("color") or color_white)
end
local newText = bNoTranslation and text or L(text)
newText = bNoUpper and newText or newText:utf8upper()
self.title:SetText(newText)
self.title:SizeToContents()
end
function PANEL:SetLeftPanel(panel)
self.left = panel
end
function PANEL:GetLeftPanel()
return self.left
end
function PANEL:SetRightPanel(panel)
self.right = panel
end
function PANEL:GetRightPanel()
return self.right
end
function PANEL:OnSetActive()
end
vgui.Register("ixSubpanel", PANEL, "EditablePanel")
-- subpanel parent
DEFINE_BASECLASS("EditablePanel")
PANEL = {}
AccessorFunc(PANEL, "padding", "Padding", FORCE_NUMBER)
AccessorFunc(PANEL, "animationTime", "AnimationTime", FORCE_NUMBER)
AccessorFunc(PANEL, "subpanelAnimationTime", "SubpanelAnimationTime", FORCE_NUMBER)
AccessorFunc(PANEL, "leftOffset", "LeftOffset", FORCE_NUMBER)
function PANEL:Init()
self.subpanels = {}
self.childPanels = {}
self.currentSubpanelX = DEFAULT_PADDING
self.targetSubpanelX = DEFAULT_PADDING
self.padding = 0
self.leftOffset = 0
self.animationTime = DEFAULT_ANIMATION_TIME
self.subpanelAnimationTime = DEFAULT_SUBPANEL_ANIMATION_TIME
end
function PANEL:SetPadding(amount, bSetDockPadding)
self.currentSubpanelX = amount
self.targetSubpanelX = amount
self.padding = 0
if (bSetDockPadding) then
self:DockPadding(0, 0, 0, 0)
end
end
function PANEL:Add(name)
local panel = BaseClass.Add(self, name)
if (panel.SetPaintedManually) then
panel:SetPaintedManually(true)
self.childPanels[#self.childPanels + 1] = panel
end
return panel
end
function PANEL:AddSubpanel(name)
local id = #self.subpanels + 1
local panel = BaseClass.Add(self, "ixSubpanel")
panel.subpanelName = name
panel.subpanelID = id
panel:SetTitle(name)
self.subpanels[id] = panel
self:SetupSubpanelReferences()
return panel
end
function PANEL:SetupSubpanelReferences()
local lastPanel
for i = 1, #self.subpanels do
local panel = self.subpanels[i]
local nextPanel = self.subpanels[i + 1]
if (IsValid(lastPanel)) then
lastPanel:SetRightPanel(panel)
panel:SetLeftPanel(lastPanel)
end
if (IsValid(nextPanel)) then
panel:SetRightPanel(nextPanel)
end
lastPanel = panel
end
end
function PANEL:SetSubpanelPos(id, x)
local currentPanel = self.subpanels[id]
if (!currentPanel) then
return
end
local paddingW = (ScrW() - currentPanel:GetWide()) / 2
local topPushDown = ScreenScale(75 / 3)
if currentPanel.avoidPadding != true then
currentPanel:SetPos(paddingW, topPushDown)
end
local _, oldY = currentPanel:GetPos()
currentPanel:SetPos(x, oldY)
-- traverse left
while (IsValid(currentPanel)) do
local left = currentPanel:GetLeftPanel()
if (IsValid(left)) then
left:MoveLeftOf(currentPanel, self.padding + self.leftOffset)
end
currentPanel = left
end
currentPanel = self.subpanels[id]
-- traverse right
while (IsValid(currentPanel)) do
local right = currentPanel:GetRightPanel()
if (IsValid(right)) then
right:MoveRightOf(currentPanel, self.padding)
end
currentPanel = right
end
end
function PANEL:SetActiveSubpanel(id, length)
if (isstring(id)) then
for i = 1, #self.subpanels do
if (self.subpanels[i].subpanelName == id) then
id = i
break
end
end
end
local activePanel = self.subpanels[id]
if (!activePanel) then
return false
end
if (length == 0 or !self.activeSubpanel) then
self:SetSubpanelPos(id, self.padding + self.leftOffset)
else
local x, _ = activePanel:GetPos()
local target = self.targetSubpanelX + self.leftOffset
self.currentSubpanelX = x + self.padding + self.leftOffset
self:CreateAnimation(length or self.subpanelAnimationTime, {
index = 420,
target = {currentSubpanelX = target},
easing = "outQuint",
Think = function(animation, panel)
panel:SetSubpanelPos(id, panel.currentSubpanelX)
end,
OnComplete = function(animation, panel)
panel:SetSubpanelPos(id, target)
end
})
end
self.activeSubpanel = id
activePanel:OnSetActive()
return true
end
function PANEL:GetSubpanel(id)
return self.subpanels[id]
end
function PANEL:GetActiveSubpanel()
return self.subpanels[self.activeSubpanel]
end
function PANEL:GetActiveSubpanelID()
return self.activeSubpanel
end
function PANEL:Slide(direction, length, callback, bIgnoreConfig)
local _, height = self:GetParent():GetSize()
local x, _ = self:GetPos()
local targetY = direction == "up" and 0 or height
self:SetVisible(true)
if (length == 0) then
self:SetPos(x, targetY)
else
length = length or self.animationTime
self.currentY = direction == "up" and height or 0
self:CreateAnimation(length or self.animationTime, {
index = -1,
target = {currentY = targetY},
easing = "outExpo",
bIgnoreConfig = bIgnoreConfig,
Think = function(animation, panel)
local currentX, _ = panel:GetPos()
panel:SetPos(currentX, panel.currentY)
end,
OnComplete = function(animation, panel)
if (direction == "down") then
panel:SetVisible(false)
end
if (callback) then
callback(panel)
end
end
})
end
end
function PANEL:SlideUp(...)
self:SetMouseInputEnabled(true)
self:SetKeyboardInputEnabled(true)
self:OnSlideUp()
self:Slide("up", ...)
end
function PANEL:SlideDown(...)
self:SetMouseInputEnabled(false)
self:SetKeyboardInputEnabled(false)
self:OnSlideDown()
self:Slide("down", ...)
end
function PANEL:OnSlideUp()
end
function PANEL:OnSlideDown()
end
function PANEL:Paint(width, height)
for i = 1, #self.childPanels do
self.childPanels[i]:PaintManual()
end
end
function PANEL:PaintSubpanels(width, height)
for i = 1, #self.subpanels do
self.subpanels[i]:PaintManual()
end
end
-- ????
PANEL.Remove = BaseClass.Remove
vgui.Register("ixSubpanelParent", PANEL, "EditablePanel")

View File

@@ -0,0 +1,603 @@
--[[
| 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/
--]]
--- Text container for `ixTooltip`.
-- Rows are the main way of interacting with `ixTooltip`s. These derive from
-- [DLabel](https://wiki.garrysmod.com/page/Category:DLabel) panels, which means that making use of this panel
-- will be largely the same as any DLabel panel.
-- @panel ixTooltipRow
local animationTime = 1
-- panel meta
do
local PANEL = FindMetaTable("Panel")
local ixChangeTooltip = ChangeTooltip
local ixRemoveTooltip = RemoveTooltip
local tooltip
local lastHover
function PANEL:SetHelixTooltip(callback)
self:SetMouseInputEnabled(true)
self.ixTooltip = callback
end
function ChangeTooltip(panel, ...) -- luacheck: globals ChangeTooltip
if (!panel.ixTooltip) then
return ixChangeTooltip(panel, ...)
end
RemoveTooltip()
timer.Create("ixTooltip", 0.1, 1, function()
if (!IsValid(panel) or lastHover != panel) then
return
end
tooltip = vgui.Create("ixTooltip")
panel.ixTooltip(tooltip)
tooltip:SizeToContents()
end)
lastHover = panel
end
function RemoveTooltip() -- luacheck: globals RemoveTooltip
if (IsValid(tooltip)) then
tooltip:Remove()
tooltip = nil
end
timer.Remove("ixTooltip")
lastHover = nil
return ixRemoveTooltip()
end
end
DEFINE_BASECLASS("DLabel")
local PANEL = {}
AccessorFunc(PANEL, "backgroundColor", "BackgroundColor")
AccessorFunc(PANEL, "maxWidth", "MaxWidth", FORCE_NUMBER)
AccessorFunc(PANEL, "bNoMinimal", "MinimalHidden", FORCE_BOOL)
function PANEL:Init()
self:SetFont("ixSmallFont")
self:SetText(L("unknown"))
self:SetTextColor(color_white)
self:SetTextInset(15, 0)
self:SetContentAlignment(4)
self:Dock(TOP)
self.maxWidth = ScrW() * 0.2
self.bNoMinimal = false
self.bMinimal = false
end
--- Whether or not this tooltip row should be displayed in a minimal format. This usually means no background and/or
-- smaller font. You probably won't need this if you're using regular `ixTooltipRow` panels, but you should take into
-- account if you're creating your own panels that derive from `ixTooltipRow`.
-- @realm client
-- @treturn bool True if this tooltip row should be displayed in a minimal format
function PANEL:IsMinimal()
return self.bMinimal
end
--- Sets this row to be more prominent with a larger font and more noticable background color. This should usually
-- be used once per tooltip as a title row. For example, item tooltips have one "important" row consisting of the
-- item's name. Note that this function is a fire-and-forget function; you cannot revert a row back to it's regular state
-- unless you set the font/colors manually.
-- @realm client
function PANEL:SetImportant()
self:SetFont("TitlesFontNoClamp")
self:SetBackgroundColor(ix.config.Get("color"))
end
--- Sets the background color of this row. This should be used sparingly to avoid overwhelming players with a
-- bunch of different colors that could convey different meanings.
-- @realm client
-- @color color New color of the background. The alpha is clamped to 100-255 to ensure visibility
function PANEL:SetBackgroundColor(color)
color = table.Copy(color)
color.a = math.min(color.a or 255, 100)
self.backgroundColor = color
end
--- Resizes this panel to fit its contents. This should be called after setting the text.
-- @realm client
function PANEL:SizeToContents()
local contentWidth, contentHeight = self:GetContentSize()
contentWidth = contentWidth
contentHeight = contentHeight
if (contentWidth > self.maxWidth) then
self:SetWide(self.maxWidth - 15) -- to account for text inset
self:SetTextInset(15, 0)
self:SetWrap(true)
self:SizeToContentsY()
self:SetWide(self:GetContentSize() + 15)
else
self:SetSize(contentWidth + 15, contentHeight + 15)
end
end
--- Resizes the height of this panel to fit its contents.
-- @internal
-- @realm client
function PANEL:SizeToContentsY()
BaseClass.SizeToContentsY(self)
self:SetTall(self:GetTall() + 15)
end
--- Called when the background of this row should be painted. This will paint the background with the
-- `DrawImportantBackground` function set in the skin by default.
-- @realm client
-- @number width Width of the panel
-- @number height Height of the panel
function PANEL:PaintBackground(width, height)
if (self.backgroundColor) then
derma.SkinFunc("DrawImportantBackground", 0, 0, width, height, self.backgroundColor)
end
end
--- Called when the foreground of this row should be painted. If you are overriding this in a subclassed panel,
-- make sure you call `ixTooltipRow:PaintBackground` at the *beginning* of your function to make its style
-- consistent with the rest of the framework.
-- @realm client
-- @number width Width of the panel
-- @number height Height of the panel
function PANEL:Paint(width, height)
self:PaintBackground(width, height)
end
vgui.Register("ixTooltipRow", PANEL, "DLabel")
--- Generic information panel.
-- Tooltips are used extensively throughout Helix: for item information, character displays, entity status, etc.
-- The tooltip system can be used on any panel or entity you would like to show standardized information for. Tooltips
-- consist of the parent container panel (`ixTooltip`), which is filled with rows of information (usually
-- `ixTooltipRow`, but can be any docked panel if non-text information needs to be shown, like an item's size).
--
-- Tooltips can be added to panel with `panel:SetHelixTooltip()`. An example taken from the scoreboard:
-- panel:SetHelixTooltip(function(tooltip)
-- local name = tooltip:AddRow("name")
-- name:SetImportant()
-- name:SetText(client:SteamName())
-- name:SetBackgroundColor(team.GetColor(client:Team()))
-- name:SizeToContents()
--
-- tooltip:SizeToContents()
-- end)
-- @panel ixTooltip
DEFINE_BASECLASS("Panel")
PANEL = {}
AccessorFunc(PANEL, "entity", "Entity")
AccessorFunc(PANEL, "mousePadding", "MousePadding", FORCE_NUMBER)
AccessorFunc(PANEL, "bDrawArrow", "DrawArrow", FORCE_BOOL)
AccessorFunc(PANEL, "arrowColor", "ArrowColor")
AccessorFunc(PANEL, "bHideArrowWhenRaised", "HideArrowWhenRaised", FORCE_BOOL)
AccessorFunc(PANEL, "bArrowFollowEntity", "ArrowFollowEntity", FORCE_BOOL)
function PANEL:Init()
self.fraction = 0
self.mousePadding = 16
self.arrowColor = ix.config.Get("color")
self.bHideArrowWhenRaised = true
self.bArrowFollowEntity = true
self.bMinimal = false
self.lastX, self.lastY = self:GetCursorPosition()
self.arrowX, self.arrowY = ScrW() * 0.5, ScrH() * 0.5
self:SetAlpha(0)
self:SetSize(0, 0)
self:SetDrawOnTop(true)
self:CreateAnimation(animationTime, {
index = 1,
target = {fraction = 1},
easing = "outQuint",
Think = function(animation, panel)
panel:SetAlpha(panel.fraction * 255)
end
})
end
--- Whether or not this tooltip should be displayed in a minimal format.
-- @realm client
-- @treturn bool True if this tooltip should be displayed in a minimal format
-- @see ixTooltipRow:IsMinimal
function PANEL:IsMinimal()
return self.bMinimal
end
-- ensure all children are painted manually
function PANEL:Add(...)
local panel = BaseClass.Add(self, ...)
panel:SetPaintedManually(true)
return panel
end
--- Creates a new `ixTooltipRow` panel and adds it to the bottom of this tooltip.
-- @realm client
-- @string id Name of the new row. This is used to reorder rows if needed
-- @treturn panel Created row
function PANEL:AddRow(id)
local panel = self:Add("ixTooltipRow")
panel.id = id
panel:SetZPos(#self:GetChildren() * 10)
return panel
end
--- Creates a new `ixTooltipRow` and adds it after the row with the given `id`. The order of the rows is set via
-- setting the Z position of the panels, as this is how VGUI handles ordering with docked panels.
-- @realm client
-- @string after Name of the row to insert after
-- @string id Name of the newly created row
-- @treturn panel Created row
function PANEL:AddRowAfter(after, id)
local panel = self:AddRow(id)
after = self:GetRow(after)
if (!IsValid(after)) then
return panel
end
panel:SetZPos(after:GetZPos() + 1)
return panel
end
--- Sets the entity associated with this tooltip. Note that this function is not how you get entities to show tooltips.
-- @internal
-- @realm client
-- @entity entity Entity to associate with this tooltip
function PANEL:SetEntity(entity)
if (!IsValid(entity)) then
self.bEntity = false
return
end
-- don't show entity tooltips if we have an entity menu open
if (IsValid(ix.menu.panel)) then
self:Remove()
return
end
if (entity:IsPlayer()) then
local character = entity:GetCharacter()
if (character) then
-- we want to group things that will most likely have backgrounds (e.g name/health status)
hook.Run("PopulateImportantCharacterInfo", entity, character, self)
hook.Run("PopulateCharacterInfo", entity, character, self)
end
else
if (entity.OnPopulateEntityInfo) then
entity:OnPopulateEntityInfo(self)
else
hook.Run("PopulateEntityInfo", entity, self)
end
end
self:SizeToContents()
self.entity = entity
self.bEntity = true
end
function PANEL:PaintUnder(width, height)
end
function PANEL:Paint(width, height)
self:PaintUnder()
-- directional arrow
self.bRaised = LocalPlayer():IsWepRaised()
if (!self.bClosing) then
if (self.bEntity and IsValid(self.entity) and self.bArrowFollowEntity) then
local entity = self.entity
local position = select(1, entity:GetBonePosition(entity:LookupBone("ValveBiped.Bip01_Spine") or -1)) or
entity:LocalToWorld(entity:OBBCenter())
position = position:ToScreen()
self.arrowX = math.Clamp(position.x, 0, ScrW())
self.arrowY = math.Clamp(position.y, 0, ScrH())
end
end
-- arrow
if (self.bDrawArrow or (self.bDrawArrow and self.bRaised and !self.bHideArrowWhenRaised)) then
local x, y = self:ScreenToLocal(self.arrowX, self.arrowY)
DisableClipping(true)
surface.SetDrawColor(self.arrowColor)
surface.DrawLine(0, 0, x * self.fraction, y * self.fraction)
surface.DrawRect((x - 2) * self.fraction, (y - 2) * self.fraction, 15, 15)
DisableClipping(false)
end
-- contents
local x, y = self:GetPos()
render.SetScissorRect(x, y, x + width * self.fraction, y + height, true)
derma.SkinFunc("PaintTooltipBackground", self, width, height)
for _, v in ipairs(self:GetChildren()) do
if (IsValid(v)) then
v:PaintManual()
end
end
render.SetScissorRect(0, 0, 0, 0, false)
end
--- Returns the current position of the mouse cursor on the screen.
-- @realm client
-- @treturn number X position of cursor
-- @treturn number Y position of cursor
function PANEL:GetCursorPosition()
local width, height = self:GetSize()
local mouseX, mouseY = gui.MousePos()
return math.Clamp(mouseX + self.mousePadding, 0, ScrW() - width), math.Clamp(mouseY, 0, ScrH() - height)
end
function PANEL:Think()
if (!self.bEntity) then
if (!vgui.CursorVisible()) then
self:SetPos(self.lastX, self.lastY)
-- if the cursor isn't visible then we don't really need the tooltip to be shown
if (!self.bClosing) then
self:Remove()
end
else
local newX, newY = self:GetCursorPosition()
self:SetPos(newX, newY)
self.lastX, self.lastY = newX, newY
end
self:MoveToFront() -- dragging a panel w/ tooltip will push the tooltip beneath even the menu panel(???)
elseif (IsValid(self.entity) and !self.bClosing) then
if (self.bRaised) then
self:SetPos(
ScrW() * 0.5 - self:GetWide() * 0.5,
math.min(ScrH() * 0.5 + self:GetTall() + 32, ScrH() - self:GetTall())
)
else
local entity = self.entity
local min, max = entity:GetRotatedAABB(entity:OBBMins() * 0.5, entity:OBBMaxs() * 0.5)
min = entity:LocalToWorld(min):ToScreen().x
max = entity:LocalToWorld(max):ToScreen().x
self:SetPos(
math.Clamp(math.max(min, max), ScrW() * 0.5 + 32, ScrW() * 0.66 - self:GetWide()),
ScrH() * 0.5 - self:GetTall() * 0.5
)
end
end
end
--- Returns an `ixTooltipRow` corresponding to the given name.
-- @realm client
-- @string id Name of the row
-- @treturn[1] panel Corresponding row
-- @treturn[2] nil If the row doesn't exist
function PANEL:GetRow(id)
for _, v in ipairs(self:GetChildren()) do
if (IsValid(v) and v.id == id) then
return v
end
end
end
--- Resizes the tooltip to fit all of the child panels. You should always call this after you are done
-- adding all of your rows.
-- @realm client
function PANEL:SizeToContents()
local height = 0
local width = 0
for _, v in ipairs(self:GetChildren()) do
if (v:GetWide() > width) then
width = v:GetWide()
end
height = height + v:GetTall()
end
self:SetSize(width, height)
end
function PANEL:Remove()
if (self.bClosing) then
return
end
self.bClosing = true
self:CreateAnimation(animationTime * 0.5, {
target = {fraction = 0},
easing = "outQuint",
Think = function(animation, panel)
panel:SetAlpha(panel.fraction * 255)
end,
OnComplete = function(animation, panel)
BaseClass.Remove(panel)
end
})
end
vgui.Register("ixTooltip", PANEL, "Panel")
-- legacy tooltip row
PANEL = {}
function PANEL:Init()
self.bMinimal = true
self.ixAlpha = 0 -- to avoid conflicts if we're animating a non-tooltip panel
self:SetExpensiveShadow(1, color_black)
self:SetContentAlignment(5)
end
function PANEL:SetImportant()
self:SetFont("ixMinimalTitleFont")
self:SetBackgroundColor(ix.config.Get("color"))
end
-- background color will affect text instead in minimal tooltips
function PANEL:SetBackgroundColor(color)
color = table.Copy(color)
color.a = math.min(color.a or 255, 100)
self:SetTextColor(color)
self.backgroundColor = color
end
function PANEL:PaintBackground()
end
vgui.Register("ixTooltipMinimalRow", PANEL, "ixTooltipRow")
-- legacy tooltip
DEFINE_BASECLASS("ixTooltip")
PANEL = {}
function PANEL:Init()
self.bMinimal = true
-- we don't want to animate the alpha since children will handle their own animation, but we want to keep the fraction
-- for the background to animate
self:CreateAnimation(animationTime, {
index = 1,
target = {fraction = 1},
easing = "outQuint",
})
self:SetAlpha(255)
end
-- we don't need the children to be painted manually
function PANEL:Add(...)
local panel = BaseClass.Add(self, ...)
panel:SetPaintedManually(false)
return panel
end
function PANEL:AddRow(id)
local panel = self:Add("ixTooltipMinimalRow")
panel.id = id
panel:SetZPos(#self:GetChildren() * 10)
return panel
end
function PANEL:Paint(width, height)
self:PaintUnder()
derma.SkinFunc("PaintTooltipMinimalBackground", self, width, height)
end
function PANEL:Think()
end
function PANEL:SizeToContents()
-- remove any panels that shouldn't be shown in a minimal tooltip
for _, v in ipairs(self:GetChildren()) do
if (v.bNoMinimal) then
v:Remove()
end
end
BaseClass.SizeToContents(self)
self:SetPos(ScrW() * 0.5 - self:GetWide() * 0.5, ScrH() * 0.5 + self.mousePadding)
-- we create animation here since this is the only function that usually gets called after all the rows are populated
local children = self:GetChildren()
-- sort by z index so we can animate them in order
table.sort(children, function(a, b)
return a:GetZPos() < b:GetZPos()
end)
local i = 1
local count = table.Count(children)
for _, v in ipairs(children) do
v.ixAlpha = v.ixAlpha or 0
v:CreateAnimation((animationTime / count) * i, {
easing = "inSine",
target = {ixAlpha = 255},
Think = function(animation, panel)
panel:SetAlpha(panel.ixAlpha)
end
})
i = i + 1
end
end
DEFINE_BASECLASS("Panel")
function PANEL:Remove()
if (self.bClosing) then
return
end
self.bClosing = true
-- we create animation here since this is the only function that usually gets called after all the rows are populated
local children = self:GetChildren()
-- sort by z index so we can animate them in order
table.sort(children, function(a, b)
return a:GetZPos() > b:GetZPos()
end)
local duration = animationTime * 0.5
local i = 1
local count = table.Count(children)
for _, v in ipairs(children) do
v.ixAlpha = v.ixAlpha or 255
v:CreateAnimation(duration / count * i, {
target = {ixAlpha = 0},
Think = function(animation, panel)
panel:SetAlpha(panel.ixAlpha)
end
})
i = i + 1
end
self:CreateAnimation(duration, {
target = {fraction = 0},
OnComplete = function(animation, panel)
BaseClass.Remove(panel)
end
})
end
vgui.Register("ixTooltipMinimal", PANEL, "ixTooltip")

View File

@@ -0,0 +1,354 @@
--[[
| 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 CREDITS = {
{"Atle", "76561198002319944", {"Project Manager", "Concept Art" }},
{"Votton", "76561198052727595", {"Development Manager", "Digital Archon"}},
{"M!NT", "76561198201768255", {"Lead Developer", "Lua Archmage"}},
{"Fruity", "76561198068753895", {"UI Developer", "3D Modeling"}},
{"Aspect", "76561198251001690", {"Developer", "Speedy Development"}},
{"Gr4Ss", "76561197997384060", {"Developer", "Lua Magician"}},
{"Naast", "76561198380784421", {"Developer", "3D2D Magician"}},
{"Robert", "76561198032327315", {"Developer", "Spreadsheet Magician"}},
{"Mango", "76561199049344428", {"Developer", "Gamer Cat"}},
{"Geferon", "76561198026760063", {"Developer"}},
{"Whitehole", "76561198034272701", {"Developer"}},
{"gb", "76561198125119997", {"developer", "hater of upper case letters"}},
{"Hiros", "76561198068403371", {"Jr. Developer", "Fish"}},
{"Asimo", "76561198077477334", {"Jr. Developer", "Balance Schizo"}},
{"Hayden", "76561198004342461", {"Jr. Developer", "'Idiot'"}},
{"AleXXX_007", "76561198050171407", {"Freelance Developer"}},
{"LegAz ", "76561198080318117", {"Freelance Developer"}},
{"Kawasaniac", "76561198399653717", {"3D Modeling", "Cat Update"}},
{"Adi", "76561198138418837", {"3D Modeling"}},
{"Lurondor", "76561198088832581", {"3D Modeling"}},
}
local SPECIALS = {
{
{"LORD-RAD-X", "76561197986444716"},
{"Rabithunter", "76561198005055437"},
{"DeNuke", "76561198009096978"},
},
{
{"Kena", "76561198186266199"},
{"Legion", "76561198108804650"},
{"Pixel", "76561198112973827"}
}
}
local MISC = {
{"Community Support", "Our deep gratitude and thanks for all the support from the WN community!"},
}
local url = "https://willard.network/"
local padding = SScaleMin(32 / 3)
-- logo
local PANEL = {}
function PANEL:Init()
self:SetTall(SScaleMin(230 / 3))
self:Dock(TOP)
self:DockMargin(0, SScaleMin(30 / 3), 0, 0)
end
function PANEL:Paint(width, height)
local curTime = CurTime()
surface.SetDrawColor(Color(255, 255, 255, 255))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_base.png"))
surface.DrawTexturedRect(width * 0.5 - SScaleMin(195 / 3) * 0.5, height * 0.5 - SScaleMin(196 / 3) * 0.5, SScaleMin(195 / 3), SScaleMin(196 / 3))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_circle1.png"))
surface.DrawTexturedRectRotated((width * 0.5) + 2, (height * 0.5) - 2, SScaleMin(195 / 3), SScaleMin(196 / 3), curTime * -15)
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_circle2.png"))
surface.DrawTexturedRectRotated((width * 0.5) - 2, (height * 0.5) + 2, SScaleMin(195 / 3), SScaleMin(196 / 3), curTime * -15)
end
vgui.Register("ixWillardCreditsLogo", PANEL, "Panel")
-- logo
local PANEL = {}
function PANEL:Init()
self:SetTall(SScaleMin(230 / 3))
self:Dock(TOP)
self:DockMargin(0, SScaleMin(30 / 3), 0, 0)
end
function PANEL:Paint(width, height)
local curTime = CurTime()
surface.SetDrawColor(color_white)
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_base_new.png"))
surface.DrawTexturedRect(width * 0.5 - SScaleMin(69 / 3) * 0.5, height * 0.5 - SScaleMin(59 / 3) * 0.5, SScaleMin(69 / 3), SScaleMin(59 / 3))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_circle1_new.png"))
surface.DrawTexturedRectRotated((width * 0.5) + 2, (height * 0.5) - 2, SScaleMin(125 / 3), SScaleMin(122 / 3), curTime * -15)
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_circle2_new.png"))
surface.DrawTexturedRectRotated((width * 0.5) - 2, (height * 0.5) + 2, SScaleMin(125 / 3), SScaleMin(122 / 3), curTime * -15)
end
vgui.Register("ixWillardCreditsLogoSmall", PANEL, "Panel")
-- nametag
PANEL = {}
function PANEL:Init()
self.name = self:Add("DLabel")
self.name:SetFont("WNSmallerMenuTitleNoBoldNoClamp")
self.avatar = self:Add("AvatarImage")
end
function PANEL:SetName(name)
self.name:SetText(name)
end
function PANEL:SetAvatar(steamid)
self.avatar:SetSteamID(steamid, SScaleMin(64 / 3))
end
function PANEL:PerformLayout(width, height)
self.name:SetPos(width - self.name:GetWide(), 0)
self.avatar:MoveLeftOf(self.name, padding * 0.5)
end
function PANEL:SizeToContents()
self.name:SizeToContents()
local tall = self.name:GetTall()
self.avatar:SetSize(tall, tall)
self:SetSize(self.name:GetWide() + self.avatar:GetWide() + padding * 0.5, self.name:GetTall())
end
vgui.Register("ixCreditsNametag", PANEL, "Panel")
-- name row
PANEL = {}
function PANEL:Init()
self:DockMargin(0, padding, 0, 0)
self:Dock(TOP)
self.nametag = self:Add("ixCreditsNametag")
self.tags = self:Add("DLabel")
self.tags:SetFont("TitlesFontNoBoldNoClamp")
self:SizeToContents()
end
function PANEL:SetName(name)
self.nametag:SetName(name)
end
function PANEL:SetAvatar(steamid)
self.nametag:SetAvatar(steamid)
end
function PANEL:SetTags(tags)
for i = 1, #tags do
tags[i] = L(tags[i])
end
self.tags:SetText(table.concat(tags, "\n"))
end
function PANEL:Paint(width, height)
surface.SetDrawColor(ix.config.Get("color"))
surface.DrawRect(width * 0.5 - 1, 0, 1, height)
end
function PANEL:PerformLayout(width, height)
self.nametag:SetPos(width * 0.5 - self.nametag:GetWide() - padding, 0)
self.tags:SetPos(width * 0.5 + padding, 0)
end
function PANEL:SizeToContents()
self.nametag:SizeToContents()
self.tags:SizeToContents()
self:SetTall(math.max(self.nametag:GetTall(), self.tags:GetTall()))
end
vgui.Register("ixCreditsRow", PANEL, "Panel")
PANEL = {}
function PANEL:Init()
self.left = {}
self.right = {}
end
function PANEL:AddLeft(name, steamid)
local nametag = self:Add("ixCreditsNametag")
nametag:SetName(name)
nametag:SetAvatar(steamid)
nametag:SizeToContents()
self.left[#self.left + 1] = nametag
end
function PANEL:AddRight(name, steamid)
local nametag = self:Add("ixCreditsNametag")
nametag:SetName(name)
nametag:SetAvatar(steamid)
nametag:SizeToContents()
self.right[#self.right + 1] = nametag
end
function PANEL:PerformLayout(width, height)
local y = 0
for _, v in ipairs(self.left) do
v:SetPos(width * 0.25 - v:GetWide() * 0.5, y)
y = y + v:GetTall() + padding
end
y = 0
for _, v in ipairs(self.right) do
v:SetPos(width * 0.75 - v:GetWide() * 0.5, y)
y = y + v:GetTall() + padding
end
if (IsValid(self.center)) then
self.center:SetPos(width * 0.5 - self.center:GetWide() * 0.5, y)
end
end
function PANEL:SizeToContents()
local heightLeft, heightRight, centerHeight = 0, 0, 0
if (#self.left > #self.right) then
local center = self.left[#self.left]
centerHeight = center:GetTall()
self.center = center
self.left[#self.left] = nil
elseif (#self.right > #self.left) then
local center = self.right[#self.right]
centerHeight = center:GetTall()
self.center = center
self.right[#self.right] = nil
end
for _, v in ipairs(self.left) do
heightLeft = heightLeft + v:GetTall() + padding
end
for _, v in ipairs(self.right) do
heightRight = heightRight + v:GetTall() + padding
end
self:SetTall(math.max(heightLeft, heightRight) + centerHeight)
end
vgui.Register("ixCreditsSpecials", PANEL, "Panel")
PANEL = {}
function PANEL:Init()
self:Add("ixWillardCreditsLogo")
local link = self:Add("DLabel", self)
link:SetFont("MenuFontNoClamp")
link:SetTextColor(Color(200, 200, 200, 255))
link:SetText(url)
link:SetContentAlignment(5)
link:Dock(TOP)
link:SizeToContents()
link:SetMouseInputEnabled(true)
link:SetCursor("hand")
link.OnMousePressed = function()
gui.OpenURL(url)
end
for _, v in ipairs(CREDITS) do
local row = self:Add("ixCreditsRow")
row:SetName(v[1])
row:SetAvatar(v[2])
row:SetTags(v[3])
row:SizeToContents()
end
local specials = self:Add("ixKLabel")
specials:SetText(L("creditSpecial"):utf8upper())
specials:SetTextColor(ix.config.Get("color"))
specials:SetExpensiveShadow(1)
specials:SetKerning(16)
specials:SetCentered(true)
specials:DockMargin(0, padding * 2, 0, padding)
specials:Dock(TOP)
specials:SetFont("WNSmallerMenuTitleNoBoldNoClamp")
specials:SizeToContents()
local specialList = self:Add("ixCreditsSpecials")
specialList:DockMargin(0, padding, 0, 0)
specialList:Dock(TOP)
for _, v in ipairs(SPECIALS[1]) do
specialList:AddLeft(v[1], v[2])
end
for _, v in ipairs(SPECIALS[2]) do
specialList:AddRight(v[1], v[2])
end
specialList:SizeToContents()
-- less more padding if there's a center column nametag
if (IsValid(specialList.center)) then
specialList:DockMargin(0, padding, 0, padding)
end
for _, v in ipairs(MISC) do
local title = self:Add("DLabel")
title:SetFont("WNSmallerMenuTitleNoBoldNoClamp")
title:SetText(v[1])
title:SetContentAlignment(5)
title:SizeToContents()
title:DockMargin(0, padding, 0, 0)
title:Dock(TOP)
local description = self:Add("DLabel")
description:SetFont("TitlesFontNoBoldNoClamp")
description:SetText(v[2])
description:SetContentAlignment(5)
description:SizeToContents()
description:Dock(TOP)
end
self:Dock(TOP)
self:SizeToContents()
end
function PANEL:SizeToContents()
local height = padding
for _, v in pairs(self:GetChildren()) do
local _, top, _, bottom = v:GetDockMargin()
height = height + v:GetTall() + top + bottom
end
self:SetTall(height)
end
vgui.Register("ixWillardCredits", PANEL, "Panel")
hook.Add("PopulateHelpMenu", "ixHelixCredits", function(tabs)
tabs["WN Credits"] = function(container)
container:Add("ixWillardCredits")
end
end)

View File

@@ -0,0 +1,39 @@
--[[
| 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
function PLUGIN:AddQuiz(question, answers, bPermanent)
netstream.Start("AddQuiz", question, answers, bPermanent)
end
function PLUGIN:RemoveQuiz(id)
netstream.Start("RemoveQuiz", id)
end
function PLUGIN:EditQuiz(id, question, answers, bPermanent)
netstream.Start("EditQuiz", id, question, answers, bPermanent)
end
-- Hooks
netstream.Hook("SyncQuiz", function(list)
PLUGIN.quizlist = list
if IsValid(ix.gui.quizAnswering) then
if (ix.gui.quizAnswering.CreateQuizContent) then
ix.gui.quizAnswering:CreateQuizContent()
end
end
if IsValid(ix.gui.quizMenu) then
if (ix.gui.quizMenu.CreateLeftSide) then
ix.gui.quizMenu:CreateLeftSide()
end
end
end)

View File

@@ -0,0 +1,291 @@
--[[
| 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
local PANEL = {}
local margin10 = SScaleMin(10 / 3)
local size50 = SScaleMin(50 / 3)
function PANEL:Init()
ix.gui.quizMenu = self
self:SetSize(SScaleMin(600 / 3), SScaleMin(500 / 3))
self:Center()
self:SetTitle("Quiz Manager")
DFrameFixer(self)
self.leftSide = self:Add("Panel")
self.leftSide:Dock(LEFT)
self.leftSide:SetWide(self:GetWide() * 0.5)
self.leftSide:DockMargin(0, 0, margin10, 0)
local divider = self:Add("DShape")
divider:Dock(LEFT)
divider:SetWide(SScaleMin(1 / 3))
divider:SetType("Rect")
divider:DockMargin(0, 0, margin10, 0)
divider:SetColor(Color(111, 111, 136, (255 / 100 * 30)))
self.rightSide = self:Add("Panel")
self.rightSide:Dock(FILL)
self:CreateRightSide()
netstream.Start("RequestQuizzes", true)
end
function PANEL:CreateRightTitle()
self:CreateTitle(self.rightSide, "Question Editor")
end
function PANEL:CreateLeftTitle()
self:CreateTitle(self.leftSide, "Current Questions")
end
function PANEL:CreateTitle(parent, text, font)
local title = parent:Add("DLabel")
title:Dock(TOP)
title:SetText(text)
title:SetFont(font or "LargerTitlesFontNoClamp")
title:SetContentAlignment(5)
title:SizeToContents()
title:DockMargin(0, 0, 0, margin10)
end
function PANEL:CreateLeftSide()
for _, v in pairs(self.leftSide:GetChildren()) do
v:Remove()
end
self:CreateLeftTitle()
local addQuiz = self.leftSide:Add("DButton")
addQuiz:Dock(BOTTOM)
addQuiz:SetTall(size50)
addQuiz:SetText("ADD QUESTION")
addQuiz:SetFont("MenuFontLargerNoClamp")
addQuiz:DockMargin(0, margin10, 0, 0)
addQuiz.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
if self.quizAddEditPanel then
self.quizAddEditPanel:Remove()
self.quizAddEditPanel = nil
end
self:CreateQuizAddPanel()
end
self.quizScroll = self.leftSide:Add("DScrollPanel")
self.quizScroll:Dock(FILL)
self:RefreshQuizzes()
end
function PANEL:CreateRightSide()
self:CreateRightTitle()
end
function PANEL:RefreshQuizzes()
for id, table in pairs(PLUGIN.quizlist) do
local question = table[1] or "NO QUESTION"
local answers = table[2] or {}
local quiz = self.quizScroll:Add("DButton")
quiz:Dock(TOP)
quiz:SetTall(size50)
quiz:SetText(question and (string.len(question) > 30 and string.Left(question, 30).."..." or question) or "")
quiz:SetContentAlignment(4)
quiz:SetTextInset(margin10, 0)
quiz:SetFont("MenuFontLargerNoClamp")
quiz.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
if self.quizAddEditPanel then
self.quizAddEditPanel:Remove()
self.quizAddEditPanel = nil
end
self:CreateQuizAddPanel(id, table)
end
local deleteQuiz = quiz:Add("DButton")
deleteQuiz:Dock(RIGHT)
deleteQuiz:DockMargin(margin10, margin10 * 1.5, 0, margin10 * 1.5)
deleteQuiz:SetWide(SScaleMin(30 / 3))
deleteQuiz:SetText("")
deleteQuiz.Paint = function(self, w, h)
surface.SetDrawColor(color_white)
surface.SetMaterial(ix.util.GetMaterial("materials/willardnetworks/tabmenu/navicons/exit.png"))
surface.DrawTexturedRect(0, 0, w - SScaleMin(10 / 3), h)
end
deleteQuiz.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
PLUGIN:RemoveQuiz(id)
quiz:Remove()
end
end
end
function PANEL:CreateQuizAddPanel(id, table)
self.answers = {}
self.question = ""
self.quizAddEditPanel = self.rightSide:Add("EditablePanel")
self.quizAddEditPanel:Dock(FILL)
self:CreateTitle(self.quizAddEditPanel, "Question", "MenuFontNoClamp")
local question = self.quizAddEditPanel:Add("DTextEntry")
question:Dock(TOP)
question:SetTall(SScaleMin(30 / 3))
question:DockMargin(0, 0, 0, margin10)
question:SetZPos(1)
self:CreateTextEntry(question, id and table[1] or "A cool question")
local addAnswer = self.quizAddEditPanel:Add("DButton")
addAnswer:Dock(TOP)
addAnswer:DockMargin(0, 0, 0, margin10)
addAnswer:SetFont("MenuFontLargerNoClamp")
addAnswer:SetText("ADD ANSWER(S)")
addAnswer:SetTall(size50)
addAnswer:SetZPos(2)
addAnswer.DoClick = function()
if #self.answers == 6 then return LocalPlayer():NotifyLocalized("Max answers is 6!") end
self:CreateAnswer(self.quizAddEditPanel)
end
if !id then
for i = 1, 2 do
addAnswer.DoClick()
end
local firstAnswer = self.answers[1]:GetChildren()[1]
firstAnswer.DoClick(firstAnswer)
self.answers[1]:SetText("A right answer")
self.answers[2]:SetText("A wrong answer")
else
for answer, rightAnswer in pairs(table[2]) do
self:CreateAnswer(self.quizAddEditPanel, answer, rightAnswer)
end
end
local bPermanent = self.quizAddEditPanel:Add("DCheckBoxLabel")
bPermanent:Dock(BOTTOM)
bPermanent:SetZPos(4)
bPermanent:SetFont("MenuFontNoClamp")
bPermanent:SetText("Permanent Question")
bPermanent:SizeToContents()
bPermanent:DockMargin(0, 0, 0, SScaleMin(10 / 3))
bPermanent:SetValue(id and table[3] or false)
local saveQuiz = self.quizAddEditPanel:Add("DButton")
saveQuiz:Dock(BOTTOM)
saveQuiz:SetTall(size50)
saveQuiz:SetZPos(3)
saveQuiz:SetText(id and "EDIT" or "SAVE")
saveQuiz:SetFont("MenuFontLargerNoClamp")
saveQuiz.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
self.question = question:GetText()
self:SaveQuiz(id, bPermanent:GetChecked())
self.quizAddEditPanel:Remove()
end
end
function PANEL:CreateAnswer(parent, sAnswer, bRightAnswer)
local answerPanel = parent:Add("Panel")
answerPanel:Dock(TOP)
answerPanel:SetTall(SScaleMin(30 / 3))
answerPanel:SetZPos(5)
local answer = answerPanel:Add("DTextEntry")
answer:Dock(LEFT)
answer:SetWide(SScaleMin(267 / 3))
answer:SetText(sAnswer or "")
self:CreateTextEntry(answer, sAnswer or "", 30, true)
answer.rightAnswer = bRightAnswer or false
local trueOrFalse = answer:Add("DButton")
trueOrFalse:Dock(RIGHT)
trueOrFalse:SetWide(SScaleMin(30 / 3))
trueOrFalse:SetText("")
trueOrFalse.Paint = function(self, w, h)
if self:GetParent().rightAnswer then
surface.SetDrawColor(color_white)
surface.SetMaterial(ix.util.GetMaterial("materials/willardnetworks/charselect/check.png"))
surface.DrawTexturedRect(SScaleMin(5 / 3), SScaleMin(5 / 3), w - margin10, h - margin10)
else
surface.SetDrawColor(color_white)
surface.SetMaterial(ix.util.GetMaterial("materials/willardnetworks/tabmenu/navicons/exit.png"))
surface.DrawTexturedRect(SScaleMin(5 / 3), SScaleMin(5 / 3), w - margin10, h - margin10)
end
end
trueOrFalse.DoClick = function(this)
if !this:GetParent().rightAnswer then
this:GetParent().rightAnswer = true
end
for _, v in pairs(self.answers) do
v.rightAnswer = false
end
this:GetParent().rightAnswer = true
end
table.insert(self.answers, answer)
end
function PANEL:SaveQuiz(id, bPermanent)
local answers = {}
for _, v in pairs(self.answers) do
answers[v:GetText()] = v.rightAnswer
end
if id then
PLUGIN:EditQuiz(id, self.question, answers, bPermanent)
else
PLUGIN:AddQuiz(self.question, answers, bPermanent)
end
end
function PANEL:CreateTextEntry(parent, value, maxChars, bShouldBePaintedShorter)
parent:SetTextColor(Color(200, 200, 200, 255))
parent:SetCursorColor(Color(200, 200, 200, 255))
parent:SetFont("MenuFontNoClamp")
parent:SetText(value or "")
parent.Paint = function(self, w, h)
surface.SetDrawColor(Color(0, 0, 0, 100))
surface.DrawRect(0, 0, bShouldBePaintedShorter and (w - SScaleMin(30 / 3) - margin10) or w, h)
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
surface.DrawOutlinedRect(0, 0, bShouldBePaintedShorter and (w - SScaleMin(30 / 3) - margin10) or w, h)
self:DrawTextEntryText( self:GetTextColor(), self:GetHighlightColor(), self:GetCursorColor() )
end
if maxChars then
parent.MaxChars = maxChars
parent.AllowInput = function()
local value2 = parent:GetValue()
if (string.utf8len(value2) > maxChars) then
return true
end
end
end
end
vgui.Register("QuizPanel", PANEL, "DFrame")

View File

@@ -0,0 +1,242 @@
--[[
| 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.quizlist = PLUGIN.quizlist or {}
function PLUGIN:DatabaseConnected()
local query = mysql:Create("ix_storedquiz")
query:Create("quiz_id", "INT(11) UNSIGNED NOT NULL AUTO_INCREMENT")
query:Create("quiz_question", "TEXT")
query:Create("quiz_answers", "TEXT")
query:Create("quiz_permanent", "TEXT")
query:PrimaryKey("quiz_id")
query:Callback(function()
local quizQuery = mysql:Select("ix_storedquiz")
quizQuery:Callback(function(quizResult)
if (!istable(quizResult) or #quizResult == 0) then
return
end
for _, v in ipairs(quizResult) do
self.quizlist[tonumber(v["quiz_id"])] = {v["quiz_question"], util.JSONToTable(v["quiz_answers"]), v["quiz_permanent"]}
end
end)
quizQuery:Execute()
end)
query:Execute()
end
function PLUGIN:RandomQuizzes(client, newQuizList)
-- Thanks Gr4Ss
client.sentQuizIDs = {}
local keys = {}
local quiz = {}
for k, v in pairs(newQuizList) do
if (v[3] == true) then
quiz[#quiz + 1] = v
client.sentQuizIDs[#quiz] = k
else
keys[#keys + 1] = k
end
end
while (#quiz < 6 and #keys > 0) do
local winner = math.random(#keys)
quiz[#quiz + 1] = newQuizList[keys[winner]]
client.sentQuizIDs[#quiz] = keys[winner]
table.remove(keys, winner)
end
netstream.Start(client, "SyncQuiz", quiz)
end
function PLUGIN:ReplyQuizzes(client, bAdmin)
if (bAdmin) then
if (client:IsAdmin()) then
self:SyncFullQuizList(client)
else
ix.log.Add(client, "luaHack", "access the full quizlist without admin")
client:Kick("You're not an admin ruski.")
end
return false
end
local newQuizList = {}
for oldKey, tQuestion in pairs(self.quizlist) do
newQuizList[oldKey] = {tQuestion[1], {}, tQuestion[3]}
for answer, _ in pairs(tQuestion[2]) do
newQuizList[oldKey][2][#newQuizList[oldKey][2] + 1] = answer
end
end
self:RandomQuizzes(client, newQuizList)
end
function PLUGIN:SyncFullQuizList(client)
netstream.Start(client, "SyncQuiz", self.quizlist)
end
netstream.Hook("RequestQuizzes", function(client, bAdmin)
PLUGIN:ReplyQuizzes(client, bAdmin)
end)
function PLUGIN:AddQuiz(client, question, answers, bPermanent)
if (!client:IsAdmin()) then
ix.log.Add(client, "luaHack", "access QuizAdd")
client:Kick("You're not an admin ruski.")
return false
end
PLUGIN.quizlist[#PLUGIN.quizlist + 1] = {question, answers, bPermanent}
local queryAdd = mysql:Insert("ix_storedquiz")
queryAdd:Insert("quiz_question", question)
queryAdd:Insert("quiz_answers", util.TableToJSON(answers))
queryAdd:Insert("quiz_permanent", bPermanent)
queryAdd:Execute()
self:SyncFullQuizList(client)
end
function PLUGIN:RemoveQuiz(client, id)
if (!client:IsAdmin()) then
ix.log.Add(client, "luaHack", "access QuizRemove")
client:Kick("You're not an admin ruski.")
return false
end
PLUGIN.quizlist[id] = nil
local queryDelete = mysql:Delete("ix_storedquiz")
queryDelete:Where("quiz_id", id)
queryDelete:Execute()
self:SyncFullQuizList(client)
end
function PLUGIN:EditQuiz(client, id, question, answers, bPermanent)
if !client:IsAdmin() then
ix.log.Add(client, "luaHack", "access QuizEdit")
client:Kick("You're not an admin ruski.")
return false
end
PLUGIN.quizlist[id] = {question, answers, bPermanent}
local queryEdit = mysql:Update("ix_storedquiz")
queryEdit:Where("quiz_id", id)
queryEdit:Update("quiz_question", question)
queryEdit:Update("quiz_answers", util.TableToJSON(answers))
queryEdit:Update("quiz_permanent", bPermanent)
queryEdit:Execute()
self:SyncFullQuizList(client)
end
function PLUGIN:CheckIfAnswersAreRight(client, answers)
if !client.sentQuizIDs then return false end
for sendID, actualAnswer in pairs(answers) do
local realID = client.sentQuizIDs[sendID]
if (!realID) then
ix.log.Add(client, "luaHack", "change what quiz questions are being asked")
return false
end
local question = self.quizlist[realID]
local bAnswerFound = false
if question then
for answer, bRightAnswer in pairs(question[2]) do
if (answer == actualAnswer) then
if (bRightAnswer != true) then
return false
else
bAnswerFound = true
break
end
end
end
end
if (!bAnswerFound) then return false end
end
return true
end
function PLUGIN:AnswersMissing(client, answers)
if (!client.sentQuizIDs) then
return true
end
if (table.Count(answers) != #client.sentQuizIDs) then
return true
end
return false
end
function PLUGIN:CanPlayerCreateCharacter(client)
if (!client:GetData("QuizCompleted", false)) then
ix.log.Add(client, "luaHack", "bypass character creation quiz check")
return false, "Nice try ruski"
end
end
function PLUGIN:CompleteQuiz(client, answers)
if (self:AnswersMissing(client, answers)) then
netstream.Start(client, "SendCharacterPanelNotify", "You are still missing answering some questions!")
return false
end
if (!self:CheckIfAnswersAreRight(client, answers)) then
local quizAttempts = client:GetNetVar("quizAttempts", 3)
if (quizAttempts > 1) then
local remainingAttempts = quizAttempts - 1
local notification = string.format("One or more of your answers were incorrect. Please read the rules and guidelines and try again. You have %d attempt%s left.", remainingAttempts, remainingAttempts > 1 and "s" or "")
netstream.Start(client, "SendCharacterPanelNotify", notification)
client:SetNetVar("quizAttempts", remainingAttempts)
else
client:Kick("Unfortunately you did not answer correctly. Please read the rules and guidelines at https://willard.network/forums/ and try again")
end
return false
end
client:SetData("QuizCompleted", true)
client.sentQuizIDs = nil
netstream.Start(client, "SendCharacterPanelNotify", "Success, you've answered correctly and can now create a character!")
netstream.Start(client, "RemoveQuizUI")
end
-- Hooks
netstream.Hook("AddQuiz", function(client, question, answers, bPermanent)
PLUGIN:AddQuiz(client, question, answers, bPermanent)
end)
netstream.Hook("RemoveQuiz", function(client, id)
PLUGIN:RemoveQuiz(client, id)
end)
netstream.Hook("EditQuiz", function(client, id, question, answers, bPermanent)
PLUGIN:EditQuiz(client, id, question, answers, bPermanent)
end)
netstream.Hook("CompleteQuiz", function(client, answers)
PLUGIN:CompleteQuiz(client, answers)
end)

View File

@@ -0,0 +1,47 @@
--[[
| 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/
--]]
net.Receive("RequestMainMenuInfo", function()
local list = net.ReadTable()
local logoData = net.ReadTable()
local buttonColors = net.ReadTable()
if ix.gui.wnMainMenu and IsValid(ix.gui.wnMainMenu) then
if ix.gui.wnMainMenu.CreateMainPanel then
ix.gui.wnMainMenu:CreateMainPanel(logoData, buttonColors)
if ix.gui.wnMainMenu.UpdateChildPanels and ix.gui.wnMainMenu.GetParent then
local parent = ix.gui.wnMainMenu:GetParent()
if parent and IsValid(parent) then
ix.gui.wnMainMenu:UpdateChildPanels(parent)
end
end
end
end
if #list <= 0 then
list = {"city_bg"}
end
ix.gui.background_url = "willardnetworks/backgrounds/"..table.Random(list)..".jpg"
if !ix.gui.mainMenuManager or ix.gui.mainMenuManager and !IsValid(ix.gui.mainMenuManager) then
return
end
if !ix.gui.mainMenuManager.PopulateBackgroundList then return end
if !list or list and !istable(list) then return end
ix.gui.mainMenuManager:PopulateBackgroundList(list)
if !ix.gui.mainMenuManager.PopulateColors then return end
ix.gui.mainMenuManager:PopulateColors(buttonColors)
end)

View File

@@ -0,0 +1,231 @@
--[[
| 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 PANEL = {}
function PANEL:Init()
ix.gui.mainMenuManager = self
self:SetSize(SScaleMin(600 / 3), SScaleMin(500 / 3))
self:Center()
self:SetTitle("Main Menu Manager")
DFrameFixer(self)
self:CreateMain()
end
function PANEL:CreateMain()
if !self.mainPanel or self.mainPanel and !IsValid(self.mainPanel) then
self.mainPanel = self:Add("Panel")
self.mainPanel:Dock(FILL)
end
for _, v in pairs(self.mainPanel:GetChildren()) do
if IsValid(v) then
v:Remove()
end
end
self.backgrounds = self.mainPanel:Add("DButton")
self:CreateButton(self.backgrounds, "Backgrounds")
self.backgrounds.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
self.buttonOptions:Remove()
self.logoOptions:Remove()
self.backgrounds:Remove()
self:CreateBackgroundsPanel()
end
local infoText1 = "Relative to materials/willardnetworks/, must be png, only write the name of the file "
local infoText2 = "without .png extension. e.g. 'wn_logo_base'."
local infoText = infoText1..infoText2
self.logoOptions = self.mainPanel:Add("DButton")
self:CreateButton(self.logoOptions, "Logo Options")
self.logoOptions.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
Derma_Query("Set Logo Options", "Width/Height/Path",
"Use Standard WN Logo", function()
net.Start("SetMainMenuLogo")
net.SendToServer()
end,
"Set Custom Logo", function ()
Derma_StringRequest("Set Custom Logo Path", infoText, "", function(path)
Derma_StringRequest("Set Custom Logo Width", "In pixels.", "", function(width)
Derma_StringRequest("Set Custom Logo Height", "In pixels.", "", function(height)
local logoTable = { path, width, height }
net.Start("SetMainMenuLogo")
net.WriteTable(logoTable)
net.SendToServer()
end)
end)
end)
end,
"Cancel"
)
end
local options = {
"Font Color",
"Font Hover Color",
"Font Locked Button Color"
}
self.buttonOptions = self.mainPanel:Add("DButton")
self:CreateButton(self.buttonOptions, "Button Options")
self.buttonOptionList = {}
self.buttonOptions.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
self.buttonOptions:Remove()
self.logoOptions:Remove()
self.backgrounds:Remove()
self:CreateBackButton()
for _, v in pairs(options) do
local buttonOption = self.mainPanel:Add("DButton")
self:CreateButton(buttonOption, v)
buttonOption.colorPicker = buttonOption:Add("ixSettingsRowColor")
buttonOption.colorPicker:Dock(RIGHT)
buttonOption.colorPicker:DockMargin(0, 0, SScaleMin(10 / 3), 0)
buttonOption.colorPicker:SetText("")
buttonOption.colorPicker.OnValueChanged = function(panel, color)
self:UpdateButtonColorsToServer()
end
net.Start("RequestMainMenuInfo")
net.SendToServer()
buttonOption.DoClick = function()
buttonOption.colorPicker:OpenPicker()
end
self.buttonOptionList[v] = buttonOption
end
end
end
function PANEL:UpdateButtonColorsToServer()
local colorTable = {
["Font Color"] = self.buttonOptionList["Font Color"].colorPicker:GetValue(),
["Font Hover Color"] = self.buttonOptionList["Font Hover Color"].colorPicker:GetValue(),
["Font Locked Button Color"] = self.buttonOptionList["Font Locked Button Color"].colorPicker:GetValue()
}
net.Start("SetMainMenuButtonColors")
net.WriteTable(colorTable)
net.SendToServer()
end
function PANEL:PopulateColors(colors)
for type, color in pairs(colors) do
if !self.buttonOptionList[type] then continue end
if !self.buttonOptionList[type].colorPicker then continue end
self.buttonOptionList[type].colorPicker:SetValue(color)
end
end
function PANEL:CreateBackgroundsPanel()
self:CreateBackButton()
local addBackground = self.mainPanel:Add("DButton")
self:CreateButton(addBackground, "Add Background")
local infoText1 = "Relative to materials/willardnetworks/backgrounds/, must be jpg, only write the name of the file without "
local infoText2 = ".jpg extension. e.g. 'city_bg'."
local infoText = infoText1..infoText2
addBackground.DoClick = function()
Derma_StringRequest("Add background", infoText, "", function(text)
net.Start("AddMainMenuBackground")
net.WriteString(text)
net.SendToServer()
end)
end
self:CreateNote("Path relative to materials/willardnetworks/backgrounds/")
self.backgroundList = self.mainPanel:Add("DListView")
self.backgroundList:Dock(FILL)
self.backgroundList:DockMargin(4, 4, 4, 4)
self.backgroundList:AddColumn("Path (right click on rows for options)")
self.backgroundList:SetHeaderHeight(SScaleMin(16 / 3))
self.backgroundList:SetDataHeight(SScaleMin(17 / 3))
net.Start("RequestMainMenuInfo")
net.SendToServer()
self.backgroundList.OnRowRightClick = function(list, lineId, line)
local dmenu = DermaMenu()
dmenu:MakePopup()
dmenu:SetPos(input.GetCursorPos())
dmenu:AddOption("Remove", function()
net.Start("RemoveMainMenuBackground")
net.WriteString(line:GetValue(1))
net.SendToServer()
end)
for _, v in pairs(dmenu:GetChildren()[1]:GetChildren()) do
v:SetFont("MenuFontNoClamp")
end
end
end
function PANEL:PopulateBackgroundList(table)
if !self.backgroundList then return end
if self.backgroundList and !IsValid(self.backgroundList) then return end
self.backgroundList:Clear()
for _, name in pairs(table) do
self.backgroundList:AddLine(name)
end
end
function PANEL:CreateNote(text)
local note = self.mainPanel:Add("DLabel")
note:SetFont("TitlesFontNoClamp")
note:Dock(TOP)
note:DockMargin(SScaleMin(10 / 3), SScaleMin(10 / 3), 0, SScaleMin(10 / 3))
note:SetText(text)
note:SetContentAlignment(4)
note:SizeToContents()
return note
end
function PANEL:CreateBackButton()
self.back = self.mainPanel:Add("DButton")
self:CreateButton(self.back, "Back")
self.back.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
self:CreateMain()
end
end
function PANEL:CreateButton(name, text)
name:SetSize(SScaleMin(480 / 3), SScaleMin(46 / 3))
name:SetContentAlignment(4)
name:SetTextInset(SScaleMin(20 / 3), 0)
name:Dock(TOP)
name:SetFont("TitlesFontNoClamp")
name:DockMargin(0, 0, 0, SScaleMin(9 / 3))
name:SetText(text)
end
vgui.Register("MainMenuManager", PANEL, "DFrame")

View File

@@ -0,0 +1,88 @@
--[[
| 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
util.AddNetworkString("RequestMainMenuInfo")
util.AddNetworkString("AddMainMenuBackground")
util.AddNetworkString("RemoveMainMenuBackground")
util.AddNetworkString("SetMainMenuLogo")
util.AddNetworkString("SetMainMenuButtonColors")
function PLUGIN:UpdateMainMenu(client)
net.Start("RequestMainMenuInfo")
net.WriteTable(PLUGIN.menuBackgrounds)
net.WriteTable(PLUGIN.logoData)
net.WriteTable(PLUGIN.buttonColors)
net.Send(client)
end
net.Receive("RequestMainMenuInfo", function(_, client)
PLUGIN:UpdateMainMenu(client)
end)
net.Receive("AddMainMenuBackground", function(_, client)
if (!client:IsAdmin()) then return end
local backgroundName = net.ReadString()
PLUGIN.menuBackgrounds[#PLUGIN.menuBackgrounds + 1] = backgroundName
PLUGIN:SaveData()
PLUGIN:UpdateMainMenu(client)
end)
net.Receive("RemoveMainMenuBackground", function(_, client)
if (!client:IsAdmin()) then return end
local toRemove = net.ReadString()
for key, name in pairs(PLUGIN.menuBackgrounds) do
if name == toRemove then
table.remove(PLUGIN.menuBackgrounds, key)
break
end
end
PLUGIN:SaveData()
PLUGIN:UpdateMainMenu(client)
end)
net.Receive("SetMainMenuLogo", function(_, client)
if (!client:IsAdmin()) then return end
local newLogo = net.ReadTable()
if #newLogo == 0 then
PLUGIN.logoData = {bDefault = true}
return
end
local path = newLogo[1]
local width = tonumber(newLogo[2])
local height = tonumber(newLogo[3])
if !isnumber(width) then return end
if !isnumber(height) then return end
if !isstring(path) then return end
PLUGIN.logoData = {path = path, width = width, height = height}
PLUGIN:SaveData()
end)
net.Receive("SetMainMenuButtonColors", function(_, client)
if (!client:IsAdmin()) then return end
local newColors = net.ReadTable()
PLUGIN.buttonColors = newColors
PrintTable(PLUGIN.buttonColors)
PLUGIN:SaveData()
end)

View File

@@ -0,0 +1,536 @@
--[[
| 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/
--]]
resource.AddFile( "resource/fonts/v-opensans-extrabold.ttf" )
resource.AddFile( "resource/fonts/v-opensans-bold.ttf" )
resource.AddFile( "resource/fonts/v-opensans-bolditalic.ttf" )
resource.AddFile( "resource/fonts/v-opensans-extrabolditalic.ttf" )
resource.AddFile( "resource/fonts/v-opensans-italic.ttf" )
resource.AddFile( "resource/fonts/v-opensans-light.ttf" )
resource.AddFile( "resource/fonts/v-opensans-lightitalic.ttf" )
resource.AddFile( "resource/fonts/v-opensans-regular.ttf" )
resource.AddFile( "resource/fonts/v-opensans-semibold.ttf" )
resource.AddFile( "resource/fonts/v-opensans-semibolditalic.ttf" )
resource.AddFile( "resource/fonts/sourcesanspro-bold.ttf" )
if (CLIENT) then
function PLUGIN:LoadFonts(font, genericFont)
surface.CreateFont( "CharCreationBoldTitle", {
font = "Open Sans Extrabold",
extended = true,
size = math.Clamp(SScaleMin(12), 26, 36),
weight = 550,
antialias = true,
} )
surface.CreateFont( "CharCreationBoldTitleNoClamp", {
font = "Open Sans Extrabold",
extended = true,
size = SScaleMin(36 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "CombineMonitor", {
font = "Courier New",
extended = true,
size = SScaleMin(20 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "CombineMonitorLarge", {
font = "Open Sans Extrabold",
extended = true,
size = SScaleMin(30 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNMenuTitle", {
font = "Open Sans Extrabold",
extended = true,
size = math.Clamp(SScaleMin(23.333333333333), 0, 70),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNMenuTitleNoClamp", {
font = "Open Sans Extrabold",
extended = true,
size = SScaleMin(70 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNBleedingTitle", {
font = "Open Sans Extrabold",
extended = true,
size = math.Clamp(SScaleMin(24.333333333333), 0, 73),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNBleedingTitleNoClamp", {
font = "Open Sans Extrabold",
extended = true,
size = SScaleMin(73 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNBleedingMinutesBold", {
font = "Open Sans Bold",
extended = true,
size = math.Clamp(SScaleMin(8), 0, 24),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNBleedingMinutesBoldNoClamp", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(24 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNBleedingText", {
font = "Open Sans",
extended = true,
size = math.Clamp(SScaleMin(8.6666666666667), 0, 26),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNBleedingTextNoClamp", {
font = "Open Sans",
extended = true,
size = SScaleMin(26 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNBleedingTextBold", {
font = "Open Sans",
extended = true,
size = SScaleMin(26 / 3),
weight = 700,
antialias = true,
} )
surface.CreateFont( "WNSmallerMenuTitle", {
font = "Open Sans Extrabold",
extended = true,
size = math.Clamp(SScaleMin(14), 0, 42),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNSmallerMenuTitleNoClamp", {
font = "Open Sans Extrabold",
extended = true,
size = SScaleMin(14),
weight = 550,
antialias = true,
} )
surface.CreateFont( "SkillsTitle", {
font = "Open Sans Extrabold",
extended = true,
size = SScaleMin(60 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "DebugFixedRadio", {
font = "Courier New",
extended = true,
size = SScaleMin(14 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "SkillsDesc", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(36 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNSmallerMenuTitleNoBold", {
font = "Open Sans",
extended = true,
size = math.Clamp(SScaleMin(14), 0, 42),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNSmallerMenuTitleNoBoldNoClamp", {
font = "Open Sans",
extended = true,
size = SScaleMin(14),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNMenuSubtitle", {
font = "Yellowtail",
extended = true,
size = math.Clamp(SScaleMin(11.333333333333), 0, 34),
weight = 500,
antialias = true,
} )
surface.CreateFont( "WNMenuSubtitleNoClamp", {
font = "Yellowtail",
extended = true,
size = SScaleMin(34 / 3),
weight = 500,
antialias = true,
} )
surface.CreateFont( "WNMenuFont", {
font = "Open Sans",
extended = true,
size = math.Clamp(SScaleMin(6.6666666666667), 18, 20),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNMenuFontNoClamp", {
font = "Open Sans",
extended = true,
size = SScaleMin(20 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNBackFont", {
font = "Open Sans",
extended = true,
size = math.Clamp(SScaleMin(5.3333333333333), 16, 16),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNBackFontNoClamp", {
font = "Open Sans",
extended = true,
size = SScaleMin(5.3333333333333),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNBackFontBold", {
font = "Open Sans Bold",
extended = true,
size = math.Clamp(SScaleMin(5.3333333333333), 16, 16),
weight = 550,
antialias = true,
} )
surface.CreateFont( "WNBackFontBoldNoClamp", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(5.3333333333333),
weight = 550,
antialias = true,
} )
surface.CreateFont( "MenuFont", {
font = "Open Sans",
extended = true,
size = math.Clamp(SScaleMin(6), 14, 18),
weight = 550,
antialias = true,
} )
surface.CreateFont( "MenuFontNoClamp", {
font = "Open Sans",
extended = true,
size = SScaleMin(18 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "MenuFontFixed", {
font = "Open Sans",
extended = true,
size = 18,
weight = 550,
antialias = true,
} )
surface.CreateFont( "MenuFontOutlined", {
font = "Open Sans",
extended = true,
size = math.Clamp(SScaleMin(6), 14, 18),
weight = 550,
additive = true,
shadow = true,
outline = true,
antialias = true,
} )
surface.CreateFont( "MenuFontOutlinedNoClamp", {
font = "Open Sans",
extended = true,
size = SScaleMin(18 / 3),
weight = 550,
additive = true,
shadow = true,
outline = true,
antialias = true,
} )
surface.CreateFont( "MenuFontLarger", {
font = "Open Sans",
extended = true,
size = math.Clamp(SScaleMin(6.3333333333333), 15, 19),
weight = 550,
antialias = true,
} )
surface.CreateFont( "MenuFontLargerNoClamp", {
font = "Open Sans",
extended = true,
size = SScaleMin(19 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "MenuFontLargerBold", {
font = "Open Sans Bold",
extended = true,
size = math.Clamp(SScaleMin(6.3333333333333), 15, 19),
weight = 550,
antialias = true,
} )
surface.CreateFont( "MenuFontLargerBoldNoFix", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(19 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "MenuFontBold", {
font = "Open Sans Bold",
extended = true,
size = math.Clamp(SScaleMin(6), 14, 18),
weight = 550,
antialias = true,
} )
surface.CreateFont( "MenuFontBoldNoClamp", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(18 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "SubtitleFont", {
font = "Open Sans",
extended = true,
size = math.Clamp(SScaleMin(4.6666666666667), 0, 14),
weight = 550,
antialias = true,
} )
surface.CreateFont( "TitlesFont", {
font = "Open Sans Bold",
extended = true,
size = math.Clamp(SScaleMin(8), 20, 24),
weight = 550,
antialias = true,
} )
surface.CreateFont( "TitlesFontNoClamp", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(24 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "TitlesFontFixed", {
font = "Open Sans Bold",
extended = true,
size = 24,
weight = 550,
antialias = true,
} )
surface.CreateFont( "LargerTitlesFont", {
font = "Open Sans Bold",
extended = true,
size = math.Clamp(SScaleMin(9.3333333333333), 0, 28),
weight = 550,
antialias = true,
} )
surface.CreateFont( "LargerTitlesFontNoClamp", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(28 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "EvenLargerTitlesFontNoClamp", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(30 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "LargerTitlesFontFixed", {
font = "Open Sans Bold",
extended = true,
size = 28,
weight = 550,
antialias = true,
} )
surface.CreateFont( "WN3D2DLargeText", {
font = "Open Sans",
extended = true,
size = 36,
weight = 550,
antialias = true,
} )
surface.CreateFont( "WN3D2DMediumText", {
font = "Open Sans",
extended = true,
size = 28,
weight = 550,
antialias = true,
} )
surface.CreateFont( "TitlesFontNoBold", {
font = "Open Sans",
extended = true,
size = math.Clamp(SScaleMin(7.3333333333333), 20, 22),
weight = 550,
antialias = true,
} )
surface.CreateFont( "TitlesFontNoBoldNoClamp", {
font = "Open Sans",
extended = true,
size = SScaleMin(22 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "SmallerTitleFont", {
font = "Open Sans Bold",
extended = true,
size = math.Clamp(SScaleMin(6.6666666666667), 18, 20),
weight = 550,
antialias = true,
} )
surface.CreateFont( "SmallerTitleFontNoClamp", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(20 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "SmallerTitleFontNoBold", {
font = "Open Sans",
extended = true,
size = math.Clamp(SScaleMin(6.6666666666667), 16, 20),
weight = 550,
antialias = true,
} )
surface.CreateFont( "SmallerTitleFontNoBoldNoClamp", {
font = "Open Sans",
extended = true,
size = SScaleMin(20 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "SmallerTitleFontNoBoldNoClampLessWeight", {
font = "Open Sans",
extended = true,
size = SScaleMin(20 / 3),
weight = 400,
antialias = true,
} )
surface.CreateFont( "HUDFontLarge", {
font = "Open Sans Bold",
extended = true,
size = math.Clamp(SScaleMin(18.666666666667), 0, 56),
weight = 550,
antialias = true,
} )
surface.CreateFont( "HUDFontLargeNoClamp", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(56 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "HUDFontExtraLarge", {
font = "Open Sans Bold",
extended = true,
size = math.Clamp(SScaleMin(24), 0, 72),
weight = 550,
antialias = true,
} )
surface.CreateFont( "HUDFontExtraLargeNoClamp", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(72 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "MainMenuNewTitleFont", {
font = "Source Sans Pro",
extended = true,
size = SScaleMin(70 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "MainMenuNewTitleFont", {
font = "Open Sans Extrabold",
extended = true,
size = SScaleMin(90 / 3),
weight = 550,
antialias = true,
} )
surface.CreateFont( "MainMenuNewButtonFont", {
font = "Open Sans Bold",
extended = true,
size = SScaleMin(20 / 3),
weight = 550,
antialias = true,
} )
end
end

View File

@@ -0,0 +1,242 @@
--[[
| 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
ix.lang.AddTable("english", {
optHUDMinimalShow = "Używaj minimalnych pasków info",
optdHUDMinimalShow = "Zmniejszy częstotliwość wyświetlania pasków informacyjnych HUD, ograniczając je do wyświetlania tylko wtedy, gdy jest to wymagane.",
optHUDScalePercent = "Skala interfejsu użytkownika",
optdHUDScalePercent = "Skaluj interfejs użytkownika, aby był większy lub mniejszy w oparciu o swoje preferencje.",
optHUDPosition = "Pozycja paska info",
optdHUDPosition = "Wybierz miejsce wyświetlania pasków informacyjnych HUD na ekranie.",
optAmmoPosition = "Pozycja paska amunicji",
optdAmmoPosition = "Wybierz miejsce wyświetlania paska amunicji na ekranie."
})
ix.lang.AddTable("spanish", {
optdAmmoPosition = "Elige donde mostrar la barra de munición en tu pantalla.",
optHUDPosition = "Posición de la Barra de Información",
optdHUDScalePercent = "Re-escala tu interfaz de usuario para hacerla más grande o más pequeña, según tu preferencia.",
optAmmoPosition = "Posición de la Barra de Munición",
optHUDScalePercent = "Escala de la Interfaz de Usuario",
optdHUDPosition = "Elige donde mostrar las barras de información de la HUD en tu pantalla.",
optHUDMinimalShow = "Usar Barras de Información Minimalistas",
optdHUDMinimalShow = "Reducirá las veces que tus barras de información son mostradas en pantalla, limitándolas de forma que solo aparecerán cuando sean necesarias."
})
ix.lang.AddTable("polish", {
optHUDMinimalShow = "Używaj minimalnych pasków info",
optdHUDMinimalShow = "Zmniejszy częstotliwość wyświetlania pasków informacyjnych HUD, ograniczając je do wyświetlania tylko wtedy, gdy jest to wymagane.",
optHUDScalePercent = "Skala interfejsu użytkownika",
optdHUDScalePercent = "Skaluj interfejs użytkownika, aby był większy lub mniejszy w oparciu o swoje preferencje.",
optHUDPosition = "Pozycja paska info",
optdHUDPosition = "Wybierz miejsce wyświetlania pasków informacyjnych HUD na ekranie.",
optAmmoPosition = "Pozycja paska amunicji",
optdAmmoPosition = "Wybierz miejsce wyświetlania paska amunicji na ekranie."
})
if (CLIENT) then
local staminaIcon = ix.util.GetMaterial("willardnetworks/hud/stamina.png")
local vortIcon = ix.util.GetMaterial("willardnetworks/tabmenu/inventory/inv_vort.png")
local yellow = Color(255, 204, 0, 255)
local fakeHealthColor = Color(253, 161, 0, 255)
local background = Color(0, 0, 0, 128)
local paddingX, paddingY = SScaleMin(30 / 3), SScaleMin(30 / 3)
local iconW, iconH = SScaleMin(14 / 3), SScaleMin(14 / 3)
local iconRightPadding = SScaleMin(10 / 3)
local iconBottomPadding = SScaleMin(10 / 3)
local barWidth = SScaleMin(115 / 3)
local barHeight = iconH / 2
local yaw = 0
local function CreateRow(icon, value, secondaryEnd, secondaryOverlap)
local scale = ix.option.Get("HUDScalePercent")
local x = paddingX + ((iconW / 100) * scale) + ((iconRightPadding / 100) * scale)
local y = paddingY + ((yaw / 100) * scale) + (iconH / 2) - ((iconH / 2) - (barHeight / 2))
local w = barWidth * math.Clamp(value, 0, 1)
local h = barHeight
local configpos = ix.option.Get("HUDPosition")
local hudposX, hudposY = 0, 0
if configpos == "Top Right" then
hudposX = ScrW() - x - ((barWidth / 100) * scale) - paddingX
elseif configpos == "Bottom Right" then
hudposX = ScrW() - x - ((barWidth / 100) * scale) - paddingX
hudposY = ScrH() - y - barHeight - paddingY - ((yaw / 100) * scale)
elseif configpos == "Bottom Left" then
hudposY = ScrH() - y - barHeight - paddingY - ((yaw / 100) * scale)
end
-- Draw icon
surface.SetDrawColor(color_white)
surface.SetMaterial(icon)
surface.DrawTexturedRect(paddingX + hudposX, paddingY + ((yaw / 100) * scale) + hudposY, (iconW / 100) * scale, (iconH / 100) * scale)
-- Bar background
surface.SetDrawColor(background)
surface.DrawRect(x + hudposX, y + hudposY, (barWidth / 100 * scale), (h / 100) * scale)
-- Draw behind primary bar so it 'sticks' out at the end
if (secondaryEnd and secondaryEnd > value) then
surface.SetDrawColor(fakeHealthColor)
surface.DrawRect(x + hudposX, y + hudposY, (barWidth * math.Clamp(secondaryEnd, 0, 1) / 100) * scale, (h / 100) * scale)
end
-- Actual info
surface.SetDrawColor(yellow)
surface.DrawRect(x + hudposX, y + hudposY, (w / 100) * scale, (h / 100) * scale)
-- Draw over primary bar so it overlaps at the beginning
if (secondaryOverlap) then
surface.SetDrawColor(fakeHealthColor)
surface.DrawRect(x + hudposX, y + hudposY, (barWidth * math.Clamp(secondaryOverlap, 0, 1) / 100) * scale, (h / 100) * scale)
end
yaw = yaw + iconH + iconBottomPadding
end
local function CreateAlertRow(value, bFlash)
local scale = ix.option.Get("HUDScalePercent")
local bleedingRectH = SScaleMin(20 / 3)
local x = paddingX + ((iconW / 100) * scale) + ((iconRightPadding / 100) * scale)
local y = paddingY + ((yaw / 100) * scale) + (iconH / 2) - ((iconH / 2) - (barHeight / 2))
local configpos = ix.option.Get("HUDPosition")
local hudposX, hudposY = 0, 0
if configpos == "Top Right" then
hudposX = ScrW() - x - ((barWidth / 100) * scale) - paddingX
elseif configpos == "Bottom Right" then
hudposX = ScrW() - x - ((barWidth / 100) * scale) - paddingX
hudposY = ScrH() - y - bleedingRectH - paddingY - ((yaw / 100) * scale)
elseif configpos == "Bottom Left" then
hudposY = ScrH() - y - bleedingRectH - paddingY - ((yaw / 100) * scale)
end
local newWidth = ((barWidth + iconRightPadding + iconW) / 100) * scale
local newHeight = (bleedingRectH / 100) * scale
if (bFlash) then
local sin = math.sin(CurTime() * 10)
draw.RoundedBox(4, paddingX + hudposX, y + hudposY, newWidth, newHeight, Color(255, math.Remap(sin, -1, 1, 78, 150), math.Remap(sin, -1, 1, 69, 150), 255))
else
draw.RoundedBox(4, paddingX + hudposX, y + hudposY, newWidth, newHeight, Color(255, 78, 69, 255))
end
surface.SetFont("HUDBleedingFontBold")
surface.SetTextColor( 255, 255, 255 )
local txWidth = surface.GetTextSize(value)
surface.SetTextPos(paddingX + hudposX + (newWidth - txWidth) / 2, y + hudposY + (newHeight * 0.15))
surface.DrawText(value)
yaw = yaw + newHeight + iconBottomPadding
end
do
ix.option.Add("HUDMinimalShow", ix.type.bool, false, {
category = "appearance"
})
ix.option.Add("HUDScalePercent", ix.type.number, 100, {
category = "appearance",
min = 0, max = 100, decimals = 0, OnChanged = function()
surface.CreateFont( "HUDBleedingFontBold", {
font = "Open Sans Bold",
extended = false,
size = (SScaleMin(15 / 3) / 100) * ix.option.Get("HUDScalePercent"),
weight = 550,
antialias = true,
} )
end
})
ix.option.Add("HUDPosition", ix.type.array, "Top Left", {
category = "appearance",
populate = function()
local entries = {}
for _, v in SortedPairs({"Top Left", "Top Right", "Bottom Left", "Bottom Right"}) do
local name = v
local name2 = v:utf8sub(1, 1):utf8upper() .. v:utf8sub(2)
if (name) then
name = name
else
name = name2
end
entries[v] = name
end
return entries
end
})
ix.option.Add("AmmoPosition", ix.type.array, "Bottom Right", {
category = "appearance",
populate = function()
local entries = {}
for _, v in SortedPairs({"Top Left", "Top Right", "Bottom Left", "Bottom Right"}) do
local name = v
local name2 = v:utf8sub(1, 1):utf8upper() .. v:utf8sub(2)
if (name) then
name = name
else
name = name2
end
entries[v] = name
end
return entries
end
})
surface.CreateFont( "HUDBleedingFontBold", {
font = "Open Sans Bold",
extended = false,
size = (SScaleMin(15 / 3) / 100) * ix.option.Get("HUDScalePercent"),
weight = 550,
antialias = true,
} )
end
function PLUGIN:HUDPaint()
local client = LocalPlayer()
local character = client:GetCharacter()
if (!character) then return end
yaw = 0
hook.Run("DrawImportantBars", client, character, ix.option.Get("alwaysShowBars", true), ix.option.Get("HUDMinimalShow"), CreateRow)
-- Stamina
if (client:GetLocalVar("stm", 0) < 100 and ix.option.Get("StaminaBarEnabled", true)) then
CreateRow(staminaIcon, client:GetLocalVar("stm", 0) / 100)
end
-- Vorts
if ix.plugin.Get("vortigaunts") then
if character:IsVortigaunt() then
CreateRow(vortIcon, character:GetVortalEnergy() / ix.config.Get("maxVortalEnergy", 100))
end
end
hook.Run("DrawBars", client, character, ix.option.Get("alwaysShowBars", true), ix.option.Get("HUDMinimalShow"), CreateRow)
hook.Run("DrawAlertBars", client, character, CreateAlertRow)
hook.Run("DrawHUDOverlays", client, character)
ix.bar.newTotalHeight = yaw + paddingY
end
end

View File

@@ -0,0 +1,477 @@
--[[
| 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, "Whether or not char creation is enabled.", nil, {
category = "Characters"
})
ix.config.Add("IntroTextLong", "", "The long text shown in the intro.", nil, {
category = "Appearance",
type = ix.type.string
})
ix.lang.AddTable("english", {
optDisableAutoScrollChat = "Wyłącz auto przewijanie czatu",
optdDisableAutoScrollChat = "Określa, czy okno czatu NIE powinno przewijać się automatycznie."
})
ix.lang.AddTable("spanish", {
optDisableAutoScrollChat = "Desactiva el Auto Scroll del Chat"
})
ix.lang.AddTable("polish", {
optDisableAutoScrollChat = "Wyłącz auto przewijanie czatu",
optdDisableAutoScrollChat = "Określa, czy okno czatu NIE powinno przewijać się automatycznie."
})
ix.option.Add("disableAutoScrollChat", ix.type.bool, false, {
category = "Chat"
})
ix.config.Add("ShowCPsOnScoreboard", true, "Whether or not CP's show on scoreboard.", nil, {
category = "Characters"
})
ix.config.Add("CheckCrimeAmountNeeded", 4,
"How many CP's are required to be online before the CheckCrime command allows crime.", nil, {
data = {min = 1, max = 10},
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 = "Sprawdź, czy jest wystarczająca ilość CP online, aby móc popełniać przestępstwa.",
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("Obecnie JEST wystarczająca ilość CP online, by móc popełniać przestępstwa.")
else
client:Notify("Obecnie NIE MA wystarczającej ilości CP online, by móc popełniać przestępstwa!")
end
end
})
ix.command.Add("CheckPetty", {
description = "Sprawdź, czy jest wystarczająca ilość CP online, aby móc popełniać drobne wykroczenia.",
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("Obecnie JEST wystarczająca ilość CP online, by móc popełniać przestępstwa.")
else
client:Notify("Obecnie NIE MA wystarczającej ilości CP online, by móc popełniać przestępstwa!")
end
end
})
ix.command.Add("CheckOverwatch", {
description = "Sprawdź, czy jest wystarczająca ilość Sił Transludzkich online, by móc popełniać poważne przestępstwa na terenie Nexusa lub struktur Administracyjnych.",
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("Obecnie JEST wystarczajca ilość Sił Transludzkich online, by móc przeprowadzić atak na struktury Nadzoru.")
else
client:Notify("Obecnie NIE MA wystarczającej ilości Sił Transludzkich online, by móc przeprowadzić atak na struktury Nadzoru!")
end
end
})
if (SERVER) then
function PLUGIN:CanPlayerCreateCharacter(client)
if (ix.config.Get("CharCreationDisabled") and !CAMI.PlayerHasAccess(client, "Helix - Character Creation 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] = character:GetEyeColor().." Oczy"
end
if (!faction.noHeight and character:GetHeight() != "N/A") then
table.insert(geneticDesc, math.min(2, #geneticDesc + 1), character:GetHeight()..(#geneticDesc > 0 and "" or " Wzrostu"))
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["eye color"]) then
newPayload.eyeColor = newPayload.data["eye color"]
newPayload.data["eye color"] = 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

View File

@@ -0,0 +1,76 @@
--[[
| 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/
--]]
util.AddNetworkString("ixInventoryShiftMove")
util.AddNetworkString("ixReturnToMenu")
net.Receive("ixInventoryShiftMove", function(length, client)
local itemTable = net.ReadFloat()
local storageTable = net.ReadFloat()
if (!itemTable or !storageTable) then return end
itemTable = ix.item.instances[itemTable]
storageTable = ix.item.inventories[storageTable]
if (!itemTable or !storageTable) then return end
if (itemTable.invID == storageTable.id) then
local targetInventoryID = client:GetCharacter():GetInventory():GetID()
itemTable:Transfer(targetInventoryID)
else
itemTable:Transfer(storageTable.id)
end
end)
net.Receive("ixReturnToMenu", function(length, client)
local currentCharacter = client:GetCharacter()
local cantBypass = !CAMI.PlayerHasAccess(client, "Helix - Bypass CharSwap Disable")
local nextSwap = client:GetData("nextCharacterSwap", -1)
local timeCheck = nextSwap >= os.time()
if (nextSwap == 0) then
timeCheck = true
end
if (currentCharacter and cantBypass and (ix.config.Get("charSwapDisabled") == true or timeCheck)) then
client:Notify("Zamiana postaci jest obecnie zabroniona.")
return
end
ix.log.Add(client, "characterUnloaded", client:GetName())
local character = client:GetCharacter()
if (character) then
character:Save()
character:Kick()
end
end)
ix.log.AddType("characterUnloaded", function(client, ...)
local arguments = {...}
return Format("%s has unloaded their \"%s\" character.", client:SteamName(), arguments[1])
end)
function PLUGIN:OnItemSpawned(itemEntity)
local item = itemEntity:GetItemTable()
if (item.color) then
itemEntity:SetColor(item.color)
end
if (item.material) then
itemEntity:SetMaterial(item.material)
end
end