Другое С/С++ Вопрос - Ответ

Vesca

Новичок
20
0
Как обрабатывать сообщения чата? Я имею в виду, как изменить сообщение, которое появляется в чате, прежде чем он это сделает?
 

iAmerican

Известный
Друг
615
257
Как обрабатывать сообщения чата? Я имею в виду, как изменить сообщение, которое появляется в чате, прежде чем он это сделает?

Ставишь хук на 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);
 

Vesca

Новичок
20
0
Ставишь хук на 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);
Большое спасибо
 

SR_team

like pancake
BH Team
4,720
6,367
Делаю ползунок. И не могу составить формулу.
Данный код .
// 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)); // Ползунок

}
Много вас таких, не способных сделать ползунок.
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;
    }

Размер скролла у меня указывается в пикселях, но можно притянуть и строки.
 
  • Нравится
Реакции: iAmerican

iAmerican

Известный
Друг
615
257
Много вас таких, не способных сделать ползунок.
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;
    }

Размер скролла у меня указывается в пикселях, но можно притянуть и строки.
Благодарю , но оказывается , было вроде как все правильно , просто ползнунок оставался на том же месте , пока до него не дотронешься...
 

Medvedko

Новичок
19
0
Как загрузить и отрисовать текстуру с помощью SFAPI? К примеру Дигла. Спасибо.
 

iAmerican

Известный
Друг
615
257
Как загрузить и отрисовать текстуру с помощью SFAPI? К примеру Дигла. Спасибо.
А в чем проблема то?
В VS нажимаешь Добавить-> Новый объект -> Файл ресурсов .rc
Открываешь его дабл кликом, если он сам не открылся.
Добавляешь ресурс вот так
d753f5e4aa.png

В окошке нажимаешь импорт, выбираешь картинку где-угодно и пишешь тип ресурса RCDATA
Далее просто открыть эту папку(RCDATA) в этом же "окошке" и посмотреть/поменять id ресурса: по умолчанию это IDR_RCDATA1, 2 итд
К примеру, я изменил имя на IDR_LANDSCAPE

Ну и аналогично тому, как и происходит рендер с файла, объявить callback и переменные. Загрузить так (даже никаких макросов на преобразование в LPTSTR не нужно):
pTexture = SF->getRender()->LoadTextureFromResource(IDR_LANDSCAPE, -1);

Результат очевиден:
3486a93e8d.png
 

Medvedko

Новичок
19
0
А нельзя ли это завязать не на ресурсах проекта, а на внутриигровых текстурах? Да бы вызывать его по иду.
 

Sonik Mells

Известный
12
2
Показываю своё меню на рендере (SF), мышь показываю путем SF->getSAMP()->getMisc()->ToggleCursor(true);, вопрос! Как отловить нажатие ESC, дабы скрыть курсор с меню моим, блокируя показ игрового меню?
 

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,260
1,740
Показываю своё меню на рендере (SF), мышь показываю путем SF->getSAMP()->getMisc()->ToggleCursor(true);, вопрос! Как отловить нажатие ESC, дабы скрыть курсор с меню моим, блокируя показ игрового меню?
wndproc хукани и там обрывай
 

ishi

Известный
493
110
Как получить адрес символьного массива? (через & не хочет, ошибка)