vanilla-wow-addons – Rev 1
?pathlinks?
-----------------------
-- TeamSpeak monitor --
-----------------------
local meSpeaking = false
local meSpeakChannel
local endSpeaking
speakerIcons = {}
Speaking = {}
local functions = {}
local tsFrame
local updatingName
if (not XPerlColourTable) then
local function MashXX(class)
local c = RAID_CLASS_COLORS[class]
XPerlColourTable[class] = string.format("|c00%02X%02X%02X", 255 * c.r, 255 * c.g, 255 * c.b)
end
XPerlColourTable = {}
MashXX("HUNTER")
MashXX("WARLOCK")
MashXX("PRIEST")
MashXX("PALADIN")
MashXX("MAGE")
MashXX("ROGUE")
MashXX("DRUID")
MashXX("SHAMAN")
MashXX("WARRIOR")
end
XPerlTeamSpeak = {}
-- CheckOnUpdate
local function CheckOnUpdate()
local any
if (endSpeaking) then
any = true
else
for k,v in pairs(Speaking) do
any = true
break
end
end
if (any) then
XPerl_TeamSpeak_Events:SetScript("OnUpdate", XPerl_TeamSpeak_OnUpdate)
else
XPerl_TeamSpeak_Events:SetScript("OnUpdate", nil)
XPerl_TeamSpeakIcon:SetTexCoord(0.75, 1, 0, 1)
end
end
-- StartSpeaking(name)
local function StartSpeaking(name)
if (not Speaking[name]) then
Speaking[name] = {start = GetTime(), icons = {}}
updatingName = name
if (name == UnitName("player")) then
if (functions.player) then
functions.player()
end
else
if (functions.party) then
functions.party(name)
end
end
if (functions.raid) then
functions.raid(name)
end
updatingName = nil
if (XPerl_TeamSpeak_Frame:IsShown()) then
XPerl_SetInfoText()
end
CheckOnUpdate()
end
end
-- StopSpeaking
local function StopSpeaking(name)
local stopSpeaking = Speaking[name]
if (stopSpeaking) then
for k,v in pairs(stopSpeaking.icons) do
v.SpeakerIcon.SpeakingName = nil
v.SpeakerIcon.SpeakStart = nil
v.SpeakerIcon:Hide()
speakerIcons[v] = nil
end
Speaking[name] = nil
if (XPerl_TeamSpeak_Frame:IsShown()) then
XPerl_SetInfoText()
end
CheckOnUpdate()
end
end
-- SetInfoText
local depth = 0
function XPerl_SetInfoText()
depth = depth + 1
local sorter = {}
for k,v in pairs(Speaking) do
tinsert(sorter, {name = k, time = GetTime()})
end
sort(sorter, function(a,b) return a.time < b.time end)
local text = ""
local removeName
for k,v in pairs(sorter) do
if (text ~= "") then
text = text.."|r, "
end
if (UnitName("player") == v.name) then
local _, class = UnitClass("player")
text = text..XPerlColourTable[class]
elseif (UnitInRaid("player")) then
local name, rank, subgroup, level, _, class, zone, online
for i = 1,GetNumRaidMembers() do
name, rank, subgroup, level, _, class, zone, online = GetRaidRosterInfo(i)
if (online) then
if (name == v.name) then
text = text..XPerlColourTable[class]
break
end
elseif (not removeName) then
removeName = name
break -- Since we'll be redoing the list anyway.
end
end
elseif (UnitInParty("player")) then
for i = 1,GetNumPartyMembers() do
if (UnitName("party"..i) == v.name) then
local _, class = UnitClass("party"..i)
text = text..XPerlColourTable[class]
break
end
end
end
text = text..v.name
end
XPerl_TeamSpeakText:SetText(text)
if (removeName and depth < 10) then
StopSpeaking(removeName)
end
depth = depth - 1
end
-- XPerl_BarUpdate
local speakerTimer = 0
local speakerCycle = 0
function XPerl_TeamSpeak_OnUpdate()
if (endSpeaking) then
if (GetTime() >= endSpeaking) then
endSpeaking = nil
if (meSpeakChannel) then
SendAddonMessage(XPERL_COMMS_PREFIX, "NOSPEAK", meSpeakChannel)
end
CheckOnUpdate()
end
end
speakerTimer = speakerTimer + arg1
if (speakerTimer >= 0.1) then
speakerTimer = 0
speakerCycle = speakerCycle + 1
if (speakerCycle > 6) then
speakerCycle = 0
end
local left
if (speakerCycle > 3) then
left = (6 - speakerCycle) / 4
else
left = speakerCycle / 4
end
local right = left + 0.25
local any
local now = GetTime()
local remove
for k,v in pairs(speakerIcons) do
if (not remove and v.SpeakStart and v.SpeakStart < now - 60) then
remove = k
end
v:SetTexCoord(left, right, 0, 1)
any = true
end
if (any) then
XPerl_TeamSpeakIcon:SetTexCoord(left, right, 0, 1)
else
XPerl_TeamSpeakIcon:SetTexCoord(0.75, 1, 0, 1)
end
if (remove) then
StopSpeaking(speakerIcons[remove].SpeakingName)
end
end
end
-- It won't send repetative SPEAK, NOSPEAK messages if you spam the button.
-- Will instead join them together until speak button released for at least 1 second
-- XPerl_TeamSpeakToggle
function XPerl_TeamSpeakToggle(keystate)
local myName = UnitName("player")
if (keystate == "down") then
meSpeaking = true
if (not endSpeaking) then
if (UnitInRaid("player")) then
meSpeakChannel = "RAID"
elseif (UnitInParty("player")) then
meSpeakChannel = "PARTY"
end
if (meSpeakChannel) then
SendAddonMessage(XPERL_COMMS_PREFIX, "SPEAK", meSpeakChannel)
end
else
endSpeaking = nil
end
StartSpeaking(myName)
else
StopSpeaking(myName)
if (meSpeaking) then
meSpeaking = false
-- We speak for at least 1 second. This way spamming the speak button won't send a lot of traffic out
endSpeaking = GetTime() + 1
end
end
end
-- XPerl_TeamspeakMessage
local function XPerl_TeamspeakMessage(name, msg, channel)
if (name ~= UnitName("player")) then
if (msg == "SPEAK") then
StartSpeaking(name)
elseif (msg == "NOSPEAK") then
StopSpeaking(name)
end
end
end
-- XPerl_ActivateSpeaker
function XPerl_ActivateSpeaker(frame, anchor)
if (frame) then
if (not frame.SpeakerIcon) then
if (not anchor) then
anchor = "LEFT"
end
frame.SpeakerIcon = frame:CreateTexture(nil, "OVERLAY")
frame.SpeakerIcon:SetWidth(20)
frame.SpeakerIcon:SetHeight(20)
frame.SpeakerIcon:SetPoint(anchor, frame, anchor, 5, -1)
frame.SpeakerIcon:SetTexture("Interface\\Addons\\XPerl_TeamSpeak\\XPerl_Speakers")
frame.SpeakerIcon:SetTexCoord(0, 0.25, 0, 1)
end
tinsert(Speaking[updatingName].icons, frame)
speakerIcons[frame] = frame.SpeakerIcon
frame.SpeakerIcon.SpeakingName = updatingName
frame.SpeakerIcon.SpeakStart = GetTime()
frame.SpeakerIcon:Show()
end
end
-- XPerl_TeamSpeak_Register
-- Parameters:
-- group = "player" func = function(speaking)
-- group = "party" func = function(name, speaking)
-- group = "raid" func = function(name, speaking)
function XPerl_TeamSpeak_Register(group, func)
functions[group] = func
end
-- SetupAnchor()
local function SetupAnchor()
XPerl_TeamSpeakText:ClearAllPoints()
local r, jH, jV
if (XPerlTeamSpeak.Anchor == "TOPLEFT") then
r = "BOTTOMLEFT"
jH = "LEFT"
jV = "TOP"
elseif (XPerlTeamSpeak.Anchor == "TOPRIGHT") then
r = "BOTTOMRIGHT"
jH = "RIGHT"
jV = "TOP"
elseif (XPerlTeamSpeak.Anchor == "BOTTOMLEFT") then
r = "TOPLEFT"
jH = "LEFT"
jV = "BOTTOM"
else
r = "TOPRIGHT"
jH = "RIGHT"
jV = "BOTTOM"
end
XPerl_TeamSpeakText:SetPoint(XPerlTeamSpeak.Anchor, XPerl_TeamSpeakIcon, r, 0, 0)
XPerl_TeamSpeakText:SetJustifyH(jH)
XPerl_TeamSpeakText:SetJustifyV(jV)
end
-- XPerlTeamspeakSlashCmd()
local function XPerlTeamspeakSlashCmd()
XPerl_TeamSpeak_Frame:Show()
SetupAnchor()
end
-- XPerl_GetRaidPosition
if (not XPerl_GetRaidPosition) then
function XPerl_GetRaidPosition(findName)
for i = 1,GetNumRaidMembers() do
if (UnitName("raid"..i) == findName) then
return i
end
end
end
end
if (not XPerl_GetPartyPosition) then
function XPerl_GetPartyPosition(findName)
for i = 1,GetNumPartyMembers() do
if (UnitName("party"..i) == findName) then
return i
end
end
end
end
-- SetDefaultHandlers()
local function SetDefaultHandlers()
if (not functions.player) then
if (XPerl_Player) then
functions.player = function()
XPerl_ActivateSpeaker(XPerl_Player_NameFrame)
end
elseif (Perl_Player_Frame) then
functions.player = function()
XPerl_ActivateSpeaker(Perl_Player_NameFrame)
end
elseif (Nurfed_player) then
functions.player = function()
XPerl_ActivateSpeaker(Nurfed_player)
end
elseif (NUFPlayerFrame) then
functions.player = function()
XPerl_ActivateSpeaker(NUI_Player_ClickNDragFrame, "CENTER")
end
elseif (PlayerFrame) then
functions.player = function()
XPerl_ActivateSpeaker(PlayerFrame, "TOP")
end
end
if (XPerl_party1) then
functions.party = function(name)
local id = XPerl_GetPartyPosition(name)
if (id) then
local nameFrame = getglobal("XPerl_party"..id.."_NameFrame")
XPerl_ActivateSpeaker(nameFrame)
end
end
elseif (Perl_party1) then
functions.party = function(name)
local id = XPerl_GetPartyPosition(name)
if (id) then
local nameFrame = getglobal("Perl_party"..id.."_NameFrame")
XPerl_ActivateSpeaker(nameFrame)
end
end
elseif (Nurfed_party1) then
functions.party = function(name)
local id = XPerl_GetPartyPosition(name)
if (id) then
local frame = getglobal("Nurfed_party"..id)
XPerl_ActivateSpeaker(frame)
end
end
elseif (NUFPartyMemberFrame1) then
functions.party = function(name)
local id = XPerl_GetPartyPosition(name)
if (id) then
local frame = getglobal("NUIPartyClickNDragFrame"..id)
XPerl_ActivateSpeaker(frame, "CENTER")
end
end
elseif (PartyMemberFrame1) then
functions.party = function(name)
local id = XPerl_GetPartyPosition(name)
if (id) then
local frame = getglobal("PartyMemberFrame"..id.."Disconnect"):GetParent():GetParent()
XPerl_ActivateSpeaker(frame, "LEFT")
end
end
end
if (XPerl_Raid_Frame) then
functions.raid = function(name)
local id = XPerl_GetRaidPosition(name)
if (id) then
local frame = getglobal("XPerl_raid"..id.."_NameFrame")
if (frame) then
XPerl_ActivateSpeaker(frame)
end
end
end
return
elseif (Perl_Raid1) then
functions.raid = function(name)
local id = XPerl_GetRaidPosition(name)
if (id) then
local frame = getglobal("Perl_Raid"..id.."_NameFrame")
if (frame) then
XPerl_ActivateSpeaker(frame)
end
end
end
elseif (CT_RAMember1) then
functions.raid = function(name)
local id = XPerl_GetRaidPosition(name)
if (id) then
local frame = getglobal("CT_RAMember"..id)
if (frame) then
XPerl_ActivateSpeaker(frame, "TOP")
end
end
end
elseif (Nurfed_RaidUnit1) then
functions.raid = function(name)
local id = XPerl_GetRaidPosition(name)
if (id) then
for i = 1,400 do
local button = getglobal("Nurfed_RaidUnit"..i)
if (not button) then
break
end
if (button.id == id) then
XPerl_ActivateSpeaker(button, "CENTER")
end
end
end
end
end
end
end
-- XPerl_TeamSpeak_OnEvent
function XPerl_TeamSpeak_OnEvent(event)
if (event == "CHAT_MSG_ADDON") then
if (arg1 == "X-Perl") then
XPerl_TeamspeakMessage(arg4, arg2, arg3)
end
elseif (event == "PLAYER_ENTERING_WORLD") then
this:UnregisterEvent("PLAYER_ENTERING_WORLD")
if (not XPerlTeamSpeak) then
XPerlTeamSpeak = {}
if (XPerl_Player == nil) then
XPerlTeamSpeak.tsFrame = true
end
end
if (not XPerlTeamSpeak.Anchor) then
XPerlTeamSpeak.Anchor = "TOPLEFT"
end
SetDefaultHandlers()
SlashCmdList["XPERL_TEAMSPEAK"] = XPerlTeamspeakSlashCmd
SLASH_XPERL_TEAMSPEAK1 = "/ts"
SLASH_XPERL_TEAMSPEAK2 = "/teamspeak"
SLASH_XPERL_TEAMSPEAK3 = "/ventrilo"
SLASH_XPERL_TEAMSPEAK4 = "/vent"
if (XPerlTeamSpeak.tsFrame) then
XPerl_TeamSpeak_Frame:Show()
SetupAnchor()
end
end
end
-- XPerl_TeamSpeakMenu()
function XPerl_TeamSpeakMenu()
ToggleDropDownMenu(1, nil, XPerl_TeamSpeak_DropDown, "XPerl_TeamSpeak_Frame", 0, 0)
end
-- XPerl_Teamspeak_Dropdown_OnLoad
function XPerl_Teamspeak_Dropdown_OnLoad()
UIDropDownMenu_Initialize(this, XPerl_Teamspeak_Dropdown_Initialize, "MENU")
end
-- SetAnchor
local function SetAnchor(a)
XPerlTeamSpeak.Anchor = a
HideDropDownMenu(1)
SetupAnchor()
end
function XPerl_Teamspeak_Dropdown_Initialize()
local info = {}
if (UIDROPDOWNMENU_MENU_LEVEL == 2) then
if (UIDROPDOWNMENU_MENU_VALUE == XPERL_TSMENU_ANCHOR) then
info = {}
info.text = XPERL_TSMENU_ANCHOR_TL
if (XPerlTeamSpeak.Anchor == "TOPLEFT") then
info.checked = 1
end
info.func = function() SetAnchor("TOPLEFT") end
UIDropDownMenu_AddButton(info, 2)
info = {}
info.text = XPERL_TSMENU_ANCHOR_TR
if (XPerlTeamSpeak.Anchor == "TOPRIGHT") then
info.checked = 1
end
info.func = function() SetAnchor("TOPRIGHT") end
UIDropDownMenu_AddButton(info, 2)
info = {}
info.text = XPERL_TSMENU_ANCHOR_BL
if (XPerlTeamSpeak.Anchor == "BOTTOMLEFT") then
info.checked = 1
end
info.func = function() SetAnchor("BOTTOMLEFT") end
UIDropDownMenu_AddButton(info, 2)
info = {}
info.text = XPERL_TSMENU_ANCHOR_BR
if (XPerlTeamSpeak.Anchor == "BOTTOMRIGHT") then
info.checked = 1
end
info.func = function() SetAnchor("BOTTOMRIGHT") end
UIDropDownMenu_AddButton(info, 2)
end
return
end
info = {}
info.text = XPERL_TSMENU_ANCHOR
info.hasArrow = 1
info.notCheckable = 1
UIDropDownMenu_AddButton(info)
info = {}
info.text = RESET
info.notCheckable = 1
info.func = XPerl_TeamSpeakReset
UIDropDownMenu_AddButton(info)
info = {}
info.text = CLOSE
info.notCheckable = 1
info.func = function() XPerl_TeamSpeak_Frame:Hide() end
UIDropDownMenu_AddButton(info)
end
-- XPerl_TeamSpeakReset
function XPerl_TeamSpeakReset()
for k,v in pairs(Speakers) do
StopSpeaking(k)
end
end