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

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

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

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.942
Благодарности
1.470
Баллы
465
Если в скрипте нпс есть строка
Код:
aivar[AIV_DropDeadAndKill] = TRUE;
то проигравший (будь то нпс или игрок) сразу погибает.
 

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
По умолчанию - если гильдии враждебные, то противник умирает, а если нейтральные или дружественные - то уходит в нокаут. Добивать после нокаута или нет, зависит от причины атаки.

Если переменная AIV_DropDeadAndKill установлена TRUE, то сам NPC будет умирать вне зависимости от гильдии противника. Если противник ушел в нокаут, то NPC его добьет независимо от причины атаки.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Ну а непосредственно за убиение или нокаут в Г2 отвечает функция AI\Human\C_Human\C_DropUnconscious.d
Вроде правильно прокомментировал, но с Равеном че-то непонятно...
Daedalus:
// **************************************************************

// C_DropUnconscious

// -----------------

// self und other hier vom Programm initialisiert:
// self и other инициализированные здесь

// self ist immer der NPC, fьr den diese Funktion den Check macht
// self (получает удар) - всегда является NPC, для которого эта функция проверяет

// other ist immer der Tдter (der den Treffer gelandet hat)
// other (наносит удар) - всегда тот кто нанес удар

// **************************************************************

func int C_DropUnconscious()

{
   //if (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Raven))
   //|| (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(Raven))
   //{
   //   return TRUE;
   //};

   // ------ Folgende NSCs tцten immer ------ //Следующие NPC всегда убивают
   if (other.guild > GIL_SEPERATOR_HUM) //Если НЕ относится к гильдии людей
   || (other.guild == GIL_DMT) //Если ищущий или черный маг
   || (other.guild == GIL_BDT) //Если бандит
   || (other.aivar[AIV_DropDeadAndKill] == TRUE) //Если имеет флаг AIV_DropDeadAndKill
   {
     return FALSE; //Выход из функции с убийством
   };

   // ------ nur echte Humans kцnnen Unconscious werden ------ //Относящиеся к Humans (люди) отправляются в нокаут

   if (self.guild < GIL_SEPERATOR_HUM) //Если гильдия относится к людям
   {
     if (self.guild != GIL_DMT) //Если не ищущий или черный маг
     && (self.guild != GIL_BDT) //Если не бандит
     && (self.aivar[AIV_DropDeadAndKill] == FALSE) //Если не имеет флага AIV_DropDeadAndKill
     {
       return TRUE; //Выход из функции с нокаутом
     };
   };
   return FALSE; //Выход из функции с убийством
};
 
Последнее редактирование:

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.191
Благодарности
3.376
Баллы
485
Если переменная AIV_DropDeadAndKill установлена TRUE, то сам NPC будет умирать вне зависимости от гильдии противника. Если противник ушел в нокаут, то NPC его добьет независимо от причины атаки.

Такой переменной нет в Г1, так что попробовала добавить самостоятельно, получилось вот так:
func void zs_unconscious()
{
if(self.aivar[AIV_DropDeadAndKill] == TRUE)
{
b_killnpc(self);
return;
}
else
{
*весь оригинальный код*
Таким образом, перед отправкой противника в нокаут у него проверяется переменная aivar: если есть DropDeadAndKill, то он сразу умирает, а если нету - то выполняется стандартный сценарий нокаута.
Или для Г1 есть более простые решения?)
 

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.227
Благодарности
1.910
Баллы
370
Такой переменной нет в Г1, так что попробовала добавить самостоятельно, получилось вот так:
func void zs_unconscious()
{
if(self.aivar[AIV_DropDeadAndKill] == TRUE)
{
b_killnpc(self);
return;
}
else
{
*весь оригинальный код*
Таким образом, перед отправкой противника в нокаут у него проверяется переменная aivar: если есть DropDeadAndKill, то он сразу умирает, а если нету - то выполняется стандартный сценарий нокаута.
Или для Г1 есть более простые решения?)
Легче сменить гильдию во время диалога на враждебную, или изначально сделать нпс с враждебной гильдией. Например поставил нпс гильдию орк, и он сразу убивается.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Например поставил нпс гильдию орк, и он сразу убивается.
Не рекомендую так делать. Орочьи гильдии имеют ограничения в движке, а то, что непись после диалога будет обязательно убит - не факт. Это решение представляет из себя потенциальный глюкодром.
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.191
Благодарности
3.376
Баллы
485
Таким образом, перед отправкой противника в нокаут у него проверяется переменная aivar: если есть DropDeadAndKill, то он сразу умирает, а если нету - то выполняется стандартный сценарий нокаута.

Более подробное тестирование показало ужасные вещи: некоторые нпц с этим aivar погибают сразу, а другие уходят в нокаут, лежат 20 секунд, встают и... падают замертво. Иногда по-разному себя ведут даже одни и те же нпц при загрузках сохранения. В чем ошибка?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
лежат 20 секунд, встают и... падают замертво
Это происходит потому, что движок не всегда корректно переводит непися в состояние смерти из бессознательного состояния. Иногда происходят глюки, например, добитый непись или ГГ продолжает дышать и периодически пытается подняться. Попробуй сделать так:
Код:
func void ZS_Unconscious()
{
   if(self.aivar[AIV_DropDeadAndKill])
   {
     Npc_ChangeAttribute(self,ATR_HITPOINTS,-1);
     AI_StartState(self,ZS_Dead,0,"");
     return;
   };
  ...
};
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.191
Благодарности
3.376
Баллы
485
Это происходит потому, что движок не всегда корректно переводит непися в состояние смерти из бессознательного состояния. Иногда происходят глюки, например, добитый непись или ГГ продолжает дышать и периодически пытается подняться. Попробуй сделать так:
Не работает, к сожалению. Непись всё равно погибает "технически", но уходит в состояние нокаута, добить его нельзя, а AI_StartState(self,ZS_Dead,0,"") не позволяет ему встать. Будет бесконечно лежать и держаться за живот. Если убрать AI_StartState, то он встанет через 20 секунд, проиграет анимацию смерти и умрет "по-настоящему". Нужно чтобы скрипт отправки в бессознательное состояние не выполнялся совсем...
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Будет бесконечно лежать и держаться за живот.
Будет просто лежать, не шевелясь? И не устраивает именно то, что поза не совсем такая, как при "правильной" смерти? Если да, то, в теории, можно соорудить мини-оверлей, подменяющий анимации перехода в состояние отключки и нахождения в нём. Анимации будут выглядеть также, как будто непись действительно упал замертво, а не потерял сознание. Этот мини-оверлей нужно будет назначить неписям в их инстанциях.
 

alex_draven


Модостроитель
Регистрация
13 Сен 2007
Сообщения
2.183
Благодарности
2.880
Баллы
420
Он шевелится и дышит
Вы Готику 1 ковыряете? В ней есть ошибка движка, при которой некорректно обрабатывается переход в состояние смерти, если герой был в нокауте на животе. Будет исправлено в системпак следующей ревизии.
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.191
Благодарности
3.376
Баллы
485
Вы Готику 1 ковыряете? В ней есть ошибка движка, при которой некорректно обрабатывается переход в состояние смерти, если герой был в нокауте на животе. Будет исправлено в системпак следующей ревизии.
Да, первую. Окей, будем ждать.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Окей, будем ждать.
А пока, в качестве костыля, можно попробовать этот оверлей (положить в папку Data или распаковать и упаковать в свой проект). В инстанции непися, убиваемого сразу, нужно прописать:
Код:
Mdl_ApplyOverlayMds(self,"Humans_NonUnconscious.mds");
В состоянии ZS_Unconscious - то, что советовал раньше:
Код:
func void ZS_Unconscious()
{
      if(self.aivar[AIV_DropDeadAndKill])
      {
           Npc_ChangeAttribute(self,ATR_HITPOINTS,-1);
           AI_StartState(self,ZS_Dead,0,"");
           return;
      };
      ...
};

Из замеченных недостатков: начисление опыта (вывод надписи на экран) происходит по окончанию выполнения анимации падения.

некорректно обрабатывается переход в состояние смерти, если герой был в нокауте на животе

К сожалению, не только этот случай обрабатывается с ошибкой. При добивании ГГ, находящегося в положении "на спине", тоже далеко не всегда правильно работают переходные анимации.
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.191
Благодарности
3.376
Баллы
485
А пока, в качестве костыля, можно попробовать этот оверлей (положить в папку Data или распаковать и упаковать в свой проект). В инстанции непися, убиваемого сразу, нужно прописать:
Спасибо, но не совсем подходит мне по нескольким причинам. Буду ждать SP 1.2)
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.191
Благодарности
3.376
Баллы
485
Ситуация: во время диалога нпц меняет свой внешний вид командой Mdl_SetVisualBody. Как сделать так, чтобы новая внешность оставалась при загрузке сохранения, а не возвращалась к исходной?

Вторая проблема: внешность меняется сразу с началом диалога, а не после необходимой реплики.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Как сделать так, чтобы новая внешность оставалась при загрузке сохранения, а не возвращалась к исходной?
Пример со сменой имени персонажа:
Вопросы по скриптингу

Вторая проблема: внешность меняется сразу с началом диалога, а не после необходимой реплики.
Ещё один подходящий пример:
Не стесняюсь спросить....
 

Ласковый Мороз

Участник форума
Регистрация
21 Апр 2010
Сообщения
91
Благодарности
3
Баллы
155
Давненько не заходил сюда! Аж ух...

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

Ласковый Мороз

Участник форума
Регистрация
21 Апр 2010
Сообщения
91
Благодарности
3
Баллы
155
Сверху Снизу