454 lines
15 KiB
Lua
454 lines
15 KiB
Lua
SKILLS_TO_DISPLAY = 12;
|
|
SKILLFRAME_SKILL_HEIGHT = 15;
|
|
|
|
function SkillFrame_OnShow (self)
|
|
SkillFrame_UpdateSkills(self);
|
|
end
|
|
|
|
function SkillFrame_OnLoad (self)
|
|
self:RegisterEvent("SKILL_LINES_CHANGED");
|
|
self:RegisterEvent("CHARACTER_POINTS_CHANGED");
|
|
SkillListScrollFrameScrollBar:SetValue(0);
|
|
SetSelectedSkill(0);
|
|
SkillFrame.statusBarClickedID = 0;
|
|
SkillFrame.showSkillDetails = nil;
|
|
SkillFrame_UpdateSkills(self);
|
|
end
|
|
|
|
function SkillFrame_OnEvent(self, event, ...)
|
|
if ( SkillFrame:IsVisible() ) then
|
|
SkillFrame_UpdateSkills(self);
|
|
end
|
|
end
|
|
|
|
function SkillFrame_SetStatusBar(statusBarID, skillIndex, numSkills, adjustedSkillPoints)
|
|
-- Get info
|
|
local skillName, header, isExpanded, skillRank, numTempPoints, skillModifier, skillMaxRank, isAbandonable, stepCost, rankCost, minLevel, skillCostType = GetSkillLineInfo(skillIndex);
|
|
local skillRankStart = skillRank;
|
|
skillRank = skillRank + numTempPoints;
|
|
|
|
-- Skill bar objects
|
|
local statusBar = _G["SkillRankFrame"..statusBarID];
|
|
local statusBarLabel = "SkillRankFrame"..statusBarID;
|
|
local statusBarSkillRank = _G["SkillRankFrame"..statusBarID.."SkillRank"];
|
|
local statusBarName = _G["SkillRankFrame"..statusBarID.."SkillName"];
|
|
local statusBarBorder = _G["SkillRankFrame"..statusBarID.."Border"];
|
|
local statusBarBackground = _G["SkillRankFrame"..statusBarID.."Background"];
|
|
local statusBarFillBar = _G["SkillRankFrame"..statusBarID.."FillBar"];
|
|
|
|
statusBarFillBar:Hide();
|
|
|
|
-- Header objects
|
|
local skillRankFrameBorderTexture = _G["SkillRankFrame"..statusBarID.."Border"];
|
|
local skillTypeLabelText = _G["SkillTypeLabel"..statusBarID];
|
|
|
|
-- Frame width vars
|
|
local skillRankFrameWidth = 0;
|
|
|
|
-- Hide or show skill bar
|
|
if ( skillName == "" ) then
|
|
statusBar:Hide();
|
|
skillTypeLabelText:Hide();
|
|
return;
|
|
end
|
|
|
|
-- Is header
|
|
if ( header ) then
|
|
skillTypeLabelText:Show();
|
|
skillTypeLabelText:SetText(skillName);
|
|
skillTypeLabelText.skillIndex = skillIndex;
|
|
skillRankFrameBorderTexture:Hide();
|
|
statusBar:Hide();
|
|
local normalTexture = _G["SkillTypeLabel"..statusBarID.."NormalTexture"];
|
|
if ( isExpanded ) then
|
|
skillTypeLabelText:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up");
|
|
else
|
|
skillTypeLabelText:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up");
|
|
end
|
|
skillTypeLabelText.isExpanded = isExpanded;
|
|
return;
|
|
else
|
|
skillTypeLabelText:Hide();
|
|
skillRankFrameBorderTexture:Show();
|
|
statusBar:Show();
|
|
end
|
|
|
|
-- Set skillbar info
|
|
statusBar.skillIndex = skillIndex;
|
|
statusBarName:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b);
|
|
statusBarSkillRank:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
|
|
statusBarSkillRank:ClearAllPoints();
|
|
statusBarSkillRank:SetPoint("LEFT", "SkillRankFrame"..statusBarID.."SkillName", "RIGHT", 13, 0);
|
|
statusBarSkillRank:SetJustifyH("LEFT");
|
|
|
|
-- Anchor the text to the left by default
|
|
statusBarName:ClearAllPoints();
|
|
statusBarName:SetPoint("LEFT", statusBar, "LEFT", 6, 1);
|
|
|
|
-- Lock border color if skill is selected
|
|
if (skillIndex == GetSelectedSkill()) then
|
|
statusBarBorder:LockHighlight();
|
|
else
|
|
statusBarBorder:UnlockHighlight();
|
|
end
|
|
|
|
-- Set bar color depending on skill cost
|
|
if (skillCostType == 1) then
|
|
statusBar:SetStatusBarColor(0.0, 0.75, 0.0, 0.5);
|
|
statusBarBackground:SetVertexColor(0.0, 0.5, 0.0, 0.5);
|
|
statusBarFillBar:SetVertexColor(0.0, 1.0, 0.0, 0.5);
|
|
elseif (skillCostType == 2) then
|
|
statusBar:SetStatusBarColor(0.75, 0.75, 0.0, 0.5);
|
|
statusBarBackground:SetVertexColor(0.75, 0.75, 0.0, 0.5);
|
|
statusBarFillBar:SetVertexColor(1.0, 1.0, 0.0, 0.5);
|
|
elseif (skillCostType == 3) then
|
|
statusBar:SetStatusBarColor(0.75, 0.0, 0.0, 0.5);
|
|
statusBarBackground:SetVertexColor(0.75, 0.0, 0.0, 0.5);
|
|
statusBarFillBar:SetVertexColor(1.0, 0.0, 0.0, 0.5);
|
|
else
|
|
statusBar:SetStatusBarColor(0.5, 0.5, 0.5, 0.5);
|
|
statusBarBackground:SetVertexColor(0.5, 0.5, 0.5, 0.5);
|
|
statusBarFillBar:SetVertexColor(1.0, 1.0, 1.0, 0.5);
|
|
end
|
|
|
|
-- Default width
|
|
skillRankFrameWidth = 256;
|
|
|
|
statusBarName:SetText(skillName);
|
|
|
|
-- Show and hide skill up arrows
|
|
if ( stepCost ) then
|
|
-- If is a learnable skill
|
|
-- Set cost, text, and color
|
|
statusBar:SetMinMaxValues(0, 1);
|
|
statusBar:SetValue(0);
|
|
statusBar:SetStatusBarColor(0.25, 0.25, 0.25);
|
|
statusBarBackground:SetVertexColor(0.75, 0.75, 0.75, 0.5);
|
|
statusBarName:SetFormattedText(LEARN_SKILL_TEMPLATE,skillName);
|
|
statusBarName:ClearAllPoints();
|
|
statusBarName:SetPoint("LEFT", statusBar, "LEFT", 15, 1);
|
|
statusBarSkillRank:SetText("");
|
|
|
|
-- If skill is too high level
|
|
if ( UnitLevel("player") < minLevel ) then
|
|
statusBar:SetValue(0);
|
|
statusBarSkillRank:SetFormattedText(LEVEL_GAINED,minLevel);
|
|
statusBarSkillRank:ClearAllPoints();
|
|
statusBarSkillRank:SetPoint("RIGHT", "SkillDetailStatusBar", "RIGHT",-13, 0);
|
|
statusBarSkillRank:SetJustifyH("RIGHT");
|
|
statusBarName:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
|
|
statusBarSkillRank:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
|
|
return;
|
|
end
|
|
|
|
elseif ( rankCost or (numTempPoints > 0) ) then
|
|
-- If is a skill that can be trained up
|
|
if ( not rankCost ) then
|
|
rankCost = 0;
|
|
end
|
|
|
|
statusBarName:SetText(skillName);
|
|
|
|
-- Setwidth value
|
|
skillRankFrameWidth = 215;
|
|
else
|
|
-- Normal skill
|
|
statusBarName:SetText(skillName);
|
|
statusBar:SetStatusBarColor(0.0, 0.0, 1.0, 0.5);
|
|
statusBarBackground:SetVertexColor(0.0, 0.0, 0.75, 0.5);
|
|
end
|
|
|
|
if ( skillMaxRank == 1 ) then
|
|
-- If max rank in a skill is 1 assume that its a proficiency
|
|
statusBar:SetMinMaxValues(0, 1);
|
|
statusBar:SetValue(1);
|
|
statusBar:SetStatusBarColor(0.5, 0.5, 0.5);
|
|
statusBarSkillRank:SetText("");
|
|
statusBarBackground:SetVertexColor(1.0, 1.0, 1.0, 0.5);
|
|
elseif ( skillMaxRank > 0 ) then
|
|
statusBar:SetMinMaxValues(0, skillMaxRank);
|
|
statusBar:SetValue(skillRankStart);
|
|
if (numTempPoints > 0) then
|
|
local fillBarWidth = (skillRank / skillMaxRank) * statusBar:GetWidth();
|
|
statusBarFillBar:SetPoint("TOPRIGHT", statusBarLabel, "TOPLEFT", fillBarWidth, 0);
|
|
statusBarFillBar:Show();
|
|
else
|
|
statusBarFillBar:Hide();
|
|
end
|
|
if ( skillModifier == 0 ) then
|
|
statusBarSkillRank:SetText(skillRank.."/"..skillMaxRank);
|
|
else
|
|
local color = RED_FONT_COLOR_CODE;
|
|
if ( skillModifier > 0 ) then
|
|
color = GREEN_FONT_COLOR_CODE.."+"
|
|
end
|
|
statusBarSkillRank:SetText(skillRank.." ("..color..skillModifier..FONT_COLOR_CODE_CLOSE..")/"..skillMaxRank);
|
|
end
|
|
end
|
|
end
|
|
|
|
function SkillDetailFrame_SetStatusBar(skillIndex, adjustedSkillPoints)
|
|
-- Get info
|
|
local skillName, header, isExpanded, skillRank, numTempPoints, skillModifier, skillMaxRank, isAbandonable, stepCost, rankCost, minLevel, skillCostType, skillDescription = GetSkillLineInfo(skillIndex);
|
|
local skillRankStart = skillRank;
|
|
skillRank = skillRank + numTempPoints;
|
|
|
|
-- Skill bar objects
|
|
local statusBar = _G["SkillDetailStatusBar"];
|
|
local statusBarBackground = _G["SkillDetailStatusBarBackground"];
|
|
local statusBarSkillRank = _G["SkillDetailStatusBarSkillRank"];
|
|
local statusBarName = _G["SkillDetailStatusBarSkillName"];
|
|
local statusBarUnlearnButton = _G["SkillDetailStatusBarUnlearnButton"];
|
|
local statusBarLeftArrow = _G["SkillDetailStatusBarLeftArrow"];
|
|
local statusBarRightArrow = _G["SkillDetailStatusBarRightArrow"];
|
|
local statusBarLearnSkillButton = _G["SkillDetailStatusBarLearnSkillButton"];
|
|
local statusBarFillBar = _G["SkillDetailStatusBarFillBar"];
|
|
|
|
-- Frame width vars
|
|
local skillRankFrameWidth = 0;
|
|
|
|
-- Hide or show skill bar
|
|
if ( not skillName or skillName == "" ) then
|
|
statusBar:Hide();
|
|
SkillDetailDescriptionText:Hide();
|
|
return;
|
|
else
|
|
statusBar:Show();
|
|
SkillDetailDescriptionText:Show();
|
|
end
|
|
|
|
-- Hide or show abandon button
|
|
if ( isAbandonable ) then
|
|
statusBarUnlearnButton:Show();
|
|
statusBarUnlearnButton.skillName = skillName;
|
|
statusBarUnlearnButton.index = skillIndex;
|
|
else
|
|
statusBarUnlearnButton:Hide();
|
|
end
|
|
|
|
-- Set skillbar info
|
|
statusBar.skillIndex = skillIndex;
|
|
statusBarName:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b);
|
|
statusBarSkillRank:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
|
|
statusBarSkillRank:ClearAllPoints();
|
|
statusBarSkillRank:SetPoint("LEFT", "SkillDetailStatusBarSkillName", "RIGHT", 13, 0);
|
|
statusBarSkillRank:SetJustifyH("LEFT");
|
|
|
|
-- Hide the learn skill button by default
|
|
statusBarLearnSkillButton:Hide();
|
|
|
|
-- Anchor the text to the left by default
|
|
statusBarName:ClearAllPoints();
|
|
statusBarName:SetPoint("LEFT", statusBar, "LEFT", 6, 1);
|
|
|
|
-- Set bar color depending on skill cost
|
|
local skillType = "";
|
|
if (skillCostType == 1) then
|
|
statusBar:SetStatusBarColor(0.0, 0.75, 0.0, 0.5);
|
|
statusBarBackground:SetVertexColor(0.0, 0.75, 0.0, 0.5);
|
|
statusBarFillBar:SetVertexColor(0.0, 1.0, 0.0, 0.5);
|
|
elseif (skillCostType == 2) then
|
|
statusBar:SetStatusBarColor(0.75, 0.75, 0.0, 0.5);
|
|
statusBarBackground:SetVertexColor(0.75, 0.75, 0.0, 0.5);
|
|
statusBarFillBar:SetVertexColor(1.0, 1.0, 0.0, 0.5);
|
|
elseif (skillCostType == 3) then
|
|
statusBar:SetStatusBarColor(0.75, 0.0, 0.0, 0.5);
|
|
statusBarBackground:SetVertexColor(0.75, 0.0, 0.0, 0.5);
|
|
statusBarFillBar:SetVertexColor(1.0, 0.0, 0.0, 0.5);
|
|
-- skillType = "Tertiary Skill:";
|
|
end
|
|
|
|
-- Set skill description text
|
|
SkillDetailDescriptionText:SetFormattedText(SKILL_DESCRIPTION,skillType,skillDescription);
|
|
|
|
-- Default width
|
|
skillRankFrameWidth = 256;
|
|
|
|
-- Show and hide skill up arrows
|
|
if ( stepCost ) then
|
|
-- If is a learnable skill
|
|
-- Color red or green depending on if its affordable or not
|
|
local color = RED_FONT_COLOR_CODE;
|
|
if ( adjustedSkillPoints >= stepCost ) then
|
|
color = GREEN_FONT_COLOR_CODE;
|
|
end
|
|
|
|
-- Set cost, text, and color
|
|
statusBar:SetMinMaxValues(0, 1);
|
|
statusBar:SetValue(1);
|
|
statusBar:SetStatusBarColor(0.0, 0.0, 1.0, 0.5);
|
|
statusBarName:SetFormattedText(LEARN_SKILL_TEMPLATE,skillName);
|
|
statusBarName:ClearAllPoints();
|
|
statusBarName:SetPoint("CENTER", statusBar, "CENTER", 0, 1);
|
|
statusBarSkillRank:SetText("");
|
|
statusBarFillBar:Hide();
|
|
statusBarLearnSkillButton:Show();
|
|
statusBarLeftArrow:Hide();
|
|
statusBarRightArrow:Hide();
|
|
|
|
-- Set skill learnable cost text
|
|
if ( stepCost == 1 ) then
|
|
SkillDetailCostText:SetFormattedText(SKILL_LEARNING_COST_SINGULAR,color,stepCost);
|
|
else
|
|
SkillDetailCostText:SetFormattedText(SKILL_LEARNING_COST,color,stepCost);
|
|
end
|
|
SkillDetailCostText:Show();
|
|
|
|
-- If skill is too high level
|
|
if ( UnitLevel("player") < minLevel ) then
|
|
statusBar:SetValue(0);
|
|
statusBarSkillRank:SetFormattedText(LEVEL_GAINED,minLevel);
|
|
statusBarSkillRank:ClearAllPoints();
|
|
statusBarSkillRank:SetPoint("RIGHT", "SkillDetailStatusBar", "RIGHT",-13, 0);
|
|
statusBarSkillRank:SetJustifyH("RIGHT");
|
|
statusBarName:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
|
|
statusBarSkillRank:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
|
|
statusBarLeftArrow:Hide();
|
|
statusBarRightArrow:Hide();
|
|
return;
|
|
end
|
|
|
|
elseif ( rankCost or (numTempPoints > 0) ) then
|
|
-- If is a skill that can be trained up
|
|
if ( not rankCost ) then
|
|
rankCost = 0;
|
|
end
|
|
|
|
statusBarLeftArrow:Show();
|
|
statusBarRightArrow:Show();
|
|
|
|
-- Color red or green depending on if its affordable or not
|
|
local color = RED_FONT_COLOR_CODE;
|
|
if ( adjustedSkillPoints >= rankCost ) then
|
|
color = GREEN_FONT_COLOR_CODE;
|
|
end
|
|
|
|
-- Set skill increment cost text
|
|
if ( skillRank == skillMaxRank ) then
|
|
color = "|cff888888";
|
|
end
|
|
if ( rankCost == 1 ) then
|
|
SkillDetailCostText:SetFormattedText(SKILL_INCREMENT_COST_SINGULAR,color,rankCost);
|
|
else
|
|
SkillDetailCostText:SetFormattedText(SKILL_INCREMENT_COST,color,rankCost);
|
|
end
|
|
SkillDetailCostText:Show();
|
|
|
|
if ( numTempPoints > 0 ) then
|
|
statusBarLeftArrow:Enable();
|
|
else
|
|
statusBarLeftArrow:Disable();
|
|
end
|
|
if ( (adjustedSkillPoints >= rankCost) and (rankCost ~= 0) and (skillRank ~= skillMaxRank) ) then
|
|
statusBarRightArrow:Enable();
|
|
else
|
|
statusBarRightArrow:Disable();
|
|
end
|
|
|
|
statusBarName:SetText(skillName);
|
|
|
|
-- Setwidth value
|
|
skillRankFrameWidth = 215;
|
|
else
|
|
-- Normal skill
|
|
statusBarName:SetText(skillName);
|
|
statusBar:SetStatusBarColor(0.0, 0.0, 1.0, 0.5);
|
|
statusBarBackground:SetVertexColor(0.0, 0.0, 0.75, 0.5);
|
|
|
|
statusBarLeftArrow:Hide();
|
|
statusBarRightArrow:Hide();
|
|
|
|
SkillDetailCostText:Hide();
|
|
end
|
|
|
|
if ( SkillDetailCostText:IsShown() ) then
|
|
SkillDetailDescriptionText:SetPoint("TOP", "SkillDetailCostText", "BOTTOM", 0, -10 );
|
|
else
|
|
SkillDetailDescriptionText:SetPoint("TOP", "SkillDetailCostText", "TOP", 0, 0 );
|
|
end
|
|
|
|
if ( skillMaxRank == 1 ) then
|
|
-- If max rank in a skill is 1 assume that its a proficiency
|
|
statusBar:SetMinMaxValues(0, 1);
|
|
statusBar:SetValue(1);
|
|
statusBar:SetStatusBarColor(0.5, 0.5, 0.5);
|
|
statusBarSkillRank:SetText("");
|
|
statusBarBackground:SetVertexColor(1.0, 1.0, 1.0, 0.5);
|
|
statusBarLeftArrow:Hide();
|
|
statusBarRightArrow:Hide();
|
|
statusBarFillBar:Hide();
|
|
elseif ( skillMaxRank > 0 ) then
|
|
statusBar:SetMinMaxValues(0, skillMaxRank);
|
|
statusBar:SetValue(skillRankStart);
|
|
if (numTempPoints > 0) then
|
|
local fillBarWidth = (skillRank / skillMaxRank) * statusBar:GetWidth();
|
|
statusBarFillBar:SetPoint("TOPRIGHT", "SkillDetailStatusBar", "TOPLEFT", fillBarWidth, 0);
|
|
statusBarFillBar:Show();
|
|
else
|
|
statusBarFillBar:Hide();
|
|
end
|
|
if ( skillModifier == 0 ) then
|
|
statusBarSkillRank:SetText(skillRank.."/"..skillMaxRank);
|
|
else
|
|
local color = RED_FONT_COLOR_CODE;
|
|
if ( skillModifier > 0 ) then
|
|
color = GREEN_FONT_COLOR_CODE.."+"
|
|
end
|
|
statusBarSkillRank:SetText(skillRank.." ("..color..skillModifier..FONT_COLOR_CODE_CLOSE..")/"..skillMaxRank);
|
|
end
|
|
end
|
|
end
|
|
|
|
function SkillFrame_UpdateSkills()
|
|
local numSkills = GetNumSkillLines();
|
|
local adjustedSkillPoints = GetAdjustedSkillPoints();
|
|
local offset = FauxScrollFrame_GetOffset(SkillListScrollFrame) + 1;
|
|
local index = 1;
|
|
for i=offset, offset + SKILLS_TO_DISPLAY - 1 do
|
|
if ( i <= numSkills ) then
|
|
SkillFrame_SetStatusBar(index, i, numSkills, adjustedSkillPoints);
|
|
else
|
|
break;
|
|
end
|
|
index = index + 1;
|
|
end
|
|
|
|
-- Update the expand/collapse all button
|
|
SkillFrameCollapseAllButton.isExpanded = 1;
|
|
SkillFrameCollapseAllButton:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up");
|
|
for i=1, numSkills do
|
|
local temp, header, isExpanded = GetSkillLineInfo(i);
|
|
if ( header ) then
|
|
-- If one header is not expanded then set isExpanded to false and break
|
|
if ( not isExpanded ) then
|
|
SkillFrameCollapseAllButton.isExpanded = nil;
|
|
SkillFrameCollapseAllButton:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up");
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Hide unused bars
|
|
for i=index, SKILLS_TO_DISPLAY do
|
|
_G["SkillRankFrame"..i]:Hide();
|
|
_G["SkillTypeLabel"..i]:Hide();
|
|
end
|
|
|
|
local talentPoints, currSkillPoints = UnitCharacterPoints("player");
|
|
|
|
-- Update skill points
|
|
SkillFrame.UpdatedSkillPoints = GetAdjustedSkillPoints();
|
|
|
|
-- Update scrollFrame
|
|
FauxScrollFrame_Update(SkillListScrollFrame, numSkills, SKILLS_TO_DISPLAY, SKILLFRAME_SKILL_HEIGHT );
|
|
|
|
SkillDetailFrame_SetStatusBar(GetSelectedSkill(),adjustedSkillPoints)
|
|
end
|
|
|
|
function SkillBar_OnClick (self)
|
|
SkillFrame.statusBarClickedID = self:GetParent():GetID() + FauxScrollFrame_GetOffset(SkillListScrollFrame);
|
|
SetSelectedSkill(SkillFrame.statusBarClickedID);
|
|
SkillFrame.showSkillDetails = 1
|
|
SkillFrame_UpdateSkills();
|
|
end
|