Добавлен
как работают эти функции в мемхаке 1.5?
    function GetFramePointX takes integer pFrame, integer point returns real
        local integer pFramePoint = GetFramePoint( pFrame, point )

        if pFramePoint > 0 then
            return GetRealFromMemory( ReadRealMemory( GetFramePoint( pFrame, point ) + 0xC ) )
        endif

        return 0.
    endfunction

    function GetFramePointY takes integer pFrame, integer point returns real
        local integer pFramePoint = GetFramePoint( pFrame, point )

        if pFramePoint > 0 then
            return GetRealFromMemory( ReadRealMemory( GetFramePoint( pFrame, point ) + 0x10 ) )
        endif

        return 0.
    endfunction
я думал что возвращает x, y точки фрейма в декартовой системе координат экрана но там какие-то 9999999+ цифры, можно ли получить вообще x y одной из 9 точек фрейма?

Загляни в триггер MemHackUIAPI, там много примеров использования фреймов.
По делу - конкретный пример использования GetFramePointX
call BJDebugMsg(R2S(GetFramePointX(GetUIHeroBar(), 0)))
Первым аргументом в GetFramePointX суем айди самого фрейма, его можно получить двумя способами:
  1. по названию
function GetFrameByName takes string name,integer id returns integer
Названия всех фреймов удобно показаны здесь: www.hiveworkshop.com/threads/default-names-for-blzgetframebyname... (под катом images)
  1. по уже готовым функциям мемхака, они в триггере APIMemoryGameUI, что я и использовал в примере.
Второй аргумент это точка на фрейме (центр, левая нижняя, правая верхняя, т.п.), константы к ним объявлены в MemHackUIAPI.
Важно еще сказать, что для многих фреймов GetFramePointX|Y может возвращать 0.000, ибо возвращает она не абсолютную позицию фрейма, а относительно родителя. За деталями советую по ссылке выше, там целая серия статей эту тему.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
15
Координаты у фреймов расположены в диапазоне [0,0] - [0.8,0.6], где 0,0 это левый нижний угол. Скриншоты для наглядности
Больше инфы по фреймам: www.hiveworkshop.com/threads/ui-positionate-frames.315860
(статьи для рефорджета, но почти вся инфа кроме названия функций актуальна для мемхака)
Если возвращает огромные непонятные числа, значит неправильно как-то используешь.
Загруженные файлы
28
Если возвращает огромные непонятные числа, значит неправильно как-то используешь.
вот я и спрашиваю как использовать, всё что выше этой цитаты никакой полезной инфы мне не дало, то что ты рассказал про 0.8, 0.6 это и есть декартовая система координат, о которой я в курсе и уже упоминал в самом вопросе:
я думал что возвращает x, y точки фрейма в декартовой системе координат экрана но там какие-то 9999999+ цифры, можно ли получить вообще x y одной из 9 точек фрейма?
могу ошибаться, но может сами функции неисправны и есть у кого-то исправленные версии, если же всё в порядке с ними, то нужно объяснение как пользоваться, может сверху ещё несколько конвертирующих функций нужно накинуть
15
Загляни в триггер MemHackUIAPI, там много примеров использования фреймов.
По делу - конкретный пример использования GetFramePointX
call BJDebugMsg(R2S(GetFramePointX(GetUIHeroBar(), 0)))
Первым аргументом в GetFramePointX суем айди самого фрейма, его можно получить двумя способами:
  1. по названию
function GetFrameByName takes string name,integer id returns integer
Названия всех фреймов удобно показаны здесь: www.hiveworkshop.com/threads/default-names-for-blzgetframebyname... (под катом images)
  1. по уже готовым функциям мемхака, они в триггере APIMemoryGameUI, что я и использовал в примере.
Второй аргумент это точка на фрейме (центр, левая нижняя, правая верхняя, т.п.), константы к ним объявлены в MemHackUIAPI.
Важно еще сказать, что для многих фреймов GetFramePointX|Y может возвращать 0.000, ибо возвращает она не абсолютную позицию фрейма, а относительно родителя. За деталями советую по ссылке выше, там целая серия статей эту тему.
Принятый ответ
21
Мемхак достаточно багнутый, я вроде пытался юзать эти функции и не получалось

GetFrameByName юзать тоже бесполезно, испробовал все названия с хайва...
28
ofeerist, то что возвращает не абсолютную позицию точки фрейма мне уже хватило, получается работает не так как хотелось бы
12
Даро передает вам послание от владыки Анрайза

call BJDebugMsg( "GetCFrameByName( GoldText, 0 ) = " + IntToHex( GetCFrameByName( "GoldText", 0 ) ) )
GetFrameByName в МемХаке сделан для получения именно фреймов типа CFrame, он не был сделан как в рефорджеде на все фреймы, ибо на момент написания МемХакАПИ оно было банально не нужно.
GetFramePointX/Y принимают значение point не просто так, а подробнее:
TopLeft = 0
TopCenter = 1
TopRight = 2
Left = 3
Center = 4
Right = 5
BottomLeft = 6
BottomCenter = 7
BottomRight = 8
Потому, если фрейм не имеет крепления к TopLeft, а допустим к Center, то нужно вызывать GetFramePointX( frame, 4 ) а не 0. И так далее.
Багов в МемХаке кроме GetTerrainAxisZ не наблюдается, потому не совсем понятно о каких багах речь.
Оффсет для получения CSimpleFrame по имени на 1.26а = 0x61C770
Оффсет для получения CSimpleTexture по имени на 1.26а = 0x61C790
Оффсет для получения CSimpleFontString по имени на 1.26а = 0x61C7B0
Собственно для них есть функции:
function GetCSimpleFrameByName takes string name, integer id returns integer
if pGetCSimpleFrameByName > 0 then
if name != "" then
return fast_call_2( pGetCSimpleFrameByName, GetStringAddress( name ), id )
endif
endif

return 0
endfunction

function GetCSimpleFontByName takes string name, integer id returns integer
if pGetCSimpleFontByName > 0 then
if name != "" then
return fast_call_2( pGetCSimpleFontByName, GetStringAddress( name ), id )
endif
endif

return 0
endfunction

function GetCSimpleTextureByName takes string name, integer id returns integer
if pGetCSimpleTextureByName > 0 then
if name != "" then
return fast_call_2( pGetCSimpleTextureByName, GetStringAddress( name ), id )
endif
endif

return 0
endfunction
Итого, всё что нужно сделать свой враппер и вызвать каждую из функций, пока какая-либо не вернёт адрес отличный от 0.
И получился:
function GetFrameByName takes string name, integer id returns integer
local integer addr = GetCFrameByName( name, id )

if addr == 0 then
set addr = GetCSimpleFrameByName( name, id )
endif

if addr == 0 then
set addr = GetCSimpleTextureByName( name, id )
endif

if addr == 0 then
set addr = GetCSimpleFontByName( name, id )
endif

return addr
endfunction 
28
Daro, я уже понял, у меня был рассчет получить абсолютную точку фрейма в декартовой системе координат, это просто не то
12
rsfghd,
Фреймы не работают на декартовой системе координат, но имеют понятие Абсолютной позиции, но они все транслируются на координатах от -1 до 1, ибо они рисуются на ЭКРАН, а не на МИР, где есть XYZ. У экрана лишь X/Y в пикселях. Очень нелогично делать декартовую систему координат, ибо тогда придётся на каждое разрешение делать свои координаты и т.д.
Для Абсолютной позиции есть GetFrameAbsolutePoint и SetFrameAbsolutePoint, но и она как и описано выше не использует декартовую систему координат, не стоит в общем путать то, что рисуется на CWorldFrameWar3, а что идёт на CGameUI (интерфейс/экран).
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.