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

kizn

\ 0 _ 0 /
Всефорумный модератор
2,408
2,090
как перезаписать самповскую команду? (/q к примеру)
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,808
как перезаписать самповскую команду? (/q к примеру)
Регистрируешь ее еще раз, и все. Либо в структуре stInputInfo изменяешь функцию (CMDPROC) на свою, поиском по зарегистрированным именам команд
C++:
typedef void(__cdecl* CMDPROC) (PCHAR);
struct stInputInfo
{
    void* pD3DDevice;
    void* pDXUTDialog;
    stInputBox* pDXUTEditBox;
    CMDPROC                pCMDs[SAMP_MAX_CLIENTCMDS];
    char                szCMDNames[SAMP_MAX_CLIENTCMDS][33];
    int                    iCMDCount;
    int                    iInputEnabled;
    char                szInputBuffer[129];
    char                szRecallBufffer[10][129];
    char                szCurrentBuffer[129];
    int                    iCurrentRecall;
    int                    iTotalRecalls;
    CMDPROC                pszDefaultCMD;
};
 

checkdasound

Известный
Проверенный
963
410
Есть плагин с d3d9 рендером. Как сделать, чтобы инициализация хука происходила в нужный момент. Объясню: если поставить проверку на загрузку игры (0xC8D4C0 != 9) и сразу после нее инициализировать, то не будет работать, но если поставить после этого задержку в секунд так 10, то будет, но это такое. Мб есть какой-то адрес, отвечающий за это или что-то типа того.
 

4el0ve4ik

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

kin4stat

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

CleanLegend

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

checkdasound

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

4el0ve4ik

Известный
Всефорумный модератор
1,550
1,343
такое не прокатит, он уже проверят инициализацию игры через 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

\ 0 _ 0 /
Всефорумный модератор
2,408
2,090
По поводу SF: да, она перезаписывает самповскую команду, ошибка была в другом. Вопрос теперь у меня другой:
- как сделать проверку, остановился ли персонаж? в PEDSELF не нашел
 
  • Злость
Реакции: Izvinisb

kin4stat

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

frit

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

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,808
как получить все числа из строки? есть строка "абвгд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

*/