[RenderEdge] Основная версия

» опубликован

Актуальная версия v0.2.7a

Особенности

  1. Система отрисовки пользовательского интерфейса:
    • (+) Основная система;
    • (+) Управление при помощи Jass функций;
    • (+) Поддержка многострочного текста с форматированием;
    • (+) Поддержка .ttf формата шрифтов;
  1. Постобработка:
    • (-) HDR Rendering;
    • (-) Пост-эффекты;
    • (-) Управление при помощи Jass функций;
  1. Улучшенное освещение:
    • (-) Попиксельное освещение;
    • (-) Поддержка .dds/.blp2 формата текстур для .mdx/.mdl моделей;
    • (-) Поддержка пользовательских шейдеров;
    • (-) Генерация кубических карт окружения;
    • (-) Shadow Mapping;
    • (-) Поддержка карт нормалей;
  1. Совместимость:
    • (+) Поддержка Direct3D8;
    • (+) Поддержка Direct3D9;
    • (+) Поддержка широкоформатных мониторов;
  1. Прочее:
    • (+) Уменьшение задержки между приказами в игре;
    • (+) Запуск более одного экземпляра war3.exe одновременно.

Скриншоты

Custom Natives

» Дополнительные константы
// TriggerRegisterMouseEvent & TriggerRegisterKeyEvent
constant integer MB_Left = 0
constant integer MB_Middle = 1
constant integer MB_Right = 2
constant integer MB_X1 = 3
constant integer MB_X2 = 4
constant integer KEY_Any = -1
constant integer EVENT_Down = 0
constant integer EVENT_Up = 1

// CtrlSetAnchor & SetPortrait
constant integer ANCHOR_TOPLEFT = 0
constant integer ANCHOR_TOP = 1
constant integer ANCHOR_TOPRIGHT = 2
constant integer ANCHOR_LEFT = 3
constant integer ANCHOR_CENTER = 4
constant integer ANCHOR_RIGHT = 5
constant integer ANCHOR_BOTTOMLEFT = 6
constant integer ANCHOR_BOTTOM = 7
constant integer ANCHOR_BOTTOMRIGHT = 8
» Mouse API
native int GetMouseX() // Возвращает положение курсора в экранных координатах
native int GetMouseY()
native int GetMouseXRelative()
native int GetMouseYRelative()
native float GetMouseTerrainX() // Возвращает проекцию позиции курсора на ландшафт
native float GetMouseTerrainY()
native float GetMouseTerrainZ()
native bool IsMouseOverUI() // Находится ли курсор над стандартным интерфейсом или нет?
native void BlockMouse(bool bBlock) // Блокирует входные сообщения от мыши (перемещение, нажатия), передаваемые в игру
native int GetWheelDelta() // Возвращает направление/скорость вращения колёсика мыши (положительное значение указывает на то, что колесо вращается вперед)
native void SetMousePos(int x, int y) // Устанавливает положение курсора
native void TriggerRegisterMouseWheelEvent(trigger trig) // Триггер срабатывает при прокрутки колёсика мыши
native void TriggerRegisterMouseMoveEvent(trigger trig) // Триггер срабатывает при перемещении курсора
native void TriggerRegisterMouseEvent(trigger trig, int iButton, int state) // Триггер срабатывает при нажатии (state == 0) / отпуске (state == 1) кнопки iButton (поставьте iButton == -1, чтобы отлавливать все кнопки мыши)
» Keyboard API
native int GetTriggerKey() // Возвращает последнюю нажатую клавишу
native bool IsKeyDown(int iKey) // Нажата ли клавиша?
native void TriggerRegisterKeyEvent(trigger trig, int iKey, int state) // Триггер срабатывает при нажатии (state == 0) / отпуске (state == 1) клавиши iKey (поставьте iKey == -1, чтобы отлавливать любые клавиши)
» Window API
native int GetWindowWidth() // Возвращает ширину экрана в полноэкранном режиме, либо ширину окна в оконном
native int GetWindowHeight()
native int GetWindowX() // Возвращает координаты окна
native int GetWindowY()
native void TriggerRegisterWindowResizeEvent(trigger trig) // Триггер срабатывает при изменении размера окна
» GUI API
native void CtrlNew(int id, int offsetX, int offsetY, int width, int height) // Создаёт новый экземпляр элемента GUI (id >= 0)
native void CtrlSetText(int id, string text, bool bWrap) // bWrap: если текст заходит за пределы ширины, заданной при создании элемента GUI, то происходит переход на новую строку
native void CtrlSetColor(int id, int argb) // Красит элемент GUI в заданный цвет
native void CtrlSetAnchor(int id, int parentId, int anchor) // Выравнивание элемента. Установите parentId = -1, чтобы выравнивание шло относительно всего окна
native void CtrlSetTexture(int id, string filename) // Устанавливает текстуру элемента
native void CtrlSetSize(int id, int width, int height) // Устанавливает размер элемента. Функция не изменяет ширину или высоту, если установить соответствующий аргумент равным -1;
native void CtrlSetPosition(int id, int offsetX, int offsetY) // Устанавливает позицию элемента
native void CtrlShow(int id, bool isShow) // Показывает (true) / скрывает (false) элемент GUI
native void CtrlSetDepth(int id, float fDepth) // Определяет порядок поиска элементов GUI функцией CtrlGetFromMousePoint. Чем значение fDepth меньше, тем элемент расположен ближе к экрану (1.0 по умолчанию)
native void CtrlSetAngle(int id, float fAngle) // Устанавливает угол поворота элемента GUI (в радианах)
native int CtrlGetWidth(int id)
native int CtrlGetHeight(int id) // Используется, чтобы узнать высоту элемента GUI после применения функции CtrlSetText с аргументом "bWrap" == true
native int CtrlGetFromPoint(int x, int y) // Возвращает элемент, расположенный по заданным координатам (если такого нет, возвращает -1)
native bool CtrlIsText(int id) // Является ли элемент GUI текстом?
native void CtrlSetFont(int id, string fontName, int size) // Устанавливает шрифт для указанного элемента GUI (по умолчанию используется "Consolas" с размером 13)
native void GUILoadFont(string fileName) // Загружает шрифт по указанному пути в память
» Misc API
native float GetFPS() // Возвращает количество кадров в секунду
native float GetDeltaTime() // Возвращает количество времени, затрачиваемое на отрисовку одного кадра (в секундах)
native int COLOR_ARGB(int a, int r, int g, int b) // Переводит цвет из ARGB формата в шестнадцатеричное значение
native void EnableVsync(bool bEnable) // Включает/выключает вертикальную синхронизацию
native void TriggerRegisterFrameUpdateEvent(trigger trig) // Триггер срабатывает каждый кадр
native bool IsGamePaused() // Находится ли игра на паузе?
native void SetBlackBorders(float upper, float bottom) // Изменяет расположение чёрных границ по оси y (значения находятся в промежутке от 0.0 до 0.6). Значения по умолчанию - upper = -0.02, bottom = 0.13.
native void SetPortrait(int anchor, int x, int y, int width, int height) // Устанавливает расположение и ширину портрета в пикселях. Выравнивание идёт относительно всего окна.
» Lighting API
N/A
» Post-processing API
N/A

Установка


Требования:

  • Архив можно извлечь в любое место;
  • При первом запуске нужно указать расположение war3.exe;
  • Индикатором того, что мод был успешно запущен, является надпись "RenderEdge" с текущей версией мода в левом верхнем углу экрана;
  • Для запуска в режиме отладки измените значение параметра "Debug" на "1" (HKEY_CURRENT_USER\SOFTWARE\RenderEdge);
  • Для подключения RenderEdge к Jass New Gen Pack (exp. 2) скачайте и замените файл wehack.lua в папке с JNGP (заменяет вкладку с RtC). Либо отредактируйте его самостоятельно:
» wehack.lua
Пример того, как выглядит wehack.lua после редактирования
-- # begin RenderEdge #
RenderEdgePath = grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "InstallPath")
haveRenderEdge = grim.exists(RenderEdgePath .. "\\RenderEdge.exe")

function toggleRenderEdgeDebug(checked)
    if checked then
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug", 1)
	else
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug", 0)
	end
end

if haveRenderEdge then
	RenderEdgeMenu = wehack.addmenu("RenderEdge")
	RenderEdgeEnabled = TogMenuEntry:New(RenderEdgeMenu, "Run with RenderEdge", nil, true)
	RenderEdgeDebug = TogMenuEntry:New(RenderEdgeMenu, "Debug Mode", 
	    function(self) toggleRenderEdgeDebug(self.checked) end, false)
	if grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug") == 1 then
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeDebug, 1)
	else
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeDebug, 0)
	end
end
-- # end RenderEdge #

function testmap(cmdline)
	if haveRenderEdge and RenderEdgeEnabled.checked then
		local pos = string.find(cmdline, ".exe")
		cmdline = string.sub(cmdline, 5 + pos)
		cmdline = RenderEdgePath .. "RenderEdge.exe " .. cmdline
	end
	
	if wh_opengl.checked then
		cmdline = cmdline .. " -opengl"
	end
	if wh_window.checked then
		cmdline = cmdline .. " -window"
	end
	wehack.execprocess(cmdline)
end

Примеры

Карта написана на vJass и содержит демонстрацию использования всех функций RenderEdge. Карта обновляется каждый раз, при выпуске новой версии RenderEdge.
Особенности карты:
  • Система пользовательского интерфейса (виджеты: Label, Button, Dragbox, Checkbox, Horizontal Slider);
  • Редактирование стандартного интерфейса;
  • Система управления камерой.

Список изменений

v0.2.7a
  * Обновлён RenderStage Controller (улучшен перехват отрисовки стандартного интерфейса);
  * Исправлены баги в JassAPI (некорректная конвертация real <=> float);
  * Исправлены баги в функциях CtrlSetDepth и CtrlSetAngle;
  * Исправлены слайдеры и чекбоксы в карте-примере;
  * Добавлены описания .exe и .dll файлов.

v0.2.6a
  * Убран лимит на размер 512p в .blp тексурах (спасибо Karaulov`у);
  * Добавлена новая native функция CtrlSetZOrder (порядок отрисовки элементов интерфейса);
  * Добавлена новая native функция EnableAnisoFiltering (возможность установить анизотропную фильтрацию текстур);
  * Добавлена новая native функция HideInterface;
  * Добавлены новые native функции: EditMinimap, EditCommandBarButton, EditHeroBarButton, EditItemBarButton, EditMinimapButton и EditUpperButtonBarButton;
  * Изменено название функций SetPortrait и SetBlackBorders на EditPortrait и EditBlackBorders;
  * Исправлено большое количество багов в RenderEdge_loader.dll и RenderEdge.exe;
  * Исправлен некорректный перенос строки при использовании символа "|n" во wrapped тексте;
  * Исправлено большое количество багов в GUI-системе (например, баг с функцией CtrlSetTexture при перезапуске карты);
  * Оптимизирована GUI-система. Некоторые функции переписаны с нуля;
  * Оптимизированы менеджеры шрифтов и текстур;
  * Обновлены detours.lib и libjpeg.lib до последней версии;
  * Улучшен и оптимизирован debug log.

v0.2.5a
  * Добавлена новая native функция GUILoadFont;
  * Добавлена новая native функция CtrlSetFont;
  * Удалена функция GUISetFont;
  * Исправлены вылеты при установке некоторых шрифтов (например, "Times New Roman");
  * Исправлена высота однострочного текста;

v0.2.4a
  * Добавлена новая native функция SetPortrait;
  * Функция CtrlSetSize теперь не изменяет ширину или высоту, если вы установите соответствующий аргумент равным -1;
  * Изменено имя функции CtrlSetAlignment на CtrlSetAnchor;
  * Изменён способ исправления ширины полосок здоровья;
  * Исправлено выравнивание динамических элементов по отношению к другим элементам пользовательского интерфейса;
  * Исправлена высота wrapped текста;
  * Исправлена высота wrapped текста при динамическом изменении ширины;
  * Исправлены проблемы с безопасностью. Если жирный, курсивный или полужирный курсивный шрифт недоступен, используется обычный шрифт.

v0.2.3b
  * Исправлено выравнивание относительно других элементов интерфейса.

v0.2.3a
  * Добавлена новая native функция CtrlSetSize;
  * добавлена новая native функция CtrlSetAlignment;
  * Функции CtrlSetPosition и CtrlNew теперь принимают offsetX и offsetY вместо x и y;
  * Удалена функция CtrlSetRect.

v0.2.2a
  * Добавлена новая native функция IsGamePaused;
  * Добавлена новая native функция SetBlackBorders;
  * Обновлен Jass API, исправлены некоторые баги связанные с пользовательскими нативными функциями;
  * Исправлены нативные функции, которые принимают аргументы тира boolean;
  * Исправлено повторное добавление триггеров функциями TriggerRegister#Event после перезапуска карты;
  * Функция EnableVsync теперь работает без необходимости сворачивать игру;
  * Исправлена ошибка, при которой новые элементы GUI не имели зеленой текстуры по умолчанию;
  * Улучшен debug log. Лог файл очищается, если размер превышает 100 КБ.

v0.2.1b
  * Исправлены вылеты при вызове функций CtrlSetText, CtrlSetTexture и GUISetFont (проблема с конвертацией UTF-8 в ASCII);
  * Удалено нестабильное нововведение из предыдущей версии: "Убрано стандартное ограничение минимальной дистанции камеры до цели";
  * Обновлён FreeType до версии 2.8;
  * Обновлён RenderEdge_loader.dll. Теперь он ищет RenderEdge_exp.dll, если не нашёл, то запускает RenderEdge.dll;
  * Добавлен счётчик памяти, используемой варкрафтом;
  * Оптимизация GUI системы;
  * Оптимизация Widescreen fix;
  * Оптимизация debug log. Система отладки переписана с нуля.

v0.2.1a
  * Обновлён Widescreen Fix. Вертикальный угол обзора больше не зависит от ширины экрана;
  * Снято ограничение на максимальный FPS, теперь он может подниматься выше 64 с выключенным vsync (спасибо Karaulov'у);
  * Убрано стандартное ограничение минимальной дистанции камеры до цели (было 100.0, теперь можно установить до 0.01);
  * Использование более точного формата буфера глубины, если поддерживается. Используйте SetCameraField(ConvertCameraField(7), value, time), чтобы изменить ближнюю плоскость отсечения камеры (100.0 по умолчанию);
  * Добавлена новая native функция TriggerRegisterFrameUpdateEvent. Триггер срабатывает каждый кадр (задержка меньше 0.001 секунд);
  * Добавлена новая native функция EnableVsync (включено по умолчанию);
  * Добавлены новые native функции GetWindowX и GetWindowY;
  * Добавлены новые native функции GetMouseXRelative и GetMouseYRelative;
  * Функции GetMouseX и GetMouseY теперь возвращают координаты без отсечения границами окна;
  * Изменено название функции FPS на GetFPS;
  * Изменено название функции DeltaTime на GetDeltaTime;
  * Функция GetDeltaTime теперь возвращает секунды вместо миллисекунд;
  * Улучшен debug log. Лог файл очищается при превышении размера в 1 MB.

v0.2.0a
  * Поддержка Direct3D9;
  * Блокировка функции CtrlGetFromPoint, если игра на паузе;
  * Показ GUI только после загрузки карты;
  * Исправлен баг, связанный с тем, что ширина и высота текстур были перепутаны;
  * Исправлен слишком большой угол обзора при использовании Widescreen Fix;
  * Исправлена проблема, связанная с тем, что невозможно было запустить приложение с первой попытки;
  * Обновлён FreeType до версии 2.7;
  * Запуск более одного экземпляра war3.exe одновременно;
  * Оптимизация RenderEdge.dll;
  * Исправлены проблемы безопасности;
  * Обновлено лого проекта, и добавлен значок приложения;
  * Улучшен debug log;

v0.1.0a
  * Реализована поддержка широкоформатных мониторов;
  * Реализовано корректное получение информации из jass строки (поддержка всех языков, а не только английского);
  * Добавлена поддержка TTF шрифтов, используя FreeType (https://www.freetype.org/);
  * Добавлена поддержка многострочного текста и форматирования ("|n" (на новую строку), "|cAARRGGBB" (изменить цвет), "|b" (полужирный шрифт), "|i" (наклонный шрифт), "|r" (сброс к стандартному цвету текста и обычному шрифту));
  * Уменьшена задержка отдачи приказов юнитам в одиночной игре;
  * Исправлена проблема, связанная с невозможностью запустить RenderEdge после переустановки Warcraft по другому пути;
  * Изменено название функции CtrlCreateInstance на CtrlNew;
  * Изменена функция CtrlSetText(int id, bool autoResize, string text) на CtrlSetText(int id, string text, bool bWrap);
  * Изменена функция CtrlGetFromMousePoint() на CtrlGetFromPoint(int x, int y);
  * Добавлена новая native функция GUISetFont;
  * Добавлена новая native функция CtrlIsText;
  * Функция IsMouseOverUI теперь работает корректно;
  * Удалена функция CtrlSetSolidColor, вместо этого используйте белую текстуру ("Textures\\white.blp") и функцию CtrlSetColor(int argb);
  * Добавлен логотип проекта;
  * Уменьшен размер RenderEdge.mpq;
  * Улучшен debug log.

v0.0.3a
  * Реализовано чтение настроек из реестра;
  * Добавлены функции CtrlGetHeight и CtrlGetWidth для получения ширины элемента GUI после применения функции CtrlSetText с аргументом "autoResize" == true;
  * Исправлено растягивание полосок здоровья на широкоформатных экранах;
  * Отключена функция EnableDebug, теперь включение режима отладки осуществляется из редактора реестра;
  * Улучшена совместимость с JNGP;
  * Улучшен debug log.

v0.0.2b
  * Исправлена проблема, при которой не получалось запустить мод с первого раза;
  * Улучшен debug log.

v0.0.2a
  * Исправлена ошибка с загрузкой RenderEdge.mpq, теперь мод можно без проблем размещать в любой папке;
  * Исправлен баг в функции CtrlSetText, при котором все элементы GUI, использующие текстуру шрифта, имели одинаковый текст;
  * Изменена функция CtrlSetText - убран аргумент "argb", отвечающий за цвет создаваемого текста, вместо этого используйте функцию CtrlSetColor (текст по умолчанию белый);
  * Изменена функция CtrlSetDepth - тип аргумента "depth" изменён на real;
  * Добавлена новая native функция CtrlSetAngle;
  * Удалена функция CtrlSetCallback.

v0.0.1a
  * Первая стабильная версия.


Просмотров: 17 138



» Лучшие комментарии


alexprey #201 - 8 месяцев назад 0
Огонь! И не надо извращаться с глючным DGUI :D
Кет #202 - 8 месяцев назад (отредактировано ) 0
только надо вынудить игрока установить рендер эдж =/
alexprey #203 - 8 месяцев назад 0
Кет, впаривать не карту, а полноценную игру) Как доту первую впаривают сразу вместе с кастомным варом
ENAleksey #204 - 8 месяцев назад (отредактировано ) 3
Извиняюсь, забыл проверить выравнивание относительно других элементов UI. Исправлено. Также исправлено отображение неправильной версии RenderEdge (v0.2.2a) в левом верхнем углу.

Обновление v0.2.3b

  • Исправлено выравнивание относительно других элементов интерфейса.
» Используемый код
function TestAlignment takes nothing returns nothing
    local integer parentId = 1000 // -1

    call CtrlNew(1000, 100, 200, 400, 400)
    call CtrlSetTexture(1000, "Textures\\white.blp")
    call CtrlSetColor(1000, 0xA0FFFFFF)

    call CtrlNew(1001,  0,   0,  64, 64) // TOPLEFT
    call CtrlNew(1002, -32,  0,  64, 64) // TOP
    call CtrlNew(1003, -64,  0,  64, 64) // TOPRIGHT
    call CtrlNew(1004,  0,  -32, 64, 64) // LEFT
    call CtrlNew(1005, -32, -32, 64, 64) // CENTER
    call CtrlNew(1006, -64, -32, 64, 64) // RIGHT
    call CtrlNew(1007,  0,  -64, 64, 64) // BOTTOMLEFT
    call CtrlNew(1008, -32, -64, 64, 64) // BOTTOM
    call CtrlNew(1009, -64, -64, 64, 64) // BOTTOMRIGHT

    call CtrlSetAlignment(1001, parentId, ALIGN_TOPLEFT)
    call CtrlSetAlignment(1002, parentId, ALIGN_TOP)
    call CtrlSetAlignment(1003, parentId, ALIGN_TOPRIGHT)
    call CtrlSetAlignment(1004, parentId, ALIGN_LEFT)
    call CtrlSetAlignment(1005, parentId, ALIGN_CENTER)
    call CtrlSetAlignment(1006, parentId, ALIGN_RIGHT)
    call CtrlSetAlignment(1007, parentId, ALIGN_BOTTOMLEFT)
    call CtrlSetAlignment(1008, parentId, ALIGN_BOTTOM)
    call CtrlSetAlignment(1009, parentId, ALIGN_BOTTOMRIGHT)
endfunction
прикреплены файлы
ENAleksey #205 - 7 месяцев назад (отредактировано ) 7

Обновление v0.2.4a

  • Добавлена новая native функция SetPortrait;
  • Функция CtrlSetSize теперь не изменяет ширину или высоту, если вы установите соответствующий аргумент равным -1;
  • Изменено имя функции CtrlSetAlignment на CtrlSetAnchor;
  • Изменён способ исправления ширины полосок здоровья;
  • Исправлено выравнивание динамических элементов по отношению к другим элементам пользовательского интерфейса;
  • Исправлена высота wrapped текста;
  • Исправлена высота wrapped текста при динамическом изменении ширины;
  • Исправлены проблемы с безопасностью. Если жирный, курсивный или полужирный курсивный шрифт недоступен, используется обычный шрифт.
Также, карта-пример была переписана, используя только vJass для большей совместимости.
Melissa #206 - 7 месяцев назад 0
Можно сделать чтобы при галочке Default Render можно было скрыть интерфейс "disable ui"? Хочу поиграть в Dualism без всякого интерфейса и с возможностью кликать куда угодно, но без галки Default Render 13 фпс...
ENAleksey #207 - 7 месяцев назад (отредактировано ) 1
Melissa, немного не в ту тему написал.
В экспериментальной версии эта галочка просто отключает отображение интерфейса, при этом на все кнопки всё ещё можно нажать. Я скоро добавлю функцию для полного скрытия интерфейса в основную версию, но не факт, что в следующую. Могу сделать отдельную версию, точнее модификацию Widescreen fix, но при этом будут проблемы, например будет скрыт весь интерфейс, даже меню.
ENAleksey #208 - 7 месяцев назад (отредактировано ) 3

Обновление v.0.2.5a

  • Добавлена новая native функция GUILoadFont;
  • Добавлена новая native функция CtrlSetFont;
  • Удалена функция GUISetFont;
  • Исправлены вылеты при установке некоторых шрифтов (например, "Times New Roman");
  • Исправлена высота однострочного текста;

Функция CtrlSetFont(int id, string fontName, int iSize) устанавливает шрифт для указанного элемента интерфейса. По умолчанию используется Consolas с высотой 13.
» Код
private function TestFonts takes nothing returns nothing
    call CtrlNew(1001, 400, 300, 0, 0)
    call CtrlSetFont(1001, "Arial", 16)
    call CtrlSetText(1001, "Arial 16", false)

    call CtrlNew(1002, 400, 335, 0, 0)
    call CtrlSetFont(1002, "Consolas", 11)
    call CtrlSetText(1002, "Consolas 11", false)

    call CtrlNew(1003, 400, 350, 0, 0)
    call CtrlSetFont(1003, "Segoe Script", 20)
    call CtrlSetText(1003, "Segoe Script 20", false)

    call CtrlNew(1004, 500, 315, 0, 0)
    call CtrlSetFont(1004, "Times New Roman", 18)
    call CtrlSetText(1004, "Times New Roman 18", false)

    call CtrlNew(1005, 400, 380, 0, 0)
    call CtrlSetFont(1005, "Jokerman", 35)
    call CtrlSetText(1005, "Jokerman 35", false)

    call CtrlNew(1006, 400, 440, 0, 0)
    call CtrlSetFont(1006, "Harrington", 30)
    call CtrlSetText(1006, "Harrington 30", false)
endfunction

Функция GUILoadFont(string fileName) загружает в память шрифт из карты или архивов игры.
Например, так можно загрузить стандартный шрифт варкрафта:
call GUILoadFont("Fonts\\FRIZQT__.ttf")
Затем его можно будет установить для какого-нибудь элемента интерфейса (его имя Nimrod MT). Единственное - стандартный шрифт варкрафта не поддерживает Bold и Italic.
прикреплены файлы
Кет #209 - 7 месяцев назад (отредактировано ) 0
ENAleksey, имхо было бы логичней стандартным сделать Fritz Quadrata (шрифт интерфейса WC3). Ты его не используешь, потому что там одно начертание?
ENAleksey #210 - 7 месяцев назад (отредактировано ) 0
Кет, сначала так и хотел сделать. Да, отказался из-за того, что доступно только одно начертание, при этом шрифт ещё и выглядит не очень приятно (но это чисто мое мнение).
FTFire #211 - 7 месяцев назад 0
ENAleksey, Можешь сделать скрытие интерфейса файлом?Наподобие widescreen fix,буду очень благодарен.
ENAleksey #212 - 7 месяцев назад (отредактировано ) 6
Clamp, NanO, доступа к компьютеру сейчас нет, когда приеду домой (10 числа), смогу точнее написать код:
» раскрыть
constant integer ANCHOR_TOPLEFT = 0
constant integer ANCHOR_TOP = 1
constant integer ANCHOR_TOPRIGHT = 2
constant integer ANCHOR_LEFT = 3
constant integer ANCHOR_CENTER = 4
constant integer ANCHOR_RIGHT = 5
constant integer ANCHOR_BOTTOMLEFT = 6
constant integer ANCHOR_BOTTOM = 7
constant integer ANCHOR_BOTTOMRIGHT = 8


integer address_SetFramePoint = GameBase + 0x606770 // 1.26a
integer address_GetGameUI = GameBase + ? // Нужно будет поискать адрес через IDA Pro


function SetFramePoint takes integer pFrame, integer point, integer pParentFrame, integer relativePoint, real offsetX, real offsetY returns nothing
	call CallThisCallWith6Args(address_SetFramePoint, pFrame, point, pParentFrame, relativePoint, cleanInt(realToIndex(offsetX)), cleanInt(realToIndex(offsetY)), 1)
endfunction

function GetGameUI takes integer a1, integer a2 returns nothing
    call CallFastCallWith2Args(address_GetGameUI, a1, a2)
endfunction


function HideBlackBorders takes nothing returns nothing
    // точно не помню, как в мемхаке работать с указателями, вроде бы, через массив Memory
	local integer pBordersFrame = Memory[Memory[GetGameUI(0, 0)/4]/4 + 239] + 180 // *((int*)GetGameUI(0, 0) + 239) + 180
	local integer pWindowFrame = GetGameUI(0, 0) + 180

	call SetFramePoint(pBordersFrame, ANCHOR_TOPRIGHT, pWindowFrame, ANCHOR_TOPRIGHT, 0.0, 0.0) // верхняя граница
	call SetFramePoint(pBordersFrame, ANCHOR_BOTTOMLEFT, pWindowFrame, ANCHOR_BOTTOMLEFT, 0.0, 0.0) // нижняя граница
endfunction
NanO #213 - 7 месяцев назад 0
Подскажи, что в написанном коде надо доработать, чтобы оно заработало и какой конечный результат получится :)
ENAleksey #214 - 7 месяцев назад 0
NanO, нужно как-то переписать эту строку на jass с помощью массива Memory, там вроде где-то нужно делить на 4, где-то умножать, чтобы получить указатель или разыменовать его:
local integer pBordersFrame = *((int*)GetGameUI(0, 0) + 239) + 180
Можно спросить у Лича или Караулова.
NanO #215 - 7 месяцев назад 0
ENAleksey:
NanO, нужно как-то переписать эту строку на jass с помощью массива Memory, там вроде где-то нужно делить на 4, где-то умножать, чтобы получить указатель или разыменовать его:
local integer pBordersFrame = *((int*)GetGameUI(0, 0) + 239) + 180
Можно спросить у Лича или Караулова.
Я просто не особо шарю в jass, никогда не ковырял его.
Напиши плиз их ники точно, я постучусь в ЛС попрошу помочь.
Подскажи, какой в итоге результат то?)
Оно уберет интерфейс или что?
Как примерно будет выглядеть?
ENAleksey #216 - 7 месяцев назад (отредактировано ) 3
Я уже написал Караулову, может быть ответить.
В результате пропадут чёрные полосы сверху и снизу экрана, будет выглядеть примерно так:
NanO #217 - 7 месяцев назад 0
А какие минусы?
Не следил просто за разработкой последние года, не в курсе всех этих вещей.
Для мемхака используется внешнее ПО или нет?
То есть достаточно просто написать код и иницилизировать его в карте, или вместе с картой будет необходимо предоставлять конечному пользователю дополнительное ПО?
ENAleksey #218 - 7 месяцев назад (отредактировано ) 3
Дополнительное ПО не нужно распространять вместе с картой (но можно). Просто копируем нужный код в карту и сохраняем.
NanO #219 - 7 месяцев назад 0
Угу, ознакомился.
То есть для моих целей нужна просто либа, которую загружаем в карту, и компилятор, который нужен для разработки.
Слушай, очень крутая вещь.
Оно в мультиплеере типа тоже работает? (мне не надо, чисто любопытно)
Надеюсь, чувак ответит и смогу вечером прикрутить к своему квесту. Было бы очень здорово дать больше пространства игроку + к тому же, как я понимаю, если убрать интерфейс, то площадь рендеринга(поправь, если не так называю) увеличится и это так же поможет с проблемой вайд скрина (изображение растянутое)?
ENAleksey #220 - 7 месяцев назад 0
NanO, если не к спеху, то я могу сделать dll, которая будет содержать widescreen fix и убранные полоски. Эту библиотеку можно будет просто импортировать в карту, а с помощью мемхака подгружать её в игру. Но домой приеду только 10 августа.
Я такое уже делал, правда без удаления полосок. Посмотри 157 комментарий из этой темы, там есть карта для загрузки под спойлером.
NanO #221 - 7 месяцев назад 0
ENAleksey:
NanO, если не к спеху, то я могу сделать dll, которая будет содержать widescreen fix и убранные полоски. Эту библиотеку можно будет просто импортировать в карту, а с помощью мемхака подгружать её в игру. Но домой приеду только 10 августа.
Я такое уже делал, правда без удаления полосок. Посмотри 157 комментарий из этой темы, там есть карта для загрузки под спойлером.
Там чисто вайдскрин фикс?
Не особо к спеху, к 10 августа подождет, это все равно не главное.
Как будет что-то готовое, сделаю видео того, что делаю, скину тебе, если заинтересует, то поможешь с этим dll :)
Deal?
Кет #222 - 7 месяцев назад 0
ENAleksey, а можно таким образом какие-то Custom Natives твои импортировать?
karaulov #223 - 7 месяцев назад (отредактировано ) 0
Memory[Memory[GetGameUI(0, 0)/4]/4 + 239]/4 + 45
наверно так? если нужно через Memory массив читать
Адрес должен получится для чтения через Memory[]
или
Memory[Memory[GetGameUI(0, 0)/4]/4 + 239] + 180
если нужен реальный адрес
ENAleksey #224 - 7 месяцев назад 0
NanO, ок.
Кет, вряд ли, так как jass код начинает выполняться только при инициализации карты, следовательно dll с нативками подгрузится ещё позже, а добавлять их можно только до инициализации.
Clamp #225 - 7 месяцев назад (отредактировано ) 0
dll с нативками подгрузится ещё позже
Подгрузка много времени занимает?
Если нет, то можно попробовать в config (эта функция вызывается при при выборе карты в списке) вписать действие на подгрузку и небольшую задержку.

В теории при подгрузке карты в списке карт игра подвиснет на время задержки и подгрузит dll.
ENAleksey #226 - 7 месяцев назад (отредактировано ) 0
Clamp, карта просто не запустится, будет вылетать в меню, если в ней используются кастомные нативки, которые ещё не добавлены в варкрафт, а с помощью мемхака их можно добавить только после загрузки карты.
Clamp #227 - 7 месяцев назад 0
ENAleksey, смотри: функция "config" содержит в себе такие вещи, как название карты, количество игроков на карте и т.д., и вызывается при выборе карты в списке карт, даже не при создании лобби. При запуски карты из лобби вызывается функция "main", в неё действительно тыкаться мало смысла даже в теории.
alexprey #228 - 7 месяцев назад 0
Clamp, есть вероятность, что перед вызовом конфига и происходит проверка jass файла
Clamp #229 - 7 месяцев назад 0
alexprey, сейчас уже не найду, давно было, но вроде как читал, что проверяется только код, который вызывается напрямую из "config" и "main", а всё, что вызывается через "ExecuteFunc" проверкой обходится.
Могу быть неправ, впрочем.
NanO #230 - 7 месяцев назад 0
Не знаю как вы, но я жду 10-го числа и надеюсь получить отдельным ресурсом в рамках этого проекта наработку, чтобы убрать интерфейс :)
ENAleksey #231 - 7 месяцев назад (отредактировано ) 1
NanO, отдельным ресурсом выкладывать не буду, я только обновлю код из моего комментария выше (а тебе уже помогу доработать код и добавить ещё несколько нужных фич). И этот код не убирает интерфейс полностью, а только скрывает чёрные полосы, хотя скрыть весь интерфейс тоже можно (посмотрите видео в начале темы).
Но у метода, который я сейчас использую, есть недостаток - скрывается абсолютно весь интерфейс, даже меню. Потом я его доработаю и добавлю функцию для частичного скрытия интерфейса в основную версию RenderEdge. Кстати любой элемент можно переместить или скрыть с помощью функции SetFramePoint (код выше), главное - знать его адрес. Вот результат использования этой функции:
ENAleksey #232 - 7 месяцев назад (отредактировано ) 3
NanO, Clamp, готово. Работает только на версии 1.26a:
2 комментария удалено
FTFire #235 - 6 месяцев назад 0
ENAleksey, Хотел спросить а перемещение элементов например мини-карты,инвентаря есть в MemoryHack?Если есть можешь подсказать код?
ENAleksey #236 - 6 месяцев назад 0
FTFire, лучше задавать вопросы относительно MemoryHack в соответствующей теме.
Вот код для миникарты:
function SetMinimap takes real x, real y, real size returns nothing
    local integer pMinimapFrame = ReadGameUIArray(240) + 180
    local integer pParentFrame = ReadGameUIArray(263) + 180

    call SetFramePoint(pMinimapFrame, FRAME_BOTTOMLEFT, pParentFrame, FRAME_BOTTOMLEFT, x, 0.6 - y - size)
    call SetFramePoint(pMinimapFrame, FRAME_TOPRIGHT, pParentFrame, FRAME_BOTTOMLEFT, x + size, 0.6 - y)
endfunction
Про инвентарь не знаю, нужно искать либо в IDA Pro, либо методом подбора значения в функции ReadGameUIArray.
Nelloy #237 - 6 месяцев назад (отредактировано ) 0
Возможно ли встроить весь GUI API внутрь карты? То есть без отдельной библиотеки или с распаковкой из самой карты
Кет #238 - 6 месяцев назад 0
Nelloy, я уже две недели назад спрашивал -_- Ответ:
карта просто не запустится, будет вылетать в меню, если в ней используются кастомные нативки, которые ещё не добавлены в варкрафт, а с помощью мемхака их можно добавить только после загрузки карты.
Nelloy #239 - 6 месяцев назад (отредактировано ) 0
Имел ввиду переписать нативки через мемхак, есть хотя бы теоретическая возможность?
Nelloy #241 - 6 месяцев назад (отредактировано ) 0
Clamp, чтобы не привязываться к какому бы то ни было ресурсу, требующему отдельной установки
Как вариант выгружать библиотеку средствами мемхака, а нативки вызывать неявно через ExecuteFunc.
Второй вариант: собранную библиотеку внедрять в карту побайтно, сделав асемблерную вставку, должно работать, но надо знать куда втыкать
по идее есть 2 исхода для первого варианта, на первом запуске карты народ будет ловить десинк или же все сразу заведется
Так что думаю вполне реально сделать отрисовку кастомного UI таким образом
Clamp #242 - 6 месяцев назад 0
Nelloy, нативки и так в игре есть, зачем их переписывать вообще?
Или ты про нативки RenderEdge?
Nelloy #243 - 6 месяцев назад 0
Clamp, Конечно про него)
ENAleksey #244 - 6 месяцев назад (отредактировано ) 2
Nelloy:
Возможно ли встроить весь GUI API внутрь карты? То есть без отдельной библиотеки или с распаковкой из самой карты
Караулов уже сделал это в своей библиотеке, нужно просто скачать её, импортировать себе в карту, а затем извлечь и загрузить её с помощью Memory Hack:
Как вариант выгружать библиотеку средствами мемхака, а нативки вызывать неявно через ExecuteFunc.
Можно в динамической библиотеке экспортировать нужные функции, а потом выполнять их как-то так:
address_GetWindowX = GetModuleProcAddress("RenderEdge_mini.dll", "GetWindowX")

function GetWindowX takes nothing returns integer
    return std_call1(address_GetWindowX, 0)
endfunction
Vitalik8 #245 - 6 месяцев назад 0
На Windows 8.1 после сворачивании игры в варик не зайти чорный екран
ENAleksey #246 - 6 месяцев назад 0
Vitalik8, покажи, пожалуйста, скрин папки с варкрафтом.
Vitalik8 #247 - 6 месяцев назад 0
ENAleksey, вот
прикреплены файлы
ENAleksey #248 - 6 месяцев назад 0
Vitalik8, а где RenderEdge.exe? Лучше все файлы RenderEdge поместить в отдельную папку. И ещё, скинь, пожалуйста, RenderEdge.log.
Vitalik8 #249 - 6 месяцев назад 0
ENAleksey, убрал файлы и кинул скрин папки с RenderEdge и RenderEdge.log
ENAleksey, на Windows 7 все работало
прикреплены файлы
ENAleksey #250 - 6 месяцев назад 0
Vitalik8, после переноса файлов в одну папку чёрный экран так же появляется?