Просмотр полной версии : С/С++ Вопрос - Ответ
Не понял, что за переменная counti, что с ней делать?
Ошибся, не "counti",a "count". Каждый раз когда скин походит, она инкримируется, и в последствии у тебя будет количество людей с нужными скинами
Почему то так, выводит только первый скин, 102.
103 и 104 не выводит.
Я бы заменил на:
C++:
if
(
g_Players
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
->
base
.
model_alt_id
>
102
&&
g_Players
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
->
base
.
model_alt_id
PrintShadow
(
1
,
pPresentParam
.
BackBufferHeight
/
2
+
count
*
20
,
color
,
text
)
;
count
++
;
}
Почему то так, выводит только первый скин, 102.
103 и 104 не выводит.
Он выводит только 103 скин, я писал не так. У меня вместо 102 в коде 101, а вместо 104 - 105. А в случае как ты написал, надо было бы в условии сделать вместо знаков ">" "=" "
в исходнике соба нет структуры stSAMPMisc
в структуре есть iRaceCheckpointEnabled и vecRaceCheckpointPos, чем их можно заменить?
Как сделать проверку на ЗАЖАТИЕ клавиши? Пока клавишу держат опущенной, то программа работает, когда отпускают - перестаёт работать.
SF->getGame()->isKeyDown()
or
GetAsyncKeyState() != NULL
как проверить, если пикап уже подобрали?
когда кто то поднимает пикап, он по прежнему существует, но мы его не можем видеть или поднять...
Vasiliy77
12.03.2016, 22:52
Пробую написать значит прогу для начала у виде ехе файла, чтобы можно было удобней проверять написанное. Прога должна находить с памяти gta-sa.exe динамический адрес айпи. С помощью видеоуроков на ютубе и Cheat Engine я сделал приблизительно что нужно мне:
// В файле класса:
DWORD Anticheat::ReadPointer(DWORD base, DWORD* offsets, int count)
{
for (int i = 0; i Open();
printf("PID: %x\n\n", mem->getPID());
DWORD offsets[] = { 0x021A0F8, 0x20 };
DWORD addressdllsamp = 0x05180000;// адрес samp.dll
DWORD ammoadr = mem->ReadPointer(addressdllsamp, offsets, 2);
printf("Adress: 0x%x / value = %s\n\n", ammoadr, mem->Read(ammoadr, 15).toStringA());// 15 - величина nick`a + 1
system("PAUSE");
}[/I]
Здесь система получает динамический адресс значения "айпи сервера", через оффсеты и поинты.
Если в уже открытом процессе менять айпи, то в консоль выводит ее правильно. Но если перезапустить процесс, то в CE вижу что в samp.dll уже другой адрес, и в итоге в консоли ничего нет. Помогите вот, нужно такое же сделать, только уже для samp.dll, тоесть узнать поинт и оффсеты смещения в памяти адреса dll-лки.
http://www.cyberforum.ru/attachments/660889d1457693750
@Vasiliy77 (https://www.blast.hk/members/62479/), тебе нужно получить базовый адрес модуля в процессе.
это можно сделать с помощью такой функции:
C++:
#include
#include
HMODULE
getModuleHandleRemote
(
DWORD processId
,
const
char
*
moduleName
)
{
HANDLE snap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPMODULE
,
processId
)
;
if
(
snap
==
INVALID_HANDLE_VALUE
)
return
NULL
;
MODULEENTRY32 moduleEntry
;
moduleEntry
.
dwSize
=
sizeof
(
moduleEntry
)
;
bool
found
=
Module32First
(
snap
,
&
moduleEntry
)
==
TRUE
;
while
(
found
)
{
if
(
stricmp
(
moduleEntry
.
szModule
,
moduleName
)
==
0
)
return
CloseHandle
(
snap
)
,
moduleEntry
.
hModule
;
found
=
Module32Next
(
snap
,
&
moduleEntry
)
==
TRUE
;
}
CloseHandle
(
snap
)
;
return
NULL
;
}
Gabriel__
15.03.2016, 14:26
Почему не работает!!!
Это все изза дибильной функции stricmp которая не сравнивает две строки если они одинаковые. (код отлаживал)
Код:
#include
#include
....
DWORD GetPID(const char * m_pName)
{
DWORD m_pID = 0;
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pInfo;
pInfo.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(snapshot, &pInfo))
{
while (Process32Next(snapshot, &pInfo))
{
if ( !stricmp( (const char *) m_pName, (const char *) pInfo.szExeFile) )
{
m_pID = pInfo.th32ProcessID;
CloseHandle(snapshot);
return m_pID;
}
}
}
CloseHandle(snapshot);
return m_pID;
}
....
GetPID("smss.exe");
itsLegend
15.03.2016, 15:57
И что именно не работает? Я скомпилил, норм всё.
Vasiliy77
15.03.2016, 15:58
Почему не работает!!!
Это все изза дибильной функции stricmp которая не сравнивает две строки если они одинаковые. (код отлаживал)
Код:
#include
#include
....
DWORD GetPID(const char * m_pName)
{
DWORD m_pID = 0;
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pInfo;
pInfo.dwSize = sizeof(PROCESSENTRY32);
.................
Код:
void GetPID()
{
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pInfo;// тут хранится запись о текущем процессе
pInfo.dwSize = sizeof(PROCESSENTRY32);// размер структуры записи текущего процесса
if (Process32First(snapshot, &pInfo))
{
while (Process32Next(snapshot, &pInfo))
{
if (_stricmp(m_pName, pInfo.szExeFile) == 0)
{
m_pID = pInfo.th32ProcessID;
CloseHandle(snapshot);
return;
}
}
}
CloseHandle(snapshot);
m_pID = 0;
}
void Open(DWORD accessRights)
{
GetPID();
m_hProc = OpenProcess(accessRights, false, m_pID);
}
DWORD getPID(){ return m_pID; }
Vasiliy77
15.03.2016, 16:01
@Vasiliy77 (https://www.blast.hk/members/62479/), тебе нужно получить базовый адрес модуля в процессе.
это можно сделать с помощью такой функции:
C++:
#include
#include
HMODULE
getModuleHandleRemote
(
DWORD processId
,
const
char
*
moduleName
)
{
HANDLE snap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPMODULE
,
processId
)
;
if
(
snap
==
INVALID_HANDLE_VALUE
)
return
NULL
;
MODULEENTRY32 moduleEntry
;
moduleEntry
.
dwSize
=
sizeof
(
moduleEntry
)
;
bool
found
=
Module32First
(
snap
,
&
moduleEntry
)
==
TRUE
;
while
(
found
)
{
if
(
stricmp
(
moduleEntry
.
szModule
,
moduleName
)
==
0
)
return
CloseHandle
(
snap
)
,
moduleEntry
.
hModule
;
found
=
Module32Next
(
snap
,
&
moduleEntry
)
==
TRUE
;
}
CloseHandle
(
snap
)
;
return
NULL
;
}
Спасибо, все получилось. А как можно узнать какие клео скрипты уже загружены в память? В каком участке памяти это есть? Нужны особенно те скрипты, которые делают WriteMemory в процесс.
Goldfish
16.03.2016, 16:07
подскажите плиз где найти задачки с примерами среднего уровня по ООП C++
Dark_Knight
16.03.2016, 17:00
подскажите плиз где найти задачки с примерами среднего уровня по ООП C++
Гугл)))
Gabriel__
16.03.2016, 18:12
И что именно не работает? Я скомпилил, норм всё.
Сказал же _stricmp нихрена не работает! Строки одинаковые но выдает что они разные!
http://s017.radikal.ru/i434/1603/47/d77b4138d112.jpg
Наверное это все изза вот такого преобразования
_stricmp(m_pName, (char *) pInfo.szExeFile) == 0
Без вот этого ---
Ошибка компиляции.
error C2664: _stricmp: невозможно преобразовать параметр 2 из "WCHAR [260]" в "const char *"
Код:
DWORD GetPID()
{
DWORD m_pID = 0;
char * m_pName = "smss.exe";
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pInfo;// тут хранится запись о текущем процессе
pInfo.dwSize = sizeof(PROCESSENTRY32);// размер структуры записи текущего процесса
if (Process32First(snapshot, &pInfo))
{
while (Process32Next(snapshot, &pInfo))
{
if (_stricmp(m_pName, (char *) pInfo.szExeFile) == 0)
{
m_pID = pInfo.th32ProcessID;
CloseHandle(snapshot);
return m_pID;
}
}
}
CloseHandle(snapshot);
return m_pID;
}
itsLegend
16.03.2016, 22:39
В свойствах проекта установи набор символов из многобайтовой кодировки.
Goldfish
16.03.2016, 23:17
Гугл)))
спасибо что напомнил :mda:
Gabriel__
17.03.2016, 13:24
Как проверить что хендл или указатель рабочие ? Тоесть на что они указывают существует.
Dark_Knight
17.03.2016, 14:27
!= null(nullptr)
Извините прям, ну вот совсем за такой уебанский вопрос. Что нужно добавлять в исходник кода, чтоб консоль не закрывалась сразу после выполнения кода. Т.е. даже самый простой пример, я вывожу текст Hello, World ! И даже не успеваю его прочитать, как консоль закрывается. Или считаю числа и не успеваю посмотреть ответ между подсчетами. Короче сабж.
Пример кода:
C++:
#include "stdafx.h"
#include
int
main
(
)
{
std
::
cout
>
v1
>>
v2
;
std
::
cout
Код все норм дебажится и запускается консоль.
Вот кстати код дебага:
Код:
[CODE]
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Users\Oleg\Documents\Visual Studio 2013\Projects\ConsoleApplication1\Debug\ConsoleApp lication1.exe'. Symbols loaded.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\kernel32.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\KernelBase.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\msvcp120d.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\msvcr120d.dll'. Cannot find or open the PDB file.
The program '[3384] ConsoleApplication1.exe' has exited with code 0 (0x0).
P.S. Microsoft Visual Studio 2013 (последний Pack)
BlackKnigga
20.03.2016, 14:08
Извините прям, ну вот совсем за такой уебанский вопрос. Что нужно добавлять в исходник кода, чтоб консоль не закрывалась сразу после выполнения кода. Т.е. даже самый простой пример, я вывожу текст Hello, World ! И даже не успеваю его прочитать, как консоль закрывается. Или считаю числа и не успеваю посмотреть ответ между подсчетами. Короче сабж.
Пример кода:
C++:
#include "stdafx.h"
#include
int
main
(
)
{
std
::
cout
>
v1
>>
v2
;
std
::
cout
Код все норм дебажится и запускается консоль.
Вот кстати код дебага:
Код:
[CODE]
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Users\Oleg\Documents\Visual Studio 2013\Projects\ConsoleApplication1\Debug\ConsoleApp lication1.exe'. Symbols loaded.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\kernel32.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\KernelBase.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\msvcp120d.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\msvcr120d.dll'. Cannot find or open the PDB file.
The program '[3384] ConsoleApplication1.exe' has exited with code 0 (0x0).
P.S. Microsoft Visual Studio 2013 (последний Pack)
Инклудь cstdlib и в конец System("Pause");
Инклудь cstdlib и в конец System("Pause");
Бесит, что в учебнике не сказано, так делать. После таких глупостей, просто хочеться плюнуть в лицо автору учебника. Просто после таких ошибок, ты сидишь и думаешь, какого фига консоль закрывается ? Вроде бы все хорошо написал в коде, но бац тут такая фигня, автор учебника просто забыл сказать это. Учебник 2013.
В любом случаи спасибо за помощь.
Gabriel__
20.03.2016, 15:45
_getch() - Файл conio.h
system("pause") - Файл iostream для VS
system("pause") - Файл cstdlib для GCC
Можно ли сделать сканер файлов?
как подключится к процессу dll ? На подобии CE
Woofing Giraffe
21.03.2016, 00:40
Глупый вопрос, но почему компилятор ругается? И как можно сделать по другому?
Код:
size_t test = strlen(NickLexem);
char Trash[test];
Dark_Knight
21.03.2016, 00:45
Глупый вопрос, но почему компилятор ругается? И как можно сделать по другому?
Код:
size_t test= strlen(NickLexem);
char Trash[test];
char *cha = (char *)malloc(test);
Кто нибудь работал с трейнерами cs go или warface (на С++) отпишите мне в лс пожалуйста.
Gabriel__
23.03.2016, 18:56
Как записать значение в память ? Например мне нужно записать значение размеров в 8 байт как мне это сделать ?
Dark_Knight
23.03.2016, 19:29
*(DWORD *)0xFFFFFFFF = 0xFFFFFFFF
Gabriel__
23.03.2016, 19:44
DWORD имеет размер 4.
Как это будет выглядить в c++ ?
0A8C: write_memory 0x747FB6 size 1 value 16843009 virtual_protect 0
0A8C: write_memory 0x74805A size 1 value 16843009 virtual_protect 0
0A8C: write_memory 0x74542B size 8 value -1869574000 virtual_protect 0
Dark_Knight
23.03.2016, 21:07
Код в клео неверный. В первой и второй строке у тебя точно значение не в байтах.
Третья строка вот тебе.
*(double *)0x74542B = -1869574000
Gabriel__
24.03.2016, 15:36
Как через Switch создавать объекты с одинаковыми названиями но разными типами ?
Код:
switch (params->packetId)
{
case PacketEnumeration::ID_WEAPONS_UPDATE:
return false;
case PacketEnumeration::ID_PLAYER_SYNC:
stOnFootData *data = new stOnFootData;
break;
case PacketEnumeration::ID_VEHICLE_SYNC:
stInCarData *data = new stInCarData;
break;
case PacketEnumeration::ID_PASSENGER_SYNC:
stPassengerData *data = new stPassengerData;
break;
default:
return true;
}
memset(data, 0, sizeof (data) ); // обнуляем
DWORD имеет размер 4.
Как это будет выглядить в c++ ?
0A8C: write_memory 0x747FB6 size 1 value 16843009 virtual_protect 0
0A8C: write_memory 0x74805A size 1 value 16843009 virtual_protect 0
0A8C: write_memory 0x74542B size 8 value -1869574000 virtual_protect 0
В клео вроде нельзя больше 4х байт писать.
Gabriel__
24.03.2016, 16:01
Как опростить этот говнокод ? Т.е Switch создать объект нужной структуры.
Код:
switch (params->packetId)
{
case PacketEnumeration::ID_PLAYER_SYNC:
stOnFootData data; // определяем объект в который сохраним отправляемые данные
memset(&data, 0, sizeof(stOnFootData)); // обнуляем
byte packet;
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(packet); // читаем ID пакета
params->bitStream->Read((PCHAR)&data, sizeof(stOnFootData)); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
data.byteCurrentWeapon = 0;
params->bitStream->ResetWritePointer(); // обнуляем оффсет записи
params->bitStream->Write(packet); // пишем ид пакета
params->bitStream->Write((PCHAR)&data, sizeof(stOnFootData)); // пишем обновленные данные
break;
case PacketEnumeration::ID_VEHICLE_SYNC:
stInCarData data; // определяем объект в который сохраним отправляемые данные
memset(&data, 0, sizeof(stInCarData)); // обнуляем
byte packet;
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(packet); // читаем ID пакета
params->bitStream->Read((PCHAR)&data, sizeof(stInCarData)); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
data.byteCurrentWeapon = 0;
params->bitStream->ResetWritePointer(); // обнуляем оффсет записи
params->bitStream->Write(packet); // пишем ид пакета
params->bitStream->Write((PCHAR)&data, sizeof(stInCarData)); // пишем обновленные данные
break;
case PacketEnumeration::ID_PASSENGER_SYNC:
stPassengerData data; // определяем объект в который сохраним отправляемые данные
memset(&data, 0, sizeof(stPassengerData)); // обнуляем
byte packet;
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(packet); // читаем ID пакета
params->bitStream->Read((PCHAR)&data, sizeof(stPassengerData)); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
data.byteCurrentWeapon = 0;
params->bitStream->ResetWritePointer(); // обнуляем оффсет записи
params->bitStream->Write(packet); // пишем ид пакета
params->bitStream->Write((PCHAR)&data, sizeof(stPassengerData)); // пишем обновленные данные
break;
default:
}
return true;
};
Dark_Knight
24.03.2016, 16:08
Никак, но можно создать определенные функции в которые можно передавать ид пакета указатель на битстрим.
Gabriel__
24.03.2016, 16:32
А как создать такую переменную которая будет хранить класс или структуру а потом через эту переменную создать объект.
Вот что то типо такого
myClass = &stOnFootData;
myclass * obj = new myClass;
Dark_Knight
24.03.2016, 16:43
Создаешь обьект своей структуры и не паришься.
Gabriel__
24.03.2016, 16:46
Не получится так. Компилятор выдаст ошибку что объект уже создан.
Dark_Knight
24.03.2016, 16:57
Ну тогда в чем проблема? Опиши, что тебе надо сделать.
Gabriel__
24.03.2016, 17:08
Хук который будет ловить исходящие пакеты. В Switch'е он будет создавать объект нужной структуры stOnFootData, stInCarData. И слудующий код будет ставить им значения скорости например. А то без этого пулучится такая хрень типо для каждой структуры будет такая хрень.
Код:
switch (params->packetId)
{
case PacketEnumeration::ID_PLAYER_SYNC:
stOnFootData data; // определяем объект в который сохраним отправляемые данные
memset(&data, 0, sizeof(stOnFootData)); // обнуляем
byte packet;
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(packet); // читаем ID пакета
params->bitStream->Read((PCHAR)&data, sizeof(stOnFootData)); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
data.byteCurrentWeapon = 0;
params->bitStream->ResetWritePointer(); // обнуляем оффсет записи
params->bitStream->Write(packet); // пишем ид пакета
params->bitStream->Write((PCHAR)&data, sizeof(stOnFootData)); // пишем обновленные данные
break;
case PacketEnumeration::ID_VEHICLE_SYNC:
stInCarData data; // определяем объект в который сохраним отправляемые данные
memset(&data, 0, sizeof(stInCarData)); // обнуляем
byte packet;
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(packet); // читаем ID пакета
params->bitStream->Read((PCHAR)&data, sizeof(stInCarData)); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
data.byteCurrentWeapon = 0;
params->bitStream->ResetWritePointer(); // обнуляем оффсет записи
params->bitStream->Write(packet); // пишем ид пакета
params->bitStream->Write((PCHAR)&data, sizeof(stInCarData)); // пишем обновленные данные
break;
case PacketEnumeration::ID_PASSENGER_SYNC:
stPassengerData data; // определяем объект в который сохраним отправляемые данные
memset(&data, 0, sizeof(stPassengerData)); // обнуляем
byte packet;
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(packet); // читаем ID пакета
params->bitStream->Read((PCHAR)&data, sizeof(stPassengerData)); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
data.byteCurrentWeapon = 0;
params->bitStream->ResetWritePointer(); // обнуляем оффсет записи
params->bitStream->Write(packet); // пишем ид пакета
params->bitStream->Write((PCHAR)&data, sizeof(stPassengerData)); // пишем обновленные данные
break;
default:
}
return true;
};
Dark_Knight
24.03.2016, 17:22
Ну так у тебя верный код. Какие проблемы с ним?
Gabriel__
24.03.2016, 17:26
Это не код а говнокод. Нужно исправить. Он очень большой.
Делал кто функции с переменным числом параметров? Хочу создать свою функцию логгирования данных, но не знаю как реализовать это. Делал кто такое?
Вот что хочу:
C++:
void
Log
(
char
*
String
,
.
.
.
)
{
char
out
[
1024
]
;
//sprintf(out, String, ... /*параметры*/);
va_list ap
;
va_start
(
ap
,
pText
)
;
sprintf
(
out
,
String
,
ap
)
}
Идея заключается в том, чтобы передать в sprintf список параметров из функции Log. Как это можно сделать? Отправить туда адрес, указатель или что? Теоретически это возможно, но я не знаю как это реализовать.
MISTER_GONWIK
24.03.2016, 18:27
Делал кто функции с переменным числом параметров? Хочу создать свою функцию логгирования данных, но не знаю как реализовать это. Делал кто такое?
Вот что хочу:
C++:
void
Log
(
char
*
String
,
.
.
.
)
{
char
out
[
1024
]
;
//sprintf(out, String, ... /*параметры*/);
va_list ap
;
va_start
(
ap
,
pText
)
;
sprintf
(
out
,
String
,
ap
)
}
Идея заключается в том, чтобы передать в sprintf список параметров из функции Log. Как это можно сделать? Отправить туда адрес, указатель или что? Теоретически это возможно, но я не знаю как это реализовать.
идёшь в собейт и смотришь как там реализовано
идёшь в собейт и смотришь как там реализовано
Спасибо, нашёл. Почему то думал, что там немного другая система.
Gabriel__
24.03.2016, 19:58
Как пользоваться GetPrivateProfileInt.
Это не работает int buffer = GetPrivateProfileInt((LPCWSTR)"Section", (LPCWSTR)"Key", 0, (LPCWSTR)"Config");
И нахуя её надо LPCWSTR че её const char не устраивает.
Dark_Knight
24.03.2016, 20:15
Читай справку на MSDN
Подскажите, пожалуйста.
Нахожу данные о чекпоинте:
Код:
struct checkpoint *cp = (struct checkpoint *)0x00C7F158;
Нужно найти его тип, но его нет в структуре. Я узнал, что смещение (byte)+0 - это и есть тип чекпоинта, но когда делаю такое:
Код:
struct checkpoint *cp = (struct checkpoint *)0x00C7F158;
SF->getSAMP()->getChat()->AddChatMessage(0x808080, "%d", cp);
... выдает хуету.
Есть идеи?
Dark_Knight
27.03.2016, 00:20
В цикле перебирал?
В цикле перебирал?
Я, наверное, неправильно выразился. У меня структура гоночного чекпоинта, он может быть только один.
В struct checkpoint есть радиус, координаты и прочее, но нет типа чекпоинта, на который смещение +0.
Или имеется ввиду перебрать адреса какие-то?
Gabriel__
28.03.2016, 15:07
Гоночных чекпоинтов можно создать несколько. Только нигде так не делают.
Dark_Knight
28.03.2016, 15:27
Я, наверное, неправильно выразился. У меня структура гоночного чекпоинта, он может быть только один.
В struct checkpoint есть радиус, координаты и прочее, но нет типа чекпоинта, на который смещение +0.
Или имеется ввиду перебрать адреса какие-то?
Они в пуле идут, если память не изменяет.
Dark_Knight
28.03.2016, 15:28
Они в пуле идут, если память не изменяет.
Собственно вот.
https://yadi.sk/i/M4iivoFGqXu8b (https://www.blast.hk/redirect/aHR0cHM6Ly95YWRpLnNrL2kvTTRpaXZvRkdxWHU4Yg)
Woofing Giraffe
30.03.2016, 21:13
Как работают подобные сайты? (https://www.blast.hk/redirect/aHR0cDovL29ubGluZXNpbS5ydS8) (Не реклама)
Возможно ли сделать что то подобное чисто для себя?
Как взять строку из чата и проверить ее на наличие ключевого слова? Для SF надо.
Woofing Giraffe
30.03.2016, 23:34
Как взять строку из чата и проверить ее на наличие ключевого слова? Для SF надо.
Хукаешь RPC_ScrClientMessage и strstr
Хукаешь RPC_ScrClientMessage и strstr
чет сложно) Можно подробней?
Woofing Giraffe
30.03.2016, 23:43
чет сложно) Можно подробней?
https://www.blast.hk/wiki/tutorials:api_lesson_raknet
Vasiliy77
31.03.2016, 00:10
Почему при каждом запуске консоли значение адреса всегда разное, а в Cheat Engine оно не меняется? Код прилагаю ниже.
C++:
DWORD offsets
[
]
=
{
0x6FCF3
}
;
// смещение
DWORD addressdllsamp
=
(
DWORD
)
getModuleHandleRemote
(
PID
,
"samp.dll"
)
;
// адрес samp.dll
DWORD ippointer1
=
mem
->
ReadPointer
(
addressdllsamp
,
offsets
,
1
)
;
printf
(
"Address samp.dll [2]: 0x%x \n=====================\n"
,
addressdllsamp
)
;
printf
(
"[2] Adress: 0x%x / value = %d\n"
,
ippointer1
,
mem
->
Read
(
ippointer1
,
16
)
)
;
// ВОТ ТУТ value = всегда разное число
C++:
HMODULE AC
::
getModuleHandleRemote
(
DWORD processId
,
const
char
*
moduleName
)
{
HANDLE snap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPMODULE
,
processId
)
;
if
(
snap
==
INVALID_HANDLE_VALUE
)
return
NULL
;
MODULEENTRY32 moduleEntry
;
moduleEntry
.
dwSize
=
sizeof
(
moduleEntry
)
;
bool
found
=
Module32First
(
snap
,
&
moduleEntry
)
==
TRUE
;
while
(
found
)
{
if
(
strcmp
(
moduleEntry
.
szModule
,
moduleName
)
==
0
)
return
CloseHandle
(
snap
)
,
moduleEntry
.
hModule
;
found
=
Module32Next
(
snap
,
&
moduleEntry
)
==
TRUE
;
}
CloseHandle
(
snap
)
;
return
NULL
;
}
C++:
[CODE]
DWORD AC
::
ReadPointer
(
DWORD base
,
DWORD
*
offsets
,
int
count
)
{
for
(
int
i
=
0
;
i
1. Как можно поворачивать игрока?
2. Как можно удобней записать 72 точки телепорта, содержащие 3 координаты каждая?
Почему при каждом запуске консоли значение адреса всегда разное, а в Cheat Engine оно не меняется? Код прилагаю ниже.
C++:
DWORD offsets
[
]
=
{
0x6FCF3
}
;
// смещение
DWORD addressdllsamp
=
(
DWORD
)
getModuleHandleRemote
(
PID
,
"samp.dll"
)
;
// адрес samp.dll
DWORD ippointer1
=
mem
->
ReadPointer
(
addressdllsamp
,
offsets
,
1
)
;
printf
(
"Address samp.dll [2]: 0x%x \n=====================\n"
,
addressdllsamp
)
;
printf
(
"[2] Adress: 0x%x / value = %d\n"
,
ippointer1
,
mem
->
Read
(
ippointer1
,
16
)
)
;
// ВОТ ТУТ value = всегда разное число
C++:
HMODULE AC
::
getModuleHandleRemote
(
DWORD processId
,
const
char
*
moduleName
)
{
HANDLE snap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPMODULE
,
processId
)
;
if
(
snap
==
INVALID_HANDLE_VALUE
)
return
NULL
;
MODULEENTRY32 moduleEntry
;
moduleEntry
.
dwSize
=
sizeof
(
moduleEntry
)
;
bool
found
=
Module32First
(
snap
,
&
moduleEntry
)
==
TRUE
;
while
(
found
)
{
if
(
strcmp
(
moduleEntry
.
szModule
,
moduleName
)
==
0
)
return
CloseHandle
(
snap
)
,
moduleEntry
.
hModule
;
found
=
Module32Next
(
snap
,
&
moduleEntry
)
==
TRUE
;
}
CloseHandle
(
snap
)
;
return
NULL
;
}
C++:
[CODE]
DWORD AC
::
ReadPointer
(
DWORD base
,
DWORD
*
offsets
,
int
count
)
{
for
(
int
i
=
0
;
i
потому что CE использует оффсеты от начала модуля (например samp.dll + 1337)
1. Как можно поворачивать игрока?
2. Как можно удобней записать 72 точки телепорта, содержащие 3 координаты каждая?
Через матрицу и структуру(только Z)
смотря как дальше использовать хочешь. CVector вполне удобно
Через матрицу и структуру(только Z)
А можно подробней?
BlackKnigga
05.04.2016, 18:18
Как циклом for each перебрать элементы списка с конца?
Dark_Knight
05.04.2016, 19:11
std::vector vector;
vector.push_back("Хуй");
vector.push_back("Пизда");
vector.push_back("скоровода");
for(auto &it : vector)
{
SF->log(it.c_str());
}
Dark_Knight
05.04.2016, 22:08
Пиздю. Это с начала до конца.
BlackKnigga
05.04.2016, 22:16
Пиздю. Это с начала до конца.
Так я и не понял ничего%). А с циклом for что?
Dark_Knight
05.04.2016, 22:27
Так я и не понял ничего%). А с циклом for что?
Щас усё будет. Подожди
NarutoUA
05.04.2016, 22:47
C++:
[CODE]
vector
vec
=
{
1
,
2
,
3
,
4
,
5
}
;
std
::
reverse
(
vec
.
begin
(
)
,
vec
.
end
(
)
)
;
for
(
auto
&
i
:
vec
)
cout
Но лучше не выдумывать ***ни и делать через
C++:
[CODE]
for
(
int
j
=
vec
.
size
(
)
;
j
--
;
)
cout
BlackKnigga
05.04.2016, 22:47
Щас усё будет. Подожди
Да я уже придумал, спасибо.
[QUOTE="NarutoUA"]
Но лучше не выдумывать ***ни и делать через
for (int j = vec.size(); j--;)
cout
NarutoUA
05.04.2016, 22:56
Да я уже придумал, спасибо.
Кстать так и сделал.
ну так ты спрашивал о цикле for each, в С++ такого как в C# нет
Dark_Knight
05.04.2016, 23:00
Я пытался сделать через итераторы, но я нуб и не получилось :sad_frog:
Через реверс, все работает заебись.
https://yadi.sk/i/Plp7_K8cqmHuf (https://www.blast.hk/redirect/aHR0cHM6Ly95YWRpLnNrL2kvUGxwN19LOGNxbUh1Zg)
Плюсик твой))
NarutoUA
05.04.2016, 23:15
Я пытался сделать через итераторы, но я нуб и не получилось :sad_frog:
C++:
[CODE]
vector
vec
=
{
1
,
2
,
3
,
4
,
5
}
;
for
(
auto
it
=
vec
.
rbegin
(
)
;
it
!=
vec
.
rend
(
)
;
it
++
)
{
cout
Dark_Knight
05.04.2016, 23:26
Чуствовал, что надо было его еще потестить.
Как достать уровень доступного спринта?
Dark_Knight
06.04.2016, 00:09
Как достать уровень доступного спринта?
Т.е. значение выносливости?
Т.е. значение выносливости?
Ну да :D
Dark_Knight
06.04.2016, 00:25
float stamina = *(float *)0xB7CDB4;
Так же советую делить на 31.4701;
float stamina = *(float *)0xB7CDB4;
Так же советую делить на 31.4701;
Благодарю.
zikekazil
08.04.2016, 22:02
Есть такая строка:
Код:
[Рация] Ivan_Ivanov[17]: тест
Как используя RegEx можно извлечь и ник, и сообщение (где "тест")? Перепробовал все, но чет не могу сам дойти до этого. :(
1. Как сделать админ чекер в m0d_sa?
1. Как сделать админ чекер в m0d_sa?
https://www.blast.hk/threads/1549/
itsLegend
09.04.2016, 15:57
Есть такая строка:
Код:
[Рация] Ivan_Ivanov[17]: тест
Как используя RegEx можно извлечь и ник, и сообщение (где "тест")? Перепробовал все, но чет не могу сам дойти до этого. :(
Код:
([\\w]+)\\[(\\d+)\\]\\: ([^$]+)
Код:
Result of search: 1 match(-es)
Match #0: Ivan_Ivanov[17]: test
Match #1: Ivan_Ivanov
Match #2: 17
Match #3: test
Dark_Knight
09.04.2016, 16:05
Как по мне она у тебя кривая, легенд. Ты заюзал 2 слеша, а это уже ты ишешь символ \, а не слова. Так же такая регулярка не сможешь пропустить ники с символами.
Такие будут получше ловить
^\[Рация\] (.+)\[(\d+)\]\: ([А-Яа-я]+)$
^\[Рация\] (.+)\[(\d+)\]\: (.+)$
itsLegend
09.04.2016, 16:06
Хз как у тебя, но у меня VS жалуется на то, что без двух бэкслэшей.
Dark_Knight
09.04.2016, 16:19
Ставишь 2013 ВС с апдейтом 5 и не паришься.
zikekazil
09.04.2016, 18:05
спасибо, сделал как-то так:
Код:
std::string chatm = "[Рация] Ivan_Ivanov[17]: тест";
std::smatch chatres;
if (std::regex_match(chatm, chatres, std::regex(R"(^\[Рация\] (.+)\[(\d+)\]\: (.+)$)")))
SF->getSAMP()->getChat()->AddChatMessage(-1, "Ник: %s", chatres[1].str());
но после проверки всего этого в игре, происходит зависание. Смог вывести только "chatres" целиком, а не один его элемент. Почему так? :(
Dark_Knight
09.04.2016, 18:56
str().c_str() заюзай
Помогите исправить код, всё объявлено и код работает, но при активации телепортирует под землю и не замирает, то есть, если не поставить метку - в чат пишет, но самой телепортации не происходит, войд ниже.
Код:
void cheat_handle_coordmaster()
{
static int time=0;
if(cheat_state->_generic.coordmaster == 1) {
if(GetTickCount()-set.coord_time > time) {
if (*(int *)0xBA6774 != 0)
{
float mapPos[3];
for ( int i = 0; i GetWorld()->FindGroundZForPosition( mapPos[0], mapPos[1] ) + 2.0f;
float cpos[3] = {pPedSelf->GetPosition()->fX,pPedSelf->GetPosition()->fY,pPedSelf->GetPosition()->fZ};
char opa=0;
if(cpos[0] > mapPos[0]) {
if(cpos[0]-mapPos[0] > set.coord_distance) cpos[0] -= set.coord_distance;
else {
cpos[0] = mapPos[0];
opa++;
}
} else {
if(mapPos[0]-cpos[0] > set.coord_distance) cpos[0] += set.coord_distance;
else {
cpos[0] = mapPos[0];
opa++;
}
}
if(cpos[1] > mapPos[1]) {
if(cpos[1]-mapPos[1] > set.coord_distance) cpos[1] -= set.coord_distance;
else {
cpos[1] = mapPos[1];
opa++;
}
} else {
if(mapPos[1]-cpos[1] > set.coord_distance) cpos[1] += set.coord_distance;
else {
cpos[1] = mapPos[1];
opa++;
}
}
if(opa == 2) {
cpos[2] = mapPos[2];
cheat_state->_generic.coordmaster = 0;
GTAfunc_TogglePlayerControllable(0);
GTAfunc_LockActor(0);
}
else cpos[2] = pGameInterface->GetWorld()->FindGroundZForPosition( cpos[0], cpos[1] )-20;
cheat_teleport(cpos,0);
}
}
} else {
addMessageToChatWindow("Поставьте метку на карте!");
cheat_state->_generic.coordmaster = 0;
}
time = GetTickCount();
}
}
return;
}
Решил создать .asi плагин. В DllMain в DLL_PROCESS_ATTACH создал поток и в главной функции этого потока написал самое простое, логирование строки "loop", но когда увидел лог, охуел. 155 mb за минуту работы плагина. Понятно, что с такой скоростью игра зависнет, если я буду добавлять функции. Как это решить, юзать Sleep(1); ?
C++:
void
Loop
(
LPVOID pArg
)
{
while
(
bThreadStatus
)
{
Log
(
"Loop"
)
;
}
_endthread
(
)
;
}
Dark_Knight
13.04.2016, 15:56
Не зависнет. И надо юзать таймеры, а не слипы.
Не зависнет. И надо юзать таймеры, а не слипы.
Понял. Но появилась другая проблемка. Создал пустой проект, добавил DllMain, но появилась ошибка entry point must be defined. В настройках тип конфигурации dll, исходное расширение .asi. Искал в интернете, не нашёл ничего.
P.S. Где подчеркнуто, писал /ENTRY: DllMain, тоже не помогло.
http://i.imgur.com/u3rwYvw.png
Dark_Knight
13.04.2016, 20:15
http://www.cplusplus.com/forum/windows/58523/#msg315653 (https://www.blast.hk/redirect/aHR0cDovL3d3dy5jcGx1c3BsdXMuY29tL2ZvcnVtL3dpbmRvd3 MvNTg1MjMvI21zZzMxNTY1Mw)
http://www.cplusplus.com/forum/windows/58523/#msg315653 (https://www.blast.hk/redirect/aHR0cDovL3d3dy5jcGx1c3BsdXMuY29tL2ZvcnVtL3dpbmRvd3 MvNTg1MjMvI21zZzMxNTY1Mw)
Там у него консольное приложение, где точка в хода main(). А мне нужно dll приложение, где роль точки входа отыгрывает DllMain, которая у меня есть, но компилить не хочет.
Там у него консольное приложение, где точка в хода main(). А мне нужно dll приложение, где роль точки входа отыгрывает DllMain, которая у меня есть, но компилить не хочет.
в свойствах проекта выбери тип динамической библиотеки
_endthread();
он используется как return в void функциях, и в конце не обязателен
в свойствах проекта выбери тип динамической библиотеки
Я компилил конфигурацией Debug, а настраивал конфигурацию Release.:pidrila:
Как проверить, что игра загрузилась не используя GAME_API и SF_API?
Как проверить, что игра загрузилась не используя GAME_API и SF_API?
if (*(DWORD*)0xB6F5F0>0)
NarutoUA
14.04.2016, 17:31
*(DWORD*)0xC8D4C0 == 7;
NarutoUA
14.04.2016, 20:04
А что на счет сампа?
g_SAMP != NULL
Vasiliy77
17.04.2016, 02:47
Вопрос по dll & asi, как определить вхождение в игру, т.е. момент появления чата после загрузки, чтобы туда отправить текст? И момент загрузки, когда картинка сампа появляется, для рендера текста. Без SF желательно.
Вопрос по dll & asi, как определить вхождение в игру, т.е. момент появления чата после загрузки, чтобы туда отправить текст? И момент загрузки, когда картинка сампа появляется, для рендера текста. Без SF желательно.
функции чата статические, по крайней мере обработчик. Так что по сути чат может работать сразу после цепляния либы. Чекай его на строку загруженности сампа, это и будет тот момент, что ты хочешь поймать
Vasiliy77
18.04.2016, 19:37
Чекай его на строку загруженности сампа, это и будет тот момент, что ты хочешь поймать
Может глупый вопрос, но как найти эту строку? И другой вопрос еще, как картинку (.jpg, .png) запихнуть в сам плагин, чтобы она для рендера бралась не из какой-то папки, а из самого плагина?
Здравствуйте,не могли бы вы мне сказать:
1) Какие библиотека(и) служит(ат) для работы с Хуками в самп?
2) Как узнать какие параметры у данные RPCs?
Скрытое содержимое доступно для зарегистрированных пользователей!
Dark_Knight
19.04.2016, 21:13
1. СФ.
2. https://docs.google.com/spreadsheet/ccc?key=0AtKPKl8O9mGodFZESEp6WEdzcTB0U2V1ZkR0UWpub 1E#gid=1 (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXQvY2 NjP2tleT0wQXRLUEtsOE85bUdvZEZaRVNFcDZXRWR6Y1RCMFUy VjFaa1IwVVdwdWIxRSNnaWQ9MQ)
Подскажите, пожалуйста, как в собейте реализован телепорт к поставленному игроком маркеру на карте?
Нужно перенести это дело в сф плагин.
Подскажите, пожалуйста, как в собейте реализован телепорт к поставленному игроком маркеру на карте?
Нужно перенести это дело в сф плагин.
Получаешь координаты маркера на карте, получаешь по координатам высоту, телепортируешь игрока на эти координаты
Получаешь координаты маркера на карте, получаешь по координатам высоту, телепортируешь игрока на эти координаты
В этом-то и вся загвоздка: не знаю, как получить координату маркера.
Woofing Giraffe
24.04.2016, 23:31
https://pp.vk.me/c628731/v628731695/506c0/ow5Nl_yzC8A.jpg
Что за фигня? Почему не устанавливается?
itsLegend
24.04.2016, 23:59
Откуда скачивал?
Woofing Giraffe
25.04.2016, 00:03
Откуда скачивал?
С оф. сайта Microsoft
Woofing Giraffe
25.04.2016, 00:20
Установил СДК, теперь это
https://pp.vk.me/c628731/v628731695/506de/ZGhDEt3jSQ4.jpg
Вызываю функцию рисование текста в перехваченной End Scene - черный экран. Если вызвать в Present, то рисуется пока есть загрузочный экран, как только проходим этот этап - тоже черный экран.
C++:
if
(
pFont
==
NULL
)
D3DXCreateFont
(
pDevice
,
17
,
0
,
FW_BOLD
,
0
,
FALSE
,
DEFAULT_CHARSET
,
OUT_DEFAULT_PRECIS
,
ANTIALIASED_QUALITY
,
DEFAULT_PITCH
|
FF_DONTCARE
,
TEXT
(
"Arial"
)
,
&
pFont
)
;
PrintText
(
pFont
,
700
,
700
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
0
)
,
"Testing hook."
)
;
C++:
void
PrintText
(
ID3DXFont
*
pFont
,
int
X
,
int
Y
,
D3DCOLOR ARGB
,
LPCSTR Text
)
{
RECT Rect
;
Rect
.
left
=
X
;
Rect
.
right
=
1680
;
Rect
.
top
=
Y
;
Rect
.
bottom
=
Rect
.
top
+
200
;
pFont
->
DrawTextA
(
NULL
,
Text
,
-
1
,
&
Rect
,
DT_LEFT
,
ARGB
)
;
}
NarutoUA
25.04.2016, 01:18
Нужно настраивать RenderState до и после отрисовки.
Vasiliy77
25.04.2016, 01:58
Можно ли из готового ехе файла-чита вытянуть адреса памяти, значения которых он меняет? Каким способом?
И можно ли сделать AntTweakBar без использования SF? Мб какие-то библиотеки есть.
Можно ли из готового ехе файла-чита вытянуть адреса памяти, значения которых он меняет? Каким способом?
И можно ли сделать AntTweakBar без использования SF? Мб какие-то библиотеки есть.
ReadProcessMemory, WriteProcessMemory
AntTweakBar это отдельная библиотека, ты можешь её юзать не только с сф
Чет ничего не пойму. Не рендерит. Может какие RenderStates установить нужно? p.s. вызываю перед end scene
C++:
D3DXVECTOR2 Vectors
[
2
]
;
Vectors
[
0
]
.
x
=
X1
;
Vectors
[
0
]
.
y
=
Y1
;
Vectors
[
1
]
.
x
=
X2
;
Vectors
[
1
]
.
y
=
Y2
;
D3DLine
->
SetWidth
(
Width
)
;
D3DLine
->
SetAntialias
(
false
)
;
D3DLine
->
SetGLLines
(
false
)
;
D3DLine
->
Begin
(
)
;
D3DLine
->
Draw
(
Vectors
,
2
,
ARGB
)
;
D3DLine
->
End
(
)
;
Чет ничего не пойму. Не рендерит. Может какие RenderStates установить нужно? p.s. вызываю перед end scene
C++:
D3DXVECTOR2 Vectors
[
2
]
;
Vectors
[
0
]
.
x
=
X1
;
Vectors
[
0
]
.
y
=
Y1
;
Vectors
[
1
]
.
x
=
X2
;
Vectors
[
1
]
.
y
=
Y2
;
D3DLine
->
SetWidth
(
Width
)
;
D3DLine
->
SetAntialias
(
false
)
;
D3DLine
->
SetGLLines
(
false
)
;
D3DLine
->
Begin
(
)
;
D3DLine
->
Draw
(
Vectors
,
2
,
ARGB
)
;
D3DLine
->
End
(
)
;
ты не заменяй функцию, а заинжекться в оригинальную, после Begin() сделай вызов своей stdcall функции
woksonal
27.04.2016, 18:56
Установил СДК, теперь это UOTE]
попробуй поменять: проект - свойства - свойства конфигурации - набор инструментов платф.
Почему пропадают объекты, которые я рисую, когда я скрываю чат. Вроде не должно..
Gabriel__
02.05.2016, 10:57
Как создать таймер который будет вызывать функцию каждый интервал ? ( Как таймеры в SAMPFUNCS в клео )
Dark_Knight
02.05.2016, 12:24
https://github.com/urShadow/TimerManager
MISTER_GONWIK
02.05.2016, 13:45
Нихрена не работает это не для Visual Studio. И вообще непонятно как работает. Придется отдельный поток создавать.
:facepalm:
Вообщем, я хз почему, но когда в своей перехваченной функции Present я рисую текст и примитивы, то когда я скрываю чат или захожу в меню, текст остается, а примитивы исчезают. Как это решить? Вот функция рисования четырехугольника.
C++:
HRESULT CD3DRender
::
DrawBox
(
int
X
,
int
Y
,
int
W
,
int
H
,
D3DCOLOR ARGB
)
{
D3DVERTEX Vertices
[
6
]
;
Vertices
[
0
]
=
{
(
float
)
X
,
(
float
)
Y
,
1.0f
,
1.0f
,
ARGB
}
;
Vertices
[
1
]
=
{
(
float
)
X
+
W
,
(
float
)
Y
,
1.0f
,
1.0f
,
ARGB
}
;
Vertices
[
2
]
=
{
(
float
)
X
,
(
float
)
Y
+
H
,
1.0f
,
1.0f
,
ARGB
}
;
Vertices
[
3
]
=
{
(
float
)
X
,
(
float
)
Y
+
H
,
1.0f
,
1.0f
,
ARGB
}
;
Vertices
[
4
]
=
{
(
float
)
X
+
W
,
(
float
)
Y
,
1.0f
,
1.0f
,
ARGB
}
;
Vertices
[
5
]
=
{
(
float
)
X
+
W
,
(
float
)
Y
+
H
,
1.0f
,
1.0f
,
ARGB
}
;
DWORD FVF
;
m_D3DDevice
->
GetFVF
(
&
FVF
)
;
m_D3DStateNorm
->
Capture
(
)
;
m_D3DStateDraw
->
Apply
(
)
;
m_D3DDevice
->
SetFVF
(
D3DFVF_XYZRHW
|
D3DFVF_DIFFUSE
)
;
m_D3DDevice
->
DrawPrimitiveUP
(
D3DPT_TRIANGLELIST
,
2
,
&
Vertices
,
sizeof
(
D3DVERTEX
)
)
;
m_D3DDevice
->
SetFVF
(
FVF
)
;
m_D3DStateNorm
->
Apply
(
)
;
return
S_OK
;
}
Можно как-то занопить функцию рисования клистов на карте? Как найти её?
Можно как-то занопить функцию рисования клистов на карте? Как найти её?
можно альфа канал на 0 уебать
можно альфа канал на 0 уебать
Можно, но в каком месте?)
Dark_Knight
05.05.2016, 14:08
Можно, но в каком месте?)
Через хук РПЦ. Хотя не уверен.
http://gui.oldschoolhack.me/ (https://www.blast.hk/redirect/aHR0cDovL2d1aS5vbGRzY2hvb2xoYWNrLm1lLw) Что скажите насчет этого?
Dark_Knight
05.05.2016, 17:16
Судя по коду то подключить не сложно
Gabriel__
05.05.2016, 18:48
А для memcpy и memset обязательно снимать защиту памяти ? (VirtualProtect)
Vasiliy77
09.05.2016, 10:37
Как нужно переделать, чтобы выводило в "Test command with params" не только цифры, а и буквы? Сейчас цифры только.
C++:
void
cmd_findtext
(
char
*
szParams
)
{
addMessageToChat
(
0xFFFFFFFF
,
"Test command with params: "
%
s
""
,
szParams
)
;
}
void
addMessageToChat
(
D3DCOLOR cColor
,
char
*
szMsg
,
.
.
.
)
{
if
(
g_Chat
==
nullptr
)
return
;
void
(
__thiscall
*
AddToChatWindowBuffer
)
(
const
void
*
_this
,
int
iType
,
char
*
szText
,
char
*
szPrefix
,
DWORD cColor
,
DWORD cPrefixColor
)
=
(
void
(
__thiscall
*
)
(
const
void
*
,
int
,
char
*
,
char
*
,
DWORD
,
DWORD
)
)
(
dwSAMPAddr
+
SAMP_FUNC_ADDTOCHATWND
)
;
if
(
szMsg
==
NULL
)
return
;
va_list ap
;
char
tmp
[
512
]
;
memset
(
tmp
,
0
,
512
)
;
va_start
(
ap
,
szMsg
)
;
vsnprintf
(
tmp
,
sizeof
(
tmp
)
-
1
,
szMsg
,
ap
)
;
va_end
(
ap
)
;
return
AddToChatWindowBuffer
(
(
void
*
)
g_Chat
,
8
,
tmp
,
NULL
,
cColor
,
0x00
)
;
}
DarkExorcist
18.05.2016, 01:15
Как создать поток при подключении .dll, чтобы игру не крашнуло?
Код:
DWORD WINAPI tp (LPVOID);
DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID IpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread(NULL,NULL,tp,NULL,NULL,NULL);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
}
Таким способом не получается, но нашел только его :(
Woofing Giraffe
18.05.2016, 09:09
Как создать поток при подключении .dll, чтобы игру не крашнуло?
Код:
DWORD WINAPI tp (LPVOID);
DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID IpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread(NULL,NULL,tp,NULL,NULL,NULL);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
}
Таким способом не получается, но нашел только его :(
Не проще в main его создать?
Как создать поток при подключении .dll, чтобы игру не крашнуло?
Код:
DWORD WINAPI tp (LPVOID);
DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID IpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread(NULL,NULL,tp,NULL,NULL,NULL);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
}
Таким способом не получается, но нашел только его :(
_beginthread
DarkExorcist
18.05.2016, 16:48
Что делать, чтобы GetKeyState(); возвращала значение не равное 0, только когда нужная мне кнопка зажата? Просто условие продолжает работу до повторного нажатия Insert
Dark_Knight
18.05.2016, 19:49
getasynckeystate и цикл. Можно и булевую переменную создать и её в качестве проверке юзать.
CLEO:
0AA2:
30@
= load_library
"samp.dll"
// IF and SET
0A8E:
1@
=
30@
+
457971
// int
0A8C:
write_memory
1@
size
4
value
24216591
virtual_protect
1
0A8E:
2@
=
1@
+
4
// int
0A8C:
write_memory
2@
size
2
value
0
virtual_protect
1
0A8E:
3@
=
30@
+
458004
// int
0A8C:
write_memory
3@
size
4
value
22053903
virtual_protect
1
0A8E:
4@
=
3@
+
4
// int
0A8C:
write_memory
4@
size
2
value
0
virtual_protect
1
0A8E:
5@
=
30@
+
458280
// int
0A8C:
write_memory
5@
size
2
value
16500
virtual_protect
1
0A8E:
6@
=
30@
+
462648
// int
0A8C:
write_memory
6@
size
2
value
24948
virtual_protect
1
0A8E:
7@
=
30@
+
462372
// int
0A8C:
write_memory
7@
size
4
value
24218127
virtual_protect
1
0A8E:
8@
=
7@
+
4
// int
0A8C:
write_memory
8@
size
2
value
0
virtual_protect
1
0AA3:
free_library
30@
0AB2:
ret
0
как это будет в C++
CLEO:
0AA2:
30@
= load_library
"samp.dll"
// IF and SET
0A8E:
1@
=
30@
+
457971
// int
0A8C:
write_memory
1@
size
4
value
24216591
virtual_protect
1
0A8E:
2@
=
1@
+
4
// int
0A8C:
write_memory
2@
size
2
value
0
virtual_protect
1
0A8E:
3@
=
30@
+
458004
// int
0A8C:
write_memory
3@
size
4
value
22053903
virtual_protect
1
0A8E:
4@
=
3@
+
4
// int
0A8C:
write_memory
4@
size
2
value
0
virtual_protect
1
0A8E:
5@
=
30@
+
458280
// int
0A8C:
write_memory
5@
size
2
value
16500
virtual_protect
1
0A8E:
6@
=
30@
+
462648
// int
0A8C:
write_memory
6@
size
2
value
24948
virtual_protect
1
0A8E:
7@
=
30@
+
462372
// int
0A8C:
write_memory
7@
size
4
value
24218127
virtual_protect
1
0A8E:
8@
=
7@
+
4
// int
0A8C:
write_memory
8@
size
2
value
0
virtual_protect
1
0AA3:
free_library
30@
0AB2:
ret
0
как это будет в C++
да почти также, но если sf плагин пишешь, то лучше готовыми структурами воспользуйся
да почти также, но если sf плагин пишешь, то лучше готовыми структурами воспользуйся
можно пример?
можно пример?
https://google.gik-team.com/?q=указатели+C++ (https://www.blast.hk/redirect/aHR0cHM6Ly9nb29nbGUuZ2lrLXRlYW0uY29tLz9xPSVEMSU4My VEMCVCQSVEMCVCMCVEMCVCNyVEMCVCMCVEMSU4MiVEMCVCNSVE MCVCQiVEMCVCOCtDJTJCJTJC)
https://google.gik-team.com/?q=работа+с+памятью+C++ (https://www.blast.hk/redirect/aHR0cHM6Ly9nb29nbGUuZ2lrLXRlYW0uY29tLz9xPSVEMSU4MC VEMCVCMCVEMCVCMSVEMCVCRSVEMSU4MiVEMCVCMCslRDElODEr JUQwJUJGJUQwJUIwJUQwJUJDJUQxJThGJUQxJTgyJUQxJThDJU QxJThFK0MlMkIlMkI)
https://google.gik-team.com/?q=указатели+C++ (https://www.blast.hk/redirect/aHR0cHM6Ly9nb29nbGUuZ2lrLXRlYW0uY29tLz9xPSVEMSU4My VEMCVCQSVEMCVCMCVEMCVCNyVEMCVCMCVEMSU4MiVEMCVCNSVE MCVCQiVEMCVCOCtDJTJCJTJC)
https://google.gik-team.com/?q=работа+с+памятью+C++ (https://www.blast.hk/redirect/aHR0cHM6Ly9nb29nbGUuZ2lrLXRlYW0uY29tLz9xPSVEMSU4MC VEMCVCMCVEMCVCMSVEMCVCRSVEMSU4MiVEMCVCMCslRDElODEr JUQwJUJGJUQwJUIwJUQwJUJDJUQxJThGJUQxJTgyJUQxJThDJU QxJThFK0MlMkIlMkI)
я по поводу SF и его структур, как на СФ написать этот код будет проще?
Dark_Knight
20.05.2016, 13:33
Вообще чего это код?
Вообще чего это код?
Отрывок кода nametaghack
Gabriel__
20.05.2016, 14:21
CLEO:
0AA2:
30@
= load_library
"samp.dll"
// IF and SET
0A8E:
1@
=
30@
+
457971
// int
0A8C:
write_memory
1@
size
4
value
24216591
virtual_protect
1
0A8E:
2@
=
1@
+
4
// int
0A8C:
write_memory
2@
size
2
value
0
virtual_protect
1
0A8E:
3@
=
30@
+
458004
// int
0A8C:
write_memory
3@
size
4
value
22053903
virtual_protect
1
0A8E:
4@
=
3@
+
4
// int
0A8C:
write_memory
4@
size
2
value
0
virtual_protect
1
0A8E:
5@
=
30@
+
458280
// int
0A8C:
write_memory
5@
size
2
value
16500
virtual_protect
1
0A8E:
6@
=
30@
+
462648
// int
0A8C:
write_memory
6@
size
2
value
24948
virtual_protect
1
0A8E:
7@
=
30@
+
462372
// int
0A8C:
write_memory
7@
size
4
value
24218127
virtual_protect
1
0A8E:
8@
=
7@
+
4
// int
0A8C:
write_memory
8@
size
2
value
0
virtual_protect
1
0AA3:
free_library
30@
0AB2:
ret
0
как это будет в C++
А зачем сдесь загружать и выгружать библиотеку ? И почему это вообще работает ?? Нужно же в уже в существующую samp.dll писать значение чтобы работало.
NarutoUA
20.05.2016, 14:59
Ну загружать видимо чтобы получить дескриптор модуля, а выгружать хз.
DarkExorcist
21.05.2016, 17:32
Как в с++ использовать call, call_function или же call_method из клео. Точнее аналоги этих функций в с++
Как в с++ использовать call, call_function или же call_method из клео. Точнее аналоги этих функций в с++
как-то так DWORD dwRet = ((DWORD*)dwAddress)(float fParam);
Проще юзать asm вставку
_asm{
push fParam
call dwAddress
mov dwRet, eax
}
Почему не работает? Хочу сделать массив массивов массивов%) (примерно так array[0][0][0]). Но чтобы количество элементов можно было увеличивать.
Код:
int lvl1 = 0;
int lvl2 = 0;
int lvl3 = 0;
void inc3(int *arr, int val)
{
lvl3++;
arr = (int *)realloc(arr, sizeof(int) * lvl3);
arr[lvl3 - 1] = val;
}
void inc2(int **arr, int val)
{
lvl2++;
arr = (int **)realloc(arr, sizeof(int) * lvl2);
inc3(arr[lvl2 - 1], val);
}
void inc1(int ***arr, int val)
{
lvl1++;
arr = (int ***)realloc(arr, sizeof(int) * lvl1);
inc2(arr[lvl1 - 1], val);
}
void main()
{
int ***arr = NULL;
inc1(arr, 10);
}
Dark_Knight
21.05.2016, 19:56
А не проще ли заюзать вектора?
Vasiliy77
22.05.2016, 00:09
Какие оффсеты нужны для создания диалога на 0.3.7? Юзаю код ниже, в результате диалог не отображается.
C++:
#define SAMP_DIALOG_SHOW 0x80320
//
#define SAMP_DIALOG_INFO_OFFSET 0x2129F8
//
showSampDialog
(
int
send
,
int
dialogID
,
int
typedialog
,
char
*
caption
,
char
*
text
,
char
*
button1
,
char
*
button2
)
{
uint32_t
samp_dll
=
(
uint32_t
)
GetModuleHandle
(
"samp.dll"
)
;
g_dwSAMP_Addr
=
(
uint32_t
)
samp_dll
;
uint32_t
func
=
g_dwSAMP_Addr
+
SAMP_DIALOG_SHOW
;
uint32_t
data
=
g_dwSAMP_Addr
+
SAMP_DIALOG_INFO_OFFSET
;
__asm mov eax
,
dword ptr
[
data
]
__asm mov ecx
,
dword ptr
[
eax
]
//mov to offset
__asm push send
//0 - No send response, 1 - Send response
__asm push button2
__asm push button1
__asm push text
__asm push caption
__asm push typedialog
__asm push dialogID
__asm call func
return
;
}
Думаю нужны другие адреса в #define, может знаете какие?
И 2 вопрос, как редактировать пункты в главном меню на Esc? Убрать какой-то например.
SAMP_DIALOG_SHOW 0x6B9C0
SAMP_DIALOG_INFO_OFFSET 0x21A0B8
А не проще ли заюзать вектора?
Это что?
Как проверить что нужная клавиша была нажата, а не зажата.
Как проверить что нужная клавиша была нажата, а не зажата.
WM_KEYDOWN
Как я понял, вместо _beginthreadex можно засунуть вызов своей функции в case: DLL_THREAD_ATTACH? На сколько это будет правильно и когда вообще вызывается функция DllMain и параметром DLL_THREAD_ATTACH?
Как я понял, вместо _beginthreadex можно засунуть вызов своей функции в case: DLL_THREAD_ATTACH? На сколько это будет правильно и когда вообще вызывается функция DllMain и параметром DLL_THREAD_ATTACH?
DLL_PROCESS_ATTACH вызывается при подключение библиотеки к процессу
DLL_THREAD_ATTACH вызывается когда программа опрашивает подключенные библиотеки. Опрашивает не сама, а система, по этому вызываются даже приинжекченые библиотеки
DLL_THREAD_DETACH аналогично предыдущему, только вызывается позже. Может быть полезно для каких-либо специфичных задач, в которых надо что-то изменить на выходе из библиотеки
DLL_PROCESS_DETACH вызывается при выгрузке библиотеки из памяти процесса
Есть еще WinAPI функция, которая отключает опрос библиотеки, я ее не помню, но можно найти в говно-примерах читов, где сам чит работает в отдельном потоке
Как на счет delete this? Это плохой тон? Одни пишут что это плохо, другие что это вполне нормально.
C++:
class
myclass
{
public
:
void
Initialize
(
)
;
void
Release
(
)
{
delete
this
;
}
}
// ...
myclass
*
class
=
new
myclass
(
)
;
// ...
class
->
Initialize
(
)
;
// ...
class
->
Release
(
)
;
Как на счет delete this? Это плохой тон? Одни пишут что это плохо, другие что это вполне нормально.
C++:
class
myclass
{
public
:
void
Initialize
(
)
;
void
Release
(
)
{
delete
this
;
}
}
// ...
myclass
*
class
=
new
myclass
(
)
;
// ...
class
->
Initialize
(
)
;
// ...
class
->
Release
(
)
;
а нахуя? Есть же деструктор class->~myclass()
Dark_Knight
25.05.2016, 22:14
а нахуя? Есть же деструктор class->~myclass()
Который вызывается при делете. А так же можно вместо инициализации юзать конструктор
Gabriel__
27.05.2016, 15:09
Не получается получить адрес функции. Вместо неё получается адрес call'a который её вызывает.
C++:
[CODE]
std
::
cout
[QUOTE="Gabriel__"]
Не получается получить адрес функции. Вместо неё получается адрес call'a который её вызывает.
C++:
[CODE]
std
::
cout
Gabriel__
27.05.2016, 16:49
Ты наверно не меня понял. Я перехожу в отладчике по адресу который мне высветила консоль и вижу там call и адрес моей функции. А я хотел сразу получить её адрес.
Ты наверно не меня понял.
да, походу не тебя
Помогите, пытаюсь переименовать окно гташки, но ничего не получается.
Код:
SendMessage(*(HWND*)0xC17054, WM_SETTEXT, 0, (LPARAM)SF->getSAMP()->getInfo()->szHostname);
Решил. Не тот адрес.
Dark_Knight
30.05.2016, 11:42
В собе никак.
Vasiliy77
30.05.2016, 11:53
Как редактировать список пунктов в главном меню на Esc? Убрать несколько например
В собе никак.
а я видел реализацию. Был выдран кусок из сурсов сампа для этого
Dark_Knight
30.05.2016, 20:05
а я видел реализацию. Был выдран кусок из сурсов сампа для этого
Только зачем юзать клео, если есть GAME API?
есть у кого функция чтения ini файла?
Dark_Knight
01.06.2016, 14:52
Boost::property_tree
Написал .asi плагин, у меня норм работает. У других необходим VCRUNTIME140.dll и другие библиотеки. Как это обойти?
itsLegend
02.06.2016, 00:25
Visual C++ Redistributable пусть обновляют, либо компилируй под старую платформу
Visual C++ Redistributable пусть обновляют, либо компилируй под старую платформу
Про второй вариант можно подробнее? Это как?
Gabriel__
02.06.2016, 10:13
В настройках проекта выбрать платформу v100(Свойства конфигурации->общие->набор инструментов платформы).
В настройках проекта выбрать платформу v100(Свойства конфигурации->общие->набор инструментов платформы).
Нет такой платормы.
Нет такой платормы.
просто у тебя она не установленна.
Что хранят эти переменные? За что отвечают? (те, возле которых стоят вопросы)
C++:
struct
stSAMPInfo
{
void
*
pUnk0
[
2
]
;
uint8_t
byteSpace
[
24
]
;
char
szIP
[
257
]
;
char
szHostname
[
259
]
;
uint8_t
byteUnk1
;
uint32_t
ulPort
;
uint32_t
ulMapIcons
[
100
]
;
// Что это?
int
iLanMode
;
// И это
int
iGameState
;
uint32_t
ulConnectTick
;
struct
stServerPresets
*
pSettings
;
void
*
pRakClientInterface
;
struct
stSAMPPools
*
pPools
;
}
;
struct
stServerPresets
{
uint8_t
byteCJWalk
;
// true\false?
uint8_t
byteUnk0
[
4
]
;
float
fWorldBoundaries
[
4
]
;
uint8_t
byteUnk1
;
float
fGravity
;
uint8_t
byteDisableInteriorEnterExits
;
uint32_t
ulVehicleFriendlyFire
;
// true/false? Почему тогда unsigned int?
uint8_t
byteUnk2
[
4
]
;
int
iClassesAvailable
;
// mm?
float
fNameTagsDistance
;
uint8_t
byteUnk3
;
uint8_t
byteWorldTime_Hour
;
uint8_t
byteWorldTime_Minute
;
uint8_t
byteWeather
;
uint8_t
byteNoNametagsBehindWalls
;
uint8_t
bytePlayerMarkersMode
;
uint8_t
byteUnk4
[
3
]
;
float
fGlobalChatRadiusLimit
;
uint8_t
byteShowNameTags
;
}
;
Dark_Knight
02.06.2016, 18:46
uint8_t byteCJWalk; // true\false? 6ег сиджея. 6айт
uint32_t ulMapIcons[100]; // Что это? Массив иконок на карте. Дворд
int iLanMode; // И это. 1ока1ьный режим
Что хранят эти переменные? За что отвечают? (те, возле которых стоят вопросы)
C++:
struct
stSAMPInfo
{
void
*
pUnk0
[
2
]
;
uint8_t
byteSpace
[
24
]
;
char
szIP
[
257
]
;
char
szHostname
[
259
]
;
uint8_t
byteUnk1
;
uint32_t
ulPort
;
uint32_t
ulMapIcons
[
100
]
;
// Что это?
int
iLanMode
;
// И это
int
iGameState
;
uint32_t
ulConnectTick
;
struct
stServerPresets
*
pSettings
;
void
*
pRakClientInterface
;
struct
stSAMPPools
*
pPools
;
}
;
struct
stServerPresets
{
uint8_t
byteCJWalk
;
// true\false?
uint8_t
byteUnk0
[
4
]
;
float
fWorldBoundaries
[
4
]
;
uint8_t
byteUnk1
;
float
fGravity
;
uint8_t
byteDisableInteriorEnterExits
;
uint32_t
ulVehicleFriendlyFire
;
// true/false? Почему тогда unsigned int?
uint8_t
byteUnk2
[
4
]
;
int
iClassesAvailable
;
// mm?
float
fNameTagsDistance
;
uint8_t
byteUnk3
;
uint8_t
byteWorldTime_Hour
;
uint8_t
byteWorldTime_Minute
;
uint8_t
byteWeather
;
uint8_t
byteNoNametagsBehindWalls
;
uint8_t
bytePlayerMarkersMode
;
uint8_t
byteUnk4
[
3
]
;
float
fGlobalChatRadiusLimit
;
uint8_t
byteShowNameTags
;
}
;
все же есть в samp wiki
ShowPlayerMapIcon();
lanmode в server.cfg
UsePlayerPedAnims()
EnableVehicleFriendlyFire()
AddPlayerClass() - их кол-во
все же есть в samp wiki
ShowPlayerMapIcon();
lanmode в server.cfg
UsePlayerPedAnims()
EnableVehicleFriendlyFire()
AddPlayerClass() - их кол-во
uint8_t byteCJWalk; // true\false? 6ег сиджея. 6айт
uint32_t ulMapIcons[100]; // Что это? Массив иконок на карте. Дворд
int iLanMode; // И это. 1ока1ьный режим
Благодарю! :)
Dark_Knight
04.06.2016, 11:45
C++:
key
=
get_string_from_ini
(
INI_FILE
,
INI_SECTION_FRIXEN
,
INI_TEST
)
;
_bKEY
=
atoi
(
key
.
c_str
(
)
)
;
Почему он берет из ini файла допустим не 123 (как там написано), а в игру выводит 4234234234 - приблизительно такие числа.
SF->getGame()->isKeyPressed(_bKEY) - не работает :(
Весь код давай.
Весь код давай.
уже сам разобрался, все получилось
Как превратить интерфейс в таблицу виртуальных методов? Такое врятли сработает.
C++:
DWORD
*
VTable
;
memcpy
(
&
VTable
,
(
BYTE
*
)
getRakClientInterface
(
)
,
4
)
;
Не подскажете где взять функцию конвертирования 3D координат в экранные и наоборот. В собейте искал, не нашёл чет. Искал также и в Game SDK.
В собейте искал, не нашёл чет
плохо искал
плохо искал
Подскажи в каком хедере искать. Там их много.
Так что? Никто не даст функцию конвертирования 3d координат в экранные? Я хз где оно в собейте и как она вообще называется.
itsLegend
06.06.2016, 19:00
Так что? Никто не даст функцию конвертирования 3d координат в экранные? Я хз где оно в собейте и как она вообще называется.
https://github.com/BlastHackNet/mod...b494a3f7d0f/src/proxyIDirect3DDevice9.cpp#L97 (https://github.com/BlastHackNet/mod_s0beit_sa/blob/19e9ec2e0f393ff9d094337519ea1b494a3f7d0f/src/proxyIDirect3DDevice9.cpp#L97)
https://github.com/BlastHackNet/mod...b494a3f7d0f/src/proxyIDirect3DDevice9.cpp#L97 (https://github.com/BlastHackNet/mod_s0beit_sa/blob/19e9ec2e0f393ff9d094337519ea1b494a3f7d0f/src/proxyIDirect3DDevice9.cpp#L97)
Спасибо :3
Dark_Knight
07.06.2016, 22:32
RPC_ScrCreateExplosion скорее всего он.
По какому адресу находится game destructor? Хочу на него хук поставить.
По какому адресу находится game destructor? Хочу на него хук поставить.
в собе глянь
Vadim.dll
11.06.2016, 16:13
Как подключить D3d9 к проекту SF?
Как подключить D3d9 к проекту SF?
он и так подключен
Dark_Knight
11.06.2016, 17:50
И? Ты включил какой-то патч не написавши код? На*** тогда было вопрос задавать.
включил патч все ровно взрывы есть
взрывы от гранат, машин, танков, вертолетов обрабатываются не через этот рпц
как найти нужный рпц
для чего именно?
взрывы от выстрела танков вертолетов гидры
они не в рпц
Seanbotik
11.06.2016, 20:46
как правильно raknet библиотеки к собейту подключить? если напрямую, то переопределения и т.д.
Vadim.dll
11.06.2016, 21:26
не удается открыть источник файл "windows.h" SFPlugin
Вот такую ошибку выдает, что делать?
Vadim.dll
11.06.2016, 21:36
И еще вопросик, какой функцией можно изменить значение в памяти gta sa?
0xB7CE50 - [dword] Деньги - Например
Dark_Knight
11.06.2016, 22:25
*(type *)adress = value
Vadim.dll
11.06.2016, 22:35
*(type *)adress = value
Дарк, ты не знаешь а на питоне как?
Dark_Knight
12.06.2016, 03:29
Дарк, ты не знаешь а на питоне как?
Нет. И темка по С/С++
RPC_Chat какие параметры имеет
Dark_Knight
12.06.2016, 12:25
Дворд и чар
в собе глянь
Я хз где там. Я искал и не нашёл.
Что за hook_handle_rpc_packet1 и hook_handle_rpc_packet2? Нашёл в собейте/ Это зачем? Ведь есть OnSendRPC, OnSendPacket и OnReceivePacket?
Так что, знает кто где в собейте устанавливается хук на game destructor?
пытаюсь сделать динамическое выделение памяти для менюхи, как в собейте, но вылетает через 1-2 секунды после загрузки игры, если madd() вызывать
Код:
struct stMenuInfo
{
const char *mname;
struct stMenuInfo *pmenu;
struct stMenuInfo *cmenu;
unsigned int bcount;
struct stButtonInfo *btn;
};
struct stMenuInfo* mdata;
unsigned int mcount = 0;
unsigned int madd(const char* mname)
{
struct stMenuInfo *new_mn;
memset(&new_mn, 0, 0);
new_mn = (struct stMenuInfo *)realloc(mdata, (mcount + 1) * sizeof(struct stMenuInfo));
if (new_mn == NULL)
return NULL;
mdata = new_mn;
mdata[mcount].mname = _strdup(mname);
mcount++;
return mcount - 1;
}
помогите, пожалуйста
Если я понял тебя правильно.
C++:
struct
stMenuInfo
{
const
char
*
mname
;
struct
stMenuInfo
*
pmenu
;
struct
stMenuInfo
*
cmenu
;
unsigned
int
bcount
;
struct
stButtonInfo
*
btn
;
}
;
struct
stMenuInfo
*
mdata
;
unsigned
int
mcount
=
0
;
unsigned
int
madd
(
const
char
*
mname
)
{
// Есть массив меню и их количество.
// realloc - это функция, которая изменяет количество выделенной памяти
// для нашего участка памяти (массива mdata)
// и возвращает содержимое предыдущего участка, то есть наш массив с +1 элементом.
// То есть, мы должны присвоить mdata её return,
// а в аргументах указать участок для которого хотим выделить память
// и количество выделенной памяти.
// То есть, mdata и ++mcount (сразу добавляем 1 к mcount, важно чтобы ++ стояло перед переменной, загугли почему если не знаешь)
// умножить на размер структуры.
// Таким образом, у нас есть массив который содержит все те же элементы,
// но у которого появился еще один элемент с "мусором".
mdata
=
(
struct
stMenuInfo
*
)
realloc
(
mdata
,
++
mcount
*
sizeof
(
struct
stMenuInfo
)
)
;
// Очищаем "мусор".
// Почему mcount - 1? Потому что у нас отсчет не с 1, а с 0 и последний элемент это всегда = количество_меню - 1.
memset
(
&
mdata
[
mcount
-
1
]
,
0
,
sizeof
(
struct
stMenuInfo
)
)
;
mdata
[
mcount
-
1
]
.
mname
=
_strdup
(
mname
)
;
return
mcount
-
1
;
// возвращаем id последнего меню?
}
Если я понял тебя правильно.
C++:
struct
stMenuInfo
{
const
char
*
mname
;
struct
stMenuInfo
*
pmenu
;
struct
stMenuInfo
*
cmenu
;
unsigned
int
bcount
;
struct
stButtonInfo
*
btn
;
}
;
struct
stMenuInfo
*
mdata
;
unsigned
int
mcount
=
0
;
unsigned
int
madd
(
const
char
*
mname
)
{
// Есть массив меню и их количество.
// realloc - это функция, которая изменяет количество выделенной памяти
// для нашего участка памяти (массива mdata)
// и возвращает содержимое предыдущего участка, то есть наш массив с +1 элементом.
// То есть, мы должны присвоить mdata её return,
// а в аргументах указать участок для которого хотим выделить память
// и количество выделенной памяти.
// То есть, mdata и ++mcount (сразу добавляем 1 к mcount, важно чтобы ++ стояло перед переменной, загугли почему если не знаешь)
// умножить на размер структуры.
// Таким образом, у нас есть массив который содержит все те же элементы,
// но у которого появился еще один элемент с "мусором".
mdata
=
(
struct
stMenuInfo
*
)
realloc
(
mdata
,
++
mcount
*
sizeof
(
struct
stMenuInfo
)
)
;
// Очищаем "мусор".
// Почему mcount - 1? Потому что у нас отсчет не с 1, а с 0 и последний элемент это всегда = количество_меню - 1.
memset
(
&
mdata
[
mcount
-
1
]
,
0
,
sizeof
(
struct
stMenuInfo
)
)
;
mdata
[
mcount
-
1
]
.
mname
=
_strdup
(
mname
)
;
return
mcount
-
1
;
// возвращаем id последнего меню?
}
спасибо, надо учебники уже читать начать, уж больно интересны эти пляски с памятью
UPD:
чет рано обрадовался, игра-то вылетает все равно.
если убрать указатели на другие структуры из stMenuInfo, то все работает, но они нужны.
всё ещё в поисках помощи, посоны
спасибо, надо учебники уже читать начать, уж больно интересны эти пляски с памятью
UPD:
чет рано обрадовался, игра-то вылетает все равно.
если убрать указатели на другие структуры из stMenuInfo, то все работает, но они нужны.
всё ещё в поисках помощи, посоны
А ты юзаешь их? Или что ты вообще хочешь сделать?
Dark_Knight
17.06.2016, 01:11
Вы пытаетесь вызывать, то что не существует.
А ты юзаешь их? Или что ты вообще хочешь сделать?
cmenu, pmenu - уберу (понял, как сделать без этого)
а вот struct stButtonInfo *btn - это инфа о элементах меню. Элементы добавляются точно таким же способом.
cmenu, pmenu - уберу (понял, как сделать без этого)
а вот struct stButtonInfo *btn - это инфа о элементах меню. Элементы добавляются точно таким же способом.
Указатели - это лишь указатели на объект, если ты его не создавал, то и обращаться к нему нельзя. Кидай код.
когда стреляю из машины пули отправляются не через ID_BULLET_SYNC через какой пакет они отправляются тогда
ты про стрельбу в сторону из окна? там по клавишам синхра
да сделал буллит аим хук и подменяю координаты и оффсет на ближайшего игрока когда стреляю из окна буллит не отправляется как резвернуть эти пули куда мне надо
никак, шли свои
Как реализована release функция в сампфунксе? Там врятли плагин освобождается в DLL_PROCESS_DETACH, ибо когда я ввожу /q, то сразу весь интерфейс sampfunc пропадает. Мб стоит хук какой на команду /q?
woksonal
21.06.2016, 10:29
ты про стрельбу в сторону из окна? там по клавишам синхра
отправляется bullet когда из окна стреляешь, клавиши отправляются только для звуков и визуал эффектов
из танка/базуки итд, наверно, по клавишам и аим синхре создает снаряд/взрыв локально
отправляется bullet когда из окна стреляешь, клавиши отправляются только для звуков и визуал эффектов
из танка/базуки итд, наверно, по клавишам и аим синхре создает снаряд/взрыв локально
я лично не смотрел, что из окна летит, но из вертолета, самолета и мотоцикла буллета нет, и скорее всего из машины тоже
woksonal
21.06.2016, 10:56
я из кара смотрел
Vasiliy77
22.06.2016, 16:16
Как можно обработать нажатие клавиш диалога, который я создаю в asi файле? Чтобы при нажатии например левой клавиши "Далее" было одно действие дальше, "Назад" - другое действие.
Как называется хук, когда мы заменяет виртуальную таблицу (RakClientInterface или IDirect3DDevice9) на свою (proxyIDirect3DDevice9, как в собейте) и в её методах уже вызываем оригинальные функции? Хотел почитать об этом.
NarutoUA
23.06.2016, 00:31
vtable hook
vtable hook
Не то это. Там рассказывается об отдельных методах. Вроде это называется патчинг виртуальных таблиц, но я не уверен.
Что делать если я не могу отловить баг? В определенный момент он срабатывает, а в другой - нет. Вообще, что делать в таких случаях?
Что делать если я не могу отловить баг? В определенный момент он срабатывает, а в другой - нет. Вообще, что делать в таких случаях?
вести лог
NarutoUA
23.06.2016, 22:56
Не то это. Там рассказывается об отдельных методах. Вроде это называется патчинг виртуальных таблиц, но я не уверен.
Откуда тебе знать то ли это или нет? В первых 4х байтах класса лежит указатель на таблицу, меняешь его на свой и всё.
Откуда тебе знать то ли это или нет? В первых 4х байтах класса лежит указатель на таблицу, меняешь его на свой и всё.
Видимо я не так понял то что гуглил, поздно было да и на английском все. Спасибо,
вести лог
А что логгировать то? Я то нашёл место где это происходит, но в одном случае - все срабатывает, во втором - нет. Буду что-то пробовать еще.
Видимо я не так понял то что гуглил, поздно было да и на английском все. Спасибо,
А что логгировать то? Я то нашёл место где это происходит, но в одном случае - все срабатывает, во втором - нет. Буду что-то пробовать еще.
логируй все
логируй все
А как проверить, валиден ли указатель? То есть, это указатель на нужный мне объект или на что-то другое.
А как проверить, валиден ли указатель? То есть, это указатель на нужный мне объект или на что-то другое.
а ты что его из рандомных участков памяти достаешь?
а ты что его из рандомных участков памяти достаешь?
Нет. При создании элемента меню я указываю родителя. В одних элементах родитель валиден, а если обратиться к родителю в других элементах, то игра вылетает. Я не знаю с чем это связано.
Нет. При создании элемента меню я указываю родителя. В одних элементах родитель валиден, а если обратиться к родителю в других элементах, то игра вылетает. Я не знаю с чем это связано.
приравнивай родителей у корневого меню к 0 при создание, а потом сравнивай
приравнивай родителей у корневого меню к 0 при создание, а потом сравнивай
Исправил баг. Если честно я так и не понял почему он срабатывал. В структуре одним из элементов была другая структура, я заменил этот элемент на указатель на эту структуру и все сработало. Очень странно.
itsLegend
24.06.2016, 21:01
Используй RakLogger.
Никак.
DarkExorcist
26.06.2016, 21:48
как перевести DWORD в char? Пробовал форматировать, но пропадают нули в начале, а мне их нужно сохранить
Gabriel__
26.06.2016, 21:56
Нельзя так сделать. DWORD имеет размер 4 байта, char 1 байт. Если у тебя hex то у тебя пустое место будет заменяться нулями в начале. Не сможешь ты впихнуть 4 байта в 1 байт.
как перевести DWORD в char? Пробовал форматировать, но пропадают нули в начале, а мне их нужно сохранить
А что ты хочешь сделать?
как перевести DWORD в char? Пробовал форматировать, но пропадают нули в начале, а мне их нужно сохранить
sprintf(szStr, "0x%08X", dwValue);
Dark_Knight
27.06.2016, 13:35
как перевести DWORD в char? Пробовал форматировать, но пропадают нули в начале, а мне их нужно сохранить
%02d, %03d и т.д.
Как заставить ID3DXFont рисовать текст с учетом цветовых кодов? Он рисует текст вместо со скобками {FFAA0000}.
Dark_Knight
27.06.2016, 22:15
Собейт в помощь)
Собейт в помощь)
Там не ID3DXFont используется.
Dark_Knight
28.06.2016, 00:57
Там не ID3DXFont используется.
D3CFont или как там, все равно юзает ID3DXFont
NarutoUA
29.06.2016, 14:50
D3CFont или как там, все равно юзает ID3DXFont
Нет, в собе CD3DFont и он не юзает ID3DXFont а рисует текст треугольниками что быстрее
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot