dosinabox / g2nr_unofficial_update

Исходники скриптов, релизы, хотфиксы и тестовые версии неофициального обновления для игры "Готика 2: Ночь Ворона".
https://worldofplayers.ru/threads/36817
The Unlicense
15 stars 2 forks source link

Когти Особого Снеппера / Когти Вожака Снепперов #124

Open Kor-Angar opened 5 years ago

Kor-Angar commented 5 years ago

Для снятия когтей вожака не требуется навык.

не требуется. хотя по идеи должен требоваться. и эту ситуация теперь можно исправить Внёс правки в скрипт и все почти получилось https://www.youtube.com/watch?v=MjJDfmFyT9s обрати внимание что есть даже диалог про то что снял ли герой когти и варианты не снял. image


Сам снеппер , убрал когти

instance NewMine_LeadSnapper(Mst_Default_Snapper)
{
    name[0] = "Вожак стаи";
    level = 16; // 12
    B_SetVisuals_Snapper();
    Npc_SetToFistMode(self);
    Mdl_SetModelScale(self,1.1,1.1,1.1);
    attribute[ATR_HITPOINTS_MAX] = 160;
    attribute[ATR_HITPOINTS] = 160;
//  CreateInvItems(self,ItAt_ClawLeader,1); //
};

Билгот при добавления Лидера Снепперов, проверка на навык снятия когтей

instance DIA_Bilgot_KNOWSLEADSNAPPER(C_Info)
{
    npc = VLK_4120_Bilgot;
    nr = 4;
    condition = DIA_Bilgot_KNOWSLEADSNAPPER_Condition;
    information = DIA_Bilgot_KNOWSLEADSNAPPER_Info;
    permanent = FALSE;
    description = "Расскажи мне, что ты знаешь. И я вытащу тебя отсюда!";
};

func int DIA_Bilgot_KNOWSLEADSNAPPER_Condition()
{
    if(Npc_KnowsInfo(other,DIA_Bilgot_Hilfe) && (MIS_Fajeth_Kill_Snapper == LOG_Running))
    {
        return TRUE;
    };
};

func void DIA_Bilgot_KNOWSLEADSNAPPER_Info()
{
    AI_Output(other,self,"DIA_Bilgot_KNOWSLEADSNAPPER_15_00");  //Расскажи мне, что ты знаешь. И я вытащу тебя отсюда!
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_01");  //Я знал, что могу рассчитывать на тебя. Так что будь внимателен. Я довольно долго наблюдаю за снепперами.
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_02");  //Они очень хитры и могут, ну, как бы... общаться. Они никогда не ходят поодиночке и нападают только стаей.
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_03");  //Но есть еще кое-что. Среди них есть один особенный. Он редко показывается, но я видел его.
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_04");  //Другие снепперы низко кланяются, когда проходят мимо него, но никогда не отходят далеко.
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_05");  //Пока этот зверь не тронется с места, ни один снеппер поблизости даже не шевельнется.
    AI_Output(other,self,"DIA_Bilgot_KNOWSLEADSNAPPER_15_06");  //Где мне найти этого кровожадного зверя?
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_07");  //Я видел его на ступенях старой сторожевой башни.
    AI_Output(other,self,"DIA_Bilgot_KNOWSLEADSNAPPER_15_08");  //Отлично. Мне кажется, я понял. Спасибо!
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_09");  //Помни, ты дал мне слово!
    NewMine_LeadSnapper_Spawned = TRUE;
    Wld_InsertNpc(NewMine_LeadSnapper,"OW_ORC_LOOKOUT_2_01");           
    if (PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] == TRUE)
    {
        CreateInvItems(NewMine_LeadSnapper,ItAt_ClawLeader,2); // добавляем когти Снеппера
    };

    B_LogEntry(TOPIC_FajethKillSnapper,"Билгот рассказал мне о вожаке стаи снепперов. Он должен быть у старой сторожевой башни.");
    Log_CreateTopic(TOPIC_BilgotEscort,LOG_MISSION);
    Log_SetTopicStatus(TOPIC_BilgotEscort,LOG_Running);
    B_LogEntry(TOPIC_BilgotEscort,"Билгот хочет, чтобы я вывел его из долины.");
};

Jergan при изучение навыка проверка на смерть Лидера Снепперов + вставлялся ли он в мир

instance DIA_Jergan_Teach(C_Info)
{
    npc = VLK_4110_Jergan;
    nr = 9;
    condition = DIA_Jergan_Teach_Condition;
    information = DIA_Jergan_Teach_Info;
    permanent = TRUE;
//  description = B_BuildLearnString("Покажи мне, как отделять когти",B_GetLearnCostTalent(other,NPC_TALENT_TAKEANIMALTROPHY,TROPHY_Claws));
    description = B_BuildLearnString(NAME_TROPHY_Claws,B_GetLearnCostTalent(other,NPC_TALENT_TAKEANIMALTROPHY,TROPHY_Claws));
};

func int DIA_Jergan_Teach_Condition()
{
    if(Npc_KnowsInfo(other,DIA_Jergan_Claw) && (PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] == FALSE))
    {
        return TRUE;
    };
};

func void DIA_Jergan_Teach_Info()
{
    AI_Output(other,self,"DIA_Jergan_Teach_15_00"); //Покажи мне, как отделять когти.
    if(B_TeachPlayerTalentTakeAnimalTrophy(self,other,TROPHY_Claws))
    {
        AI_Output(self,other,"DIA_Jergan_Teach_13_01"); //Когти нужно отрубить одним точным и резким ударом. Тут нельзя колебаться, иначе ты испортишь трофей.
        AI_Output(self,other,"DIA_Jergan_Teach_13_02"); //Таким образом ты можешь отделять не только когти снепперов, но также ящеров и мракорисов.

    if((Npc_IsDead(NewMine_LeadSnapper)) && (NewMine_LeadSnapper_Spawned == TRUE))
    {
        Wld_InsertNpc(NewMine_LeadSnapper,"OW_ORC_LOOKOUT_2_01");
        CreateInvItems(NewMine_LeadSnapper,ItAt_ClawLeader,2); // добавляем когти Снеппера
        B_KillNpc(NewMine_LeadSnapper); 
    };      

    };
};

_Originally posted by @Kor-Angar in https://github.com/dosinabox/g2nr_unofficial_update/issues/123#issuecomment-544244836_

Kor-Angar commented 4 years ago

а как можно сделать что бы Jergan осматривал труп Снеппера? :-)

dosinabox commented 4 years ago

Можно, но крайне криво и ненадежно. Распиши, что он должен делать. Идти на гору и проигрывать анимацию обыска? А если на горе будут другие снепперы? А если ГГ его опередит, обчистит труп и он исчезнет? Как отследить момент обыска трупа ГГ? В какой момент возвращать Джергана в лагерь? Как долго он должен обыскивать труп?

Kor-Angar commented 4 years ago

привет. вот у меня Джерган идёт к трупу Снеппера Лидера

instance DIA_Jergan_Leader(C_Info)
{
    npc = VLK_4110_Jergan;
    nr = 3;
    condition = DIA_Jergan_Leader_Condition;
    information = DIA_Jergan_Leader_Info;
//  permanent = FALSE;
    important = TRUE; // Jergan обращается к Герою
};

func int DIA_Jergan_Leader_Condition()
{
    if((Npc_GetDistToWP(self,"OW_NEWMINE_04") < 1000) && Npc_IsDead(NewMine_LeadSnapper) && (NewMine_LeadSnapper_Spawned == TRUE))
    {
        return TRUE;
    };
};

func void DIA_Jergan_Leader_Info()
{
    AI_Output(self,other,"DIA_Jergan_Leader_13_00");    //Ты убил вожака стаи. И как - ты забрал когти этого зверя?
    if(Npc_HasItems(other,ItAt_ClawLeader) || (Lutero_Krallen == LOG_SUCCESS))
    {
        AI_Output(other,self,"DIA_Jergan_Leader_15_01");    //Да.
        AI_Output(self,other,"DIA_Jergan_Leader_13_02");    //Они стоят целое состояние. Есть люди, которые коллекционируют такие вещи.
        AI_Output(self,other,"DIA_Jergan_Leader_13_03");    //Если ты найдешь правильного покупателя, то получишь за них целую кучу золота.
        if(Lutero_Krallen == LOG_SUCCESS)
        {
            AI_Output(other,self,"DIA_Raoul_TROLLFELL_ja_15_00");   //Продано.
        };
    }
    else
    {
        AI_Output(other,self,"DIA_Jergan_Leader_15_04");    //Нет.
        AI_Output(self,other,"DIA_Jergan_Leader_13_05");    //Это ты зря. Я уверен, они стоят целое состояние.
        Info_AddChoice(DIA_Jergan_Leader,"Мне это не интересно.",DIA_Jergan_Leader_rechnung_hastrecht);

        if(PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] == FALSE)
        {
            Info_AddChoice(DIA_Jergan_Leader,"Покажи мне, как отделять когти.",DIA_Jergan_Teach_Info);
        };

        Npc_ExchangeRoutine(self,"LeadSnapper"); // Jergan идёт к трупу Снеппера
    };
};

func void DIA_Jergan_Leader_rechnung_hastrecht()
{
    AI_Output(other,self,"DIA_Raoul_TROLL_rechnung_hastrecht_15_00");   //Мне это не интересно.
    Info_ClearChoices(DIA_Jergan_Leader);
//  CreateInvItems(self,ItAt_ClawLeader,2); // Jergan добавляем когти Снеппера
    Wld_InsertNpc(NewMine_LeadSnapper,"OW_ORC_LOOKOUT_2_01");   // создаём Лидера Снепперов
    B_KillAnimal(NewMine_LeadSnapper);      // убиваем Лидера Снепперов 
    DIA_Jergan_EXIT_Info();
};

хотелось бы что бы он там не столбом стоял а обыскивал труп снеппера:-)

dosinabox commented 4 years ago

Npc_ExchangeRoutine(self,"LeadSnapper"); // Jergan идёт к трупу Снеппера

А когда он пойдет обратно? Что сменит ему распорядок дня? Как избежать ситуации, когда он будет обыскивать пустое место после пропажи трупа?

DIA_Jergan_EXIT_Info();

Используй просто AI_StopProcessInfos(self);

хотелось бы что бы он там не столбом стоял а обыскивал труп снеппера:-)

Смотри распорядок дня Рангара, который копается в ящиках Мартина:

func void Rtn_PalCampKlau_321()
{
    TA_Stand_Drinking(4,0,23,0,"NW_CITY_BEER_06");
    TA_Pick_FP(23,0,4,0,"NW_CITY_PALCAMP_15");
};

Занятие TA_Pick_FP также используют крестьяне, которые копаются на грядках.

Kor-Angar commented 4 years ago

DIA_Jergan_EXIT_Info(); Используй просто AI_StopProcessInfos(self);

не срабатывала AI_StopProcessInfos(self); решил попробовать DIA_Jergan_EXIT_Info(); тоже не помогло :-(

Занятие TA_Pick_FP также используют крестьяне, которые копаются на грядках.

спасибо

dosinabox commented 4 years ago

не срабатывала AI_StopProcessInfos(self); решил попробовать DIA_Jergan_EXIT_Info(); тоже не помогло :-(

Диалог не завершается? Возможно, тут смена распорядка дня мешает. Нужно сначала завершать диалог и уже потом менять распорядок. То есть, в таком порядке:

AI_StopProcessInfos(self);
Npc_ExchangeRoutine(self,"LeadSnapper");
dosinabox commented 4 years ago

И если используешь принудительное завершение диалога, то эта команда не нужна:

Info_ClearChoices(DIA_Jergan_Leader);

Она нужна для очистки текущего диалогового окна: действие кнопок "НАЗАД" и необходимая операция перед Info_AddChoice (добавлением новых опций-разветвлений в текущий диалог).

dosinabox commented 4 years ago

Она нужна для очистки текущего диалогового окна: действие кнопок "НАЗАД" и необходимая операция перед Info_AddChoice (добавлением новых опций-разветвлений в текущий диалог).


instance DIA_Test(C_Info)
{
npc = VLK_4110_Jergan;
nr = 3;
condition = DIA_Test_Condition;
information = DIA_Test_Info;
important = TRUE;
};

func int DIA_Test_Condition() { return TRUE; };

func void DIA_Test_Info() { AI_Output(self,other,"DIA_Test_13_00"); //Да или нет? Info_ClearChoices(DIA_Test); Info_AddChoice(DIA_Test,"ЗАКОНЧИТЬ",DIA_Test_Info_exit); Info_AddChoice(DIA_Test,"НАЗАД",DIA_Test_Info_back); Info_AddChoice(DIA_Test,"Да.",DIA_Test_Info_yes); Info_AddChoice(DIA_Test,"Нет.",DIA_Test_Info_no); };

func void DIA_Test_Info_exit() { AI_StopProcessInfos(self); };

func void DIA_Test_Info_back() { Info_ClearChoices(DIA_Test); };

func void DIA_Test_Info_yes() { AI_Output(other,self,"DIA_Test_13_01"); //Да. };

func void DIA_Test_Info_no() { AI_Output(other,self,"DIA_Test_13_02"); //Нет. };

Kor-Angar commented 4 years ago

если не делать

    AI_Output(other,self,"DIA_Raoul_TROLL_rechnung_hastrecht_15_00");   //Мне это не интересно.
    Info_ClearChoices(DIA_Jergan_Leader);

а сделать вот так

func void DIA_Jergan_Leader_Info()
{
    AI_Output(self,other,"DIA_Jergan_Leader_13_00");    //Ты убил вожака стаи. И как - ты забрал когти этого зверя?
    if(Npc_HasItems(other,ItAt_ClawLeader) || (Lutero_Krallen == LOG_SUCCESS))
    {
        AI_Output(other,self,"DIA_Jergan_Leader_15_01");    //Да.
        AI_Output(self,other,"DIA_Jergan_Leader_13_02");    //Они стоят целое состояние. Есть люди, которые коллекционируют такие вещи.
        AI_Output(self,other,"DIA_Jergan_Leader_13_03");    //Если ты найдешь правильного покупателя, то получишь за них целую кучу золота.
        if(Lutero_Krallen == LOG_SUCCESS)
        {
            AI_Output(other,self,"DIA_Raoul_TROLLFELL_ja_15_00");   //Продано.
        };
    }
    else
    {
        AI_Output(other,self,"DIA_Jergan_Leader_15_04");    //Нет.
        AI_Output(self,other,"DIA_Jergan_Leader_13_05");    //Это ты зря. Я уверен, они стоят целое состояние.

        Info_ClearChoices(DIA_Jergan_Leader);
        Info_AddChoice(DIA_Jergan_Leader,"Мне это не интересно.",DIA_Jergan_Leader_rechnung_hastrecht);

        if(PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] == FALSE)
        {
            Info_AddChoice(DIA_Jergan_Leader,"Покажи мне, как отделять когти.",DIA_Jergan_Teach_Info);
    //  }
    //  else
    //  {
    //      Npc_ExchangeRoutine(self,"LeadSnapper"); // Jergan идёт к трупу Снеппера
        };

    };
};

func void DIA_Jergan_Leader_rechnung_hastrecht()
{
    AI_Output(other,self,"DIA_Raoul_TROLL_rechnung_hastrecht_15_00");   //Мне это не интересно.
//  Info_ClearChoices(DIA_Jergan_Leader);
//  CreateInvItems(self,ItAt_ClawLeader,2); // Jergan добавляем когти Снеппера
    Wld_InsertNpc(NewMine_LeadSnapper,"OW_ORC_LOOKOUT_2_01");   // создаём Лидера Снепперов
    B_KillAnimal(NewMine_LeadSnapper);      // убиваем Лидера Снепперов 
//  DIA_Jergan_EXIT_Info();

    AI_StopProcessInfos(self);
    Npc_ExchangeRoutine(self,"LeadSnapper"); // Jergan идёт к трупу Снеппера
};

то получится вот так

https://youtu.be/WwVaJ9lu12I

Kor-Angar commented 4 years ago

а как сделать что бы Ёрган не пошёл, а быстро побежал?:-)

Kor-Angar commented 4 years ago

а вот если так сделать то работает

instance DIA_Jergan_Leader(C_Info)
{
    npc = VLK_4110_Jergan;
    nr = 3;
    condition = DIA_Jergan_Leader_Condition;
    information = DIA_Jergan_Leader_Info;
//  permanent = FALSE;
    important = TRUE; // Jergan обращается к Герою после убийства лидера Снепперов
};

func int DIA_Jergan_Leader_Condition()
{
    if((Npc_GetDistToWP(self,"OW_NEWMINE_04") < 1000) && Npc_IsDead(NewMine_LeadSnapper) && (NewMine_LeadSnapper_Spawned == TRUE))
    {
        return TRUE;
    };
};

func void DIA_Jergan_Leader_Info()
{
    AI_Output(self,other,"DIA_Jergan_Leader_13_00");    //Ты убил вожака стаи. И как - ты забрал когти этого зверя?
    if(Npc_HasItems(other,ItAt_ClawLeader) || (Lutero_Krallen == LOG_SUCCESS))
    {
        AI_Output(other,self,"DIA_Jergan_Leader_15_01");    //Да.
        AI_Output(self,other,"DIA_Jergan_Leader_13_02");    //Они стоят целое состояние. Есть люди, которые коллекционируют такие вещи.
        AI_Output(self,other,"DIA_Jergan_Leader_13_03");    //Если ты найдешь правильного покупателя, то получишь за них целую кучу золота.
        if(Lutero_Krallen == LOG_SUCCESS)
        {
            AI_Output(other,self,"DIA_Raoul_TROLLFELL_ja_15_00");   //Продано.
        };
    }
    else
    {
        AI_Output(other,self,"DIA_Jergan_Leader_15_04");    //Нет.
        AI_Output(self,other,"DIA_Jergan_Leader_13_05");    //Это ты зря. Я уверен, они стоят целое состояние.

//      Info_ClearChoices(DIA_Jergan_Leader);
        Info_AddChoice(DIA_Jergan_Leader,"Мне это не интересно.",DIA_Jergan_Leader_rechnung_hastrecht);

        if(PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] == FALSE)
        {
            Info_AddChoice(DIA_Jergan_Leader,"Покажи мне, как отделять когти.",DIA_Jergan_Teach_Info);
        };

        Npc_ExchangeRoutine(self,"LeadSnapper"); // Jergan идёт к трупу Снеппера

    };
};

func void DIA_Jergan_Leader_rechnung_hastrecht()
{
    AI_Output(other,self,"DIA_Raoul_TROLL_rechnung_hastrecht_15_00");   //Мне это не интересно.
    Info_ClearChoices(DIA_Jergan_Leader);
//  CreateInvItems(self,ItAt_ClawLeader,2); // Jergan добавляем когти Снеппера
    Wld_InsertNpc(NewMine_LeadSnapper,"OW_ORC_LOOKOUT_2_01");   // создаём Лидера Снепперов
    B_KillAnimal(NewMine_LeadSnapper);      // убиваем Лидера Снепперов 
    AI_StopProcessInfos(self);
};

единственной что не срабатывает AI_StopProcessInfos(self); после реплики "Мне это не интересно."

https://www.youtube.com/watch?v=uLDXdG3hfXc&feature=youtu.be

dosinabox commented 4 years ago

единственной что не срабатывает AI_StopProcessInfos(self); после реплики "Мне это не интересно."

Перенеси её выше:

func void DIA_Jergan_Leader_rechnung_hastrecht()
{
    AI_Output(other,self,"DIA_Raoul_TROLL_rechnung_hastrecht_15_00");   //Мне это не интересно.
    AI_StopProcessInfos(self);
//  CreateInvItems(self,ItAt_ClawLeader,2); // Jergan добавляем когти Снеппера
    Wld_InsertNpc(NewMine_LeadSnapper,"OW_ORC_LOOKOUT_2_01");   // создаём Лидера Снепперов
    B_KillAnimal(NewMine_LeadSnapper);      // убиваем Лидера Снепперов 
};
Kor-Angar commented 4 years ago

Перенеси её выше

спасибо, помогло

Kor-Angar commented 4 years ago

подскажи плиз, я вот такое добавил в файл, а оно не срабатывает :-)

instance DIA_Jergan_LeadSnapper(C_Info)
{
    npc = VLK_4110_Jergan;
    nr = 3;
    condition = DIA_Jergan_LeadSnapper_Condition;
    information = DIA_Jergan_LeadSnapper_Info;
//  permanent = FALSE;
    important = TRUE; // Jergan обращается к Герою
};

func int DIA_Jergan_LeadSnapper_Condition()
{
    if(Npc_GetDistToWP(self,"OW_ORC_LOOKOUT_2_01") < 1000) 
    {
        return TRUE;
    };
};

func void DIA_Jergan_LeadSnapper_Info()
{

    AI_Output(self,other,"DIA_Jergan_Gegend_13_01");    //Если ты хочешь выжить, беги от всего, что тебе встретится.

    if(PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] == FALSE)
    {
        CreateInvItems(self,ItAt_ClawLeader,2); // Jergan добавляем когти Снеппера
    };

    AI_StopProcessInfos(self);
    Npc_ExchangeRoutine(self,"Fajeth"); // Jergan возвращется к Фаджету

};
Kor-Angar commented 4 years ago

и в земле что то он не ковыряется

func void Rtn_LeadSnapper_4110()
{
    TA_Pick_FP (8,0,23,0,"OW_ORC_LOOKOUT_2_01"); // Вожак Снепперов
    TA_Pick_FP (23,0,8,0,"OW_ORC_LOOKOUT_2_01"); // Вожак Снепперов
};

новую игру начать надо или сейв до входа в долину рудников тоже подойдёт? :-)

dosinabox commented 4 years ago

Если добавляется новый диалог или новый распорядок дня, то только новая игра.

dosinabox commented 4 years ago

Соблюдай оформление!

func void Rtn_LeadSnapper_4110()
{
    TA_Pick_FP(8,0,23,0,"OW_ORC_LOOKOUT_2_01");
    TA_Pick_FP(23,0,8,0,"OW_ORC_LOOKOUT_2_01");
};

и в земле что то он не ковыряется

В мире должны находиться специальные точки с определенными именами, на которых люди выполняют нужные анимации. Конечно же, таких точек в этом месте нет. Нужно копать функцию ZS_Pick_FP_Loop() и прописывать исключения для Джергана.

а как сделать что бы Ёрган не пошёл, а быстро побежал?:-)

Опять же - исключения в ZS_Pick_FP_Loop().

Напишу всё, не глядя в сурсер и не проверяя в игре:


func void ZS_Pick_FP()
{
    Perception_Set_Normal();
    B_ResetAll(self);
    if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Jergan))
    {
        AI_SetWalkMode(self,NPC_RUN);
    }
    else
    {
        AI_SetWalkMode(self,NPC_WALK);
    };
    if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX)
    {
        AI_GotoWP(self,self.wp);
    };
};

func int ZS_Pick_FP_Loop()
{
    if((Npc_GetStateTime(self) >= 7) && Hlp_Random(2))
    {
        if(Npc_IsOnFP(self,"PICK") && Wld_IsFPAvailable(self,"PICK"))
        {
            AI_GotoNextFP(self,"PICK");
            AI_PlayAni(self,"T_PLUNDER");
            Npc_SetStateTime(self,0);
        }
        else if(Npc_IsOnFP(self,"PICK") || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Jergan)))
        {
            AI_PlayAni(self,"T_PLUNDER");
            Npc_SetStateTime(self,0);
        };
        AI_SetWalkMode(self,NPC_WALK);
    }
    else if(Npc_GetStateTime(self) >= 7)
    {
        if(Npc_IsOnFP(self,"PICK") || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Jergan)))
        {
            AI_PlayAni(self,"T_PLUNDER");
        };
        AI_SetWalkMode(self,NPC_WALK);
    };
    if(!Npc_IsOnFP(self,"PICK") && Wld_IsFPAvailable(self,"PICK"))
    {
        AI_GotoFP(self,"PICK");
    };
    return LOOP_CONTINUE;
};

func void ZS_Pick_FP_End()
{
};
Kor-Angar commented 4 years ago

отлично. заработало :-) https://www.youtube.com/watch?v=42Kq8__Yw3A&feature=youtu.be

Общая мысль такая:


instance DIA_Jergan_Teach(C_Info)
{
    npc = VLK_4110_Jergan;
    nr = 9;
    condition = DIA_Jergan_Teach_Condition;
    information = DIA_Jergan_Teach_Info;
    permanent = TRUE;
//  description = B_BuildLearnString("Покажи мне, как отделять когти",B_GetLearnCostTalent(other,NPC_TALENT_TAKEANIMALTROPHY,TROPHY_Claws));
    description = B_BuildLearnString(NAME_TROPHY_Claws,B_GetLearnCostTalent(other,NPC_TALENT_TAKEANIMALTROPHY,TROPHY_Claws));
};

func int DIA_Jergan_Teach_Condition()
{
    if(Npc_KnowsInfo(other,DIA_Jergan_Claw) && (PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] == FALSE))
    {
        return TRUE;
    };
};

func void DIA_Jergan_Teach_Info()
{
    AI_Output(other,self,"DIA_Jergan_Teach_15_00"); //Покажи мне, как отделять когти.
    if(B_TeachPlayerTalentTakeAnimalTrophy(self,other,TROPHY_Claws))
    {
        AI_Output(self,other,"DIA_Jergan_Teach_13_01"); //Когти нужно отрубить одним точным и резким ударом. Тут нельзя колебаться, иначе ты испортишь трофей.
        AI_Output(self,other,"DIA_Jergan_Teach_13_02"); //Таким образом ты можешь отделять не только когти снепперов, но также ящеров и мракорисов.
        Info_ClearChoices(DIA_Jergan_Leader);   

        if(Npc_GetDistToWP(self,"OW_ORC_LOOKOUT_2_01") < 1000)
        {
            B_GiveInvItems(self,other,ItAt_ClawLeader,1); // отдаём когти снеппера
        }
        else if((Npc_IsDead(NewMine_LeadSnapper)) && (NewMine_LeadSnapper_Spawned == TRUE))
        { 
            Wld_InsertNpc(NewMine_LeadSnapper,"OW_ORC_LOOKOUT_2_01");   // создаём Лидера Снепперов
            CreateInvItems(NewMine_LeadSnapper,ItAt_ClawLeader,2);      // добавляем когти в Лидера Снепперов
            B_KillAnimal(NewMine_LeadSnapper);                          // убиваем Лидера Снепперов
        }   
        else if(NewMine_LeadSnapper_Spawned == TRUE)
        { 
            CreateInvItems(NewMine_LeadSnapper,ItAt_ClawLeader,2);      // добавляем когти в Лидера Снепперов
        };  

    };
};

instance DIA_Jergan_Leader(C_Info)
{
    npc = VLK_4110_Jergan;
    nr = 3;
    condition = DIA_Jergan_Leader_Condition;
    information = DIA_Jergan_Leader_Info;
//  permanent = FALSE;
    important = TRUE; // Jergan обращается к Герою после убийства лидера Снепперов
};

func int DIA_Jergan_Leader_Condition()
{
    if((Npc_GetDistToWP(self,"OW_NEWMINE_04") < 1000) && Npc_IsDead(NewMine_LeadSnapper) && (NewMine_LeadSnapper_Spawned == TRUE))
    {
        return TRUE;
    };
};

func void DIA_Jergan_Leader_Info()
{
    AI_Output(self,other,"DIA_Jergan_Leader_13_00");    //Ты убил вожака стаи. И как - ты забрал когти этого зверя?
    if(Npc_HasItems(other,ItAt_ClawLeader) || (Lutero_Krallen == LOG_SUCCESS))
    {
        AI_Output(other,self,"DIA_Jergan_Leader_15_01");    //Да.
        AI_Output(self,other,"DIA_Jergan_Leader_13_02");    //Они стоят целое состояние. Есть люди, которые коллекционируют такие вещи.
        AI_Output(self,other,"DIA_Jergan_Leader_13_03");    //Если ты найдешь правильного покупателя, то получишь за них целую кучу золота.
        if(Lutero_Krallen == LOG_SUCCESS)
        {
            AI_Output(other,self,"DIA_Raoul_TROLLFELL_ja_15_00");   //Продано.
        };
    }
    else
    {
        AI_Output(other,self,"DIA_Jergan_Leader_15_04");    //Нет.
        AI_Output(self,other,"DIA_Jergan_Leader_13_05");    //Это ты зря. Я уверен, они стоят целое состояние.

//      Info_ClearChoices(DIA_Jergan_Leader);
        Info_AddChoice(DIA_Jergan_Leader,"Мне это не интересно.",DIA_Jergan_Leader_rechnung_hastrecht);

        if(PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] == FALSE)
        {
            Info_AddChoice(DIA_Jergan_Leader,"Покажи мне, как отделять когти.",DIA_Jergan_Teach_Info);
        };

        Npc_ExchangeRoutine(self,"LeadSnapper"); // Jergan идёт к трупу Снеппера
    };
};

func void DIA_Jergan_Leader_rechnung_hastrecht()
{
    AI_Output(other,self,"DIA_Raoul_TROLL_rechnung_hastrecht_15_00");   //Мне это не интересно.
    AI_StopProcessInfos(self);
    Wld_InsertNpc(NewMine_LeadSnapper,"OW_ORC_LOOKOUT_2_01");   // создаём Лидера Снепперов
    B_KillAnimal(NewMine_LeadSnapper);      // убиваем Лидера Снепперов 
//  Npc_ExchangeRoutine(self,"LeadSnapper"); // Jergan идёт к трупу Снеппера
};

instance DIA_Jergan_LeadSnapper(C_Info)
{
    npc = VLK_4110_Jergan;
    nr = 3;
    condition = DIA_Jergan_LeadSnapper_Condition;
    information = DIA_Jergan_LeadSnapper_Info;
//  permanent = FALSE;
    important = TRUE; // Jergan обращается к Герою
};

func int DIA_Jergan_LeadSnapper_Condition()
{
    if(Npc_GetDistToWP(self,"OW_ORC_LOOKOUT_2_01") < 1000) 
    {
        return TRUE;
    };
};

func void DIA_Jergan_LeadSnapper_Info()
{
    AI_Output(self,other,"DIA_Jergan_Gegend_13_01");    //Если ты хочешь выжить, беги от всего, что тебе встретится.
    if(PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] == FALSE)
    {
        CreateInvItems(self,ItAt_ClawLeader,2); // Jergan добавляем когти Снеппера
    };  
    AI_StopProcessInfos(self);
    Npc_ExchangeRoutine(self,"Fajeth"); // Jergan возвращется к Фаджету
};

instance VLK_4110_Jergan(Npc_Default)
{
    name[0] = "Джерган";
    guild = GIL_NONE;
    id = 4110;
    voice = 13;
    flags = 0;
    npcType = npctype_main;
    aivar[AIV_ToughGuy] = TRUE;
    B_SetAttributesToChapter(self,5);
    fight_tactic = FAI_HUMAN_STRONG;
//  EquipItem(self,ItMw_2h_Sld_Axe);  // Двуручный топор урон 60
    EquipItem(self,ItMW_Addon_Hacker_1h_01); // Мачете 1р урон 100
    B_CreateAmbientInv(self);
    B_SetNpcVisual(self,MALE,"Hum_Head_Bald",Face_N_Whistler,BodyTex_N,ITAR_Leather_L); // Кожанный доспех
    Mdl_SetModelFatness(self,1);
    Mdl_ApplyOverlayMds(self,"Humans_Militia.mds"); // Militia - походка НПС
    B_GiveNpcTalents(self);
//  B_SetFightSkills(self,75);
    B_AddFightSkill (self, NPC_TALENT_1H, 80); // - талант владени¤ одноручем
    B_AddFightSkill (self, NPC_TALENT_2H, 50); // - талант владени¤ двуручем
    B_AddFightSkill (self, NPC_TALENT_BOW, 60); // - талант владени¤ луком
    B_AddFightSkill (self, NPC_TALENT_CROSSBOW, 30); // - талант владени¤ арболетом
    daily_routine = Rtn_Start_4110;
};

func void Rtn_Start_4110()
{
    TA_Sit_Campfire(8,0,23,0,"OW_STAND_JERGAN");
    TA_Sit_Campfire(23,0,8,0,"OW_STAND_JERGAN");
};

func void Rtn_Fajeth_4110()
{
    TA_Sit_Campfire(8,0,23,0,"OW_NEWMINE_04");
    TA_Sit_Campfire(23,0,8,0,"OW_NEWMINE_04");
};

func void Rtn_LeadSnapper_4110()
{
    TA_Pick_FP (8,0,23,0,"OW_ORC_LOOKOUT_2_01"); // Вожак Снепперов
    TA_Pick_FP (23,0,8,0,"OW_ORC_LOOKOUT_2_01"); // Вожак Снепперов
};

Сам снеппер , убрал когти

instance NewMine_LeadSnapper(Mst_Default_Snapper)
{
    name[0] = "Вожак стаи";
    level = 16; // 12
    B_SetVisuals_Snapper();
    Npc_SetToFistMode(self);
    Mdl_SetModelScale(self,1.1,1.1,1.1);
    attribute[ATR_HITPOINTS_MAX] = 160;
    attribute[ATR_HITPOINTS] = 160;
//  CreateInvItems(self,ItAt_ClawLeader,1); //
};

Билгот при добавления Лидера Снепперов, проверка на навык снятия когтей

instance DIA_Bilgot_KNOWSLEADSNAPPER(C_Info)
{
    npc = VLK_4120_Bilgot;
    nr = 4;
    condition = DIA_Bilgot_KNOWSLEADSNAPPER_Condition;
    information = DIA_Bilgot_KNOWSLEADSNAPPER_Info;
    permanent = FALSE;
    description = "Расскажи мне, что ты знаешь. И я вытащу тебя отсюда!";
};

func int DIA_Bilgot_KNOWSLEADSNAPPER_Condition()
{
    if(Npc_KnowsInfo(other,DIA_Bilgot_Hilfe) && (MIS_Fajeth_Kill_Snapper == LOG_Running))
    {
        return TRUE;
    };
};

func void DIA_Bilgot_KNOWSLEADSNAPPER_Info()
{
    AI_Output(other,self,"DIA_Bilgot_KNOWSLEADSNAPPER_15_00");  //Расскажи мне, что ты знаешь. И я вытащу тебя отсюда!
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_01");  //Я знал, что могу рассчитывать на тебя. Так что будь внимателен. Я довольно долго наблюдаю за снепперами.
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_02");  //Они очень хитры и могут, ну, как бы... общаться. Они никогда не ходят поодиночке и нападают только стаей.
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_03");  //Но есть еще кое-что. Среди них есть один особенный. Он редко показывается, но я видел его.
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_04");  //Другие снепперы низко кланяются, когда проходят мимо него, но никогда не отходят далеко.
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_05");  //Пока этот зверь не тронется с места, ни один снеппер поблизости даже не шевельнется.
    AI_Output(other,self,"DIA_Bilgot_KNOWSLEADSNAPPER_15_06");  //Где мне найти этого кровожадного зверя?
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_07");  //Я видел его на ступенях старой сторожевой башни.
    AI_Output(other,self,"DIA_Bilgot_KNOWSLEADSNAPPER_15_08");  //Отлично. Мне кажется, я понял. Спасибо!
    AI_Output(self,other,"DIA_Bilgot_KNOWSLEADSNAPPER_05_09");  //Помни, ты дал мне слово!
    NewMine_LeadSnapper_Spawned = TRUE;
    Wld_InsertNpc(NewMine_LeadSnapper,"OW_ORC_LOOKOUT_2_01");           
    if (PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] == TRUE)
    {
        CreateInvItems(NewMine_LeadSnapper,ItAt_ClawLeader,2); // добавляем когти Снеппера
    };

    B_LogEntry(TOPIC_FajethKillSnapper,"Билгот рассказал мне о вожаке стаи снепперов. Он должен быть у старой сторожевой башни.");
    Log_CreateTopic(TOPIC_BilgotEscort,LOG_MISSION);
    Log_SetTopicStatus(TOPIC_BilgotEscort,LOG_Running);
    B_LogEntry(TOPIC_BilgotEscort,"Билгот хочет, чтобы я вывел его из долины.");
};
dosinabox commented 4 years ago

Заметь, что реплика

AI_Output(other,self,"DIA_Raoul_TROLL_rechnung_hastrecht_15_00");   //Мне это не интересно.

произносится с красными субтитрами внизу экрана (как фоновые разговоры), а не с белыми субтитрами вверху экрана (как обычные диалоги). Чтобы было как со всеми диалогами, после этой реплики ГГ нужно добавить какую-нибудь реплику Джергана или команду AI_WaitTillEnd(self,other) (эта команда ещё не проверялась, но должно сработать - хочу попробовать исправить такие случаи неправильных субтитров в диалогах с Джорой, Болтаном и ещё кем-то).

Kor-Angar commented 4 years ago

или команду AI_WaitTillEnd(self,other) (эта команда ещё не проверялась, но должно сработать

работает https://www.youtube.com/watch?v=wF0PMyR9UNE&feature=youtu.be