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!
- AddCSLuaFile("autorun/client/cl_inventory.lua")
- AddCSLuaFile("autorun/sh_inventory.lua")
- include("autorun/sh_inventory.lua")
- resource.AddFile("materials/slot_overlay.png")
- resource.AddFile("slot_overlay.png")
- local meta = FindMetaTable("Player")
- util.AddNetworkString("inv_sync")
- util.AddNetworkString("inv_slotChange")
- util.AddNetworkString("inv_itemEquip")
- util.AddNetworkString("inv_unitemEquip")
- util.AddNetworkString("inv_toolEquip")
- util.AddNetworkString("inv_untoolEquip")
- util.AddNetworkString("inv_refresh")
- util.AddNetworkString("inv_itemDrop")
- util.AddNetworkString("inv_equipNotify")
- util.AddNetworkString("inv_equipCancel")
- function meta:SyncInventory()
- net.Start("inv_sync")
- net.WriteTable(self.inventory)
- net.Send(self)
- self:SaveInventory()
- end
- function meta:CreateInventory()
- self.inventory = {backpack = {}, backpackSize = INVENTORY_CONFIG.NumSlots, primary = nil, secondary = nil, melee = nil, tools = {}}
- for i = 1, INVENTORY_CONFIG.NumSlots do
- self.inventory.backpack[i] = {item = nil, amount = nil}
- end
- for i = 1, 10 do
- self.inventory.tools[i] = {}
- end
- self:GiveDefaultItems()
- self:SyncInventory()
- end
- function meta:GiveDefaultItems()
- for i = 1, #INVENTORY_CONFIG.DefaultSpawnItems do
- self:AddInventoryItem(INVENTORY_CONFIG.DefaultSpawnItems[i].item, INVENTORY_CONFIG.DefaultSpawnItems[i].amount)
- end
- end
- function meta:AddInventoryItem(item_, amount_)
- if not self.inventory or not self.inventory.backpack then return end
- local backpack = self.inventory.backpack
- local noStack
- if table.HasValue(INVENTORY_CONFIG.NonstackableItems, INVENTORY_CONFIG.RegisteredItems[item_].itemtype) then
- noStack = true
- end
- local hasItem, slotItem = self:HasInventoryItem(item_)
- amount_ = amount_ or 1
- if hasItem and not noStack then
- local amt = backpack[slotItem].amount
- backpack[slotItem] = {item = item_, amount = amt + amount_}
- elseif not hasItem and not noStack then
- if self:GetUsedSlotNumber() + 1 <= INVENTORY_CONFIG.NumSlots then
- backpack[self:FindOpenSlot()] = {item = item_, amount = amount_}
- else
- self:ChatPrint("You do not have room to carry this item!")
- end
- elseif noStack then
- if self:GetUsedSlotNumber() + 1 <= INVENTORY_CONFIG.NumSlots then
- backpack[self:FindOpenSlot()] = {item = item_, amount = 1}
- else
- self:ChatPrint("You do not have room to carry this item!")
- end
- end
- self:SyncInventory()
- end
- function meta:GetUsedSlotNumber()
- if not self.inventory or not self.inventory.backpack then return end
- local backpack = self.inventory.backpack
- local num = 0
- for i = 1, #backpack do
- if backpack[i].item != nil then
- num = num + 1
- end
- end
- return num
- end
- function meta:FindOpenSlot()
- local openSlot = nil
- if not self.inventory or not self.inventory.backpack then return end
- local backpack = self.inventory.backpack
- for i = 1, #backpack do
- if backpack[i].item == nil then
- openSlot = i
- break
- end
- end
- return openSlot
- end
- function meta:HasInventoryItem(item_)
- local hasItem = false
- local slot = nil
- if not self.inventory or not self.inventory.backpack then return end
- local backpack = self.inventory.backpack
- for i = 1, #backpack do
- if backpack[i].item == item_ then
- hasItem = true
- slot = i
- break
- end
- end
- return hasItem, slot
- end
- function meta:RemoveInventoryItem(item_, amount_)
- if not self.inventory or not self.inventory.backpack then return end
- local backpack = self.inventory.backpack
- amount_ = amount_ or 1
- for i = 1, #backpack do
- if backpack[i].item == item_ then
- backpack[i].amount = backpack[i].amount - amount_
- if backpack[i].amount <= 0 then
- backpack[i] = {}
- end
- break
- end
- end
- self:SyncInventory()
- end
- function meta:RemoveInventorySlotItem(slot, amount_)
- if not self.inventory or not self.inventory.backpack then return end
- local backpack = self.inventory.backpack
- if not backpack[slot] then return end
- amount_ = amount_ or 1
- backpack[slot].amount = backpack[slot].amount - amount_
- if backpack[slot].amount <= 0 then
- backpack[slot] = {item = nil, amount = nil}
- end
- self:SyncInventory()
- end
- net.Receive("inv_itemDrop", function(len, ply)
- local slot = net.ReadInt(8)
- ply:DropInventoryItem(slot, false)
- end)
- function meta:IsSwappingInvWeapon()
- return timer.Exists(tostring(self) .. "inv_equipNotify")
- end
- /*
- function meta:EquipInventoryItem(item, slot)
- local reg = INVENTORY_CONFIG.RegisteredItems
- local inv = self.inventory
- local isMelee = reg[item].melee
- local isPrimary = reg[item].primary
- local isSecondary = reg[item].secondary
- local giveItem
- if inv.backpack[slot].item == nil or self:IsSwappingInvWeapon() then return end
- if isPrimary and inv.primary == nil then
- inv.primary = item
- giveItem = true
- elseif isSecondary and inv.secondary == nil then
- inv.secondary = item
- giveItem = true
- elseif isMelee and inv.melee == nil then
- inv.melee = item
- giveItem = true
- end
- if giveItem then
- self.UsePos = self:GetPos()
- self:InvEquipNotify(INVENTORY_CONFIG.EquipMessage)
- timer.Create(tostring(self) .. "inv_equipNotify", INVENTORY_CONFIG.SwapDelay, 1, function()
- self:Give(item)
- self:SelectWeapon(item)
- self:RemoveInventorySlotItem(slot, 1)
- self:RefreshInventory()
- end)
- for k,v in pairs(player.GetAll()) do
- if v:GetPos():Distance(self:GetPos()) < 250 then
- v:ChatPrint(self:GetName().. " is pulling a weapon out of their backpack.")
- end
- end
- end
- end
- */
- function meta:EquipInventoryItem(item, slot)
- local reg = INVENTORY_CONFIG.RegisteredItems
- local inv = self.inventory
- local isMelee = reg[item].melee
- local isPrimary = reg[item].primary
- local isSecondary = reg[item].secondary
- local giveItem
- if inv.backpack[slot].item == nil or self:IsSwappingInvWeapon() then return end
- if isPrimary and inv.primary == nil then
- giveItem = true
- elseif isSecondary and inv.secondary == nil then
- giveItem = true
- elseif isMelee and inv.melee == nil then
- giveItem = true
- end
- if not giveItem then return end
- for k,v in pairs(player.GetAll()) do
- if v:GetPos():Distance(self:GetPos()) < 250 then
- v:ChatPrint(self:GetName().. " is pulling a weapon out of their backpack.")
- end
- end
- self.UsePos = self:GetPos()
- self:InvEquipNotify(INVENTORY_CONFIG.EquipMessage)
- timer.Create(tostring(self) .. "inv_equipNotify", INVENTORY_CONFIG.SwapDelay, 1, function()
- if isPrimary and inv.primary == nil then
- inv.primary = item
- elseif isSecondary and inv.secondary == nil then
- inv.secondary = item
- elseif isMelee and inv.melee == nil then
- inv.melee = item
- end
- self:Give(item)
- self:SelectWeapon(item)
- self:RemoveInventorySlotItem(slot, 1)
- self:RefreshInventory()
- end)
- end
- function meta:UnEquipInventoryItem(item, slot)
- local reg = INVENTORY_CONFIG.RegisteredItems
- local inv = self.inventory
- local isMelee = reg[item].melee
- local isPrimary = reg[item].primary
- local isSecondary = reg[item].secondary
- if self:IsSwappingInvWeapon() then return end
- if inv.primary == item or inv.secondary == item or inv.melee == item then
- for k,v in pairs(player.GetAll()) do
- if v:GetPos():Distance(self:GetPos()) < 250 then
- v:ChatPrint(self:GetName().. " is putting a weapon back into their backpack.")
- end
- end
- self.UsePos = self:GetPos()
- self:InvEquipNotify(INVENTORY_CONFIG.UnequipMessage)
- timer.Create(tostring(self) .. "inv_equipNotify", INVENTORY_CONFIG.SwapDelay, 1, function()
- if isPrimary then
- inv.primary = nil
- elseif isSecondary then
- inv.secondary = nil
- elseif isMelee then
- inv.melee = nil
- end
- if self:HasWeapon(item) then
- self:StripWeapon(item)
- inv.backpack[slot] = {item = item, amount = 1}
- self:SyncInventory()
- self:RefreshInventory()
- end
- end)
- end
- end
- function meta:SwapInventorySlot(slotA, slotB)
- if self:IsSwappingInvWeapon() then return end
- local invBackpack = self.inventory.backpack
- local slotA_ = invBackpack[slotA]
- local slotB_ = invBackpack[slotB]
- invBackpack[slotA] = slotB_
- invBackpack[slotB] = slotA_
- self:SyncInventory()
- self:RefreshInventory()
- end
- function meta:DropInventoryItem(slot, equipped)
- local reg = INVENTORY_CONFIG.RegisteredItems
- if not self.inventory then return end
- local tr = util.TraceLine( {
- start = self:EyePos(),
- endpos = self:EyePos() + self:EyeAngles():Forward() * 80,
- filter = self,
- })
- if equipped and slot == nil then
- if self.inventory.primary != nil then
- local droppedItem = ents.Create("spawned_weapon")
- droppedItem:SetPos(self:EyePos())
- droppedItem:SetModel(reg[self.inventory.primary].model)
- droppedItem:SetWeaponClass(self.inventory.primary)
- droppedItem:Spawn()
- self.inventory.primary = nil
- end
- if self.inventory.secondary != nil then
- local droppedItem = ents.Create("spawned_weapon")
- droppedItem:SetPos(self:EyePos())
- droppedItem:SetModel(reg[self.inventory.secondary].model)
- droppedItem:SetWeaponClass(self.inventory.secondary)
- droppedItem:Spawn()
- self.inventory.secondary = nil
- end
- if self.inventory.melee != nil then
- local droppedItem = ents.Create("spawned_weapon")
- droppedItem:SetPos(self:EyePos())
- droppedItem:SetModel(reg[self.inventory.melee].model)
- droppedItem:SetWeaponClass(self.inventory.melee)
- droppedItem:Spawn()
- self.inventory.melee = nil
- end
- else
- if self:IsSwappingInvWeapon() then return end
- local item = self.inventory.backpack[slot].item
- if reg[item].itemtype == "weapon" then
- local droppedItem = ents.Create("spawned_weapon")
- droppedItem:SetPos(tr.HitPos)
- droppedItem:SetModel(reg[item].model)
- droppedItem:SetWeaponClass(item)
- droppedItem:Spawn()
- self:RemoveInventorySlotItem(slot, 1)
- self:RefreshInventory()
- elseif reg[item].itemtype == "prop" then
- local droppedItem = ents.Create("prop_physics")
- droppedItem:SetPos(tr.HitPos)
- droppedItem:SetModel(reg[item].model)
- droppedItem:Spawn()
- self:RemoveInventorySlotItem(slot, 1)
- self:RefreshInventory()
- elseif reg[item].itemtype == "entity" then
- local droppedItem = ents.Create(item)
- droppedItem:SetPos(tr.HitPos)
- droppedItem:Spawn()
- self:RemoveInventorySlotItem(slot, 1)
- self:RefreshInventory()
- end
- end
- self:SyncInventory()
- end
- function meta:InvEquipNotify(message, cancel)
- if cancel != true then
- net.Start("inv_equipNotify")
- net.WriteString(message)
- net.Send(self)
- else
- net.Start("inv_equipCancel")
- net.Send(self)
- end
- end
- hook.Add("PlayerPostThink", "CheckIfPlayerMoved", function(ply)
- ply.UsePos = ply.UsePos or ply:GetPos()
- if ply:HasPlayerMoved() and ply:IsSwappingInvWeapon() then
- ply:ChatPrint("Action cancelled.")
- timer.Destroy(tostring(ply).."inv_equipNotify")
- ply:InvEquipNotify(nil, true)
- end
- end)
- function meta:HasPlayerMoved()
- if self.UsePos:Distance(self:GetPos()) > 75 then
- return true
- else
- return false
- end
- end
- hook.Add("PlayerPickupDarkRPWeapon", "NoPickup", function(ply, ent, wep)
- if ply:GetUsedSlotNumber() + ent:Getamount() <= INVENTORY_CONFIG.NumSlots then
- for i = 1, ent:Getamount() do
- ply:AddInventoryItem(ent:GetWeaponClass())
- ent:Remove()
- end
- return true
- end
- end)
- hook.Add("canDropWeapon", "Inv_NoDropSwap", function(ply, weapon)
- return false
- end)
- function meta:RefreshInventory()
- net.Start("inv_refresh")
- net.Send(self)
- end
- net.Receive("inv_slotChange", function(len,ply)
- local slotA = net.ReadInt(8)
- local slotB = net.ReadInt(8)
- ply:SwapInventorySlot(slotA, slotB)
- end)
- net.Receive("inv_itemEquip", function(len,ply)
- local slot = net.ReadInt(8)
- local item = ply.inventory.backpack[slot].item
- ply:EquipInventoryItem(item, slot)
- end)
- net.Receive("inv_unitemEquip", function(len,ply)
- local class = net.ReadString()
- local slot = net.ReadInt(8)
- ply:UnEquipInventoryItem(class, slot)
- end)
- net.Receive("inv_toolEquip", function(len, ply)
- local slot = net.ReadInt(8)
- local targetSlot = net.ReadInt(8)
- local class = ply.inventory.backpack[slot].item
- if ply.inventory.tools[targetSlot].item == nil then
- ply:RemoveInventorySlotItem(slot, 1)
- ply.inventory.tools[targetSlot] = {item = class}
- ply:SyncInventory()
- ply:RefreshInventory()
- ply:Give(class)
- end
- end)
- net.Receive("inv_untoolEquip", function(len, ply)
- local dropslot = net.ReadInt(8) -- The slot being dropped onto
- local slot = net.ReadInt(8) -- The slot of the tool being dropped
- local class = net.ReadString() -- The class of the tool being dropped
- if ply.inventory.backpack[dropslot].item == nil and ply.inventory.tools[slot].item == class then
- ply.inventory.tools[slot] = {}
- ply.inventory.backpack[dropslot] = {item = class, amount = 1}
- ply:SyncInventory()
- ply:RefreshInventory()
- ply:StripWeapon(class)
- end
- end)
- hook.Add("PlayerInitialSpawn", "Inv_InitInventory", function(ply)
- timer.Simple(4, function()
- if !file.Exists(ply:GetInventoryDir(), "DATA") then
- ply:CreateInventoryDir()
- ply:CreateInventory()
- else
- ply:LoadInventory()
- end
- ply.UsePos = ply:GetPos()
- end)
- end)
- hook.Add("PlayerSpawn", "Inv_GiveTools", function(ply)
- if ply.inventory and ply.inventory.tools then
- for k,v in pairs(ply.inventory.tools) do
- if ply.inventory.tools[k].item != nil then
- ply:Give(ply.inventory.tools[k].item)
- ply:GiveInventoryLoadout()
- end
- end
- end
- if ply.inventory.backpack then ply:SyncInventory() end
- end)
- hook.Add("PlayerDeath", "DropInventoryItems", function(victim, inflictor, attacker)
- if victim.inventory then
- victim:DropInventoryItem(nil, true)
- end
- end)
- concommand.Add("reginfo", function(ply)
- if IsValid(ply:GetActiveWeapon()) then
- local wep = ply:GetActiveWeapon()
- ply:ChatPrint(wep:GetWeaponWorldModel() .. " " .. wep:GetClass())
- end
- end)
- function meta:GetInventoryDir()
- local ID = self:SteamID()
- return "inventory/"..string.sub(tostring(ID), 11).."/inventory"
- end
- function meta:CreateInventoryDir()
- local ID = self:SteamID()
- file.CreateDir("inventory/"..string.sub(tostring(ID), 11).."/inventory")
- end
- function meta:GetInventoryFile()
- return self:GetInventoryDir() .. "/inventory.txt"
- end
- function meta:SaveInventory()
- local storageData = util.TableToKeyValues(self.inventory)
- file.Write(self:GetInventoryFile(), storageData)
- end
- function meta:GiveInventoryLoadout()
- local inv = self.inventory
- if inv.primary != nil then
- self:Give(inv.primary)
- end
- if inv.secondary != nil then
- self:Give(inv.secondary)
- end
- if inv.melee != nil then
- self:Give(inv.melee)
- end
- end
- function meta:LoadInventory()
- local dataStorage = file.Read(self:GetInventoryFile(), "DATA")
- local datatbl = util.KeyValuesToTable(dataStorage)
- PrintTable(datatbl)
- self.inventory = {backpack = {}, backpackSize = INVENTORY_CONFIG.NumSlots, primary = nil, secondary = nil, melee = nil, tools = {}}
- for i = 1, INVENTORY_CONFIG.NumSlots do
- self.inventory.backpack[i] = {item = nil, amount = nil}
- end
- for i = 1, 10 do
- self.inventory.tools[i] = {}
- end
- for k,v in pairs(datatbl.backpack) do
- self.inventory.backpack[k] = v
- end
- if datatbl.tools then
- for k,v in pairs(datatbl.tools) do
- self.inventory.tools[k] = v
- end
- end
- self.inventory.primary = datatbl.primary
- self.inventory.secondary = datatbl.secondary
- self.inventory.melee = datatbl.melee
- self:SyncInventory()
- self:GiveInventoryLoadout()
- end
RAW Paste Data

