Добро пожаловать на BlackSAMP - ФОРУМ

  • Приватные и секретные разделы доступны только зарегистрированным пользователям.

    Вся важная информация в нашем ТГ: t.me/gtablack

    На данном форуме запрещено публиковать контент нарушающий Российское законодательство, за это последует блокировка ФА.

Гайд Важно sampfuncs api - как писать скрипты

DarkPhantom

Активный
Администратор
Регистрация
18 Авг 2024
Сообщения
93
Решения
2
Реакции
27
Баллы
28
sampfuncs api - это набор инструментов и библиотек позволяющий делать скрипты для GTA San Andreas Multiplayer (SAMP) на языке программирования C++.
Jd2qEdt.png
Давайте я расскажу , что надо для работы .
1. Visual Studio
2. DirectX SDK
3. Sampfuncs
После того , как вы все скачали вам надо распаковать архив . После откройте проект в Visual Studio.
У вас появится ошибка . Для её устранения вам надо подключить DirectX.
Для этого перейдите в свойства и установите версию SDK для вашей винды. Набор инструментов платформы ставим последний.
Затем переходим в каталоги VC++ и в пункте "Включаемые каталоги " указываем путь до папки include в DirectX sdk . Дальше мы видим пункт подключаемые библиотеки и указываем путь до папки lib опять же в DirectX sdk.
Jd2qEdt.png
Затем открываем main.cpp .
И нас встречает готовый проект , который в чат выводит "Sampfuncs plugin loaded" .
Jd2qEdt.png
Давайте напишем простой скрипт , состоящий из команды и вывода текста в чат .
Для регистрации команды , в функции mainloop , во 2 условии где идёт проверка на инициализацию игры и САМПа вставляем эту строку .
C++:
SF->getSAMP()->rergisterChatCommand("cmd",func);
Что тут происходит ?
Мы обращаемся к сампфунксу , к функции getSAMP и функции registerChatCommand.
Первым параметром идёт команда (без слеша ) , вторым функция , которая будет вызываться каждый раз при вводе команды в чат .
Есть 3 способа , как объявить функцию .
1. Лямбда функция
2. Объявить в заголовочном файле .
3. Зарегистрировать функцию в начале, а обращаться в конце .
1
C++:
SF->getSAMP()->rergisterChatCommand("cmd",[](std::string){
     SF->getSAMP()->getChat->AddChatMessage(-1,"Hi");

});
2. В файле main.h

C++:
void __stdcall func(std::string);
И в main.cpp после функции mainloop
C++:
void __stdcall func(std::string)
{
     SF->getSAMP()->getChat->AddChatMessage(-1,"Hi");
}

3. Так же , как и во 2.
Давайте скомпилируем проект и убедимся ,что все работает (сборка->собрать решение)
Jd2qEdt.png
Тему буду дополнять . В планах создать полноценный гайд по imgui , диалогам и ракнету
 
Последнее редактирование:

DarkPhantom

Активный
Администратор
Регистрация
18 Авг 2024
Сообщения
93
Решения
2
Реакции
27
Баллы
28
Аргументы для команды + нажатые клавиши .
Передать аргументы в команду очень легко . Для этого после std::string напишите название переменной , в моем случае param.
Код :
C++:
SF->getSAMP()->rergisterChatCommand("cmd",[](std::string){
     SF->getSAMP()->getChat->AddChatMessage(-1,"Hi %s",param.c_str());
});
Функция c_str нужна для перевода в тип char .Jd2qEdt.png
Для реализации нажатия на клавиши , пишем else для if(!initialized).
Пример :
C++:
if(!initialized)
{
    //Тут код
}
else
{

}
В этом условии напишем отслеживание нажатых клавиш .
Всего есть два вида нажатия :
1. Обычное нажатие .
2. Нажатие с удержанием .
Давайте рассмотрим обычное нажатие.

C++:
if(SF->getGame()->isKeyPressed(191))
{
   SF->getSAMP()->getChat()->AddChatMessage("Вы нажали клавишу",-1);
}
В функции isKeyPressed надо указать id клавиши .
images (1).png
2. Тип нажатия - удержание .
Вот код :
C++:
if(SF->getGame()->isKeyDown(191))
{

   SF->getSAMP()->getChat()->AddChatMessage("Вы нажали и удерживаете клавишу",-1);
}
 

DarkPhantom

Активный
Администратор
Регистрация
18 Авг 2024
Сообщения
93
Решения
2
Реакции
27
Баллы
28

Как работать с диалогами ?

Всего есть 4 вида часто используемых диалогов:
1. DIALOG_STYLE_LIST
Без названия (7).jpeg
2. DIALOG_STYLE_MSGBOX
Без названия (1).png
3. DIALOG_STYLE_INPUT
Без названия (6).jpeg
4. DIALOG_STYLE_PASSWORD
Dialog_style_password.png

Ещё есть DIALOG_STYLE_HEADER:
Dialog_style_tablist_headers.png
Но он используется крайне редко .
Jd2qEdt.png
Давайте приступим к созданию диалога .
Для этого объявим указатель в начале кода :

C++:
stDialogInfo* DIALOG = nullptr;
За
C++:
dialog = SF->getSAMP->getDialog();
dialog->registerDialogCallback(OnDialogRes);
SF->getSAMP()->registerChatCommand("cmd",[](std::string){
   dialog->ShowDialog(4,DIALOG_STYLE_LIST,"название","пункт 1\nПункт 2","+","-");
});
Для обработки событий используем функцию OnDialogRes:
C++:
void __stdcall OnDialogRes(int dialogId, int buttonId ,int listItem , const char* input)
{
    
}
Тут все как в pawn .
Код:
if(dialogId==4 & buttonId==1)
{
    switch(listItem)
    {
       case 0:
       {
           SF->getSAMP()->getChat()->AddChatMessage("Вы выбрали пункт 1");
       }
       case 2:
       {
           SF->getSAMP()->getChat()->AddChatMessage("Вы выбрали пункт 2");
       }
    }
}
На данный момент нельзя реализовать обычный показ диалога в этом обработчике и нужно идти на хитрости :
C++:
bool __showDialog = false;
C++:
if(dialogId==4 & buttonId==1)



{



    switch(listItem)



    {



       case 0:



       {



           SF->getSAMP()->getChat()->AddChatMessage("Вы выбрали пункт 1");



       }



       case 2:



       {



             __showDialog=true;



       }



    }



}
В основной функции
Код:
if(__showDialog)
{
   __showDialog=false;
   dialog->ShowDialog(6,DIALOG_STYLE_MSGBOX,"Заголовок","Содержание","кнопка  1" , "кнопка 2");
}
Дальше обрабатываем в нашем методе ,как и с обычным диалогом.
 
Сверху Снизу