Multiple Credit Equipment Checker not working!

Some of my Traitor menu equipment costs more than 1 credit.
This is done using SWEP.Cost in each SWEP

This is the function:


local function HasEnoughCredits(item)
	local ply = LocalPlayer()
	local creds = ply:GetCredits()
	if creds >= item.cost then
		return true
	else
		return false
	end
end

item.cost is defined here:


for k, v in pairs(weapons.GetList()) do
         if v and v.CanBuy then
            local data = v.EquipMenuData or {}
            local base = {
               id       = WEPS.GetClass(v),
               name     = v.PrintName or "Unnamed",
	       cost	= v.Cost or 1, --COST IS DEFINED HERE!!!!
               limited  = v.LimitedStock,
               kind     = v.Kind or WEAPON_NONE,
               slot     = (v.Slot or 0) + 1,
               material = v.Icon or "vgui/ttt/icon_id",
               -- the below should be specified in EquipMenuData, in which case
               -- these values are overwritten
               type     = "Type not specified",
               model    = "models/weapons/w_bugbait.mdl",
               desc     = "No description specified.",
			   donor    = v.Tier or "None"
            };

            -- Force material to nil so that model key is used when we are
            -- explicitly told to do so (ie. material is false rather than nil).
            if data.modelicon then
               base.material = nil
            end

            table.Merge(base, data)

            -- add this buyable weapon to all relevant equipment tables
            for _, r in pairs(v.CanBuy) do
				tbl[r] = tbl[r] or {}
				if (v.Tier or "None")== "None" and donor == false then
					table.insert(tbl[r], base)
				elseif donor == true and (v.Tier or "None") ~= "None" then
					table.insert(tbl[r],base)
				end
            end
         end
      end

However, I get this error:

Please help! Nobody can play properly without a functioning T menu!

But that’s a local variable. Where is HasEnoughCredits called?

It’s in the same file (cl_equip.lua) where it decides whether or not to grey out the weapon.

But it’s local to the loop. Can you post the whole file please?

Most certainly!


---- Traitor equipment menu

local GetTranslation = LANG.GetTranslation
local GetPTranslation = LANG.GetParamTranslation
local tiers =  {none=1,
				bronze=2,
				silver=3,
				gold=4,
				ostrich=5}
-- Buyable weapons are loaded automatically. Buyable items are defined in
-- equip_items_shd.lua

local Equipment = nil
function GetEquipmentForRole(role,donor)
   -- need to build equipment cache?
   if true then --(not Equipment) or donor then
      -- start with all the non-weapon goodies
	  local tbl = {[ROLE_TRAITOR]={},[ROLE_DETECTIVE]={}}
	  if not donor then
		tbl = table.Copy(EquipmentItems)
	  end
      -- find buyable weapons to load info from
      for k, v in pairs(weapons.GetList()) do
         if v and v.CanBuy then
            local data = v.EquipMenuData or {}
            local base = {
               id       = WEPS.GetClass(v),
               name     = v.PrintName or "Unnamed",
			   cost		= v.Cost or 1,
               limited  = v.LimitedStock,
               kind     = v.Kind or WEAPON_NONE,
               slot     = (v.Slot or 0) + 1,
               material = v.Icon or "vgui/ttt/icon_id",
               -- the below should be specified in EquipMenuData, in which case
               -- these values are overwritten
               type     = "Type not specified",
               model    = "models/weapons/w_bugbait.mdl",
               desc     = "No description specified.",
			   donor    = v.Tier or "None"
            };

            -- Force material to nil so that model key is used when we are
            -- explicitly told to do so (ie. material is false rather than nil).
            if data.modelicon then
               base.material = nil
            end

            table.Merge(base, data)

            -- add this buyable weapon to all relevant equipment tables
            for _, r in pairs(v.CanBuy) do
				tbl[r] = tbl[r] or {}
				if (v.Tier or "None")== "None" and donor == false then
					table.insert(tbl[r], base)
				elseif donor == true and (v.Tier or "None") ~= "None" then
					table.insert(tbl[r],base)
				end
            end
         end
      end

      -- mark custom items
      for r, is in pairs(tbl) do
         for _, i in pairs(is) do
            if i and i.id then
               i.custom = not table.HasValue(DefaultEquipment[r], i.id)
            end
         end
      end

      Equipment = tbl
   end

   return Equipment and Equipment[role] or {}
end


local function ItemIsWeapon(item) return not tonumber(item.id) end
local function CanCarryWeapon(item) return LocalPlayer():CanCarryType(item.kind) end

--Checks if player's donor tier is high enough
local function IsSufficientTier(item)
	local ply = LocalPlayer()
	local donorlevel = ply:GetUserGroup()
	local weapondonor = (item.donor or "None"):lower()
	local dlevel = 1
	for i,v in pairs(tiers) do		
		if donorlevel:match(i) then
			dlevel = v
			break
		end
	end	
	weapondonor = tiers[weapondonor]
	if dlevel >= weapondonor then
		return true
	else
		return false
	end
end

local function HasEnoughCredits(item)
	local ply = LocalPlayer()
	local creds = ply:GetCredits()
	if creds >= item.cost then
		return true
	else
		return false
	end
end
							
local color_bad = Color(220, 60, 60, 255)
local color_good = Color(0, 200, 0, 255)

-- Creates tabel of labels showing the status of ordering prerequisites
local function PreqLabels(parent, x, y)
   local tbl = {}

   tbl.credits = vgui.Create("DLabel", parent)
   tbl.credits:SetToolTip(GetTranslation("equip_help_cost"))
   tbl.credits:SetPos(x, y)
   tbl.credits.Check = function(s, sel)
                          local credits = LocalPlayer():GetCredits()
                          return credits > 0, GetPTranslation("equip_cost", {num = credits})
                       end

   tbl.owned = vgui.Create("DLabel", parent)
   tbl.owned:SetToolTip(GetTranslation("equip_help_carry"))
   tbl.owned:CopyPos(tbl.credits)
   tbl.owned:MoveBelow(tbl.credits, y)
   tbl.owned.Check = function(s, sel)
                        if ItemIsWeapon(sel) and (not CanCarryWeapon(sel)) then
                           return false, GetPTranslation("equip_carry_slot", {slot = sel.slot})
                        elseif (not ItemIsWeapon(sel)) and LocalPlayer():HasEquipmentItem(sel.id) then
                           return false, GetTranslation("equip_carry_own")
                        else
                           return true, GetTranslation("equip_carry")
                        end
                     end

   tbl.bought = vgui.Create("DLabel", parent)
   tbl.bought:SetToolTip(GetTranslation("equip_help_stock"))
   tbl.bought:CopyPos(tbl.owned)
   tbl.bought:MoveBelow(tbl.owned, y)
   tbl.bought.Check = function(s, sel)
                         if sel.limited and LocalPlayer():HasBought(tostring(sel.id)) then
                            return false, GetTranslation("equip_stock_deny")
                         else
                            return true, GetTranslation("equip_stock_ok")
                         end
                      end
					  
   

   for k, pnl in pairs(tbl) do
      pnl:SetFont("TabLarge")
   end

   return function(selected)
             local allow = true
             for k, pnl in pairs(tbl) do
                local result, text = pnl:Check(selected)
                pnl:SetTextColor(result and color_good or color_bad)
                pnl:SetText(text)
                pnl:SizeToContents()

                allow = allow and result and IsSufficientTier(selected)
             end
             return allow
          end
end

-- quick, very basic override of DPanelSelect
local PANEL = {}
local function DrawSelectedEquipment(pnl)
   surface.SetDrawColor(255, 200, 0, 255)
   surface.DrawOutlinedRect(0, 0, pnl:GetWide(), pnl:GetTall())
end

function PANEL:SelectPanel(pnl)	
		if pnl ~= nil then
		   self.BaseClass.SelectPanel(self, pnl)
		   if pnl then
			  pnl.PaintOver = DrawSelectedEquipment
		   end
		end
end
vgui.Register("EquipSelect", PANEL, "DPanelSelect")


local SafeTranslate = LANG.TryTranslation

local color_darkened = Color(255,255,255, 80)
-- TODO: make set of global role colour defs, these are same as wepswitch
local color_slot = {
   [ROLE_TRAITOR]   = Color(180, 50, 40, 255),
   [ROLE_DETECTIVE] = Color(50, 60, 180, 255)
};

local eqframe = nil
local function TraitorMenuPopup()
   local ply = LocalPlayer()
   if not IsValid(ply) or not ply:IsActiveSpecial() then
      return
   end

   -- Close any existing traitor menu
   if eqframe and ValidPanel(eqframe) then eqframe:Close() end

   local credits = ply:GetCredits()
   local can_order = credits > 0

   local dframe = vgui.Create("DFrame")
   local w, h = 500, 350
   dframe:SetSize(w, h)
   dframe:Center()
   dframe:SetTitle(GetTranslation("equip_title"))
   dframe:SetVisible(true)
   dframe:ShowCloseButton(true)
   dframe:SetMouseInputEnabled(true)
   dframe:SetDeleteOnClose(true)

   local m = 5

   local dsheet = vgui.Create("DPropertySheet", dframe)

   -- Add a callback when switching tabs
   local oldfunc = dsheet.SetActiveTab
   dsheet.SetActiveTab = function(self, new)
      if self.m_pActiveTab != new and self.OnTabChanged then
         self:OnTabChanged(self.m_pActiveTab, new)
      end
      oldfunc(self, new)
   end

   dsheet:SetPos(0,0)
   dsheet:StretchToParent(m,m + 25,m,m)
   local padding = dsheet:GetPadding()
   

   local dequip = vgui.Create("DPanel", dsheet)
   dequip:SetPaintBackground(false)
   dequip:StretchToParent(padding,padding,padding,padding)
   
   local dequipdonor = vgui.Create("DPanel", dsheet)
   dequipdonor:SetPaintBackground(false)
   dequipdonor:StretchToParent(padding,padding,padding,padding)
   
   -- Determine if we already have equipment
   local owned_ids = {}
   for _, wep in pairs(ply:GetWeapons()) do
      if IsValid(wep) and wep:IsEquipment() then
         table.insert(owned_ids, wep:GetClass())
      end
   end

   -- Stick to one value for no equipment
   if #owned_ids == 0 then
      owned_ids = nil
   end

   --- Construct icon listing
   local dlist = vgui.Create("EquipSelect", dequip)
   dlist:SetPos(0,0)
   dlist:SetSize(154, h - 75)
   dlist:EnableVerticalScrollbar(true)
   dlist:EnableHorizontal(true)
   dlist:SetPadding(4)
   
   local dlistdonor = vgui.Create("EquipSelect", dequipdonor)
   dlistdonor:SetPos(0,0)
   dlistdonor:SetSize(154, h - 75)
   dlistdonor:EnableVerticalScrollbar(true)
   dlistdonor:EnableHorizontal(true)
   dlistdonor:SetPadding(4)

   local items = GetEquipmentForRole(ply:GetRole(),false)
   local donoritems = GetEquipmentForRole(ply:GetRole(),true)

   local to_select = nil
   for k, item in pairs(items) do
      local ic = nil

      -- Create icon panel
      if item.material then
         if item.custom then
            -- Custom marker icon
            ic = vgui.Create("LayeredIcon", dlist)

            local marker = vgui.Create("DImage")
            marker:SetImage("vgui/ttt/custom_marker")
            marker.PerformLayout = function(s)
                                      s:AlignBottom(2)
                                      s:AlignRight(2)
                                      s:SetSize(16, 16)
                                   end
            marker:SetTooltip(GetTranslation("equip_custom"))

            ic:AddLayer(marker)

            ic:EnableMousePassthrough(marker)
         elseif not ItemIsWeapon(item) then
            ic = vgui.Create("SimpleIcon", dlist)
         else
            ic = vgui.Create("LayeredIcon", dlist)
         end

         -- Slot marker icon
         if ItemIsWeapon(item) then
            local slot = vgui.Create("SimpleIconLabelled")
            slot:SetIcon("vgui/ttt/slotcap")
            slot:SetIconColor(color_slot[ply:GetRole()] or COLOR_GREY)
            slot:SetIconSize(16)

            slot:SetIconText(item.slot)

            slot:SetIconProperties(COLOR_WHITE,
                                   "DefaultBold",
                                   {opacity=220, offset=1},
                                   {10, 8})

            ic:AddLayer(slot)
            ic:EnableMousePassthrough(slot)
         end

         ic:SetIconSize(64)
         ic:SetIcon(item.material)
      elseif item.model then
         ic = vgui.Create("SpawnIcon", dlist)
         ic:SetModel(item.model)
      else
         ErrorNoHalt("Equipment item does not have model or material specified: " .. tostring(item) .. "
")
      end

      ic.item = item

      local tip = SafeTranslate(item.name) .. " (" .. SafeTranslate(item.type) .. ")"
      ic:SetTooltip(tip)

      -- If we cannot order this item, darken it
      if ((not can_order) or
          -- already owned
          table.HasValue(owned_ids, item.id) or
          (tonumber(item.id) and ply:HasEquipmentItem(tonumber(item.id))) or
          -- already carrying a weapon for this slot
          (ItemIsWeapon(item) and (not CanCarryWeapon(item))) or
		  -- check if donator level is high enough
		  (not IsSufficientTier(item)) or
		  --Cost is too high
		  (not HasEnoughCredits(item)) or
          -- already bought the item before
          (item.limited and ply:HasBought(tostring(item.id)))) then

         ic:SetIconColor(color_darkened)
      end

      dlist:AddPanel(ic)
   end
   
   --Donor items tab
   local to_selectdonor = nil
   for k, item in pairs(donoritems) do
      local ic = nil

      -- Create icon panel
      if item.material then
         if item.custom then
            -- Custom marker icon
            ic = vgui.Create("LayeredIcon", dlistdonor)

            local marker = vgui.Create("DImage")
            marker:SetImage("vgui/ttt/custom_marker")
            marker.PerformLayout = function(s)
                                      s:AlignBottom(2)
                                      s:AlignRight(2)
                                      s:SetSize(16, 16)
                                   end
            marker:SetTooltip(GetTranslation("equip_custom"))

            ic:AddLayer(marker)

            ic:EnableMousePassthrough(marker)
         elseif not ItemIsWeapon(item) then
            ic = vgui.Create("SimpleIcon", dlistdonor)
         else
            ic = vgui.Create("LayeredIcon", dlistdonor)
         end

         -- Slot marker icon
         if ItemIsWeapon(item) then
            local slot = vgui.Create("SimpleIconLabelled")
            slot:SetIcon("vgui/ttt/slotcap")
            slot:SetIconColor(color_slot[ply:GetRole()] or COLOR_GREY)
            slot:SetIconSize(16)

            slot:SetIconText(item.slot)

            slot:SetIconProperties(COLOR_WHITE,
                                   "DefaultBold",
                                   {opacity=220, offset=1},
                                   {10, 8})

            ic:AddLayer(slot)
            ic:EnableMousePassthrough(slot)
         end

         ic:SetIconSize(64)
         ic:SetIcon(item.material)
      elseif item.model then
         ic = vgui.Create("SpawnIcon", dlistdonor)
         ic:SetModel(item.model)
      else
         ErrorNoHalt("Equipment item does not have model or material specified: " .. tostring(item) .. "
")
      end

      ic.item = item

      local tip = SafeTranslate(item.name) .. " (" .. SafeTranslate(item.type) .. ")"
      ic:SetTooltip(tip)

      -- If we cannot order this item, darken it
      if ((not can_order) or
          -- already owned
          table.HasValue(owned_ids, item.id) or
          (tonumber(item.id) and ply:HasEquipmentItem(tonumber(item.id))) or
          -- already carrying a weapon for this slot
          (ItemIsWeapon(item) and (not CanCarryWeapon(item))) or
		  -- check if donator level is high enough
		  (not IsSufficientTier(item)) or
		  --Cost is too high
		  (not HasEnoughCredits(item)) or
          -- already bought the item before
          (item.limited and ply:HasBought(tostring(item.id)))) then

         ic:SetIconColor(color_darkened)
      end

      dlistdonor:AddPanel(ic)
   end

   local dlistw = 154

   local bw, bh = 100, 25

   local dih = h - bh - m*5
   local diw = w - dlistw - m*6 - 2
   local dinfobg = vgui.Create("DPanel", dequip)
   dinfobg:SetPaintBackground(false)
   dinfobg:SetSize(diw, dih)
   dinfobg:SetPos(dlistw + m, 0)
   
   local dinfobgdonor = vgui.Create("DPanel", dequipdonor)
   dinfobgdonor:SetPaintBackground(false)
   dinfobgdonor:SetSize(diw, dih)
   dinfobgdonor:SetPos(dlistw + m, 0)

   local dinfo = vgui.Create("ColoredBox", dinfobg)
   dinfo:SetColor(Color(90, 90, 95))
   dinfo:SetPos(0,0)
   dinfo:StretchToParent(0, 0, 0, dih - 135)
   
   local dinfodonor = vgui.Create("ColoredBox", dinfobgdonor)
   dinfodonor:SetColor(Color(90, 90, 95))
   dinfodonor:SetPos(0,0)
   dinfodonor:StretchToParent(0, 0, 0, dih - 135)

   local dfields = {}
   for _, k in pairs({"name", "type", "desc"}) do
      dfields[k] = vgui.Create("DLabel", dinfo)
      dfields[k]:SetTooltip(GetTranslation("equip_spec_" .. k))
      dfields[k]:SetPos(m*3, m*2)
   end

   dfields.name:SetFont("TabLarge")

   dfields.type:SetFont("DermaDefault")
   dfields.type:MoveBelow(dfields.name)

   dfields.desc:SetFont("DermaDefaultBold")
   dfields.desc:SetContentAlignment(7)
   dfields.desc:MoveBelow(dfields.type, 1)
 
-- 
   local dfieldsdonor = {}
   for _, k in pairs({"name", "type", "desc"}) do
      dfieldsdonor[k] = vgui.Create("DLabel", dinfodonor)
      dfieldsdonor[k]:SetTooltip(GetTranslation("equip_spec_" .. k))
      dfieldsdonor[k]:SetPos(m*3, m*2)
   end

   dfieldsdonor.name:SetFont("TabLarge")

   dfieldsdonor.type:SetFont("DermaDefault")
   dfieldsdonor.type:MoveBelow(dfieldsdonor.name)

   dfieldsdonor.desc:SetFont("DermaDefaultBold")
   dfieldsdonor.desc:SetContentAlignment(7)
   dfieldsdonor.desc:MoveBelow(dfieldsdonor.type, 1)
--

   local iw, ih = dinfo:GetSize()

   local dhelp = vgui.Create("ColoredBox", dinfobg)
   dhelp:SetColor(Color(90, 90, 95))
   dhelp:SetSize(diw, dih - 205)
   dhelp:MoveBelow(dinfo, m)
   
   local dhelpdonor = vgui.Create("ColoredBox", dinfobgdonor)
   dhelpdonor:SetColor(Color(90, 90, 95))
   dhelpdonor:SetSize(diw, dih - 205)
   dhelpdonor:MoveBelow(dinfodonor, m)


   local update_preqs = PreqLabels(dhelp, m*3, m*2)
   local update_preqsdonor = PreqLabels(dhelpdonor, m*3, m*2)

   dhelp:SizeToContents()
   dhelpdonor:SizeToContents()

   local dconfirm = vgui.Create("DButton", dinfobg)
   dconfirm:SetPos(0, dih - bh*2)
   dconfirm:SetSize(bw, bh)
   dconfirm:SetDisabled(true)
   dconfirm:SetText(GetTranslation("equip_confirm"))
   
   local dconfirmdonor = vgui.Create("DButton", dinfobgdonor)
   dconfirmdonor:SetPos(0, dih - bh*2)
   dconfirmdonor:SetSize(bw, bh)
   dconfirmdonor:SetDisabled(true)
   dconfirmdonor:SetText(GetTranslation("equip_confirm"))


   dsheet:AddSheet(GetTranslation("equip_tabtitle"), dequip, "icon16/bomb.png", false, false, "Traitor equipment menu")
   dsheet:AddSheet("Donor Equipment", dequipdonor, "icon16/bomb.png", false, false, "Donor only equipment")

   -- Item control
   if ply:HasEquipmentItem(EQUIP_RADAR) then
      local dradar = RADAR.CreateMenu(dsheet, dframe)
      dsheet:AddSheet(GetTranslation("radar_name"), dradar, "icon16/magnifier.png", false,false, "Radar control")
   end

   if ply:HasEquipmentItem(EQUIP_DISGUISE) then
      local ddisguise = DISGUISE.CreateMenu(dsheet)
      dsheet:AddSheet(GetTranslation("disg_name"), ddisguise, "icon16/user.png", false,false, "Disguise control")
   end

   -- Weapon/item control
   if IsValid(ply.radio) or ply:HasWeapon("weapon_ttt_radio") then
      local dradio = TRADIO.CreateMenu(dsheet)
      dsheet:AddSheet(GetTranslation("radio_name"), dradio, "icon16/transmit.png", false,false, "Radio control")
   end

   -- Credit transferring
   if credits > 0 then
      local dtransfer = CreateTransferMenu(dsheet)
      dsheet:AddSheet(GetTranslation("xfer_name"), dtransfer, "icon16/group_gear.png", false,false, "Transfer credits")
   end


   -- couple panelselect with info
   dlist.OnActivePanelChanged = function(self, _, new)
                                   for k,v in pairs(new.item) do
                                      if dfields[k] then
                                         dfields[k]:SetText(SafeTranslate(v))
                                         dfields[k]:SizeToContents()
                                      end
                                   end

                                   -- Trying to force everything to update to
                                   -- the right size is a giant pain, so just
                                   -- force a good size.
                                   dfields.desc:SetTall(70)

                                   can_order = update_preqs(new.item)

                                   dconfirm:SetDisabled(not can_order)
                                end
	--							
	 dlistdonor.OnActivePanelChanged = function(self, _, new)
									if new ~= nil then
										for k,v in pairs(new.item) do
										   if dfieldsdonor[k] then
											 dfieldsdonor[k]:SetText(SafeTranslate(v))
											  dfieldsdonor[k]:SizeToContents()
										   end
										end
									end
                                   -- Trying to force everything to update to
                                   -- the right size is a giant pain, so just
                                   -- force a good size.
                                    dfieldsdonor.desc:SetTall(70)
									
									if new ~= nil then can_order = update_preqsdonor(new.item) end

                                    dconfirmdonor:SetDisabled(not can_order)
                                 end

   -- select first
   dlist:SelectPanel(to_select or dlist:GetItems()[1])
   dlistdonor:SelectPanel(to_selectdonor or dlistdonor:GetItems()[1])

   -- prep confirm action
   dconfirm.DoClick = function()
                         local pnl = dlist.SelectedPanel
                         if not pnl or not pnl.item then return end
                         local choice = pnl.item
                         RunConsoleCommand("ttt_order_equipment", choice.id)
                         dframe:Close()
                      end
					  
	dconfirmdonor.DoClick = function()
                         local pnl = dlistdonor.SelectedPanel
                         if not pnl or not pnl.item then return end
                         local choice = pnl.item
                         RunConsoleCommand("ttt_order_equipment", choice.id)
                         dframe:Close()
                      end

   -- update some basic info, may have changed in another tab
   -- specifically the number of credits in the preq list
   dsheet.OnTabChanged = function(s, old, new)
                            if not IsValid(new) then return end

                            if new:GetPanel() == dequip then
                               can_order = update_preqs(dlist.SelectedPanel.item)
                               dconfirm:SetDisabled(not can_order)
                            elseif new:GetPanel() == dequipdonor then
								can_order = update_preqsdonor(dlistdonor.SelectedPanel.item)
								dconfirmdonor:SetDisabled(not can_order)
							end
                         end

   local dcancel = vgui.Create("DButton", dframe)
   dcancel:SetPos(w - 13 - bw, h - bh - 16)
   dcancel:SetSize(bw, bh)
   dcancel:SetDisabled(false)
   dcancel:SetText(GetTranslation("close"))
   dcancel.DoClick = function() dframe:Close() end

   dframe:MakePopup()
   dframe:SetKeyboardInputEnabled(false)

   eqframe = dframe

end
concommand.Add("ttt_cl_traitorpopup", TraitorMenuPopup)

local function ForceCloseTraitorMenu(ply, cmd, args)
   if ValidPanel(eqframe) then
      eqframe:Close()
   end
end
concommand.Add("ttt_cl_traitorpopup_close", ForceCloseTraitorMenu)

function GM:OnContextMenuOpen()
   local r = GetRoundState()
   if r == ROUND_ACTIVE and not (LocalPlayer():GetTraitor() or LocalPlayer():GetDetective()) then
      return
   elseif r == ROUND_POST or r == ROUND_PREP then
      CLSCORE:Reopen()
      return
   end

   RunConsoleCommand("ttt_cl_traitorpopup")
end

local function ReceiveEquipment()
   local ply = LocalPlayer()
   if not IsValid(ply) then return end

   ply.equipment_items = net.ReadUInt(16)
end
net.Receive("TTT_Equipment", ReceiveEquipment)

local function ReceiveCredits()
   local ply = LocalPlayer()
   if not IsValid(ply) then return end

   ply.equipment_credits = net.ReadUInt(8)
end
net.Receive("TTT_Credits", ReceiveCredits)

local r = 0
local function ReceiveBought()
   local ply = LocalPlayer()
   if not IsValid(ply) then return end

   ply.bought = {}
   local num = net.ReadUInt(8)
   for i=1,num do
      local s = net.ReadString()
      if s != "" then
         table.insert(ply.bought, s)
      end
   end

   -- This usermessage sometimes fails to contain the last weapon that was
   -- bought, even though resending then works perfectly. Possibly a bug in
   -- bf_read. Anyway, this hack is a workaround: we just request a new umsg.
   if num != #ply.bought and r < 10 then -- r is an infinite loop guard
      RunConsoleCommand("ttt_resend_bought")
      r = r + 1
   else
      r = 0
   end
end
net.Receive("TTT_Bought", ReceiveBought)

-- Player received the item he has just bought, so run clientside init
local function ReceiveBoughtItem()
   local is_item = net.ReadBit() == 1
   local id = is_item and net.ReadUInt(16) or net.ReadString()

   -- I can imagine custom equipment wanting this, so making a hook
   hook.Run("TTTBoughtItem", is_item, id)
end
net.Receive("TTT_BoughtItem", ReceiveBoughtItem)


Dont do this ONLY clientside. Should edit weaponry.lua too so people cant ttt_order_equipment and bypass the menu.
http://forum.facepunch.com/showthread.php?t=1287293&p=46357433#post46357433

Ehh… I’ve already done that, but what you said doesn’t help solve my problem.

BUMP! This is very urgent - people can’t play on my server without a working T menu - please help if possible!

Is it SWEP.Cost or SWEP.cost ? because youre using SWEP.cost in the function, but, youre using SWEP.Cost in the GetEquipmentForRole function

Where am I using SWEP.cost ?



local function HasEnoughCredits(item)
	local ply = LocalPlayer()
	local creds = ply:GetCredits()
	if creds >= item.cost then
		return true
	else
		return false
	end
end


That’s not SWEP.cost …


cost	= v.Cost or 1,

I seem to have fixed it on my client with this


local function HasEnoughCredits(item)
  local ply = LocalPlayer()
  local creds = ply:GetCredits()
  if creds >= (item.cost or 1) then
    return true
  else
    return false
  end
end

Ok I’ll give it a try - did you change any other code?

nope, just copy and pasted it onto a vanilla ttt, made the C4 have a SWEP.Cost = 3, edited the code to that, and tested it. It blurred out the C4 icon if I had less than 3 credits.

Ok - it kinda works, it greys out the item if you cannot afford it however you can still buy it with the buy equipment button. When I bought a 3 credit item and had 2 credits, I received the item and my credits went to 255 (overflow), at which point I could no longer buy anything. How do I fix this?

are you sure you edited weaponry.lua
also are you Disabling the button if they cant afford it correctly?

Nevermind - fixed (used > instead of >=)
Thanks for your help!