Главная » Статьи GTA » Работа с модами и скриптами SAMP »



Информация по созданию модов SAMP [2]
Исчерпывающая информация и фак'и по созданию модов и скриптов GTA SAMP
Информация по соданию скриптов SAMP [3]
Инструкции и описания по созданию SAMP скриптов
Оптимизация модов и скриптов [4]
Статьи по оптимизации модов и скриптов SAMP
Ошибки и их решения [0]
Ошибки при работе с созданием и оптимизацией SAMP модов и скриптов
FAQ по установке и настройке [1]
Вопрос-ответ по установке и настройке модов и скриптов SAMP
Статьи о компиляции PAWN [1]
Вся информация, касающаяся компиляции на языке PAWN с помощью компилятора.
Руководства по NPC [13]
Как работать с NPC в SAMP узнаем из этого раздела



В разделе статей: 24
Показано статей: 6-10
Страницы: « 1 2 3 4 5 »

Читайте предыдущую часть статьи по ссылкеРазбор скрипта "NPC боксёр в SAMP" (Часть 2)

Начнем с функции public OnPlayerPickUpPickup(playerid, pickupid)

{ - открываем паблик

Функция вызывается тогда, когда игрок подбирает какой-либо пикап, наиболее яркие примеры пикапов в сингле это броня, аптечки, оружие.

if (pickupid == pickupkase) в этом строке мы указываем, что будет если игрок подберет пикап с идентификатором pickupkase.

{ - открываем всё, что нам надо сделать при подборе этого пикапа.

SendClientMessage(playerid,COLOR_GREEN,"Сражайтесь с мастером, чтобы овладеть стилем!"); - Посылаем игроку, подобравшему пикап текстовое сообщение зеленым цветом.

SetPlayerPos(playerid, 762.9995,2.5302,1001.5942); - задаем игроку позицию,  точнее мы портаем его на ринг, данная функция выглядит как playerid – это тот, кого портать, а дальше через запятую идут некие цифры, которые являются координатами по x,y,z.

SetPlayerFacingAngle(playerid, 138.2046); - телепортировав игрока на ринг зададим ему некий угол поворота, чтобы он смотрел в центр ринга.

DestroyPickup(pickupkase); - уничтожаем пикап, на самом деле эту строчку можно было бы написать выше всех, возможно, так было бы логичней, но вследствие того, что данный процесс происходит очень быстро, то мы не почувствуем разницы, в данном случае это не принципиально, но бывают случаи, когда это критично, если такое встретиться в моих скриптах, мы обязательно это обсудим. Зачем уничтожать пикап, спросите Вы? Для того, чтобы не было такого, что 2 и более игроков так же телепортируются на ринг – одного портировали и хватит, умрет или выйдет с сервера – удалим боксера и обновим пикап, но об этом далее.

SetPVarInt(playerid, "box",1); - что за ужасы пошли, «пвары» какие-то? На самом деле это «АРХИполезная» функция. «Пвары» это такие «присваиватели». Если так можно сказать. В данном случае здесь обозначается игрок ,находящийся на ринге. Для NPC Pvar’ы очень и очень важны, с помощью них мы можем производить контроль по принципу state_machine, об этом позже. Здесь же у нас всё просто: для игрока взявшего пикап, мы говорим  -этот человек на ринге! Ну, как говорим,  NPC-то пока об этом ничего не знает, об это знаем только мы, но, вскоре, мы расскажем ему этот секрет)

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

 

 

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

Добавилось то, что теперь мы дописываем в строку к 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 | Просмотров: 3060 | Дата: 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)

1-5 6-10 11-15 16-20 21-24