aboutsummaryrefslogtreecommitdiff
path: root/gamemode/inventorysystem/equipment/sh_equipment.lua
diff options
context:
space:
mode:
Diffstat (limited to 'gamemode/inventorysystem/equipment/sh_equipment.lua')
-rw-r--r--gamemode/inventorysystem/equipment/sh_equipment.lua180
1 files changed, 180 insertions, 0 deletions
diff --git a/gamemode/inventorysystem/equipment/sh_equipment.lua b/gamemode/inventorysystem/equipment/sh_equipment.lua
new file mode 100644
index 0000000..ca7c22d
--- /dev/null
+++ b/gamemode/inventorysystem/equipment/sh_equipment.lua
@@ -0,0 +1,180 @@
+--[[
+ A simple inventory that holds 1 item
+]]
+local itm = nrequire("item.lua")
+local ste = nrequire("utility/stream.lua")
+local inventory = nrequire("inventory/inventory.lua")
+print("Got invnetory table, it is:")
+PrintTable(inventory)
+local slots = {
+ "Head",
+ "Shoulders",
+ "Chest",
+ "Arms",
+ "Left Hand",
+ "Right Hand",
+ "Dual",
+ "Legs",
+ "Belt",
+ "Gloves",
+ "Feet",
+ "Back",
+ "Ring 1",
+ "Ring 2",
+ "Ring 3",
+ "Ring 4",
+ "Ring 5",
+ "Ring 6",
+}
+
+local inv = {}
+if SERVER then inv = nrequire("sv_equipment.lua") end
+if CLIENT then inv = nrequire("cl_equipment.lua") end
+
+inv.Name = "Equipment"
+inv.equiped = {}
+inv.FindPlaceFor = function(self, item)
+ --Make sure it's equipable
+ if not item.Equipable then return nil end
+
+ --If this is a dual weielding weapon
+ if item.Equipable == "Dual" then
+ if self.equiped["Left Hand"] == nil and self.equiped["Right Hand"] == nil then
+ return {"Dual"}
+ else
+ return nil
+ end
+ end
+
+ --If this item is a left or right handed, make sure we don't have a dual equiped
+ if item.Equipable == "Left Hand" or item.Equipable == "Right Hand" then
+ if self.equiped["Dual"] ~= nil then return nil
+ elseif self.equiped[item.Equipable] ~= nil then return nil
+ else return {item.Equipable} end
+ end
+
+ --If this item is a ring
+ if item.Equipable == "Ring" then
+ for i = 1,6 do
+ if self.equiped["Ring " .. i] == nil then
+ return {"Ring " .. i}
+ end
+ end
+ return nil
+ end
+
+ --Otherwise, just check if the slot is empty
+ if self.equiped[item.Equipable] == nil then
+ return {item.Equipable}
+ else
+ return nil
+ end
+end
+
+inv.CanFitIn = function(self,position,item)
+ return (position[1] == item.Equipable) and (self.equiped[position[1]] == nil)
+end
+
+inv.Put = function(self,position,item)
+ self.equiped[position[1]] = item
+end
+
+inv.Has = function(self,string_or_compare_func)
+ if type(string_or_compare_func) == "string" then
+ for k,v in pairs(self.equiped) do
+ if v.Name == string_or_compare_func then return k end
+ end
+ return nil
+ elseif type(string_or_compare_func) == "function" then
+ for k,v in pairs(self.equiped) do
+ if string_or_compare_func(v.Name) then return k end
+ end
+ return nil
+ end
+ error(string.format("equipment:Has() called with a %s, expected string or function.",type(string_or_compare_func)))
+end
+
+inv.Remove = function(self,position)
+ self.equiped[position[1]] = nil
+end
+
+inv.Get = function(self,position)
+ return self.equiped[position[1]]
+end
+
+inv.Serialize = function(self)
+ local tbl = {}
+ for k,v in pairs(self.equiped) do
+ tbl[k] = v:Serialize()
+ end
+ return util.TableToJSON(tbl)
+end
+
+inv.DeSerialize = function(self,data)
+ print("deserializeing, data was",data)
+ if data ~= nil and data ~= "" then
+ local tbl = util.JSONToTable(data)
+ local cpy = table.Copy(self)
+ for k,v in pairs(tbl) do
+ cpy.equiped[k] = itm.GetItemFromData(v)
+ end
+ else
+ return table.Copy(self)
+ end
+end
+
+inventory.RegisterInventory(inv)
+
+--[[
+for k,v in pairs(slots) do
+ local inv = {}
+ inv.Name = "inv_" .. v
+ inv.FindPlaceFor = function(self, item)
+ if self.item == nil then return {} else return nil end
+ end
+ inv.CanFitIn = function(self,position,item)
+ if self.item == nil then return true else return "Inventory slot occupied by a(n)" .. self.item.Name end
+ end
+ inv.Put = function(self,pos,item)
+ self.item = item
+ end
+ inv.Has = function(self,prt)
+ if type(prt) == "string" then
+ if self.item ~= nil and self.item.Name == prt then return {} else return nil end
+ elseif type(prt) == "function" then
+ if prt(self.item) then return {} else return nil end
+ end
+ error(string.format("Passed a %s to %s:Has(), expected string or function",type(prt),self.Name))
+ end
+ inv.Remove = function(self,pos)
+ self.item = nil
+ end
+ inv.Get = function(self,pos)
+ return self.item
+ end
+ inv.Serialize = function(self)
+ if self.item then
+ local data = ste.CreateStream()
+ local itemname = self.item.Name
+ local itemdata = self.item:Serialize()
+ data:WriteString(itemname)
+ data:WriteString(itemdata)
+ return data:ToString()
+ end
+ return ""
+ end
+ inv.DeSerialize = function(self,str)
+ print("data was",str)
+ if str == "" or str == nil then
+ return table.Copy(self)
+ else
+ local data = ste.CreateStream(str)
+ local itemname = data:ReadString()
+ local itemdata = data:ReadString()
+ self.item = itm.GetItemFromData(itemname,itemdata)
+ end
+ end
+ print("Attempting to register inventory with the name " .. inv.Name)
+ inventory.RegisterInventory(inv)
+end
+]]