annotate WowObjects.lua @ 34:6ce173840e68

Reworked the whole "wow object" system: - Only save what is strictly necessary. - Save appropriate persistent information for all objects (like spellIDs instead of spellBook+spellIndex). - Fixed Battle Pets objects (non-combat pets in pre-MoP). - Fixed item objects. - Cleaned and simplified most objects implementation. - Moved the settings and button profile to the root of the saved data, rather than in a per-character sub-table (that data is already tagged as saved per character). This should fix most issues with objects changing without user interaction on diverse occasions. Old profiles are not converted to the new system. This will come soon. Some issues persist due to the asynchronous loading of some informations: - Pet icons are never properly loaded from saved data. - Items are not properly loaded the first time the UI is started (a "/reload ui" or disconnect/connect cycle fixes this problem).
author madcatzinc@35b17cf1-18cd-47ff-9ca3-31d6b526ef09
date Thu, 25 Apr 2013 01:31:31 +0000
parents 1c0af1810e06
children d12a5a7d2be5
rev   line source
madcatzinc@13 1 --~ Warcraft Plugin for Cyborg MMO7
madcatzinc@0 2 --~ Filename: WowObjects.lua
madcatzinc@0 3 --~ Description: Warcraft in game object models
madcatzinc@0 4 --~ Copyright (C) 2012 Mad Catz Inc.
madcatzinc@0 5 --~ Author: Christopher Hooks
madcatzinc@0 6
madcatzinc@0 7 --~ This program is free software; you can redistribute it and/or
madcatzinc@0 8 --~ modify it under the terms of the GNU General Public License
madcatzinc@0 9 --~ as published by the Free Software Foundation; either version 2
madcatzinc@0 10 --~ of the License, or (at your option) any later version.
madcatzinc@0 11
madcatzinc@0 12 --~ This program is distributed in the hope that it will be useful,
madcatzinc@0 13 --~ but WITHOUT ANY WARRANTY; without even the implied warranty of
madcatzinc@0 14 --~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
madcatzinc@0 15 --~ GNU General Public License for more details.
madcatzinc@0 16
madcatzinc@0 17 --~ You should have received a copy of the GNU General Public License
madcatzinc@0 18 --~ along with this program; if not, write to the Free Software
madcatzinc@0 19 --~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
madcatzinc@0 20
madcatzinc@25 21 ------------------------------------------------------------------------------
madcatzinc@0 22
madcatzinc@25 23 local WowObject_methods = {}
madcatzinc@25 24 local WowObject_mt = {__index=WowObject_methods}
madcatzinc@25 25
madcatzinc@25 26 local function WowObject(type, detail, subdetail)
madcatzinc@25 27 local self = {}
madcatzinc@25 28
madcatzinc@34 29 self.type = type
madcatzinc@34 30 self.detail = detail
madcatzinc@34 31 self.subdetail = subdetail
madcatzinc@25 32
madcatzinc@25 33 setmetatable(self, WowObject_mt)
madcatzinc@25 34
madcatzinc@25 35 return self
madcatzinc@25 36 end
madcatzinc@25 37
madcatzinc@34 38 function WowObject_methods:SaveData()
madcatzinc@34 39 return {
madcatzinc@34 40 type = self.type,
madcatzinc@34 41 detail = self.detail,
madcatzinc@34 42 subdetail = self.subdetail,
madcatzinc@34 43 }
madcatzinc@34 44 end
madcatzinc@34 45
madcatzinc@25 46 function WowObject_methods:DoAction()
madcatzinc@25 47 CyborgMMO_DPrint("Nothing To Do")
madcatzinc@25 48 end
madcatzinc@25 49
madcatzinc@25 50 function WowObject_methods:Pickup()
madcatzinc@25 51 CyborgMMO_DPrint("Pick up Item")
madcatzinc@25 52 end
madcatzinc@25 53
madcatzinc@25 54 function WowObject_methods:SetBinding(key)
madcatzinc@25 55 end
madcatzinc@25 56
madcatzinc@25 57 ------------------------------------------------------------------------------
madcatzinc@25 58
madcatzinc@25 59 local WowCallback_methods = setmetatable({}, {__index=WowObject_methods})
madcatzinc@25 60 local WowCallback_mt = {__index=WowCallback_methods}
madcatzinc@25 61
madcatzinc@25 62 local function WowCallback(callbackName)
madcatzinc@25 63 local self = WowObject("callback", callbackName, "")
madcatzinc@25 64
madcatzinc@34 65 self.callbackName = callbackName
madcatzinc@34 66 self.texture = "Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.callbackName.."Unselected.tga"
madcatzinc@25 67
madcatzinc@25 68 setmetatable(self, WowCallback_mt)
madcatzinc@25 69
madcatzinc@25 70 return self
madcatzinc@25 71 end
madcatzinc@25 72
madcatzinc@25 73 function WowCallback_methods:SetTextures(buttonFrame)
madcatzinc@34 74 buttonFrame:SetNormalTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.callbackName.."Unselected.tga")
madcatzinc@34 75 buttonFrame:SetPushedTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.callbackName.."Down.tga")
madcatzinc@34 76 buttonFrame:SetHighlightTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.callbackName.."Over.tga")
madcatzinc@25 77 end
madcatzinc@25 78
madcatzinc@25 79 function WowCallback_methods:DoAction()
madcatzinc@34 80 local action = CyborgMMO_CallbackFactory:GetCallback(self.callbackName)
madcatzinc@25 81 action()
madcatzinc@25 82 end
madcatzinc@25 83
madcatzinc@25 84 function WowCallback_methods:PickupCallback()
madcatzinc@25 85 local slot = nil
madcatzinc@25 86 local observers = CyborgMMO_RatPageModel:GetAllObservers()
madcatzinc@25 87 for i=1,#observers do
madcatzinc@25 88 if MouseIsOver(observers[i]) then
madcatzinc@25 89 slot = observers[i]
madcatzinc@25 90 break
madcatzinc@0 91 end
madcatzinc@25 92 end
madcatzinc@25 93 slot:SetNormalTexture(slot.UnCheckedTexture)
madcatzinc@25 94 end
madcatzinc@0 95
madcatzinc@25 96 function WowCallback_methods:Pickup()
madcatzinc@34 97 PlaySound("igAbilityIconDrop")
madcatzinc@25 98 ClearCursor()
madcatzinc@25 99 self:PickupCallback()
madcatzinc@25 100 end
madcatzinc@0 101
madcatzinc@25 102 function WowCallback_methods:SetBinding(key)
madcatzinc@25 103 local buttonFrame,parentFrame,name = CyborgMMO_CallbackFactory:AddCallback(function(...) return self:DoAction(...) end)
madcatzinc@25 104 SetOverrideBindingClick(CyborgMMO_CallbackFactory.Frame, true, key, name, "LeftButton")
madcatzinc@25 105 end
madcatzinc@0 106
madcatzinc@25 107 ------------------------------------------------------------------------------
madcatzinc@0 108
madcatzinc@25 109 local WowItem_methods = setmetatable({}, {__index=WowObject_methods})
madcatzinc@25 110 local WowItem_mt = {__index=WowItem_methods}
madcatzinc@0 111
madcatzinc@34 112 local function WowItem(itemID)
madcatzinc@34 113 local self = WowObject("item", itemID)
madcatzinc@0 114
madcatzinc@34 115 self.itemID = itemID
madcatzinc@34 116 self.texture = select(10, GetItemInfo(itemID)) -- :FIXME: this may fail too early in the session (like when loading saved data)
madcatzinc@0 117
madcatzinc@25 118 setmetatable(self, WowItem_mt)
madcatzinc@0 119
madcatzinc@25 120 return self
madcatzinc@25 121 end
madcatzinc@0 122
madcatzinc@25 123 function WowItem_methods:Pickup()
madcatzinc@34 124 -- PlaySound("igAbilityIconDrop")
madcatzinc@25 125 ClearCursor()
madcatzinc@34 126 -- SetCursor(self.texture)
madcatzinc@34 127 return PickupItem(self.itemID)
madcatzinc@25 128 end
madcatzinc@25 129
madcatzinc@25 130 function WowItem_methods:SetBinding(key)
madcatzinc@34 131 local name = GetItemInfo(self.itemID)
madcatzinc@34 132 SetOverrideBindingItem(CyborgMMO_CallbackFactory.Frame, true, key, name)
madcatzinc@25 133 end
madcatzinc@25 134
madcatzinc@25 135 ------------------------------------------------------------------------------
madcatzinc@25 136
madcatzinc@25 137 local WowSpell_methods = setmetatable({}, {__index=WowObject_methods})
madcatzinc@25 138 local WowSpell_mt = {__index=WowSpell_methods}
madcatzinc@25 139
madcatzinc@34 140 local function WowSpell(spellID)
madcatzinc@34 141 local self = WowObject("spell", spellID)
madcatzinc@25 142
madcatzinc@34 143 self.spellID = spellID
madcatzinc@34 144 self.texture = GetSpellTexture(spellID)
madcatzinc@25 145
madcatzinc@25 146 setmetatable(self, WowSpell_mt)
madcatzinc@25 147
madcatzinc@25 148 return self
madcatzinc@25 149 end
madcatzinc@25 150
madcatzinc@25 151 function WowSpell_methods:DoAction()
madcatzinc@25 152 CyborgMMO_DPrint("Cast Spell")
madcatzinc@25 153 end
madcatzinc@25 154
madcatzinc@25 155 function WowSpell_methods:Pickup()
madcatzinc@34 156 -- PlaySound("igAbilityIconDrop")
madcatzinc@25 157 ClearCursor()
madcatzinc@34 158 -- SetCursor(self.texture)
madcatzinc@34 159 -- return PickupSpellBookItem(self.SpellbookID, self.Spellbook)
madcatzinc@34 160 return PickupSpell(self.spellID)
madcatzinc@25 161 end
madcatzinc@25 162
madcatzinc@25 163 function WowSpell_methods:SetBinding(key)
madcatzinc@34 164 -- CyborgMMO_DPrint("Binding to key "..key)
madcatzinc@34 165 local name = GetSpellInfo(self.spellID)
madcatzinc@34 166 CyborgMMO_DPrint("binding spell:", self.spellID, name)
madcatzinc@34 167 SetOverrideBindingSpell(CyborgMMO_CallbackFactory.Frame, true, key, name)
madcatzinc@25 168 end
madcatzinc@25 169
madcatzinc@25 170 ------------------------------------------------------------------------------
madcatzinc@25 171
madcatzinc@25 172 local WowMacro_methods = setmetatable({}, {__index=WowObject_methods})
madcatzinc@25 173 local WowMacro_mt = {__index=WowMacro_methods}
madcatzinc@25 174
madcatzinc@34 175 local function WowMacro(name)
madcatzinc@34 176 local self = WowObject("macro", name)
madcatzinc@25 177
madcatzinc@34 178 self.name = name
madcatzinc@34 179 self.texture = select(2, GetMacroInfo(name))
madcatzinc@25 180
madcatzinc@25 181 setmetatable(self, WowMacro_mt)
madcatzinc@25 182
madcatzinc@25 183 return self
madcatzinc@25 184 end
madcatzinc@25 185
madcatzinc@25 186 function WowMacro_methods:DoAction()
madcatzinc@25 187 CyborgMMO_DPrint("Use Item")
madcatzinc@25 188 end
madcatzinc@25 189
madcatzinc@25 190 function WowMacro_methods:Pickup()
madcatzinc@34 191 -- PlaySound("igAbilityIconDrop")
madcatzinc@25 192 ClearCursor()
madcatzinc@34 193 -- SetCursor(self.texture)
madcatzinc@34 194 return PickupMacro(self.name)
madcatzinc@25 195 end
madcatzinc@25 196
madcatzinc@25 197 function WowMacro_methods:SetBinding(key)
madcatzinc@34 198 SetOverrideBindingMacro(CyborgMMO_CallbackFactory.Frame, true, key, self.name)
madcatzinc@25 199 end
madcatzinc@25 200
madcatzinc@25 201 ------------------------------------------------------------------------------
madcatzinc@25 202
madcatzinc@25 203 local WowCompanion_methods = setmetatable({}, {__index=WowObject_methods})
madcatzinc@25 204 local WowCompanion_mt = {__index=WowCompanion_methods}
madcatzinc@25 205
madcatzinc@34 206 local function WowCompanion(spellID)
madcatzinc@34 207 local self = WowObject("companion", spellID)
madcatzinc@34 208 CyborgMMO_DPrint("creating companion binding:", type, spellID)
madcatzinc@25 209
madcatzinc@34 210 self.spellID = spellID
madcatzinc@34 211 self.texture = select(3, GetSpellInfo(spellID))
madcatzinc@25 212
madcatzinc@25 213 setmetatable(self, WowCompanion_mt)
madcatzinc@25 214
madcatzinc@25 215 return self
madcatzinc@25 216 end
madcatzinc@25 217
madcatzinc@34 218 local function IdentifyCompanion(spellID)
madcatzinc@34 219 for _,subtype in ipairs{'MOUNT', 'CRITTER'} do
madcatzinc@34 220 for index=1,GetNumCompanions(subtype) do
madcatzinc@34 221 local spellID2,_,active = select(3, GetCompanionInfo(subtype, index))
madcatzinc@34 222 if spellID2 == spellID then
madcatzinc@34 223 return subtype,index,active
madcatzinc@34 224 end
madcatzinc@34 225 end
madcatzinc@34 226 end
madcatzinc@34 227 end
madcatzinc@34 228
madcatzinc@25 229 function WowCompanion_methods:DoAction()
madcatzinc@34 230 local subtype,index,active = IdentifyCompanion(self.spellID)
madcatzinc@34 231 -- if subtype == "MOUNT" and IsMounted() then
madcatzinc@34 232 if subtype == "MOUNT" and active then
madcatzinc@25 233 Dismount()
madcatzinc@34 234 elseif subtype and index then
madcatzinc@34 235 CallCompanion(subtype, index)
madcatzinc@25 236 end
madcatzinc@25 237 end
madcatzinc@25 238
madcatzinc@25 239 function WowCompanion_methods:Pickup()
madcatzinc@34 240 -- PlaySound("igAbilityIconDrop")
madcatzinc@34 241 local subtype,index = IdentifyCompanion(self.spellID)
madcatzinc@34 242 if subtype and index then
madcatzinc@34 243 return PickupCompanion(subtype, index)
madcatzinc@34 244 end
madcatzinc@25 245 end
madcatzinc@25 246
madcatzinc@25 247 function WowCompanion_methods:SetBinding(key)
madcatzinc@25 248 local buttonFrame,parentFrame,name = CyborgMMO_CallbackFactory:AddCallback(function() self:DoAction() end)
madcatzinc@25 249 SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton")
madcatzinc@25 250 end
madcatzinc@25 251
madcatzinc@25 252 ------------------------------------------------------------------------------
madcatzinc@25 253
madcatzinc@25 254 local WowEquipmentSet_methods = setmetatable({}, {__index=WowObject_methods})
madcatzinc@25 255 local WowEquipmentSet_mt = {__index=WowEquipmentSet_methods}
madcatzinc@25 256
madcatzinc@34 257 local function WowEquipmentSet(name)
madcatzinc@34 258 local self = WowObject("equipmentset", name)
madcatzinc@25 259
madcatzinc@34 260 self.name = name
madcatzinc@34 261 local texture = GetEquipmentSetInfoByName(name)
madcatzinc@34 262 self.texture = "Interface\\Icons\\"..texture
madcatzinc@25 263
madcatzinc@25 264 setmetatable(self, WowEquipmentSet_mt)
madcatzinc@25 265
madcatzinc@25 266 return self
madcatzinc@25 267 end
madcatzinc@25 268
madcatzinc@25 269 function WowEquipmentSet_methods:DoAction()
madcatzinc@34 270 UseEquipmentSet(self.name)
madcatzinc@25 271 end
madcatzinc@25 272
madcatzinc@25 273 function WowEquipmentSet_methods:Pickup()
madcatzinc@34 274 -- PlaySound("igAbilityIconDrop")
madcatzinc@25 275 ClearCursor()
madcatzinc@34 276 -- SetCursor(self.texture)
madcatzinc@25 277 return PickupEquipmentSetByName(self.Name)
madcatzinc@25 278 end
madcatzinc@25 279
madcatzinc@25 280 function WowEquipmentSet_methods:SetBinding(key)
madcatzinc@34 281 local buttonFrame,parentFrame,name = CyborgMMO_CallbackFactory:AddCallback(function() self:DoAction() end)
madcatzinc@34 282 SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton")
madcatzinc@34 283 end
madcatzinc@34 284
madcatzinc@34 285 ------------------------------------------------------------------------------
madcatzinc@34 286
madcatzinc@34 287 local WowBattlePet_methods = setmetatable({}, {__index=WowObject_methods})
madcatzinc@34 288 local WowBattlePet_mt = {__index=WowBattlePet_methods}
madcatzinc@34 289
madcatzinc@34 290 local function WowBattlePet(petID)
madcatzinc@34 291 local self = WowObject("battlepet", petID)
madcatzinc@34 292 CyborgMMO_DPrint("creating battle pet binding:", petID)
madcatzinc@34 293
madcatzinc@34 294 self.petID = petID
madcatzinc@34 295 self.texture = select(9, C_PetJournal.GetPetInfoByPetID(petID)) -- :FIXME: this may fail too early in the session (like when loading saved data)
madcatzinc@34 296
madcatzinc@34 297 setmetatable(self, WowBattlePet_mt)
madcatzinc@34 298
madcatzinc@34 299 return self
madcatzinc@34 300 end
madcatzinc@34 301
madcatzinc@34 302 --[[
madcatzinc@34 303 local function IdentifyPet(petID)
madcatzinc@34 304 local creatureID = select(11, C_PetJournal.GetPetInfoByPetID(petID))
madcatzinc@34 305 for index=1,GetNumCompanions('CRITTER') do
madcatzinc@34 306 local creatureID2,_,spellID = GetCompanionInfo('CRITTER', index)
madcatzinc@34 307 if creatureID2 == creatureID then
madcatzinc@34 308 return spellID
madcatzinc@34 309 end
madcatzinc@34 310 end
madcatzinc@34 311 end
madcatzinc@34 312 --]]
madcatzinc@34 313
madcatzinc@34 314 function WowBattlePet_methods:DoAction()
madcatzinc@34 315 -- PlaySound("igMainMenuOptionCheckBoxOn")
madcatzinc@34 316 C_PetJournal.SummonPetByGUID(self.petID)
madcatzinc@34 317 end
madcatzinc@34 318
madcatzinc@34 319 function WowBattlePet_methods:Pickup()
madcatzinc@34 320 -- PlaySound("igAbilityIconDrop")
madcatzinc@34 321 return C_PetJournal.PickupPet(self.petID)
madcatzinc@34 322 end
madcatzinc@34 323
madcatzinc@34 324 function WowBattlePet_methods:SetBinding(key)
madcatzinc@34 325 local buttonFrame,parentFrame,name = CyborgMMO_CallbackFactory:AddCallback(function() self:DoAction() end)
madcatzinc@25 326 SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton")
madcatzinc@25 327 end
madcatzinc@25 328
madcatzinc@25 329 ------------------------------------------------------------------------------
madcatzinc@25 330
madcatzinc@25 331 -- this class is used by pre-defined icons in the corner of the Rat page
madcatzinc@4 332 CyborgMMO_CallbackIcons = {
madcatzinc@0 333 new = function(self)
madcatzinc@13 334 self.point,
madcatzinc@13 335 self.relativeTo,
madcatzinc@13 336 self.relativePoint,
madcatzinc@13 337 self.xOfs,
madcatzinc@13 338 self.yOfs = self:GetPoint()
madcatzinc@13 339 -- self:SetPoint(self.point, self.relativeTo, self.relativePoint, self.xOfs, self.yOfs)
madcatzinc@13 340 self.strata = self:GetFrameStrata()
madcatzinc@25 341 self.wowObject = WowCallback(string.gsub(self:GetName(), self:GetParent():GetName(), "",1))
madcatzinc@25 342 self.wowObject:SetTextures(self)
madcatzinc@0 343 self:RegisterForDrag("LeftButton","RightButton")
madcatzinc@13 344 self:SetResizable(false)
madcatzinc@13 345
madcatzinc@0 346 self.OnClick = function()
madcatzinc@25 347 self.wowObject:DoAction()
madcatzinc@0 348 end
madcatzinc@13 349
madcatzinc@0 350 self.DragStart = function()
madcatzinc@13 351 self:SetMovable(true)
madcatzinc@13 352 self:StartMoving()
madcatzinc@13 353 self.isMoving = true
madcatzinc@0 354 self:SetFrameStrata("TOOLTIP")
madcatzinc@0 355 end
madcatzinc@13 356
madcatzinc@0 357 self.DragStop = function()
madcatzinc@13 358 self:SetFrameStrata(self.strata)
madcatzinc@13 359 self.isMoving = false
madcatzinc@13 360 self:SetMovable(false)
madcatzinc@13 361 self:StopMovingOrSizing()
madcatzinc@0 362
madcatzinc@13 363 self:ClearAllPoints()
madcatzinc@13 364 self:SetPoint(self.point, self.relativeTo, self.relativePoint, self.xOfs, self.yOfs)
madcatzinc@13 365 local x,y = GetCursorPosition()
madcatzinc@18 366 CyborgMMO_RatPageController:CallbackDropped(self)
madcatzinc@0 367 end
madcatzinc@13 368
madcatzinc@13 369 return self
madcatzinc@13 370 end,
madcatzinc@0 371 }
madcatzinc@0 372
madcatzinc@25 373 ------------------------------------------------------------------------------
madcatzinc@13 374
madcatzinc@25 375 function CyborgMMO_CreateWowObject(type, ...)
madcatzinc@25 376 local object
madcatzinc@13 377
madcatzinc@25 378 if type == "item" then
madcatzinc@34 379 -- :KLUDGE: if the item is not in the cache, return an empty WowObject
madcatzinc@34 380 local id = ...
madcatzinc@34 381 if not GetItemInfo(id) then
madcatzinc@34 382 object = WowObject()
madcatzinc@34 383 else
madcatzinc@34 384 object = WowItem(...)
madcatzinc@34 385 end
madcatzinc@25 386 elseif type == "macro" then
madcatzinc@25 387 object = WowMacro(...)
madcatzinc@25 388 elseif type == "spell" then
madcatzinc@33 389 object = WowSpell(...)
madcatzinc@25 390 elseif type == "companion" then
madcatzinc@25 391 object = WowCompanion(...)
madcatzinc@25 392 elseif type == "equipmentset" then
madcatzinc@34 393 object = WowEquipmentSet(...)
madcatzinc@34 394 elseif type == "battlepet" then
madcatzinc@34 395 object = WowBattlePet(...)
madcatzinc@25 396 elseif type == "callback" then
madcatzinc@25 397 object = WowCallback(...)
madcatzinc@25 398 else
madcatzinc@25 399 object = WowObject(type, ...)
madcatzinc@25 400 end
madcatzinc@13 401
madcatzinc@25 402 return object
madcatzinc@25 403 end
madcatzinc@0 404
madcatzinc@25 405 function CyborgMMO_ClearBinding(key)
madcatzinc@25 406 SetOverrideBinding(CyborgMMO_CallbackFactory.Frame, true, key, nil)
madcatzinc@25 407 end
madcatzinc@13 408