Compare with Previous | Blame | View Log
local E, C = unpack(select(2, ...)) if not C["bag"].enable == true then return end _G.JPackLocale = {} if GetLocale() ~= "zhCN" then return end local L = JPackLocale L.TYPE_BAG = "容å¨" L.TYPE_FISHWEAPON = "鱼竿" L.TYPE_MISC = "å ¶å®" L.TYPE_CONSUMABLE = "æ¶èå" JPACK_ORDER={"çç³","##åéª","ç¿å·¥é","å¥ç®å°å","鱼竿","#鱼竿","#æ¦å¨","#æ¤ç²", "#æ¦å¨##å ¶å®","#æ¤ç²##å ¶å®","#é æ¹","#ä»»å¡","##å ç´ ","##éå±åç¿ç³","##èè¯", "#ææ","##ç å®","#æ¶èå","##å¸æ","#åå","##èç±»","#","鱼油","çµéç¢ç","#å ¶å®"} JPACK_DEPOSIT={"##å ç´ ","##éå±åç¿ç³","#ææ","##èè¯","#ç å®","#容å¨"} JPACK_DRAW={"#ä»»å¡","##èè¯"} L["HELP"] = 'è¾å ¥"/jpack help"è·å帮å©.' L["COMPLETE"] = "æ´çå®æ¯..." L["WARN"] = "请å æ¿æä½ é¼ æ ä¸çç©å. æ´çæ¶ä¸è¦æèµ·ç©åãéé±ãæ³æ¯." L["Unknown command"] = "æªç¥å½ä»¤" -- Help info L["Slash command"] = "å½ä»¤" L["Pack"] = "æ´ç" L["Set sequence to ascend"] = "æ£åºæ´ç" L["Set sequence to descend"] = "éåºæ´ç" L["Save to the bank"] = "ä¿åå°é¶è¡" L["Load from the bank"] = "ä»é¶è¡ååº" L["Packup guildbank"] = "æ´çå ¬ä¼é¶è¡" L["Print help info"] = "æ¾ç¤ºå¸®å©" L["Sequence"] = "æ´ç顺åº" L["asc"] = "æ£åº" L["desc"] = "éåº" L["Click"] = "ç¹å»" L["Pack"] = "æ´ç" L["Alt + Left-Click"] = "Alt + å·¦é®" L["Shift + Left-Click"] = "Shift + å·¦é®" L["Ctrl + Left-Click"] = "Ctrl + å·¦é®" L["Shift + Right-Click"] = "Shift + å³é®" L["Ctrl + Right-Click"] = "Ctrl + å³é®" local DEV_MOD = false local debug local debugf = tekDebug and tekDebug:GetFrame("JPack")--tekDebug if debugf then debug = function(...) debugf:AddMessage(string.join(", ", tostringall(...))) end else debug = function() end end --[===[@debug@ DEV_MOD = true --@end-debug@]===] --[[=================================== Local =====================================]] JPack = CreateFrame"Frame" JPack.DEV_MOD = DEV_MOD JPack.bankOpened = false JPack.guildbankOpened = false JPack.deposit = false JPack.draw = false JPack.packupguildbank = false JPack.bagGroups = {} JPack.packingGroupIndex = 1 JPack.packingBags={} JPack.updatePeriod = .1 local version = GetAddOnMetadata("JPack", "Version") or "alpha" JPack.version = version local L = setmetatable(JPackLocale, {__index=function(t,i) return i end}) JPack:SetScript("OnEvent", function(self, event, ...) self[event](self,event,...) end) local bagSize=0 local packingBags={} local JPACK_MAXMOVE_ONCE=3 local current,to,lockedSlots,currentGBTab -- æ´çç¶æ local JPACK_STEP=0 local JPACK_STARTED=1 local JPACK_DEPOSITING=2 local JPACK_DRAWING=3 -- local JPACK_STACKING=4 -- local JPACK_STACK_OVER=5 local JPACK_SORTING=6 -- local JPACK_PACKING=7 local JPACK_START_PACK=8 local JPACK_GUILDBANK_STACKING=9 local JPACK_GUILDBANK_SORTING=10 local JPACK_GUILDBANK_COMPLETE=11 local JPACK_SPEC_BAG_OVER=12 local JPACK_STOPPED=0 --[[=================================== lib =====================================]] local function print(msg,r,g,b) if (not r) or (not g) or (not b) then r, g, b = .41, .8, .94 end msg = 'JPack: '..msg DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b) end local function CheckCursor() ClearCursor() if GetCursorInfo() then return true end end local function IndexOfTable(t,v) for i=1,#t do if(v==t[i])then return i end end return 0 end --[[ è·å¾ä¸ä¸ª JPack æ ¼å¼çç©å对象 isGB = true, å·¥ä¼é¶è¡ ]] local function getJPackItem(bag,slot,isGB) local link = isGB and GetGuildBankItemLink(bag,slot) or GetContainerItemLink(bag,slot) if not link then return end local item={} item.slotId=c item.name, item.link, item.rarity, item.level, item.minLevel, item.type, item.subType, item.stackCount, item.equipLoc, item.texture = GetItemInfo(link) item.itemid = tonumber(link:match("item:(%d+):")) return item end --æ¯å¦è½æ¾å ¥æèå local function CanGoInBag(frombag,fromslot, tobag) local item = GetContainerItemLink(frombag,fromslot) if not item then return false end -- Get the item's family local itemFamily = GetItemFamily(item) -- If the item is a container, then the itemFamily should be 0 --[[ local equipSlot = select(9, GetItemInfo(item)) if equipSlot == "INVTYPE_BAG" then itemFamily = 0 end ]]-- -- Get the bag's family local bagFamily = select(2, GetContainerNumFreeSlots(tobag)) return bagFamily == 0 or bit.band(itemFamily, bagFamily) > 0 end --èå æ¯å¦åå¤å¥½äºï¼æ éå®ç©åï¼ local function isBagReady(bag) for i=1,GetContainerNumSlots(bag) do local _, _, locked = GetContainerItemInfo(bag,i) if(locked)then return false end end return true end -- å ¬ä¼é¶è¡æ¯å¦åå¤å¥½ (æ éå®ç©å) local function isGBReady(tab) for i = 1, 98 do -- æ¯é¡µ98ä¸ªæ ¼å local _,_,locked = GetGuildBankItemInfo(tab or currentGBTab, i) if locked then return end end return true end --æ¯å¦ææèå åå¤å¥½äº local function isAllBagReady() for i=1,#JPack.bagGroups do for j=1,#JPack.bagGroups[i] do if(not isBagReady(JPack.bagGroups[i][j])) then return false end end end return true end --[[ return 1xxx éåå¾ ï¼0xxx for åå¾ï¼xxx为ï¼999-JPACK_ORDERä¸æå®çä½ç½®ï¼ ]] local function getPerffix(item) if not item then return end --æå称è·åé¡ºåº local i=IndexOfTable(JPACK_ORDER,item.name) if(i<=0)then --æåç±»å«è·åé¡ºåº i=IndexOfTable(JPACK_ORDER,"#"..item.type.."##"..item.subType) else --å称å¹é ç´æ¥è¿å return '1'..string.format("%3d",999-i) end if(i<=0)then --æåç±»å«è·åé¡ºåº i=IndexOfTable(JPACK_ORDER,"##"..item.subType) end if(i<=0)then --æç±»å«è·åé¡ºåº i=IndexOfTable(JPACK_ORDER,"#"..item.type) end if(i<=0)then --é»è®¤ç±»å«é¡ºåº i=IndexOfTable(JPACK_ORDER,"#") end if(i<=0)then --é»è®¤é¡ºåº i=999 end local s=string.format("%3d",999-i) --ç°è²ç©åãå¯è£ å¤çéä¼ç§ç©å if(item.rarity==0)then return "00"..s elseif(IsEquippableItem(item.name) and item.type~=L.TYPE_BAG and item.subType~=L.TYPE_FISHWEAPON) and item.subType~=L.TYPE_MISC then if(item.rarity <= 1 ) or (item.level<UnitLevel('player')*0.9)then return '02'..s end elseif(item.type==L.TYPE_CONSUMABLE)then if(item.level<UnitLevel('player')*0.9)then return '01'..s end end return "1"..s end --[[ bagIds = {1,3,5} packIndex ---JPackçindex bagID --- wow çbagId slotId ---- wow çslotId ]] --[[ bag èå slot ä½ç½® return æ¯å¦éè¦ä¿åå°é¶è¡ ]] local function shouldSaveToBank(bag,slot) local item=getJPackItem(bag,slot) return item~=nil and ((IndexOfTable(JPACK_DEPOSIT,"#"..item.type.."##"..item.subType)>0) or (IndexOfTable(JPACK_DEPOSIT,"#"..item.type)>0) or (IndexOfTable(JPACK_DEPOSIT,"##"..item.subType)>0) or (IndexOfTable(JPACK_DEPOSIT,item.name)>0)) end --[[ bag èå slot ä½ç½® return æ¯å¦éè¦ä»é¶è¡ååº ]] local function shouldLoadFromBank(bag,slot) local item=getJPackItem(bag,slot) return item~=nil and ((IndexOfTable(JPACK_DRAW,"#"..item.type.."##"..item.subType)>0) or (IndexOfTable(JPACK_DRAW,"#"..item.type)>0) or (IndexOfTable(JPACK_DRAW,"##"..item.subType)>0) or (IndexOfTable(JPACK_DRAW,item.name)>0)) end --[[ bags ä¸ç»èå bag å½åèå å¨bagsä¸ä½ç½® slot å½åèå slot return åä¸ä¸ªèå ä½ç½®ç bag,slot ]]-- local function getPrevSlot(bags,bag,slot) if(slot>1)then slot=slot-1 elseif(bag>1)then bag=bag-1 slot=GetContainerNumSlots(bags[bag]) else bag=-1 end return bag,slot end --[[ æ¯è¾ç¨çå符串,ä¸æåºç´æ¥ç¸å ³çå½æ° ]] local function getCompareStr(item) if(not item)then return nil elseif(not item.compareStr)then local _,_,textureType,textureIndex=string.find(item.texture,"\\.*\\([^_]+_?[^_]*_?[^_]*)_?(%d*)") if(not item.rarity)then item.rarity='1' end item.compareStr= getPerffix(item).." "..item.rarity..item.type.." "..item.subType.." "..textureType.." " ..string.format("%2d",item.minLevel).." "..string.format("%2d",item.level).." "..(textureIndex or "00")..item.name end return item.compareStr end --[[ æ¯è¾ä¸¤ä¸ªç©å return 1 a å¨å return -1 b å¨å ]] local function compare(a, b) local ret=0 if(a==b)then ret= 0 elseif(a==nil)then ret= -1 elseif(b==nil)then ret= 1 elseif(a.name==b.name)then ret= 0 else local sa = getCompareStr(a) local sb = getCompareStr(b) if(sa>sb)then ret= 1 elseif(sa<sb) then ret= -1 end end return ret end local function swap(items,i,j) local y=items[i] items[i]=items[j] items[j]=y end local function qsort(items,from,to) local i,j=from,to local ix=items[i] local x=i while(i<j) do while(j>x) do if(compare(items[j], ix)==1)then swap(items,j,x) x=j else j=j-1 end end while(i<x)do if(compare(items[i], ix)==-1)then swap(items,i,x) x=i else i=i+1 end end end if(x-1 > from) then qsort(items,from,x-1) end if(x+1 < to) then qsort(items,x+1,to) end end --[[ æåº items ,并è¿åä¸ä¸ªæ°çæåºè¿ç items,å items ä¸å ]] local function jsort(items) local clone = {}--Item:new[items.length] for i=1,bagSize do clone[i] = items[i] end qsort(clone,1,bagSize) return clone end --local moving=false local function sortTo(_current, _to) current=_current to=_to lockedSlots={} JPACK_STEP=JPACK_PACKING end --[[=================================== Main Processing =====================================]] --移å¨å°ç¹æ®èå ï¼å¦ç®è¢ï¼çµéè¢ï¼èè¯è¢ï¼ç¿ç³è¢ --flag =0 , èå ï¼ flag = 1 bank local function moveToSpecialBag(flag) local bagTypes if flag == 0 then --bagSlotTypes[容å¨]=[0,1,2,4] ï¼bagSlotTypes[ç®è¢]=[3] bagTypes = JPack.bagSlotTypes elseif flag == 1 then bagTypes = JPack.bankSlotTypes if(not JPack.bankOpened)then return end --elseif guidbank end --ä»å®¹å¨ä¸ååºç©å ,fromBags = å®¹å¨ local fromBags = bagTypes[L.TYPE_BAG] for k,v in pairs(bagTypes) do --é对æ¯ç§ä¸åçèå ,k is type,v is slots if k ~= L.TYPE_BAG then local toBags = v local frombagIndex,tobagIndex=#fromBags,#toBags local frombag,tobag = fromBags[frombagIndex],toBags[tobagIndex] local fromslot,toslot=GetContainerNumSlots(frombag),GetContainerNumSlots(tobag) --ç§»å¨ local c = 0 while(true) do c = c + 1 if(c>300)then debug("force quit, count to 300") break end while(tobagIndex>0 and GetContainerItemLink(tobag,toslot))do --ç´å°æ¾å°ä¸ä¸ªç©ºæ ¼ tobagIndex,toslot=getPrevSlot(toBags,tobagIndex,toslot) tobag = toBags[tobagIndex] end while(tobagIndex>0 and frombagIndex>0 and (not CanGoInBag(frombag,fromslot,tobag)))do frombagIndex,fromslot=getPrevSlot(fromBags,frombagIndex,fromslot) frombag = fromBags[frombagIndex] end if(frombagIndex<=0 or tobagIndex <=0 or fromslot<=0 or toslot<=0)then debug("break to move sepical bag") break end if CheckCursor() then print(L["WARN"],1,0,0) end PickupContainerItem(frombag,fromslot) PickupContainerItem(tobag,toslot) --next frombagIndex,fromslot=getPrevSlot(fromBags,frombagIndex,fromslot) tobagIndex,toslot=getPrevSlot(toBags,tobagIndex,toslot) end end end end --ä¿åå°é¶è¡ local function saveToBank() if(not JPack.bankOpened)then return end --ä¿å for k,v in pairs(JPack.bankSlotTypes) do --é对æ¯ç§ä¸åçèå ,k is type,v is slots local bkTypes,bagTypes=JPack.bankSlotTypes[k],JPack.bagSlotTypes[k] local bkBag,bag=#bkTypes,#bagTypes local bkSlot,slot=GetContainerNumSlots(bkTypes[bkBag]),GetContainerNumSlots(bagTypes[bag]) --ä¿å while(true) do while(bkBag>0 and GetContainerItemLink(bkTypes[bkBag],bkSlot))do --ç´å°æ¾å°ä¸ä¸ªç©ºæ ¼ bkBag,bkSlot=getPrevSlot(bkTypes,bkBag,bkSlot) end while(bag>0 and (not shouldSaveToBank(bagTypes[bag],slot)))do bag,slot=getPrevSlot(bagTypes,bag,slot) end if(bkBag<=0 or bag <=0 or bkSlot<=0 or slot<=0)then debug("break to save") break end if CheckCursor() then print(L["WARN"],1,0,0) end PickupContainerItem(bagTypes[bag],slot) PickupContainerItem(bkTypes[bkBag],bkSlot) --next bkBag,bkSlot=getPrevSlot(bkTypes,bkBag,bkSlot) bag,slot=getPrevSlot(bagTypes,bag,slot) end end end --ä»é¶è¡ååº local function loadFromBank() if(not JPack.bankOpened)then return end --ä¿å for k,v in pairs(JPack.bankSlotTypes) do --é对æ¯ç§ä¸åçèå ,k is type,v is slots local bkTypes,bagTypes=JPack.bankSlotTypes[k],JPack.bagSlotTypes[k] local bkBag,bag=#bkTypes,#bagTypes local bkSlot,slot=GetContainerNumSlots(bkTypes[bkBag]),GetContainerNumSlots(bagTypes[bag]) --ä¿å while(true) do while(bag>0 and GetContainerItemLink(bagTypes[bag],slot))do --ç´å°æ¾å°ä¸ä¸ªç©ºæ ¼ bag,slot=getPrevSlot(bagTypes,bag,slot) end while(bkBag>0 and (not shouldLoadFromBank(bkTypes[bkBag],bkSlot)))do bkBag,bkSlot=getPrevSlot(bkTypes,bkBag,bkSlot) end if(bkBag<=0 or bag <=0 or bkSlot<=0 or slot<=0)then break end if CheckCursor() then print(L["WARN"],1,0,0) end PickupContainerItem(bkTypes[bkBag],bkSlot) PickupContainerItem(bagTypes[bag],slot) --next bkBag,bkSlot=getPrevSlot(bkTypes,bkBag,bkSlot) bag,slot=getPrevSlot(bagTypes,bag,slot) end end end --[[ å°èå æç±»ååç» bagGroups bankGroups bagTypes packingTypeIndex packingBags ]] local dummy_table = {} local function groupBags() local ignored = JPACK_IGNORE_BAGS or dummy_table local bagTypes={} bagTypes[L.TYPE_BAG]={} if not ignored[0] then bagTypes[L.TYPE_BAG][1]=0 end for i=1,4 do if not ignored[i] then local name=GetBagName(i) if(name)then local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, subType, itemStackCount, itemEquipLoc, itemTexture = GetItemInfo(name) debug("Bag[",i,"]Typeï¼",subType) if(bagTypes[subType]==nil)then bagTypes[subType]={} end local t = bagTypes[subType] t[#t+1]=i end end end local bankSlotTypes={} if(JPack.bankOpened)then bankSlotTypes[L.TYPE_BAG]={} if not ignored[-1] then bankSlotTypes[L.TYPE_BAG][1]=-1 end for i=5,11 do if not ignored[i] then local name=GetBagName(i) if(name)then local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, subType, itemStackCount, itemEquipLoc, itemTexture = GetItemInfo(name) if(bankSlotTypes[subType]==nil)then bankSlotTypes[subType]={} end local t = bankSlotTypes[subType] t[#t+1]=i end end end end JPack.bagSlotTypes=bagTypes JPack.bankSlotTypes=bankSlotTypes local j=1 for k,v in pairs(bankSlotTypes) do JPack.bagGroups[j]=v j=j+1 end for k,v in pairs(bagTypes) do JPack.bagGroups[j]=v j=j+1 end end --[[ è·åPackingBagsç JPackæ ¼å¼ç©åtable ]] local function getPackingItems() local c=1 local items={} if not JPackDB then JPackDB = {} end if JPackDB.asc then for i=1,#JPack.packingBags do local num = GetContainerNumSlots(JPack.packingBags[i]) for j = 1,num do items[c]=getJPackItem(JPack.packingBags[i],j) c = c+1 end end else for i=#JPack.packingBags,1,-1 do local num = GetContainerNumSlots(JPack.packingBags[i]) for j = num,1,-1 do items[c]=getJPackItem(JPack.packingBags[i],j) c = c+1 end end end return items,c-1 end --[[ å¼å§å¯¹packingBags è¿è¡æ´ç ]] local function startPack() local items,count = getPackingItems() bagSize=count local sorted = jsort(items) debug("sorted...") --[[for i=1,#sorted do debug(getCompareStr(sorted[i])) end]] sortTo(items,sorted) end --[[ å° PackIndex 转æ¢ä¸º BagId,SlotId ]] local function getSlotId(packIndex) local slot=packIndex if JPackDB.asc then for i=1,#JPack.packingBags do local num=GetContainerNumSlots(JPack.packingBags[i]) if(slot<=num)then return JPack.packingBags[i],slot end slot = slot - num end else for i=#JPack.packingBags,1,-1 do local num=GetContainerNumSlots(JPack.packingBags[i]) if(slot<=num)then return JPack.packingBags[i],1+num-slot end slot = slot - num end end return -1,-1 end --[[ oldIndex åJPackç©åä½ç½®ç´¢å¼ newIndex æ°JPackç©åä½ç½®ç´¢å¼ æç©åä»oldIndex 移å¨å° newIndex ]] local function moveTo(oldIndex,newIndex) PickupContainerItem(getSlotId(oldIndex)) PickupContainerItem(getSlotId(newIndex)) end --[[ æä½ç½®æ¯å¦è¢«éå®,ä¸blizzardå½æ°ä¸åçæ¯ï¼ç©ºæ ¼ä¹å¯è½è¢«éå® ]] local function isLocked(index) local il=IndexOfTable(lockedSlots,index) local texture, itemCount, locked, quality, readable = GetContainerItemInfo(getSlotId(index)) if(texture==nil)then locked= il >0 elseif(il>0)then table.remove(lockedSlots,il) end return locked end --[[ items ç©åæ°ç» key å¾ æ¥æ¾ç©ååå return æåä¸ä¸ªå¯ä»¥ç§»å¨çæ¤ç©åä½ç½® ]] local function GetLastItemIndex(items,key) local i=bagSize while(i>0)do if(items[i] ~= nil and not isLocked(i) and items[i].name == key)then return i end i= i-1 end return -1 end --[[ 移å¨ä¸æ¬¡, è¿åæ¯å¦ç»§ç» ]] local function moveOnce() local working=false local i=1 local lockCount=0 while to[i] do local locked=isLocked(i) if(locked==nil)then locked=false end if(locked)then lockCount=lockCount+1 end if(lockCount>JPACK_MAXMOVE_ONCE)then return true end if(current[i] == nil or to[i].name ~= current[i].name)then working = true if(not locked)then local slot =GetLastItemIndex(current, to[i].name) if(slot ~= -1)then moveTo(slot,i) -- 移å¨ç©å local x=current[slot] current[slot]=current[i] current[i]=x if(current[slot]==nil)then --éå®ç©ºæ ¼ lockedSlots[#lockedSlots+1]=i end end end end i=i+1 end return working or lockCount>0 end --å å ä¸æ¬¡ï¼è¿åæ¯å¦ç»æ local function stackOnce() local bags,bag,item,slotInfo if(JPack.bankOpened)then bags={11,10,9,8,7,6,5,-1,4,3,2,1,0} else bags={4,3,2,1,0} end local pendingStack={} local complet=true for i=1,#bags do bag = bags[i] for slot = GetContainerNumSlots(bag),1,-1 do local texture, itemCount, locked, quality, readable = GetContainerItemInfo(bag, slot) item = getJPackItem(bag,slot) if(item)then if (not locked) then if (item.stackCount ~= 1) and (itemCount < item.stackCount)then slotInfo = pendingStack[item.itemid] if(slotInfo)then PickupContainerItem(bag,slot) PickupContainerItem(slotInfo[1],slotInfo[2]) pendingStack[item.itemid]=nil complet = false else pendingStack[item.itemid]={bag,slot} end end else complet = false end end end end return complet end --[[ === GuildBank === http://wowprogramming.com/docs/api/ GetCurrentGuildBankTab Returns the currently selected guild bank tab (number) PickupGuildBankItem GetGuildBankItemInfo(tab, slot) è¿å æè´¨/å å æ°é/*æ¯å¦éå® GetGuildBankItemLink GetGuildBankTabInfo GetGuildBankTabPermissions GetNumGuildBankTabs ]] --å å ä¸æ¬¡å ¬ä¼é¶è¡ï¼è¿åæ¯å¦ç»æ local function GBstackOnce() local item,slotInfo local pendingStack={} local complet = true for slot = 98,1,-1 do local texture, itemCount, locked = GetGuildBankItemInfo(currentGBTab, slot) if texture then -- if there is an item in this slot item = getJPackItem(currentGBTab,slot,true) -- tab, slot, isGuildBank if(item) then if(not locked)then if(itemCount < item.stackCount)then slotInfo = pendingStack[item.itemid] if(slotInfo)then JPack:GBMoved(true) PickupGuildBankItem(currentGBTab,slot) PickupGuildBankItem(slotInfo[1],slotInfo[2]) pendingStack[item.itemid]=nil complet = false else pendingStack[item.itemid]={currentGBTab,slot} end end else complet = false end end end end return complet end -- TODO --[[=================================== Events/slash..etc.. =====================================]] local function stopPacking() if JPack:GetScript"OnUpdate" then JPack:SetScript("OnUpdate", nil) end if JPack.packupguildbank then JPack:UnregisterEvent("GUILDBANKBAGSLOTS_CHANGED") end end JPack.OnLoad = {} JPack.OnLoad_GB = {} function JPack:ADDON_LOADED(event, addon) --if addon ~= 'JPack' then return end debug'JPack loaded' self:UnregisterEvent("ADDON_LOADED") self.ADDON_LOADED = nil JPackDB = JPackDB or {} local oldver = JPackDB.version if oldver ~= version then JPackDB.version = version end print(format('%s %s', version, L["HELP"])) JPack:RegisterEvent"BANKFRAME_OPENED" JPack:RegisterEvent"BANKFRAME_CLOSED" JPack:RegisterEvent"GUILDBANKFRAME_CLOSED" JPack:RegisterEvent"GUILDBANKFRAME_OPENED" end JPack:RegisterEvent"ADDON_LOADED" function JPack:BANKFRAME_OPENED() JPack.bankOpened = true end function JPack:BANKFRAME_CLOSED() JPack.bankOpened = false stopPacking() end function JPack:GUILDBANKFRAME_OPENED() JPack.guildbankOpened = true end function JPack:GUILDBANKFRAME_CLOSED() JPack.guildbankOpened = false if JPACK_STEP~=JPACK_STOPPED and JPack.packupguildbank then stopPacking() end end --[=[ GuildBank packup æåºå¯ä»¥åè é¶è¡çæ´çï¼ä½ç±äºpické¶è¡åpickèå é½æ¯ç¸åçapiåªæ¯èå çbagIdä¸å ï¼ èå ¬ä¼é¶è¡åæ¯å®å ¨ä½¿ç¨äºå¦å¤ä¸å¥apiï¼è¿éå¤çèµ·æ¥æäºé¾åº¦ã 1. å°èå åç»ï¼åç»å 类似 {{1,2,3},{4,5},{6,7,8},{9,10}} æ¯ä¸ä¸ªbagIdæ°ç»çæ°ç»ï¼ {1,2,3} è¿3èå å°è§ä¸ºæ´ä½å¨ä¸èµ·æ´çï¼ç¶åæ¯ {4,5} , { 6,7,8} ã å ¬ä¼é¶è¡çbagIdä¸èå é¶è¡çbagIdä¸ç¥éæ¯å¦æå²çªã å¦ææå²çªå¯ä»¥ä½¿ç¨ 100+å ¬ä¼é¶è¡bagId æ¥è¿è¡åºå 2. bagId,slotId -> jpackIndex , jpackIndex -> bagId,slotId ï¼å¨jpackæåºè¿ç¨ä¸ï¼ åªæ¯å¯¹ä¸ä¸ªæ°ç»è¿è¡æåºï¼èä¸åºåèå ï¼æ以éè¦å° bagIdãslotId 转æ¢ä¸º jpackIndexï¼ èå¨æåºç»æåï¼éè¦ç§»å¨ç©åï¼ å¨ç§»å¨ç©åæ¶åè¦æ jpackIndex 转æ¢ä¸º bagId,slotId 以移å¨ç©åã æ¤å¤åæ ·æ¯bagId çé®é¢ã 2. æåºãæ éä¿®æ¹ 3. 移å¨ç©åï¼pickup(bag1,slot1)ï¼pickup(bag2,slot2) ï¼ è¿ä¸¤è¡ä»£ç å°ä¼æ bag1,slot1 ä¸ bag2 slot2çç©åäºæ¢ï¼ bag2ï¼slot2 å¯ä»¥æ²¡æç©åï¼bag1ï¼slot1 å¿ é¡»æç©åã æ¤å¤è¦åçä¿®æ¹æ¯ï¼bag1ï¼bag2 å¦ææ¯èå æé¶è¡å使ç¨åæçpickupå½æ°ï¼ å¦æbag1ãbag2æ¯å ¬ä¼é¶è¡ï¼å使ç¨å ¬ä¼é¶è¡çpickupå½æ°ã ]=] --[[ GUILDBANKBAGSLOTS_CHANGED will fire THREE times when you move a item before this event fired, NOTHING you can do with the guildbank GuildBank movement check ]] local GUILDBANKBAGSLOTS_CHANGED_TIMES = 0 function JPack:GUILDBANKBAGSLOTS_CHANGED() GUILDBANKBAGSLOTS_CHANGED_TIMES = GUILDBANKBAGSLOTS_CHANGED_TIMES + 1 end function JPack:GBCanMove() if (GUILDBANKBAGSLOTS_CHANGED_TIMES ~= 0) and (GUILDBANKBAGSLOTS_CHANGED_TIMES%3 == 0) then return true end end function JPack:GBMoved(isTrue) if isTrue then GUILDBANKBAGSLOTS_CHANGED_TIMES = 0 end end --[[ bag/bank packup onupdate script to move items ]] local elapsed = 0 function JPack.OnUpdate(self, el) elapsed = elapsed + el if elapsed < self.updatePeriod then return end elapsed = 0 debug("\nOnUpdate!\n") if DEV_MOD and JPACK_STEP==JPACK_STARTED and JPack.guildbankOpened and JPack.packupguildbank then debug"æ´çå¼å§, å·¥ä¼é¶è¡æ´ç" -- åå¾å½åæå¼é¡µ currentGBTab = GetCurrentGuildBankTab() debug('currentGBTab: ',currentGBTab) -- å¤æç©å®¶æ¯å¦æå¼å ¬ä¼é¶è¡å¹¶æç¸åºæé *** éè¦çº æ£å¤æ if IsGuildLeader(UnitName("player")) then JPACK_STEP=JPACK_GUILDBANK_STACKING -- ç´æ¥è¿å ¥å·¥ä¼é¶è¡å å else local name, icon, isViewable, canDeposit, numWithdrawals, remainingWithdrawals = GetGuildBankTabInfo(currentGBTab) debug('isViewable ', isViewable, 'canDeposit ', canDeposit, 'remainingWithdrawals', remainingWithdrawals) if isViewable and canDeposit then -- æ¥æ移å¨æé JPACK_STEP=JPACK_GUILDBANK_STACKING -- è¿å ¥å·¥ä¼é¶è¡å å else currentGBTab = nil JPACK_STEP=JPACK_GUILDBANK_COMPLETE -- æ 足å¤æé ç»ææ´ç end end -- restack elseif(JPACK_STEP == JPACK_GUILDBANK_STACKING)then if JPack:GBCanMove() then if GBstackOnce() then JPACK_STEP = JPACK_GUILDBANK_SORTING end end -- 计ç®æåº, 移å¨ç©å elseif(JPACK_STEP == JPACK_GUILDBANK_SORTING)then JPACK_STEP = JPACK_GUILDBANK_COMPLETE --_G.print'123123123' --if isGBReady() then --å ¬ä¼é¶è¡æ´çç»æ, ç»ææ´çå·¥ä½ elseif(JPACK_STEP == JPACK_GUILDBANK_COMPLETE) then debug"GUILDBANK PACKUP COMPLETE" print(L["COMPLETE"]) JPack:UnregisterEvent("GUILDBANKBAGSLOTS_CHANGED") -- æ®éæ´ç elseif JPACK_STEP==JPACK_STARTED then debug"æ®éæ´ç" if stackOnce() then JPACK_STEP=JPACK_STACK_OVER end elseif(JPACK_STEP==JPACK_STACK_OVER)then debug("JPACK_STEP==JPACK_STACK_OVER, å¼å§ç§»å¨å°ç¹æ®èå ") if(isAllBagReady())then debug("å å å®æ¯,JPack_STEP=JPACK_STACK_OVER") moveToSpecialBag(1) moveToSpecialBag(0) JPACK_STEP = JPACK_SPEC_BAG_OVER end elseif(JPACK_STEP==JPACK_SPEC_BAG_OVER)then debug("JPACK_STEP==JPACK_SPEC_BAG_OVER, å¼å§åé¶è¡ä¿å") if(isAllBagReady())then if(JPack.deposit)then debug("saveToBank()") saveToBank() end JPACK_STEP=JPACK_DEPOSITING end elseif(JPACK_STEP==JPACK_DEPOSITING)then debug("JPACK_STEP==JPACK_DEPOSITING, å¼å§ä»é¶è¡æå") if(isAllBagReady())then debug("ä¿åç©åå®æ¯,JPack_STEP=JPACK_DEPOSITING") if(JPack.draw)then debug("loadFromBank()") loadFromBank() end JPACK_STEP=JPACK_START_PACK end elseif(JPACK_STEP==JPACK_START_PACK)then debug("å¼å§æ´ç,JPACK_STEP=JPACK_START_PACK") if(isAllBagReady())then JPack.packingGroupIndex=1 JPack.packingBags=JPack.bagGroups[1] --计ç®æåº startPack() JPACK_STEP=JPACK_PACKING end elseif(JPACK_STEP==JPACK_PACKING)then --æåºç»æ --移å¨ç©å if not moveOnce() then JPack.packingGroupIndex=JPack.packingGroupIndex + 1 debug("index", JPack.packingGroupIndex) JPack.packingBags=JPack.bagGroups[JPack.packingGroupIndex] debug("JPack.bagGroups . size = ",#JPack.bagGroups) for i=1,#JPack.bagGroups do for j=1,#JPack.bagGroups[i] do debug("i", i, "j", j..":", JPack.bagGroups[i][j]) end end if(JPack.packingBags==nil)then debug"PACKUP COMPLETE" JPACK_STEP=JPACK_STOPPED JPack.bagGroups={} print(L["COMPLETE"]) JPack:SetScript("OnUpdate",nil) current=nil to=nil else debug("Packing ", JPack.packingGroupIndex) startPack() end end end end local function pack() debug("\n\n\n\nPACK START") if CheckCursor() then print(L["WARN"],2,0.28,2) else JPACK_STEP=JPACK_STARTED if JPack.packupguildbank then JPack:GBMoved(true) JPack:RegisterEvent"GUILDBANKBAGSLOTS_CHANGED" else groupBags() end elapsed = 1 JPack:SetScript("OnUpdate", JPack.OnUpdate) end end SLASH_JPACK1 = "/jpack" SLASH_JPACK2 = "/jp" SlashCmdList.JPACK = function(msg) local a,b,c=strfind(msg, "(%S+)") if not c then return JPack:Pack() end c = strlower(c) if(c=="asc")then JPack:Pack(nil, 1) elseif(c=="desc")then JPack:Pack(nil, 2) elseif(c=="deposit" or c=="save")then JPack:Pack(1) elseif(c=="draw" or c=="load")then JPack:Pack(2) elseif(DEV_MOD and c=="gb" or c=="guildbank") then JPack:Pack(3) elseif(c == "stop") then stopPacking() elseif(c=="help")then local text = "%s - |cffffffff%s|r" print(L["Slash command"]..": /jpack |cffffffffor|r /jp") print(format(text, "/jp", L["Pack"])) print(format(text, "/jp asc", L["Set sequence to ascend"])) print(format(text, "/jp desc", L["Set sequence to descend"])) print(format(text, "/jp deposit |cffffffffor|r save", L["Save to the bank"])) print(format(text, "/jp draw |cffffffffor|r load", L["Load from the bank"])) if DEV_MOD then print(format(text, "/jp gb |cffffffffor|r guildback", L["Packup guildbank"])) end print(format(text, "/jp help", L["Print help info"])) else print(format("%s: |cffff0000%s|r , %s", L["Unknown command"], c, L["HELP"])) end end --[[=================================== API =====================================]] --[[ JPack:Pack(access, order) access 1 save 2 load 3 packup guild bank nil just pack the bag (and bank) order 1 asc 2 desc nil last-time-order ]] function JPack:Pack(access, order) JPack.deposit = false JPack.draw = false JPack.packupguildbank = false if access == 1 then JPack.deposit = true elseif access == 2 then JPack.draw = true elseif access == 3 and DEV_MOD then JPack.packupguildbank = true end if order == 1 then JPackDB.asc=true elseif order == 2 then JPackDB.asc=false end pack() end local L = _G.JPackLocale local addon = CreateFrame'frame' addon:SetScript('OnEvent', function(self, event, ...) self[event](self, event, ...) end) local function OnClick(self, button) local access, order if ( button == 'LeftButton' ) then if IsShiftKeyDown() then access = 1 elseif IsControlKeyDown() then access = 2 elseif IsAltKeyDown() then access = 3 end elseif ( button == 'RightButton' ) then if IsShiftKeyDown() then order = 1 elseif IsControlKeyDown() then order = 2 end end JPack:Pack(access, order) end local function OnEnter(self) GameTooltip:SetOwner(self, 'ANCHOR_RIGHT') GameTooltip:AddDoubleLine(L['Click'], L['Pack'], 0, 1, 0, 0, 1, 0) if JPack.DEV_MOD then GameTooltip:AddDoubleLine(L['Alt + Left-Click'], L['Packup guildbank'], 0, 1, 0, 0, 1, 0) end GameTooltip:AddDoubleLine(L['Shift + Left-Click'], L['Save to the bank'], 0, 1, 0, 0, 1, 0) GameTooltip:AddDoubleLine(L['Ctrl + Left-Click'], L['Load from the bank'], 0, 1, 0, 0, 1, 0) GameTooltip:AddDoubleLine(L['Shift + Right-Click'], L['Set sequence to ascend'], 0, 1, 0, 0, 1, 0) GameTooltip:AddDoubleLine(L['Ctrl + Right-Click'], L['Set sequence to descend'], 0, 1, 0, 0, 1, 0) GameTooltip:Show() end local function OnLeave() GameTooltip:Hide() end function BuildButton(parent, width, height, point1, point2, point3) local f = CreateFrame('Button', nil, parent, 'UIPanelButtonTemplate') f:SetWidth(width) f:SetHeight(height) f:SetPoint(point1, point2, point3) f:SetText(L['Pack']) f:SetScript('OnMouseUP', OnClick) f:SetScript('OnEnter', OnEnter) f:SetScript('OnLeave', OnLeave) return f end function addon:ADDON_LOADED(event,addon) if addon ~= 'Blizzard_GuildBankUI' then return end BuildButton(GuildBankFrame, 45, 20, 'TOPRIGHT', -25, -15) self:UnregisterEvent('ADDON_LOADED') self.ADDON_LOADED = nil end function addon:PLAYER_LOGIN() addon:UnregisterEvent('PLAYER_LOGIN') BuildButton(BBCont1_1, 45, 20, 'TOPRIGHT', -45, 22) BuildButton(BBCont2_1, 45, 20, 'TOPRIGHT', -45, 22) if JPack.DEV_MOD then addon:RegisterEvent('ADDON_LOADED') end end addon:RegisterEvent('PLAYER_LOGIN')