341 lines
9.1 KiB
Lua
341 lines
9.1 KiB
Lua
CASTING_BAR_ALPHA_STEP = 0.05;
|
|
CASTING_BAR_FLASH_STEP = 0.2;
|
|
CASTING_BAR_HOLD_TIME = 1;
|
|
|
|
function CastingBarFrame_OnLoad (self, unit, showTradeSkills, showShield)
|
|
self:RegisterEvent("UNIT_SPELLCAST_START");
|
|
self:RegisterEvent("UNIT_SPELLCAST_STOP");
|
|
self:RegisterEvent("UNIT_SPELLCAST_FAILED");
|
|
self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED");
|
|
self:RegisterEvent("UNIT_SPELLCAST_DELAYED");
|
|
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START");
|
|
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE");
|
|
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP");
|
|
self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE");
|
|
self:RegisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE");
|
|
self:RegisterEvent("PLAYER_ENTERING_WORLD");
|
|
|
|
self.unit = unit;
|
|
self.showTradeSkills = showTradeSkills;
|
|
self.showShield = showShield;
|
|
self.casting = nil;
|
|
self.channeling = nil;
|
|
self.holdTime = 0;
|
|
self.showCastbar = true;
|
|
|
|
local barIcon = _G[self:GetName().."Icon"];
|
|
if ( barIcon ) then
|
|
barIcon:Hide();
|
|
end
|
|
end
|
|
|
|
function CastingBarFrame_OnShow (self)
|
|
if ( self.casting ) then
|
|
local _, _, _, _, startTime = UnitCastingInfo(self.unit);
|
|
if ( startTime ) then
|
|
self.value = (GetTime() - (startTime / 1000));
|
|
end
|
|
else
|
|
local _, _, _, _, _, endTime = UnitChannelInfo(self.unit);
|
|
if ( endTime ) then
|
|
self.value = ((endTime / 1000) - GetTime());
|
|
end
|
|
end
|
|
end
|
|
|
|
function CastingBarFrame_OnEvent (self, event, ...)
|
|
local arg1 = ...;
|
|
|
|
local unit = self.unit;
|
|
if ( event == "PLAYER_ENTERING_WORLD" ) then
|
|
local nameChannel = UnitChannelInfo(unit);
|
|
local nameSpell = UnitCastingInfo(unit);
|
|
if ( nameChannel ) then
|
|
event = "UNIT_SPELLCAST_CHANNEL_START";
|
|
arg1 = unit;
|
|
elseif ( nameSpell ) then
|
|
event = "UNIT_SPELLCAST_START";
|
|
arg1 = unit;
|
|
else
|
|
CastingBarFrame_FinishSpell(self);
|
|
end
|
|
end
|
|
|
|
if ( arg1 ~= unit ) then
|
|
return;
|
|
end
|
|
|
|
local selfName = self:GetName();
|
|
local barSpark = _G[selfName.."Spark"];
|
|
local barText = _G[selfName.."Text"];
|
|
local barFlash = _G[selfName.."Flash"];
|
|
local barIcon = _G[selfName.."Icon"];
|
|
local barBorder = _G[selfName.."Border"];
|
|
local barBorderShield = _G[selfName.."BorderShield"];
|
|
if ( event == "UNIT_SPELLCAST_START" ) then
|
|
local name, nameSubtext, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitCastingInfo(unit);
|
|
if ( not name or (not self.showTradeSkills and isTradeSkill)) then
|
|
self:Hide();
|
|
return;
|
|
end
|
|
|
|
self:SetStatusBarColor(1.0, 0.7, 0.0);
|
|
if ( barSpark ) then
|
|
barSpark:Show();
|
|
end
|
|
self.value = (GetTime() - (startTime / 1000));
|
|
self.maxValue = (endTime - startTime) / 1000;
|
|
self:SetMinMaxValues(0, self.maxValue);
|
|
self:SetValue(self.value);
|
|
if ( barText ) then
|
|
barText:SetText(text);
|
|
end
|
|
if ( barIcon ) then
|
|
barIcon:SetTexture(texture);
|
|
end
|
|
self:SetAlpha(1.0);
|
|
self.holdTime = 0;
|
|
self.casting = 1;
|
|
self.castID = castID;
|
|
self.channeling = nil;
|
|
self.fadeOut = nil;
|
|
if ( barBorderShield ) then
|
|
if ( self.showShield and notInterruptible ) then
|
|
barBorderShield:Show();
|
|
if ( barBorder ) then
|
|
barBorder:Hide();
|
|
end
|
|
else
|
|
barBorderShield:Hide();
|
|
if ( barBorder ) then
|
|
barBorder:Show();
|
|
end
|
|
end
|
|
end
|
|
if ( self.showCastbar ) then
|
|
self:Show();
|
|
end
|
|
|
|
elseif ( event == "UNIT_SPELLCAST_STOP" or event == "UNIT_SPELLCAST_CHANNEL_STOP") then
|
|
if ( not self:IsVisible() ) then
|
|
self:Hide();
|
|
end
|
|
if ( (self.casting and event == "UNIT_SPELLCAST_STOP" and select(4, ...) == self.castID) or
|
|
(self.channeling and event == "UNIT_SPELLCAST_CHANNEL_STOP") ) then
|
|
if ( barSpark ) then
|
|
barSpark:Hide();
|
|
end
|
|
if ( barFlash ) then
|
|
barFlash:SetAlpha(0.0);
|
|
barFlash:Show();
|
|
end
|
|
self:SetValue(self.maxValue);
|
|
if ( event == "UNIT_SPELLCAST_STOP" ) then
|
|
self.casting = nil;
|
|
self:SetStatusBarColor(0.0, 1.0, 0.0);
|
|
else
|
|
self.channeling = nil;
|
|
end
|
|
self.flash = 1;
|
|
self.fadeOut = 1;
|
|
self.holdTime = 0;
|
|
end
|
|
elseif ( event == "UNIT_SPELLCAST_FAILED" or event == "UNIT_SPELLCAST_INTERRUPTED" ) then
|
|
if ( self:IsShown() and
|
|
(self.casting and select(4, ...) == self.castID) and not self.fadeOut ) then
|
|
self:SetValue(self.maxValue);
|
|
self:SetStatusBarColor(1.0, 0.0, 0.0);
|
|
if ( barSpark ) then
|
|
barSpark:Hide();
|
|
end
|
|
if ( barText ) then
|
|
if ( event == "UNIT_SPELLCAST_FAILED" ) then
|
|
barText:SetText(FAILED);
|
|
else
|
|
barText:SetText(INTERRUPTED);
|
|
end
|
|
end
|
|
self.casting = nil;
|
|
self.channeling = nil;
|
|
self.fadeOut = 1;
|
|
self.holdTime = GetTime() + CASTING_BAR_HOLD_TIME;
|
|
end
|
|
elseif ( event == "UNIT_SPELLCAST_DELAYED" ) then
|
|
if ( self:IsShown() ) then
|
|
local name, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitCastingInfo(unit);
|
|
if ( not name or (not self.showTradeSkills and isTradeSkill)) then
|
|
-- if there is no name, there is no bar
|
|
self:Hide();
|
|
return;
|
|
end
|
|
self.value = (GetTime() - (startTime / 1000));
|
|
self.maxValue = (endTime - startTime) / 1000;
|
|
self:SetMinMaxValues(0, self.maxValue);
|
|
if ( not self.casting ) then
|
|
self:SetStatusBarColor(1.0, 0.7, 0.0);
|
|
if ( barSpark ) then
|
|
barSpark:Show();
|
|
end
|
|
if ( barFlash ) then
|
|
barFlash:SetAlpha(0.0);
|
|
barFlash:Hide();
|
|
end
|
|
self.casting = 1;
|
|
self.channeling = nil;
|
|
self.flash = 0;
|
|
self.fadeOut = 0;
|
|
end
|
|
end
|
|
elseif ( event == "UNIT_SPELLCAST_CHANNEL_START" ) then
|
|
local name, nameSubtext, text, texture, startTime, endTime, isTradeSkill, notInterruptible = UnitChannelInfo(unit);
|
|
if ( not name or (not self.showTradeSkills and isTradeSkill)) then
|
|
-- if there is no name, there is no bar
|
|
self:Hide();
|
|
return;
|
|
end
|
|
|
|
self:SetStatusBarColor(0.0, 1.0, 0.0);
|
|
self.value = ((endTime / 1000) - GetTime());
|
|
self.maxValue = (endTime - startTime) / 1000;
|
|
self:SetMinMaxValues(0, self.maxValue);
|
|
self:SetValue(self.value);
|
|
if ( barText ) then
|
|
barText:SetText(text);
|
|
end
|
|
if ( barIcon ) then
|
|
barIcon:SetTexture(texture);
|
|
end
|
|
if ( barSpark ) then
|
|
barSpark:Hide();
|
|
end
|
|
self:SetAlpha(1.0);
|
|
self.holdTime = 0;
|
|
self.casting = nil;
|
|
self.channeling = 1;
|
|
self.fadeOut = nil;
|
|
if ( barBorderShield ) then
|
|
if ( self.showShield and notInterruptible ) then
|
|
barBorderShield:Show();
|
|
if ( barBorder ) then
|
|
barBorder:Hide();
|
|
end
|
|
else
|
|
barBorderShield:Hide();
|
|
if ( barBorder ) then
|
|
barBorder:Show();
|
|
end
|
|
end
|
|
end
|
|
if ( self.showCastbar ) then
|
|
self:Show();
|
|
end
|
|
elseif ( event == "UNIT_SPELLCAST_CHANNEL_UPDATE" ) then
|
|
if ( self:IsShown() ) then
|
|
local name, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo(unit);
|
|
if ( not name or (not self.showTradeSkills and isTradeSkill)) then
|
|
-- if there is no name, there is no bar
|
|
self:Hide();
|
|
return;
|
|
end
|
|
self.value = ((endTime / 1000) - GetTime());
|
|
self.maxValue = (endTime - startTime) / 1000;
|
|
self:SetMinMaxValues(0, self.maxValue);
|
|
self:SetValue(self.value);
|
|
end
|
|
elseif ( self.showShield and event == "UNIT_SPELLCAST_INTERRUPTIBLE" ) then
|
|
if ( barBorderShield ) then
|
|
barBorderShield:Hide();
|
|
if ( barBorder ) then
|
|
barBorder:Show();
|
|
end
|
|
end
|
|
elseif ( self.showShield and event == "UNIT_SPELLCAST_NOT_INTERRUPTIBLE" ) then
|
|
if ( barBorderShield ) then
|
|
barBorderShield:Show();
|
|
if ( barBorder ) then
|
|
barBorder:Hide();
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function CastingBarFrame_OnUpdate (self, elapsed)
|
|
local barSpark = _G[self:GetName().."Spark"];
|
|
local barFlash = _G[self:GetName().."Flash"];
|
|
|
|
if ( self.casting ) then
|
|
self.value = self.value + elapsed;
|
|
if ( self.value >= self.maxValue ) then
|
|
self:SetValue(self.maxValue);
|
|
CastingBarFrame_FinishSpell(self, barSpark, barFlash);
|
|
return;
|
|
end
|
|
self:SetValue(self.value);
|
|
if ( barFlash ) then
|
|
barFlash:Hide();
|
|
end
|
|
if ( barSpark ) then
|
|
local sparkPosition = (self.value / self.maxValue) * self:GetWidth();
|
|
barSpark:SetPoint("CENTER", self, "LEFT", sparkPosition, 2);
|
|
end
|
|
elseif ( self.channeling ) then
|
|
self.value = self.value - elapsed;
|
|
if ( self.value <= 0 ) then
|
|
CastingBarFrame_FinishSpell(self, barSpark, barFlash);
|
|
return;
|
|
end
|
|
self:SetValue(self.value);
|
|
if ( barFlash ) then
|
|
barFlash:Hide();
|
|
end
|
|
elseif ( GetTime() < self.holdTime ) then
|
|
return;
|
|
elseif ( self.flash ) then
|
|
local alpha = 0;
|
|
if ( barFlash ) then
|
|
alpha = barFlash:GetAlpha() + CASTING_BAR_FLASH_STEP;
|
|
end
|
|
if ( alpha < 1 ) then
|
|
if ( barFlash ) then
|
|
barFlash:SetAlpha(alpha);
|
|
end
|
|
else
|
|
if ( barFlash ) then
|
|
barFlash:SetAlpha(1.0);
|
|
end
|
|
self.flash = nil;
|
|
end
|
|
elseif ( self.fadeOut ) then
|
|
local alpha = self:GetAlpha() - CASTING_BAR_ALPHA_STEP;
|
|
if ( alpha > 0 ) then
|
|
self:SetAlpha(alpha);
|
|
else
|
|
self.fadeOut = nil;
|
|
self:Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
function CastingBarFrame_FinishSpell (self, barSpark, barFlash)
|
|
self:SetStatusBarColor(0.0, 1.0, 0.0);
|
|
if ( barSpark ) then
|
|
barSpark:Hide();
|
|
end
|
|
if ( barFlash ) then
|
|
barFlash:SetAlpha(0.0);
|
|
barFlash:Show();
|
|
end
|
|
self.flash = 1;
|
|
self.fadeOut = 1;
|
|
self.casting = nil;
|
|
self.channeling = nil;
|
|
end
|
|
|
|
function CastingBarFrame_UpdateIsShown(self)
|
|
if ( self.casting and self.showCastbar ) then
|
|
CastingBarFrame_OnEvent(self, "PLAYER_ENTERING_WORLD")
|
|
else
|
|
self:Hide();
|
|
end
|
|
end
|