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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

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

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

Стражник

Участник форума
Регистрация
14 Фев 2009
Сообщения
675
Благодарности
101
Баллы
220
А вот выбор оружия по ходу боя определяется в функции B_SelectWeapon.

Болты в инвентарь добавил, силы на арбалет хватает и НПС им экипирован.

Что нужно изменить в B_SelectWeapon?
Не совсем понятно что там править а косяк в этом файле может потом серьезно аукнуться в дальнейшем.

В файле Focus дистанция для стрелкового оружия вроде превышает дистанцию холодного оружия.

Нужно ли что добавлять самому НПС. Пытаюсь разобраться в оригинальной Г2 НВ немного меняя его.
Нужно чтобы НПС вначале использовали стрелковое оружие а при приближении врага уже оружие ближнего боя. Сейчас НПС видят меня на большой дистанции и бегут к ГГ с мечами.


Снизу содержимое этого файла.

func void B_SelectWeapon(var C_Npc slf,var C_Npc oth)
{
if(C_BodyStateContains(slf,BS_FALL) || C_BodyStateContains(slf,BS_SWIM) || C_BodyStateContains(slf,BS_DIVE))
{
return;
};
if(B_SelectSpell(slf,oth))
{
return;
};
if(Npc_IsInFightMode(slf,FMODE_MAGIC))
{
if(!Npc_IsInFightMode(slf,FMODE_NONE))
{
AI_RemoveWeapon(slf);
};
AI_ReadyMeleeWeapon(slf);
return;
};
if(Npc_IsInFightMode(slf,FMODE_FAR))
{
if((Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) || !Npc_HasEquippedMeleeWeapon(slf))
{
return;
};
};
if(Npc_IsInFightMode(slf,FMODE_MELEE))
{
if((Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER) || !Npc_HasEquippedRangedWeapon(slf))
{
return;
};
};
if(Npc_HasEquippedMeleeWeapon(slf) && (Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER))
{
if(!Npc_IsInFightMode(slf,FMODE_NONE))
{
AI_RemoveWeapon(slf);
};
AI_ReadyMeleeWeapon(slf);
return;
};
if(Npc_HasEquippedRangedWeapon(slf) && (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) && C_NpcHasAttackReasonToKill(slf))
{
if(!Npc_IsInFightMode(slf,FMODE_NONE))
{
AI_RemoveWeapon(slf);
};
AI_ReadyRangedWeapon(slf);
return;
};
if(Npc_IsInFightMode(slf,FMODE_NONE))
{
if(Npc_HasEquippedMeleeWeapon(slf))
{
AI_ReadyMeleeWeapon(slf);
return;
};
if(Npc_HasEquippedRangedWeapon(slf))
{
AI_ReadyRangedWeapon(slf);
return;
};
AI_ReadyMeleeWeapon(slf);
return;
};
};
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.641
Баллы
625
А где находится сам непись, если он где-то находится?
он удаляется из активного списка неписей, но продолжает существовать в мире. смотри наглядно

UPD: В примере нпс никак не связан с текущем миром. ни вейпоинтами, ни фрипоинтами.
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.411
Благодарности
3.242
Баллы
525
Что нужно изменить в B_SelectWeapon?
Ничего не нужно изменять. Если ты, конечно, не планируешь заняться правками ИИ. Но в этой функции можно посмотреть, от чего зависит выбор того или иного вида оружия.

Загляни в спойлер. Там эта функция с комментариями.
Код:
func void B_SelectWeapon(var C_Npc slf,var C_Npc oth)
{
   // Непись падает, плывёт или ныряет -> выход из функции. Смены оружия или его выбора не происходит.
   if(C_BodyStateContains(slf,BS_FALL) || C_BodyStateContains(slf,BS_SWIM) || C_BodyStateContains(slf,BS_DIVE))
   {
     return;
   };
  
   // Непись экипировался активным заклинанием -> выход из функции.
   if(B_SelectSpell(slf,oth))
   {
     return;
   };
  
   // Непись в режиме магического боя
   if(Npc_IsInFightMode(slf,FMODE_MAGIC))
   {
     if(!Npc_IsInFightMode(slf,FMODE_NONE))
     {
       AI_RemoveWeapon(slf); // Убирание оружия/заклинания.
     };
     AI_ReadyMeleeWeapon(slf); // Вытаскивание оружия ближнего боя.
     return;
   };
  
   // Непись в режиме дальнего боя.
   if(Npc_IsInFightMode(slf,FMODE_FAR))
   {
     // Дистанция больше 9м или у непися нет экипированного оружия ближнего боя -> выход из функции. Смены оружия не происходит.
     if((Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) || !Npc_HasEquippedMeleeWeapon(slf))
     {
       return;
     };
   };
  
   // Непись в режиме ближнего боя.
   if(Npc_IsInFightMode(slf,FMODE_MELEE))
   {
     // Дистанция меньше 10м, или у непися нет экипированного оружия дальнего боя -> выход из функции. Смены оружия не происходит.
     if((Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER) || !Npc_HasEquippedRangedWeapon(slf))
     {
       return;
     };
   };
  
   // Дистанция меньше 10м, и у непися есть экипированное оружие ближнего боя.
   if(Npc_HasEquippedMeleeWeapon(slf) && (Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER))
   {
     if(!Npc_IsInFightMode(slf,FMODE_NONE))
     {
       AI_RemoveWeapon(slf); // Убирание оружия/заклинания.
     };
     AI_ReadyMeleeWeapon(slf); // Вытаскивание оружия ближнего боя.
     return;
   };
  
   // Дистанция больше 9м, и у непися есть экипированное оружие дальнего боя, и непись ГОТОВ УБИТЬ противника.
   if(Npc_HasEquippedRangedWeapon(slf) && (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) && C_NpcHasAttackReasonToKill(slf))
   {
     if(!Npc_IsInFightMode(slf,FMODE_NONE))
     {
       AI_RemoveWeapon(slf); // Убирание оружия/заклинания.
     };
     AI_ReadyRangedWeapon(slf); // Вытаскивание оружия дальнего боя.
     return;
   };
  
   // Не понятно, в каком боевом режиме непись.
   if(Npc_IsInFightMode(slf,FMODE_NONE))
   {
    
     //Есть экипированное оружие ближнего боя
     if(Npc_HasEquippedMeleeWeapon(slf))
     {
       AI_ReadyMeleeWeapon(slf); // Вытаскивание оружия ближнего боя.
       return;
     };
    
     //Есть экипированное оружие дальнего боя
     if(Npc_HasEquippedRangedWeapon(slf))
     {
       AI_ReadyRangedWeapon(slf); // Вытаскивание оружия дальнего боя.
       return;
     };
    
     // Ничего нет -> вытаскивание оружия ближнего боя, в данном случае - переход в режим кулачного боя.
     AI_ReadyMeleeWeapon(slf);
     return;
   };
};
 

Стражник

Участник форума
Регистрация
14 Фев 2009
Сообщения
675
Благодарности
101
Баллы
220
Ничего не нужно изменять. Если ты, конечно, не планируешь заняться правками ИИ. Но в этой функции можно посмотреть, от чего зависит выбор того или иного вида оружия.

Вернусь к этому чуть позже. Сейчас хочу немного поработать с торговцами.

Создал торговца и прописал его в необходимых файлах.

Проблема в том, что у торговца нет прописанного ассортимента. Сам ассортимент товара является случайным - в основном это трава, рыба, хлеб и тд.
При этом в торговле присутствуют только 3 дешевых товара меняющихся с новой игрой + 1 аквамарин прописанный в инвентаре самого НПС.

Возможно в ассортимент торговца попадают предметы из его инвентаря. Хотя кроме аквамарина все остальное выпадает случайным образом при новой игре.
 
Последнее редактирование:

Gimli

Участник форума
Регистрация
5 Ноя 2016
Сообщения
10
Благодарности
0
Баллы
160
где найти файлы для декомпеляции моделей формата(mdl, mds, mmb, msb )?
 

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.119
Благодарности
584
Баллы
350
Вернусь к этому чуть позже. Сейчас хочу немного поработать с торговцами.

Создал торговца и прописал его в необходимых файлах.

Проблема в том, что у торговца нет прописанного ассортимента. Сам ассортимент товара является случайным - в основном это трава, рыба, хлеб и тд.
При этом в торговле присутствуют только 3 дешевых товара меняющихся с новой игрой + 1 аквамарин прописанный в инвентаре самого НПС.

Возможно в ассортимент торговца попадают предметы из его инвентаря. Хотя кроме аквамарина все остальное выпадает случайным образом при новой игре.

Инвентарь у торговца вызывается функцией "B_GiveTradeInv(self);" из диалога, а функция в свою очередь вызывает файл который лежит по пути Story/B_GiveTradeInv
Пример Орлан
func void B_GiveTradeInv_Orlan(var C_Npc slf)
{
if((Kapitel >= 1) && (Orlan_ItemsGiven_Chapter_1 == FALSE))
{
CreateInvItems(slf,ItMi_Gold,30);
CreateInvItems(slf,ItRw_Arrow,21);
CreateInvItems(slf,ItRw_Bolt,5);
CreateInvItems(slf,ItFo_Water,4);
CreateInvItems(slf,ItFo_Beer,10);
CreateInvItems(slf,ItFo_Bread,4);
CreateInvItems(slf,ItFo_Milk,4);
CreateInvItems(slf,ItFo_Wine,2);
CreateInvItems(slf,ItFo_Bacon,2);
CreateInvItems(slf,ItLsTorch,3);
CreateInvItems(slf,ItMw_Zweihaender1,1);
CreateInvItems(slf,ItMw_Bartaxt,1);
CreateInvItems(slf,ItMw_Orkschlaechter,1);
CreateInvItems(slf,ItMw_Schlachtaxt,1);
CreateInvItems(slf,ItMw_Barbarenstreitaxt,1);
CreateInvItems(slf,ItRw_Bow_L_01,1);
CreateInvItems(slf,ItBE_Addon_Leather_01,1);
CreateInvItems(slf,ItRi_Prot_Mage_02,1);
Orlan_ItemsGiven_Chapter_1 = TRUE;
};
if((Kapitel >= 2) && (Orlan_ItemsGiven_Chapter_2 == FALSE))
{
CreateInvItems(slf,ItMi_Gold,50);
CreateInvItems(slf,ItRw_Arrow,40);
CreateInvItems(slf,ItRw_Bolt,45);
CreateInvItems(slf,ItBe_Addon_DEX_5,1);
Orlan_ItemsGiven_Chapter_2 = TRUE;
};
if((Kapitel >= 3) && (Orlan_ItemsGiven_Chapter_3 == FALSE))
{
CreateInvItems(slf,ItMi_Gold,100);
CreateInvItems(slf,ItRw_Arrow,120);
CreateInvItems(slf,ItRw_Bolt,115);
CreateInvItems(slf,ItBe_Addon_Prot_EdgPoi,1);
Orlan_ItemsGiven_Chapter_3 = TRUE;
};
if((Kapitel >= 4) && (Orlan_ItemsGiven_Chapter_4 == FALSE))
{
CreateInvItems(slf,ItMi_Gold,200);
CreateInvItems(slf,ItMw_Zweihaender1,1);
CreateInvItems(slf,ItMw_Bartaxt,1);
Orlan_ItemsGiven_Chapter_4 = TRUE;
};
if((Kapitel >= 5) && (Orlan_ItemsGiven_Chapter_5 == FALSE))
{
CreateInvItems(slf,ItMi_Gold,300);
CreateInvItems(slf,ItRw_Arrow,120);
CreateInvItems(slf,ItRw_Bolt,115);
Orlan_ItemsGiven_Chapter_5 = TRUE;
};
};
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.411
Благодарности
3.242
Баллы
525
где найти файлы для декомпеляции моделей формата(mdl, mds, mmb, msb )?
anims.VDF

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.641
Баллы
625
можно встретить не только в конечных точках маршрута
в плане? AI подставляет дислокацию ближайшего распорядка и кидает туда непися. так что вне зоны доступа он так и остается кирпичом без интеллекта.

давай смоделируем ситуацию.
стражник идет от точки А в точку Б. при этом Точку Б мы прекрасно видим и она УЖЕ считается активной. и в момент выхода нпс из фокуса (допустим мы его обогнали) с рабочей точкой назначения, он в нее уже никогда не попадет без обновления условий распорядков.
это указывает на то, что за весь интеллект в игре завязан на ребуте рутин для выведения персонажей из слипмода..
как мы помним, слипмод определяет наличие нпс в активном списке мира, а из него как раз и происходит вся движуха с циклометодами поведений
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.411
Благодарности
3.242
Баллы
525
в плане? AI подставляет дислокацию ближайшего распорядка и кидает туда непися. так что вне зоны доступа он так и остается кирпичом без интеллекта.
Поясню на конкретном примере. Упомянутые выше Стражи. С 6-00 до 14-00 им предписывается болтать около лаборатории в Болотном Лагере, а с 14-00 до 6-00 - около Старой Шахты. Спим в хижине под лабораторией до утра (8-00), смотрим, на месте их нет, а по времени уже должны бы быть. Бежим навстречу им по дороге к Старому Лагерю. Встречаем их ближе к лесу на расстоянии почти 300м от точки выполнения распорядка идущими на своё место. Ещё раз спим до утра, подходим к точке выполнения их распорядка. В консоли выставляем время 8-30 - Стражей нет. 8-45 - нет. 8-55 - они приходят на своё место.

Могу ошибаться, но это похоже на то, как будто бы движок просчитывает примерное их положение на пути от СШ к БЛ, даже если сами неписи при этом находятся в спящем состоянии.

С другой стороны, если в начале игры побежать впереди Диего к Старому Лагерю, то, прибежав на место, можно увидеть Диего, сидящим на лавке около своей хижины. Когда только успел?
 
Последнее редактирование:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.641
Баллы
625
не, читать что они делают я щас не в состоянии.. дай мне проект свой с этими распорядками
 

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
Поясню на конкретном примере. Упомянутые выше Стражи. С 6-00 до 14-00 им предписывается болтать около лаборатории в Болотном Лагере, а с 14-00 до 6-00 - около Старой Шахты. Спим в хижине под лабораторией до утра (8-00), смотрим, на месте их нет, а по времени уже должны бы быть. Бежим навстречу им по дороге к Старому Лагерю. Встречаем их ближе к лесу на расстоянии почти 300м от точки выполнения распорядка идущими на своё место. Ещё раз спим до утра, подходим к точке выполнения их распорядка. В консоли выставляем время 8-30 - Стражей нет. 8-45 - нет. 8-55 - они приходят на своё место.

Могу ошибаться, но это похоже на то, как будто бы движок просчитывает примерное их положение на пути от СШ к БЛ, даже если сами неписи при этом находятся в спящем состоянии.

С другой стороны, если в начале игры побежать впереди Диего к Старому Лагерю, то, прибежав на место, можно увидеть Диего, сидящим на лавке около своей хижины. Когда только успел?

А что собственно ты хочешь изменить тут?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.411
Благодарности
3.242
Баллы
525
Со Стражами изменения не нужны. Но если когда-нибудь дело дойдёт до организации караванов между СЛ и СШ, то хотелось бы понимать, как работает двиг в этом плане. А вот ситуацию с телепортирующимися неписями, опережающими бегущего ГГ, хотелось бы как-то поправить. Если это возможно, конечно.
 

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
Со Стражами изменения не нужны. Но если когда-нибудь дело дойдёт до организации караванов между СЛ и СШ, то хотелось бы понимать, как работает двиг в этом плане. А вот ситуацию с телепортирующимися неписями, опережающими бегущего ГГ, хотелось бы как-то поправить. Если это возможно, конечно.

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

Кстати в г2 с последними СП неписи ходят примерно также как и в г1. То есть я могу их встретить по дороге. Другое дело что эти неписи начинают забирать опыт у игрока убивая монстров или умирают сами. Игрокам это есно не по душе... Раньше такая фишка была только в г1.
 

Стражник

Участник форума
Регистрация
14 Фев 2009
Сообщения
675
Благодарности
101
Баллы
220
Инвентарь у торговца вызывается функцией "B_GiveTradeInv(self);" из диалога, а функция в свою очередь вызывает файл который лежит по пути Story/B_GiveTradeInv
Пример Орлан

Упустил из виду прописку в диалогах B_LogEntry(TOPIC_CityTrader,LogText где нужно было прописать что НПС ведет определенный род деятельности. Все заработало.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.641
Баллы
625
тразик, знаешь что бывает при разглашении военных тайн? ::)
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.641
Баллы
625
Со Стражами изменения не нужны. Но если когда-нибудь дело дойдёт до организации караванов между СЛ и СШ, то хотелось бы понимать, как работает двиг в этом плане. А вот ситуацию с телепортирующимися неписями, опережающими бегущего ГГ, хотелось бы как-то поправить. Если это возможно, конечно.
ну смотри. можно создать пассивное хранилище с неактивными неписями и загружать их обратно при прямой видимости.
помимо этого прикрутить обработчик перемещений, чтобы нпс с рутиной передвижения от точки к точке был в состоянии ходить по вайнетам.
и еще я бы не усыплял болванов пока те в режиме драки (либо пока все конфликтующие стороны не будут вне зоны доступа)..
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.411
Благодарности
3.242
Баллы
525
Представь себе что ты меняешь рутину НПС, где вейпоинт самой рутины находится хер знает где + не связан с общей сеткой.
Я говорил об исправлении ситуации средствами скриптера, а скриптер должен отдавать себе отчёт, что и как устроено в игровом мире. Таких эпизодов в игре, когда непись "обгоняет" игрока, немного, и по каждому из них неплохо бы придумать механизм обхода. А для этого нужно представлять, как работает двиг, как скриптер может использовать его особенности.
 
Сверху Снизу