Dominos

Dominos

19M Downloads

Feature Request: Disable new 10.1.5 actionbutton animations

Daenarys opened this issue ยท 36 comments

commented

I was wondering if you can add an option or make it default to hide the new action button animations that come in 10.1.5
I think theyre useless :)

Also,
Do you have any plans to implement the pre 10.x actionbutton theme?

commented

I don't have any plans on implementing a pre 10.x theme. Masque should cover you there.

commented

Closing this issue, as I don't think there's anything I specifically need to implement in Dominos for this.

commented

Blizz removed the new recharge animation today so you can now remove this part from the code again

hooksecurefunc("StartChargeCooldown", function(parent)
	parent.chargeCooldown:SetEdgeTexture("Interface\\Cooldown\\edge")
end)

They also removed the new CooldownFlash animation so you can remove this too, maybe they add it again later tho..

hooksecurefunc("ActionButtonCooldown_OnCooldownDone", function(cooldown)
    local flash = cooldown:GetParent().CooldownFlash
    if flash then
        flash:Hide()
    end
end)
commented

The edge texture was probably reverted due to it not really being compatible with buttons that utilize :SetUseCircularEdge(). When I was doing some testing, it looked pretty bad on round buttons. The edge animation seems to just rotate the texture, which works fine for a thin line, but you can see the square edges on anything larger. Maybe we'll get lucky and they'll implement a better way of doing it, like a flip book animation instead of a rotation.

As for the charge cooldown animation, I'm not sure why they removed it. It could be back later, but we'll have to see.

commented

You can add this to restore the "old" cooldown done flash

hooksecurefunc("ActionButtonCooldown_OnCooldownDone", function(cooldown)
	cooldown:SetDrawBling(true)
end)
commented

Masque doesn't appear to have any way to disable things like the cast or channel progress overlaid on to spell icons, and while an entire pre-10.1.5 theme might be overkill it would be handy to be able to turn them off (if such a thing is possible).

commented

in my addon (razernaga ui) i disabled the animations by hooking actionbutton OnUpdate and hiding them there

self:HookScript("OnUpdate", function(self)
	self.CooldownFlash:Hide()
	self.InterruptDisplay:Hide()
	self.SpellCastAnimFrame:Hide()
	self.TargetReticleAnimFrame:Hide()
end)

and to restore some old animations i added

self.cooldown:SetDrawBling(true)

hooksecurefunc("StartChargeCooldown", function(self)
	self.chargeCooldown:SetEdgeTexture("Interface\\Cooldown\\edge")
end)
commented

If you throw this into an addon, it should work on all stock action buttons (including Dominos). You want to avoid hooking OnUpdate, as that happens every time a frame is rendered in game. Some things may be done a bit more efficiently via using SetAlpha(0) on them to "hide"

local function hideSpellCastAnimFrame(button)
    button.SpellCastAnimFrame:Hide()
end

local function hideInterruptDisplay(button)
    button.InterruptDisplay:Hide()
end

local function hideTargetReticleAnimFrame(button)
    button.TargetReticleAnimFrame:Hide()
end

local function hideCastAnimations(button)
    button.cooldown:SetDrawBling(true)

    hooksecurefunc(button, "PlaySpellCastAnim", hideSpellCastAnimFrame)
    hooksecurefunc(button, "PlaySpellInterruptedAnim", hideInterruptDisplay)
    hooksecurefunc(button, "PlayTargettingReticleAnim", hideTargetReticleAnimFrame)
end

hooksecurefunc("StartChargeCooldown", function(button)
    button.chargeCooldown:SetEdgeTexture("Interface\\Cooldown\\edge")
end)

-- hide the cooldown flash animation
hooksecurefunc("ActionButtonCooldown_OnCooldownDone", function(cooldown)
    local cooldownFlash = cooldown:GetParent().CooldownFlash

    if cooldownFlash then
        cooldownFlash:Hide()
    end
end)

-- register known action buttons
for _, button in pairs(ActionBarButtonEventsFrame.frames) do
    hideCastAnimations(button)
end

-- and watch for any additional action buttons
hooksecurefunc(ActionBarButtonEventsFrame, "RegisterFrame", function(_, button)
    hideCastAnimations(button)
end)
commented

Interesting.
When using your code my addon uses 6-7mb memory, and with the code i posted it uses 1.0-1.5mb.
Maybe its working better for dominos? :P

commented

Interesting.
When using your code my addon uses 6-7mb memory, and with the code i posted it uses 1.0-1.5mb.
Maybe its working better for dominos? :P

hideCastAnimations needs a check added to ensure that the button hasnโ€™t already been registered before

commented

https://filebin.net/xng6z6e492dudxrr

for the fix Tuller recommended above. Just put the Bar folder in your addons folder like any other addon.

commented

Bartender does still have the old one (just tested this myself to verify), couldn't you just copy from that?

Bartender uses LibActionButton-1.0, which still uses the old style. I can't control whether action bar add-ons use custom buttons or the default buttons (Dominos uses the default buttons, while Bartender creates it own via LAB).

commented

wait so, they changed the size of the action buttons, but not the font size for the keybindings?

They didn't need to, because at their existing size, they're fine. How the text is scaled, however, depends on how it's implemented. Masque don't change the font size at all, only the "container" for the text, to keep it in scale with the button.

so the proportions were just different because of that? if pre-DF the font made up let's say 25% of the button, because they changed the size of the buttons, now the font was just f.e. 20%? something like that? that would make sense then why the keybindings got so small after I changed the action bars back to being the size they were before DF.

Your keybindings likely got smaller because Blizzard may have implemented font scaling along with the button scaling. Font scaling is separate from font object (the container box for the text) scaling. You can resize a text block without changing the size of the font it contains, if that makes sense. That's how Masque does it.

I take it since you're replying to my message with the screenshot that you're talking about the spell proc flash animation? The old one will probably still be in the game files somewhere if I had to guess? Or do you think they just overwrote it with the new one?

The files are there. The issue is that they're implemented differently and I'd effectively have to create the a new, separate animation to replace it. When I get around to making custom animations, I'll probably just make a toned-down version of the new one, versus trying to rig the old one into the new system.

commented

I'd like to tag on and say that a lot of people would love if you made this into a little addon of its own. I've seen many people with various disabilities and/or sensitivities on the forums complaining about the new spell flash/gcd animations. For some it's serious enough that without a fix, they'll stop playing. And I think not everyone will find your comment on this issue on this repo - putting it up on curseforge as its own thing would really help a lot of people.

commented

Yea i agree, btw, i hate how they keep adding new stuff without giving us an option to disable or revert that new thing.. ugh

commented
commented

Nice! i guess the SpellActivationAlert (spell proc flash) requires a bit more work since all the animations and durations etc were changed :)

commented

For that, youโ€™d probably want to look at something like LibActionButton. It has its own implementation for that which could likely be reapplied to the stock action buttons

commented

I had to tweak the scaling via masque btw because with dragonflight something about the scaling got changed, making all my actionbars way bigger when I first logged in.

For what it's worth, this is because action buttons were increased from 36 x 36 to 45 x 45 in Dragonflight.

Also, I'm looking into adding options to Masque for disabling the new animations. At least that will be something until I can add custom animations.

commented

This should fix the proc flash size, add it underneath the code tuller provided.

hooksecurefunc("ActionButton_SetupOverlayGlow", function(parent)
	if parent.SpellActivationAlert then
		parent.SpellActivationAlert:ClearAllPoints()
		parent.SpellActivationAlert:SetPoint("TOPLEFT", -7.20, 7.20)
		parent.SpellActivationAlert:SetPoint("BOTTOMRIGHT", 7.20, -7.20)

		parent.SpellActivationAlert.ProcStartFlipbook:ClearAllPoints()
		parent.SpellActivationAlert.ProcStartFlipbook:SetPoint("TOPLEFT", -37, 37)
		parent.SpellActivationAlert.ProcStartFlipbook:SetPoint("BOTTOMRIGHT", 37, -37)
	end
end)

you can tweak the setpoints values if its too large/small

commented

Stole this from another addon to tame the spell proc animation:

-- from HideActionBarAnimations
-- Golden Border Procc
hooksecurefunc("ActionButton_ShowOverlayGlow", function(button)
	if button.SpellActivationAlert.ProcStartAnim:IsPlaying() then
		--Hack to hide the animation start if we do 
		--button.SpellActivationAlert.ProcStartAnim:Stop()
		--then the texture breaks in horrendous ways
		button.SpellActivationAlert:SetAlpha(0)
		C_Timer.After(0.26, function()
			button.SpellActivationAlert:SetAlpha(0.7)
		end)
		-- Interface\\SpellActivationOverlay\\IconAlert
		-- Interface\\SpellActivationOverlay\\IconAlertAnts
		-- ActionButton_HideOverlayGlow(self) -- Perma Hide it?
	end
end)

Originally, it set the alpha back to 1 but it was still very bright.

Adding this to the end of the above makes the action bars mostly bearable for me now.

commented

but I think for me because of how I've scaled everything, it will still look off with the spacing and all even if you implement a texture of your own design, correct?

Masque doesn't currently allow adjusting the size of Spell Alerts by skins. I'm planning on changing that. This will leave it to the skin author(s) to make sure their skins are set up correctly.

and I can hear you thinking "just switch to bartender" and okay, yes, but

I try not to influence what users use.

40+ alts.. and action bar profiles/action bar saver apparently don't work for bartender.

Ability assignments on action bars is generally saved server-side. ABS saves a set-up locally and then applies it, which then prompts the server to update. If it's not working with Bartender, it likely because BT creates its own buttons, though I was under the impression that it tied into the native API. I could be wrong.

commented

Now I just need to find a way to get the font size back to normal :D

commented
function BindableButton:UpdateHotkeys()
	_G[self:GetName()..'HotKey']:SetFont("Fonts\\ARIALN.TTF", 13, "OUTLINE")
    local key = getButtonHotkey(self)

    if key ~= '' and Addon:ShowBindingText() then
        self.HotKey:SetText("|cffffffff"..key)
        self.HotKey:Show()

In bindablebutton.lua I changed that and i was able to get the size and colour back

commented

Don't know if Tuller can make a cleaner implementation, but this should restore the old spell proc animations :)

hooksecurefunc("ActionButton_SetupOverlayGlow", function(button)
	if button.SpellActivationAlert then
		button.SpellActivationAlert:SetAlpha(0)
	end

	if button.ActionButtonOverlay then
		return;
	end

	local name = button:GetName()
	local overlay = CreateFrame("Frame", nil, button)
	
	-- spark
	overlay.spark = overlay:CreateTexture(name .. "Spark", "BACKGROUND")
	overlay.spark:SetPoint("CENTER")
	overlay.spark:SetAlpha(0)
	overlay.spark:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
	overlay.spark:SetTexCoord(0.00781250, 0.61718750, 0.00390625, 0.26953125)
	
	-- inner glow
	overlay.innerGlow = overlay:CreateTexture(name .. "InnerGlow", "ARTWORK")
	overlay.innerGlow:SetPoint("CENTER")
	overlay.innerGlow:SetAlpha(0)
	overlay.innerGlow:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
	overlay.innerGlow:SetTexCoord(0.00781250, 0.50781250, 0.27734375, 0.52734375)
	
	-- inner glow over
	overlay.innerGlowOver = overlay:CreateTexture(name .. "InnerGlowOver", "ARTWORK")
	overlay.innerGlowOver:SetPoint("TOPLEFT", overlay.innerGlow, "TOPLEFT")
	overlay.innerGlowOver:SetPoint("BOTTOMRIGHT", overlay.innerGlow, "BOTTOMRIGHT")
	overlay.innerGlowOver:SetAlpha(0)
	overlay.innerGlowOver:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
	overlay.innerGlowOver:SetTexCoord(0.00781250, 0.50781250, 0.53515625, 0.78515625)
	
	-- outer glow
	overlay.outerGlow = overlay:CreateTexture(name .. "OuterGlow", "ARTWORK")
	overlay.outerGlow:SetPoint("CENTER")
	overlay.outerGlow:SetAlpha(0)
	overlay.outerGlow:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
	overlay.outerGlow:SetTexCoord(0.00781250, 0.50781250, 0.27734375, 0.52734375)
	
	-- outer glow over
	overlay.outerGlowOver = overlay:CreateTexture(name .. "OuterGlowOver", "ARTWORK")
	overlay.outerGlowOver:SetPoint("TOPLEFT", overlay.outerGlow, "TOPLEFT")
	overlay.outerGlowOver:SetPoint("BOTTOMRIGHT", overlay.outerGlow, "BOTTOMRIGHT")
	overlay.outerGlowOver:SetAlpha(0)
	overlay.outerGlowOver:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
	overlay.outerGlowOver:SetTexCoord(0.00781250, 0.50781250, 0.53515625, 0.78515625)
	
	-- ants
	overlay.ants = overlay:CreateTexture(name .. "Ants", "OVERLAY")
	overlay.ants:SetPoint("CENTER")
	overlay.ants:SetAlpha(0)
	overlay.ants:SetTexture([[Interface\SpellActivationOverlay\IconAlertAnts]])
	
	overlay.OnUpdate = function(button, elapsed)
		AnimateTexCoords(button.ants, 256, 256, 48, 48, 22, elapsed, 0.01)
		local cooldown = button:GetParent().cooldown
		-- we need some threshold to avoid dimming the glow during the gdc
		-- (using 1500 exactly seems risky, what if casting speed is slowed or something?)
		if(cooldown and cooldown:IsShown() and cooldown:GetCooldownDuration() > 3000) then
			button:SetAlpha(0.5)
		else
			button:SetAlpha(1.0)
		end
	end
	overlay:SetScript("OnUpdate", overlay.OnUpdate)
	
	overlay.OnHide = function(button)
		if ( button.animOut:IsPlaying() ) then
			button.animOut:Stop()
			button.animOut:OnFinished()
		end
	end
	overlay:SetScript("OnHide", overlay.OnHide)
	
	local tmpanim
	overlay.animIn = overlay:CreateAnimationGroup()
	
	tmpanim = overlay.animIn:CreateAnimation("Scale")
	tmpanim:SetTarget(overlay.spark)
	tmpanim:SetDuration(0.2)
	tmpanim:SetScale(1.5, 1.5)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animIn:CreateAnimation("Alpha")
	tmpanim:SetTarget(overlay.spark)
	tmpanim:SetDuration(0.2)
	tmpanim:SetFromAlpha(0)
	tmpanim:SetToAlpha(1)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animIn:CreateAnimation("Scale")
	tmpanim:SetTarget(overlay.innerGlow)
	tmpanim:SetDuration(0.3)
	tmpanim:SetScale(2, 2)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animIn:CreateAnimation("Scale")
	tmpanim:SetTarget(overlay.innerGlowOver)
	tmpanim:SetDuration(0.3)
	tmpanim:SetScale(2, 2)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animIn:CreateAnimation("Alpha")
	tmpanim:SetTarget(overlay.innerGlowOver)
	tmpanim:SetDuration(0.3)
	tmpanim:SetFromAlpha(1)
	tmpanim:SetToAlpha(0)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animIn:CreateAnimation("Scale")
	tmpanim:SetTarget(overlay.outerGlow)
	tmpanim:SetDuration(0.3)
	tmpanim:SetScale(0.5, 0.5)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animIn:CreateAnimation("Scale")
	tmpanim:SetTarget(overlay.outerGlowOver)
	tmpanim:SetDuration(0.3)
	tmpanim:SetScale(0.5, 0.5)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animIn:CreateAnimation("Alpha")
	tmpanim:SetTarget(overlay.outerGlowOver)
	tmpanim:SetDuration(0.3)
	tmpanim:SetFromAlpha(1)
	tmpanim:SetToAlpha(0)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animIn:CreateAnimation("Scale")
	tmpanim:SetTarget(overlay.spark)
	tmpanim:SetStartDelay(0.2)
	tmpanim:SetDuration(0.2)
	tmpanim:SetScale(0.666666, 0.666666)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animIn:CreateAnimation("Alpha")
	tmpanim:SetTarget(overlay.spark)
	tmpanim:SetStartDelay(0.2)
	tmpanim:SetDuration(0.2)
	tmpanim:SetFromAlpha(1)
	tmpanim:SetToAlpha(0)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animIn:CreateAnimation("Alpha")
	tmpanim:SetTarget(overlay.innerGlow)
	tmpanim:SetStartDelay(0.3)
	tmpanim:SetDuration(0.2)
	tmpanim:SetFromAlpha(1)
	tmpanim:SetToAlpha(0)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animIn:CreateAnimation("Alpha")
	tmpanim:SetTarget(overlay.ants)
	tmpanim:SetStartDelay(0.3)
	tmpanim:SetDuration(0.2)
	tmpanim:SetFromAlpha(0)
	tmpanim:SetToAlpha(1)
	tmpanim:SetOrder(1)
	
	overlay.animIn.OnPlay = function(button)
		local frame = button:GetParent()
		local frameWidth, frameHeight = frame:GetSize()
		frame.spark:SetSize(frameWidth, frameHeight)
		frame.spark:SetAlpha(0.3)
		frame.innerGlow:SetSize(frameWidth / 2, frameHeight / 2)
		frame.innerGlow:SetAlpha(1.0)
		frame.innerGlowOver:SetAlpha(1.0)
		frame.outerGlow:SetSize(frameWidth * 2, frameHeight * 2)
		frame.outerGlow:SetAlpha(1.0)
		frame.outerGlowOver:SetAlpha(1.0)
		frame.ants:SetSize(frameWidth * 0.85, frameHeight * 0.85)
		frame.ants:SetAlpha(0)
		frame:Show()
	end
	overlay.animIn:SetScript("OnPlay", overlay.animIn.OnPlay)
	
	overlay.animIn.OnFinished = function(button)
		local frame = button:GetParent()
		local frameWidth, frameHeight = frame:GetSize()
		frame.spark:SetAlpha(0)
		frame.innerGlow:SetAlpha(0)
		frame.innerGlow:SetSize(frameWidth, frameHeight)
		frame.innerGlowOver:SetAlpha(0.0)
		frame.outerGlow:SetSize(frameWidth, frameHeight)
		frame.outerGlowOver:SetAlpha(0.0)
		frame.outerGlowOver:SetSize(frameWidth, frameHeight)
		frame.ants:SetAlpha(1.0)
	end
	overlay.animIn:SetScript("OnFinished", overlay.animIn.OnFinished)
	
	overlay.animOut = overlay:CreateAnimationGroup()
	
	tmpanim = overlay.animOut:CreateAnimation("Alpha")
	tmpanim:SetTarget(overlay.outerGlowOver)
	tmpanim:SetDuration(0.2)
	tmpanim:SetFromAlpha(0)
	tmpanim:SetToAlpha(1)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animOut:CreateAnimation("Alpha")
	tmpanim:SetTarget(overlay.ants)
	tmpanim:SetDuration(0.2)
	tmpanim:SetFromAlpha(1)
	tmpanim:SetToAlpha(0)
	tmpanim:SetOrder(1)
	
	tmpanim = overlay.animOut:CreateAnimation("Alpha")
	tmpanim:SetTarget(overlay.outerGlowOver)
	tmpanim:SetDuration(0.2)
	tmpanim:SetFromAlpha(1)
	tmpanim:SetToAlpha(0)
	tmpanim:SetOrder(2)
	
	tmpanim = overlay.animOut:CreateAnimation("Alpha")
	tmpanim:SetTarget(overlay.outerGlow)
	tmpanim:SetDuration(0.2)
	tmpanim:SetFromAlpha(1)
	tmpanim:SetToAlpha(0)
	tmpanim:SetOrder(2)
	
	overlay.animOut.OnFinished = function(button)
		local frame = button:GetParent()
		frame:Hide()
	end
	overlay.animOut:SetScript("OnFinished", overlay.animOut.OnFinished)
	
	button.ActionButtonOverlay = overlay
	local frameWidth, frameHeight = button:GetSize()
	overlay:ClearAllPoints();
	overlay:SetSize(frameWidth * 1.4, frameHeight * 1.4)
	overlay:SetPoint("TOPLEFT", button, "TOPLEFT", -frameWidth * 0.2, frameHeight * 0.2);
	overlay:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", frameWidth * 0.2, -frameHeight * 0.2);
	overlay:Hide()
	
	hooksecurefunc("ActionButton_ShowOverlayGlow", function(button)
		if not (button.ActionButtonOverlay) then
			return
		end
		if button.ActionButtonOverlay.animOut:IsPlaying() then
			button.ActionButtonOverlay.animOut:Stop()
		end
		if not button.ActionButtonOverlay:IsShown() then
			button.ActionButtonOverlay.animIn:Play()
		end
	end)

	hooksecurefunc("ActionButton_HideOverlayGlow", function(button)
		if not (button.ActionButtonOverlay) then
			return
		end
		if button.ActionButtonOverlay.animIn:IsPlaying() then
			button.ActionButtonOverlay.animIn:Stop()
		end
		if button:IsVisible() then
			button.ActionButtonOverlay.animOut:Play()
		else
			button.ActionButtonOverlay.animOut:OnFinished()
		end
	end)
end)
commented

Where do I input this may I ask Daenarys?

commented

Just put it underneath the code in the addon that tuller provided

commented

Thanks!

commented

For the charges use self.Count instead of self.Hotkey

commented

I honestly wish I could just not use masque scaling and avoid the issue entirely, but I want to be able to read my keybinds still.

You could just use the custom add-on you're using to change the text size. Eg:

for i = 1, 12 do
   -- Default FontObject is "NumberFontNormalSmallGray, with a size of 11.
   _G["ActionButton"..i].HotKey:SetFontObject("NumberFontNormalGray") -- Size = 14
end

or if you need to be more precise:

local path, size, flags = ActionButton1.HotKey:GetFont()
for i = 1, 12 do
   _G["ActionButton"..i].HotKey:SetFont(path, 13, flags) 
end
commented

That was just an example. You'd need to iterate through all the bars and their respective buttons:

-- Each of these bars have 12 buttons.
local ActionBars = {
	"ActionButton",
	"MultiBarBottomLeftButton",
	"MultiBarBottomRightButton",
	"MultiBarLeftButton",
	"MultiBarRightButton",
	"MultiBar5Button",
	"MultiBar6Button",
	"MultiBar7Button",
}

-- Action Bars
for _, name in ipairs(ActionBars) do
	for i = 1, 12 do
		local btn = _G[name..i]
		if btn and btn.HotKey then
			btn.HotKey:SetFontObject("NumberFontNormalGray")
		end
	end
end

-- Pet/Stance Bar
for i = 1, 10 do
	local pab, sab = PetActionBar.actionButtons[i], StanceBar.actionButtons[i]
	if pab and pab.HotKey then
		pab.HotKey:SetFontObject("NumberFontNormalGray")
	end
	if sab and sab.HotKey then
		sab.HotKey:SetFontObject("NumberFontNormalGray")
	end
end

Edit: Had to update it a bit, because it's late and I'm tired. This should work, unless I messed something up.

commented

does apply to all action bars now but sadly still does nothing with dominos enabled

A quick search through the code shows only a case of some clean-up for Classic/Wrath, but it doesn't affect Retail. So the issue might be Dominos scaling things, which I can't help you with. The only other thing I can think of is to make sure your custom add-on is loaded after Dominos via the line:

## OptionalDeps: Dominos

In your custom add-on's ToC file(s).

seems to sit 'inside' of the button now, that is to say, the border of the button will overlap the text.

Again, I was just giving you an example. It obviously doesn't account for position. You'll either need to adjust it manually in your custom add-on or, if you're using Masque, you can tweak your local copy of the skin.

commented

There's code in Masque to adjust the position of the text? Well. Doesn't matter if it won't work with dominos anyway.

It should. You'll have to find the HotKey = { section of your preferred skin and adjust the OffsetX and OffsetY values. Note that X is horizontal and Y is vertical and they start in the bottom left corner, so to lower the text, you'd subtract from its current value. To adjust it to the left or right, you subtract or add, respectively, to the X value.

commented

You can use the following to do initialization to stock action buttons/addons that reuse the stock templates. ActionBarActionButtonMixin:OnLoad calls ActionBarButtonEventsFrame:RegisterFrame

local function onRegister(button)
    -- do stuff like restyling buttons
   button.HotKey:SetFont("Fonts\\FRIZQT__.TTF", 16, "OUTLINE")
end

-- deal with buttons that have already been loaded
for _, button in ipairs(ActionBarButtonEventsFrame.frames) do
    onRegister(button)
end

-- handle buttons that are loaded later
hooksecurefunc(ActionBarButtonEventsFrame, "RegisterFrame", function(_, button)
    onRegister(button)
end)
commented

@StormFX hey. bit unrelated, but im trying to get my hotkey font the same as it was pre shadowlands. I am using the exact same font+flags (NumberFontNormalSmallGray with the thickoutline and monochrome flags) but its not quite the same, left is Legion, right is Dragonflight. Legion had more spacing between the letters it seems, could it be a shadow thingy? https://i.imgur.com/3xMVjcB.png

commented

The text on the right is larger. When text is scaled, the spacing, etc, changes and can look off. This happens even with desktop applications. You can try setting its size to a decimal. Eg, if you've changed it from 11px to 12px, try setting it 11.5 or something.

Edit: It also could be partially related to UI scaling. You'd have to fiddle around with it and see what affects it.