Другое С/С++ Вопрос - Ответ

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,339
Есть плагин с d3d9 рендером. Как сделать, чтобы инициализация хука происходила в нужный момент. Объясню: если поставить проверку на загрузку игры (0xC8D4C0 != 9) и сразу после нее инициализировать, то не будет работать, но если поставить после этого задержку в секунд так 10, то будет, но это такое. Мб есть какой-то адрес, отвечающий за это или что-то типа того.
Проверять 0xC97C28 - IDirect3DDevice9 pointer! = nullptr, после проверки делать инициальзацию
 
  • Нравится
Реакции: checkdasound

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,731
4,720
Есть плагин с d3d9 рендером. Как сделать, чтобы инициализация хука происходила в нужный момент. Объясню: если поставить проверку на загрузку игры (0xC8D4C0 != 9) и сразу после нее инициализировать, то не будет работать, но если поставить после этого задержку в секунд так 10, то будет, но это такое. Мб есть какой-то адрес, отвечающий за это или что-то типа того.
Думаю можно хукнуть это:
 

CleanLegend

Известный
Всефорумный модератор
476
929
Проверять 0xC97C28 - IDirect3DDevice9 pointer! = nullptr, после проверки делать инициальзацию
такое не прокатит, он уже проверят инициализацию игры через 0xC8D4C0.
этот указатель(0xC97C28) заменяется на новый указатель при инициализации samp.dll.
нужно ждать пока пройдет инициализация замены указателя и только потом хукать, так как изначально выход идет на present от gta_sa, потом samp заменяет всю виртуальную таблицу на свою.
как вариант можно проверять какую либо структуру из samp на null
 

checkdasound

Известный
Проверенный
963
406
такое не прокатит, он уже проверят инициализацию игры через 0xC8D4C0.
этот указатель(0xC97C28) заменяется на новый указатель при инициализации samp.dll.
нужно ждать пока пройдет инициализация замены указателя и только потом хукать, так как изначально выход идет на present от gta_sa, потом samp заменяет всю виртуальную таблицу на свою.
как вариант можно проверять какую либо структуру из samp на null
мне нужно было без сампа, а вариант человечика прокатил
p.s. на самом деле нет, просто я забыл задержку убрать
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,339
такое не прокатит, он уже проверят инициализацию игры через 0xC8D4C0.
этот указатель(0xC97C28) заменяется на новый указатель при инициализации samp.dll.
нужно ждать пока пройдет инициализация замены указателя и только потом хукать, так как изначально выход идет на present от gta_sa, потом samp заменяет всю виртуальную таблицу на свою.
как вариант можно проверять какую либо структуру из samp на null
Че это не прокатит, просто самп будет рендерить раньше плагина и всего лишь, мы то подменим таблицу гта са, после чего самп уже заменяет измененную таблицу на свою и получится цепочка в виде самп->наш плагин->гта са
@CleanLegend работает же
Grand Theft Auto  San Andreas Screenshot 2020.09.12 - 15.11.52.63.png



C++:
void Thread(void*) {
    while (*reinterpret_cast<IDirect3DDevice9**>(0xC97C28) != nullptr)
        Sleep(350);
    d3d3hk = new D3D9Hook(*reinterpret_cast<IDirect3DDevice9**>(0xC97C28));
    d3d3hk->SetHook(&hkdPresent, iPresent);
    d3d3hk->SetHook(&hkdReset, iReset);
    gOriginalPresent = (tPresent)d3d3hk->GetOriginalFunc(iPresent);
    gOriginalReset = (tReset)d3d3hk->GetOriginalFunc(iReset);
}
остальную часть кода нет смысла выкладывать.
 
Последнее редактирование:

kizn

О КУ)))
Всефорумный модератор
2,405
2,060
По поводу SF: да, она перезаписывает самповскую команду, ошибка была в другом. Вопрос теперь у меня другой:
- как сделать проверку, остановился ли персонаж? в PEDSELF не нашел
 
  • Злость
Реакции: Izvinisb

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,731
4,720
По поводу SF: да, она перезаписывает самповскую команду, ошибка была в другом. Вопрос теперь у меня другой:
- как сделать проверку, остановился ли персонаж? в PEDSELF не нашел
стоит на месте или остановился?
Если стоит на месте - во флагах педа 1 бит. Или проверять скорость на нули.
А если остановился - можно закостылить через ид анимки сампа, если без костылей, то придется мудрить с Tasks
 

frit

Известный
389
174
как получить все числа из строки? есть строка "абвгд123еёжзийкл228", должен получить 123, 228
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,731
4,720
как получить все числа из строки? есть строка "абвгд123еёжзийкл228", должен получить 123, 228
C++:
#include <stdio.h>
#include <vector>
std::vector<int> numbers;
int number;
// scanning numbers from buffer(const char*) until available 
while (sscanf(buffer, “%99999d”, &number) != 0)
{
    numbers.push_back(number);
}
// I didnt tested this code, so check it before using
 
  • Нравится
Реакции: сerf

Cake_

Известный
Проверенный
263
313
C++:
#include <stdio.h>
#include <vector>
std::vector<int> numbers;
int number;
// scanning numbers from buffer(const char*) until available
while (sscanf(buffer, “%99999d”, &number) != 0)
{
    numbers.push_back(number);
}
// I didnt tested this code, so check it before using
fuck the sscanf:
#include <iostream>
#include <vector>
#include <regex>

std::vector<int> getNumberFromString(std::string input) {
    std::vector<int> output;

    std::regex regex(R"((\d+))");
    std::smatch matches;

    while (std::regex_search(input, matches, regex)) {
        output.push_back(std::stoi(matches[1].str()));
        input = matches.suffix().str();
    }
    return output;
}

void main() {
    std::vector<int> vec = getNumberFromString("str123str890str25str5");

    for (auto value : vec)
        std::cout << value << std::endl;

    system("pause");
}

/*
prompt output:

123
890
25
5

*/
 

frit

Известный
389
174
Как получить текст после :? Пример: "Привет: мир, как дела?", должен получить мир
 
Последнее редактирование:

Izvinisb

Известный
Проверенный
964
598
Как получить текст после :? Пример: "Привет: мир", должен получить мир
C++:
#include <iostream>
#include <string>
#include <regex>

int main()
{
    std::string str = "Привет: мир";
    std::cmatch res;
    std::regex reg("\\s(\.+)");
    if (std::regex_search(str.c_str(), res, reg))
        std::cout << res[1]; // мир
    return 0;
}
 

kizn

О КУ)))
Всефорумный модератор
2,405
2,060
Как сделать диалог с инпутом, в инпут которого принимается только текст формата 00:00:00 либо 00.00.0000
(где 0 - любое число)
 

Dark_Knight

Me, me and me.
Друг
4,065
2,079
Проще будет сделать проверку на то что уже ввел игрок после нажатия чем в момент нажатия.