Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Программирование / Programming (https://forum.zone-game.info/forumdisplay.php?f=98)
-   -   Графика и вывод своей информации (https://forum.zone-game.info/showthread.php?t=42375)

Zubastic 26.06.2017 07:52

Графика и вывод своей информации
 
Собственно появилась гигантская мотивация освоить графику и прочие интересности (вывод информации на экран).

Прочитал тему http://coderx.ru/showthread.php?t=1077 и решил попробовать, однако все закончилось печально: крит и GTFO.

Так же видел пример работы в ргварде, но там какой-то ужас и садамия. Вопрос вот в чем: нет ли у кого-нибудь нормального работающего примера с графикой. На том же астериосе выводят онлайн, я вот тоже хочу что-то выводить :)

Добавлено через 42 секунды
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);
}
Code: C++
Код, который я переписал выглядит вот так.

Zubastic 26.06.2017 12:10

Re: Графика и вывод своей информации
 
Вообще хотелось бы реализовать что-то типа такого:
http://klikr.org/68d02763f5ef1ee59ce4fd9ffedd.png

Zubastic 29.06.2017 03:04

Re: Графика и вывод своей информации
 
Up!

ALF. 29.06.2017 13:12

Re: Графика и вывод своей информации
 
Посмотри в исходниках RGuard, правда там тоже не совсем правильно. Там хардкод на некоторые адреса в engine.dll, которые можно получить динамически почти независимо от хроник. Я если доберусь до своего компа, где занимался л2, может зашарю. Там и защита с шифрованием и GUIятинка.

Zubastic 29.06.2017 22:34

Re: Графика и вывод своей информации
 
Цитата:

Сообщение от ALF. (Сообщение 426846)
Посмотри в исходниках RGuard, правда там тоже не совсем правильно. Там хардкод на некоторые адреса в engine.dll, которые можно получить динамически почти независимо от хроник. Я если доберусь до своего компа, где занимался л2, может зашарю. Там и защита с шифрованием и GUIятинка.

Смотрел. Код в первом посте от него же :)

У тебя GUI с помощью канваса или же через D3D?

ALF. 30.06.2017 10:33

Re: Графика и вывод своей информации
 
Цитата:

Сообщение от Zubastic (Сообщение 426852)
Смотрел. Код в первом посте от него же :)

У тебя GUI с помощью канваса или же через D3D?

С помошью канваса.

У р-гуарда код на 80% правильный, они правильным путем пошли.
Через Д3Д мне не понравилось, ибо там графика не адаптированная под л2.
Шрифты не л2-шные, теней нету, и вообще как-то не красиво)
А что бы сделать красиво через д3д - надо неплохо заморочится.

Zubastic 03.07.2017 01:58

Re: Графика и вывод своей информации
 
Цитата:

Сообщение от ALF. (Сообщение 426854)
С помошью канваса.

У р-гуарда код на 80% правильный, они правильным путем пошли.
Через Д3Д мне не понравилось, ибо там графика не адаптированная под л2.
Шрифты не л2-шные, теней нету, и вообще как-то не красиво)
А что бы сделать красиво через д3д - надо неплохо заморочится.

Ну я сделал кое что, но всеравно есть косяки :(.

Например при сворачивании окна, ловлю такие криты:
Цитата:

2017.7.3 01:57:50
OS : Windows7(32) 6.1 (Build: 7601)
CPU : GenuineIntel Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz @ 3605 MHz 4095MB RAM
Video : NVIDIA GeForce GTX 960 (8253)
PosCode : LS1(273) 0:0:0 8/0 [390]

General protection fault!

History: UD3DRenderDevice::HoldBackBuffer <- UD3DRenderDevice::Present <- PresentLastFrame <- UGameEngine::Draw <- UWindowsViewport::Repaint <- UWindowsClient::Tick <- ClientTick <- UGameEngine::Tick <- UpdateWorld <- MainLoop
Цитата:

2017.7.3 01:58:44
OS : Windows7(32) 6.1 (Build: 7601)
CPU : GenuineIntel Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz @ 3605 MHz 4095MB RAM
Video : NVIDIA GeForce GTX 960 (8253)
PosCode : LS1(273) 0:0:0 8/0 [390]

General protection fault!

History: UD3DRenderDevice::SetRes <- UWindowsViewport::EndFullscreen <- UWindowsViewport::ToggleFullscreen <- WM_KEYUP <- UWindowsViewport::ViewportWndProc <- WWindow::StaticProc <- DispatchMessage <- 006F28D6 261 <- MessagePump <- MainLoop


Awiion 04.07.2017 15:48

Re: Графика и вывод своей информации
 
Zubastic,
Ну так вы пишете в буффер, дальше когда вы делаете альт+таб, у вас он очищается, и по стеку получается крашь :)





Цитата:

Сообщение от ALF. (Сообщение 426854)
Шрифты не л2-шные, теней нету, и вообще как-то не красиво)
А что бы сделать красиво через д3д - надо неплохо заморочится.

Извините, а что там сложного?

Клац:
Свернуть ↑Развернуть ↓

Zubastic 04.07.2017 17:12

Re: Графика и вывод своей информации
 
Цитата:

Сообщение от Awiion (Сообщение 426903)
Zubastic,
Ну так вы пишете в буффер, дальше когда вы делаете альт+таб, у вас он очищается, и по стеку получается крашь :)

Да я посмотрел, там вообще выгрузка идет и загрузка обратно. Другое дело, что я понятия не имею как с моим кодом это сделать. Можно в личку кинуть какой-нибудь месседжер? А то уже все работает (почти) кроме 1го но с этой фигней :)

Awiion 04.07.2017 23:46

Re: Графика и вывод своей информации
 
Вложений: 2
Вот пример, накидал на dx9, (dx8, opengl) можно использовать:)
Простенький хук, ЕндСцена, Текст и Драв бокс.

https://image.zone-game.info/images/...4/Lineage2.png


Текущее время: 02:57. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot