Месье знает толк в извращениях

Адский wall of text, моя предупредил.
Например для цели в ElvUI\modules\unitframes\units\target.lua есть
frame.Castbar = self:Construct_Castbar(frame, 'RIGHT', L['Target Castbar'])
вызываемая функция лежит в ElvUI\modules\unitframes\elements\castbar.lua
function UF:Construct_Castbar(self, direction, moverName)
...
local holder = CreateFrame('Frame', nil, castbar)
button:SetTemplate("Default")
if direction == "LEFT" then
holder:Point("TOPRIGHT", self, "BOTTOMRIGHT", 0, -(E.Border * 3))
castbar:Point('BOTTOMRIGHT', holder, 'BOTTOMRIGHT', -E.Border, E.Border)
button:Point("RIGHT", castbar, "LEFT", E.PixelMode and 0 or -3, 0)
else
holder:Point("TOPLEFT", self, "BOTTOMLEFT", 0, -(E.Border * 3))
castbar:Point('BOTTOMLEFT', holder, 'BOTTOMLEFT', E.Border, E.Border)
button:Point("LEFT", castbar, "RIGHT", E.PixelMode and 0 or 3, 0)
end
holder:Point в данном случае задает позицию по умолчанию прицепиться в таком-то порядке к self (там в вызове функции цепляется имя фрейма). Правда, если менять это, то еще и на другие фреймы повлияет. Можно скопипастить функцию, обозвать чуть по другому и вызывать для нужного фрейма уже ее.
Для панелей команд чуть проще.
ElvUI\modules\actionbars\actionbars.lua
["bar2"] = {
['page'] = 5,
['bindButtons'] = "MULTIACTIONBAR2BUTTON",
['conditions'] = "",
['position'] = "BOTTOM,ElvUI_Bar1,TOP,0,2",
},
строка position отвечает за позиционирование посредством подобной функции :Point, только в другом месте и с другими аргументами. В данном случае привязка пойдет по коду
local point, anchor, attachTo, x, y = split(',', self['barDefaults']['bar'..id].position)
bar:Point(point, anchor, attachTo, x, y)
Он расположен в том же файле в функции AB:CreateBar(id). Выдирает значения из заданной переменной (self['barDefaults']['bar'..id].position) и использует их для :Point. В данном примере привязка пойдет к ElvUI_Bar1
Сама :Point работает по типу frame:Point(point, anchor, attachTo, x, y), где
- frame - название фрейма, которому мы хотим задать позицию
- point - точка на фрейме, которой он будет цепляться
- anchor - фрейм, относительно которого будет идти позиционирование
- attachTo - точка на anchor, к которой будет идти привязка
- x - отступ по х от точки соединения
- y - отступ по y от точки соединения
Например Frame_1:Point("BOTTOM", Frame_2, "TOP", 5, 0) привяжет Frame_1 к Frame_2, при этом первый будет цепляться своей нижней границей к верхней границе второго фрейма. А 5 означает, что при этом первый фрейм уползет на 5 пикселей вправо.
Оно же на Wiki.
Однако. Если фрейм уже двигался, то в профиле под него будет запись в субтаблице movers. Если она существует, то сборка игнорирует позицию по умолчанию, даже если ее переписать. Лечится командой /resetui <Имя фксатора> (например, /resetui Панель 5 - сбросит позицию пятой панели. Имена соответствуют тексту на фиксаторе в режиме конфигурации)
Тобишь есть два варианта:
- Отредактировать исходный код. Однако придется этим заниматься каждый апдейт + для юнитфреймов это будет довольно проблемно.
- Создать что-то типа плагина, который будет висеть отдельно и делать позиционирование уже после загрузки в игру. Не нужно переделывать каждый апдейт.