diff options
Diffstat (limited to 'gamemode/inventorysystem/equipment/sh_equipment.lua')
| -rw-r--r-- | gamemode/inventorysystem/equipment/sh_equipment.lua | 180 |
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 +]] |
