Автор Тема: CFont - Информация.  (Прочитано 5866 раз)

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
CFont - Информация.
« : Апрель 15, 2015, 05:11:52 pm »
Выкладываю полу-сорц CFont (Шрифт), так называемый), может кому пригодиться в моддинге.
Однако, это далеко не полный функционал, в будущем может обновлю. Кстати имена класса и методов, оригинальные с вайса, взято с андроид базы!

И так, заголовочный файл vcFont.h:

Код: C++
  1.  
  2. class CFont
  3. {
  4.  public:
  5.         static void SetPropOn();
  6.         static void SetBackgroundOff();
  7.         static void SetScale(float weight, float height);
  8.         static void SetCentreOn();
  9.         static void SetCentreSize(float size);
  10.         static void SetJustifyOff();
  11.         static void SetColor(RwRGBA * RGBA);       // Там типа обвертка CRGBA
  12.         static void SetBackGroundOnlyTextOff();
  13.         static void SetFontStyle(short style);
  14.         static void PrintString(float x, float y, wchar_t * text);
  15. };
  16.  
  17.  

Тело vcFont.cpp:


Код: C++
  1. #include "stdafx.h"
  2. #include "vcFont.h"
  3.  
  4. void CFont::SetPropOn(){
  5.          auto Call_ctor = (void (__cdecl*)())0x0550020;
  6.      Call_ctor();
  7. }
  8.  
  9. void CFont::SetBackgroundOff(){
  10.          auto Call_ctor = (void (__cdecl*)())0x05500D0;
  11.      Call_ctor();
  12. }
  13.  
  14. void CFont::SetScale(float weight, float height){
  15.          auto Call_ctor = (void (__cdecl*)(float, float))0x0550230;
  16.      Call_ctor(weight, height);
  17. }
  18.  
  19. void CFont::SetCentreOn(){
  20.          auto Call_ctor = (void (__cdecl*)())0x0550120;
  21.      Call_ctor();
  22. }
  23.  
  24. void CFont::SetCentreSize(float size){
  25.          auto Call_ctor = (void (__cdecl*)(float))0x05500F0;
  26.      Call_ctor(size);
  27. }
  28.  
  29. void CFont::SetJustifyOff(){
  30.          auto Call_ctor = (void (__cdecl*)())0x0550140;
  31.      Call_ctor();
  32. }
  33.  
  34. void CFont::SetColor(RwRGBA * RGBA){
  35.          auto Call_ctor = (void (__cdecl*)(RwRGBA*))0x0550170;
  36.      Call_ctor(RGBA);
  37. }
  38.  
  39. void CFont::SetBackGroundOnlyTextOff(){
  40.          auto Call_ctor = (void (__cdecl*)())0x0550080;
  41.      Call_ctor();
  42. }
  43.  
  44. void CFont::SetFontStyle(short style){
  45.          auto Call_ctor = (void (__cdecl*)(short))0x054FFE0;
  46.      Call_ctor(style);
  47. }
  48.  
  49. void CFont::PrintString(float x, float y, wchar_t * text) {
  50.          auto Call_ctor = (void (__cdecl*)(float, float, wchar_t*))0x0551040;
  51.      Call_ctor(x,y, text);
  52. }
  53.  
  54.  


Использование:
И так, у нас есть модуль vcFont.h, что-же делать дальше? А все просто:
Где-то в коде плагина, напишем такую функцию, в качестве примера:


Код: C++
  1. // Тестовый текст
  2. wchar_t text[] = L"hello World!";
  3.  
  4. void DrawOnGameFont()
  5. {
  6.  
  7. // Описываем структуру, про нее, я уже как-то раньше в уроках, писал.
  8. // Можно и сделать по своему, но не нужно, когда уже есть.
  9.  RwRGBA rgba;
  10.  rgba.alpha = 255;
  11.  rgba.blue   = 0;
  12.  rgba.green = 0;
  13.  rgba.red    = 180;
  14.  
  15. // Данные цвета заполнении, он у нас будет красноватый.
  16. // Теперь выводим, это дело на Экран
  17.     CFont::SetPropOn();
  18.     CFont::SetScale(2.0f, 2.0f);
  19.     CFont::SetJustifyOff();
  20.     CFont::SetColor(&rgba);
  21.     CFont::PrintString(200.0 , 200.0, text);
  22. }
  23.  

И последний метод, это инжект в процесс отрисовки:



Код: C++
  1.  
  2. // Сама функция инжекта, всем известная!:
  3. void injectFunction (DWORD address, DWORD function) {
  4. DWORD _old;
  5.     VirtualProtect((LPVOID)address,4,  PAGE_READWRITE, &_old);
  6.     BYTE * patch = (BYTE *)address;
  7.     *patch = 0xE9;    // JMP
  8.     *(DWORD *)(patch+1) = (function-(address+5));    
  9.      VirtualProtect((LPVOID)address,4, _old, &_old);
  10. }
  11.  
  12.  
  13. // Делаем это где-то в case DLL_PROCESS_ATTACH:
  14.   injectFunction(0x043E490, (DWORD)DrawOnGameFont);
  15.  


Все готово, запускайте игру и наслаждайтесь текстом. Только текст в меню не выведется, там надо инжект делать в другое место.

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: CFont - Информация.
« Ответ #1 : Апрель 15, 2015, 08:49:46 pm »
Т.е. с помощью этого можно выводить на экран текст игровым шрифтом?
P.S. Давно хотел сделать рандомные надписи над полосой загрузки в игре...

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: CFont - Информация.
« Ответ #2 : Апрель 15, 2015, 08:51:00 pm »
Цитировать
Т.е. с помощью этого можно выводить на экран текст игровым шрифтом?
Именно так. Можешь сейчас по пробовать, для примера.

Оффлайн Saint

  • Прохожий
  • *
  • Сообщений: 83
  • Репутация: +1/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
Re: CFont - Информация.
« Ответ #3 : Сентябрь 05, 2020, 03:12:24 pm »
Ребят может кто знает но при использовании функции 0x550100 в VC моя игра просто зависает, в чём дело?

Код: C++
  1.  
  2. // вариант 1
  3.  
  4. void _declspec(naked) Font_SetLineWidth(float width)
  5. {
  6.        
  7. //      _asm mov eax, 0x7194D0 // SA // CFont::SetWrapx(float value)
  8.         _asm mov eax, 0x550100 // VC // CFont::SetWrapx(float wrap)
  9.         _asm jmp eax
  10.  
  11. }
  12.  
  13. // вариант 2
  14.  
  15. void CFont::SetWrapx(float value)
  16. {
  17.  
  18. //      ((void (__cdecl *)(float))0x7194D0)(value); // SA
  19.         ((void (__cdecl *)(float))0x550100)(value); // VC
  20.  
  21. }
  22.