283 lines
9 KiB
Lua
283 lines
9 KiB
Lua
|
local function pointslabelThink(self)
|
||
|
local points = MySelf:GetPoints()
|
||
|
if self.m_LastPoints ~= points then
|
||
|
self.m_LastPoints = points
|
||
|
|
||
|
self:SetText("Points to spend: "..points)
|
||
|
self:SizeToContents()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
hook.Add("Think", "PointsShopThink", function()
|
||
|
local pan = GAMEMODE.m_PointsShop
|
||
|
if pan and pan:Valid() and pan:IsVisible() then
|
||
|
local newstate = not GAMEMODE:GetWaveActive()
|
||
|
if newstate ~= pan.m_LastNearArsenalCrate then
|
||
|
pan.m_LastNearArsenalCrate = newstate
|
||
|
|
||
|
if newstate then
|
||
|
pan.m_DiscountLabel:SetText(GAMEMODE.ArsenalCrateDiscountPercentage.."% discount for buying between waves!")
|
||
|
pan.m_DiscountLabel:SetTextColor(COLOR_GREEN)
|
||
|
else
|
||
|
pan.m_DiscountLabel:SetText("All sales are final!")
|
||
|
pan.m_DiscountLabel:SetTextColor(COLOR_GRAY)
|
||
|
end
|
||
|
|
||
|
pan.m_DiscountLabel:SizeToContents()
|
||
|
pan.m_DiscountLabel:AlignRight(8)
|
||
|
end
|
||
|
|
||
|
local mx, my = gui.MousePos()
|
||
|
local x, y = pan:GetPos()
|
||
|
if mx < x - 16 or my < y - 16 or mx > x + pan:GetWide() + 16 or my > y + pan:GetTall() + 16 then
|
||
|
pan:SetVisible(false)
|
||
|
surface.PlaySound("npc/dog/dog_idle3.wav")
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
local function PointsShopCenterMouse(self)
|
||
|
local x, y = self:GetPos()
|
||
|
local w, h = self:GetSize()
|
||
|
gui.SetMousePos(x + w * 0.5, y + h * 0.5)
|
||
|
end
|
||
|
|
||
|
local ammonames = {
|
||
|
["pistol"] = "pistolammo",
|
||
|
["buckshot"] = "shotgunammo",
|
||
|
["smg1"] = "smgammo",
|
||
|
["ar2"] = "assaultrifleammo",
|
||
|
["357"] = "rifleammo",
|
||
|
["XBowBolt"] = "crossbowammo"
|
||
|
}
|
||
|
|
||
|
local warnedaboutammo = CreateClientConVar("_zs_warnedaboutammo", "0", true, false)
|
||
|
local function PurchaseDoClick(self)
|
||
|
if not warnedaboutammo:GetBool() then
|
||
|
local itemtab = FindItem(self.ID)
|
||
|
if itemtab and itemtab.SWEP then
|
||
|
local weptab = weapons.GetStored(itemtab.SWEP)
|
||
|
if weptab and weptab.Primary and weptab.Primary.Ammo and ammonames[weptab.Primary.Ammo] then
|
||
|
RunConsoleCommand("_zs_warnedaboutammo", "1")
|
||
|
Derma_Message("Be sure to buy extra ammo. Weapons purchased do not contain any extra ammo!", "Warning")
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
RunConsoleCommand("zs_pointsshopbuy", self.ID)
|
||
|
end
|
||
|
|
||
|
local function BuyAmmoDoClick(self)
|
||
|
RunConsoleCommand("zs_pointsshopbuy", "ps_"..self.AmmoType)
|
||
|
end
|
||
|
|
||
|
local function worthmenuDoClick()
|
||
|
MakepWorth()
|
||
|
GAMEMODE.m_PointsShop:Close()
|
||
|
end
|
||
|
|
||
|
local function ItemPanelThink(self)
|
||
|
local itemtab = FindItem(self.ID)
|
||
|
if itemtab then
|
||
|
local newstate = MySelf:GetPoints() >= math.ceil(itemtab.Worth * (GAMEMODE.m_PointsShop.m_LastNearArsenalCrate and GAMEMODE.ArsenalCrateMultiplier or 1)) and not (itemtab.NoClassicMode and GAMEMODE:IsClassicMode())
|
||
|
if newstate ~= self.m_LastAbleToBuy then
|
||
|
self.m_LastAbleToBuy = newstate
|
||
|
if newstate then
|
||
|
self:AlphaTo(255, 0.75, 0)
|
||
|
self.m_NameLabel:SetTextColor(COLOR_WHITE)
|
||
|
self.m_BuyButton:SetImage("icon16/accept.png")
|
||
|
else
|
||
|
self:AlphaTo(90, 0.75, 0)
|
||
|
self.m_NameLabel:SetTextColor(COLOR_RED)
|
||
|
self.m_BuyButton:SetImage("icon16/exclamation.png")
|
||
|
end
|
||
|
|
||
|
self.m_BuyButton:SizeToContents()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function PointsShopThink(self)
|
||
|
if GAMEMODE:GetWave() ~= self.m_LastWaveWarning and not GAMEMODE:GetWaveActive() and CurTime() >= GAMEMODE:GetWaveStart() - 10 and CurTime() > (self.m_LastWaveWarningTime or 0) + 11 then
|
||
|
self.m_LastWaveWarning = GAMEMODE:GetWave()
|
||
|
self.m_LastWaveWarningTime = CurTime()
|
||
|
|
||
|
surface.PlaySound("ambient/alarms/klaxon1.wav")
|
||
|
timer.Simple(0.6, function() surface.PlaySound("ambient/alarms/klaxon1.wav") end)
|
||
|
timer.Simple(1.2, function() surface.PlaySound("ambient/alarms/klaxon1.wav") end)
|
||
|
timer.Simple(2, function() surface.PlaySound("vo/npc/Barney/ba_hurryup.wav") end)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function GM:OpenPointsShop()
|
||
|
if self.m_PointsShop and self.m_PointsShop:Valid() then
|
||
|
self.m_PointsShop:SetVisible(true)
|
||
|
self.m_PointsShop:CenterMouse()
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local wid, hei = 480, math.max(ScrH() * 0.5, 400)
|
||
|
|
||
|
local frame = vgui.Create("DFrame")
|
||
|
frame:SetSize(wid, hei)
|
||
|
frame:Center()
|
||
|
frame:SetDeleteOnClose(false)
|
||
|
frame:SetTitle(" ")
|
||
|
frame:SetDraggable(false)
|
||
|
if frame.btnClose and frame.btnClose:Valid() then frame.btnClose:SetVisible(false) end
|
||
|
if frame.btnMinim and frame.btnMinim:Valid() then frame.btnMinim:SetVisible(false) end
|
||
|
if frame.btnMaxim and frame.btnMaxim:Valid() then frame.btnMaxim:SetVisible(false) end
|
||
|
frame.CenterMouse = PointsShopCenterMouse
|
||
|
frame.Think = PointsShopThink
|
||
|
self.m_PointsShop = frame
|
||
|
|
||
|
local topspace = vgui.Create("DPanel", frame)
|
||
|
topspace:SetWide(wid - 16)
|
||
|
|
||
|
local title = EasyLabel(topspace, "The Points Shop", "ZSHUDFontSmall", COLOR_WHITE)
|
||
|
title:CenterHorizontal()
|
||
|
local subtitle = EasyLabel(topspace, "For all of your zombie apocalypse needs!", "ZSHUDFontTiny", COLOR_WHITE)
|
||
|
subtitle:CenterHorizontal()
|
||
|
subtitle:MoveBelow(title, 4)
|
||
|
|
||
|
local _, y = subtitle:GetPos()
|
||
|
topspace:SetTall(y + subtitle:GetTall() + 4)
|
||
|
topspace:AlignTop(8)
|
||
|
topspace:CenterHorizontal()
|
||
|
|
||
|
local tt = vgui.Create("DImage", topspace)
|
||
|
tt:SetImage("gui/info")
|
||
|
tt:SizeToContents()
|
||
|
tt:SetPos(8, 8)
|
||
|
tt:SetMouseInputEnabled(true)
|
||
|
tt:SetTooltip("This shop is armed with the QUIK - Anti-zombie backstab device.\nMove your mouse outside of the shop to quickly close it!")
|
||
|
|
||
|
local wsb = EasyButton(topspace, "Worth Menu", 8, 4)
|
||
|
wsb:AlignRight(8)
|
||
|
wsb:AlignTop(8)
|
||
|
wsb.DoClick = worthmenuDoClick
|
||
|
|
||
|
|
||
|
local bottomspace = vgui.Create("DPanel", frame)
|
||
|
bottomspace:SetWide(topspace:GetWide())
|
||
|
|
||
|
local pointslabel = EasyLabel(bottomspace, "Points to spend: 0", "ZSHUDFontTiny", COLOR_GREEN)
|
||
|
pointslabel:AlignTop(4)
|
||
|
pointslabel:AlignLeft(8)
|
||
|
pointslabel.Think = pointslabelThink
|
||
|
|
||
|
local lab = EasyLabel(bottomspace, " ", "ZSHUDFontTiny")
|
||
|
lab:AlignTop(4)
|
||
|
lab:AlignRight(4)
|
||
|
frame.m_DiscountLabel = lab
|
||
|
|
||
|
local _, y = lab:GetPos()
|
||
|
bottomspace:SetTall(y + lab:GetTall() + 4)
|
||
|
bottomspace:AlignBottom(8)
|
||
|
bottomspace:CenterHorizontal()
|
||
|
|
||
|
local topx, topy = topspace:GetPos()
|
||
|
local botx, boty = bottomspace:GetPos()
|
||
|
|
||
|
local propertysheet = vgui.Create("DPropertySheet", frame)
|
||
|
propertysheet:SetSize(wid - 8, boty - topy - 8 - topspace:GetTall())
|
||
|
propertysheet:MoveBelow(topspace, 4)
|
||
|
propertysheet:CenterHorizontal()
|
||
|
|
||
|
local isclassic = GAMEMODE:IsClassicMode()
|
||
|
|
||
|
for catid, catname in ipairs(GAMEMODE.ItemCategories) do
|
||
|
local hasitems = false
|
||
|
for i, tab in ipairs(GAMEMODE.Items) do
|
||
|
if tab.Category == catid and tab.PointShop then
|
||
|
hasitems = true
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if hasitems then
|
||
|
local list = vgui.Create("DPanelList", propertysheet)
|
||
|
list:SetPaintBackground(false)
|
||
|
propertysheet:AddSheet(catname, list, GAMEMODE.ItemCategoryIcons[catid], false, false)
|
||
|
list:EnableVerticalScrollbar(true)
|
||
|
list:SetWide(propertysheet:GetWide() - 16)
|
||
|
list:SetSpacing(2)
|
||
|
list:SetPadding(2)
|
||
|
|
||
|
for i, tab in ipairs(GAMEMODE.Items) do
|
||
|
if tab.Category == catid and tab.PointShop then
|
||
|
local itempan = vgui.Create("DPanel")
|
||
|
itempan:SetSize(list:GetWide(), 40)
|
||
|
itempan.ID = tab.Signature or i
|
||
|
itempan.Think = ItemPanelThink
|
||
|
list:AddItem(itempan)
|
||
|
|
||
|
local mdlframe = vgui.Create("DPanel", itempan)
|
||
|
mdlframe:SetSize(32, 32)
|
||
|
mdlframe:SetPos(4, 4)
|
||
|
|
||
|
local weptab = weapons.GetStored(tab.SWEP) or tab
|
||
|
local mdl = tab.Model or weptab.WorldModel
|
||
|
if mdl then
|
||
|
local mdlpanel = vgui.Create("DModelPanel", mdlframe)
|
||
|
mdlpanel:SetSize(mdlframe:GetSize())
|
||
|
mdlpanel:SetModel(mdl)
|
||
|
local mins, maxs = mdlpanel.Entity:GetRenderBounds()
|
||
|
mdlpanel:SetCamPos(mins:Distance(maxs) * Vector(0.75, 0.75, 0.5))
|
||
|
mdlpanel:SetLookAt((mins + maxs) / 2)
|
||
|
end
|
||
|
|
||
|
if tab.SWEP or tab.Countables then
|
||
|
local counter = vgui.Create("ItemAmountCounter", itempan)
|
||
|
counter:SetItemID(i)
|
||
|
end
|
||
|
|
||
|
local name = tab.Name or ""
|
||
|
local namelab = EasyLabel(itempan, name, "ZSHUDFontSmall", COLOR_WHITE)
|
||
|
namelab:SetPos(42, itempan:GetTall() * 0.5 - namelab:GetTall() * 0.5)
|
||
|
itempan.m_NameLabel = namelab
|
||
|
|
||
|
local pricelab = EasyLabel(itempan, tostring(tab.Worth).." Points", "ZSHUDFontTiny")
|
||
|
pricelab:SetPos(itempan:GetWide() - 20 - pricelab:GetWide(), 4)
|
||
|
itempan.m_PriceLabel = pricelab
|
||
|
|
||
|
local button = vgui.Create("DImageButton", itempan)
|
||
|
button:SetImage("icon16/lorry_add.png")
|
||
|
button:SizeToContents()
|
||
|
button:SetPos(itempan:GetWide() - 20 - button:GetWide(), itempan:GetTall() - 20)
|
||
|
button:SetTooltip("Purchase "..name)
|
||
|
button.ID = itempan.ID
|
||
|
button.DoClick = PurchaseDoClick
|
||
|
itempan.m_BuyButton = button
|
||
|
|
||
|
if weptab and weptab.Primary then
|
||
|
local ammotype = weptab.Primary.Ammo
|
||
|
if ammonames[ammotype] then
|
||
|
local ammobutton = vgui.Create("DImageButton", itempan)
|
||
|
ammobutton:SetImage("icon16/add.png")
|
||
|
ammobutton:SizeToContents()
|
||
|
ammobutton:CopyPos(button)
|
||
|
ammobutton:MoveLeftOf(button, 2)
|
||
|
ammobutton:SetTooltip("Purchase ammunition")
|
||
|
ammobutton.AmmoType = ammonames[ammotype]
|
||
|
ammobutton.DoClick = BuyAmmoDoClick
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if tab.Description then
|
||
|
itempan:SetTooltip(tab.Description)
|
||
|
end
|
||
|
|
||
|
if tab.NoClassicMode and isclassic or tab.NoZombieEscape and GAMEMODE.ZombieEscape then
|
||
|
itempan:SetAlpha(120)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
frame:MakePopup()
|
||
|
frame:CenterMouse()
|
||
|
end
|
||
|
GM.OpenPointShop = GM.OpenPointsShop
|