Как обрабатывать сообщения чата? Я имею в виду, как изменить сообщение, которое появляется в чате, прежде чем он это сделает?
bool CALLBACK incomingRPC(stRakNetHookParams *params) {
if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
{
D3DCOLOR color = -1;
int length = 0;
char message[144]{ 0 };
params->bitStream->Read(color);
params->bitStream->Read(length);
params->bitStream->Read(message, length);
if (!strcmp(message, " "))
return false;
if (strstr(message,"Какое то сообщение пришло") != NULL)
{
SF->getSAMP()->getChat()->AddChatMessage(-1, ">> Какое то сообщение отредактировано");
return false;
}
return true;
};
SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
Большое спасибоСтавишь хук на RPC_ScrClientMessage. В нём добавляешь проверку , на необходимые тебе сообщения.
Если сообщение пришло возвращаешь return false; и выводишь своё сообщение.
C++:bool CALLBACK incomingRPC(stRakNetHookParams *params) { if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage) { D3DCOLOR color = -1; int length = 0; char message[144]{ 0 }; params->bitStream->Read(color); params->bitStream->Read(length); params->bitStream->Read(message, length); if (!strcmp(message, " ")) return false; if (strstr(message,"Какое то сообщение пришло") != NULL) { SF->getSAMP()->getChat()->AddChatMessage(-1, ">> Какое то сообщение отредактировано"); return false; } return true; };
в mainloop , до init = true;
C++:SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
Много вас таких, не способных сделать ползунок.Делаю ползунок. И не могу составить формулу.
Данный код .
// maxsize , максимальное значение для ползунка , не длинна.
....
Т.Е. Допустим будет максимальное значение 1 , значит 0 будет в начале линии , 1 будет в конце уже.
макс. значение 300 , 0 в начале линии , 300 в конце..
Ну думаю понятно это .
// var , переменная в которую будет записываться значение ползунка.
C++:bool SlideInt(std::string text, int maxsize, int &var) { static int iPoligonX = ((var / 280) * maxsize); // Положение ползунка на линии. Тут и не могу составить нормальную формулу. SF->getRender()->DrawLine(0, 900 , 280, 900, 2, -1); // Сама линия SF->getRender()->DrawPolygon(iPoligonX, 900, 10, 10, 0, 20, D3DCOLOR_ARGB(155, 0, 0, 255)); // Ползунок }
void CNode::DrawScrollBarVertical( int so_V, int so_H )
{
int fullScroll = _size.y - 4;
float rollerSize = (float)_size.y / ((float)_scrollSizeVertical) * (float)fullScroll;
float rollerOffset = (float)_size.y / ((float)_scrollSizeVertical) * (float)_scrollOffsetVertical;
_draw->D3DBox( _pos.x + _size.x - so_H, _pos.y - so_V, 6, _size.y, _scrollFrame );
_draw->D3DBox( _pos.x + _size.x + 2 - so_H, (_pos.y + 2) - so_V, 2, fullScroll, _scrollMat );
_draw->D3DBox( _pos.x + _size.x + 2 - so_H, (_pos.y + 2 + rollerOffset) - so_V, 2, rollerSize, _scrollRoller );
}
void CNode::DrawScrollBarHorizontal( int so_V, int so_H )
{
float rollerSize = (float)_size.x / ((float)_scrollSizeHorizontal) * (float)_size.x;
float rollerOffset = (float)_size.x / ((float)_scrollSizeHorizontal) * (float)_scrollOffsetHorizontal;
_draw->D3DBox( _pos.x - so_H, (_pos.y + _size.y) - so_V, _size.x + 6, 6, _scrollFrame );
_draw->D3DBox( _pos.x + 3 - so_H, (_pos.y + _size.y + 2) - so_V, _size.x, 2, _scrollMat );
_draw->D3DBox( _pos.x + 3 + rollerOffset - so_H, (_pos.y + _size.y + 2) - so_V, rollerSize, 2, _scrollRoller );
}
switch ( uMsg )
{
case WM_MOUSEWHEEL:
if ( GET_WHEEL_DELTA_WPARAM( wParam ) < 0 ){
_scrollOffsetVertical += _scrollStep;
if ( _scrollOffsetVertical + _size.y > _scrollSizeVertical )
_scrollOffsetVertical = _scrollSizeVertical - _size.y;
}
else{
_scrollOffsetVertical -= _scrollStep;
if ( _scrollOffsetVertical < 0 )
_scrollOffsetVertical = 0;
}
return false;
case WM_KEYDOWN:
switch ( wParam )
{
case VK_UP:
_scrollOffsetVertical -= _scrollStep;
if ( _scrollOffsetVertical < 0 )
_scrollOffsetVertical = 0;
return false;
case VK_DOWN:
_scrollOffsetVertical += _scrollStep;
if ( _scrollOffsetVertical + _size.y > _scrollSizeVertical )
_scrollOffsetVertical = _scrollSizeVertical - _size.y;
return false;
case VK_LEFT:
_scrollOffsetHorizontal -= _scrollStep;
if ( _scrollOffsetHorizontal < 0 )
_scrollOffsetHorizontal = 0;
return false;
case VK_RIGHT:
_scrollOffsetHorizontal += _scrollStep;
if ( _scrollOffsetHorizontal + _size.x > _scrollSizeHorizontal )
_scrollOffsetHorizontal = _scrollSizeHorizontal - _size.x;
return false;
case VK_PRIOR:
_scrollOffsetVertical = 0;
return false;
case VK_NEXT:
_scrollOffsetVertical = _scrollSizeVertical - _size.y;
return false;
case VK_HOME:
_scrollOffsetHorizontal = 0;
return false;
case VK_END:
_scrollOffsetHorizontal = _scrollSizeHorizontal - _size.x;
return false;
default:
break;
}
break;
default:
break;
}
Благодарю , но оказывается , было вроде как все правильно , просто ползнунок оставался на том же месте , пока до него не дотронешься...Много вас таких, не способных сделать ползунок.
C++:void CNode::DrawScrollBarVertical( int so_V, int so_H ) { int fullScroll = _size.y - 4; float rollerSize = (float)_size.y / ((float)_scrollSizeVertical) * (float)fullScroll; float rollerOffset = (float)_size.y / ((float)_scrollSizeVertical) * (float)_scrollOffsetVertical; _draw->D3DBox( _pos.x + _size.x - so_H, _pos.y - so_V, 6, _size.y, _scrollFrame ); _draw->D3DBox( _pos.x + _size.x + 2 - so_H, (_pos.y + 2) - so_V, 2, fullScroll, _scrollMat ); _draw->D3DBox( _pos.x + _size.x + 2 - so_H, (_pos.y + 2 + rollerOffset) - so_V, 2, rollerSize, _scrollRoller ); } void CNode::DrawScrollBarHorizontal( int so_V, int so_H ) { float rollerSize = (float)_size.x / ((float)_scrollSizeHorizontal) * (float)_size.x; float rollerOffset = (float)_size.x / ((float)_scrollSizeHorizontal) * (float)_scrollOffsetHorizontal; _draw->D3DBox( _pos.x - so_H, (_pos.y + _size.y) - so_V, _size.x + 6, 6, _scrollFrame ); _draw->D3DBox( _pos.x + 3 - so_H, (_pos.y + _size.y + 2) - so_V, _size.x, 2, _scrollMat ); _draw->D3DBox( _pos.x + 3 + rollerOffset - so_H, (_pos.y + _size.y + 2) - so_V, rollerSize, 2, _scrollRoller ); }
so_V и so_H тебе не нужны скорее всего - можешь их просто удалить или передавать нули.
Прокрутка:
C++:switch ( uMsg ) { case WM_MOUSEWHEEL: if ( GET_WHEEL_DELTA_WPARAM( wParam ) < 0 ){ _scrollOffsetVertical += _scrollStep; if ( _scrollOffsetVertical + _size.y > _scrollSizeVertical ) _scrollOffsetVertical = _scrollSizeVertical - _size.y; } else{ _scrollOffsetVertical -= _scrollStep; if ( _scrollOffsetVertical < 0 ) _scrollOffsetVertical = 0; } return false; case WM_KEYDOWN: switch ( wParam ) { case VK_UP: _scrollOffsetVertical -= _scrollStep; if ( _scrollOffsetVertical < 0 ) _scrollOffsetVertical = 0; return false; case VK_DOWN: _scrollOffsetVertical += _scrollStep; if ( _scrollOffsetVertical + _size.y > _scrollSizeVertical ) _scrollOffsetVertical = _scrollSizeVertical - _size.y; return false; case VK_LEFT: _scrollOffsetHorizontal -= _scrollStep; if ( _scrollOffsetHorizontal < 0 ) _scrollOffsetHorizontal = 0; return false; case VK_RIGHT: _scrollOffsetHorizontal += _scrollStep; if ( _scrollOffsetHorizontal + _size.x > _scrollSizeHorizontal ) _scrollOffsetHorizontal = _scrollSizeHorizontal - _size.x; return false; case VK_PRIOR: _scrollOffsetVertical = 0; return false; case VK_NEXT: _scrollOffsetVertical = _scrollSizeVertical - _size.y; return false; case VK_HOME: _scrollOffsetHorizontal = 0; return false; case VK_END: _scrollOffsetHorizontal = _scrollSizeHorizontal - _size.x; return false; default: break; } break; default: break; }
Размер скролла у меня указывается в пикселях, но можно притянуть и строки.
Как загрузить и отрисовать текстуру с помощью SFAPI? К примеру Дигла. Спасибо.
А в чем проблема то?
В VS нажимаешь Добавить-> Новый объект -> Файл ресурсов .rc
Открываешь его дабл кликом, если он сам не открылся.
Добавляешь ресурс вот так
![]()
В окошке нажимаешь импорт, выбираешь картинку где-угодно и пишешь тип ресурса RCDATA
Далее просто открыть эту папку(RCDATA) в этом же "окошке" и посмотреть/поменять id ресурса: по умолчанию это IDR_RCDATA1, 2 итд
К примеру, я изменил имя на IDR_LANDSCAPE
Ну и аналогично тому, как и происходит рендер с файла, объявить callback и переменные. Загрузить так (даже никаких макросов на преобразование в LPTSTR не нужно):
pTexture = SF->getRender()->LoadTextureFromResource(IDR_LANDSCAPE, -1);
Результат очевиден:
![]()
Какую кнопку, какие вещи?Как сделать кнопку (и вещи, когда я ее нажимаю)?
Но это открытое меню! Мне требуется, не допускать его открытия.SF->getGame()-isActiveMenu()
wndproc хукани и там обрывайПоказываю своё меню на рендере (SF), мышь показываю путем SF->getSAMP()->getMisc()->ToggleCursor(true);, вопрос! Как отловить нажатие ESC, дабы скрыть курсор с меню моим, блокируя показ игрового меню?