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

Тема: труп zombi

  1. #1
    Аватар для Den_Gurino
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.07.2017
    Сообщений
    36
    Репутация:
    3 ±

    труп zombi

    Здравствуйте!
    Нашел на просторах интернета FS zombi, добился от него правильной работы, но после того как я застрелю зомбака, его труп просто исчезает, и вот что мне интересно, возможно ли оставить труп зомби на том же месте где он умер?

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

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

    Как я понял, таймер скрывает тело бота для его воскрешения, а вот второй паблик, отправляет npc в виртуальный мир, так вот я колдовал с вирт мирами, пробовал задать анимацию, для того что бы npcid лежал на земле после смерти, но у меня ни чего не получилось, труп как исчезал, так и исчезает!
    Подскажите пожалуйста, как оставить труп на земле, а я уже сам налажу таймер hidebody для его скрытия!
    Последний раз редактировалось Den_Gurino; 28.05.2019 в 11:58.

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Тебе нужно по новой спавнить бота на месте смерти и применять для него анимацию, ибо, как я понимаю, бот исчезает из-за скрипта внутри самого плагина FCNPC, раз происходит вызов коллбэка FCNPC_OnDeath.
    Но я с теми ботами практически не работал, так что могу ошибаться. Ну если это единственный код, который срабатывает при смерти бота, то другого объяснения я найти этому не могу.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. Пользователь сказал cпасибо:
    Den_Gurino (28.05.2019)
  4. #3
    Аватар для Den_Gurino
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.07.2017
    Сообщений
    36
    Репутация:
    3 ±
    Многоуважаемый DeimoS, а вы не могли бы мне примерно накидать код, как спавнить жмурика бота на месте убийства?

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

    Статус
    Оффлайн
    Регистрация
    29.07.2017
    Сообщений
    36
    Репутация:
    3 ±
    Пытаюсь вот кое что сделать, не знаю, правильно ли я вообще делаю!
    PHP код:
    public hidebody(npcid)
    {
        
    SpawnPlayer(npcid);
        
    SetPlayerVirtualWorld(npcid,0);
        new 
    Float:PosX,Float:PosY,Float:PosZ;
        
    SetPlayerPos(npcidFloatPosX,FloatPosY,FloatPosZ);
        
    ApplyActorAnimation(npcid"CRACK""CRCKDETH2"4.11000, -1);


  6. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Как я уже сказал, я не особо работал с данным плагином, так что не смогу сказать точно. Найди тему с плагином на форуме и поищи информацию там.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. Пользователь сказал cпасибо:
    Den_Gurino (08.06.2019)
  8. #6
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Den_Gurino Посмотреть сообщение
    Пытаюсь вот кое что сделать, не знаю, правильно ли я вообще делаю!
    PHP код:
    public hidebody(npcid)
    {
        
    SpawnPlayer(npcid);
        
    SetPlayerVirtualWorld(npcid,0);
        new 
    Float:PosX,Float:PosY,Float:PosZ;
        
    SetPlayerPos(npcidFloatPosX,FloatPosY,FloatPosZ);
        
    ApplyActorAnimation(npcid"CRACK""CRCKDETH2"4.11000, -1);

    Попробуй так.

    PHP код:
    public FCNPC_OnDeath(npcid)
    {
        if (
    GetPVarInt(npcid"condition") != 0)
        {
            
    DeletePVar(npcid"condition");
        }
        
        
    FCNPC_ApplyAnimation(npcid"CRACK""CRCKDETH2"4.11000, -1);
        
    SetTimerEx("respawn"150000"i"npcid); //создаем специализированный одноразовый таймер для того, чтобы воскресить бота

    Да и рекомендую ознакомиться с функциями данного плагина: https://github.com/ziggi/FCNPC

  9. 2 пользователя(ей) сказали cпасибо:
    DeimoS (28.05.2019) Den_Gurino (08.06.2019)
  10. #7
    Аватар для Den_Gurino
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.07.2017
    Сообщений
    36
    Репутация:
    3 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Попробуй так.

    PHP код:
    public FCNPC_OnDeath(npcid)
    {
        if (
    GetPVarInt(npcid"condition") != 0)
        {
            
    DeletePVar(npcid"condition");
        }
        
        
    FCNPC_ApplyAnimation(npcid"CRACK""CRCKDETH2"4.11000, -1);
        
    SetTimerEx("respawn"150000"i"npcid); //создаем специализированный одноразовый таймер для того, чтобы воскресить бота

    Да и рекомендую ознакомиться с функциями данного плагина: https://github.com/ziggi/FCNPC
    К сожалению нет ни каких изменений! Жмурик исчезает моментально, смотрите ниже!
    До начала убийства
    https://wampi.ru/image/6QUNP9Y
    Зразу после смерти
    https://wampi.ru/image/6QUNl10
    Как говориться, остаётся только одно мокрое место, брызги крови и больше ни чего!
    Последний раз редактировалось Den_Gurino; 29.05.2019 в 18:28.

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

    Статус
    Оффлайн
    Регистрация
    09.09.2018
    Сообщений
    17
    Репутация:
    1 ±
    Может есть таймер, который проверяет ХП зомби, и удаляет его.

    Но это лишь догадки, было бы глупо так делать)

    edit: покажи весь код FS

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

    Статус
    Оффлайн
    Регистрация
    29.07.2017
    Сообщений
    36
    Репутация:
    3 ±
    Цитата Сообщение от ihNNNNNify Посмотреть сообщение
    Может есть таймер, который проверяет ХП зомби, и удаляет его.

    Но это лишь догадки, было бы глупо так делать)

    edit: покажи весь код FS
     Великоват будет!
    PHP код:
    //Includes
    #include <a_samp>
    #include <FCNPC>
    //

    ///Переменные
    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] = {
        
    //~~~~~~~~~~~~~~~~~~~~~~~~~ЛАС-ВЕНТУРАС~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
        
    {"Zomby_52"1FIGHT_STYLE_BOXING1250.5149,790.0477,10.8203,93.0426,0},
        {
    "Zomby_53"2FIGHT_STYLE_BOXING1500.2626,955.2888,10.8203,0.5670,0},
        {
    "Zomby_54"3FIGHT_STYLE_BOXING1879.1792,940.6086,10.8203,270.7180,0},
        {
    "Zomby_55"4FIGHT_STYLE_BOXING2119.1450,980.9487,10.8203,270.7181,0},
        {
    "Zomby_56"5FIGHT_STYLE_BOXING2339.4934,1025.9950,10.8203,359.8387,0},
        {
    "Zomby_57"6FIGHT_STYLE_BOXING2450.0581,960.3638,10.8203,269.5849,0},
        {
    "Zomby_58"7FIGHT_STYLE_BOXING2591.1453,1185.2911,10.8203,89.1213,0},
        {
    "Zomby_59"8FIGHT_STYLE_BOXING2380.1509,1200.2634,10.8203,89.7689,0},
        {
    "Zomby_60"9FIGHT_STYLE_BOXING2175.8252,1365.7859,10.8203,270.3943,0},
        {
    "Zomby_61"10FIGHT_STYLE_BOXING2258.4863,1525.7576,10.8203,269.7465,0},
        {
    "Zomby_62"11FIGHT_STYLE_BOXING2421.8279,1620.3629,10.7881,89.9308,0},
        {
    "Zomby_63"12FIGHT_STYLE_BOXING2499.1208,1729.1166,10.8203,0.2434,0},
        {
    "Zomby_64"13FIGHT_STYLE_BOXING2446.6216,1965.3469,10.8203,90.2545,0},
        {
    "Zomby_65"14FIGHT_STYLE_BOXING2535.0581,2187.2302,10.8203,0.4051,0},
        {
    "Zomby_66"15FIGHT_STYLE_BOXING2454.1348,2421.1238,10.8125,90.3351,0},
        {
    "Zomby_67"16FIGHT_STYLE_BOXING2209.7527,2445.8345,10.8203,90.0922,0},
        {
    "Zomby_68"17FIGHT_STYLE_BOXING2020.2131,2508.4021,11.8385,0.1622,0},
        {
    "Zomby_69"18FIGHT_STYLE_BOXING1979.7169,2635.9048,10.8203,89.6067,0},
        {
    "Zomby_70"19FIGHT_STYLE_BOXING1670.8789,2725.3127,10.8203,90.0923,0},
        {
    "Zomby_71"20FIGHT_STYLE_BOXING1345.3442,2581.9526,10.8203,89.8861,0},
        {
    "Zomby_72"21FIGHT_STYLE_BOXING1398.5051,2320.4431,10.8203,270.1880,0},
        {
    "Zomby_73"22FIGHT_STYLE_BOXING1519.5756,2143.1763,10.8203,180.4196,0},
        {
    "Zomby_74"23FIGHT_STYLE_BOXING1495.3964,1948.0508,10.8203,180.2575,0},
        {
    "Zomby_75"24FIGHT_STYLE_BOXING1395.0160,1968.8717,10.6779,0.3164,0},
        {
    "Zomby_76"25FIGHT_STYLE_BOXING1015.3405,1838.1201,10.8203,0.3973,0},
        {
    "Zomby_77"26FIGHT_STYLE_BOXING999.4326,1705.9674,10.9219,179.8528,0},
        {
    "Zomby_78"27FIGHT_STYLE_BOXING1014.6409,1507.3297,10.8203,180.0147,0},
        {
    "Zomby_79"28FIGHT_STYLE_BOXING999.9213,1314.9604,10.8203,180.3384,0},
        {
    "Zomby_80"29FIGHT_STYLE_BOXING1045.2173,1185.9701,10.8203,270.2686,0},
        {
    "Zomby_81"30FIGHT_STYLE_BOXING1333.4371,1185.1455,10.8203,270.2686,0},
        {
    "Zomby_82"31FIGHT_STYLE_BOXING1466.2374,1140.4878,10.8203,269.7831,0},
        {
    "Zomby_83"32FIGHT_STYLE_BOXING1588.0394,1140.4592,10.8125,269.5400,0},
        {
    "Zomby_84"33FIGHT_STYLE_BOXING1688.5476,1140.3832,10.8203,269.8637,0},
        {
    "Zomby_85"34FIGHT_STYLE_BOXING1831.5267,1265.4098,12.6282,89.4000,0},
        {
    "Zomby_86"35FIGHT_STYLE_BOXING1886.8296,1280.5950,10.8203,270.4299,0},
        {
    "Zomby_87"36FIGHT_STYLE_BOXING1981.0396,1460.3553,10.8203,90.4520,0},
        {
    "Zomby_89"37FIGHT_STYLE_BOXING2015.8407,1700.1545,10.8203,89.3997,0},
        {
    "Zomby_90"38FIGHT_STYLE_BOXING2103.3291,2029.3054,10.8203,89.6425,0},
        {
    "Zomby_91"39FIGHT_STYLE_BOXING2109.7253,2105.0999,10.8203,89.6424,0},
        {
    "Zomby_92"40FIGHT_STYLE_BOXING2046.8573,2275.7983,10.8203,90.0029,0},
        {
    "Zomby_93"41FIGHT_STYLE_BOXING1919.6548,2306.3672,10.8203,179.4474,0},
        {
    "Zomby_94"42FIGHT_STYLE_BOXING1802.6858,2280.0271,12.5896,90.8934,0},
        {
    "Zomby_95"43FIGHT_STYLE_BOXING1728.6693,2310.1016,10.8203,8.0055,0},
        {
    "Zomby_96"44FIGHT_STYLE_BOXING1616.2184,2266.4893,10.8203,89.5983,0},
        {
    "Zomby_97"45FIGHT_STYLE_BOXING398.8468,1915.5275,17.6406,358.5465,0},
        {
    "Zomby_98"46FIGHT_STYLE_BOXING110.3911,2481.0620,16.4844,271.6281,0},
        {
    "Zomby_99"47FIGHT_STYLE_BOXING1376.6896,2581.6975,10.8203,89.7602,0},
        {
    "Zomby_100"48FIGHT_STYLE_BOXING1256.0396,2597.8669,10.8125,1.4490,0}
    };
    //

    //Main publics
    public OnFilterScriptInit()
    {

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

    //Main NPC Public
    forward spawnNPC();
    public 
    spawnNPC()
    {
        for (new 
    npcid 0npcid 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 0npcid 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 
    GetMaxPlayers();>= 0;i--)
        {
            if(
    playerid == i) continue;
            if(!
    IsPlayerConnected(i)) continue;
            if (
    IsPlayerNPC(i)) continue;
            
    GetPlayerPos(i,x,y,z);
            
    -= mx;
            
    -= my;
            
    -= mz;

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

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

        return 
    cid;
    }
    //

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

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

        
    FCNPC_SetAngle(npcid180.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 0npcid 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")==&& 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")==&& dist 10.0//если состояние равно единице и расстояние между ботом и игроком менее 25 метров
                
    {
                    
    SetPVarInt(npc[npcid][npc_ID],"condition",2); //переключаем состояние боту
                
    }
                if(
    GetPVarInt(npc[npcid][npc_ID],"condition")==&& dist 10.0//если состояние равно единице и расстояние между ботом и игроком менее 25 метров
                
    {
                    
    SetPVarInt(npc[npcid][npc_ID],"condition",2); //переключаем состояние боту
                
    }
                if(
    GetPVarInt(npc[npcid][npc_ID],"condition")==&& dist 10.0//если состояние равно двум и расстояние между ботом и игроком менее 25 метров
                
    {
                    new 
    Float:xFloat:yFloat: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")==&& dist 0.8//если состояние равно двум и расстояние между ботом и игроком менее 0.8 метров
                
    {
                    
    SetPVarInt(npc[npcid][npc_ID],"condition",3); //переключаем состояние боту
                
    }
                if(
    GetPVarInt(npc[npcid][npc_ID],"condition")==&& dist 0.8//если состояние равно трем и расстояние между ботом и игроком менее 0.8 метров
                
    {
                    
    FCNPC_Player_Angle(npc[npcid][npc_ID], pid); //разворачиваем NPC лицом к игроку
                    
    switch(random(3)) // заставляем бота использовать одну из трех комбинаций кнопок, случайный образом: 2 комбинации атаки и один блок
                    
    {
                        case 
    0FCNPC_SetKeys(npc[npcid][npc_ID], KEY_HANDBRAKE+KEY_FIRE00);
                        case 
    1FCNPC_SetKeys(npc[npcid][npc_ID], KEY_HANDBRAKE+KEY_SECONDARY_ATTACK00);
                        case 
    2FCNPC_SetKeys(npc[npcid][npc_ID], KEY_HANDBRAKE+KEY_JUMP00);
                    }
                }
                if(
    GetPVarInt(npc[npcid][npc_ID],"condition")==&& 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:xFloat:yFloat: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(npcidGetPVarFloat(npcid,"x"),GetPVarFloat(npcid,"y"),GetPVarFloat(npcid,"z"));
            if(
    distance 20.0)
            {
                
    FCNPC_GoTo(npcidGetPVarFloat(npcid,"x"), GetPVarFloat(npcid,"y"), GetPVarFloat(npcid,"z"), MOVE_TYPE_WALK/*,0.0,0*/);
            }
            else if(
    distance <20.0)
            {
                new 
    Float:xFloat:yFloat:z;
                
    FCNPC_GetPosition(npcid,x,y,z);
                
    += (21.0 floatsin(-FCNPC_GetAngle(npcid), degrees));
                
    += (21.0 floatcos(-FCNPC_GetAngle(npcid), degrees));
                
    FCNPC_GoTo(npcid,x,y,z,MOVE_TYPE_WALK/*,0.0,0*/);
            }
        }
        
    }
    //

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

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

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

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


  13. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Для публикации большого кода можно воспользоваться - http://pastebin.com
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  14. Пользователь сказал cпасибо:
    Den_Gurino (08.06.2019)
 

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

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

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

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

Ваши права

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