Разбор скрипта «NPC боксёр в SAMP» (Часть 6)

30 сентября 2015 | Рубрика: Статьи

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

Паблик для вычисления ближайшего игрока – примем как данное, это математика.

forward boxerfight();

public boxerfight()

{ начинается самое интересное, готовы? Поехали!

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

                   new Float:dist;

                   new pid = GetClosestPlayer(npc[npcid][npc_ID],dist);

для NPC-боксера задаем переменную дистанция, через переменную pid мы получаем ближайшего игрока к NPC на какой-либо дистанции.

if(dist<15.0 && GetPVarInt(pid, «box»)== 1)

                   {

                            SetPVarInt(npc[npcid][npc_ID], «Condition»,0);

                   }

Собственно сама дистанция, если дистанция менее 15 и этот человек именно тот, кто бросил вызов NPC, задать состояние NPC равное нулю.

Так как таймер каждые 250 миллисекунд всё проверяет, то просканировав в следующий раз он такой смотрит

if(GetPVarInt(pid, «box»)== 1 && GetPVarInt(npc[npcid][npc_ID], «Condition»)==0)

                   {

                            new Float:xnc, Float:ync, Float:znc;

                            GetPlayerPos(pid,xnc,ync,znc);

                            FCNPC_GoTo(npc[npcid][npc_ID],xnc,ync,znc,MOVE_TYPE_RUN,0,0);

                   }

Игрок, мол есть, идентификатор у него бокс, а теперь и у NPC ещё состояние нулевое, что означает состояние “беги” в данном случае. Задаем локальные координаты, получаем координаты ближайшего игрока через pid, ну и, конечно же, функцию GetPlayerPos, фишка в том, что pvar нам нужен для того, чтобы NPC не бил просто ближайшего игрока, он будет бить именно того, что бросил вызов, надеюсь теперь немного понятно зачем они здесь. Далее говорим NPC беги в игрока.

Таймер все также по 250 миллисекунд сканирует, вот подбегает он к игроку и тут

if(dist < 0.8 && dist<15.0 && GetPVarInt(pid, «box»)== 1)

                   {

                            FCNPC_Stop(npc[npcid][npc_ID]);

                            SetPVarInt(npc[npcid][npc_ID], «Condition»,1);

                   }

Опа, дистанция то у нас теперь менее 0.8 и не более 15, а игрок наш тот, что вызов бросил, говорим NPC прекратить бег, бегая удар-то не нанесешь, нормальный по крайней мере, хотя есть такая функция для FCNPC, но лучше её не использовать, итак остановили NPC и перевели его в состояние 1.

Таймер снова сканирует всё

if(GetPVarInt(pid, «box»)== 1 && GetPVarInt(npc[npcid][npc_ID], «Condition»)==1)

                   {

                            switch(random(3))

                            {

                            case 0: FCNPC_SetKeys(npc[npcid][npc_ID],KEY_HANDBRAKE+KEY_FIRE);

                            case 1: FCNPC_SetKeys(npc[npcid][npc_ID],KEY_HANDBRAKE+KEY_SECONDARY_ATTACK);

                            case 2: FCNPC_SetKeys(npc[npcid][npc_ID],KEY_HANDBRAKE+KEY_JUMP);

                            }

                   }

Теперь у нас выполняется условие, что игрок с индентификатором бокс рядом, в пределах от 0.8 до 15, а состояние NPC равно единичке. Про то, почему такие дистанции, напишу позже.

Читай скорее далее: Разбор скрипта «NPC боксёр в SAMP» (Заключение и выводы)