Mercurial > wow > askmrrobot
comparison Export.lua @ 57:01b63b8ed811 v21
total rewrite to version 21
| author | yellowfive |
|---|---|
| date | Fri, 05 Jun 2015 11:05:15 -0700 |
| parents | |
| children | 69db1c3025ac |
comparison
equal
deleted
inserted
replaced
| 56:75431c084aa0 | 57:01b63b8ed811 |
|---|---|
| 1 local Amr = LibStub("AceAddon-3.0"):GetAddon("AskMrRobot") | |
| 2 local L = LibStub("AceLocale-3.0"):GetLocale("AskMrRobot", true) | |
| 3 local AceGUI = LibStub("AceGUI-3.0") | |
| 4 | |
| 5 local _lastExport = nil | |
| 6 local _txt = nil | |
| 7 | |
| 8 local function createLabel(container, text, width) | |
| 9 local lbl = AceGUI:Create("AmrUiLabel") | |
| 10 lbl:SetWidth(width or 800) | |
| 11 lbl:SetText(text) | |
| 12 lbl:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.Text)) | |
| 13 container:AddChild(lbl) | |
| 14 return lbl | |
| 15 end | |
| 16 | |
| 17 local function onSplashClose() | |
| 18 Amr:HideCover() | |
| 19 Amr.db.char.FirstUse = false | |
| 20 end | |
| 21 | |
| 22 -- render a splash screen with first-time help | |
| 23 local function renderSplash(container) | |
| 24 local panel = Amr:RenderCoverChrome(container, 700, 450) | |
| 25 | |
| 26 local lbl = createLabel(panel, L.ExportSplashTitle, 650) | |
| 27 lbl:SetJustifyH("CENTER") | |
| 28 lbl:SetFont(Amr.CreateFont("Bold", 24, Amr.Colors.TextHeaderActive)) | |
| 29 lbl:SetPoint("TOP", panel.content, "TOP", 0, -10) | |
| 30 | |
| 31 local lbl2 = createLabel(panel, L.ExportSplashSubtitle, 650) | |
| 32 lbl2:SetJustifyH("CENTER") | |
| 33 lbl2:SetFont(Amr.CreateFont("Bold", 18, Amr.Colors.TextTan)) | |
| 34 lbl2:SetPoint("TOP", lbl.frame, "BOTTOM", 0, -20) | |
| 35 | |
| 36 lbl = createLabel(panel, L.ExportSplash1, 650) | |
| 37 lbl:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.Text)) | |
| 38 lbl:SetPoint("TOPLEFT", lbl2.frame, "BOTTOMLEFT", 0, -70) | |
| 39 | |
| 40 lbl2 = createLabel(panel, L.ExportSplash2, 650) | |
| 41 lbl2:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.Text)) | |
| 42 lbl2:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -15) | |
| 43 | |
| 44 lbl = createLabel(panel, L.ExportSplash3, 650) | |
| 45 lbl:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.Text)) | |
| 46 lbl:SetPoint("TOPLEFT", lbl2.frame, "BOTTOMLEFT", 0, -15) | |
| 47 | |
| 48 local btn = AceGUI:Create("AmrUiButton") | |
| 49 btn:SetText(L.ExportSplashClose) | |
| 50 btn:SetBackgroundColor(Amr.Colors.Green) | |
| 51 btn:SetFont(Amr.CreateFont("Bold", 16, Amr.Colors.White)) | |
| 52 btn:SetWidth(120) | |
| 53 btn:SetHeight(28) | |
| 54 btn:SetPoint("BOTTOM", panel.content, "BOTTOM", 0, 20) | |
| 55 btn:SetCallback("OnClick", onSplashClose) | |
| 56 panel:AddChild(btn) | |
| 57 end | |
| 58 | |
| 59 -- renders the main UI for the Export tab | |
| 60 function Amr:RenderTabExport(container) | |
| 61 | |
| 62 local lbl = createLabel(container, L.ExportTitle) | |
| 63 lbl:SetFont(Amr.CreateFont("Bold", 24, Amr.Colors.TextHeaderActive)) | |
| 64 lbl:SetPoint("TOPLEFT", container.content, "TOPLEFT", 0, -40) | |
| 65 | |
| 66 local lbl2 = createLabel(container, L.ExportHelp1) | |
| 67 lbl2:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -10) | |
| 68 | |
| 69 lbl = createLabel(container, L.ExportHelp2) | |
| 70 lbl:SetPoint("TOPLEFT", lbl2.frame, "BOTTOMLEFT", 0, -10) | |
| 71 | |
| 72 lbl2 = createLabel(container, L.ExportHelp3) | |
| 73 lbl2:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -10) | |
| 74 | |
| 75 lbl = createLabel(container, L.ExportHelp4) | |
| 76 lbl:SetPoint("TOPLEFT", lbl2.frame, "BOTTOMLEFT", 0, -10) | |
| 77 | |
| 78 _txt = AceGUI:Create("AmrUiTextarea") | |
| 79 _txt:SetWidth(800) | |
| 80 _txt:SetHeight(300) | |
| 81 _txt:SetPoint("TOP", lbl.frame, "BOTTOM", 0, -20) | |
| 82 _txt:SetFont(Amr.CreateFont("Regular", 12, Amr.Colors.Text)) | |
| 83 container:AddChild(_txt) | |
| 84 | |
| 85 local data = self:ExportCharacter() | |
| 86 local txt = Amr.Serializer:SerializePlayerData(data, true) | |
| 87 _txt:SetText(txt) | |
| 88 _txt:SetFocus(true) | |
| 89 | |
| 90 -- update shopping list data | |
| 91 Amr:UpdateShoppingData(data) | |
| 92 | |
| 93 -- show help splash if first time a user is using this | |
| 94 if Amr.db.char.FirstUse then | |
| 95 Amr:ShowCover(renderSplash) | |
| 96 AceGUI:ClearFocus() | |
| 97 end | |
| 98 end | |
| 99 | |
| 100 function Amr:ReleaseTabExport() | |
| 101 end | |
| 102 | |
| 103 function Amr:GetExportText() | |
| 104 return _txt:GetText() | |
| 105 end | |
| 106 | |
| 107 | |
| 108 -- use some local variables to deal with the fact that a user can close the bank before a scan completes | |
| 109 local _lastBankBagId = nil | |
| 110 local _lastBankSlotId = nil | |
| 111 | |
| 112 local function scanBag(bagId, isBank, bagTable, bagItemsWithCount) | |
| 113 local numSlots = GetContainerNumSlots(bagId) | |
| 114 for slotId = 1, numSlots do | |
| 115 local _, itemCount, _, _, _, _, itemLink = GetContainerItemInfo(bagId, slotId) | |
| 116 if itemLink ~= nil then | |
| 117 local itemData = Amr.Serializer.ParseItemLink(itemLink) | |
| 118 if itemData ~= nil then | |
| 119 -- only add equippable items to bag data | |
| 120 if IsEquippableItem(itemLink) or Amr.SetTokenIds[itemData.id] then | |
| 121 if isBank then | |
| 122 _lastBankBagId = bagId | |
| 123 _lastBankSlotId = slotId | |
| 124 end | |
| 125 | |
| 126 table.insert(bagTable, itemLink) | |
| 127 end | |
| 128 | |
| 129 -- all items and counts, used for e.g. shopping list and reagents, etc. | |
| 130 if bagItemsWithCount then | |
| 131 if bagItemsWithCount[itemData.id] then | |
| 132 bagItemsWithCount[itemData.id] = bagItemsWithCount[itemData.id] + itemCount | |
| 133 else | |
| 134 bagItemsWithCount[itemData.id] = itemCount | |
| 135 end | |
| 136 end | |
| 137 end | |
| 138 end | |
| 139 end | |
| 140 end | |
| 141 | |
| 142 -- get the player's current gear and save it, also returns the data from GetPlayerData for efficiency | |
| 143 local function getEquipped() | |
| 144 local data = Amr.Serializer:GetPlayerData(Amr.db.char.SubSpecs) | |
| 145 local spec = GetActiveSpecGroup() | |
| 146 | |
| 147 Amr.db.char.Equipped[spec] = data.Equipped[spec] | |
| 148 Amr.db.char.SubSpecs[spec] = data.SubSpecs[spec] | |
| 149 | |
| 150 return data | |
| 151 end | |
| 152 | |
| 153 local function scanBags() | |
| 154 | |
| 155 local bagItems = {} | |
| 156 local itemsAndCounts = {} | |
| 157 | |
| 158 scanBag(BACKPACK_CONTAINER, false, bagItems, itemsAndCounts) -- backpack | |
| 159 for bagId = 1, NUM_BAG_SLOTS do | |
| 160 scanBag(bagId, false, bagItems, itemsAndCounts) | |
| 161 end | |
| 162 | |
| 163 Amr.db.char.BagItems = bagItems | |
| 164 Amr.db.char.BagItemsAndCounts = itemsAndCounts | |
| 165 end | |
| 166 | |
| 167 -- scan the player's bank and save the contents, must be at the bank | |
| 168 local function scanBank() | |
| 169 | |
| 170 local bankItems = {} | |
| 171 local itemsAndCounts = {} | |
| 172 | |
| 173 scanBag(BANK_CONTAINER, true, bankItems, itemsAndCounts) | |
| 174 scanBag(REAGENTBANK_CONTAINER, true, bankItems, itemsAndCounts) | |
| 175 for bagId = NUM_BAG_SLOTS + 1, NUM_BAG_SLOTS + NUM_BANKBAGSLOTS do | |
| 176 scanBag(bagId, true, bankItems, itemsAndCounts) | |
| 177 end | |
| 178 | |
| 179 -- see if the scan completed before the window closed, otherwise we don't overwrite with partial data | |
| 180 if _lastBankBagId ~= nil then | |
| 181 local itemLink = GetContainerItemLink(_lastBankBagId, _lastBankSlotId) | |
| 182 if itemLink ~= nil then --still open | |
| 183 Amr.db.char.BankItems = bankItems | |
| 184 Amr.db.char.BankItemsAndCounts = itemsAndCounts | |
| 185 end | |
| 186 end | |
| 187 | |
| 188 end | |
| 189 | |
| 190 -- scan the player's void storage and save the contents, must be at void storage | |
| 191 local function scanVoid() | |
| 192 | |
| 193 if IsVoidStorageReady() then | |
| 194 local voidItems = {} | |
| 195 local VOID_STORAGE_MAX = 80 | |
| 196 local VOID_STORAGE_PAGES = 2 | |
| 197 | |
| 198 for page = 1,VOID_STORAGE_PAGES do | |
| 199 for i = 1,VOID_STORAGE_MAX do | |
| 200 local itemId = GetVoidItemInfo(page, i) | |
| 201 if itemId then | |
| 202 local itemLink = GetVoidItemHyperlinkString(((page - 1) * VOID_STORAGE_MAX) + i); | |
| 203 if itemLink then | |
| 204 tinsert(voidItems, itemLink) | |
| 205 end | |
| 206 end | |
| 207 end | |
| 208 end | |
| 209 | |
| 210 Amr.db.char.VoidItems = voidItems | |
| 211 end | |
| 212 | |
| 213 end | |
| 214 | |
| 215 local function getRepStanding(factionId) | |
| 216 local name, description, standingId, _ = GetFactionInfoByID(factionId) | |
| 217 return standingId - 1; -- our rep enum correspond to what the armory returns, are 1 less than what the game returns | |
| 218 end | |
| 219 | |
| 220 local function getReputations() | |
| 221 local reps = {} | |
| 222 | |
| 223 local repList = {1375,1376,1270,1269,1341,1337,1387,1388,1435} | |
| 224 for i, repId in pairs(repList) do | |
| 225 local standing = getRepStanding(repId) | |
| 226 if standing >= 0 then | |
| 227 reps[repId] = standing | |
| 228 end | |
| 229 end | |
| 230 | |
| 231 return reps | |
| 232 end | |
| 233 | |
| 234 -- Returns a data object containing all information about the current player needed for an export: | |
| 235 -- gear, spec, reputations, bag, bank, and void storage items. | |
| 236 function Amr:ExportCharacter() | |
| 237 | |
| 238 local data = getEquipped() | |
| 239 scanBags() | |
| 240 | |
| 241 -- get extra data that is not necessary for the base serializer, but that we add here for completeness | |
| 242 data.Equipped = Amr.db.char.Equipped | |
| 243 data.Reputations = getReputations() | |
| 244 data.BagItems = Amr.db.char.BagItems | |
| 245 data.BankItems = Amr.db.char.BankItems | |
| 246 data.VoidItems = Amr.db.char.VoidItems | |
| 247 | |
| 248 return data | |
| 249 end | |
| 250 | |
| 251 function Amr:InitializeExport() | |
| 252 Amr:AddEventHandler("UNIT_INVENTORY_CHANGED", function(unitID) | |
| 253 if unitID and unitID ~= "player" then return end | |
| 254 getEquipped() | |
| 255 end) | |
| 256 end | |
| 257 | |
| 258 Amr:AddEventHandler("BANKFRAME_OPENED", scanBank) | |
| 259 Amr:AddEventHandler("PLAYERBANKSLOTS_CHANGED", scanBank) | |
| 260 | |
| 261 Amr:AddEventHandler("VOID_STORAGE_OPEN", scanVoid) | |
| 262 Amr:AddEventHandler("VOID_STORAGE_CONTENTS_UPDATE", scanVoid) | |
| 263 Amr:AddEventHandler("VOID_STORAGE_DEPOSIT_UPDATE", scanVoid) | |
| 264 Amr:AddEventHandler("VOID_STORAGE_UPDATE", scanVoid) |
