madcatzinc@13: --~ Warcraft Plugin for Cyborg MMO7 madcatzinc@0: --~ Filename: WowObjects.lua madcatzinc@0: --~ Description: Warcraft in game object models madcatzinc@0: --~ Copyright (C) 2012 Mad Catz Inc. madcatzinc@0: --~ Author: Christopher Hooks madcatzinc@0: madcatzinc@0: --~ This program is free software; you can redistribute it and/or madcatzinc@0: --~ modify it under the terms of the GNU General Public License madcatzinc@0: --~ as published by the Free Software Foundation; either version 2 madcatzinc@0: --~ of the License, or (at your option) any later version. madcatzinc@0: madcatzinc@0: --~ This program is distributed in the hope that it will be useful, madcatzinc@0: --~ but WITHOUT ANY WARRANTY; without even the implied warranty of madcatzinc@0: --~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the madcatzinc@0: --~ GNU General Public License for more details. madcatzinc@0: madcatzinc@0: --~ You should have received a copy of the GNU General Public License madcatzinc@0: --~ along with this program; if not, write to the Free Software madcatzinc@0: --~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. madcatzinc@0: madcatzinc@25: ------------------------------------------------------------------------------ madcatzinc@0: madcatzinc@25: local WowObject_methods = {} madcatzinc@25: local WowObject_mt = {__index=WowObject_methods} madcatzinc@25: madcatzinc@25: local function WowObject(type, detail, subdetail) madcatzinc@25: local self = {} madcatzinc@25: madcatzinc@34: self.type = type madcatzinc@34: self.detail = detail madcatzinc@34: self.subdetail = subdetail madcatzinc@25: madcatzinc@25: setmetatable(self, WowObject_mt) madcatzinc@25: madcatzinc@25: return self madcatzinc@25: end madcatzinc@25: madcatzinc@34: function WowObject_methods:SaveData() madcatzinc@34: return { madcatzinc@34: type = self.type, madcatzinc@34: detail = self.detail, madcatzinc@34: subdetail = self.subdetail, madcatzinc@34: } madcatzinc@34: end madcatzinc@34: madcatzinc@25: function WowObject_methods:DoAction() madcatzinc@25: CyborgMMO_DPrint("Nothing To Do") madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowObject_methods:Pickup() madcatzinc@25: CyborgMMO_DPrint("Pick up Item") madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowObject_methods:SetBinding(key) madcatzinc@25: end madcatzinc@25: madcatzinc@25: ------------------------------------------------------------------------------ madcatzinc@25: madcatzinc@25: local WowCallback_methods = setmetatable({}, {__index=WowObject_methods}) madcatzinc@25: local WowCallback_mt = {__index=WowCallback_methods} madcatzinc@25: madcatzinc@25: local function WowCallback(callbackName) madcatzinc@25: local self = WowObject("callback", callbackName, "") madcatzinc@25: madcatzinc@34: self.callbackName = callbackName madcatzinc@47: self.texture = "Interface\\AddOns\\CyborgMMO7\\Graphics\\"..callbackName.."Unselected" madcatzinc@25: madcatzinc@25: setmetatable(self, WowCallback_mt) madcatzinc@25: madcatzinc@25: return self madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowCallback_methods:SetTextures(buttonFrame) madcatzinc@47: buttonFrame:SetNormalTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.callbackName.."Unselected") madcatzinc@47: buttonFrame:SetPushedTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.callbackName.."Down") madcatzinc@47: buttonFrame:SetHighlightTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.callbackName.."Over") madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowCallback_methods:DoAction() madcatzinc@34: local action = CyborgMMO_CallbackFactory:GetCallback(self.callbackName) madcatzinc@25: action() madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowCallback_methods:PickupCallback() madcatzinc@25: local slot = nil madcatzinc@25: local observers = CyborgMMO_RatPageModel:GetAllObservers() madcatzinc@25: for i=1,#observers do madcatzinc@25: if MouseIsOver(observers[i]) then madcatzinc@25: slot = observers[i] madcatzinc@25: break madcatzinc@0: end madcatzinc@25: end madcatzinc@25: slot:SetNormalTexture(slot.UnCheckedTexture) madcatzinc@25: end madcatzinc@0: madcatzinc@25: function WowCallback_methods:Pickup() madcatzinc@34: PlaySound("igAbilityIconDrop") madcatzinc@25: ClearCursor() madcatzinc@25: self:PickupCallback() madcatzinc@25: end madcatzinc@0: madcatzinc@25: function WowCallback_methods:SetBinding(key) madcatzinc@25: local buttonFrame,parentFrame,name = CyborgMMO_CallbackFactory:AddCallback(function(...) return self:DoAction(...) end) madcatzinc@25: SetOverrideBindingClick(CyborgMMO_CallbackFactory.Frame, true, key, name, "LeftButton") madcatzinc@25: end madcatzinc@0: madcatzinc@25: ------------------------------------------------------------------------------ madcatzinc@0: madcatzinc@25: local WowItem_methods = setmetatable({}, {__index=WowObject_methods}) madcatzinc@25: local WowItem_mt = {__index=WowItem_methods} madcatzinc@0: madcatzinc@34: local function WowItem(itemID) madcatzinc@39: local texture = select(10, GetItemInfo(itemID)) -- :FIXME: this may fail too early in the session (like when loading saved data) madcatzinc@39: if not texture then madcatzinc@39: return nil madcatzinc@39: end madcatzinc@39: madcatzinc@34: local self = WowObject("item", itemID) madcatzinc@0: madcatzinc@34: self.itemID = itemID madcatzinc@39: self.texture = texture madcatzinc@0: madcatzinc@25: setmetatable(self, WowItem_mt) madcatzinc@0: madcatzinc@25: return self madcatzinc@25: end madcatzinc@0: madcatzinc@25: function WowItem_methods:Pickup() madcatzinc@34: -- PlaySound("igAbilityIconDrop") madcatzinc@25: ClearCursor() madcatzinc@34: -- SetCursor(self.texture) madcatzinc@34: return PickupItem(self.itemID) madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowItem_methods:SetBinding(key) madcatzinc@34: local name = GetItemInfo(self.itemID) madcatzinc@34: SetOverrideBindingItem(CyborgMMO_CallbackFactory.Frame, true, key, name) madcatzinc@25: end madcatzinc@25: madcatzinc@25: ------------------------------------------------------------------------------ madcatzinc@25: madcatzinc@25: local WowSpell_methods = setmetatable({}, {__index=WowObject_methods}) madcatzinc@25: local WowSpell_mt = {__index=WowSpell_methods} madcatzinc@25: madcatzinc@34: local function WowSpell(spellID) madcatzinc@39: local texture = GetSpellTexture(spellID) madcatzinc@39: if not texture then madcatzinc@39: return nil madcatzinc@39: end madcatzinc@39: madcatzinc@34: local self = WowObject("spell", spellID) madcatzinc@25: madcatzinc@34: self.spellID = spellID madcatzinc@39: self.texture = texture madcatzinc@25: madcatzinc@25: setmetatable(self, WowSpell_mt) madcatzinc@25: madcatzinc@25: return self madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowSpell_methods:DoAction() madcatzinc@25: CyborgMMO_DPrint("Cast Spell") madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowSpell_methods:Pickup() madcatzinc@34: -- PlaySound("igAbilityIconDrop") madcatzinc@25: ClearCursor() madcatzinc@34: -- SetCursor(self.texture) madcatzinc@34: -- return PickupSpellBookItem(self.SpellbookID, self.Spellbook) madcatzinc@34: return PickupSpell(self.spellID) madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowSpell_methods:SetBinding(key) madcatzinc@34: -- CyborgMMO_DPrint("Binding to key "..key) madcatzinc@34: local name = GetSpellInfo(self.spellID) madcatzinc@34: CyborgMMO_DPrint("binding spell:", self.spellID, name) madcatzinc@34: SetOverrideBindingSpell(CyborgMMO_CallbackFactory.Frame, true, key, name) madcatzinc@25: end madcatzinc@25: madcatzinc@25: ------------------------------------------------------------------------------ madcatzinc@25: madcatzinc@25: local WowMacro_methods = setmetatable({}, {__index=WowObject_methods}) madcatzinc@25: local WowMacro_mt = {__index=WowMacro_methods} madcatzinc@25: madcatzinc@34: local function WowMacro(name) madcatzinc@39: local texture = select(2, GetMacroInfo(name)) madcatzinc@39: if not texture then madcatzinc@39: return nil madcatzinc@39: end madcatzinc@39: madcatzinc@34: local self = WowObject("macro", name) madcatzinc@25: madcatzinc@34: self.name = name madcatzinc@39: self.texture = texture madcatzinc@25: madcatzinc@25: setmetatable(self, WowMacro_mt) madcatzinc@25: madcatzinc@25: return self madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowMacro_methods:DoAction() madcatzinc@25: CyborgMMO_DPrint("Use Item") madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowMacro_methods:Pickup() madcatzinc@34: -- PlaySound("igAbilityIconDrop") madcatzinc@25: ClearCursor() madcatzinc@34: -- SetCursor(self.texture) madcatzinc@34: return PickupMacro(self.name) madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowMacro_methods:SetBinding(key) madcatzinc@34: SetOverrideBindingMacro(CyborgMMO_CallbackFactory.Frame, true, key, self.name) madcatzinc@25: end madcatzinc@25: madcatzinc@25: ------------------------------------------------------------------------------ madcatzinc@25: madcatzinc@25: local WowEquipmentSet_methods = setmetatable({}, {__index=WowObject_methods}) madcatzinc@25: local WowEquipmentSet_mt = {__index=WowEquipmentSet_methods} madcatzinc@25: madcatzinc@34: local function WowEquipmentSet(name) madcatzinc@39: local texture = GetEquipmentSetInfoByName(name) madcatzinc@39: if not texture then madcatzinc@39: return nil madcatzinc@39: end madcatzinc@39: madcatzinc@34: local self = WowObject("equipmentset", name) madcatzinc@25: madcatzinc@34: self.name = name madcatzinc@34: self.texture = "Interface\\Icons\\"..texture madcatzinc@25: madcatzinc@25: setmetatable(self, WowEquipmentSet_mt) madcatzinc@25: madcatzinc@25: return self madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowEquipmentSet_methods:DoAction() madcatzinc@34: UseEquipmentSet(self.name) madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowEquipmentSet_methods:Pickup() madcatzinc@34: -- PlaySound("igAbilityIconDrop") madcatzinc@25: ClearCursor() madcatzinc@34: -- SetCursor(self.texture) madcatzinc@50: return PickupEquipmentSetByName(self.name) madcatzinc@25: end madcatzinc@25: madcatzinc@25: function WowEquipmentSet_methods:SetBinding(key) madcatzinc@34: local buttonFrame,parentFrame,name = CyborgMMO_CallbackFactory:AddCallback(function() self:DoAction() end) madcatzinc@34: SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton") madcatzinc@34: end madcatzinc@34: madcatzinc@34: ------------------------------------------------------------------------------ madcatzinc@34: madcatzinc@34: local WowBattlePet_methods = setmetatable({}, {__index=WowObject_methods}) madcatzinc@34: local WowBattlePet_mt = {__index=WowBattlePet_methods} madcatzinc@34: madcatzinc@34: local function WowBattlePet(petID) madcatzinc@39: local texture = select(9, C_PetJournal.GetPetInfoByPetID(petID)) -- :FIXME: this may fail too early in the session (like when loading saved data) madcatzinc@39: if not texture then madcatzinc@39: return nil madcatzinc@39: end madcatzinc@39: madcatzinc@34: local self = WowObject("battlepet", petID) madcatzinc@34: CyborgMMO_DPrint("creating battle pet binding:", petID) madcatzinc@34: madcatzinc@34: self.petID = petID madcatzinc@39: self.texture = texture madcatzinc@34: madcatzinc@34: setmetatable(self, WowBattlePet_mt) madcatzinc@34: madcatzinc@34: return self madcatzinc@34: end madcatzinc@34: madcatzinc@34: --[[ madcatzinc@34: local function IdentifyPet(petID) madcatzinc@34: local creatureID = select(11, C_PetJournal.GetPetInfoByPetID(petID)) madcatzinc@34: for index=1,GetNumCompanions('CRITTER') do madcatzinc@34: local creatureID2,_,spellID = GetCompanionInfo('CRITTER', index) madcatzinc@34: if creatureID2 == creatureID then madcatzinc@34: return spellID madcatzinc@34: end madcatzinc@34: end madcatzinc@34: end madcatzinc@34: --]] madcatzinc@34: madcatzinc@34: function WowBattlePet_methods:DoAction() madcatzinc@34: -- PlaySound("igMainMenuOptionCheckBoxOn") madcatzinc@34: C_PetJournal.SummonPetByGUID(self.petID) madcatzinc@34: end madcatzinc@34: madcatzinc@34: function WowBattlePet_methods:Pickup() madcatzinc@34: -- PlaySound("igAbilityIconDrop") madcatzinc@34: return C_PetJournal.PickupPet(self.petID) madcatzinc@34: end madcatzinc@34: madcatzinc@34: function WowBattlePet_methods:SetBinding(key) madcatzinc@34: local buttonFrame,parentFrame,name = CyborgMMO_CallbackFactory:AddCallback(function() self:DoAction() end) madcatzinc@25: SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton") madcatzinc@25: end madcatzinc@25: madcatzinc@25: ------------------------------------------------------------------------------ madcatzinc@25: jerome@65: local function GetMountInfoEx(mountID) jerome@65: -- special case for random mount jerome@65: if mountID == 0xFFFFFFF then jerome@65: return 0,"Interface/ICONS/ACHIEVEMENT_GUILDPERK_MOUNTUP" jerome@65: end jerome@65: jerome@65: local spellID = CyborgMMO_MountMap[mountID] or CyborgMMO_LocalMountMap[mountID] jerome@65: if not spellID then return nil,"not in database" end jerome@65: jerome@65: local mountIndex jerome@65: for i=1,C_MountJournal.GetNumMounts() do jerome@65: local _,spell,texture = C_MountJournal.GetMountInfo(i) -- :FIXME: this may fail too early in the session (like when loading saved data) jerome@65: if spell==spellID then jerome@65: return i,texture jerome@65: end jerome@65: end jerome@65: jerome@65: return nil,"not in journal" jerome@65: end jerome@65: jerome@68: local function FindMountFromSpellID(spellID) jerome@68: for mount,spell in pairs(CyborgMMO_MountMap) do jerome@68: if spell==spellID then jerome@68: return mount jerome@68: end jerome@68: end jerome@68: for mount,spell in pairs(CyborgMMO_MountMap) do jerome@68: if spell==spellID then jerome@68: return mount jerome@68: end jerome@68: end jerome@68: for i=1,C_MountJournal.GetNumMounts() do jerome@68: local _,spell = C_MountJournal.GetMountInfo(i) jerome@68: if spell==spellID then jerome@68: local cursor = pack(GetCursorInfo()) jerome@68: C_MountJournal.Pickup(i) jerome@68: local _,mountID = GetCursorInfo() jerome@68: ClearCursor() jerome@68: return mountID jerome@68: end jerome@68: end jerome@68: return nil jerome@68: end jerome@68: jerome@65: local WowMount_methods = setmetatable({}, {__index=WowObject_methods}) jerome@65: local WowMount_mt = {__index=WowMount_methods} jerome@65: jerome@65: local function WowMount(mountID) jerome@65: local mountIndex,texture = GetMountInfoEx(mountID) jerome@65: if not mountIndex then jerome@65: -- the mount might have been removed from the game jerome@65: return nil jerome@65: end jerome@65: jerome@65: local self = WowObject("mount", mountID) jerome@65: CyborgMMO_DPrint("creating mount binding:", mountID, texture) jerome@65: jerome@65: self.mountID = mountID jerome@65: self.texture = texture jerome@65: jerome@65: setmetatable(self, WowMount_mt) jerome@65: jerome@65: return self jerome@65: end jerome@65: jerome@65: function WowMount_methods:DoAction() jerome@65: local mountIndex = GetMountInfoEx(self.mountID) jerome@65: if not mountIndex then return end jerome@65: jerome@65: C_MountJournal.Summon(mountIndex) jerome@65: end jerome@65: jerome@65: function WowMount_methods:Pickup() jerome@65: local mountIndex = GetMountInfoEx(self.mountID) jerome@65: if not mountIndex then return end jerome@65: jerome@65: return C_MountJournal.Pickup(mountIndex) jerome@65: end jerome@65: jerome@65: function WowMount_methods:SetBinding(key) jerome@65: local buttonFrame,parentFrame,name = CyborgMMO_CallbackFactory:AddCallback(function() self:DoAction() end) jerome@65: SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton") jerome@65: end jerome@65: jerome@65: ------------------------------------------------------------------------------ jerome@65: madcatzinc@25: -- this class is used by pre-defined icons in the corner of the Rat page madcatzinc@4: CyborgMMO_CallbackIcons = { madcatzinc@0: new = function(self) madcatzinc@13: self.point, madcatzinc@13: self.relativeTo, madcatzinc@13: self.relativePoint, madcatzinc@13: self.xOfs, madcatzinc@13: self.yOfs = self:GetPoint() madcatzinc@13: -- self:SetPoint(self.point, self.relativeTo, self.relativePoint, self.xOfs, self.yOfs) madcatzinc@13: self.strata = self:GetFrameStrata() madcatzinc@25: self.wowObject = WowCallback(string.gsub(self:GetName(), self:GetParent():GetName(), "",1)) madcatzinc@25: self.wowObject:SetTextures(self) madcatzinc@0: self:RegisterForDrag("LeftButton","RightButton") madcatzinc@13: self:SetResizable(false) madcatzinc@13: madcatzinc@0: self.OnClick = function() madcatzinc@25: self.wowObject:DoAction() madcatzinc@0: end madcatzinc@13: madcatzinc@0: self.DragStart = function() madcatzinc@13: self:SetMovable(true) madcatzinc@13: self:StartMoving() madcatzinc@13: self.isMoving = true madcatzinc@0: self:SetFrameStrata("TOOLTIP") madcatzinc@0: end madcatzinc@13: madcatzinc@0: self.DragStop = function() madcatzinc@13: self:SetFrameStrata(self.strata) madcatzinc@13: self.isMoving = false madcatzinc@13: self:SetMovable(false) madcatzinc@13: self:StopMovingOrSizing() madcatzinc@0: madcatzinc@13: self:ClearAllPoints() madcatzinc@13: self:SetPoint(self.point, self.relativeTo, self.relativePoint, self.xOfs, self.yOfs) madcatzinc@13: local x,y = GetCursorPosition() madcatzinc@18: CyborgMMO_RatPageController:CallbackDropped(self) madcatzinc@0: end madcatzinc@13: madcatzinc@13: return self madcatzinc@13: end, madcatzinc@0: } madcatzinc@0: madcatzinc@25: ------------------------------------------------------------------------------ madcatzinc@13: madcatzinc@25: function CyborgMMO_CreateWowObject(type, ...) madcatzinc@39: local object,unsupported madcatzinc@13: madcatzinc@25: if type == "item" then madcatzinc@39: object = WowItem(...) madcatzinc@25: elseif type == "macro" then madcatzinc@25: object = WowMacro(...) madcatzinc@25: elseif type == "spell" then madcatzinc@33: object = WowSpell(...) madcatzinc@25: elseif type == "companion" then jerome@68: -- most likely a legacy mount in an old SavedVariables jerome@68: local spellID = ... jerome@68: local mountID = FindMountFromSpellID(spellID) jerome@68: if mountID then jerome@68: object = WowMount(mountID) jerome@68: end madcatzinc@25: elseif type == "equipmentset" then madcatzinc@34: object = WowEquipmentSet(...) madcatzinc@34: elseif type == "battlepet" then madcatzinc@34: object = WowBattlePet(...) jerome@65: elseif type == "mount" then jerome@65: object = WowMount(...) madcatzinc@25: elseif type == "callback" then madcatzinc@25: object = WowCallback(...) madcatzinc@25: else madcatzinc@39: CyborgMMO_DPrint("unsupported wow object:", type, ...) madcatzinc@39: unsupported = true madcatzinc@39: end madcatzinc@39: if not object and not unsupported then madcatzinc@39: CyborgMMO_DPrint("creating "..tostring(type).." object failed:", type, ...) madcatzinc@25: end madcatzinc@13: madcatzinc@25: return object madcatzinc@25: end madcatzinc@0: madcatzinc@25: function CyborgMMO_ClearBinding(key) madcatzinc@25: SetOverrideBinding(CyborgMMO_CallbackFactory.Frame, true, key, nil) madcatzinc@25: end madcatzinc@13: