режим предателя + UI референсы и DragonUI
This commit is contained in:
@@ -0,0 +1,298 @@
|
||||
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
|
||||
Reference in New Issue
Block a user