I came across party cast bar addon which basically puts a cast bar next to the party frames to track what spells they are casting. very usefull in arena. the problem is i cannot get it to work.
can anyone help me deycper the code below and see if its possible to write a script to do just that.
Difficulty = hardmode
–[[
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
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
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, colorToString(state.color), typeString );
end;
local colorResetFeedback = function(state)
return format(PCB_COLOR_RESET, colorToString(state.color), typeString );
end;
table.insert(
optionSet,
{
id=reaction..typeString.."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.. typeString.."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 colorChangeFeedback = function(state)
return format(PCB_COLOR_CHANGED, colorToString(state.color), typeString );
end;
local colorResetFeedback = function(state)
return format(PCB_COLOR_RESET, colorToString(state.color), typeString );
end;
table.insert(
optionSet,
{
id=reaction..typeString.."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..typeString.."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
===================================================
I found another easier script from jax casting bar, the only thing is how do i increase the casting bar size.
local JPC = CreateFrame(“Frame”,“JPC”,UIParent)
local GetNumPartyMembers = GetNumGroupMembers
local usingRaidFrames = tonumber(GetCVar(“useCompactPartyFrames”))
local spellBars = {}
local InArena = function() return (select(2,IsInInstance()) == “arena”) end