• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Не стесняюсь спросить....

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
С этого момента максимально подробно опиши, что именно багнуто в SVM с голосом 4. Может быть, дело в том, что по умолчанию в игре воспроизводится довольно ограниченный набор криков боли и смерти (SVM_??_AARGH* и SVM_??_DEAD), поэтому в неофициальном обновлении мне пришлось добавлять дополнительные инстанции звуков в файл SFX\SfxInst.d и перекомпилировать sfx.dat.
Я не знаю что именно багнуто, но мне известно что остальные голоса отлично работают.

У меня возникла еще одна проблема.
Почему-то мой НПС не хочет начинать со мной диалог. В игре, когда я подхожу к НПС он просто на меня смотрит, а если говорю с ним, то он уже начинает говорить, хотя я поставил Important = true;
 

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.861
Благодарности
1.254
Баллы
440
У меня возникла еще одна проблема.
Почему-то мой НПС не хочет начинать со мной диалог. В игре, когда я подхожу к НПС он просто на меня смотрит, а если говорю с ним, то он уже начинает говорить, хотя я поставил Important = true;

Скрипт диалога может покажешь?:)
 

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
Скрипт диалога может покажешь?:)
Код:
instance DIA_WENART_EXIT(C_INFO)
{
   npc = CON_100_WENART;
   nr = 999;
   condition = DIA_WENART_EXIT_Condition;
   information = DIA_WENART_EXIT_Info;
   permanent = TRUE;
   description = Dialog_Ende;
};

func int DIA_WENART_EXIT_Condition()
{
  return TRUE;
};
func void DIA_WENART_EXIT_Info()
{
   AI_StopProcessInfos(self);
};

var int Knows_PaladinInfo;

instance DIA_WENART_HELLO(C_INFO)
{
   npc = CON_100_WENART;
  nr = 1;
  condition = DIA_WENART_HELLO_Condition;
  information = DIA_WENART_HELLO_Info;
  permanent = FALSE;
   important = TRUE;
};

func int DIA_WENART_HELLO_Condition()
{
   return TRUE;
};

func void DIA_WENART_HELLO_Info()
{
   AI_Output(self,other,"DIA_WENART_HELLO_01_00"); //???
   AI_Output(other,self,"DIA_WENART_HELLO_15_01"); //???
   AI_Output(self,other,"DIA_WENART_HELLO_01_02"); //???
   AI_Output(other,self,"DIA_WENART_HELLO_15_03"); //???
   AI_Output(self,other,"DIA_WENART_HELLO_01_04"); //???
   AI_Output(other,self,"DIA_WENART_HELLO_15_05"); //???
   AI_Output(other,self,"DIA_WENART_HELLO_15_06"); //???
   AI_Output(self,other,"DIA_WENART_HELLO_01_07"); //???
   AI_Output(self,other,"DIA_WENART_HELLO_01_08"); //???
   AI_Output(self,other,"DIA_WENART_HELLO_01_09"); //???
   AI_Output(self,other,"DIA_WENART_HELLO_01_10"); //???
   AI_Output(self,other,"DIA_WENART_HELLO_01_11"); //???
   Info_ClearChoices(DIA_WENART_HELLO);
   Info_AddChoice(DIA_WENART_HELLO,"???",DIA_WENART_HELLO_PALADINS);
   Info_AddChoice(DIA_WENART_HELLO,"???",DIA_WENART_HELLO_WHO);
};

func void DIA_WENART_HELLO_PALADINS()
{
   AI_Output(other,self,"DIA_WENART_HELLO_PALADINS_15_00"); //???
   AI_Output(self,other,"DIA_WENART_HELLO_PALADINS_01_01"); //???
   AI_Output(self,other,"DIA_WENART_HELLO_PALADINS_01_02"); //???
   Knows_PaladinInfo = TRUE;
};

func void DIA_WENART_HELLO_WHO()
{
   AI_Output(other,self,"DIA_WENART_HELLO_WHO_15_00"); //???
   AI_Output(self,other,"DIA_WENART_HELLO_WHO_01_01"); //???
   AI_Output(self,other,"DIA_WENART_HELLO_WHO_01_02"); //???
   if(Knows_PaladinInfo == TRUE)
   {
     Info_ClearChoices(DIA_WENART_HELLO);
   }
   else
   {
     Info_ClearChoices(DIA_WENART_HELLO);
     Info_AddChoice(DIA_WENART_HELLO,"???",DIA_WENART_HELLO_PALADINS);
   };
};

Можно ли сделать квест который начинается при начале игры?
 

DenZanuda


Архивариус
Регистрация
4 Ноя 2011
Сообщения
941
Благодарности
476
Баллы
245
В копилку нубских вопросов:

Почему иногда при загрузке ГГ теряет текстуру одежды и как с этим бороться?
Между сохранением и загрузкой не вносилось никаких изменений ни в скрипты ни в зен
 

Вложения

  • saves.jpg
    saves.jpg
    73,9 KB · Просмотры: 185

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.861
Благодарности
1.254
Баллы
440
попробуй убрать пробелы в строках
" npc = CON_100_WENART;" и " important = TRUE;", чтобы выровнять с остальными. И убрать "permanent = FALSE;" Незачем лишнюю информацию писать.
 

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
попробуй убрать пробелы в строках
" npc = CON_100_WENART;" и " important = TRUE;", чтобы выровнять с остальными. И убрать "permanent = FALSE;" Незачем лишнюю информацию писать.
ничего не изменилось

вот еще одна проблема:

1Ej0vft.jpg

НПС не становится на место где должен стоять после того как избивает меня ("BEACH")
Он вообще не выполняет свою рутина, хотя я все правильно сделал:
Код:
instance CON_100_WENART(Npc_Default)
{
   name = "Венарт";
   guild = GIL_CON;
   npctype = NPCTYPE_MAIN;
   flags = 0;
   id = 100;
   voice = 10;

   B_SetAttributesToChapter(self,2);
   B_GiveNpcTalents(self);
   B_SetFightSkills(self,45);
   fight_tactic = FAI_HUMAN_COWARD;

   Mdl_SetModelFatness(self,2);
   Mdl_ApplyOverlayMds(self,"Humans_Relaxed.mds");
   B_SetNpcVisual(self,MALE,"Hum_Head_FatBald",Face_N_NormalBart08,BodyTex_N,ITAR_Bau_L);

   EquipItem(self,ITMW_1H_BAU_MACE);

   B_CreateAmbientInv(self);

   daily_routine = Rtn_Start_100;
};

func void Rtn_Start_100()
{
   TA_Stand_Guarding (8, 0, 22, 0,"BEACH");
   TA_Stand_Guarding (22, 0, 8, 0,"BEACH");
};

func void Rtn_Normal_100()
{
   TA_Stand_Guarding (8, 0, 22, 0,"BEACH5");
   TA_Sit_Campfire (22, 0, 8, 0,"BEACH_SIT_CAMPFIRE_01");
};
а этот НПС все делает и работает правильно
Код:
instance CON_101_FISHER(Npc_Default)
{
   name[0] = NAME_Fisher;
   guild = GIL_CON;
   npcType = NPCTYPE_AMBIENT;
   flags = 0;
   id = 101;
   voice = 7;
   
   B_SetAttributesToChapter(self,2);
   B_GiveNpcTalents(self);
   B_SetFightSkills(self,45);
   fight_tactic = FAI_HUMAN_COWARD;
   
   Mdl_SetModelFatness(self,1);
   Mdl_ApplyOverlayMds(self,"Humans_Relaxed.mds");
   B_SetNpcVisual(self,MALE,"Hum_Head_Fighter",Face_N_Normal17,BodyTex_N,ITAR_Bau_L);
   
   EquipItem(self,ItMw_1h_Bau_Axe);
   
   B_CreateAmbientInv(self);
   
   daily_routine = Rtn_Start_101;
};

func void Rtn_Start_101()
{
   TA_Stand_Guarding (8, 0, 22, 0,"BEACH_STAND_GUARDING_01");
   TA_Sleep (22, 0, 8, 0,"BEACH_SLEEP_01");
};
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.346
Благодарности
3.190
Баллы
525
Почему иногда при загрузке ГГ теряет текстуру одежды и как с этим бороться?

Есть подозрение, что причина в наличии конфликта названий материалов. Ты, часом, модели из модельного мода не используешь? Просто, когда я его делал, то не имел ни малейшего представления о том, что такое материалы, и как с ними правильно обходиться. Модели компилились неправильно, где-то могли затесаться разные материалы с одинаковыми названиями. Другой вариант - переполнение кэша текстур при использовании текстур повышенного разрешения.

НПС не становится на место где должен стоять после того как избивает меня

А фрипоинт нужный там есть? Чёйто его не видно.

Почему-то мой НПС не хочет начинать со мной диалог.

Включи Марвина, возьми непися в фокус, нажми на клавиатуре кнопку "T/Е". Будет выведен список восприятий непися. Убедись, что там есть восприятие ГГ PERC_ASSESSPLAYER.

Также непись может быть отвлечён от ГГ находящимся поблизости монстром. У непися постоянно срабатывает восприятие PERC_ASSESSENEMY, имеющие более высокий приоритет. В этом случае нужно переместить монстра или уменьшить радиус действия восприятий непися.

ЗЫ. ФПС 208 для Спейсера - не айс. Запили батник и запускай Спейсер с ФПС 30.
 

Михаил Карсаков

Участник форума
Регистрация
17 Ноя 2014
Сообщения
85
Благодарности
2
Баллы
170
В спейсере проблемы у меня.
Когда ставлю новый объект (будь то вейпоинт, или еще что нибудь), или меняю содержимое сундука, да хоть что, игра не запускается. Сохранил-закинул-запустил-новая игра-ошибка-вылет.
 

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
ЗЫ. ФПС 208 для Спейсера - не айс. Запили батник и запускай Спейсер с ФПС 30.

Не спейсер это.


Ближе к теме, AssessPlayer есть, монстров нет.
К анимации которая мне нужна, не нужно ставить фрипоинт (TA_STAND_GUARDING)
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.346
Благодарности
3.190
Баллы
525
Не спейсер это.
Упс, майбэд! :)

AssessPlayer есть, монстров нет
Включи Марвина, вселись в непися, нажми на клавиатуре кнопку "G/П", вселись в себя. Позволь ему себя побить, дождись, когда он "зависнет" (не вернётся на своё место). Заскринь и выложи.

не нужно ставить фрипоинт (TA_STAND_GUARDING)
Разве?
 

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
Упс, майбэд! :)


Включи Марвина, вселись в непися, нажми на клавиатуре кнопку "G/П", вселись в себя. Позволь ему себя побить, дождись, когда он "зависнет" (не вернётся на своё место). Заскринь и выложи.


Разве?
Лови)
Z17I4iu.jpg
+ Я создал второго непися. Он во время драки отошел, и тоже теперь не возвращается(

У меня такое ощущение что я слишком много поудалял и порезал
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.346
Благодарности
3.190
Баллы
525
На скрине белым по цветному писано, что непись, вроде как, отрабатывает свою рутину. Ставь фрипоинт "STAND", не ленись. Кстати, "SIT" и "CAMPFIRE" тоже должны присутствовать в наименованиях фрипоинтов. Не запрещено называть так веи, но толку от этого не будет. ;)
 

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
На скрине белым по цветному писано, что непись, вроде как, отрабатывает свою рутину. Ставь фрипоинт "STAND", не ленись. Кстати, "SIT" и "CAMPFIRE" тоже должны присутствовать в наименованиях фрипоинтов. Не запрещено называть так веи, но толку от этого не будет. ;)
Ладно попробую добавить фрипоинты, а что насчет начала диалога неписем когда близко подходишь? Он так и не хочет этого делать!
 

Vlad_Torop

Участник форума
Регистрация
2 Май 2014
Сообщения
869
Благодарности
499
Баллы
230

cool_er

Участник форума
Регистрация
23 Мар 2015
Сообщения
118
Благодарности
42
Баллы
190
Ладно попробую добавить фрипоинты, а что насчет начала диалога неписем когда близко подходишь? Он так и не хочет этого делать!
НПС, так и не заговорит, т.к ты удалил функцию восприятия важного диалога. Замени всё в файле "Scripts/AI/Human/B_Human/B_AssessPlayer.d" на это:
Код:
// *******************************************************
// Функция реакции НПС (людей) на ГГ (обработка активного восприятия PERC_ASSESSPLAYER).
// ГГ должен быть в поле зрения НПС (люди не имеют чувства обоняния)
// Макс. дистанция реакции на ГГ - PERC_DIST_ACTIVE_MAX.
// *******************************************************

func void B_AssessPlayer()
{
    // other в функции - ГГ, self - НПС
    // Если ГГ находится в режиме диалога
    if(other.aivar[AIV_INVINCIBLE] == TRUE)
    {
        return;
    };
    // Если ГГ мертв, безсознания или в магическом сне
    if(C_NpcIsDown(other))
    {
        return;
    };
    // Если ГГ превращен в монстра
    if(other.guild > GIL_SEPERATOR_HUM)
    {
        // Если НПС охранник, то он должен задержать любого монстра
        if(C_NpcIsGateGuard(self))
        {
            // НПС встает
            AI_StandUpQuick(self);
            // вызов функции сражения
            B_Attack(self,other,AR_MonsterCloseToGate,0);
            return;
        }
        // если гильдии ГГ и НПС враждебны
        else if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_HOSTILE)
        {
            // если НПС не сопровождает ГГ и НПС не является другом ГГ
            if(self.aivar[AIV_PARTYMEMBER] == FALSE) && (self.npctype != NPCTYPE_FRIEND)
            {
                // вызов функции сражения
                B_Attack(self,other,AR_GuildEnemy,0);
                return;
            };
        };
    };
    // Если ГГ враг
    if(B_AssessEnemy())   
    {
        return;
    };
    // Если ГГ бандит и НПС не бандит
    if(C_PlayerIsFakeBandit(self,other) && (self.guild != GIL_BDT))
    {
        // вызов функции сражения
        B_Attack(self,other,AR_GuildEnemy,0);
    };
    // Если ГГ убийца и НПС должен атаковать убийцу и расстояние между ГГ и НПС <= PERC_DIST_INTERMEDIAT
    if(B_GetPlayerCrime(self) == CRIME_MURDER) && C_WantToAttackMurder(self,other) && (Npc_GetDistToNpc(self,other) <= PERC_DIST_INTERMEDIAT)
    {
        // вызов функции сражения
        B_Attack(self,other,AR_HumanMurderedHuman,0);   
        return;
    };
    // Если ГГ вошел в помещение, ему не принадлежащее
    if(B_AssessEnterRoom())   
    {
        return;
    };
    // Если оружие ГГ обнажено
    if(B_AssessDrawWeapon())
    {
        return;
    }
    else // сброс флага комментирования обнаженного оружия
    {
        Player_DrawWeaponComment = FALSE;
    };
    // Если ГГ подкрадывается
    if(C_BodyStateContains(other,BS_SNEAK))
    {
        // если НПС не наблюдает за ГГ и НПС должен реагировать на крадущегося ГГ
        if(!Npc_IsInState(self,ZS_ObservePlayer) && C_WantToReactToSneaker(self,other))
        {
            // очистка AI команд НПС
            Npc_ClearAIQueue(self);
            // очистка восприятий НПС
            B_ClearPerceptions(self);
            // перевод НПС в состояние наблюдения за ГГ
            AI_StartState(self,ZS_ObservePlayer,1,"");
            return;
        };
    }
    else // ГГ не подкрадывается
    {
        // если ГГ не стоит
        if(!C_BodyStateContains(other,BS_STAND))
        {
            // сброс флага комментирования крадущегося ГГ
            Player_SneakerComment = FALSE;
        };
    };
    // Если ГГ не лежит
    if(!C_BodyStateContains(other,BS_LIE))
    {
        // сброс флага комментирования, что ГГ лег на чужую кровать
        Player_GetOutOfMyBedComment = FALSE;
    };
    // Важная информация для окружающих черных магов (я так понимаю, что это ищущие)
//    B_AssignDementorTalk(self);
    // *********** Диалог *************
    // Если расстояние между ГГ и НПС <= дистанции начала разговора и НПС имеет важную информацию
    if(Npc_GetDistToNpc(self,other) <= PERC_DIST_DIALOG) && (Npc_CheckInfo(self,1))
    {
        // Если НПС охраняет ворота
        if(C_NpcIsGateGuard(self))
        {
            // установка флага для НПС при обращении с важной информацией к ГГ
            self.aivar[AIV_NpcStartedTalk] = TRUE;
            // функция диалога
            B_AssessTalk();
            return;
        }
        else //для других НПС
        {
            // если ГГ не падает и не плывет и не ныряет
            if(!C_BodyStateContains(other,BS_FALL)) && (!C_BodyStateContains(other,BS_SWIM)) && (!C_BodyStateContains(other,BS_DIVE))
            // и ГГ не занимается криминалом
            && (B_GetPlayerCrime(self) == CRIME_NONE)
            // и ГГ не отказался от разговора с НПС
            && (C_RefuseTalk(self,other) == FALSE)
            // и ГГ не является членом подставной гильдии
            && (C_PlayerHasFakeGuild(self,other) == FALSE)
            {
                // установка флага для НПС при обращении с важной информацией к ГГ
                self.aivar[AIV_NpcStartedTalk] = TRUE;
                // функция диалога
                B_AssessTalk();
                return;
            };
        };
    };   
    // *********** Приветствие *************
    // если НПС идет и расстояние между ГГ и НПС <= дистанции начала разговора
    if (C_BodyStateContains(self,BS_WALK)) && (Npc_GetDistToNpc(self,other) <= PERC_DIST_DIALOG)
    // и ГГ не отказался от диалога и НПС не охранник
    && (Npc_RefuseTalk(other) == FALSE) && (!C_NpcIsGateGuard(self))
    // и ГГ не является членом подставной гильдии
    && (C_PlayerHasFakeGuild(self,other) == FALSE)           
    {   
        // НПС и ГГ смотрят друг на друга
        B_LookAtNpc(self,other);
        // звучит приветственная фраза
        B_Say_GuildGreetings(self,other);
        // НПС и ГГ перестают смотреть друг на друга
        B_StopLookAt(self);
        // отказ ГГ от диалога на 20 секунд
        Npc_SetRefuseTalk(other,20);
    };
    // *********** Сброс предупреждений охраной *************
    // если НПС охранник и расстояние между ГГ и НПС > дистанции начала разговора
    if(C_NpcIsGateGuard(self)) && (Npc_GetDistToNpc(self,other) > PERC_DIST_DIALOG)
    {
        // Статус предупреждений охраны = Нет предупреждений
        self.aivar[AIV_Guardpassage_Status] = GP_NONE;
    };
    return;
};
 

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
НПС, так и не заговорит, т.к ты удалил функцию восприятия важного диалога. Замени всё в файле "Scripts/AI/Human/B_Human/B_AssessPlayer.d" на это:
Код:
// *******************************************************
// Функция реакции НПС (людей) на ГГ (обработка активного восприятия PERC_ASSESSPLAYER).
// ГГ должен быть в поле зрения НПС (люди не имеют чувства обоняния)
// Макс. дистанция реакции на ГГ - PERC_DIST_ACTIVE_MAX.
// *******************************************************

func void B_AssessPlayer()
{
    // other в функции - ГГ, self - НПС
    // Если ГГ находится в режиме диалога
    if(other.aivar[AIV_INVINCIBLE] == TRUE)
    {
        return;
    };
    // Если ГГ мертв, безсознания или в магическом сне
    if(C_NpcIsDown(other))
    {
        return;
    };
    // Если ГГ превращен в монстра
    if(other.guild > GIL_SEPERATOR_HUM)
    {
        // Если НПС охранник, то он должен задержать любого монстра
        if(C_NpcIsGateGuard(self))
        {
            // НПС встает
            AI_StandUpQuick(self);
            // вызов функции сражения
            B_Attack(self,other,AR_MonsterCloseToGate,0);
            return;
        }
        // если гильдии ГГ и НПС враждебны
        else if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_HOSTILE)
        {
            // если НПС не сопровождает ГГ и НПС не является другом ГГ
            if(self.aivar[AIV_PARTYMEMBER] == FALSE) && (self.npctype != NPCTYPE_FRIEND)
            {
                // вызов функции сражения
                B_Attack(self,other,AR_GuildEnemy,0);
                return;
            };
        };
    };
    // Если ГГ враг
    if(B_AssessEnemy())
    {
        return;
    };
    // Если ГГ бандит и НПС не бандит
    if(C_PlayerIsFakeBandit(self,other) && (self.guild != GIL_BDT))
    {
        // вызов функции сражения
        B_Attack(self,other,AR_GuildEnemy,0);
    };
    // Если ГГ убийца и НПС должен атаковать убийцу и расстояние между ГГ и НПС <= PERC_DIST_INTERMEDIAT
    if(B_GetPlayerCrime(self) == CRIME_MURDER) && C_WantToAttackMurder(self,other) && (Npc_GetDistToNpc(self,other) <= PERC_DIST_INTERMEDIAT)
    {
        // вызов функции сражения
        B_Attack(self,other,AR_HumanMurderedHuman,0);
        return;
    };
    // Если ГГ вошел в помещение, ему не принадлежащее
    if(B_AssessEnterRoom())
    {
        return;
    };
    // Если оружие ГГ обнажено
    if(B_AssessDrawWeapon())
    {
        return;
    }
    else // сброс флага комментирования обнаженного оружия
    {
        Player_DrawWeaponComment = FALSE;
    };
    // Если ГГ подкрадывается
    if(C_BodyStateContains(other,BS_SNEAK))
    {
        // если НПС не наблюдает за ГГ и НПС должен реагировать на крадущегося ГГ
        if(!Npc_IsInState(self,ZS_ObservePlayer) && C_WantToReactToSneaker(self,other))
        {
            // очистка AI команд НПС
            Npc_ClearAIQueue(self);
            // очистка восприятий НПС
            B_ClearPerceptions(self);
            // перевод НПС в состояние наблюдения за ГГ
            AI_StartState(self,ZS_ObservePlayer,1,"");
            return;
        };
    }
    else // ГГ не подкрадывается
    {
        // если ГГ не стоит
        if(!C_BodyStateContains(other,BS_STAND))
        {
            // сброс флага комментирования крадущегося ГГ
            Player_SneakerComment = FALSE;
        };
    };
    // Если ГГ не лежит
    if(!C_BodyStateContains(other,BS_LIE))
    {
        // сброс флага комментирования, что ГГ лег на чужую кровать
        Player_GetOutOfMyBedComment = FALSE;
    };
    // Важная информация для окружающих черных магов (я так понимаю, что это ищущие)
//    B_AssignDementorTalk(self);
    // *********** Диалог *************
    // Если расстояние между ГГ и НПС <= дистанции начала разговора и НПС имеет важную информацию
    if(Npc_GetDistToNpc(self,other) <= PERC_DIST_DIALOG) && (Npc_CheckInfo(self,1))
    {
        // Если НПС охраняет ворота
        if(C_NpcIsGateGuard(self))
        {
            // установка флага для НПС при обращении с важной информацией к ГГ
            self.aivar[AIV_NpcStartedTalk] = TRUE;
            // функция диалога
            B_AssessTalk();
            return;
        }
        else //для других НПС
        {
            // если ГГ не падает и не плывет и не ныряет
            if(!C_BodyStateContains(other,BS_FALL)) && (!C_BodyStateContains(other,BS_SWIM)) && (!C_BodyStateContains(other,BS_DIVE))
            // и ГГ не занимается криминалом
            && (B_GetPlayerCrime(self) == CRIME_NONE)
            // и ГГ не отказался от разговора с НПС
            && (C_RefuseTalk(self,other) == FALSE)
            // и ГГ не является членом подставной гильдии
            && (C_PlayerHasFakeGuild(self,other) == FALSE)
            {
                // установка флага для НПС при обращении с важной информацией к ГГ
                self.aivar[AIV_NpcStartedTalk] = TRUE;
                // функция диалога
                B_AssessTalk();
                return;
            };
        };
    };
    // *********** Приветствие *************
    // если НПС идет и расстояние между ГГ и НПС <= дистанции начала разговора
    if (C_BodyStateContains(self,BS_WALK)) && (Npc_GetDistToNpc(self,other) <= PERC_DIST_DIALOG)
    // и ГГ не отказался от диалога и НПС не охранник
    && (Npc_RefuseTalk(other) == FALSE) && (!C_NpcIsGateGuard(self))
    // и ГГ не является членом подставной гильдии
    && (C_PlayerHasFakeGuild(self,other) == FALSE)  
    {
        // НПС и ГГ смотрят друг на друга
        B_LookAtNpc(self,other);
        // звучит приветственная фраза
        B_Say_GuildGreetings(self,other);
        // НПС и ГГ перестают смотреть друг на друга
        B_StopLookAt(self);
        // отказ ГГ от диалога на 20 секунд
        Npc_SetRefuseTalk(other,20);
    };
    // *********** Сброс предупреждений охраной *************
    // если НПС охранник и расстояние между ГГ и НПС > дистанции начала разговора
    if(C_NpcIsGateGuard(self)) && (Npc_GetDistToNpc(self,other) > PERC_DIST_DIALOG)
    {
        // Статус предупреждений охраны = Нет предупреждений
        self.aivar[AIV_Guardpassage_Status] = GP_NONE;
    };
    return;
};
не работает. НПС не начинает диалог

я добавил это
Код:
aivar[AIV_IgnoresFakeGuild] = TRUE
и нпс теперь начинает диалог. Только не понятно почему

+Можно ли вызвать дождь в скриптах?

++Как сделать чтобы НПС был телохранителем другого НПС. чтобы когда мы атаковали этого "Другого НПС", именно этот "Телохранитель" атаковал нас. А то он в сторонку отходит и болеет

+++У меня следующий код у неписей:
Код:
   B_SetAttributesToChapter(self,5);
   fight_tactic = FAI_HUMAN_STRONG;
   B_GiveNpcTalents(self);
   B_SetFightSkills(self,85);
или что-то похожее, но они махают своей палочкой-уронялочкой будто у них скилл менее 30% или менее 60%. Вопрос: Почему?
 
Последнее редактирование:

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.333
Баллы
315
Дождь в скриптах только с помощью Икаруса/AST можно вызвать.
 

cool_er

Участник форума
Регистрация
23 Мар 2015
Сообщения
118
Благодарности
42
Баллы
190
не работает. НПС не начинает диалог

я добавил это
Код:
aivar[AIV_IgnoresFakeGuild] = TRUE
и нпс теперь начинает диалог. Только не понятно почему

+Можно ли вызвать дождь в скриптах?

++Как сделать чтобы НПС был телохранителем другого НПС. чтобы когда мы атаковали этого "Другого НПС", именно этот "Телохранитель" атаковал нас. А то он в сторонку отходит и болеет

+++У меня следующий код у неписей:
Код:
   B_SetAttributesToChapter(self,5);
   fight_tactic = FAI_HUMAN_STRONG;
   B_GiveNpcTalents(self);
   B_SetFightSkills(self,85);
или что-то похожее, но они махают своей палочкой-уронялочкой будто у них скилл менее 30% или менее 60%. Вопрос: Почему?
1)Могу предположить что у ГГ что-то не то с гильдией. По-моему FakeGuild - это когда ГГ одевает например одежду бандита и на время одевания становится бандитом.
2)Насчет телохранителя не могу помочь, единственное что я знаю - это то что все будут заступаться за НПС которые имеют флаг гражданина.
3)У меня такое было, решалось сохранением и загрузкой, и после загрузки все НПС дрались как следует. С чем связано - не знаю.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.563
Благодарности
4.157
Баллы
915
2)Насчет телохранителя не могу помочь, единственное что я знаю - это то что все будут заступаться за НПС которые имеют флаг гражданина.
Это будут делать не все, а только представители дружественных гильдий.
Например, горожан (GIL_VLK) будут защищать ополченцы (GIL_MIL) и паладины (GIL_PAL). Крестьян (GIL_BAU) защитят наёмники (GIL_SLD) и ОнДы (GIL_DJG). Послушников (GIL_NOV) защищают маги Огня (GIL_KDF), а самих магов Огня - паладины. Чтобы вернувшегося в город Хоринис мага Воды Миксира (GIL_KDW) стали защищать ополченцы, мне пришлось изменить его гильдию на GIL_VLK.
Короче, изучай таблицы взаимоотношений между гильдиями (AI\Human\Guilds.d и AI\Monster\B_Monster\B_InitMonsterAttitudes.d).
3)У меня такое было, решалось сохранением и загрузкой, и после загрузки все НПС дрались как следует. С чем связано - не знаю.
Это связано с оверлеями владения различными видами оружия, поэтому их надо назначать в скрипте
Story\B_Story\B_AddFightSkill.d:
Код:
func void B_AddFightSkill(var C_Npc slf,var int talent,var int percent)
{
    if(talent == NPC_TALENT_1H)
    {
        slf.HitChance[NPC_TALENT_1H] += percent;
        if(slf.HitChance[NPC_TALENT_1H] > 100)
        {
            slf.HitChance[NPC_TALENT_1H] = 100;
        };
        if(slf.HitChance[NPC_TALENT_1H] >= 60)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,2);
            Mdl_ApplyOverlayMds(slf,"humans_1hST2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_1H] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,1);
            Mdl_ApplyOverlayMds(slf,"humans_1hST1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,0);
            Mdl_RemoveOverlayMds(slf,"humans_1hST1.MDS");
            Mdl_RemoveOverlayMds(slf,"humans_1hST2.MDS");
        };
    };
    if(talent == NPC_TALENT_2H)
    {
        slf.HitChance[NPC_TALENT_2H] += percent;
        if(slf.HitChance[NPC_TALENT_2H] > 100)
        {
            slf.HitChance[NPC_TALENT_2H] = 100;
        };
        if(slf.HitChance[NPC_TALENT_2H] >= 60)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,2);
            Mdl_ApplyOverlayMds(slf,"humans_2hST2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_2H] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,1);
            Mdl_ApplyOverlayMds(slf,"humans_2hST1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_2H,0);
            Mdl_RemoveOverlayMds(slf,"humans_2hST1.MDS");
            Mdl_RemoveOverlayMds(slf,"humans_2hST2.MDS");
        };
    };
    if(talent == NPC_TALENT_BOW)
    {
        slf.HitChance[NPC_TALENT_BOW] += percent;
        if(slf.HitChance[NPC_TALENT_BOW] > 100)
        {
            slf.HitChance[NPC_TALENT_BOW] = 100;
        };
        if(slf.HitChance[NPC_TALENT_BOW] >= 60)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,2);
            Mdl_ApplyOverlayMds(slf,"humans_bowT2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_BOW] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,1);
            Mdl_ApplyOverlayMds(slf,"humans_bowT1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_BOW,0);
            Mdl_RemoveOverlayMds(slf,"humans_bowT1.MDS");
            Mdl_RemoveOverlayMds(slf,"humans_bowT2.MDS");
        };
    };
    if(talent == NPC_TALENT_CROSSBOW)
    {
        slf.HitChance[NPC_TALENT_CROSSBOW] += percent;
        if(slf.HitChance[NPC_TALENT_CROSSBOW] > 100)
        {
            slf.HitChance[NPC_TALENT_CROSSBOW] = 100;
        };
        if(slf.HitChance[NPC_TALENT_CROSSBOW] >= 60)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,2);
            Mdl_ApplyOverlayMds(slf,"humans_cbowT2.mds");
        }
        else if(slf.HitChance[NPC_TALENT_CROSSBOW] >= 30)
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,1);
            Mdl_ApplyOverlayMds(slf,"humans_cbowT1.mds");
        }
        else
        {
            Npc_SetTalentSkill(slf,NPC_TALENT_CROSSBOW,0);
            Mdl_RemoveOverlayMds(slf,"humans_cbowT1.MDS");
            Mdl_RemoveOverlayMds(slf,"humans_cbowT2.MDS");
        };
    };
};
 
Последнее редактирование:
Сверху Снизу