FrameworkZ 4.4.2
Provides a framework for Project Zomboid with various systems.
Loading...
Searching...
No Matches
Items.lua
Go to the documentation of this file.
2
3--! \brief Items module for FrameworkZ. Defines and interacts with ITEM \object.
4--! \class FrameworkZ.Items
5FrameworkZ.Items = {}
6FrameworkZ.Items.__index = FrameworkZ.Items
7FrameworkZ.Items.List = {}
8FrameworkZ.Items.Instances = {}
9FrameworkZ.Items = FrameworkZ.Foundation:NewModule(FrameworkZ.Items, "Items")
10
11local ITEM = {}
12ITEM.__index = ITEM
14ITEM.name = "Unknown"
15ITEM.description = "No description available."
16ITEM.category = "Uncategorized"
17ITEM.useText = "Use"
18ITEM.useTime = 1
19ITEM.weight = 1
20ITEM.shouldConsume = true
22function ITEM:Initialize()
23 return FrameworkZ.Items:Initialize(self)
24end
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
32
33function ITEM:GetName()
34 return self.name or "Unnamed Item"
35end
36
37function ITEM:Remove()
38 FrameworkZ.Items:RemoveInstance(self.instanceID)
39end
40
41function FrameworkZ.Items:New(uniqueID, itemID, username)
42 if not uniqueID then return false, "Missing unique ID." end
44 local object = {
45 uniqueID = uniqueID,
46 itemID = itemID or "Base.Plank",
47 owner = username or nil,
48 }
50 setmetatable(object, ITEM)
52 return object, "Item created."
53end
54
55function FrameworkZ.Items:Initialize(data)
56 self.List[data.uniqueID] = data
58 return data.uniqueID
59end
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
68end
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
73
74 local item = self:GetItemByID(itemID)
75
76 if not item then return false, "Item not found." end
77
78 local success, message, worldItem = FrameworkZ.Items:CreateWorldItem(isoPlayer, item.itemID)
79
80 if not success or not worldItem then return false, message end
81
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 {}
97 }
98
99 FrameworkZ.Items:LinkWorldItemToInstanceData(worldItem, instanceData)
100
101 return true, "Created " .. itemInstance.uniqueID .. " item.", itemInstance
102end
104function FrameworkZ.Items:AddInstance(item, isoPlayer, worldItem)
105 local instanceID = #self.Instances + 1
106
107 --item["worldItem"] = worldItem
108 --self.Instances[instanceID] = item
109 table.insert(self.Instances, FrameworkZ.Utilities:CopyTable(item))
110
111 local itemInstance = self.Instances[instanceID]
112
113 if itemInstance.OnInstanced then
114 itemInstance:OnInstanced(isoPlayer, worldItem)
115 end
116
117 return instanceID, itemInstance
118end
119
120function FrameworkZ.Items:LinkWorldItemToInstanceData(worldItem, instanceData)
121 worldItem:getModData()["FZ_ITM"] = instanceData
122 worldItem:setName(instanceData.name)
123 worldItem:setActualWeight(instanceData.weight)
124end
125
126function FrameworkZ.Items:GetInstance(id)
127 return self.Instances[id]
128end
129
130function FrameworkZ.Items:RemoveInstance(id)
131 local instance = self.Instances[id]
132
133 if instance.OnRemoved then
134 instance:OnRemoved()
135 end
136
137 instance.worldItem:getContainer():DoRemoveItem(instance.worldItem)
138 self.Instances[id] = nil
139end
140
141function FrameworkZ.Items:GetItemByID(uniqueID)
142 local item = self.List[uniqueID] or nil
143
144 return item
145end
146
147-- TODO use multiple items, not just one
148function FrameworkZ.Items:OnUseItemCallback(parameters)
149 local worldItem, item, playerObject = parameters[1], parameters[2], parameters[3]
150
151 item:OnUse(playerObject, worldItem)
152end
153
154function FrameworkZ.Items:OnDropItemCallback(parameters)
155 local items, playerObject = ISInventoryPane.getActualItems(parameters[1]), parameters[2]
156
157 for _, item in ipairs(items) do
158 if not item:isFavorite() then
159 ISInventoryPaneContextMenu.dropItem(item, playerObject)
160 end
161 end
162end
163
164function FrameworkZ.Items:OnExamineItemCallback(parameters)
165 local item, playerObject = parameters[1], parameters[2]
166
167 playerObject:Say(item.description)
168end
169
170function FrameworkZ.Items:OnFillInventoryObjectContextMenu(player, context, items)
171 context:clear()
172
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")
178
179 items = ISInventoryPane.getActualItems(items)
180
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
186 end
187 end
188
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
196
197 if instance then
198 if instance.CanContext then
199 canContext = instance:CanContext(playerObject, v)
200 end
201
202 if canContext then
203 if instance.OnContext then
204 context = instance:OnContext(playerObject, menuManager, uniqueIDCounts[uniqueID])
205 end
206
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)
211 end
212 end
213
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)
217
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)
221 else
222 local option = Options.new()
223 option:setText("Malformed Item")
224 menuManager:addOption(option, interactSubMenu)
225 end
226 end
227 end
228
229 menuManager:buildMenu()
230
231 if interactSubMenu:getContext():isEmpty() then
232 local option = Options.new()
233 option:setText("No Interactions Available")
234 menuManager:addOption(option, interactSubMenu)
235 end
236end
237
238FrameworkZ.Foundation:RegisterModule(FrameworkZ.Items)
void id()
void player
void self isoPlayer
void context()
void local worldItem()
void uniqueID()
void items()
void itemID()
void local instanceData()
void local examineText()
void local useOption()
void local canContext()
void UnnamedFunction()
void local uniqueID()
void local option()
void local useText()
void local dropText()
void context()
void local instanceID()
void local dropOption()
void local instance()
void FrameworkZ()
void local examineOption()
void local itemData()
void self self
Definition MainMenu.lua:85
void self username()
void local item()
Items module for FrameworkZ. Defines and interacts with ITEM object.
Definition Items.lua:5
FrameworkZ Items __index
Definition Items.lua:7
FrameworkZ Items List
Definition Items.lua:9
FrameworkZ Items Instances
Definition Items.lua:11
FrameworkZ global table.
Definition Items.lua:60
void Remove()
void GetName()
void Initialize()