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.
348 lines
10 KiB
348 lines
10 KiB
|
|
local addon, ns = ...;
|
|
do
|
|
local addon_short = "FH-TP";
|
|
local colors = {"82c5ff","00ff00","ff6060","44ffff","ffff00","ff8800","ff44ff","ffffff"};
|
|
local function colorize(...)
|
|
local t,c,a1 = {tostringall(...)},1,...;
|
|
if type(a1)=="boolean" then tremove(t,1); end
|
|
if a1~=false then
|
|
local header = "FarmHud (TrailPath)";
|
|
if a1==true then
|
|
header = addon_short;
|
|
elseif a1=="||" then
|
|
header = "||";
|
|
elseif a1=="()" then
|
|
header = header .. " (" ..t[2]..")";
|
|
tremove(t,2);
|
|
tremove(t,1);
|
|
end
|
|
tinsert(t,1,"|cff82c5ff"..header.."|r"..(a1~="||" and HEADER_COLON or ""));
|
|
c=2;
|
|
end
|
|
for i=c, #t do
|
|
if not t[i]:find("\124c") then
|
|
t[i],c = "|cff"..colors[c]..t[i].."|r", c<#colors and c+1 or 1;
|
|
end
|
|
end
|
|
return unpack(t);
|
|
end
|
|
function ns.print(...)
|
|
print(colorize(...));
|
|
end
|
|
end
|
|
|
|
local HBD = LibStub("HereBeDragons-2.0")
|
|
local HBDPins = LibStub("HereBeDragons-Pins-2.0")
|
|
|
|
local L = ns.L;
|
|
local pi2 = math.pi*2;
|
|
local media, media_blizz = "Interface\\AddOns\\FarmHud\\media\\", "Interface\\Minimap\\";
|
|
local minDistanceBetween = 12;
|
|
local trailPathActive,trailPathPool,lastX,lastY,lastM,lastFacing = {},{};
|
|
local trailPathIcons,trailPathTicker = { -- coords_pos = { <left>, <right>, <top>, <bottom>, <sizeW>, <sizeH> }
|
|
-- arrows1.tga
|
|
arrow01 = {file=media.."arrows1.tga",coords_pos={58,122, 64,128, 128,128},desaturated=true},
|
|
arrow02 = {file=media.."arrows1.tga",coords_pos={69,98, 0,29, 128,128},desaturated=true},
|
|
arrow03 = {file=media.."arrows1.tga",coords_pos={39,54, 30,45, 128,128},desaturated=true},
|
|
arrow04 = {file=media.."arrows1.tga",coords_pos={18,33, 107,125, 128,128},desaturated=true},
|
|
arrow05 = {file=media.."arrows1.tga",coords_pos={74,105, 29,59, 128,128},desaturated=false},
|
|
arrow06 = {file=media.."arrows1.tga",coords_pos={34,57, 68,91, 128,128},desaturated=false},
|
|
|
|
--
|
|
dot01 = {file=media.."playerDot-white.tga",coords={0.2,0.8,0.2,0.8}},
|
|
dot02 = {file="interface/Challenges/challenges-metalglow",coords={0.2,0.8,0.2,0.8},desaturated=true},
|
|
|
|
--
|
|
ring1 = {file="interface/COMMON/portrait-ring-withbg-highlight",coords={0.2,0.8,0.2,0.8},desaturated=true},
|
|
ring2 = {file="interface/Calendar/EventNotificationGlow",desaturated=true,mode="ADD"},
|
|
|
|
--== ideas for other icons to use as trail pin icon? ==--
|
|
-- hexagon = {"interface/ARCHEOLOGY/Arch-Keystone-Mask",coords},
|
|
-- /Animations/PowerSwirlAnimation ( atlas entries )
|
|
-- /Azerite/Azerite ( atlas entry + adjustments )
|
|
-- /Artifacts/Artifacts ( atlas entry + adjustments )
|
|
-- /ARCHEOLOGY/Arch-Keystone-Mask
|
|
-- /BUTTONS/Arrow-Up-Down ( desaturated )
|
|
-- /COMMON/ReputationStar
|
|
-- /COMMON/common-mask-diamond
|
|
-- /Challenges/challenges-metalglow
|
|
-- /ENCOUNTERJOURNAL/UI-EJ-Icons
|
|
-- /FriendsFrame/UI-Toast-ToastIcons
|
|
-- /GLUES/LOGIN/UI-BackArrow
|
|
-- /GLUES/Models/UI_BloodElf/BloodElfFemaleEyeGlowGreenGuard
|
|
-- /GLUES/Models/UI_DarkIronDwarf/T_VFX_Glow01_64
|
|
-- /GUILDFRAME/Communities
|
|
-- /Garrison/GarrisonBuildingUI
|
|
-- /Garrison/GarrisonMissionUI1
|
|
-- /Garrison/OrderHallTalents
|
|
-- /LootFrame/LootToastAtlas
|
|
-- /MINIMAP/ObjectIconsAtlas
|
|
-- /PETBATTLES/PetBattle-StatIcons
|
|
-- /PLAYERFRAME/PALADINPOWERTEXTURES
|
|
-- /SPELLBOOK/GlyphIconSpellbook
|
|
-- /Store/Services
|
|
|
|
--== trailPath pin icons by LibSharedMedia? maybe later...
|
|
}
|
|
local TrailPathIconValues = {
|
|
arrow01 = L["Arrow 1"],
|
|
arrow02 = L["Arrow 2"],
|
|
arrow03 = L["Arrow 3"],
|
|
arrow04 = L["Arrow 4"],
|
|
arrow05 = L["Arrow 5"],
|
|
arrow06 = L["Arrow 6"],
|
|
dot01 = L["Dot 1"],
|
|
dot02 = L["Dot 2"],
|
|
ring1 = L["Ring 1"],
|
|
ring2 = L["Ring 2"],
|
|
}
|
|
FarmHudTrailPathPinMixin = {}
|
|
|
|
function FarmHudTrailPathPinMixin:UpdatePin(facing,pinIcon,scale)
|
|
-- facing
|
|
if facing and IsOpened then
|
|
if rotationMode == "0" then
|
|
facing = self.info.f;
|
|
else
|
|
facing = -(facing-self.info.f);
|
|
end
|
|
self.pin.Facing.Rotate :SetRadians(facing);
|
|
end
|
|
-- texture
|
|
if self.info.currentPinIcon ~= pinIcon then
|
|
local icon = trailPathIcons[pinIcon];
|
|
if icon then
|
|
self.pin.icon :SetTexture(icon.file)
|
|
if not icon.coords then
|
|
icon.coords = {0,1,0,1};
|
|
end
|
|
self.pin.icon :SetTexCoord(unpack(icon.coords));
|
|
self.pin.icon :SetDesaturated(icon.desaturated==true)
|
|
self.pin.icon :SetBlendMode(icon.mode or "BLEND");
|
|
self.info.currentPinIcon = pinIcon
|
|
end
|
|
end
|
|
-- scaling
|
|
if self.info.currentPinScale~=scale then
|
|
self.pin :SetScale(scale);
|
|
self.info.currentPinScale = scale;
|
|
end
|
|
-- color
|
|
if self.info.currentPinColor1~=FarmHudDB.trailPathColor1 then
|
|
self.pin.icon :SetVertexColor(unpack(FarmHudDB.trailPathColor1))
|
|
self.info.currentPinColor1 = FarmHudDB.trailPathColor1;
|
|
end
|
|
end
|
|
|
|
local function GetMicrotime()
|
|
return ceil(GetTime()*100);
|
|
end
|
|
|
|
local function TrailPath_TickerFunc()
|
|
local x,y,instance = HBD :GetPlayerWorldPosition();
|
|
|
|
local currentFacing = GetPlayerFacing() or 0; -- 0 - 6.5
|
|
|
|
if x and y and instance then
|
|
if lastX and lastY and lastM==instance then
|
|
local a, distance = HBD :GetWorldVector(instance,lastX,lastY,x,y);
|
|
if distance < minDistanceBetween then
|
|
x,y = nil,nil;
|
|
if currentFacing then
|
|
trailPathActive[1].info.f = currentFacing;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if x and y and instance then
|
|
local entry,new = trailPathPool[1],false;
|
|
if not entry then
|
|
entry = CreateFrame("Frame",nil,FarmHud,"FarmHudTrailPathPinTemplate");
|
|
entry.info = {};
|
|
entry.pin.Facing:Play();
|
|
new = true;
|
|
end
|
|
|
|
lastX,lastY,lastM = x,y,instance;
|
|
entry.info.map = instance;
|
|
entry.info.x = x;
|
|
entry.info.y = y;
|
|
entry.info.f = currentFacing;
|
|
entry.info.t = GetMicrotime();
|
|
HBDPins:AddMinimapIconWorld(FarmHud, entry, instance, x, y );
|
|
tinsert(trailPathActive,1,entry);
|
|
if not new then
|
|
tremove(trailPathPool,1);
|
|
end
|
|
end
|
|
|
|
if #trailPathActive>0 then
|
|
local currentScale,currentPinIcon = FarmHudDB.trailPathScale;
|
|
local currentTime = GetMicrotime();
|
|
local IsOnCluster = trailPathActive[1] :GetParent()~=Minimap;
|
|
if IsOnCluster then
|
|
if FarmHudDB.rotation then
|
|
currentPinIcon = FarmHudDB.trailPathIcon or "arrow01";
|
|
else
|
|
currentPinIcon = "dot02";
|
|
end
|
|
IsOpened = true;
|
|
else
|
|
currentPinIcon = "dot02"
|
|
currentScale = 0.7;
|
|
IsOpened = false;
|
|
end
|
|
for i=#trailPathActive, 1, -1 do
|
|
local v = trailPathActive[i];
|
|
if i>1 and (i>FarmHudDB.trailPathCount or (v.info.t and currentTime-v.info.t>(FarmHudDB.trailPathTimeout*100))) then
|
|
HBDPins:RemoveMinimapIcon(FarmHud,v);
|
|
wipe(v.info);
|
|
tinsert(trailPathPool,v);
|
|
tremove(trailPathActive,i);
|
|
else
|
|
if i==1 then
|
|
trailPathActive[i].info.t = currentTime;
|
|
end
|
|
trailPathActive[i]:UpdatePin(currentFacing,currentPinIcon,currentScale);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function UpdateTrailPath(force)
|
|
if force==nil then
|
|
force = FarmHudDB.trailPathShow;
|
|
end
|
|
if force==true and trailPathTicker==nil then
|
|
trailPathTicker = C_Timer.NewTicker(0.5,TrailPath_TickerFunc);
|
|
elseif force==false and trailPathTicker then
|
|
trailPathTicker:Cancel();
|
|
trailPathTicker = nil;
|
|
for i,v in ipairs(FarmHud.TrailPathPool)do
|
|
v:Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
local module = {};
|
|
|
|
module.dbDefaults = {
|
|
trailPathShow = true, trailPathCount = 32, trailPathTimeout = 60, trailPathIcon = "arrow01", trailPathColor1 = {1,.2,.2,1,.75}, trailPathScale = 1,
|
|
};
|
|
|
|
function module.AddOptions()
|
|
return {
|
|
trial = {
|
|
type = "group", --order = 9,
|
|
name = L["TrailPath"],
|
|
args = {
|
|
trailPathShow = {
|
|
type = "toggle", order = 0, width = "full",
|
|
name = L["TrailPathShow"]
|
|
},
|
|
trailPathCount = {
|
|
type = "range", order = 1,
|
|
name = L["TrailPathCount"], desc = L["TrailPathCountDesc"],
|
|
min = 10, step = 1, max = 64,
|
|
},
|
|
trailPathTimeout = {
|
|
type = "range", order = 2,
|
|
name = L["TrailPathTimeout"], desc = L["TrailPathTimeoutDesc"],
|
|
min = 10, step = 10, max = 600,
|
|
},
|
|
-- TODO: header ?
|
|
trailPathIcon = {
|
|
type = "select", order = 4,
|
|
name = L["TrailPathIcon"], desc = L["TrailPathIconDesc"],
|
|
values = TrailPathIconValues
|
|
},
|
|
trailPathScale = {
|
|
type = "range", order = 5,
|
|
name = L["TrailPathScale"], desc = L["TrailPathScaleDesc"],
|
|
min=0.1, step=0.1, max=1, isPercent = true
|
|
},
|
|
-- TODO: Little description for LibSharedMedia support... maybe later?
|
|
--[[
|
|
trailPathColorMode = {
|
|
type = "select", order = 5,
|
|
name = L["TrailPathColorMode"],
|
|
values = {
|
|
-- single
|
|
-- 2 colors
|
|
-- 3 colors
|
|
}
|
|
},
|
|
]]
|
|
trailPathColor1 = {
|
|
type = "color", order = 6,
|
|
name = COLOR, desc = L["TrailPathColorsDesc"],
|
|
hasAlpha = true,
|
|
hidden = false -- function to check color mode
|
|
},
|
|
--[[
|
|
trailPathColor2 = {
|
|
type = "color", order = 6,
|
|
name = COLOR.." 2", desc = L["TrailPathColorsDesc"],
|
|
hidden = false -- function to check color mode
|
|
},
|
|
trailPathColor3 = {
|
|
type = "color", order = 6,
|
|
name = COLOR.." 2", desc = L["TrailPathColorsDesc"],
|
|
hidden = false -- function to check color mode
|
|
},
|
|
]]
|
|
}
|
|
}
|
|
};
|
|
end
|
|
|
|
-- function module.OnShow() end
|
|
|
|
-- function module.OnHide() end
|
|
|
|
-- function module.<eventName>(...) end
|
|
|
|
function module.UpdateOptions(key,value)
|
|
if key=="trailPathShow" then
|
|
UpdateTrailPath(value);
|
|
end
|
|
end
|
|
|
|
function module.PLAYER_ENTERING_WORLD()
|
|
if IsInInstance() then
|
|
UpdateTrailPath(false)
|
|
else
|
|
UpdateTrailPath()
|
|
end
|
|
end
|
|
|
|
function module.OnLoad()
|
|
-- prepare trailPathIcons texture coords from coords_pos entries
|
|
FarmHud.UpdateTrailPath = UpdateTrailPath;
|
|
|
|
for key, value in pairs(trailPathIcons)do
|
|
if value.coords_pos then
|
|
if not value.coords then
|
|
value.coords = {0,1,0,1};
|
|
end
|
|
for i, pos in ipairs(value.coords_pos)do
|
|
if i>4 then break; end
|
|
if pos>1 then
|
|
value.coords[i] = pos/value.coords_pos[i<=2 and 5 or 6];
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
UpdateTrailPath();
|
|
end
|
|
|
|
FarmHud:RegisterModule("TrailPath",module)
|
|
|
|
|
|
--[[
|
|
known problems:
|
|
- sometimes icons disappear on turn off famrhud. invisible not removed.
|
|
]]
|