13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

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
13

» RenderEdge / [RenderEdge] Memory Hack

Обновление v1.0.1a

  • Добавлено внедрение динамической библиотеки RenderEdge_mini.dll (извлекается из карты в папку с варкрафтом);
  • Widescreen Fix;
  • Добавлена функция для редактирования миникарты.
Функции из RenderEdge_mini.dll:
function GetWindowX takes nothing returns integer
function GetWindowY takes nothing returns integer
function GetWindowWidth takes nothing returns integer
function GetWindowHeight takes nothing returns integer
function GetMouseX takes nothing returns integer
function GetMouseY takes nothing returns integer
А вот некоторые фреймы, которые я нашёл:
ReadGameUIArray(239) + 180 // Black Borders
ReadGameUIArray(240) + 180 // Minimap
ReadGameUIArray(241)       // Unit InfoPanel
ReadGameUIArray(243)       // ResourceBarFrame
ReadGameUIArray(244)       // UpperButtonBarFrame
ReadGameUIArray(247)       // ?
ReadGameUIArray(248)       // IdlePeon
ReadGameUIArray(253) + 180 // Portrait
ReadGameUIArray(255) + 180 // ?
ReadGameUIArray(251)       // WorldFrameChatMessage

ReadGameUIArray(258)       // Minimap button 1
ReadGameUIArray(259)       // Minimap button 2
ReadGameUIArray(260)       // Minimap button 3
ReadGameUIArray(261)       // Minimap button 4
ReadGameUIArray(262)       // Minimap button 5
Загруженные файлы
13

» RenderEdge / [RenderEdge] Memory Hack

FTFire, кода нет, как я уже писал, нужно искать первый аргумент функции SetFramePoint либо в IDA Pro, либо методом перебора значений в функции ReadGameUIArray.
13

» RenderEdge / [RenderEdge] Memory Hack

Редактирование миникарты:
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
Карту обновлю позже, после того, как добавлю демонстрацию внедрения сторонних динамических библиотек.
Загруженные файлы
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

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.
13

» RenderEdge / [RenderEdge] Memory Hack

FTFire, для компиляции кода нужно использовать экспериментальную версию PJass: Скачать
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

NanO, отдельным ресурсом выкладывать не буду, я только обновлю код из моего комментария выше (а тебе уже помогу доработать код и добавить ещё несколько нужных фич). И этот код не убирает интерфейс полностью, а только скрывает чёрные полосы, хотя скрыть весь интерфейс тоже можно (посмотрите видео в начале темы).
Но у метода, который я сейчас использую, есть недостаток - скрывается абсолютно весь интерфейс, даже меню. Потом я его доработаю и добавлю функцию для частичного скрытия интерфейса в основную версию RenderEdge. Кстати любой элемент можно переместить или скрыть с помощью функции SetFramePoint (код выше), главное - знать его адрес. Вот результат использования этой функции:
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

Clamp, карта просто не запустится, будет вылетать в меню, если в ней используются кастомные нативки, которые ещё не добавлены в варкрафт, а с помощью мемхака их можно добавить только после загрузки карты.
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

NanO, ок.
Кет, вряд ли, так как jass код начинает выполняться только при инициализации карты, следовательно dll с нативками подгрузится ещё позже, а добавлять их можно только до инициализации.
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

NanO, если не к спеху, то я могу сделать dll, которая будет содержать widescreen fix и убранные полоски. Эту библиотеку можно будет просто импортировать в карту, а с помощью мемхака подгружать её в игру. Но домой приеду только 10 августа.
Я такое уже делал, правда без удаления полосок. Посмотри 157 комментарий из этой темы, там есть карта для загрузки под спойлером.
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

Дополнительное ПО не нужно распространять вместе с картой (но можно). Просто копируем нужный код в карту и сохраняем.
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

Я уже написал Караулову, может быть ответить.
В результате пропадут чёрные полосы сверху и снизу экрана, будет выглядеть примерно так:
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

NanO, нужно как-то переписать эту строку на jass с помощью массива Memory, там вроде где-то нужно делить на 4, где-то умножать, чтобы получить указатель или разыменовать его:
local integer pBordersFrame = *((int*)GetGameUI(0, 0) + 239) + 180
Можно спросить у Лича или Караулова.
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

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
13

» Edemium / Edemium

и даже потом кнопочки кастомные сделать?
Конечно:
если придумать как передавать это всё вместе с картой и настроить твою тулу
Полностью запихнуть в карту не получится (по крайней мере, сейчас), так как способ установки хука на DirectX, который я сейчас использую, работает только при запуске игры, во время загрузки карты устанавливать уже поздно. Но скрыть полоски можно и с помощью мемхака, если нужно, скину реализацию в ЛС.
13

» Edemium / Edemium

TripleKor, а чего ждать? Всё же готово) Можно даже чёрные полоски убрать.
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

Кет, сначала так и хотел сделать. Да, отказался из-за того, что доступно только одно начертание, при этом шрифт ещё и выглядит не очень приятно (но это чисто мое мнение).
13

» WarCraft 3 / Warcraft 3: 1.28+

lll_Kirito_lll, Если честно, то я пробовал ставить старую версию, но она выдавала ошибки в коде при сохранении и вылетела в произвольный момент. А недавно поставил последнюю версию, так она вообще запустила 50 копий war3.exe + редактор карт, при этом с сообщением о невозможности запустить варкрафт. Минут пять сидел и пытался отключить все созданные процессы через диспетчер задач, при этом создавались новые. Больше запускать не пробовал. Варкрафт 1.26а.
13

» WarCraft 3 / Warcraft 3: 1.28+

шейп крафт
Если вы имели ввиду SharpCraft, то попробуйте написать в тему по ссылке, может там подскажут, как решить проблему.
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

Обновление 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.
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

Melissa, немного не в ту тему написал.
В экспериментальной версии эта галочка просто отключает отображение интерфейса, при этом на все кнопки всё ещё можно нажать. Я скоро добавлю функцию для полного скрытия интерфейса в основную версию, но не факт, что в следующую. Могу сделать отдельную версию, точнее модификацию Widescreen fix, но при этом будут проблемы, например будет скрыт весь интерфейс, даже меню.