GTA Vice City > Справочная информация
CFont - Информация.
(1/1)
Sektor:
Выкладываю полу-сорц CFont (Шрифт), так называемый), может кому пригодиться в моддинге.
Однако, это далеко не полный функционал, в будущем может обновлю. Кстати имена класса и методов, оригинальные с вайса, взято с андроид базы!
И так, заголовочный файл vcFont.h:
--- Код: C++ --- class CFont { public: static void SetPropOn(); static void SetBackgroundOff(); static void SetScale(float weight, float height); static void SetCentreOn(); static void SetCentreSize(float size); static void SetJustifyOff(); static void SetColor(RwRGBA * RGBA); // Там типа обвертка CRGBA static void SetBackGroundOnlyTextOff(); static void SetFontStyle(short style); static void PrintString(float x, float y, wchar_t * text);};
Тело vcFont.cpp:
--- Код: C++ ---#include "stdafx.h"#include "vcFont.h" void CFont::SetPropOn(){ auto Call_ctor = (void (__cdecl*)())0x0550020; Call_ctor();} void CFont::SetBackgroundOff(){ auto Call_ctor = (void (__cdecl*)())0x05500D0; Call_ctor();} void CFont::SetScale(float weight, float height){ auto Call_ctor = (void (__cdecl*)(float, float))0x0550230; Call_ctor(weight, height);} void CFont::SetCentreOn(){ auto Call_ctor = (void (__cdecl*)())0x0550120; Call_ctor();} void CFont::SetCentreSize(float size){ auto Call_ctor = (void (__cdecl*)(float))0x05500F0; Call_ctor(size);} void CFont::SetJustifyOff(){ auto Call_ctor = (void (__cdecl*)())0x0550140; Call_ctor();} void CFont::SetColor(RwRGBA * RGBA){ auto Call_ctor = (void (__cdecl*)(RwRGBA*))0x0550170; Call_ctor(RGBA);} void CFont::SetBackGroundOnlyTextOff(){ auto Call_ctor = (void (__cdecl*)())0x0550080; Call_ctor();} void CFont::SetFontStyle(short style){ auto Call_ctor = (void (__cdecl*)(short))0x054FFE0; Call_ctor(style);} void CFont::PrintString(float x, float y, wchar_t * text) { auto Call_ctor = (void (__cdecl*)(float, float, wchar_t*))0x0551040; Call_ctor(x,y, text);}
Использование:
И так, у нас есть модуль vcFont.h, что-же делать дальше? А все просто:
Где-то в коде плагина, напишем такую функцию, в качестве примера:
--- Код: C++ ---// Тестовый текстwchar_t text[] = L"hello World!"; void DrawOnGameFont(){ // Описываем структуру, про нее, я уже как-то раньше в уроках, писал. // Можно и сделать по своему, но не нужно, когда уже есть. RwRGBA rgba; rgba.alpha = 255; rgba.blue = 0; rgba.green = 0; rgba.red = 180; // Данные цвета заполнении, он у нас будет красноватый.// Теперь выводим, это дело на Экран CFont::SetPropOn(); CFont::SetScale(2.0f, 2.0f); CFont::SetJustifyOff(); CFont::SetColor(&rgba); CFont::PrintString(200.0 , 200.0, text);}
И последний метод, это инжект в процесс отрисовки:
--- Код: C++ --- // Сама функция инжекта, всем известная!:void injectFunction (DWORD address, DWORD function) {DWORD _old; VirtualProtect((LPVOID)address,4, PAGE_READWRITE, &_old); BYTE * patch = (BYTE *)address; *patch = 0xE9; // JMP *(DWORD *)(patch+1) = (function-(address+5)); VirtualProtect((LPVOID)address,4, _old, &_old); } // Делаем это где-то в case DLL_PROCESS_ATTACH: injectFunction(0x043E490, (DWORD)DrawOnGameFont);
Все готово, запускайте игру и наслаждайтесь текстом. Только текст в меню не выведется, там надо инжект делать в другое место.
Shagg_E:
Т.е. с помощью этого можно выводить на экран текст игровым шрифтом?
P.S. Давно хотел сделать рандомные надписи над полосой загрузки в игре...
Sektor:
--- Цитировать ---Т.е. с помощью этого можно выводить на экран текст игровым шрифтом?
--- Конец цитаты ---
Именно так. Можешь сейчас по пробовать, для примера.
Saint:
Ребят может кто знает но при использовании функции 0x550100 в VC моя игра просто зависает, в чём дело?
--- Код: C++ --- // вариант 1 void _declspec(naked) Font_SetLineWidth(float width){ // _asm mov eax, 0x7194D0 // SA // CFont::SetWrapx(float value) _asm mov eax, 0x550100 // VC // CFont::SetWrapx(float wrap) _asm jmp eax } // вариант 2 void CFont::SetWrapx(float value){ // ((void (__cdecl *)(float))0x7194D0)(value); // SA ((void (__cdecl *)(float))0x550100)(value); // VC }
Навигация
Перейти к полной версии