• Уважаемый Гость.
    - Прежде чем создать свою тему, пожалуйста, попробуй воспользоваться этим -> ПОИСКОМ !!!
    - После решения Вашего вопроса (проблемы) - нажмите "Лучший ответ", на сообщении, которое его решило. За игнорирование этого действия - Вы получите соответствующее предупреждение. Мы - стараемся Вам помочь. Уделите 10 секунд - чтобы нажать кнопку. (Если у Вас нет такой возможности - укажите в последнем своем сообщении какой ответ Вы считаете лучшим. Наши модераторы сделают это за Вас)
    ЗАПРЕЩЕНО:
    - Cоздавать темы с названиями "Помогите", "Плиз", "Ошибка", "Не могу найти", "Хелп" и тому подобное;
    - Cоздавать темы без детального описания того, что нужно исправить.
    - Cоздавать темы из одного скриншота.
    За игнор правил форума - Ваша тема будет удалена, а Вы получите системное предупреждение.

Не работает FCNPC

NoPressF

Умник
Здравствуйте, почему у меня зомби не хочет меня бить хотя бегает за мной?
PHP:
//Includes
#include <a_samp>
#include <FCNPC>
//
#define MOVE_TYPE_RUN 1
#define MOVE_TYPE_WALK 0
///Переменные
new npc_timer; //создаем переменную для таймера NPC, чтобы можно было его контролировать, а именно - удалить после отгрузки скрипта
//

//Enums
enum npcInfo {
    npc_Name[MAX_PLAYER_NAME], //имя бота
    npc_Skin, //скин бота
    npc_FightStyle, //стиль боя бота
    Float:npc_X, //координата появления по Х
    Float:npc_Y, //координата появления по Y
    Float:npc_Z, //координата появления по Z
    Float:npc_A, //координата угла поворота при появлении
    weaponnpcid, //оружие бота
    npc_ID, //идентификатор бота
}

new npc[][npcInfo] = {
    {"Zombie_1", 162, FIGHT_STYLE_BOXING, 155.2671,2159.7761, 23.0466, 81.1022,0}, // Спавн зона
    {"Zombie_2", 162, FIGHT_STYLE_BOXING, 384.5046, 2123.3501, 17.2337, 224.8191,0}, // Спавн зона
    {"Zombie_3", 162, FIGHT_STYLE_BOXING, 439.6664, 1914.5359, 21.4267, 191.6054,0}, // Спавн зона
    {"Zombie_4", 162, FIGHT_STYLE_BOXING, 328.3770, 1681.3593, 18.6567, 128.3115,0}, // Спавн зона
    {"Zombie_5", 162, FIGHT_STYLE_BOXING, 2.6968, 1866.6641, 17.6496, 71.8791,0} // Спавн зона
};
//

//Main publics
public OnFilterScriptInit()
{
    SetTimer("spawnNPC",1500,0); //через 1.5 секунды после загрузки скрипта начнем создавать бота
}
public OnFilterScriptExit()
{
    for (new npcid = 0; npcid < sizeof(npc); npcid++) { //при отгрузке скрипта, удаляем всех созданных нами ботов
        FCNPC_Destroy(npc[npcid][npc_ID]);
    }
    KillTimer(npc_timer); // при отгрузке скрипта, удаляем таймер, чтобы не было лишней нагрузки
    return 1;
}
//

//Main NPC Public
forward spawnNPC();
public spawnNPC()
{
    for (new npcid = 0; npcid < sizeof(npc); npcid++)
    {
          npc[npcid][npc_ID] = FCNPC_Create(npc[npcid][npc_Name]); //присваиваем имя нашему боту то, что мы ввели в enum'е
          FCNPC_Spawn(npc[npcid][npc_ID], npc[npcid][npc_Skin], npc[npcid][npc_X], npc[npcid][npc_Y], npc[npcid][npc_Z]); //создаем бота со скином и координатами по x,y,z, указанными в enum'е
          SetPlayerFightingStyle(npc[npcid][npc_ID], npc[npcid][npc_FightStyle]); //задаем боту стиль боя, указанный в enum'е
          FCNPC_Stop(npc[npcid][npc_ID]); //так как плагин связан с хаком памяти, боты вначале при подгрузке могут делать странные вещи, случайная анимация или атака, убираем всё это
          FCNPC_StopAttack(npc[npcid][npc_ID]); //тоже самое, что и строка выше
          FCNPC_SetWeapon(npc[npcid][npc_ID],npc[npcid][weaponnpcid]); //выдаем боту оружие, согласно enum'у
          FCNPC_SetQuaternion(npc[npcid][npc_ID],0.0,0.0,0.0,0.0); //кватернион - угол поворота в пространстве, чтобы наш бот заспавнился "нормально", то есть с 0 углами наклона относительно осей
          FCNPC_SetAngle(npc[npcid][npc_ID], npc[npcid][npc_A]); //задаем боту угол поворота, согласно enum'у, важно, чтобы данная строка стояли только после кватерниона
    }
    {
    npc_timer = SetTimer("npc_timer_public",100,1);
    }
    for (new npcid = 0; npcid < sizeof(npc); npcid++) {
    SetPVarFloat(npc[npcid][npc_ID],"x",npc[npcid][npc_X]);
    SetPVarFloat(npc[npcid][npc_ID],"y",npc[npcid][npc_Y]);
    SetPVarFloat(npc[npcid][npc_ID],"z",npc[npcid][npc_Z]); //запоминаем координаты спавна для NPC
    SetPVarInt(npc[npcid][npc_ID],"condition",0); //задаем для NPC из первой строчки значение pvar'а состояния равным одному
    //создаем таймер с глобальной переменной, в котором будут обновляться действия NPC каждые 100 миллисекунд
}
}
//

//Нахождения расстояния между NPC и игроком
static stock GetClosestPlayer(playerid, &Float:cdist)
{
    new cid = INVALID_PLAYER_ID;
    new Float:dist;
    new Float:x,Float:y,Float:z;
    new Float:mx,Float:my,Float:mz;

    cdist = 65000.0;
    GetPlayerPos(playerid,mx,my,mz);

    for(new i = GetMaxPlayers();i >= 0;i--)
    {
        if(playerid == i) continue;
        if(!IsPlayerConnected(i)) continue;
        if (IsPlayerNPC(i)) continue;
        GetPlayerPos(i,x,y,z);
        x -= mx;
        y -= my;
        z -= mz;

        dist = floatsqroot(x*x + y*y + z*z);

        if(dist < cdist)
        {
            cdist = dist;
            cid = i;
        }
    }

    return cid;
}
//

//Сток для разворота NPC лицом к игроку
stock FCNPC_Player_Angle(npcid, playerid)
{
    new Float:player_pos[3];
    GetPlayerPos(playerid, player_pos[0], player_pos[1], player_pos[2]);

    new Float:npc_pos[3];
    FCNPC_GetPosition(npcid, npc_pos[0], npc_pos[1], npc_pos[2]);

    FCNPC_SetAngle(npcid, 180.0 - atan2(npc_pos[0] - player_pos[0], npc_pos[1] - player_pos[1]));
    return 1;
}
//


//Паблик обновления действий NPC
forward npc_timer_public();
public npc_timer_public()
{
    for (new npcid = 0; npcid < sizeof(npc); npcid++) {
        new Float:dist; //переменная дистанции, которая будет использована для определения расстояния между NPC и ближайшим к нему игроком
        new pid = GetClosestPlayer(npc[npcid][npc_ID],dist); //находим ближайшего игрока к NPC и получаем дистанцию между ними
        if(GetPlayerVirtualWorld(pid) == GetPlayerVirtualWorld(npc[npcid][npc_ID])) //если виртуальный мир игрока и бота одинаков
        {
              if(GetPVarInt(npc[npcid][npc_ID],"condition")==0 && dist > 10.0) //если состояние равно единице и расстояние между ботом и игроком менее 25 метров
            {
                SetPVarInt(npc[npcid][npc_ID],"condition",1); //переключаем состояние боту
                CallLocalFunction("FCNPC_OnReachDestination", "i", npc[npcid][npc_ID]); //посылаем в паблик
            }
            if(GetPVarInt(npc[npcid][npc_ID],"condition")==0 && dist < 10.0) //если состояние равно единице и расстояние между ботом и игроком менее 25 метров
            {
                SetPVarInt(npc[npcid][npc_ID],"condition",2); //переключаем состояние боту
            }
            if(GetPVarInt(npc[npcid][npc_ID],"condition")==1 && dist < 10.0) //если состояние равно единице и расстояние между ботом и игроком менее 25 метров
            {
                SetPVarInt(npc[npcid][npc_ID],"condition",2); //переключаем состояние боту
            }
            if(GetPVarInt(npc[npcid][npc_ID],"condition")==2 && dist < 10.0) //если состояние равно двум и расстояние между ботом и игроком менее 25 метров
            {
                new Float:x, Float:y, Float:z; //создаем переменные, в которые будем записывать координаты ближайшего игрока
                GetPlayerPos(pid,x,y,z); //записываем координаты ближайшего игрока
                FCNPC_GoTo(npc[npcid][npc_ID],x,y,z,MOVE_TYPE_RUN/*,0,0*/); //направляем нашего NPC по координатам игрока бегом
            }
            if(GetPVarInt(npc[npcid][npc_ID],"condition")==2 && dist < 0.8) //если состояние равно двум и расстояние между ботом и игроком менее 0.8 метров
            {
                SetPVarInt(npc[npcid][npc_ID],"condition",3); //переключаем состояние боту
            }
            if(GetPVarInt(npc[npcid][npc_ID],"condition")==3 && dist < 0.8) //если состояние равно трем и расстояние между ботом и игроком менее 0.8 метров
            {
                FCNPC_Player_Angle(npc[npcid][npc_ID], pid); //разворачиваем NPC лицом к игроку
                switch(random(3)) // заставляем бота использовать одну из трех комбинаций кнопок, случайный образом: 2 комбинации атаки и один блок
                {
                    case 0: FCNPC_SetKeys(npc[npcid][npc_ID], KEY_HANDBRAKE+KEY_FIRE, 0, 0);
                    case 1: FCNPC_SetKeys(npc[npcid][npc_ID], KEY_HANDBRAKE+KEY_SECONDARY_ATTACK, 0, 0);
                    case 2: FCNPC_SetKeys(npc[npcid][npc_ID], KEY_HANDBRAKE+KEY_JUMP, 0, 0);
                }
            }
            if(GetPVarInt(npc[npcid][npc_ID],"condition")==3 && dist > 0.8) //если состояние равно трем и расстояние между ботом и игроком более 0.8 метров
            {
                SetPVarInt(npc[npcid][npc_ID],"condition",2); //переключаем расстояние
            }
            if(dist > 25.0 && GetPVarInt(npc[npcid][npc_ID],"condition")==2) // если состояние равно двум и дистанция более 25 метров
            {
                SetPVarInt(npc[npcid][npc_ID],"condition",4); //переключаем состояние
                FCNPC_Stop(npc[npcid][npc_ID]); //останавливаем бота
                new Float:x, Float:y, Float:z;
                FCNPC_GetPosition(npc[npcid][npc_ID],x,y,z);
                SetPVarFloat(npc[npcid][npc_ID],"x",x), SetPVarFloat(npc[npcid][npc_ID],"y",y), SetPVarFloat(npc[npcid][npc_ID],"z",z);
                SetPVarInt(npc[npcid][npc_ID],"condition",1);
                CallLocalFunction("FCNPC_OnReachDestination", "i", npc[npcid][npc_ID]); //посылаем в паблик
            }
        }
    }
}
//



//Паблик проверяется тогда, когда NPC завершил перемещение
public FCNPC_OnReachDestination(npcid)
{
    if(GetPVarInt(npcid,"condition")==1)
    {
        new Float:distance;
        distance = GetPlayerDistanceFromPoint(npcid, GetPVarFloat(npcid,"x"),GetPVarFloat(npcid,"y"),GetPVarFloat(npcid,"z"));
        if(distance > 20.0)
        {
            FCNPC_GoTo(npcid, GetPVarFloat(npcid,"x"), GetPVarFloat(npcid,"y"), GetPVarFloat(npcid,"z"), MOVE_TYPE_WALK/*,0.0,0*/);
        }
        else if(distance <20.0)
        {
            new Float:x, Float:y, Float:z;
            FCNPC_GetPosition(npcid,x,y,z);
            x += (21.0 * floatsin(-FCNPC_GetAngle(npcid), degrees));
            y += (21.0 * floatcos(-FCNPC_GetAngle(npcid), degrees));
            FCNPC_GoTo(npcid,x,y,z,MOVE_TYPE_WALK/*,0.0,0*/);
        }
    }

}
//

// Паблик получения урона, используется как для игроков, так и для NPC
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart)
{
    if (IsPlayerNPC(damagedid) && GetPVarInt(damagedid,"evade")!=1) //если тот, кто получил урон это NPC и у него нет иммунитета к урону
    {
        if(GetPlayerWeapon(playerid) ==0) // если оружие игрока - кулаки
        {
            FCNPC_SetHealth(damagedid, FCNPC_GetHealth(damagedid) - 5.0); // задаем боту жизней столько, сколько у него и было минус 5 единиц
        }
    }
}
//

//Паблик вызывается, когда NPC умирает
public FCNPC_OnDeath(npcid)
{
    if(GetPVarInt(npcid,"condition")!=0)
    {
        DeletePVar(npcid,"condition"); // удаляем pvar, чтобы нагрузка не шла, когда NPC мертв
    }
    SetTimerEx("hidebody",7500,0,"i",npcid); //создаем специализированный одноразовый таймер для того, чтобы скрыть тело бота
    SetTimerEx("respawn",15000,0,"i",npcid); //создаем специализированный одноразовый таймер для того, чтобы воскресить бота
}
//

//Скрываем тело NPC в другом виртуальном мире, чтобы не кикать его с сервера
forward hidebody(npcid);
public hidebody(npcid)
{
    SetPlayerVirtualWorld(npcid,1); //посылаем NPC в 1ый виртуальный мир (по стандарту все игроки находят в нулевом)
}
//

//Воскрешаем NPC и возвращаем его в мир игроков
forward respawn(npcid);
public respawn(npcid)
{
    DeletePVar(npcid,"evade"); //удаляем пвар убегания на всякий случай
    SetPVarInt(npcid,"condition",2); //так как мы будем респавнить бота с той позиции, на которой он умер, задаем второе состояние, чтобы в случае чего, бот убежал на точку появления
    FCNPC_Respawn(npcid); //воскрешаем бота
    SetPlayerVirtualWorld(npcid,0); //посылаем NPC в мир к игрокам
}
//

//Паблик, срабатывающий на команды
public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!strcmp(cmdtext, "/teleport", true)) {
        new Float:x, Float:y, Float:z;
        FCNPC_GetPosition(npc[0][npc_ID],x,y,z);
        SetPlayerPos(playerid,x,y,z);
        return 1;
    }
    if (!strcmp(cmdtext, "/tp", true)) {
        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid,x,y,z);
        FCNPC_SetPosition(npc[0][npc_ID],x+2.0,y,z);
        return 1;
    }
    return 0;
}
//
 
Сверху Снизу