if (SERVER) then util.AddNetworkString("ixBagDrop") end ITEM.name = "Bag" ITEM.description = "A bag to hold items." ITEM.model = "models/props_c17/suitcase001a.mdl" ITEM.category = "Storage" ITEM.width = 2 ITEM.height = 2 ITEM.invWidth = 4 ITEM.invHeight = 2 ITEM.isBag = true ITEM.functions.View = { icon = "icon16/briefcase.png", OnClick = function(item) local index = item:GetData("id", "") if (index) then local panel = ix.gui["inv"..index] local inventory = ix.item.inventories[index] local parent = IsValid(ix.gui.menuInventoryContainer) and ix.gui.menuInventoryContainer or ix.gui.openedStorage if (IsValid(panel)) then panel:Remove() end if (inventory and inventory.slots) then panel = vgui.Create("ixInventory", IsValid(parent) and parent or nil) panel:SetInventory(inventory) panel:ShowCloseButton(true) panel:SetTitle(item.GetName and item:GetName() or L(item.name)) if (parent != ix.gui.menuInventoryContainer) then panel:Center() if (parent == ix.gui.openedStorage) then panel:MakePopup() end else panel:MoveToFront() end ix.gui["inv"..index] = panel else ErrorNoHalt("[Helix] Attempt to view an uninitialized inventory '"..index.."'\n") end end return false end, OnCanRun = function(item) return !IsValid(item.entity) and item:GetData("id") and !IsValid(ix.gui["inv" .. item:GetData("id", "")]) end } ITEM.functions.combine = { OnRun = function(item, data) ix.item.instances[data[1]]:Transfer(item:GetData("id"), nil, nil, item.player) return false end, OnCanRun = function(item, data) local index = item:GetData("id", "") if (index) then local inventory = ix.item.inventories[index] if (inventory) then return true end end return false end } if (CLIENT) then function ITEM:PaintOver(item, width, height) local panel = ix.gui["inv" .. item:GetData("id", "")] if (!IsValid(panel)) then return end if (vgui.GetHoveredPanel() == self) then panel:SetHighlighted(true) else panel:SetHighlighted(false) end end end -- Called when a new instance of this item has been made. function ITEM:OnInstanced(invID, x, y) local inventory = ix.item.inventories[invID] ix.inventory.New(inventory and inventory.owner or 0, self.uniqueID, function(inv) local client = inv:GetOwner() inv.vars.isBag = self.uniqueID self:SetData("id", inv:GetID()) if (IsValid(client)) then inv:AddReceiver(client) end end) end function ITEM:GetInventory() local index = self:GetData("id") if (index) then return ix.item.inventories[index] end end ITEM.GetInv = ITEM.GetInventory -- Called when the item first appears for a client. function ITEM:OnSendData() local index = self:GetData("id") if (index) then local inventory = ix.item.inventories[index] if (inventory) then inventory.vars.isBag = self.uniqueID inventory:Sync(self.player) inventory:AddReceiver(self.player) else local owner = self.player:GetCharacter():GetID() ix.inventory.Restore(self:GetData("id"), self.invWidth, self.invHeight, function(inv) inv.vars.isBag = self.uniqueID inv:SetOwner(owner, true) if (!inv.owner) then return end for client, character in ix.util.GetCharacters() do if (character:GetID() == inv.owner) then inv:AddReceiver(client) break end end end) end else ix.inventory.New(self.player:GetCharacter():GetID(), self.uniqueID, function(inv) self:SetData("id", inv:GetID()) end) end end ITEM.postHooks.drop = function(item, result) local index = item:GetData("id") local query = mysql:Update("ix_inventories") query:Update("character_id", 0) query:Where("inventory_id", index) query:Execute() net.Start("ixBagDrop") net.WriteUInt(index, 32) net.Send(item.player) end if (CLIENT) then net.Receive("ixBagDrop", function() local index = net.ReadUInt(32) local panel = ix.gui["inv"..index] if (panel and panel:IsVisible()) then panel:Close() end end) end -- Called before the item is permanently deleted. function ITEM:OnRemoved() local index = self:GetData("id") if (index) then local query = mysql:Delete("ix_items") query:Where("inventory_id", index) query:Execute() query = mysql:Delete("ix_inventories") query:Where("inventory_id", index) query:Execute() end end -- Called when the item should tell whether or not it can be transfered between inventories. function ITEM:CanTransfer(oldInventory, newInventory) local index = self:GetData("id") if (newInventory) then if (newInventory.vars and newInventory.vars.isBag) then return false end local index2 = newInventory:GetID() if (index == index2) then return false end for k, _ in self:GetInventory():Iter() do if (k:GetData("id") == index2) then return false end end end return !newInventory or newInventory:GetID() != oldInventory:GetID() or newInventory.vars.isBag end function ITEM:OnTransferred(curInv, inventory) local bagInventory = self:GetInventory() if (isfunction(curInv.GetOwner)) then local owner = curInv:GetOwner() if (IsValid(owner)) then bagInventory:RemoveReceiver(owner) end end if (isfunction(inventory.GetOwner)) then local owner = inventory:GetOwner() if (IsValid(owner)) then bagInventory:AddReceiver(owner) bagInventory:SetOwner(owner) end else -- it's not in a valid inventory so nobody owns this bag bagInventory:SetOwner(nil) end end -- Called after the item is registered into the item tables. function ITEM:OnRegistered() ix.inventory.Register(self.uniqueID, self.invWidth, self.invHeight, true) end