965e8589c9
I implemented a QuestHelper_GetTime function for the next time Blizzard decides to fiddle with the time functions. It returns debugprofilestop() / 1000, to exactly match the precision of GetTime(). I also re-removed references to Cartographer from the rollback.
135 lignes
4,3 Kio
Lua
135 lignes
4,3 Kio
Lua
|
|
local GetTime = QuestHelper_GetTime
|
|
|
|
QuestHelper_File["collect_equip.lua"] = "4.0.1.$svnversion$"
|
|
QuestHelper_Loadtime["collect_equip.lua"] = GetTime()
|
|
|
|
local debug_output = false
|
|
if QuestHelper_File["collect_equip.lua"] == "Development Version" then debug_output = true end
|
|
|
|
local GetItemType
|
|
local Notifier
|
|
local GetSpecBolus
|
|
local Patterns
|
|
|
|
local QHCI
|
|
|
|
-- why does this need to exist
|
|
local invloc_lookup_proto = {
|
|
INVTYPE_HEAD = {"HeadSlot"},
|
|
INVTYPE_NECK = {"NeckSlot"},
|
|
INVTYPE_SHOULDER = {"ShoulderSlot"},
|
|
INVTYPE_CHEST = {"ChestSlot"},
|
|
INVTYPE_ROBE = {"ChestSlot"},
|
|
INVTYPE_WAIST = {"WaistSlot"},
|
|
INVTYPE_LEGS = {"LegsSlot"},
|
|
INVTYPE_FEET = {"FeetSlot"},
|
|
INVTYPE_WRIST = {"WristSlot"},
|
|
INVTYPE_HAND = {"HandsSlot"},
|
|
INVTYPE_FINGER = {"Finger0Slot", "Finger1Slot"},
|
|
INVTYPE_TRINKET = {"Trinket0Slot", "Trinket1Slot"},
|
|
INVTYPE_CLOAK = {"BackSlot"},
|
|
INVTYPE_WEAPON = {"MainHandSlot", "SecondaryHandSlot"},
|
|
INVTYPE_SHIELD = {"SecondaryHandSlot"},
|
|
INVTYPE_2HWEAPON = {"MainHandSlot"},
|
|
INVTYPE_WEAPONMAINHAND = {"MainHandSlot"},
|
|
INVTYPE_WEAPONOFFHAND = {"SecondaryHandSlot"},
|
|
INVTYPE_HOLDABLE = {"RangedSlot"},
|
|
INVTYPE_RANGED = {"RangedSlot"},
|
|
INVTYPE_THROWN = {"RangedSlot"},
|
|
INVTYPE_RANGEDRIGHT = {"RangedSlot"},
|
|
INVTYPE_RELIC = {"RangedSlot"},
|
|
}
|
|
|
|
local invloc_lookup = {}
|
|
|
|
for k, v in pairs(invloc_lookup_proto) do
|
|
local temp = {}
|
|
for _, tv in pairs(v) do
|
|
table.insert(temp, (GetInventorySlotInfo(tv)))
|
|
end
|
|
invloc_lookup[k] = temp
|
|
end
|
|
|
|
local function Recheck(item, location, competing)
|
|
local replaced_item = nil
|
|
local confused = false
|
|
|
|
for i, v in pairs(invloc_lookup[location]) do
|
|
if competing[i] then
|
|
local ilink = GetInventoryItemLink("player", v)
|
|
if ilink then
|
|
local itype = GetItemType(ilink)
|
|
local eqtext = nil
|
|
if itype == item then
|
|
replaced_item = competing[i]
|
|
elseif itype == competing[i] then
|
|
else
|
|
confused = true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if confused then
|
|
if debug_output then QuestHelper:TextOut(string.format("Confused about %s", GetItemInfo(item))) end
|
|
return
|
|
end
|
|
|
|
if not QHCI[item] then QHCI[item] = {} end
|
|
if replaced_item then
|
|
if debug_output then QuestHelper:TextOut(string.format("Equipped %s over %s", GetItemInfo(item), GetItemInfo(replaced))) end
|
|
if not QHCI[item].equip_yes then QHCI[item].equip_yes = {} end
|
|
table.insert(QHCI[item].equip_yes, { replaced = replaced_item, spec = GetSpecBolus() })
|
|
else
|
|
for _, v in pairs(competing) do
|
|
if debug_output then QuestHelper:TextOut(string.format("Did not equip %s over %s", GetItemInfo(item), GetItemInfo(v))) end
|
|
if not QHCI[item].equip_no then QHCI[item].equip_no = {} end
|
|
table.insert(QHCI[item].equip_no, { item = v, spec = GetSpecBolus() })
|
|
end
|
|
end
|
|
end
|
|
|
|
local function Looted(message)
|
|
item = string.match(message, Patterns.LOOT_ITEM_PUSHED_SELF)
|
|
if not item then item = string.match(message, Patterns.LOOT_ITEM_SELF) end
|
|
if not item then return end
|
|
|
|
local item = GetItemType(message, true)
|
|
|
|
local name, _, quality, ilvl, min, itype, isubtype, _, equiploc, _ = GetItemInfo(item)
|
|
|
|
if name and IsEquippableItem(item) and min <= UnitLevel("player") and invloc_lookup[equiploc] then -- The level comparison may be redundant
|
|
local competing = {}
|
|
local nonempty = false
|
|
for i, v in pairs(invloc_lookup[equiploc]) do
|
|
local litem = GetInventoryItemLink("player", v)
|
|
if litem then litem = GetItemType(litem) end
|
|
if litem and litem ~= item then competing[i] = litem nonempty = true end
|
|
end
|
|
|
|
if not nonempty then return end -- congratulations you are better than nothing, we do not care
|
|
|
|
Notifier(GetTime() + 5 * 60, function () Recheck(item, equiploc, competing) end)
|
|
end
|
|
end
|
|
|
|
function QH_Collect_Equip_Init(QHCData, API)
|
|
if not QHCData.item then QHCData.item = {} end
|
|
QHCI = QHCData.item
|
|
|
|
Patterns = API.Patterns
|
|
QuestHelper: Assert(Patterns)
|
|
|
|
API.Patterns_Register("LOOT_ITEM_PUSHED_SELF", "|c.*|r")
|
|
API.Patterns_Register("LOOT_ITEM_SELF", "|c.*|r")
|
|
|
|
QH_Event("CHAT_MSG_LOOT", Looted)
|
|
|
|
GetItemType = API.Utility_GetItemType
|
|
Notifier = API.Utility_Notifier
|
|
GetSpecBolus = API.Utility_GetSpecBolus
|
|
QuestHelper: Assert(GetItemType)
|
|
QuestHelper: Assert(Notifier)
|
|
QuestHelper: Assert(GetSpecBolus)
|
|
end
|