daily pastebin goal
41%
SHARE
TWEET

Untitled

a guest Jan 29th, 2018 54 in 6 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. AddCSLuaFile("autorun/client/cl_inventory.lua")
  3. AddCSLuaFile("autorun/sh_inventory.lua")
  4. include("autorun/sh_inventory.lua")
  5. resource.AddFile("materials/slot_overlay.png")
  6. resource.AddFile("slot_overlay.png")
  7.  
  8. local meta = FindMetaTable("Player")
  9.  
  10. util.AddNetworkString("inv_sync")
  11. util.AddNetworkString("inv_slotChange")
  12. util.AddNetworkString("inv_itemEquip")
  13. util.AddNetworkString("inv_unitemEquip")
  14. util.AddNetworkString("inv_toolEquip")
  15. util.AddNetworkString("inv_untoolEquip")
  16. util.AddNetworkString("inv_refresh")
  17. util.AddNetworkString("inv_itemDrop")
  18. util.AddNetworkString("inv_equipNotify")
  19. util.AddNetworkString("inv_equipCancel")
  20.  
  21. function meta:SyncInventory()
  22.  
  23.     net.Start("inv_sync")
  24.     net.WriteTable(self.inventory)
  25.     net.Send(self)
  26.     self:SaveInventory()
  27.  
  28. end
  29.  
  30. function meta:CreateInventory()
  31.  
  32.     self.inventory = {backpack = {}, backpackSize = INVENTORY_CONFIG.NumSlots, primary = nil, secondary = nil, melee = nil, tools = {}}
  33.     for i = 1, INVENTORY_CONFIG.NumSlots do
  34.  
  35.         self.inventory.backpack[i] = {item = nil, amount = nil}
  36.  
  37.     end
  38.     for i = 1, 10 do
  39.         self.inventory.tools[i] = {}
  40.     end
  41.     self:GiveDefaultItems()
  42.     self:SyncInventory()
  43. end
  44.  
  45. function meta:GiveDefaultItems()
  46.  
  47.     for i = 1, #INVENTORY_CONFIG.DefaultSpawnItems do
  48.  
  49.         self:AddInventoryItem(INVENTORY_CONFIG.DefaultSpawnItems[i].item, INVENTORY_CONFIG.DefaultSpawnItems[i].amount)
  50.  
  51.     end
  52.  
  53. end
  54.  
  55.  
  56. function meta:AddInventoryItem(item_, amount_)
  57.     if not self.inventory or not self.inventory.backpack then return end
  58.  
  59.     local backpack = self.inventory.backpack
  60.     local noStack
  61.  
  62.     if table.HasValue(INVENTORY_CONFIG.NonstackableItems, INVENTORY_CONFIG.RegisteredItems[item_].itemtype) then
  63.     noStack = true
  64.     end
  65.  
  66.     local hasItem, slotItem = self:HasInventoryItem(item_)
  67.     amount_ = amount_ or 1
  68.        
  69.             if hasItem and not noStack then
  70.                 local amt = backpack[slotItem].amount
  71.                 backpack[slotItem] = {item = item_, amount = amt + amount_}
  72.  
  73.             elseif not hasItem and not noStack then
  74.  
  75.                 if self:GetUsedSlotNumber() + 1 <= INVENTORY_CONFIG.NumSlots then
  76.                
  77.                     backpack[self:FindOpenSlot()] = {item = item_, amount = amount_}
  78.  
  79.                 else
  80.  
  81.                     self:ChatPrint("You do not have room to carry this item!")
  82.  
  83.                 end
  84.  
  85.  
  86.             elseif noStack then
  87.  
  88.                 if self:GetUsedSlotNumber() + 1 <= INVENTORY_CONFIG.NumSlots then
  89.                
  90.                 backpack[self:FindOpenSlot()] = {item = item_, amount = 1}
  91.  
  92.                 else
  93.  
  94.                     self:ChatPrint("You do not have room to carry this item!")
  95.  
  96.                 end
  97.  
  98.             end
  99.  
  100.  
  101.     self:SyncInventory()
  102.  
  103. end
  104.  
  105.  
  106. function meta:GetUsedSlotNumber()
  107.     if not self.inventory or not self.inventory.backpack then return end
  108.  
  109.     local backpack = self.inventory.backpack
  110.     local num = 0
  111.  
  112.     for i = 1, #backpack do
  113.  
  114.         if backpack[i].item != nil then
  115.             num = num + 1
  116.         end
  117.  
  118.     end
  119.  
  120.     return num
  121.  
  122. end
  123.  
  124.  
  125. function meta:FindOpenSlot()
  126.  
  127.     local openSlot = nil
  128.  
  129.     if not self.inventory or not self.inventory.backpack then return end
  130.  
  131.     local backpack = self.inventory.backpack
  132.  
  133.     for i = 1, #backpack do
  134.  
  135.         if backpack[i].item == nil then
  136.  
  137.             openSlot = i
  138.             break
  139.  
  140.         end
  141.  
  142.     end
  143.  
  144.     return openSlot
  145.  
  146. end
  147.  
  148. function meta:HasInventoryItem(item_)
  149.  
  150.     local hasItem = false
  151.     local slot = nil
  152.  
  153.     if not self.inventory or not self.inventory.backpack then return end
  154.  
  155.     local backpack = self.inventory.backpack
  156.  
  157.     for i = 1, #backpack do
  158.  
  159.         if backpack[i].item == item_ then
  160.  
  161.             hasItem = true
  162.             slot = i
  163.             break
  164.  
  165.         end
  166.  
  167.     end
  168.  
  169.     return hasItem, slot
  170.  
  171.  
  172. end
  173.  
  174. function meta:RemoveInventoryItem(item_, amount_)
  175.     if not self.inventory or not self.inventory.backpack then return end
  176.     local backpack = self.inventory.backpack
  177.     amount_ = amount_ or 1
  178.     for i = 1, #backpack do
  179.  
  180.         if backpack[i].item == item_ then
  181.  
  182.             backpack[i].amount = backpack[i].amount - amount_
  183.  
  184.             if backpack[i].amount <= 0 then
  185.                 backpack[i] = {}
  186.             end
  187.  
  188.             break
  189.  
  190.         end
  191.  
  192.     end
  193.  
  194.     self:SyncInventory()
  195.  
  196.  
  197. end
  198.  
  199. function meta:RemoveInventorySlotItem(slot, amount_)
  200.     if not self.inventory or not self.inventory.backpack then return end
  201.     local backpack = self.inventory.backpack
  202.     if not backpack[slot] then return end
  203.     amount_ = amount_ or 1
  204.     backpack[slot].amount = backpack[slot].amount - amount_
  205.     if backpack[slot].amount <= 0 then
  206.         backpack[slot] = {item = nil, amount = nil}
  207.     end
  208.     self:SyncInventory()
  209.  
  210. end
  211.  
  212. net.Receive("inv_itemDrop", function(len, ply)
  213.  
  214.     local slot = net.ReadInt(8)
  215.     ply:DropInventoryItem(slot, false)
  216.  
  217. end)
  218.  
  219. function meta:IsSwappingInvWeapon()
  220.  
  221.     return timer.Exists(tostring(self) .. "inv_equipNotify")
  222.  
  223. end
  224.  
  225. /*
  226. function meta:EquipInventoryItem(item, slot)
  227.  
  228.     local reg = INVENTORY_CONFIG.RegisteredItems
  229.     local inv = self.inventory
  230.     local isMelee = reg[item].melee
  231.     local isPrimary = reg[item].primary
  232.     local isSecondary = reg[item].secondary
  233.     local giveItem
  234.     if inv.backpack[slot].item == nil or self:IsSwappingInvWeapon() then return end
  235.     if isPrimary and inv.primary == nil then
  236.         inv.primary = item
  237.         giveItem = true
  238.     elseif isSecondary and inv.secondary == nil then
  239.         inv.secondary = item
  240.         giveItem = true
  241.     elseif isMelee and inv.melee == nil then
  242.         inv.melee = item
  243.         giveItem = true
  244.     end
  245.  
  246.     if giveItem then
  247.         self.UsePos = self:GetPos()
  248.         self:InvEquipNotify(INVENTORY_CONFIG.EquipMessage)
  249.         timer.Create(tostring(self) .. "inv_equipNotify", INVENTORY_CONFIG.SwapDelay, 1, function()
  250.         self:Give(item)
  251.         self:SelectWeapon(item)
  252.         self:RemoveInventorySlotItem(slot, 1)
  253.         self:RefreshInventory()
  254.             end)
  255.         for k,v in pairs(player.GetAll()) do
  256.             if v:GetPos():Distance(self:GetPos()) < 250 then
  257.                 v:ChatPrint(self:GetName().. " is pulling a weapon out of their backpack.")
  258.             end
  259.         end
  260.     end
  261.  
  262. end
  263. */
  264.  
  265. function meta:EquipInventoryItem(item, slot)
  266.  
  267.     local reg = INVENTORY_CONFIG.RegisteredItems
  268.     local inv = self.inventory
  269.     local isMelee = reg[item].melee
  270.     local isPrimary = reg[item].primary
  271.     local isSecondary = reg[item].secondary
  272.     local giveItem
  273.     if inv.backpack[slot].item == nil or self:IsSwappingInvWeapon() then return end
  274.     if isPrimary and inv.primary == nil then
  275.         giveItem = true
  276.     elseif isSecondary and inv.secondary == nil then
  277.         giveItem = true
  278.     elseif isMelee and inv.melee == nil then
  279.         giveItem = true
  280.     end
  281.     if not giveItem then return end
  282.         for k,v in pairs(player.GetAll()) do
  283.             if v:GetPos():Distance(self:GetPos()) < 250 then
  284.                 v:ChatPrint(self:GetName().. " is pulling a weapon out of their backpack.")
  285.             end
  286.         end
  287.     self.UsePos = self:GetPos()
  288.     self:InvEquipNotify(INVENTORY_CONFIG.EquipMessage)
  289.     timer.Create(tostring(self) .. "inv_equipNotify", INVENTORY_CONFIG.SwapDelay, 1, function()
  290.     if isPrimary and inv.primary == nil then
  291.         inv.primary = item
  292.     elseif isSecondary and inv.secondary == nil then
  293.         inv.secondary = item
  294.     elseif isMelee and inv.melee == nil then
  295.         inv.melee = item
  296.     end
  297.     self:Give(item)
  298.     self:SelectWeapon(item)
  299.     self:RemoveInventorySlotItem(slot, 1)
  300.     self:RefreshInventory()
  301.  
  302.  
  303.     end)
  304.  
  305. end
  306.  
  307.  
  308. function meta:UnEquipInventoryItem(item, slot)
  309.  
  310.     local reg = INVENTORY_CONFIG.RegisteredItems
  311.     local inv = self.inventory
  312.     local isMelee = reg[item].melee
  313.     local isPrimary = reg[item].primary
  314.     local isSecondary = reg[item].secondary
  315.     if self:IsSwappingInvWeapon() then return end
  316.     if inv.primary == item or inv.secondary == item or inv.melee == item then
  317.         for k,v in pairs(player.GetAll()) do
  318.             if v:GetPos():Distance(self:GetPos()) < 250 then
  319.                 v:ChatPrint(self:GetName().. " is putting a weapon back into their backpack.")
  320.             end
  321.         end
  322.     self.UsePos = self:GetPos()
  323.     self:InvEquipNotify(INVENTORY_CONFIG.UnequipMessage)
  324.     timer.Create(tostring(self) .. "inv_equipNotify", INVENTORY_CONFIG.SwapDelay, 1, function()
  325.     if isPrimary then
  326.         inv.primary = nil
  327.     elseif isSecondary then
  328.         inv.secondary = nil
  329.     elseif isMelee then
  330.         inv.melee = nil
  331.     end
  332.     if self:HasWeapon(item) then
  333.     self:StripWeapon(item)
  334.     inv.backpack[slot] = {item = item, amount = 1}
  335.     self:SyncInventory()
  336.     self:RefreshInventory()
  337.     end
  338.     end)
  339. end
  340.  
  341. end
  342.  
  343. function meta:SwapInventorySlot(slotA, slotB)
  344.  
  345.     if self:IsSwappingInvWeapon() then return end
  346.     local invBackpack = self.inventory.backpack
  347.     local slotA_ = invBackpack[slotA]
  348.     local slotB_ = invBackpack[slotB]
  349.     invBackpack[slotA] = slotB_
  350.     invBackpack[slotB] = slotA_
  351.     self:SyncInventory()
  352.     self:RefreshInventory()
  353.  
  354. end
  355.  
  356. function meta:DropInventoryItem(slot, equipped)
  357.     local reg = INVENTORY_CONFIG.RegisteredItems
  358.     if not self.inventory then return end
  359.  
  360.     local tr = util.TraceLine( {
  361.     start = self:EyePos(),
  362.     endpos = self:EyePos() + self:EyeAngles():Forward() * 80,
  363.     filter = self,
  364.     })
  365.  
  366.     if equipped and slot == nil then
  367.  
  368.         if self.inventory.primary != nil then
  369.         local droppedItem = ents.Create("spawned_weapon")
  370.         droppedItem:SetPos(self:EyePos())
  371.         droppedItem:SetModel(reg[self.inventory.primary].model)
  372.         droppedItem:SetWeaponClass(self.inventory.primary)
  373.         droppedItem:Spawn()
  374.         self.inventory.primary = nil
  375.         end
  376.         if self.inventory.secondary != nil then
  377.         local droppedItem = ents.Create("spawned_weapon")
  378.         droppedItem:SetPos(self:EyePos())
  379.         droppedItem:SetModel(reg[self.inventory.secondary].model)
  380.         droppedItem:SetWeaponClass(self.inventory.secondary)
  381.         droppedItem:Spawn()
  382.         self.inventory.secondary = nil
  383.         end
  384.         if self.inventory.melee != nil then
  385.         local droppedItem = ents.Create("spawned_weapon")
  386.         droppedItem:SetPos(self:EyePos())
  387.         droppedItem:SetModel(reg[self.inventory.melee].model)
  388.         droppedItem:SetWeaponClass(self.inventory.melee)
  389.         droppedItem:Spawn()
  390.         self.inventory.melee = nil
  391.         end
  392.  
  393.     else
  394.             if self:IsSwappingInvWeapon() then return end
  395.         local item = self.inventory.backpack[slot].item
  396.         if reg[item].itemtype == "weapon" then
  397.         local droppedItem = ents.Create("spawned_weapon")
  398.         droppedItem:SetPos(tr.HitPos)
  399.         droppedItem:SetModel(reg[item].model)
  400.         droppedItem:SetWeaponClass(item)
  401.         droppedItem:Spawn()
  402.         self:RemoveInventorySlotItem(slot, 1)
  403.         self:RefreshInventory()
  404.         elseif reg[item].itemtype == "prop" then
  405.         local droppedItem = ents.Create("prop_physics")
  406.         droppedItem:SetPos(tr.HitPos)
  407.         droppedItem:SetModel(reg[item].model)
  408.         droppedItem:Spawn()
  409.         self:RemoveInventorySlotItem(slot, 1)
  410.         self:RefreshInventory()
  411.  
  412.         elseif reg[item].itemtype == "entity" then
  413.         local droppedItem = ents.Create(item)
  414.         droppedItem:SetPos(tr.HitPos)
  415.         droppedItem:Spawn()
  416.         self:RemoveInventorySlotItem(slot, 1)
  417.         self:RefreshInventory()
  418.         end
  419.  
  420.  
  421.     end
  422.  
  423.     self:SyncInventory()
  424.  
  425. end
  426.  
  427. function meta:InvEquipNotify(message, cancel)
  428.  
  429.     if cancel != true then
  430.     net.Start("inv_equipNotify")
  431.     net.WriteString(message)
  432.     net.Send(self)
  433.     else
  434.     net.Start("inv_equipCancel")
  435.     net.Send(self)
  436.     end
  437.  
  438.  
  439. end
  440.  
  441. hook.Add("PlayerPostThink", "CheckIfPlayerMoved", function(ply)
  442.  
  443.     ply.UsePos = ply.UsePos or ply:GetPos()
  444.  
  445.     if ply:HasPlayerMoved() and ply:IsSwappingInvWeapon() then
  446.  
  447.         ply:ChatPrint("Action cancelled.")
  448.         timer.Destroy(tostring(ply).."inv_equipNotify")
  449.         ply:InvEquipNotify(nil, true)
  450.  
  451.     end
  452.  
  453. end)
  454.  
  455. function meta:HasPlayerMoved()
  456.  
  457.     if self.UsePos:Distance(self:GetPos()) > 75 then
  458.  
  459.         return true
  460.  
  461.     else
  462.  
  463.         return false
  464.  
  465.     end
  466.  
  467. end
  468.  
  469. hook.Add("PlayerPickupDarkRPWeapon", "NoPickup", function(ply, ent, wep)
  470.  
  471. if ply:GetUsedSlotNumber() + ent:Getamount() <= INVENTORY_CONFIG.NumSlots then
  472.     for i = 1, ent:Getamount() do
  473.     ply:AddInventoryItem(ent:GetWeaponClass())
  474.     ent:Remove()
  475.     end
  476.     return true
  477. end
  478.  
  479.  
  480. end)
  481.  
  482. hook.Add("canDropWeapon", "Inv_NoDropSwap", function(ply, weapon)
  483.  
  484.     return false
  485.  
  486. end)
  487.  
  488. function meta:RefreshInventory()
  489.  
  490.     net.Start("inv_refresh")
  491.     net.Send(self)
  492. end
  493.  
  494. net.Receive("inv_slotChange", function(len,ply)
  495.  
  496.     local slotA = net.ReadInt(8)
  497.     local slotB = net.ReadInt(8)
  498.     ply:SwapInventorySlot(slotA, slotB)
  499.  
  500. end)
  501.  
  502. net.Receive("inv_itemEquip", function(len,ply)
  503.  
  504.     local slot = net.ReadInt(8)
  505.     local item = ply.inventory.backpack[slot].item
  506.     ply:EquipInventoryItem(item, slot)
  507.  
  508. end)
  509.  
  510. net.Receive("inv_unitemEquip", function(len,ply)
  511.  
  512.     local class = net.ReadString()
  513.     local slot = net.ReadInt(8)
  514.     ply:UnEquipInventoryItem(class, slot)
  515.  
  516. end)
  517.  
  518. net.Receive("inv_toolEquip", function(len, ply)
  519.  
  520.  
  521.     local slot = net.ReadInt(8)
  522.     local targetSlot = net.ReadInt(8)
  523.     local class = ply.inventory.backpack[slot].item
  524.     if ply.inventory.tools[targetSlot].item == nil then
  525.     ply:RemoveInventorySlotItem(slot, 1)
  526.     ply.inventory.tools[targetSlot] = {item = class}
  527.     ply:SyncInventory()
  528.     ply:RefreshInventory()
  529.     ply:Give(class)
  530.     end
  531.  
  532. end)
  533.  
  534. net.Receive("inv_untoolEquip", function(len, ply)
  535.  
  536.     local dropslot = net.ReadInt(8) -- The slot being dropped onto
  537.     local slot = net.ReadInt(8) -- The slot of the tool being dropped
  538.     local class = net.ReadString() -- The class of the tool being dropped
  539.     if ply.inventory.backpack[dropslot].item == nil and ply.inventory.tools[slot].item == class then
  540.         ply.inventory.tools[slot] = {}
  541.         ply.inventory.backpack[dropslot] = {item = class, amount = 1}
  542.         ply:SyncInventory()
  543.         ply:RefreshInventory()
  544.         ply:StripWeapon(class)
  545.     end
  546.  
  547. end)
  548. hook.Add("PlayerInitialSpawn", "Inv_InitInventory", function(ply)
  549.  
  550.     timer.Simple(4, function()
  551.     if !file.Exists(ply:GetInventoryDir(), "DATA") then
  552.     ply:CreateInventoryDir()
  553.     ply:CreateInventory()
  554.     else
  555.     ply:LoadInventory()
  556.     end
  557.     ply.UsePos = ply:GetPos()
  558.     end)
  559.  
  560. end)
  561.  
  562. hook.Add("PlayerSpawn", "Inv_GiveTools", function(ply)
  563.  
  564.     if ply.inventory and ply.inventory.tools then
  565.     for k,v in pairs(ply.inventory.tools) do
  566.         if ply.inventory.tools[k].item != nil then
  567.         ply:Give(ply.inventory.tools[k].item)
  568.         ply:GiveInventoryLoadout()
  569.     end
  570.     end
  571.     end
  572.  
  573.     if ply.inventory.backpack then ply:SyncInventory() end
  574.  
  575. end)
  576.  
  577. hook.Add("PlayerDeath", "DropInventoryItems", function(victim, inflictor, attacker)
  578.  
  579.     if victim.inventory then
  580.     victim:DropInventoryItem(nil, true)
  581.     end
  582. end)
  583.  
  584. concommand.Add("reginfo", function(ply)
  585.  
  586.     if IsValid(ply:GetActiveWeapon()) then
  587.        
  588.         local wep = ply:GetActiveWeapon()
  589.         ply:ChatPrint(wep:GetWeaponWorldModel() .. "    " .. wep:GetClass())
  590.  
  591.     end
  592.  
  593. end)
  594.  
  595. function meta:GetInventoryDir()
  596.     local ID = self:SteamID()
  597.     return "inventory/"..string.sub(tostring(ID), 11).."/inventory"
  598.  
  599. end
  600.  
  601. function meta:CreateInventoryDir()
  602.     local ID = self:SteamID()
  603.     file.CreateDir("inventory/"..string.sub(tostring(ID), 11).."/inventory")
  604.  
  605. end
  606.  
  607. function meta:GetInventoryFile()
  608.     return self:GetInventoryDir() .. "/inventory.txt"
  609. end
  610.  
  611. function meta:SaveInventory()
  612.     local storageData = util.TableToKeyValues(self.inventory)
  613.     file.Write(self:GetInventoryFile(), storageData)
  614. end
  615.  
  616. function meta:GiveInventoryLoadout()
  617.     local inv = self.inventory
  618.     if inv.primary != nil then
  619.     self:Give(inv.primary)
  620. end
  621.     if inv.secondary != nil then
  622.     self:Give(inv.secondary)
  623. end
  624.     if inv.melee != nil then
  625.     self:Give(inv.melee)
  626. end
  627.  
  628. end
  629. function meta:LoadInventory()
  630.    
  631.     local dataStorage = file.Read(self:GetInventoryFile(), "DATA")
  632.     local datatbl = util.KeyValuesToTable(dataStorage)
  633.     PrintTable(datatbl)
  634.  
  635.  
  636.     self.inventory = {backpack = {}, backpackSize = INVENTORY_CONFIG.NumSlots, primary = nil, secondary = nil, melee = nil, tools = {}}
  637.     for i = 1, INVENTORY_CONFIG.NumSlots do
  638.  
  639.         self.inventory.backpack[i] = {item = nil, amount = nil}
  640.  
  641.     end
  642.     for i = 1, 10 do
  643.         self.inventory.tools[i] = {}
  644.     end
  645.  
  646.     for k,v in pairs(datatbl.backpack) do
  647.  
  648.         self.inventory.backpack[k] = v
  649.  
  650.     end
  651.  
  652.     if datatbl.tools then
  653.  
  654.         for k,v in pairs(datatbl.tools) do
  655.  
  656.         self.inventory.tools[k] = v
  657.  
  658.        end
  659.  
  660.     end
  661.  
  662.     self.inventory.primary = datatbl.primary
  663.     self.inventory.secondary = datatbl.secondary
  664.     self.inventory.melee = datatbl.melee
  665.  
  666.     self:SyncInventory()
  667.     self:GiveInventoryLoadout()
  668.  
  669. end
RAW Paste Data
Pastebin PRO WINTER Special!
Get 40% OFF Pastebin PRO accounts!
Top