3--! \brief Items
module for FrameworkZ. Defines and interacts with ITEM \object.
4--! \class FrameworkZ.Items
6FrameworkZ.Items.__index = FrameworkZ.Items
7FrameworkZ.Items.List = {}
8FrameworkZ.Items.Instances = {}
9FrameworkZ.Items = FrameworkZ.Foundation:NewModule(FrameworkZ.Items, "Items")
15ITEM.description = "No description available."
16ITEM.category = "Uncategorized"
20ITEM.shouldConsume = true
22function ITEM:Initialize()
23 return FrameworkZ.Items:Initialize(self)
26function ITEM:CanContext(isoPlayer, worldItem) return true end
27function ITEM:CanDrop(isoPlayer, worldItem) return true end
28function ITEM:CanUse(isoPlayer, worldItem) return true end
29function ITEM:OnContext(playerObject, instance, interactContext) end
30function ITEM:OnInstanced(isoPlayer, worldItem) end
31function ITEM:OnUse(isoPlayer, worldItem) end
33function ITEM:GetName()
34 return self.name or "Unnamed Item"
38 FrameworkZ.Items:RemoveInstance(self.instanceID)
41function FrameworkZ.Items:New(uniqueID, itemID, username)
42 if not uniqueID then return false, "Missing unique ID." end
46 itemID = itemID or "Base.Plank",
47 owner = username or nil,
50 setmetatable(object, ITEM)
52 return object, "Item created."
55function FrameworkZ.Items:Initialize(data)
56 self.List[data.uniqueID] = data
61function FrameworkZ.Items:CreateWorldItem(isoPlayer, fullItemID)
62 if not isoPlayer then return false, "Missing ISO Player." end
63 if not fullItemID then return false, "Missing full item ID." end
65 local worldItem = isoPlayer:getInventory():AddItem(InventoryItemFactory.CreateItem(fullItemID))
67 return true, "Created world item.", worldItem
70function FrameworkZ.Items:CreateItem(itemID, isoPlayer)
71 if not itemID then return false, "Missing item ID." end
72 if not isoPlayer then return false, "Missing ISO Player." end
74 local item = self:GetItemByID(itemID)
76 if not item then return false, "Item not found." end
78 local success, message, worldItem = FrameworkZ.Items:CreateWorldItem(isoPlayer, item.itemID)
80 if not success or not worldItem then return false, message end
82 local instanceID, itemInstance = self:AddInstance(item, isoPlayer, worldItem)
84 local instanceData = {
85 uniqueID = itemInstance.uniqueID,
86 itemID = worldItem:getFullType(),
87 instanceID = instanceID,
88 owner = isoPlayer:getUsername(),
89 name = itemInstance.name or "Unknown",
90 description = itemInstance.description or "No description available.",
91 category = itemInstance.category or "Uncategorized",
92 shouldConsume = itemInstance.shouldConsume or false,
93 weight = itemInstance.weight or 1,
94 useAction = itemInstance.useAction or nil,
95 useTime = itemInstance.useTime or nil,
96 customFields = itemInstance.customFields or {}
99 FrameworkZ.Items:LinkWorldItemToInstanceData(worldItem, instanceData)
101 return true, "Created " .. itemInstance.uniqueID .. " item.", itemInstance
104function FrameworkZ.Items:AddInstance(item, isoPlayer, worldItem)
105 local instanceID = #self.Instances + 1
107 --item["worldItem"] = worldItem
108 --self.Instances[instanceID] = item
109 table.insert(self.Instances, FrameworkZ.Utilities:CopyTable(item))
111 local itemInstance = self.Instances[instanceID]
113 if itemInstance.OnInstanced then
114 itemInstance:OnInstanced(isoPlayer, worldItem)
117 return instanceID, itemInstance
120function FrameworkZ.Items:LinkWorldItemToInstanceData(worldItem, instanceData)
121 worldItem:getModData()["FZ_ITM"] = instanceData
122 worldItem:setName(instanceData.name)
123 worldItem:setActualWeight(instanceData.weight)
126function FrameworkZ.Items:GetInstance(id)
127 return self.Instances[id]
130function FrameworkZ.Items:RemoveInstance(id)
131 local instance = self.Instances[id]
133 if instance.OnRemoved then
137 instance.worldItem:getContainer():DoRemoveItem(instance.worldItem)
138 self.Instances[id] = nil
141function FrameworkZ.Items:GetItemByID(uniqueID)
142 local item = self.List[uniqueID] or nil
147-- TODO use multiple items, not just one
148function FrameworkZ.Items:OnUseItemCallback(parameters)
149 local worldItem, item, playerObject = parameters[1], parameters[2], parameters[3]
151 item:OnUse(playerObject, worldItem)
154function FrameworkZ.Items:OnDropItemCallback(parameters)
155 local items, playerObject = ISInventoryPane.getActualItems(parameters[1]), parameters[2]
157 for _, item in ipairs(items) do
158 if not item:isFavorite() then
159 ISInventoryPaneContextMenu.dropItem(item, playerObject)
164function FrameworkZ.Items:OnExamineItemCallback(parameters)
165 local item, playerObject = parameters[1], parameters[2]
167 playerObject:Say(item.description)
170function FrameworkZ.Items:OnFillInventoryObjectContextMenu(player, context, items)
173 local playerObject = getSpecificPlayer(player)
174 local menuManager = MenuManager.new(context)
175 local interactSubMenu = menuManager:addSubMenu("Interact")
176 local equipSubMenu = menuManager:addSubMenu("Equip")
177 local manageSubMenu = menuManager:addSubMenu("Manage")
179 items = ISInventoryPane.getActualItems(items)
181 local uniqueIDCounts = {}
182 for k, v in pairs(items) do
183 if instanceof(v, "InventoryItem") and v:getModData()["FZ_ITM"] then
184 local uniqueID = v:getModData()["FZ_ITM"].uniqueID
185 uniqueIDCounts[uniqueID] = (uniqueIDCounts[uniqueID] or 0) + 1
189 for k, v in pairs(items) do
190 if instanceof(v, "InventoryItem") and v:getModData()["FZ_ITM"] then
191 local itemData = v:getModData()["FZ_ITM"]
192 local uniqueID = itemData.uniqueID
193 local instanceID = itemData.instanceID
194 local instance = self:GetInstance(instanceID)
195 local canContext = false
198 if instance.CanContext then
199 canContext = instance:CanContext(playerObject, v)
203 if instance.OnContext then
204 context = instance:OnContext(playerObject, menuManager, uniqueIDCounts[uniqueID])
207 if instance.OnUse then
208 local useText = (instance.useText or "Use") .. " " .. instance.name
209 local useOption = Options.new(useText, self, FrameworkZ.Items.OnUseItemCallback, {v, instance, playerObject}, true, true, uniqueIDCounts[uniqueID])
210 menuManager:addAggregatedOption(uniqueID, useOption, interactSubMenu)
214 local examineText = "Examine " .. instance.name
215 local examineOption = Options.new(examineText, self, FrameworkZ.Items.OnExamineItemCallback, {v, instance, playerObject}, false, true, uniqueIDCounts[uniqueID])
216 menuManager:addAggregatedOption("Examine" .. uniqueID, examineOption, interactSubMenu)
218 local dropText = "Drop " .. instance.name
219 local dropOption = Options.new(dropText, self, FrameworkZ.Items.OnDropItemCallback, {v, player}, false, true, uniqueIDCounts[uniqueID])
220 menuManager:addAggregatedOption(uniqueID, dropOption, manageSubMenu)
222 local option = Options.new()
223 option:setText("Malformed Item")
224 menuManager:addOption(option, interactSubMenu)
229 menuManager:buildMenu()
231 if interactSubMenu:getContext():isEmpty() then
232 local option = Options.new()
233 option:setText("No Interactions Available")
234 menuManager:addOption(option, interactSubMenu)
238FrameworkZ.Foundation:RegisterModule(FrameworkZ.Items)
void local instanceData()
void local examineOption()
Items module for FrameworkZ. Defines and interacts with ITEM object.
FrameworkZ Items Instances