
22.04.2016, 20:05
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Ничего нет. Разберись сам. можешь опкоды СФ для работы с текстдравами заюзать.
|
|
|

22.04.2016, 22:06
|
|
Постоянный
Регистрация: 10.07.2015
Сообщений: 642
С нами:
5706781
Репутация:
43
|
|
struct stTextdraw
{
char szText[800 + 1]; // Вроде как за текст?
char szString[1600 + 2];//Тоже текст
float fLetterWidth; Ширина
float fLetterHeight; Высота
DWORD dwLetterColor;//Цвет
uint8_t byte_unk; // always = 01 (?)
BYTE byteCenter; Выравнивание по центру
BYTE byteBox;// Бокс
float fBoxSizeX;//Размер Бокса по X
float fBoxSizeY;//Размеры Бокса по Y
DWORD dwBoxColor;//Цвет Бокса
BYTE byteProportional;// Пропорциональность, потести, поймешь.
DWORD dwShadowColor;// Цвет тени
BYTE byteShadowSize;//Размер тени
BYTE byteOutline;// Обводка
BYTE byteLeft;// Выравнивание по левому краю
BYTE byteRight;// Выравнивание по правому краю
int iStyle; // font style/texture/model |Так понял стиль textdraw
float fX;// Позиция текстдрава
float fY;//Позиция текстдрава
byte unk[8];// ?
DWORD dword99B; // -1 by default ???
DWORD dword99F; // -1 by default ???
DWORD index; // -1 if bad ID textdraw'a?
BYTE byte9A7; // = 1; 0 by default ???
uint16_t sModel; //???
float fRot[3];//???
float fZoom;//???
WORD sColor[2];// Цвет чего-то
BYTE f9BE; //???
BYTE byte9BF;//???
BYTE byte9C0;//???
DWORD dword9C1;//???
DWORD dword9C5;//???
DWORD dword9C9;//???
DWORD dword9CD;//???
BYTE byte9D1;//???
DWORD dword9D2;//???
};
struct stTextdrawPool
{
int iIsListed[SAMP_MAX_TEXTDRAWS]; //Существует ли глобальный textdraw?
int iPlayerTextDraw[SAMP_MAX_PLAYERTEXTDRAWS];//Существует ли textdraw для игрока?
struct stTextdraw *textdraw[SAMP_MAX_TEXTDRAWS];// массив текстдравов. То есть, можно обращаться к элементам и получать текстдрав по его ID
struct stTextdraw *playerTextdraw[SAMP_MAX_PLAYERTEXTDRAWS];// массив текстдравов игрока ^
};
|
|
|

23.04.2016, 12:05
|
|
Новичок
Регистрация: 13.12.2020
Сообщений: 0
С нами:
2851002
Репутация:
0
|
|
пытаюсь прочитать позицию пикапа с помощью перехвата RPC, но правильно читается только его ID, а всё остальное - нет.
Код:
Код:
else if (params->packetId == ScriptRPCEnumeration::RPC_ScrCreatePickup)
{
short pickup_id;
float pos[3];
int model_id;
int type;
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(pickup_id); // читаем отправляемые данные
params->bitStream->Read(model_id); // читаем отправляемые данные
params->bitStream->Read(type); // читаем отправляемые данные
params->bitStream->Read(pos); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
SF->getSAMP()->getChat()->AddChatMessage(-1, "%d %f %f %f", pickup_id, pos[0], pos[1], pos[2]);
return true;
}
Решил методом тыка.
Код:
Код:
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(pickup_id); // читаем отправляемые данные
params->bitStream->SetReadOffset(96);
params->bitStream->Read(pos[0]); // читаем отправляемые данные
params->bitStream->Read(pos[1]); // читаем отправляемые данные
params->bitStream->Read(pos[2]); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
SF->getSAMP()->getChat()->AddChatMessage(-1, "%d %f %f %f", pickup_id, pos[0], pos[1], pos[2]);
|
|
|

23.04.2016, 15:41
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Сообщение от Dimoz
пытаюсь прочитать позицию пикапа с помощью перехвата RPC, но правильно читается только его ID, а всё остальное - нет.
Код:
Код:
else if (params->packetId == ScriptRPCEnumeration::RPC_ScrCreatePickup)
{
short pickup_id;
float pos[3];
int model_id;
int type;
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(pickup_id); // читаем отправляемые данные
params->bitStream->Read(model_id); // читаем отправляемые данные
params->bitStream->Read(type); // читаем отправляемые данные
params->bitStream->Read(pos); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
SF->getSAMP()->getChat()->AddChatMessage(-1, "%d %f %f %f", pickup_id, pos[0], pos[1], pos[2]);
return true;
}
Решил методом тыка.
Код:
Код:
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(pickup_id); // читаем отправляемые данные
params->bitStream->SetReadOffset(96);
params->bitStream->Read(pos[0]); // читаем отправляемые данные
params->bitStream->Read(pos[1]); // читаем отправляемые данные
params->bitStream->Read(pos[2]); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
SF->getSAMP()->getChat()->AddChatMessage(-1, "%d %f %f %f", pickup_id, pos[0], pos[1], pos[2]);
https://docs.google.com/spreadsheet/ccc?key=0AtKPKl8O9mGodFZESEp6WEdzcTB0U2V1ZkR0UWpub 1E#gid=1
|
|
|

23.04.2016, 16:03
|
|
Постоянный
Регистрация: 10.07.2015
Сообщений: 642
С нами:
5706781
Репутация:
43
|
|
Мой хук работает так:
Я хукаю оргинальную функцию Present (или End Scene) моей функцией Present. Когда оригинальная функция Present вызовется игрой, сначала выполнится моя функция, а потом в конце моей функции я вызову стандартную функцию. Но в SFAPI там немного по другому. То есть, оригинальная функция не вызывается ибо в конце функций стоит не return originalPresent(pDevice, ...), а просто return TRUE. Как это работает в SFAPI? Это другой вид хука?
|
|
|

23.04.2016, 16:21
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
В СФ юзается хук как в собейте. Можешь там глянуть.
|
|
|

23.04.2016, 21:53
|
|
Постоянный
Регистрация: 10.07.2015
Сообщений: 642
С нами:
5706781
Репутация:
43
|
|
Сообщение от Dark_Knight
В СФ юзается хук как в собейте. Можешь там глянуть.
Но там тоже в конце выполняется оригинальная функция present.
Код:
Код:
HRESULT proxyIDirect3DDevice9::Present ( CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride,
CONST RGNDATA *pDirtyRegion )
{
traceLastFunc( "proxyIDirect3DDevice9::Present()" );
renderHandler();
// get original function to return
return origIDirect3DDevice9->Present( pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion );
}
|
|
|

23.04.2016, 22:06
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
И?
|
|
|

23.04.2016, 23:06
|
|
Постоянный
Регистрация: 10.07.2015
Сообщений: 642
С нами:
5706781
Репутация:
43
|
|
Сообщение от Dark_Knight
И?
А в SFAPI функция просто возвращает TRUE. То есть, оригинальная функция не вызывается. Почему так?
|
|
|

24.04.2016, 15:31
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
Сообщение от AWRage
А в SFAPI функция просто возвращает TRUE. То есть, оригинальная функция не вызывается. Почему так?
плагинов может быть over9000, а хуков столько не надо. Сам хук находится в СФ и он вызывает стандартную функцию в конце, а в теле хука опрашивает функции в плагинах и рисует чот свое.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|