diff --git a/modules/PlayerInfo.lua b/modules/PlayerInfo.lua index 73d12bf..e10322c 100644 --- a/modules/PlayerInfo.lua +++ b/modules/PlayerInfo.lua @@ -1,6 +1,13 @@ local AceOO = AceLibrary("AceOO-2.0") local PlayerInfo = AceOO.Class(IceTargetInfo) +local EPSILON = 0.5 + +PlayerInfo.prototype.mainHandEnchantTimeSet = 0 +PlayerInfo.prototype.mainHandEnchantEndTime = 0 +PlayerInfo.prototype.offHandEnchantTimeSet = 0 +PlayerInfo.prototype.offHandEnchantEndTime = 0 + -- Constructor -- function PlayerInfo.prototype:init() PlayerInfo.super.prototype.init(self, "PlayerInfo", "player") @@ -73,6 +80,8 @@ function PlayerInfo.prototype:Enable(core) if (self.moduleSettings.hideBlizz) then self:HideBlizz() end + + self:ScheduleRepeatingEvent(self.elementName, self.UpdateBuffs, 1, self, self.unit, true) end function PlayerInfo.prototype:ShowBlizz() @@ -88,5 +97,73 @@ function PlayerInfo.prototype:HideBlizz() BuffFrame:UnregisterAllEvents() end +function PlayerInfo.prototype:UpdateBuffs(unit, fromRepeated) + if unit and unit ~= self.unit then + return + end + + if not fromRepeated then + PlayerInfo.super.prototype.UpdateBuffs(self) + end + + local startingNum = 0 + + for i=1, IceCore.BuffLimit do + if not self.frame.buffFrame.buffs[i]:IsVisible() + or self.frame.buffFrame.buffs[i].type == "mh" + or self.frame.buffFrame.buffs[i].type == "oh" then + startingNum = i + break + end + end + + local hasMainHandEnchant, mainHandExpiration, mainHandCharges, + hasOffHandEnchant, offHandExpiration, offHandCharges + = GetWeaponEnchantInfo() + + if hasMainHandEnchant or hasOffHandEnchant then + local CurrTime = GetTime() + + if hasMainHandEnchant then + if self.mainHandEnchantEndTime == 0 or + abs(self.mainHandEnchantEndTime - (mainHandExpiration/1000)) > CurrTime - self.mainHandEnchantTimeSet + EPSILON then + self.mainHandEnchantEndTime = mainHandExpiration/1000 + self.mainHandEnchantTimeSet = CurrTime + end + + self:SetUpBuff(startingNum, + GetInventoryItemTexture(self.unit, GetInventorySlotInfo("MainHandSlot")), + self.mainHandEnchantEndTime, + CurrTime + (mainHandExpiration/1000), + true, + mainHandCharges, + "mh") + + startingNum = startingNum + 1 + end + + if hasOffHandEnchant then + if self.offHandEnchantEndTime == 0 or + abs(self.offHandEnchantEndTime - (offHandExpiration/1000)) > abs(CurrTime - self.offHandEnchantTimeSet) + EPSILON then + self.offHandEnchantEndTime = offHandExpiration/1000 + self.offHandEnchantTimeSet = CurrTime + end + + self:SetUpBuff(startingNum, + GetInventoryItemTexture(self.unit, GetInventorySlotInfo("SecondaryHandSlot")), + self.offHandEnchantEndTime, + CurrTime + (offHandExpiration/1000), + true, + offHandCharges, + "oh") + + startingNum = startingNum + 1 + end + + local direction = self.moduleSettings.buffGrowDirection == "Left" and -1 or 1 + self.frame.buffFrame.buffs = self:CreateIconFrames(self.frame.buffFrame, direction, self.frame.buffFrame.buffs, "buff") + end +end + -- Load us up IceHUD.PlayerInfo = PlayerInfo:new() diff --git a/modules/TargetInfo.lua b/modules/TargetInfo.lua index 201a933..a5fd59f 100644 --- a/modules/TargetInfo.lua +++ b/modules/TargetInfo.lua @@ -958,7 +958,7 @@ function IceTargetInfo.prototype:CreateIconFrames(parent, direction, buffs, type buffs[i].id = i if (self.moduleSettings.mouseBuff) then buffs[i]:EnableMouse(true) - buffs[i]:SetScript("OnEnter", function() self:BuffOnEnter(type) end) + buffs[i]:SetScript("OnEnter", function() self:BuffOnEnter(buffs[i].type or type) end) buffs[i]:SetScript("OnLeave", function() GameTooltip:Hide() end) else buffs[i]:EnableMouse(false) @@ -1004,38 +1004,7 @@ function IceTargetInfo.prototype:UpdateBuffs() end if (buffTexture) then - self.frame.buffFrame.buffs[i].icon.texture:SetTexture(buffTexture) - self.frame.buffFrame.buffs[i].icon.texture:SetTexCoord(zoom, 1-zoom, zoom, 1-zoom) - - local alpha = buffTexture and 0.5 or 0 - self.frame.buffFrame.buffs[i].texture:SetTexture(0, 0, 0, alpha) - - -- cooldown frame - if (buffDuration and buffDuration > 0 and - buffTimeLeft and buffTimeLeft > 0) then - local start - if IceHUD.WowVer >= 30000 then - -- in wotlk, the "bufftimeleft" parameter is actually the ending time for the buff - start = buffTimeLeft - buffDuration - else - start = GetTime() - buffDuration + buffTimeLeft - end - self.frame.buffFrame.buffs[i].cd:SetCooldown(start, buffDuration) - self.frame.buffFrame.buffs[i].cd:Show() - else - self.frame.buffFrame.buffs[i].cd:Hide() - end - - self.frame.buffFrame.buffs[i].fromPlayer = isFromMe - - if (buffApplications and (buffApplications > 1)) then - self.frame.buffFrame.buffs[i].icon.stack:SetText(buffApplications) - else - self.frame.buffFrame.buffs[i].icon.stack:SetText(nil) - end - - - self.frame.buffFrame.buffs[i]:Show() + self:SetUpBuff(i, buffTexture, buffDuration, buffTimeLeft, isFromMe, buffApplications) else self.frame.buffFrame.buffs[i]:Hide() end @@ -1096,6 +1065,38 @@ function IceTargetInfo.prototype:UpdateBuffs() end +function IceTargetInfo.prototype:SetUpBuff(i, buffTexture, buffDuration, buffTimeLeft, isFromMe, buffApplications, buffType) + local zoom = self.moduleSettings.zoom + + self.frame.buffFrame.buffs[i].type = buffType + self.frame.buffFrame.buffs[i].icon.texture:SetTexture(buffTexture) + self.frame.buffFrame.buffs[i].icon.texture:SetTexCoord(zoom, 1-zoom, zoom, 1-zoom) + + local alpha = buffTexture and 0.5 or 0 + self.frame.buffFrame.buffs[i].texture:SetTexture(0, 0, 0, alpha) + + -- cooldown frame + if (buffDuration and buffDuration > 0 and + buffTimeLeft and buffTimeLeft > 0) then + local start = buffTimeLeft - buffDuration + self.frame.buffFrame.buffs[i].cd:SetCooldown(start, buffDuration) + self.frame.buffFrame.buffs[i].cd:Show() + else + self.frame.buffFrame.buffs[i].cd:Hide() + end + + self.frame.buffFrame.buffs[i].fromPlayer = isFromMe + + if (buffApplications and (buffApplications > 1)) then + self.frame.buffFrame.buffs[i].icon.stack:SetText(buffApplications) + else + self.frame.buffFrame.buffs[i].icon.stack:SetText(nil) + end + + self.frame.buffFrame.buffs[i]:Show() +end + + function IceTargetInfo.prototype:AuraChanged(unit) if (unit == self.unit) then @@ -1310,6 +1311,8 @@ function IceTargetInfo.prototype:BuffOnEnter(type) GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT") if (type == "buff") then GameTooltip:SetUnitBuff(self.unit, this.id) + elseif (type == "mh" or type == "oh") then + GameTooltip:SetInventoryItem("player", type == "mh" and GetInventorySlotInfo("MainHandSlot") or GetInventorySlotInfo("SecondaryHandSlot")) else GameTooltip:SetUnitDebuff(self.unit, this.id) end