// **************************************************************
// 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; //Выход из функции с убийством
};
Если переменная AIV_DropDeadAndKill установлена TRUE, то сам NPC будет умирать вне зависимости от гильдии противника. Если противник ушел в нокаут, то NPC его добьет независимо от причины атаки.
Легче сменить гильдию во время диалога на враждебную, или изначально сделать нпс с враждебной гильдией. Например поставил нпс гильдию орк, и он сразу убивается.Такой переменной нет в Г1, так что попробовала добавить самостоятельно, получилось вот так:
Таким образом, перед отправкой противника в нокаут у него проверяется переменная aivar: если есть DropDeadAndKill, то он сразу умирает, а если нету - то выполняется стандартный сценарий нокаута.func void zs_unconscious()
{
if(self.aivar[AIV_DropDeadAndKill] == TRUE)
{
b_killnpc(self);
return;
}
else
{
*весь оригинальный код*
Или для Г1 есть более простые решения?)
Не рекомендую так делать. Орочьи гильдии имеют ограничения в движке, а то, что непись после диалога будет обязательно убит - не факт. Это решение представляет из себя потенциальный глюкодром.Например поставил нпс гильдию орк, и он сразу убивается.
Таким образом, перед отправкой противника в нокаут у него проверяется переменная aivar: если есть DropDeadAndKill, то он сразу умирает, а если нету - то выполняется стандартный сценарий нокаута.
Это происходит потому, что движок не всегда корректно переводит непися в состояние смерти из бессознательного состояния. Иногда происходят глюки, например, добитый непись или ГГ продолжает дышать и периодически пытается подняться. Попробуй сделать так:лежат 20 секунд, встают и... падают замертво
func void ZS_Unconscious()
{
if(self.aivar[AIV_DropDeadAndKill])
{
Npc_ChangeAttribute(self,ATR_HITPOINTS,-1);
AI_StartState(self,ZS_Dead,0,"");
return;
};
...
};
Не работает, к сожалению. Непись всё равно погибает "технически", но уходит в состояние нокаута, добить его нельзя, а AI_StartState(self,ZS_Dead,0,"") не позволяет ему встать. Будет бесконечно лежать и держаться за живот. Если убрать AI_StartState, то он встанет через 20 секунд, проиграет анимацию смерти и умрет "по-настоящему". Нужно чтобы скрипт отправки в бессознательное состояние не выполнялся совсем...Это происходит потому, что движок не всегда корректно переводит непися в состояние смерти из бессознательного состояния. Иногда происходят глюки, например, добитый непись или ГГ продолжает дышать и периодически пытается подняться. Попробуй сделать так:
Будет просто лежать, не шевелясь? И не устраивает именно то, что поза не совсем такая, как при "правильной" смерти? Если да, то, в теории, можно соорудить мини-оверлей, подменяющий анимации перехода в состояние отключки и нахождения в нём. Анимации будут выглядеть также, как будто непись действительно упал замертво, а не потерял сознание. Этот мини-оверлей нужно будет назначить неписям в их инстанциях.Будет бесконечно лежать и держаться за живот.
Он шевелится и дышитБудет просто лежать, не шевелясь? И не устраивает именно то, что поза не совсем такая, как при "правильной" смерти?
Вы Готику 1 ковыряете? В ней есть ошибка движка, при которой некорректно обрабатывается переход в состояние смерти, если герой был в нокауте на животе. Будет исправлено в системпак следующей ревизии.Он шевелится и дышит
Да, первую. Окей, будем ждать.Вы Готику 1 ковыряете? В ней есть ошибка движка, при которой некорректно обрабатывается переход в состояние смерти, если герой был в нокауте на животе. Будет исправлено в системпак следующей ревизии.
А пока, в качестве костыля, можно попробовать этот оверлей (положить в папку Data или распаковать и упаковать в свой проект). В инстанции непися, убиваемого сразу, нужно прописать:Окей, будем ждать.
Mdl_ApplyOverlayMds(self,"Humans_NonUnconscious.mds");
func void ZS_Unconscious()
{
if(self.aivar[AIV_DropDeadAndKill])
{
Npc_ChangeAttribute(self,ATR_HITPOINTS,-1);
AI_StartState(self,ZS_Dead,0,"");
return;
};
...
};
некорректно обрабатывается переход в состояние смерти, если герой был в нокауте на животе
Спасибо, но не совсем подходит мне по нескольким причинам. Буду ждать SP 1.2)А пока, в качестве костыля, можно попробовать этот оверлей (положить в папку Data или распаковать и упаковать в свой проект). В инстанции непися, убиваемого сразу, нужно прописать:
Пример со сменой имени персонажа:Как сделать так, чтобы новая внешность оставалась при загрузке сохранения, а не возвращалась к исходной?
Ещё один подходящий пример:Вторая проблема: внешность меняется сразу с началом диалога, а не после необходимой реплики.
Ну прям как в воду глядел! Почему-то в мане не заметил такого. Спасибо, добр ччеловекА ты файл ou.bin вставляешь в директорию Gothic II\_work\Data\Scripts\Content\Cutscene ?