299 lines
8.3 KiB
Lua
299 lines
8.3 KiB
Lua
VOICECHAT_DELAY = 1.25;
|
|
VOICECHAT_BUTTON_OFFSET = 45;
|
|
VOICECHAT_UPDATE_FREQ = 0.05
|
|
VOICECHAT_TALKERS_PADDING = 16;
|
|
MOVING_FRAME = nil;
|
|
|
|
VOICECHAT_TALKERS = {};
|
|
local timeSinceLast = 0;
|
|
|
|
local function AddTalker(name, unit)
|
|
assert(name, "Usage: AddTalker(name, <unitToken>)");
|
|
for index, talker in ipairs(VOICECHAT_TALKERS) do
|
|
if ( name == talker.name ) then
|
|
talker.fadeout = nil;
|
|
return;
|
|
end
|
|
end
|
|
|
|
local talker = {}
|
|
talker.name = name;
|
|
talker.unit = unit;
|
|
tinsert(VOICECHAT_TALKERS, talker);
|
|
if ( not VoiceChatTalkers:GetScript("OnUpdate") ) then
|
|
VoiceChatTalkers:SetScript("OnUpdate", VoiceChatTalkers_OnUpdate);
|
|
end
|
|
end
|
|
|
|
local function RemoveTalker(name)
|
|
assert(name, "Usage: RemoveTalker(name)");
|
|
for index, talker in next, VOICECHAT_TALKERS do
|
|
if ( name == talker.name ) then
|
|
tremove(VOICECHAT_TALKERS, index);
|
|
return;
|
|
end
|
|
end
|
|
end
|
|
|
|
function VoiceChatTalkers_OnLoad()
|
|
VoiceChatTalkers.buttons = {};
|
|
VoiceChatTalkers.visible = 0;
|
|
local buttonFrame = CreateFrame("FRAME", "VoiceChatTalkersButton1", VoiceChatTalkers, "VoiceChatButtonTemplate");
|
|
tinsert(VoiceChatTalkers.buttons, buttonFrame);
|
|
buttonFrame:SetPoint("TOPLEFT", 0, -8);
|
|
VoiceChatTalkers:RegisterEvent("VOICE_PLATE_START")
|
|
VoiceChatTalkers:RegisterEvent("VOICE_PLATE_STOP")
|
|
VoiceChatTalkers:RegisterEvent("VOICE_LEFT_SESSION")
|
|
VoiceChatTalkers:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
VoiceChatTalkers:RegisterForDrag("LeftButton");
|
|
VoiceChatTalkers:SetAlpha(0);
|
|
end
|
|
|
|
function VoiceChatTalkers_OnEvent(self, event, ...)
|
|
local arg1, arg2 = ...;
|
|
if ( event == "VOICE_PLATE_START" ) then
|
|
if ( arg1 and (not arg2 or not UnitIsUnit(arg2, "player")) ) then
|
|
AddTalker(arg1, arg2);
|
|
VoiceChatTalkers_Update();
|
|
end
|
|
elseif ( event == "VOICE_PLATE_STOP" ) then
|
|
if ( arg1 and (not arg2 or not UnitIsUnit(arg2, "player")) ) then
|
|
for _, talker in next, VOICECHAT_TALKERS do
|
|
if ( arg1 == talker.name ) then
|
|
talker.fadeout = GetTime() + VOICECHAT_DELAY;
|
|
end
|
|
end
|
|
VoiceChatTalkers_Update();
|
|
end
|
|
end
|
|
end
|
|
|
|
function VoiceChatTalkers_OnUpdate(self, elapsed)
|
|
timeSinceLast = timeSinceLast + elapsed;
|
|
if ( timeSinceLast > VOICECHAT_UPDATE_FREQ ) then
|
|
local update = false;
|
|
for _, talker in next, VOICECHAT_TALKERS do
|
|
if ( talker.fadeout and talker.fadeout <= GetTime() ) then
|
|
RemoveTalker(talker.name);
|
|
update = true;
|
|
end
|
|
end
|
|
|
|
if ( update ) then
|
|
VoiceChatTalkers_Update();
|
|
end
|
|
|
|
if ( #VOICECHAT_TALKERS == 0 ) then
|
|
VoiceChatTalkers:SetScript("OnUpdate", nil);
|
|
end
|
|
timeSinceLast = 0;
|
|
end
|
|
end
|
|
|
|
function VoiceChatTalkers_FadeOut()
|
|
local fadeInfo = {};
|
|
fadeInfo.mode = "OUT";
|
|
fadeInfo.timeToFade = .35;
|
|
fadeInfo.startAlpha = 1;
|
|
fadeInfo.endAlpha = 0;
|
|
fadeInfo.finishedFunc = function() if ( #VOICECHAT_TALKERS > 0 ) then return end VoiceChatTalkers.buttons[1].button:SetAttribute("name", nil); VoiceChatTalkers.buttons[1]:Hide() VoiceChatTalkersSpeaker:Show() end;
|
|
UIFrameFade(VoiceChatTalkers, fadeInfo);
|
|
VoiceChatTalkers.visible = 0;
|
|
end
|
|
|
|
function VoiceChatTalkers_CanHide()
|
|
return (#VOICECHAT_TALKERS == 0) and (not VoiceChatTalkers.speakerLock) and (not VoiceChatTalkers.optionsLock) and (not VoiceChatTalkers.mouseoverLock);
|
|
end
|
|
|
|
function VoiceChatTalkers_Update()
|
|
local visibleButtons = 0;
|
|
|
|
if ( #VOICECHAT_TALKERS > #VoiceChatTalkers.buttons ) then
|
|
VoiceChatTalkers_CreateButtons(#VOICECHAT_TALKERS);
|
|
elseif ( #VOICECHAT_TALKERS == 0 ) then
|
|
for i = 2, #VoiceChatTalkers.buttons do
|
|
VoiceChatTalkers.buttons[i].button:SetAttribute("name", nil);
|
|
VoiceChatTalkers.buttons[i]:Hide();
|
|
end
|
|
VoiceChatTalkers_ResizeFrame(1);
|
|
VoiceChatTalkers.speakerLock = nil;
|
|
|
|
if ( VoiceChatTalkers.visible > 0 and VoiceChatTalkers_CanHide() ) then
|
|
--Only run this if we're actually changing from a number of talkers greater than zero to zero.
|
|
VoiceChatTalkers_FadeOut();
|
|
end
|
|
return;
|
|
end
|
|
|
|
for i = 1, #VoiceChatTalkers.buttons do
|
|
if ( VOICECHAT_TALKERS[i] ) then
|
|
VoiceChatTalkers.buttons[i].button:SetAttribute("name", VOICECHAT_TALKERS[i].name);
|
|
VoiceChatTalkers.buttons[i].text:SetText(VOICECHAT_TALKERS[i].name);
|
|
VoiceChatTalkers.buttons[i]:Show();
|
|
visibleButtons = visibleButtons + 1;
|
|
else
|
|
VoiceChatTalkers.buttons[i].button:SetAttribute("name", nil);
|
|
VoiceChatTalkers.buttons[i]:Hide();
|
|
end
|
|
end
|
|
|
|
VoiceChatTalkersSpeaker:Hide();
|
|
VoiceChatTalkers.speakerLock = true;
|
|
VoiceChatTalkers:SetAlpha(1);
|
|
VoiceChatTalkers.visible = visibleButtons;
|
|
VoiceChatTalkers_ResizeFrame(visibleButtons);
|
|
end
|
|
|
|
function VoiceChatTalkers_CreateButtons (maxButtons)
|
|
assert(maxButtons)
|
|
|
|
local buttonFrame;
|
|
for i = #VoiceChatTalkers.buttons + 1, maxButtons do
|
|
buttonFrame = CreateFrame("FRAME", VoiceChatTalkers:GetName() .. "Button" .. i, VoiceChatTalkers, "VoiceChatButtonTemplate");
|
|
buttonFrame:SetPoint("TOPLEFT", VoiceChatTalkers.buttons[#VoiceChatTalkers.buttons], "BOTTOMLEFT");
|
|
tinsert(VoiceChatTalkers.buttons, buttonFrame);
|
|
end
|
|
|
|
VoiceChatTalkers_ResizeFrame(maxButtons);
|
|
end
|
|
|
|
function VoiceChatTalkers_ResizeFrame(visible)
|
|
local visibleButtons = visible;
|
|
|
|
if ( not visibleButtons ) then
|
|
for i = 1, #VoiceChatTalkers.buttons do
|
|
if ( VoiceChatTalkers.buttons[i]:IsShown() ) then
|
|
visibleButtons = visibleButtons + 1;
|
|
end
|
|
end
|
|
end
|
|
|
|
if ( visibleButtons > 0 ) then
|
|
VoiceChatTalkers:SetHeight(visibleButtons * VoiceChatTalkers.buttons[1]:GetHeight() + VOICECHAT_TALKERS_PADDING);
|
|
else
|
|
VoiceChatTalkers:SetHeight(VoiceChatTalkers.buttons[1]:GetHeight() + VOICECHAT_TALKERS_PADDING);
|
|
end
|
|
end
|
|
|
|
function VoiceChat_OnUpdate(self, elapsed)
|
|
if ( not self.show ) then
|
|
if ( self.unit ) then
|
|
if ( self.name == UnitName("player") ) then
|
|
return;
|
|
elseif ( self.timer ) then
|
|
if ( self.timer < 0 ) then
|
|
UIFrameFadeOut(self, 0.35);
|
|
self.timer = nil;
|
|
self.unit = nil;
|
|
self.name = nil;
|
|
else
|
|
self.timer = self.timer - elapsed;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function VoiceChat_Animate(frame, animate)
|
|
local frameName = frame:GetName();
|
|
if ( animate ) then
|
|
UIFrameFlash(_G[frameName.."Flash"], 0.35, 0.35, -1);
|
|
else
|
|
UIFrameFlashStop(_G[frameName.."Flash"]);
|
|
frame:Hide();
|
|
end
|
|
end
|
|
|
|
|
|
function MiniMapVoiceChat_Update()
|
|
local count = GetNumVoiceSessions();
|
|
if ( IsVoiceChatEnabled() ) then
|
|
if ( GetNumVoiceSessions() ) then
|
|
MiniMapVoiceChatFrame:Show();
|
|
if ( count ~= MiniMapVoiceChatFrame.count ) then
|
|
VoiceChatShineFadeIn();
|
|
end
|
|
MiniMapVoiceChatFrame.count = count;
|
|
end
|
|
else
|
|
MiniMapVoiceChatFrame:Hide();
|
|
end
|
|
end
|
|
|
|
--- Global Voice Chat Switch
|
|
function VoiceChat_Toggle()
|
|
if ( IsVoiceChatEnabled() ) then
|
|
-- Options Frame Enable
|
|
GameMenuButtonSoundOptions:SetText(SOUNDOPTIONS_MENU);
|
|
ChannelFrameAutoJoin:Show();
|
|
VoiceChatTalkers:Show();
|
|
else
|
|
if ( IsVoiceChatAllowedByServer() ) then
|
|
-- Options Frame Enable
|
|
GameMenuButtonSoundOptions:SetText(SOUNDOPTIONS_MENU);
|
|
else
|
|
-- Options Frame Disable
|
|
GameMenuButtonSoundOptions:SetText(VOICE_SOUND);
|
|
end
|
|
ChannelFrameAutoJoin:Hide();
|
|
VoiceChatTalkers:Hide();
|
|
end
|
|
end
|
|
|
|
--[ Minimap DropDown Functions ]--
|
|
|
|
function MiniMapVoiceChatDropDown_OnLoad(self)
|
|
UIDropDownMenu_Initialize(self, MiniMapVoiceChatDropDown_Initialize, "MENU");
|
|
end
|
|
|
|
function MiniMapVoiceChatDropDown_Initialize()
|
|
local name, active, checked;
|
|
local count = GetNumVoiceSessions();
|
|
local info;
|
|
for id=1, count do
|
|
name, active = GetVoiceSessionInfo(id);
|
|
|
|
info = UIDropDownMenu_CreateInfo();
|
|
info.text = name;
|
|
info.checked = active;
|
|
info.func = function (self, id) SetActiveVoiceChannelBySessionID(id) end;
|
|
info.arg1 = id;
|
|
UIDropDownMenu_AddButton(info);
|
|
end
|
|
|
|
if ( not GetVoiceCurrentSessionID() ) then
|
|
checked = 1;
|
|
else
|
|
checked = nil;
|
|
end
|
|
|
|
info = UIDropDownMenu_CreateInfo();
|
|
info.text = NONE;
|
|
info.checked = checked;
|
|
info.func = function (self, id) SetActiveVoiceChannelBySessionID(id) end;
|
|
info.arg1 = 0;
|
|
UIDropDownMenu_AddButton(info);
|
|
|
|
end
|
|
|
|
function VoiceChatShineFadeIn()
|
|
-- Fade in the shine and then fade it out with the ComboPointShineFadeOut function
|
|
local fadeInfo = {};
|
|
fadeInfo.mode = "IN";
|
|
fadeInfo.timeToFade = 0.5;
|
|
fadeInfo.finishedFunc = VoiceChatShineFadeOut;
|
|
UIFrameFade(VoiceChatShine, fadeInfo);
|
|
end
|
|
|
|
function VoiceChatShineFadeOut()
|
|
UIFrameFadeOut(VoiceChatShine, 0.5);
|
|
end
|
|
|
|
function SetSelfMuteState()
|
|
if ( (GetCVar("VoiceChatSelfMute") == "1") and (GetCVar("VoiceChatMode") == "1") ) then
|
|
MiniMapVoiceChatFrameIconMuted:Show();
|
|
else
|
|
MiniMapVoiceChatFrameIconMuted:Hide();
|
|
end
|
|
end
|