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.

164 lines
4.2 KiB

local VUHDO_1_DIV_2_PI_MUL_108 = 108 / math.pi / 2;
local UnitIsUnit = UnitIsUnit;
local floor = floor;
local sOldButton;
local sOldDistance;
local sIsDeadOnly;
local sIsAlways;
local sIsDistanceText;
local sScale;
local VuhDoDirectionFrame;
local VuhDoDirectionFrameArrow;
local VuhDoDirectionFrameText;
local VUHDO_setMapToCurrentZone;
local VUHDO_getDistanceBetween;
local VUHDO_getUnitDirection;
local VUHDO_RAID = { };
function VUHDO_directionsInitLocalOverrides()
VUHDO_RAID = _G["VUHDO_RAID"];
sIsDeadOnly = VUHDO_CONFIG["DIRECTION"]["isDeadOnly"];
sIsAlways = VUHDO_CONFIG["DIRECTION"]["isAlways"];
sIsDistanceText = VUHDO_CONFIG["DIRECTION"]["isDistanceText"];
sScale = VUHDO_CONFIG["DIRECTION"]["scale"] * 0.01;
sOldButton = nil;
sOldDistance = nil;
VuhDoDirectionFrame = _G["VuhDoDirectionFrame"];
VuhDoDirectionFrameArrow = _G["VuhDoDirectionFrameArrow"];
VuhDoDirectionFrameText = _G["VuhDoDirectionFrameText"];
VUHDO_setMapToCurrentZone = _G["VUHDO_setMapToCurrentZone"];
VUHDO_getDistanceBetween = _G["VUHDO_getDistanceBetween"];
VUHDO_getUnitDirection = _G["VUHDO_getUnitDirection"];
end
--
function VUHDO_getCellForDirection(aDirection)
return floor(aDirection * VUHDO_1_DIV_2_PI_MUL_108 + 0.5) % 108
end
local VUHDO_getCellForDirection = VUHDO_getCellForDirection;
--
local tStartX, tStartY;
function VUHDO_getTexCoordsForCell(aCell)
tStartX, tStartY = (aCell % 9) * 0.109375, floor(aCell / 9) * 0.08203125;
return tStartX, tStartX + 0.109375, tStartY, tStartY + 0.08203125;
end
local VUHDO_getTexCoordsForCell = VUHDO_getTexCoordsForCell;
--
local tQuota;
local tR, tG;
local tInvModi;
function VUHDO_getRedGreenForDistance(aDistance)
tQuota = 4 - 0.05 * aDistance;
if tQuota > 2 then tQuota = 2;
elseif tQuota < 0 then tQuota = 0; end
if tQuota > 1 then
tR, tG = 0, 1;
tQuota = tQuota - 1;
else
tR, tG = 1, 0;
end
tInvModi = 1 - tQuota;
return tInvModi + tR * tQuota, tG * tInvModi + tQuota;
end
local VUHDO_getRedGreenForDistance = VUHDO_getRedGreenForDistance;
--
local tInfo;
local tIsInInstance;
function VUHDO_shouldDisplayArrow(aUnit)
tIsInInstance, _ = IsInInstance();
if tIsInInstance then
return false;
end
tInfo = VUHDO_RAID[aUnit];
return not UnitIsUnit("player", aUnit)
and tInfo
and (not tInfo["range"] or sIsAlways)
and (not sIsDeadOnly or tInfo["dead"])
and tInfo["connected"]
and not tInfo["isPet"];
end
local VUHDO_shouldDisplayArrow = VUHDO_shouldDisplayArrow;
--
local tUnit;
local tCell;
local sLastCell = nil;
local tButton = nil;
local tHeight;
local tDistance;
local tHeight;
local tDestR, tDestG;
function VUHDO_updateDirectionFrame(aButton)
if aButton then tButton = aButton;
elseif not tButton then return; end
tUnit = tButton:GetAttribute("unit");
if not VUHDO_shouldDisplayArrow(tUnit) then
VuhDoDirectionFrame["shown"] = false;
VuhDoDirectionFrame:Hide();
return;
end
tDirection = VUHDO_getUnitDirection(tUnit);
if not tDirection then
VuhDoDirectionFrame["shown"] = false;
VuhDoDirectionFrame:Hide();
return;
end
tCell = VUHDO_getCellForDirection(tDirection);
if tCell ~= sLastCell then
sLastCell = tCell;
VuhDoDirectionFrameArrow:SetTexCoord(VUHDO_getTexCoordsForCell(tCell));
end
if sIsDistanceText then
tDistance = VUHDO_getDistanceBetween("player", tUnit);
if (tDistance or 0) > 0 then
tDistance = floor(tDistance + 0.5);
if tDistance ~= sOldDistance then
sOldDistance = tDistance;
VuhDoDirectionFrameText:SetText(tDistance);
tDestR, tDestG = VUHDO_getRedGreenForDistance(tDistance);
VuhDoDirectionFrameText:SetTextColor(tDestR, tDestG, 0.2, 0.8);
VuhDoDirectionFrameArrow:SetVertexColor(tDestR, tDestG, 0);
end
else
VuhDoDirectionFrameText:SetText("");
end
end
if sOldButton ~= tButton then
sOldButton = tButton;
tHeight = tButton:GetHeight() * sScale * tButton:GetEffectiveScale();
VuhDoDirectionFrame:SetPoint("CENTER", tButton:GetName(), "CENTER", 0, 0);
VuhDoDirectionFrame:SetWidth(tHeight);
VuhDoDirectionFrame:SetHeight(tHeight);
end
VuhDoDirectionFrame:Show();
VuhDoDirectionFrame["shown"] = true;
end