Quantum is a Garry's Mod RPG framework.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
quantum/gamemode/engine/lib/server/sv_inventory.lua

120 lines
3.5 KiB

-- __ _ _______ _ __
-- / / /\ | | |__ __| | | \ \
-- / / / \ | |_ __ ___ | | ___ ___| |__ \ \
-- < < / /\ \ | | '_ ` _ \| |/ _ \/ __| '_ \ > >
-- \ \ / ____ \| | | | | | | | __/ (__| | | | / /
-- \_\ /_/ \_\_|_| |_| |_|_|\___|\___|_| |_| /_/
Quantum.Server.Inventory = {}
function Quantum.Server.Inventory.Create( char )
char.inventory = {}
return char.inventory
end
local function isEquippable( item )
return item.equipable || false
end
local function isStackable( item )
return item.stack || false
end
function Quantum.Server.Inventory.SetSlotItem( char, pos, itemid, amount )
local item = Quantum.Item.Get( itemid )
if( isEquippable( item ) || !isStackable( item ) ) then
amount = 1
char.inventory[pos] = { itemid }
else
amount = amount || 1
char.inventory[pos] = { itemid, amount }
end
Quantum.Debug( "Gave " .. char.name .. " " .. amount .. "x [" .. item.name .. "] at " .. tostring(pos) )
end
function Quantum.Server.Inventory.GetSlotItem( char, pos ) return char.inventory[pos] end
function Quantum.Server.Inventory.FindStackable( char, item )
if( item.stack ) then
local inv = Quantum.Server.Char.GetInventory( char )
for i, item2 in pairs( inv ) do
if( item2[1] == item.id ) then -- if the item is stackable and it is the same item
return i -- return its index
end
end
else
return
end
end
local function getStackSize( char, item )
return item.stack || 1
end
local function sortItem( char, itemid, amount )
local item = Quantum.Item.Get( itemid )
local slotitem = Quantum.Server.Inventory.GetSlotItem( char, index )
local inv = Quantum.Server.Char.GetInventory( char )
local stacksize = getStackSize( char, item )
local index = Quantum.Server.Inventory.FindStackable( char, item ) || #inv + 1
local rest = amount
if( slotitem != nil ) then rest = rest + slotitem[2] end
local count = 0
local itemInSlot = Quantum.Server.Inventory.GetSlotItem( char, index )
while( rest > stacksize ) do
count = count + 1
if( count == 1 ) then
if( itemInSlot != nil ) then
rest = rest - ( stacksize - itemInSlot[2] )
else
rest = rest - stacksize
end
Quantum.Server.Inventory.SetSlotItem( char, index, itemid, stacksize )
else
index = index + 1
itemInSlot = Quantum.Server.Inventory.GetSlotItem( char, index )
if( itemInSlot != nil ) then
if( itemInSlot[1] == itemid && itemInSlot[2] < stacksize ) then
rest = rest - ( stacksize - itemInSlot[2] )
Quantum.Server.Inventory.SetSlotItem( char, index, itemid, stacksize )
if( rest <= 0 ) then
rest = 0
break
end
end
else
rest = rest - stacksize
Quantum.Server.Inventory.SetSlotItem( char, index, itemid, stacksize )
end
end
end
Quantum.Server.Inventory.SetSlotItem( char, #inv + 1, itemid, rest )
end
function Quantum.Server.Inventory.GiveItem( pl, itemid, amount )
local char = Quantum.Server.Char.GetCurrentCharacter( pl )
local inv = Quantum.Server.Char.GetInventory( char )
local item = Quantum.Item.Get( itemid )
if( item == nil ) then Quantum.Error( "Tried to give " .. tostring(pl) .. " a non-existent item! Item '" .. tostring(itemid) .. "' does not exist." ) return end
if( #inv + 1 <= Quantum.Inventory.Width * Quantum.Inventory.Height || Quantum.Server.Inventory.FindStackable( char, item ) != nil ) then
sortItem( char, itemid, amount )
-- send net message to client about item update
else
Quantum.Debug( "Tried to give " .. tostring(pl) .. " a item but their inventory is full!" )
end
end