Просмотр полной версии : С/С++ Вопрос - Ответ
В смысле список?? Конкретнее. Что ты подразумеваешь под хуком? Клик его? Есть два варианта:
1.
C++:
SF
->
getSAMP
(
)
->
sendClickTextDraw
(
)
;
2.
ClickTextdraw // rpc
Чтобы получить информацию с текстдрава
1.
ShowTextDraw
ну список всех которые сейчас присутствуют у меня на экране. под хуком подразумеваю типо сервер отправляет мне текстдравы, в плагине это узнаю сразу и пишу в чат, например.
Почему если пытаюсь получить index сразу крашит? и почему szString всегда одинаковый пишет, какое то не понятное число?
Неадекватная сова
13.05.2019, 17:47
Почему если пытаюсь получить index сразу крашит? и почему szString всегда одинаковый пишет, какое то не понятное число?
Потому что читаешь не правильно:
Код:
ShowTextDraw - ID: 134
Parameters: UINT16 wTextDrawID, UINT8 Flags, float fLetterWidth, float fLetterHeight, UINT32 dwLetterColor, float fLineWidth, float fLineHeight, UINT32 dwBoxColor, UINT8 Shadow, UINT8 Outline, UINT32 dwBackgroundColor, UINT8 Style, UINT8 Selectable, float fX, float fY, UINT16 wModelID, float fRotX, float fRotY, float fRotZ, float fZoom, UINT16 wColor1, UINT16 wColor2, UINT8 szTextLen, char[] szText
Потому что читаешь не правильно:
Код:
ShowTextDraw - ID: 134
Parameters: UINT16 wTextDrawID, UINT8 Flags, float fLetterWidth, float fLetterHeight, UINT32 dwLetterColor, float fLineWidth, float fLineHeight, UINT32 dwBoxColor, UINT8 Shadow, UINT8 Outline, UINT32 dwBackgroundColor, UINT8 Style, UINT8 Selectable, float fX, float fY, UINT16 wModelID, float fRotX, float fRotY, float fRotZ, float fZoom, UINT16 wColor1, UINT16 wColor2, UINT8 szTextLen, char[] szText
из-за id все равно крашит, а текст все тот же пишет
Musaigen
13.05.2019, 19:02
из-за id все равно крашит, а текст все тот же пишет
Потому что ты гений, который читает не по структуре RPC
Потому что ты гений, который читает не по структуре RPC
а как надо? я из примера брал
Почему если пытаюсь получить index сразу крашит? и почему szString всегда одинаковый пишет, какое то не понятное число?
Facepalm... Нужно читать textdraw id. Textdraw data, len textdraw, text textdrawa, в конце обязательно очисти мусорв строке. Я не за компом , так бы написал код. Я думаю , разберёшься сам
а как надо? я из примера брал
Длину текста нужно читать перед текстом
Facepalm... Нужно читать textdraw id. Textdraw data, len textdraw, text textdrawa, в конце обязательно очисти мусорв строке. Я не за компом , так бы написал код. Я думаю , разберёшься сам
Длину текста нужно читать перед текстом
!отдельно!
SAMP.ASI
14.05.2019, 18:30
Хочу получить ники всех игроков на сервере.
C++:
[CODE]
int
main
(
)
{
DWORD pID
;
char
moduleName
[
]
=
"samp.dll"
;
HWND hGameWindow
=
FindWindow
(
NULL
,
L
"GTA:SA:MP"
)
;
GetWindowThreadProcessId
(
hGameWindow
,
&
pID
)
;
HANDLE pGta
=
OpenProcess
(
PROCESS_VM_READ
,
FALSE
,
pID
)
;
DWORD pSamp
=
GetModuleBaseAddress
(
pID
,
L
"samp.dll"
)
;
cout
strPlayerName
Но получаю либо кашу либо краш.
Facepalm... Нужно читать textdraw id. Textdraw data, len textdraw, text textdrawa, в конце обязательно очисти мусорв строке. Я не за компом , так бы написал код. Я думаю , разберёшься сам
Длину текста нужно читать перед текстом
!отдельно!
а как? напиши, пожалуйста, а то я дурачек
а как? напиши, пожалуйста, а то я дурачек
Попробуй просто длину текста читать отдельно
Попробуй просто длину текста читать отдельно
Дату текстдрава вроде не обязательно читать
Попробуй просто длину текста читать отдельно
Дату текстдрава вроде не обязательно читать
И используй 256 элементов в массиве , на всякий случай
а как? напиши, пожалуйста, а то я дурачек
Код:
bool CALLBACK incomingRPC(stRakNetHookParams *params)
{
if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowTextDraw)
{
stTextDrawTransmit txd;
WORD txdID, cTextLen; char cText[800];
params->bitStream->ResetReadPointer();
params->bitStream->Read(txdID);
params->bitStream->Read((PCHAR)&txd, sizeof(stTextDrawTransmit));
params->bitStream->Read(cTextLen);
params->bitStream->Read(cText, cTextLen);
params->bitStream->ResetReadPointer();
cText[cTextLen] = '\0';
SF->getSAMP()->getChat()->AddChatMessage(-1, "Получен текстдрав (%i) с текстом: %s", txdID, cText);
}
return true;
};
Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про hash_map, а если компилить с "
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1", то при входе в игру пишется "Test", а команда /showinfo просто не работает
Код:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS *SF = new SAMPFUNCS();
void CALLBACK cmd_show_info_player(std::string param)
{
if (param.empty()) return;
int i = std::stoi(param);
char buf[128];
stRemotePlayer* pPlayer = SF->getSAMP()->getPlayers()->pRemotePlayer[i];
if (!pPlayer) return;
sprintf(buf, "Nickname - %s, Ping - %d, Score - %d, isNPC - %d, AFKState - %d",
pPlayer->szPlayerName,
pPlayer->iPing,
pPlayer->iScore,
pPlayer->iIsNPC,
pPlayer->pPlayerData->iAFKState == 2);
SF->getSAMP()->getChat()->AddChatMessage(-1, buf);
};
void CALLBACK mainloop()
{
static bool init = false;
if (!init)
{
if (GAME == nullptr)
return;
if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
return;
if (!SF->getSAMP()->IsInitialized())
return;
SF->getSAMP()->getChat()->AddChatMessage( D3DCOLOR_XRGB( 0, 0xAA, 0 ), "Test." );
SF->getSAMP()->registerChatCommand("showinfo", cmd_show_info_player);
init = true;
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
switch (dwReasonForCall)
{
case DLL_PROCESS_ATTACH:
SF->initPlugin(mainloop, hModule);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про hash_map, а если компилить с "
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1", то при входе в игру пишется "Test", а команда /showinfo просто не работает
Код:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS *SF = new SAMPFUNCS();
void CALLBACK cmd_show_info_player(std::string param)
{
if (param.empty()) return;
int i = std::stoi(param);
char buf[128];
stRemotePlayer* pPlayer = SF->getSAMP()->getPlayers()->pRemotePlayer[i];
if (!pPlayer) return;
sprintf(buf, "Nickname - %s, Ping - %d, Score - %d, isNPC - %d, AFKState - %d",
pPlayer->szPlayerName,
pPlayer->iPing,
pPlayer->iScore,
pPlayer->iIsNPC,
pPlayer->pPlayerData->iAFKState == 2);
SF->getSAMP()->getChat()->AddChatMessage(-1, buf);
};
void CALLBACK mainloop()
{
static bool init = false;
if (!init)
{
if (GAME == nullptr)
return;
if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
return;
if (!SF->getSAMP()->IsInitialized())
return;
SF->getSAMP()->getChat()->AddChatMessage( D3DCOLOR_XRGB( 0, 0xAA, 0 ), "Test." );
SF->getSAMP()->registerChatCommand("showinfo", cmd_show_info_player);
init = true;
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
switch (dwReasonForCall)
{
case DLL_PROCESS_ATTACH:
SF->initPlugin(mainloop, hModule);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Первой строкой поставь. Нужно вводить не просто /showinfo, в команде должен быть один параметр, в данном случае это id игрока ( 0 - 1000).
C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
Первой строкой поставь. Нужно вводить не просто /showinfo, в команде должен быть один параметр, в данном случае это id игрока ( 0 - 1000).
C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенкс
Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенкс
Чтобы вывестисвои данныевот код:
C++:
char
*
name
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pszLocalPlayerName
;
int
id
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
sLocalPlayerID
;
int
score
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iLocalPlayerScore
;
int
ping
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iLocalPlayerPing
;
char
buffer
[
228
]
;
sprintf
(
buffer
,
"NickName: %s , ID: %d , Ping: %d , Score: %d , "
,
name
,
id
,
ping
,
score
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
buffer
)
;
Vadim.dll
15.05.2019, 15:03
Вопрос:
Есть такая структура:
C++:
struct
stSAMP
{
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
stSAMPSettings
*
pSettings
;
void
*
pRakClientInterface
;
struct
stSAMPPools
*
pPools
;
}
;
https://i.imgur.com/VbXsKBq.png
Но в cheat engine она выглядит совсем не так, данные то в ней есть, вроде IP и Hostname, но они расположены на каких-то непонятных оффсетах, почему структура в C++ выглядит не так, как в CheatEngine, смотрел еще некоторые структуры - так там данные в CE расположены в том же порядке, что и в C++
[QUOTE="SAMP.ASI"]
Хочу получить ники всех игроков на сервере.
C++:
[CODE]
int
main
(
)
{
DWORD pID
;
char
moduleName
[
]
=
"samp.dll"
;
HWND hGameWindow
=
FindWindow
(
NULL
,
L
"GTA:SA:MP"
)
;
GetWindowThreadProcessId
(
hGameWindow
,
&
pID
)
;
HANDLE pGta
=
OpenProcess
(
PROCESS_VM_READ
,
FALSE
,
pID
)
;
DWORD pSamp
=
GetModuleBaseAddress
(
pID
,
L
"samp.dll"
)
;
cout
strPlayerName
Vadim.dll
15.05.2019, 15:40
Как минимум - у Вас несоответствие кодировок. ANSI программа (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcHJldm lvdXMtdmVyc2lvbnMvdmlzdWFsc3R1ZGlvL3Zpc3VhbC1zdHVk aW8tNi4wL2FhMjk5Mzg2KHY9dnMuNjAp) использующая ANSI версии функций winApi у Вас принимает в качестве аргументов const wchar_t * (https://www.blast.hk/redirect/aHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbm d1YWdlL3N0cmluZ19saXRlcmFs) (строки L"..."), что является ошибкой.
А как более - хороший пример по external получению списка игроков написан в samp udf for ahk (https://github.com/SAMP-UDF/SAMP-UDF-for-AutoHotKey/blob/master/SAMP.ahk#L2644). Все оффсеты есть в верхней части файла в массивах, где 1, 2, 3 позиции соответствуют версиям 0.3.7r1, r2, 0.3dl с поправкой для global SAMP_REMOTEPLAYERDATA_PED := [0x2A4, 0x40, 0x40].
Также для определения причин вылета лучше применять отладчик, т.к. сообщение "у меня крашит" практически не несет в себе полезной нагрузки, а узнать причины краша Вы можете самостоятельно.
Вероятно, дело в выравнивании структур компилятором. Статья 1 (https://www.blast.hk/redirect/aHR0cDovL2tvbmlzaGNoZXZkbWl0cnkuYmxvZ3Nwb3QuY29tLz IwMTAvMDEvYmxvZy1wb3N0Lmh0bWw), Статья 2 (https://www.blast.hk/redirect/aHR0cHM6Ly9oYWJyLmNvbS9lbi9wb3N0LzE0MjY2Mi8)
Спасибо! Надеюсь это мне поможет!
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге
Код:
bool CALLBACK incomingRPC(stRakNetHookParams* params)
{
if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
{
short int DialogID;
char pText[64];
params->bitStream->ResetReadPointer();
params->bitStream->Read(DialogID);
params->bitStream->Read(pText);
params->bitStream->ResetReadPointer();
SF->getSAMP()->getChat()->AddChatMessage(-1, "DIALOG ID [%d]]", DialogID);
SF->getSAMP()->getChat()->AddChatMessage(-1, "Text: [%s]", pText);
};
return true;
};
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге
Код:
bool CALLBACK incomingRPC(stRakNetHookParams* params)
{
if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
{
short int DialogID;
char pText[64];
params->bitStream->ResetReadPointer();
params->bitStream->Read(DialogID);
params->bitStream->Read(pText);
params->bitStream->ResetReadPointer();
SF->getSAMP()->getChat()->AddChatMessage(-1, "DIALOG ID [%d]]", DialogID);
SF->getSAMP()->getChat()->AddChatMessage(-1, "Text: [%s]", pText);
};
return true;
};
Читаешь длину текста, читаешь сам текст, декодишь, убираешь мусор.
Читаешь длину текста, читаешь сам текст, декодишь, убираешь мусор.
ShowDialog - ID: 61
Parameters: UINT16 wDialogID, UINT8 bDialogStyle, UINT8 bTitleLength, char[] szTitle, UINT8 bButton1Len, char[] szButton1, UINT8 bButton2Len, char[] szButton2, CSTRING szInfo
Vadim.dll
15.05.2019, 17:08
[QUOTE="SAMP.ASI"]
Хочу получить ники всех игроков на сервере.
C++:
[CODE]
int
main
(
)
{
DWORD pID
;
char
moduleName
[
]
=
"samp.dll"
;
HWND hGameWindow
=
FindWindow
(
NULL
,
L
"GTA:SA:MP"
)
;
GetWindowThreadProcessId
(
hGameWindow
,
&
pID
)
;
HANDLE pGta
=
OpenProcess
(
PROCESS_VM_READ
,
FALSE
,
pID
)
;
DWORD pSamp
=
GetModuleBaseAddress
(
pID
,
L
"samp.dll"
)
;
cout
strPlayerName
C++:
[CODE]
#include
#include
#include
#include
#include
using
namespace
std
;
DWORD
GetProcId
(
const
wchar_t
*
procname
)
{
PROCESSENTRY32 pe
;
HANDLE hSnap
;
pe
.
dwSize
=
sizeof
(
PROCESSENTRY32
)
;
hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
NULL
)
;
if
(
Process32First
(
hSnap
,
&
pe
)
)
{
do
{
if
(
wcscmp
(
pe
.
szExeFile
,
procname
)
==
0
)
break
;
}
while
(
Process32Next
(
hSnap
,
&
pe
)
)
;
}
return
pe
.
th32ProcessID
;
}
DWORD
get_module
(
DWORD processID
,
const
wchar_t
*
name
)
{
HMODULE hMods
[
1024
]
;
HANDLE hProcess
;
DWORD cbNeeded
;
unsigned
int
i
;
// Print the process identifier.
printf
(
"\nProcess ID: %u\n"
,
processID
)
;
// Get a handle to the process.
hProcess
=
OpenProcess
(
PROCESS_QUERY_INFORMATION
|
PROCESS_VM_READ
,
FALSE
,
processID
)
;
if
(
NULL
==
hProcess
)
return
1
;
// Get a list of all the modules in this process.
if
(
EnumProcessModules
(
hProcess
,
hMods
,
sizeof
(
hMods
)
,
&
cbNeeded
)
)
{
for
(
i
=
0
;
i
strPlayerName
Попробуй это.
Vadim.dll
15.05.2019, 18:12
Почему бы не вывести список ников через цикл? :wall:
Я здесь так то чисто свой ник вывел, а вывод всех остальных - закомментировал, т.к у меня нет структуры stRemotePlayer
SAMP.ASI
16.05.2019, 00:26
[QUOTE="Vadim.dll"]
C++:
[CODE]
#include
#include
#include
#include
#include
using
namespace
std
;
DWORD
GetProcId
(
const
wchar_t
*
procname
)
{
PROCESSENTRY32 pe
;
HANDLE hSnap
;
pe
.
dwSize
=
sizeof
(
PROCESSENTRY32
)
;
hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
NULL
)
;
if
(
Process32First
(
hSnap
,
&
pe
)
)
{
do
{
if
(
wcscmp
(
pe
.
szExeFile
,
procname
)
==
0
)
break
;
}
while
(
Process32Next
(
hSnap
,
&
pe
)
)
;
}
return
pe
.
th32ProcessID
;
}
DWORD
get_module
(
DWORD processID
,
const
wchar_t
*
name
)
{
HMODULE hMods
[
1024
]
;
HANDLE hProcess
;
DWORD cbNeeded
;
unsigned
int
i
;
// Print the process identifier.
printf
(
"\nProcess ID: %u\n"
,
processID
)
;
// Get a handle to the process.
hProcess
=
OpenProcess
(
PROCESS_QUERY_INFORMATION
|
PROCESS_VM_READ
,
FALSE
,
processID
)
;
if
(
NULL
==
hProcess
)
return
1
;
// Get a list of all the modules in this process.
if
(
EnumProcessModules
(
hProcess
,
hMods
,
sizeof
(
hMods
)
,
&
cbNeeded
)
)
{
for
(
i
=
0
;
i
strPlayerName
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге
Код:
bool CALLBACK incomingRPC(stRakNetHookParams* params)
{
if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
{
short int DialogID;
char pText[64];
params->bitStream->ResetReadPointer();
params->bitStream->Read(DialogID);
params->bitStream->Read(pText);
params->bitStream->ResetReadPointer();
SF->getSAMP()->getChat()->AddChatMessage(-1, "DIALOG ID [%d]]", DialogID);
SF->getSAMP()->getChat()->AddChatMessage(-1, "Text: [%s]", pText);
};
return true;
};
странно что у тебя вообще что-то выводится с таким кодом.
компоненты RPC/пакета нужно получать строго по порядку.
Код:
struct stSAMPDialog
{
int iIsActive;
BYTE bDialogStyle;
WORD wDialogID;
BYTE bTitleLength;
char szTitle[257];
BYTE bButton1Len;
char szButton1[257];
BYTE bButton2Len;
char szButton2[257];
char szInfo[1000];
};
bool CALLBACK incomingRPC(stRakNetHookParams *params)
{
if (hook->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
{
stSAMPDialog sampDialog;
params->bitStream->ResetReadPointer();
params->bitStream->Read(sampDialog.wDialogID);
params->bitStream->Read(sampDialog.bDialogStyle);
params->bitStream->Read(sampDialog.bTitleLength);
params->bitStream->Read(sampDialog.szTitle, sampDialog.bTitleLength);
sampDialog.szTitle[sampDialog.bTitleLength] = 0;
params->bitStream->Read(sampDialog.bButton1Len);
params->bitStream->Read(sampDialog.szButton1, sampDialog.bButton1Len);
sampDialog.szButton1[sampDialog.bButton1Len] = 0;
params->bitStream->Read(sampDialog.bButton2Len);
params->bitStream->Read(sampDialog.szButton2, sampDialog.bButton2Len);
sampDialog.szButton2[sampDialog.bButton2Len] = 0;
SF->getRakNet()->DecodeString(sampDialog.szInfo, 900, params->bitStream);
SF->getSAMP()->getChat()->AddChatMessage(-1, sampDialog.szInfo);
};
return true;
};
Vadim.dll
16.05.2019, 19:11
Мне нужно получить структуру pRemotePlayer[1004], чтоб получить из нее значения ника, счета. pRemotePlayer находится в stPlayerPool
А где у тебя эта структура определена?
Вопрос, как в Cheat Engine или где-нибудь еще получить адрес на структуру, в которой лежит текст диалога? Пробовал искать, нашел один указатель, так на него ничего не ссылается и в дизассембле пишется прямо в него, нету сдвига, может подскажет кто.
SAMP.ASI
16.05.2019, 19:18
А где у тебя эта структура определена?
Вопрос, как в Cheat Engine или где-нибудь еще получить адрес на структуру, в которой лежит текст диалога? Пробовал искать, нашел один указатель, так на него ничего не ссылается и в дизассембле пишется прямо в него, нету сдвига, может подскажет кто.
В начале кода подключена structures.h, вот она https://pastebin.com/7iBpCA9L (https://www.blast.hk/redirect/aHR0cHM6Ly9wYXN0ZWJpbi5jb20vN2lCcENBOUw)
Vadim.dll
16.05.2019, 21:11
В начале кода подключена structures.h, вот она https://pastebin.com/7iBpCA9L (https://www.blast.hk/redirect/aHR0cHM6Ly9wYXN0ZWJpbi5jb20vN2lCcENBOUw)
C++:
[CODE]
#include
#include
#include
#include
#include
using
namespace
std
;
DWORD
GetProcId
(
const
wchar_t
*
procname
)
{
PROCESSENTRY32 pe
;
HANDLE hSnap
;
pe
.
dwSize
=
sizeof
(
PROCESSENTRY32
)
;
hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
NULL
)
;
if
(
Process32First
(
hSnap
,
&
pe
)
)
{
do
{
if
(
wcscmp
(
pe
.
szExeFile
,
procname
)
==
0
)
break
;
}
while
(
Process32Next
(
hSnap
,
&
pe
)
)
;
}
return
pe
.
th32ProcessID
;
}
DWORD
get_module
(
DWORD processID
,
const
wchar_t
*
name
)
{
HMODULE hMods
[
1024
]
;
HANDLE hProcess
;
DWORD cbNeeded
;
unsigned
int
i
;
// Print the process identifier.
printf
(
"\nProcess ID: %u\n"
,
processID
)
;
// Get a handle to the process.
hProcess
=
OpenProcess
(
PROCESS_QUERY_INFORMATION
|
PROCESS_VM_READ
,
FALSE
,
processID
)
;
if
(
NULL
==
hProcess
)
return
1
;
// Get a list of all the modules in this process.
if
(
EnumProcessModules
(
hProcess
,
hMods
,
sizeof
(
hMods
)
,
&
cbNeeded
)
)
{
for
(
i
=
0
;
i
У тебя адрес был неправильный, нужно не 0x2A, а 0x2E. Завести это дело со структурой не получилось у меня. Чтобы данные вывелись, тебе нужно в игре нажать на tab, чтобы таблица загрузилась и проге было откуда брать данные.
странно что у тебя вообще что-то выводится с таким кодом.
компоненты RPC/пакета нужно получать строго по порядку.
Код:
struct stSAMPDialog
{
int iIsActive;
BYTE bDialogStyle;
WORD wDialogID;
BYTE bTitleLength;
char szTitle[257];
BYTE bButton1Len;
char szButton1[257];
BYTE bButton2Len;
char szButton2[257];
char szInfo[1000];
};
bool CALLBACK incomingRPC(stRakNetHookParams *params)
{
if (hook->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
{
stSAMPDialog sampDialog;
params->bitStream->ResetReadPointer();
params->bitStream->Read(sampDialog.wDialogID);
params->bitStream->Read(sampDialog.bDialogStyle);
params->bitStream->Read(sampDialog.bTitleLength);
params->bitStream->Read(sampDialog.szTitle, sampDialog.bTitleLength);
sampDialog.szTitle[sampDialog.bTitleLength] = 0;
params->bitStream->Read(sampDialog.bButton1Len);
params->bitStream->Read(sampDialog.szButton1, sampDialog.bButton1Len);
sampDialog.szButton1[sampDialog.bButton1Len] = 0;
params->bitStream->Read(sampDialog.bButton2Len);
params->bitStream->Read(sampDialog.szButton2, sampDialog.bButton2Len);
sampDialog.szButton2[sampDialog.bButton2Len] = 0;
SF->getRakNet()->DecodeString(sampDialog.szInfo, 900, params->bitStream);
SF->getSAMP()->getChat()->AddChatMessage(-1, sampDialog.szInfo);
};
return true;
};
Откуда тут "hook"?
Код:
hook->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog
Он ошибся. Вот так правильно:
C++:
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrShowDialog
)
{
И тут нужно еще от мусорачистить каждый элемент с текстом.
Это я понял, сразу же исправил на params, но всё равно ничего не выводится
Это я понял, сразу же исправил на params, но всё равно ничего не выводится
с параметром промазал, в остальном всё работает.
https://i.imgur.com/cQ7qEiz.jpg
с переменной промазал, в остальном всё работает.
cQ7qEiz.jpgCake_ · 16 Май 2019 в 21:13' data-fancybox="lb-post-338798" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fi.imgur.com%2FcQ7qEi z.jpg&hash=8dd279e0cee3fda039f86cca290f53cb" style="cursor: pointer;" title="cQ7qEiz.jpg">
https://i.imgur.com/cQ7qEiz.jpg
Если не ошибаюсь, это код @ЯedЯuM. Зачем там структура...
Зачем там структура...
допустим для удобства и не говнокода?
Если не ошибаюсь, это код @ЯedЯuM. Зачем там структура...
ты не ошибаешься
и не говнокода?
если структура то не говнокод? это что то новое
если структура то не говнокод? это что то новое
со структурой приятнее выглядит
SAMP.ASI
17.05.2019, 22:18
Можно к .dll\.asi прикрутить консоль парралельно игре? Либо как легко рендерить текст поверх игры, как например это делают читы с bandicam bypass? Желательно первое.
CleanLegend
18.05.2019, 10:05
Можно к .dll\.asi прикрутить консоль парралельно игре? Либо как легко рендерить текст поверх игры, как например это делают читы с bandicam bypass? Желательно первое.
Работа с консолью из dll:
C++:
//Открывает консоль
AllocConsole
(
)
;
//Перенаправляет вызовы:
freopen
(
"CONIN$"
,
"r"
,
stdin
)
;
freopen
(
"CONOUT$"
,
"w"
,
stdout
)
;
freopen
(
"CONOUT$"
,
"w"
,
stderr
)
;
Для рендера текста можно создавать оверлей поверх игры или хукать функции отрисовки d3d9.
https://blast.hk/threads/32712/
DarkP1xel
20.05.2019, 10:44
Можно к .dll\.asi прикрутить консоль парралельно игре? Либо как легко рендерить текст поверх игры, как например это делают читы с bandicam bypass? Желательно первое.
https://blast.hk/threads/22179/
_=Gigant=_
22.05.2019, 02:05
Does anyone have addresses for gta sa radar x, y position ? Thanks.
Чтобы вывестисвои данныевот код:
C++:
char
*
name
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pszLocalPlayerName
;
int
id
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
sLocalPlayerID
;
int
score
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iLocalPlayerScore
;
int
ping
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iLocalPlayerPing
;
char
buffer
[
228
]
;
sprintf
(
buffer
,
"NickName: %s , ID: %d , Ping: %d , Score: %d , "
,
name
,
id
,
ping
,
score
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
buffer
)
;
Не советую юзать pszLocalPlayerName. Зачастую там какой-то баганый мусор. Получать своё ник лучше через getPlayerName.
Does anyone have addresses for gta sa radar x, y position ? Thanks.
*(float *)0x858A10 = X;
*(float *)0x866B70 = Y;
_=Gigant=_
22.05.2019, 03:34
[QUOTE = "ALF, post: 341084, member: 162843"] * (float *) 0x858A10 = X;
* (float *) 0x866B70 = Y; [/ QUOTE]
Thanks, btw
PS y works fine, but x position position textdraw height ...
https://i.postimg.cc/L6PQwDGY/sa-mp-178.png
Неадекватная сова
22.05.2019, 12:23
[QUOTE = "ALF, post: 341084, member: 162843"] * (float *) 0x858A10 = X;
* (float *) 0x866B70 = Y; [/ QUOTE]
Thanks, btw
PS y works fine, but x position position textdraw height ...
https://i.postimg.cc/L6PQwDGY/sa-mp-178.png
C++:
float
RadarPos
=
40.0
;
*
(
DWORD
*
)
(
0x0718D14
)
=
(
DWORD
)
&
RadarPos
;
_=Gigant=_
22.05.2019, 15:56
C++:
std
::
ifstream readfile_shet
;
std
::
string shet_filename
;
char
reading_file_get
[
256
]
;
snprintf
(
reading_file_get
,
sizeof
(
reading_file_get
)
,
"%s\\"
M0D_FOLDER
"%s"
,
g_szWorkingDirectory
,
"text.txt"
)
;
readfile_shet
.
open
(
reading_file_get
)
;
while
(
std
::
getline
(
readfile_shet
,
shet_filename
)
)
{
ImGui
::
Text
(
shet_filename
.
c_str
(
)
)
;
ImGui
::
SameLine
(
)
;
if
(
ImGui
::
Button
(
"Say"
,
ImVec2
(
50.0f
,
20.0f
)
)
)
{
say
(
"%s"
,
shet_filename
.
c_str
(
)
)
;
}
}
readfile_shet
.
close
(
)
;
when I click on the first button 'Say' it only shows text which is in the first line when i click on buttons which are on the other lines nothing shows how to make it to go through all lines ? it only gets first line...
Скиньте, пожалуйста, оффсеты координат транспорта.
vehPtr + ?
Vadim.dll
22.05.2019, 19:04
C++:
typedef
int
(
__cdecl
*
func
)
(
int
someint
,
const
char
*
data
)
;
func f
=
(
func
)
(
dwSamp
+
0x57F0
)
;
f
(
1
,
"pidor"
)
;
samp+0x57F0 - функция для отправления сообщения в чат. Когда пробую вызвать - крашит. Что я делаю неправильно?
C++:
typedef
int
(
__cdecl
*
func
)
(
int
someint
,
const
char
*
data
)
;
func f
=
(
func
)
(
dwSamp
+
0x57F0
)
;
f
(
1
,
"pidor"
)
;
samp+0x57F0 - функция для отправления сообщения в чат. Когда пробую вызвать - крашит. Что я делаю неправильно?
Это функция одного аргумента, возвращаемый тип - void.
Код:
void __stdcall sendSay(char *data)
Vadim.dll
22.05.2019, 20:06
Это функция одного аргумента, возвращаемый тип - void.
Код:
void __stdcall sendSay(char *data)
О, спасибо. А то в исходниках каких-то нашел, что там 2 аргумента
Функция CreateRemoteThread (поток, который запускается в виртуальном адресном пространстве другого процесса) даёт возможность передать потому только один аргумент: "LPVOID lpParameter, // аргументы потока".
Хотел бы узнать, как передать потоку более одного аргумента (желательно с примером).
Функция CreateRemoteThread (поток, который запускается в виртуальном адресном пространстве другого процесса) даёт возможность передать потому только один аргумент: "LPVOID lpParameter, // аргументы потока".
Хотел бы узнать, как передать потоку более одного аргумента (желательно с примером).
https://blast.hk/threads/33035/
Receiver
24.05.2019, 12:35
как отправить команду в чат?
Receiver
24.05.2019, 16:24
как сделать задержку перед вводом текста в диалог, чтобы при этом игра не зависала ?
_=Gigant=_
24.05.2019, 23:05
what's difference between
1.
stOnFootData OnFoot;
memcpy(&OnFoot, &g_Players->pLocalPlayer->onFootData, sizeof(stOnFootData));
OnFoot->byteHealth = 50;
BitStream bsOnFoot;
bsOnFoot.Write((BYTE)ID_PLAYER_SYNC);
bsOnFoot.Write((PCHAR)&OnFoot, sizeof(stOnFootData));
g_RakFuncs->Send(&bsOnFoot, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0);
and
2.
g_Player->pLocalPlayer->OnFootData.byteHealth ?
Is 1. better synced ?
Receiver
25.05.2019, 10:37
Есть скрипт в который нужно запихнуть задержку между вводом текста в диалог, как это сделать без замораживания игрового процесса? (Отредактируйте мой код)
void CALLBACK mainloop()
{
if (SF->getSAMP()->getDialog()->iIsActive && SF->getSAMP()->getDialog()->DialogID == 1)
{
SF->getSAMP()->getDialog()->SetInputText("1");
// тут нужно сделать задержку
SF->getSAMP()->getDialog()->SetInputText("2");
// тут нужно сделать задержку
SF->getSAMP()->getDialog()->SetInputText("3");
// тут нужно сделать задержку
SF->getSAMP()->getDialog()->Close(1);
}
}
Есть скрипт в который нужно запихнуть задержку между вводом текста в диалог, как это сделать без замораживания игрового процесса? (Отредактируйте мой код)
https://blast.hk/threads/781/page-98#post-314836
Receiver
25.05.2019, 13:04
нужно разбить char * test = "12345" на цифры, чтобы можно было сделать так:
char nds[5];
sprintf(result, "%s%s%s%s%s", nds[0], nds[1], nds[2], nds[3], nds[4], nds[5])
когда пытаюсь делать test[0], test[1] ... - краш игры.
??
Receiver
25.05.2019, 13:35
C++:
char
text
[
]
=
"12345"
;
text
[
0
]
;
// 1
text
[
1
]
;
// 2
text
[
2
]
;
// 3
text
[
3
]
;
// 4
text
[
4
]
;
// 5
Смысл тебе писать на C++ , если ты даже основ не знаешь?
мне нужно чтобы было именно char * а не char[]
но если использовать такой метод с char *, то игру крашит
нужно разбить char * test = "12345" на цифры, чтобы можно было сделать так:
char nds[5];
sprintf(result, "%s%s%s%s%s", nds[0], nds[1], nds[2], nds[3], nds[4], nds[5])
когда пытаюсь делать test[0], test[1] ... - краш игры.
??
При спецификаторе %s идет обращение к адресу, записанному в передаваемый аргумент (т.е. переменная должна быть указателем на строку). Естественно, у тебя будет ошибка access violation at adress test[number].
https://ru.wikipedia.org/wiki/Система_типов_Си (https://www.blast.hk/redirect/aHR0cHM6Ly9ydS53aWtpcGVkaWEub3JnL3dpa2kv0KHQuNGB0Y LQtdC80LBf0YLQuNC_0L7Qsl_QodC4)
Сначала неплохо бы основы выучить, как сказал товарищ сверху. Чтобы вывести однобайтовый символ - используй %c.
Receiver
25.05.2019, 14:48
Код:
const auto myTask = []()
{
Sleep(500);
SF->getSAMP()->getDialog()->SetInputText("х");
Sleep(500);
SF->getSAMP()->getDialog()->SetInputText("у");
};
std::thread(myTask).detach();
- краш игры, в чём проблема ?
Receiver
25.05.2019, 15:16
Нужно проверять на валидностьдиалог.
Там сверху проверка есть на валидность, это похоже из-за того что два Sleep
----
Смысл есть везде
Receiver
25.05.2019, 16:02
C++:
int
&
iDialogStatus
=
SF
->
getSAMP
(
)
->
getDialog
(
)
->
iIsActive
;
поставил, перед каждый вводом проверка, снова краш
Receiver
25.05.2019, 17:21
Фулл код дай.
Не достаточно просто вставить...
Код:
if (SF->getSAMP()->getDialog()->iIsActive && SF->getSAMP()->getDialog()->DialogID == 1 && work_started)
{
const auto myTask = []()
{
int &iDialogStatus = SF->getSAMP()->getDialog()->iIsActive;
if (iDialogStatus)
{
Sleep(599);
SF->getSAMP()->getDialog()->SetInputText("1");
}
if (iDialogStatus)
{
Sleep(200);
SF->getSAMP()->getDialog()->SetInputText("2");
}
if (iDialogStatus)
{
Sleep(300);
SF->getSAMP()->getDialog()->SetInputText("3");
}
if (iDialogStatus)
{
Sleep(100;
SF->getSAMP()->getDialog()->SetInputText("4");
}
if (iDialogStatus)
{
Sleep(555);
SF->getSAMP()->getDialog()->SetInputText("5");
}
};
std::thread(myTask).detach();
}
}
Фулл код дай.
Не достаточно просто вставить...
может объяснишь чё не так ?
Код:
if (SF->getSAMP()->getDialog()->iIsActive && SF->getSAMP()->getDialog()->DialogID == 1 && work_started)
{
const auto myTask = []()
{
int &iDialogStatus = SF->getSAMP()->getDialog()->iIsActive;
if (iDialogStatus)
{
Sleep(599);
SF->getSAMP()->getDialog()->SetInputText("1");
}
if (iDialogStatus)
{
Sleep(200);
SF->getSAMP()->getDialog()->SetInputText("2");
}
if (iDialogStatus)
{
Sleep(300);
SF->getSAMP()->getDialog()->SetInputText("3");
}
if (iDialogStatus)
{
Sleep(100;
SF->getSAMP()->getDialog()->SetInputText("4");
}
if (iDialogStatus)
{
Sleep(555);
SF->getSAMP()->getDialog()->SetInputText("5");
}
};
std::thread(myTask).detach();
}
}
может объяснишь чё не так ?
Всё...
Receiver
25.05.2019, 19:33
Всё...
а конкретнее ?
я прекрасно знаю что в моём коде происходит пиздец ;d это рофел, вот тебе норм код:
Код:
if (SF->getSAMP()->getDialog()->iIsActive && (SF->getSAMP()->getDialog()->DialogID == 9089 || SF->getSAMP()->getDialog()->DialogID == 9090) && work_started)
{
const auto myTask = []()
{
Sleep(100);
SF->getSAMP()->getDialog()->SetInputText("1");
Sleep(200);
SF->getSAMP()->getDialog()->SetInputText("1");
};
std::thread(myTask).detach();
}
}
зависает игра, приходится через диспетчер офать
Чтобы самому понять, что и где не так - воспользуйтесь отладкой. Люди на форуме - не компиляторы и не дебаггеры.
https://blast.hk/threads/20320/
Receiver
25.05.2019, 20:15
Код:
void CALLBACK mainloop()
{
if (SF->getSAMP()->getDialog()->iIsActive && SF->getSAMP()->getDialog()->DialogID == 1 && work_started)
{
SF->getSAMP()->getDialog()->SetInputText("1");
// нужна задержка в 5000 мс. перед вводом.
SF->getSAMP()->getDialog()->SetInputText("2");
}
}
нужен таймер без заморозки основного потока. (игры)
поток – краш.
таймер – краш. (https://www.blast.hk/redirect/aHR0cHM6Ly9wcm8tcHJvZi5jb20vZm9ydW1zL3RvcGljL2NwbH VzcGx1cy10aW1lcg)
Код:
void CALLBACK mainloop()
{
if (SF->getSAMP()->getDialog()->iIsActive && SF->getSAMP()->getDialog()->DialogID == 1 && work_started)
{
SF->getSAMP()->getDialog()->SetInputText("1");
// нужна задержка в 5000 мс. перед вводом.
SF->getSAMP()->getDialog()->SetInputText("2");
}
}
нужен таймер без заморозки основного потока. (игры)
поток – краш.
таймер – краш. (https://www.blast.hk/redirect/aHR0cHM6Ly9wcm8tcHJvZi5jb20vZm9ydW1zL3RvcGljL2NwbH VzcGx1cy10aW1lcg)
C++:
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
!
GAME
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
init
=
true
;
}
if
(
SF
->
getSAMP
(
)
->
getDialog
(
)
->
iIsActive
&&
SF
->
getSAMP
(
)
->
getDialog
(
)
->
DialogID
==
1
)
{
static
bool
state
=
false
;
static
DWORD dwTime
=
0
;
if
(
!
state
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"1"
)
;
state
=
true
;
dwTime
=
GetTickCount
(
)
;
}
else
if
(
state
&&
GetTickCount
(
)
-
dwTime
>
5000
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"2"
)
;
state
=
false
;
}
}
}
Receiver
25.05.2019, 21:52
C++:
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
!
GAME
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
init
=
true
;
}
if
(
SF
->
getSAMP
(
)
->
getDialog
(
)
->
iIsActive
&&
SF
->
getSAMP
(
)
->
getDialog
(
)
->
DialogID
==
1
)
{
static
bool
state
=
false
;
static
DWORD dwTime
=
0
;
if
(
!
state
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"1"
)
;
state
=
true
;
dwTime
=
GetTickCount
(
)
;
}
else
if
(
state
&&
GetTickCount
(
)
-
dwTime
>
5000
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"2"
)
;
state
=
false
;
}
}
}
Код:
switch (state)
{
case 0: dwTime = GetTickCount(); state ++;
case 1:
{
if (GetTickCount() - dwTime > 500)
{
sprintf(result, "%c", text[0]);
SF->getSAMP()->getDialog()->SetInputText(result);
state ++;
dwTime = GetTickCount();
}
}
case 2:
{
if (GetTickCount() - dwTime > 600)
{
sprintf(result, "%c%c", text[0], text[1]);
SF->getSAMP()->getDialog()->SetInputText(result);
state ++;
dwTime = GetTickCount();
}
}
}
если в стриме 5-6 игроков, то скрипт сбивается
видимо TickCount плохая идея
тупо нужен таймер, который игру бы не крашил
Receiver
25.05.2019, 22:05
У тебя взаимодействий с игроками нет...
Кидай полный код откуда мы можем знать что у тебя еще есть?
C++:
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
255
,
55
,
55
)
,
"***ня загружена."
)
;
init
=
true
;
}
if
(
SF
->
getSAMP
(
)
->
getDialog
(
)
->
iIsActive
&&
(
SF
->
getSAMP
(
)
->
getDialog
(
)
->
DialogID
==
1
)
{
static
DWORD dwTime
=
0
;
char
result
[
5
]
;
char
*
text
=
"лох"
;
static
int
state
=
0
;
switch
(
state
)
{
case
0
:
dwTime
=
GetTickCount
(
)
;
state
++
;
case
1
:
{
if
(
GetTickCount
(
)
-
dwTime
>
500
)
{
sprintf
(
result
,
"%c"
,
text
[
0
]
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
result
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
case
2
:
{
if
(
GetTickCount
(
)
-
dwTime
>
600
)
{
sprintf
(
result
,
"%c%c"
,
text
[
0
]
,
text
[
1
]
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
result
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
case
3
:
{
if
(
GetTickCount
(
)
-
dwTime
>
700
)
{
sprintf
(
result
,
"%c%c%c"
,
text
[
0
]
,
text
[
1
]
,
text
[
2
]
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
result
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
}
char
result2
[
255
]
;
sprintf
(
result2
,
"%d | %d | %d"
,
GetTickCount
(
)
,
GetTickCount
(
)
-
dwTime
,
state
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
result2
)
;
}
}
если в зоне стрима есть человек, то скрипт сразу переходит к state 3, то есть вводу последнего символа
Receiver
25.05.2019, 22:33
Cам код - полный ужас. Если делаешь клики диалогов делай это в хуке
C++:
if
(
GetTickCount
(
)
-
dwTime
>
timer
[
0
]
)
// warning C4018: >: несоответствие типов со знаком и без знака
я заметил что когда у меня задержка на каждом символе одинаковая, то все нормально.
если же разная, то эти символы вводятся без задержки. Что за бред блинблять
if (GetTickCount() - dwTime > timer[0]) // warning C4018: >: несоответствие типов со знаком и без знака
if (GetTickCount() - dwTime > (DWORD)timer[0])
Как заставить vector и string в std выделять динамическую память, а не стек?
Как заставить vector и string в std выделять динамическую память, а не стек?
Динамически выделить std::string или std::vector
C++:
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
255
,
55
,
55
)
,
"***ня загружена."
)
;
init
=
true
;
}
if
(
SF
->
getSAMP
(
)
->
getDialog
(
)
->
iIsActive
&&
(
SF
->
getSAMP
(
)
->
getDialog
(
)
->
DialogID
==
1
)
{
static
DWORD dwTime
=
0
;
char
result
[
5
]
;
char
*
text
=
"лох"
;
static
int
state
=
0
;
switch
(
state
)
{
case
0
:
dwTime
=
GetTickCount
(
)
;
state
++
;
case
1
:
{
if
(
GetTickCount
(
)
-
dwTime
>
500
)
{
sprintf
(
result
,
"%c"
,
text
[
0
]
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
result
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
case
2
:
{
if
(
GetTickCount
(
)
-
dwTime
>
600
)
{
sprintf
(
result
,
"%c%c"
,
text
[
0
]
,
text
[
1
]
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
result
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
case
3
:
{
if
(
GetTickCount
(
)
-
dwTime
>
700
)
{
sprintf
(
result
,
"%c%c%c"
,
text
[
0
]
,
text
[
1
]
,
text
[
2
]
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
result
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
}
char
result2
[
255
]
;
sprintf
(
result2
,
"%d | %d | %d"
,
GetTickCount
(
)
,
GetTickCount
(
)
-
dwTime
,
state
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
result2
)
;
}
}
если в зоне стрима есть человек, то скрипт сразу переходит к state 3, то есть вводу последнего символа
Ты забыл оператор break после case X:
C++:
switch
(
a
)
{
case
0
:
{
// code
}
break
;
case
1
:
{
// code
}
break
;
}
DarkP1xel
26.05.2019, 00:51
Динамически выделить std::string или std::vector
Ты забыл оператор break после case X:
C++:
switch
(
a
)
{
case
0
:
{
// code
}
break
;
case
1
:
{
// code
}
break
;
}
Он должен стоять внутри конструкции.
Он должен стоять внутри конструкции.
Если ты про скобки после case - то их можно вообще не ставить, и break может быть хоть в них, хоть за ними.
C++:
for
(
int
i
=
0
;
i
Вывод:
Код:
[CODE]
Switch test 0: 1 2 3
Switch test 1: 2 3
Switch test 2: 3
Switch test 3: 4
DarkP1xel
26.05.2019, 01:56
Если ты про скобки после case - то их можно вообще не ставить
Причем тут синтаксис? При использовании многослойного switch/case, внешний break нарушит слой и произойдет незапланированный выход. Зачем лишний раз себе палку в колеса пихать?
Причем тут синтаксис? При использовании многослойного switch/case, внешний break нарушит слой и произойдет незапланированный выход. Зачем лишний раз себе палку в колеса пихать?
Можешь привести пример того, где break нарушит слой?
Receiver
26.05.2019, 09:49
C++:
static
DWORD dwTime
=
0
;
switch
(
state
)
{
case
0
:
dwTime
=
GetTickCount
(
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
""
)
;
state
++
;
case
1
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_1
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"Л"
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
case
2
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_2
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"О"
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
case
3
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_3
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"Х"
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
case
6
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_4
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
Close
(
1
)
;
state
=
0
;
}
}
}
Скрипт моментально вводит слово и переходит к state 6 (закрытию диалога), как пофиксеть
C++:
static
DWORD dwTime
=
0
;
switch
(
state
)
{
case
0
:
dwTime
=
GetTickCount
(
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
""
)
;
state
++
;
case
1
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_1
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"Л"
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
case
2
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_2
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"О"
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
case
3
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_3
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"Х"
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
case
6
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_4
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
Close
(
1
)
;
state
=
0
;
}
}
}
Скрипт моментально вводит слово и переходит к state 6 (закрытию диалога), как пофиксеть
C++:
static
DWORD dwTime
=
0
;
switch
(
state
)
{
case
0
:
dwTime
=
GetTickCount
(
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
""
)
;
state
++
;
break
;
case
1
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_1
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"Л"
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
break
;
case
2
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_2
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"О"
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
break
;
case
3
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_3
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
SetInputText
(
"Х"
)
;
state
++
;
dwTime
=
GetTickCount
(
)
;
}
}
break
;
case
6
:
{
if
(
GetTickCount
(
)
-
dwTime
>
(
DWORD
)
cc_delay_4
)
{
SF
->
getSAMP
(
)
->
getDialog
(
)
->
Close
(
1
)
;
state
=
0
;
}
}
break
;
}
Vadim.dll
28.05.2019, 23:18
Как запустить ЖТА и пропустить всю фигню вначале?
У меня получилось убрать меню и перейти сразу к загрузке, но там начинается катсцена и жта виснет. Как ее пропустить, что нужно занопить?
Как запустить ЖТА и пропустить всю фигню вначале?
У меня получилось убрать меню и перейти сразу к загрузке, но там начинается катсцена и жта виснет. Как ее пропустить, что нужно занопить?
https://github.com/Whitetigerswt/gtasa_crashfix/blob/master/crashes/crashes/quickload.cpp#L104
Vadim.dll
29.05.2019, 00:41
https://github.com/Whitetigerswt/gtasa_crashfix/blob/master/crashes/crashes/quickload.cpp#L104
Не то, я имел ввиду, как пропустить вот эту шнягу:
1
Receiver
30.05.2019, 23:16
C++:
bool
RegWriteInt
(
HKEY key
,
const
char
*
name
,
int
value
)
{
DWORD val
=
value
;
return
RegSetValueExA
(
key
,
name
,
0
,
REG_DWORD
,
(
byte
*
)
&
val
,
1
)
==
ERROR_SUCCESS
;
}
bool
RegReadInt
(
HKEY key
,
const
char
*
name
,
int
&
value
)
{
DWORD val
=
0
,
type
=
REG_DWORD
,
size
=
4
;
bool
result
=
RegQueryValueExA
(
key
,
name
,
NULL
,
&
type
,
(
byte
*
)
&
val
,
&
size
)
==
ERROR_SUCCESS
;
value
=
val
;
return
result
;
}
нужно сделать чтение и запись int в реестр, не работает, что не так ?
Неадекватная сова
30.05.2019, 23:19
C++:
bool
RegWriteInt
(
HKEY key
,
const
char
*
name
,
int
value
)
{
DWORD val
=
value
;
return
RegSetValueExA
(
key
,
name
,
0
,
REG_DWORD
,
(
byte
*
)
&
val
,
1
)
==
ERROR_SUCCESS
;
}
bool
RegReadInt
(
HKEY key
,
const
char
*
name
,
int
&
value
)
{
DWORD val
=
0
,
type
=
REG_DWORD
,
size
=
4
;
bool
result
=
RegQueryValueExA
(
key
,
name
,
NULL
,
&
type
,
(
byte
*
)
&
val
,
&
size
)
==
ERROR_SUCCESS
;
value
=
val
;
return
result
;
}
нужно сделать чтение и запись int в реестр, не работает, что не так ?
https://blast.hk/threads/13855/
TheRuthArbiter
31.05.2019, 12:49
Почему такая ошибка при компиляции? Windows SDK есть.
https://forum.antichat.xyz/attachments/27345081/
Почему такая ошибка при компиляции? Windows SDK есть.
Целевая платформа в свойствах проекта верно стоит?
TheRuthArbiter
31.05.2019, 13:14
Скорее всего не установлены компоненты для работы с C++ при установке студии либо DirectX 9-12
всё установлено.
Целевая платформа в свойствах проекта верно стоит?
https://forum.antichat.xyz/attachments/27345088/
Там вроде ничего не выставишь
Я переоткрыл проект, в итоге вот:
https://forum.antichat.xyz/attachments/27345088/
всё установлено.
Там вроде ничего не выставишь
Я переоткрыл проект, в итоге вот:
Ты его с архива открываешь?
всё установлено.
Там вроде ничего не выставишь
Я переоткрыл проект, в итоге вот:
При установке студии надо установить запусти установщик и установи компоненты для работы с C++ которые у тебя не установлены
TheRuthArbiter
31.05.2019, 13:39
Ты его с архива открываешь?
При установке студии надо установить запусти установщик и установи компоненты для работы с C++ которые у тебя не установлены
не с архива. Я НАПИСАЛ: ВСЕ КОМПОНЕНТЫ УСТАНОВЛЕНЫ УЖЕ!
не с архива. Я НАПИСАЛ: ВСЕ КОМПОНЕНТЫ УСТАНОВЛЕНЫ УЖЕ!
Поставь в настройках проекта сдк и набор инструментов платформы на те которые у тебя есть
TheRuthArbiter
31.05.2019, 14:07
Поставь в настройках проекта сдк и набор инструментов платформы на те которые у тебя есть
спасибо)
Receiver
02.06.2019, 17:06
https://pp.userapi.com/c851436/v851436935/13de36/UaZ64nlFUbE.jpg
выводит "не удалось подключица к серверу", почему так?
https://pp.userapi.com/c851436/v851436935/13de36/UaZ64nlFUbE.jpg
выводит "не удалось подключица к серверу", почему так?
https удалить?
Receiver
02.06.2019, 17:44
https удалить?
удали пожалуйсто :pidrila:
помогите тогда написать https клиент на сокетах
Receiver
02.06.2019, 18:01
Чем тебя curl не устраивает?
запариваться с установкой надо.
Как прочитать txt файл с сервера ?
Как правильно считать память?
Пытался через следующее:
Код:
[CODE]
void getDialogTitle()
{
DWORD dwAddress;
ReadProcessMemory(g_Handle, (LPCVOID)(g_Samp + 0x21A0B8), &dwAddress, 4, 0);
char message[128];
ReadProcessMemory(g_Handle, (LPCVOID)(dwAddress + 0x40), &message, 128, 0);
std::cout
Но message пустое...
P.S. Адреса взял из AHK UDF.
[QUOTE="2Shae"]
Как правильно считать память?
Пытался через следующее:
Код:
[CODE]
void getDialogTitle()
{
DWORD dwAddress;
ReadProcessMemory(g_Handle, (LPCVOID)(g_Samp + 0x21A0B8), &dwAddress, 4, 0);
char message[128];
ReadProcessMemory(g_Handle, (LPCVOID)(dwAddress + 0x40), &message, 128, 0);
std::cout
Проверьте хендл gta и адрес samp.dll на валидность. Уточнить причину ошибки можно вызовом GetLastError (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG 93cy9kZXNrdG9wL2FwaS9lcnJoYW5kbGluZ2FwaS9uZi1lcnJo YW5kbGluZ2FwaS1nZXRsYXN0ZXJyb3I).
Вот что выдёт через cout
https://forum.antichat.xyz/attachments/27346305/
Код:
[CODE]
DWORD procID;
HWND hWnd = FindWindowA(NULL, "GTA:SA:MP");
GetWindowThreadProcessId(hWnd, &procID);
std::cout
Функция get_module с форума, судя по отписям рабочая.
Receiver
03.06.2019, 10:32
C++:
HINTERNET hInternet
=
InternetOpenW
(
L
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36"
,
INTERNET_OPEN_TYPE_PRECONFIG
,
NULL
,
NULL
,
0
)
;
wchar_t
*
hdrs
=
L
"Content-Type: application/x-www-form-urlencoded"
;
DWORD dwFlags
=
INTERNET_FLAG_PRAGMA_NOCACHE
|
INTERNET_FLAG_NO_CACHE_WRITE
;
if
(
hInternet
==
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
255
,
55
,
55
)
,
"Error code #1"
)
;
}
else
{
HINTERNET hConnect
=
InternetConnectW
(
hInternet
,
L
"сайт/"
,
INTERNET_DEFAULT_HTTP_PORT
,
NULL
,
NULL
,
INTERNET_SERVICE_HTTP
,
0
,
NULL
)
;
if
(
hConnect
==
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
255
,
55
,
55
)
,
"Error code #2"
)
;
}
else
{
const
wchar_t
*
parrAcceptTypes
[
]
=
{
L
"text/*"
,
NULL
}
;
HINTERNET hRequest
=
HttpOpenRequestW
(
hConnect
,
L
"GET"
,
L
"/akks.txt"
,
NULL
,
NULL
,
parrAcceptTypes
,
dwFlags
,
0
)
;
if
(
hRequest
==
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
255
,
55
,
55
)
,
"Error code #3"
)
;
}
else
{
BOOL bRequestSent
=
HttpSendRequestW
(
hRequest
,
hdrs
,
wcslen
(
hdrs
)
,
NULL
,
NULL
)
;
if
(
!
bRequestSent
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
255
,
55
,
55
)
,
"Error code #4"
)
;
}
else
{
std
::
string strResponse
;
const
int
nBuffSize
=
1024
;
char
buff
[
nBuffSize
]
;
BOOL bKeepReading
=
true
;
DWORD dwBytesRead
=
-
1
;
while
(
bKeepReading
&&
dwBytesRead
!=
0
)
{
bKeepReading
=
InternetReadFile
(
hRequest
,
buff
,
nBuffSize
,
&
dwBytesRead
)
;
strResponse
.
append
(
buff
,
dwBytesRead
)
;
}
if
(
!
strstr
(
buff
,
"bfabfabfa"
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
255
,
55
,
55
)
,
"Error code #5"
)
;
}
}
InternetCloseHandle
(
hRequest
)
;
}
InternetCloseHandle
(
hConnect
)
;
}
InternetCloseHandle
(
hInternet
)
;
}
это подключение к сайту и получение файла с аккаунтами,
все бы ничего, но у людей с антивирусами, антистиллерами и фаерволами, постоянно блочит отправку запроса (Error code #2 & #3)
можно как нибудь это обойти?
Прошу помочь с адаптацией данного кода на SAMPFUNCS (C++):
CLEO:
{$CLEO .cs}
//-------------MAIN---------------
thread
"map"
0000:
NOP
wait
2000
if
0AAB:
file_exists
"CLEO\map.ini"
else_jump
@Label0000A3
0AF4:
4@v
= read_string_from_ini_file
"cleo\map.ini"
section
"MAP"
key
"file"
0AF0:
28@
= get_int_from_ini_file
"cleo\map.ini"
section
"MAP"
key
"key"
0AF0:
29@
= get_int_from_ini_file
"cleo\map.ini"
section
"MAP"
key
"alpha"
0AF0:
27@
= get_int_from_ini_file
"cleo\map.ini"
section
"MAP"
key
"toggle"
:Label0000A3
0390:
load_txd_dictionary
"MAP"
038F:
load_texture
4@v
as
1
// Load dictionary with 0390 first
038F:
load_texture
"pla"
as
2
// Load dictionary with 0390 first
038F:
load_texture
"MAR"
as
3
// Load dictionary with 0390 first
:Label0000C3
wait
0
call
@Label0005AC
1
0
if
and
27@
==
1
key_down
28@
else_jump
@Label000117
call
@Label000462
0
30@
if
30@
==
0
else_jump
@Label000117
0B12:
31@
=
31@
XOR
1
wait
100
:Label000117
if
and
31@
==
1
27@
==
1
else_jump
@Label000149
call
@Label0005AC
1
1
call
@Label00019F
1
29@
:Label000149
if
and
27@
==
0
key_down
28@
else_jump
@Label000198
call
@Label000462
0
30@
if
30@
==
0
else_jump
@Label000198
call
@Label0005AC
1
1
call
@Label00019F
1
29@
:Label000198
jump
@Label0000C3
:Label00019F
03F0:
enable_text_draw
1
03E3:
set_texture_to_be_drawn_antialiased
1
038D:
draw_texture
1
position
320.0
224.0
size
448.0
448.0
RGBA
255
255
255
0@
call
@Label0002C5
0
23@
24@
25@
if
and
not
23@
==
0.0
not
24@
==
0.0
else_jump
@Label000204
gosub
@Label0003A3
:Label000204
0A8D:
30@
= read_memory
13098730
size
1
virtual_protect
0
if
30@
==
1
else_jump
@Label00025D
call
@Label0004B5
0
23@
24@
25@
if
and
not
23@
==
0.0
not
24@
==
0.0
else_jump
@Label00025D
gosub
@Label0003A3
:Label00025D
Actor.StorePos(
$PLAYER_ACTOR
,
1@
,
2@
,
3@
)
3@
= Actor.Angle(
$PLAYER_ACTOR
)
3@
-=
180.0
3@
*= -
1.0
0@
=
2
gosub
@Label00040C
if
0AB6:
store_target_marker_coords_to
1@
2@
3@
// IF and SET
else_jump
@Label0002C0
0@
=
3
3@
=
0
gosub
@Label00040C
:Label0002C0
ret
0
:Label0002C5
12@
=
9999.0
0@
=
0
:Label0002D6
0085:
1@
=
0@
// (int)
1@
*=
56
1@
+=
13103448
1@
+=
16
0A8D:
2@
= read_memory
1@
size
4
virtual_protect
0
1@
+=
4
0A8D:
3@
= read_memory
1@
size
4
virtual_protect
0
1@
+=
4
0A8D:
4@
= read_memory
1@
size
4
virtual_protect
0
Actor.StorePos(
$PLAYER_ACTOR
,
5@
,
6@
,
7@
)
050A:
8@
= distance_between_XYZ
2@
3@
4@
and_XYZ
5@
6@
7@
if
0025:
12@
>
8@
// (float)
else_jump
@Label000380
0087:
12@
=
8@
// (float)
0087:
9@
=
2@
// (float)
0087:
10@
=
3@
// (float)
0087:
11@
=
4@
// (float)
:Label000380
0@
+=
1
0@
>
31
else_jump
@Label0002D6
ret
3
9@
10@
11@
:Label0003A3
23@
/=
13.4
23@
+=
320.0
24@
/= -
13.4
24@
+=
224.0
03F0:
enable_text_draw
1
03E3:
set_texture_to_be_drawn_antialiased
1
038E:
draw_box_position
23@
24@
size
6.0
6.0
RGBA
0
0
0
255
038E:
draw_box_position
23@
24@
size
5.0
5.0
RGBA
255
0
0
255
return
:Label00040C
1@
/=
13.4
1@
+=
320.0
2@
/= -
13.4
2@
+=
224.0
03F0:
enable_text_draw
0
03E3:
set_texture_to_be_drawn_antialiased
1
074B:
draw_texture
0@
position
1@
2@
scale
10.0
10.0
angle
3@
color_RGBA
255
255
255
255
return
:Label000462
0AA2:
1@
= load_library
"samp.dll"
// IF and SET
1@
+=
2203880
0A8D:
1@
= read_memory
1@
size
4
virtual_protect
0
1@
+=
8
0A8D:
1@
= read_memory
1@
size
4
virtual_protect
0
1@
+=
4
0A8D:
1@
= read_memory
1@
size
1
virtual_protect
0
ret
1
1@
:Label0004B5
10@
=
13098328
6@
=
0
:Label0004C6
0085:
14@
=
6@
// (int)
14@
*=
160
0A8E:
13@
=
10@
+
14@
// int
0A8E:
11@
=
13@
+
48
// int
0A8D:
3@
= read_memory
11@
size
4
virtual_protect
0
0A8E:
11@
=
13@
+
52
// int
0A8D:
4@
= read_memory
11@
size
4
virtual_protect
0
0A8E:
11@
=
13@
+
56
// int
0A8D:
5@
= read_memory
11@
size
4
virtual_protect
0
if
and
not
3@
==
0.0
not
4@
==
0.0
else_jump
@Label000589
if
or
3@
==
1099.551
4@
==
1601.497
5@
==
11.44687
3@
==
2695.624
4@
== -
1704.688
5@
==
10.844
else_jump
@Label00059E
:Label000589
6@
+=
1
6@
>
32
else_jump
@Label0004C6
:Label00059E
ret
3
3@
4@
5@
:Label0005AC
0AA2:
1@
= load_library
"samp.dll"
// IF and SET
1@
+=
2203876
0A8D:
1@
= read_memory
1@
size
4
virtual_protect
0
1@
+=
8
if
0@
==
1
else_jump
@Label0005FC
0A8C:
write_memory
1@
size
4
value
0
virtual_protect
1
jump
@Label000607
:Label0005FC
0A8C:
write_memory
1@
size
4
value
2
virtual_protect
1
:Label000607
ret
0
-raymond-
04.06.2019, 10:07
где скачать исходник asi плагина с game api и samp api?
Как отправить пулю в игрока? Не на буллет синхре, а через getsamp. На луа есть типа setcharammo. А нужно сделать как-то на c++
Помогите пожалуйста ImGui не ладит с русскими символами.
Это добавил.
C++:
case
WM_CHAR
:
wchar_t
wch
;
MultiByteToWideChar
(
CP_ACP
,
MB_PRECOMPOSED
,
(
char
*
)
&
wParam
,
1
,
&
wch
,
1
)
;
io
.
AddInputCharacter
(
wch
)
;
break
;
В ImGui все нормально.
https://i.imgur.com/XMwE5EY.jpg
А вот, что записывается в переменную.
https://i.imgur.com/ITo2IHR.jpg
C++:
char
g_SMSMessage
[
5
]
[
512
]
=
{
""
,
""
,
""
,
""
,
""
}
;
ImGui
::
InputText
(
"1"
,
g_SMSMessage
[
i
]
,
_countof
(
g_SMSMessage
[
i
]
)
)
;
Неадекватная сова
04.06.2019, 19:51
Помогите пожалуйста ImGui не ладит с русскими символами.
Это добавил.
C++:
case
WM_CHAR
:
wchar_t
wch
;
MultiByteToWideChar
(
CP_ACP
,
MB_PRECOMPOSED
,
(
char
*
)
&
wParam
,
1
,
&
wch
,
1
)
;
io
.
AddInputCharacter
(
wch
)
;
break
;
В ImGui все нормально.
https://i.imgur.com/XMwE5EY.jpg
А вот, что записывается в переменную.
https://i.imgur.com/ITo2IHR.jpg
C++:
char
g_SMSMessage
[
5
]
[
512
]
=
{
""
,
""
,
""
,
""
,
""
}
;
ImGui
::
InputText
(
"1"
,
g_SMSMessage
[
i
]
,
_countof
(
g_SMSMessage
[
i
]
)
)
;
C++:
string
UTF8ToANSI
(
string s
)
{
BSTR bstrWide
;
char
*
pszAnsi
;
int
nLength
;
const
char
*
pszCode
=
s
.
c_str
(
)
;
nLength
=
MultiByteToWideChar
(
CP_UTF8
,
0
,
pszCode
,
strlen
(
pszCode
)
+
1
,
NULL
,
NULL
)
;
bstrWide
=
SysAllocStringLen
(
NULL
,
nLength
)
;
MultiByteToWideChar
(
CP_UTF8
,
0
,
pszCode
,
strlen
(
pszCode
)
+
1
,
bstrWide
,
nLength
)
;
nLength
=
WideCharToMultiByte
(
CP_ACP
,
0
,
bstrWide
,
-
1
,
NULL
,
0
,
NULL
,
NULL
)
;
pszAnsi
=
new
char
[
nLength
]
;
WideCharToMultiByte
(
CP_ACP
,
0
,
bstrWide
,
-
1
,
pszAnsi
,
nLength
,
NULL
,
NULL
)
;
SysFreeString
(
bstrWide
)
;
string
r
(
pszAnsi
)
;
delete
[
]
pszAnsi
;
return
r
;
}
Receiver
05.06.2019, 19:38
C++:
bool
functeion_crash
=
false
;
ImGui
::
Checkbox
(
"Крашить игроков"
,
&
functeion_crash
)
;
reg
->
SetRegister
(
"crashit"
,
REG_DWORD
,
&
functeion_crash
)
;
Вместо 1 и 0, в реестр сохраняется 17601 и 17602, как это исправить ?
C++:
bool
functeion_crash
=
false
;
ImGui
::
Checkbox
(
"Крашить игроков"
,
&
functeion_crash
)
;
reg
->
SetRegister
(
"crashit"
,
REG_DWORD
,
&
functeion_crash
)
;
Вместо 1 и 0, в реестр сохраняется 17601 и 17602, как это исправить ?
Измени тип переменной на DWORD
With SFPlugin C++:
How to get the vehicle of the vehicle I enter in?
How to send it through T> {enter}?
With SFPlugin C++:
How to get the vehicle of the vehicle I enter in?
How to send it through T> {enter}?
u can hook RPC_EnterVehicle:
Код:
bool CALLBACK outRPC(stRakNetHookParams *params)
{
if (params->packetId == RPCEnumeration::RPC_EnterVehicle)
{
int16 vehID;
bool asPassenger;
char buf[255];
params->bitStream->ResetReadPointer();
params->bitStream->Read(vehID);
params->bitStream->Read(asPassenger);
params->bitStream->ResetReadPointer();
sprintf(buf, "I enter the car ID: %i", vehID);
SF->getSAMP()->getPlayers()->pLocalPlayer->Say(buf);
};
return true;
};
SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHO OK_TYPE_OUTCOMING_RPC, outRPC); // in mainloop()
Receiver
06.06.2019, 12:21
Измени тип переменной на DWORD
C++:
DWORD functeion_crash
=
false
;
ImGui
::
Checkbox
(
"Крашить игроков"
,
&
functeion_crash
)
;
SetRegister
(
"crashit"
,
REG_DWORD
,
&
functeion_crash
)
;
Код:
error C2664: "bool ImGui::Checkbox(const char *,bool *)": невозможно преобразовать аргумент 2 из "DWORD *" в "bool *"
error C2664: "bool ImGui::Checkbox(const char *,bool *)": невозможно преобразовать аргумент 2 из "DWORD *" в "bool *"
у тебя обьявление функции в "DWORD" должна бить в "bool"
Неадекватная сова
06.06.2019, 16:48
Как чисто по адресам памяти (сигнлплеер) заморозить игрока (отключить ему все анимации, например бега, прыжка и т.п.)? Я хочу сделать айрбрейк, всё работает, но анимации сильно (очень сильно) мешают, меняя направление движения.
C++:
#define FUNC_MakePlayerSafe 0x56e870
#define ACTOR_POINTER_SELF 0x00B7CD98
void
GTAfunc_TogglePlayerControllable
(
bool
bToggle
)
{
DWORD func
=
FUNC_MakePlayerSafe
;
float
fTen
=
10.0f
;
_asm
{
mov ecx
,
ACTOR_POINTER_SELF
push fTen
push bToggle
call func
}
}
static
bool
state
=
false
;
state
^=
true
;
GTAfunc_TogglePlayerControllable
(
state
?
1
:
0
)
;
How can I edit a text before sending it to server?
If I type [/command someText] i want to edit it into: [/command Some text!].
I mean I want to parse and edit the text before sending it to server.
Receiver
06.06.2019, 20:58
C++:
DWORD functeion_crash
=
false
;
ImGui
::
Checkbox
(
"Крашить игроков"
,
&
functeion_crash
)
;
SetRegister
(
"crashit"
,
REG_DWORD
,
&
functeion_crash
)
;
Код:
error C2664: "bool ImGui::Checkbox(const char *,bool *)": невозможно преобразовать аргумент 2 из "DWORD *" в "bool *"
>> Проблема не решена.
Что я делаю не так? Очень странно всё работает (может я дебил, не исключено). Жмёшь стрелку вверх - едет вниз, жмёшь стрелку вниз - едет вниз, WASD вообще почти ничего не делают (только если в прыжке включить пролетит немного и остановится в воздухе).
C++:
void
Airbreak
(
)
{
DWORD CPed
=
*
(
DWORD
*
)
0xB6F5F0
;
GTAfunc_TogglePlayerControllable
(
1
)
;
byte mod
=
20
;
while
(
1
)
{
if
(
aAirbreak
==
0
)
{
break
;
GTAfunc_TogglePlayerControllable
(
0
)
;
}
DWORD x
=
(
CPed
+
0x14
)
+
0x30
;
DWORD y
=
(
CPed
+
0x14
)
+
0x34
;
DWORD z
=
(
CPed
+
0x14
)
+
0x38
;
if
(
GetAsyncKeyState
(
0x57
)
)
{
// W
x
+=
mod
;
*
(
DWORD
*
)
x
=
x
;
}
if
(
GetAsyncKeyState
(
0x53
)
)
{
// S
x
-=
mod
;
*
(
DWORD
*
)
x
=
x
;
}
if
(
GetAsyncKeyState
(
0x41
)
)
{
// A
y
+=
mod
;
*
(
DWORD
*
)
y
=
y
;
}
if
(
GetAsyncKeyState
(
0x44
)
)
{
// D
y
-=
mod
;
*
(
DWORD
*
)
y
=
y
;
}
if
(
GetAsyncKeyState
(
VK_UP
)
)
{
// Arrow up
z
+=
mod
;
*
(
DWORD
*
)
z
=
z
;
}
if
(
GetAsyncKeyState
(
VK_DOWN
)
)
{
// Arrow down
z
-=
mod
;
*
(
DWORD
*
)
z
=
z
;
}
// это чтоб не падал и не двигался сам по себе никуда
*
(
DWORD
*
)
x
=
x
;
*
(
DWORD
*
)
y
=
y
;
*
(
DWORD
*
)
z
=
z
;
}
return
;
}
https://git.prime-hack.net/SR_team/AirBreak_exe/src/branch/master/airbreak.cpp#L314 (https://www.blast.hk/redirect/aHR0cHM6Ly9naXQucHJpbWUtaGFjay5uZXQvU1JfdGVhbS9BaX JCcmVha19leGUvc3JjL2JyYW5jaC9tYXN0ZXIvYWlyYnJlYWsu Y3BwI0wzMTQ)
>> Проблема не решена.
C++:
ImGui
::
Checkbox
(
"Крашить игроков"
,
(
bool
*
)
&
functeion_crash
)
;
[QUOTE="Vesca"]
How can I edit a text before sending it to server?
If I type [/command someText] i want to edit it into: [/command Some text!].
I mean I want to parse and edit the text before sending it to server.
You should hook the outcomimg RPC_ServerCommamd
-raymond-
07.06.2019, 07:48
как в имгуи преобразовать цвет из rgba в ImVec2? Есть ли генератор такого цвета?
как в имгуи преобразовать цвет из rgba в ImVec2? Есть ли генератор такого цвета?
мб в ImVec4? в полезных функциях вроде был сниппет.
Receiver
07.06.2019, 13:14
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
DWORD strlen
;
char
string
[
2048
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
strlen
)
;
params
->
bitStream
->
Read
(
string
,
strlen
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"дебаг"
)
;
if
(
!
strcmp
(
string
,
"Server closed the connection."
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Сервер закрыл соединение"
)
;
}
}
return
true
;
}
В чат выводит "дебаг", но "Сервер закрыл соединение" - нет. Почему так ?
-raymond-
07.06.2019, 14:08
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
DWORD strlen
;
char
string
[
2048
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
strlen
)
;
params
->
bitStream
->
Read
(
string
,
strlen
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"дебаг"
)
;
if
(
!
strcmp
(
string
,
"Server closed the connection."
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Сервер закрыл соединение"
)
;
}
}
return
true
;
}
В чат выводит "дебаг", но "Сервер закрыл соединение" - нет. Почему так ?
вроде нельзя этот текст хукнуть через raknet
мб в ImVec4? в полезных функциях вроде был сниппет.
да в imvec4
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
DWORD strlen
;
char
string
[
2048
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
strlen
)
;
params
->
bitStream
->
Read
(
string
,
strlen
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"дебаг"
)
;
if
(
!
strcmp
(
string
,
"Server closed the connection."
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Сервер закрыл соединение"
)
;
}
}
return
true
;
}
В чат выводит "дебаг", но "Сервер закрыл соединение" - нет. Почему так ?
отлавливай через структуру чата либо через хук DISCONNECTION_NOTIFICATION
How to hook the outcomimg RPC_ServerCommamd?
Receiver
07.06.2019, 14:58
отлавливай через структуру чата либо через хук DISCONNECTION_NOTIFICATION
Даже если другой текст ввести туда, то всё равно не сравниваются строки
Как отловить сообщение и сравнить с помощью strcmp ?
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
DWORD strlen
;
char
string
[
2048
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
strlen
)
;
params
->
bitStream
->
Read
(
string
,
strlen
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"дебаг"
)
;
if
(
!
strcmp
(
string
,
"Server closed the connection."
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Сервер закрыл соединение"
)
;
}
}
return
true
;
}
В чат выводит "дебаг", но "Сервер закрыл соединение" - нет. Почему так ?
1. не правильно читаешь
2. Server closed the connection не приходит в RPC_ScrClientMessage
Receiver
07.06.2019, 15:47
1. не правильно читаешь
2. Server closed the connection не приходит в RPC_ScrClientMessage
Без разницы на этот клосед коннекцион, как любое другое сообщение отловить и сравнить ?
Без разницы на этот клосед коннекцион, как любое другое сообщение отловить и сравнить ?
C++:
uint strLen
,
color
;
char
szMsg
[
144
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
strLen
)
;
if
(
strLen
>=
sizeof
(
szMsg
)
)
strLen
=
sizeof
(
szMsg
)
-
1
;
params
->
bitStream
->
Read
(
szMsg
,
strLen
)
;
szMsg
[
strLen
]
=
'\0'
;
if
(
strstr
(
szMsg
,
"text"
)
)
{
// ...
}
Receiver
07.06.2019, 17:43
C++:
uint strLen
,
color
;
char
szMsg
[
144
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
strLen
)
;
if
(
strLen
>=
sizeof
(
szMsg
)
)
strLen
=
sizeof
(
szMsg
)
-
1
;
params
->
bitStream
->
Read
(
szMsg
,
strLen
)
;
szMsg
[
strLen
]
=
'\0'
;
if
(
strstr
(
szMsg
,
"text"
)
)
{
// ...
}
не работает, ничего не происходит
каллбэк регаю, хз в чём проблема
C++:
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
_=Gigant=_
07.06.2019, 20:37
Без разницы на этот клосед коннекцион, как любое другое сообщение отловить и сравнить ?
http://www.cplusplus.com/reference/cstring/strcmp/ (https://www.blast.hk/redirect/aHR0cDovL3d3dy5jcGx1c3BsdXMuY29tL3JlZmVyZW5jZS9jc3 RyaW5nL3N0cmNtcC8)
не работает, ничего не происходит
каллбэк регаю, хз в чём проблема
C++:
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
C++:
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
size_t len
;
DWORD color
;
char
message
[
256
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
len
)
;
params
->
bitStream
->
Read
(
message
,
len
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
message
[
len
]
=
'\0'
;
if
(
strcmp
(
message
,
"cakebou"
)
==
0
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Got it!"
)
;
}
}
;
не работает, ничего не происходит
каллбэк регаю, хз в чём проблема
C++:
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
Если что функция strcmp проверяет целую строку, а strstr проверяет часть строки
How to hook the outcomimg RPC_ServerCommamd?
Receiver
08.06.2019, 09:41
C++:
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
size_t len
;
DWORD color
;
char
message
[
256
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
len
)
;
params
->
bitStream
->
Read
(
message
,
len
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
message
[
len
]
=
'\0'
;
if
(
strcmp
(
message
,
"cakebou"
)
==
0
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Got it!"
)
;
}
}
;
Если что функция strcmp проверяет целую строку, а strstr проверяет часть строки
И так и так проверял, не работает, он читает другие строки чата, но почему-то не сравнивает.
Это проблема появилась после подключения имгуи к проекту.
Возможно это из-за того что сравнивает с текстом на кириллице.
Как отобразить курсор при активном меню ImGui и спрятать его, когда оно закрыто?
_=Gigant=_
08.06.2019, 18:39
Как отобразить курсор при активном меню ImGui и спрятать его, когда оно закрыто?
C++:
static
int
mouse_imgui_menu
=
2
;
if
(
bShow_ImGui_Menu
)
{
mouse_imgui_menu
=
0
;
toggleSAMPCursor
(
1
)
;
}
else
{
if
(
mouse_imgui_menu
==
0
)
{
toggleSAMPCursor
(
0
)
;
mouse_imgui_menu
++
;
}
}
Потому что ImGui работает только с UTF-8.
ImGui::Text(u8"Русский язык");
ImGui::Text(u8"Чек-Текст");
ImGui::Button(u8"Закрыть", ImVec2(75, 20)); - не пашет, все равно вопросы вместо текста.
UPD:
C++:
ImFontConfig font_config
;
font_config
.
OversampleH
=
1
;
font_config
.
OversampleV
=
1
;
font_config
.
PixelSnapH
=
1
;
static
const
ImWchar ranges
[
]
=
{
0x0020
,
0x00FF
,
// Basic Latin + Latin Supplement
0x0400
,
0x044F
,
// Cyrillic
0
,
}
;
io
.
Fonts
->
AddFontFromFileTTF
(
"C:\\Windows\\Fonts\\Tahoma.ttf"
,
16.0f
,
&
font_config
,
ranges
)
;
Есть еще решения проблемы, кроме предложенных?
ImGui::Text(u8"Чек-Текст");
ImGui::Button(u8"Закрыть", ImVec2(75, 20)); - не пашет, все равно вопросы вместо текста.
UPD:
C++:
ImFontConfig font_config
;
font_config
.
OversampleH
=
1
;
font_config
.
OversampleV
=
1
;
font_config
.
PixelSnapH
=
1
;
static
const
ImWchar ranges
[
]
=
{
0x0020
,
0x00FF
,
// Basic Latin + Latin Supplement
0x0400
,
0x044F
,
// Cyrillic
0
,
}
;
io
.
Fonts
->
AddFontFromFileTTF
(
"C:\\Windows\\Fonts\\Tahoma.ttf"
,
16.0f
,
&
font_config
,
ranges
)
;
Есть еще решения проблемы, кроме предложенных?
Должно работать, может, у тебя в коде есть еще загрузки шрифтов, убедись, что этот шрифт загружается последним или что установлен именно этот шрифт.
И попробуй сделать так
C++:
io
.
FontDefault
=
io
.
Fonts
->
AddFontFromFileTTF
(
fontPath
,
16
,
&
font_config
,
io
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
Чем этот не подходит?
1 - u8"Text" отказывается работать (ImGUI v1.71)
2 - занимает несколько строк при инициализации, но работает. Стало интересно какие еще решения есть
1 - u8"Text" отказывается работать (ImGUI v1.71)
2 - занимает несколько строк при инициализации, но работает. Стало интересно какие еще решения есть
дефолтный шрифт имгуи не поддерживает кириллицу, какие тут ещё могут быть решения?
Неадекватная сова
09.06.2019, 16:43
ImGui::Text(u8"Чек-Текст");
ImGui::Button(u8"Закрыть", ImVec2(75, 20)); - не пашет, все равно вопросы вместо текста.
UPD:
C++:
ImFontConfig font_config
;
font_config
.
OversampleH
=
1
;
font_config
.
OversampleV
=
1
;
font_config
.
PixelSnapH
=
1
;
static
const
ImWchar ranges
[
]
=
{
0x0020
,
0x00FF
,
// Basic Latin + Latin Supplement
0x0400
,
0x044F
,
// Cyrillic
0
,
}
;
io
.
Fonts
->
AddFontFromFileTTF
(
"C:\\Windows\\Fonts\\Tahoma.ttf"
,
16.0f
,
&
font_config
,
ranges
)
;
Есть еще решения проблемы, кроме предложенных?
После всех include"ов вставь и глянь:
C++:
#pragma execution_character_set("utf-8")
В c++ проекте на linux мне попалась вот такая интересная строка:
C++:
std
::
string mainXML
=
#include
"Main.xml"
;
Однако, в винде среда считает её ошибкой. Подскажите, есть вариант в винде так же через дефайн загружать содержимое файла в string, без открытия и чтения?
В c++ проекте на linux мне попалась вот такая интересная строка:
C++:
std
::
string mainXML
=
#include
"Main.xml"
;
Однако, в винде среда считает её ошибкой. Подскажите, есть вариант в винде так же через дефайн загружать содержимое файла в string, без открытия и чтения?
Чем тебе с чтением не нравится?
В c++ проекте на linux мне попалась вот такая интересная строка:
C++:
std
::
string mainXML
=
#include
"Main.xml"
;
Однако, в винде среда считает её ошибкой. Подскажите, есть вариант в винде так же через дефайн загружать содержимое файла в string, без открытия и чтения?
file.cpp
C++:
R"(int function(int a , int b){
return a + b;
})"
main.cpp
C++:
int
main
(
)
{
const
char
*
file
=
{
#include "file.h"
}
;
printf
(
"%s\n"
,
file
)
;
system
(
"pause"
)
;
return
0
;
}
Receiver
10.06.2019, 19:02
как эмулировать нажатие клавишы N без зависания игры в mainloop с повторением ?
как эмулировать нажатие клавишы N без зависания игры в mainloop с повторением ?
emulategtakey, синхра, win api функции + timer
как эмулировать нажатие клавишы N без зависания игры в mainloop с повторением ?
C++:
void
EmulKey
(
int
KeyId
)
{
stOnFootData sync
;
memset
(
&
sync
,
0
,
sizeof
(
stOnFootData
)
)
;
sync
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
;
sync
.
sKeys
=
KeyId
;
BitStream bsActorSync
;
bsActorSync
.
Write
(
(
BYTE
)
ID_PLAYER_SYNC
)
;
bsActorSync
.
Write
(
(
PCHAR
)
&
sync
,
sizeof
(
stOnFootData
)
)
;
SF
->
getRakNet
(
)
->
SendPacket
(
&
bsActorSync
)
;
}
Эмуляция с помощью синхры
emulategtakey, синхра, win api функции + timer
C++:
void
EmulKey
(
int
KeyId
)
{
stOnFootData sync
;
memset
(
&
sync
,
0
,
sizeof
(
stOnFootData
)
)
;
sync
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
;
sync
.
sKeys
=
KeyId
;
BitStream bsActorSync
;
bsActorSync
.
Write
(
(
BYTE
)
ID_PLAYER_SYNC
)
;
bsActorSync
.
Write
(
(
PCHAR
)
&
sync
,
sizeof
(
stOnFootData
)
)
;
SF
->
getRakNet
(
)
->
SendPacket
(
&
bsActorSync
)
;
}
Эмуляция с помощью синхры
C++:
static
int
time
=
0
;
if
(
GetTickCount
(
)
-
1000
>
time
)
{
time
=
GetTickCount
(
)
;
EmulKey
(
/* id клавиши */
)
;
}
// эмуляция нажатия клавиши 1 раз в секунду
Receiver
11.06.2019, 11:24
emulategtakey, синхра, win api функции + timer
C++:
void
EmulKey
(
int
KeyId
)
{
stOnFootData sync
;
memset
(
&
sync
,
0
,
sizeof
(
stOnFootData
)
)
;
sync
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
;
sync
.
sKeys
=
KeyId
;
BitStream bsActorSync
;
bsActorSync
.
Write
(
(
BYTE
)
ID_PLAYER_SYNC
)
;
bsActorSync
.
Write
(
(
PCHAR
)
&
sync
,
sizeof
(
stOnFootData
)
)
;
SF
->
getRakNet
(
)
->
SendPacket
(
&
bsActorSync
)
;
}
Эмуляция с помощью синхры
C++:
static
int
time
=
0
;
if
(
GetTickCount
(
)
-
1000
>
time
)
{
time
=
GetTickCount
(
)
;
EmulKey
(
/* id клавиши */
)
;
}
// эмуляция нажатия клавиши 1 раз в секунду
и какой ид клавиши N ?
Receiver
12.06.2019, 20:29
Хукай онфут дату (id_player_sync )и выводи значение клавиши .
, я с телефона щас так бы написал код
не ебу как это сделать, не работал с пакетами, запрашиваю у вас код клавиши
Неадекватная сова
12.06.2019, 22:03
не ебу как это сделать, не работал с пакетами, запрашиваю у вас код клавиши
С твоим "не ебу как сделать", ты ничего не добьешься. Хукай пакет ID_PLAYER_SYNC выводя в чат параметр stKeys
не ебу как это сделать, не работал с пакетами, запрашиваю у вас код клавиши
https://blast.hk/wiki/tutorials:api_lesson_raknet
из аси можно вызвать клео опкод?
DarkP1xel
13.06.2019, 07:45
из аси можно вызвать клео опкод?
Да.
rraggerr
13.06.2019, 16:01
Есть .asi, нужно чтобы он заменил другой файл .asi в папке с игрой на свой, как такое реализовать на С++?
никак, после загрузки, пока аси не выгрузится, его нельзя будет заменить
CleanLegend
13.06.2019, 16:12
Есть .asi, нужно чтобы он заменил другой файл .asi в папке с игрой на свой, как такое реализовать на С++?
Выделить виртуальную память,заполнить ее твоей функцией, получить адреса функций и параметры, запустить поток и передать аргументы в виде структуры(адреса функций и параметры для них)
как....?
Получить адрес функции вызова опкода и вызвать её
и какой ид клавиши N ?
Клавиши N/Y проверяются через currentweaponid
CleanLegend
13.06.2019, 16:14
а теперь, если можно, в код...
https://blast.hk/threads/33035/
CleanLegend
13.06.2019, 16:19
@CleanLegend (https://www.blast.hk/members/268/) делал гайд по выгрузке
тут есть пример https://blast.hk/threads/34101/
для библиотеки вызываешь FreeLibrary прям из нее,перед этим нужно еще снять хуки
хорошо, а есть какая-то функция чтобы предотвратить загрузку другого .asi ?
Загрузка dll происходит через WinAPI функцию LoadLibrary, хукаешь ее и не даешь загружаться
тут есть пример https://blast.hk/threads/34101/
для библиотеки вызываешь FreeLibrary прям из нее,перед этим нужно еще снять хуки
Загрузка dll происходит через WinAPI функцию LoadLibrary, хукаешь ее и не даешь загружаться
*супер обход пикселя*
Receiver
14.06.2019, 17:43
С твоим "не ебу как сделать", ты ничего не добьешься. Хукай пакет ID_PLAYER_SYNC выводя в чат параметр stKeys
при нажатии на N - 0, при нажатии на пробел - 32
C++:
bool
CALLBACK
outcomingData
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
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
(
)
;
// снова обнуляем оффсет чтения
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
255
,
255
,
0
)
,
"nazhata klavisha: %d"
,
data
.
sKeys
)
;
// выводим ***ню на экран
}
;
return
true
;
// успешно завершаем отправку пакета
}
;
при нажатии на N - 0, при нажатии на пробел - 32
C++:
bool
CALLBACK
outcomingData
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
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
(
)
;
// снова обнуляем оффсет чтения
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
255
,
255
,
0
)
,
"nazhata klavisha: %d"
,
data
.
sKeys
)
;
// выводим ***ню на экран
}
;
return
true
;
// успешно завершаем отправку пакета
}
;
Нажатия клавиш N и Y передаются через элемент byteCurrentWeapon, номер клавиши N - 128
С чего начинать делать софты для SAMPA?
rraggerr
14.06.2019, 21:17
С чего начинать делать софты для SAMPA?
с основ
У кого-нибудь есть адреса, чтобы узнать ид педа в которого выстрельнул с оружия?
(для одиночки нужно, не samp)
-raymond-
15.06.2019, 13:30
возникла проблема с imgui
создал 2 поля inputtext
https://i.imgur.com/WVl94oi.png
при нажатии на поле логина вводить ничего нельзя, при нажатии на поле пароля я ввожу свой текст, указывая при этом флаг ImGuiInputTextFlags_Password, и этот же текст дублируется в поле логина но уже не зашифрованный
код:
C++:
ImGui
::
Begin
(
NAME_LOADER
,
&
open
,
ImVec2
(
WINDOW_WIDTH
,
WINDOW_HEIGHT
)
,
1.0f
,
dwWindowFlag
)
;
{
ImVec2 size_item
;
size_item
=
ImGui
::
CalcTextSize
(
u8
"Логин"
)
;
ImGui
::
SetCursorPosX
(
(
ImGui
::
GetWindowWidth
(
)
-
size_item
.
x
)
/
2
)
;
ImGui
::
SetCursorPosY
(
(
ImGui
::
GetWindowHeight
(
)
-
size_item
.
y
)
/
2
)
;
ImGui
::
Text
(
u8
"Логин"
)
;
static
char
login_text
[
32
]
;
ImGui
::
PushItemWidth
(
ImGui
::
GetWindowWidth
(
)
-
200
)
;
ImGui
::
SetCursorPosX
(
(
ImGui
::
GetWindowWidth
(
)
-
ImGui
::
CalcItemWidth
(
)
)
/
2
)
;
ImGui
::
InputText
(
u8
""
,
login_text
,
32
,
ImGuiInputTextFlags_CharsHexadecimal
)
;
ImGui
::
PopItemWidth
(
)
;
size_item
=
ImGui
::
CalcTextSize
(
u8
"Пароль"
)
;
ImGui
::
SetCursorPosX
(
(
ImGui
::
GetWindowWidth
(
)
-
size_item
.
x
)
/
2
)
;
ImGui
::
Text
(
u8
"Пароль"
)
;
static
char
password_text
[
32
]
;
ImGui
::
PushItemWidth
(
ImGui
::
GetWindowWidth
(
)
-
200
)
;
ImGui
::
SetCursorPosX
(
(
ImGui
::
GetWindowWidth
(
)
-
ImGui
::
CalcItemWidth
(
)
)
/
2
)
;
ImGui
::
InputText
(
u8
""
,
password_text
,
32
,
ImGuiInputTextFlags_CharsHexadecimal
|
ImGuiInputTextFlags_Password
)
;
ImGui
::
PopItemWidth
(
)
;
}
ImGui
::
End
(
)
;
Musaigen
15.06.2019, 13:34
возникла проблема с imgui
создал 2 поля inputtext
https://i.imgur.com/WVl94oi.png
при нажатии на поле логина вводить ничего нельзя, при нажатии на поле пароля я ввожу свой текст, указывая при этом флаг ImGuiInputTextFlags_Password, и этот же текст дублируется в поле логина но уже не зашифрованный
код:
C++:
ImGui
::
Begin
(
NAME_LOADER
,
&
open
,
ImVec2
(
WINDOW_WIDTH
,
WINDOW_HEIGHT
)
,
1.0f
,
dwWindowFlag
)
;
{
ImVec2 size_item
;
size_item
=
ImGui
::
CalcTextSize
(
u8
"Логин"
)
;
ImGui
::
SetCursorPosX
(
(
ImGui
::
GetWindowWidth
(
)
-
size_item
.
x
)
/
2
)
;
ImGui
::
SetCursorPosY
(
(
ImGui
::
GetWindowHeight
(
)
-
size_item
.
y
)
/
2
)
;
ImGui
::
Text
(
u8
"Логин"
)
;
static
char
login_text
[
32
]
;
ImGui
::
PushItemWidth
(
ImGui
::
GetWindowWidth
(
)
-
200
)
;
ImGui
::
SetCursorPosX
(
(
ImGui
::
GetWindowWidth
(
)
-
ImGui
::
CalcItemWidth
(
)
)
/
2
)
;
ImGui
::
InputText
(
u8
""
,
login_text
,
32
,
ImGuiInputTextFlags_CharsHexadecimal
)
;
ImGui
::
PopItemWidth
(
)
;
size_item
=
ImGui
::
CalcTextSize
(
u8
"Пароль"
)
;
ImGui
::
SetCursorPosX
(
(
ImGui
::
GetWindowWidth
(
)
-
size_item
.
x
)
/
2
)
;
ImGui
::
Text
(
u8
"Пароль"
)
;
static
char
password_text
[
32
]
;
ImGui
::
PushItemWidth
(
ImGui
::
GetWindowWidth
(
)
-
200
)
;
ImGui
::
SetCursorPosX
(
(
ImGui
::
GetWindowWidth
(
)
-
ImGui
::
CalcItemWidth
(
)
)
/
2
)
;
ImGui
::
InputText
(
u8
""
,
password_text
,
32
,
ImGuiInputTextFlags_CharsHexadecimal
|
ImGuiInputTextFlags_Password
)
;
ImGui
::
PopItemWidth
(
)
;
}
ImGui
::
End
(
)
;
Названия измени в инпуте на ##1 и ##2
Как это будет на SF/C++ ?
Lua:
getOffsetFromCharInWorldCoords
Как это будет на SF/C++ ?
Lua:
getOffsetFromCharInWorldCoords
PEDSELF->GetPosition() + CVector(x, y, z)
как можно сделать линию только не на екране а в 3d?
как можно сделать линию только не на екране а в 3d?
Перевести 3д координаты в 2д и отрисовать по этим координатам линию
как можно сделать линию только не на екране а в 3d?
C++:
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
enpos
[
0
]
,
enpos
[
1
]
,
enpos
[
2
]
,
&
screen
[
0
]
,
&
screen
[
1
]
)
;
Update: enpos - 3д коорды , которые нужно перевести , screen - куда будут записаны 2д коорды
Перевести 3д координаты в 2д и отрисовать по этим координатам линию
А в 3d никак ?
А как узнать что обьект на екране?
И есть ли в SF массив со всема обектами, и массив c текстами (label)
А в 3d никак ?
А как узнать что обьект на екране?
И есть ли в SF массив со всема обектами, и массив c текстами (label)
C++:
CPed
*
Pedself
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
;
if
(
Pedself
->
IsOnScreen
(
)
)
{
//Код
}
C++:
CPed
*
Pedself
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
;
if
(
Pedself
->
IsOnScreen
(
)
)
{
//Код
}
А это точно код который проверяет что объект на экране?
https://dev.prineside.com/ru/gtasa_samp_model_id/ (https://www.blast.hk/redirect/aHR0cHM6Ly9kZXYucHJpbmVzaWRlLmNvbS9ydS9ndGFzYV9zYW 1wX21vZGVsX2lkLw)
Ой , не правильно прочитал , сейчас
Нашел
C++:
bool
IsOnScreen
(
DWORD OBJECT
)
{
DWORD dwFunc
=
FUNC_IsVisible
;
DWORD dwThis
=
(
DWORD
)
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
->
object
[
OBJECT
]
->
pGTAEntity
;
bool
bReturn
=
false
;
_asm
{
mov ecx
,
dwThis
call dwFunc
mov bReturn
,
al
}
return
bReturn
;
}
Нашел
C++:
bool
IsOnScreen
(
DWORD OBJECT
)
{
DWORD dwFunc
=
FUNC_IsVisible
;
DWORD dwThis
=
(
DWORD
)
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
->
object
[
OBJECT
]
->
pGTAEntity
;
bool
bReturn
=
false
;
_asm
{
mov ecx
,
dwThis
call dwFunc
mov bReturn
,
al
}
return
bReturn
;
}
C++:
bool
OnScreen
(
CVector vect
)
{
SF
->
getCLEO
(
)
->
callOpcode
(
"00C2: %f %f %f 0.0"
,
vect
.
fX
,
vect
.
fY
,
vect
.
fZ
)
;
return
SF
->
getCLEO
(
)
->
GetCondResult
(
)
;
}
Или так
А в 3d никак ?
А как узнать что обьект на екране?
И есть ли в SF массив со всема обектами, и массив c текстами (label)
Не так сказал, есть ли в SF массив со всема созданными сервером объектами, и массив c текстами (label) (типа в зоне стрима)
__________
Нашел
Приветствую. Хочу развёрнутый ответ на вопрос: как найти базовый адрес samp.dll (в CE можно сразу писать "samp.dll + ...[смещение"). Плиз, помогите =)
Плиз, помогите =)
Здравствуйте) Хотелось бы посоветовать использовать след. WinAPI ф-ции
https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-getmodulehandlea (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG 93cy9kZXNrdG9wL2FwaS9saWJsb2FkZXJhcGkvbmYtbGlibG9h ZGVyYXBpLWdldG1vZHVsZWhhbmRsZWE)
https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-getmodulehandleexa (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG 93cy9kZXNrdG9wL2FwaS9saWJsb2FkZXJhcGkvbmYtbGlibG9h ZGVyYXBpLWdldG1vZHVsZWhhbmRsZWV4YQ)
Пример использования в собейте
https://github.com/BlastHackNet/mod...6f567b5391b0b2a6dc8/src/cheat_funcs.cpp#L3102 (https://github.com/BlastHackNet/mod_s0beit_sa-1/blob/dc9b3b13599a8b6325e566f567b5391b0b2a6dc8/src/cheat_funcs.cpp#L3102)
https://github.com/BlastHackNet/mod...b6325e566f567b5391b0b2a6dc8/src/samp.cpp#L178 (https://github.com/BlastHackNet/mod_s0beit_sa-1/blob/dc9b3b13599a8b6325e566f567b5391b0b2a6dc8/src/samp.cpp#L178)
писать "samp.dll + ...[смещение"
Только не забывайте, что такая арифметика в языке С иногда не работает так, как предполагается: арифметика указателей в C всегда автоматически масштабируется под размер объектов, на которые ссылается указатель
Здравствуйте) Хотелось бы посоветовать использовать след. WinAPI ф-ции
https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-getmodulehandlea (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG 93cy9kZXNrdG9wL2FwaS9saWJsb2FkZXJhcGkvbmYtbGlibG9h ZGVyYXBpLWdldG1vZHVsZWhhbmRsZWE)
https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-getmodulehandleexa (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG 93cy9kZXNrdG9wL2FwaS9saWJsb2FkZXJhcGkvbmYtbGlibG9h ZGVyYXBpLWdldG1vZHVsZWhhbmRsZWV4YQ)
Пример использования в собейте
https://github.com/BlastHackNet/mod...6f567b5391b0b2a6dc8/src/cheat_funcs.cpp#L3102 (https://github.com/BlastHackNet/mod_s0beit_sa-1/blob/dc9b3b13599a8b6325e566f567b5391b0b2a6dc8/src/cheat_funcs.cpp#L3102)
https://github.com/BlastHackNet/mod...b6325e566f567b5391b0b2a6dc8/src/samp.cpp#L178 (https://github.com/BlastHackNet/mod_s0beit_sa-1/blob/dc9b3b13599a8b6325e566f567b5391b0b2a6dc8/src/samp.cpp#L178)
Только не забывайте, что такая арифметика в языке С иногда не работает так, как предполагается: арифметика указателей в C всегда автоматически масштабируется под размер объектов, на которые ссылается указатель
Спасибо за всё, но я так нифига и не понял.
Объясняю свою ситуацию. Я прочитал на различных форумах, как искать базовый адрес (ну + смещения и указатели) и начал искать базовый адрес информации игрока (SAMP), чтобы он него оттолкнуться и найти твой текущий ID (и я его нашёл). Выглядит оно примерно так (в кавычках БА): [samp.dll + 0x151434] + 0x2F1C -> указатель на ID. Теперь хочу написать на С++ программу, которая будет искать мой ID и сохранять его в какую-либо переменную (через ReadProcessMemory). Суть в том, что надо искать смещение для "samp.dll". Пожалуйста, покажите какой-либо готовый код (он же там не длинный), либо функцию, которая, зная хэндл ГТАшки, кидает мне БА сампа.длл. Буду очень благодарен =)
В телеграмм скинул тебе
Lua:
setCharHeading
Какая альтернатива этому есть вC++/SF?
Ответа не нашел
Ответа не нашел
C++:
SF
->
getGame
(
)
->
actorInfoGet
(
ACTOR_SELF
,
0
)
->
base
.
m_heading
как можно изменить 3dText c какимто айдишником?
как можно изменить 3dText c какимто айдишником?
C++:
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
ID
]
C++:
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
ID
]
я так делал, не выходит, это просто информация
я так делал, не выходит, это просто информация
Я не понял, что ты хочешь
Я не понял, что ты хочешь
У меня есть айди 3d текста который пришел с сервера, мне нужно изменить в нём текст, и установить другую максимальную дальность видимости текста, хукать RPC и изменять данные RPC пакета не вариант потому что плагин могут загрузить когда RPC уже придет, поэтому я прохожусь по всем 3dtext там и ищу нужній мне и после того когда я нашел нужнужный я хочу изменить в нём текст, и установить другую максимальную дальность видимости текста
У меня есть айди 3d текста который пришел с сервера, мне нужно изменить в нём текст, и установить другую максимальную дальность видимости текста, хукать RPC и изменять данные RPC пакета не вариант потому что плагин могут загрузить когда RPC уже придет, поэтому я прохожусь по всем 3dtext там и ищу нужній мне и после того когда я нашел нужнужный я хочу изменить в нём текст, и установить другую максимальную дальность видимости текста
C++:
strcpy
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
ID
]
.
pText
,
TEXT
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
ID
]
.
fMaxViewDistance
=
DISTANCE
C++:
strcpy
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
ID
]
.
pText
,
TEXT
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
ID
]
.
fMaxViewDistance
=
DISTANCE
Не робит:sad_frog2:
C++:
strcat
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
s
]
.
pText
,
"\n"
)
;
strcat
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
s
]
.
pText
,
temp
)
;
strcat
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
s
]
.
pText
,
" / "
)
;
strcat
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
s
]
.
pText
,
(
ksh
->
GetState
(
)
==
0
?
"Unsigned"
:
(
ksh
->
GetState
(
)
==
2
?
"Vyros"
:
"Scoro vyroste"
)
)
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
s
]
.
fMaxViewDistance
=
299.
;
---------------------
Сори, протупил все чётко работает
Receiver
17.06.2019, 18:36
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
size_t len
;
DWORD color
;
char
zq_message
[
256
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
len
)
;
params
->
bitStream
->
Read
(
zq_message
,
len
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
zq_message
[
len
]
=
'\0'
;
// strstr(zq_message, "[Информация] {FFFFFF}Поздравляю! Теперь этот бизнес ваш!")
if
(
!
strcmp
(
zq_message
,
"[Информация] {FFFFFF}Поздравляю! Теперь этот дом"
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Вы купили дом за 1.3124 мс."
)
;
}
}
;
return
true
;
}
не работает, сообщение 100% правильное
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
size_t len
;
DWORD color
;
char
zq_message
[
256
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
len
)
;
params
->
bitStream
->
Read
(
zq_message
,
len
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
zq_message
[
len
]
=
'\0'
;
// strstr(zq_message, "[Информация] {FFFFFF}Поздравляю! Теперь этот бизнес ваш!")
if
(
!
strcmp
(
zq_message
,
"[Информация] {FFFFFF}Поздравляю! Теперь этот дом"
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Вы купили дом за 1.3124 мс."
)
;
}
}
;
return
true
;
}
не работает, сообщение 100% правильное
замени !strcmp на strstr
Receiver
17.06.2019, 18:46
замени !strcmp на strstr
Не работает
Не работает
Замени size_t на DWORD
C++:
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
Функа
)
;
и ты это сделал?
Receiver
17.06.2019, 19:03
Замени size_t на DWORD
C++:
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
Функа
)
;
и ты это сделал?
Да, сделал.
Спасибо за всё, но я так нифига и не понял.
Объясняю свою ситуацию. Я прочитал на различных форумах, как искать базовый адрес (ну + смещения и указатели) и начал искать базовый адрес информации игрока (SAMP), чтобы он него оттолкнуться и найти твой текущий ID (и я его нашёл). Выглядит оно примерно так (в кавычках БА): [samp.dll + 0x151434] + 0x2F1C -> указатель на ID. Теперь хочу написать на С++ программу, которая будет искать мой ID и сохранять его в какую-либо переменную (через ReadProcessMemory). Суть в том, что надо искать смещение для "samp.dll". Пожалуйста, покажите какой-либо готовый код (он же там не длинный), либо функцию, которая, зная хэндл ГТАшки, кидает мне БА сампа.длл. Буду очень благодарен =)
UP
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
size_t len
;
DWORD color
;
char
zq_message
[
256
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
len
)
;
params
->
bitStream
->
Read
(
zq_message
,
len
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
zq_message
[
len
]
=
'\0'
;
// strstr(zq_message, "[Информация] {FFFFFF}Поздравляю! Теперь этот бизнес ваш!")
if
(
!
strcmp
(
zq_message
,
"[Информация] {FFFFFF}Поздравляю! Теперь этот дом"
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Вы купили дом за 1.3124 мс."
)
;
}
}
;
return
true
;
}
не работает, сообщение 100% правильное
Вроде бы код правильный. Проверь, вызывается ли incomingRPC вовсе.
Receiver
17.06.2019, 19:54
Вроде бы код правильный. Проверь, вызывается ли incomingRPC вовсе.
Да, вызывается. Перестало работать после подключения имгуи
В сф некоторых структурах есть массив matrix что в нем, для чего он?
В сф некоторых структурах есть массив matrix что в нем, для чего он?
Это матрица, которая хранит в себе числовые характеристики, она представлена в виде 2 х мерной структуры, в сампе в ней хранятся всякие позиции/углы и т.д
В сф некоторых структурах есть массив matrix что в нем, для чего он?
Можно сказать классификация, насколько я помню
https://forum.antichat.xyz/attachments/27354255/
как можно узнать ModelID котороя приходит в вот этом(верхнем) пакете, но не по средствам перехвата RPC а через структуры
C++:
SAMPFUNCS
,
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
->
object
[
s
]
->
iModel
вот это не то там хранится id модели которая приходит в вот этом пакете я спрашиваю потому что ModelID одинаковая а объекты разные потому что приходит пакет SetPlayerObjectMaterial, можно как то определить текущий modelID
https://forum.antichat.xyz/attachments/27354255/
Здрасте, как уменьшить sliderint?
https://forum.antichat.xyz/attachments/27354489/
C++:
ImGui
::
SliderInt
(
"Fov"
,
&
Cvars
::
fov
,
90
,
180
)
;
-raymond-
18.06.2019, 20:40
есть ли в собейте функция чтобы узнать ид игрока по нику? или самому сделать
Здрасте, как уменьшить sliderint?
C++:
ImGui
::
SliderInt
(
"Fov"
,
&
Cvars
::
fov
,
90
,
180
)
;
ImGui::PushItemWidth
есть ли в собейте функция чтобы узнать ид игрока по нику? или самому сделать
в собейте нет. самому сделать несложно.
Код:
int getPlayerIDFromName(char *PlayerName)
{
for (int id = 0; id SAMP_MAX_PLAYERS)
return NULL;
if (iPlayerID SAMP_MAX_PLAYERS)
return NULL;
if (iPlayerID == g_Players->sLocalPlayerID)
return g_Players->strLocalPlayerName.c_str();
if (g_Players->pRemotePlayer[iPlayerID] == NULL)
return NULL;
return g_Players->pRemotePlayer[iPlayerID]->strPlayerName.c_str();
}
как можно узнать ModelID котороя приходит в вот этом(верхнем) пакете, но не по средствам перехвата RPC а через структуры
без хуков никак. на основе пришедшего идентификатора модели сразу же создается текстура и информация о нем нигде не сохраняется
-raymond-
19.06.2019, 08:06
в собейте нет. самому сделать несложно.
Код:
int getPlayerIDFromName(char *PlayerName)
{
for (int id = 0; id SAMP_MAX_PLAYERS)
return NULL;
if (iPlayerID SAMP_MAX_PLAYERS)
return NULL;
if (iPlayerID == g_Players->sLocalPlayerID)
return g_Players->strLocalPlayerName.c_str();
if (g_Players->pRemotePlayer[iPlayerID] == NULL)
return NULL;
return g_Players->pRemotePlayer[iPlayerID]->strPlayerName.c_str();
}
мог бы не расписывать, сам знаю что парсить всех игроков надо, но все равно благодарю
Receiver
19.06.2019, 18:47
При чём тут гуй к хукам ракнета?
Собейт установлен?
Почему тут просто "этот дом"? strcmp не ищет подстроки если чо я же писал тебе.
Скопируй полностью строку из chatlog.txt
Собейт не установлен, "этот дом" потому что пробовал полностью - тоже не работает.
Собейт не установлен, "этот дом" потому что пробовал полностью - тоже не работает.
Как оно должно заработать если строка не полная ?! Уже сколько раз отвечал как работает функция strcmp и strstr
У кого-то руки не от туда растут, скорее всего
Собейт не установлен, "этот дом" потому что пробовал полностью - тоже не работает.
Приложи фулл код плагина
Receiver
21.06.2019, 12:56
Как оно должно заработать если строка не полная ?! Уже сколько раз отвечал как работает функция strcmp и strstr
У кого-то руки не от туда растут, скорее всего
Приложи фулл код плагина
C++:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
size_t len
;
DWORD color
;
char
message
[
256
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
len
)
;
params
->
bitStream
->
Read
(
message
,
len
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DOM ne BAYED"
)
;
// [Информация] {FFFFFF}Поздравляю! Теперь этот бизнес ваш!
if
(
strcmp
(
message
,
"[Информация] {FFFFFF}Поздравляю! Теперь этот дом ваш"
)
==
0
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DOM BAYED"
)
;
char
result
[
12
]
;
strcat
(
message
,
" [1.9741]"
)
;
return
1
;
}
}
;
return
1
;
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
init
=
true
;
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
switch
(
dwReasonForCall
)
{
case
DLL_PROCESS_ATTACH
:
SF
->
initPlugin
(
mainloop
,
hModule
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}
всегда дом не байед блеать
C++:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
size_t len
;
DWORD color
;
char
message
[
256
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
len
)
;
params
->
bitStream
->
Read
(
message
,
len
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DOM ne BAYED"
)
;
// [Информация] {FFFFFF}Поздравляю! Теперь этот бизнес ваш!
if
(
strcmp
(
message
,
"[Информация] {FFFFFF}Поздравляю! Теперь этот дом ваш"
)
==
0
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DOM BAYED"
)
;
char
result
[
12
]
;
strcat
(
message
,
" [1.9741]"
)
;
return
1
;
}
}
;
return
1
;
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
init
=
true
;
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
switch
(
dwReasonForCall
)
{
case
DLL_PROCESS_ATTACH
:
SF
->
initPlugin
(
mainloop
,
hModule
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}
всегда дом не байед блеать
Значит не правильная строка о покупке дома. Попробуй выводить переменную message в чат и копировать строку о покупке дома из нее
iAmerican
22.06.2019, 10:41
Как это будет на сф/C++?
C++:
vect2_dist
vect3_copy
в собейте посмотри
Receiver
22.06.2019, 10:42
Значит не правильная строка о покупке дома. Попробуй выводить переменную message в чат и копировать строку о покупке дома из нее
та же самая строка получаеца
Roger571
22.06.2019, 11:06
та же самая строка получаеца
Сомневаюсь, что из-за этого, но все же.
Какая кодировка проекта стоит?
Свойства -> Общие -> Набор знаков
Неадекватная сова
22.06.2019, 13:24
C++:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
size_t len
;
DWORD color
;
char
message
[
256
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
len
)
;
params
->
bitStream
->
Read
(
message
,
len
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DOM ne BAYED"
)
;
// [Информация] {FFFFFF}Поздравляю! Теперь этот бизнес ваш!
if
(
strcmp
(
message
,
"[Информация] {FFFFFF}Поздравляю! Теперь этот дом ваш"
)
==
0
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DOM BAYED"
)
;
char
result
[
12
]
;
strcat
(
message
,
" [1.9741]"
)
;
return
1
;
}
}
;
return
1
;
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
init
=
true
;
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
switch
(
dwReasonForCall
)
{
case
DLL_PROCESS_ATTACH
:
SF
->
initPlugin
(
mainloop
,
hModule
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}
всегда дом не байед блеать
C++:
if
(
strstr
(
message
,
"Поздравляю! Теперь этот дом ваш"
)
!=
0
)
{
}
C++:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
size_t len
;
DWORD color
;
char
message
[
256
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
len
)
;
params
->
bitStream
->
Read
(
message
,
len
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DOM ne BAYED"
)
;
// [Информация] {FFFFFF}Поздравляю! Теперь этот бизнес ваш!
if
(
strcmp
(
message
,
"[Информация] {FFFFFF}Поздравляю! Теперь этот дом ваш"
)
==
0
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DOM BAYED"
)
;
char
result
[
12
]
;
strcat
(
message
,
" [1.9741]"
)
;
return
1
;
}
}
;
return
1
;
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
init
=
true
;
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
switch
(
dwReasonForCall
)
{
case
DLL_PROCESS_ATTACH
:
SF
->
initPlugin
(
mainloop
,
hModule
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}
всегда дом не байед блеать
ты заебал, я же тебе уже отвечал и давал полностью рабочий пример
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
uint strLen
,
color
;
char
szMsg
[
144
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
strLen
)
;
if
(
strLen
>=
sizeof
(
szMsg
)
)
strLen
=
sizeof
(
szMsg
)
-
1
;
params
->
bitStream
->
Read
(
szMsg
,
strLen
)
;
szMsg
[
strLen
]
=
'\0'
;
if
(
strstr
(
szMsg
,
"Поздравляю! Теперь этот дом ваш"
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"kla$$"
)
;
// ...
}
}
return
1
;
}
-raymond-
22.06.2019, 19:12
возможно ли в сф отрендерить текст при загрузке игры? как в собейте на месте худа снизу
iAmerican
23.06.2019, 00:21
возможно ли в сф отрендерить текст при загрузке игры? как в собейте на месте худа снизу
Ставь свой хук на present или попробуй SFшный поставить пораньше
checkdasound
24.06.2019, 04:21
В структуре actor_info есть элемент runningStyle, для примера там указаны такие значения как: 0x36 = cj, 0x8A = rollerskate, 0x7F = woozie, 0x75 = crash.
Где можно найти полный список?
Roger571
24.06.2019, 09:15
В структуре actor_info есть элемент runningStyle, для примера там указаны такие значения как: 0x36 = cj, 0x8A = rollerskate, 0x7F = woozie, 0x75 = crash.
Где можно найти полный список?
C++:
const
struct
move_animation_info
move_animations
[
MOVE_ANIMATIONS_COUNT
]
=
{
// ordered by eMoveAnim-ids (ascending)
{
MOVE_PLAYER
,
"CJ"
}
,
// { MOVE_PLAYER_F, "Player (F)" },
// { MOVE_PLAYER_M, "Player (M)" },
{
MOVE_ROCKET
,
"Rocket"
}
,
// { MOVE_ROCKET_F, "Rocket (F)" },
// { MOVE_ROCKET_M, "Rocket (M)" },
{
MOVE_ARMED
,
"Armed"
}
,
// { MOVE_ARMED_F, "Armed (F)" },
// { MOVE_ARMED_M, "Armed (M)" },
{
MOVE_BBBAT
,
"Baseball"
}
,
// { MOVE_BBBAT_F, "Baseball (F)" },
// { MOVE_BBBAT_M, "Baseball (M)" },
{
MOVE_CSAW
,
"Chainsaw"
}
,
// { MOVE_CSAW_F, "Chainsaw (F)" },
// { MOVE_CSAW_M, "Chainsaw (M)" },
{
MOVE_SNEAK
,
"Sneak"
}
,
{
MOVE_JETPACK
,
"Jetpack"
}
,
{
MOVE_MAN
,
"Man"
}
,
{
MOVE_SHUFFLE
,
"Shuffle"
}
,
{
MOVE_OLDMAN
,
"Old (M)"
}
,
{
MOVE_GANG1
,
"Gang1"
}
,
{
MOVE_GANG2
,
"Gang2"
}
,
{
MOVE_OLDFATMAN
,
"Old fat (M)"
}
,
{
MOVE_FATMAN
,
"Fat (M)"
}
,
{
MOVE_JOGGER
,
"Jogger (M)"
}
,
{
MOVE_DRUNKMAN
,
"Drunk"
}
,
{
MOVE_BLINDMAN
,
"Woozie"
}
,
{
MOVE_SWAT
,
"SWAT"
}
,
{
MOVE_WOMAN
,
"Woman"
}
,
{
MOVE_SHOPPING
,
"Shopping"
}
,
{
MOVE_BUSYWOMAN
,
"Busy (F)"
}
,
{
MOVE_SEXYWOMAN
,
"Sexy (F)"
}
,
{
MOVE_PRO
,
"Pro"
}
,
{
MOVE_OLDWOMAN
,
"Old (F)"
}
,
{
MOVE_FATWOMAN
,
"Fat (F)"
}
,
{
MOVE_JOGWOMAN
,
"Jogger (F)"
}
,
{
MOVE_OLDFATWOMAN
,
"Old fat (F)"
}
,
// { MOVE_SKATE, "Skate" }, /needs to be loaded from some not always loaded file?
}
;
C++:
enum
eMoveAnim
{
MOVE_PLAYER
=
54
,
MOVE_PLAYER_F
,
MOVE_PLAYER_M
,
MOVE_ROCKET
,
MOVE_ROCKET_F
,
MOVE_ROCKET_M
,
MOVE_ARMED
,
MOVE_ARMED_F
,
MOVE_ARMED_M
,
MOVE_BBBAT
,
MOVE_BBBAT_F
,
MOVE_BBBAT_M
,
MOVE_CSAW
,
MOVE_CSAW_F
,
MOVE_CSAW_M
,
MOVE_SNEAK
,
MOVE_JETPACK
,
MOVE_MAN
=
118
,
MOVE_SHUFFLE
,
MOVE_OLDMAN
,
MOVE_GANG1
,
MOVE_GANG2
,
MOVE_OLDFATMAN
,
MOVE_FATMAN
,
MOVE_JOGGER
,
MOVE_DRUNKMAN
,
MOVE_BLINDMAN
,
MOVE_SWAT
,
MOVE_WOMAN
,
MOVE_SHOPPING
,
MOVE_BUSYWOMAN
,
MOVE_SEXYWOMAN
,
MOVE_PRO
,
MOVE_OLDWOMAN
,
MOVE_FATWOMAN
,
MOVE_JOGWOMAN
,
MOVE_OLDFATWOMAN
,
MOVE_SKATE
,
}
;
Как получить адрес(&) виртуального указателя-члена класса?
Как сделать проверку на дистанцию игрока???
checkdasound
24.06.2019, 13:57
Как в имгуи сделать проверку, что открыто любое поле ввода? (в самом меню, а не в игре).
rraggerr
24.06.2019, 14:26
float distance = sqrt ( (x2- x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) ); пишу с телефона , так бы скинул функу , но думаю самому не сложно будет сделать
if (data->EventFlag ==
Вроде тут есть , я щас с мобилы не могу проверить
нахуя тогда отвечать если не можешь сделать это нормально?
Как в имгуи сделать проверку, что открыто любое поле ввода? (в самом меню, а не в игре).
можешь проверять курсор енаблед, он в основном от инпут боксов возвращает тру, или от включенном диалоге
если ты про имгуи то if(inputtext) , при нажатии или изменении оно вернет тебе тру
при компиляции такая хуета
1>D:\вс19\MSBuild\Microsoft\VC\v160\Microsoft.Cpp. WindowsSDK.targets(46,5): error MSB8036: не удалось найти Windows SDK версии 8.1. Установите нужную версию Windows SDK или измените версию SDK на страницах свойств проекта либо щелкнув правой кнопкой мыши решение и выбрав "Изменить целевую платформу решения".
установил уже windows sdk 8.1 и тоже самое
как фиксить?
при компиляции такая хуета
установил уже windows sdk 8.1 и тоже самое
как фиксить?
очень ахуенно ставлю клас
свойства проекта не открывал? там много чего интересного
очень ахуенно ставлю клас
свойства проекта не открывал? там много чего интересного
открывал
открывал
молодец. скрин сам скинешь?
молодец. скрин сам скинешь?
зачем?
что именно там кидать тебе?
молодец. скрин сам скинешь?
https://i.imgur.com/FAvqBIj.png
что именно там кидать тебе?
https://i.imgur.com/FAvqBIj.png
ну во-первых активируй винду
во-вторых попробуй ребут компа, посмотри версии сдк, если есть новее, ставь новее
ну во-первых активируй винду
во-вторых попробуй ребут компа, посмотри версии сдк, если есть новее, ставь новее
https://i.imgur.com/54YJZ2w.png
ща релогну пк
ну во-первых активируй винду
во-вторых попробуй ребут компа, посмотри версии сдк, если есть новее, ставь новее
нихуя
возможно ли сделать чтобы при нажатии на ImGui::Button создавалась ещё ImGui::Button и так дальше при каждом нажатии +1 ImGui::Button?
возможно ли сделать чтобы при нажатии на ImGui::Button создавалась ещё ImGui::Button и так дальше при каждом нажатии +1 ImGui::Button?
C++:
static
int
n
=
1
;
for
(
int
i
=
0
;
i
*/
)
.
c_str
(
)
)
)
{
n
++
;
}
}
Вопрос скорей всего не по SAMP'у.
На днях мне было необходимо создать графическое приложение. Можно использовать C++ вместе с MFC, либо переехать на QT Creator, либо.. Либо использовать C# вместе с C++. Я бы хотел спросить про третий случай.
Кто нибудь уже пробовал создавать графику в C# и вызывать из C# функции (какие-нибудь системные вычисления) из своей библиотеки C++? Что можно сказать про производительность?
Просто я не сильно доверяю QT Creator из-за незнания самого продукта.
Не знаю, ответите ли вы, но всё же.
Имеется 2 функции, silentaim и wallhack, все производятся в цикле и в одном и том же void.
Но, вот, вх то ренедрит нормально, то есть работает всё, а вот сайлент нет, почему же так?
aim:
C++:
if
(
Cvars
::
aim
)
{
IEntityIt
*
pEntityIt
=
gEnv
->
pEntitySystem
->
GetEntityIterator
(
)
;
while
(
IEntity
*
pExp
=
pEntityIt
->
Next
(
)
)
{
IEntityClass
*
pEntClass
=
pExp
->
GetClass
(
)
;
if
(
!
pEntClass
)
continue
;
const
char
*
ClassName
=
pEntClass
->
GetName
(
)
;
const
char
*
Name
=
pExp
->
GetName
(
)
;
if
(
!
_strcmp
(
ClassName
,
"Dummy"
)
)
continue
;
IEntityRenderProxy
*
pRenderProxy
=
pExp
->
GetRenderProxy
(
)
;
if
(
!
pRenderProxy
)
continue
;
uint32 RenderFlags
=
pRenderProxy
->
GetFlags
(
)
;
if
(
RenderFlags
==
386
)
{
if
(
_strstr
(
Name
,
"laymore"
)
||
_strstr
(
Name
,
"apsule"
)
||
_strstr
(
Name
,
"smartmine"
)
||
_strstr
(
Name
,
"spidermine"
)
||
_strstr
(
Name
,
"mine"
)
||
_strstr
(
Name
,
"heavydroid_rocket"
)
)
{
AABB aabb
;
pExp
->
GetWorldBounds
(
aabb
)
;
Vec3 vBonePos
=
aabb
.
GetCenter
(
)
;
Vec3 Out
;
if
(
_strstr
(
Name
,
"laymore"
)
||
_strstr
(
Name
,
"apsule"
)
||
_strstr
(
Name
,
"smartmine"
)
||
_strstr
(
Name
,
"spidermine"
)
||
_strstr
(
Name
,
"mine"
)
||
_strstr
(
Name
,
"heavydroid_rocket"
)
)
{
gRender
->
ProjectToScreen
(
aabb
.
GetCenter
(
)
,
Out
)
;
if
(
IsAim
(
Name
,
ClassName
,
pExp
,
vBonePos
)
||
is_Visible
(
aabb
.
GetCenter
(
)
,
2.0f
)
&&
Priority
(
vBonePos
)
)
{
Aim
(
pWeaponPTR
,
Name
,
ClassName
,
m_pActor
,
m_pItem
,
aabb
.
GetCenter
(
)
)
;
}
continue
;
}
continue
;
}
}
if
(
IActor
*
pActor
=
pFramework
->
GetIActorSystem
(
)
->
GetActor
(
pExp
->
GetId
(
)
)
)
{
if
(
pActor
->
IsDead
(
)
||
pActor
==
m_pActor
||
pActor
->
IsDead
(
)
||
IsMyTeam
(
m_pActor
,
pActor
)
)
continue
;
Vec3 vBonePos
=
ZERO
;
Vec3 Out
;
gRender
->
ProjectToScreen
(
vBonePos
,
Out
)
;
if
(
IsAim
(
Name
,
ClassName
,
pExp
,
vBonePos
)
||
is_Visible
(
vBonePos
,
0.0f
)
&&
Priority
(
vBonePos
)
)
{
Aim
(
pWeaponPTR
,
Name
,
ClassName
,
m_pActor
,
m_pItem
,
vBonePos
)
;
}
}
}
}
wh:
C++:
if
(
Cvars
::
wallhack
)
{
IEntityIt
*
pEntityIt
=
gEnv
->
pEntitySystem
->
GetEntityIterator
(
)
;
while
(
IEntity
*
pExp
=
pEntityIt
->
Next
(
)
)
{
IEntityClass
*
pEntClass
=
pExp
->
GetClass
(
)
;
if
(
!
pEntClass
)
continue
;
const
char
*
ClassName
=
pEntClass
->
GetName
(
)
;
const
char
*
Name
=
pExp
->
GetName
(
)
;
if
(
!
_strcmp
(
ClassName
,
"Dummy"
)
)
continue
;
IEntityRenderProxy
*
pRenderProxy
=
pExp
->
GetRenderProxy
(
)
;
if
(
!
pRenderProxy
)
continue
;
uint32 RenderFlags
=
pRenderProxy
->
GetFlags
(
)
;
if
(
RenderFlags
==
386
)
{
if
(
_strstr
(
Name
,
"laymore"
)
||
_strstr
(
Name
,
"apsule"
)
||
_strstr
(
Name
,
"smartmine"
)
||
_strstr
(
Name
,
"spidermine"
)
||
_strstr
(
Name
,
"mine"
)
||
_strstr
(
Name
,
"heavydroid_rocket"
)
)
{
pRenderProxy
->
SetHUDSilhouettesParams
(
0xFF
,
0x00
,
0x0
)
;
}
}
if
(
IActor
*
pActor
=
pFramework
->
GetIActorSystem
(
)
->
GetActor
(
pExp
->
GetId
(
)
)
)
{
if
(
pActor
->
IsDead
(
)
||
pActor
==
m_pActor
||
pActor
->
IsDead
(
)
||
IsMyTeam
(
m_pActor
,
pActor
)
)
continue
;
pRenderProxy
->
SetHUDSilhouettesParams
(
0xFF
,
0x00
,
0x0
)
;
}
}
}
Roger571
28.06.2019, 08:31
Вопрос скорей всего не по SAMP'у.
На днях мне было необходимо создать графическое приложение. Можно использовать C++ вместе с MFC, либо переехать на QT Creator, либо.. Либо использовать C# вместе с C++. Я бы хотел спросить про третий случай.
Кто нибудь уже пробовал создавать графику в C# и вызывать из C# функции (какие-нибудь системные вычисления) из своей библиотеки C++? Что можно сказать про производительность?
Просто я не сильно доверяю QT Creator из-за незнания самого продукта.
Сам никогда совмещение не практиковал, но есть вариант на крестах написать библиотеку и вызывать ее функции уже из шарпа.
В процессе поиска выяснилось, что это не так и сложно, как мне показалось изначально.
Но т.к. сам я никогда такое не практиковал, то мои советы скорее всего будут с нулевой пользой и я буду выступать твоим личным гуглом.
SO1 (https://www.blast.hk/redirect/aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNz cyMDQxL3VzaW5nLWMtbGlicmFyeS1pbi1jLXNoYXJw)
SO2 (https://www.blast.hk/redirect/aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMj UzMjkwNy9jb21iaW5pbmctYy1hbmQtYy1zaGFycA)
Сам никогда совмещение не практиковал, но есть вариант на крестах написать библиотеку и вызывать ее функции уже из шарпа.
В процессе поиска выяснилось, что это не так и сложно, как мне показалось изначально.
Но т.к. сам я никогда такое не практиковал, то мои советы скорее всего будут с нулевой пользой и я буду выступать твоим личным гуглом.
SO1 (https://www.blast.hk/redirect/aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNz cyMDQxL3VzaW5nLWMtbGlicmFyeS1pbi1jLXNoYXJw)
SO2 (https://www.blast.hk/redirect/aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMj UzMjkwNy9jb21iaW5pbmctYy1hbmQtYy1zaGFycA)
Хотелось бы встретить человека который бы сравнил производительность программы, которая была написана только на C# и программы которая бы комбинировала два языка.
Хук по адресу samp.dll + 0x65C60(это FUNC_SAMP_SENDCMD) конфликтит с SF, вызывая, к примеру из Lua скрипта, функцию
sampSendChat - выбрасывается "opcode '0AF9' call caused an unhandled exception". Есть другой адрес?
Хук по адресу samp.dll + 0x65C60(это FUNC_SAMP_SENDCMD) конфликтит с SF, вызывая, к примеру из Lua скрипта, функцию
sampSendChat - выбрасывается "opcode '0AF9' call caused an unhandled exception". Есть другой адрес?
если хук нарушает вызовы хукнутой функции, то проблема однозначно в самом хуке.
Как вернуть массив из функции?
C++:
char
*
Func
(
)
{
char
i
[
7
]
=
"cakebou"
;
return
i
;
}
Ты возвращаешь адрес локального массива, это даже не скомпилируется.
C++:
char
*
foo
(
)
{
char
*
bar
=
new
char
[
7
]
;
bar
=
"string"
;
return
bar
;
}
И после использования - не забыть освободить память.
здрасте. почему код выполняет действие, даже не смотря на то, что я нажал кнопку?
C++:
if
(
Cvars
::
teleport
&&
GetAsyncKeyState
(
Cvars
::
tp_key
)
)
{
IEntity
*
entity
=
nullptr
;
if
(
Cvars
::
tp
==
1
)
entity
->
SetPos
(
Cvars
::
TeleportPositions1
)
;
if
(
Cvars
::
tp
==
2
)
entity
->
SetPos
(
Cvars
::
TeleportPositions2
)
;
if
(
Cvars
::
tp
==
3
)
entity
->
SetPos
(
Cvars
::
TeleportPositions3
)
;
if
(
Cvars
::
tp
==
4
)
entity
->
SetPos
(
Cvars
::
TeleportPositions4
)
;
}
C++:
char
*
Func
(
)
{
char
i
[
7
]
=
"cakebou"
;
return
i
;
}
C++:
#include
auto
get_array
(
)
{
return
std
::
array
{
'a'
,
'b'
,
'c'
}
;
}
здрасте. почему код выполняет действие, даже не смотря на то, что я нажал кнопку?
C++:
if
(
Cvars
::
teleport
&&
GetAsyncKeyState
(
Cvars
::
tp_key
)
)
{
IEntity
*
entity
=
nullptr
;
if
(
Cvars
::
tp
==
1
)
entity
->
SetPos
(
Cvars
::
TeleportPositions1
)
;
if
(
Cvars
::
tp
==
2
)
entity
->
SetPos
(
Cvars
::
TeleportPositions2
)
;
if
(
Cvars
::
tp
==
3
)
entity
->
SetPos
(
Cvars
::
TeleportPositions3
)
;
if
(
Cvars
::
tp
==
4
)
entity
->
SetPos
(
Cvars
::
TeleportPositions4
)
;
}
Попробуй вот это, у меня в плагинах норм работает
C++:
GetKeyState
(
VK_ADD
)
&
0x8000
Попробуй вот это, у меня в плагинах норм работает
C++:
GetKeyState
(
VK_ADD
)
&
0x8000
Попробуй с этим
C++:
BOOL
GetMessage
(
LPMSG lpMsg
,
HWND hWnd
,
UINT wMsgFilterMin
,
UINT wMsgFilterMax
)
;
не, пачаны. этот tp_key пользователь сам выбирает. вот воид выбора кнопки:
C++:
void
GUI
::
hotkey
(
int
&
key
)
noexcept
{
key
?
ImGui
::
Text
(
"[ 0x%x ]"
,
key
)
:
ImGui
::
Text
(
"[ key ]"
)
;
if
(
ImGui
::
IsItemHovered
(
)
)
{
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
for
(
int
i
=
0
;
i
1
?
2
:
1
)
!=
config
.
misc
.
menuKey
)
key
=
i
+
(
i
>
1
?
2
:
1
)
;
}
}
не, пачаны. этот tp_key пользователь сам выбирает. вот воид выбора кнопки:
C++:
void
GUI
::
hotkey
(
int
&
key
)
noexcept
{
key
?
ImGui
::
Text
(
"[ 0x%x ]"
,
key
)
:
ImGui
::
Text
(
"[ key ]"
)
;
if
(
ImGui
::
IsItemHovered
(
)
)
{
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
for
(
int
i
=
0
;
i
1
?
2
:
1
)
!=
config
.
misc
.
menuKey
)
key
=
i
+
(
i
>
1
?
2
:
1
)
;
}
}
C++:
GetKeyState
(
Cvars
::
tp_key
)
&
0x8000
?
void mapMenuTeleport(void)
SF->getSAMP()->registerChatCommand("test", mapMenuTeleport());
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp( 50): error C2664: "bool SFSAMP::registerChatCommand(std::string,CommandPro c)": невозможно преобразовать аргумент 2 из "void" в "CommandProc"
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp( 50): note: Выражение, имеющее тип void, нельзя преобразовать в другой тип
как исправить?
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp( 50): error C2664: "bool SFSAMP::registerChatCommand(std::string,CommandPro c)": невозможно преобразовать аргумент 2 из "void" в "CommandProc"
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp( 50): note: Выражение, имеющее тип void, нельзя преобразовать в другой тип
как исправить?
убрать войд в аргументе функи?
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp( 50): error C2664: "bool SFSAMP::registerChatCommand(std::string,CommandPro c)": невозможно преобразовать аргумент 2 из "void" в "CommandProc"
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp( 50): note: Выражение, имеющее тип void, нельзя преобразовать в другой тип
как исправить?
void CALLBACK mapMenuTeleport() и
убери скобочки () в регистрации команды
убрать войд в аргументе функи?
Никак не помешает
void CALLBACK mapMenuTeleport() и
убери скобочки () в регистрации команды
Никак не помешает
тоже самое
Ответ выше
я уже решил эту проблему
vania3450
30.06.2019, 01:36
Добрый день,скачал я значит плагин https://github.com/dotSILENT/chandling/releases, оригинальный ASI разработчика работает у всех игроков, а мой собранный ASI (даже пробовал собрать не меняя) работает только у меня и у человека у которого установлена Visual Studio, тоисть я кидаю свой ASI игроку он у него не работает,я кидаю точно такой же, НО от разработчика и он у него работает.
исходник моего asi: https://yadi.sk/d/Z3mM8GuC_RSu7w (https://www.blast.hk/redirect/aHR0cHM6Ly95YWRpLnNrL2QvWjNtTThHdUNfUlN1N3c)
iAmerican
30.06.2019, 12:05
Добрый день,скачал я значит плагин https://github.com/dotSILENT/chandling/releases, оригинальный ASI разработчика работает у всех игроков, а мой собранный ASI (даже пробовал собрать не меняя) работает только у меня и у человека у которого установлена Visual Studio, тоисть я кидаю свой ASI игроку он у него не работает,я кидаю точно такой же, НО от разработчика и он у него работает.
исходник моего asi: https://yadi.sk/d/Z3mM8GuC_RSu7w (https://www.blast.hk/redirect/aHR0cHM6Ly95YWRpLnNrL2QvWjNtTThHdUNfUlN1N3c)
http://prntscr.com/o8jsw8 (https://www.blast.hk/redirect/aHR0cDovL3BybnRzY3IuY29tL284anN3OA)
TheUnity
30.06.2019, 12:43
можно как то не дать серверу воспроизводить звук? например, 1169 id звука
vania3450
30.06.2019, 13:03
http://prntscr.com/o8jsw8 (https://www.blast.hk/redirect/aHR0cDovL3BybnRzY3IuY29tL284anN3OA)
https://prnt.sc/o8k60k (https://www.blast.hk/redirect/aHR0cHM6Ly9wcm50LnNjL284azYwaw) как только поставил сразу ошибки и не компилит
можно как то не дать серверу воспроизводить звук? например, 1169 id звука
C++:
#include
#include "main.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrPlaySound
)
{
DWORD soundId
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
soundId
)
;
if
(
soundId
==
1169
)
return
false
;
// id звука = 1169
}
return
true
;
}
;
void
__stdcall
mainloop
(
)
{
static
bool
initialized
=
false
;
if
(
!
initialized
)
{
if
(
GAME
&&
GAME
->
GetSystemState
(
)
==
eSystemState
::
GS_PLAYING_GAME
&&
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
{
initialized
=
true
;
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
}
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
return
TRUE
;
}
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot