 |
|

14.05.2019, 21:01
|
|
Постоянный
Регистрация: 05.03.2014
Сообщений: 626
С нами:
6415078
Репутация:
163
|
|
Сообщение от Imbecil
а как? напиши, пожалуйста, а то я дурачек
Код:
Код:
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;
};
|
|
|

15.05.2019, 14:05
|
|
Постоянный
Регистрация: 17.06.2015
Сообщений: 578
С нами:
5739536
Репутация:
98
|
|
Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про 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;
}
|
|
|

15.05.2019, 14:10
|
|
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами:
4793630
Репутация:
133
|
|
Сообщение от HanPrincess
Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про 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
|
|
|

15.05.2019, 14:15
|
|
Постоянный
Регистрация: 17.06.2015
Сообщений: 578
С нами:
5739536
Репутация:
98
|
|
Сообщение от cakebou
Первой строкой поставь. Нужно вводить не просто /showinfo, в команде должен быть один параметр, в данном случае это id игрока ( 0 - 1000).
C++:
Код:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенкс
|
|
|

15.05.2019, 15:02
|
|
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами:
4793630
Репутация:
133
|
|
Сообщение от HanPrincess
Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенкс
Чтобы вывестисвои данныевот код:
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
)
;
|
|
|

15.05.2019, 15:03
|
|
Участник форума
Регистрация: 04.07.2015
Сообщений: 168
С нами:
5715860
Репутация:
78
|
|
Вопрос:
Есть такая структура:
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
;
}
;
Но в cheat engine она выглядит совсем не так, данные то в ней есть, вроде IP и Hostname, но они расположены на каких-то непонятных оффсетах, почему структура в C++ выглядит не так, как в CheatEngine, смотрел еще некоторые структуры - так там данные в CE расположены в том же порядке, что и в C++
|
|
|

15.05.2019, 15:31
|
|
Новичок
Регистрация: 18.10.2015
Сообщений: 6
С нами:
5563739
Репутация:
0
|
|
[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
|
|
|

15.05.2019, 15:40
|
|
Участник форума
Регистрация: 04.07.2015
Сообщений: 168
С нами:
5715860
Репутация:
78
|
|
Сообщение от index
Как минимум - у Вас несоответствие кодировок. ANSI программа использующая ANSI версии функций winApi у Вас принимает в качестве аргументов const wchar_t * (строки L"..."), что является ошибкой.
А как более - хороший пример по external получению списка игроков написан в samp udf for ahk. Все оффсеты есть в верхней части файла в массивах, где 1, 2, 3 позиции соответствуют версиям 0.3.7r1, r2, 0.3dl с поправкой для global SAMP_REMOTEPLAYERDATA_PED := [0x2A4, 0x40, 0x40].
Также для определения причин вылета лучше применять отладчик, т.к. сообщение "у меня крашит" практически не несет в себе полезной нагрузки, а узнать причины краша Вы можете самостоятельно.
Вероятно, дело в выравнивании структур компилятором. Статья 1, Статья 2
Спасибо! Надеюсь это мне поможет!
|
|
|

15.05.2019, 15:54
|
|
Постоянный
Регистрация: 17.06.2015
Сообщений: 578
С нами:
5739536
Репутация:
98
|
|
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге
Код:
Код:
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;
};
|
|
|

15.05.2019, 16:13
|
|
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами:
4793630
Репутация:
133
|
|
Сообщение от HanPrincess
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге
Код:
Код:
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;
};
Читаешь длину текста, читаешь сам текст, декодишь, убираешь мусор.
Сообщение от cakebou
Читаешь длину текста, читаешь сам текст, декодишь, убираешь мусор.
Parameters: UINT16 wDialogID, UINT8 bDialogStyle, UINT8 bTitleLength, char[] szTitle, UINT8 bButton1Len, char[] szButton1, UINT8 bButton2Len, char[] szButton2, CSTRING szInfo
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|