GM.ZSInventory = {} INVCAT_TRINKETS = 1 INVCAT_COMPONENTS = 2 INVCAT_CONSUMABLES = 3 local meta = FindMetaTable("Player") function meta:GetInventoryItems() return GAMEMODE.ZSInventory end function meta:HasInventoryItem(item) return GAMEMODE.ZSInventory[item] and GAMEMODE.ZSInventory[item] > 0 end net.Receive("zs_inventoryitem", function() local item = net.ReadString() local count = net.ReadInt(5) local prevcount = GAMEMODE.ZSInventory[item] or 0 GAMEMODE.ZSInventory[item] = count if GAMEMODE.InventoryMenu and GAMEMODE.InventoryMenu:IsValid() then if count > prevcount then GAMEMODE:InventoryAddGridItem(item, GAMEMODE:GetInventoryItemType(item)) else GAMEMODE:InventoryRemoveGridItem(item) end end if MySelf and MySelf:IsValid() then MySelf:ApplyTrinkets() end end) net.Receive("zs_wipeinventory", function() GAMEMODE.ZSInventory = {} if GAMEMODE.InventoryMenu and GAMEMODE.InventoryMenu:IsValid() then GAMEMODE:InventoryWipeGrid() end MySelf:ApplyTrinkets() end) local function TryCraftWithComponent(me) net.Start("zs_trycraft") net.WriteString(me.Item) net.WriteString(me.WeaponCraft) net.SendToServer() end local function ItemPanelDoClick(self) local item = self.Item if not item then return end local category, sweptable = self.Category if category == INVCAT_WEAPONS then sweptable = weapons.Get(item) else sweptable = GAMEMODE.ZSInventoryItemData[item] end local viewer = GAMEMODE.m_InvViewer local screenscale = BetterScreenScale() if self.On then if viewer and viewer:IsValid() then viewer:SetVisible(false) end self.On = false GAMEMODE.InventoryMenu.SelInv = false GAMEMODE:DoAltSelectedItemUpdate() return else for _, v in pairs(self:GetParent():GetChildren()) do v.On = false end self.On = true GAMEMODE.InventoryMenu.SelInv = item GAMEMODE:DoAltSelectedItemUpdate() end GAMEMODE:CreateInventoryInfoViewer() viewer = GAMEMODE.m_InvViewer viewer.m_Title:SetText(sweptable.PrintName) viewer.m_Title:PerformLayout() local desctext = sweptable.Description or "" if category == INVCAT_WEAPONS then viewer.ModelPanel:SetModel(sweptable.WorldModel) local mins, maxs = viewer.ModelPanel.Entity:GetRenderBounds() viewer.ModelPanel:SetCamPos(mins:Distance(maxs) * Vector(1.15, 0.75, 0.5)) viewer.ModelPanel:SetLookAt((mins + maxs) / 2) viewer.m_VBG:SetVisible(true) if sweptable.NoDismantle then desctext = desctext .. "\nCannot be dismantled for scrap." end viewer.m_Desc:MoveBelow(viewer.m_VBG, 8) viewer.m_Desc:SetFont("ZSBodyTextFont") local canammo = false if sweptable.Primary then local ammotype = sweptable.Primary.Ammo if GAMEMODE.AmmoToPurchaseNames[ammotype] then canammo = true end end if canammo and GAMEMODE.AmmoNames[string.lower(sweptable.Primary.Ammo)] then viewer.m_AmmoType:SetText(GAMEMODE.AmmoNames[string.lower(sweptable.Primary.Ammo)]) viewer.m_AmmoType:PerformLayout() else viewer.m_AmmoType:SetText("") end else viewer.ModelPanel:SetModel("") viewer.m_VBG:SetVisible(false) viewer.m_Desc:MoveBelow(viewer.m_Title, 20) viewer.m_Desc:SetFont("ZSBodyTextFontBig") viewer.m_AmmoType:SetText("") end viewer.m_Desc:SetText(desctext) GAMEMODE:ViewerStatBarUpdate(viewer, category ~= INVCAT_WEAPONS, sweptable) for i = 1, 3 do local crab, cral = viewer.m_CraftBtns[i][1], viewer.m_CraftBtns[i][2] crab:SetVisible(false) cral:SetVisible(false) end local assembles = {} for k,v in pairs(GAMEMODE.Assemblies) do if v[1] == item then assembles[v[2]] = k end end local count = 0 for k,v in pairs(assembles) do count = count + 1 local crab, cral = viewer.m_CraftBtns[count][1], viewer.m_CraftBtns[count][2] local iitype = GAMEMODE:GetInventoryItemType(k) ~= -1 crab.Item = item crab.WeaponCraft = k crab.DoClick = TryCraftWithComponent crab:SetPos(viewer:GetWide() / 2 - crab:GetWide() / 2, (viewer:GetTall() - 33 * screenscale) - (count - 1) * 33 * screenscale) crab:SetVisible(true) cral:SetText((iitype and GAMEMODE.ZSInventoryItemData[k] or weapons.Get(k)).PrintName) cral:SetPos(crab:GetWide() / 2 - cral:GetWide() / 2, (crab:GetTall() * 0.5 - cral:GetTall() * 0.5)) cral:SetContentAlignment(5) cral:SetVisible(true) end if count > 0 then viewer.m_CraftWith:SetPos(viewer:GetWide() / 2 - viewer.m_CraftWith:GetWide() / 2, (viewer:GetTall() - 33 * screenscale) - 33 * count * screenscale) viewer.m_CraftWith:SetContentAlignment(5) viewer.m_CraftWith:SetVisible(true) else viewer.m_CraftWith:SetVisible(false) end end local categorycolors = { [INVCAT_TRINKETS] = {COLOR_RED, COLOR_DARKRED}, [INVCAT_COMPONENTS] = {COLOR_BLUE, COLOR_DARKBLUE}, [INVCAT_CONSUMABLES] = {COLOR_YELLOW, COLOR_DARKYELLOW} } local colBG = Color(10, 10, 10, 252) local colBGH = Color(200, 200, 200, 5) local function ItemPanelPaint(self, w, h) draw.RoundedBox(2, 0, 0, w, h, (self.Depressed or self.On) and categorycolors[self.Category][1] or categorycolors[self.Category][2]) draw.RoundedBox(2, 2, 2, w - 4, h - 4, colBG) if self.On or self.Hovered then draw.RoundedBox(2, 2, 2, w - 4, h - 4, colBGH) end return true end function GM:CreateInventoryInfoViewer() if self.m_InvViewer and self.m_InvViewer:IsValid() then self.m_InvViewer:SetVisible(true) return end local leftframe = self.InventoryMenu local viewer = vgui.Create("DFrame") local screenscale = BetterScreenScale() viewer:SetDeleteOnClose(false) viewer:SetTitle(" ") viewer:SetDraggable(false) if viewer.btnClose and viewer.btnClose:IsValid() then viewer.btnClose:SetVisible(false) end if viewer.btnMinim and viewer.btnMinim:IsValid() then viewer.btnMinim:SetVisible(false) end if viewer.btnMaxim and viewer.btnMaxim:IsValid() then viewer.btnMaxim:SetVisible(false) end viewer:SetSize(leftframe:GetWide() / 1.25, leftframe:GetTall()) viewer:MoveRightOf(leftframe, 32) viewer:MoveAbove(leftframe, -leftframe:GetTall()) self.m_InvViewer = viewer self:CreateItemViewerGenericElems(viewer) local craftbtns = {} for i = 1, 3 do local craftb = vgui.Create("DButton", viewer) craftb:SetText("") craftb:SetSize(viewer:GetWide() / 1.15, 27 * screenscale) craftb:SetVisible(false) local namelab = EasyLabel(craftb, "...", "ZSBodyTextFont", COLOR_WHITE) namelab:SetWide(craftb:GetWide()) namelab:SetVisible(false) craftbtns[i] = {craftb, namelab} end viewer.m_CraftBtns = craftbtns local craftwith = EasyLabel(viewer, "Craft With...", "ZSBodyTextFontBig", COLOR_WHITE) craftwith:SetSize(viewer:GetWide() / 1.15, 27 * screenscale) craftwith:SetVisible(false) viewer.m_CraftWith = craftwith end local NumToRomanNumeral = { "I", "II", "III", "IV", "V", "VI" } function GM:InventoryAddGridItem(item, category) local screenscale = BetterScreenScale() local grid = self.InventoryMenu.Grid local itempan = vgui.Create("DButton") itempan:SetText("") itempan:SetSize(64 * screenscale, 64 * screenscale) itempan.Paint = ItemPanelPaint itempan.DoClick = ItemPanelDoClick itempan.Item = item itempan.Category = category grid:AddItem(itempan) grid:SortByMember("Category") local mdlframe = vgui.Create("DPanel", itempan) mdlframe:SetSize(60 * screenscale, 30 * screenscale) mdlframe:Center() mdlframe:SetMouseInputEnabled(false) mdlframe.Paint = function() end local trintier = EasyLabel(itempan, "", "ZSHUDFontSmaller", COLOR_WHITE) trintier:CenterHorizontal(0.8) trintier:CenterVertical(0.8) if category == INVCAT_TRINKETS then local tier = GAMEMODE.ZSInventoryItemData[item].Tier or 1 trintier:SetText(NumToRomanNumeral[tier]) trintier:SizeToContents() trintier:CenterHorizontal(0.8) trintier:CenterVertical(0.8) end local kitbl = killicon.Get(category == INVCAT_TRINKETS and "weapon_zs_trinket" or "weapon_zs_craftables") if kitbl then self:AttachKillicon(kitbl, itempan, mdlframe) end end function GM:InventoryRemoveGridItem(item) local grid = self.InventoryMenu.Grid for k, v in pairs(grid:GetChildren()) do if v.Item == item then grid:RemoveItem(v) break end end grid:SortByMember("Category") if self.InventoryMenu.SelInv == item then if self.m_InvViewer and self.m_InvViewer:IsValid() and self.InventoryMenu.SelInv then self.m_InvViewer:SetVisible(false) end self.InventoryMenu.SelInv = nil self:DoAltSelectedItemUpdate() end end function GM:InventoryWipeGrid() local grid = self.InventoryMenu.Grid for k, v in pairs(grid:GetChildren()) do grid:RemoveItem(v) end if self.m_InvViewer and self.m_InvViewer:IsValid() then self.m_InvViewer:SetVisible(false) end self.InventoryMenu.SelInv = nil self:DoAltSelectedItemUpdate() end function GM:OpenInventory() if self.InventoryMenu and self.InventoryMenu:IsValid() then self.InventoryMenu:SetVisible(true) if self.m_InvViewer and self.m_InvViewer:IsValid() and self.InventoryMenu.SelInv then self.m_InvViewer:SetVisible(true) end return end local screenscale = BetterScreenScale() local wid, hei = math.max(400, math.min(ScrW(), 400) * screenscale), math.min(ScrH(), 370) * screenscale local frame = vgui.Create("DFrame") frame:SetSize(wid, hei) frame:CenterHorizontal(0.385) frame:CenterVertical(0.25) frame:SetDeleteOnClose(false) frame:SetTitle(" ") frame:SetDraggable(false) if frame.btnClose and frame.btnClose:IsValid() then frame.btnClose:SetVisible(false) end if frame.btnMinim and frame.btnMinim:IsValid() then frame.btnMinim:SetVisible(false) end if frame.btnMaxim and frame.btnMaxim:IsValid() then frame.btnMaxim:SetVisible(false) end self.InventoryMenu = frame local topspace = vgui.Create("DPanel", frame) topspace:SetWide(wid - 16) local title = EasyLabel(topspace, "Inventory", "ZSHUDFontSmall", COLOR_WHITE) title:CenterHorizontal() local _, y = title:GetPos() topspace:SetTall(y + title:GetTall() + 2) topspace:AlignTop(8) topspace:CenterHorizontal() local invListPanel = vgui.Create("DScrollPanel", frame) invListPanel:Dock( FILL ) local sbar = invListPanel:GetVBar() sbar.Enabled = true invListPanel:DockMargin(0, topspace:GetTall() + 8, 0, 0) invListPanel:InvalidateParent(true) local invgrid = vgui.Create("DGrid", invListPanel) invgrid:SetSize(invListPanel:GetWide() - sbar:GetWide(), invListPanel:GetTall()) invgrid:SetCols(5) invgrid:SetColWide((70 + (invgrid:GetWide() - 70*5) / 4) * screenscale) invgrid:SetRowHeight(70 * screenscale) frame.Grid = invgrid for item, count in pairs(self.ZSInventory) do if count > 0 then for i = 1, count do self:InventoryAddGridItem(item, self:GetInventoryItemType(item)) end end end invgrid:SortByMember("Category") frame:MakePopup() end