1. Внимание!
    Объявились мошенники, которые представляются администрацией форума и обманывают покупателей. У них есть своя группа ВКонтакте, копирующая нашу, и несколько аккаунтов, маскирующихся под аккаунты администраторов и гарантов форума.
    При проведении любых сделок с администраторами, гарантами и пользователями BlastHack настойчиво требуйте у них написать вам личное сообщение на форуме и ни в коем случае не продолжайте сделку при отказе выполнять это требование или если сообщение не было получено.

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

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

  1. BlackKnigga

    Проверенный

    Регистрация:
    10.01.16
    Сообщения:
    443
    Лайки:
    100
    Репутация:
    53
    SF->getSAMP()->getPlayers()->pLocalPlayer->Say

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

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

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

    Dark_Knight РКН Тян
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.194
    Лайки:
    595
    Репутация:
    188
    Чтобы узнать какая именно клавиша была нажатая на клавиатуре, то тут уже нужен хук на окно.
     
    #1963
  4. Jadson

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

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

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

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

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    Последний вопрос на сегодня :)
    Код (C++):
    Выделить всё двойным кликом
        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(), я больше не нашел способа вызвать поле ввода.
     
    #1965
  6. Dark_Knight

    Dark_Knight РКН Тян
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.194
    Лайки:
    595
    Репутация:
    188
    Для буфера с обменов есть винапи. Для него все есть в гугле.
     
    #1966
  7. AWRage

    Проверенный

    Регистрация:
    10.07.15
    Сообщения:
    645
    Лайки:
    123
    Репутация:
    56
    SF->getSAMP()->getPlayers()->pLocalPlayer->Say();

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

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

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

    Может кто по поводу SF->getSAMP()->getInput()->EnableInput() всё же может кто подсказать?
    Короче что происходит:
    Код (C++):
    Выделить всё двойным кликом
    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
    Последнее редактирование: 31 дек 2016
  9. IvanJudin

    IvanJudin Новичок

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

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

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

    Проверенный

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

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.14
    Сообщения:
    412
    Лайки:
    264
    Репутация:
    39
    вангуем же,
    та да, почему бы и нет?
     
    #1972
  13. Jadson

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

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

    IvanJudin Новичок

    Регистрация:
    26.07.13
    Сообщения:
    3
    Лайки:
    0
    Репутация:
    0
    вот примерно такое
    Код (C++):
    Выделить всё двойным кликом
    #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;
    }
    сначала написал простое подключение к бд - скрипт не работает в игре,потом просто вывод версии библиотеки - тоже не работает, мож я чего-то не понимаю ?

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

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.14
    Сообщения:
    412
    Лайки:
    264
    Репутация:
    39
    позже сам попробую, через час отпишу, гляну
     
    #1975
  16. iAmerican

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

    Регистрация:
    17.02.14
    Сообщения:
    278
    Лайки:
    55
    Репутация:
    11
    Код (C++):
    Выделить всё двойным кликом
    SF->getSAMP()->getDialog()->ShowDialog(1, DIALOG_STYLE_INPUT, "Введите ID", "", "Ок", "Отмена");
    от сюда только хуком вытаскивать данные? или можно как то иначе?
    и ещё вопрос сразу , как организовать свой диалог с вводом данных?
    мне чисто в теории
     
    #1976
  17. IvanJudin

    IvanJudin Новичок

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

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.14
    Сообщения:
    412
    Лайки:
    264
    Репутация:
    39
    ага, хуков вытаскивай данные.
     
    #1978
  19. 2Shae

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

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

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.14
    Сообщения:
    412
    Лайки:
    264
    Репутация:
    39
    Ну в моде проверка, так что нет.
     
    #1980
  21. Shaurma

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

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

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.14
    Сообщения:
    412
    Лайки:
    264
    Репутация:
    39
    что-то мне подсказывает что требуется точка с запятой
    вот она ;
     
    #1982
  23. bovilejate

    bovilejate Новичок

    Регистрация:
    09.01.17
    Сообщения:
    4
    Лайки:
    0
    Репутация:
    0
    Код (C++):
    Выделить всё двойным кликом
     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?
     
    #1983
  24. BlackKnigga

    Проверенный

    Регистрация:
    10.01.16
    Сообщения:
    443
    Лайки:
    100
    Репутация:
    53
    Таймером, используя GetTickCount()
    Только с твоим кодом это будет не просто.
     
    #1984
  25. bovilejate

    bovilejate Новичок

    Регистрация:
    09.01.17
    Сообщения:
    4
    Лайки:
    0
    Репутация:
    0
    Подскажи...
     
    #1985
  26. BlackKnigga

    Проверенный

    Регистрация:
    10.01.16
    Сообщения:
    443
    Лайки:
    100
    Репутация:
    53
    Код (C++):
    Выделить всё двойным кликом
    static int timer = GetTickCount();
    if(GetTickCount() - timer > 2000)
    {
        // Действия внутри блока будут выполняться каждые 2 сек.

        timer = GetTickCount();
    }
    Примерно так, но в твоем случае сложнее
     
    #1986
  27. bovilejate

    bovilejate Новичок

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

    Dark_Knight РКН Тян
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.194
    Лайки:
    595
    Репутация:
    188
    .\\ попробуй убрать и лучше юзай std::ifstream и передавай туда полный путь.
     
    #1988
  29. bovilejate

    bovilejate Новичок

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

    Dark_Knight РКН Тян
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.194
    Лайки:
    595
    Репутация:
    188
    if(file.is_open())
     
    #1990
  31. Shaurma

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

    Регистрация:
    01.12.14
    Сообщения:
    5
    Лайки:
    3
    Репутация:
    0
    Код (C++):
    Выделить всё двойным кликом
    ".\\SAMPFUNCS/punishment.txt"
    Можешь так попробовать
     
    #1991
  32. 2Shae

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

    Регистрация:
    14.05.14
    Сообщения:
    91
    Лайки:
    5
    Репутация:
    4
    Как вставить текст в поле ввода серверного диалога (DIALOG_STYLE_INPUT)?
     
    #1992
  33. 4el0ve4ik

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

    Регистрация:
    12.11.15
    Сообщения:
    1.255
    Лайки:
    340
    Репутация:
    82
    Проверяешь нужный ли тебе диалог открыт и юзаешь это
    Код (C++):
    Выделить всё двойным кликом
    SF->getSAMP()->getDialog()->SetInputText("text");
     
    #1993
  34. 2Shae

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

    Регистрация:
    14.05.14
    Сообщения:
    91
    Лайки:
    5
    Репутация:
    4
    Делал, поле ввода оставалось пустым.
    В RPC_ScrShowDialog делал проверку на окно авторизации:
    Код (Text):
    Выделить всё двойным кликом
    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
    Последнее редактирование: 17 янв 2017
  35. BlackKnigga

    Проверенный

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

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

    Регистрация:
    14.05.14
    Сообщения:
    91
    Лайки:
    5
    Репутация:
    4
    Бля, эпичнейший фэйспалм:facepalm:
    Спасибо тебе, работает
     
    #1996
  37. return

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

    Регистрация:
    29.07.15
    Сообщения:
    61
    Лайки:
    2
    Репутация:
    2
    а не проще юзать sendDialogResponse?
     
    #1997
  38. BlackKnigga

    Проверенный

    Регистрация:
    10.01.16
    Сообщения:
    443
    Лайки:
    100
    Репутация:
    53
    Ты о чем?
     
    #1998
  39. Nexiq

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

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

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

    Регистрация:
    17.02.14
    Сообщения:
    278
    Лайки:
    55
    Репутация:
    11
    Код (C++):
    Выделить всё двойным кликом

    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) {
            // твоя всякая штука
        }
    }
    Это примитивная совсем.
     
    #2000