Добавлен , опубликован

Основы Интерфейса

Содержание:
Здесь описаны все функции для работы с фреймами.
Для удобства, чтобы время не терять в поисках той или иной нативки. Убивает кучу времени на листание страниц в поисках нужной инфы.
события фрейма и его константы

регистр событии для фреймов

События синхронизированы, это значит, если вызвал один игрок, у других также выдает инфу. Все события eventId и их описание можно посмотреть в этом разделе у некоторых фреймов можно зарегистрировать только 1 триггер. Если попытаться задать новый триггер с этим событием, то старый триггер не работает. Приходилось все делать в одном триггере
---@param whichTrigger trigger
---@param frame framehandle
---@param eventId frameeventtype
---@return event
function BlzTriggerRegisterFrameEvent(whichTrigger, frame, eventId) end	-- (native)

фрейм-триггер, вызвавший триггер

Думаю, что не нужно объяснять это.
---@return framehandle
function BlzGetTriggerFrame() end	-- (native)

id событие триггера

Можно узнать какое событие запустило триггер. Можно все в одном триггере сделать. Однако, никогда не пробовал несколько разных событий фрейма вешать на один триггер, поэтому не знаю как это работает.
Только вам нужно знать у каких типов фреймов будет работать данное id событие. Можно посмотреть здесь , какие ивенты срабатывают у разных фреймов. Хотя это взято из хайва, есть не точности, нужно проверять
---@return frameeventtype
function BlzGetTriggerFrameEvent() end	-- (native)

Blz​Get​Trigger​Frame​Value() возвращает число value

некоторые фреймы могут изменять значения. Пример:
  • slider, scrollbar отображают изменение значение шкалы. Ивент: FRAMEEVENT_SLIDER_VALUE_CHANGED
  • при прокрутке колесиком мыши над фреймом отображается угол поворота колесиком +120° (вверх)/=120° (вниз). У большинства фреймов есть это событие. Ивент: FRAMEEVENT_MOUSE_WHEEL
  • popupmenu: в вызванном меню menu нажатие на вызывает номер прожатой ячейки (кнопки). Ивент: FRAMEEVENT_POPUPMENU_ITEM_CHANGED
---@return real
function BlzGetTriggerFrameValue() end	-- (native)

Blz​Get​Trigger​Frame​Text() возвращает строку (текст)

при вводе текста в фрейм выводит текст. В основном это работает у текстовых фреймов, где присутствовает возможность редактировать текст по ходу игру. Это у нас один фрейм такой - editbox. Можно вводить поле текст. Ивенты: FRAMEEVENT_EDITBOX_TEXT_CHANGED, FRAMEEVENT_EDITBOX_ENTER. Однако, editbox сам по себе не очень безопасен, может вызывать вылеты, если прожимать разные комбинации кнопок клавиатуры, к примеру системные кнопки.
---@return string
function BlzGetTriggerFrameText() end	-- (native)
три функции создания и удаление
три разные функции создания фрейма.

кат первые две

  • string name. первые две вызываются по шаблону (прописываают имя шаблона name), строго требуется fdf-шаблон, иначе не создадутся. Первая создает обычные фреймы, другая simpleframes. Нельзя в первой указать шаблон-simpleframe, также как и во второй шаблон обычных фреймов. Они не создадутся.
  • frame owner. Также важно подобрать фрейму верного родителя owner, не все фреймы могут подходить в качестве родителей. Пример для simpleframe/frame требуется указать дефолтный gameUI или похожий дефолтный фрейм. Для simpleframe лучше подбирать в качестве родителей simpleframe, аналогично, для frame - frame. Инвче не создается, если указать неправильный.
  • integer createContext. Это номер содержания (контекста). При создании фрейм имеет имя и номер-контекст. Вы можете обратиться BlzGetFrameByName(name, createContext).
  • integer priority. Неизвестно.
function BlzCreateFrame(name, owner, priority, createContext) end
function BlzCreateSimpleFrame(name, owner, createContext) end

Последняя функция создания фреймов

является универсальной, тк она может создавать собственные именные фреймы name. И ей не обязательно наследовать параметры шаблона inherits
  • string typeName - указывают тип фрейма. Каждый фрейм имеет свое поведение, и свойство. Чем-то они все похожи с долей отличия и возможностями.
  • string name - имя фрейма. В отличии от первых двух фреймов, где строго нужно было указывать имя шаблона, здесь можна задать фрейму собственное имя. У фрейма можно появится собственное имя благодаря триггеру, к которому можно обратиться через BlzGetFrameByName(name, createContext). Поэтому нативка этим и уникальна. Но это все по желанию картодела, не обязательно указывать имя, можно просто обнулить name="".
  • owner и createContext имеет те же параметры, что и указанных выше
  • string inherits - здесь можно указать шаблон, который фрейм может наследовать через импорт fdf-file и другие дефолтные шаблоны. Здесь тоже по желанию картодела, и не обязательно указывать шаблон inherits=""
function BlzCreateFrameByType(typeName, name, owner, inherits, createContext) end	-- (native)
удалить фрейм
function BlzDestroyFrame(frame)
позиционирование фрейма
Функции отвечают за расположение фреймов на экране. В одной статье уже это объяснялось более подробно
framepoints
Точки фрейма. Также многие функции позиционирования используют их для расположения, крепления
 FRAMEPOINT_TOPLEFT
 FRAMEPOINT_TOP
 FRAMEPOINT_TOPRIGHT
 FRAMEPOINT_LEFT
 FRAMEPOINT_CENTER
 FRAMEPOINT_RIGHT
 FRAMEPOINT_BOTTOMLEFT
 FRAMEPOINT_BOTTOM
 FRAMEPOINT_BOTTOMRIGHT

SetPoint

привязать фреймы двумя точками
Эта функция привязывает фрейм. Это периодически внутри движка будет двигать или растягивать фрейм. Растягивает фрейм (изменяет размеры) в том случае, если у фрейма несколько фрейм-точек закреплено к разным фрейм-точкам
  1. другого фрейма (если этот фрейм изменяет размеры)
  2. или двух остальных фреймам (если эти два фрейма изменяют позицию).
  • frame - фрейм, которого пытаемся привязать ко второму relative
  • point - framepoint фрейма frame, которую привязать к relativePoint
  • relative - фрейм, за которым пытаемя крепить frame. Это значит, всегда будет двигаться frame за relative
  • relativePoint - framepoint фрейма relative, к которой привязали point фрейма
  • x,y - оффсеты
---@param frame framehandle
---@param point framepointtype
---@param relative framehandle
---@param relativePoint framepointtype
---@param x real
---@param y real
---@return nothing
function BlzFrameSetPoint(frame, point, relative, relativePoint, x, y) end	-- (native)

Blz​Frame​Set​Abs​Point

Переместить фрейм в нужные координаты экрана
---@param frame framehandle
---@param point framepointtype
---@param x real
---@param y real
---@return nothing
function BlzFrameSetAbsPoint(frame, point, x, y) end	-- (native)

чистим привязку точек ​Blz​Frame​Clear​All​Points

чистим привязанные точки. Часто многие фреймы могут быть привязаны к другим фреймам. И поскольку мы не знаем привязан ли фрейм к чему-то, нужно его отвязать. Понимаете, привязанные фреймы не сдвинуть будет, внутри движка система будет двигать или растягивать фрейм. Чтобы этого не допустить, нужно почистить привязку фрейм-поинтов. Иначе, работает будет не так.
---@param frame framehandle
---@return nothing
function BlzFrameClearAllPoints(frame) end	-- (native)

Blz​Frame​Set​All​Points

привязывает все framepoints одного фрейма к framepoints другого. Это значит, что все точки совпадают.
right => right
left => left
top => top
bottom => bottom
bottomleft => bottomleft
bottomright => bottomright
topleft => topleft
topright => topright
Если первый фрейм имел другие размеры, то принимает те же размеры, что у второго. И все точки на указанном экране тоже располагаются. У этого есть недостатки: один фрейм будет ниже другого, а значит, он закроет собой вид. Короче, будет не видно. Но не стоит переживать, этому находят применение. Пример: рамку на кнопку, текст на кнопку, фон на кнопку, кнопку на невидимый фрейм, расширение фона за кнопкой итд. Это очень хорошо работает с кнопкой, которой можно изменять размеры. Изменяешь ей размеры, и остальное, следовательно, меняет за кнопкой
---@param frame framehandle
---@param relative framehandle
---@return nothing
function BlzFrameSetAllPoints(frame, relative) end	-- (native)

отключить/включить авто-позиционирование интерфейса

нужно понять что такое авто-позиционирование фреймов? Возможно, авто-позиционирование это следование фрейма за закрепленными фрейм-поинтами. Пример: SetPoint, BlzFrameSetAllPoints
---@param enable boolean
---@return nothing
function BlzEnableUIAutoPosition(enable) end	-- (native)
В интернете нашел:
Скрывает/показывает большую часть игрового интерфейса по умолчанию.
Не затронуты: мышь, кнопки управления, чат, сообщения, TimerDialog, Multiboard, Leaderboard и ConsoleUIBackdrop.
(De)Активирует некоторое автоматическое изменение положения фреймов по умолчанию
обращение к фреймам

по имени

к фрейму можно обратиться по имени. Все именные фреймы имеют названия, их указываются в шаблонах fdf-files. Большинство дефолтных имеют это имя. Однако, не ко всем можно обратиться. Это работает в том случае, если они созданы игрой. Да, есть указанные шаблоны, но они должны быть созданы. Созданному фрейму можно указать свое имя через нативку BlzCreateFrameByType
обратиться по имени можно к последнему созданному фрейму. Что это значит? Это значит, если в игре есть несколько фреймов с одинаковым именем, то нативки с этим именем ссылаются на последнего созданного фрейма. Работает это принцип и с потомками, прописанные в fdf, они ведь тоже создаются вместе с родителем
---@param name string
---@param createContext integer
---@return framehandle
function BlzGetFrameByName(name, createContext) end	-- (native)
получить имя фрейма
---@param frame framehandle
---@return string
function BlzFrameGetName(frame) end	-- (native)

по дефолтным константам

в рефе завезли константы, где записаны дефолтные фреймы игры. К ним можно обратиться через константы.
---@param frameType originframetype
---@param index integer
---@return framehandle
function BlzGetOriginFrame(frameType, index) end	-- (native)

связь родитель-ребенок

Установить фрейму родителя. По правилу у фрейма должен быть один родитель, и не может быть несколько. Так, что скорее всего перезаписывается ссылка на новый. И параметры наследования тоже должны измениться. Честно, ни разу не использовал эту функцию.
---@param frame framehandle
---@param parent framehandle
---@return nothing
function BlzFrameSetParent(frame, parent) end	-- (native)
Вычисляет родителя. возвращает фрейм-родителя.
---@param frame framehandle
---@return framehandle
function BlzFrameGetParent(frame) end	-- (native)
возвращает фрейм-потомка, не являющимся String/Texture. В варкрафте доступ к некоторым фреймам не получить обычным способом, только через потомков можно получить доступ к стандартным файлам.
---@param frame framehandle
---@param index integer
---@return framehandle
function BlzFrameGetChild(frame, index) end	-- (native)
возвращает число, таким образом мы можем у родителя узнать кол-во потомков-фреймов, не являющимися String/Texture. А от старших потомков еще узнать других. Это все меняет, так мы можем понимать сколько потомков
---@param frame framehandle
---@return integer
function BlzFrameGetChildrenCount(frame) end	-- (native)
visible frame. показ: вкл/выкл, проверка: видим ли фрейм
показать true/спрятать false фрейм. Фрейм при сокрытии становится невидимым, но в игре еще существует. Этот параметр также влияет и на потомков. Скрываешь родителя, скрываются потомки. Но такое наследование не работает у simpleframes, их не скроешь. Но сокрытие работает не мгновенно, есть задержка 0.01-0.02.
Чаще всего этой функцией задействуют картоделы, когда нужно убрать дефолтный интерфейс. И приходиться все убирать и скрывать. Однако, учтите, что это действие не всегда хорошо прячет дефолтные фреймы. Может задеть игровые процессы и вылететь, или скрывает частично, а значит, зависит от предка. Надо скрывать предка, или пробовать скрывать другими способами
function BlzFrameSetVisible(frame, visible) end	-- (native)
Видим ли фрейм игроку true/false. Если фрейм не существует, то обращение к нативки вызывает вылет. А еще BlzFrameIsVisible(frame) может вызывать десинхи.
function BlzFrameIsVisible(frame) end	-- (native)
enable frame. работа фрейма: вкл/выкл фрейм, проверка: включен ли фрейм
включить true/выключить false фрейм. Отключает работу фрейма:
  • отключается фокус; пример при вводе в поле editbox можно фокус снять, и тогда клава не будет фокусирована на фрейм;
  • отключен mouse control: это означает, что мышь не реагирует на отключенный фрейм, следовательно, не работают некоторые события фреймов на мышь, и конечно, не реагирует подсказка tooltip; mouse control это свое рода реакция на мышь, короче события наведения, клик и пр
  • при отключении mouse control занимаемая область фрейма становится открытой => через фрейм можно кликать по другим объектам, даже если их не видно. Короче, фреймы можно наслаивает друг на друга, и если сверху на кнопку наложить текст, то на эту кнопку вы не сможете прожать, тк текст мешает. Текст можно было отключить, дабы прожать кнопку. Это один из примеров юза
  • выключает авто-позиционирование фрейма, у вас не будет отключенный фрейм следовать за фрейм-точками;
  • ну и очевидно, из-за всего этого выше, перестают работать события фрейма, это триггеры фрейма не работают;
  • отпускает кнопку. Отключение отпускает кнопку, если она была зажата. У кнопок есть баг, когда кнопка залипает. И ее нужно отпустить. Только отключение помогает отпускать.
Я рассказал вам на что влияет отключение.
Т.е. фрейм можно выключить, но изображение остается видимым. После отключения фрейм занимает режим Disabled, у него может быть затемнена текстура и текст, пример как во время паузы. Этот режим задается в fdf-file. Если не задан в шаблонах, то ничего не будет видно визуально, просто не работает.
Этот параметр также влияет и на потомков. Отключаешь предка, отключаются потомки. Но такое наследование не работает у simpleframes, их не отключишь. Но отключение работает не мгновенно, есть задержка 0.01-0.02.
function BlzFrameSetEnable(frame, enabled) end	-- (native)
Включен ли фрейм игроку true/false. Если фрейм не существует, то обращение к нативки вызывает вылет. А еще BlzFrameGetEnable(frame) может вызывать десинхи.
---@param frame framehandle
---@return boolean
function BlzFrameGetEnable(frame) end	-- (native)
триггерный вызов клика
Можно вызвать триггерное прожатие на кнопку фрейма. И вызвать действие триггера, вызвать открытие меню итд. Многие дефолтные и самодельные фреймы я вызывал через BlzFrameClick (если такие фреймы имеют клики, у большинства фреймов есть клики. Даже, у таких типов как TEXT есть они. Но не у всех типов). Однако, не у всех дефолтных фреймов можно прожать триггером, пример кнопки инвентаря и коммандной панели не вызываются по клику, и такая возможность отключена. Но зато можно прожать по кнопкам меню, портрету и прочее.
---@param frame framehandle
---@return nothing
function BlzFrameClick(frame) end	-- (native)
редактирование текста фреймов
Есть такие текстовые фреймы, у них можно прочесть, отредактировать строку. Однако, не у всех типов она есть.

set/get/add text (работа со строкой текста)

установить/прочесть (получить)/добавить строку. Вроде добавление текста у text area работает, и мб у остальных
---@param frame framehandle
---@param text string
---@return nothing
function BlzFrameSetText(frame, text) end	-- (native)

---@param frame framehandle
---@return string
function BlzFrameGetText(frame) end	-- (native)

---@param frame framehandle
---@param text string
---@return nothing
function BlzFrameAddText(frame, text) end	-- (native)

установить лимит на строку SizeLimit

можно задать текстовому фрейму размер символов в строке
---@param frame framehandle
---@param size integer
---@return nothing
function BlzFrameSetTextSizeLimit(frame, size) end	-- (native)

---@param frame framehandle
---@return integer
function BlzFrameGetTextSizeLimit(frame) end	-- (native)

указать цвет тексту

Можно изменять цвет и прозрачность тексту фрейма.
---@param frame framehandle
---@param color integer
---@return nothing
function BlzFrameSetTextColor(frame, color) end	-- (native)
В качестве color указывают целочисленный 16-ричный цветовой код. Его можно получить из BlzConvertColor. или пример
BlzConvertColor takes integer a, integer r, integer g, integer b - вводите alpha (0-255), red (0-255), green (0-255), blue (0-255), и эта функция возвращает 16-ричный цветовой код.
Внутри fdf можно настроить цвет String/TEXT с помощью некоторых fdf функции. Но также можно раскрасить текст цветовыми кодами warcraft 3 при установке текста в качестве префикса |cff0021ff.
конвектор цветов

задать шрифт и размер шрифта

Warcraft 3 (Reforged V1.32.2) имеет шрифты для всех языков, найденных внутри war3.w3mod: шрифты лежат в игре в папке "Fonts\name"
  • frame - тектовый фрейм
  • fileName - название шрифта. тут для разных языков разные шрифты, можете посмотреть в UI/warskins.txt. Об этом можно прочесть тут
  • height - размер шрифта, отвечает за высоту
  • flags - неизвестно, не тестировал. часто ставлю 0.
---@param frame framehandle
---@param fileName string
---@param height real
---@param flags integer
---@return nothing
function BlzFrameSetFont(frame, fileName, height, flags) end	-- (native)
Теоретически шрифт также можно установить внутри кода с помощью BlzFrameSetFont. По какой-то странной причине это не работает для типа фрейма «TEXT» (V1.31.1).
примеры:
BlzFrameSetFont(stringFrame, "fonts\\dfst-m3u.ttf", 0.016, 0)
BlzFrameSetFont(stringFrame, "fonts\\nim_____.ttf", 0.013, 0)
BlzFrameSetFont(stringFrame, "fonts\\thowr___.ttf", 0.012, 0)
Использование этой native BlzFrameSetFont для задания размера шрифта, сильно отличающимся от исходного, может нарушить отображаемый текст.
тут для разных языков разные шрифты, можете посмотреть в UI/warskins.txt.
Если текст немного большой или мал, то его размер можно изменить через масштаб BlzFrameSetScale(frame, scale). Масштабирование не влияет на границы прямоугольного текста. Помните, что текст имеет невидимые прямоугольные размеры, и если указать их, то текст который не влез, обрезается. Можно не указывать widht,height через BlzFrameSetSize(frame, width, height) или обнулить какой-то один из этих параметров widht,height, тогда не будет ограничения на объем текста, и фрейм будет расширяться в зависимости от объема добавленого текста. типу TEXT нельзя динамично в течении игры изменять шрифт FontNative (ни в V1.31, ни в V1.32). Поэтому можно масштабировать таким образом.

выравнивание текста

Эта нативка показывает, как будет расположен/выравниваться текст.
Фрейм TEXT имеет невидимую прямоугольную рамку.
Вы можете задавать размер ширины и высоты рамки фрейма. Даже когда вы создадите фрейм TEXT, вы в этой области не можете кликать по объектам, тк клик идет по нашему TEXT. Это доказанный факт
для этих строчек указывают расположение текста внутри, короче это такое выравнивание текста. TextAlignment важен только тогда, когда текст задан прямоугольником. внутри Fdf разделены горизонтальное и вертикальное выравнивание:
---@param frame framehandle
---@param vert textaligntype
---@param horz textaligntype
---@return nothing
function BlzFrameSetTextAlignment(frame, vert, horz) end	-- (native)
Выравнивание по горизонтали (horizontal). Когда текстовому фрейму задан прямоугольник, он будет располагать отображаемый текст по оси X в этом TextJustify:
JUSTIFYRIGHT - по правому краю
JUSTIFYLEFT - по левому краю
JUSTIFYCENTER - в центре
Выравнивание по вертикали (vertical). Когда текстовому фрейму задан прямоугольник, он будет располагать отображаемый текст по оси Y в этом TextJustify. :
JUSTIFYTOP - по верхнему краю
JUSTIFYMIDDLE - посередине
JUSTIFYBOTTOM - по нижнему краю
К сожалению, нет выравния по ширине.
textaligntype
TEXT_JUSTIFY_TOP = ConvertTextAlignType(0)	
TEXT_JUSTIFY_MIDDLE = ConvertTextAlignType(1)
TEXT_JUSTIFY_BOTTOM = ConvertTextAlignType(2)	
TEXT_JUSTIFY_LEFT = ConvertTextAlignType(3)
TEXT_JUSTIFY_CENTER = ConvertTextAlignType(4)	
TEXT_JUSTIFY_RIGHT = ConvertTextAlignType(5)
включить/выключить фокус
У фрейма есть такое состояние как фокус, это не наведение мыши на кнопку, это другое.
Это такой режим. У разных видов фреймов он определяется по разному. Пример, можно прописать кнопке в fdf-file такой контрол - эффект фокуса, при нажимании у вас подсвечивается кнопка (по факту сверху накладывают полупрозрачную текстуру), и эффект отключается повторным нажатием.
Пример:
  • у кнопок подсвечивается рамка фокус. Пример, кнопка героя подсвечивается рамкой, когда у него лишний skill-point остается;
  • у контексного меню (popup menu) при выборе кнопки открывается меню (menu). Фокус наведен на меню popup menu. Когда игрок нвжимает на popup menu, у его видимым становится только одно menu
  • поле ввода (edit box): можно ввод переключить на edit box. Можно отобразить несколько полей (edit box), но ввод можно фокусировать только в одном. Можно прописать текст в edit box через триггер, но для этого он должен быть выделен фокусом
Надеюсь, вы поняли работу? Объяснено не так хорошо, поскольку фокусом я и сам мало пользуюсь. Но это просто доп флаг под выделение фрейма.
---@param frame framehandle
---@param flag boolean
---@return nothing
function BlzFrameSetFocus(frame, flag) end	-- (native)
задать цвет фрейму и прозрачность
можно задать цвет текстуре texture. Тестировалось. Однако, не всем фреймам можно задать цвет, практически только texture может менять цвет, в то же время как остальные этого не могут. Возможно и могут, но так подробно не тестировалось на всех фреймах. Времени нет.
---@param frame framehandle
---@param color integer
---@return nothing
function BlzFrameSetVertexColor(frame, color) end	-- (native)
BlzFrameSetVertexColor takes framehandle frame, integer color - эта функция подкрашивает текст в нужный цветовой код. Или можно цветовой код получить здесь
BlzFrameSetVertexColor(texture, BlzConvertColor(255, 255, 255, 1)) - чтобы получить. будет отображать текстуру без синего цвета. при использовании этой линии на текстуре архимага она станет желтоватой, как на изображении ниже
установить альфа-прозрачность фрейму
Задает прозрачность фрейму. Эти нативки редко мной использовались, поэтому не знаю всех подробностей.
Задать прозрачность изображению и тексту от 0-255. Данный размер кажется влияет не только на сам фрейм, но и на его потомков (не проверено). Хорошо, когда прозрачными становятся и потомки. Наверное, наследование и на потомков тоже не распространяется.
---@param frame framehandle
---@param alpha integer
---@return nothing
function BlzFrameSetAlpha(frame, alpha) end	-- (native)
получить размер прозрачности фрейма 0-255. Если фрейм не существует, то обращение к нативки вызывает вылет. А еще BlzFrameGetAlpha(frame) может вызывать десинхи.
---@param frame framehandle
---@return integer
function BlzFrameGetAlpha(frame) end	-- (native)
Неизвестно, есть ли какая то связь между Alpha и VertexColor через нативку BlzFrameSetVertexColor, или Alpha как отдельный параметр.
задать/получить число фрейма value real
Некоторые фреймы могут возвращать число
  • slider, scrollbar отображают изменение значение шкалы. Ивент: FRAMEEVENT_SLIDER_VALUE_CHANGED
  • при прокрутке колесиком мыши над фреймом отображается угол поворота колесиком +120° (вверх)/=120° (вниз). У большинства фреймов есть это событие. Ивент: FRAMEEVENT_MOUSE_WHEEL
  • popupmenu: в вызванном меню menu нажатие на вызывает номер прожатой ячейки (кнопки). Ивент: FRAMEEVENT_POPUPMENU_ITEM_CHANGED
Установить число фрейму
---@param frame framehandle
---@param value real
---@return nothing
function BlzFrameSetValue(frame, value) end	-- (native)
Получить число к фрейму. Наверняка, это нативка десинхает
---@param frame framehandle
---@return real
function BlzFrameGetValue(frame) end	-- (native)
задать текстуру
При изменении текстуры с помощью кода перестают работать заданные в fdf-file границы и настройки backdrop и похожих фреймов. фон может быть пустым, за исключением BackdropBackgroundSize
---@param frame framehandle
---@param texFile string
---@param flag integer
---@param blend boolean
---@return nothing
function BlzFrameSetTexture(frame, texFile, flag, blend) end	-- (native)
  • texFile - который необходимо указать для использования.
  • flag = 0 или 1. 0 - для растянутого режима; 1 - для режима плитки.
  • blend - имеет какое-то отношение к прозрачности. (false) выглядит странно, если в текстуре используется прозрачность
Использование BlzFrameSetTexture приведет к удалению BackdropEdgeFile.
задать модель
Модель можно задать таким фреймам как sprite, model, status bar и др. Не могу вспомнить гле еще можно было модели задавать. пример
Пишут, что моделям нужно камеру задать. Подобно портретам юнитов. Иначе их не увидешь.
---@param frame framehandle
---@param modelFile string
---@param cameraIndex integer
---@return nothing
function BlzFrameSetModel(frame, modelFile, cameraIndex) end	-- (native)
проиграть анимацию спрайту
---@param frame framehandle
---@param primaryProp integer
---@param flags integer
---@return nothing
function BlzFrameSetSpriteAnimate(frame, primaryProp, flags) end	-- (native)
где frame - фрейм, primaryProp - номер индекса анимации. воспроизводит анимацию модели по индексу, узнать их можно сконвертировав модель в MDL и открыв через блокнот посмотреть какая анимация в списке, начиная с нуля сверху вниз.
Сообщили, что primaryProp это не индекс анимации.
birth = 0
death = 1
stand = 2 при создании чаще проигрывает анимация stand
morph = 3
alternate = 4
flags - последняя цифра в функции скорее всего зациклить ли анимацию, не тестил. не знаю как воспроизвести. Ребята сообщили, что модель должна быть зациклена, чтобы это включать. Это в редакторе моделей работать
масштабирование фрейма scale
задает размер фрейма. Можно увеличивость размер фрейма. На самом деле, масштаб не всегда привязан к экранным размерам фреймов прямоугольника = width, height. Чаще всего, масштаб влияет на размер шрифта, модели фрейма, размера плитки и многое другое. У каждого что-то свое.
---@param frame framehandle
---@param scale real
---@return nothing
function BlzFrameSetScale(frame, scale) end	-- (native)
ширина и высота фрейма
влияет на размеры границы прямоугольника. Это влияет на экранные размеры прямоугольника. без этих размеров невозможна отобразить иззображение и текст, если ничего не указано.
установить ширину width и высоту height фрейму
---@param frame framehandle
---@param width real
---@param height real
---@return nothing
function BlzFrameSetSize(frame, width, height) end	-- (native)
получить ширину и высоту фрейма.
---@param frame framehandle
---@return real
function BlzFrameGetHeight(frame) end	-- (native)

---@param frame framehandle
---@return real
function BlzFrameGetWidth(frame) end	-- (native)
установить подсказку фрейму
На фрейм можно привязать подсказку. Чаще всего привязывают текстовую подсказку, когда наводишь курсором мыши на фрейм, и у вас отображается подсказка. Можно не только текст привязывать, но и другие типы. Можно привязывать вспомогательные и прочее для проверки как тут. Но рекомендуют отказаться, тк подобные проверки могут вызывать десинхи из-за BlzFrameIsVisible(frame). Но точно за десинхи не ручаюсь, тк не тестировал.
---@param frame framehandle
---@param tooltip framehandle
---@return nothing
function BlzFrameSetTooltip(frame, tooltip) end	-- (native)
привязать курсор к фрейму
данная нативка привязывать курсор в пределах прямоугольного экранного размера фрейма. То есть вы не сможете двигать курсор мыши за пределы фрейма.
---@param frame framehandle
---@param enable boolean
---@return nothing
function BlzFrameCageMouse(frame, enable) end	-- (native)
мин и макс размер, шаг и значение value
Некоторым видам фреймов можно задавать параметры. Например, скроллбар или слайдер. Где важно задать размер полосы от мин до макс, шаг и тек значение. Также можно задать Statusbar,SimpleStatusBar, которым важно задать шкалу прогресса.

устанавливает мин и макс значение.

значения мб любые.
---@param frame framehandle
---@param minValue real
---@param maxValue real
---@return nothing
function BlzFrameSetMinMaxValue(frame, minValue, maxValue) end	-- (native)

задает размер шага

влияет на переход полосы скроллбара или слайдера при перемещении мышкой. Честно, не помню, где еще так важен шаг.
---@param frame framehandle
---@param stepSize real
---@return nothing
function BlzFrameSetStepSize(frame, stepSize) end	-- (native)

Значение value

эти две нативки помогают изменять тек значение фрейма
function BlzFrameSetValue(frame, value) end -- (native)
function BlzFrameGetValue(frame) end -- (native)
скрыть дефолтные фреймы
это все фреймы указанные в константах. Однако, не все фреймы скрываются игрой. Остается черная полоса и кнопки коммандной панели.
---@param enable boolean
---@return nothing
function BlzHideOriginFrames(enable) end	-- (native)
уровень фрейма
задает уровень наслаивания фрейма. Уровень определяет как фреймы будет располагаться, выше или ниже. Самый высокий уровень определяет видимость, а также приорете mouse control в экранной области, а те фреймы, что ниже фрейма с высоким уровнем будут не видимы и не будет оказывать никакая реакция мыши на них.
---@param frame framehandle
---@param level integer
---@return nothing
function BlzFrameSetLevel(frame, level) end	-- (native)
загрузка toc
загружает в игру ток-файл. инфа
---@param TOCFile string
---@return boolean
function BlzLoadTOCFile(TOCFile) end	-- (native)
можно превратить с дебагом, тк BlzLoadTOCFile возвращает bool. Если ошибка ошибка или не правильно импортировали вернет false, иначе true.
function LoadToc(s)
    if BlzLoadTOCFile(s) then
        print("Loaded: "..s)
    else
        print("Failed to Load: "..s)
    end  
end
color-конверт a,r,g,b => целочисленный 16-ричный код
конверт такой больше нужен для перекраски текстуры и текста
---@param a integer
---@param r integer
---@param g integer
---@param b integer
---@return integer
function BlzConvertColor(a, r, g, b) end	-- (native)
Пример в каких функц это применяется:
BlzFrameSetVertexColor(frame, color)
BlzFrameSetTextColor(frame, color)
события мыши и константы
События и константы, говорят, что синхронизированы
мировые координаты x,y мыши
function BlzGetTriggerPlayerMouseX() end	-- (native)
function BlzGetTriggerPlayerMouseY() end	-- (native)
точка, определяющая положение мыши
---@return location
function BlzGetTriggerPlayerMousePosition() end	-- (native)
определет какая кнопка мыши была нажата (левая, правая или средняя)
переменные кнопок mousebuttontype
MOUSE_BUTTON_TYPE_LEFT = ConvertMouseButtonType(1)		
MOUSE_BUTTON_TYPE_MIDDLE = ConvertMouseButtonType(2)
MOUSE_BUTTON_TYPE_RIGHT = ConvertMouseButtonType(3)
---@return mousebuttontype
function BlzGetTriggerPlayerMouseButton() end	-- (native)
зарегистрировать события мыши можно с помощью этой нативки. Что-то в рефе через триггеры BJ создает.
TriggerRegisterPlayerEvent(trig, whichPlayer, event)
какие события мыши eventId можно указать. всего 3: нажатие down, отпускание up, перемещение move. Последний показыввет изменение положение курсора.
EVENT_PLAYER_MOUSE_DOWN = ConvertPlayerEvent(305)	
EVENT_PLAYER_MOUSE_UP = ConvertPlayerEvent(306)	
EVENT_PLAYER_MOUSE_MOVE = ConvertPlayerEvent(307)
как отследить какой eventId
---@return eventid
function GetTriggerEventId() end	-- (native)
юнит, на которого навели мышь
function BlzGetMouseFocusUnit() end	-- (native)
спрятать курсор мыши
Можно спрятать курсор мыши. Вы можете спрятать курсор, но прячет его не на постоянной основе. Если невидимый курсор мыши переместить в поле интерфейса, то настройка сбрасывается, и курсор становится видимым какое-то время. Можно отслеживать событиями фреймов MOUSE_ENTER и MOUSE_LEAVE, когда курсор входит в фрейм или покидает фрейм. Еще можно отслеживать перемещается ли курсор по карте событием bj_MOUSEEVENTTYPE_MOVE. Проблема сброса происходит из-за дефолтного интерфейса.
---@param enable boolean
---@return nothing
function BlzEnableCursor(enable) end	-- (native)
переместить курсор
---@param x integer
---@param y integer
---@return nothing
function BlzSetMousePos(x, y) end	-- (native)
скорее всего x,y - не координаты, а оффсеты от экрана. Выражены в целые числа, что вообще то необычно.
Вот так ставит курсор в центр экрана
call BlzSetMousePos(R2I(BlzGetLocalClientWidth() * 0.5), R2I(BlzGetLocalClientHeight() * 0.5 ))
размеры экрана монитора
Вроде возвращает размеры экрана монитора, но эти функуии асихронны, т.е. приводят к десинку
---@return integer
function BlzGetLocalClientWidth() end	-- (native)

---@return integer
function BlzGetLocalClientHeight() end	-- (native)
кнопки клавиатуры
уже изучали в данной теме
---@param whichTrigger trigger
---@param whichPlayer player
---@param key oskeytype
---@param metaKey integer
---@param keyDown boolean
---@return event
function BlzTriggerRegisterPlayerKeyEvent(whichTrigger, whichPlayer, key, metaKey, keyDown) end	-- (native)

---@return oskeytype
function BlzGetTriggerPlayerKey() end	-- (native)

---@return integer
function BlzGetTriggerPlayerMetaKey() end	-- (native)

---@return boolean
function BlzGetTriggerPlayerIsKeyDown() end	-- (native)
событие синхронизации игроков
по деситхронизации уже есть статья.
Функции, чтение которых может вызвать десинк
советуют их не использовать
BlzFrameGetText
BlzFrameGetTextSizeLimit
BlzFrameGetEnable
BlzFrameGetAlpha
BlzFrameGetValue
BlzFrameGetHeight
BlzFrameGetWidth
BlzFrameGetParent
BlzFrameIsVisible
Только события и их производные константы не вызывают десинхи. Тк там все синхронизировано.
константы
BlzGetTriggerFrame
BlzGetTriggerFrameEvent
BlzGetTriggerFrameValue
BlzGetTriggerFrameText
основные нативки
---@param whichTrigger trigger
---@param whichPlayer player
---@param prefix string
---@param fromServer boolean
---@return event
function BlzTriggerRegisterPlayerSyncEvent(whichTrigger, whichPlayer, prefix, fromServer) end	-- (native)

---@param prefix string
---@param data string
---@return boolean
function BlzSendSyncData(prefix, data) end	-- (native)

---@return string
function BlzGetTriggerSyncPrefix() end	-- (native)

---@return string
function BlzGetTriggerSyncData() end	-- (native)
нужен пример в качестве синхронизации.
код в качестве примера
do
    local real = MarkGameStarted
    function MarkGameStarted()
    real()


        local syncTrigger = CreateTrigger()
        for int = 0, bj_MAX_PLAYERS - 1 do
            BlzTriggerRegisterPlayerSyncEvent(syncTrigger, Player(int), "IsCursorMouseInGameZone", false)
        end
        TriggerAddAction(syncTrigger, function()
            
            local n = tonumber(BlzGetTriggerSyncData())
            
            print('SyncData: '..n)
            if inv[n].sight_activation then
                inv[n].sight_activation=false
                print('|cff00BFFFприцел итема деактивирован|r')
                unit_inv[h].num_actively_slot=0
            end
        end)

        local TriggerLeftClickOnSlot = CreateTrigger()
        TriggerRegisterPlayerMouseEventBJ( TriggerLeftClickOnSlot, Player(0), bj_MOUSEEVENTTYPE_DOWN )
        TriggerAddAction(TriggerLeftClickOnSlot,function()
            local n = GetPlayerId(GetTriggerPlayer())
            local h = GetHandleId(LastSelectUnit[n])
            if BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_LEFT then
                
            --если юнит получил приказ во время наведения, значит, что способность активирована.
            if inv[n].sight_activation and inv[n].current_num_slot==0 then
                    
                if GetLocalPlayer() == GetTriggerPlayer() then
                        
                    if BlzFrameIsVisible(w_tooltip) then
                        BlzSendSyncData("IsCursorMouseInGameZone", n)
                    end
                end
            end
        end)

        print("done")
    end
end
глобальные параметры селекта (выделения, выбора)
Вы можете отключать и включать выбор игроку. Пример, заклинание наведения на точку не при нацеливании не может выделять объектов, это как один из примеров управления интерфейс-функциями. Отключить еще можно визуальные составляющие
объекты могут быть выделены/не выделены, круг выбора отображается/не отображается
native EnableSelect takes boolean state, boolean ui returns nothing
при наведении объекты могут быть выделены/не выделены, визуальные части вроде круга, полоски жизни мана и хп, и подсказки-фреймы над головой
native EnablePreSelect takes boolean state, boolean ui returns nothing
при drag-select перетаскивании, а точнее выделение юнитов прямоугольной рамкой drag selection. выделяются/не выделяются объекты, включает/отключает визуальную рамку выделения drag selection box
native EnableDragSelect takes boolean state, boolean ui returns nothing
включить/отключить выделение юнита и круг выбора
function BlzIsSelectionEnabled takes nothing returns boolean
function BlzIsSelectionCircleEnabled takes nothing returns boolean
function BlzEnableSelections takes boolean enableSelection, boolean enableSelectionCircle returns nothing
индикатор
Создание индикатора = кружочка под юнитом.
Создаёт CImage как раз, который можно перехватить.
---@param whichUnit unit
---@param red integer
---@param green integer
---@param blue integer
---@param alpha integer
---@return nothing
function UnitAddIndicator(whichUnit, red, green, blue, alpha) end	-- (native)
---@param whichWidget widget
---@param red integer
---@param green integer
---@param blue integer
---@param alpha integer
---@return nothing
function AddIndicator(whichWidget, red, green, blue, alpha) end	-- (native)
отобразить текст/очистить текст
выводит системные сообщения на экран. можно выводить на экран системные ошибки итд.
---@param toPlayer player
---@param x real
---@param y real
---@param message string
---@return nothing
function DisplayTextToPlayer(toPlayer, x, y, message) end	-- (native)

---@param toPlayer player
---@param x real
---@param y real
---@param duration real
---@param message string
---@return nothing
function DisplayTimedTextToPlayer(toPlayer, x, y, duration, message) end	-- (native)

---@param toPlayer player
---@param x real
---@param y real
---@param duration real
---@param message string
---@return nothing
function DisplayTimedTextFromPlayer(toPlayer, x, y, duration, message) end	-- (native)

---@param whichPlayer player
---@param recipient integer
---@param message string
---@return nothing
function BlzDisplayChatMessage(whichPlayer, recipient, message) end	-- (native)
убирает текст с экрана, кроме того чистит хорошо и журнал сообщении. Работает неплохо с GetLocalPlayer() длч очистки локально
---@return nothing
function ClearTextMessages() end	-- (native)
локализация
так понял, что BlzGetLocale показывает локализацию. то есть на каком языке играет пользователь. Функция асихронна.
Возвращает использованный warcraft 3 Lcid.
Английский (США) = 'enUS'
английский (Великобритания) = 'enGB'
Французский = 'frFR'
немецкий = 'deDE'
Испанский = 'esES'
итальянский = 'itIT'
Чехия = 'csCZ'
русский = 'ruRU'
польский = 'plPL'
Португальский (бразильский) = 'ptBR'
Португальский (Португалия) = 'ptPT'
Турецкий = 'tkTK'
Японский = 'jaJA'
Корейский = 'koKR'
Китайский (традиционный) = 'zhTW'
Китайский (упрощенный) = 'zhCN'
Тайский = 'thTH'

note Warcraft 3 Lcids можно найти в файле config.ini внутри CASC.
---@return string
function BlzGetLocale() end	-- (native)
BlzIsLocalClientActive
Возвращает true, если окно Warcraft 3 находится в фокусе. Функция асихронна
---@return boolean
function BlzIsLocalClientActive() end	-- (native)
мини-иконка, пинги и пр
установить иконку мини-карты
---@param iconPath string
---@return nothing
function SetAltMinimapIcon(iconPath) end	-- (native)
пинги мини карты
мигающая отметка на мини-карте. Чаще всего это отметка отмечается игроком для других игроков, чтобы указать конкретное место на карте. Или просто обратить внимание союзников или игроков на чем-то. Также эти отметки можно создать триггерно, чтобы указать игроку на место квеста и др.
---@param x real
---@param y real
---@param duration real
---@return nothing
function PingMinimap(x, y, duration) end	-- (native)

---@param x real
---@param y real
---@param duration real
---@param red integer
---@param green integer
---@param blue integer
---@param extraEffects boolean
---@return nothing
function PingMinimapEx(x, y, duration, red, green, blue, extraEffects) end	-- (native)
фильтры мини-карты
задает цветовой режим:
  • режим 1. цвета игроков.
  • режим 2. союзники и противники. отображпют всех юниты союзника, в том числе и своих, под цвета голубого, и вражеских красным.
  • режим 3. ваши войска, союзники и противники. отображает всех союзников только одним цветом (чаще собственныве юниты изукрашиваются синим, а союзники голубым). Не только на мини-карте, но и на экране отображается смена цвета, юниты теряют team-color.
---@return integer
function GetAllyColorFilterState() end	-- (native)

---@param state integer
---@return nothing
function SetAllyColorFilterState(state) end	-- (native)
отображать вражеских нейтральных юнитов на карте (чаще всего отображаются на мини-карте вражеские лагеря)
---@return boolean
function GetCreepCampFilterState() end	-- (native)

---@param state boolean
---@return nothing
function SetCreepCampFilterState(state) end	-- (native)
неизвестно
---@param enableAlly boolean
---@param enableCreep boolean
---@return nothing
function EnableMinimapFilterButtons(enableAlly, enableCreep) end	-- (native)

---@param flag boolean
---@param fadeDuration real
---@return nothing
function ShowInterface(flag, fadeDuration) end	-- (native)
загрузка текстуры мини-карты
можно загрузить текстуру для мини карты. жаль не прорисовывает (плохо изучено)
---@param texFile string
---@return boolean
function BlzChangeMinimapTerrainTex(texFile) end	-- (native)
установить туман для террейна (плохо изучено)
сам террейн иногда бывает плохо видим на мини карте, поэтому иногда закрашивают его темным на мини карте
---@param a real
---@param b real
---@param c real
---@param d real
---@param e real
---@return nothing
function SetTerrainFog(a, b, c, d, e) end	-- (native)

---@return nothing
function ResetTerrainFog() end	-- (native)

---@param a real
---@param b real
---@param c real
---@param d real
---@param e real
---@return nothing
function SetUnitFog(a, b, c, d, e) end	-- (native)

---@param style integer
---@param zstart real
---@param zend real
---@param density real
---@param red real
---@param green real
---@param blue real
---@return nothing
function SetTerrainFogEx(style, zstart, zend, density, red, green, blue) end	-- (native)

---@param show boolean 
---@return nothing
function BlzShowTerrain(show)

---@param show boolean 
---@return nothing
function BlzShowSkyBox(show)
мини-иконка minimapicon
---@param whichUnit unit 
---@param red integer
---@param green integer
---@param blue integer
---@param pingPath string
---@param fogVisibility fogstate
---@return minimapicon
function CreateMinimapIconOnUnit(whichUnit, red, green, blue, pingPath, fogVisibility)


---@param where location 
---@param red integer
---@param green integer
---@param blue integer
---@param pingPath string
---@param fogVisibility fogstate
---@return minimapicon
function CreateMinimapIconAtLoc(where, red, green, blue, pingPath, fogVisibility)

---@param x real 
---@param y real 
---@param red integer
---@param green integer
---@param blue integer
---@param pingPath string
---@param fogVisibility fogstate
---@return minimapicon
function CreateMinimapIcon(x, y, red, green, blue, pingPath, fogVisibility)

---@param whichMinimapIcon minimapicon 
---@return nothing
function DestroyMinimapIcon(whichMinimapIcon)

---@param whichMinimapIcon minimapicon 
---@param visible boolean 
---@return nothing
function SetMinimapIconVisible(whichMinimapIcon, visible)

---@param whichMinimapIcon minimapicon 
---@param doDestroy boolean 
---@return nothing
function SetMinimapIconOrphanDestroy(whichMinimapIcon, doDestroy)
таргет индикатор
таргет индикатор. можно включить индикатор нацеливания
---@param enable boolean
---@return nothing
function BlzEnableTargetIndicator(enable) end	-- (native)
---@return boolean
function BlzIsTargetIndicatorEnabled() end	-- (native)
EnableUserControl
Влияет на работу user control: это выделение мышкой, хп бар, круги и пр. Все что связанное вспомогательные элементы на карте отключены. Тут ещеси мышь отключена.
Вроде эта функц для синематиков вкрубают, чтобы это все не мешало на экране
Кстати, в работе с фреймами это еще и решает баг
---@param b boolean
---@return nothing
function EnableUserControl(b) end	-- (native)
EnableUserUI
Вроде что-то делает с интерфейсом. Отключает UI. Вроде это работа с UI синематиками. Эта функц убирает стандартный интерфейс

заменяет UI синематика.
function EnableUserUI(b) end    -- (native) 
IntroShot вступление
отвечает за модель и описание текста в загрузочном ролике
---@param introText string
---@return nothing
function SetIntroShotText(introText) end    -- (native)

---@param introModelPath string
---@return nothing
function SetIntroShotModel(introModelPath) end    -- (native)
неизвестно
---@param reserved integer
---@return nothing
function SetReservedLocalHeroButtons(reserved) end	-- (native)

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...