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

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

  1. BlackKnigga

    Проверенный

    Регистрация:
    10.01.2016
    Сообщения:
    616
    Симпатии:
    140
    Репутация:
    66
    SF->getSAMP()->getPlayers()->pLocalPlayer->Say

    Так у тебя &&, блок выполнится только при нажатии обоих клавиш.
     
  2. Jadson

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

    Регистрация:
    26.12.2016
    Сообщения:
    24
    Симпатии:
    6
    Репутация:
    0
    Не так написал, имел в виду или, к примеру мне надо будет узнать какую клавишу от 1 до 0 нажал человек, чтоб не делать 10 блоков я бы хотел 1 с переменной в которой будет клавиша, если это возможно, я так понимаю это уже не API а средствами C++ надо делать?
     
  3. Dark_Knight

    Dark_Knight Мое лицо, когда человек верующий.
    Друг

    Регистрация:
    18.03.2013
    Сообщения:
    2.454
    Симпатии:
    724
    Репутация:
    206
    Чтобы узнать какая именно клавиша была нажатая на клавиатуре, то тут уже нужен хук на окно.
     
  4. Jadson

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

    Регистрация:
    26.12.2016
    Сообщения:
    24
    Симпатии:
    6
    Репутация:
    0
    Ладно, пока для первой версии программы сделаю просто статикой, потом буду искать способ сделать код лучше, ещё вопрос, можно ли как то добавить данные в буфер обмена через API? И вообще есть где то хоть не много информации о методах? А то я так каждый день писать буду сюда :)

    P.S. И ещё вопрос назрел, можно ли как то открыть инпут в чате? Который на F6 открывается вдруг кто не понял) Лажу по методам но что-то ничего похожего не нахожу (Ответ уже нашел, остается вопрос выше:) )
     
    #1964 Jadson, 31 дек 2016
    Последнее редактирование: 31 дек 2016
  5. Jadson

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

    Регистрация:
    26.12.2016
    Сообщения:
    24
    Симпатии:
    6
    Репутация:
    0
    Последний вопрос на сегодня :)
        if (SF->getGame()->isKeyPressed(0x31))
    {
          SF->getSAMP()->getInput()->EnableInput();
          SF->getSAMP()->getChat()->SetChatInputText(text here);
    }
    Вот так я пытаюсь ловить события при нажатии на 1, и всё хорошо если происходит другое действие, но не то что выше, когда при нажатии на 1 появляется поле ввода и текст в нём, всё как надо, но после закрытия это поля и отправки сообщения я нажимаю снова 1 и ничего не происходит, SF->getGame()->isKeyPressed(0x31) уже не видит нажатие, а если я нажму ещё раз 1 тогда всё работает, такое чувство что методом SF->getSAMP()->getInput()->EnableInput() я что-то преребиваю, потому что без него SF->getSAMP()->getChat()->SetChatInputText(text here) вставляет нормально данные в поле ввода, но я его не вижу. А нужно чтоб было поле ввода и мой текст. Причина точно в SF->getSAMP()->getInput()->EnableInput(), я больше не нашел способа вызвать поле ввода.
     
  6. Dark_Knight

    Dark_Knight Мое лицо, когда человек верующий.
    Друг

    Регистрация:
    18.03.2013
    Сообщения:
    2.454
    Симпатии:
    724
    Репутация:
    206
    Для буфера с обменов есть винапи. Для него все есть в гугле.
     
  7. AWRage

    Проверенный

    Регистрация:
    10.07.2015
    Сообщения:
    645
    Симпатии:
    118
    Репутация:
    57
    SF->getSAMP()->getPlayers()->pLocalPlayer->Say();

    if(key_pressed(W) && key_pressed(E))
    {
    if(key_pressed(W)
    {}
    else
    {}
    }
     
  8. Jadson

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

    Регистрация:
    26.12.2016
    Сообщения:
    24
    Симпатии:
    6
    Репутация:
    0
    Нет такой функции.

    Может кто по поводу SF->getSAMP()->getInput()->EnableInput() всё же может кто подсказать?
    Короче что происходит:
    if (SF->getGame()->isKeyPressed(0x31)) //нажимаю на 1
    {
           SF->getSAMP()->getChat()->SetChatInputText("text here");
        SF->getSAMP()->getInput()->EnableInput();
    }
    В итоге в чат идет text here1 и потом когда я нажимаю 1 во второй раз ничего не происходит, а когда в третий - уже снова идет вызов, такое чувство что из-за того что цифра 1 идет в чат не отпраляется событие keydown и только при 2 нажатии оно отправляется и выходит что на 3 раз уже при нажатии на 1 всё работает, как от этого избавиться?
    Может есть ещё способ отслеживать нажатие клавиши и чтоб она в чат не шла?

    UPD. Отправку цифры 1 в чат убрал через эмуляцию нажатия backspace, а вот почему после вызова EnableInput не работает снова вызов на цифру 1 пока не могу понять
     
    #1968 Jadson, 31 дек 2016
    Последнее редактирование: 31 дек 2016
  9. IvanJudin

    IvanJudin Новичок

    Регистрация:
    26.07.2013
    Сообщения:
    3
    Симпатии:
    0
    Репутация:
    0
    можно ли в .sf использовать библиотеку sqlite?вроде подключил, написал простенький скрипт, все скомпилировалось. в игре же скрипт не запускается
     
  10. Jadson

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

    Регистрация:
    26.12.2016
    Сообщения:
    24
    Симпатии:
    6
    Репутация:
    0
    Может кто подсказать как поступить.
    Делаю сейчас локальный DXUT диалог на Cleo и надо бы как то его вызывать по команде и собирать данные с его инпутов, их там 3 будет и работать с ними через C++ SF API, как можно будет при нажатии на кнопку забирать данные в SF API? Через getCLEO есть методы взять переменные, но как их в cleo скрипте объявить чтоб забрать в коде? Может кто пример кода показать, примеров нигде не нашел.
    Есть ещё вариант через getDialog но там всё ещё запутаней, по методам ничего не понятно, а доки то и нет
     
  11. AWRage

    Проверенный

    Регистрация:
    10.07.2015
    Сообщения:
    645
    Симпатии:
    118
    Репутация:
    57
    То, что ты делаешь через InputBox полнейшая хрень. Есть функция Say и её используют для отправки сообщения или команды.[​IMG]
     
  12. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.2014
    Сообщения:
    407
    Симпатии:
    265
    Репутация:
    39
    вангуем же,
    та да, почему бы и нет?
     
  13. Jadson

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

    Регистрация:
    26.12.2016
    Сообщения:
    24
    Симпатии:
    6
    Репутация:
    0
    А при чем тут это? Мне надо чтобы текст вставлялся в инпут без отправки, чтоб дальше можно было дописать ID и отправить. Я вроде как с этим уже разобрался.
     
  14. IvanJudin

    IvanJudin Новичок

    Регистрация:
    26.07.2013
    Сообщения:
    3
    Симпатии:
    0
    Репутация:
    0
    вот примерно такое
    #define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
    #include <windows.h>
    #include <string>
    #include <assert.h>
    #include <process.h>
    #include "sqlite3.h"
    #include "SAMPFUNCS_API.h"
    #include "game_api\game_api.h"
    
    SAMPFUNCS *SF = new SAMPFUNCS();
    
    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 ;
    
           SF->getSAMP()->getChat()->AddChatMessage(-1, sqlite3_libversion());
           
          
            init = true;
        }
      
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
    {
        switch (dwReasonForCall)
        {
            case DLL_PROCESS_ATTACH:
                SF->initPlugin(mainloop, hModule);
                break;
            case DLL_THREAD_ATTACH:
            case DLL_THREAD_DETACH:
            case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
    }
    
    сначала написал простое подключение к бд - скрипт не работает в игре,потом просто вывод версии библиотеки - тоже не работает, мож я чего-то не понимаю ?

    в логах ничего интересного
     
  15. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.2014
    Сообщения:
    407
    Симпатии:
    265
    Репутация:
    39
    позже сам попробую, через час отпишу, гляну
     
  16. iAmerican

    Проверенный

    Регистрация:
    17.02.2014
    Сообщения:
    350
    Симпатии:
    70
    Репутация:
    15
    SF->getSAMP()->getDialog()->ShowDialog(1, DIALOG_STYLE_INPUT, "Введите ID", "", "Ок", "Отмена");
    от сюда только хуком вытаскивать данные? или можно как то иначе?
    и ещё вопрос сразу , как организовать свой диалог с вводом данных?
    мне чисто в теории
     
  17. IvanJudin

    IvanJudin Новичок

    Регистрация:
    26.07.2013
    Сообщения:
    3
    Симпатии:
    0
    Репутация:
    0
    чет походу никак,пробовал даж не компилировать библ., а через dll подключить,разницы нет
     
  18. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.2014
    Сообщения:
    407
    Симпатии:
    265
    Репутация:
    39
    ага, хуков вытаскивай данные.
     
  19. 2Shae

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

    Регистрация:
    14.05.2014
    Сообщения:
    110
    Симпатии:
    6
    Репутация:
    4
    Можно ли как-то использовать команду, которая недоступна для твоего ранга/фракции на сервере? Ну или хотя бы считать содержимое диалога, не открывая его (опять же из-за того, что ранг/фракция не та).
     
  20. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.2014
    Сообщения:
    407
    Симпатии:
    265
    Репутация:
    39
    Ну в моде проверка, так что нет.
     
  21. Shaurma

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

    Регистрация:
    01.12.2014
    Сообщения:
    5
    Симпатии:
    3
    Репутация:
    0
    Когда открываю SFPlugin.sln. Что с этим делать?
    [​IMG]
     
  22. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.2014
    Сообщения:
    407
    Симпатии:
    265
    Репутация:
    39
    что-то мне подсказывает что требуется точка с запятой
    вот она ;
     
  23. bovilejate

    bovilejate Новичок

    Регистрация:
    09.01.2017
    Сообщения:
    4
    Симпатии:
    0
    Репутация:
    0
     if (id == 3)
        {
            LP->Say("/do В кармане лежит смартфон.");
            Sleep(2000);
            LP->Say("/me достал смартфон из кармана, после чего разблокировал его");
            Sleep(2000);
            LP->Say("/me открыл раздел \"Государственные новости\"");
            Sleep(2000);
            LP->Say("/me настроил волну на \"Государственные вещания\"");
            Sleep(2000);
            LP->Say("/me нажал на кнопку \"Вещать\"");
            Sleep(2000);
            LP->Say("/n MM | Были технические неполадки, просим прощения.");
            Sleep(2000);
            LP->Say("/me заблокировал смартфон и убрал в правый карман");
            return;
        }
    Чем заменить Sleep?
     
  24. BlackKnigga

    Проверенный

    Регистрация:
    10.01.2016
    Сообщения:
    616
    Симпатии:
    140
    Репутация:
    66
    Таймером, используя GetTickCount()
    Только с твоим кодом это будет не просто.
     
  25. bovilejate

    bovilejate Новичок

    Регистрация:
    09.01.2017
    Сообщения:
    4
    Симпатии:
    0
    Репутация:
    0
    Подскажи...
     
  26. BlackKnigga

    Проверенный

    Регистрация:
    10.01.2016
    Сообщения:
    616
    Симпатии:
    140
    Репутация:
    66
    static int timer = GetTickCount();
    if(GetTickCount() - timer > 2000)
    {
        // Действия внутри блока будут выполняться каждые 2 сек.
    
        timer = GetTickCount();
    }
    Примерно так, но в твоем случае сложнее
     
  27. bovilejate

    bovilejate Новичок

    Регистрация:
    09.01.2017
    Сообщения:
    4
    Симпатии:
    0
    Репутация:
    0
    Почему файл не читается? Код написан правильно
    fopen(".\\SAMPFUNCS\\punishment.txt", "r");
     
  28. Dark_Knight

    Dark_Knight Мое лицо, когда человек верующий.
    Друг

    Регистрация:
    18.03.2013
    Сообщения:
    2.454
    Симпатии:
    724
    Репутация:
    206
    .\\ попробуй убрать и лучше юзай std::ifstream и передавай туда полный путь.
     
  29. bovilejate

    bovilejate Новичок

    Регистрация:
    09.01.2017
    Сообщения:
    4
    Симпатии:
    0
    Репутация:
    0
    Не выходит....
    std::ifstream file("C:\\Program Files(x86)\\GTA San Andreas\\SAMPFUNCS\\test.txt", std::ios::in);
    if (file)
    {
          SF->Log("+");
    }
    
    Разобрался
     
    #1989 bovilejate, 16 янв 2017
    Последнее редактирование: 16 янв 2017
  30. Dark_Knight

    Dark_Knight Мое лицо, когда человек верующий.
    Друг

    Регистрация:
    18.03.2013
    Сообщения:
    2.454
    Симпатии:
    724
    Репутация:
    206
    if(file.is_open())
     
  31. Shaurma

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

    Регистрация:
    01.12.2014
    Сообщения:
    5
    Симпатии:
    3
    Репутация:
    0
    ".\\SAMPFUNCS/punishment.txt"
    Можешь так попробовать
     
  32. 2Shae

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

    Регистрация:
    14.05.2014
    Сообщения:
    110
    Симпатии:
    6
    Репутация:
    4
    Как вставить текст в поле ввода серверного диалога (DIALOG_STYLE_INPUT)?
     
  33. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.2015
    Сообщения:
    1.327
    Симпатии:
    399
    Репутация:
    102
    Проверяешь нужный ли тебе диалог открыт и юзаешь это
    SF->getSAMP()->getDialog()->SetInputText("text");
     
  34. 2Shae

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

    Регистрация:
    14.05.2014
    Сообщения:
    110
    Симпатии:
    6
    Репутация:
    4
    Делал, поле ввода оставалось пустым.
    В RPC_ScrShowDialog делал проверку на окно авторизации:
    if(caption == "Авторизация")
            {
                SF->getSAMP()->getChat()->AddChatMessage(-1, "Диалог авторизации открыт");
                SF->getSAMP()->getDialog()->SetInputText(password);
                keybd_event(VK_RETURN, 0, 0, 0);
                keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
            }
    (да, сама проверка на открытый диалог работает)
     
    #1994 2Shae, 17 янв 2017
    Последнее редактирование: 17 янв 2017
  35. BlackKnigga

    Проверенный

    Регистрация:
    10.01.2016
    Сообщения:
    616
    Симпатии:
    140
    Репутация:
    66
    Ты прямо в теле хука чтоль делал? Если да то когда ты вызываешь SetInputText, диалога еще нет в игре(тыж его хукнул) и текст не вставляется. Вызывай функу после хука и приема рпц.
     
  36. 2Shae

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

    Регистрация:
    14.05.2014
    Сообщения:
    110
    Симпатии:
    6
    Репутация:
    4
    Бля, эпичнейший фэйспалм:facepalm:
    Спасибо тебе, работает
     
  37. return

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

    Регистрация:
    29.07.2015
    Сообщения:
    80
    Симпатии:
    4
    Репутация:
    2
    а не проще юзать sendDialogResponse?
     
  38. BlackKnigga

    Проверенный

    Регистрация:
    10.01.2016
    Сообщения:
    616
    Симпатии:
    140
    Репутация:
    66
    Ты о чем?
     
  39. Nexiq

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

    Регистрация:
    08.02.2016
    Сообщения:
    46
    Симпатии:
    3
    Репутация:
    0
    Как сделать привязку по серийнику?
     
  40. iAmerican

    Проверенный

    Регистрация:
    17.02.2014
    Сообщения:
    350
    Симпатии:
    70
    Репутация:
    15
    
    
    bool biAM = false;
    
    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;
            char VolumeNameBuffer[255], FileSystemNameBuffer[255];
            DWORD VolumeSerialNumber, MaximumComponentLength, FileSystemFlags;
            GetVolumeInformation("C:\\", VolumeNameBuffer, 255, &VolumeSerialNumber, &MaximumComponentLength, &FileSystemFlags, FileSystemNameBuffer, 255);
    
            if (VolumeSerialNumber == 1216947533)
                biAM = true;
            else
                biAM = false;
            init = true;
        }
        if (biAM) {
            // твоя всякая штука
        }
    }
    
    Это примитивная совсем.