Собственно появилась гигантская мотивация освоить графику и прочие интересности (вывод информации на экран).
Прочитал тему http://coderx.ru/showthread.php?t=1077 и решил попробовать, однако все закончилось печально: крит и GTFO.
Так же видел пример работы в ргварде, но там какой-то ужас и садамия. Вопрос вот в чем: нет ли у кого-нибудь нормального работающего примера с графикой. На том же астериосе выводят онлайн, я вот тоже хочу что-то выводить
Добавлено через 42 секунды
[SRC="c++"]struct TFontDrawInfo
{
int font;
unsigned int color, u1, u2, u3, u4;
};
unsigned int Canvas;
unsigned int mainThread;
typedef void(_fastcall *MasterProcessPreRender) (unsigned int This, unsigned int EDX, unsigned int UCanvas);
MasterProcessPreRender true_MasterProcessPreRender;
typedef int(_fastcall *DrawTextTTFToCanvas) (unsigned int This, unsigned int EDX, int X, int Y, wchar_t *text, TFontDrawInfo *FontDrawInfo, unsigned char, int, int, unsigned int FontDrawInfoSection);
DrawTextTTFToCanvas true_DrawTextTTFToCanvas;
typedef void(_fastcall *Render) (unsigned int This, unsigned int EDX, unsigned int FRenderInterface);
Render true_Render;
void _fastcall new_MasterProcessPreRender(unsigned int This, unsigned int EDX, unsigned int UCanvas)
{
Canvas = UCanvas;
true_MasterProcessPreRender(This, EDX, UCanvas);
}
void _fastcall new_Render(unsigned int This, unsigned int EDX, unsigned int FRenderInterface)
{
mainThread = GetCurrentThreadId();
RECT L2Rect;
auto L2hWND = (HWND*)GetProcAddress(LoadLibraryA("core.dll"), "?GTopWnd@@3PAUHWND__@@A");
true_Render(This, EDX, FRenderInterface);
GetClientRect(*L2hWND, &L2Rect);
time_t rawtime;
struct tm timeinfo;
wchar_t exstr[16], newstr[64];
time(&rawtime);
localtime_s(&timeinfo, &rawtime);
wcsftime(exstr, 15, L"%H:%M", &timeinfo);
wcscpy_s(newstr, L"Test");
wcscat_s(newstr, exstr);
long x = 100;
long y = 100;
auto font = new TFontDrawInfo();
font->color = 0x00FF00;
font->font = 1;
font->u1 = 1;
font->u2 = 2;
font->u3 = 3;
font->u4 = 4;
true_DrawTextTTFToCanvas(Canvas, 0, L2Rect.right - x, L2Rect.top + y, newstr, font, 0xFF, 0, 0, 0);
}
void ExtRender(HMODULE hEngine)
{
true_DrawTextTTFToCanvas = (DrawTextTTFToCanvas)GetProcAddress(hEngine, "?DrawTextTTFToCanvas@UCanvas@@QAEHHHPB_WPBVFontDrawInfo@@EHHPBV?$TArray@PAVFontDrawInfoSection@@@@@Z");
true_MasterProcessPreRender = (MasterProcessPreRender)((int)GetProcAddress(hEngine, "?MasterProcessPreRender@UInteractionMaster@@QAEXPAVUCanvas@@@Z") + 5);
true_Render = (Render)((int)GetProcAddress(hEngine, "?Render@FPlayerSceneNode@@UAEXPAVFRenderInterface@@@Z")+5);
HookHelper::BeginRedirect(GetProcAddress(hEngine, "?MasterProcessPreRender@UInteractionMaster@@QAEXPAVUCanvas@@@Z"), new_MasterProcessPreRender);
HookHelper::BeginRedirect(GetProcAddress(hEngine, "?Render@FPlayerSceneNode@@UAEXPAVFRenderInterface@@@Z"), new_Render);
}[/SRC]
Код, который я переписал выглядит вот так.
Прочитал тему http://coderx.ru/showthread.php?t=1077 и решил попробовать, однако все закончилось печально: крит и GTFO.
Так же видел пример работы в ргварде, но там какой-то ужас и садамия. Вопрос вот в чем: нет ли у кого-нибудь нормального работающего примера с графикой. На том же астериосе выводят онлайн, я вот тоже хочу что-то выводить
Добавлено через 42 секунды
[SRC="c++"]struct TFontDrawInfo
{
int font;
unsigned int color, u1, u2, u3, u4;
};
unsigned int Canvas;
unsigned int mainThread;
typedef void(_fastcall *MasterProcessPreRender) (unsigned int This, unsigned int EDX, unsigned int UCanvas);
MasterProcessPreRender true_MasterProcessPreRender;
typedef int(_fastcall *DrawTextTTFToCanvas) (unsigned int This, unsigned int EDX, int X, int Y, wchar_t *text, TFontDrawInfo *FontDrawInfo, unsigned char, int, int, unsigned int FontDrawInfoSection);
DrawTextTTFToCanvas true_DrawTextTTFToCanvas;
typedef void(_fastcall *Render) (unsigned int This, unsigned int EDX, unsigned int FRenderInterface);
Render true_Render;
void _fastcall new_MasterProcessPreRender(unsigned int This, unsigned int EDX, unsigned int UCanvas)
{
Canvas = UCanvas;
true_MasterProcessPreRender(This, EDX, UCanvas);
}
void _fastcall new_Render(unsigned int This, unsigned int EDX, unsigned int FRenderInterface)
{
mainThread = GetCurrentThreadId();
RECT L2Rect;
auto L2hWND = (HWND*)GetProcAddress(LoadLibraryA("core.dll"), "?GTopWnd@@3PAUHWND__@@A");
true_Render(This, EDX, FRenderInterface);
GetClientRect(*L2hWND, &L2Rect);
time_t rawtime;
struct tm timeinfo;
wchar_t exstr[16], newstr[64];
time(&rawtime);
localtime_s(&timeinfo, &rawtime);
wcsftime(exstr, 15, L"%H:%M", &timeinfo);
wcscpy_s(newstr, L"Test");
wcscat_s(newstr, exstr);
long x = 100;
long y = 100;
auto font = new TFontDrawInfo();
font->color = 0x00FF00;
font->font = 1;
font->u1 = 1;
font->u2 = 2;
font->u3 = 3;
font->u4 = 4;
true_DrawTextTTFToCanvas(Canvas, 0, L2Rect.right - x, L2Rect.top + y, newstr, font, 0xFF, 0, 0, 0);
}
void ExtRender(HMODULE hEngine)
{
true_DrawTextTTFToCanvas = (DrawTextTTFToCanvas)GetProcAddress(hEngine, "?DrawTextTTFToCanvas@UCanvas@@QAEHHHPB_WPBVFontDrawInfo@@EHHPBV?$TArray@PAVFontDrawInfoSection@@@@@Z");
true_MasterProcessPreRender = (MasterProcessPreRender)((int)GetProcAddress(hEngine, "?MasterProcessPreRender@UInteractionMaster@@QAEXPAVUCanvas@@@Z") + 5);
true_Render = (Render)((int)GetProcAddress(hEngine, "?Render@FPlayerSceneNode@@UAEXPAVFRenderInterface@@@Z")+5);
HookHelper::BeginRedirect(GetProcAddress(hEngine, "?MasterProcessPreRender@UInteractionMaster@@QAEXPAVUCanvas@@@Z"), new_MasterProcessPreRender);
HookHelper::BeginRedirect(GetProcAddress(hEngine, "?Render@FPlayerSceneNode@@UAEXPAVFRenderInterface@@@Z"), new_Render);
}[/SRC]
Код, который я переписал выглядит вот так.