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 } 

Навигация

[0] Главная страница сообщений

Перейти к полной версии