Quantcast

- display an action even if it is not in the action bar (do not work well for "on next action" spells)

Sidoine De Wispelaere [07-05-09 - 11:06]
- display an action even if it is not in the action bar (do not work well for "on next action" spells)

git-svn-id: svn://svn.curseforge.net/wow/ovale/mainline/trunk@80 d5049fe3-3747-40f7-a4b5-f36d6801af5f
Filename
Ovale.lua
OvaleIcone.lua
diff --git a/Ovale.lua b/Ovale.lua
index a6644be..291a254 100644
--- a/Ovale.lua
+++ b/Ovale.lua
@@ -13,8 +13,6 @@ Ovale.talentNameToId = {}
 Ovale.firstInit = false
 Ovale.Inferieur = 1
 Ovale.Superieur = 2
-Ovale.retourPriorite = 0
-Ovale.retourAction = nil
 Ovale.listeTalentsRemplie = false
 Ovale.frame = nil
 Ovale.checkBoxes = {}
@@ -673,10 +671,7 @@ function Ovale:CalculerMeilleureAction(element)
 	if (not element) then
 		return nil
 	end
-
-	self.retourAction = nil
-	self.retourPriorite = nil
-
+
 	if (element.type=="function")then
 		if (element.func == "Spell" or element.func=="Macro" or element.func=="Item") then
 			local action
@@ -688,31 +683,57 @@ function Ovale:CalculerMeilleureAction(element)
 			elseif (element.func=="Item") then
 				action = self.actionObjet[element.params[1]]
 			end
-			if (not action) then
+			local actionTexture, actionInRange, actionCooldownStart, actionCooldownDuration,
+				actionUsable, actionShortcut, actionIsCurrent, actionEnable
+
+			if (action) then
+				actionTexture = GetActionTexture(action)
+				actionInRange = IsActionInRange(action, "target")
+				actionCooldownStart, actionCooldownDuration, actionEnable = GetActionCooldown(action)
+				actionUsable = IsUsableAction(action)
+				actionShortcut = self.shortCut[action]
+				actionIsCurrent = IsCurrentAction(action)
+			end
+			if (not actionTexture and element.func == "Spell") then
+				local sort = self:GetSpellInfoOrNil(element.params[1])
+				actionTexture = GetSpellTexture(sort)
+				actionInRange = IsSpellInRange(sort, "target")
+				actionCooldownStart, actionCooldownDuration, actionEnable = GetSpellCooldown(sort)
+				actionUsable = IsUsableSpell(sort)
+				actionShortcut = nil
+				local casting = UnitCastingInfo("player")
+				if (casting == sort) then
+					actionIsCurrent = 1
+				else
+					actionIsCurrent = nil
+				end
+				-- not quite the same as IsCurrentAction. Why did they remove IsCurrentCast?
+			end
+
+			if (not actionTexture) then
 				if (Ovale.trace) then
 					self:Print("Action "..element.params[1].." not found")
 				end
 				return nil
 			end
-			if (element.params.usable==1 and not IsUsableAction(action)) then
+			if (element.params.usable==1 and not actionUsable) then
 				if (Ovale.trace) then
 					self:Print("Action "..element.params[1].." not usable")
 				end
 				return nil
 			end
-			if (element.params.doNotRepeat==1 and IsCurrentAction(action)) then
+			if (element.params.doNotRepeat==1 and actionIsCurrent) then
 				if (Ovale.trace) then
 					self:Print("Action "..element.params[1].." is current action")
 				end
 				return nil
 			end
-			local start, duration, enable = GetActionCooldown(action)
-			local restant
-			if (enable>0) then
-				if (not duration or start==0) then
+			if (actionEnable>0) then
+				local restant
+				if (not actionCooldownDuration or actionCooldownStart==0) then
 					restant = 0
 				else
-					restant = duration - (self.maintenant - start);
+					restant = actionCooldownDuration - (self.maintenant - actionCooldownStart);
 				end
 				if (restant<self.attenteFinCast) then
 					restant = self.attenteFinCast
@@ -720,17 +741,16 @@ function Ovale:CalculerMeilleureAction(element)
 				if (Ovale.trace) then
 					self:Print("Action "..element.params[1].." remains "..restant)
 				end
-				self.retourAction = action
-				self.retourPriorite = element.params.priority
-				if (not self.retourPriorite) then
-					self.retourPriorite = 3
+				local retourPriorite = element.params.priority
+				if (not retourPriorite) then
+					retourPriorite = 3
 				end
-				return restant
+				return restant, retourPriorite, actionTexture, actionInRange, actionCooldownStart, actionCooldownDuration,
+					actionUsable, actionShortcut
 			else
 				if (Ovale.trace) then
 					self:Print("Action "..element.params[1].." not enabled")
 				end
-				return nil
 			end
 		else
 			local classe = Ovale.conditions[element.func]
@@ -749,10 +769,7 @@ function Ovale:CalculerMeilleureAction(element)
 				end
 			end

-			if (temps == nil) then
-				return nil
-			end
-	 		return temps
+			return temps
 		end
 	elseif (element.type == "before") then
 		if (Ovale.trace) then
@@ -764,8 +781,9 @@ function Ovale:CalculerMeilleureAction(element)
 		end
 		if (tempsA<element.time) then
 			return 0
+		else
+			return tempsA - element.time
 		end
-		return tempsA - element.time
 	elseif (element.type == "and" or element.type == "if") then
 		if (Ovale.trace) then
 			self:Print(element.type)
@@ -774,14 +792,17 @@ function Ovale:CalculerMeilleureAction(element)
 		if (tempsA==nil) then
 			return nil
 		end
-		local tempsB = Ovale:CalculerMeilleureAction(element.b)
+		local tempsB, priorite, actionTexture, actionInRange, actionCooldownStart, actionCooldownDuration,
+			actionUsable, actionShortcut = Ovale:CalculerMeilleureAction(element.b)
 		if (tempsB==nil) then
 			return nil
 		end
 		if (tempsB>tempsA) then
-			return tempsB
+			return  tempsB, priorite, actionTexture, actionInRange, actionCooldownStart, actionCooldownDuration,
+				actionUsable, actionShortcut
 		else
-			return tempsA
+			return  tempsA, priorite, actionTexture, actionInRange, actionCooldownStart, actionCooldownDuration,
+				actionUsable, actionShortcut
 		end
 	elseif (element.type == "unless") then
 		if (Ovale.trace) then
@@ -791,9 +812,11 @@ function Ovale:CalculerMeilleureAction(element)
 		if (tempsA==0) then
 			return nil
 		end
-		local tempsB = Ovale:CalculerMeilleureAction(element.b)
+		local tempsB, priorite, actionTexture, actionInRange, actionCooldownStart, actionCooldownDuration,
+			actionUsable, actionShortcut = Ovale:CalculerMeilleureAction(element.b)
 		if (tempsA==nil or tempsA>tempsB) then
-			return tempsB
+			return tempsB, priorite, actionTexture, actionInRange, actionCooldownStart, actionCooldownDuration,
+				actionUsable, actionShortcut
 		else
 			return nil
 		end
@@ -815,17 +838,26 @@ function Ovale:CalculerMeilleureAction(element)
 		local meilleurFils
 		local meilleurTempsFils
 		local meilleurePrioriteFils
+		local bestActionInRange
+		local bestActionCooldownStart
+		local bestActionCooldownDuration
+		local bestActionUsable
+		local bestActionShortCut

 		if (Ovale.trace) then
 			self:Print(element.type)
 		end

 		for k, v in ipairs(element.nodes) do
-			local nouveauTemps = Ovale:CalculerMeilleureAction(v)
-			local action = self.retourAction
-			local priorite = self.retourPriorite
+			local nouveauTemps, priorite, action, actionInRange, actionCooldownStart, actionCooldownDuration,
+				actionUsable, actionShortcut = Ovale:CalculerMeilleureAction(v)
 			if (nouveauTemps) then
 				local remplacer
+				if (not action) then
+					self:Print("Internal error: "..v.type.." returned nouveauTemps="..nouveauTemps.." and action=nil")
+					self.bug = true
+					return nil
+				end
 				if (not meilleurTempsFils) then
 					remplacer = true
 				else
@@ -833,7 +865,7 @@ function Ovale:CalculerMeilleureAction(element)
 					local maxEcart
 					if (priorite and not meilleurePrioriteFils) then
 						self.bug = true
-						self:Print("meilleurePrioriteFils nil and priorite not nil")
+						self:Print("Internal error: meilleurePrioriteFils=nil and priorite="..priorite)
 						return nil
 					end
 					if (priorite and priorite > meilleurePrioriteFils) then
@@ -855,6 +887,11 @@ function Ovale:CalculerMeilleureAction(element)
 					meilleurTempsFils = nouveauTemps
 					meilleurFils = action
 					meilleurePrioriteFils = priorite
+					bestActionInRange = actionInRange
+					bestActionCooldownStart = actionCooldownStart
+					bestActionCooldownDuration = actionCooldownDuration
+					bestActionUsable = actionUsable
+					bestActionShortCut = actionShortcut
 				end
 			end
 		end
@@ -863,14 +900,14 @@ function Ovale:CalculerMeilleureAction(element)
 			if (Ovale.trace) then
 				self:Print("Best action "..meilleurFils.." remains "..meilleurTempsFils)
 			end
-			self.retourPriorite = meilleurePrioriteFils
-			self.retourAction = meilleurFils
-			return meilleurTempsFils
+			return meilleurTempsFils,meilleurePrioriteFils, meilleurFils, bestActionInRange, bestActionCooldownStart,
+						bestActionCooldownDuration, bestActionUsable, bestActionShortCut
 		else
 			if (Ovale.trace) then printTime(nil) end
 			return nil
 		end
 	end
+	return nil
 end

 function Ovale:ChargerDefaut()
diff --git a/OvaleIcone.lua b/OvaleIcone.lua
index 6fe7796..c5be895 100644
--- a/OvaleIcone.lua
+++ b/OvaleIcone.lua
@@ -6,8 +6,8 @@
 	end

 	Ovale:InitCalculerMeilleureAction()
-	local minAttente = Ovale:CalculerMeilleureAction(self.masterNode)
-	local meilleureAction = Ovale.retourAction
+	local minAttente, priorite, actionTexture, actionInRange, actionCooldownStart, actionCooldownDuration,
+		actionUsable, actionShortcut = Ovale:CalculerMeilleureAction(self.masterNode)

 	if (Ovale.trace) then
 		Ovale.trace=false
@@ -24,16 +24,16 @@
 		minAttente = nil
 	end

-	if (minAttente~=nil and meilleureAction) then
+	if (minAttente~=nil and actionTexture) then

-		if (meilleureAction~=self.actionCourante or self.ancienneAttente==nil or
+		if (actionTexture~=self.actionCourante or self.ancienneAttente==nil or
 			(minAttente~=0 and minAttente>self.ancienneAttente+0.01) or
 			(Ovale.maintenant + minAttente < self.finAction-0.01)) then
-			if (meilleureAction~=self.actionCourante or self.ancienneAttente==nil or
+			if (actionTexture~=self.actionCourante or self.ancienneAttente==nil or
 					(minAttente~=0 and minAttente>self.ancienneAttente+0.01)) then
 				self.debutAction = Ovale.maintenant
 			end
-			self.actionCourante = meilleureAction
+			self.actionCourante = actionTexture
 			self.finAction = minAttente + Ovale.maintenant
 			if (minAttente == 0) then
 				self.cd:Hide()
@@ -47,16 +47,15 @@

 		-- L'icône avec le cooldown
 		self.icone:Show()
-		self.icone:SetTexture(GetActionTexture(meilleureAction));
+		self.icone:SetTexture(actionTexture);

-		if (IsUsableAction(meilleureAction)) then
+		if (actionUsable) then
 			self.icone:SetAlpha(1.0)
 		else
 			self.icone:SetAlpha(0.25)
 		end

-		local start, duration, enable = GetActionCooldown(meilleureAction)
-		if (Ovale.maintenant + minAttente > start + duration + 0.01 and minAttente > 0
+		if (Ovale.maintenant + minAttente > actionCooldownStart + actionCooldownDuration + 0.01 and minAttente > 0
 			and minAttente>Ovale.attenteFinCast) then
 			self.icone:SetVertexColor(0.75,0,0)
 		else
@@ -78,17 +77,17 @@
 		-- Le raccourcis clavier
 		if (Ovale.db.profile.apparence.raccourcis) then
 			self.shortcut:Show()
-			self.shortcut:SetText(Ovale.shortCut[meilleureAction])
+			self.shortcut:SetText(actionShortcut)
 		else
 			self.shortcut:Hide()
 		end

 		-- L'indicateur de portée
 		self.aPortee:Show()
-		if (IsActionInRange(meilleureAction,"target")==1) then
+		if (actionInRange==1) then
 			self.aPortee:SetVertexColor(0.6,0.6,0.6)
 			self.aPortee:Show()
-		elseif (IsActionInRange(meilleureAction,"target")==0) then
+		elseif (actionInRange==0) then
 			self.aPortee:SetVertexColor(1.0,0.1,0.1)
 			self.aPortee:Show()
 		else