Другое SAMPFUNCS | API C++

mrdiimax

Известный
566
79
@mrdiimax

C++:
bool CALLBACK incomingRPC(stRakNetHookParams *params)
{
    if( params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
        uint32_t strLen, color;
        char msg[144];

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(color);
        params->bitStream->Read(strLen);
        params->bitStream->Read(msg, strLen);
        msg[strLen] = '\0';
        params->bitStream->ResetReadPointer();
                   
        if (strstr(msg, "хуй"))
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "йоу, мы нашли хуй");
        }
    }
    return true;
}
Тоесть если будет строка "хуй" будет выведено смс "йоу, мы нашли хуй" да?Сяп
 
  • Нравится
Реакции: Vandal™

ALF

Известный
Проверенный
320
539
Да.
Зарегистрировать в mainloop не забудь
 

vasiliy130198

Новичок
27
0
Здравствуйте. Не знаю поднималась ли эта тема здесь..
1) Возможно ли вообще получить информацию о каком-то текстдраве, который отображен на экране?
2) Как имитировать нажатие какой-то клавиши на клавиатуре?
Как эти функции с двух пунктов называются, и как найти их?

Мне нужно будет реализовать вечный цикл с паузой допустим 5 мс, в котором будет отлавливаться текстдрав со строкой "PRESS: ", и имитировать нажатие соответствующей клавиши.Y / H / N, буква которой будет после двоеточия.

Заранее спасибо за помощь :)
 

BlackKnigga

Известный
BH Team
922
446
Здравствуйте. Не знаю поднималась ли эта тема здесь..
1) Возможно ли вообще получить информацию о каком-то текстдраве, который отображен на экране?
2) Как имитировать нажатие какой-то клавиши на клавиатуре?
Как эти функции с двух пунктов называются, и как найти их?

Мне нужно будет реализовать вечный цикл с паузой допустим 5 мс, в котором будет отлавливаться текстдрав со строкой "PRESS: ", и имитировать нажатие соответствующей клавиши.Y / H / N, буква которой будет после двоеточия.

Заранее спасибо за помощь :)
1. Возможно
2. SendMessage(но это не точно), SendInput.
Но в сампе лучше слать нажатие через player_sync
 

mkrn

Известный
67
63
1. Возможно
2. SendMessage(но это не точно), SendInput.
Но в сампе лучше слать нажатие через player_sync

не всегда player_sync, если перс будет в тачке за рулём, то инкар дата, если на пассажирке - passenger data. Некоторые кнопки находятся в currentweapon, например N
 
Последнее редактирование:

vasiliy130198

Новичок
27
0
SF->getSAMP()->getInfo()->pPools->pTextdraw
Дальше надеюсь разберешься
Да, спасибо большое. Последний вопросик.. вот есть такой код, который показывает текст при определённом условии:
C++:
if (SUCCEEDED(SF->getRender()->BeginRender()))
{
   stFontInfo *pFont;
   pFont = SF->getRender()->CreateNewFont("Arial", 12, 13);
   pFont->Print("ON", -1, 140, 727, false);
   SF->getRender()->EndRender();
};

Как после удалить этот текст, при другом условии уже?
(Аналог активации-деактивации функции по команде, когда она активна - на экране есть зелёным цветом текст "ON")
 

mkrn

Известный
67
63
Да, спасибо большое. Последний вопросик.. вот есть такой код, который показывает текст при определённом условии:
C++:
if (SUCCEEDED(SF->getRender()->BeginRender()))
{
   stFontInfo *pFont;
   pFont = SF->getRender()->CreateNewFont("Arial", 12, 13);
   pFont->Print("WORK", -1, 140, 727, false);
   SF->getRender()->EndRender();
};

Как после удалить этот текст, при другом условии уже?
(Аналог активации-деактивации функции по команде, когда она активна - на экране есть зелёным цветом текст "ON")

Рендер должен вызываться постоянно, если этого не будет, то и никакого текста на экране тоже не будет. if (SUCCEEDED(SF->getRender()->BeginRender()) && activation)
 

Dark_Knight

Me, me and me.
Друг
4,085
2,114
Да, спасибо большое. Последний вопросик.. вот есть такой код, который показывает текст при определённом условии:
C++:
if (SUCCEEDED(SF->getRender()->BeginRender()))
{
   stFontInfo *pFont;
   pFont = SF->getRender()->CreateNewFont("Arial", 12, 13);
   pFont->Print("ON", -1, 140, 727, false);
   SF->getRender()->EndRender();
};

Как после удалить этот текст, при другом условии уже?
(Аналог активации-деактивации функции по команде, когда она активна - на экране есть зелёным цветом текст "ON")
Нельзя создавать шрифт в цикле. У тебя тут утечка память. Обьяви его до коллбека рендера, а иницилизируй в мейн лупе до регистрации коллбека рендера.
 

vasiliy130198

Новичок
27
0
Есть такой код эмуляции клавиш, взят с этой темы:
C++:
void EmulKey(int KeyId)
{
    stOnFootData sync;
    memset(&sync, 0, sizeof(stOnFootData));
    sync = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData;
    sync.byteCurrentWeapon = KeyId;
    BitStream bsActorSync;
    bsActorSync.Write((BYTE)ID_PLAYER_SYNC);
    bsActorSync.Write((PCHAR)&sync, sizeof(stOnFootData));
    SF->getRakNet()->SendPacket(&bsActorSync);
    memset(&bsActorSync, 0, sizeof(BitStream));
    sync.byteCurrentWeapon = 0;
    bsActorSync.Write((BYTE)ID_PLAYER_SYNC);
    bsActorSync.Write((PCHAR)&sync, sizeof(stOnFootData));
    SF->getRakNet()->SendPacket(&bsActorSync);
}
Пробую эмулировать нажатие скриптом на работе сервера - всё ок, но нажимается правильно только первый раз, а второй уже нет.. В чём может быть проблема?
На этой работе я знаю что меняется анимация из спец. действием игроку, и аттачится два предмета на руки. Персонаж в процессе работы в машину не садится, постоянно на ногах.

P.S.: Вот в этом проблема:
не всегда player_sync, если перс будет в тачке за рулём, то инкар дата, если на пассажирке - passenger data. Некоторые кнопки находятся в currentweapon, например N
Если мне нужно N нажать, то какой тогда код должен быть?
 

mkrn

Известный
67
63
Есть такой код эмуляции клавиш, взят с этой темы:

Если мне нужно N нажать, то какой тогда код должен быть?

C++:
void send_key(byte key)
{
    if (SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->state == 50)
    {
        if (SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->vehicle->passengers[0] == SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped)
        {
            do
            {
                stInCarData sync = SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData;
                sync.byteCurrentWeapon = key;
                BitStream bs;
                bs.Write((BYTE)ID_VEHICLE_SYNC);
                bs.Write((PCHAR)&sync, sizeof(stInCarData));
                SF->getRakNet()->SendPacket(&bs);
                SF->getSAMP()->getChat()->AddChatMessage(-1, "[INCAR DATA] Отправлена кнопка: %d", key);
                key = !key;
            } while (!key);
        }
        else do
        {
            stPassengerData sync = SF->getSAMP()->getPlayers()->pLocalPlayer->passengerData;
            sync.byteCurrentWeapon = key;
            BitStream bs;
            bs.Write((BYTE)ID_PASSENGER_SYNC);
            bs.Write((PCHAR)&sync, sizeof(stPassengerData));
            SF->getRakNet()->SendPacket(&bs);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "[PASSENGER DATA] Отправлена кнопка: %d", key);
            key = !key;
        } while (!key);
    }
    else do
    {
        stOnFootData sync = SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData;
        sync.byteCurrentWeapon = key;
        BitStream bs;
        bs.Write((BYTE)ID_PLAYER_SYNC);
        bs.Write((PCHAR)&sync, sizeof(stOnFootData));
        SF->getRakNet()->SendPacket(&bs);
        SF->getSAMP()->getChat()->AddChatMessage(-1, "[ONFOOT DATA] Отправлена кнопка: %d", key);
        key = !key;
    } while (!key);
}

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;

        init = true;
    }

    if (SF->getGame()->isKeyPressed(49)) send_key(128); // 128 - N
}

Наверное как-то так. Отправит сначала кнопку, которую ты указываешь в вызове функции, а потом 0 - отжатие
 
Последнее редактирование:

vasiliy130198

Новичок
27
0
.....
Наверное как-то так. Отправит сначала кнопку, которую ты указываешь в вызове функции, а потом 0 - отжатие
Не знаю почему, но функция send_key сработала, спасибо большое)

Вот еще как узнавать коды клавиш для этой функции, если кому-то нужно будет:
C++:
        char *txt = new char[144];
        sprintf(txt, "byteCurrentWeapon: %d | sKeys: %d",
            SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.byteCurrentWeapon,
            SF->getSAMP()->getPlayers()->pLocalPlayer->onFootData.sKeys);
        pFont->Print(txt, -1, 140, 727, false);
        delete txt;
(я вставлял это в коллбэк рендера Present)