спрятать дефолтный статусбар , создать свой , родителя для него сделать фрейму нужного масштаба , сделать хайд и шоу хуки что бы прятать новые статусбары вместе с плейтой и value хуки что бы новый статусбар перенимал значение старого. Других вариантов масштабировать статусбар нет т.к вместе с масштабом меняется и пасштаб позиций.
Если же по глупости менять масштаб то выйдет следующее:
- - - Updated - - -
А нет тут ничего прикольного , нужно же как то на арене и бг отличать "своих" от противников , вот ребята по цвету и отличают =) Ну при наведении мышкой можно сделать , но когда плейта спрячется а потом покажется - придется заново наводить мышкой .
аффтор (16.01.2016)
Там нет тритлиста. Негде нет тритлиста , есть ивент , который идет в случае если игрок в группе , он и передает те самые цифры и из этих цифр выводят проценты , других способов нет. Из трит региона максимум можно получить цвет в hex , который потом конвертить в rgb . Что бы получить проценты, тебе нужно знать сколько трита набил танк и твой трит делить на его и умножать на 100 , из нейм плейты это получить нельзя , только белый , желтый , красный , причем не определишь сколько нужно , что бы из желтого перейти в красный.
PS не нужно тут писать про поиск и гуды и подобный бред. Нет ну это действительно бред. Особенно если использовать это на мобов , у которых все характеристики одинаковы и отличаются только гуиды. Фишка плейтов в том , что бы получать инфу не имея юнита , а это не возможно используя только луа.
Ну ок. Поменяли , что дальше? Получать информацию можно только для ЮНИТА (ей богу не знаю сколько еще раз это повторять), юниты это :
"arenaN" -- N = 1,2,3,4,5
"arenapetN" --N = 1,2,3,4,5
"bossN" --N = 1,2,3,4
"focus"
"mouseover"
"none"
"partyN" -- N = 1,2,3,4
"partypetN" --N = 1,2,3, or 4
"pet"
"player"
"raidN" -- N 1,2,3,...,40
"raidpetN" -- N = 1,2,3,...,40
"target"
"vehicle"
И как ты получишь инфу для плейты , которая не принадлежит юниту?
Есть 10 мобов , моб1 , моб2 и тд . У тебя в цели моб8 , а тебе нужно получить информацию для моб3 , при этом он не является юнитом. Вариант это брать его в цель или наводить на его неймплейту мышкой (причем именно на нейм плейту , потому , что если навести именно на моба , то не появится маусовер регион и ты не узнаешь какому мобу принадлежит эта плейта).
Слышал кулстори про поиск плейтов по имени ...
Ну ок дилема - имена у мобов одинаковые , максимальное количество здоровья одинаковое , текущее здоровье сравнить нельзя т.к если хп выше 103к инфа со статусбара st:GetValue() не будет равняться UnitHealth() , теперь даже если захочешь найти плейту принадлежащую конкретному юниту - ты ее не найдешь.
Окей , решили записывать в массивы гуиды мобов при взятии моба в таргет (это единственный способ, при котором нейм плейту для юнита "target" можно найти в 100% случаев верно). Набрался массив из 100+ нейм плейтов , привет 10 фпс в любом рейде, при этом после того как нейм плейта спрячется , найти ее по гуиду уже не получится т.к она ушла из поля зрения и как результат на ее место могла прийти новая нейм плейта.
PS да я сделал себе ауры над нейм плейтами юнитов , да я сделал кастбары для юнитов , но это все только для юнитов . реализовать как в катаклизме и выше на стороне клиента нельзя. Плейты катаклизма и выше сами по себе передают информацию , которая дает возможность в 100% случаев находить плейту как минимум для юнита , как максимум для гуида по комбат логу и это все без записи в массивы всякого мусора который садит фпс при каждом новом поиске.
Последний раз редактировалось DreamlØlz; 17.01.2016 в 13:12.
Тогда придется дефолтный статусбар прятать и делать свой =) min, cur, max значения брать из стандартного , а цвета сравнивать (дефолтный со своим) , проблема только в том , что это делать можно только OnUpdate , а это сильную нагрузку на проц будет давать при большом количестве плейтов , как итоге потеря фпс.
- - - Updated - - -
Сделать это к стати не сложно.
дрим, а твои плейты при большом кол-ве тоже фпс садят?
■■■■
Без кэша и так можно обойтись ... А не проще ли тогда иконку класса на курсор зацепить?))
PS плейты время от времени будут менять свой цвет , к примеру при дуэли и тд. К стати гуид игрока по нейм плейте нельзя определить , не стоит путать детородный орган с пальцем , гуид привязывается к плейте на время ее существования в поле зрения и удаляется при ее исчезновении. В луа нет деструкторов , только гарбаж калектор , который не выгружает фреймы , которыми является плейта , там механизм похож с на реализацию аур . Я когда то так же был одержим плейтами и копался в памяти игры , пытаясь найти алгоритм по которому плейта привязывается к обьекту (до чертиков хотелось кастбары и ауры сделать как на кате)
У меня сейчас заминки с пк ... вторник-четверг набросаю.
Последний раз редактировалось DreamlØlz; 17.01.2016 в 23:37.
А ты сделай прототип , 2 функции - одну я кидал на форум , определение типа юнита по гуиду , что бы определять игрок или нет (это упростит поиск плейты по маусоверу т.к в обычном случае для определения нейм плейты нужно навести курсор на саму плейту , что бы появился маусовер регион) и если это игрок тогда делать сравнение по нику , если ник совпадает тогда продолжать делать отсев по максимальному и текущему хп. И обработчик ивентов прямо на самой плейте , тогда перебор будет рекурсивный (циклы не йас) что ускорит работу. Ну и пару методов для самой плейты что бы не дублировать одинаковые куски кода, а сразу при ивенте вызывать метод и перекрашивать плейту или цеплять иконку.
Так не будет лагать.
Потом все что нужно делаеш с массивом plates , к примеруPHP код:local plates = {}
local FindPlates
do
local regionIndex = 0
local Overlay = [=[Interface\Tooltips\Nameplate-Border]=]
local IsNamePlate = function(obj)
local Name = obj:GetName()
local _, OverlayRegion = obj:GetRegions()
if(Name)then return end
return OverlayRegion and OverlayRegion:GetObjectType() == "Texture" and OverlayRegion:GetTexture() == Overlay
end
FindPlates = function(self)
local numRegions = self:GetNumChildren()
if numRegions ~= regionIndex then
regionIndex = regionIndex + 1
local obj = select(regionIndex, self:GetChildren())
if IsNamePlate(obj) and not plates[obj] then
print("найдена плейта", obj, regionIndex )
plates[obj] = true
end
FindPlates(self)
end
end
end
WorldFrame:HookScript("OnUpdate", FindPlates)
PHP код:for plate in pairs(plates) do
plate:Hide()
end
Последний раз редактировалось DreamlØlz; 19.01.2016 в 15:40.