mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
475 lines
12 KiB
Lua
475 lines
12 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
|
|
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)
|