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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в оценке работ на конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык
    Ссылка на тему с работами участников- тык

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

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
228
Благодарности
29
Баллы
190
Не подскажете, почему НПС не переходит в более злым вариантам диалога и почему у меня две строчки "Конец":
Daedalus:
const string Wnd_1618_Checkpoint = "NW_WANDCAMP1_TENT1";

instance DIA_Wnd_1618_Wanderer_FirstWarn(C_Info)
{
    npc = WND_1618_Wanderer;
    nr = 1;
    condition = DIA_Wnd_1618_Wanderer_FirstWarn_Condition;
    information = DIA_Wnd_1618_Wanderer_FirstWarn_Info;
    permanent = TRUE;
    important = TRUE;
};


func int DIA_Wnd_1618_Wanderer_FirstWarn_Condition()
{
    if((MIS_ChilledRevenge != LOG_Running) && (self.aivar[AIV_Guardpassage_Status] == GP_NONE) && (self.aivar[AIV_PASSGATE] == FALSE) && (Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == TRUE))
    {
        return TRUE;
    };
};

func void DIA_Wnd_1618_Wanderer_FirstWarn_Info()
{
    AI_Output(self,other,"DIA_Wnd_1618_Wanderer_FirstWarn_01_00");    //Стой! Куда это ты идешь?
    AI_Output(other,self,"DIA_Wnd_1618_Wanderer_FirstWarn_15_01");    //Я хотел...
    AI_Output(self,other,"DIA_Wnd_1618_Wanderer_FirstWarn_01_03");    //Здесь не на что смотреть. Иди своей дорогой.
    other.aivar[AIV_LastDistToWP] = Npc_GetDistToWP(other,Wnd_1618_Checkpoint);
    self.aivar[AIV_Guardpassage_Status] = GP_FirstWarnGiven;
};


instance DIA_Wnd_1618_Wanderer_SecondWarn(C_Info)
{
    npc = WND_1618_Wanderer;
    nr = 2;
    condition = DIA_Wnd_1618_Wanderer_SecondWarn_Condition;
    information = DIA_Wnd_1618_Wanderer_SecondWarn_Info;
    permanent = TRUE;
    important = TRUE;
};


func int DIA_Wnd_1618_Wanderer_SecondWarn_Condition()
{
    if((MIS_ChilledRevenge != LOG_Running) && (self.aivar[AIV_Guardpassage_Status] == GP_FirstWarnGiven) && (self.aivar[AIV_PASSGATE] == FALSE) && (Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == TRUE) && (Npc_GetDistToWP(other,Wnd_1618_Checkpoint) < (other.aivar[AIV_LastDistToWP] - 50)))
    {
        return TRUE;
    };
};

func void DIA_Wnd_1618_Wanderer_SecondWarn_Info()
{
    AI_Output(self,other,"DIA_Wnd_1618_Wanderer_SecondWarn_01_01");    //Ты же не хочешь ЗАСТАВИТЬ меня ударить тебя, правда?
    other.aivar[AIV_LastDistToWP] = Npc_GetDistToWP(other,Wnd_1618_Checkpoint);
    self.aivar[AIV_Guardpassage_Status] = GP_SecondWarnGiven;
    AI_StopProcessInfos(self);
};


instance DIA_Wnd_1618_Wanderer_Attack(C_Info)
{
    npc = WND_1618_Wanderer;
    nr = 3;
    condition = DIA_Wnd_1618_Wanderer_Attack_Condition;
    information = DIA_Wnd_1618_Wanderer_Attack_Info;
    permanent = TRUE;
    important = TRUE;
};


func int DIA_Wnd_1618_Wanderer_Attack_Condition()
{
    if((MIS_ChilledRevenge != LOG_Running) && (self.aivar[AIV_Guardpassage_Status] == GP_SecondWarnGiven) && (self.aivar[AIV_PASSGATE] == FALSE) && (Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == TRUE) && (Npc_GetDistToWP(other,Wnd_1618_Checkpoint) < (other.aivar[AIV_LastDistToWP] - 50)))
    {
        return TRUE;
    };
};

func void DIA_Wnd_1618_Wanderer_Attack_Info()
{
    other.aivar[AIV_LastDistToWP] = 0;
    self.aivar[AIV_Guardpassage_Status] = GP_NONE;
    AI_StopProcessInfos(self);
    B_Attack(self,other,AR_GuardStopsIntruder,1);
};


instance WND_1618_Wanderer_EXIT(C_Info)
{
    npc = WND_1618_Wanderer;
    nr = 999;
    condition = WND_1618_Wanderer_EXIT_Condition;
    information = WND_1618_Wanderer_EXIT_Info;
    permanent = TRUE;
    description = "Конец";
};
 
func int WND_1618_Wanderer_EXIT_Condition()
{
    return TRUE;
};
 
func void WND_1618_Wanderer_EXIT_Info()
{
    AI_StopProcessInfos(self);
};

Дома или прохода? Это разные вещи. Приведённые тобой фрагменты кода относятся к диалогам по защите прохода (стражники на воротах, например). Фактически, это система диалогов, запрещающих ГГ приближаться к определённому вейпоинту, находящемуся позади стражников.

Зашита ДОМА от проникновения туда нежданного гостя в виде ГГ - это область функций ИИ.

Ну, вообще, сейчас именно прохода. Про дом я для общего развития спрашивал, потому что думал, что это схожие функции.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.928
Благодарности
926
Баллы
275
и почему у меня две строчки "Конец":
проверь npctype в инстанцию WND_1618_Wanderer
Пост автоматически объединён:

Не подскажете, почему НПС не переходит в более злым вариантам диалога
из-за условий в кондишион и/или "веса" инстанций. попробуй сделать одну инстанцию и собрать все условия в один общий кондишион, а функции инфо при этом можно использовать разные что бы голова не болела :)

Daedalus:
instance DIA_Wnd_1618_AllWanderer(C_Info)
{
    npc = WND_1618_Wanderer;
    nr = 1;
    condition = DIA_Wnd_1618_AllWanderer_Condition;
    permanent = TRUE;
    important = TRUE;
};


func int DIA_Wnd_1618_AllWanderer_Condition()
{
    if (MIS_ChilledRevenge != LOG_Running)
    && (self.aivar[AIV_PASSGATE] == FALSE)
    && (Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == TRUE)
    {
        if (self.aivar[AIV_Guardpassage_Status] == GP_NONE)
        {
            DIA_Wnd_1618_AllWanderer.information = DIA_Wnd_1618_Wanderer_FirstWarn_Info;
            return TRUE;
        };
        if (Npc_GetDistToWP(other,Wnd_1618_Checkpoint) < (other.aivar[AIV_LastDistToWP] - 50)
        {
            if (self.aivar[AIV_Guardpassage_Status] == GP_FirstWarnGiven)
            {
                DIA_Wnd_1618_AllWanderer.information = DIA_Wnd_1618_Wanderer_SecondWarn_Info;
                return TRUE;
            };
            if (self.aivar[AIV_Guardpassage_Status] == GP_SecondWarnGiven)
            {
                DIA_Wnd_1618_AllWanderer.information = DIA_Wnd_1618_Wanderer_Attack_Info;
                return TRUE;
            };
        };
    };
    return false;
};
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
почему НПС не переходит в более злым вариантам диалога
Работает система диалогов примерно так. Первый диалог происходит, когда ГГ приближается к охраннику на расстояние, немного меньшее, чем дистанция старта диалога (5м). При этом запоминается расстояние между ГГ и некоим вейпоинтом, который является для данного места контрольным. Затем контролируется это расстояние, и, если оно уменьшается на 50+ см, то стартует второй диалог. Расстояние снова запоминается. Далее расстояние опять контролируется, и, если оно уменьшается на 50+ см, то стартует третий диалог, который является стартом атаки.

Работа системы этих диалогов может нарушаться, если контрольный вейпоинт расположен неправильно, относительно прохода и его охранника. Вейпоинт должен располагаться позади охранника, стоящего спиной к проходу, на достаточном удалении (не менее 5м, думаю), желательно, близко к оси симметрии прохода.

две строчки "Конец"
Первая строчка - инстанция диалога, привязанная конкретно к этому неписю. Вторая строчка - от амбиентного диалога, предназначенного для группы неписей, и динамически переназначаемого разным неписям в режиме диалога. Обычно, это дежурные диалоги, одинаковые для множества неписей. Назначаются они, если в параметре npctype прописана принадлежность к амбиентной группе. У владельцев собственных диалогов обычно прописывается npcType_Main или как-то так. На память точно не помню.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
Приветствую всех вновь.
Правильно ли я понимаю, что данный гайд сейчас не актуален?
Хочу прояснить несколько моментов по поводу вставки новых NPC:
- Возможно ли вставить нового NPC на уже существующие вэй-поинты/фри-поинты?
- Если нет, то новые WP/FP обязательно создавать именно в Spacer-е, меняя игровой мир?
 

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.845
Благодарности
1.209
Баллы
380
Правильно ли я понимаю, что данный гайд сейчас не актуален?
Почему не актуален?
- Возможно ли вставить нового NPC на уже существующие вэй-поинты/фри-поинты?
Возможно.
- Если нет, то новые WP/FP обязательно создавать именно в Spacer-е, меняя игровой мир?
Естественно.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.928
Благодарности
926
Баллы
275
Правильно ли я понимаю, что данный гайд сейчас не актуален?
не правильною ты понимаешь. указанный тобой гайд будет актуален всегда ;-)

- Возможно ли вставить нового NPC на уже существующие вэй-поинты/фри-поинты?
возможно. обрати внимание что Пираньи вставляются NPC, у которых есть расписание, в мир на общую точку. например B_Enter_OldWorld.d
Daedalus:
        Wld_InsertNpc        (DJG_705_Angar,         "OC1");
        Wld_InsertNpc        (DJG_708_Kurgan,         "OC1");
        Wld_InsertNpc        (DJG_709_Rethon,         "OC1");
        Wld_InsertNpc        (DJG_710_Kjorn,            "OC1");
        Wld_InsertNpc        (DJG_711_Godar,         "OC1");
        Wld_InsertNpc        (DJG_712_Hokurn,         "OC1");
        Wld_InsertNpc        (DJG_713_Biff,             "OC1");
        Wld_InsertNpc        (DJG_714_Jan,             "OC1");
        Wld_InsertNpc        (DJG_715_Ferros,         "OC1");
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
возможно. обрати внимание что Пираньи вставляются NPC, у которых есть расписание, в мир на общую точку. например B_Enter_OldWorld.d
А что насчёт фри-поинтов? Я пытался вставить NPC-рыбака на вэй-поинт у корабля (NW_CITY_WAY_TO_SHIP_10), добавив просто "рутину стояния", указав тот же вэй-поинт, но он НЕ появился.
Действовал по гайду, прописав вставку NPC через StartUp.d.
 

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.845
Благодарности
1.209
Баллы
380
Я пытался вставить NPC-рыбака на вэй-поинт у корабля (NW_CITY_WAY_TO_SHIP_10), добавив просто "рутину стояния", указав тот же вэй-поинт, но он НЕ появился.
Всегда должен быть написан полный порядок ваших действий и приложен написанный вами код. Экстрасенсов тут нет!
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.928
Благодарности
926
Баллы
275
специальный порядок действий для KirTheSeeker,
1) Прописал НПС. Запустил игру , вставил через консоль. если нпс есть переходим к пункту 2.
2) сделал расписание для НПС, указал расписание в файле инстанции НПС . Запустил игру , вставил через консоль НПС, если нпс выполняет расписание переходим в пункт 3.
3) вставляем НПС через скрипты.

всегда сложную задачу можно разложить на более простые и решить их по отдельности ;-) и это вовсе "не зашквар" :)
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
специальный порядок действий для KirTheSeeker,
1) Прописал НПС. Запустил игру , вставил через консоль. если нпс есть переходим к пункту 2.
Как прописать NPC без расписания? Мне не удаётся:
1.png
 

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.845
Благодарности
1.209
Баллы
380
Ошибка в распорядке дня - не везде Rtn_Start_4305
закомментирован распорядок, я думаю, специально для вопроса к MW 7?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.928
Благодарности
926
Баллы
275
Как прописать NPC без расписания?

закомментируй daily_routine
***

ошибка при компиляции из -за то что ты не поставил в самом конце файле */
Пост автоматически объединён:

4301 это Фарим :) фактически сейчас ты поменял распорядок Фариму, вместо того что бы создать новый распорядок для нового НПС.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
закомментирован распорядок, я думаю, специально для вопроса к MW 7?
Верно.
Пост автоматически объединён:

4301 это Фарим :) фактически сейчас ты поменял распорядок Фариму, вместо того что бы создать новый распорядок для нового НПС.
Я понимаю это. Но не знал, что NPC может функционировать без расписания.
Пост автоматически объединён:

закомментируй daily_routine
Да, это сработало. NPC призывается.
 
Последнее редактирование:

botik

Участник форума
Регистрация
25 Янв 2017
Сообщения
51
Благодарности
15
Баллы
165
Вопросы и предложения по Gothic 3
Можно ли добавить в навык "Быстрое обучения" компенсацию очков обучения.К примеру можно изучить этот навык на 40 уровне и сразу получить компенсацию +40 очков обучения (тот бонус который мог бы получить к 40 уровню изучив его на первом уровне 400 против 440) .Это позволит брать этот навык на любом уровне и не бегать в начале игры по всей карте в поисках древних табличек.

Изменение в боевой системе.

Если взять оружие дальнего боя или магию то при повороте камеры мышкой персонаж поворачивается но очень медленно.Можно ли как-то этот процесс ускорить и сделать жесткую привязку камеры ? Но это не работает если в руках оружия ближнего боя. Можно ли обмануть игру и сделать чтобы оружие ближнего боя воспринималось как оружие дальнего боя или как магия ? И по возможности убрать шаг вперед при атаке.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.928
Благодарности
926
Баллы
275
Да, это сработало. NPC призывается.
прекрасно. заодно проверь соответствует ли новый НПС твои требованиям: правильно ли он дерётся, правильный ли у него лут, диалоги и так далее.

***

Теперь можно перейти к следующему шагу: расписание раскомментировать и поменять название с Rtn_start_4301 на Rtn_start_4305
 

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
ошибка при компиляции из -за то что ты не поставил в самом конце файле */
Да, но не "в самом конце". В самом конце должна быть ПУСТАЯ и не закомментированная строка.
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
228
Благодарности
29
Баллы
190
Подскажите, пожалуйста, реально вообще собрать новую модель брони из кусков дефолтной?
Дело было так:
Я решил сделать своих странников стилистике шотландских горцев (ну, ребята с килтами)
надеюсь у готоманов Старого лагеря не случится инфаркт от этих слов
1. Я взял две модели Одежду послушника и одежду крестьянина.
2. Открыл файл с одеждой послушника, конвертировал все в Editable Mesh.
3. С одежды послушника удалил всю верхнюю часть (все кроме юбки и ног) и сохранил как MAXовский файл.
4. Открыл файл с Одеждой крестьянина, конвертировал все в Editable Mesh и удалил ему ноги. (получается скелет из файла с одеждой крестьянина).
5. Закинул к нему юбку послушника.
6. Приатачил юбку послушника к торсу крестьянина.
7. Привязал доспех к скелету (зеленой привязкой).
8. Текстуры не трогал (в надежде, что игра подхватит текстуры дефолтные для начала, и еще не хотел связваться с текстурами NAKED_BODY).

По итогу в игре отображается только торс крестьянина с текстурами послушника.
Возможно я теперь знаю, как сделать вс*атого призрака, но я не этого хотел. :oops:
Плиз помогите знающие люди, как это победить?
 
Сверху Снизу