From a42ea42ec39e9bda384693abf97a1dcc8a232eca Mon Sep 17 00:00:00 2001 From: James Whitehead II Date: Sun, 17 Aug 2008 10:20:29 +0000 Subject: [PATCH] Fix for mainhand/offhand code, and added a debug frame --- DressToKill.lua | 125 +++++++++++++++++++++++++++++++++--------------- DressToKillOptions.lua | 42 ++++++++++++++++ 2 files changed, 129 insertions(+), 38 deletions(-) diff --git a/DressToKill.lua b/DressToKill.lua index ce38e62..406b6f9 100644 --- a/DressToKill.lua +++ b/DressToKill.lua @@ -6,15 +6,16 @@ local L = DressToKillLocals local DEBUG = false local function debug(fmt, ...) + local msg = "|cffffff78DressToKill:|r " + if select("#", ...) > 0 then + msg = msg .. fmt:format(...) + else + msg = msg .. fmt + end if DEBUG then - local msg = "|cffffff78DressToKill:|r " - if select("#", ...) > 0 then - msg = msg .. fmt:format(...) - else - msg = msg .. fmt - end ChatFrame1:AddMessage(msg) end + DressToKillDebugScrollFrame:AddMessage(msg) end function DressToKill:SetDebug(value) @@ -96,82 +97,115 @@ function DressToKill:FindEmptySlot() end local function scanFunction(weightFunction) - debug(L["Beginning an inventory scan"]) + debug(L["********** Beginning an inventory scan **********"]) UIErrorsFrame:AddMessage("Please do not change buffs or forms during scan...", 1, 0.2, 0.2) local blacklist = {} local slotAvail = {} for slotName,slotId in pairs(slotIds) do + debug(L["Collecting available items for %s"], slotName) local avail = GetInventoryItemsForSlot(slotId) if next(avail) then + local c = 0 + for k,v in pairs(avail) do c = c + 1 end + debug(L["Found %d available items"], c) slotAvail[slotId] = avail + else + debug(L["Found no available items"]) end end -- Let's handle the weapons, since they're somewhat complicated - local mh_stash, oh_stash = {}, {} - local mainslot, offslot = slotIds["MainHandSlot"], slotIds["SecondaryHandSlot"] + local mainslot = GetInventorySlotInfo("MainHandSlot") + local offslot = GetInventorySlotInfo("SecondaryHandSlot") -- Unequip both weapon slots local mh_link = GetInventoryItemLink("player", mainslot) local oh_link = GetInventoryItemLink("player", offslot) + + debug(L["Mainhand link: %s"], tostring(mh_link)) + debug(L["Offhand link: %s"], tostring(oh_link)) + if mh_link then + debug(L["Found a mainhand weapon: %s"], mh_link) local mh_bag, mh_slot = DressToKill:FindEmptySlot() if not mh_bag then print(L["Out of inventory space, cannot proceed"]) return end - mh_stash.bag = mh_bag - mh_stash.slot = mh_slot + debug(L["Unequipping the mainhand weapon"]) + PickupInventoryItem(mainslot) + PickupContainerItem(mh_bag, mh_slot) + coroutine.yield() end if oh_link then + debug(L["Found an offhand weapon: %s"], oh_link) local oh_bag, oh_slot = DressToKill:FindEmptySlot() if not oh_bag then print(L["Out of inventory space, cannot proceed"]) return end - oh_stash.bag = oh_bag - oh_stash.slot = oh_slot + debug(L["Unequipping the offhand weapon"]) + PickupInventoryItem(offslot) + PickupContainerItem(oh_bag, oh_slot) + coroutine.yield() end + local mh_avail = GetInventoryItemsForSlot(mainslot) + local oh_avail = GetInventoryItemsForSlot(offslot) + -- Calculate weapon base score with nothing equipped local linen_shirt = "\124cffffffff\124Hitem:2576:0:0:0:0:0:0:0\124h[White Linen Shirt]\124h\124r" - local weapon_base = weightFunction(linen_shirt, mainslot) + weightFunction(linen_shirt, offslot) + local mh_base = weightFunction(linen_shirt, mainslot) or 0 + local oh_base = mh_base local weapon_max, weapon_win = 0, {} + debug(L["Weapon base score: %s"], mh_base) + -- Try on each mainhand weapon - for mh_mask,item in pairs(slotAvail[mainslot]) do - local mh_equipped = DressToKill:EquipItem(mainslot, mh_mask, mh_stash) + for mh_mask,item in pairs(mh_avail) do + local name, link = GetItemInfo(item) + debug(L["Equipping mainhand weapon: %s"], link) + + local mh_equipped = DressToKill:EquipItem(mainslot, mh_mask) blacklist[mh_mask] = true if mh_equipped then + debug(L["Successfully equipped %s"], link) local mh_link = GetInventoryItemLink("player", mainslot) - local mh_score = weightFunction(mh_link, mainslot) - weapon_base + local mh_score = weightFunction(mh_link, mainslot) - mh_base local score = mh_score + debug(L["Mainhand score: %d"], score) if not IsEquippedItemType("Two-Hand") then + debug(L["This is a one hand weapon, try offhand weapons"]) -- Try to equip each off-hand weapon to compliment this one - for oh_mask,item in pairs(slotAvail[offslot]) do - local oh_equipped = DressToKill:EquipItem(offslot, oh_mask, oh_stash) - - -- If we equipped offhand, then score it too - if oh_equipped then - local oh_link = GetInventoryItemLink("player", offslot) or linen_shirt - local oh_score = weightFunction(oh_link, offslot) - weapon_base - score = score + oh_score - end - - debug("Got score of %s for %s and %s", score, mh_link, oh_link or "empty") - if score >= weapon_max then - weapon_max = score - weapon_win.mh = mh_mask - weapon_win.oh = oh_equipped and oh_mask or nil - end - - -- Unequip the offhand item - if oh_equipped then - DressToKill:UnequipItem(offslot, oh_mask, oh_stash) + for oh_mask,item in pairs(oh_avail) do + if not blacklist[oh_mask] then + local name, link = GetItemInfo(item) + + debug(L["Equipping offhand weapon: %s"], link) + local oh_equipped = DressToKill:EquipItem(offslot, oh_mask) + + -- If we equipped offhand, then score it too + if oh_equipped then + local oh_link = GetInventoryItemLink("player", offslot) or linen_shirt + local oh_score = weightFunction(oh_link, offslot) - score + score = score + oh_score + end + + debug("Got score of %s for %s and %s", score, mh_link, oh_link or "empty") + if score >= weapon_max then + weapon_max = score + weapon_win.mh = mh_mask + weapon_win.oh = oh_equipped and oh_mask or nil + end + + -- Unequip the offhand item + if oh_equipped then + DressToKill:UnequipItem(offslot, oh_mask, oh_stash) + end end end else @@ -193,9 +227,11 @@ local function scanFunction(weightFunction) DressToKill:EquipItem(mainslot, weapon_win.mh, mh_stash) local link = GetInventoryItemLink("player", mainslot) print("Choosing %s", link) + debug("Choosing %s", link) blacklist[weapon_win.mh] = true + -- Equip the offhand winner, if there was one - if weapon_min.oh then + if weapon_win.oh then DressToKill:EquipItem(offslot, weapon_win.oh, oh_stash) local link = GetInventoryItemLink("player", offslot) print("Choosing %s", link) @@ -256,6 +292,7 @@ local function scanFunction(weightFunction) end UIErrorsFrame:AddMessage("Scan complete!", 0.2, 1, 0.2) print("Evaluation complete!") + debug(L["Evaluation complete!"]) end function DressToKill:EquipItem(slotId, mask, stash) @@ -307,6 +344,10 @@ local function OnEvent(self, event, arg1) self.equipped = false debug(L["Clearing item we don't have the proficiency for"]) ClearCursor() + elseif event == "UI_ERROR_MESSAGE" and arg1 == ERR_2HSKILLNOTFOUND then + self.equipped = false + debug(L["Clearing item since we lack dual wielding skill"]) + ClearCursor() end local thread = DressToKill.currentThread @@ -336,6 +377,11 @@ SlashCmdList["DRESSTOKILL"] = function(msg, editbox) return end + if msg and msg:lower():match("%s*debug%s*") then + InterfaceOptionsFrame_OpenToFrame(DressToKillDebugFrame) + return + end + -- Check to see if a function was specified on the commandline local weightName = msg:match("^%s*(.+)$") if not weightName then @@ -389,6 +435,9 @@ local bagMap = { [0x800] = 4, } function DressToKill:ItemInBag(mask) + if not mask then + debug(debugstack()) + end if bit.band(mask, ITEM_INVENTORY_BAGS) > 0 then local bag = bagMap[bit.band(mask, MASK_BAG)] local slot = bit.band(mask, MASK_SLOT) diff --git a/DressToKillOptions.lua b/DressToKillOptions.lua index 9cb198c..697a35d 100644 --- a/DressToKillOptions.lua +++ b/DressToKillOptions.lua @@ -260,3 +260,45 @@ end ) InterfaceOptions_AddCategory(frame) +local debugframe = CreateFrame("Frame", "DressToKillDebugFrame", UIParent) +debugframe.name = L["Debug Log"] +debugframe.parent = L["Dress to Kill"] +debugframe:Hide() +debugframe:SetScript("OnShow", function(frame) + debugframe:SetScript("OnShow", nil) +end) + +local scrollframe = CreateFrame("ScrollingMessageFrame", "DressToKillDebugScrollFrame", debugframe) +scrollframe:SetPoint("TOPLEFT", 10, -10) +scrollframe:SetPoint("BOTTOMRIGHT", -10, 10) +scrollframe:SetFontObject("ChatFontNormal") +scrollframe:SetJustifyH("LEFT") +scrollframe:SetFading(false) +scrollframe:EnableMouseWheel(true) +scrollframe:SetInsertMode("BOTTOM") +scrollframe:SetMaxLines(99999) +local function scroll(self, delta) + if delta > 0 then + if IsShiftKeyDown() then + self:ScrollToTop() + elseif IsControlKeyDown() then + self:PageUp() + else + self:ScrollUp() + end + elseif delta < 0 then + if IsShiftKeyDown() then + self:ScrollToBottom() + elseif IsControlKeyDown() then + self:PageDown() + else + self:ScrollDown() + end + end +end +scrollframe:SetScript("OnHyperlinkClick", function(self, ...) + ChatFrame_OnHyperlinkShow(...) +end) +scrollframe:SetScript("OnMouseWheel", scroll) + +InterfaceOptions_AddCategory(debugframe) -- 1.7.9.5