diff CyborgMMO7.lua @ 54:c9706291c141

Added per-spec bindings. This is optional and must be enabled in the addon settings.
author madcatzinc@35b17cf1-18cd-47ff-9ca3-31d6b526ef09
date Fri, 03 May 2013 23:24:21 +0000
parents fb81254bd7b8
children 1236b2b22dde
line wrap: on
line diff
--- a/CyborgMMO7.lua	Fri May 03 23:24:16 2013 +0000
+++ b/CyborgMMO7.lua	Fri May 03 23:24:21 2013 +0000
@@ -24,6 +24,14 @@
 	SHIFT = 0,
 }
 
+local function toboolean(value)
+	if value then
+		return true
+	else
+		return false
+	end
+end
+
 function CyborgMMO_LoadStrings(self)
 --	CyborgMMO_DPrint("LoadStrings("..self:GetName()..") = "..CyborgMMO_StringTable[self:GetName()])
 	self:SetText(CyborgMMO_StringTable[self:GetName()])
@@ -94,20 +102,36 @@
 
 function CyborgMMO_SetRatSaveData(objects)
 	assert(VarsLoaded)
-	local data = {}
+	local specIndex
+	if Settings.PerSpecBindings then
+		specIndex = GetActiveSpecGroup()
+	else
+		specIndex = 1
+	end
+	local ratData = {}
 	for mode=1,RAT7.MODES do
-		data[mode] = {}
+		ratData[mode] = {}
 		for button=1,RAT7.BUTTONS do
 			if objects[mode][button] then
-				data[mode][button] = objects[mode][button]:SaveData()
+				ratData[mode][button] = objects[mode][button]:SaveData()
 			end
 		end
 	end
-	CyborgMMO_GetSaveData().Rat = data
+	local saveData = CyborgMMO_GetSaveData()
+	if not saveData.Rat then saveData.Rat = {} end
+	saveData.Rat[specIndex] = ratData
 end
 
 function CyborgMMO_GetRatSaveData()
-	return CyborgMMO_GetSaveData().Rat
+	local specIndex
+	if Settings.PerSpecBindings then
+		specIndex = GetActiveSpecGroup()
+	else
+		specIndex = 1
+	end
+	CyborgMMO_DPrint("returning rat data for spec:", specIndex, GetActiveSpecGroup())
+	local saveData = CyborgMMO_GetSaveData()
+	return saveData.Rat and saveData.Rat[specIndex]
 end
 
 local function GetSpellID(name)
@@ -247,19 +271,21 @@
 	
 	-- gather all needed IDs (and trigger sync while doing so)
 	if data.Rat then
-		for mode=1,RAT7.MODES do
-			for button=1,RAT7.BUTTONS do
-				local data = data.Rat[mode][button]
-				if data then
-					if data.type=='item' then
-						local itemID = data.detail
-						if not GetItemInfo(itemID) then
-							itemIDs[itemID] = true
-						end
-					elseif data.type=='battlepet' then
-						local petID = data.detail
-						if not C_PetJournal.GetPetInfoByPetID(petID) then
-							petIDs[petID] = true
+		for spec,specData in pairs(data.Rat) do
+			for mode=1,RAT7.MODES do
+				for button=1,RAT7.BUTTONS do
+					local buttonData = specData[mode] and specData[mode][button]
+					if buttonData then
+						if buttonData.type=='item' then
+							local itemID = buttonData.detail
+							if not GetItemInfo(itemID) then
+								itemIDs[itemID] = true
+							end
+						elseif buttonData.type=='battlepet' then
+							local petID = buttonData.detail
+							if not C_PetJournal.GetPetInfoByPetID(petID) then
+								petIDs[petID] = true
+							end
 						end
 					end
 				end
@@ -311,34 +337,39 @@
 			local oldData = CyborgMMO7SaveData[SaveName]
 			CyborgMMO7SaveData = {}
 			CyborgMMO7SaveData.Settings = oldData.Settings
-			CyborgMMO7SaveData.Rat = ConvertOldRatData(oldData.Rat)
+			-- Rat is an array, with one child per talent spec/group
+			CyborgMMO7SaveData.Rat = {}
+			CyborgMMO7SaveData.Rat[1] = ConvertOldRatData(oldData.Rat)
 			CyborgMMO7SaveData[SaveName] = oldData -- for now keep the data, we may have missed something in the conversion
 		end
 	elseif event == "PLAYER_ENTERING_WORLD" then
 		EnteredWorld = true
 	elseif event == "PLAYER_REGEN_DISABLED" then
 		CyborgMMO_Close()
+	elseif event == "ACTIVE_TALENT_GROUP_CHANGED" then
+		-- force a re-loading of bindings
+		BindingsLoaded = false
 	else
 		CyborgMMO_DPrint("Event is "..tostring(event))
 	end
 
 	-- Fire Loading if and only if the player is in the world and vars are loaded
-	if not BindingsLoaded and VarsLoaded and AsyncDataLoaded and EnteredWorld then
+	if not SettingsLoaded and VarsLoaded and AsyncDataLoaded and EnteredWorld then
 		local data = CyborgMMO_GetSaveData()
 
-		CyborgMMO_RatPageModel:LoadData()
-		BindingsLoaded = true
-
-		CyborgMMO_SetupModeCallbacks(1)
-		CyborgMMO_SetupModeCallbacks(2)
-		CyborgMMO_SetupModeCallbacks(3)
-
 		Settings = data.Settings
 		if not Settings then
 			Settings = {}
+			data.Settings = Settings
+		end
+		if Settings.MiniMapButton == nil then
 			Settings.MiniMapButton = true
+		end
+		if Settings.CyborgButton == nil then
 			Settings.CyborgButton = true
-			data.Settings = Settings
+		end
+		if Settings.PerSpecBindings == nil then
+			Settings.PerSpecBindings = false
 		end
 		if not Settings.Cyborg then
 			Settings.Cyborg = 0.75
@@ -357,9 +388,21 @@
 		CyborgMMO_SetMiniMapButton(Settings.MiniMapButton)
 		CyborgMMO_MiniMapButtonReposition(Settings.MiniMapButtonAngle)
 		CyborgMMO_SetCyborgHeadButton(Settings.CyborgButton)
+		CyborgMMO_SetPerSpecBindings(Settings.PerSpecBindings)
 
 		SettingsLoaded = true
 	end
+
+	-- load data AFTER the settings, because PerSpecBindings may affect what's loaded
+	if not BindingsLoaded and VarsLoaded and AsyncDataLoaded and EnteredWorld then
+		CyborgMMO_RatPageModel:LoadData()
+
+		CyborgMMO_SetupModeCallbacks(1)
+		CyborgMMO_SetupModeCallbacks(2)
+		CyborgMMO_SetupModeCallbacks(3)
+
+		BindingsLoaded = true
+	end
 end
 
 function CyborgMMO_SetDefaultSettings()
@@ -389,6 +432,7 @@
 	CyborgMMO_MainPage:RegisterEvent("VARIABLES_LOADED")
 	CyborgMMO_MainPage:RegisterEvent("PLAYER_ENTERING_WORLD")
 	CyborgMMO_MainPage:RegisterEvent("PLAYER_REGEN_DISABLED")
+	CyborgMMO_MainPage:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED")
 end
 
 function CyborgMMO_Close()
@@ -462,7 +506,7 @@
 	end
 	CyborgMMO_OptionPageCyborgButton:SetChecked(visible)
 	if SettingsLoaded then
-		Settings.CyborgButton = visible
+		Settings.CyborgButton = toboolean(visible)
 	end
 end
 
@@ -474,7 +518,18 @@
 	end
 	CyborgMMO_OptionPageMiniMapButton:SetChecked(visible)
 	if SettingsLoaded then
-		Settings.MiniMapButton = visible
+		Settings.MiniMapButton = toboolean(visible)
 	end
 end
 
+function CyborgMMO_SetPerSpecBindings(perSpec)
+	CyborgMMO_OptionPagePerSpecBindings:SetChecked(perSpec)
+	if SettingsLoaded then
+		Settings.PerSpecBindings = toboolean(perSpec)
+	end
+	-- reload bindings if necessary (AFTER altering the setting)
+	if BindingsLoaded then
+		CyborgMMO_RatPageModel:LoadData()
+	end
+end
+