Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 3 1 2 3 ПоследняяПоследняя
Показано с 1 по 10 из 22
  1. #1
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±

    Создание NPC бота

    Доброго времени суток дорогие форумчане, в данном уроке вы подробно узнаете как создать своего собственного NPC бота.

    Предисловие: За время моей практики я уже написал ещё один урок по созданию NPC бота, но к сожалению к тому времени у меня было мало опыта и допустил не мало ошибок. В данном уроке я попытаюсь исправить все мои допущенные ошибки, ну а также учту все нововведения появившийся с того момента.

    Некоторые часто задаваемые вопросы:
    Q:Что такое NPC?
    A:NPC (Non-Playing Characters или 'боты') это нововведение в версии SA-MP 0.3. Данная нововведение позволяет вам добавить одного или несколько NPC на вашем сервере. Боты будут работать как "виртуальные игроки", при этом будут занимать 1 слот, также как нормальный игрок. (Подробнее: КЛАЦ)
    Q:Нужны ли определённые дополнения (плагин к примеру) для создания NPC?
    A:Нет, всё нужное встроено в клиентах версии 0.3+. Если же, в папках .../pawno/include/ отсутствуют инлкюды a_npc или a_samp, вы можете их скопировать с официального сайта sa-mp.

    I. Создание NPC

    1) Заходим в корневую папку вашего сервера, находим файл server.cfg, открываем в Блокноте, и добавляем/изменяем после строчки "maxnpc" значение на *количество ботов которых вы хотите создать*.
    2) Открываем pawno, и создаём новый файл. Заменяем всё содержимое на:
     Клик *
    PHP код:
    #include <a_samp>
    #tryinclude <dc_cmd>
    #if defined DC_CMD
    CMD:startrecrod(playeridparams[])
    {
        if(!
    strlen(params[0])) return SendClientMessage(playerid,0xFF0000FF,"Использвание: /startrecord {Название записи}");
        if(!
    IsPlayerInAnyVehicle(playerid)) StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_DRIVER,params[0]);
        else 
    StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_ONFOOT,params[0]);
        
    SendClientMessage(playerid,0xFF0000FF,"Запись началась.");
        return 
    1;
    }
    CMD:stoprecord(playeridparams[])
    {
        
    StopRecordingPlayerData(playerid);
        
    SendClientMessage(playerid,0xFF0000FF,"Запись остановлена.");
        return 
    1;
    }
    #else
    #include "../include/gl_common.inc"
    public OnPlayerCommandText(playeridcmdtext[])
    {
        new 
    cmd[256];
        new 
    idx;
        
    cmd strtok(cmdtextidx);
         if(
    strcmp(cmd"/startrecord"true) == 0){
            new 
    tmp[512];
              
    tmp strtok(cmdtextidx);
            if(!
    strlen(tmp)) return SendClientMessage(playerid,0xFF0000FF,"Использвание: /startrecord {Название записи}");
            if(!
    IsPlayerInAnyVehicle(playerid)) StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_DRIVER,tmp);
            else 
    StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_ONFOOT,tmp);
            
    SendClientMessage(playerid,0xFF0000FF,"Запись началась.");
            return 
    1;
        }
        if(
    strcmp(cmd"/stoprecord"true) == 0) {
            
    StopRecordingPlayerData(playerid);
            
    SendClientMessage(playerid,0xFF0000FF,"Запись остановлена.");
            return 
    1;
        }
        return 
    0;
    }
    #endif 

    Компилируем под названием record в каталог(папку) filterscripts.


    *Команды данного скрипта скомпилируются на DC_CMD (при наличии includa <dc_cmd>) либо на стандартный командный процессор.
    3) Вводим в консоль команду "loadfs record"(без кавычек), либо в игре: /rcon loadfs record (сперва нужно авторизоваться как администратор).
    4) Заходим в игру и пишем /startrecrod "Название записи" с позиции старта/повтора записи бота.
    После того как мы повторили точные движения бота, вводим /stoprecord.
    -"Запись началась"
    -"Запись остановлена."
    5) Открываем каталог \scriptfiles и находим в нём файл с ранее указанным названием (расширение .rec).


    6) Копируем/вырезаем файл в каталоге \npcmodes\recordings
    7) Открываем компилятор, создаём новый файл, и заменяем всё содержимое на:
     Клац*
    PHP код:
    #define RECORDING "Название записи" //ковычки оставляем
    #define RECORDING_TYPE 1// Заменяем на любое другое число если запись
    #define RECORDING_REPLAY 1// Повтор записи, 1 - да, 0 - нет
    #include <a_npc>
    main(){}
    #if RECORDING_REPLAY == 1
    public OnRecordingPlaybackEnd() StartRecordingPlayback(RECORDING_TYPERECORDING);
    #endif
    #if RECORDING_TYPE == 1
    public OnNPCEnterVehicle(vehicleidseatidStartRecordingPlayback(RECORDING_TYPERECORDING);
    public 
    OnNPCExitVehicle() StopRecordingPlayback();
    #else
    public OnNPCSpawn() StartRecordingPlayback(RECORDING_TYPERECORDING);
    #endif 

    Компилируем в каталог \npcmodes с тем же названием что и у записи.


    *Не забываем изменить директивы #define на нужные нам параметры.
    *Вы также можете использовать в данный скрипт и другие NPC калбэки, полный список всех NPC калбэков: КЛАЦ
    8) Подключаем бота при помощи функции ConnectNPC(name[], script[]) - желательно в OnGameModeInit*.
    PHP код:
    public OnGameModeInit()
    {
       
    ConnectNPC("Nick_Name","MyRec");
       return 
    1;



    *Так, у бота, без всякого риска останется свободный слот.
    9) Если запись бота происходила а автомобиле, обязательно создавать его (при помощи функции CreateVehicle/AddStaticVehicle). Также, не обязательно указывать точные координаты спавна автомобиля, так как бот сам телепортирует её к месту старта записи, но не нужно забывать про PutPlayerInVehicle.
    Пример:
    PHP код:
    new botcar;
    public 
    OnGameModeInit()
    {
       
    ConnectNPC("Nick_Name","MyRec");
       
    botcar CreateVehicle(*carid*, 0.00.05.00.0
       *
    цвет1*, *цвет2*, 5000);
       return 
    1;
    }
    public 
    OnPlayerSpawn(playerid)
    {
        if(
    IsPlayerNPC(playerid))
        {
            new 
    npcname[MAX_PLAYER_NAME+1];
            
    GetPlayerName(playeridnpcnamesizeof(npcname));
            if(!
    strcmp(npcname"Nick_Name"true))
            {
                
    PutPlayerInVehicle(playeridbotcar0);
                
    SetSpawnInfo(playerid,0,*skinid*,0.0,0.0,0.0,0.0,0,0,0,0,0,0);
            }
            return 
    1;
        }
        return 
    1;

    10) ПРИМЕЧАНИЕ: После его подключение, бот ведёт себя как обычный игрок, и по мимо калбэков в NPC скрипте, он отвечает на обычных калбэков для игроков. Иногда это удобно, но при этом есть некоторые калбэки или функцие которые NPC не сможет пройти, к примеру вашу Реггистрацию, Анти-Чит телепорта и т.д. Следовательно, в данных калбэков нужно исключить NPC простой проверки:
    PHP код:
    if(IsPlayerNPC(playerid)) return 1


    *Можно экспериментировать калбэками (КЛАЦ) и обычными функциями и создать весьма интересные системы ; ).
    Данный урок посвящается порталу pro-pawn.ru, просьба не копировать на посторонних источниках.
    Автор: ^_^

    Тема будет дополнятся.
    Последний раз редактировалось ^_^; 12.01.2014 в 16:27.

  2. 19 пользователя(ей) сказали cпасибо:
    #ball (28.09.2014) $continue$ (13.01.2015) Albert (14.01.2015) AndreyKa (12.01.2014) bredvix (09.01.2014) Daniel_Cortez (09.01.2014) Dima_Turkow (09.01.2014) DmX (17.04.2014) Gressie (27.09.2021) L0ndl3m (09.01.2014) Nurick (28.09.2014) Osetin (19.01.2014) Salvacore (10.01.2014) Straik32423 (22.06.2015) TWIX (09.01.2014) [ForD] (14.01.2015) Пельмень (13.01.2014) ™Олежа™ (09.01.2014)
  3. #2
    Аватар для TWIX
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.10.2013
    Сообщений
    100
    Репутация:
    41 ±
    Неплохо!
    Уважаю данных Людей:

    1. Osetin(Хороший Администратор)
    2.Daniel_Cortez(Классный скриптер)
    3.Londlem(Офигенный скриптер)
    4.#Carleone(Просто хороший человек)

  4. #3
    Аватар для Dima_Turkow
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2013
    Адрес
    Екатеринбург
    Сообщений
    124
    Репутация:
    8 ±
    + дам

  5. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Not bad. За фишку с опциональным использованием dc_cmd уже можно + поставить.

    P.S.: Если не сложно, уменьши ширину 1-го столбца в таблице. Жутко неудобно каждый раз прокручивать страницу вправо, чтобы увидеть содержимое 2-го столбца.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. #5
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Not bad. За фишку с опциональным использованием dc_cmd уже можно + поставить.

    P.S.: Если не сложно, уменьши ширину 1-го столбца в таблице. Жутко неудобно каждый раз прокручивать страницу вправо, чтобы увидеть содержимое 2-го столбца.
    Благодарю, первый пост обновлён.

  7. 2 пользователя(ей) сказали cпасибо:
    Dima_Turkow (09.01.2014) Salvacore (10.01.2014)
  8. #6
    Аватар для Dima_Turkow
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2013
    Адрес
    Екатеринбург
    Сообщений
    124
    Репутация:
    8 ±
    Молодец )

  9. #7
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Молодец.
    Very good.

  10. #8
    Аватар для MR_BEN
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.01.2014
    Сообщений
    110
    Репутация:
    29 ±
    Спасибо, пригодилось.

  11. #9
    Аватар для AndreyKa
    Пользователь

    Статус
    Оффлайн
    Регистрация
    12.01.2014
    Адрес
    Архангельск
    Сообщений
    53
    Репутация:
    1 ±
    Отлично,не каждый знает это!

  12. #10
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Тема обновлена.

  13. 2 пользователя(ей) сказали cпасибо:
    DmX (17.04.2014) Osetin (19.01.2014)
 

 
Страница 1 из 3 1 2 3 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •