Выкладываю полу-сорц CFont (Шрифт), так называемый), может кому пригодиться в моддинге.
Однако, это далеко не полный функционал, в будущем может обновлю. Кстати имена класса и методов, оригинальные с вайса, взято с андроид базы!
И так, заголовочный файл vcFont.h:
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:
#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, что-же делать дальше? А все просто:
Где-то в коде плагина, напишем такую функцию, в качестве примера:
// Тестовый текст
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);
}
И последний метод, это инжект в процесс отрисовки:
// Сама функция инжекта, всем известная!:
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);
Все готово, запускайте игру и наслаждайтесь текстом. Только текст в меню не выведется, там надо инжект делать в другое место.