как будто бы это лишнее. никогда не чистил шрифты при лостеImGuiIO& io = ImGui::GetIO(); io.Fonts->Clear(); // Очистить текущие шрифты
как будто бы это лишнее. никогда не чистил шрифты при лостеImGuiIO& io = ImGui::GetIO(); io.Fonts->Clear(); // Очистить текущие шрифты
У меня подобное было при рендере текста через DirectX, попробуй восстанавливать состояние, я обошёл это обычным перезапуском рендераДа я уже давно справился с этой задачей. Но всё равно спасибо.
Всем привет. Вопрос следующего характера. Не могу понять, почему при Render`е обычного 3D текста через графическую библиотеку ImGui при ALT + ENTER (смене разрешения) всё нормально, но, стоит мне сделать ALT + ENTER, то ники мои вообще не вижу (собсна, которые рендерю через ImGui)
А если я сделаю ALT + ENTER в момент когда рендерится ник над головой, то игра вообще не развернётся и всё.
В чём трабл?
Единственное что удивляет, с HP/Armour барами такого нету.
Может дело в шрифте?
cpp:void __fastcall CPlayerTags_DrawHealthBar_Hook(void* thisptr, void* edx, CVectorSamp* position, float fHealth, float fArmour, float fDistanceToCamera) { if (!deviceReset) return cPlayerTags_DrawHealthBar(thisptr, position, fHealth, fArmour, fDistanceToCamera); Main::RenderBars(position, fDistanceToCamera, fHealth, fArmour); } void __fastcall CPlayerTags_DrawLabel_Hook(void* thisptr, void* edx, CVectorSamp* position, const char* szText, unsigned long color, float fDistanceCamera, bool bDrawStatus, int nStatus) { /*if (true) { return; }*/ if (!deviceReset) return cPlayerTags_DrawLabel(thisptr, position, szText, color, fDistanceCamera, bDrawStatus, nStatus); Main::RenderText(szText, position, color, fDistanceCamera); } Инициализация ImGui. Events::initGameEvent += []() { CHooks::InitMinHook(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange; myFont = io.Fonts->AddFontFromFileTTF(std::string(CUtils::GetPath() + "font.ttf").c_str(), 18.0f, NULL, io.Fonts->GetGlyphRangesCyrillic()); if (myFont == nullptr) { printf("font not found\n"); myFont = io.Fonts->AddFontDefault(); } ImGui::StyleColorsDark(); ImGui_ImplWin32_Init(GetActiveWindow()); ImGui_ImplDX9_Init(*reinterpret_cast<IDirect3DDevice9**>(0xC97C28)); CHooks::GameLoop_HookInstall(); CHooks::CLabel__DrawHookInstall(); CHooks::CPlayerTags__DrawLabelHookInstall(); CHooks::CPlayerTags__DrawHealthBarHookInstall(); return true; }; Events::d3dResetEvent += []() { deviceReset = true; ImGui_ImplWin32_Init(GetActiveWindow()); ImGui_ImplDX9_Init(*reinterpret_cast<IDirect3DDevice9**>(0xC97C28)); ImGui_ImplDX9_CreateDeviceObjects(); ImGuiIO& io = ImGui::GetIO(); io.Fonts->AddFontFromFileTTF(std::string(CUtils::GetPath() + "font.ttf").c_str(), 18.0f, NULL, io.Fonts->GetGlyphRangesCyrillic()); io.Fonts->Build(); return true; }; Events::d3dLostEvent += []() { if (!deviceReset) return true; deviceReset = false; ImGui_ImplWin32_Shutdown(); ImGui_ImplDX9_Shutdown(); ImGui_ImplDX9_InvalidateDeviceObjects(); ImGuiIO& io = ImGui::GetIO(); io.Fonts->Clear(); // Очистить текущие шрифты return true; }; extern "C" __declspec(dllexport) void Ext_RenderText(const char* szText, CVectorSamp* position, unsigned long color, float fDistanceToCamera, bool isBot = false) { if (!deviceReset) return; ImGui_ImplDX9_NewFrame(); ImGui_ImplWin32_NewFrame(); ImGui::NewFrame(); position->z = fDistanceToCamera * 0.047499999 + position->z + 0.2; RwV3d pos{ position->x, position->y, position->z }; RwV3d out; float width, height; uint8_t r, g, b, a; CUtils::explode_argb((uint32_t)color, a, r, g, b); CVector cameraPos = TheCamera.GetPosition(); CEntity* entity = FindPlayerPed(); CColPoint colPoint; bool isLineOfSight = !CWorld::ProcessLineOfSight( cameraPos, pos, colPoint, entity, true, false, false, true, false, true, false, false ); if (!isLineOfSight) return; if (CSprite::CalcScreenCoors(pos, &out, &width, &height, true, true)) { ImVec2 screenPos(out.x, out.y + 4.0f); ImDrawList* drawList = ImGui::GetForegroundDrawList(); std::string utf8Text = CUtils::ConvertAnsiToUtf8(szText); auto RemoveColorCodes = [](const std::string& text) -> std::string { std::string result = text; size_t pos = 0; while ((pos = result.find('{', pos)) != std::string::npos) { size_t endPos = result.find('}', pos); if (endPos != std::string::npos) { result.erase(pos, endPos - pos + 1); } else { break; } } return result; }; std::string nickname; int playerID = -1; size_t openBracket = utf8Text.find('('); if (openBracket != std::string::npos) { size_t closeBracket = utf8Text.find(')', openBracket); if (closeBracket != std::string::npos) { nickname = utf8Text.substr(0, openBracket); std::string idString = utf8Text.substr(openBracket + 1, closeBracket - openBracket - 1); try { playerID = std::stoi(idString); } catch (const std::exception&) { playerID = -1; } if (!nickname.empty() && nickname.back() == ' ') { nickname.pop_back(); } } } else { nickname = utf8Text; playerID = -1; } UINT32 characterId = 0; if (CHooks::playersCharacterId.contains(playerID)) { characterId = CHooks::playersCharacterId[playerID]; } if (!characterId && !isBot) return; if (isBot) characterId = playerID; nickname = RemoveColorCodes(nickname); std::string characterIdPart = " #" + std::to_string(characterId); ImVec2 nicknameSize = ImGui::CalcTextSize(nickname.c_str()); ImVec2 characterIdSize = ImGui::CalcTextSize(characterIdPart.c_str()); ImVec2 totalSize = ImVec2(nicknameSize.x + characterIdSize.x, std::max(nicknameSize.y, characterIdSize.y)); ImVec2 centeredPos = screenPos; centeredPos.x -= totalSize.x / 2.0f; centeredPos.y -= totalSize.y / 2.0f; auto DrawTextOutline = [&](const ImVec2& pos, const std::string& text, ImU32 textColor, ImU32 outlineColor = IM_COL32(0, 0, 0, 255)) { float outlineThickness = 1.0f; ImVec2 offsets[] = { ImVec2(-outlineThickness, -outlineThickness), // лево-верх ImVec2(0, -outlineThickness), // верх ImVec2(outlineThickness, -outlineThickness), // право-верх ImVec2(-outlineThickness, 0), // лево ImVec2(outlineThickness, 0), // право ImVec2(-outlineThickness, outlineThickness), // лево-низ ImVec2(0, outlineThickness), // низ ImVec2(outlineThickness, outlineThickness) // право-низ }; for (int layer = 0; layer < 2; layer++) { for (const auto& offset : offsets) { ImVec2 outlinePos = ImVec2(pos.x + offset.x, pos.y + offset.y); drawList->AddText( myFont, ImGui::GetFontSize(), outlinePos, outlineColor, text.c_str() ); } } drawList->AddText( myFont, ImGui::GetFontSize(), pos, textColor, text.c_str() ); }; if (!nickname.empty()) { ImU32 nicknameColor = IM_COL32(r, g, b, 255); DrawTextOutline(centeredPos, nickname, nicknameColor); } ImVec2 characterIdPos = ImVec2(centeredPos.x + nicknameSize.x, centeredPos.y); ImU32 whiteColor = IM_COL32(255, 255, 255, 255); DrawTextOutline(characterIdPos, characterIdPart, whiteColor); } ImGui::EndFrame(); ImGui::Render(); ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData()); }
Ты имеешь ввиду вот это?У меня подобное было при рендере текста через DirectX, попробуй восстанавливать состояние, я обошёл это обычным перезапуском рендера
ImGui_ImplWin32_Init(GetActiveWindow());
ImGui_ImplDX9_Init(*reinterpret_cast<IDirect3DDevice9**>(0xC97C28));
Ты имеешь ввиду вот это?
cpp:ImGui_ImplWin32_Init(GetActiveWindow()); ImGui_ImplDX9_Init(*reinterpret_cast<IDirect3DDevice9**>(0xC97C28));
Восстанавливать состояние? Не особо понял, что ты имел ввиду.
Моим нервам пизда, нихуя не исправилось, как исправить эту ебаную хуйню?Ты имеешь ввиду вот это?
cpp:ImGui_ImplWin32_Init(GetActiveWindow()); ImGui_ImplDX9_Init(*reinterpret_cast<IDirect3DDevice9**>(0xC97C28));
Восстанавливать состояние? Не особо понял, что ты имел ввиду.
P.S. Всё исправил. Проблема была в моей невнимательности.
Events::initGameEvent += []() {
CHooks::InitMinHook();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange;
myFont = io.Fonts->AddFontFromFileTTF(std::string(CUtils::GetPath() + "font.ttf").c_str(), 18.0f, NULL, io.Fonts->GetGlyphRangesCyrillic());
if (myFont == nullptr) {
printf("font not found\n");
myFont = io.Fonts->AddFontDefault();
}
ImGui::StyleColorsDark();
ImGui_ImplWin32_Init(GetActiveWindow());
ImGui_ImplDX9_Init(*reinterpret_cast<IDirect3DDevice9**>(0xC97C28));
CHooks::GameLoop_HookInstall();
CHooks::CLabel__DrawHookInstall();
CHooks::CPlayerTags__DrawLabelHookInstall();
CHooks::CPlayerTags__DrawHealthBarHookInstall();
return true;
};
Events::d3dResetEvent += []() {
if (!deviceReset) return false;
deviceReset = false;
//ImGui::CreateContext();
//ImGui_ImplWin32_Init(GetActiveWindow());
//ImGui_ImplDX9_Init(*reinterpret_cast<IDirect3DDevice9**>(0xC97C28));
ImGui_ImplDX9_CreateDeviceObjects();
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF(std::string(CUtils::GetPath() + "font.ttf").c_str(), 18.0f, NULL, io.Fonts->GetGlyphRangesCyrillic());
io.Fonts->Build();
return true;
};
Events::d3dLostEvent += []() {
deviceReset = true;
//ImGui_ImplWin32_Shutdown();
//ImGui_ImplDX9_Shutdown();
ImGui_ImplDX9_InvalidateDeviceObjects();
//ImGuiIO& io = ImGui::GetIO();
//io.Fonts->Clear(); // Очистить текущие шрифты
return true;
};
Events::pedDtorEvent += [](CPed* ped) {
int playerId = CMultiplayer::GetPlayerID(ped);
if (playerId != 65535) {
CHooks::playersCharacterId.erase(playerId);
}
};
};
} grade_tags;
BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH) {}
//gChat.initialize();
else if (fdwReason == DLL_PROCESS_DETACH)
{
ImGui_ImplDX9_Shutdown();
ImGui_ImplWin32_Shutdown();
ImGui::DestroyContext();
}
return TRUE;
}
extern "C" __declspec(dllexport) void Ext_RenderText(const char* szText, CVectorSamp* position, unsigned long color, float fDistanceToCamera, bool isBot = false)
{
if (deviceReset) return;
ImGui_ImplDX9_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
position->z = fDistanceToCamera * 0.047499999 + position->z + 0.2;
RwV3d pos{ position->x, position->y, position->z };
RwV3d out;
float width, height;
uint8_t r, g, b, a;
CUtils::explode_argb((uint32_t)color, a, r, g, b);
CVector cameraPos = TheCamera.GetPosition();
CEntity* entity = FindPlayerPed();
CColPoint colPoint;
bool isLineOfSight = !CWorld::ProcessLineOfSight(
cameraPos,
pos,
colPoint,
entity,
true,
false,
false,
true,
false,
true,
false,
false
);
if (!isLineOfSight) return;
if (CSprite::CalcScreenCoors(pos, &out, &width, &height, true, true)) {
ImVec2 screenPos(out.x, out.y + 4.0f);
ImDrawList* drawList = ImGui::GetForegroundDrawList();
std::string utf8Text = CUtils::ConvertAnsiToUtf8(szText);
auto RemoveColorCodes = [](const std::string& text) -> std::string {
std::string result = text;
size_t pos = 0;
while ((pos = result.find('{', pos)) != std::string::npos) {
size_t endPos = result.find('}', pos);
if (endPos != std::string::npos) {
result.erase(pos, endPos - pos + 1);
}
else {
break;
}
}
return result;
};
std::string nickname;
int playerID = -1;
size_t openBracket = utf8Text.find('(');
if (openBracket != std::string::npos) {
size_t closeBracket = utf8Text.find(')', openBracket);
if (closeBracket != std::string::npos) {
nickname = utf8Text.substr(0, openBracket);
std::string idString = utf8Text.substr(openBracket + 1, closeBracket - openBracket - 1);
try {
playerID = std::stoi(idString);
}
catch (const std::exception&) {
playerID = -1;
}
if (!nickname.empty() && nickname.back() == ' ') {
nickname.pop_back();
}
}
}
else {
nickname = utf8Text;
playerID = -1;
}
UINT32 characterId = 0;
if (CHooks::playersCharacterId.contains(playerID)) {
characterId = CHooks::playersCharacterId[playerID];
}
if (!characterId && !isBot) return;
if (isBot) characterId = playerID;
nickname = RemoveColorCodes(nickname);
std::string characterIdPart = " #" + std::to_string(characterId);
ImVec2 nicknameSize = ImGui::CalcTextSize(nickname.c_str());
ImVec2 characterIdSize = ImGui::CalcTextSize(characterIdPart.c_str());
ImVec2 totalSize = ImVec2(nicknameSize.x + characterIdSize.x, std::max(nicknameSize.y, characterIdSize.y));
ImVec2 centeredPos = screenPos;
centeredPos.x -= totalSize.x / 2.0f;
centeredPos.y -= totalSize.y / 2.0f;
auto DrawTextOutline = [&](const ImVec2& pos, const std::string& text, ImU32 textColor, ImU32 outlineColor = IM_COL32(0, 0, 0, 255)) {
float outlineThickness = 1.0f;
ImVec2 offsets[] = {
ImVec2(-outlineThickness, -outlineThickness), // лево-верх
ImVec2(0, -outlineThickness), // верх
ImVec2(outlineThickness, -outlineThickness), // право-верх
ImVec2(-outlineThickness, 0), // лево
ImVec2(outlineThickness, 0), // право
ImVec2(-outlineThickness, outlineThickness), // лево-низ
ImVec2(0, outlineThickness), // низ
ImVec2(outlineThickness, outlineThickness) // право-низ
};
for (int layer = 0; layer < 2; layer++) {
for (const auto& offset : offsets) {
ImVec2 outlinePos = ImVec2(pos.x + offset.x, pos.y + offset.y);
drawList->AddText(
myFont,
ImGui::GetFontSize(),
outlinePos,
outlineColor,
text.c_str()
);
}
}
drawList->AddText(
myFont,
ImGui::GetFontSize(),
pos,
textColor,
text.c_str()
);
};
if (!nickname.empty()) {
ImU32 nicknameColor = IM_COL32(r, g, b, 255);
DrawTextOutline(centeredPos, nickname, nicknameColor);
}
ImVec2 characterIdPos = ImVec2(centeredPos.x + nicknameSize.x, centeredPos.y);
ImU32 whiteColor = IM_COL32(255, 255, 255, 255);
DrawTextOutline(characterIdPos, characterIdPart, whiteColor);
}
ImGui::EndFrame();
ImGui::Render();
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
}
Всякие хуки
void __fastcall CPlayerTags_DrawHealthBar_Hook(void* thisptr, void* edx, CVectorSamp* position, float fHealth, float fArmour, float fDistanceToCamera) {
if (deviceReset)
return cPlayerTags_DrawHealthBar(thisptr, position, fHealth, fArmour, fDistanceToCamera);
Main::RenderBars(position, fDistanceToCamera, fHealth, fArmour);
}
void __fastcall CPlayerTags_DrawLabel_Hook(void* thisptr, void* edx, CVectorSamp* position, const char* szText, unsigned long color, float fDistanceCamera, bool bDrawStatus, int nStatus) {
/*if (true) {
return;
}*/
if (deviceReset)
return cPlayerTags_DrawLabel(thisptr, position, szText, color, fDistanceCamera, bDrawStatus, nStatus);
Main::RenderText(szText, position, color, fDistanceCamera);
}
лишнееImGui_ImplDX9_CreateDeviceObjects(); ImGuiIO& io = ImGui::GetIO(); io.Fonts->AddFontFromFileTTF(std::string(CUtils::GetPath() + "font.ttf").c_str(), 18.0f, NULL, io.Fonts->GetGlyphRangesCyrillic()); io.Fonts->Build();
и вот такую хуйню вижу, когда нажимаю кнопки ALT и ENTERлишнее
При удалении создания шрифта в ресете, ничего не меняется?и вот такую хуйню вижу, когда нажимаю кнопки ALT и ENTERПосмотреть вложение 277204
У меня вообще подозрения на то, что я не правильно понял предназначения этих двух Event`овПри удалении создания шрифта в ресете, ничего не меняется?
Events::d3dResetEvent += []() {
if (!deviceReset) return false;
deviceReset = false;
ImGui::CreateContext();
//ImGui_ImplWin32_Init(GetActiveWindow());
//ImGui_ImplDX9_Init(*reinterpret_cast<IDirect3DDevice9**>(0xC97C28));
//ImGui_ImplDX9_CreateDeviceObjects();
//ImGuiIO& io = ImGui::GetIO();
//io.Fonts->AddFontFromFileTTF(std::string(CUtils::GetPath() + "font.ttf").c_str(), 18.0f, NULL, io.Fonts->GetGlyphRangesCyrillic());
//io.Fonts->Build();
return true;
};
Events::d3dLostEvent += []() {
deviceReset = true;
//ImGui_ImplWin32_Shutdown();
//ImGui_ImplDX9_Shutdown();
ImGui_ImplDX9_InvalidateDeviceObjects();
ImGuiIO& io = ImGui::GetIO();
io.Fonts->Clear(); // Очистить текущие шрифты
return true;
};
В точкуlost, когда же потерян фокус с экраном, а reset - восстановлен фокус с экраном?
Это не нужно делать, достаточно вызвать ImGui_ImplDX9_InvalidateDeviceObjects (Восстанавливать состояния в этом случае также не требуется. Это делается автоматически)Так-вот, я делаю очистку шрифта, и у меня игра сразу же при запуске.
пиздец(В точку
Это не нужно делать, достаточно вызвать ImGui_ImplDX9_InvalidateDeviceObjects (Восстанавливать состояния в этом случае также не требуется. Это делается автоматически)
Можешь скинуть проект в ЛС, я в свободное время глянупиздец(
и чо делать?
ImGui_ImplDX9_InvalidateDeviceObjects(); вот у меня вызывается в lost event
очистку шрифтов я убрал, но ничего не изменяется(((
короче есть такой код
и там есть трабл в том что при выводе курсора можно управлять педом, но а мне надо что бы при выводе курсора нельзя было типо как в сампе открываешь чат/esc что бы так же выводилоC++:void show_cursor(bool state) { using RwD3D9GetCurrentD3DDevice_t = LPDIRECT3DDEVICE9(__cdecl*)(); auto rwCurrentD3dDevice{ reinterpret_cast< RwD3D9GetCurrentD3DDevice_t>(0x7F9D50U)() }; if (nullptr == rwCurrentD3dDevice) { return; } static DWORD updateMouseProtection, rsMouseSetPosProtFirst, rsMouseSetPosProtSecond; if (state) { ::VirtualProtect(reinterpret_cast<void*>(0x53F3C6U), 5U, PAGE_EXECUTE_READWRITE, &updateMouseProtection); ::VirtualProtect(reinterpret_cast<void*>(0x53E9F1U), 5U, PAGE_EXECUTE_READWRITE, &rsMouseSetPosProtFirst); ::VirtualProtect(reinterpret_cast<void*>(0x748A1BU), 5U, PAGE_EXECUTE_READWRITE, &rsMouseSetPosProtSecond); // NOP: CPad::UpdateMouse *reinterpret_cast<uint8_t*>(0x53F3C6U) = 0xE9U; *reinterpret_cast<uint32_t*>(0x53F3C6U + 1U) = 0x15BU; // NOP: RsMouseSetPos memset(reinterpret_cast<void*>(0x53E9F1U), 0x90, 5U); memset(reinterpret_cast<void*>(0x748A1BU), 0x90, 5U); rwCurrentD3dDevice->ShowCursor(TRUE); } else { // Original: CPad::UpdateMouse memcpy(reinterpret_cast<void*>(0x53F3C6U), "\xE8\x95\x6C\x20\x00", 5U); // Original: RsMouseSetPos memcpy(reinterpret_cast<void*>(0x53E9F1U), "\xE8\xAA\xAA\x0D\x00", 5U); memcpy(reinterpret_cast<void*>(0x748A1BU), "\xE8\x80\x0A\xED\xFF", 5U); using CPad_ClearMouseHistory_t = void(__cdecl*)(); using CPad_UpdatePads_t = void(__cdecl*)(); reinterpret_cast<CPad_ClearMouseHistory_t>(0x541BD0U)(); reinterpret_cast<CPad_UpdatePads_t>(0x541DD0U)(); ::VirtualProtect(reinterpret_cast<void*>(0x53F3C6U), 5U, updateMouseProtection, &updateMouseProtection); ::VirtualProtect(reinterpret_cast<void*>(0x53E9F1U), 5U, rsMouseSetPosProtFirst, &rsMouseSetPosProtFirst); ::VirtualProtect(reinterpret_cast<void*>(0x748A1BU), 5U, rsMouseSetPosProtSecond, &rsMouseSetPosProtSecond); rwCurrentD3dDevice->ShowCursor(FALSE); } }
на 11 винде проблема с путями.Столкнулся с такой проблемой, что на Windows 11 32-х битной структуры плагины не запускаются (ну когда x86 выбираешь в Visual Studio)
И вообще, на 11 винде как-то не стабильно работает гта
Сделал.При запуске предлагает выбрать монитор и разрешение, как можно перехватить это окно выбора и изменить, картинку там добавить или текст какой то?
Через IDA смотрел не нашёл по strings ничего подобного.
В потоке изменил, через опрос (polling)Как удалось?