Mercurial > wow > wowdb-profiler
comparison Main.lua @ 19:6a0c96063003
Handle looting items from items. Renamed UnitEntry() to DBEntry() for clarity.
author | James D. Callahan III <jcallahan@curse.com> |
---|---|
date | Tue, 08 May 2012 12:59:23 -0500 |
parents | 86f02232a9e5 |
children | dae28edbbd61 |
comparison
equal
deleted
inserted
replaced
18:86f02232a9e5 | 19:6a0c96063003 |
---|---|
69 | 69 |
70 | 70 |
71 ----------------------------------------------------------------------- | 71 ----------------------------------------------------------------------- |
72 -- Helper Functions. | 72 -- Helper Functions. |
73 ----------------------------------------------------------------------- | 73 ----------------------------------------------------------------------- |
74 local function UnitEntry(unit_type, unit_id) | 74 local function DBEntry(data_type, unit_id) |
75 if not unit_type or not unit_id then | 75 if not data_type or not unit_id then |
76 return | 76 return |
77 end | 77 end |
78 local unit = db[unit_type][unit_id] | 78 local unit = db[data_type][unit_id] |
79 | 79 |
80 if not unit then | 80 if not unit then |
81 db[unit_type][unit_id] = {} | 81 db[data_type][unit_id] = {} |
82 unit = db[unit_type][unit_id] | 82 unit = db[data_type][unit_id] |
83 end | 83 end |
84 return unit | 84 return unit |
85 end | 85 end |
86 | 86 |
87 | 87 |
143 local function UpdateObjectLocation(identifier) | 143 local function UpdateObjectLocation(identifier) |
144 if not identifier then | 144 if not identifier then |
145 return | 145 return |
146 end | 146 end |
147 local zone_name, x, y, map_level, instance_type = CurrentLocationData() | 147 local zone_name, x, y, map_level, instance_type = CurrentLocationData() |
148 local object = UnitEntry("objects", identifier) | 148 local object = DBEntry("objects", identifier) |
149 object.locations = object.locations or {} | 149 object.locations = object.locations or {} |
150 | 150 |
151 if not object.locations[zone_name] then | 151 if not object.locations[zone_name] then |
152 object.locations[zone_name] = {} | 152 object.locations[zone_name] = {} |
153 end | 153 end |
154 object.locations[zone_name][("%s:%s:%s:%s"):format(instance_type, map_level, x, y)] = true | 154 object.locations[zone_name][("%s:%s:%s:%s"):format(instance_type, map_level, x, y)] = true |
155 end | |
156 | |
157 | |
158 local function HandleItemUse(item_link, bag_index, slot_index) | |
159 if not item_link then | |
160 return | |
161 end | |
162 local item_id = ItemLinkToID(item_link) | |
163 | |
164 if not bag_index or not slot_index then | |
165 for new_bag_index = 0, _G.NUM_BAG_FRAMES do | |
166 for new_slot_index = 1, _G.GetContainerNumSlots(new_bag_index) do | |
167 if item_id == ItemLinkToID(_G.GetContainerItemLink(new_bag_index, new_slot_index)) then | |
168 bag_index = new_bag_index | |
169 slot_index = new_slot_index | |
170 break | |
171 end | |
172 end | |
173 end | |
174 end | |
175 | |
176 if not bag_index or not slot_index then | |
177 return | |
178 end | |
179 local _, _, _, _, _, is_lootable = _G.GetContainerItemInfo(bag_index, slot_index) | |
180 | |
181 if not is_lootable then | |
182 return | |
183 end | |
184 DatamineTT:ClearLines() | |
185 DatamineTT:SetBagItem(bag_index, slot_index) | |
186 | |
187 for line_index = 1, DatamineTT:NumLines() do | |
188 local current_line = _G["WDPDatamineTTTextLeft" .. line_index] | |
189 | |
190 if not current_line then | |
191 break | |
192 end | |
193 | |
194 if current_line:GetText() == _G.ITEM_OPENABLE then | |
195 table.wipe(action_data) | |
196 action_data.type = AF.ITEM | |
197 action_data.item_id = item_id | |
198 action_data.loot_type = "contains" | |
199 break | |
200 end | |
201 end | |
155 end | 202 end |
156 | 203 |
157 | 204 |
158 ----------------------------------------------------------------------- | 205 ----------------------------------------------------------------------- |
159 -- Methods. | 206 -- Methods. |
180 for event_name, mapping in pairs(EVENT_MAPPING) do | 227 for event_name, mapping in pairs(EVENT_MAPPING) do |
181 self:RegisterEvent(event_name, (_G.type(mapping) ~= "boolean") and mapping or nil) | 228 self:RegisterEvent(event_name, (_G.type(mapping) ~= "boolean") and mapping or nil) |
182 end | 229 end |
183 durability_timer_handle = self:ScheduleRepeatingTimer("ProcessDurability", 30) | 230 durability_timer_handle = self:ScheduleRepeatingTimer("ProcessDurability", 30) |
184 target_location_timer_handle = self:ScheduleRepeatingTimer("UpdateTargetLocation", 0.2) | 231 target_location_timer_handle = self:ScheduleRepeatingTimer("UpdateTargetLocation", 0.2) |
232 | |
233 _G.hooksecurefunc("UseContainerItem", function(bag_index, slot_index, target_unit) | |
234 if target_unit then | |
235 return | |
236 end | |
237 HandleItemUse(_G.GetContainerItemLink(bag_index, slot_index), bag_index, slot_index) | |
238 | |
239 end) | |
240 | |
241 _G.hooksecurefunc("UseItemByName", function(identifier, target_unit) | |
242 if target_unit then | |
243 return | |
244 end | |
245 local _, item_link = _G.GetItemInfo(identifier) | |
246 HandleItemUse(item_link) | |
247 end) | |
185 end | 248 end |
186 | 249 |
187 | 250 |
188 local function RecordDurability(item_id, durability) | 251 local function RecordDurability(item_id, durability) |
189 if not durability or durability <= 0 then | 252 if not durability or durability <= 0 then |
235 | 298 |
236 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then | 299 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then |
237 return | 300 return |
238 end | 301 end |
239 local zone_name, x, y, map_level, instance_type = CurrentLocationData() | 302 local zone_name, x, y, map_level, instance_type = CurrentLocationData() |
240 local npc_data = UnitEntry("npcs", unit_idnum).stats[("level_%d"):format(_G.UnitLevel("target"))] | 303 local npc_data = DBEntry("npcs", unit_idnum).stats[("level_%d"):format(_G.UnitLevel("target"))] |
241 npc_data.locations = npc_data.locations or {} | 304 npc_data.locations = npc_data.locations or {} |
242 | 305 |
243 if not npc_data.locations[zone_name] then | 306 if not npc_data.locations[zone_name] then |
244 npc_data.locations[zone_name] = {} | 307 npc_data.locations[zone_name] = {} |
245 end | 308 end |
249 | 312 |
250 ----------------------------------------------------------------------- | 313 ----------------------------------------------------------------------- |
251 -- Event handlers. | 314 -- Event handlers. |
252 ----------------------------------------------------------------------- | 315 ----------------------------------------------------------------------- |
253 function WDP:COMBAT_TEXT_UPDATE(event, message_type, faction_name, amount) | 316 function WDP:COMBAT_TEXT_UPDATE(event, message_type, faction_name, amount) |
254 -- if message_type ~= "FACTION" or _G.UnitIsUnit("target", "questnpc") then | 317 -- if message_type ~= "FACTION" or _G.UnitIsUnit("target", "questnpc") then |
255 -- return | 318 -- return |
256 -- end | 319 -- end |
257 -- local unit_type, unit_idnum = self:ParseGUID(_G.UnitGUID("target")) | 320 -- local unit_type, unit_idnum = self:ParseGUID(_G.UnitGUID("target")) |
258 -- local npc = UnitEntry("npcs", unit_idnum) | 321 -- local npc = DBEntry("npcs", unit_idnum) |
259 -- | 322 -- |
260 -- if not npc then | 323 -- if not npc then |
261 -- return | 324 -- return |
262 -- end | 325 -- end |
263 -- npc.reputations = npc.reputations or {} | 326 -- npc.reputations = npc.reputations or {} |
264 -- npc.reputations[faction_name] = amount | 327 -- npc.reputations[faction_name] = amount |
265 -- | 328 -- |
266 -- print(("%s: %s, %s, %s"):format(event, message_type, faction_name, amount)) | 329 -- print(("%s: %s, %s, %s"):format(event, message_type, faction_name, amount)) |
267 end | 330 end |
268 | 331 |
269 | 332 |
270 function WDP:LOOT_CLOSED() | 333 function WDP:LOOT_CLOSED() |
327 } | 390 } |
328 | 391 |
329 | 392 |
330 local LOOT_UPDATE_FUNCS = { | 393 local LOOT_UPDATE_FUNCS = { |
331 [AF.ITEM] = function() | 394 [AF.ITEM] = function() |
332 local item = UnitEntry("items", action_data.item_id) | 395 local item = DBEntry("items", action_data.item_id) |
333 local loot_type = action_data.loot_type | 396 local loot_type = action_data.loot_type or "drops" |
334 item[loot_type] = item[loot_type] or {} | 397 item[loot_type] = item[loot_type] or {} |
335 | 398 |
336 for index = 1, #action_data.loot_list do | 399 for index = 1, #action_data.loot_list do |
337 table.insert(item[loot_type], action_data.loot_list[index]) | 400 table.insert(item[loot_type], action_data.loot_list[index]) |
338 end | 401 end |
339 end, | 402 end, |
340 [AF.NPC] = function() | 403 [AF.NPC] = function() |
341 local npc = UnitEntry("npcs", action_data.id_num) | 404 local npc = DBEntry("npcs", action_data.id_num) |
342 | 405 |
343 if not npc then | 406 if not npc then |
344 return | 407 return |
345 end | 408 end |
346 local loot_type = action_data.loot_type or "drops" | 409 local loot_type = action_data.loot_type or "drops" |
349 for index = 1, #action_data.loot_list do | 412 for index = 1, #action_data.loot_list do |
350 table.insert(npc[loot_type], action_data.loot_list[index]) | 413 table.insert(npc[loot_type], action_data.loot_list[index]) |
351 end | 414 end |
352 end, | 415 end, |
353 [AF.OBJECT] = function() | 416 [AF.OBJECT] = function() |
354 local object = UnitEntry("objects", action_data.identifier) | 417 local object = DBEntry("objects", action_data.identifier) |
355 object.drops = object.drops or {} | 418 object.drops = object.drops or {} |
356 | 419 |
357 for index = 1, #action_data.loot_list do | 420 for index = 1, #action_data.loot_list do |
358 table.insert(object.drops, action_data.loot_list[index]) | 421 table.insert(object.drops, action_data.loot_list[index]) |
359 end | 422 end |
360 end, | 423 end, |
361 [AF.ZONE] = function() | 424 [AF.ZONE] = function() |
362 local loot_type = action_data.loot_type or "drops" | 425 local loot_type = action_data.loot_type or "drops" |
363 local zone = UnitEntry("zones", action_data.zone) | 426 local zone = DBEntry("zones", action_data.zone) |
364 zone[loot_type] = zone[loot_type] or {} | 427 zone[loot_type] = zone[loot_type] or {} |
365 | 428 |
366 local location_data = ("%s:%s:%s:%s"):format(action_data.instance_type, action_data.map_level, action_data.x, action_data.y) | 429 local location_data = ("%s:%s:%s:%s"):format(action_data.instance_type, action_data.map_level, action_data.x, action_data.y) |
367 local loot_data = zone[loot_type][location_data] | 430 local loot_data = zone[loot_type][location_data] |
368 | 431 |
452 local unit_type, unit_idnum = self:ParseGUID(_G.UnitGUID("target")) | 515 local unit_type, unit_idnum = self:ParseGUID(_G.UnitGUID("target")) |
453 | 516 |
454 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then | 517 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then |
455 return | 518 return |
456 end | 519 end |
457 local merchant = UnitEntry("npcs", unit_idnum) | 520 local merchant = DBEntry("npcs", unit_idnum) |
458 merchant.sells = merchant.sells or {} | 521 merchant.sells = merchant.sells or {} |
459 | 522 |
460 for item_index = 1, _G.GetMerchantNumItems() do | 523 for item_index = 1, _G.GetMerchantNumItems() do |
461 local _, _, copper_price, stack_size, num_available, _, extended_cost = _G.GetMerchantItemInfo(item_index) | 524 local _, _, copper_price, stack_size, num_available, _, extended_cost = _G.GetMerchantItemInfo(item_index) |
462 local item_id = ItemLinkToID(_G.GetMerchantItemLink(item_index)) | 525 local item_id = ItemLinkToID(_G.GetMerchantItemLink(item_index)) |
563 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then | 626 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then |
564 return | 627 return |
565 end | 628 end |
566 table.wipe(action_data) | 629 table.wipe(action_data) |
567 | 630 |
568 local npc = UnitEntry("npcs", unit_idnum) | 631 local npc = DBEntry("npcs", unit_idnum) |
569 local _, class_token = _G.UnitClass("target") | 632 local _, class_token = _G.UnitClass("target") |
570 npc.class = class_token | 633 npc.class = class_token |
571 -- TODO: Add faction here | 634 -- TODO: Add faction here |
572 npc.gender = GENDER_NAMES[_G.UnitSex("target")] or "UNDEFINED" | 635 npc.gender = GENDER_NAMES[_G.UnitSex("target")] or "UNDEFINED" |
573 npc.is_pvp = _G.UnitIsPVP("target") and true or nil | 636 npc.is_pvp = _G.UnitIsPVP("target") and true or nil |
601 local unit_type, unit_id = WDP:ParseGUID(_G.UnitGUID("questnpc")) | 664 local unit_type, unit_id = WDP:ParseGUID(_G.UnitGUID("questnpc")) |
602 | 665 |
603 if unit_type == private.UNIT_TYPES.OBJECT then | 666 if unit_type == private.UNIT_TYPES.OBJECT then |
604 UpdateObjectLocation(unit_id) | 667 UpdateObjectLocation(unit_id) |
605 end | 668 end |
606 local quest = UnitEntry("quests", _G.GetQuestID()) | 669 local quest = DBEntry("quests", _G.GetQuestID()) |
607 quest[point] = quest[point] or {} | 670 quest[point] = quest[point] or {} |
608 quest[point][("%s:%d"):format(private.UNIT_TYPE_NAMES[unit_type + 1], unit_id)] = true | 671 quest[point][("%s:%d"):format(private.UNIT_TYPE_NAMES[unit_type + 1], unit_id)] = true |
609 end | 672 end |
610 | 673 |
611 | 674 |