Compare commits
32 Commits
v60200-1.7
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 587a7e0d56 | |||
| 0cb3708671 | |||
| 35023a61c1 | |||
| a4f08a0b44 | |||
| 771bfaf5eb | |||
| 48eba18c2b | |||
| 089d270ade | |||
| 83abacd2f9 | |||
| 895f0ccd4c | |||
| 4d657ecee1 | |||
| 6352b997d1 | |||
| 23ff6cf7f3 | |||
| 17486c3251 | |||
| f6706c380b | |||
| f4ac2a0139 | |||
| b49f508c47 | |||
| 3a62dd9b99 | |||
| 6e353d9ebd | |||
| 733b7cc325 | |||
| f42d4c2a34 | |||
| 7c694ba727 | |||
| 77c25484f1 | |||
| f75aa0bd11 | |||
| 284bf213dd | |||
| 252e10de9a | |||
| 800a9b450b | |||
| e086ca746b | |||
| e140c68663 | |||
| 1f35539578 | |||
| 5e6b8eebf8 | |||
| 570abca36f | |||
| 7e13a47e52 |
21
.pkgmeta
21
.pkgmeta
@ -33,24 +33,3 @@ externals:
|
|||||||
Libs/AceGUI-3.0:
|
Libs/AceGUI-3.0:
|
||||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceGUI-3.0
|
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceGUI-3.0
|
||||||
tag: latest
|
tag: latest
|
||||||
MyBagsCache/Libs/LibStub:
|
|
||||||
url: svn://svn.wowace.com/wow/libstub/mainline/trunk
|
|
||||||
tag: latest
|
|
||||||
MyBagsCache/Libs/CallbackHandler-1.0:
|
|
||||||
url: svn://svn.wowace.com/wow/callbackhandler/mainline/trunk/CallbackHandler-1.0
|
|
||||||
tag: latest
|
|
||||||
MyBagsCache/Libs/AceAddon-3.0:
|
|
||||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceAddon-3.0
|
|
||||||
tag: latest
|
|
||||||
MyBagsCache/Libs/AceEvent-3.0:
|
|
||||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceEvent-3.0
|
|
||||||
tag: latest
|
|
||||||
MyBagsCache/Libs/AceDB-3.0:
|
|
||||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceDB-3.0
|
|
||||||
tag: latest
|
|
||||||
MyBagsCache/Libs/AceLocale-3.0:
|
|
||||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceLocale-3.0
|
|
||||||
tag: latest
|
|
||||||
|
|
||||||
move-folders:
|
|
||||||
MyBags/MyBagsCache: MyBagsCache
|
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
## Interface: 60200
|
## Interface: 70000
|
||||||
## Author: Ramble (modified by Isharra) (updated by thegabbert) (converted to Ace3 by Takika)
|
## Author: Ramble (modified by Isharra) (updated by thegabbert) (converted to Ace3 by Takika)
|
||||||
## Title: MyBags |cff007FFF -Ace3-|r
|
## Title: MyBags |cff007FFF -Ace3-|r
|
||||||
## Notes: Complete Replacement for Inventory and Bank Bags.
|
## Notes: Complete Replacement for Inventory and Bank Bags.
|
||||||
## OptionalDeps: MyBagsCache, DataStore, DataStore_Containers, DataStore_Characters
|
## OptionalDeps: DataStore, DataStore_Containers, DataStore_Characters
|
||||||
## SavedVariables: MyInventoryDB, MyBankDB, MyEquipmentDB
|
## SavedVariables: MyInventoryDB, MyBankDB, MyEquipmentDB
|
||||||
|
|
||||||
Embeds.xml
|
Embeds.xml
|
||||||
|
|||||||
@ -1,12 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.blizzard.com/wow/ui/" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
|
||||||
..\FrameXML\UI.xsd">
|
|
||||||
<Script file="Libs\LibStub\LibStub.lua"/>
|
|
||||||
<Include file="Libs\CallbackHandler-1.0\CallbackHandler-1.0.xml"/>
|
|
||||||
|
|
||||||
<!--Ace3 Libraries-->
|
|
||||||
<Include file="Libs\AceAddon-3.0\AceAddon-3.0.xml"/>
|
|
||||||
<Include file="Libs\AceEvent-3.0\AceEvent-3.0.xml"/>
|
|
||||||
<Include file="Libs\AceDB-3.0\AceDB-3.0.xml"/>
|
|
||||||
<Include file="Libs\AceLocale-3.0\AceLocale-3.0.xml"/>
|
|
||||||
</Ui>
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.blizzard.com/wow/ui/" xsi:schemaLocation="http://www.blizzard.com/wow/ui/FrameXML\UI.xsd">
|
|
||||||
<Include file="enUS.lua"/>
|
|
||||||
</Ui>
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
local L = LibStub("AceLocale-3.0"):NewLocale("MyBagsCache", "enUS", true, true)
|
|
||||||
|
|
||||||
if not L then
|
|
||||||
print("AceLocale not loaded")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
L["ACE_TEXT_OF"] = "of";
|
|
||||||
L["CHARACTER_DELIMITOR"] = " of ";
|
|
||||||
L["SplitString must be passed a string as the first argument"] = "SplitString must be passed a string as the first argument";
|
|
||||||
|
|
||||||
@ -1,452 +0,0 @@
|
|||||||
MyBagsCache = LibStub("AceAddon-3.0"):NewAddon("MyBagsCache", "AceEvent-3.0");
|
|
||||||
|
|
||||||
local L = LibStub("AceLocale-3.0"):GetLocale("MyBagsCache")
|
|
||||||
|
|
||||||
local select, tinsert, type = select, table.insert, type
|
|
||||||
local strfind, strsub, strtrim = string.find, string.sub, strtrim
|
|
||||||
local error, unpack = error, unpack
|
|
||||||
local tonumber, pairs = tonumber, pairs
|
|
||||||
|
|
||||||
local function GetItemInfoFromLink(l)
|
|
||||||
if (not l) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local c, t, id, il, n = select(3, strfind(l, "|cff(%x+)|H(%l+):(%-?%d+)([^|]+)|h%[(.-)%]|h|r"))
|
|
||||||
|
|
||||||
-- return n, c, id .. il, id, t
|
|
||||||
return n, c, id .. il, id
|
|
||||||
end
|
|
||||||
|
|
||||||
local function SplitString(s, p, n)
|
|
||||||
if (type(s) ~= "string") then
|
|
||||||
error(L["SplitString must be passed a string as the first argument"], 2)
|
|
||||||
end
|
|
||||||
|
|
||||||
local l, sp, ep = {}, 0
|
|
||||||
while (sp) do
|
|
||||||
sp, ep = strfind(s, p)
|
|
||||||
if (sp) then
|
|
||||||
tinsert(l, strsub(s, 1, sp - 1))
|
|
||||||
s = strsub(s, ep + 1)
|
|
||||||
else
|
|
||||||
tinsert(l, s)
|
|
||||||
break
|
|
||||||
end
|
|
||||||
if (n) then
|
|
||||||
n = n - 1
|
|
||||||
end
|
|
||||||
if (n and (n == 0)) then
|
|
||||||
tinsert(l, s)
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return unpack(l)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function SortChars(a, b, a_time, b_time, t)
|
|
||||||
local a_player, a_realm = SplitString(a, L["CHARACTER_DELIMITOR"])
|
|
||||||
local b_player, b_realm = SplitString(b, L["CHARACTER_DELIMITOR"])
|
|
||||||
if (t == "realm") then
|
|
||||||
if (a_realm == b_realm) then
|
|
||||||
return (a_player > b_player)
|
|
||||||
else
|
|
||||||
return (a_realm > b_realm)
|
|
||||||
end
|
|
||||||
elseif (t == "char") then
|
|
||||||
if (a_player == b_player) then
|
|
||||||
return (a_realm > b_realm)
|
|
||||||
else
|
|
||||||
return (a_player > b_player)
|
|
||||||
end
|
|
||||||
elseif (t == "update") then
|
|
||||||
return a_time < b_time
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:OnInitialize()
|
|
||||||
self.db = LibStub("AceDB-3.0"):New("MyBagsCacheDB");
|
|
||||||
local charName = strtrim(UnitName("player"));
|
|
||||||
local realmName = strtrim(GetRealmName());
|
|
||||||
-- self.atBank = false
|
|
||||||
self.Player = charName .. L["CHARACTER_DELIMITOR"] .. realmName
|
|
||||||
|
|
||||||
if not self.db.global[self.Player] then
|
|
||||||
self.db.global[self.Player]={}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:OnEnable()
|
|
||||||
self:RegisterEvent("PLAYER_MONEY")
|
|
||||||
self:RegisterEvent("PLAYERBANKSLOTS_CHANGED")
|
|
||||||
self:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED")
|
|
||||||
self:RegisterEvent("BANKFRAME_OPENED")
|
|
||||||
self:RegisterEvent("BANKFRAME_CLOSED")
|
|
||||||
self:RegisterEvent("UNIT_INVENTORY_CHANGED")
|
|
||||||
self:RegisterEvent("BAG_UPDATE")
|
|
||||||
self:RegisterEvent("BANKFRAME_OPENED")
|
|
||||||
self:RegisterEvent("BANKFRAME_CLOSED")
|
|
||||||
|
|
||||||
self:RegisterEvent("VOID_STORAGE_CONTENTS_UPDATE")
|
|
||||||
self:RegisterEvent("VOID_TRANSFER_DONE")
|
|
||||||
-- self:RegisterEvent("INVENTORY_SEARCH_UPDATE")
|
|
||||||
self:RegisterEvent("VOID_STORAGE_OPEN")
|
|
||||||
self:RegisterEvent("VOID_STORAGE_CLOSE")
|
|
||||||
|
|
||||||
if not self.db.global[self.Player][0] then
|
|
||||||
self:SaveItems()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:VOID_STORAGE_CONTENTS_UPDATE()
|
|
||||||
-- Move item in Void OR
|
|
||||||
-- Move item from Void to Withdraw
|
|
||||||
if (CanUseVoidStorage()) then
|
|
||||||
self.atVoid = true
|
|
||||||
self:SaveItems()
|
|
||||||
self:SaveUpdateTime()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:VOID_TRANSFER_DONE()
|
|
||||||
-- Move items between bags and void
|
|
||||||
if (CanUseVoidStorage()) then
|
|
||||||
self.atVoid = true
|
|
||||||
self:SaveItems()
|
|
||||||
self:SaveUpdateTime()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--[[
|
|
||||||
function MyBagsCache:INVENTORY_SEARCH_UPDATE()
|
|
||||||
-- Search box change
|
|
||||||
end
|
|
||||||
]]
|
|
||||||
|
|
||||||
function MyBagsCache:VOID_STORAGE_OPEN()
|
|
||||||
-- Open Void
|
|
||||||
if (CanUseVoidStorage()) then
|
|
||||||
self.atVoid = true
|
|
||||||
self:SaveItems()
|
|
||||||
self:SaveUpdateTime()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:VOID_STORAGE_CLOSE()
|
|
||||||
-- Close Void
|
|
||||||
self.atVoid = false
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:PLAYER_MONEY()
|
|
||||||
self.db.global[self.Player].cash = GetMoney();
|
|
||||||
self:SaveUpdateTime()
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:PLAYERBANKBAGSLOTS_CHANGED()
|
|
||||||
local numSlots, full = GetNumBankSlots()
|
|
||||||
local cost = GetBankSlotCost(numSlots)
|
|
||||||
if not self.db.global[self.Player].BankSlots then
|
|
||||||
self.db.global[self.Player].BankSlots = {}
|
|
||||||
end
|
|
||||||
self.db.global[self.Player].BankSlots = {
|
|
||||||
["Number"] = numSlots,
|
|
||||||
["Cost"] = cost,
|
|
||||||
["Full"] = full
|
|
||||||
}
|
|
||||||
self:SaveUpdateTime()
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:PLAYERBANKSLOTS_CHANGED()
|
|
||||||
local itemIndex
|
|
||||||
for itemIndex = 1, 28 do
|
|
||||||
self:SaveItemInfo(BANK_CONTAINER, itemIndex)
|
|
||||||
end
|
|
||||||
self:SaveUpdateTime()
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:BAG_UPDATE(event, bagIndex)
|
|
||||||
if not self.atBank and bagIndex > 4 and bagIndex <= 11 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local slots = self:SaveBagInfo(bagIndex)
|
|
||||||
local itemIndex
|
|
||||||
for itemIndex = 1, slots do
|
|
||||||
self:SaveItemInfo(bagIndex, itemIndex)
|
|
||||||
end
|
|
||||||
self:SaveUpdateTime()
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:UNIT_INVENTORY_CHANGED(event, unit)
|
|
||||||
if (unit == "player") then
|
|
||||||
self:SaveEquipment()
|
|
||||||
self:SaveUpdateTime()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:BANKFRAME_OPENED()
|
|
||||||
self.atBank = true
|
|
||||||
self:SaveItems()
|
|
||||||
self:SaveUpdateTime()
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:BANKFRAME_CLOSED()
|
|
||||||
self.atBank = false
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:SaveUpdateTime()
|
|
||||||
self.db.global[self.Player].updateTime = GetTime()
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:SaveItems()
|
|
||||||
self:SaveVoid()
|
|
||||||
self:SaveInventory()
|
|
||||||
self:SaveBank()
|
|
||||||
self:SaveEquipment()
|
|
||||||
self:PLAYER_MONEY()
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:SaveVoid()
|
|
||||||
if not self.atVoid then return end
|
|
||||||
if not self.db.global[self.Player]["Void"] then
|
|
||||||
self.db.global[self.Player]["Void"] = {}
|
|
||||||
end
|
|
||||||
local itemIndex
|
|
||||||
local VOID_STORAGE_SIZE = 80
|
|
||||||
for itemIndex = 1, VOID_STORAGE_SIZE do
|
|
||||||
local itemID, texture = GetVoidItemInfo(itemIndex);
|
|
||||||
if (itemID) then
|
|
||||||
local myName, myLink = GetItemInfo(itemID)
|
|
||||||
local myColor = select(2, GetItemInfoFromLink(myLink))
|
|
||||||
self.db.global[self.Player]["Void"][itemIndex] = {
|
|
||||||
["Name"] = myName,
|
|
||||||
["Color"] = myColor,
|
|
||||||
["Link"] = myLink,
|
|
||||||
["Count"] = 1,
|
|
||||||
["Texture"] = texture,
|
|
||||||
}
|
|
||||||
else
|
|
||||||
self.db.global[self.Player]["Void"][itemIndex] = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:SaveInventory()
|
|
||||||
local bagIndex
|
|
||||||
for bagIndex = 0, 4 do
|
|
||||||
local slots = self:SaveBagInfo(bagIndex)
|
|
||||||
local itemIndex
|
|
||||||
for itemIndex = 1, slots do
|
|
||||||
self:SaveItemInfo(bagIndex, itemIndex)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:SaveBank()
|
|
||||||
if not self.atBank then return end
|
|
||||||
if not self.db.global[self.Player][BANK_CONTAINER] then
|
|
||||||
self.db.global[self.Player][BANK_CONTAINER] = {}
|
|
||||||
end
|
|
||||||
if not self.db.global[self.Player][BANK_CONTAINER][0] then
|
|
||||||
self.db.global[self.Player][BANK_CONTAINER][0] = {}
|
|
||||||
end
|
|
||||||
self.db.global[self.Player][BANK_CONTAINER][0] = {
|
|
||||||
["Count"] = 28
|
|
||||||
}
|
|
||||||
local itemIndex, bagIndex
|
|
||||||
for itemIndex = 1, 28 do
|
|
||||||
self:SaveItemInfo(BANK_CONTAINER, itemIndex)
|
|
||||||
end
|
|
||||||
for bagIndex = 5, 11 do
|
|
||||||
local slots = self:SaveBagInfo(bagIndex)
|
|
||||||
for itemIndex = 1, slots do
|
|
||||||
self:SaveItemInfo(bagIndex, itemIndex)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:SaveEquipment()
|
|
||||||
if not self.db.global[self.Player].equipment then
|
|
||||||
self.db.global[self.Player].equipment = {}
|
|
||||||
end
|
|
||||||
local itemIndex
|
|
||||||
for itemIndex = 0, 19 do
|
|
||||||
self:SaveEquipmentInfo(itemIndex)
|
|
||||||
end
|
|
||||||
local hasRelic = UnitHasRelicSlot("player")
|
|
||||||
self.db.global[self.Player].equipment.hasRelic = hasRelic
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:SaveBagInfo(bagIndex)
|
|
||||||
local invID -- get Inventory ID
|
|
||||||
if bagIndex >= 1 and bagIndex <=4 then
|
|
||||||
invID = ContainerIDToInventoryID(bagIndex)
|
|
||||||
elseif bagIndex >= 5 and bagIndex <= 11 then
|
|
||||||
invID = BankButtonIDToInvSlotID(bagIndex, 1)
|
|
||||||
else
|
|
||||||
invID = nil;
|
|
||||||
end
|
|
||||||
if bagIndex == 0 then -- Set Count to 16
|
|
||||||
if not self.db.global[self.Player][bagIndex] then
|
|
||||||
self.db.global[self.Player][bagIndex]= {}
|
|
||||||
end
|
|
||||||
self.db.global[self.Player][bagIndex][0] = {
|
|
||||||
["Count"] = 16,
|
|
||||||
["Texture"] = "Interface\\Buttons\\Button-Backpack-Up"
|
|
||||||
}
|
|
||||||
return 16
|
|
||||||
end
|
|
||||||
local bagSize = GetContainerNumSlots(bagIndex)
|
|
||||||
local itemLink = GetInventoryItemLink("player", invID)
|
|
||||||
if itemLink then
|
|
||||||
local name, myColor, myLink = GetItemInfoFromLink(itemLink)
|
|
||||||
local soulbound, madeBy = nil
|
|
||||||
local texture = GetInventoryItemTexture("player", invID)
|
|
||||||
if not self.db.global[self.Player][bagIndex] then
|
|
||||||
self.db.global[self.Player][bagIndex] = {}
|
|
||||||
end
|
|
||||||
self.db.global[self.Player][bagIndex][0] = {
|
|
||||||
["Name"] = name,
|
|
||||||
["Color"] = myColor,
|
|
||||||
["Link"] = myLink,
|
|
||||||
["Count"] = bagSize,
|
|
||||||
["Texture"] = texture,
|
|
||||||
["Soulbound"] = soulbound,
|
|
||||||
["MadeBy"] = madeBy
|
|
||||||
}
|
|
||||||
end
|
|
||||||
if bagSize > 0 then
|
|
||||||
return bagSize
|
|
||||||
else
|
|
||||||
self.db.global[self.Player][bagIndex] = nil
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:SaveEquipmentInfo(itemIndex)
|
|
||||||
local itemLink = GetInventoryItemLink("player", itemIndex)
|
|
||||||
if itemLink or itemIndex == 0 then
|
|
||||||
-- local myColor, myLink, myName, soulbound, madeBy = nil
|
|
||||||
local texture = GetInventoryItemTexture("player", itemIndex)
|
|
||||||
local count = GetInventoryItemCount("player", itemIndex)
|
|
||||||
local myName, myColor, myLink = GetItemInfoFromLink(itemLink)
|
|
||||||
if not self.db.global[self.Player].equipment[itemIndex] then
|
|
||||||
self.db.global[self.Player].equipment[itemIndex] = {}
|
|
||||||
end
|
|
||||||
self.db.global[self.Player].equipment[itemIndex] = {
|
|
||||||
["Name"] = myName,
|
|
||||||
["Color"] = myColor,
|
|
||||||
["Link"] = myLink,
|
|
||||||
["Count"] = count,
|
|
||||||
["Texture"] = texture,
|
|
||||||
["Soulbound"] = nil,
|
|
||||||
["MadeBy"] = nil,
|
|
||||||
}
|
|
||||||
else
|
|
||||||
self.db.global[self.Player].equipment[itemIndex] = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:SaveItemInfo(bagIndex, itemIndex)
|
|
||||||
local itemLink = GetContainerItemLink(bagIndex, itemIndex)
|
|
||||||
if itemLink then
|
|
||||||
local myName, myColor, myLink = GetItemInfoFromLink(itemLink)
|
|
||||||
local texture, itemCount = GetContainerItemInfo(bagIndex, itemIndex)
|
|
||||||
self.db.global[self.Player][bagIndex][itemIndex] = {
|
|
||||||
["Name"] = myName,
|
|
||||||
["Color"] = myColor,
|
|
||||||
["Link"] = myLink,
|
|
||||||
["Count"] = itemCount,
|
|
||||||
["Texture"] = texture,
|
|
||||||
["Soulbound"] = nil,
|
|
||||||
["MadeBy"] = nil,
|
|
||||||
}
|
|
||||||
else
|
|
||||||
self.db.global[self.Player][bagIndex][itemIndex] = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:GetInfo(bagIndex, slotIndex, charID)
|
|
||||||
slotIndex = tonumber(slotIndex or 0)
|
|
||||||
if not self.db.global[charID] or not self.db.global[charID][bagIndex] or not self.db.global[charID][bagIndex][slotIndex] then
|
|
||||||
return nil, 0, nil, nil, nil
|
|
||||||
else
|
|
||||||
local data = self.db.global[charID][bagIndex][slotIndex]
|
|
||||||
return data.Texture, data.Count, data.Link, data.Color, data.Name
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:GetRelic(charID)
|
|
||||||
if not self.db.global[charID] or not self.db.global[charID].equipment or not self.db.global[charID].equipment.hasRelic then
|
|
||||||
return nil
|
|
||||||
else
|
|
||||||
return self.db.global[charID].equipment.hasRelic
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:GetCash(charID)
|
|
||||||
if not self.db.global[charID] or not self.db.global[charID].cash then
|
|
||||||
return nil
|
|
||||||
else
|
|
||||||
return self.db.global[charID].cash
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:GetCharList(realm)
|
|
||||||
local result = {}
|
|
||||||
local cache = self.db.global
|
|
||||||
local index, value
|
|
||||||
for index, value in pairs(cache) do
|
|
||||||
if index ~= "profiles" then
|
|
||||||
local charName, realmID = SplitString(index, L["CHARACTER_DELIMITOR"])
|
|
||||||
if (not realm or realmID == realm) then
|
|
||||||
result[index] = {
|
|
||||||
name = charName,
|
|
||||||
realm = realmID,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCache:GetSortedCharList(sorttype, realm)
|
|
||||||
local result = {}
|
|
||||||
local idx = 0
|
|
||||||
local cache = self.db.global
|
|
||||||
local index, value
|
|
||||||
for index, value in pairs(cache) do
|
|
||||||
if index ~= "profiles" then
|
|
||||||
local realmID = select(2, SplitString(index, L["CHARACTER_DELIMITOR"]))
|
|
||||||
if (not realm or realmID == realm) then
|
|
||||||
idx = idx + 1
|
|
||||||
result[idx] = index
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local swapped
|
|
||||||
local x_time, y_time
|
|
||||||
local q, w, i
|
|
||||||
repeat
|
|
||||||
swapped = 0
|
|
||||||
for i = 1, idx-1 do
|
|
||||||
q = result[i]
|
|
||||||
w = result[i+1]
|
|
||||||
if (not self.db.global[q].updateTime) then
|
|
||||||
x_time = 0
|
|
||||||
else
|
|
||||||
x_time = self.db.global[q].updateTime
|
|
||||||
end
|
|
||||||
if (not self.db.global[w].updateTime) then
|
|
||||||
y_time = 0
|
|
||||||
else
|
|
||||||
y_time = self.db.global[w].updateTime
|
|
||||||
end
|
|
||||||
if SortChars(q, w, x_time, y_time, sorttype) then
|
|
||||||
result[i] = w
|
|
||||||
result[i+1] = q
|
|
||||||
swapped = 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
until swapped == 0
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
## Interface: 50400
|
|
||||||
## Author: Takika
|
|
||||||
## Title: MyBagsCache3 |cff007FFF -Ace3-|r
|
|
||||||
## Notes: Item database for Equipment, Inventory and Bank Bags.
|
|
||||||
## OptionalDeps: Ace3
|
|
||||||
## SavedVariables: MyBagsCacheDB
|
|
||||||
## LoadOnDemand: 0
|
|
||||||
|
|
||||||
# Libraries
|
|
||||||
Embeds.xml
|
|
||||||
|
|
||||||
#Locales
|
|
||||||
Locals\Locals.xml
|
|
||||||
|
|
||||||
MyBagsCache.xml
|
|
||||||
MyBagsCache.lua
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
<Ui xmlns="http://www.blizzard.com/wow/ui/"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.blizzard.com/wow/ui/FrameXML/UI.xsd">
|
|
||||||
<GameTooltip name="MyBagsCacheHiddenTooltip" inherits="GameTooltipTemplate" parent="UIParent" hidden="true">
|
|
||||||
<Scripts>
|
|
||||||
<OnLoad>
|
|
||||||
self:SetOwner(UIParent, "ANCHOR_NONE");
|
|
||||||
</OnLoad>
|
|
||||||
</Scripts>
|
|
||||||
</GameTooltip>
|
|
||||||
</Ui>
|
|
||||||
|
|
||||||
@ -1,5 +1,65 @@
|
|||||||
local MBC = "MyBagsCore-1.0"
|
local MBC = "MyBagsCore-1.1"
|
||||||
local MBC_MINOR = "2015.08.28.2"
|
local MBC_MINOR = "2016.09.08.1"
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local error, assert, pairs, unpack = error, assert, pairs, unpack
|
||||||
|
local strfind, strlen, strsub, strlower, strgmatch, strupper = string.find, string.len, string.sub, string.lower, string.gmatch, string.upper
|
||||||
|
local strtrim, format, floor = strtrim, format, floor
|
||||||
|
local tinsert, tremove = table.insert, table.remove
|
||||||
|
local tostring, tonumber, select = tostring, tonumber, select
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local _G = _G
|
||||||
|
local NewItemsIsNewItem = C_NewItems.IsNewItem
|
||||||
|
local BackpackTokenFrame_IsShown = BackpackTokenFrame_IsShown
|
||||||
|
local BankButtonIDToInvSlotID = BankButtonIDToInvSlotID
|
||||||
|
local BattlePetToolTip_Show = BattlePetToolTip_Show
|
||||||
|
local ChatEdit_InsertLink = ChatEdit_InsertLink
|
||||||
|
local ContainerIDToInventoryID = ContainerIDToInventoryID
|
||||||
|
local CooldownFrame_Set = CooldownFrame_Set
|
||||||
|
local CreateFrame = CreateFrame
|
||||||
|
local CursorUpdate = CursorUpdate
|
||||||
|
local DressUpItemLink = DressUpItemLink
|
||||||
|
local GetBackpackCurrencyInfo = GetBackpackCurrencyInfo
|
||||||
|
local GetBankSlotCost = GetBankSlotCost
|
||||||
|
local GetContainerItemCooldown = GetContainerItemCooldown
|
||||||
|
local GetContainerItemInfo = GetContainerItemInfo
|
||||||
|
local GetContainerItemLink = GetContainerItemLink
|
||||||
|
local GetContainerNumSlots = GetContainerNumSlots
|
||||||
|
local GetInventoryItemTexture = GetInventoryItemTexture
|
||||||
|
local GetInventorySlotInfo = GetInventorySlotInfo
|
||||||
|
local GetItemIcon = GetItemIcon
|
||||||
|
local GetItemInfo = GetItemInfo
|
||||||
|
local GetItemQualityColor = GetItemQualityColor
|
||||||
|
local GetMoney = GetMoney
|
||||||
|
local GetNumBankSlots = GetNumBankSlots
|
||||||
|
local GetRealmName = GetRealmName
|
||||||
|
local IsAddOnLoaded = IsAddOnLoaded
|
||||||
|
local IsBattlePayItem = IsBattlePayItem
|
||||||
|
local IsControlKeyDown, IsShiftKeyDown = IsControlKeyDown, IsShiftKeyDown
|
||||||
|
local IsInventoryItemLocked = IsInventoryItemLocked
|
||||||
|
local IsInventoryItemProfessionBag = IsInventoryItemProfessionBag
|
||||||
|
local MoneyFrame_Update = MoneyFrame_Update
|
||||||
|
local PickupBagFromSlot = PickupBagFromSlot
|
||||||
|
local PlaySound = PlaySound
|
||||||
|
local PutItemInBackpack = PutItemInBackpack
|
||||||
|
local PutItemInBag = PutItemInBag
|
||||||
|
local SetItemButtonCount = SetItemButtonCount
|
||||||
|
local SetItemButtonDesaturated = SetItemButtonDesaturated
|
||||||
|
local SetItemButtonNormalTextureVertexColor = SetItemButtonNormalTextureVertexColor
|
||||||
|
local SetItemButtonTexture = SetItemButtonTexture
|
||||||
|
local SetItemButtonTextureVertexColor = SetItemButtonTextureVertexColor
|
||||||
|
local SetMoneyFrameColor = SetMoneyFrameColor
|
||||||
|
local SetTooltipMoney = SetTooltipMoney
|
||||||
|
local ShowInspectCursor = ShowInspectCursor
|
||||||
|
local SortBags = SortBags
|
||||||
|
local StaticPopup_Show = StaticPopup_Show
|
||||||
|
local UnitName = UnitName
|
||||||
|
|
||||||
|
--Global variables that we don't cache, list them here for the mikk's Find Globals script
|
||||||
|
-- GLOBALS: StaticPopupDialogs, UIParent, UISpecialFrames, UIDropDownMenu_SetSelectedValue, ContainerFrameItemButton_OnLoad
|
||||||
|
-- GLOBALS: BankFrameItemButtonGeneric_OnClick, ContainerFrameItemButton_OnClick, ContainerFrameItemButton_OnEnter
|
||||||
|
|
||||||
if not LibStub then
|
if not LibStub then
|
||||||
error(MBC .. " requires LibStub.")
|
error(MBC .. " requires LibStub.")
|
||||||
end
|
end
|
||||||
@ -30,17 +90,13 @@ local MYBAGS_HERBCOLOR = { 0.0, 0.6, 0.0 }
|
|||||||
local MYBAGS_GEMCOLOR = { 0.0, 0.6, 0.6 }
|
local MYBAGS_GEMCOLOR = { 0.0, 0.6, 0.6 }
|
||||||
local MYBAGS_MININGCOLOR = { 0.0, 0.0, 0.6 }
|
local MYBAGS_MININGCOLOR = { 0.0, 0.0, 0.6 }
|
||||||
|
|
||||||
local ACEG_MAP_ONOFF = {[0]="|cffff5050Off|r",[1]="|cff00ff00On|r"}
|
local ACEG_MAP_ONOFF = {
|
||||||
|
[0] = "|cffff5050Off|r",
|
||||||
|
[1] = "|cff00ff00On|r"
|
||||||
|
}
|
||||||
|
|
||||||
local L = LibStub("AceLocale-3.0"):GetLocale("MyBags")
|
local L = LibStub("AceLocale-3.0"):GetLocale("MyBags")
|
||||||
|
|
||||||
local pcall, error, pairs, unpack = pcall, error, pairs, unpack
|
|
||||||
local strfind, strlen, strsub, strlower, strgmatch, strupper = string.find, string.len, string.sub, string.lower, string.gmatch, string.upper
|
|
||||||
local strtrim = strtrim
|
|
||||||
local tinsert, tremove = table.insert, table.remove
|
|
||||||
local tostring, tonumber, select = tostring, tonumber, select
|
|
||||||
local CreateFrame = _G.CreateFrame
|
|
||||||
|
|
||||||
local mb_options = {
|
local mb_options = {
|
||||||
type = "group",
|
type = "group",
|
||||||
args = {
|
args = {
|
||||||
@ -68,9 +124,10 @@ local function ColorConvertHexToDigit(h)
|
|||||||
e = 14,
|
e = 14,
|
||||||
f = 15
|
f = 15
|
||||||
}
|
}
|
||||||
return ((tonumber(strsub(h,1,1)) or r[strsub(h,1,1)] or 0) * 16 + (tonumber(strsub(h,2,2)) or r[strsub(h,2,2)] or 0))/255,
|
|
||||||
((tonumber(strsub(h,3,3)) or r[strsub(h,3,3)] or 0) * 16 + (tonumber(strsub(h,4,4)) or r[strsub(h,4,4)] or 0))/255,
|
return ((tonum(strsub(h, 1, 1)) or r[strsub(h, 1, 1)] or 0) * 16 + (tonum(strsub(h, 2, 2)) or r[strsub(h, 2, 2)] or 0)) / 255,
|
||||||
((tonumber(strsub(h,5,5)) or r[strsub(h,5,5)] or 0) * 16 + (tonumber(strsub(h,6,6)) or r[strsub(h,6,6)] or 0))/255
|
((tonum(strsub(h, 3, 3)) or r[strsub(h, 3, 3)] or 0) * 16 + (tonum(strsub(h, 4, 4)) or r[strsub(h, 4, 4)] or 0)) / 255,
|
||||||
|
((tonum(strsub(h, 5, 5)) or r[strsub(h, 5, 5)] or 0) * 16 + (tonum(strsub(h, 6, 6)) or r[strsub(h, 6, 6)] or 0)) / 255
|
||||||
end
|
end
|
||||||
|
|
||||||
local function GetItemInfoFromLink(l)
|
local function GetItemInfoFromLink(l)
|
||||||
@ -87,10 +144,11 @@ local function GetBattlePetInfoFromLink(l)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local c, id, lvl, num, hp, pw, sp, u, n
|
local id, lvl, rar, hp, pw, sp, n
|
||||||
if (strfind(l, "Hbattlepet")) then
|
if (strfind(l, "Hbattlepet")) then
|
||||||
-- "|cff0070dd|Hbattlepet:1178:1:3:152:13:10:0x0000000000000000|h[Sunreaver Micro-Sentry]|h|r"
|
-- "|cff0070dd|Hbattlepet:1178:1:3:152:13:10:0x0000000000000000|h[Sunreaver Micro-Sentry]|h|r"
|
||||||
c, id, lvl, rar, hp, pw, sp, u, n = select(3, strfind(l, "|cff(%x+)|Hbattlepet:(%-?%d+):(%d+):(%d+):(%d+):(%d+):(%d+):([^|]+)|h%[(.-)%]|h|r"))
|
local u
|
||||||
|
id, lvl, rar, hp, pw, sp, u, n = select(4, strfind(l, "|cff(%x+)|Hbattlepet:(%-?%d+):(%d+):(%d+):(%d+):(%d+):(%d+):([^|]+)|h%[(.-)%]|h|r"))
|
||||||
end
|
end
|
||||||
|
|
||||||
return tonum(id), tonum(lvl), tonum(rar), tonum(hp), tonum(pw), tonum(sp), n
|
return tonum(id), tonum(lvl), tonum(rar), tonum(hp), tonum(pw), tonum(sp), n
|
||||||
@ -155,7 +213,6 @@ local function ParseWords(str, pat)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local list = {}
|
local list = {}
|
||||||
local word
|
|
||||||
|
|
||||||
for word in strgmatch(str, pat or "%S+") do
|
for word in strgmatch(str, pat or "%S+") do
|
||||||
tinsert(list, word)
|
tinsert(list, word)
|
||||||
@ -218,9 +275,11 @@ function MyBagsCore:OnEmbedInitialize(addon)
|
|||||||
if val == true then
|
if val == true then
|
||||||
val = 1
|
val = 1
|
||||||
end
|
end
|
||||||
|
|
||||||
if (map) then
|
if (map) then
|
||||||
val = map[val or 0] or val
|
val = map[val or 0] or val
|
||||||
end
|
end
|
||||||
|
|
||||||
AC:Printf(format(L["ACE_CMD_RESULT"], addon.name, text .. " " .. L["ACEG_TEXT_NOW_SET_TO"] .. " " .. format(L["ACEG_DISPLAY_OPTION"], val or L["ACE_CMD_REPORT_NO_VAL"])))
|
AC:Printf(format(L["ACE_CMD_RESULT"], addon.name, text .. " " .. L["ACEG_TEXT_NOW_SET_TO"] .. " " .. format(L["ACEG_DISPLAY_OPTION"], val or L["ACE_CMD_REPORT_NO_VAL"])))
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -236,7 +295,6 @@ function MyBagsCore:OnEmbedInitialize(addon)
|
|||||||
addon.frame = _G[addon.frameName]
|
addon.frame = _G[addon.frameName]
|
||||||
addon.frame.self = addon
|
addon.frame.self = addon
|
||||||
local inOptions = false
|
local inOptions = false
|
||||||
local key, value
|
|
||||||
for key, value in pairs(INTERFACEOPTIONS_ADDONCATEGORIES) do
|
for key, value in pairs(INTERFACEOPTIONS_ADDONCATEGORIES) do
|
||||||
if value.name == "MyBags" then
|
if value.name == "MyBags" then
|
||||||
inOptions = true
|
inOptions = true
|
||||||
@ -339,7 +397,6 @@ function MyBagsCore:CloseBag(bag)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function MyBagsCore:SetUISpecialFrames()
|
function MyBagsCore:SetUISpecialFrames()
|
||||||
local k, v
|
|
||||||
if self.GetOpt("NoEsc") then
|
if self.GetOpt("NoEsc") then
|
||||||
for k, v in pairs(UISpecialFrames) do
|
for k, v in pairs(UISpecialFrames) do
|
||||||
if v == (self.frameName) then
|
if v == (self.frameName) then
|
||||||
@ -367,6 +424,7 @@ function MyBagsCore:SetLockTexture()
|
|||||||
if not self.GetOpt("Lock") then
|
if not self.GetOpt("Lock") then
|
||||||
texture = texture .. "Un"
|
texture = texture .. "Un"
|
||||||
end
|
end
|
||||||
|
|
||||||
texture = texture .. "Locked-Up"
|
texture = texture .. "Locked-Up"
|
||||||
button:SetTexture(texture)
|
button:SetTexture(texture)
|
||||||
if self.GetOpt("Lock") and self.GetOpt("Graphics") == "none" then
|
if self.GetOpt("Lock") and self.GetOpt("Graphics") == "none" then
|
||||||
@ -378,12 +436,10 @@ end
|
|||||||
|
|
||||||
function MyBagsCore:CanSaveItems()
|
function MyBagsCore:CanSaveItems()
|
||||||
local live = self:IsLive()
|
local live = self:IsLive()
|
||||||
self.isLive = false
|
|
||||||
if self:GetInfoFunc() ~= self.GetInfoNone then
|
|
||||||
self.isLive = live
|
self.isLive = live
|
||||||
|
if self:GetInfoFunc() ~= self.GetInfoNone then
|
||||||
return true
|
return true
|
||||||
else
|
else
|
||||||
self.isLive = live
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -516,6 +572,7 @@ function MyBagsCore:IncludeBag(bag)
|
|||||||
if self.db.profiles[prof][bs] and self.db.profiles[prof][bs]["Exclude"] then
|
if self.db.profiles[prof][bs] and self.db.profiles[prof][bs]["Exclude"] then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -541,10 +598,8 @@ function MyBagsCore:GetCash()
|
|||||||
local player, realm = self:SplitString(self:GetCurrentPlayer(), L["CHARACTER_DELIMITOR"])
|
local player, realm = self:SplitString(self:GetCurrentPlayer(), L["CHARACTER_DELIMITOR"])
|
||||||
local char_key = DS:GetCharacter(player, realm)
|
local char_key = DS:GetCharacter(player, realm)
|
||||||
return DS:GetMoney(char_key)
|
return DS:GetMoney(char_key)
|
||||||
elseif IsAddOnLoaded("MyBagsCache") then
|
|
||||||
local charID = self:GetCurrentPlayer()
|
|
||||||
return MyBagsCache:GetCash(charID)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -567,9 +622,11 @@ function MyBagsCore:SplitString(s, p, n)
|
|||||||
tinsert(l, s)
|
tinsert(l, s)
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
|
||||||
if (n) then
|
if (n) then
|
||||||
n = n - 1
|
n = n - 1
|
||||||
end
|
end
|
||||||
|
|
||||||
if (n and (n == 0)) then
|
if (n and (n == 0)) then
|
||||||
tinsert(l, s)
|
tinsert(l, s)
|
||||||
break
|
break
|
||||||
@ -612,23 +669,20 @@ function MyBagsCore:GetInfoLive(bag, slot)
|
|||||||
local charName = strtrim(UnitName("player"))
|
local charName = strtrim(UnitName("player"))
|
||||||
local realmName = strtrim(GetRealmName())
|
local realmName = strtrim(GetRealmName())
|
||||||
self.Player = charName .. L["CHARACTER_DELIMITOR"] .. realmName
|
self.Player = charName .. L["CHARACTER_DELIMITOR"] .. realmName
|
||||||
|
local texture, count, ID, locked, quality, readable, name, i_type, _
|
||||||
if slot ~= nil then
|
if slot ~= nil then
|
||||||
-- it's an item
|
-- it's an item
|
||||||
local texture, count, locked, _ , readable = GetContainerItemInfo(bag, slot)
|
texture, count, locked, _, readable = GetContainerItemInfo(bag, slot)
|
||||||
local itemLink = GetContainerItemLink(bag, slot)
|
local itemLink = GetContainerItemLink(bag, slot)
|
||||||
local name, quality, _, ID, i_type
|
|
||||||
if itemLink then
|
if itemLink then
|
||||||
name, quality, _, ID, i_type = GetItemInfoFromLink(itemLink)
|
name, quality, _, ID, i_type = GetItemInfoFromLink(itemLink)
|
||||||
end
|
end
|
||||||
|
|
||||||
count = tonum(count)
|
|
||||||
return texture, count, ID, locked, quality, readable, name or nil, i_type
|
|
||||||
else
|
else
|
||||||
-- it's a bag
|
-- it's a bag
|
||||||
local count = GetContainerNumSlots(bag)
|
i_type = "bag"
|
||||||
|
count = GetContainerNumSlots(bag)
|
||||||
|
local itemLink
|
||||||
local inventoryID = self:BagIDToInvSlotID(bag)
|
local inventoryID = self:BagIDToInvSlotID(bag)
|
||||||
local texture, itemLink, locked, readable
|
|
||||||
local name, quality, _, ID
|
|
||||||
if inventoryID then
|
if inventoryID then
|
||||||
texture = GetInventoryItemTexture("player", inventoryID)
|
texture = GetInventoryItemTexture("player", inventoryID)
|
||||||
itemLink = GetInventoryItemLink("player", inventoryID)
|
itemLink = GetInventoryItemLink("player", inventoryID)
|
||||||
@ -644,18 +698,17 @@ function MyBagsCore:GetInfoLive(bag, slot)
|
|||||||
texture = "Interface\\Buttons\\Button-Backpack-Up"
|
texture = "Interface\\Buttons\\Button-Backpack-Up"
|
||||||
count = 16
|
count = 16
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
count = tonum(count)
|
count = tonum(count)
|
||||||
return texture, count, ID, locked, quality, readable, name or nil, "bag"
|
return texture, count, ID, locked, quality, readable, name or nil, i_type
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function MyBagsCore:GetInfoDataStore(bag, slot)
|
function MyBagsCore:GetInfoDataStore(bag, slot)
|
||||||
local DS = DataStore
|
local DS = DataStore
|
||||||
local player, realm = self:SplitString(self:GetCurrentPlayer(), L["CHARACTER_DELIMITOR"])
|
local player, realm = self:SplitString(self:GetCurrentPlayer(), L["CHARACTER_DELIMITOR"])
|
||||||
local char_key = DS:GetCharacter(player, realm)
|
local char_key = DS:GetCharacter(player, realm)
|
||||||
local readable
|
local texture, count, ID, quality, readable, name, i_type, _
|
||||||
local quality
|
|
||||||
|
|
||||||
if self.isEquipment then
|
if self.isEquipment then
|
||||||
-- texture, count, id, locked, quality, _, name = GetInfo(item)
|
-- texture, count, id, locked, quality, _, name = GetInfo(item)
|
||||||
@ -672,18 +725,18 @@ function MyBagsCore:GetInfoDataStore(bag, slot)
|
|||||||
if bag == -1 then
|
if bag == -1 then
|
||||||
bag = 100
|
bag = 100
|
||||||
end
|
end
|
||||||
|
|
||||||
local container = DS:GetContainer(char_key, bag)
|
local container = DS:GetContainer(char_key, bag)
|
||||||
if not slot then
|
if not slot then
|
||||||
local texture, ID, count, _, _ = DS:GetContainerInfo(char_key, bag)
|
i_type = "bag"
|
||||||
local name
|
texture, ID, count, _, _ = DS:GetContainerInfo(char_key, bag)
|
||||||
if ID then
|
if ID then
|
||||||
name = GetItemInfo(ID)
|
name = GetItemInfo(ID)
|
||||||
readable = IsSpecialtyBagFromID(ID)
|
readable = IsSpecialtyBagFromID(ID)
|
||||||
end
|
end
|
||||||
return texture, count, ID, nil, quality, readable, name
|
|
||||||
else
|
else
|
||||||
local ID, slotLink, count = DS:GetSlotInfo(container, slot)
|
local slotLink, itemLink
|
||||||
local name, itemLink, texture, quality, i_type
|
ID, slotLink, count = DS:GetSlotInfo(container, slot)
|
||||||
if ID then
|
if ID then
|
||||||
name, itemLink = GetItemInfo(ID)
|
name, itemLink = GetItemInfo(ID)
|
||||||
texture = GetItemIcon(ID)
|
texture = GetItemIcon(ID)
|
||||||
@ -691,28 +744,15 @@ function MyBagsCore:GetInfoDataStore(bag, slot)
|
|||||||
quality, i_type = select(3, strfind(itemLink, "|cff(%x+)|H(%l+):.*|h|r"))
|
quality, i_type = select(3, strfind(itemLink, "|cff(%x+)|H(%l+):.*|h|r"))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if slotLink then
|
if slotLink then
|
||||||
ID = slotLink
|
ID = slotLink
|
||||||
end
|
end
|
||||||
return texture, count, ID, nil, quality, readable, name, i_type
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBagsCore:GetInfoMyBagsCache(bag,slot)
|
|
||||||
local charID = self:GetCurrentPlayer()
|
|
||||||
local texture, count, ID, locked, quality, readable, name, i_type
|
|
||||||
if self.isEquipment then
|
|
||||||
texture, count, ID, quality, name, i_type = MyBagsCache:GetInfo("equipment", bag, charID)
|
|
||||||
else
|
|
||||||
texture, count, ID, quality, name, i_type = MyBagsCache:GetInfo(bag, slot, charID)
|
|
||||||
if not slot and ID then
|
|
||||||
readable = IsSpecialtyBagFromID(ID)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
count = tonum(count)
|
count = tonum(count)
|
||||||
return texture, count, ID, nil, quality, readable, name, i_type
|
return texture, count, ID, nil, quality or nil, readable, name, i_type
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function MyBagsCore:GetInfoNone(bag, slot)
|
function MyBagsCore:GetInfoNone(bag, slot)
|
||||||
@ -721,13 +761,12 @@ end
|
|||||||
|
|
||||||
function MyBagsCore:GetSlotCount()
|
function MyBagsCore:GetSlotCount()
|
||||||
local slots, used, displaySlots = 0, 0, 0
|
local slots, used, displaySlots = 0, 0, 0
|
||||||
local i
|
|
||||||
local bagIndex
|
|
||||||
if self.isBank then
|
if self.isBank then
|
||||||
if self:CanSaveItems() or self.isLive then
|
if self:CanSaveItems() or self.isLive then
|
||||||
slots = 28
|
slots = 28
|
||||||
displaySlots = 28
|
displaySlots = 28
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 1, slots do
|
for i = 1, slots do
|
||||||
if (self:GetInfo(BANK_CONTAINER, i)) then
|
if (self:GetInfo(BANK_CONTAINER, i)) then
|
||||||
used = used + 1
|
used = used + 1
|
||||||
@ -771,6 +810,7 @@ function MyBagsCore:ItemButton_OnLeave(widget)
|
|||||||
if bagButton then
|
if bagButton then
|
||||||
bagButton:UnlockHighlight()
|
bagButton:UnlockHighlight()
|
||||||
end
|
end
|
||||||
|
|
||||||
CursorUpdate(widget)
|
CursorUpdate(widget)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -834,7 +874,8 @@ function MyBagsCore:ItemButton_OnEnter(widget)
|
|||||||
if widget:GetParent() == MyBankFrameBank then
|
if widget:GetParent() == MyBankFrameBank then
|
||||||
GameTooltip:SetInventoryItem("player", BankButtonIDToInvSlotID(widget:GetID()))
|
GameTooltip:SetInventoryItem("player", BankButtonIDToInvSlotID(widget:GetID()))
|
||||||
else
|
else
|
||||||
local hasCooldown, repairCost, speciesID, level, breedQuality, maxHealth, power, speed, name = GameTooltip:SetBagItem(widget:GetParent():GetID(), widget:GetID())
|
local speciesID = select(3, GameTooltip:SetBagItem(widget:GetParent():GetID(), widget:GetID()))
|
||||||
|
-- local hasCooldown, repairCost, speciesID, level, breedQuality, maxHealth, power, speed, name = GameTooltip:SetBagItem(widget:GetParent():GetID(), widget:GetID())
|
||||||
if (speciesID and speciesID > 0) then
|
if (speciesID and speciesID > 0) then
|
||||||
local link = GetContainerItemLink(widget:GetParent():GetID(), widget:GetID())
|
local link = GetContainerItemLink(widget:GetParent():GetID(), widget:GetID())
|
||||||
local id, lvl, rar, hp, pw, sp, n = GetBattlePetInfoFromLink(link)
|
local id, lvl, rar, hp, pw, sp, n = GetBattlePetInfoFromLink(link)
|
||||||
@ -843,6 +884,7 @@ function MyBagsCore:ItemButton_OnEnter(widget)
|
|||||||
if (BattlePetTooltip) then
|
if (BattlePetTooltip) then
|
||||||
BattlePetTooltip:Hide()
|
BattlePetTooltip:Hide()
|
||||||
end
|
end
|
||||||
|
|
||||||
ContainerFrameItemButton_OnEnter(widget)
|
ContainerFrameItemButton_OnEnter(widget)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -851,7 +893,9 @@ function MyBagsCore:ItemButton_OnEnter(widget)
|
|||||||
local i_type = select(8, self:GetInfo(widget:GetParent():GetID(), widget:GetID() - 1000))
|
local i_type = select(8, self:GetInfo(widget:GetParent():GetID(), widget:GetID() - 1000))
|
||||||
if ID and i_type ~= "battlepet" then
|
if ID and i_type ~= "battlepet" then
|
||||||
local hyperlink = self:GetHyperlink(ID)
|
local hyperlink = self:GetHyperlink(ID)
|
||||||
if hyperlink then GameTooltip:SetHyperlink(hyperlink) end
|
if hyperlink then
|
||||||
|
GameTooltip:SetHyperlink(hyperlink)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -920,6 +964,7 @@ function MyBagsCore:BagButton_OnEnter(widget)
|
|||||||
else
|
else
|
||||||
SetMoneyFrameColor("GameTooltipMoneyFrame", 1.0, 0.1, 0.1)
|
SetMoneyFrameColor("GameTooltipMoneyFrame", 1.0, 0.1, 0.1)
|
||||||
end
|
end
|
||||||
|
|
||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -937,7 +982,6 @@ function MyBagsCore:BagButton_OnEnter(widget)
|
|||||||
|
|
||||||
if self.GetOpt("HlItems") then
|
if self.GetOpt("HlItems") then
|
||||||
-- Highlight
|
-- Highlight
|
||||||
local i
|
|
||||||
for i = 1, self.GetOpt("MAXBAGSLOTS") do
|
for i = 1, self.GetOpt("MAXBAGSLOTS") do
|
||||||
local button = _G[bagFrame:GetName() .. "Item" .. i]
|
local button = _G[bagFrame:GetName() .. "Item" .. i]
|
||||||
if button then
|
if button then
|
||||||
@ -952,7 +996,6 @@ end
|
|||||||
function MyBagsCore:BagButton_OnLeave(widget)
|
function MyBagsCore:BagButton_OnLeave(widget)
|
||||||
SetMoneyFrameColor("GameTooltipMoneyFrame", 1.0, 1.0, 1.0)
|
SetMoneyFrameColor("GameTooltipMoneyFrame", 1.0, 1.0, 1.0)
|
||||||
GameTooltip:Hide()
|
GameTooltip:Hide()
|
||||||
local i
|
|
||||||
for i = 1, self.GetOpt("MAXBAGSLOTS") do
|
for i = 1, self.GetOpt("MAXBAGSLOTS") do
|
||||||
local button = _G[widget:GetParent():GetName() .. "Item" .. i]
|
local button = _G[widget:GetParent():GetName() .. "Item" .. i]
|
||||||
if button then
|
if button then
|
||||||
@ -976,6 +1019,7 @@ function MyBagsCore:BagButton_OnClick(widget, button, ignoreShift)
|
|||||||
if not StaticPopupDialogs["PURCHASE_BANKBAG"] then
|
if not StaticPopupDialogs["PURCHASE_BANKBAG"] then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
StaticPopup_Show("PURCHASE_BANKBAG")
|
StaticPopup_Show("PURCHASE_BANKBAG")
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -997,8 +1041,10 @@ function MyBagsCore:BagButton_OnClick(widget, button, ignoreShift)
|
|||||||
if not self.db.profiles[prof][bg] then
|
if not self.db.profiles[prof][bg] then
|
||||||
self.db.profiles[prof][bg] = {}
|
self.db.profiles[prof][bg] = {}
|
||||||
end
|
end
|
||||||
|
|
||||||
self.db.profiles[prof][bg]["Exclude"] = true
|
self.db.profiles[prof][bg]["Exclude"] = true
|
||||||
end
|
end
|
||||||
|
|
||||||
self.hooks.CloseBag(bgnum)
|
self.hooks.CloseBag(bgnum)
|
||||||
self:LayoutFrame()
|
self:LayoutFrame()
|
||||||
end
|
end
|
||||||
@ -1028,6 +1074,7 @@ function MyBagsCore:BagButton_OnReceiveDrag(widget)
|
|||||||
else
|
else
|
||||||
hadItem = PutItemInBag(invID)
|
hadItem = PutItemInBag(invID)
|
||||||
end
|
end
|
||||||
|
|
||||||
if not hadItem then
|
if not hadItem then
|
||||||
if not self:IncludeBag(bagFrame:GetID()) then
|
if not self:IncludeBag(bagFrame:GetID()) then
|
||||||
self.hooks.ToggleBag(bagFrame:GetID())
|
self.hooks.ToggleBag(bagFrame:GetID())
|
||||||
@ -1079,7 +1126,6 @@ function MyBagsCore:LayoutOptions()
|
|||||||
if (BackpackTokenFrame_IsShown()) then
|
if (BackpackTokenFrame_IsShown()) then
|
||||||
token:SetParent(self.frameName)
|
token:SetParent(self.frameName)
|
||||||
token:SetPoint("RIGHT", cash, "LEFT", -10, 0)
|
token:SetPoint("RIGHT", cash, "LEFT", -10, 0)
|
||||||
local i
|
|
||||||
for i = 1, MAX_WATCHED_TOKENS do
|
for i = 1, MAX_WATCHED_TOKENS do
|
||||||
local name, count, icon, currencyID = GetBackpackCurrencyInfo(i)
|
local name, count, icon, currencyID = GetBackpackCurrencyInfo(i)
|
||||||
-- Update watched tokens
|
-- Update watched tokens
|
||||||
@ -1091,6 +1137,7 @@ function MyBagsCore:LayoutOptions()
|
|||||||
else
|
else
|
||||||
watchButton.count:SetText("*")
|
watchButton.count:SetText("*")
|
||||||
end
|
end
|
||||||
|
|
||||||
watchButton.currencyID = currencyID
|
watchButton.currencyID = currencyID
|
||||||
watchButton:Show()
|
watchButton:Show()
|
||||||
BackpackTokenFrame.shouldShow = 1
|
BackpackTokenFrame.shouldShow = 1
|
||||||
@ -1102,6 +1149,7 @@ function MyBagsCore:LayoutOptions()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
token:Show()
|
token:Show()
|
||||||
else
|
else
|
||||||
token:Hide()
|
token:Hide()
|
||||||
@ -1125,6 +1173,7 @@ function MyBagsCore:LayoutOptions()
|
|||||||
else
|
else
|
||||||
playerSelectFrame:Hide()
|
playerSelectFrame:Hide()
|
||||||
end
|
end
|
||||||
|
|
||||||
playerSelectFrame:ClearAllPoints()
|
playerSelectFrame:ClearAllPoints()
|
||||||
|
|
||||||
if self.GetOpt("Graphics") == "art" then
|
if self.GetOpt("Graphics") == "art" then
|
||||||
@ -1173,6 +1222,7 @@ function MyBagsCore:LayoutOptions()
|
|||||||
else
|
else
|
||||||
slots:Hide()
|
slots:Hide()
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.GetOpt("Reverse") then
|
if self.GetOpt("Reverse") then
|
||||||
self.reverseOrder = true
|
self.reverseOrder = true
|
||||||
else
|
else
|
||||||
@ -1183,11 +1233,19 @@ function MyBagsCore:LayoutOptions()
|
|||||||
if self.GetOpt("AIOI") then
|
if self.GetOpt("AIOI") then
|
||||||
self.aioiOrder = true
|
self.aioiOrder = true
|
||||||
local columns = self.GetOpt("Columns")
|
local columns = self.GetOpt("Columns")
|
||||||
if not (self.isEquipment) and self.GetOpt("Bag") == "before" then displaySlots = displaySlots + self.totalBags end
|
if not (self.isEquipment) and self.GetOpt("Bag") == "before" then
|
||||||
|
displaySlots = displaySlots + self.totalBags
|
||||||
|
end
|
||||||
|
|
||||||
columns = tonum(columns)
|
columns = tonum(columns)
|
||||||
if self.isEquipment then displaySlots = 20 end
|
if self.isEquipment then
|
||||||
|
displaySlots = 20
|
||||||
|
end
|
||||||
|
|
||||||
self.curCol = columns - (mod(displaySlots, columns))
|
self.curCol = columns - (mod(displaySlots, columns))
|
||||||
if self.curCol == columns then self.curCol = 0 end
|
if self.curCol == columns then
|
||||||
|
self.curCol = 0
|
||||||
|
end
|
||||||
else
|
else
|
||||||
self.aioiOrder = false
|
self.aioiOrder = false
|
||||||
end
|
end
|
||||||
@ -1321,7 +1379,6 @@ function MyBagsCore:LayoutBagFrame(bagFrame)
|
|||||||
searchText = strlower(strtrim(searchText))
|
searchText = strlower(strtrim(searchText))
|
||||||
end
|
end
|
||||||
|
|
||||||
local slot
|
|
||||||
local itemBase = bagFrameName .. "Item"
|
local itemBase = bagFrameName .. "Item"
|
||||||
local bagButton = _G[bagFrameName .. "Bag"]
|
local bagButton = _G[bagFrameName .. "Bag"]
|
||||||
local slotColor = ((self.GetOpt("SlotColor")) or MYBAGS_SLOTCOLOR)
|
local slotColor = ((self.GetOpt("SlotColor")) or MYBAGS_SLOTCOLOR)
|
||||||
@ -1338,7 +1395,7 @@ function MyBagsCore:LayoutBagFrame(bagFrame)
|
|||||||
bagFrame.size = tonum(count)
|
bagFrame.size = tonum(count)
|
||||||
if bagButton and bagFrame:GetID() ~= BANK_CONTAINER then
|
if bagButton and bagFrame:GetID() ~= BANK_CONTAINER then
|
||||||
if not texture then
|
if not texture then
|
||||||
local bag_id, texture = GetInventorySlotInfo("Bag0Slot")
|
texture = select(2, GetInventorySlotInfo("Bag0Slot"))
|
||||||
end
|
end
|
||||||
|
|
||||||
if not self.isLive or (self.isLive and self:IsBagSlotUsable(bagFrame:GetID())) then
|
if not self.isLive or (self.isLive and self:IsBagSlotUsable(bagFrame:GetID())) then
|
||||||
@ -1410,7 +1467,7 @@ function MyBagsCore:LayoutBagFrame(bagFrame)
|
|||||||
local newItemTexture = _G[itemBase .. slot].NewItemTexture
|
local newItemTexture = _G[itemBase .. slot].NewItemTexture
|
||||||
local flash = _G[itemBase .. slot].flashAnim
|
local flash = _G[itemBase .. slot].flashAnim
|
||||||
local newItemAnim = _G[itemBase .. slot].newitemglowAnim
|
local newItemAnim = _G[itemBase .. slot].newitemglowAnim
|
||||||
local isNewItem = C_NewItems.IsNewItem(bagFrame:GetID(), itemButton:GetID())
|
local isNewItem = NewItemsIsNewItem(bagFrame:GetID(), itemButton:GetID())
|
||||||
local isBattlePayItem = IsBattlePayItem(bagFrame:GetID(), itemButton:GetID())
|
local isBattlePayItem = IsBattlePayItem(bagFrame:GetID(), itemButton:GetID())
|
||||||
|
|
||||||
local battlepayItemTexture = _G[itemBase .. slot].BattlepayItemTexture
|
local battlepayItemTexture = _G[itemBase .. slot].BattlepayItemTexture
|
||||||
@ -1426,6 +1483,7 @@ function MyBagsCore:LayoutBagFrame(bagFrame)
|
|||||||
else
|
else
|
||||||
newItemTexture:SetAtlas("bags-glow-white")
|
newItemTexture:SetAtlas("bags-glow-white")
|
||||||
end
|
end
|
||||||
|
|
||||||
battlepayItemTexture:Hide()
|
battlepayItemTexture:Hide()
|
||||||
newItemTexture:Show()
|
newItemTexture:Show()
|
||||||
end
|
end
|
||||||
@ -1465,7 +1523,7 @@ function MyBagsCore:LayoutBagFrame(bagFrame)
|
|||||||
if self.isLive then
|
if self.isLive then
|
||||||
local start, duration, enable = GetContainerItemCooldown(bagFrame:GetID(), slot)
|
local start, duration, enable = GetContainerItemCooldown(bagFrame:GetID(), slot)
|
||||||
local cooldown = _G[itemButton:GetName() .. "Cooldown"]
|
local cooldown = _G[itemButton:GetName() .. "Cooldown"]
|
||||||
CooldownFrame_SetTimer(cooldown, start, duration, enable)
|
CooldownFrame_Set(cooldown, start, duration, enable)
|
||||||
if duration > 0 and enable == 0 then
|
if duration > 0 and enable == 0 then
|
||||||
SetItemButtonTextureVertexColor(itemButton, 0.4, 0.4, 0.4)
|
SetItemButtonTextureVertexColor(itemButton, 0.4, 0.4, 0.4)
|
||||||
end
|
end
|
||||||
@ -1522,7 +1580,7 @@ function MyBagsCore:LayoutFrame()
|
|||||||
|
|
||||||
self.isLive = self:IsLive()
|
self.isLive = self:IsLive()
|
||||||
local bagBase = self.frameName .. "Bag"
|
local bagBase = self.frameName .. "Bag"
|
||||||
local bagIndex, bagFrame, bag
|
local bagFrame
|
||||||
self.curRow, self.curCol = 0,0
|
self.curRow, self.curCol = 0,0
|
||||||
self:LayoutOptions()
|
self:LayoutOptions()
|
||||||
if self.isEquipment then
|
if self.isEquipment then
|
||||||
@ -1591,7 +1649,6 @@ end
|
|||||||
|
|
||||||
function MyBagsCore:SetColumns(cols)
|
function MyBagsCore:SetColumns(cols)
|
||||||
cols = floor(tonum(cols))
|
cols = floor(tonum(cols))
|
||||||
|
|
||||||
self.SetOpt("Columns", cols)
|
self.SetOpt("Columns", cols)
|
||||||
self:LayoutFrame()
|
self:LayoutFrame()
|
||||||
end
|
end
|
||||||
@ -1810,7 +1867,7 @@ function MyBagsCore:SetAnchor(point)
|
|||||||
self.SetOpt("Anchor", point)
|
self.SetOpt("Anchor", point)
|
||||||
self.Result("Anchor", point)
|
self.Result("Anchor", point)
|
||||||
self.anchorPoint = strupper(point)
|
self.anchorPoint = strupper(point)
|
||||||
return TRUE
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
function MyBagsCore:SetCompanion()
|
function MyBagsCore:SetCompanion()
|
||||||
@ -1906,7 +1963,6 @@ local mixins = {
|
|||||||
"GetInfo",
|
"GetInfo",
|
||||||
"GetInfoLive",
|
"GetInfoLive",
|
||||||
"GetInfoDataStore",
|
"GetInfoDataStore",
|
||||||
"GetInfoMyBagsCache",
|
|
||||||
"GetInfoNone",
|
"GetInfoNone",
|
||||||
"GetSlotCount",
|
"GetSlotCount",
|
||||||
"ItemButton_OnLoad",
|
"ItemButton_OnLoad",
|
||||||
@ -1965,7 +2021,6 @@ local mixins = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function MyBagsCore:Embed(target)
|
function MyBagsCore:Embed(target)
|
||||||
local k, v
|
|
||||||
for k, v in pairs(mixins) do
|
for k, v in pairs(mixins) do
|
||||||
target[v] = self[v]
|
target[v] = self[v]
|
||||||
end
|
end
|
||||||
|
|||||||
@ -35,14 +35,32 @@ local MYBANK_DEFAULT_OPTIONS = {
|
|||||||
["_RIGHTOFFSET"] = 3,
|
["_RIGHTOFFSET"] = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
MyBank = LibStub("AceAddon-3.0"):NewAddon("MyBank", "MyBagsCore-1.0", "AceHook-3.0", "AceEvent-3.0", "AceConsole-3.0")
|
MyBank = LibStub("AceAddon-3.0"):NewAddon("MyBank", "MyBagsCore-1.1", "AceHook-3.0", "AceEvent-3.0", "AceConsole-3.0")
|
||||||
local MB_Config = LibStub("AceConfig-3.0")
|
local MB_Config = LibStub("AceConfig-3.0")
|
||||||
local MB_Dialog = LibStub("AceConfigDialog-3.0")
|
local MB_Dialog = LibStub("AceConfigDialog-3.0")
|
||||||
local MB_Cmd = LibStub("AceConfigCmd-3.0")
|
local MB_Cmd = LibStub("AceConfigCmd-3.0")
|
||||||
local MB_Core = LibStub("MyBagsCore-1.0")
|
local MB_Core = LibStub("MyBagsCore-1.1")
|
||||||
|
|
||||||
local L = LibStub("AceLocale-3.0"):GetLocale("MyBags")
|
local L = LibStub("AceLocale-3.0"):GetLocale("MyBags")
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs = pairs
|
||||||
|
local strtrim = strtrim
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local _G = _G
|
||||||
|
local CloseBackpack = CloseBackpack
|
||||||
|
local IsBagOpen = IsBagOpen
|
||||||
|
local MoneyFrame_Update = MoneyFrame_Update
|
||||||
|
local OpenBackpack = OpenBackpack
|
||||||
|
local PlaySound = PlaySound
|
||||||
|
local SetPortraitTexture = SetPortraitTexture
|
||||||
|
local SortBankBags = SortBankBags
|
||||||
|
local ToggleBackpack = ToggleBackpack
|
||||||
|
|
||||||
|
--Global variables that we don't cache, list them here for the mikk's Find Globals script
|
||||||
|
-- GLOBALS:
|
||||||
|
|
||||||
function MyBank:OnInitialize()
|
function MyBank:OnInitialize()
|
||||||
self.name = "MyBank"
|
self.name = "MyBank"
|
||||||
self.frameName = "MyBankFrame"
|
self.frameName = "MyBankFrame"
|
||||||
@ -56,12 +74,13 @@ function MyBank:OnInitialize()
|
|||||||
self.anchorParent = "UIParent"
|
self.anchorParent = "UIParent"
|
||||||
self.anchorOffsetX = 5
|
self.anchorOffsetX = 5
|
||||||
self.anchorOffsetY = 100
|
self.anchorOffsetY = 100
|
||||||
self.db = LibStub("AceDB-3.0"):New("MyBankDB");
|
self.db = LibStub("AceDB-3.0"):New("MyBankDB")
|
||||||
local prof = self.db:GetCurrentProfile()
|
local prof = self.db:GetCurrentProfile()
|
||||||
if self.db.profiles[prof] and self.db.profiles[prof]["Columns"] and self.db.profiles[prof]["Columns"] > 0 then
|
if self.db.profiles[prof] and self.db.profiles[prof]["Columns"] and self.db.profiles[prof]["Columns"] > 0 then
|
||||||
else
|
else
|
||||||
self.db.profiles[prof] = self.defaults
|
self.db.profiles[prof] = self.defaults
|
||||||
end
|
end
|
||||||
|
|
||||||
self:RegisterChatCommand("mb", "MB_ChatCommand")
|
self:RegisterChatCommand("mb", "MB_ChatCommand")
|
||||||
self:RegisterChatCommand("mybank", "MB_ChatCommand")
|
self:RegisterChatCommand("mybank", "MB_ChatCommand")
|
||||||
self.options = {
|
self.options = {
|
||||||
@ -401,7 +420,7 @@ function MyBank:OnInitialize()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function MyBank:OnEnable()
|
function MyBank:OnEnable()
|
||||||
-- MyBagsCore:Enable(self);
|
-- MyBagsCore:Enable(self)
|
||||||
MyBankFrameBank.maxIndex = 28
|
MyBankFrameBank.maxIndex = 28
|
||||||
MyBankFrameBank:SetID(BANK_CONTAINER)
|
MyBankFrameBank:SetID(BANK_CONTAINER)
|
||||||
MyBankFrameBag0:SetID(5)
|
MyBankFrameBag0:SetID(5)
|
||||||
@ -443,9 +462,10 @@ function MyBank:OnEnable()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function MyBank:MB_ChatCommand(input)
|
function MyBank:MB_ChatCommand(input)
|
||||||
if not input or input:trim() == "" then
|
if not input or strtrim(input) == "" then
|
||||||
MB_Dialog:Open(self.name)
|
MB_Dialog:Open(self.name)
|
||||||
else
|
else
|
||||||
|
input = strtrim(input)
|
||||||
MB_Cmd.HandleCommand(MyBank, "mybank", self.name, input)
|
MB_Cmd.HandleCommand(MyBank, "mybank", self.name, input)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -459,7 +479,10 @@ end
|
|||||||
function MyBank:LoadDropDown()
|
function MyBank:LoadDropDown()
|
||||||
local dropDown = _G[self.frameName .. "CharSelectDropDown"]
|
local dropDown = _G[self.frameName .. "CharSelectDropDown"]
|
||||||
local dropDownButton = _G[self.frameName .. "CharSelectDropDownButton"]
|
local dropDownButton = _G[self.frameName .. "CharSelectDropDownButton"]
|
||||||
if not dropDown then return end
|
if not dropDown then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local last_this = _G["this"]
|
local last_this = _G["this"]
|
||||||
_G["this"] = dropDownButton
|
_G["this"] = dropDownButton
|
||||||
UIDropDownMenu_Initialize(dropDown, self.UserDropDown_Initialize)
|
UIDropDownMenu_Initialize(dropDown, self.UserDropDown_Initialize)
|
||||||
@ -470,13 +493,14 @@ end
|
|||||||
|
|
||||||
function MyBank:UserDropDown_Initialize()
|
function MyBank:UserDropDown_Initialize()
|
||||||
local this = self or _G.this
|
local this = self or _G.this
|
||||||
local chars, char_num, i
|
local chars, char_num
|
||||||
chars = MyBank:GetSortedCharList(MyBank.GetOpt("Sort"))
|
chars = MyBank:GetSortedCharList(MyBank.GetOpt("Sort"))
|
||||||
char_num = getn(chars)
|
char_num = #chars
|
||||||
if (char_num == 0) then
|
if (char_num == 0) then
|
||||||
MyBank.GetOpt("Player")
|
-- MyBank.GetOpt("Player")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local frame = this:GetParent():GetParent()
|
local frame = this:GetParent():GetParent()
|
||||||
local selectedValue = UIDropDownMenu_GetSelectedValue(this)
|
local selectedValue = UIDropDownMenu_GetSelectedValue(this)
|
||||||
|
|
||||||
@ -488,7 +512,10 @@ function MyBank:UserDropDown_Initialize()
|
|||||||
["owner"] = frame.self,
|
["owner"] = frame.self,
|
||||||
["checked"] = nil,
|
["checked"] = nil,
|
||||||
}
|
}
|
||||||
if selectedValue == info.value then info.checked = 1 end
|
if selectedValue == info.value then
|
||||||
|
info.checked = 1
|
||||||
|
end
|
||||||
|
|
||||||
UIDropDownMenu_AddButton(info)
|
UIDropDownMenu_AddButton(info)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -526,17 +553,20 @@ function MyBank:ToggleAllBags(forceopen)
|
|||||||
else
|
else
|
||||||
ToggleBackpack()
|
ToggleBackpack()
|
||||||
end
|
end
|
||||||
local action, i
|
|
||||||
|
local action
|
||||||
if (IsBagOpen(0) or MyInventory.frame:IsVisible()) then
|
if (IsBagOpen(0) or MyInventory.frame:IsVisible()) then
|
||||||
action = "OpenBag"
|
action = "OpenBag"
|
||||||
else
|
else
|
||||||
action = "CloseBag"
|
action = "CloseBag"
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 1, 4, 1 do
|
for i = 1, 4, 1 do
|
||||||
if not (MyInventory.GetOpt("Replace") and MyInventory:IncludeBag(i)) then
|
if not (MyInventory.GetOpt("Replace") and MyInventory:IncludeBag(i)) then
|
||||||
self.hooks[action](i)
|
self.hooks[action](i)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 5, 11, 1 do
|
for i = 5, 11, 1 do
|
||||||
if not MyBank.GetOpt("Replace") or not MyBank:IncludeBag(i) then
|
if not MyBank.GetOpt("Replace") or not MyBank:IncludeBag(i) then
|
||||||
self.hooks[action](i)
|
self.hooks[action](i)
|
||||||
@ -545,7 +575,6 @@ function MyBank:ToggleAllBags(forceopen)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function MyBank:CloseAllBags()
|
function MyBank:CloseAllBags()
|
||||||
local i
|
|
||||||
MyInventory:Close()
|
MyInventory:Close()
|
||||||
CloseBackpack() -- just in case backpack is not contolled by MyInventory
|
CloseBackpack() -- just in case backpack is not contolled by MyInventory
|
||||||
for i = 1, 4, 1 do
|
for i = 1, 4, 1 do
|
||||||
@ -553,6 +582,7 @@ function MyBank:CloseAllBags()
|
|||||||
self.hooks.CloseBag(i)
|
self.hooks.CloseBag(i)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 5, 11, 1 do
|
for i = 5, 11, 1 do
|
||||||
if not MyBank.GetOpt("Replace") or not MyBank:IncludeBag(i) then
|
if not MyBank.GetOpt("Replace") or not MyBank:IncludeBag(i) then
|
||||||
self.hooks.CloseBag(i)
|
self.hooks.CloseBag(i)
|
||||||
@ -575,6 +605,7 @@ function MyBank:BANKFRAME_OPENED()
|
|||||||
else
|
else
|
||||||
self.holdOpen = false
|
self.holdOpen = false
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.GetOpt("Replace") then
|
if self.GetOpt("Replace") then
|
||||||
self:Open()
|
self:Open()
|
||||||
else
|
else
|
||||||
@ -591,8 +622,11 @@ function MyBank:BANKFRAME_CLOSED()
|
|||||||
end -- calling self:close() would trigger the bank closing twice
|
end -- calling self:close() would trigger the bank closing twice
|
||||||
else
|
else
|
||||||
self.holdOpen = false
|
self.holdOpen = false
|
||||||
if self.isLive then self:LayoutFrame() end
|
if self.isLive then
|
||||||
|
self:LayoutFrame()
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
self:UnregisterEvents()
|
self:UnregisterEvents()
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -600,18 +634,18 @@ function MyBank:GetInfoFunc()
|
|||||||
if self.isLive then
|
if self.isLive then
|
||||||
return self.GetInfoLive
|
return self.GetInfoLive
|
||||||
end
|
end
|
||||||
|
|
||||||
if IsAddOnLoaded("DataStore_Containers") then
|
if IsAddOnLoaded("DataStore_Containers") then
|
||||||
return self.GetInfoDataStore
|
return self.GetInfoDataStore
|
||||||
end
|
end
|
||||||
if IsAddOnLoaded("MyBagsCache") then
|
|
||||||
return self.GetInfoMyBagsCache
|
|
||||||
end
|
|
||||||
return self.GetInfoNone
|
return self.GetInfoNone
|
||||||
end
|
end
|
||||||
|
|
||||||
function MyBank:GetSortedCharList(sorttype, realm)
|
function MyBank:GetSortedCharList(sorttype, realm)
|
||||||
|
local result = {}
|
||||||
|
|
||||||
if IsAddOnLoaded("DataStore_Containers") then
|
if IsAddOnLoaded("DataStore_Containers") then
|
||||||
local realmname
|
|
||||||
local realmlist = {}
|
local realmlist = {}
|
||||||
local realmcount = 0
|
local realmcount = 0
|
||||||
if not realm then
|
if not realm then
|
||||||
@ -623,10 +657,8 @@ function MyBank:GetSortedCharList(sorttype, realm)
|
|||||||
realmcount = 1
|
realmcount = 1
|
||||||
realmlist[1] = realm
|
realmlist[1] = realm
|
||||||
end
|
end
|
||||||
local result = {}
|
|
||||||
local idx = 0
|
local idx = 0
|
||||||
local i
|
|
||||||
local charname, charkey
|
|
||||||
for i = 1, realmcount do
|
for i = 1, realmcount do
|
||||||
for charname, charkey in pairs(DataStore:GetCharacters(realmlist[i])) do
|
for charname, charkey in pairs(DataStore:GetCharacters(realmlist[i])) do
|
||||||
-- charkey = DataStore:GetCharacter(charname, realmlist[i])
|
-- charkey = DataStore:GetCharacter(charname, realmlist[i])
|
||||||
@ -636,9 +668,10 @@ function MyBank:GetSortedCharList(sorttype, realm)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local swapped
|
local swapped
|
||||||
local q, w
|
local q, w
|
||||||
local x_time, y_time;
|
local x_time, y_time
|
||||||
local charName, realmName
|
local charName, realmName
|
||||||
repeat
|
repeat
|
||||||
swapped = 0
|
swapped = 0
|
||||||
@ -651,12 +684,14 @@ function MyBank:GetSortedCharList(sorttype, realm)
|
|||||||
else
|
else
|
||||||
x_time = DataStore:GetModuleLastUpdate(DataStore_Containers, charName, realmName)
|
x_time = DataStore:GetModuleLastUpdate(DataStore_Containers, charName, realmName)
|
||||||
end
|
end
|
||||||
|
|
||||||
charName, realmName = self:SplitString(w)
|
charName, realmName = self:SplitString(w)
|
||||||
if (not DataStore:GetModuleLastUpdate(DataStore_Containers, charName, realmName)) then
|
if (not DataStore:GetModuleLastUpdate(DataStore_Containers, charName, realmName)) then
|
||||||
y_time = 0
|
y_time = 0
|
||||||
else
|
else
|
||||||
y_time = DataStore:GetModuleLastUpdate(DataStore_Containers, charName, realmName)
|
y_time = DataStore:GetModuleLastUpdate(DataStore_Containers, charName, realmName)
|
||||||
end
|
end
|
||||||
|
|
||||||
if self:SortChars(q, w, x_time, y_time, sorttype) then
|
if self:SortChars(q, w, x_time, y_time, sorttype) then
|
||||||
result[i] = w
|
result[i] = w
|
||||||
result[i + 1] = q
|
result[i + 1] = q
|
||||||
@ -664,51 +699,10 @@ function MyBank:GetSortedCharList(sorttype, realm)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
until swapped == 0
|
until swapped == 0
|
||||||
|
end
|
||||||
|
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
if IsAddOnLoaded("MyBagsCache") then
|
|
||||||
local result = {}
|
|
||||||
local idx = 0
|
|
||||||
local cache = MyBagsCache.db.global
|
|
||||||
local index, value
|
|
||||||
for index, value in pairs(cache) do
|
|
||||||
local charName, realmID = self:SplitString(index)
|
|
||||||
if index ~= "profiles" then
|
|
||||||
if (not realm or realmID == realm) then
|
|
||||||
idx = idx + 1
|
|
||||||
result[idx] = index
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local swapped
|
|
||||||
local q, w
|
|
||||||
local x_time, y_time
|
|
||||||
local i
|
|
||||||
repeat
|
|
||||||
swapped = 0
|
|
||||||
for i = 1, idx-1 do
|
|
||||||
q = result[i]
|
|
||||||
w = result[i+1]
|
|
||||||
if (not cache[q].updateTime) then
|
|
||||||
x_time = 0
|
|
||||||
else
|
|
||||||
x_time = cache[q].updateTime
|
|
||||||
end
|
|
||||||
if (not cache[w].updateTime) then
|
|
||||||
y_time = 0
|
|
||||||
else
|
|
||||||
y_time = cache[w].updateTime
|
|
||||||
end
|
|
||||||
if self:SortChars(q, w, x_time, y_time, sorttype) then
|
|
||||||
result[i] = w
|
|
||||||
result[i+1] = q
|
|
||||||
swapped = 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
until swapped == 0
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MyBank:SetReplace()
|
function MyBank:SetReplace()
|
||||||
self.TogMsg("Replace", "Replace default bags")
|
self.TogMsg("Replace", "Replace default bags")
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
local MYBAGS_MAXEQUIPSLOTS = 19
|
|
||||||
local MYBAGS_SLOTCOLOR = { 0.5, 0.5, 0.5 }
|
local MYBAGS_SLOTCOLOR = { 0.5, 0.5, 0.5 }
|
||||||
local MYEQUIPMENT_SLOT = {}
|
local MYEQUIPMENT_SLOT = {}
|
||||||
|
|
||||||
@ -46,22 +45,72 @@ local MYEQUIPMENT_DEFAULT_OPTIONS = {
|
|||||||
["_RIGHTOFFSET"] = 3,
|
["_RIGHTOFFSET"] = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
MyEquipment = LibStub("AceAddon-3.0"):NewAddon("MyEquipment", "AceConsole-3.0", "AceHook-3.0", "AceEvent-3.0", "MyBagsCore-1.0")
|
MyEquipment = LibStub("AceAddon-3.0"):NewAddon("MyEquipment", "AceConsole-3.0", "AceHook-3.0", "AceEvent-3.0", "MyBagsCore-1.1")
|
||||||
local ME_Dialog = LibStub("AceConfigDialog-3.0")
|
local ME_Dialog = LibStub("AceConfigDialog-3.0")
|
||||||
local ME_Cmd = LibStub("AceConfigCmd-3.0")
|
local ME_Cmd = LibStub("AceConfigCmd-3.0")
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs = pairs
|
||||||
|
local strlen, strsub, strfind, strtrim = string.len, string.sub, string.find, strtrim
|
||||||
|
local select = select
|
||||||
|
local tonumber = tonumber
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local _G = _G
|
||||||
|
local ChatEdit_InsertLink = ChatEdit_InsertLink
|
||||||
|
local CursorCanGoInSlot = CursorCanGoInSlot
|
||||||
|
local CursorUpdate = CursorUpdate
|
||||||
|
local DressUpItemLink = DressUpItemLink
|
||||||
|
local GetInventoryItemCooldown = GetInventoryItemCooldown
|
||||||
|
local GetInventoryItemCount = GetInventoryItemCount
|
||||||
|
local GetInventoryItemLink = GetInventoryItemLink
|
||||||
|
local GetInventoryItemTexture = GetInventoryItemTexture
|
||||||
|
local GetInventorySlotInfo = GetInventorySlotInfo
|
||||||
|
local InRepairMode = InRepairMode
|
||||||
|
local IsControlKeyDown = IsControlKeyDown
|
||||||
|
local IsInventoryItemLocked = IsInventoryItemLocked
|
||||||
|
local IsShiftKeyDown = IsShiftKeyDown
|
||||||
|
local PaperDollItemSlotButton_OnClick = PaperDollItemSlotButton_OnClick
|
||||||
|
local PaperDollItemSlotButton_OnEvent = PaperDollItemSlotButton_OnEvent
|
||||||
|
local PaperDollItemSlotButton_OnModifiedClick = PaperDollItemSlotButton_OnModifiedClick
|
||||||
|
local SetItemButtonCount = SetItemButtonCount
|
||||||
|
local SetItemButtonDesaturated = SetItemButtonDesaturated
|
||||||
|
local SetItemButtonTexture = SetItemButtonTexture
|
||||||
|
local SetItemButtonTextureVertexColor = SetItemButtonTextureVertexColor
|
||||||
|
local SetTooltipMoney = SetTooltipMoney
|
||||||
|
local ShowInspectCursor = ShowInspectCursor
|
||||||
|
local UnitHasRelicSlot = UnitHasRelicSlot
|
||||||
|
|
||||||
|
--Global variables that we don't cache, list them here for the mikk's Find Globals script
|
||||||
|
-- GLOBALS:
|
||||||
|
|
||||||
|
|
||||||
local function ColorConvertHexToDigit(h)
|
local function ColorConvertHexToDigit(h)
|
||||||
if(strlen(h)~=6) then return 0,0,0 end
|
if (strlen(h) ~= 6) then
|
||||||
local r={a=10,b=11,c=12,d=13,e=14,f=15}
|
return 0, 0, 0
|
||||||
return ((tonumber(strsub(h,1,1)) or r[strsub(h,1,1)] or 0) * 16 + (tonumber(strsub(h,2,2)) or r[strsub(h,2,2)] or 0))/255,
|
end
|
||||||
((tonumber(strsub(h,3,3)) or r[strsub(h,3,3)] or 0) * 16 + (tonumber(strsub(h,4,4)) or r[strsub(h,4,4)] or 0))/255,
|
|
||||||
((tonumber(strsub(h,5,5)) or r[strsub(h,5,5)] or 0) * 16 + (tonumber(strsub(h,6,6)) or r[strsub(h,6,6)] or 0))/255
|
local r = {
|
||||||
|
a = 10,
|
||||||
|
b = 11,
|
||||||
|
c = 12,
|
||||||
|
d = 13,
|
||||||
|
e = 14,
|
||||||
|
f = 15
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((tonum(strsub(h, 1, 1)) or r[strsub(h, 1, 1)] or 0) * 16 + (tonum(strsub(h, 2, 2)) or r[strsub(h, 2, 2)] or 0)) / 255,
|
||||||
|
((tonum(strsub(h, 3, 3)) or r[strsub(h, 3, 3)] or 0) * 16 + (tonum(strsub(h, 4, 4)) or r[strsub(h, 4, 4)] or 0)) / 255,
|
||||||
|
((tonum(strsub(h, 5, 5)) or r[strsub(h, 5, 5)] or 0) * 16 + (tonum(strsub(h, 6, 6)) or r[strsub(h, 6, 6)] or 0)) / 255
|
||||||
end
|
end
|
||||||
|
|
||||||
local function GetItemInfoFromLink(l)
|
local function GetItemInfoFromLink(l)
|
||||||
if(not l) then return end
|
if (not l) then
|
||||||
local c,id,il,n=select(3, strfind(l,"|cff(%x+)|Hitem:(%-?%d+)([^|]+)|h%[(.-)%]|h|r"))
|
return
|
||||||
return n,c,id..il,id
|
end
|
||||||
|
|
||||||
|
local c, t, id, il, n = select(3, strfind(l, "|cff(%x+)|H(%l+):(%-?%d+)([^|]+)|h%[(.-)%]|h|r"))
|
||||||
|
return n, c, id .. il, id, t
|
||||||
end
|
end
|
||||||
|
|
||||||
local function tonum(val)
|
local function tonum(val)
|
||||||
@ -312,7 +361,6 @@ end
|
|||||||
|
|
||||||
function MyEquipment:OnEnable()
|
function MyEquipment:OnEnable()
|
||||||
MyEquipmentFramePortrait:SetTexture("Interface\\Addons\\MyBags\\Skin\\MyEquipmentPortrait")
|
MyEquipmentFramePortrait:SetTexture("Interface\\Addons\\MyBags\\Skin\\MyEquipmentPortrait")
|
||||||
local key, value
|
|
||||||
for key,value in pairs(SLOTNAMES) do -- Just in case Blizzard shuffles the slot name table around
|
for key,value in pairs(SLOTNAMES) do -- Just in case Blizzard shuffles the slot name table around
|
||||||
local slotId = GetInventorySlotInfo(value)
|
local slotId = GetInventorySlotInfo(value)
|
||||||
MYEQUIPMENT_SLOT[slotId] = value
|
MYEQUIPMENT_SLOT[slotId] = value
|
||||||
@ -333,7 +381,10 @@ end
|
|||||||
function MyEquipment:LoadDropDown()
|
function MyEquipment:LoadDropDown()
|
||||||
local dropDown = _G[self.frameName .. "CharSelectDropDown"]
|
local dropDown = _G[self.frameName .. "CharSelectDropDown"]
|
||||||
local dropDownButton = _G[self.frameName .. "CharSelectDropDownButton"]
|
local dropDownButton = _G[self.frameName .. "CharSelectDropDownButton"]
|
||||||
if not dropDown then return end
|
if not dropDown then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local last_this = _G["this"]
|
local last_this = _G["this"]
|
||||||
_G["this"] = dropDownButton
|
_G["this"] = dropDownButton
|
||||||
UIDropDownMenu_Initialize(dropDown, self.UserDropDown_Initialize)
|
UIDropDownMenu_Initialize(dropDown, self.UserDropDown_Initialize)
|
||||||
@ -347,15 +398,15 @@ function MyEquipment:UserDropDown_Initialize()
|
|||||||
local this = self or _G.this
|
local this = self or _G.this
|
||||||
local chars, charnum
|
local chars, charnum
|
||||||
chars = MyEquipment:GetSortedCharList(MyEquipment.GetOpt("Sort"))
|
chars = MyEquipment:GetSortedCharList(MyEquipment.GetOpt("Sort"))
|
||||||
charnum = getn(chars)
|
charnum = #chars
|
||||||
if (charnum == 0) then
|
if (charnum == 0) then
|
||||||
self.GetOpt("Player")
|
-- self.GetOpt("Player")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local frame = this:GetParent():GetParent()
|
local frame = this:GetParent():GetParent()
|
||||||
local selectedValue = UIDropDownMenu_GetSelectedValue(this)
|
local selectedValue = UIDropDownMenu_GetSelectedValue(this)
|
||||||
|
|
||||||
local i
|
|
||||||
for i = 1, charnum do
|
for i = 1, charnum do
|
||||||
local info = {
|
local info = {
|
||||||
["text"] = chars[i],
|
["text"] = chars[i],
|
||||||
@ -364,7 +415,10 @@ function MyEquipment:UserDropDown_Initialize()
|
|||||||
["owner"] = frame.self,
|
["owner"] = frame.self,
|
||||||
["checked"] = nil,
|
["checked"] = nil,
|
||||||
}
|
}
|
||||||
if selectedValue == info.value then info.checked = 1 end
|
if selectedValue == info.value then
|
||||||
|
info.checked = 1
|
||||||
|
end
|
||||||
|
|
||||||
UIDropDownMenu_AddButton(info)
|
UIDropDownMenu_AddButton(info)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -384,11 +438,10 @@ end
|
|||||||
function MyEquipment:GetRelic(charID)
|
function MyEquipment:GetRelic(charID)
|
||||||
if self.isLive then
|
if self.isLive then
|
||||||
return UnitHasRelicSlot("player")
|
return UnitHasRelicSlot("player")
|
||||||
elseif IsAddOnLoaded("MyBagsCache") then
|
else
|
||||||
return MyBagsCache:GetRelic(charID)
|
|
||||||
end
|
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function MyEquipment:GetInfoFunc()
|
function MyEquipment:GetInfoFunc()
|
||||||
if self.isLive then
|
if self.isLive then
|
||||||
@ -397,15 +450,13 @@ function MyEquipment:GetInfoFunc()
|
|||||||
elseif IsAddOnLoaded("DataStore_Inventory") then
|
elseif IsAddOnLoaded("DataStore_Inventory") then
|
||||||
return self.GetInfoDataStore
|
return self.GetInfoDataStore
|
||||||
]]
|
]]
|
||||||
elseif IsAddOnLoaded("MyBagsCache") then
|
else
|
||||||
return self.GetInfoMyBagsCache
|
|
||||||
end
|
|
||||||
return self.GetInfoNone
|
return self.GetInfoNone
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function MyEquipment:GetEquipInfoLive(itemIndex)
|
function MyEquipment:GetEquipInfoLive(itemIndex)
|
||||||
local itemLink = GetInventoryItemLink("player",itemIndex)
|
local itemLink = GetInventoryItemLink("player",itemIndex)
|
||||||
local myColor, myLink, myName = nil
|
|
||||||
local texture, count, quality, ID = nil
|
local texture, count, quality, ID = nil
|
||||||
if itemLink or itemIndex == 0 then
|
if itemLink or itemIndex == 0 then
|
||||||
texture = GetInventoryItemTexture("player",itemIndex)
|
texture = GetInventoryItemTexture("player",itemIndex)
|
||||||
@ -415,7 +466,7 @@ function MyEquipment:GetEquipInfoLive(itemIndex)
|
|||||||
ID = select(4, GetItemInfoFromLink(itemLink))
|
ID = select(4, GetItemInfoFromLink(itemLink))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
local hasRelic = UnitHasRelicSlot("player")
|
|
||||||
local locked = IsInventoryItemLocked(itemIndex)
|
local locked = IsInventoryItemLocked(itemIndex)
|
||||||
return texture, count, ID, locked, quality, readable, nil
|
return texture, count, ID, locked, quality, readable, nil
|
||||||
end
|
end
|
||||||
@ -423,7 +474,7 @@ end
|
|||||||
function MyEquipment:MyEquipmentItemSlotButton_OnLoad(widget)
|
function MyEquipment:MyEquipmentItemSlotButton_OnLoad(widget)
|
||||||
widget:RegisterForDrag("LeftButton")
|
widget:RegisterForDrag("LeftButton")
|
||||||
_G[widget:GetName() .. "NormalTexture"]:SetTexture("Interface\\AddOns\\MyBags\\Skin\\Button")
|
_G[widget:GetName() .. "NormalTexture"]:SetTexture("Interface\\AddOns\\MyBags\\Skin\\Button")
|
||||||
widget.UpdateTooltip = widget.MyEquipmentItemSlotButton_OnEnter;
|
widget.UpdateTooltip = widget.MyEquipmentItemSlotButton_OnEnter
|
||||||
end
|
end
|
||||||
|
|
||||||
function MyEquipment:MyEquipmentItemSlotButton_OnEnter(widget)
|
function MyEquipment:MyEquipmentItemSlotButton_OnEnter(widget)
|
||||||
@ -433,9 +484,13 @@ function MyEquipment:MyEquipmentItemSlotButton_OnEnter(widget)
|
|||||||
local hasItem, hasCooldown, repairCost = GameTooltip:SetInventoryItem("player", widget:GetID())
|
local hasItem, hasCooldown, repairCost = GameTooltip:SetInventoryItem("player", widget:GetID())
|
||||||
if not hasItem then
|
if not hasItem then
|
||||||
text = TEXT(_G[MYEQUIPMENT_SLOT[tonum(strsub(widget:GetName(), 21))]])
|
text = TEXT(_G[MYEQUIPMENT_SLOT[tonum(strsub(widget:GetName(), 21))]])
|
||||||
if widget.hasRelic then text = TEXT(_G["RELICSLOT"]) end
|
if widget.hasRelic then
|
||||||
|
text = TEXT(_G["RELICSLOT"])
|
||||||
|
end
|
||||||
|
|
||||||
GameTooltip:SetText(text)
|
GameTooltip:SetText(text)
|
||||||
end
|
end
|
||||||
|
|
||||||
if (InRepairMode() and repairCost and (repairCost > 0)) then
|
if (InRepairMode() and repairCost and (repairCost > 0)) then
|
||||||
GameTooltip:AddLine(TEXT(REPAIR_COST), "", 1, 1, 1)
|
GameTooltip:AddLine(TEXT(REPAIR_COST), "", 1, 1, 1)
|
||||||
SetTooltipMoney(GameTooltip, repairCost)
|
SetTooltipMoney(GameTooltip, repairCost)
|
||||||
@ -449,11 +504,19 @@ function MyEquipment:MyEquipmentItemSlotButton_OnEnter(widget)
|
|||||||
local _, count, ID, _, quality, _, name = self:GetInfo(widget:GetID())
|
local _, count, ID, _, quality, _, name = self:GetInfo(widget:GetID())
|
||||||
if ID and ID ~= "" then
|
if ID and ID ~= "" then
|
||||||
local hyperlink = self:GetHyperlink(ID)
|
local hyperlink = self:GetHyperlink(ID)
|
||||||
if hyperlink then GameTooltip:SetHyperlink(hyperlink) end
|
if hyperlink then
|
||||||
if IsControlKeyDown() and hyperlink then ShowInspectCursor() end
|
GameTooltip:SetHyperlink(hyperlink)
|
||||||
|
end
|
||||||
|
|
||||||
|
if IsControlKeyDown() and hyperlink then
|
||||||
|
ShowInspectCursor()
|
||||||
|
end
|
||||||
else
|
else
|
||||||
text = TEXT(_G[MYEQUIPMENT_SLOT[tonum(strsub(widget:GetName(), 21))]])
|
text = TEXT(_G[MYEQUIPMENT_SLOT[tonum(strsub(widget:GetName(), 21))]])
|
||||||
if widget.hasRelic then text = TEXT(_G["RELICSLOT"]) end
|
if widget.hasRelic then
|
||||||
|
text = TEXT(_G["RELICSLOT"])
|
||||||
|
end
|
||||||
|
|
||||||
if name then -- it's a bleeding ammo slot
|
if name then -- it's a bleeding ammo slot
|
||||||
text = name
|
text = name
|
||||||
GameTooltip:SetText(text, ColorConvertHexToDigit(quality))
|
GameTooltip:SetText(text, ColorConvertHexToDigit(quality))
|
||||||
@ -487,7 +550,10 @@ function MyEquipment:MyEquipmentItemSlotButton_OnModifiedClick(widget, button)
|
|||||||
elseif (IsShiftKeyDown()) then
|
elseif (IsShiftKeyDown()) then
|
||||||
local ID = select(3, self:GetInfo(widget:GetID()))
|
local ID = select(3, self:GetInfo(widget:GetID()))
|
||||||
local hyperLink
|
local hyperLink
|
||||||
if ID then hyperLink = self:GetHyperlink(ID) end
|
if ID then
|
||||||
|
hyperLink = self:GetHyperlink(ID)
|
||||||
|
end
|
||||||
|
|
||||||
if hyperLink then
|
if hyperLink then
|
||||||
ChatEdit_InsertLink(hyperLink)
|
ChatEdit_InsertLink(hyperLink)
|
||||||
end
|
end
|
||||||
@ -512,6 +578,7 @@ function MyEquipment:MyEquipmentItemSlotButton_OnEvent(widget, event)
|
|||||||
else
|
else
|
||||||
widget:UnlockHighlight()
|
widget:UnlockHighlight()
|
||||||
end
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -525,7 +592,7 @@ end
|
|||||||
|
|
||||||
function MyEquipment:LayoutEquipmentFrame(self)
|
function MyEquipment:LayoutEquipmentFrame(self)
|
||||||
local itemBase = "MyEquipmentSlotsItem"
|
local itemBase = "MyEquipmentSlotsItem"
|
||||||
local texture, count, locked, quality, ammo, key, value, id
|
local texture, count, locked, quality, id
|
||||||
local slotColor = ((self.GetOpt("SlotColor")) or MYBAGS_SLOTCOLOR)
|
local slotColor = ((self.GetOpt("SlotColor")) or MYBAGS_SLOTCOLOR)
|
||||||
local charID = self:GetCurrentPlayer()
|
local charID = self:GetCurrentPlayer()
|
||||||
local hasRelic = self:GetRelic(charID)
|
local hasRelic = self:GetRelic(charID)
|
||||||
@ -534,6 +601,7 @@ function MyEquipment:LayoutEquipmentFrame(self)
|
|||||||
if self.aioiOrder and (hasRelic or hideAmmo) then
|
if self.aioiOrder and (hasRelic or hideAmmo) then
|
||||||
self.curCol = self.curCol + 1
|
self.curCol = self.curCol + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
for key, value in pairs(SLOTNAMES) do
|
for key, value in pairs(SLOTNAMES) do
|
||||||
local slot = GetInventorySlotInfo(value)
|
local slot = GetInventorySlotInfo(value)
|
||||||
local itemButton = _G[itemBase .. slot]
|
local itemButton = _G[itemBase .. slot]
|
||||||
@ -541,6 +609,7 @@ function MyEquipment:LayoutEquipmentFrame(self)
|
|||||||
self.curCol = 0
|
self.curCol = 0
|
||||||
self.curRow = self.curRow + 1
|
self.curRow = self.curRow + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
itemButton:Show()
|
itemButton:Show()
|
||||||
itemButton:ClearAllPoints()
|
itemButton:ClearAllPoints()
|
||||||
itemButton:SetPoint("TOPLEFT", self.frame:GetName(), "TOPLEFT", self:GetXY(self.curRow, self.curCol))
|
itemButton:SetPoint("TOPLEFT", self.frame:GetName(), "TOPLEFT", self:GetXY(self.curRow, self.curCol))
|
||||||
@ -549,24 +618,30 @@ function MyEquipment:LayoutEquipmentFrame(self)
|
|||||||
if id and id ~= "" then
|
if id and id ~= "" then
|
||||||
itemButton.hasItem = 1
|
itemButton.hasItem = 1
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.isLive then
|
if self.isLive then
|
||||||
local start, duration, enable = GetInventoryItemCooldown("player", slot)
|
local start, duration, enable = GetInventoryItemCooldown("player", slot)
|
||||||
local cooldown = _G[itemButton:GetName() .. "Cooldown"]
|
local cooldown = _G[itemButton:GetName() .. "Cooldown"]
|
||||||
CooldownFrame_SetTimer(cooldown,start,duration,enable)
|
CooldownFrame_Set(cooldown, start, duration, enable)
|
||||||
if duration > 0 and enable == 0 then
|
if duration > 0 and enable == 0 then
|
||||||
SetItemButtonTextureVertexColor(itemButton, 0.4,0.4,0.4)
|
SetItemButtonTextureVertexColor(itemButton, 0.4,0.4,0.4)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if value == "RANGEDSLOT" and hasRelic then
|
if value == "RANGEDSLOT" and hasRelic then
|
||||||
itemButton.hasRelic = 1
|
itemButton.hasRelic = 1
|
||||||
end
|
end
|
||||||
|
|
||||||
SetItemButtonTexture(itemButton, (texture or ""))
|
SetItemButtonTexture(itemButton, (texture or ""))
|
||||||
SetItemButtonCount(itemButton, count)
|
SetItemButtonCount(itemButton, count)
|
||||||
SetItemButtonDesaturated(itemButton, locked, 0.5, 0.5, 0.5)
|
SetItemButtonDesaturated(itemButton, locked, 0.5, 0.5, 0.5)
|
||||||
if locked and locked ~= "" then
|
if locked and locked ~= "" then
|
||||||
itemButton:LockHighlight()
|
itemButton:LockHighlight()
|
||||||
self.watchLock = 1
|
self.watchLock = 1
|
||||||
else itemButton:UnlockHighlight() end
|
else
|
||||||
|
itemButton:UnlockHighlight()
|
||||||
|
end
|
||||||
|
|
||||||
if quality and self.GetOpt("Border") then
|
if quality and self.GetOpt("Border") then
|
||||||
SetItemButtonNormalTextureVertexColor(itemButton, ColorConvertHexToDigit(quality))
|
SetItemButtonNormalTextureVertexColor(itemButton, ColorConvertHexToDigit(quality))
|
||||||
else
|
else
|
||||||
@ -576,7 +651,7 @@ function MyEquipment:LayoutEquipmentFrame(self)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function MyEquipment:ME_ChatCommand(input)
|
function MyEquipment:ME_ChatCommand(input)
|
||||||
if not input or input:trim() == "" then
|
if not input or strtrim(input) == "" then
|
||||||
ME_Dialog:Open(self.name)
|
ME_Dialog:Open(self.name)
|
||||||
else
|
else
|
||||||
ME_Cmd.HandleCommand(MyEquipment, "myequipment", self.name, input)
|
ME_Cmd.HandleCommand(MyEquipment, "myequipment", self.name, input)
|
||||||
@ -584,6 +659,7 @@ function MyEquipment:ME_ChatCommand(input)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function MyEquipment:GetSortedCharList(sorttype, realm)
|
function MyEquipment:GetSortedCharList(sorttype, realm)
|
||||||
|
local result = {}
|
||||||
--[[
|
--[[
|
||||||
if IsAddOnLoaded("DataStore_Inventory") then
|
if IsAddOnLoaded("DataStore_Inventory") then
|
||||||
local realmname
|
local realmname
|
||||||
@ -598,7 +674,6 @@ function MyEquipment:GetSortedCharList(sorttype, realm)
|
|||||||
realmcount = 1
|
realmcount = 1
|
||||||
realmlist[1] = realm
|
realmlist[1] = realm
|
||||||
end
|
end
|
||||||
local result = {}
|
|
||||||
local idx = 0
|
local idx = 0
|
||||||
local i
|
local i
|
||||||
local charname, charkey
|
local charname, charkey
|
||||||
@ -613,7 +688,7 @@ function MyEquipment:GetSortedCharList(sorttype, realm)
|
|||||||
end
|
end
|
||||||
local swapped
|
local swapped
|
||||||
local q, w
|
local q, w
|
||||||
local x_time, y_time;
|
local x_time, y_time
|
||||||
local charName, realmName
|
local charName, realmName
|
||||||
repeat
|
repeat
|
||||||
swapped = 0
|
swapped = 0
|
||||||
@ -639,49 +714,7 @@ function MyEquipment:GetSortedCharList(sorttype, realm)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
until swapped == 0
|
until swapped == 0
|
||||||
return result
|
|
||||||
end
|
end
|
||||||
]]
|
]]
|
||||||
if IsAddOnLoaded("MyBagsCache") then
|
|
||||||
local result = {}
|
|
||||||
local idx = 0
|
|
||||||
local cache = MyBagsCache.db.global
|
|
||||||
local index, value
|
|
||||||
for index, value in pairs(cache) do
|
|
||||||
local charName, realmID = self:SplitString(index)
|
|
||||||
if index ~= "profiles" then
|
|
||||||
if (not realm or realmID == realm) then
|
|
||||||
idx = idx + 1
|
|
||||||
result[idx] = index
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local swapped
|
|
||||||
local q, w
|
|
||||||
local x_time, y_time
|
|
||||||
local i
|
|
||||||
repeat
|
|
||||||
swapped = 0
|
|
||||||
for i = 1, idx-1 do
|
|
||||||
q = result[i]
|
|
||||||
w = result[i+1]
|
|
||||||
if (not cache[q].updateTime) then
|
|
||||||
x_time = 0
|
|
||||||
else
|
|
||||||
x_time = cache[q].updateTime
|
|
||||||
end
|
|
||||||
if (not cache[w].updateTime) then
|
|
||||||
y_time = 0
|
|
||||||
else
|
|
||||||
y_time =cache[w].updateTime
|
|
||||||
end
|
|
||||||
if self:SortChars(q, w, x_time, y_time, sorttype) then
|
|
||||||
result[i] = w
|
|
||||||
result[i+1] = q
|
|
||||||
swapped = 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
until swapped == 0
|
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|||||||
@ -38,10 +38,10 @@ local MYINVENTORY_DEFAULT_OPTIONS = {
|
|||||||
["_RIGHTOFFSET"] = 3,
|
["_RIGHTOFFSET"] = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
MyInventory = LibStub("AceAddon-3.0"):NewAddon("MyInventory", "AceConsole-3.0", "AceHook-3.0", "AceEvent-3.0", "MyBagsCore-1.0")
|
MyInventory = LibStub("AceAddon-3.0"):NewAddon("MyInventory", "AceConsole-3.0", "AceHook-3.0", "AceEvent-3.0", "MyBagsCore-1.1")
|
||||||
local MI_Dialog = LibStub("AceConfigDialog-3.0")
|
local MI_Dialog = LibStub("AceConfigDialog-3.0")
|
||||||
local MI_Cmd = LibStub("AceConfigCmd-3.0")
|
local MI_Cmd = LibStub("AceConfigCmd-3.0")
|
||||||
local MB_Core = LibStub("MyBagsCore-1.0")
|
local MB_Core = LibStub("MyBagsCore-1.1")
|
||||||
|
|
||||||
local L = LibStub("AceLocale-3.0"):GetLocale("MyBags")
|
local L = LibStub("AceLocale-3.0"):GetLocale("MyBags")
|
||||||
|
|
||||||
@ -456,7 +456,6 @@ function MyInventory:UserDropDown_Initialize()
|
|||||||
local chars = MyInventory:GetSortedCharList(MyInventory.GetOpt("Sort"))
|
local chars = MyInventory:GetSortedCharList(MyInventory.GetOpt("Sort"))
|
||||||
local frame = this:GetParent():GetParent()
|
local frame = this:GetParent():GetParent()
|
||||||
local selectedValue = UIDropDownMenu_GetSelectedValue(this)
|
local selectedValue = UIDropDownMenu_GetSelectedValue(this)
|
||||||
local i
|
|
||||||
|
|
||||||
for i = 1, getn(chars) do
|
for i = 1, getn(chars) do
|
||||||
local info = {
|
local info = {
|
||||||
@ -544,9 +543,7 @@ function MyInventory:GetInfoFunc()
|
|||||||
if IsAddOnLoaded("DataStore_Containers") then
|
if IsAddOnLoaded("DataStore_Containers") then
|
||||||
return self.GetInfoDataStore
|
return self.GetInfoDataStore
|
||||||
end
|
end
|
||||||
if IsAddOnLoaded("MyBagsCache") then
|
|
||||||
return self.GetInfoMyBagsCache
|
|
||||||
end
|
|
||||||
return self.GetInfoNone
|
return self.GetInfoNone
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -570,7 +567,6 @@ end
|
|||||||
|
|
||||||
function MyInventory:GetSortedCharList(sorttype, realm)
|
function MyInventory:GetSortedCharList(sorttype, realm)
|
||||||
if IsAddOnLoaded("DataStore_Containers") then
|
if IsAddOnLoaded("DataStore_Containers") then
|
||||||
local realmname
|
|
||||||
local realmlist = {}
|
local realmlist = {}
|
||||||
local realmcount = 0
|
local realmcount = 0
|
||||||
if not realm then
|
if not realm then
|
||||||
@ -623,46 +619,4 @@ function MyInventory:GetSortedCharList(sorttype, realm)
|
|||||||
until swapped == 0
|
until swapped == 0
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
if IsAddOnLoaded("MyBagsCache") then
|
|
||||||
local MBC = MyBagsCache
|
|
||||||
local result = {}
|
|
||||||
local idx = 0
|
|
||||||
local cache = MBC.db.global
|
|
||||||
for index, value in pairs(cache) do
|
|
||||||
local charName, realmID = self:SplitString(index)
|
|
||||||
if index ~= "profiles" then
|
|
||||||
if (not realm or realmID == realm) then
|
|
||||||
idx = idx + 1
|
|
||||||
result[idx] = index
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local swapped
|
|
||||||
local q, w
|
|
||||||
local x_time, y_time;
|
|
||||||
local max = idx - 1;
|
|
||||||
repeat
|
|
||||||
swapped = 0
|
|
||||||
for i = 1, max do
|
|
||||||
q = result[i]
|
|
||||||
w = result[i+1]
|
|
||||||
if (not MBC.db.global[q].updateTime) then
|
|
||||||
x_time = 0
|
|
||||||
else
|
|
||||||
x_time = MBC.db.global[q].updateTime
|
|
||||||
end
|
|
||||||
if (not MBC.db.global[w].updateTime) then
|
|
||||||
y_time = 0
|
|
||||||
else
|
|
||||||
y_time = MBC.db.global[w].updateTime
|
|
||||||
end
|
|
||||||
if self:SortChars(q, w, x_time, y_time, sorttype) then
|
|
||||||
result[i] = w
|
|
||||||
result[i+1] = q
|
|
||||||
swapped = 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
until swapped == 0
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user