Главная » Полезные статьи » Руководства по NPC

Сортировать по: Дате · Названию · Рейтингу · Комментариям · Просмотрам

Добавилось то, что теперь мы дописываем в строку к NPC интерьер, где он будет и его боевой стиль. Об этом мы писали в серии статей "Руководство по созданию NPC в SAMP"

public OnFilterScriptInit() – вызывается, когда скрипт начинает работу

{

        ringused=0; - скрипт загрузился – говорим, на ринге никого нет

        for (new i = 0; i < 499; i++) {

        DeletePVar(i, "box");  для всех игроков удаляем pvar box

        }

        pickupkase = CreatePickup(1314,2, 757.4380,5.8088,1000.7014, -1);

создаем пикап с идентификатором pickupkase по таким-то координатам, 1314 – моделька пикапа, далее идут координаты по x,y,z, затем идет в каком виртуальном мире, ставьте -1 для всех виртуальных миров, ну а так-то по идее можно и 0, для 0вого мира.

       

}

public OnPlayerDisconnect(playerid, reason) – что будет, когда игрок отключится

{

Проверяем для NPC нашего, боксера то есть

                   for (new npcid = 0; npcid < 1; npcid++) {

                   if(GetPVarInt(playerid, "box")== 1)

если игрок был с идентификатором box, что значит на ринге

                   {

Выполнить для всех игроков имеющих идентификатор box его удаление, убиваем таймер, уничтожаем NPC, ставим ринг в положение – не используется, задаем таймер на обновление пикапа для входа на ринг.

                   for (new i = 0; i < 499; i++) {

                   if(GetPVarInt(i, "box")== 1){

                   DeletePVar(i,"box");}}

                   KillTimer(boxertimer);

                   FCNPC_Destroy(npc[npcid][npc_ID]);

                   ringused=0;

                   SetTimer("Renewbox",15000,0);

                   }

                   }

}

public OnPlayerDeath(playerid, killerid, reason) вызывается когда игро умирает

{

 Всё то же самое

    for (new npcid = 0; npcid < 1; npcid++) {

         if(GetPVarInt(playerid, "box")== 1)

         {

         for (new i = 0; i < 499; i++) {

         if(GetPVarInt(i, "box")== 1){

         DeletePVar(i,"box");}}

         KillTimer(boxertimer);

         FCNPC_Destroy(npc[npcid][npc_ID]);

         ringused=0;

         SetTimer("Renewbox",15000,0);

         }

         }

    return 1;

}

public OnFilterScriptExit() когда выключаем скрипт

{

Всё то же самое, кроме

        for (new npcid = 0; npcid < sizeof(npc); npcid++) {

                FCNPC_Destroy(npc[npcid][npc_ID]);

        }

        for (new i = 0; i < 499; i++) {

         if(GetPVarInt(i, "box")== 1){

скрипт выключили, а игроку на ринге быть? Ну уж нет, все кто имеют подобные идентификатор должны быть немедленно телепортированы с него, а идентификатор удален с них

         SetPlayerPos(i, 766.2117,6.1029,1000.7167);

         SetPlayerFacingAngle(i, 170.4782);

                   DeletePVar(i,"box");}}

        KillTimer(boxertimer);

        DestroyPickup(pickupkase);

        return 1;

}

Вернуться в первую частьРазбор скрипта "NPC боксёр в SAMP" (Часть 3)

 

Руководства по NPC | Просмотров: 3063 | Дата: 02.11.2014 | Комментарии (0)

Дабы не было много флуда будем писать скрипт построчно. И объяснять почти всё, вдруг кто-то только учиться скриптить

#include <a_samp>

#include <fcnpc>

В самом начале скрипта как всегда пишутся include’ы. Include переводится как включение/вложение. Стандартным include, необходимым для работы какого-либо скрипта,  является include <a_samp>, который и содержит базовые функции. Так как стандартных функций нам недостаточно пишем, что, помимо основного include, у нас будет ещё некий include <fcnpc>, который отвечает за NPC  плагина FCNPC. Все include должны находится в папке yourserver\pawno\include. Идем далее.

#define COLOR_GREEN 0x16BC37AA

Осталось с каких-то тестовых скриптов, но раз уж используется в скрипте, то опишем, что же это за зверь) Итак, define переводится как определять/обозначать/устанавливать, то есть эта функция в данном примере устанавливает для зеленого цвета обозначение COLOR_GREEN. Дело в том, что ни один цвет, где бы то ни было не записывается как color_red, color_blue и прочее, все цвета (в SA:MP) имеют формат 0x16BC37AA, в данном случае такое выражение описывает оттенок зеленого цвета ну или как-то так, дизайнеры могут уточнить, ведь каждый цвет имеет очень много оттенков и описать все их словами было бы проблематично, да и кто бы это смог запомнить, поэтому цвета имеют такой формат. Чтобы не писать, например, в SendClientMessage(playerid, 0x16BC37AA, “Привет”) , мы заменяем 0x16BC37AA на простое и понятное для нас COLOR_GREEN, если Вы пишете большой мод, то наверняка у Вас там будет много дефайнов как для цветов, так и для чего-то иного, поэтому определения очень важны, чтобы самому не затеряться в коде.

new boxertimer;

new pickupkase;

new ringused;

Обозначим, что у нас будут некие переменные для всего скрипта, переменные бывают локальные, внутри цикла, например, и вот как здесь – для всего скрипта, мы ставим их вначале скрипта и они одни для всего сервера boxertimer – таймер, по которому вызывается ведения боя боксера;

Pickupkase – используем для обозначения пикапа, чтобы его потом удалить, а то баги будут, если вкратце, ringused используем для обозначения есть ли кто на ринге сейчас или нет.

enum npcInfo {

        npc_Name[MAX_PLAYER_NAME],

        npc_Skin,

        npc_FightStyle,

        npc_Interior,

        Float:npc_X,

        Float:npc_Y,

        Float:npc_Z,

        Float:npc_A,

        npc_ID,

}

new npc[][npcInfo] = {

        {"Master_of_Boxing", 81, FIGHT_STYLE_BOXING, 5, 758.4869,-1.7879,1001.5942,313.0229}

};

Продолжение: Разбор скрипта "NPC боксёр в SAMP" (Часть 2)

 

Руководства по NPC | Просмотров: 3393 | Дата: 02.11.2014 | Комментарии (0)

<< Учимся создавать свой первый NPC

Итак мы пишем /killnpc, наш NPC умирает, выполняется паблик OnDeath,  данный паблик у нас работает для всех NPC вообще, так как мы не указали для кого именно выполнять таймер, то для всех NPC это будет работать, но можно сделать и для одного NPC конкретно, так как данный NPC у нас единственный допишем в паблик OnDeath:

public FCNPC_OnDeath(npcid)

{

    for (new npcids = 0; npcids < 1; npcids++) {

         SetTimerEx("NPC_Death",5000,0,"dd",npcid);}

}

Теперь только для нашего NPC будет осуществлен переход в паблик NPC_Death, где собственное и выполнится функция по респавну (оживлению NPC), NPC респавнится там, где вы его убили, а не там, где он был изначально. Для чего мы задали выполнять перерождение лишь для NPC под номером 0 нашего цикла? Потому что другие NPC могут иметь и другой таймер, вдруг вам захочется сделать какого-нибудь NPC-босса с таймером в полчаса, а может вы и вовсе захотите, чтобы вашего NPC нельзя было убить. Если это так, допишем паблик:

public FCNPC_OnTakeDamage()

{

    for (new npcids = 0; npcids < 1; npcids++) {

    FCNPC_SetHealth(npc[npcids][npc_ID],100);

    }

}

Теперь при нанесении урона по NPC он будет лечиться на 100 хп, обычно сверхдамаг не проходит и этого вполне достаточно, впрочем, это лишь пример, можно вообще игнорить дамаг, но NPC все ещё можно убить с ножа сзади, перерезав горло, чтобы этого не было, проверяйте кнопки игрока, если игрок рядом с NPC, то чтобы ПКМ и ЛКМ не работали, ну это для каких-то особых NPC, которых Вы не хотели бы убивать.

На этом я заканчиваю первую часть руководства по NPC, если данная книга, станет нужной определенному кругу лиц и они потребуют продолжение, я с радостью продолжу её, углубляясь всё дальше и дальше, и рассматривая новые методы, алгоритмы и подходы. Во второй части, если такая будет, мы напишем такой вот скрипт: помните же бокс в Лос Сантосе? У нас будет стоять там пикап, при подборе пикапа нас перемещает на ринг к битве с боксером, который будет не тупо жать ЛКМ, но ещё исполнять какие-то более сложные вещи; при победе над боксером вы получите его стиль. Может ещё какие-то скрипты, я их так много сделал, если найдутся единомышленники, мы вместе обсудим их и способы их оптимизации,  а так же рассмотрим способы контроля NPC, методы передвижений и прочие интересности.

 

Руководства по NPC | Просмотров: 4783 | Дата: 08.10.2014 | Комментарии (0)

<< Учим NPC в SAMP ездить на машине

Создание NPC

В данном разделе мы создадим простейшего NPC и будем его усложнять.

#include <a_samp>

#include <fcnpc>   // подгружаем наши include, находящиеся в D:\server\ pawno\include

enum npcInfo {     // создаем enum для создания таблицы с данными

        npc_Name[MAX_PLAYER_NAME],

        npc_Skin,

        npc_FightStyle,

        Float:npc_X,

        Float:npc_Y,

        Float:npc_Z,

        Float:npc_A,

        npc_ID,    

}

new npc[][npcInfo] = {

{"Test_NPC", 255, FIGHT_STYLE_BOXING, 368.2780,1864.0972,7.6719,185.1584}

};

// согласно enum’у выше создаем нашего NPC с именем Test_NPC, скином 255, стилем боя боксом, координатами x,y,z и углом поворота.

public OnFilterScriptInit() // что произойдет при загрузке скрипта

{        SetTimer("spawnNPC", 3500, 0);  // таймер необязателен, но пусть прогрузится.

        return 1;

}

public OnFilterScriptExit() //что произойдет при отключении скрипта

{

        for (new npcids = 0; npcids < sizeof(npc); npcids++) {

        FCNPC_Destroy(npc[npcids][npc_ID]);} // удаляем всех созданных NPC в скрипте

        return 1;}

}

forward spawnNPC(); // паблик, где создается наш NPC

public spawnNPC()

{

            for (new npcids = 0; npcids < sizeof(npc); npcids++) {  //для всех npc в enum’е

            npc[npcids][npc_ID] = FCNPC_Create(npc[npcids][npc_Name]); //делаем ID, а не имя

            FCNPC_Spawn(npc[npcids][npc_ID], npc[npcids][npc_Skin], npc[npcids][npc_X], npc[npcids][npc_Y], npc[npcids][npc_Z]); //спавним NPC

            FCNPC_SetAngle(npc[npcids][npc_ID], npc[npcids][npc_A]); // задаем угол

            FCNPC_StopAttack(npc[npcids][npc_ID]); //при спавне NPC тупит, остановим

            }

}

Вот пример простейшего скрипта, у нас создается NPC с 255 скином по таким-то координатам и угол поворота такой-то.

Усложним скрипт, ведь если мы убьем нашего NPC он же не возродиться, поможем ему обрести жизнь, для этого рекомендуется перейти на версию плагина 0.3x для Windows, ибо тут мы NPC не убьем, хотя на некоторых серверах убиваются, и у меня убивались, но кто знает, что за сервер у Вас, но если все же вам влом что-то менять, то убьём NPC скриптово, чисто для теста функции, добавим в скрипт:

forward NPC_Death(npcid);

public NPC_Death(npcid)

{

    FCNPC_Respawn(npcid);

}

public FCNPC_OnDeath(npcid)

{

            SetTimerEx("NPC_Death",5000,0,"dd",npcid);

}

public OnPlayerCommandText(playerid, cmdtext[])

{

    if(!strcmp(cmdtext, "/killnpc", true))

    {

        for (new npcids = 0; npcids < 1; npcids++) {

        FCNPC_Kill(npc[npcids][npc_ID]);

        }

        return 1;

    }

    return 0;

}

Самое интересное дальше: Оживляем NPC после смерти в SAMP >>

 

Руководства по NPC | Просмотров: 3203 | Дата: 08.10.2014 | Комментарии (0)

<< Координаты скорости NPC в GTA SAMP

FCNPC_StopAttack(npcid) – останавливает безумие, описанное выше)

FCNPC_IsAiming(npcid) – выполняется, если NPC целиться.

FCNPC_IsShooting(npcid) – выполняется, если NPC стреляет.

FCNPC_IsReloading(npcid) – выполняется, если NPC перезаряжается, ну как выполняется, там значение-то 0 или 1, типа да или нет.

FCNPC_EnterVehicle(npcid, vehicleid, seatid, type) – ммм, начинается веселье. Сажает NPC в машинку или прочее ТС, где vehicleid пишем id машинки, затем место, на которое NPC сядет от 0, 0 – водительское место и тип, не знаю зачем он тут, ну я писал DRIVE, о типах выше. Итак, что же делает данная функция? Если машинка заспавнена правильно (колеса по z не проседают), то NPC бежит к машине и садиться в неё, да-да вы не ослышались САДИТСЯ, прямо как настоящий человек)

FCNPC_ExitVehicle(npcid) – как настоящий человек выходит изТС.

FCNPC_PutInVehicle(npcid, vehicleid, seatid)  - ТС далеко или ещё что-то, сажаем NPC, в отличие от функции выше, здесь не будет никакой красивой посадке тупо ТП в машину туда-то и да, вы не сможете использовать ExitVehicle, если посадили через PutInVehicle, для этого существует функция FCNPC_RemoveFromVehicle(npcid)  (хотя может и сможете, я хз, лично я не смог:D) .

FCNPC_GetVehicleID(npcid) – получаем id машины NPC, не пробовал, но скорее всего можно как и GetPlayerVehicleID.

FCNPC_GetVehicleSeat(npcid) – получаем сидение для NPC.

FCNPC_StartRecordingPlayback(npcid, file[]) – стартуем запись для NPC. Записи рекомендую использовать при езде NPC на машине, некоторые участки не запрограммируешь, это архисложно, так что если наш NPC куда-то едет, то лучше использовать запись, но опять же, смотря что вам надо если местность относительно ровная и плавная, можно замутить и через goto перемещения.

FCNPC_StopRecordingPlayback(npcid) – прерывает действие записи.

FCNPC_PauseRecordingPlayback(npcid) – приостанавливает действие записи. Зачем это нужно, спросите Вы? Отвечаю: создали мы бота автобусника, перед нами впереди человек или машина, нам что давить его что ли ну или машину таранить? Нет! Мы просто приостановим запись, от имени NPC что-то напишем хулиганам, перекрывающим путь, ну и дальше как ваша фантазия пойдет, можно сделать, чтобы хоть NPC с битой выходил и разбирался, а если машина впереди без человека можно и тарануть это всё очень на любителя, плагин позволит всё это выполнить.

FCNPC_ResumeRecordingPlayback(npcid) – продолжаем воспроизведения записи. Устранили препятствие впереди нас – едем дальше).

Фух, описал-таки эти функции, про ноды писать не буду – не уникально и крашит ИМХО, так же как и FCNPC_GetZGround(Float:x, Float:y, &Float:z) – тоже ненужная вещь, связанная с неидеальностью zmap.

Подведем итоги: плагин имеет относительно большой функционал, функции работают, версия на линуксе уже имеется, но NPC там не убиваемые и сами не могут убить ( текущая версия SA:MP 0.3z R1-2), лучшая версия для тренировки с NPC на плагине на данный момент это 0.3x последнее обновление плагина для этой версии, там вообще нет линукс версии, но зато в Windows версии NPC стреляют и нормально так, хотя как запрограммируете, но в то же время, есть небольшой минус в 0.3x в виде ников у NPC над головой, который местами багают, в 0.3 z в связи с вводом официальных повреждений для NPC Вы не увидите ников NPC, а так же их нахождении в табличке на TAB. Так вот, плагин в целом рабочий, осуществим можно очень и очень многое, стоит как минимум потренироваться.

Продолжение: Учимся создавать свой первый NPC >>

Руководства по NPC | Просмотров: 3877 | Дата: 08.10.2014 | Комментарии (0)

1-5 6-10 11-13