--[[ |
PartyCastingBars |
Adds party member casting bars to their unit frames. |
|
By: AnduinLothar |
|
|
$Id: PartyCastingBars.lua 4157 2006-10-13 20:12:04Z geowar $ |
$Rev: 4157 $ |
$LastChangedBy: geowar $ |
$Date: 2006-10-13 13:12:04 -0700 (Fri, 13 Oct 2006) $ |
|
]]-- |
|
-------------------------------------------------- |
-- Globals |
-------------------------------------------------- |
PartyCastingBars = {}; |
|
PartyCastingBars.ColorResetting = {}; |
PartyCastingBars.ColorResetting["FRIENDLY"] = {}; |
PartyCastingBars.ColorResetting["HOSTILE"] = {}; |
|
PartyCastingBars.Bars = {}; |
|
PartyCastingBars.DefaultColors = { |
["FRIENDLY"] = { |
["CAST"] = { --Light Blue |
r=0.0; |
g=0.7; |
b=1.0; |
}; |
["CHANNEL"] = { --Green |
r=0.0; |
g=1.0; |
b=0.0; |
}; |
["SUCCESS"] = { --Green |
r=0.0; |
g=1.0; |
b=0.0; |
}; |
["FAILURE"] = { --Red |
r=1.0; |
g=0.0; |
b=0.0; |
}; |
}; |
["HOSTILE"] = { |
["CAST"] = { --Orange |
r=1.0; |
g=0.5; |
b=0.1; |
}; |
["CHANNEL"] = { --Orange |
r=1.0; |
g=0.6; |
b=0.2; |
}; |
["SUCCESS"] = { --Green |
r=0.0; |
g=1.0; |
b=0.0; |
}; |
["FAILURE"] = { --Red |
r=1.0; |
g=0.0; |
b=0.0; |
}; |
}; |
}; |
|
PartyCastingBars.TIME_LEFT = "(%.1fs)"; |
PartyCastingBars.SPELL_AND_TARGET = "%s - %s"; |
PartyCastingBars.COMM_FORMAT = "%s,%s,%s"; -- spellname, targetname, hostile/friendly |
|
-------------------------------------------------- |
-- Configuration Functions |
-------------------------------------------------- |
|
PartyCastingBars_Colors = { |
["FRIENDLY"] = { |
["CAST"] = { --Yellow |
r=1.0; |
g=0.7; |
b=0.0; |
}; |
["CHANNEL"] = { --Green |
r=0.0; |
g=1.0; |
b=0.0; |
}; |
["SUCCESS"] = { --Green |
r=0.0; |
g=1.0; |
b=0.0; |
}; |
["FAILURE"] = { --Red |
r=1.0; |
g=0.0; |
b=0.0; |
}; |
}; |
["HOSTILE"] = { |
["CAST"] = { --Orange |
r=1.0; |
g=0.5; |
b=0.1; |
}; |
["CHANNEL"] = { --Orange |
r=1.0; |
g=0.6; |
b=0.2; |
}; |
["SUCCESS"] = { |
r=0.0; |
g=1.0; |
b=0.0; |
}; |
["FAILURE"] = { |
r=1.0; |
g=0.0; |
b=0.0; |
}; |
}; |
}; |
|
-- colorToString(Table{r,g,b,a}) From SeaString |
local function colorToString(color) |
if (not color) then |
return "FFFFFFFF"; |
end |
return string.format("%.2X%.2X%.2X%.2X", |
(color.a or color.opacity or 1) * 255, |
(color.r or 0) * 255, |
(color.g or 0) * 255, |
(color.b or 0) * 255 |
); |
end |
|
local function setBarColor() |
local r,g,b = ColorPickerFrame:GetColorRGB() |
local reaction = ColorPickerFrame.extraInfo.reaction |
local typeString = ColorPickerFrame.extraInfo.typeString |
local info = PartyCastingBars_Colors[reaction][typeString] |
info.r=r; info.g=g; info.b=b |
if (not ColorPickerFrame:IsShown()) then |
DEFAULT_CHAT_FRAME:AddMessage(PCB_COLOR_SET:format(reaction, typeString, colorToString(info), r, g, b) ) |
end |
end |
|
local function cancelBarColorChange() |
local color = ColorPickerFrame.previousValues |
local reaction = ColorPickerFrame.extraInfo.reaction |
local typeString = ColorPickerFrame.extraInfo.typeString |
local info = PartyCastingBars_Colors[reaction][typeString] |
info.r=color.r; info.g=color.g; info.b=color.b |
if (not ColorPickerFrame:IsShown()) then |
DEFAULT_CHAT_FRAME:AddMessage(PCB_COLOR_SET:format(reaction, typeString, colorToString(info), info.r, info.g, info.b) ) |
end |
end |
|
function PartyCastingBars.ResetBarColor(reaction, typeString) |
local default = PartyCastingBars.DefaultColors[reaction][typeString] |
local info = PartyCastingBars_Colors[reaction][typeString] |
info.r=default.r; info.g=default.g; info.b=default.b |
DEFAULT_CHAT_FRAME:AddMessage(PCB_COLOR_SET:format(reaction, typeString, colorToString(info), info.r, info.g, info.b) ) |
end |
|
for reaction, info in pairs(PartyCastingBars_Colors) do |
for typeString, typeInfo in pairs(info) do |
typeInfo.extraInfo = {typeString=typeString, reaction=reaction} |
end |
end |
|
function PartyCastingBars.OpenColorPicker(info) |
ColorPickerFrame.hasOpacity = nil; |
ColorPickerFrame.opacityFunc = nil; |
ColorPickerFrame.opacity = 1; |
ColorPickerFrame.previousValues = {r = info.r+0, g = info.g+0, b = info.b+0, opacity = 1}; |
ColorPickerFrame.func = setBarColor; |
ColorPickerFrame.cancelFunc = cancelBarColorChange; |
ColorPickerFrame.extraInfo = info.extraInfo; |
-- This must come last, since it triggers a call to ColorPickerFrame.func() |
--ColorPickerFrame:SetColorRGB(info.r, info.g, info.b); |
ShowUIPanel(ColorPickerFrame); |
ColorPickerFrame:SetColorRGB(info.r, info.g, info.b); |
end |
|
-------------------------------------------------- |
-- Party Member Caching |
-------------------------------------------------- |
|
PartyCastingBars.PartyMembers = {} |
PartyCastingBars.HostilityCache = {} |
|
function PartyCastingBars.CachePartyMembers() |
PartyCastingBars.PartyMembers = {} |
for i=1, 4 do |
local unit = "party"..i |
if (UnitExists(unit)) then |
local name = UnitName(unit) |
PartyCastingBars.PartyMembers[name] = i |
PartyCastingBars.HostilityCache[name] = UnitCanAttack("player", unit) |
end |
end |
if (UnitInRaid("player")) then |
for i=1, 40 do |
local unit = "raid"..i |
if (UnitExists(unit)) then |
local name = UnitName(unit) |
PartyCastingBars.HostilityCache[name] = UnitCanAttack("player", unit) |
end |
end |
end |
end |
|
|
-------------------------------------------------- |
-- Color Management |
-------------------------------------------------- |
|
function PartyCastingBars.GetColorArgs(database) |
return database.r, database.g, database.b |
end |
|
-------------------------------------------------- |
-- Events |
-------------------------------------------------- |
|
function PartyCastingBars.EventFrameOnLoad(frame) |
frame:RegisterEvent("VARIABLES_LOADED") |
frame:RegisterEvent("PLAYER_ENTERING_WORLD") |
frame:RegisterEvent("PARTY_MEMBERS_CHANGED") |
frame:RegisterEvent("PLAYER_TARGET_CHANGED") |
frame:RegisterEvent("UNIT_SPELLCAST_SENT") |
frame:RegisterEvent("CHAT_MSG_ADDON") |
end |
|
function PartyCastingBars.EventFrameOnEvent(event, newarg1, newarg2, newarg3, newarg4) |
if ( event == "VARIABLES_LOADED" ) then |
PartyCastingBars.RegisterConfig() |
|
elseif ( event == "PLAYER_ENTERING_WORLD" ) then |
PartyCastingBars.CachePartyMembers() |
|
elseif ( event == "PARTY_MEMBERS_CHANGED" ) then |
PartyCastingBars.CachePartyMembers() |
|
elseif ( event == "PLAYER_TARGET_CHANGED" ) then |
if (UnitExists("target")) then |
PartyCastingBars.HostilityCache[UnitName("target")] = UnitCanAttack("player", "target") |
end |
|
elseif ( event == "UNIT_SPELLCAST_SENT" ) then |
-- "player", spell, rank, target |
--Sea.io.printComma(newarg1, newarg2, newarg3, newarg4) |
if (newarg2 and newarg4) then |
if (PartyCastingBars.HostilityCache[newarg4]) then |
ChatThrottleLib:SendAddonMessage("ALERT", "PartyCastingBars", format(PartyCastingBars.COMM_FORMAT, newarg2, newarg4, "hostile"), "PARTY"); |
else |
ChatThrottleLib:SendAddonMessage("ALERT", "PartyCastingBars", format(PartyCastingBars.COMM_FORMAT, newarg2, newarg4, "friendly"), "PARTY"); |
end |
end |
|
elseif ( event == "CHAT_MSG_ADDON" ) then |
-- prefix, msg, method, sender |
if (newarg1 == "PartyCastingBars") then |
--Sea.io.printComma(format("[%s]<%s>[%s]: %s", newarg3, newarg1, newarg4, newarg2)) |
local partyNum = PartyCastingBars.PartyMembers[newarg4] |
if (partyNum) then |
local _, _, spellName, targetName, relationship = strfind(newarg2, "^(.+),(.+),(.+)$") |
if (spellName and targetName and relationship) then |
local frame = getglobal("PartyMemberFrame"..partyNum.."CastingBarFrame") |
frame.targetName = targetName |
frame.hostileCast = (relationship == "hostile") |
PartyCastingBars.OnEvent(frame, "UNIT_SPELLCAST_TARGET_CHANGED", "party"..partyNum, spellName) |
end |
end |
end |
|
end |
end |
|
-------------------------------------------------- |
-- Bar Scripts |
-------------------------------------------------- |
|
function PartyCastingBars.OnLoad(bar) |
-- Modified from CastingBarFrame_OnLoad |
bar:RegisterEvent("UNIT_SPELLCAST_START"); |
bar:RegisterEvent("UNIT_SPELLCAST_STOP"); |
bar:RegisterEvent("UNIT_SPELLCAST_FAILED"); |
bar:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED"); |
bar:RegisterEvent("UNIT_SPELLCAST_DELAYED"); |
bar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START"); |
bar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE"); |
bar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP"); |
--bar:RegisterEvent("PLAYER_ENTERING_WORLD"); |
|
bar:RegisterForDrag("LeftButton"); |
|
bar.partyFrame = bar:GetParent(); |
bar.unit = bar:GetParent().unit or bar:GetParent():GetAttribute("unit"); |
bar.showTradeSkills = true; |
bar.casting = nil; |
bar.channeling = nil; |
bar.holdTime = 0; |
bar.showCastbar = true; |
|
local barIcon = getglobal(bar:GetName().."Icon"); |
barIcon:Hide(); |
|
bar:SetScale(0.75) |
local text = getglobal(bar:GetName().."Text") |
text:ClearAllPoints() |
text:SetPoint("CENTER", bar, "CENTER", 0, 0) |
bar.barText = text |
|
local border = getglobal(bar:GetName().."Border") |
border:SetTexture("Interface\\Tooltips\\UI-StatusBar-Border") |
border:SetWidth(202) |
border:SetHeight(18) |
border:ClearAllPoints() |
border:SetPoint("CENTER", bar, "CENTER", 0, 0) |
bar.border = border |
|
local flash = getglobal(bar:GetName().."Flash") |
flash:SetTexture("Interface\\AddOns\\PartyCastingBars\\Skin\\ArcaneBarFlash") |
flash:SetWidth(292) |
flash:SetHeight(34) |
flash:ClearAllPoints() |
flash:SetPoint("CENTER", bar, "CENTER", 0, 0) |
bar.barFlash = flash |
|
local icon = getglobal(bar:GetName().."Icon") |
icon:Show(); |
bar.barIcon = icon |
|
local spark = getglobal(bar:GetName().."Spark") |
flash:ClearAllPoints() |
flash:SetPoint("CENTER", bar, "CENTER", 0, 0) |
bar.barSpark = spark |
|
bar.barTime = getglobal(bar:GetName().."Time") |
|
tinsert(PartyCastingBars.Bars, bar) |
end |
|
function PartyCastingBars.GetTimeLeft(bar) |
local min, max = bar:GetMinMaxValues(); |
local current_time; |
if ( bar.channeling ) then |
current_time = bar:GetValue() - min; |
else |
current_time = max - bar:GetValue(); |
end |
return format(PartyCastingBars.TIME_LEFT, math.max(current_time,0)); |
end |
|
function PartyCastingBars.OnEvent(bar, event, unit, spellName) |
--Modified from CastingBarFrame_OnEvent to handle colors, interuptions, frame shortcuts and possible target text |
--[[ |
if ( newevent == "PLAYER_ENTERING_WORLD" ) then |
local nameChannel = UnitChannelInfo(bar.unit); |
local nameSpell = UnitCastingInfo(bar.unit); |
if ( nameChannel ) then |
event = "UNIT_SPELLCAST_CHANNEL_START"; |
unit = bar.unit; |
elseif ( nameSpell ) then |
event = "UNIT_SPELLCAST_START"; |
unit = bar.unit; |
end |
end |
]] |
|
if ( unit ~= bar.unit ) then |
return; |
end |
|
local barSpark = bar.barSpark; |
local barText = bar.barText; |
local barFlash = bar.barFlash; |
local barIcon = bar.barIcon; |
|
if ( event == "UNIT_SPELLCAST_START" ) then |
local name, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitCastingInfo(bar.unit); |
if ( not name or (not bar.showTradeSkills and isTradeSkill)) then |
bar:Hide(); |
return; |
end |
|
bar.hostileCast = bar.nextHostileCast; |
bar.targetName = bar.nextTargetName; |
|
if (bar.hostileCast) then |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["HOSTILE"]["CAST"])); |
else |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["FRIENDLY"]["CAST"])); |
end |
barSpark:Show(); |
bar.startTime = startTime / 1000; |
bar.maxValue = endTime / 1000; |
|
-- startTime to maxValue no endTime |
bar:SetMinMaxValues(bar.startTime, bar.maxValue); |
bar:SetValue(bar.startTime); |
if (bar.targetName) then |
barText:SetText(format(PartyCastingBars.SPELL_AND_TARGET, text, bar.targetName)) |
else |
barText:SetText(text); |
end |
barIcon:SetTexture(texture); |
bar:SetAlpha(1.0); |
bar.holdTime = 0; |
bar.casting = 1; |
bar.channeling = nil; |
bar.fadeOut = nil; |
if ( bar.showCastbar ) then |
bar:Show(); |
end |
|
return; |
|
elseif ( event == "UNIT_SPELLCAST_STOP" or event == "UNIT_SPELLCAST_CHANNEL_STOP" ) then |
if ( not bar:IsVisible() ) then |
bar:Hide(); |
end |
if ( bar:IsShown() ) then |
local min, max = bar:GetMinMaxValues(); |
local currTimeLeft = max - bar:GetValue(); |
if (currTimeLeft > 0.1 and not bar.channeling) then |
-- use interupted event handler |
event = "UNIT_SPELLCAST_INTERRUPTED"; |
else |
barSpark:Hide(); |
barFlash:SetAlpha(0.0); |
barFlash:Show(); |
bar:SetValue(bar.maxValue); |
if ( event == "UNIT_SPELLCAST_STOP" ) then |
if (bar.casting) then |
if (bar.hostileCast) then |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["HOSTILE"]["SUCCESS"])); |
else |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["FRIENDLY"]["SUCCESS"])); |
end |
end |
bar.casting = nil; |
else |
bar.channeling = nil; |
end |
bar.flash = 1; |
bar.fadeOut = 1; |
bar.holdTime = 0; |
end |
|
bar.targetName = nil; |
bar.hostileCast = nil; |
end |
end |
|
if ( event == "UNIT_SPELLCAST_FAILED" or event == "UNIT_SPELLCAST_INTERRUPTED" ) then |
if ( bar:IsShown() and not bar.channeling ) then |
bar:SetValue(bar.maxValue); |
if (bar.hostileCast) then |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["HOSTILE"]["FAILURE"])); |
else |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["FRIENDLY"]["FAILURE"])); |
end |
barSpark:Hide(); |
--[[ |
if ( event == "UNIT_SPELLCAST_FAILED" ) then |
barText:SetText(FAILED); |
else |
barText:SetText(INTERRUPTED); |
end |
]]-- |
bar.casting = nil; |
bar.channeling = nil; |
bar.fadeOut = 1; |
bar.holdTime = GetTime() + CASTING_BAR_HOLD_TIME; |
|
bar.targetName = nil; |
bar.hostileCast = nil; |
end |
elseif ( event == "UNIT_SPELLCAST_TARGET_CHANGED" ) then |
-- Fake event, generated by chat comm |
if ( not spellName ) then |
return; |
end |
if ( bar:IsShown() ) then |
local min, max = bar:GetMinMaxValues(); |
local currTimeLeft = max - bar:GetValue(); |
|
local name, nameSubtext, text, texture, startTime, endTime, isTradeSkill; |
if ( bar.casting ) then |
name, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitCastingInfo(bar.unit); |
elseif ( bar.channeling ) then |
name, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo(bar.unit); |
end |
|
if (spellName == name and currTimeLeft > 0.1) then |
-- Spell start event was already recieved, update the current spell |
if ( bar.casting ) then |
if (bar.hostileCast) then |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["HOSTILE"]["CAST"])); |
else |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["FRIENDLY"]["CAST"])); |
end |
elseif ( bar.channeling ) then |
if (bar.hostileCast) then |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["HOSTILE"]["CHANNEL"])); |
else |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["FRIENDLY"]["CHANNEL"])); |
end |
end |
|
if (bar.targetName) then |
barText:SetText(format(PartyCastingBars.SPELL_AND_TARGET, text, bar.targetName)); |
else |
barText:SetText(text); |
end |
return; |
end |
end |
|
bar.nextHostileCast = bar.hostileCast; |
bar.nextTargetName = bar.targetName; |
|
elseif ( event == "UNIT_SPELLCAST_DELAYED" ) then |
if ( bar:IsShown() ) then |
local name, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitCastingInfo(bar.unit); |
if ( not name or (not bar.showTradeSkills and isTradeSkill)) then |
-- if there is no name, there is no bar |
bar:Hide(); |
return; |
end |
bar.startTime = startTime / 1000; |
bar.maxValue = endTime / 1000; |
bar:SetMinMaxValues(bar.startTime, bar.maxValue); |
end |
elseif ( event == "UNIT_SPELLCAST_CHANNEL_START" ) then |
local name, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo(bar.unit); |
if ( not name or (not bar.showTradeSkills and isTradeSkill)) then |
-- if there is no name, there is no bar |
bar:Hide(); |
return; |
end |
|
bar.hostileCast = bar.nextHostileCast; |
bar.targetName = bar.nextTargetName; |
|
if (bar.hostileCast) then |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["HOSTILE"]["CHANNEL"])); |
else |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["FRIENDLY"]["CHANNEL"])); |
end |
barSpark:Show(); |
bar.startTime = startTime / 1000; |
bar.endTime = endTime / 1000; |
bar.duration = bar.endTime - bar.startTime; |
bar.maxValue = bar.startTime; |
|
-- startTime to endTime no maxValue |
bar:SetMinMaxValues(bar.startTime, bar.endTime); |
bar:SetValue(bar.endTime); |
if (bar.targetName) then |
barText:SetText(format(PartyCastingBars.SPELL_AND_TARGET, text, bar.targetName)) |
else |
barText:SetText(text); |
end |
barIcon:SetTexture(texture); |
bar:SetAlpha(1.0); |
bar.holdTime = 0; |
bar.casting = nil; |
bar.channeling = 1; |
bar.fadeOut = nil; |
if ( bar.showCastbar ) then |
bar:Show(); |
end |
elseif ( event == "UNIT_SPELLCAST_CHANNEL_UPDATE" ) then |
if ( bar:IsShown() ) then |
local name, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo(bar.unit); |
if ( not name or (not bar.showTradeSkills and isTradeSkill)) then |
-- if there is no name, there is no bar |
bar:Hide(); |
return; |
end |
bar.startTime = startTime / 1000; |
bar.endTime = endTime / 1000; |
bar.maxValue = bar.startTime; |
bar:SetMinMaxValues(bar.startTime, bar.endTime); |
end |
end |
|
end |
|
function PartyCastingBars.OnUpdate(bar) |
if ( PartyCastingBars.draggable ) then |
return; |
end |
if ( bar.casting ) then |
local status = GetTime(); |
if ( status > bar.maxValue ) then |
status = bar.maxValue; |
end |
if ( status == bar.maxValue ) then |
bar:SetValue(bar.maxValue); |
if (bar.hostileCast) then |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["HOSTILE"]["SUCCESS"])); |
else |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["FRIENDLY"]["SUCCESS"])); |
end |
bar.barSpark:Hide(); |
bar.barFlash:SetAlpha(0.0); |
bar.barFlash:Show(); |
bar.casting = nil; |
bar.flash = 1; |
bar.fadeOut = 1; |
return; |
end |
bar:SetValue(status); |
bar.barFlash:Hide(); |
local sparkPosition = ((status - bar.startTime) / (bar.maxValue - bar.startTime)) * bar:GetWidth(); |
if ( sparkPosition < 0 ) then |
sparkPosition = 0; |
end |
bar.barSpark:SetPoint("CENTER", bar, "LEFT", sparkPosition, 0); |
bar.barTime:SetText(PartyCastingBars.GetTimeLeft(bar)); |
elseif ( bar.channeling ) then |
local time = GetTime(); |
if ( time > bar.endTime ) then |
time = bar.endTime; |
end |
if ( time == bar.endTime ) then |
if (bar.hostileCast) then |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["HOSTILE"]["SUCCESS"])); |
else |
bar:SetStatusBarColor(PartyCastingBars.GetColorArgs(PartyCastingBars_Colors["FRIENDLY"]["SUCCESS"])); |
end |
bar.barSpark:Hide(); |
bar.barFlash:SetAlpha(0.0); |
bar.barFlash:Show(); |
bar.channeling = nil; |
bar.flash = 1; |
bar.fadeOut = 1; |
return; |
end |
local barValue = bar.startTime + (bar.endTime - time); |
bar:SetValue( barValue ); |
bar.barFlash:Hide(); |
local sparkPosition = ((barValue - bar.startTime) / (bar.endTime - bar.startTime)) * bar:GetWidth(); |
bar.barSpark:SetPoint("CENTER", bar, "LEFT", sparkPosition, 0); |
bar.barTime:SetText(PartyCastingBars.GetTimeLeft(bar)); |
elseif ( GetTime() < bar.holdTime ) then |
return; |
elseif ( bar.flash ) then |
local alpha = bar.barFlash:GetAlpha() + CASTING_BAR_FLASH_STEP; |
if ( alpha < 1 ) then |
bar.barFlash:SetAlpha(alpha); |
else |
bar.barFlash:SetAlpha(1.0); |
bar.flash = nil; |
end |
elseif ( bar.fadeOut ) then |
local alpha = bar:GetAlpha() - CASTING_BAR_ALPHA_STEP; |
if ( alpha > 0 ) then |
bar:SetAlpha(alpha); |
else |
bar.fadeOut = nil; |
bar:Hide(); |
end |
end |
end |
|
function PartyCastingBars.OnDragStart(bar, button) |
if (not PartyCastingBars.draggable) then |
return; |
end |
bar:StartMoving(); |
end |
|
function PartyCastingBars.OnDragStop(bar) |
bar:StopMovingOrSizing(); |
end |
|
function PartyCastingBars.OnMouseUp(bar) |
bar:StopMovingOrSizing(); |
end |
|
function PartyCastingBars.OnHide(bar) |
bar:StopMovingOrSizing(); |
end |
|
-------------------------------------------------- |
-- Master Enable |
-------------------------------------------------- |
|
function PartyCastingBars.EnableToggle(value) |
if (value) then |
if (PartyCastingBars_Enabled) then |
--Do nothing |
else |
for i, barFrame in ipairs(PartyCastingBars.Bars) do |
barFrame:SetScript("OnEvent", PartyCastingBars.OnEvent); |
barFrame:SetScript("OnUpdate", PartyCastingBars.OnUpdate); |
end |
PartyCastingBars_Enabled = true; |
end |
else |
if (PartyCastingBars_Enabled) then |
for i, barFrame in ipairs(PartyCastingBars.Bars) do |
barFrame:SetScript("OnEvent", nil); |
barFrame:SetScript("OnUpdate", nil); |
barFrame:Hide(); |
end |
PartyCastingBars_Enabled = false; |
else |
--Do nothing |
end |
end |
end |
|
-------------------------------------------------- |
-- Icon Enable |
-------------------------------------------------- |
|
function PartyCastingBars.EnableIcons(value) |
if (value) then |
if (PartyCastingBars_IconsEnabled) then |
--Do nothing |
else |
for i, barFrame in ipairs(PartyCastingBars.Bars) do |
barFrame.barIcon:Show(); |
end |
PartyCastingBars_IconsEnabled = true; |
end |
else |
if (PartyCastingBars_IconsEnabled) then |
for i, barFrame in ipairs(PartyCastingBars.Bars) do |
barFrame.barIcon:Hide(); |
end |
PartyCastingBars_IconsEnabled = false; |
else |
--Do nothing |
end |
end |
end |
|
-------------------------------------------------- |
-- Bar Parenting |
-------------------------------------------------- |
|
function PartyCastingBars.SetParents(value) |
PartyCastingBars_Parented = (value); |
for i, barFrame in ipairs(PartyCastingBars.Bars) do |
barFrame:SetParent(value and barFrame.partyFrame or UIParent); |
end |
end |
|
-------------------------------------------------- |
-- Bar Scaling |
-------------------------------------------------- |
|
function PartyCastingBars.SetScales(value) |
for i, barFrame in ipairs(PartyCastingBars.Bars) do |
barFrame:SetScale(value); |
end |
end |
|
-------------------------------------------------- |
-- Draggable Mode |
-------------------------------------------------- |
|
function PartyCastingBars.EnableDragging(value) |
PartyCastingBars.draggable = (value); |
for i, barFrame in ipairs(PartyCastingBars.Bars) do |
if (PartyCastingBars.draggable) then |
barFrame:Show(); |
barFrame.barText:SetText(PCB_DRAGGABLE.." #"..i); |
barFrame.barSpark:Hide(); |
barFrame.barTime:SetText(format(PartyCastingBars.TIME_LEFT, 15)); |
barFrame.barTime:Show(); |
barFrame.barIcon:SetTexture("Interface\\Icons\\Spell_Holy_PowerWordShield"); |
barFrame:SetAlpha(1); |
barFrame:EnableMouse(1); |
else |
barFrame:Hide(); |
barFrame:EnableMouse(); |
end |
end |
end |
|
-------------------------------------------------- |
-- Reset Bars |
-------------------------------------------------- |
|
function PartyCastingBars.ResetBarLocations() |
for i, barFrame in ipairs(PartyCastingBars.Bars) do |
barFrame:ClearAllPoints(); |
barFrame:SetPoint("TOPLEFT", barFrame.partyFrame, "TOPRIGHT", 7, 2); |
end |
end |
|
-------------------------------------------------- |
-- Khaos Config |
-------------------------------------------------- |
|
function PartyCastingBars.RegisterConfig() |
-------------------------------------------------- |
-- Configuration Functions |
-------------------------------------------------- |
|
if (not PartyCastingBars_Colors) then PartyCastingBars_Colors = {} end; |
if (not PartyCastingBars_Colors["FRIENDLY"]) then PartyCastingBars_Colors["FRIENDLY"] = {} end; |
if (not PartyCastingBars_Colors["HOSTILE"]) then PartyCastingBars_Colors["HOSTILE"] = {} end; |
|
if ( Khaos ) then |
-- Khaos will save our vars, not the toc! |
PartyCastingBars_Enabled = true; |
PartyCastingBars_IconsEnabled = true; |
-- W0000! |
local optionSet = {}; |
local commandSet = {}; |
local configurationSet = { |
id="PartyCastingBars"; |
text=PCB_SECTION_TEXT; |
helptext=PCB_SECTION_TIP; |
difficulty=1; |
options=optionSet; |
commands=commandSet; |
default=false; |
callback=PartyCastingBars.EnableToggle; |
}; |
|
-- Register Basics |
table.insert( |
optionSet, |
{ |
id="Header"; |
text=PCB_HEADER_TEXT; |
helptext=PCB_HEADER_TIP; |
difficulty=1; |
type=K_HEADER; |
} |
); |
table.insert( |
optionSet, |
{ |
id="ShowSpellIcon"; |
text=PCB_SHOW_ICON_TEXT; |
helptext=PCB_SHOW_ICON_TIP; |
difficulty=1; |
callback=function(state) |
PartyCastingBars.EnableIcons(state.checked) |
end; |
feedback=function(state) |
if ( state.checked ) then |
return PCB_SHOWNICONFEEDBACK_NEGATIVE; |
else |
return PCB_SHOWNICONFEEDBACK_POSITIVE; |
end |
end; |
check=true; |
type=K_TEXT; |
setup= { |
}; |
default={ |
checked=true; |
}; |
disabled={ |
disabled=false; |
}; |
} |
); |
table.insert( |
optionSet, |
{ |
id="PartyMemberFrameParents"; |
text=PCB_PARTYMEMBERFRAME_PARENT_TEXT; |
helptext=PCB_PARTYMEMBERFRAME_PARENT_TIP; |
difficulty=3; |
callback=function(state) |
PartyCastingBars.SetParents(state.checked) |
end; |
feedback=function(state) |
if ( state.checked ) then |
return PCB_PARTYMEMBERFRAME_PARENT_NEGATIVE; |
else |
return PCB_PARTYMEMBERFRAME_PARENT_POSITIVE; |
end |
end; |
check=true; |
type=K_TEXT; |
setup= { |
}; |
default={ |
checked=true; |
}; |
disabled={ |
disabled=true; |
}; |
} |
); |
table.insert( |
optionSet, |
{ |
id="Draggable"; |
text=PCB_DRAGGABLE_TEXT; |
helptext=PCB_DRAGGABLE_TIP; |
difficulty=3; |
callback=function(state) |
PartyCastingBars.EnableDragging(state.checked) |
end; |
feedback=function(state) |
if ( state.checked ) then |
return PCB_DRAGGABLE_NEGATIVE; |
else |
return PCB_DRAGGABLE_POSITIVE; |
end |
end; |
check=true; |
type=K_TEXT; |
setup= { |
}; |
default={ |
checked=false; |
}; |
disabled={ |
disabled=false; |
}; |
} |
); |
table.insert( |
optionSet, |
{ |
id="Scale"; |
text=PCB_SCALE_TEXT; |
helptext=PCB_SCALE_TIP; |
difficulty=3; |
check=true; |
type=K_SLIDER; |
callback=function(state) |
PartyCastingBars.SetScales(state.slider) |
end; |
feedback=function(state) |
if ( state.checked ) then |
return format(PCB_SCALE_POSITIVE, state.slider); |
else |
return PCB_SCALE_NEGATIVE; |
end |
end; |
setup = { |
sliderMin = .5; |
sliderMax = 2; |
sliderStep = .1; |
sliderText = PCB_SCALE; |
}; |
default = { |
checked = false; |
slider = 0.7; |
}; |
disabled = { |
checked = false; |
slider = 1; |
}; |
dependencies = { |
Scale = {checked=true;}; |
}; |
} |
); |
table.insert( |
optionSet, |
{ |
id="ResetLocations"; |
text=PCB_RESET_TEXT; |
helptext=PCB_RESET_TIP; |
difficulty=3; |
callback=PartyCastingBars.ResetBarLocations; |
feedback=function(state) |
return PCB_LOCATIONS_RESET; |
end; |
type=K_BUTTON; |
setup = { |
buttonText=PCB_RESETTEXT; |
}; |
} |
); |
|
-- Register for each cast type |
|
local reaction = "FRIENDLY" |
|
table.insert( |
optionSet, |
{ |
id=reaction.."Header"; |
text=getglobal("PCB_HEADER_"..reaction.."_TEXT"); |
helptext=getglobal("PCB_HEADER_"..reaction.."_TIP"); |
difficulty=3; |
type=K_HEADER; |
} |
); |
|
for i, castType in ipairs({"CAST","CHANNEL","SUCCESS","FAILURE"}) do |
local typeString = castType; |
local niceType = Sea.string.capitalizeWords(castType); |
local colorChangeFeedback = function(state) |
return format(PCB_COLOR_CHANGED, Sea.string.colorToString(state.color), niceType ); |
end; |
local colorResetFeedback = function(state) |
return format(PCB_COLOR_RESET, Sea.string.colorToString(state.color), niceType ); |
end; |
table.insert( |
optionSet, |
{ |
id=reaction..niceType.."ColorSetter"; |
text=getglobal("PCB_"..typeString.."COLOR_"..reaction.."_SET"); |
helptext=getglobal("PCB_"..typeString.."COLOR_SET_TIP"); |
difficulty=3; |
callback=function(state) |
if (PartyCastingBars.ColorResetting[reaction][typeString]) then |
state.color = PartyCastingBars.DefaultColors[reaction][typeString]; |
PartyCastingBars.ColorResetting[reaction][typeString] = false; |
end |
getglobal("PartyCastingBars_"..reaction)[typeString] = state.color; |
end; |
feedback=colorChangeFeedback; |
type=K_COLORPICKER; |
setup= { |
hasOpacity=false; |
}; |
default={ |
color=PartyCastingBars.DefaultColors[reaction][castType]; |
}; |
disabled={ |
color=PartyCastingBars.DefaultColors[reaction][castType]; |
}; |
} |
); |
table.insert( |
optionSet, |
{ |
id=reaction..niceType.."Reset"; |
text=getglobal("PCB_"..typeString.."COLOR_RESET"); |
helptext=getglobal("PCB_"..typeString.."COLOR_RESET_TIP"); |
difficulty=3; |
callback=function(state) |
PartyCastingBars.ColorResetting[reaction][typeString] = true; |
-- The khaos config's color has to be reset too or else it will just get refreshed |
-- with its state and override any values we change here. |
end; |
feedback=colorResetFeedback; |
type=K_BUTTON; |
setup = { |
buttonText=PCB_RESETTEXT; |
}; |
} |
); |
end |
|
local reaction = "HOSTILE" |
|
table.insert( |
optionSet, |
{ |
id=reaction.."Header"; |
text=getglobal("PCB_HEADER_"..reaction.."_TEXT"); |
helptext=getglobal("PCB_HEADER_"..reaction.."_TIP"); |
difficulty=3; |
type=K_HEADER; |
} |
); |
|
for i, castType in ipairs({"CAST","CHANNEL","SUCCESS","FAILURE"}) do |
local typeString = castType; |
local niceType = Sea.string.capitalizeWords(castType); |
local colorChangeFeedback = function(state) |
return format(PCB_COLOR_CHANGED, Sea.string.colorToString(state.color), niceType ); |
end; |
local colorResetFeedback = function(state) |
return format(PCB_COLOR_RESET, Sea.string.colorToString(state.color), niceType ); |
end; |
table.insert( |
optionSet, |
{ |
id=reaction..niceType.."ColorSetter"; |
text=getglobal("PCB_"..typeString.."COLOR_"..reaction.."_SET"); |
helptext=getglobal("PCB_"..typeString.."COLOR_SET_TIP"); |
difficulty=3; |
callback=function(state) |
if (PartyCastingBars.ColorResetting[reaction][typeString]) then |
state.color = PartyCastingBars.DefaultColors[reaction][typeString]; |
PartyCastingBars.ColorResetting[reaction][typeString] = false; |
end |
getglobal("PartyCastingBars_"..reaction)[typeString] = state.color; |
end; |
feedback=colorChangeFeedback; |
type=K_COLORPICKER; |
setup= { |
hasOpacity=false; |
}; |
default={ |
color=PartyCastingBars.DefaultColors[reaction][castType]; |
}; |
disabled={ |
color=PartyCastingBars.DefaultColors[reaction][castType]; |
}; |
} |
); |
table.insert( |
optionSet, |
{ |
id=reaction..niceType.."Reset"; |
text=getglobal("PCB_"..typeString.."COLOR_RESET"); |
helptext=getglobal("PCB_"..typeString.."COLOR_RESET_TIP"); |
difficulty=3; |
callback=function(state) |
PartyCastingBars.ColorResetting[reaction][typeString] = true; |
-- The khaos config's color has to be reset too or else it will just get refreshed |
-- with its state and override any values we change here. |
end; |
feedback=colorResetFeedback; |
type=K_BUTTON; |
setup = { |
buttonText=PCB_RESETTEXT; |
}; |
} |
); |
end |
|
Khaos.registerOptionSet( |
"combat", |
configurationSet |
); |
else |
|
-- Command System FTW |
PartyCastingBars.EnableToggle(PartyCastingBars_Enabled); |
PartyCastingBars.EnableIcons(PartyCastingBars_IconsEnabled); |
PartyCastingBars.SetParents(PartyCastingBars_Parented); |
|
SlashCmdList["PARTYCASTINGBARS"] = function(msg) |
local cmd, reaction, typeString = (" "):split(strupper(msg)) |
if (cmd == "ENABLE") then |
PartyCastingBars.EnableToggle(true); |
DEFAULT_CHAT_FRAME:AddMessage(PCB_ENABLED,0,1,0); |
elseif (cmd == "DISABLE") then |
PartyCastingBars.EnableToggle(false); |
DEFAULT_CHAT_FRAME:AddMessage(PCB_DISABLED,1,0,0); |
elseif (cmd == "ICON") then |
PartyCastingBars.EnableIcons(not PartyCastingBars_IconsEnabled); |
if (PartyCastingBars_IconsEnabled) then |
DEFAULT_CHAT_FRAME:AddMessage(PCB_SHOWNICONFEEDBACK_POSITIVE,0,1,1); |
else |
DEFAULT_CHAT_FRAME:AddMessage(PCB_SHOWNICONFEEDBACK_NEGATIVE,1,1,0); |
end |
elseif (cmd == "DRAG") then |
PartyCastingBars.EnableDragging(not PartyCastingBars.draggable); |
if (PartyCastingBars.draggable) then |
DEFAULT_CHAT_FRAME:AddMessage(PCB_DRAGGABLE_POSITIVE,0,1,1); |
else |
DEFAULT_CHAT_FRAME:AddMessage(PCB_DRAGGABLE_NEGATIVE,1,1,0); |
end |
elseif (cmd == "PARENT") then |
PartyCastingBars.SetParents(not PartyCastingBars_Parented); |
if (PartyCastingBars_Parented) then |
DEFAULT_CHAT_FRAME:AddMessage(PCB_PARTYMEMBERFRAME_PARENT_POSITIVE,0,1,1); |
else |
DEFAULT_CHAT_FRAME:AddMessage(PCB_PARTYMEMBERFRAME_PARENT_NEGATIVE,1,1,0); |
end |
elseif (cmd == "SET" and reaction and typeString |
and PartyCastingBars_Colors[reaction] |
and PartyCastingBars_Colors[reaction][typeString]) then |
|
PartyCastingBars.OpenColorPicker(PartyCastingBars_Colors[reaction][typeString]) |
|
elseif (cmd == "RESET" and reaction and typeString |
and PartyCastingBars.DefaultColors[reaction] |
and PartyCastingBars.DefaultColors[reaction][typeString]) then |
|
PartyCastingBars.ResetBarColor(reaction, typeString) |
|
elseif (cmd == "HELP") then |
DEFAULT_CHAT_FRAME:AddMessage(PCB_HELP1); |
--DEFAULT_CHAT_FRAME:AddMessage(PCB_HELP2); |
DEFAULT_CHAT_FRAME:AddMessage("|c00995555--------|r"); |
DEFAULT_CHAT_FRAME:AddMessage(PCB_HELP3); |
DEFAULT_CHAT_FRAME:AddMessage(PCB_HELP4); |
DEFAULT_CHAT_FRAME:AddMessage(PCB_HELP5); |
DEFAULT_CHAT_FRAME:AddMessage(PCB_HELP6); |
DEFAULT_CHAT_FRAME:AddMessage(PCB_HELP7); |
else |
DEFAULT_CHAT_FRAME:AddMessage(PCB_INVALID_COMMAND,.5,.5,.5); |
end |
end; |
|
SLASH_PARTYCASTINGBARS1 = "/partycastingbars"; |
SLASH_PARTYCASTINGBARS2 = "/pcb"; |
|
end |
end |
|