-- Advanced Trade Skill Window v0.4.0 -- copyright 2006 by Rene Schneider (Slarti on EU-Blackhand) -- main script file ATSW_TRADE_SKILLS_DISPLAYED = 23; ATSW_MAX_TRADE_SKILL_REAGENTS = 8; ATSW_TRADE_SKILL_HEIGHT = 16; ATSW_MAX_DELAY = 4.0; ATSW_MAX_RETRIES = 5; ATSWTypeColor = { }; ATSWTypeColor["optimal"] = { r = 1.00, g = 0.50, b = 0.25 }; ATSWTypeColor["medium"] = { r = 1.00, g = 1.00, b = 0.00 }; ATSWTypeColor["easy"] = { r = 0.25, g = 0.75, b = 0.25 }; ATSWTypeColor["trivial"] = { r = 0.50, g = 0.50, b = 0.50 }; ATSWTypeColor["header"] = { r = 1.00, g = 0.82, b = 0 }; ATSWRarityColor={}; ATSWRarityColor[5] = { r = 0.64, g = 0.21, b = 0.93 }; ATSWRarityColor[4] = { r = 0, g = 0.44, b = 0.87 }; ATSWRarityColor[3] = { r = 0.12, g = 1, b = 0 }; ATSWRarityColor[2] = { r = 1, g = 1, b = 1 }; ATSWRarityColor[1] = { r = 0.62, g = 0.62, b = 0.62 }; ATSWRarityNames={}; ATSWRarityNames["purple"]=5; ATSWRarityNames["blue"]=4; ATSWRarityNames["green"]=3; ATSWRarityNames["white"]=2; ATSWRarityNames["grey"]=1; atsw_tradeskilllist={}; atsw_tradeskillheaders={}; atsw_skilllisting={}; atsw_tradeskillcounter={}; atsw_selectedskill=""; atsw_displayedgroup=""; atsw_retries=0; atsw_retrydelay=0; atsw_retry=false; atsw_delay=0; atsw_working=false; atsw_processingtimeout=0; atsw_scans=0; atsw_updatedelay=0; atsw_uncategorizedexpanded=true; atsw_tradeskillid={}; atsw_orderby={}; atsw_updating=false; atsw_incombat=false; atsw_bankopened=false; atsw_oldmode=false; atsw_disabled={}; function ATSW_OnLoad() SLASH_ATSW1 = "/atsw"; SlashCmdList["ATSW"] = ATSW_Command; ATSWFrame:RegisterEvent("TRADE_SKILL_UPDATE"); ATSWFrame:RegisterEvent("TRADE_SKILL_CLOSE"); ATSWFrame:RegisterEvent("TRADE_SKILL_SHOW"); ATSWFrame:RegisterEvent("UNIT_PORTRAIT_UPDATE"); ATSWFrame:RegisterEvent("UPDATE_TRADESKILL_RECAST"); ATSWFrame:RegisterEvent("BANKFRAME_OPENED"); ATSWFrame:RegisterEvent("BANKFRAME_CLOSED"); ATSWFrame:RegisterEvent("PLAYERBANKSLOTS_CHANGED"); ATSWFrame:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED"); ATSWFrame:RegisterEvent("MERCHANT_SHOW"); ATSWFrame:RegisterEvent("MERCHANT_UPDATE"); ATSWFrame:RegisterEvent("MERCHANT_CLOSED"); ATSWFrame:RegisterEvent("BAG_UPDATE"); ATSWFrame:RegisterEvent("TRAINER_CLOSED"); ATSWFrame:RegisterEvent("PLAYER_REGEN_DISABLED"); ATSWFrame:RegisterEvent("PLAYER_REGEN_ENABLED"); ATSWFrame:RegisterEvent("AUCTION_HOUSE_CLOSED"); ATSWFrame:RegisterEvent("AUCTION_HOUSE_SHOW"); ATSWFrame:RegisterEvent("CRAFT_SHOW"); ATSWFrame:RegisterEvent("CRAFT_CLOSE"); end function ATSW_ShowWindow() if(type(atsw_orderby)~="table") then atsw_orderby={}; end if(not atsw_orderby[UnitName("player")]) then atsw_orderby[UnitName("player")]={}; end if(not atsw_orderby[UnitName("player")][atsw_selectedskill]) then atsw_orderby[UnitName("player")][atsw_selectedskill]="nothing"; end if(atsw_oldmode and atsw_orderby[UnitName("player")][atsw_selectedskill]=="nothing") then atsw_orderby[UnitName("player")][atsw_selectedskill]="name"; end atsw_oldtradeskillcount=0; ShowUIPanel(ATSWCheckerFrame); SetPortraitTexture(ATSWFramePortrait, "player"); if(not atsw_oldmode) then ExpandTradeSkillSubClass(0); if(ATSW_GetTradeSkillSelectionIndex()>1) then ATSWFrame_SetSelection(ATSW_GetTradeSkillSelectionIndex()); else if(ATSW_GetNumTradeSkills()>0) then ATSWFrame_SetSelection(ATSW_GetFirstTradeSkill()); FauxScrollFrame_SetOffset(ATSWListScrollFrame, 0); end ATSWListScrollFrameScrollBar:SetValue(0); end end ATSWFrameTitleText:SetText(format(TEXT(TRADE_SKILL_TITLE), ATSW_GetTradeSkillLine()).." - "..ATSW_VERSION); ATSW_AdjustFrame(); ATSW_ResetPossibleItemCounts(); ATSW_CreateTradeSkillList(); ATSW_CreateSkillListing(); ATSWInv_UpdateItemList(); ShowUIPanel(ATSWFrame); ATSWFrame_UpdateQueue(); ATSWInv_UpdateQueuedItemList(); ATSWFrame_Update(); ATSWInputBox:SetText("1"); atsw_updatedelay=0.5; end function ATSW_HideWindow() HideUIPanel(ATSWFrame); end function ATSW_GetSelectedSkill() atsw_selectedskill=ATSW_GetTradeSkillLine(); if(not atsw_disabled[UnitName("player")]) then atsw_disabled[UnitName("player")]={}; end if(not atsw_disabled[UnitName("player")][atsw_selectedskill]) then atsw_disabled[UnitName("player")][atsw_selectedskill]=0; end end function ATSW_CheckForRescan() atsw_scans=0; skillname=ATSW_GetTradeSkillLine(); if(skillname) then if(skillname~=atsw_displayedgroup) then atsw_displayedgroup=skillname; atsw_selectedskill=skillname; ATSW_DeleteQueue(); ATSW_CreateTradeSkillList(); ATSW_NoteNecessaryItemsForQueue(); end end end function ATSW_OnHide() if(not atsw_oldmode) then TradeSkillFrame_Hide(); else CraftFrame_Hide(); end HideUIPanel(ATSWCheckerFrame); HideUIPanel(ATSWReagentFrame); HideUIPanel(ATSWCSFrame); end function ATSW_Command(cmd) if(cmd=="show") then ATSW_ShowWindow(); elseif(cmd=="disable") then ATSW_DisableForActiveTradeskill(); elseif(cmd=="enable") then ATSW_EnableForActiveTradeskill(); end end function ATSW_DisableForActiveTradeskill() if(atsw_oldmode) then if(CraftFrame and CraftFrame:IsVisible()) then atsw_disabled[UnitName("player")][atsw_selectedskill]=1; HideUIPanel(ATSWFrame); CraftFrame:SetAlpha(1); CraftFrame:SetScale(1); ATSW_DisplayMessage(ATSW_ACTIVATIONMESSAGE.." "..ATSW_DEACTIVATED); end else if(TradeSkillFrame and TradeSkillFrame:IsVisible()) then atsw_disabled[UnitName("player")][atsw_selectedskill]=1; HideUIPanel(ATSWFrame); TradeSkillFrame:SetAlpha(1); TradeSkillFrame:SetScale(1); ATSW_DisplayMessage(ATSW_ACTIVATIONMESSAGE.." "..ATSW_DEACTIVATED); end end end function ATSW_EnableForActiveTradeskill() if(atsw_oldmode) then if(CraftFrame and CraftFrame:IsVisible()) then atsw_disabled[UnitName("player")][atsw_selectedskill]=0; ATSW_ShowWindow(); CraftFrame:SetAlpha(0); CraftFrame:SetScale(0.001); ATSW_DisplayMessage(ATSW_ACTIVATIONMESSAGE.." "..ATSW_ACTIVATED); end else if(TradeSkillFrame and TradeSkillFrame:IsVisible()) then atsw_disabled[UnitName("player")][atsw_selectedskill]=0; ATSW_ShowWindow(); TradeSkillFrame:SetAlpha(0); TradeSkillFrame:SetScale(0.001); ATSW_DisplayMessage(ATSW_ACTIVATIONMESSAGE.." "..ATSW_ACTIVATED); end end end function ATSWFrame_Show() ATSW_ShowWindow(); end function ATSW_CheckForTradeSkillWindow(arg1) if(ATSWFrame:IsVisible()) then if(atsw_updatedelay>0) then atsw_updatedelay=atsw_updatedelay-arg1; if(atsw_updatedelay<=0) then ATSWFrame_Update(); atsw_updatedelay=0; end end ATSW_CheckForRescan(); end if(atsw_processnext==true) then atsw_processnext=false; ATSW_ProcessNextQueueItem(); end if(atsw_processing==true) then if(atsw_processingtimeout~=0) then if(atsw_processingtimeout>0) then atsw_processingtimeout=atsw_processingtimeout-arg1; else atsw_processingtimeout=0; ATSWQueueStartStopButton:SetText(ATSW_STARTQUEUE); atsw_processing=false; ATSWFrame:UnregisterEvent("SPELLCAST_STOP"); ATSWFrame:UnregisterEvent("SPELLCAST_CHANNEL_STOP"); ATSWFrame:UnregisterEvent("SPELLCAST_START"); ATSWFrame:UnregisterEvent("SPELLCAST_INTERRUPTED"); end end if(atsw_retry==true) then if(atsw_retrydelay1) then ATSWFrame_SetSelection(ATSW_GetTradeSkillSelectionIndex()); else if(ATSW_GetNumTradeSkills()>0) then ATSWFrame_SetSelection(ATSW_GetFirstTradeSkill()); FauxScrollFrame_SetOffset(ATSWListScrollFrame, 0); end ATSWListScrollFrameScrollBar:SetValue(0); end if(atsw_updating==false) then ATSW_ResetPossibleItemCounts(); ATSW_CreateSkillListing(); ATSWFrame_Update(); end end elseif(event=="UNIT_PORTRAIT_UPDATE") then if(arg1=="player") then SetPortraitTexture(TradeSkillFramePortrait, "player"); end elseif(event=="UPDATE_TRADESKILL_RECAST") then ATSWInputBox:SetNumber(GetTradeskillRepeatCount()); elseif(event=="SPELLCAST_STOP" or event=="SPELLCAST_CHANNEL_STOP") then ATSW_SpellcastStop(); elseif(event=="SPELLCAST_START") then ATSW_SpellcastStart(); elseif(event=="SPELLCAST_INTERRUPTED") then ATSW_SpellcastInterrupted(); elseif(event=="TRAINER_CLOSED") then ATSW_ResetPossibleItemCounts(); ATSW_CreateSkillListing(); if(ATSWFrame:IsVisible()) then ATSWFrame_Update(); end elseif(event=="PLAYER_REGEN_ENABLED") then atsw_incombat=false; elseif(event=="PLAYER_REGEN_DISABLED") then atsw_incombat=true; end end function ATSW_AdjustFrame() if(atsw_oldmode) then ATSWHeaderSortButton:Hide(); ATSWInvSlotDropDown:Hide(); ATSWSubClassDropDown:Hide(); ATSWExpandButtonFrame:Hide(); ATSWCreateButton:Hide(); ATSWQueueButton:Hide(); ATSWCreateAllButton:Hide(); ATSWQueueAllButton:Hide(); ATSWDecrementButton:Hide(); ATSWInputBox:Hide(); ATSWIncrementButton:Hide(); ATSWQueueStartStopButton:Hide(); ATSWQueueDeleteButton:Hide(); ATSWReagentsButton:Hide(); ATSWHorizontalBarLeft:Hide(); ATSWHorizontalBarLeft2:Hide(); ATSWHorizontalBarLeftAddon:Hide(); ATSWHorizontalBarLeft2Addon:Hide(); ATSWEnchantButton:Show(); ATSWReagentLabel:SetPoint("TOPLEFT", "ATSWFrame", "TOPLEFT" , 380, -180); ATSWCraftDescription:Show(); else ATSWHeaderSortButton:Show(); ATSWInvSlotDropDown:Show(); ATSWSubClassDropDown:Show(); ATSWExpandButtonFrame:Show(); ATSWCreateButton:Show(); ATSWQueueButton:Show(); ATSWCreateAllButton:Show(); ATSWQueueAllButton:Show(); ATSWDecrementButton:Show(); ATSWInputBox:Show(); ATSWIncrementButton:Show(); ATSWQueueStartStopButton:Show(); ATSWQueueDeleteButton:Show(); ATSWReagentsButton:Show(); ATSWHorizontalBarLeft:Show(); ATSWHorizontalBarLeft2:Show(); ATSWHorizontalBarLeftAddon:Show(); ATSWHorizontalBarLeft2Addon:Show(); ATSWEnchantButton:Hide(); ATSWReagentLabel:SetPoint("TOPLEFT", "ATSWFrame", "TOPLEFT" , 380, -136); ATSWCraftDescription:Hide(); end end function ATSW_SortTradeSkills() local tradeskills={}; ExpandTradeSkillSubClass(0); local numTradeSkills=ATSW_GetNumTradeSkills(); for i=1,numTradeSkills,1 do local skillName, skillType, numAvailable, isExpanded = ATSW_GetTradeSkillInfo(i); if(skillType~="header") then local skillTypeNumber=0; if(skillType=="easy") then skillTypeNumber=1; end if(skillType=="medium") then skillTypeNumber=2; end if(skillType=="optimal") then skillTypeNumber=3; end table.insert(tradeskills,{name=skillName,id=i,skilltype=skillTypeNumber}); end end atsw_tradeskillid={}; table.setn(atsw_tradeskillid,0); if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="name") then table.sort(tradeskills,ATSW_CompareName); for i=1,table.getn(tradeskills),1 do table.insert(atsw_tradeskillid,tradeskills[i].id); end end if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="difficulty") then table.sort(tradeskills,ATSW_CompareDifficulty); for i=1,table.getn(tradeskills),1 do table.insert(atsw_tradeskillid,tradeskills[i].id); end end end function ATSW_CompareName(i,j) return string.lower(i.name) < string.lower(j.name); end function ATSW_CompareDifficulty(i,j) return string.lower(i.skilltype) > string.lower(j.skilltype); end function ATSW_OrderBy(order) atsw_orderby[UnitName("player")][atsw_selectedskill]=order; ATSW_CreateSkillListing(); ATSWFrame_Update(); end function ATSWFrame_Update() if(type(atsw_orderby)~="table") then atsw_orderby={}; end if(not atsw_orderby[UnitName("player")]) then atsw_orderby[UnitName("player")]={}; end if(not atsw_orderby[UnitName("player")][atsw_selectedskill]) then atsw_orderby[UnitName("player")][atsw_selectedskill]="nothing"; end if(atsw_oldmode and atsw_orderby[UnitName("player")][atsw_selectedskill]=="nothing") then atsw_orderby[UnitName("player")][atsw_selectedskill]="name"; end if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="name") then ATSWHeaderSortButton:SetChecked(false); ATSWNameSortButton:SetChecked(true); ATSWDifficultySortButton:SetChecked(false); ATSWCustomSortButton:SetChecked(false); elseif(atsw_orderby[UnitName("player")][atsw_selectedskill]=="difficulty") then ATSWHeaderSortButton:SetChecked(false); ATSWNameSortButton:SetChecked(false); ATSWDifficultySortButton:SetChecked(true); ATSWCustomSortButton:SetChecked(false); elseif(atsw_orderby[UnitName("player")][atsw_selectedskill]=="custom") then ATSWHeaderSortButton:SetChecked(false); ATSWNameSortButton:SetChecked(false); ATSWDifficultySortButton:SetChecked(false); ATSWCustomSortButton:SetChecked(true); else ATSWHeaderSortButton:SetChecked(true); ATSWNameSortButton:SetChecked(false); ATSWDifficultySortButton:SetChecked(false); ATSWCustomSortButton:SetChecked(false); end for i=1,ATSW_TRADE_SKILLS_DISPLAYED,1 do getglobal("ATSWSkill"..i):Hide(); end if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="nothing" or atsw_orderby[UnitName("player")][atsw_selectedskill]=="custom") then ATSWExpandButtonFrame:Show(); local numTradeSkills=table.getn(atsw_skilllisting); local skillOffset=FauxScrollFrame_GetOffset(ATSWListScrollFrame); if(numTradeSkills==0) then ATSWFrameTitleText:SetText(format(TEXT(TRADE_SKILL_TITLE), ATSW_GetTradeSkillLine()).." - "..ATSW_VERSION); ATSWSkillName:Hide(); ATSWSkillIcon:Hide(); ATSWRequirementLabel:Hide(); ATSWCollapseAllButton:Disable(); for i=1, ATSW_MAX_TRADE_SKILL_REAGENTS, 1 do getglobal("ATSWReagent"..i):Hide(); end else ATSWSkillName:Show(); ATSWSkillIcon:Show(); ATSWCollapseAllButton:Enable(); end FauxScrollFrame_Update(ATSWListScrollFrame, numTradeSkills, ATSW_TRADE_SKILLS_DISPLAYED, ATSW_TRADE_SKILL_HEIGHT, nil, nil, nil, ATSWHighlightFrame, 293, 316); ATSWHighlightFrame:Hide(); local jumped=1; for i=1,ATSW_TRADE_SKILLS_DISPLAYED,1 do local skillName, skillType, numAvailable, isExpanded; local skillIndex; repeat skillIndex=skillOffset+jumped; if(skillIndex>numTradeSkills) then skillName=nil; else skillName = atsw_skilllisting[skillIndex].name; skillType = atsw_skilllisting[skillIndex].type; isExpanded = atsw_skilllisting[skillIndex].expanded; end jumped=jumped+1; until ((skillName and ATSW_Filter(skillName)==true and ATSW_FilterInvSlot(skillName) and ATSW_FilterSubClass(skillName)) or skillIndex>numTradeSkills or skillType=="header"); if(skillName) then numAvailable=ATSW_GetNumItemsPossible(skillName); end local skillButton=getglobal("ATSWSkill"..i); if(skillIndex<=numTradeSkills) then if(ATSWListScrollFrame:IsVisible()) then skillButton:SetWidth(293); else skillButton:SetWidth(323); end local color=ATSWTypeColor[skillType]; if(color) then skillButton:SetTextColor(color.r, color.g, color.b); end if(atsw_skilllisting[skillIndex] and atsw_skilllisting[skillIndex].id) then skillButton:SetID(atsw_skilllisting[skillIndex].id); else return; end skillButton:Show(); if(skillType=="header") then skillButton:SetText(skillName); if(isExpanded) then skillButton:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up"); else skillButton:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up"); end getglobal("ATSWSkill"..i.."Highlight"):SetTexture("Interface\\Buttons\\UI-PlusButton-Hilight"); getglobal("ATSWSkill"..i):UnlockHighlight(); else if(not skillName)then return; end skillButton:SetNormalTexture(""); getglobal("ATSWSkill"..i.."Highlight"):SetTexture(""); if(atsw_multicount==true) then if ( numAvailable == 0 ) then skillButton:SetText(" "..skillName); else skillButton:SetText(" "..skillName.." ["..numAvailable.."]"); end else local numAvailableString=ATSW_GetNumItemsPossibleWithInventory(skillName).."/"..numAvailable; if ( numAvailableString == "0/0" ) then skillButton:SetText(" "..skillName); else skillButton:SetText(" "..skillName.." ["..numAvailableString.."]"); end end if(ATSW_GetTradeSkillSelectionIndex()==atsw_skilllisting[skillIndex].id) then ATSWHighlightFrame:SetPoint("TOPLEFT", "ATSWSkill"..i, "TOPLEFT", 0, 0); ATSWHighlightFrame:Show(); ATSWFrame.numAvailable = numAvailable; getglobal("ATSWSkill"..i):LockHighlight(); else getglobal("ATSWSkill"..i):UnlockHighlight(); end end else skillButton:Hide(); end end end if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="name" or atsw_orderby[UnitName("player")][atsw_selectedskill]=="difficulty") then ATSWExpandButtonFrame:Hide(); atsw_updating=true; ATSW_SortTradeSkills(); local numTradeSkills=table.getn(atsw_tradeskillid); local skillOffset=FauxScrollFrame_GetOffset(ATSWListScrollFrame); if(numTradeSkills==0) then ATSWFrameTitleText:SetText(format(TEXT(TRADE_SKILL_TITLE), ATSW_GetTradeSkillLine()).." - "..ATSW_VERSION); ATSWSkillName:Hide(); ATSWSkillIcon:Hide(); ATSWRequirementLabel:Hide(); ATSWCollapseAllButton:Disable(); for i=1, ATSW_MAX_TRADE_SKILL_REAGENTS, 1 do getglobal("ATSWReagent"..i):Hide(); end else ATSWSkillName:Show(); ATSWSkillIcon:Show(); ATSWCollapseAllButton:Enable(); end FauxScrollFrame_Update(ATSWListScrollFrame, numTradeSkills, ATSW_TRADE_SKILLS_DISPLAYED, ATSW_TRADE_SKILL_HEIGHT, nil, nil, nil, ATSWHighlightFrame, 293, 316); ATSWHighlightFrame:Hide(); local jumped=1; for i=1,ATSW_TRADE_SKILLS_DISPLAYED,1 do local skillName, skillType, numAvailable, isExpanded, craftSubSpellName; local skillIndex; repeat skillIndex=atsw_tradeskillid[skillOffset+jumped]; if(skillIndex==nil) then skillName=nil; else skillName, skillType, numAvailable, isExpanded = ATSW_GetTradeSkillInfo(skillIndex); end jumped=jumped+1; until (((skillName and ATSW_Filter(skillName)==true and ATSW_FilterInvSlot(skillName) and ATSW_FilterSubClass(skillName)) or skillIndex==nil) and skillType~="header"); if(skillIndex) then skillName, skillType, numAvailable, isExpanded = ATSW_GetTradeSkillInfo(skillIndex); if(skillName) then numAvailable=ATSW_GetNumItemsPossible(skillName); end local skillButton=getglobal("ATSWSkill"..i); if(ATSWListScrollFrame:IsVisible()) then skillButton:SetWidth(293); else skillButton:SetWidth(323); end local color=ATSWTypeColor[skillType]; if(color) then skillButton:SetTextColor(color.r, color.g, color.b); end skillButton:SetID(skillIndex); skillButton:Show(); if(skillType=="header") then skillButton:SetText(skillName); if(isExpanded) then skillButton:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up"); else skillButton:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up"); end getglobal("ATSWSkill"..i.."Highlight"):SetTexture("Interface\\Buttons\\UI-PlusButton-Hilight"); getglobal("ATSWSkill"..i):UnlockHighlight(); else if(not skillName)then return; end skillButton:SetNormalTexture(""); getglobal("ATSWSkill"..i.."Highlight"):SetTexture(""); if(atsw_multicount==true) then if ( numAvailable == 0 ) then skillButton:SetText(" "..skillName); else skillButton:SetText(" "..skillName.." ["..numAvailable.."]"); end else local numAvailableString=ATSW_GetNumItemsPossibleWithInventory(skillName).."/"..numAvailable; if ( numAvailableString == "0/0" ) then skillButton:SetText(" "..skillName); else skillButton:SetText(" "..skillName.." ["..numAvailableString.."]"); end end if(ATSW_GetTradeSkillSelectionIndex()==skillIndex) then ATSWHighlightFrame:SetPoint("TOPLEFT", "ATSWSkill"..i, "TOPLEFT", 0, 0); ATSWHighlightFrame:Show(); ATSWFrame.numAvailable = numAvailable; getglobal("ATSWSkill"..i):LockHighlight(); else getglobal("ATSWSkill"..i):UnlockHighlight(); end end end end atsw_updating=false; end end function ATSWSkillButton_OnClick(button) if(button=="LeftButton") then ATSWFrame_SetSelection(this:GetID(),true); ATSWFrame_Update(); end end function ATSWFrame_SetSelection(id,wasClicked) local skillName, skillType, numAvailable; local listpos=ATSW_GetSkillListingPos(id); if(atsw_skilllisting[listpos]) then skillName = atsw_skilllisting[listpos].name; skillType = atsw_skilllisting[listpos].type; else skillName=nil; end if(skillName) then numAvailable=ATSW_GetNumItemsPossible(skillName); end if(IsShiftKeyDown() and skillName~=nil and wasClicked~=nil) then if(arg1=="LeftButton" and ChatFrameEditBox:IsVisible()) then ATSW_AddTradeSkillReagentLinksToChatFrame(skillName); end end ATSWHighlightFrame:Show(); if(skillType=="header") then ATSWHighlightFrame:Hide(); if(atsw_skilllisting[listpos].expanded) then ATSW_SetHeaderExpanded(id,false); else ATSW_SetHeaderExpanded(id,true); end ATSWFrame_Update(); return; end ATSWFrame.selectedSkillName=skillName; ATSWFrame.selectedSkill = id; ATSW_SelectTradeSkill(id); if(ATSW_GetTradeSkillSelectionIndex()>ATSW_GetNumTradeSkills())then return; end local color=ATSWTypeColor[skillType]; if(color) then ATSWHighlight:SetVertexColor(color.r, color.g, color.b); end -- General Info local skillLineName, skillLineRank, skillLineMaxRank = ATSW_GetTradeSkillLine(); ATSWFrameTitleText:SetText(format(TEXT(TRADE_SKILL_TITLE), skillLineName).." - "..ATSW_VERSION); -- Set statusbar info ATSWRankFrameSkillName:SetText(skillLineName); ATSWRankFrame:SetStatusBarColor(0.0, 0.0, 1.0, 0.5); ATSWRankFrameBackground:SetVertexColor(0.0, 0.0, 0.75, 0.5); ATSWRankFrame:SetMinMaxValues(0, skillLineMaxRank); ATSWRankFrame:SetValue(skillLineRank); ATSWRankFrameSkillRank:SetText(skillLineRank.."/"..skillLineMaxRank); ATSWSkillName:SetText(skillName); if(atsw_oldmode and GetCraftDescription(id)) then ATSWCraftDescription:SetText(GetCraftDescription(id)); end if(ATSW_GetTradeSkillCooldown(id)) then ATSWSkillCooldown:SetText(COOLDOWN_REMAINING.." "..SecondsToTime(ATSW_GetTradeSkillCooldown(id))); else ATSWSkillCooldown:SetText(""); end ATSWSkillIcon:SetNormalTexture(ATSW_GetTradeSkillIcon(id)); local minMade,maxMade = ATSW_GetTradeSkillNumMade(id); if(maxMade>1) then if(minMade==maxMade) then ATSWSkillIconCount:SetText(minMade); else ATSWSkillIconCount:SetText(minMade.."-"..maxMade); end if(ATSWSkillIconCount:GetWidth()>39) then ATSWSkillIconCount:SetText("~"..floor((minMade + maxMade)/2)); end else ATSWSkillIconCount:SetText(""); end local creatable = 1; local numReagents = ATSW_GetTradeSkillNumReagents(id); for i=1, numReagents, 1 do local reagentName, reagentTexture, reagentCount, playerReagentCount = ATSW_GetTradeSkillReagentInfo(id, i); local reagent = getglobal("ATSWReagent"..i); local name = getglobal("ATSWReagent"..i.."Name"); local count = getglobal("ATSWReagent"..i.."Count"); if(not reagentName or not reagentTexture) then reagent:Hide(); else reagent:Show(); SetItemButtonTexture(reagent, reagentTexture); name:SetText(reagentName); -- Grayout items if(playerReagentCount=100) then playerReagentCount = "*"; end count:SetText(playerReagentCount.." /"..reagentCount); end end local reagentToAnchorTo = numReagents; if((numReagents > 0) and (mod(numReagents, 2)==0)) then reagentToAnchorTo = reagentToAnchorTo - 1; end for i=numReagents+1, ATSW_MAX_TRADE_SKILL_REAGENTS, 1 do getglobal("ATSWReagent"..i):Hide(); end local spellFocus=BuildColoredListString(ATSW_GetTradeSkillTools(id)); if(spellFocus) then ATSWRequirementLabel:Show(); ATSWRequirementText:SetText(spellFocus); else ATSWRequirementLabel:Hide(); ATSWRequirementText:SetText(""); end if(creatable) then ATSWCreateButton:Enable(); ATSWQueueButton:Enable(); ATSWCreateAllButton:Enable(); ATSWQueueAllButton:Enable(); else ATSWCreateButton:Disable(); ATSWQueueButton:Disable(); ATSWCreateAllButton:Disable(); ATSWQueueAllButton:Disable(); end end function ATSWSubClassDropDown_OnLoad() UIDropDownMenu_Initialize(this, ATSWSubClassDropDown_Initialize); UIDropDownMenu_SetWidth(120); UIDropDownMenu_SetSelectedID(ATSWSubClassDropDown, 1); end function ATSWSubClassDropDown_OnShow() UIDropDownMenu_Initialize(this, ATSWSubClassDropDown_Initialize); if(atsw_currentsubclassfilter==0) then UIDropDownMenu_SetSelectedID(ATSWSubClassDropDown, 1); end end function ATSWSubClassDropDown_Initialize() ATSWFilterFrame_LoadSubClasses(GetTradeSkillSubClasses()); end function ATSWFilterFrame_LoadSubClasses(...) local info = {}; if ( arg.n > 1 ) then info.text = TEXT(ALL_SUBCLASSES); info.func = ATSWSubClassDropDownButton_OnClick; info.checked = allChecked; if(atsw_currentsubclassfilter==0) then info.checked=true; end UIDropDownMenu_AddButton(info); end local checked; for i=1, arg.n, 1 do if (atsw_currentsubclassfilter==0 and arg.n > 1) then checked = nil; UIDropDownMenu_SetText(TEXT(ALL_SUBCLASSES), ATSWSubClassDropDown); else if(i==atsw_currentsubclassfilter) then checked=true; UIDropDownMenu_SetText(arg[i], ATSWSubClassDropDown); else checked=false; end end info = {}; info.text = arg[i]; info.func = ATSWSubClassDropDownButton_OnClick; info.checked = checked; UIDropDownMenu_AddButton(info); end end function ATSWInvSlotDropDown_OnLoad() UIDropDownMenu_Initialize(this, ATSWInvSlotDropDown_Initialize); UIDropDownMenu_SetWidth(120); UIDropDownMenu_SetSelectedID(ATSWInvSlotDropDown, 1); end function ATSWInvSlotDropDown_OnShow() UIDropDownMenu_Initialize(this, ATSWInvSlotDropDown_Initialize); if(atsw_currentinvslotfilter==0) then UIDropDownMenu_SetSelectedID(ATSWInvSlotDropDown, 1); end end function ATSWInvSlotDropDown_Initialize() ATSWFilterFrame_LoadInvSlots(GetTradeSkillInvSlots()); end function ATSWFilterFrame_LoadInvSlots(...) local info = {} if (arg.n > 1) then info.text = TEXT(ALL_INVENTORY_SLOTS); info.func = ATSWInvSlotDropDownButton_OnClick; info.checked = false; if(atsw_currentinvslotfilter==0) then info.checked=true; end UIDropDownMenu_AddButton(info); end local checked=false; for i=1, arg.n, 1 do if (atsw_currentinvslotfilter==0 and arg.n > 1) then checked = false; UIDropDownMenu_SetText(TEXT(ALL_INVENTORY_SLOTS), ATSWInvSlotDropDown); else if(i==atsw_currentinvslotfilter) then checked=true; UIDropDownMenu_SetText(arg[i], ATSWInvSlotDropDown); else checked=false; end end info = {}; info.text = arg[i]; info.func = ATSWInvSlotDropDownButton_OnClick; info.checked = checked; UIDropDownMenu_AddButton(info); end end function ATSWSubClassDropDownButton_OnClick() UIDropDownMenu_SetSelectedID(ATSWSubClassDropDown, this:GetID()); if(this:GetID()==1) then atsw_subclassfilter=nil; atsw_subclassfiltered={}; atsw_currentsubclassfilter=0; ATSW_CreateSkillListing(); ATSWFrame_Update(); else atsw_subclassfilter=this:GetID()-1; atsw_currentsubclassfilter=atsw_subclassfilter; SetTradeSkillSubClassFilter(this:GetID() - 1, 1, 1); end end atsw_currentinvslotfilter=0; atsw_invslotfilter=nil; atsw_invslotfiltered={}; atsw_currentsubclassfilter=0; atsw_subclassfilter=nil; atsw_subclassfiltered={}; function ATSWInvSlotDropDownButton_OnClick() UIDropDownMenu_SetSelectedID(ATSWInvSlotDropDown, this:GetID()); if(this:GetID()==1) then atsw_invslotfilter=nil; atsw_invslotfiltered={}; atsw_currentinvslotfilter=0; ATSW_CreateSkillListing(); ATSWFrame_Update(); else atsw_invslotfilter=this:GetID()-1; atsw_currentinvslotfilter=atsw_invslotfilter; SetTradeSkillInvSlotFilter(this:GetID() - 1, 1, 1); end end function ATSW_FilterInvSlot(skillName) if(table.getn(atsw_invslotfiltered)==0) then return true; end if(atsw_invslotfiltered[skillName]) then return true; else return false; end end function ATSW_FilterSubClass(skillName) if(table.getn(atsw_subclassfiltered)==0) then return true; end if(atsw_subclassfiltered[skillName]) then return true; else return false; end end function ATSWCollapseAllButton_OnClick() if (this.collapsed) then this.collapsed = nil; if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="custom") then if(atsw_customheaders[UnitName("player")]) then if(atsw_customheaders[UnitName("player")][atsw_selectedskill]) then for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do atsw_customheaders[UnitName("player")][atsw_selectedskill][i].expanded=true; end end end atsw_uncategorizedexpanded=true; else for i=1,table.getn(atsw_tradeskillheaders),1 do atsw_tradeskillheaders[i].expanded=true; end end else this.collapsed = 1; ATSWListScrollFrameScrollBar:SetValue(0); if(atsw_orderby[UnitName("player")][atsw_selectedskill]=="custom") then if(atsw_customheaders[UnitName("player")]) then if(atsw_customheaders[UnitName("player")][atsw_selectedskill]) then for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do atsw_customheaders[UnitName("player")][atsw_selectedskill][i].expanded=false; end end end atsw_uncategorizedexpanded=false; else for i=1,table.getn(atsw_tradeskillheaders),1 do atsw_tradeskillheaders[i].expanded=false; end end end ATSW_CreateSkillListing(); ATSWFrame_Update(); end atsw_queue={}; function ATSWFrame_UpdateQueue() local jobs=table.getn(atsw_queue); local offset=FauxScrollFrame_GetOffset(ATSWQueueScrollFrame); for i=1,4,1 do local jobindex=i+offset; local queueCount=getglobal("ATSWQueueItem"..i.."Count"); local queueName=getglobal("ATSWQueueItem"..i.."Name"); local queueItem=getglobal("ATSWQueueItem"..i); local queueButton=getglobal("ATSWQueueItem"..i.."DeleteButton"); if(atsw_queue[jobindex]) then queueCount:SetText(atsw_queue[jobindex].count.."x"); queueName:SetText(atsw_queue[jobindex].name); queueItem.jobindex=jobindex; queueButton.jobindex=jobindex; queueItem:Show(); queueButton:Show(); else queueButton:Hide(); queueItem:Hide(); end end FauxScrollFrame_Update(ATSWQueueScrollFrame, jobs, 4, 22); end atsw_preventupdate=false; function ATSW_DeleteQueue() atsw_queue={}; ATSW_ResetPossibleItemCounts(); ATSWInv_UpdateQueuedItemList(); ATSWFrame_UpdateQueue(); ATSWFrame_Update(); end function ATSW_DeleteJob(jobindex) if(atsw_queue[jobindex]) then table.remove(atsw_queue,jobindex); if(FauxScrollFrame_GetOffset(ATSWQueueScrollFrame)>0 and FauxScrollFrame_GetOffset(ATSWQueueScrollFrame)+4>table.getn(atsw_queue)) then FauxScrollFrame_SetOffset(ATSWQueueScrollFrame,FauxScrollFrame_GetOffset(ATSWQueueScrollFrame)-1); end if(atsw_preventupdate==false) then ATSW_ResetPossibleItemCounts(); ATSWInv_UpdateQueuedItemList(); ATSWFrame_UpdateQueue(); ATSWFrame_Update(); end end end function ATSW_AddJobLL(skillname, num) for i=1,table.getn(atsw_queue),1 do if(atsw_queue[i].name==skillname) then atsw_queue[i].count=atsw_queue[i].count+num; if(atsw_preventupdate==false) then ATSW_ResetPossibleItemCounts(); ATSWInv_UpdateQueuedItemList(); ATSWFrame_UpdateQueue(); ATSWFrame_Update(); end return; end end table.insert(atsw_queue,{name=skillname,count=num}); if(atsw_preventupdate==false) then ATSW_ResetPossibleItemCounts(); ATSWInv_UpdateQueuedItemList(); ATSWFrame_UpdateQueue(); ATSWFrame_Update(); end end function ATSW_AddJobFirst(skillname, num) for i=1,table.getn(atsw_queue),1 do if(atsw_queue[i].name==skillname) then atsw_queue[i].count=atsw_queue[i].count+num; if(atsw_preventupdate==false) then ATSW_ResetPossibleItemCounts(); ATSWInv_UpdateQueuedItemList(); ATSWFrame_UpdateQueue(); ATSWFrame_Update(); end return; end end table.insert(atsw_queue,1,{name=skillname,count=num}); if(atsw_preventupdate==false) then ATSW_ResetPossibleItemCounts(); ATSWInv_UpdateQueuedItemList(); ATSWFrame_UpdateQueue(); ATSWFrame_Update(); end end function ATSW_DeleteJobPartial(skillname, num) for i=1,table.getn(atsw_queue),1 do if(atsw_queue[i].name==skillname) then atsw_queue[i].count=atsw_queue[i].count-num; if(atsw_queue[i].count<=0) then ATSW_DeleteJob(i); end if(atsw_preventupdate==false) then ATSW_ResetPossibleItemCounts(); ATSWInv_UpdateQueuedItemList(); ATSWFrame_UpdateQueue(); ATSWFrame_Update(); end return; end end end function ATSW_StartStopProcessing() if(atsw_processing==true) then atsw_processing=false; ATSWQueueStartStopButton:SetText(ATSW_STARTQUEUE); else atsw_processing=true; ATSWQueueStartStopButton:SetText(ATSW_STOPQUEUE); ATSW_StartProcessing(); end end function ATSW_Enchant() DoCraft(GetCraftSelectionIndex()); end function ATSW_SetColumnWidth(width, frame) if not frame then frame = this; end frame:SetWidth(width); getglobal(frame:GetName().."Middle"):SetWidth(width - 9); frame:Disable(); end atsw_processingname=""; atsw_processing=false; atsw_processnext=false; atsw_lastremoved=""; function ATSW_StartProcessing() atsw_retries=0; atsw_retry=false; ATSWFrame:RegisterEvent("SPELLCAST_STOP"); ATSWFrame:RegisterEvent("SPELLCAST_START"); ATSWFrame:RegisterEvent("SPELLCAST_CHANNEL_STOP"); ATSWFrame:RegisterEvent("SPELLCAST_INTERRUPTED"); ATSW_ProcessNextQueueItem(true); end function ATSW_ProcessNextQueueItem(directClick) if(table.getn(atsw_queue)>0 and atsw_retries0) then ATSW_ProcessIt(); end end function ATSWDBF_OnAbort() ATSW_StartStopProcessing(); end function ATSW_GetTradeSkillID(skillName) for i=1,table.getn(atsw_tradeskilllist),1 do if(atsw_tradeskilllist[i].name==skillName) then return atsw_tradeskilllist[i].id; end end return 0; end function ATSW_GetTradeSkillListPos(id) for i=1,table.getn(atsw_tradeskilllist),1 do if(atsw_tradeskilllist[i].id==id) then return i; end end return -1; end function ATSW_GetTradeSkillListPosByName(name) for i=1,table.getn(atsw_tradeskilllist),1 do if(atsw_tradeskilllist[i].name==name) then return i; end end return -1; end function ATSW_CreateTradeSkillList() local numTradeSkills=ATSW_GetNumTradeSkills(); local currentHeader=0; atsw_oldtradeskillheaders=atsw_tradeskillheaders; atsw_tradeskilllist={}; atsw_tradeskillheaders={}; if(atsw_oldmode) then table.insert(atsw_tradeskillheaders,{name="invisibleheader",id=0,list={},expanded=true}); currentHeader=1; end for i=1,numTradeSkills,1 do local skillName, skillType, numAvailable, isExpanded = ATSW_GetTradeSkillInfo(i); if(skillName~=nil) then if(skillType=="header") then local oldexpanded=true; for j=1,table.getn(atsw_oldtradeskillheaders),1 do if(atsw_oldtradeskillheaders[j].name==skillName) then oldexpanded=atsw_oldtradeskillheaders[j].expanded; end end table.insert(atsw_tradeskillheaders,{name=skillName,id=i,list={},expanded=oldexpanded}); currentHeader=table.getn(atsw_tradeskillheaders); else if(currentHeader>0 or atsw_oldmode) then reagentlist={}; local numReagents = ATSW_GetTradeSkillNumReagents(i); local skillLink = ATSW_GetTradeSkillItemLink(i); local numMade = ATSW_GetTradeSkillNumMade(i); for j=1, numReagents, 1 do local reagentName, reagentTexture, reagentCount, playerReagentCount = ATSW_GetTradeSkillReagentInfo(i, j); local reagentLink = ATSW_GetTradeSkillReagentItemLink(i,j); if(reagentName) then table.insert(reagentlist,{name=reagentName,count=reagentCount,link=reagentLink}); end end table.insert(atsw_tradeskilllist,{name=skillName,id=i,reagents=reagentlist,link=skillLink,type=skillType,num=numMade}); table.insert(atsw_tradeskillheaders[currentHeader].list,table.getn(atsw_tradeskilllist)); end end end end local check=false; if(atsw_invslotfilter~=nil) then atsw_invslotfilter=nil; atsw_invslotfiltered={}; for i=1,table.getn(atsw_tradeskilllist),1 do atsw_invslotfiltered[atsw_tradeskilllist[i].name]=1; table.setn(atsw_invslotfiltered,table.getn(atsw_invslotfiltered)+1); end for i=1,table.getn(atsw_tradeskillheaders),1 do atsw_invslotfiltered[atsw_tradeskillheaders[i].name]=1; table.setn(atsw_invslotfiltered,table.getn(atsw_invslotfiltered)+1); end SetTradeSkillInvSlotFilter(0, 1, 1); check=true; end if(atsw_subclassfilter~=nil) then atsw_subclassfilter=nil; atsw_subclassfiltered={}; for i=1,table.getn(atsw_tradeskilllist),1 do atsw_subclassfiltered[atsw_tradeskilllist[i].name]=1; table.setn(atsw_subclassfiltered,table.getn(atsw_subclassfiltered)+1); end for i=1,table.getn(atsw_tradeskillheaders),1 do atsw_subclassfiltered[atsw_tradeskillheaders[i].name]=1; table.setn(atsw_subclassfiltered,table.getn(atsw_subclassfiltered)+1); end SetTradeSkillSubClassFilter(0, 1, 1); check=true; end if(check==false) then ATSW_CreateSkillListing(); end end function ATSW_GetSkillListingPos(id) for i=1,table.getn(atsw_skilllisting),1 do if(atsw_skilllisting[i].id==id) then return i; end end return -1; end function ATSW_CreateSkillListing() atsw_skilllisting={}; if(atsw_orderby[UnitName("player")][atsw_selectedskill]~="custom") then for i=1,table.getn(atsw_tradeskillheaders),1 do table.insert(atsw_skilllisting,{type="header",name=atsw_tradeskillheaders[i].name,expanded=atsw_tradeskillheaders[i].expanded,id=atsw_tradeskillheaders[i].id}); if(atsw_tradeskillheaders[i].expanded==true) then for j=1,table.getn(atsw_tradeskillheaders[i].list),1 do local skillName=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].name; local skillID=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].id; local skillType=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].type; local numMade=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].num; local skillLink=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].link; table.insert(atsw_skilllisting,{type=skillType,name=skillName,id=skillID,num=numMade,link=skillLink}); end end end else local atsw_allskills={}; for i=1,table.getn(atsw_tradeskillheaders),1 do for j=1,table.getn(atsw_tradeskillheaders[i].list),1 do table.insert(atsw_allskills,atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].name); end end if(atsw_customheaders[UnitName("player")]) then if(atsw_customheaders[UnitName("player")][atsw_selectedskill]) then for i=1,table.getn(atsw_customheaders[UnitName("player")][atsw_selectedskill]),1 do table.insert(atsw_skilllisting,{type="header",name=atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name,expanded=atsw_customheaders[UnitName("player")][atsw_selectedskill][i].expanded,id=i*1000}); if(atsw_customsorting[UnitName("player")] and atsw_customsorting[UnitName("player")][atsw_selectedskill] and atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]) then for j=1,table.getn(atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name]),1 do local skillName=atsw_customsorting[UnitName("player")][atsw_selectedskill][atsw_customheaders[UnitName("player")][atsw_selectedskill][i].name][j].name; local skillID, skillType, numMade, skillLink=ATSW_GetSkillDataFromSkillList(skillName); if(atsw_customheaders[UnitName("player")][atsw_selectedskill][i].expanded==true) then table.insert(atsw_skilllisting,{type=skillType,name=skillName,id=skillID,num=numMade,link=skillLink}); end for k=1,table.getn(atsw_allskills),1 do if(atsw_allskills[k]==skillName) then table.remove(atsw_allskills,k); end end end end end end end if(table.getn(atsw_allskills)>0) then table.insert(atsw_skilllisting,{type="header",name=ATSWCS_UNCATEGORIZED,expanded=atsw_uncategorizedexpanded,id=1001}); if(atsw_uncategorizedexpanded==true) then for i=1,table.getn(atsw_allskills),1 do local skillName=atsw_allskills[i]; local skillID, skillType, numMade, skillLink=ATSW_GetSkillDataFromSkillList(skillName); table.insert(atsw_skilllisting,{type=skillType,name=skillName,id=skillID,num=numMade,link=skillLink}); end end end end end function ATSW_GetSkillDataFromSkillList(skillName) for i=1,table.getn(atsw_tradeskillheaders),1 do for j=1,table.getn(atsw_tradeskillheaders[i].list),1 do if(skillName==atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].name) then local skillID=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].id; local skillType=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].type; local numMade=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].num; local skillLink=atsw_tradeskilllist[atsw_tradeskillheaders[i].list[j]].link; return skillID, skillType, numMade, skillLink; end end end return nil,nil,nil,nil; end function ATSW_SetHeaderExpanded(id,value) if(atsw_orderby[UnitName("player")][atsw_selectedskill]~="custom") then for i=1,table.getn(atsw_tradeskillheaders),1 do if(atsw_tradeskillheaders[i].id==id) then atsw_tradeskillheaders[i].expanded=value; end end else if(id==1001) then atsw_uncategorizedexpanded=value; else atsw_customheaders[UnitName("player")][atsw_selectedskill][id/1000].expanded=value; end end ATSW_CreateSkillListing(); end function ATSW_AddTradeSkillReagentLinksToChatFrame(skillName) local channel,chatnumber = ChatFrameEditBox.chatType; if channel=="WHISPER" then chatnumber = ChatFrameEditBox.tellTarget elseif channel=="CHANNEL" then chatnumber = ChatFrameEditBox.channelTarget end local chatline; for i=1,table.getn(atsw_tradeskilllist),1 do if(atsw_tradeskilllist[i]) then if(atsw_tradeskilllist[i].name==skillName) then SendChatMessage(ATSW_REAGENTLIST1..atsw_tradeskilllist[i].link..ATSW_REAGENTLIST2,channel,nil,chatnumber); for j=1,table.getn(atsw_tradeskilllist[i].reagents),1 do chatline=atsw_tradeskilllist[i].reagents[j].count.."x "..atsw_tradeskilllist[i].reagents[j].link; SendChatMessage(chatline,channel,nil,chatnumber); end end end end end function ATSWFrameIncrement_OnClick() if(ATSWInputBox:GetNumber()<100) then ATSWInputBox:SetNumber(ATSWInputBox:GetNumber()+1); end end function ATSWFrameDecrement_OnClick() if(ATSWInputBox:GetNumber()>0) then ATSWInputBox:SetNumber(ATSWInputBox:GetNumber()-1); end end function ATSW_GetNumItemsPossible(skillName) if(atsw_tradeskillcounter[skillName]) then return atsw_tradeskillcounter[skillName]; end return ATSW_GetNumItemsPossibleNoCache(skillName,true); end function ATSW_GetNumItemsPossibleNoCache(skillName,writeCache) local atsw_considermerchants_backup=atsw_considermerchants; if(atsw_considermerchants==true and ATSW_CheckIfCreatedOnlyWithVendorStuff(skillName)==true) then atsw_considermerchants=false; end for i=1,500,1 do atsw_temporaryitemlist={}; if(ATSW_CheckIfPossible(skillName,i)==false) then atsw_temporaryitemlist={}; if(writeCache==true) then atsw_tradeskillcounter[skillName]=(i-1); end atsw_considermerchants=atsw_considermerchants_backup; return (i-1); end end atsw_considermerchants=atsw_considermerchants_backup; return 0; end function ATSW_GetNumItemsPossibleWithInventory(skillName) local atsw_considerbank_backup=atsw_considerbank; local atsw_consideralts_backup=atsw_consideralts; local atsw_considermerchants_backup=atsw_considermerchants; atsw_considerbank=false; atsw_consideralts=false; atsw_considermerchants=false; local count=ATSW_GetNumItemsPossibleNoCache(skillName,false); atsw_considerbank=atsw_considerbank_backup; atsw_consideralts=atsw_consideralts_backup; atsw_considermerchants=atsw_considermerchants_backup; return count; end function ATSW_ToggleReagentFrame() if(ATSWReagentFrame:IsVisible()) then HideUIPanel(ATSWReagentFrame); else ATSW_ShowNecessaryReagents(); end end function ATSW_ResetPossibleItemCounts() atsw_tradeskillcounter={}; end function ATSW_AddJob(skillName,count) atsw_temporaryitemlist={}; local numMade=1; for i=1,table.getn(atsw_tradeskilllist),1 do if(atsw_tradeskilllist[i].name==skillName) then numMade=atsw_tradeskilllist[i].num; end end ATSW_AddJobRecursive(skillName,count*numMade,true); end function ATSW_AddJobRecursive(skillName,count,firstcall) if(ATSW_CheckBlacklist(skillName)==false or firstcall==true) then for i=1,table.getn(atsw_tradeskilllist),1 do if(atsw_tradeskilllist[i].name==skillName) then local usagecount=math.ceil(count/atsw_tradeskilllist[i].num); for j=1,table.getn(atsw_tradeskilllist[i].reagents),1 do local itemcount=ATSW_GetItemCountMinusQueued(atsw_tradeskilllist[i].reagents[j].name); if(itemcount<0) then itemcount=0; end local necessary=atsw_tradeskilllist[i].reagents[j].count*usagecount; if(itemcount=necessary) then ATSW_TemporaryUseItem(atsw_tradeskilllist[i].reagents[j].name,necessary); else local missing=necessary-itemcount; local response=ATSW_CheckIfPossible(atsw_tradeskilllist[i].reagents[j].name,missing); if(response==false) then return false; end end end return true; end end return false; end function ATSW_CheckIfCreatedOnlyWithVendorStuff(skillName) for i=1,table.getn(atsw_tradeskilllist),1 do if(atsw_tradeskilllist[i].name==skillName) then for j=1,table.getn(atsw_tradeskilllist[i].reagents),1 do local response=ATSW_CheckIfCreatedOnlyWithVendorStuff(atsw_tradeskilllist[i].reagents[j].name); if(response==false) then return false; end end return true; end end return ATSWMerchant_CheckIfAvailable(skillName); end atsw_missingitems={}; function ATSW_NoteMissingItems(skillName,count) if(ATSW_CheckBlacklist(skillName)==false) then for i=1,table.getn(atsw_tradeskilllist),1 do if(atsw_tradeskilllist[i].name==skillName) then for j=1,table.getn(atsw_tradeskilllist[i].reagents),1 do local itemcount=ATSW_GetItemCountMinusQueuedAndTemporary(atsw_tradeskilllist[i].reagents[j].name); local necessary=atsw_tradeskilllist[i].reagents[j].count*count; if(itemcount>=necessary) then ATSW_TemporaryUseItem(atsw_tradeskilllist[i].reagents[j].name,necessary); else local missing=necessary-itemcount; ATSW_NoteMissingItems(atsw_tradeskilllist[i].reagents[j].name,missing); end end return; end end end for i=1,table.getn(atsw_missingitems),1 do if(atsw_missingitems[i]) then if(atsw_missingitems[i].name==skillName) then atsw_missingitems[i].cnt=atsw_missingitems[i].cnt+count; return; end end end table.insert(atsw_missingitems,{name=skillName,cnt=count}); end function ATSW_OutputMissingItems(skillName,count) ATSW_DisplayMessage(ATSW_ITEMSMISSING1..count.."x '"..skillName.."'"..ATSW_ITEMSMISSING2); for i=1,table.getn(atsw_missingitems),1 do ATSW_DisplayMessage(atsw_missingitems[i].cnt.."x '"..atsw_missingitems[i].name.."'"); end end atsw_necessaryitems={}; function ATSW_NoteNecessaryItems(skillName,count,itemLink) for i=1,table.getn(atsw_tradeskilllist),1 do if(atsw_tradeskilllist[i].name==skillName) then for j=1,table.getn(atsw_tradeskilllist[i].reagents),1 do local necessary=atsw_tradeskilllist[i].reagents[j].count*count; local found=false; for x=1,table.getn(atsw_necessaryitems),1 do if(atsw_necessaryitems[x]) then if(atsw_necessaryitems[x].name==atsw_tradeskilllist[i].reagents[j].name) then atsw_necessaryitems[x].cnt=atsw_necessaryitems[x].cnt+necessary; found=true; break; end end end if(found==false) then table.insert(atsw_necessaryitems,{name=atsw_tradeskilllist[i].reagents[j].name,cnt=necessary,link=atsw_tradeskilllist[i].reagents[j].link}); end end return; end end end function ATSW_NoteNecessaryItemsForQueue() atsw_necessaryitems={}; for i=1,table.getn(atsw_queue),1 do ATSW_NoteNecessaryItems(atsw_queue[i].name,atsw_queue[i].count,nil); end ATSW_FilterNecessaryItems(); end function ATSW_FilterNecessaryItems() for i=1,table.getn(atsw_necessaryitems),1 do for k=1,table.getn(atsw_queue),1 do if(atsw_necessaryitems[i].name==atsw_queue[k].name) then atsw_necessaryitems[i].cnt=atsw_necessaryitems[i].cnt-atsw_queue[k].count; end end end for i=table.getn(atsw_necessaryitems),1,-1 do if(atsw_necessaryitems[i].cnt<=0) then table.remove(atsw_necessaryitems,i); end end end function ATSW_NoteNecessaryItemsForTradeskill(skillName,skillCount) local atsw_queue_backup=atsw_queue; atsw_preventupdate=true; atsw_queue={}; ATSW_AddJob(skillName,skillCount); ATSW_NoteNecessaryItemsForQueue(); atsw_queue=atsw_queue_backup; atsw_preventupdate=false; end function ATSW_ShowNecessaryReagents() ATSW_NoteNecessaryItemsForQueue(); for i=1,20,1 do local count=getglobal("ATSWRFReagent"..i.."Count"); local item=getglobal("ATSWRFReagent"..i.."Item"); local inv=getglobal("ATSWRFReagent"..i.."Inventory"); local bank=getglobal("ATSWRFReagent"..i.."Bank"); local merchant=getglobal("ATSWRFReagent"..i.."Merchant"); local alt=getglobal("ATSWRFReagent"..i.."Alt"); local missing=getglobal("ATSWRFReagent"..i.."Missing"); if(atsw_necessaryitems[i]) then local items_inventory=ATSWInv_GetItemCount(atsw_necessaryitems[i].name); local items_bank=ATSWBank_GetItemCount(atsw_necessaryitems[i].name); local items_alt=ATSWAlt_GetItemCount(atsw_necessaryitems[i].name); local items_missing=items_inventory+items_bank+items_alt-atsw_necessaryitems[i].cnt; local items_merchant=ATSWMerchant_CheckIfAvailable(atsw_necessaryitems[i].name); count:SetText(atsw_necessaryitems[i].cnt.."x"); count:Disable(); count:Show(); item:SetText("["..atsw_necessaryitems[i].name.."]"); item.link=atsw_necessaryitems[i].link; item:Show(); inv:SetText(items_inventory); inv:Disable(); inv:Show(); if(items_inventory>=atsw_necessaryitems[i].cnt) then inv:SetTextColor(0,1,0); else inv:SetTextColor(1,0,0); end bank:SetText(items_bank); bank:Disable(); bank:Show(); if(items_bank>=atsw_necessaryitems[i].cnt) then bank:SetTextColor(0,1,0); else bank:SetTextColor(1,0,0); end merchant:SetText("X"); merchant:Disable(); if(items_merchant==true) then merchant:Show(); else merchant:Hide(); end alt:SetText(items_alt); if(items_alt>0) then alt:Enable(); alt.itemname=atsw_necessaryitems[i].name; else alt:Disable(); end alt:Show(); if(items_alt>=atsw_necessaryitems[i].cnt) then alt:SetTextColor(0,1,0); else alt:SetTextColor(1,0,0); end if(items_missing>=0) then missing:SetText("+"..items_missing); missing:SetTextColor(0,1,0); else missing:SetText(items_missing); missing:SetTextColor(1,0,0); end missing:Disable(); missing:Show(); else count:Hide(); item:Hide(); inv:Hide(); bank:Hide(); merchant:Hide(); alt:Hide(); missing:Hide(); end end ShowUIPanel(ATSWReagentFrame); end function ATSWItemButton_OnEnter() if(this.link) then GameTooltip:SetOwner(this, "ANCHOR_NONE"); GameTooltip:SetPoint("BOTTOMLEFT",this:GetName(),"TOPLEFT"); GameTooltip:SetHyperlink(string.gsub(this.link, "|c(%x+)|H(item:%d+:%d+:%d+:%d+)|h%[(.-)%]|h|r", "%2")); GameTooltip:Show(); end end function ATSWItemButton_OnLeave() GameTooltip:Hide(); end function ATSW_TemporaryUseItem(itemname,count) if(atsw_temporaryitemlist[itemname]) then atsw_temporaryitemlist[itemname]=atsw_temporaryitemlist[itemname]+count; else atsw_temporaryitemlist[itemname]=count; end end function ATSW_CheckBlacklist(itemname) for i=1,table.getn(atsw_blacklist),1 do if(atsw_blacklist[i]) then if(atsw_blacklist[i]==itemname) then return true; end end end return false; end atsw_filter=""; function ATSW_UpdateFilter(filtertext) atsw_filter=filtertext; ATSWFrame_Update(); end function ATSW_Filter(skillname) if(skillname==nil) then return false; end if(skillname=="") then return true; end local parameters={}; for w in string.gfind(atsw_filter, ":[^:]*") do local _, _, param_name, param_value=string.find(w, ":(%a+)%s([^:]*)"); if(param_name~=nil) then _, _, param_name=string.find(param_name,"^%s*(.-)%s*$"); end if(param_value~=nil) then _, _, param_value=string.find(param_value,"^%s*(.-)%s*$"); end if(param_name~=nil) then table.insert(parameters,{name=param_name,value=param_value}); end end local _, _, searchstring=string.find(atsw_filter,"^([^:]*):?"); if(searchstring~=nil) then _, _, searchstring=string.find(searchstring,"^%s*(.-)%s*$"); table.insert(parameters,1,{name="name",value=searchstring}); end for i=1,table.getn(parameters),1 do if(parameters[i].name=="name") then if(string.find(string.lower(skillname),".-"..string.lower(parameters[i].value)..".-")==nil) then return false; end end if(parameters[i].name=="reagent") then local index=ATSW_GetTradeSkillListPosByName(skillname); if(index~=-1) then local found=false; for j=1,table.getn(atsw_tradeskilllist[index].reagents),1 do if(string.find(string.lower(atsw_tradeskilllist[index].reagents[j].name),".-"..string.lower(parameters[i].value)..".-")~=nil) then found=true; end end if(found==false) then return false; end else return false; end end if(parameters[i].name=="minlevel") then local index=ATSW_GetTradeSkillListPosByName(skillname); if(index~=-1) then local level=ATSW_GetItemMinLevel(atsw_tradeskilllist[index].id); if(tonumber(parameters[i].value,10)==nil or level==0 or leveltonumber(parameters[i].value,10)) then return false; end else return false; end end if(parameters[i].name=="minrarity") then local index=ATSW_GetTradeSkillListPosByName(skillname); if(index~=-1) then local rarity=ATSW_GetItemRarity(atsw_tradeskilllist[index].id); local reference=ATSWRarityNames[parameters[i].value]; if(reference==nil or rarity==0 or rarityreference) then return false; end else return false; end end if(parameters[i].name=="minpossible") then local possible=ATSW_GetNumItemsPossibleWithInventory(skillname); if(tonumber(parameters[i].value,10)==nil or possibletonumber(parameters[i].value,10)) then return false; end end if(parameters[i].name=="minpossibletotal") then local possible=ATSW_GetNumItemsPossible(skillname); if(tonumber(parameters[i].value,10)==nil or possibletonumber(parameters[i].value,10)) then return false; end end end return true; end function ATSW_GetItemMinLevel(tradeskillid) ATSWScanTooltip:SetOwner(ATSWFrame, "ANCHOR_TOPLEFT"); ATSWScanTooltip:SetTradeSkillItem(tonumber(tradeskillid,10)); local linecount=ATSWScanTooltip:NumLines(); local k; for k=1,linecount,1 do local ttextLeft = getglobal("ATSWScanTooltipTextLeft"..k); if(ttextLeft) then local text=ttextLeft:GetText(); if(text) then local _, _, level=string.find(text,ATSW_SCAN_MINLEVEL); if(level) then ATSWScanTooltip:Hide(); return tonumber(level,10); end end end end ATSWScanTooltip:Hide(); return 0; end function ATSW_GetItemRarity(tradeskillid) ATSWScanTooltip:SetOwner(ATSWFrame, "ANCHOR_TOPLEFT"); ATSWScanTooltip:SetTradeSkillItem(tonumber(tradeskillid,10)); local ttextLeft = getglobal("ATSWScanTooltipTextLeft1"); if(ttextLeft) then local cr,cg,cb=ttextLeft:GetTextColor(); if(cr) then cr=ATSW_Round(cr,2); cg=ATSW_Round(cg,2); cb=ATSW_Round(cb,2); local col; for col=1,5,1 do if(ATSWRarityColor[col].r==cr and ATSWRarityColor[col].g==cg and ATSWRarityColor[col].b==cb) then ATSWScanTooltip:Hide(); return col; end end end end ATSWScanTooltip:Hide(); return 0; end function ATSW_Test() local stats=GetTradeSkillItemStats(3); ATSW_DisplayMessage(stats); end function ATSW_ToggleOptionsFrame() if(ATSWOptionsFrame:IsVisible()) then HideUIPanel(ATSWOptionsFrame); else if(atsw_multicount==true) then ATSWOFUnifiedCounterButton:SetChecked(true); ATSWOFSeparateCounterButton:SetChecked(false); else ATSWOFUnifiedCounterButton:SetChecked(false); ATSWOFSeparateCounterButton:SetChecked(true); end if(atsw_considerbank==true) then ATSWOFIncludeBankButton:SetChecked(true); else ATSWOFIncludeBankButton:SetChecked(false); end if(atsw_consideralts==true) then ATSWOFIncludeAltsButton:SetChecked(true); else ATSWOFIncludeAltsButton:SetChecked(false); end if(atsw_considermerchants==true) then ATSWOFIncludeMerchantsButton:SetChecked(true); else ATSWOFIncludeMerchantsButton:SetChecked(false); end if(atsw_autobuy==true) then ATSWOFAutoBuyButton:SetChecked(true); else ATSWOFAutoBuyButton:SetChecked(false); end if(atsw_recipetooltip==true) then ATSWOFTooltipButton:SetChecked(true); else ATSWOFTooltipButton:SetChecked(false); end if(atsw_displayshoppinglist==true) then ATSWOFShoppingListButton:SetChecked(true); else ATSWOFShoppingListButton:SetChecked(false); end ShowUIPanel(ATSWOptionsFrame); end end function ATSW_ToggleCSFrame() ShowUIPanel(ATSWCSFrame); end -- tooltip functions atsw_recipetooltip=true; function ATSW_DisplayTradeskillTooltip() if(atsw_recipetooltip==false) then return; end ATSWTradeskillTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT",-300); ATSWTradeskillTooltip:SetBackdropColor(0,0,0,1); local tradeskillid=this:GetID(); local skillName, skillType, numAvailable; local listpos=ATSW_GetSkillListingPos(tradeskillid); if(atsw_skilllisting[listpos]) then skillName = atsw_skilllisting[listpos].name; skillType = atsw_skilllisting[listpos].type; else skillName=nil; akillType=nil; end if(skillName and skillType ~= "header") then ATSWTradeskillTooltip:AddLine(skillName); local color=ATSWTypeColor[skillType]; if(color) then ATSWTradeskillTooltipTextLeft1:SetVertexColor(color.r, color.g, color.b); end ATSWTradeskillTooltip:AddLine(ATSW_GetNumItemsPossibleWithInventory(skillName)..ATSW_TOOLTIP_PRODUCABLE); ATSWTradeskillTooltipTextLeft2:SetVertexColor(1, 1, 1); ATSWTradeskillTooltip:AddLine(" "); ATSWTradeskillTooltip:AddLine(ATSW_TOOLTIP_NECESSARY); ATSW_NoteNecessaryItemsForTradeskill(skillName,1); for i=1,20,1 do if(atsw_necessaryitems[i]) then local items_inventory=ATSWInv_GetItemCount(atsw_necessaryitems[i].name); local items_bank=ATSWBank_GetItemCount(atsw_necessaryitems[i].name); local items_alt=ATSWAlt_GetItemCount(atsw_necessaryitems[i].name); local items_missing=items_inventory+items_bank+items_alt-atsw_necessaryitems[i].cnt; local items_merchant=""; if(ATSWMerchant_CheckIfAvailable(atsw_necessaryitems[i].name)==true) then items_merchant=ATSW_TOOLTIP_BUYABLE; end ATSWTradeskillTooltip:AddLine(atsw_necessaryitems[i].cnt.."x "..atsw_necessaryitems[i].name.." ("..items_inventory.." / "..items_bank.." / "..items_alt..")"..items_merchant); local r,g,b=ATSW_GetLinkColorRGB(atsw_necessaryitems[i].link); getglobal("ATSWTradeskillTooltipTextLeft"..(4+i)):SetVertexColor(r/256, g/256, b/256); end end ATSWTradeskillTooltip:AddLine(ATSW_TOOLTIP_LEGEND); ATSWTradeskillTooltip:Show(); end end function ATSW_GetLinkColor(link) if(link) then local _,_,color = string.find(link, "^.*|cff(.-)|.*$"); return color; else return nil; end end function ATSW_GetLinkColorRGB(link) if(link) then local color=ATSW_HexToDec(ATSW_GetLinkColor(link)); local r=math.floor(color/65536); local g=math.floor((color-r*65536)/256); local b=math.floor((color-r*65536-g*256)); return r,g,b; else return 0,0,0; end end -- item count functions atsw_considerbank=false; atsw_consideralts=false; atsw_considermerchants=false; atsw_multicount=true; function ATSW_GetItemCountMinusQueuedAndTemporary(itemname) if(atsw_temporaryitemlist[itemname]) then return ATSW_GetItemCountMinusQueued(itemname)-atsw_temporaryitemlist[itemname]; else return ATSW_GetItemCountMinusQueued(itemname); end end function ATSW_GetItemCountMinusQueued(itemname) local getitemcount=ATSWInv_GetItemCount(itemname); if(atsw_considerbank==true) then getitemcount=getitemcount+ATSWBank_GetItemCount(itemname); end if(atsw_considermerchants==true) then if(atsw_merchantlist[itemname]) then getitemcount=getitemcount+99999; end end if(atsw_consideralts==true) then getitemcount=getitemcount+ATSWAlt_GetItemCount(itemname); end if(atsw_queueditemlist[itemname]) then return getitemcount-atsw_queueditemlist[itemname]; else return getitemcount; end end -- inventory functions function ATSWInv_GetItemName(bag, slot) local link = GetContainerItemLink(bag, slot); if(link) then local _,_,name = string.find(link, "^.*%[(.*)%].*$"); return name; else return nil; end end atsw_itemlist={}; atsw_queueditemlist={}; atsw_temporaryitemlist={}; function ATSWInv_UpdateItemList() if(atsw_incombat==true) then return; end if(not atsw_itemlist[GetRealmName()]) then atsw_itemlist[GetRealmName()]={}; end atsw_itemlist[GetRealmName()][UnitName("player")]={}; for container=0, 4, 1 do for slot=1, GetContainerNumSlots(container), 1 do local itemname=ATSWInv_GetItemName(container,slot); if(itemname) then local _, itemcount=GetContainerItemInfo(container, slot); if(atsw_itemlist[GetRealmName()][UnitName("player")][itemname]) then atsw_itemlist[GetRealmName()][UnitName("player")][itemname]=atsw_itemlist[GetRealmName()][UnitName("player")][itemname]+itemcount; else atsw_itemlist[GetRealmName()][UnitName("player")][itemname]=itemcount; table.setn(atsw_itemlist[GetRealmName()][UnitName("player")],table.getn(atsw_itemlist[GetRealmName()][UnitName("player")])+1); end end end end if(ATSWFrame:IsVisible()) then ATSWFrame_Update(); end end function ATSWInv_GetItemCount(itemname) if(atsw_itemlist[GetRealmName()]) then if(atsw_itemlist[GetRealmName()][UnitName("player")]) then if(atsw_itemlist[GetRealmName()][UnitName("player")][itemname]) then return atsw_itemlist[GetRealmName()][UnitName("player")][itemname]; end end end return 0; end function ATSWInv_UpdateQueuedItemList() atsw_queueditemlist={}; for i=1,table.getn(atsw_queue),1 do for j=1,table.getn(atsw_tradeskilllist),1 do if(atsw_tradeskilllist[j].name==atsw_queue[i].name) then for k=1,table.getn(atsw_tradeskilllist[j].reagents),1 do if(atsw_tradeskilllist[j].reagents[k]) then if(atsw_queueditemlist[atsw_tradeskilllist[j].reagents[k].name]) then atsw_queueditemlist[atsw_tradeskilllist[j].reagents[k].name]=atsw_queueditemlist[atsw_tradeskilllist[j].reagents[k].name]+atsw_tradeskilllist[j].reagents[k].count*atsw_queue[i].count; else atsw_queueditemlist[atsw_tradeskilllist[j].reagents[k].name]=atsw_tradeskilllist[j].reagents[k].count*atsw_queue[i].count; table.setn(atsw_queueditemlist,table.getn(atsw_queueditemlist)+1); end end end end end end end -- bank functions atsw_bankitemlist={}; function ATSWBank_UpdateBankList() if(atsw_bankopened==true) then if(not atsw_bankitemlist[GetRealmName()]) then atsw_bankitemlist[GetRealmName()]={}; end atsw_bankitemlist[GetRealmName()][UnitName("player")]={}; for slot=1, 24, 1 do local name=ATSWInv_GetItemName(BANK_CONTAINER,slot); if(name) then local icon, count = GetContainerItemInfo(BANK_CONTAINER, slot); ATSWBank_AddToBankList(name,count); end end for container=5, 10, 1 do for slot=1, GetContainerNumSlots(container), 1 do local name=ATSWInv_GetItemName(container,slot); if(name) then local icon, count = GetContainerItemInfo(container, slot); ATSWBank_AddToBankList(name,count); end end end end end function ATSWBank_AddToBankList(name,count) if(not atsw_bankitemlist[GetRealmName()]) then atsw_bankitemlist[GetRealmName()]={}; end if(not atsw_bankitemlist[GetRealmName()][UnitName("player")]) then atsw_bankitemlist[GetRealmName()][UnitName("player")]={}; end if(atsw_bankitemlist[GetRealmName()][UnitName("player")][name]) then atsw_bankitemlist[GetRealmName()][UnitName("player")][name]=atsw_bankitemlist[GetRealmName()][UnitName("player")][name]+count; else atsw_bankitemlist[GetRealmName()][UnitName("player")][name]=count; end end function ATSWBank_GetItemCount(name) if(atsw_bankitemlist[GetRealmName()]) then if(atsw_bankitemlist[GetRealmName()][UnitName("player")]) then if(atsw_bankitemlist[GetRealmName()][UnitName("player")][name]) then return atsw_bankitemlist[GetRealmName()][UnitName("player")][name]; end end end return 0; end -- alternative character functions atsw_playernames={}; function ATSWAlt_GetItemCount(name) return ATSWAlt_GetItemCountInInventory(name)+ATSWAlt_GetItemCountInBank(name); end function ATSWAlt_GetItemCountInInventory(name) local itemcount=0; if(atsw_itemlist[GetRealmName()]) then atsw_playernames={}; table.foreach(atsw_itemlist[GetRealmName()],ATSWAlt_TableIterator); for i=1,table.getn(atsw_playernames),1 do if(atsw_itemlist[GetRealmName()][atsw_playernames[i]]) then if(atsw_itemlist[GetRealmName()][atsw_playernames[i]][name]) then itemcount=itemcount+atsw_itemlist[GetRealmName()][atsw_playernames[i]][name]; end end end end return itemcount; end function ATSWAlt_GetItemCountInBank(name) local itemcount=0; if(atsw_bankitemlist[GetRealmName()]) then atsw_playernames={}; table.foreach(atsw_bankitemlist[GetRealmName()],ATSWAlt_TableIterator); for i=1,table.getn(atsw_playernames),1 do if(atsw_bankitemlist[GetRealmName()][atsw_playernames[i]]) then if(atsw_bankitemlist[GetRealmName()][atsw_playernames[i]][name]) then itemcount=itemcount+atsw_bankitemlist[GetRealmName()][atsw_playernames[i]][name]; end end end end return itemcount; end function ATSWAlt_TableIterator(key,value) if(key~=UnitName("player")) then table.insert(atsw_playernames,key); end end function ATSWAlt_GetItemLocation(name) ATSW_DisplayMessage(ATSW_ALTLIST1..name..ATSW_ALTLIST2); if(atsw_itemlist[GetRealmName()]) then atsw_playernames={}; table.foreach(atsw_itemlist[GetRealmName()],ATSWAlt_TableIterator); for i=1,table.getn(atsw_playernames),1 do if(atsw_itemlist[GetRealmName()][atsw_playernames[i]]) then if(atsw_itemlist[GetRealmName()][atsw_playernames[i]][name]) then ATSW_DisplayMessage(atsw_itemlist[GetRealmName()][atsw_playernames[i]][name].."x "..ATSW_ALTLIST3..atsw_playernames[i]); end end end end if(atsw_bankitemlist[GetRealmName()]) then atsw_playernames={}; table.foreach(atsw_bankitemlist[GetRealmName()],ATSWAlt_TableIterator); for i=1,table.getn(atsw_playernames),1 do if(atsw_bankitemlist[GetRealmName()][atsw_playernames[i]]) then if(atsw_bankitemlist[GetRealmName()][atsw_playernames[i]][name]) then ATSW_DisplayMessage(atsw_bankitemlist[GetRealmName()][atsw_playernames[i]][name].."x "..ATSW_ALTLIST4..atsw_playernames[i]); end end end end end -- auction functions atsw_displayshoppinglist=true; function ATSWAuction_ShowShoppingList() if(AuctionFrame:IsVisible() and table.getn(atsw_queue)>0 and atsw_displayshoppinglist) then ATSWShoppingListFrame:Show(); ATSWShoppingListFrame:SetPoint("TOPLEFT","AuctionFrame","TOPLEFT",353,-436); ATSW_NoteNecessaryItemsForQueue(); ATSWAuction_UpdateReagentList(); end end function ATSWAuction_HideShoppingList() ATSWShoppingListFrame:Hide(); end function ATSWAuction_UpdateReagentList() local reagents=table.getn(atsw_necessaryitems); local offset=FauxScrollFrame_GetOffset(ATSWSLScrollFrame); for i=1,5,1 do local count=getglobal("ATSWSLFReagent"..i.."Count"); local item=getglobal("ATSWSLFReagent"..i.."Item"); local inv=getglobal("ATSWSLFReagent"..i.."Inventory"); local bank=getglobal("ATSWSLFReagent"..i.."Bank"); local merchant=getglobal("ATSWSLFReagent"..i.."Merchant"); local alt=getglobal("ATSWSLFReagent"..i.."Alt"); local missing=getglobal("ATSWSLFReagent"..i.."Missing"); if(atsw_necessaryitems[offset+i]) then local items_inventory=ATSWInv_GetItemCount(atsw_necessaryitems[offset+i].name); local items_bank=ATSWBank_GetItemCount(atsw_necessaryitems[offset+i].name); local items_alt=ATSWAlt_GetItemCount(atsw_necessaryitems[offset+i].name); local items_missing=items_inventory+items_bank+items_alt-atsw_necessaryitems[offset+i].cnt; local items_merchant=ATSWMerchant_CheckIfAvailable(atsw_necessaryitems[offset+i].name); count:SetText(atsw_necessaryitems[offset+i].cnt.."x"); count:Disable(); count:Show(); item:SetText("["..atsw_necessaryitems[offset+i].name.."]"); item.link=atsw_necessaryitems[offset+i].link; item.itemname=atsw_necessaryitems[offset+i].name; item:Show(); inv:SetText(items_inventory); inv:Disable(); inv:Show(); if(items_inventory>=atsw_necessaryitems[offset+i].cnt) then inv:SetTextColor(0,1,0); else inv:SetTextColor(1,0,0); end bank:SetText(items_bank); bank:Disable(); bank:Show(); if(items_bank>=atsw_necessaryitems[offset+i].cnt) then bank:SetTextColor(0,1,0); else bank:SetTextColor(1,0,0); end merchant:SetText("X"); merchant:Disable(); if(items_merchant==true) then merchant:Show(); else merchant:Hide(); end alt:SetText(items_alt); if(items_alt>0) then alt:Enable(); alt.itemname=atsw_necessaryitems[offset+i].name; else alt:Disable(); end alt:Show(); if(items_alt>=atsw_necessaryitems[offset+i].cnt) then alt:SetTextColor(0,1,0); else alt:SetTextColor(1,0,0); end if(items_missing>=0) then missing:SetText("+"..items_missing); missing:SetTextColor(0,1,0); else missing:SetText(items_missing); missing:SetTextColor(1,0,0); end missing:Disable(); missing:Show(); else count:Hide(); item:Hide(); inv:Hide(); bank:Hide(); merchant:Hide(); alt:Hide(); missing:Hide(); end end FauxScrollFrame_Update(ATSWSLScrollFrame, reagents, 5, 5); end function ATSWAuction_SearchForItem(itemname) if(CanSendAuctionQuery()) then BrowseName:SetText(itemname); AuctionFrameBrowse_Search(); BrowseNoResultsText:SetText(BROWSE_NO_RESULTS); end end -- merchant functions atsw_autobuy=false; atsw_merchantlist={}; function ATSWMerchant_InsertAutoBuyButton() if(table.getn(atsw_queue)==0) then return; end if(ATSWMerchant_Buy(true)==false) then return; end ATSWAutoBuyButtonFrame:Show(); ATSWAutoBuyButtonFrame:SetPoint("TOPLEFT", "MerchantFrame", "TOPLEFT" , 60, -28); ATSWAutoBuyButtonFrame:SetFrameStrata("HIGH"); end function ATSWMerchant_RemoveAutoBuyButton() ATSWAutoBuyButtonFrame:Hide(); end function ATSWMerchant_ExecuteAutoBuy() ATSWMerchant_RemoveAutoBuyButton(); ATSWMerchant_Buy(); end function ATSWMerchant_UpdateMerchantList() if(MerchantFrame:IsVisible()) then local numitems=GetMerchantNumItems(); if(numitems==148) then numitems=0; end for i=1,numitems,1 do local itemname=ATSWMerchant_GetItemName(i); if(itemname) then local name, texture, price, quantity, numAvailable, isUsable = GetMerchantItemInfo(i); if(numAvailable==-1) then atsw_merchantlist[itemname]=true; end end end end end function ATSWMerchant_GetItemName(slot) local link = GetMerchantItemLink(slot); if(link) then local _,_,name = string.find(link, "^.*%[(.*)%].*$"); return name; else return nil; end end function ATSWMerchant_CheckIfAvailable(itemname) if(atsw_merchantlist[itemname]) then return true; else return false; end end function ATSWMerchant_AutoBuy() if(atsw_autobuy==true) then ATSWMerchant_Buy(); end end function ATSWMerchant_Buy(onlyCheck) local needtobuy=false; if(table.getn(atsw_queue)>0) then if(MerchantFrame:IsVisible()) then ATSW_NoteNecessaryItemsForQueue(); autobuymessage=false; local numitems=GetMerchantNumItems(); if(numitems==148) then numitems=0; end for i=1,numitems,1 do local itemname=ATSWMerchant_GetItemName(i); if(itemname) then for k=1,table.getn(atsw_necessaryitems),1 do if(atsw_necessaryitems[k]) then if(atsw_necessaryitems[k].name==itemname) then local stilltobuy=atsw_necessaryitems[k].cnt-ATSWInv_GetItemCount(itemname); if(stilltobuy>0) then local name, texture, price, quantity, numAvailable, isUsable = GetMerchantItemInfo(i); local itemid = ATSW_GetItemID(GetMerchantItemLink(i)); local sName, sLink, iQuality, iLevel, sType, sSubType, iCount = GetItemInfo(itemid); local itemstobuy=math.ceil(stilltobuy/quantity); if(onlyCheck==nil or onlyCheck==false) then if(iCount==nil) then for l=1,itemstobuy,1 do BuyMerchantItem(i,1); end else local fullstackstobuy=math.floor(stilltobuy/iCount); local fullstackitemcount=math.floor(iCount/quantity); local resttobuy=math.ceil((stilltobuy-(fullstackstobuy*iCount))/quantity); if(fullstackstobuy>0) then for l=1,fullstackstobuy,1 do BuyMerchantItem(i,fullstackitemcount); end end if(resttobuy>0) then BuyMerchantItem(i,resttobuy); end end if(autobuymessage==false) then ATSW_DisplayMessage(ATSW_AUTOBUYMESSAGE); autobuymessage=true; end local totalprice=price*itemstobuy; local gold=math.floor(totalprice/10000); local silver=math.floor((totalprice-gold*10000)/100); local copper=math.mod(totalprice,100); local moneystring=""; if(gold>0) then moneystring=gold.."g "..silver.."s "..copper.."c"; elseif(silver>0) then moneystring=silver.."s "..copper.."c"; else moneystring=copper.."c"; end ATSW_DisplayMessage((itemstobuy*quantity).."x "..GetMerchantItemLink(i).." ("..moneystring..")"); else needtobuy=true; end end end end end end end end end return needtobuy; end -- general utility functions function ATSW_DisplayMessage(msg) DEFAULT_CHAT_FRAME:AddMessage(msg); end function ATSW_HexToDec(hex) hex=string.upper(hex); local total=0; for i=1,string.len(hex),1 do local char=string.byte(hex,i); local numeric; if(char>64) then numeric=char-55; else numeric=char-48; end total=total+numeric*math.pow(16,string.len(hex)-i); end return total; end function ATSW_GetItemID(link) if(link) then local _,_,id = string.find(link, "^.*|Hitem:(%d*):.*%[.*%].*$"); return id; else return nil; end end function ATSW_Round(number,decimals) return math.floor((number*math.pow(10,decimals)+0.5))/math.pow(10,decimals); end