F0RQU1N and
Известный
- 1,309
- 498
к обоимif (условие) {
действие
}
else if (условие) {
действие
}
else {
действие
}
else будет к чему относиться? к else if или if?
к обоимif (условие) {
действие
}
else if (условие) {
действие
}
else {
действие
}
else будет к чему относиться? к else if или if?
uint16_t playerId = 3;
const char* Name = "noname";
BitStream bsClass;
bsClass.Write(playerId);
bsClass.Write(Name);
SF->getRakNet()->emulateRecvRPC(11, &bsClass);
лайфхак: добавляем эти строки в BitStream.h куда-нибудь вниз, и кайфуемЕсли найду сообщение, то покажу пример как с std::string можно удобно записывать строки в рпц
template<>
inline void BitStream::Write(std::string var) {
Write(var.size());
Write(var.c_str(), var.size());
}
#if __cpp_lib_string_view >= 201606
template<>
inline void BitStream::Write(std::string_view var) {
Write(var.size());
Write(var.data(), var.size());
}
#endif
std::string aye_string = "АУЕ";
bs.Write(aye_string);
Хороший вариант, но size вроде 4 байта занимает, а для некоторых РПЦ такое не подойдет. У RPC_ScrShowDialog параметры строк идут в одном байте. Хотя можно еще добавить в каком типе длины записывать строку.лайфхак: добавляем эти строки в BitStream.h куда-нибудь вниз, и кайфуем
C++:template<> inline void BitStream::Write(std::string var) { Write(var.size()); Write(var.c_str(), var.size()); } #if __cpp_lib_string_view >= 201606 template<> inline void BitStream::Write(std::string_view var) { Write(var.size()); Write(var.data(), var.size()); } #endif
Ну и пример:
C++:std::string aye_string = "АУЕ"; bs.Write(aye_string);
void CShadows::RemoveOilInArea(float x1, float y1, float x2, float y2) {
((void(__cdecl *)(float, float, float, float))0x7074F0)(x1, y1, x2, y2);
}
case RPC_ShowDialog:
{
traceLastFunc("RPC_ShowDialog");
if (cheat_state->_generic.cheat_panic_enabled)
break;
traceLastFunc("RPC_ShowDialog");
/*
{'onShowDialog',
{dialogId = 'uint16'},
{style = 'uint8'},
{title = 'string8'},
{input = 'string8'},
{button2 = 'string8'},
{text = 'encodedString4096'}}
*/
BitStream bsData(rpcParams->input, rpcParams->numberOfBitsOfData / 8, false);
WORD dialogId;
uint8_t style, titleLen, button1Len, button2Len, textLen;
char title[257], button1[257], button2[257], text[4096];
bsData.Read(dialogId);
bsData.Read(style);
bsData.Read(titleLen);
bsData.Read(title, titleLen);
title[titleLen] = '\0';
bsData.Read(button1Len);
bsData.Read(button1, button1Len);
button1[button1Len] = '\0';
bsData.Read(button2Len);
bsData.Read(button2, button2Len);
button2[button2Len] = '\0';
bsData.Read(textLen);
bsData.Read(text, textLen);
text[textLen] = '\0';
addMessageToChatWindow("Coded: %s", text);
stringCompressor->DecodeString(text, 0x1000, &bsData, 0);
addMessageToChatWindow("Decoded: %s", text);
ниче правильно он читает.Все ты правильно сделал по чтению. Одно сообщение в чате может быть до 144 символов и если при добавлении строки в чат в ней будут переносы, то автоматического разделение не будет
в RPC_ScrShowDialog текст диалога записан по другому и для его чтения надо использовать DecodeString. То как ты сделал неправильно, потому что своим "Read" в этих строках ты сдвинул курсор чтения и поэтому все поломалось. Зачем тебе вообще encoded текст? Вот правильный пример: https://www.blast.hk/threads/781/post-338475, но он для 0.3.7 r1, хз поменялось ли что то в 0.3dl, но думаю что нет.bsData.Read(textLen); bsData.Read(text, textLen);
ниче правильно он читает.
в RPC_ScrShowDialog текст диалога записан по другому и для его чтения надо использовать DecodeString. То как ты сделал неправильно, потому что своим "Read" в этих строках ты сдвинул курсор чтения и поэтому все поломалось. Зачем тебе вообще encoded текст? Вот правильный пример: https://www.blast.hk/threads/781/post-338475, но он для 0.3.7 r1, хз поменялось ли что то в 0.3dl, но думаю что нет.
void HandleRPCPacketFunc(unsigned char id, RPCParameters *rpcParams, void(*callback) (RPCParameters *))
{
StringCompressor::AddReference();
StringTable::AddReference();
if (!isCheatPanicEnabled())
{
if (set.netPatchAssoc[id][INCOMING_RPC] != nullptr && set.netPatchAssoc[id][INCOMING_RPC]->enabled)
return;
}
if (rpcParams != nullptr && rpcParams->numberOfBitsOfData >= 8)
struct stDialogInfo
{
IDirect3DDevice9 *m_pD3DDevice;
int iTextPoxX;
int iTextPoxY;
uint32_t uiDialogSizeX;
uint32_t uiDialogSizeY;
int iBtnOffsetX;
int iBtnOffsetY;
class _CDXUTDialog *pDialog;
class _CDXUTListBox *pList;
class _CDXUTIMEEditBox *pEditBox;
int iIsActive;
int iType;
uint32_t DialogID;
char pText[1000];
uint32_t uiTextWidth;
uint32_t uiTextHeight;
char szCaption[65];
int bServerside;
};
Exception thrown at location 0x03B1B396 (samp.dll) in gta_sa.exe: 0xC0000005: Access violation while reading at location 0x0029E868.
Точно. Там чтение в одну строку всего лишь) Оказался не прав) Но на счет вывода сообщений он весь текст с диалога в чат не выведет.ниче правильно он читает.
в RPC_ScrShowDialog текст диалога записан по другому и для его чтения надо использовать DecodeString. То как ты сделал неправильно, потому что своим "Read" в этих строках ты сдвинул курсор чтения и поэтому все поломалось. Зачем тебе вообще encoded текст? Вот правильный пример: https://www.blast.hk/threads/781/post-338475, но он для 0.3.7 r1, хз поменялось ли что то в 0.3dl, но думаю что нет.
You need to hook up to some functions including the RPC call you get from a server in a different way and not of sobeitУ меня нет RPC_ScrShowDialog, только RPC_ShowDialog, поэтому я могу читать только через bsData.read, а не через params->bitStream->Read.
Кроме того, у меня нет структуры stSAMPDialog, но есть stDialogInfo, который содержит это:C++:void HandleRPCPacketFunc(unsigned char id, RPCParameters *rpcParams, void(*callback) (RPCParameters *)) { StringCompressor::AddReference(); StringTable::AddReference(); if (!isCheatPanicEnabled()) { if (set.netPatchAssoc[id][INCOMING_RPC] != nullptr && set.netPatchAssoc[id][INCOMING_RPC]->enabled) return; } if (rpcParams != nullptr && rpcParams->numberOfBitsOfData >= 8)
Я пытался сделать это на своей структуре, но это ничего не изменило, и при вставке структуры stSampdialog я мог только читать пустой текст.C++:struct stDialogInfo { IDirect3DDevice9 *m_pD3DDevice; int iTextPoxX; int iTextPoxY; uint32_t uiDialogSizeX; uint32_t uiDialogSizeY; int iBtnOffsetX; int iBtnOffsetY; class _CDXUTDialog *pDialog; class _CDXUTListBox *pList; class _CDXUTIMEEditBox *pEditBox; int iIsActive; int iType; uint32_t DialogID; char pText[1000]; uint32_t uiTextWidth; uint32_t uiTextHeight; char szCaption[65]; int bServerside; };
Мне нужен текст диалога, так как никнеймы в списке игроков анонимны и были перемещены в диалог вместе с id, поэтому мне нужен текст диалога, чтобы прочитать, какой id имеет какой ник, а затем заменить никнеймы игроки.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
после загрузки samp происходит вылет игры, sampfuncs 0.3dl, отладчик выдал эти адреса. На mod_sa по умолчанию нет сбоя, что может быть причиной такого сбоя?
Код:Exception thrown at location 0x03B1B396 (samp.dll) in gta_sa.exe: 0xC0000005: Access violation while reading at location 0x0029E868.
Хукнуть входящие пакеты🤡Как достать onfoot syns другого игрока и получить оттуда информацию?