PDA

Просмотр полной версии : С/С++ Вопрос - Ответ


Страницы : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [15] 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Imbecil
07.05.2019, 21:12
В смысле список?? Конкретнее. Что ты подразумеваешь под хуком? Клик его? Есть два варианта:

1.

C++:






SF
->
getSAMP
(
)
->
sendClickTextDraw
(
)
;




2.
ClickTextdraw // rpc

Чтобы получить информацию с текстдрава

1.

ShowTextDraw


ну список всех которые сейчас присутствуют у меня на экране. под хуком подразумеваю типо сервер отправляет мне текстдравы, в плагине это узнаю сразу и пишу в чат, например.

Imbecil
13.05.2019, 17:23
Почему если пытаюсь получить 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

Imbecil
13.05.2019, 18:52
Потому что читаешь не правильно:

Код:






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

Imbecil
13.05.2019, 19:05
Потому что ты гений, который читает не по структуре RPC


а как надо? я из примера брал

Cake_
13.05.2019, 20:22
Почему если пытаюсь получить 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



Но получаю либо кашу либо краш.

Imbecil
14.05.2019, 19:17
Facepalm... Нужно читать textdraw id. Textdraw data, len textdraw, text textdrawa, в конце обязательно очисти мусорв строке. Я не за компом , так бы написал код. Я думаю , разберёшься сам

Длину текста нужно читать перед текстом

!отдельно!


а как? напиши, пожалуйста, а то я дурачек

Cake_
14.05.2019, 19:25
а как? напиши, пожалуйста, а то я дурачек


Попробуй просто длину текста читать отдельно



Попробуй просто длину текста читать отдельно


Дату текстдрава вроде не обязательно читать



Попробуй просто длину текста читать отдельно

Дату текстдрава вроде не обязательно читать


И используй 256 элементов в массиве , на всякий случай

astap_
14.05.2019, 21:01
а как? напиши, пожалуйста, а то я дурачек



Код:






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;
};

#kweeZ
15.05.2019, 14:05
Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про 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;
}

Cake_
15.05.2019, 14:10
Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про 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

#kweeZ
15.05.2019, 14:15
Первой строкой поставь. Нужно вводить не просто /showinfo, в команде должен быть один параметр, в данном случае это id игрока ( 0 - 1000).







C++:






#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1







Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенкс

Cake_
15.05.2019, 15:02
Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенкс


Чтобы вывестисвои данныевот код:

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++

index
15.05.2019, 15:31
[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)


Спасибо! Надеюсь это мне поможет!

#kweeZ
15.05.2019, 15:54
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге

Код:






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;
};

Cake_
15.05.2019, 16:13
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге

Код:






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

astap_
16.05.2019, 00:40
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге

Код:






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, чтобы таблица загрузилась и проге было откуда брать данные.

#kweeZ
16.05.2019, 21:13
странно что у тебя вообще что-то выводится с таким кодом.
компоненты 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

#kweeZ
16.05.2019, 21:39
Он ошибся. Вот так правильно:

C++:






if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrShowDialog
)
{







И тут нужно еще от мусорачистить каждый элемент с текстом.



Это я понял, сразу же исправил на params, но всё равно ничего не выводится

astap_
16.05.2019, 22:09
Это я понял, сразу же исправил на params, но всё равно ничего не выводится


с параметром промазал, в остальном всё работает.




https://i.imgur.com/cQ7qEiz.jpg

Cake_
16.05.2019, 22:13
с переменной промазал, в остальном всё работает.


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. Зачем там структура...

ufdhbi
16.05.2019, 22:16
Зачем там структура...


допустим для удобства и не говнокода?

astap_
16.05.2019, 22:16
Если не ошибаюсь, это код @ЯedЯuM. Зачем там структура...


ты не ошибаешься

ALF
16.05.2019, 23:29
и не говнокода?


если структура то не говнокод? это что то новое

ufdhbi
17.05.2019, 00:49
если структура то не говнокод? это что то новое


со структурой приятнее выглядит

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.

AnWu
22.05.2019, 02:24
Чтобы вывестисвои данныевот код:

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.

ALF
22.05.2019, 03:28
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...

index
22.05.2019, 16:32
Скиньте, пожалуйста, оффсеты координат транспорта.

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 - функция для отправления сообщения в чат. Когда пробую вызвать - крашит. Что я делаю неправильно?

index
22.05.2019, 19:30
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 аргумента

Vintik
23.05.2019, 09:46
Функция CreateRemoteThread (поток, который запускается в виртуальном адресном пространстве другого процесса) даёт возможность передать потому только один аргумент: "LPVOID lpParameter, // аргументы потока".

Хотел бы узнать, как передать потоку более одного аргумента (желательно с примером).

index
23.05.2019, 09:59
Функция 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);
}
}

index
25.05.2019, 10:55
Есть скрипт в который нужно запихнуть задержку между вводом текста в диалог, как это сделать без замораживания игрового процесса? (Отредактируйте мой код)


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 *, то игру крашит

index
25.05.2019, 14:17
нужно разбить 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();
}
}






Фулл код дай.

Не достаточно просто вставить...


может объяснишь чё не так ?

Cake_
25.05.2019, 18:43
Код:






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
Всё...


а конкретнее ?

index
25.05.2019, 19:46
я прекрасно знаю что в моём коде происходит пиздец ;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)

ALF
25.05.2019, 20:36
Код:






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: >: несоответствие типов со знаком и без знака




я заметил что когда у меня задержка на каждом символе одинаковая, то все нормально.

если же разная, то эти символы вводятся без задержки. Что за бред блинблять

ALF
25.05.2019, 22:46
if (GetTickCount() - dwTime > timer[0]) // warning C4018: >: несоответствие типов со знаком и без знака


if (GetTickCount() - dwTime > (DWORD)timer[0])

ishi
25.05.2019, 23:24
Как заставить vector и string в std выделять динамическую память, а не стек?

_Vine_
25.05.2019, 23:32
Как заставить 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
;
}





Он должен стоять внутри конструкции.

_Vine_
26.05.2019, 01:49
Он должен стоять внутри конструкции.


Если ты про скобки после 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 нарушит слой и произойдет незапланированный выход. Зачем лишний раз себе палку в колеса пихать?

_Vine_
26.05.2019, 02:02
Причем тут синтаксис? При использовании многослойного 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 (закрытию диалога), как пофиксеть

_Vine_
26.05.2019, 10:07
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
Как запустить ЖТА и пропустить всю фигню вначале?

У меня получилось убрать меню и перейти сразу к загрузке, но там начинается катсцена и жта виснет. Как ее пропустить, что нужно занопить?

ALF
29.05.2019, 00:14
Как запустить ЖТА и пропустить всю фигню вначале?
У меня получилось убрать меню и перейти сразу к загрузке, но там начинается катсцена и жта виснет. Как ее пропустить, что нужно занопить?


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/

index
31.05.2019, 12:56
Почему такая ошибка при компиляции? Windows SDK есть.


Целевая платформа в свойствах проекта верно стоит?

TheRuthArbiter
31.05.2019, 13:14
Скорее всего не установлены компоненты для работы с C++ при установке студии либо DirectX 9-12


всё установлено.



Целевая платформа в свойствах проекта верно стоит?



https://forum.antichat.xyz/attachments/27345088/

Там вроде ничего не выставишь

Я переоткрыл проект, в итоге вот:

https://forum.antichat.xyz/attachments/27345088/

Cake_
31.05.2019, 13:28
всё установлено.

Там вроде ничего не выставишь

Я переоткрыл проект, в итоге вот:


Ты его с архива открываешь?



всё установлено.

Там вроде ничего не выставишь

Я переоткрыл проект, в итоге вот:


При установке студии надо установить запусти установщик и установи компоненты для работы с C++ которые у тебя не установлены

TheRuthArbiter
31.05.2019, 13:39
Ты его с архива открываешь?

При установке студии надо установить запусти установщик и установи компоненты для работы с C++ которые у тебя не установлены


не с архива. Я НАПИСАЛ: ВСЕ КОМПОНЕНТЫ УСТАНОВЛЕНЫ УЖЕ!

Cake_
31.05.2019, 13:46
не с архива. Я НАПИСАЛ: ВСЕ КОМПОНЕНТЫ УСТАНОВЛЕНЫ УЖЕ!


Поставь в настройках проекта сдк и набор инструментов платформы на те которые у тебя есть

TheRuthArbiter
31.05.2019, 14:07
Поставь в настройках проекта сдк и набор инструментов платформы на те которые у тебя есть


спасибо)

Receiver
02.06.2019, 17:06
https://pp.userapi.com/c851436/v851436935/13de36/UaZ64nlFUbE.jpg

выводит "не удалось подключица к серверу", почему так?

ALF
02.06.2019, 17:42
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 файл с сервера ?

2Shae
02.06.2019, 18:32
Как правильно считать память?

Пытался через следующее:

Код:





[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.

index
02.06.2019, 19:10
[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

2Shae
02.06.2019, 21:32
Проверьте хендл 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)

можно как нибудь это обойти?

Шурик
03.06.2019, 21:38
Прошу помочь с адаптацией данного кода на 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?

damag
04.06.2019, 13:52
Как отправить пулю в игрока? Не на буллет синхре, а через getsamp. На луа есть типа setcharammo. А нужно сделать как-то на c++

LaRossa
04.06.2019, 19:31
Помогите пожалуйста 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, как это исправить ?

_Vine_
05.06.2019, 22:26
C++:






bool
functeion_crash
=
false
;
ImGui
::
Checkbox
(
"Крашить игроков"
,
&
functeion_crash
)
;
reg
->
SetRegister
(
"crashit"
,
REG_DWORD
,
&
functeion_crash
)
;




Вместо 1 и 0, в реестр сохраняется 17601 и 17602, как это исправить ?


Измени тип переменной на DWORD

Vesca
06.06.2019, 00:34
With SFPlugin C++:

How to get the vehicle of the vehicle I enter in?

How to send it through T> {enter}?

astap_
06.06.2019, 04:52
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 *"

BaHeK
06.06.2019, 14:06
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
)
;

Vesca
06.06.2019, 18:57
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 *"






>> Проблема не решена.

SR_team
06.06.2019, 21:52
Что я делаю не так? Очень странно всё работает (может я дебил, не исключено). Жмёшь стрелку вверх - едет вниз, жмёшь стрелку вниз - едет вниз, 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)

_Vine_
07.06.2019, 01:18
>> Проблема не решена.

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? Есть ли генератор такого цвета?

astap_
07.06.2019, 07:57
как в имгуи преобразовать цвет из 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

astap_
07.06.2019, 14:31
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

Vesca
07.06.2019, 14:40
How to hook the outcomimg RPC_ServerCommamd?

Receiver
07.06.2019, 14:58
отлавливай через структуру чата либо через хук DISCONNECTION_NOTIFICATION


Даже если другой текст ввести туда, то всё равно не сравниваются строки

Как отловить сообщение и сравнить с помощью strcmp ?

ALF
07.06.2019, 15:01
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


Без разницы на этот клосед коннекцион, как любое другое сообщение отловить и сравнить ?

ALF
07.06.2019, 16:22
Без разницы на этот клосед коннекцион, как любое другое сообщение отловить и сравнить ?



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)

Cake_
07.06.2019, 21:31
не работает, ничего не происходит
каллбэк регаю, хз в чём проблема

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 проверяет часть строки

Vesca
07.06.2019, 22:42
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 проверяет часть строки


И так и так проверял, не работает, он читает другие строки чата, но почему-то не сравнивает.

Это проблема появилась после подключения имгуи к проекту.

Возможно это из-за того что сравнивает с текстом на кириллице.

2Shae
08.06.2019, 17:36
Как отобразить курсор при активном меню 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
++
;
}
}

Vandal™
09.06.2019, 00:25
Потому что 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
)
;




Есть еще решения проблемы, кроме предложенных?

_Vine_
09.06.2019, 01:59
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
(
)
)
;

Vandal™
09.06.2019, 03:19
Чем этот не подходит?


1 - u8"Text" отказывается работать (ImGUI v1.71)

2 - занимает несколько строк при инициализации, но работает. Стало интересно какие еще решения есть

astap_
09.06.2019, 06:16
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")

ishi
10.06.2019, 02:25
В c++ проекте на linux мне попалась вот такая интересная строка:







C++:






std
::
string mainXML
=
#include
"Main.xml"
;




Однако, в винде среда считает её ошибкой. Подскажите, есть вариант в винде так же через дефайн загружать содержимое файла в string, без открытия и чтения?

Cake_
10.06.2019, 06:59
В c++ проекте на linux мне попалась вот такая интересная строка:







C++:






std
::
string mainXML
=
#include
"Main.xml"
;




Однако, в винде среда считает её ошибкой. Подскажите, есть вариант в винде так же через дефайн загружать содержимое файла в string, без открытия и чтения?


Чем тебе с чтением не нравится?

_Vine_
10.06.2019, 12:27
В 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 с повторением ?

Cake_
10.06.2019, 19:36
как эмулировать нажатие клавишы 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

ALF
12.06.2019, 22:08
не ебу как это сделать, не работал с пакетами, запрашиваю у вас код клавиши


https://blast.hk/wiki/tutorials:api_lesson_raknet

Akionka
13.06.2019, 06:38
из аси можно вызвать клео опкод?

DarkP1xel
13.06.2019, 07:45
из аси можно вызвать клео опкод?


Да.

Akionka
13.06.2019, 08:09
Да.


как....?

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, хукаешь ее и не даешь загружаться

Cake_
13.06.2019, 16:22
тут есть пример 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
;
// успешно завершаем отправку пакета
}
;

_Vine_
14.06.2019, 19:06
при нажатии на 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

R G T X
14.06.2019, 21:12
С чего начинать делать софты для SAMPA?

rraggerr
14.06.2019, 21:17
С чего начинать делать софты для SAMPA?


с основ

0xff
15.06.2019, 00:46
У кого-нибудь есть адреса, чтобы узнать ид педа в которого выстрельнул с оружия?

(для одиночки нужно, не 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

Cake_
15.06.2019, 18:16
Как это будет на SF/C++ ?







Lua:






getOffsetFromCharInWorldCoords

_Vine_
15.06.2019, 22:35
Как это будет на SF/C++ ?







Lua:






getOffsetFromCharInWorldCoords







PEDSELF->GetPosition() + CVector(x, y, z)

Stiopko
16.06.2019, 16:46
как можно сделать линию только не на екране а в 3d?

_Vine_
16.06.2019, 17:01
как можно сделать линию только не на екране а в 3d?


Перевести 3д координаты в 2д и отрисовать по этим координатам линию

Cake_
16.06.2019, 17:08
как можно сделать линию только не на екране а в 3d?



C++:






SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
enpos
[
0
]
,
enpos
[
1
]
,
enpos
[
2
]
,
&
screen
[
0
]
,
&
screen
[
1
]
)
;




Update: enpos - 3д коорды , которые нужно перевести , screen - куда будут записаны 2д коорды

Stiopko
16.06.2019, 17:10
Перевести 3д координаты в 2д и отрисовать по этим координатам линию


А в 3d никак ?

А как узнать что обьект на екране?

И есть ли в SF массив со всема обектами, и массив c текстами (label)

Cake_
16.06.2019, 17:13
А в 3d никак ?
А как узнать что обьект на екране?
И есть ли в SF массив со всема обектами, и массив c текстами (label)



C++:






CPed
*
Pedself
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
;
if
(
Pedself
->
IsOnScreen
(
)
)
{
//Код
}

Stiopko
16.06.2019, 17:18
C++:






CPed
*
Pedself
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
;
if
(
Pedself
->
IsOnScreen
(
)
)
{
//Код
}







А это точно код который проверяет что объект на экране?

Stiopko
16.06.2019, 17:23
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
;
}

Cake_
16.06.2019, 17:24
Нашел

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
(
)
;
}




Или так

Stiopko
16.06.2019, 17:25
А в 3d никак ?
А как узнать что обьект на екране?
И есть ли в SF массив со всема обектами, и массив c текстами (label)



Не так сказал, есть ли в SF массив со всема созданными сервером объектами, и массив c текстами (label) (типа в зоне стрима)

__________

Нашел

Vintik
16.06.2019, 23:53
Приветствую. Хочу развёрнутый ответ на вопрос: как найти базовый адрес samp.dll (в CE можно сразу писать "samp.dll + ...[смещение"). Плиз, помогите =)

san0
17.06.2019, 00:00
Плиз, помогите =)


Здравствуйте) Хотелось бы посоветовать использовать след. 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 всегда автоматически масштабируется под размер объектов, на которые ссылается указатель

Vintik
17.06.2019, 00:58
Здравствуйте) Хотелось бы посоветовать использовать след. 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". Пожалуйста, покажите какой-либо готовый код (он же там не длинный), либо функцию, которая, зная хэндл ГТАшки, кидает мне БА сампа.длл. Буду очень благодарен =)

Cake_
17.06.2019, 02:05
В телеграмм скинул тебе



Lua:






setCharHeading




Какая альтернатива этому есть вC++/SF?


Ответа не нашел

_Vine_
17.06.2019, 02:39
Ответа не нашел



C++:






SF
->
getGame
(
)
->
actorInfoGet
(
ACTOR_SELF
,
0
)
->
base
.
m_heading

Stiopko
17.06.2019, 14:28
как можно изменить 3dText c какимто айдишником?

_Vine_
17.06.2019, 14:40
как можно изменить 3dText c какимто айдишником?



C++:






SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
ID
]

Stiopko
17.06.2019, 14:45
C++:






SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
ID
]





я так делал, не выходит, это просто информация

_Vine_
17.06.2019, 14:53
я так делал, не выходит, это просто информация


Я не понял, что ты хочешь

Stiopko
17.06.2019, 16:42
Я не понял, что ты хочешь


У меня есть айди 3d текста который пришел с сервера, мне нужно изменить в нём текст, и установить другую максимальную дальность видимости текста, хукать RPC и изменять данные RPC пакета не вариант потому что плагин могут загрузить когда RPC уже придет, поэтому я прохожусь по всем 3dtext там и ищу нужній мне и после того когда я нашел нужнужный я хочу изменить в нём текст, и установить другую максимальную дальность видимости текста

_Vine_
17.06.2019, 17:07
У меня есть айди 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

Stiopko
17.06.2019, 17:17
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% правильное

Stiopko
17.06.2019, 18:44
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


Не работает

Stiopko
17.06.2019, 18:52
Не работает


Замени 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
,
Функа
)
;




и ты это сделал?


Да, сделал.

Vintik
17.06.2019, 19:28
Спасибо за всё, но я так нифига и не понял.

Объясняю свою ситуацию. Я прочитал на различных форумах, как искать базовый адрес (ну + смещения и указатели) и начал искать базовый адрес информации игрока (SAMP), чтобы он него оттолкнуться и найти твой текущий ID (и я его нашёл). Выглядит оно примерно так (в кавычках БА): [samp.dll + 0x151434] + 0x2F1C -> указатель на ID. Теперь хочу написать на С++ программу, которая будет искать мой ID и сохранять его в какую-либо переменную (через ReadProcessMemory). Суть в том, что надо искать смещение для "samp.dll". Пожалуйста, покажите какой-либо готовый код (он же там не длинный), либо функцию, которая, зная хэндл ГТАшки, кидает мне БА сампа.длл. Буду очень благодарен =)


UP

_Vine_
17.06.2019, 19:46
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 вовсе.


Да, вызывается. Перестало работать после подключения имгуи

Stiopko
18.06.2019, 12:53
В сф некоторых структурах есть массив matrix что в нем, для чего он?

Cake_
18.06.2019, 13:04
В сф некоторых структурах есть массив matrix что в нем, для чего он?


Это матрица, которая хранит в себе числовые характеристики, она представлена в виде 2 х мерной структуры, в сампе в ней хранятся всякие позиции/углы и т.д



В сф некоторых структурах есть массив matrix что в нем, для чего он?


Можно сказать классификация, насколько я помню

Stiopko
18.06.2019, 14:00
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/

atizoff
18.06.2019, 20:11
Здрасте, как уменьшить 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

astap_
18.06.2019, 22:37
есть ли в собейте функция чтобы узнать ид игрока по нику? или самому сделать


в собейте нет. самому сделать несложно.

Код:






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();
}

LUCHARE
19.06.2019, 02:02
как можно узнать 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


Собейт не установлен, "этот дом" потому что пробовал полностью - тоже не работает.

Cake_
19.06.2019, 19:09
Собейт не установлен, "этот дом" потому что пробовал полностью - тоже не работает.


Как оно должно заработать если строка не полная ?! Уже сколько раз отвечал как работает функция 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
;
}




всегда дом не байед блеать

_Vine_
21.06.2019, 13:35
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
)
{
}

ALF
22.06.2019, 16:17
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
,
}
;

ishi
24.06.2019, 12:55
Как получить адрес(&) виртуального указателя-члена класса?

damag
24.06.2019, 13:56
Как сделать проверку на дистанцию игрока???

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) , при нажатии или изменении оно вернет тебе тру

sdfaw
25.06.2019, 00:32
при компиляции такая хуета



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 и тоже самое

как фиксить?

atizoff
25.06.2019, 00:37
при компиляции такая хуета

установил уже windows sdk 8.1 и тоже самое
как фиксить?


очень ахуенно ставлю клас

свойства проекта не открывал? там много чего интересного

sdfaw
25.06.2019, 00:47
очень ахуенно ставлю клас
свойства проекта не открывал? там много чего интересного


открывал

atizoff
25.06.2019, 00:47
открывал


молодец. скрин сам скинешь?

sdfaw
25.06.2019, 00:50
молодец. скрин сам скинешь?


зачем?

atizoff
25.06.2019, 00:54
зачем?





как фиксить?

sdfaw
25.06.2019, 01:03
что именно там кидать тебе?



молодец. скрин сам скинешь?



https://i.imgur.com/FAvqBIj.png

atizoff
25.06.2019, 01:08
что именно там кидать тебе?

https://i.imgur.com/FAvqBIj.png


ну во-первых активируй винду

во-вторых попробуй ребут компа, посмотри версии сдк, если есть новее, ставь новее

sdfaw
25.06.2019, 02:25
ну во-первых активируй винду
во-вторых попробуй ребут компа, посмотри версии сдк, если есть новее, ставь новее



https://i.imgur.com/54YJZ2w.png

ща релогну пк



ну во-первых активируй винду
во-вторых попробуй ребут компа, посмотри версии сдк, если есть новее, ставь новее


нихуя

возможно ли сделать чтобы при нажатии на ImGui::Button создавалась ещё ImGui::Button и так дальше при каждом нажатии +1 ImGui::Button?

LUCHARE
25.06.2019, 02:44
возможно ли сделать чтобы при нажатии на ImGui::Button создавалась ещё ImGui::Button и так дальше при каждом нажатии +1 ImGui::Button?



C++:






static
int
n
=
1
;
for
(
int
i
=
0
;
i
*/
)
.
c_str
(
)
)
)
{
n
++
;
}
}

liefasm
25.06.2019, 22:41
Вопрос скорей всего не по SAMP'у.

На днях мне было необходимо создать графическое приложение. Можно использовать C++ вместе с MFC, либо переехать на QT Creator, либо.. Либо использовать C# вместе с C++. Я бы хотел спросить про третий случай.

Кто нибудь уже пробовал создавать графику в C# и вызывать из C# функции (какие-нибудь системные вычисления) из своей библиотеки C++? Что можно сказать про производительность?

Просто я не сильно доверяю QT Creator из-за незнания самого продукта.

atizoff
27.06.2019, 23:59
Не знаю, ответите ли вы, но всё же.

Имеется 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)

liefasm
28.06.2019, 15:04
Сам никогда совмещение не практиковал, но есть вариант на крестах написать библиотеку и вызывать ее функции уже из шарпа.
В процессе поиска выяснилось, что это не так и сложно, как мне показалось изначально.
Но т.к. сам я никогда такое не практиковал, то мои советы скорее всего будут с нулевой пользой и я буду выступать твоим личным гуглом.
SO1 (https://www.blast.hk/redirect/aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNz cyMDQxL3VzaW5nLWMtbGlicmFyeS1pbi1jLXNoYXJw)
SO2 (https://www.blast.hk/redirect/aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMj UzMjkwNy9jb21iaW5pbmctYy1hbmQtYy1zaGFycA)



Хотелось бы встретить человека который бы сравнил производительность программы, которая была написана только на C# и программы которая бы комбинировала два языка.

RTD
28.06.2019, 16:16
Хук по адресу samp.dll + 0x65C60(это FUNC_SAMP_SENDCMD) конфликтит с SF, вызывая, к примеру из Lua скрипта, функцию

sampSendChat - выбрасывается "opcode '0AF9' call caused an unhandled exception". Есть другой адрес?

FYP
28.06.2019, 16:40
Хук по адресу samp.dll + 0x65C60(это FUNC_SAMP_SENDCMD) конфликтит с SF, вызывая, к примеру из Lua скрипта, функцию
sampSendChat - выбрасывается "opcode '0AF9' call caused an unhandled exception". Есть другой адрес?


если хук нарушает вызовы хукнутой функции, то проблема однозначно в самом хуке.

ШPEK
29.06.2019, 13:05
Как вернуть массив из функции?

index
29.06.2019, 14:58
C++:






char
*
Func
(
)
{
char
i
[
7
]
=
"cakebou"
;
return
i
;
}







Ты возвращаешь адрес локального массива, это даже не скомпилируется.

C++:






char
*
foo
(
)
{
char
*
bar
=
new
char
[
7
]
;
bar
=
"string"
;
return
bar
;
}




И после использования - не забыть освободить память.

atizoff
29.06.2019, 15:17
здрасте. почему код выполняет действие, даже не смотря на то, что я нажал кнопку?

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
)
;
}

LUCHARE
29.06.2019, 15:33
C++:






char
*
Func
(
)
{
char
i
[
7
]
=
"cakebou"
;
return
i
;
}








C++:






#include
auto
get_array
(
)
{
return
std
::
array

{
'a'
,
'b'
,
'c'
}
;
}

Stiopko
29.06.2019, 15:51
здрасте. почему код выполняет действие, даже не смотря на то, что я нажал кнопку?

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

atizoff
29.06.2019, 16:29
Попробуй вот это, у меня в плагинах норм работает

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
)
;
}
}

Stiopko
29.06.2019, 18:11
не, пачаны. этот 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




?

sdfaw
29.06.2019, 22:36
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, нельзя преобразовать в другой тип

как исправить?

ufdhbi
29.06.2019, 22:41
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, нельзя преобразовать в другой тип

как исправить?


убрать войд в аргументе функи?

ШPEK
29.06.2019, 22:56
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() и

убери скобочки () в регистрации команды



убрать войд в аргументе функи?


Никак не помешает

sdfaw
29.06.2019, 23:35
void CALLBACK mapMenuTeleport() и
убери скобочки () в регистрации команды

Никак не помешает


тоже самое

sdfaw
30.06.2019, 00:47
Ответ выше


я уже решил эту проблему

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) как только поставил сразу ошибки и не компилит

ШPEK
30.06.2019, 13:19
можно как то не дать серверу воспроизводить звук? например, 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
;
}