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

Тема в разделе "C, C++", создана пользователем urShadow, 5 дек 2014.

  1. iAmerican

    Проверенный

    Регистрация:
    17.02.2014
    Сообщения:
    367
    Симпатии:
    84
    Репутация:
    16
    void CALLBACK ctime(std::string)
    {
        if (stage)
        {
            stage = false;
        }
        else
        {
            stage = true;
        }
        return;
    }
    // Этого вполне хватит , если твоя команда больше не чего выполнять не будет
    void CALLBACK ctime(std::string) { stage != true; }
    
     
    #2441 iAmerican, 28 ноя 2017
    Последнее редактирование: 29 ноя 2017
  2. Karbun

    Karbun Известный пользователь

    Регистрация:
    11.06.2017
    Сообщения:
    96
    Симпатии:
    2
    Репутация:
    1
    Можете помочь, почему не реагирует?
    if (sscanf(msg, "%d тест",&int))
    {
            SF->getSAMP()->getChat()->AddChatMessage(-1,"%d", int);
    }
     
  3. BlackKnigga

    Друг

    Регистрация:
    10.01.2016
    Сообщения:
    775
    Симпатии:
    203
    Репутация:
    85
    Потому что int это тип данных, его нельзя использовать как название переменной.
    К тому же неизвестно что у тебя в msg.
     
    Karbun нравится это.
  4. Karbun

    Karbun Известный пользователь

    Регистрация:
    11.06.2017
    Сообщения:
    96
    Симпатии:
    2
    Репутация:
    1
    В msg сообщение из хука ScrClientMessage. Если &int поменять на любую другую, проблема остаётся.
    Пробовал еще так:
    if (sscanf(msg, "%*s %d тест",&lol))
    {
            SF->getSAMP()->getChat()->AddChatMessage(-1,"%d", lol);
    }
    Текст отправляю: 123 тест. В чат ничего не высвечивается. Переменная lol - integer.
     
  5. randazzo

    randazzo Известный пользователь

    Регистрация:
    21.05.2014
    Сообщения:
    306
    Симпатии:
    58
    Репутация:
    31
    ScrClientMessage считывает те сообщения, которые присылает сервер, а не клиент, тебе надо чтобы кто-то написал "123 тест"
     
  6. Karbun

    Karbun Известный пользователь

    Регистрация:
    11.06.2017
    Сообщения:
    96
    Симпатии:
    2
    Репутация:
    1
    Та не, бред. Свои сообщение тоже считываются.
     
  7. BlackKnigga

    Друг

    Регистрация:
    10.01.2016
    Сообщения:
    775
    Симпатии:
    203
    Репутация:
    85
    Ты уверен что сервер присылает твои сообщения в том виде, в каком ты их отправил? Перед сканом выведи сообщение в чат и посмотри, а лучше чекни в чатлоге
     
    Karbun нравится это.
  8. Karbun

    Karbun Известный пользователь

    Регистрация:
    11.06.2017
    Сообщения:
    96
    Симпатии:
    2
    Репутация:
    1
    Забыл зарегистрировать хук... извините, господа, лох :facepalm2:
     
    Blood нравится это.
  9. Vandal™

    Vandal™ Активный пользователь

    Регистрация:
    06.01.2016
    Сообщения:
    32
    Симпатии:
    2
    Репутация:
    0
    Можно как-то хакнуть память игры/плагина, что бы приходящие RPC и так далее выполнялись не зависимо от того,что игра на паузе.

    На примере выглядит так:
    С сервера пришло сообщение в 18:53, а из-за того,что мы стояли на паузе - этот RPC обрабатывается только при выходe с ESC.
    Допустим, уже не 18:53 будет показывать, а 19:32(момент выхода из АФК). Help :3
    А я хочу, что б при выходе из АФК было такое же время, когда он по сути должен был прийти - то есть 18:53
     
  10. ALF

    ALF Активный пользователь

    Регистрация:
    14.11.2017
    Сообщения:
    29
    Симпатии:
    28
    Репутация:
    10
    sampfuncs-settings -> antipause = true
     
    RAFF нравится это.
  11. Vandal™

    Vandal™ Активный пользователь

    Регистрация:
    06.01.2016
    Сообщения:
    32
    Симпатии:
    2
    Репутация:
    0
    та стоит уже , все равно не помогает.
     
  12. ALF

    ALF Активный пользователь

    Регистрация:
    14.11.2017
    Сообщения:
    29
    Симпатии:
    28
    Репутация:
    10
    мб потому, что надо сворачивать игру не уходя в афк?
     
  13. LaRossa

    LaRossa Известный пользователь

    Регистрация:
    04.02.2017
    Сообщения:
    162
    Симпатии:
    17
    Репутация:
    8
    Подскажите как отправить диалог с текстом ?
    SF->getSAMP()->getDialog()->Close;
    Не работает.
     
  14. Karbun

    Karbun Известный пользователь

    Регистрация:
    11.06.2017
    Сообщения:
    96
    Симпатии:
    2
    Репутация:
    1
    Укажи какой кнопкой закрыть.
     
  15. LaRossa

    LaRossa Известный пользователь

    Регистрация:
    04.02.2017
    Сообщения:
    162
    Симпатии:
    17
    Репутация:
    8
    Подскажите как сделать проверку что TextDraw под определенным id активен
     
  16. Vandal™

    Vandal™ Активный пользователь

    Регистрация:
    06.01.2016
    Сообщения:
    32
    Симпатии:
    2
    Репутация:
    0
    Дак мне именно с уходом в АФК нужно, что б работало. Слышал,что есть такое.
     
  17. Karbun

    Karbun Известный пользователь

    Регистрация:
    11.06.2017
    Сообщения:
    96
    Симпатии:
    2
    Репутация:
    1
    Как через api пополнить себе броню?
     
  18. ALF

    ALF Активный пользователь

    Регистрация:
    14.11.2017
    Сообщения:
    29
    Симпатии:
    28
    Репутация:
    10
    PEDSELF->SetArmor(100.0f);
     
    Karbun нравится это.
  19. samp is meme

    samp is meme Известный пользователь

    Регистрация:
    28.08.2016
    Сообщения:
    140
    Симпатии:
    28
    Репутация:
    5
    0xBA679A - [byte] ID текущей радиостанции:
    [LIST]
    [*]от 1 до 12 (ниже смотрите список радиостанций и их ID)
    [LIST]
    [*]1 = "Playback FM"
    [*]2 = "K Rose"
    [*]3 = "K-DST"
    [*]4 = "Bounce FM"
    [*]5 = "SF-UR"
    [*]6 = "Radio Los Santos"
    [*]7 = "Radio X"
    [*]8 = "CSR 103.9"
    [*]9 = "K-JAH West"
    [*]10 = "Master Sounds 98.3"
    [*]11 = "WCTR Talk Radio"
    [*]12 = "Плеер пользовательской музыки"
    [*]13 = "Радио выключено"
    [/LIST]
    [/LIST]
    
     
  20. mrdiimax

    mrdiimax Известный пользователь

    Регистрация:
    24.01.2016
    Сообщения:
    100
    Симпатии:
    6
    Репутация:
    -1
    Как сделать отлавливание определенной строки из чата и если она замечана вывести в чат сообщение(видимое только для облодателя скрипта)
     
  21. ALF

    ALF Активный пользователь

    Регистрация:
    14.11.2017
    Сообщения:
    29
    Симпатии:
    28
    Репутация:
    10
    @mrdiimax

    
    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;
    }
    
     
  22. mrdiimax

    mrdiimax Известный пользователь

    Регистрация:
    24.01.2016
    Сообщения:
    100
    Симпатии:
    6
    Репутация:
    -1
    Тоесть если будет строка "хуй" будет выведено смс "йоу, мы нашли хуй" да?Сяп
     
    Vandal™ нравится это.
  23. ALF

    ALF Активный пользователь

    Регистрация:
    14.11.2017
    Сообщения:
    29
    Симпатии:
    28
    Репутация:
    10
    Да.
    Зарегистрировать в mainloop не забудь
     
    Последние данные очков репутации:
    mrdiimax: 1 Очко (каеф) 6 дек 2017
  24. vasiliy130198

    vasiliy130198 Пользователь

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

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

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

    Друг

    Регистрация:
    10.01.2016
    Сообщения:
    775
    Симпатии:
    203
    Репутация:
    85
    1. Возможно
    2. SendMessage(но это не точно), SendInput.
    Но в сампе лучше слать нажатие через player_sync
     
    Последние данные очков репутации:
    vasiliy130198: 1 Очко (Спасибо за помощь :)) 8 дек 2017
  26. vasiliy130198

    vasiliy130198 Пользователь

    Регистрация:
    06.12.2017
    Сообщения:
    10
    Симпатии:
    0
    Репутация:
    0
    Как именно тогда, подскажите пожалуйста)
     
  27. mkrn

    mkrn Активный пользователь

    Регистрация:
    19.02.2017
    Сообщения:
    29
    Симпатии:
    6
    Репутация:
    7
    не всегда player_sync, если перс будет в тачке за рулём, то инкар дата, если на пассажирке - passenger data. Некоторые кнопки находятся в currentweapon, например N
     
    #2467 mkrn, 7 дек 2017
    Последнее редактирование: 7 дек 2017
  28. BlackKnigga

    Друг

    Регистрация:
    10.01.2016
    Сообщения:
    775
    Симпатии:
    203
    Репутация:
    85
    SF->getSAMP()->getInfo()->pPools->pTextdraw
    Дальше надеюсь разберешься
     
  29. vasiliy130198

    vasiliy130198 Пользователь

    Регистрация:
    06.12.2017
    Сообщения:
    10
    Симпатии:
    0
    Репутация:
    0
    Да, спасибо большое. Последний вопросик.. вот есть такой код, который показывает текст при определённом условии:
    
    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")
     
  30. mkrn

    mkrn Активный пользователь

    Регистрация:
    19.02.2017
    Сообщения:
    29
    Симпатии:
    6
    Репутация:
    7
    Рендер должен вызываться постоянно, если этого не будет, то и никакого текста на экране тоже не будет. if (SUCCEEDED(SF->getRender()->BeginRender()) && activation)
     
  31. Dark_Knight

    Dark_Knight Аннушка уже разлила масло.
    Друг

    Регистрация:
    18.03.2013
    Сообщения:
    2.619
    Симпатии:
    846
    Репутация:
    222
    Нельзя создавать шрифт в цикле. У тебя тут утечка память. Обьяви его до коллбека рендера, а иницилизируй в мейн лупе до регистрации коллбека рендера.
     
  32. BlackKnigga

    Друг

    Регистрация:
    10.01.2016
    Сообщения:
    775
    Симпатии:
    203
    Репутация:
    85
    Так юзать нельзя, если activation false, то после BeginRender не будет вызыватся EndRender и это плохо кончится.
     
  33. ALF

    ALF Активный пользователь

    Регистрация:
    14.11.2017
    Сообщения:
    29
    Симпатии:
    28
    Репутация:
    10
    а когда activation false, то EndRender уже не нужен.
    если конечно больше ничего в коде нет
     
    mkrn нравится это.
  34. vasiliy130198

    vasiliy130198 Пользователь

    Регистрация:
    06.12.2017
    Сообщения:
    10
    Симпатии:
    0
    Репутация:
    0
    Есть такой код эмуляции клавиш, взят с этой темы:
    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.: Вот в этом проблема:
    Если мне нужно N нажать, то какой тогда код должен быть?
     
  35. mkrn

    mkrn Активный пользователь

    Регистрация:
    19.02.2017
    Сообщения:
    29
    Симпатии:
    6
    Репутация:
    7
    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: 1 Очко (спасибо за помощь :)) 8 дек 2017
    #2475 mkrn, 8 дек 2017
    Последнее редактирование: 8 дек 2017
  36. vasiliy130198

    vasiliy130198 Пользователь

    Регистрация:
    06.12.2017
    Сообщения:
    10
    Симпатии:
    0
    Репутация:
    0
    Не знаю почему, но функция send_key сработала, спасибо большое)

    Вот еще как узнавать коды клавиш для этой функции, если кому-то нужно будет:
            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)
     
  37. vasiliy130198

    vasiliy130198 Пользователь

    Регистрация:
    06.12.2017
    Сообщения:
    10
    Симпатии:
    0
    Репутация:
    0
    Подскажите еще пожалуйста насчет следующего кода:
            case ScriptRPCEnumeration::RPC_ScrTextDrawSetString:
            {
                  WORD wTexdrawID;
                  WORD wStrLen;
                  char *szStr;
                  params->bitStream->ResetReadPointer();
                  params->bitStream->Read(wTexdrawID);
                  params->bitStream->Read(wStrLen);
                  params->bitStream->Read(szStr);
                  SF->getSAMP()->getChat()->AddChatMessage(-1, "%i || %s || %i", wTexdrawID, szStr, wStrLen);
                  break;
            }
    При первом считывании игра крашится.. Как правильно это делать? На форуме только нашел описание этого пакета, там идет сначала идет ID, после сам текст.
     
    #2477 vasiliy130198, 8 дек 2017
    Последнее редактирование: 8 дек 2017
  38. BlackKnigga

    Друг

    Регистрация:
    10.01.2016
    Сообщения:
    775
    Симпатии:
    203
    Репутация:
    85
    Выдели память в szStr, заполни нулями и указывай длину при чтении.
     
  39. Zhenya98

    Zhenya98 Известный пользователь

    Регистрация:
    12.10.2014
    Сообщения:
    61
    Симпатии:
    24
    Репутация:
    9
    приветствую, возникла проблема во входящем vehicle_sync, все читается нормально до координат, но дальше вместо moveSpeed идет мусор в цифрах, подскажите что не так делаю
    
    bool CALLBACK incoming_packet(stRakNetHookParams *params)
    {
    	if (params->packetId == PacketEnumeration::ID_VEHICLE_SYNC)
    	{	
    		ushort playerid, vehicleid, leftRightKeys, upDownKeys, keys, vehHP;
    		float vehpos[3], vehspeed[3];
    
    		params->bitStream->ResetReadPointer();
    		params->bitStream->IgnoreBits(8); // id packet's
    		params->bitStream->Read(playerid);
    		params->bitStream->Read(vehicleid);
    		params->bitStream->Read(leftRightKeys);
    		params->bitStream->Read(upDownKeys);
    		params->bitStream->Read(keys);
    		params->bitStream->IgnoreBits(52); // fQuaternion
    		params->bitStream->Read(vehpos); // корды записались
    		params->bitStream->Read(vehspeed); // а вот тут пошел уже мусор вместо скорости
    
    		SF->getSAMP()->getChat()->AddChatMessage(-1, "pedID: %d | vehID: %d | Pos: %.2f %.2f %.2f | Speed: %.2f %.2f %.2f",
    			playerid, vehicleid,
    			vehpos[0], vehpos[1], vehpos[2],
    			vehspeed[0], vehspeed[1], vehspeed[3]);
    	}
    	return true;
    }
    
     
  40. CarLCas

    CarLCas Известный пользователь

    Регистрация:
    12.07.2013
    Сообщения:
    155
    Симпатии:
    38
    Репутация:
    19
    params->bitStream->SerializeVector(false, vehspeed[0], vehspeed[1], vehspeed[2]);
     
    Zhenya98 нравится это.