comparison CyborgMMO7.lua @ 40:67ad1101ee10

Added an asynchronous loading mechanism for item and battle pet data. The wow objects loading is delayed until all the necessary data is available.
author madcatzinc@35b17cf1-18cd-47ff-9ca3-31d6b526ef09
date Thu, 25 Apr 2013 23:02:39 +0000
parents 0734b90e605a
children 841191e42919
comparison
equal deleted inserted replaced
39:ce4ddefb68c2 40:67ad1101ee10
28 -- CyborgMMO_DPrint("LoadStrings("..self:GetName()..") = "..CyborgMMO_StringTable[self:GetName()]) 28 -- CyborgMMO_DPrint("LoadStrings("..self:GetName()..") = "..CyborgMMO_StringTable[self:GetName()])
29 self:SetText(CyborgMMO_StringTable[self:GetName()]) 29 self:SetText(CyborgMMO_StringTable[self:GetName()])
30 end 30 end
31 31
32 local VarsLoaded = false 32 local VarsLoaded = false
33 local AsyncDataLoaded = false
33 local EnteredWorld = false 34 local EnteredWorld = false
34 local BindingsLoaded = false 35 local BindingsLoaded = false
35 local SettingsLoaded = false 36 local SettingsLoaded = false
36 local SaveName = GetRealmName().."_"..UnitName("player") 37 local SaveName = GetRealmName().."_"..UnitName("player")
37 local Settings = nil 38 local Settings = nil
115 if id then 116 if id then
116 return tonumber(id) 117 return tonumber(id)
117 end 118 end
118 end 119 end
119 end 120 end
121
122 local KnownOldObjectTypes = {
123 item = true,
124 macro = true,
125 spell = true,
126 petaction = true,
127 merchant = true,
128 companion = true,
129 equipmentset = true,
130 callback = true,
131 }
120 132
121 local function ConvertOldRatData(oldData) 133 local function ConvertOldRatData(oldData)
122 local newData = {} 134 local newData = {}
123 for mode,modeData in ipairs(oldData) do 135 for mode,modeData in ipairs(oldData) do
124 newData[mode] = {} 136 newData[mode] = {}
166 CyborgMMO_DPrint("converting callback:", buttonData.Detail) 178 CyborgMMO_DPrint("converting callback:", buttonData.Detail)
167 newData[mode][button] = { 179 newData[mode][button] = {
168 type = type, 180 type = type,
169 detail = buttonData.Detail, 181 detail = buttonData.Detail,
170 } 182 }
171 elseif type then 183 elseif not KnownOldObjectTypes[type] then
172 -- maybe it's an item type 184 -- maybe it's an item type
173 local id = buttonData.Detail 185 local id = buttonData.Detail
174 local class = select(6, GetItemInfo(id)) -- :NOTE: this may fail if the item is not yet in the cache 186 local class = select(6, GetItemInfo(id)) -- :NOTE: this may fail if the item is not yet in the cache
175 if class == type then 187 if class == type then
176 CyborgMMO_DPrint("converting item:", id, type, class) 188 CyborgMMO_DPrint("converting item:", id, type, class)
185 end 197 end
186 end 198 end
187 return newData 199 return newData
188 end 200 end
189 201
202 ------------------------------------------------------------------------------
203
204 local PreloadFrame
205 local step_timeout = 1
206 local total_timeout = 15
207
208 local function PreloadFrameUpdate(self, dt)
209 self.step_timeout = self.step_timeout - dt
210 self.total_timeout = self.total_timeout - dt
211 if self.step_timeout < 0 then
212 local items,pets = 0,0
213 -- check items
214 for itemID in pairs(self.itemIDs) do
215 if GetItemInfo(itemID) then
216 self.itemIDs[itemID] = nil
217 else
218 items = items + 1
219 end
220 end
221 -- check pets
222 for petID in pairs(self.petIDs) do
223 if C_PetJournal.GetPetInfoByPetID(petID) then
224 self.petIDs[petID] = nil
225 else
226 pets = pets + 1
227 end
228 end
229 CyborgMMO_DPrint("PreloadFrameUpdate step", self.total_timeout, "items:", items, "pets:", pets)
230 if self.total_timeout < 0 or next(self.itemIDs)==nil and next(self.petIDs)==nil then
231 -- when done destroy the frame and throw an event for further loading
232 self:Hide()
233 self:SetParent(nil)
234 PreloadFrame = nil
235 CyborgMMO_Event(nil, "CYBORGMMO_ASYNC_DATA_LOADED")
236 else
237 self.step_timeout = step_timeout
238 end
239 end
240 end
241
242 function PreLoad(data)
243 -- create ID sets to sync
244 local itemIDs = {}
245 local petIDs = {}
246
247 -- gather all needed IDs (and trigger sync while doing so)
248 if data.Rat then
249 for mode=1,RAT7.MODES do
250 for button=1,RAT7.BUTTONS do
251 local data = data.Rat[mode][button]
252 if data then
253 if data.type=='item' then
254 local itemID = data.detail
255 if not GetItemInfo(itemID) then
256 itemIDs[itemID] = true
257 end
258 elseif data.type=='battlepet' then
259 local petID = data.detail
260 if not C_PetJournal.GetPetInfoByPetID(petID) then
261 petIDs[petID] = true
262 end
263 end
264 end
265 end
266 end
267 end
268 -- gather IDs from old unconverted data (in case we need to convert it)
269 if data[SaveName] and data[SaveName].Rat then
270 for mode=1,RAT7.MODES do
271 for button=1,RAT7.BUTTONS do
272 local data = data[SaveName].Rat[mode][button]
273 if data then
274 -- items actually had their class overwrite the Type field
275 if not KnownOldObjectTypes[data.Type] and type(data.Detail)=='number' then
276 local itemID = data.Detail
277 if not GetItemInfo(itemID) then
278 itemIDs[itemID] = true
279 end
280 end
281 end
282 end
283 end
284 end
285
286 -- create frame for regular updates
287 PreloadFrame = CreateFrame("Frame")
288 PreloadFrame.itemIDs = itemIDs
289 PreloadFrame.petIDs = petIDs
290 PreloadFrame.total_timeout = total_timeout
291 PreloadFrame.step_timeout = step_timeout
292 PreloadFrame:SetScript("OnUpdate", PreloadFrameUpdate)
293 PreloadFrame:Show()
294 end
295
296 ------------------------------------------------------------------------------
297
190 function CyborgMMO_Event(self, event, ...) 298 function CyborgMMO_Event(self, event, ...)
191 if event == "VARIABLES_LOADED" then 299 if event == "VARIABLES_LOADED" then
192 VarsLoaded = true 300 VarsLoaded = true
193 -- create root table if necessary 301 -- create root table if necessary
194 if not CyborgMMO7SaveData then 302 if not CyborgMMO7SaveData then
195 CyborgMMO7SaveData = {} 303 CyborgMMO7SaveData = {}
196 end 304 end
305 PreLoad(CyborgMMO7SaveData)
306 elseif event == "CYBORGMMO_ASYNC_DATA_LOADED" then
307 AsyncDataLoaded = true
197 -- convert old profile 308 -- convert old profile
198 if CyborgMMO7SaveData[SaveName] and not CyborgMMO7SaveData.Settings then 309 if CyborgMMO7SaveData[SaveName] and not CyborgMMO7SaveData.Settings then
199 local oldData = CyborgMMO7SaveData[SaveName] 310 local oldData = CyborgMMO7SaveData[SaveName]
200 CyborgMMO7SaveData = {} 311 CyborgMMO7SaveData = {}
201 CyborgMMO7SaveData.Settings = oldData.Settings 312 CyborgMMO7SaveData.Settings = oldData.Settings
209 else 320 else
210 CyborgMMO_DPrint("Event is "..tostring(event)) 321 CyborgMMO_DPrint("Event is "..tostring(event))
211 end 322 end
212 323
213 -- Fire Loading if and only if the player is in the world and vars are loaded 324 -- Fire Loading if and only if the player is in the world and vars are loaded
214 if not BindingsLoaded and VarsLoaded and EnteredWorld then 325 if not BindingsLoaded and VarsLoaded and AsyncDataLoaded and EnteredWorld then
215 local data = CyborgMMO_GetSaveData() 326 local data = CyborgMMO_GetSaveData()
216 327
217 CyborgMMO_RatPageModel:LoadData() 328 CyborgMMO_RatPageModel:LoadData()
218 BindingsLoaded = true 329 BindingsLoaded = true
219 330
239 CyborgMMO_SetMiniMapButton(Settings.MiniMapButton) 350 CyborgMMO_SetMiniMapButton(Settings.MiniMapButton)
240 CyborgMMO_SetCyborgHeadButton(Settings.CyborgButton) 351 CyborgMMO_SetCyborgHeadButton(Settings.CyborgButton)
241 352
242 local xmin,ymin = Minimap:GetLeft(),Minimap:GetBottom() 353 local xmin,ymin = Minimap:GetLeft(),Minimap:GetBottom()
243 CyborgMMO_MiniMapButtonReposition(math.deg(math.atan2(ymin, xmin))) 354 CyborgMMO_MiniMapButtonReposition(math.deg(math.atan2(ymin, xmin)))
244 -- Close the main window for now
245 CyborgMMO_Close()
246 end 355 end
247 end 356 end
248 357
249 function CyborgMMO_SetDefaultSettings() 358 function CyborgMMO_SetDefaultSettings()
250 CyborgMMO_OpenButtonPageOpenMainForm:ClearAllPoints() 359 CyborgMMO_OpenButtonPageOpenMainForm:ClearAllPoints()