Регистрируешь ее еще раз, и все. Либо в структуре stInputInfo изменяешь функцию (CMDPROC) на свою, поиском по зарегистрированным именам командкак перезаписать самповскую команду? (/q к примеру)
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;
};
Регистрируешь ее еще раз, и все.
Значит через структуру подменить CMDPROC нужно будеткак я понял, сф ее не перезаписывает, как это делает луа
Проверять 0xC97C28 - IDirect3DDevice9 pointer! = nullptr, после проверки делать инициальзациюЕсть плагин с d3d9 рендером. Как сделать, чтобы инициализация хука происходила в нужный момент. Объясню: если поставить проверку на загрузку игры (0xC8D4C0 != 9) и сразу после нее инициализировать, то не будет работать, но если поставить после этого задержку в секунд так 10, то будет, но это такое. Мб есть какой-то адрес, отвечающий за это или что-то типа того.
Думаю можно хукнуть это:Есть плагин с d3d9 рендером. Как сделать, чтобы инициализация хука происходила в нужный момент. Объясню: если поставить проверку на загрузку игры (0xC8D4C0 != 9) и сразу после нее инициализировать, то не будет работать, но если поставить после этого задержку в секунд так 10, то будет, но это такое. Мб есть какой-то адрес, отвечающий за это или что-то типа того.
такое не прокатит, он уже проверят инициализацию игры через 0xC8D4C0.Проверять 0xC97C28 - IDirect3DDevice9 pointer! = nullptr, после проверки делать инициальзацию
мне нужно было без сампа, а вариант человечика прокатилтакое не прокатит, он уже проверят инициализацию игры через 0xC8D4C0.
этот указатель(0xC97C28) заменяется на новый указатель при инициализации samp.dll.
нужно ждать пока пройдет инициализация замены указателя и только потом хукать, так как изначально выход идет на present от gta_sa, потом samp заменяет всю виртуальную таблицу на свою.
как вариант можно проверять какую либо структуру из samp на null
Че это не прокатит, просто самп будет рендерить раньше плагина и всего лишь, мы то подменим таблицу гта са, после чего самп уже заменяет измененную таблицу на свою и получится цепочка в виде самп->наш плагин->гта сатакое не прокатит, он уже проверят инициализацию игры через 0xC8D4C0.
этот указатель(0xC97C28) заменяется на новый указатель при инициализации samp.dll.
нужно ждать пока пройдет инициализация замены указателя и только потом хукать, так как изначально выход идет на present от gta_sa, потом samp заменяет всю виртуальную таблицу на свою.
как вариант можно проверять какую либо структуру из samp на null
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);
}
стоит на месте или остановился?По поводу SF: да, она перезаписывает самповскую команду, ошибка была в другом. Вопрос теперь у меня другой:
- как сделать проверку, остановился ли персонаж? в PEDSELF не нашел
как получить все числа из строки? есть строка "абвгд123еёжзийкл228", должен получить 123, 228
#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
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
#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
*/