local encounterIDs = select(2, ...) local currentEncounterID local itemButtons = {} local BACKDROP = { bgFile = [=[Interface\ChatFrame\ChatFrameBackground]=], tile = true, tileSize = 16, edgeFile = [=[Interface\Tooltips\UI-Tooltip-Border]=], edgeSize = 16, insets = {left = 4, right = 4, top = 4, bottom = 4} } local Container = CreateFrame('Frame', 'BonusRollPreviewContainer', BonusRollFrame) local Handle = CreateFrame('Button', 'BonusRollPreviewHandle', BonusRollFrame) local Hotspot = CreateFrame('Frame', nil, BonusRollFrame) local Buttons = CreateFrame('Frame', 'BonusRollPreviewSpecButtons', Hotspot) local function SpecButtonClick(self) SetLootSpecialization(self.specID) Buttons:Hide() BonusRollFrame.SpecIcon:SetDesaturated(false) end local function SpecButtonEnter(self) GameTooltip:SetOwner(self, 'ANCHOR_TOPRIGHT') GameTooltip:AddLine(self.name, 1, 1, 1) GameTooltip:Show() end local specButtons local function HotspotEnter() if(not Buttons:IsShown()) then if(not specButtons) then local numSpecs = GetNumSpecializations() for index = 1, numSpecs do local specID, name, _, texture = GetSpecializationInfo(index) local SpecButton = CreateFrame('Button', nil, Buttons) SpecButton:SetPoint('LEFT', index * 28, 0) SpecButton:SetSize(22, 22) SpecButton:SetScript('OnClick', SpecButtonClick) SpecButton:SetScript('OnEnter', SpecButtonEnter) SpecButton:SetScript('OnLeave', GameTooltip_Hide) SpecButton.specID = specID SpecButton.name = name local Icon = SpecButton:CreateTexture(nil, 'OVERLAY', nil, 1) Icon:SetAllPoints() Icon:SetTexture(texture) local Ring = SpecButton:CreateTexture(nil, 'OVERLAY', nil, 2) Ring:SetPoint('TOPLEFT', -6, 6) Ring:SetSize(58, 58) Ring:SetTexture([=[Interface\Minimap\Minimap-TrackingBorder]=]) end Buttons:SetSize(numSpecs * 28 + 34, 38) specButtons = true end BonusRollFrame.SpecIcon:SetDesaturated(true) Buttons:Show() end end local function HotspotLeave() if(not Buttons:IsMouseOver()) then BonusRollFrame.SpecIcon:SetDesaturated(false) Buttons:Hide() end end local function ButtonsLeave(self) local parent = GetMouseFocus():GetParent() if(not Hotspot:IsMouseOver() and not (parent and parent == self)) then BonusRollFrame.SpecIcon:SetDesaturated(false) self:Hide() end end local collapsed = true local function HandleClick() Handle:ClearAllPoints() if(collapsed) then if(BonusRollPreviewDB.position == 'BOTTOM') then Handle.Arrow:SetTexCoord(1/2, 1, 1, 1, 1/2, 0, 1, 0) Handle:SetPoint('BOTTOM', Container, 0, -14) else Handle.Arrow:SetTexCoord(1, 0, 1/2, 0, 1, 1, 1/2, 1) Handle:SetPoint('TOP', Container, 0, 14) end Container:Show() else if(BonusRollPreviewDB.position == 'BOTTOM') then Handle.Arrow:SetTexCoord(0, 0, 1/2, 0, 0, 1, 1/2, 1) Handle:SetPoint('TOP', BonusRollFrame, 'BOTTOM', 0, 2) else Handle.Arrow:SetTexCoord(1/2, 1, 0, 1, 1/2, 0, 0, 0) Handle:SetPoint('BOTTOM', BonusRollFrame, 'TOP', 0, -2) end Container:Hide() end collapsed = not collapsed end function Container:HandleUpdate() self:ClearAllPoints() if(BonusRollPreviewDB.position == 'BOTTOM') then self:SetPoint('TOP', BonusRollFrame, 'BOTTOM') Handle.Arrow:SetTexCoord(0, 0, 1/2, 0, 0, 1, 1/2, 1) Handle.TopCenter:Hide() Handle.TopRight:Hide() Handle.TopLeft:Hide() Handle.BottomCenter:Show() Handle.BottomRight:Show() Handle.BottomLeft:Show() else self:SetPoint('BOTTOM', BonusRollFrame, 'TOP') Handle.Arrow:SetTexCoord(1/2, 1, 0, 1, 1/2, 0, 0, 0) Handle.TopCenter:Show() Handle.TopRight:Show() Handle.TopLeft:Show() Handle.BottomCenter:Hide() Handle.BottomRight:Hide() Handle.BottomLeft:Hide() end self:Hide() collapsed = true end local function HookStartRoll() local specID = GetLootSpecialization() if(not specID or specID == 0) then SetLootSpecialization(GetSpecializationInfo(GetSpecialization())) end end local function ItemButtonUpdate(self, elapsed) if(IsModifiedClick('COMPAREITEMS') or (GetCVarBool('alwaysCompareItems') and not IsEquippedItem(self.itemID))) then GameTooltip_ShowCompareItem() else ShoppingTooltip1:Hide() ShoppingTooltip2:Hide() ShoppingTooltip3:Hide() end if(IsModifiedClick('DRESSUP')) then ShowInspectCursor() else ResetCursor() end end local function ItemButtonClick(self) HandleModifiedItemClick(self.itemLink) end local function ItemButtonEnter(self) GameTooltip:SetOwner(self, 'ANCHOR_TOPLEFT') GameTooltip:SetItemByID(self.itemID) self:SetScript('OnUpdate', ItemButtonUpdate) end local function ItemButtonLeave(self) GameTooltip:Hide() self:SetScript('OnUpdate', nil) end local function GetItemLine(index) local ItemButton = itemButtons[index] if(not ItemButton) then ItemButton = CreateFrame('Button', nil, Container.ScrollChild) ItemButton:SetPoint('TOPLEFT', 6, (index - 1) * -40) ItemButton:SetPoint('TOPRIGHT', -22, (index - 1) * -40) ItemButton:SetHeight(38) local Icon = ItemButton:CreateTexture(nil, 'BACKGROUND') Icon:SetPoint('TOPLEFT', 1, -1) Icon:SetSize(36, 36) ItemButton.Icon = Icon local Background = ItemButton:CreateTexture(nil, 'BORDER') Background:SetAllPoints() Background:SetTexture([[Interface\EncounterJournal\UI-EncounterJournalTextures]]) Background:SetTexCoord(0.00195313, 0.62890625, 0.61816406, 0.66210938) Background:SetDesaturated(true) local Name = ItemButton:CreateFontString(nil, 'ARTWORK', 'GameFontNormalMed3') Name:SetPoint('TOPLEFT', Icon, 'TOPRIGHT', 7, -4) Name:SetPoint('TOPRIGHT', -6, -4) Name:SetHeight(12) Name:SetJustifyH('LEFT') ItemButton.Name = Name local Class = ItemButton:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight') Class:SetPoint('BOTTOMRIGHT', -6, 5) Class:SetSize(0, 12) Class:SetJustifyH('RIGHT') ItemButton.Class = Class local Slot = ItemButton:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight') Slot:SetPoint('BOTTOMLEFT', Icon, 'BOTTOMRIGHT', 7, 4) Slot:SetPoint('BOTTOMRIGHT', Class, 'BOTTOMLEFT', -15, 0) Slot:SetSize(0, 12) Slot:SetJustifyH('LEFT') ItemButton.Slot = Slot ItemButton:SetScript('OnClick', ItemButtonClick) ItemButton:SetScript('OnEnter', ItemButtonEnter) ItemButton:SetScript('OnLeave', ItemButtonLeave) itemButtons[index] = ItemButton end return ItemButton end function Container:Populate() local numItems = 0 for index = 1, EJ_GetNumLoot() do local name, texture, slot, itemClass, itemID, itemLink, encounterID = EJ_GetLootInfoByIndex(index) if(encounterID == currentEncounterID) then numItems = numItems + 1 local ItemButton = GetItemLine(numItems) ItemButton.Icon:SetTexture(texture) ItemButton.Name:SetText(name) ItemButton.Slot:SetText(slot) ItemButton.Class:SetText(itemClass) ItemButton.itemID = itemID ItemButton.itemLink = itemLink ItemButton:Show() end end self:SetHeight(math.min(330, math.max(50, 10 + (numItems * 40)))) if(numItems > 0) then local height = (10 + (numItems * 40)) - self:GetHeight() self.Slider:SetMinMaxValues(0, height > 0 and height or 0) self.Slider:SetValue(0) if(numItems > 8) then self:EnableMouseWheel(true) self.Slider:Show() self.ScrollChild:SetWidth(286) else self:EnableMouseWheel(false) self.Slider:Hide() self.ScrollChild:SetWidth(302) end self.Empty:Hide() else self.Empty:Show() end if(EncounterJournal) then EncounterJournal:RegisterEvent('EJ_LOOT_DATA_RECIEVED') EncounterJournal:RegisterEvent('EJ_DIFFICULTY_UPDATE') end end function Container:Update() if(EncounterJournal) then EncounterJournal:UnregisterEvent('EJ_DIFFICULTY_UPDATE') end for index, button in next, itemButtons do button:Hide() end local _, _, difficulty = GetInstanceInfo() EJ_SetDifficulty(difficulty > 0 and difficulty or 4) local currentInstance = EJ_GetCurrentInstance() EJ_SelectInstance(currentInstance > 0 and currentInstance or 322) EJ_SelectEncounter(currentEncounterID) local _, _, classID = UnitClass('player') EJ_SetLootFilter(classID, GetLootSpecialization() or GetSpecializationInfo(GetSpecialization() or 0) or 0) self:Populate() end function Container:Initialize() collapsed = false HandleClick() Container:Update() end function Container:EJ_LOOT_DATA_RECIEVED(event) if(EncounterJournal) then EncounterJournal:UnregisterEvent(event) end self:Populate() end function Container:PLAYER_LOOT_SPEC_UPDATED(event) self:Update() end function Container:SPELL_CONFIRMATION_PROMPT(event, spellID, confirmType) if(confirmType == CONFIRMATION_PROMPT_BONUS_ROLL) then currentEncounterID = encounterIDs[spellID] if(currentEncounterID) then self:RegisterEvent('EJ_LOOT_DATA_RECIEVED') self:RegisterEvent('PLAYER_LOOT_SPEC_UPDATED') self:Initialize() else print('|cffff8080BonusRollPreview:|r Found an unknown spell [' .. spellID .. ']. Please report this!') end end end function Container:SPELL_CONFIRMATION_TIMEOUT() currentEncounterID = nil self:UnregisterEvent('EJ_LOOT_DATA_RECIEVED') self:UnregisterEvent('PLAYER_LOOT_SPEC_UPDATED') end function Container:PLAYER_LOGIN() if(BonusRollPreviewDB.position == 'BOTTOM') then self:SetPoint('TOP', BonusRollFrame, 'BOTTOM') Handle:SetPoint('TOP', BonusRollFrame, 'BOTTOM', 0, 2) else self:SetPoint('BOTTOM', BonusRollFrame, 'TOP') Handle:SetPoint('BOTTOM', BonusRollFrame, 'TOP', 0, -2) end local ScrollChild = CreateFrame('Frame', nil, self) ScrollChild:SetHeight(1) -- Completely ignores this value, bug? self.ScrollChild = ScrollChild local Scroll = CreateFrame('ScrollFrame', nil, self) Scroll:SetPoint('TOPLEFT', 0, -6) Scroll:SetPoint('BOTTOMRIGHT', 0, 6) Scroll:SetScrollChild(ScrollChild) self:SetWidth(286) self:SetFrameLevel(self:GetParent():GetFrameLevel() - 2) self:SetBackdrop(BACKDROP) self:SetBackdropColor(0, 0, 0, 0.8) self:SetBackdropBorderColor(2/3, 2/3, 2/3) self:EnableMouseWheel(true) local Slider = CreateFrame('Slider', nil, Scroll) Slider:SetPoint('TOPRIGHT', -5, -16) Slider:SetPoint('BOTTOMRIGHT', -5, 14) Slider:SetWidth(16) Slider:SetFrameLevel(self:GetFrameLevel() + 10) Slider:SetThumbTexture([=[Interface\Buttons\UI-ScrollBar-Knob]=]) self.Slider = Slider local Thumb = Slider:GetThumbTexture() Thumb:SetSize(16, 24) Thumb:SetTexCoord(1/4, 3/4, 1/8, 7/8) local Up = CreateFrame('Button', nil, Slider) Up:SetPoint('BOTTOM', Slider, 'TOP') Up:SetSize(16, 16) Up:SetNormalTexture([=[Interface\Buttons\UI-ScrollBar-ScrollUpButton-Up]=]) Up:SetDisabledTexture([=[Interface\Buttons\UI-ScrollBar-ScrollUpButton-Disabled]=]) Up:SetHighlightTexture([=[Interface\Buttons\UI-ScrollBar-ScrollUpButton-Highlight]=]) Up:GetNormalTexture():SetTexCoord(1/4, 3/4, 1/4, 3/4) Up:GetDisabledTexture():SetTexCoord(1/4, 3/4, 1/4, 3/4) Up:GetHighlightTexture():SetTexCoord(1/4, 3/4, 1/4, 3/4) Up:GetHighlightTexture():SetBlendMode('ADD') Up:SetScript('OnClick', function() Slider:SetValue(Slider:GetValue() - Slider:GetHeight() / 3) end) local Down = CreateFrame('Button', nil, Slider) Down:SetPoint('TOP', Slider, 'BOTTOM') Down:SetSize(16, 16) Down:SetScript('OnClick', ScrollClick) Down:SetNormalTexture([=[Interface\Buttons\UI-ScrollBar-ScrollDownButton-Up]=]) Down:SetDisabledTexture([=[Interface\Buttons\UI-ScrollBar-ScrollDownButton-Disabled]=]) Down:SetHighlightTexture([=[Interface\Buttons\UI-ScrollBar-ScrollDownButton-Highlight]=]) Down:GetNormalTexture():SetTexCoord(1/4, 3/4, 1/4, 3/4) Down:GetDisabledTexture():SetTexCoord(1/4, 3/4, 1/4, 3/4) Down:GetHighlightTexture():SetTexCoord(1/4, 3/4, 1/4, 3/4) Down:GetHighlightTexture():SetBlendMode('ADD') Down:SetScript('OnClick', function() Slider:SetValue(Slider:GetValue() + Slider:GetHeight() / 3) end) Slider:SetScript('OnValueChanged', function(self, value) local min, max = self:GetMinMaxValues() if(value == min) then Up:Disable() else Up:Enable() end if(value == max) then Down:Disable() else Down:Enable() end local Parent = self:GetParent() Parent:SetVerticalScroll(value) ScrollChild:SetPoint('TOP', 0, value) end) Scroll:SetScript('OnMouseWheel', function(self, alpha) if(alpha > 0) then Slider:SetValue(Slider:GetValue() - Slider:GetHeight() / 3) else Slider:SetValue(Slider:GetValue() + Slider:GetHeight() / 3) end end) local Empty = self:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight') Empty:SetPoint('CENTER') Empty:SetText('This encounter has no possible items for\nyour current class and/or specialization.') self.Empty = Empty Handle:SetSize(64, 16) Handle:SetNormalTexture([=[Interface\RaidFrame\RaidPanel-Toggle]=]) Handle:SetScript('OnClick', HandleClick) Handle.Arrow = Handle:GetNormalTexture() local HandleBackground = Handle:CreateTexture(nil, 'BACKGROUND') HandleBackground:SetAllPoints() HandleBackground:SetTexture(0, 0, 0, 0.8) local TopCenter = Handle:CreateTexture(nil, 'BORDER') TopCenter:SetPoint('TOP', 0, 4.5) TopCenter:SetSize(24, 12) TopCenter:SetTexture([=[Interface\RaidFrame\RaidPanel-UpperMiddle]=]) Handle.TopCenter = TopCenter local TopRight = Handle:CreateTexture(nil, 'BORDER') TopRight:SetPoint('TOPRIGHT', 4, 4) TopRight:SetSize(24, 20) TopRight:SetTexture([=[Interface\RaidFrame\RaidPanel-UpperRight]=]) TopRight:SetTexCoord(0, 1, 0, 0.8) Handle.TopRight = TopRight local TopLeft = Handle:CreateTexture(nil, 'BORDER') TopLeft:SetPoint('TOPLEFT', -4, 4) TopLeft:SetSize(24, 20) TopLeft:SetTexture([=[Interface\RaidFrame\RaidPanel-UpperLeft]=]) TopLeft:SetTexCoord(0, 1, 0, 0.8) Handle.TopLeft = TopLeft local BottomCenter = Handle:CreateTexture(nil, 'BORDER') BottomCenter:SetPoint('BOTTOM', 0, -9) BottomCenter:SetSize(24, 12) BottomCenter:SetTexture([=[Interface\RaidFrame\RaidPanel-BottomMiddle]=]) Handle.BottomCenter = BottomCenter local BottomRight = Handle:CreateTexture(nil, 'BORDER') BottomRight:SetPoint('BOTTOMRIGHT', 4, -6) BottomRight:SetSize(24, 22) BottomRight:SetTexture([=[Interface\RaidFrame\RaidPanel-BottomRight]=]) BottomRight:SetTexCoord(0, 1, 0.1, 1) Handle.BottomRight = BottomRight local BottomLeft = Handle:CreateTexture(nil, 'BORDER') BottomLeft:SetPoint('BOTTOMLEFT', -4, -6) BottomLeft:SetSize(24, 22) BottomLeft:SetTexture([=[Interface\RaidFrame\RaidPanel-BottomLeft]=]) BottomLeft:SetTexCoord(0, 1, 0.1, 1) Handle.BottomLeft = BottomLeft self:HandleUpdate() Hotspot:SetAllPoints(BonusRollFrame.SpecIcon) Hotspot:SetScript('OnEnter', HotspotEnter) Hotspot:SetScript('OnLeave', HotspotLeave) Buttons:SetPoint('LEFT', 4, 4) Buttons:SetScript('OnLeave', ButtonsLeave) self:RegisterEvent('SPELL_CONFIRMATION_PROMPT') self:RegisterEvent('SPELL_CONFIRMATION_TIMEOUT') hooksecurefunc('BonusRollFrame_StartBonusRoll', HookStartRoll) end Container:SetScript('OnEvent', function(self, event, ...) self[event](self, event, ...) end)