loganhackerdff
Известный
- 868
- 519
кусок кода который ты показал просто прелестен, идеален. но может всё же покажешь как хукаешь, какая версия самп, ну или на крайний случай дашь хоть какуе-то информацию, кроме того как ты читаешь непонятно еще правильный ли битстрим.кроче хук 36 rpc create 3d text выводит в чат херню всякую
Посмотреть вложение 113869
всё кароче,надо было bool на char заменитькусок кода который ты показал просто прелестен, идеален. но может всё же покажешь как хукаешь, какая версия самп, ну или на крайний случай дашь хоть какуе-то информацию, кроме того как ты читаешь непонятно еще правильный ли битстрим.
if (SF->getGame()->isKeyPressed(VK_HOME)) {
renderW = !renderW;
SF->getSAMP()->getMisc()->ToggleCursor(renderW);
}
попробуйПомогите пожалуйста, нема курсора когда активна менюшка
213:if (SF->getGame()->isKeyPressed(VK_HOME)) { renderW = !renderW; SF->getSAMP()->getMisc()->ToggleCursor(renderW); }
if (SF->getGame()->isKeyPressed(VK_HOME)) {
renderW = !renderW;
SF->getSAMP()->getMisc()->ToggleCursor(renderW ? 2 : 0); // renderW << 1
}
mem.setint8(0x969152, 1, false)
template <typename T>
void writeMem(DWORD address, T value)
{
DWORD oldProtect = 0;
VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), PAGE_EXECUTE_READWRITE, &oldProtect);
WriteProcessMemory(GetCurrentProcess(), (void*)address, &value, sizeof(value), 0);
VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), oldProtect, NULL);
}
unsigned char driveOnWater = 1;
writeMem<unsigned char>(0x969152, driveOnWater);
unsigned char driveOnWater = 1;Привет, хотел перевести на плюсы вот эту запись.
memory lua:mem.setint8(0x969152, 1, false)
На с++ получилось что такое:
функция для записи в память:template <typename T> void writeMem(DWORD address, T value) { DWORD oldProtect = 0; VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), PAGE_EXECUTE_READWRITE, &oldProtect); WriteProcessMemory(GetCurrentProcess(), (void*)address, &value, sizeof(value), 0); VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), oldProtect, NULL); }
дальше вызываю в коде:
вызов функции в коде:unsigned char driveOnWater = 1; writeMem<unsigned char>(0x969152, driveOnWater);
Ну и не работает кароче. Изменяю память в цикле.
Привет, хотел перевести на плюсы вот эту запись.
memory lua:mem.setint8(0x969152, 1, false)
На с++ получилось что такое:
функция для записи в память:template <typename T> void writeMem(DWORD address, T value) { DWORD oldProtect = 0; VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), PAGE_EXECUTE_READWRITE, &oldProtect); WriteProcessMemory(GetCurrentProcess(), (void*)address, &value, sizeof(value), 0); VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), oldProtect, NULL); }
дальше вызываю в коде:
вызов функции в коде:unsigned char driveOnWater = 1; writeMem<unsigned char>(0x969152, driveOnWater);
Ну и не работает кароче. Изменяю память в цикле.
последний аргумент -- false, соответственно протекцию снимать не нужно.mem.setint8(0x969152, 1, false)
*reinterpret_cast<uint8_t*>(0x969152) = 1;
template<typename T>
void writeMem(uintptr_t address, T value, bool unprotect = false)
{
DWORD old_protection;
auto address_ = reinterpret_cast<void*>(address);
if (unprotect)
VirtualProtect(address_, sizeof(value), PAGE_EXECUTE_READWRITE, &old_protection);
memcpy(&value, address_, sizeof(value));
if (unprotect)
VirtualProtect(address_, sizeof(value), old_protection, &old_protection);
}
Ты в value записуешь байты из _address?последний аргумент -- false, соответственно протекцию снимать не нужно.
Значит, тебе достаточно просто использовать это:
А так, если ты хочешь повторить код как на луа:C++:*reinterpret_cast<uint8_t*>(0x969152) = 1;
C++:template<typename T> void writeMem(uintptr_t address, T value, bool unprotect = false) { DWORD old_protection; auto address_ = reinterpret_cast<void*>(address); if (unprotect) VirtualProtect(address_, sizeof(value), PAGE_EXECUTE_READWRITE, &old_protection); memcpy(&value, address_, sizeof(value)); if (unprotect) VirtualProtect(address_, sizeof(value), old_protection, &old_protection); }
Привет, хотел перевести на плюсы вот эту запись.
memory lua:mem.setint8(0x969152, 1, false)
На с++ получилось что такое:
функция для записи в память:template <typename T> void writeMem(DWORD address, T value) { DWORD oldProtect = 0; VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), PAGE_EXECUTE_READWRITE, &oldProtect); WriteProcessMemory(GetCurrentProcess(), (void*)address, &value, sizeof(value), 0); VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), oldProtect, NULL); }
дальше вызываю в коде:
вызов функции в коде:unsigned char driveOnWater = 1; writeMem<unsigned char>(0x969152, driveOnWater);
Ну и не работает кароче. Изменяю память в цикле.
template <typename T>
void WriteMemory(std::uintptr_t address, T value, bool protect = true) {
unsigned long oldProt;
if (protect) VirtualProtect(reinterpret_cast<void*>(address), sizeof(T), 0x04, &oldProt);
*reinterpret_cast<T*>(address) = value;
if (protect) VirtualProtect(reinterpret_cast<void*>(address), sizeof(T), oldProt, &oldProt);
}
WriteMemory(0x969152, '\x01');
Всем ку, у кого-то есть аналог convertGameScreenCoordsToWindowScreenCoords из lua?
constexpr auto kRwEngineScreenW = 0x00C17044;
constexpr auto kRwEngineScreenH = 0x00C17048;
constexpr auto kGameScreenW = 640.f;
constexpr auto kGameScreenH = 448.f;
Vec2 gameScreenToWindow(Vec2 point) {
const int sx = *reinterpret_cast<int*>(kRwEngineScreenW);
const int sy = *reinterpret_cast<int*>(kRwEngineScreenH);
Vec2 result{};
result.x = (point.x / kGameScreenW) * sx;
result.y = (point.y / kGameScreenH) * sy;
return result;
}
id текстдравов улетают в лево вверхC++:constexpr auto kRwEngineScreenW = 0x00C17044; constexpr auto kRwEngineScreenH = 0x00C17048; constexpr auto kGameScreenW = 640.f; constexpr auto kGameScreenH = 448.f; Vec2 gameScreenToWindow(Vec2 point) { const int sx = *reinterpret_cast<int*>(kRwEngineScreenW); const int sy = *reinterpret_cast<int*>(kRwEngineScreenH); Vec2 result{}; result.x = (point.x / kGameScreenW) * sx; result.x = (point.y / kGameScreenH) * sy; return result; }
auto onScreenPos{ gameScreenToWindow({ pTextdraw->m_data.m_fX,pTextdraw->m_data.m_fY }) };
ImGui::GetForegroundDrawList()->AddText({ onScreenPos.x ,onScreenPos.y}, 0xFFFFFFFF, tos(i));
как минимум там мой проеб в том, что result.x два раза подряд(уже исправил)id текстдравов улетают в лево вверх
C++:auto onScreenPos{ gameScreenToWindow({ pTextdraw->m_data.m_fX,pTextdraw->m_data.m_fY }) }; ImGui::GetForegroundDrawList()->AddText({ onScreenPos.x ,onScreenPos.y}, 0xFFFFFFFF, tos(i));
kGameScreenW и kGameScreenH попробовал заменить, не помогли