Quantcast

Alpha version - base functionality all there.

KyrosKrane [05-21-18 - 23:23]
Alpha version - base functionality all there.
Does not yet detect user switching talents in a raid.
Filename
Broker_RaidMakeup.lua
diff --git a/Broker_RaidMakeup.lua b/Broker_RaidMakeup.lua
index abfa1cb..98d1001 100644
--- a/Broker_RaidMakeup.lua
+++ b/Broker_RaidMakeup.lua
@@ -40,9 +40,17 @@
 --# Constants
 --#########################################

+-- The icons to use when displaying in the broker display
 local TankIcon = "Interface\\Icons\\Inv_shield_06.blp"
 local HealerIcon = "Interface\\Icons\\Spell_holy_flashheal.blp"
 local DPSIcon = "Interface\\Icons\\Inv_sword_110.blp"
+local UnknownIcon = "Interface\\Icons\\Inv_shield_05.blp"
+
+-- The strings used by the game to represent the roles. I don't think these are localized in the game.
+local ROLE_HEALER = "HEALER"
+local ROLE_TANK = "TANK"
+local ROLE_DPS = "DAMAGER"
+local ROLE_NONE = "NONE"


 --#########################################
@@ -80,9 +88,10 @@ BRM.Frame, BRM.Events = CreateFrame("Frame"), {}
 --# Variables for tracking raid members
 --#########################################

-BRM.TankCount = 1
-BRM.HealerCount = 2
-BRM.DPSCount = 3
+BRM.TankCount = 0
+BRM.HealerCount = 0
+BRM.DPSCount = 0
+BRM.UnknownCount = 0


 --#########################################
@@ -96,28 +105,91 @@ end -- BRM:IconString(icon)


 function BRM:GetDisplayString()
-	return string.format("%s %d %s %d %s %d", BRM:IconString(TankIcon), BRM.TankCount, BRM:IconString(HealerIcon), BRM.HealerCount, BRM:IconString(DPSIcon), BRM.DPSCount)
+	local OutputString = string.format("%s %d %s %d %s %d", BRM:IconString(TankIcon), BRM.TankCount, BRM:IconString(HealerIcon), BRM.HealerCount, BRM:IconString(DPSIcon), BRM.DPSCount)
+	if BRM.UnknownCount > 0 then
+		OutputString = string.format("%s %s %d", OutputString, BRM:IconString(UnknownIcon), BRM.UnknownCount)
+	end
+	return OutputString
 end -- BRM:GetDisplayString()


+function BRM:IncrementRole(role)
+	if ROLE_HEALER == role then
+		BRM.HealerCount = BRM.HealerCount + 1
+	elseif ROLE_TANK == role then
+		BRM.TankCount = BRM.TankCount + 1
+	elseif ROLE_DPS == role then
+		BRM.DPSCount = BRM.DPSCount + 1
+	else
+		BRM.UnknownCount = BRM.UnknownCount + 1
+	end
+end
+
+
 function BRM:UpdateComposition()
-	BRM:DebugPrint  ("in BRM:UpdateComposition")
+	BRM:DebugPrint ("in BRM:UpdateComposition")

+	-- Zero out the counts so we can start fresh
 	BRM.TankCount = 0
 	BRM.HealerCount = 0
 	BRM.DPSCount = 0
+	BRM.UnknownCount = 0
+
+	-- Figure out how many members in our group. Ungrouped returns zero.
+	local members = GetNumGroupMembers()
+	BRM:DebugPrint ("members is " .. members)
+	local Role
+
+	if members and members > 0 then
+		BRM:DebugPrint ("I am in some kind of Group.")
+
+		local CheckWord = IsInRaid() and "raid" or "party" -- this probably isn't localized in the game.
+		BRM:DebugPrint ("CheckWord is " .. CheckWord)
+
+		-- OK, this is bloody screwy.
+		-- If I'm in a party, then the addon has to check player and party1 to party4.
+		-- But if I'm in a raid, the addon has to check raid1 to raid40, with no need to check player!
+
+		local i
+		if "raid" == CheckWord then
+			-- Raid - iterate and count by role
+			for i=1,members do
+				Role = UnitGroupRolesAssigned(CheckWord .. i)
+				BRM:DebugPrint ("Group member " .. CheckWord .. i .. " has role " .. Role)
+
+				BRM:IncrementRole(Role)
+			end -- for raid members
+		else
+			-- Party - iterate and count by role
+			for i = 1, members - 1 do
+				Role = UnitGroupRolesAssigned(CheckWord .. i)
+				BRM:DebugPrint ("Group member " .. CheckWord .. i .. " has role " .. Role)
+
+				BRM:IncrementRole(Role)
+			end -- for party members
+
+			-- Now repeat all that for the player.
+			Role = UnitGroupRolesAssigned("player")
+			BRM:DebugPrint ("player has role " .. Role)
+
+			BRM:IncrementRole(Role)
+		end -- if raid/party
+	else
+		BRM:DebugPrint ("I am not in any kind of Group.")
+
+		-- When not grouped, there is no role to check. So instead, we go off the player's specialization.

-	-- if in group
-		-- get count of group members
-		-- iterate and count by role
-	-- else
 		-- get player role
-	-- end
+		Role = select(5, GetSpecializationInfo(GetSpecialization()))
+		-- GetSpecializationInfo returns: id, name, description, icon, background, role.
+		BRM:DebugPrint ("My role is " .. Role)
+
+		BRM:IncrementRole(Role)
+	end
+
+	BRM:DebugPrint ("At end of role check, tanks = " .. BRM.TankCount .. ", healers = " .. BRM.HealerCount .. ", dps = " .. BRM.DPSCount .. ", other = " .. BRM.UnknownCount)
+

-	-- Placeholder for testing
-	BRM.TankCount = 2
-	BRM.HealerCount = 4
-	BRM.DPSCount = 6

 	BRM.LDO.text = BRM:GetDisplayString()
 end -- BRM:UpdateComposition()
@@ -160,6 +232,18 @@ function BRM.Events:ADDON_LOADED(addon)
 	end -- if Broker_RaidMakeup
 end -- BRM.Events:PLAYER_LOGIN()

+function BRM.Events:GROUP_ROSTER_UPDATE(...)
+	BRM:DebugPrint ("Got GROUP_ROSTER_UPDATE")
+	BRM:UpdateComposition()
+end -- BRM.Events:PLAYER_LOGIN()
+
+function BRM.Events:ACTIVE_TALENT_GROUP_CHANGED(...)
+	BRM:DebugPrint ("Got ACTIVE_TALENT_GROUP_CHANGED")
+	BRM:UpdateComposition()
+end -- BRM.Events:PLAYER_LOGIN()
+
+
+

 --#########################################
 --# Implement the event handlers