You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
363 lines
12 KiB
363 lines
12 KiB
-- *****************************************************************************************************
|
|
-- ***** ITEM FUNCTIONS
|
|
-- *****************************************************************************************************
|
|
local function OnRelease(framePool, frame)
|
|
frame:Hide();
|
|
frame:ClearAllPoints();
|
|
frame:SetParent(nil);
|
|
end
|
|
|
|
local g_questObjectiveItemPool = CreateFramePool("BUTTON", nil, "KT_QuestObjectiveItemButtonTemplate", OnRelease);
|
|
function KT_QuestObjectiveItem_AcquireButton(parent)
|
|
local itemButton = g_questObjectiveItemPool:Acquire();
|
|
itemButton:SetParent(parent);
|
|
|
|
return itemButton;
|
|
end
|
|
|
|
function KT_QuestObjectiveItem_ReleaseButton(button)
|
|
g_questObjectiveItemPool:Release(button);
|
|
end
|
|
|
|
function KT_QuestObjectiveItem_Initialize(itemButton, questLogIndex)
|
|
local link, item, charges, showItemWhenComplete = GetQuestLogSpecialItemInfo(questLogIndex);
|
|
itemButton:SetID(questLogIndex);
|
|
itemButton.charges = charges;
|
|
itemButton.rangeTimer = -1;
|
|
SetItemButtonTexture(itemButton, item);
|
|
SetItemButtonCount(itemButton, charges);
|
|
KT_QuestObjectiveItem_UpdateCooldown(itemButton);
|
|
end
|
|
|
|
function KT_QuestObjectiveItem_OnLoad(self)
|
|
self:RegisterForClicks("AnyUp");
|
|
end
|
|
|
|
function KT_QuestObjectiveItem_OnEvent(self, event, ...)
|
|
if ( event == "PLAYER_TARGET_CHANGED" ) then
|
|
self.rangeTimer = -1;
|
|
elseif ( event == "BAG_UPDATE_COOLDOWN" ) then
|
|
KT_QuestObjectiveItem_UpdateCooldown(self);
|
|
end
|
|
end
|
|
|
|
function KT_QuestObjectiveItem_OnUpdate(self, elapsed)
|
|
-- Handle range indicator
|
|
local rangeTimer = self.rangeTimer;
|
|
if ( rangeTimer ) then
|
|
rangeTimer = rangeTimer - elapsed;
|
|
if ( rangeTimer <= 0 ) then
|
|
local link, item, charges, showItemWhenComplete = GetQuestLogSpecialItemInfo(self:GetID());
|
|
if ( not charges or charges ~= self.charges ) then
|
|
KT_ObjectiveTracker_Update(KT_OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST);
|
|
return;
|
|
end
|
|
local count = self.HotKey;
|
|
local valid = IsQuestLogSpecialItemInRange(self:GetID());
|
|
if ( valid == 0 ) then
|
|
count:Show();
|
|
count:SetVertexColor(1.0, 0.1, 0.1);
|
|
elseif ( valid == 1 ) then
|
|
count:Show();
|
|
count:SetVertexColor(0.6, 0.6, 0.6);
|
|
else
|
|
count:Hide();
|
|
end
|
|
rangeTimer = TOOLTIP_UPDATE_TIME;
|
|
end
|
|
|
|
self.rangeTimer = rangeTimer;
|
|
end
|
|
end
|
|
|
|
function KT_QuestObjectiveItem_OnShow(self)
|
|
self:RegisterEvent("PLAYER_TARGET_CHANGED");
|
|
self:RegisterEvent("BAG_UPDATE_COOLDOWN");
|
|
end
|
|
|
|
function KT_QuestObjectiveItem_OnHide(self)
|
|
self:UnregisterEvent("PLAYER_TARGET_CHANGED");
|
|
self:UnregisterEvent("BAG_UPDATE_COOLDOWN");
|
|
end
|
|
|
|
function KT_QuestObjectiveItem_OnEnter(self)
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
|
GameTooltip:SetQuestLogSpecialItem(self:GetID());
|
|
end
|
|
|
|
function KT_QuestObjectiveItem_OnClick(self, button)
|
|
if ( IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() ) then
|
|
local link, item, charges, showItemWhenComplete = GetQuestLogSpecialItemInfo(self:GetID());
|
|
if ( link ) then
|
|
ChatEdit_InsertLink(link);
|
|
end
|
|
else
|
|
UseQuestLogSpecialItem(self:GetID());
|
|
end
|
|
end
|
|
|
|
function KT_QuestObjectiveItem_UpdateCooldown(itemButton)
|
|
local start, duration, enable = GetQuestLogSpecialItemCooldown(itemButton:GetID());
|
|
if ( start ) then
|
|
CooldownFrame_Set(itemButton.Cooldown, start, duration, enable);
|
|
if ( duration > 0 and enable == 0 ) then
|
|
SetItemButtonTextureVertexColor(itemButton, 0.4, 0.4, 0.4);
|
|
else
|
|
SetItemButtonTextureVertexColor(itemButton, 1, 1, 1);
|
|
end
|
|
end
|
|
end
|
|
|
|
local g_questFindGroupButtonPool = CreateFramePool("BUTTON", nil, "KT_QuestObjectiveFindGroupButtonTemplate", OnRelease);
|
|
function KT_QuestObjectiveFindGroup_AcquireButton(parent, questID)
|
|
local button = g_questFindGroupButtonPool:Acquire();
|
|
button:SetParent(parent);
|
|
button.questID = questID;
|
|
|
|
return button;
|
|
end
|
|
|
|
function KT_QuestObjectiveFindGroup_ReleaseButton(self)
|
|
self.questID = nil;
|
|
g_questFindGroupButtonPool:Release(self);
|
|
end
|
|
|
|
function KT_QuestObjectiveFindGroup_OnMouseDown(self)
|
|
if self:IsEnabled() then
|
|
self.Icon:SetPoint("CENTER", self, "CENTER", -2, -1);
|
|
end
|
|
end
|
|
|
|
function KT_QuestObjectiveFindGroup_OnMouseUp(self)
|
|
if self:IsEnabled() then
|
|
self.Icon:SetPoint("CENTER", self, "CENTER", -1, 0);
|
|
end
|
|
end
|
|
|
|
function KT_QuestObjectiveFindGroup_OnEnter(self)
|
|
GameTooltip:SetOwner(self);
|
|
GameTooltip:AddLine(TOOLTIP_TRACKER_FIND_GROUP_BUTTON, HIGHLIGHT_FONT_COLOR:GetRGB());
|
|
|
|
GameTooltip:Show();
|
|
end
|
|
|
|
function KT_QuestObjectiveFindGroup_OnLeave(self)
|
|
GameTooltip:Hide();
|
|
end
|
|
|
|
function KT_QuestObjectiveFindGroup_OnClick(self)
|
|
local isFromGreenEyeButton = true;
|
|
--We only want green eye button groups to display the create a group button if there are already groups there.
|
|
LFGListUtil_FindQuestGroup(self.questID, isFromGreenEyeButton);
|
|
end
|
|
|
|
function KT_QuestObjectiveSetupBlockButton_AddRightButton(block, button, buttonOffsetsTag)
|
|
if block.rightButton == button then
|
|
-- TODO: Fix for real, some event causes the findGroup button to get added twice (could happen for any button)
|
|
-- so it doesn't need to be reanchored another time
|
|
return;
|
|
end
|
|
|
|
button:ClearAllPoints();
|
|
|
|
if block.rightButton then
|
|
button:SetPoint("RIGHT", block.rightButton, "LEFT", -KT_ObjectiveTracker_GetPaddingBetweenButtons(block), 0);
|
|
else
|
|
button:SetPoint("TOPRIGHT", block, KT_ObjectiveTracker_GetButtonOffsets(block, buttonOffsetsTag));
|
|
end
|
|
|
|
button:Show();
|
|
|
|
block.rightButton = button;
|
|
block.lineWidth = block.lineWidth - button:GetWidth() - KT_ObjectiveTracker_GetPaddingBetweenButtons(block);
|
|
end
|
|
|
|
function KT_QuestObjectiveSetupBlockButton_FindGroup(block, questID)
|
|
-- Cache this off to avoid spurious calls to C_LFGList.CanCreateQuestGroup, for a given quest the result will not change until
|
|
-- completed, and when completed this world quest should no longer be on the tracker.
|
|
if block.hasGroupFinderButton == nil then
|
|
block.hasGroupFinderButton = C_LFGList.CanCreateQuestGroup(questID);
|
|
end
|
|
|
|
if block.hasGroupFinderButton then
|
|
local groupFinderButton = block.groupFinderButton;
|
|
if not groupFinderButton then
|
|
groupFinderButton = KT_QuestObjectiveFindGroup_AcquireButton(block, questID);
|
|
block.groupFinderButton = groupFinderButton;
|
|
end
|
|
|
|
KT_QuestObjectiveSetupBlockButton_AddRightButton(block, groupFinderButton, "groupFinder");
|
|
else
|
|
KT_QuestObjectiveReleaseBlockButton_FindGroup(block);
|
|
end
|
|
|
|
return block.hasGroupFinderButton;
|
|
end
|
|
|
|
function KT_QuestObjectiveReleaseBlockButton_FindGroup(block)
|
|
block.hasGroupFinderButton = nil;
|
|
|
|
if block.groupFinderButton then
|
|
KT_QuestObjectiveFindGroup_ReleaseButton(block.groupFinderButton);
|
|
block.groupFinderButton = nil;
|
|
end
|
|
end
|
|
|
|
function KT_QuestObjectiveSetupBlockButton_Item(block, questLogIndex, isQuestComplete)
|
|
local item, showItemWhenComplete, _;
|
|
if questLogIndex then
|
|
_, item, _, showItemWhenComplete = GetQuestLogSpecialItemInfo(questLogIndex);
|
|
end
|
|
|
|
local shouldShowItem = item and (not isQuestComplete or showItemWhenComplete);
|
|
|
|
if shouldShowItem then
|
|
local itemButton = block.itemButton;
|
|
if not itemButton then
|
|
itemButton = KT_QuestObjectiveItem_AcquireButton(block);
|
|
block.itemButton = itemButton;
|
|
end
|
|
|
|
KT_QuestObjectiveItem_Initialize(itemButton, questLogIndex);
|
|
KT_QuestObjectiveSetupBlockButton_AddRightButton(block, itemButton, "useItem");
|
|
else
|
|
KT_QuestObjectiveReleaseBlockButton_Item(block);
|
|
end
|
|
|
|
return shouldShowItem;
|
|
end
|
|
|
|
function KT_QuestObjectiveReleaseBlockButton_Item(block)
|
|
if block.itemButton then
|
|
KT_QuestObjectiveItem_ReleaseButton(block.itemButton);
|
|
block.itemButton = nil;
|
|
end
|
|
end
|
|
|
|
function KT_QuestObjective_SetupHeader(block, initialLineWidth)
|
|
block.rightButton = nil;
|
|
block.lineWidth = initialLineWidth or KT_OBJECTIVE_TRACKER_TEXT_WIDTH;
|
|
end
|
|
|
|
KT_BonusObjectiveRewardsFrameMixin = {};
|
|
|
|
function KT_BonusObjectiveRewardsFrameMixin:SetRewardData(data)
|
|
self.storedData = data;
|
|
end
|
|
|
|
function KT_BonusObjectiveRewardsFrameMixin:OnAnimateRewardDone()
|
|
local rewardsFrame = self;
|
|
-- kill the data
|
|
local oldPosIndex = self.storedData[rewardsFrame.id].posIndex;
|
|
self.storedData[rewardsFrame.id] = nil;
|
|
rewardsFrame.id = nil;
|
|
|
|
self:OnAnimateNextReward(rewardsFrame.module, oldPosIndex);
|
|
end
|
|
|
|
--[[
|
|
data = {
|
|
posIndex, -- position index of the block that awards frame is relevent to
|
|
rewards[] = {
|
|
count, -- how much of the reward is being granted
|
|
font, -- font for the reward name
|
|
label, -- item name of the reward
|
|
texture, -- item icon
|
|
overlay -- overlay icon (can be nil)
|
|
},
|
|
|
|
}
|
|
]]--
|
|
|
|
function KT_BonusObjectiveRewardsFrameMixin:AnimateReward(block, data)
|
|
self:AnimateRewardOnAnchor(block, data, block.id, block.module);
|
|
end
|
|
|
|
function KT_BonusObjectiveRewardsFrameMixin:AnimateRewardOnAnchor(anchor, data, id, trackerModule)
|
|
local rewardsFrame = self;
|
|
if ( not rewardsFrame.id ) then
|
|
if ( not data ) then
|
|
return;
|
|
end
|
|
if ( not self.storedData) then
|
|
self.storedData = { };
|
|
end
|
|
self.storedData[id] = data;
|
|
rewardsFrame.module = trackerModule;
|
|
|
|
if ( self.HeaderText ) then
|
|
self.Header:SetText(self.HeaderText);
|
|
end
|
|
|
|
rewardsFrame.id = id;
|
|
rewardsFrame:SetParent(anchor);
|
|
rewardsFrame:ClearAllPoints();
|
|
rewardsFrame:SetPoint("TOPRIGHT", anchor, "TOPLEFT", 10, -4);
|
|
rewardsFrame:Show();
|
|
local numRewards = #data.rewards;
|
|
local contentsHeight = 12 + numRewards * 36;
|
|
rewardsFrame.Anim.RewardsBottomAnim:SetOffset(0, -contentsHeight);
|
|
rewardsFrame.Anim.RewardsShadowAnim:SetScaleTo(0.8, contentsHeight / 16);
|
|
rewardsFrame.Anim:Play();
|
|
PlaySound(SOUNDKIT.UI_BONUS_EVENT_SYSTEM_VIGNETTES);
|
|
-- configure reward frames
|
|
for i = 1, numRewards do
|
|
local rewardItem = rewardsFrame.Rewards[i];
|
|
if ( not rewardItem ) then
|
|
rewardItem = CreateFrame("FRAME", nil, rewardsFrame, "KT_BonusObjectiveTrackerRewardTemplate");
|
|
rewardItem:SetPoint("TOPLEFT", rewardsFrame.Rewards[i-1], "BOTTOMLEFT", 0, -4);
|
|
end
|
|
local rewardData = data.rewards[i];
|
|
if ( rewardData.count > 1 ) then
|
|
rewardItem.Count:Show();
|
|
rewardItem.Count:SetText(rewardData.count);
|
|
else
|
|
rewardItem.Count:Hide();
|
|
end
|
|
rewardItem.Label:SetFontObject(rewardData.font);
|
|
rewardItem.Label:SetText(rewardData.label);
|
|
rewardItem.ItemIcon:SetTexture(rewardData.texture);
|
|
if ( rewardData.overlay ) then
|
|
rewardItem.ItemOverlay:SetTexture(rewardData.overlay);
|
|
rewardItem.ItemOverlay:Show();
|
|
else
|
|
rewardItem.ItemOverlay:Hide();
|
|
end
|
|
rewardItem:Show();
|
|
if( rewardItem.Anim:IsPlaying() ) then
|
|
rewardItem.Anim:Stop();
|
|
end
|
|
rewardItem.Anim:Play();
|
|
end
|
|
-- hide unused reward items
|
|
for i = numRewards + 1, #rewardsFrame.Rewards do
|
|
rewardsFrame.Rewards[i]:Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
function KT_BonusObjectiveRewardsFrameMixin:OnAnimateNextReward(trackerModule, oldPosIndex)
|
|
local rewardsFrame = self;
|
|
-- look for another reward to animate and fix positions
|
|
local nextAnimBlock;
|
|
for id, data in pairs(self.storedData) do
|
|
local block = trackerModule:GetExistingBlock(id);
|
|
-- make sure we're still showing this
|
|
if ( block ) then
|
|
nextAnimBlock = block;
|
|
-- If we have position data and if the block that completed was ahead of this, bring it up
|
|
if ( data.posIndex and oldPosIndex and data.posIndex > oldPosIndex ) then
|
|
data.posIndex = data.posIndex - 1;
|
|
end
|
|
end
|
|
end
|
|
-- update tracker to remove dead bonus objective
|
|
KT_ObjectiveTracker_Update(trackerModule.updateReasonModule);
|
|
-- animate if we have something, otherwise clear it all
|
|
if ( nextAnimBlock ) then
|
|
self:AnimateReward(nextAnimBlock, self.storedData[nextAnimBlock.id]);
|
|
else
|
|
rewardsFrame:Hide();
|
|
wipe(self.storedData);
|
|
end
|
|
end
|
|
|