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

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

Готика 2: НВ Out Of My Way

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
  • Первое сообщение
  • #1
редакция от 1 марта 2023 года.
один архув с аудио репликами и субтитрами. второй архив со скриптами. два архива лишние, удалить не смог. у правильного архива в название указано "оно"
***
настройки восприятия можно изменить в файле gothic.ini. параметры по умолчанию
DIST_MoveNpc=300
DIST_PERC_MOVENPC=100
***
  • реплики собраны в посте #3 топика Готика 2: НВ - Out Of My Way
  • Сердце "проекта", цикл ZS_MoveNpcWait в посте #4 Готика 2: НВ - Out Of My Way
  • C_AmIFRIENDLY - у героя есть «друзья». Какие то есть изначально, какие то появляются по сюжету, какие то в рамках фракционных отношений. Друзья не бьют героя и не хомят ему на ровном месте. Друзья говорят «Привет друг». пост про друзей #5 Готика 2: НВ - Out Of My Way
  • C_AmIStronger - если НПС не друг героя и достаточно крепок, то он будет угрожать герою. Проверка на то крут НПС или нет в посте #6 Готика 2: НВ - Out Of My Way
 

Вложения

  • 2023_01_03_G2_OUTOFMYWAY_RU_SPEECH.zip
    1,7 MB · Просмотры: 15
  • оно_2023_01_03_G2_OUTOFMYWAY_scripts.zip
    9,9 KB · Просмотры: 15
  • 2023_03_10_G2_OUTOFMYWAY_scripts.zip
    10,7 KB · Просмотры: 9
  • 2023_03_13_G2_OUTOFMYWAY_scripts.zip
    10,9 KB · Просмотры: 10
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.862
Благодарности
6.742
Баллы
1.625
Пока оптимально подобрал для себя
INI:
[ZB_MOVENPCWAIT]
DIST_MoveNpc=250
DIST_PERC_MOVENPC=100
Если по дефолту 400/300 - это большие расстояния...
Сегодняшние тесты были, когда ГГ преступник в городе, непись - мент.
Завтра буду с остальными тестировать.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
Завтра буду с остальными тестировать.
там у ментов / палов / послушников / магов - условия одинаковые. можно проверить миненталь,я вчера пробовал на версии D36 всё работало.

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

Паладинам и ОнД возможно тоже стоит игнорировать оружие героя , так как у нихи доспехи крепкие :)
INI:
DIST_PERC_MOVENPC=100
100 стоит в скриптах MDK G2 ;-)
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.862
Благодарности
6.742
Баллы
1.625
И так очередной тест.
Проверил все гильдии, в разных моментах. Разными гильдиями ГГ, в разных главах, воровство, убийство, разные локации, и прочее.
Все хорошо, все замечательно, кроме бандитов.
Для бандитов пришлось изменить B_MoveNpc вот так:
Daedalus:
func void B_MoveNpc ()
{
    //if (Npc_IsInState (self,ZS_MoveNpcFriendlyWait)) { return; };
    if (Npc_IsInState (self,ZS_MoveNpcWait))         { return; };

 
    if (other.aivar[AIV_INVINCIBLE] == true)  // keine Reaktion, wenn der Blockierer gerade im Dialog ist
    {  
        return;
    };
 


 

    if ((Npc_GetAttitude (self, other) == ATT_HOSTILE) && (self.guild != GIL_BDT))
    {
    //-------- Blockierender ist feindlich! --------
        B_AssessEnemy    ();
        return;
    };
// Ну и дальше по тексту...

Так же по поводу убийства Эстебана, лучше сделать вот такую проверку:
Daedalus:
      if (slf.guild == GIL_BDT)  // НПС бандит
    {
        if (Npc_KnowsInfo(hero,DIA_Addon_BDT_10014_Thorus_Rein == true)                        // или герой убил Эстебена
        || (Npc_KnowsInfo(hero,DIA_Addon_Thorus_Speech) == true)    // или герой убир Бладвина
        || (RavenIsDead == true)                                    // или герой убил Равена
        {
            return false;
        };
        return true;
    };
Опять же тут есть небольшая нестыковка:
ГГ не может убить Бладвина или Равена, т.к. не сможет попасть к ним, не убив перед этим Эстебана, так что думаю оставить только одну проверку на смерь Эстебана.
И еще одна проблема. Когда ГГ убил Эстебана, и не поговорил с Торусом, бандиты все равно на него агрятся. Как-то можно расширить B_DragonKillCounter с помощью плагина?
Что касается дистанций, за весь день, что я манипулировал с бандитами, искал подходящее, анализировал расстояние и прочее. Подобрал для себя:
INI:
[ZB_MOVENPCWAIT]
DIST_MoveNpc=300
DIST_PERC_MOVENPC=200
Почему так, потому что непись начинает разговор в промежутке от 240 см и ниже, хз чем определяется. и вот когда DIST_MoveNpc=250, непись мог остановиться на расстоянии 240. Достать оружие, а при доставании пушки идет сдвиг назад примерно на 20-30 см, что приводило к выходу из функции.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
Опять же тут есть небольшая нестыковка:
ГГ не может убить Бладвина или Равена, т.к. не сможет попасть к ним, не убив перед этим Эстебана, так что думаю оставить только одну проверку на смерь Эстебана.
может. именно поэтому в проверке перебираются несколько вариантов.

Так же по поводу убийства Эстебана, лучше сделать вот такую проверку:
там их можно сделать хоть пачку :) по сути это ни на что не влияет. я просто прописал определённый вехи по сюжету игры:
// или герой получил доступ в шахту, через убийства Эстебана
// или герой убил Бладвина
// или герой убил Равена
можно конечно оставить только проверку на смерть Равена, но хотелось бы что бы оно было как то пораньше. Вот оно как бы и пораньше.

***

Почему так, потому что непись начинает разговор в промежутке от 240 см и ниже, хз чем определяется. и вот когда DIST_MoveNpc=250, непись мог остановиться на расстоянии 240. Достать оружие, а при доставании пушки идет сдвиг назад примерно на 20-30 см, что приводило к выходу из функции.
хорошие новости. уже виден свет в конце туннеля :)

Для бандитов пришлось изменить B_MoveNpc вот так:
спасибо!
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.862
Благодарности
6.742
Баллы
1.625
может. именно поэтому в проверке перебираются несколько вариантов.
ГГ же Торус не пропустит, если у того не будет красной таблички, а они есть только в инвентаре Эстебана, и украсть их нельзя. Следовательно - только труп Эстебана))
Не, ну, конечно, можно и с помощью марвина пролезть и грохнуть двух других.
Ну либо как дурак - бежать на пролом...
Или какой-то другой легальный путь есть? Если есть - тогда молчу))
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
ГГ же Торус не пропустит, если у того не будет красной таблички, а они есть только в инвентаре Эстебана, и украсть их нельзя. Следовательно - только труп Эстебана))
там есть свитки страха в Ярике и есть немецкие "лайфхаки" про то что используя их можно пройти. а есть ещё магия "сна". и так далее. в итоге герой может прийти к Бладвину и его грохнуть прям в храме, получив таким образом бандитский доспех. Вреда от подобных проверок я не вижу, а сегрегировать игроков которые делают что то "правильно" или "не правильно" и " наказывать" их мне кажется контерпродуктивным. поэтому поставил три проверки, на разные случаи. если для тебя это принципиально, то давай уберём.

***

Ну либо как дурак - бежать на пролом...
можно и в виде бронированного дракона-снеппера прорваться в храм :-D я точно так делал в 2006 году :)
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.862
Благодарности
6.742
Баллы
1.625
поэтому поставил три проверки. если для тебя это принципиально, то давай уберём.
Не ненадо, пусть будут...
А расширить стандартную функцию B_DragonKillCounter не получится?
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.862
Благодарности
6.742
Баллы
1.625
э.. а зачем? ты про смену значения и глобальной переменной RavenIsDead ?
Нееее
Добавить туда эстебана и бладвина, чтобы не вводить проверку на знание диалога...
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
Добавить туда эстебана и бладвина, чтобы не вводить проверку на знание диалога...
а зачем всё так усложнять? :) мы же используем то что уже есть в игре. эти проверки вполне корректны со всех сторон. они соответствуют сюжетным вехам.
ну можно конечно сделать доп проверку на текущий МИР и на то жив ли НПС...
Daedalus:
// герой убил и/или  Эстебена и/или Бладвина  и/или Равена
if (MIS_Send_Buddler == LOG_SUCCESS)
|| (Npc_KnowsInfo(hero,DIA_Addon_Thorus_Speech) == true)
|| (RavenIsDead == true)                              
{
            return false;
};
Daedalus:
if (RavenIsDead == true)        { return false; };
if (CurrentLevel == ADDONWORLD_ZEN)
{
       var C_Npc npc;
       npc = Hlp_GetNpc(BDT_1083_Addon_Esteban);
       if (Npc_IsDead(npc))        { return false; };
       npc = Hlp_GetNpc(BDT_1085_Addon_Bloodwyn);
       if (Npc_IsDead(npc))        { return false; };
};
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.862
Благодарности
6.742
Баллы
1.625
мы же используем то что уже есть в игре.
Прости меня - дуру грешную...
я совсем забыл про Npc_IsDead )))
Давай тогда второй вариант использовать для бандитов.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
Давай тогда второй вариант использовать для бандитов.
ок
Пост автоматически объединён:

магов воды наверное тоже надо исключить, что бы они не ругались :)
Код:
func int C_AmIStronger (var C_Npc slf, var C_Npc her)   // her это герой
{
...
    if (slf.guild == GIL_KDW)   // Маги Воды
    {
        return false;
    };
...
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
Инстанцияпроверка на оружиепроверка на то был ли он побитпримечание
SLD_806_Sylvioнетнетотмороженный на всю башку
SLD_807_Bullcoнетнетподражает своему другу
BAU_900_Onarнетнетнападает в случае, если ГГ послушник или нейтрал, в остальных случаях только предупреждает вытащив оружие
KDF_511_DaronнетнетДумаю, из за того что он Маг, за него впрягутся многие, по этому как такового, страха нет.
VLK_484_LehmarнетнетАгрится на всех кроме мента, пала и мага
Грегнети да и нетЕсли побит, то действует как Онар - достает пушку и просто предупреждает.
SLD_814_Sentenzaдада
BAU_935_BronkoдадаАгрится только на нейтрала
VLK_432_MoeдадаАгрится только на нейтрала
VLK_434_BorkaдадаАгрится только на нейтрала
VLK_438_AlrikдадаАгрится только на нейтрала
Охранник складаАгрится только на нейтрала и наема/ОнД
Daedalus:
    if (slf.npcType == NPCTYPE_FRIEND)
    {
        return FALSE;   
    };
    if (Npc_GetAttitude (slf, her) == ATT_FRIENDLY)
    {
        return FALSE;   
    };   
 

    // именные НПС и прочие борзые НПС, без чувства самосохранения 
    if (C_IsNpc(slf,SLD_807_Bullco) == TRUE)    { return TRUE; };   
    if (C_IsNpc(slf,SLD_806_Sylvio) == TRUE)    { return TRUE; };   
    if (C_IsNpc(slf,KDF_511_Daron) == TRUE)     { return TRUE; };   
    if (C_IsNpc(slf,VLK_484_Lehmar) == TRUE)
    {
        if (her.guild == GIL_NOV)       { return TRUE; };
        if (her.guild == GIL_NONE)      { return TRUE; };
        if (her.guild == GIL_SLD)       { return TRUE; };
        if (her.guild == GIL_DJG)       { return TRUE; };
        return false;
    };   
    if (C_IsNpc(slf,BAU_900_Onar) == TRUE)
    {
        if (her.guild == GIL_NOV)       { return TRUE; };
        if (her.guild == GIL_NONE)      { return TRUE; };
        return false;
    };
    
    
    // НПС уже получал на орежи от ГГ. НПС принимает решение воздержаться от конфликта.
    if (slf.aivar[AIV_VictoryXPGiven] == TRUE)
    {
        return FALSE;
    };   

    // проверка оружия ГГ: НПС оценивает оружие героя и принимает решение не идти на открытый конфликт
       var C_ITEM equipMeleeWeap; equipMeleeWeap = Npc_GetEquippedMeleeWeapon(her);
    if (equipMeleeWeap.damageTotal >= Damage_Orkschwert_01)
    {
        return FALSE;
    };

    // именные НПС и прочие борзые НПС, с чувством самосохранения. Expertus metuet.
    if (C_IsNpc(slf,SLD_814_Sentenza) == TRUE)  { return TRUE; };
    
    if (C_IsNpc(slf,BAU_935_Bronko) == TRUE)
    {
        if (her.guild == GIL_NOV)       { return TRUE; };
        //if (her.guild == GIL_NONE)      { return TRUE; };
        return false;
    };
    if (C_IsNpc(slf,VLK_432_Moe) == TRUE)
    {
        if (her.guild == GIL_NOV)       { return TRUE; };
        //if (her.guild == GIL_NONE)      { return TRUE; };
        return false;
    };
    if (C_IsNpc(slf,VLK_434_Borka) == TRUE)
    {
        if (her.guild == GIL_NOV)       { return TRUE; };
        //if (her.guild == GIL_NONE)      { return TRUE; };
        return false;
    };
    if (C_IsNpc(slf,VLK_438_Alrik) == TRUE)
    {
        if (her.guild == GIL_NOV)       { return TRUE; };
        //if (her.guild == GIL_NONE)      { return TRUE; };
        return false;
    };
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.862
Благодарности
6.742
Баллы
1.625
MW 7,
BAU_935_Bronko
VLK_432_Moe
VLK_434_Borka
VLK_438_Alrik
Ониж нападают на нейтрала, а не на послушника)) т.е.
Daedalus:
        if (her.guild == GIL_NOV)       { return TRUE; };
        //if (her.guild == GIL_NONE)      { return TRUE; };
        return false;
поменять на
Daedalus:
        //if (her.guild == GIL_NOV)       { return TRUE; };
        if (her.guild == GIL_NONE)      { return TRUE; };
        return false;
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
Ониж нападают на нейтрала, а не на послушника)) т.е.
не тех закомментировал. поправил :) спасибо.

Охранник склада
он стоит на месте. никуда не ходит. можно не добавлять
Пост автоматически объединён:

там еще что то то есть про смену анимации лица
Daedalus:
func void B_SetFaceExpression (var C_NPC slf, var C_NPC oth)
{
    PrintDebugNpc        (PD_ZS_FRAME,    "B_SetFaceExpression");

    var int attitude;
   
    attitude = Npc_GetTempAttitude(slf, oth);
   
    if (Npc_IsInState(self, ZS_Flee) || self.aivar[AIV_WASDEFEATEDBYSC])
    {
        PrintDebugNpc        (PD_ZS_CHECK,    "...to frightened!");
        Mdl_StartFaceAni    (self,    "S_FRIGHTENED",    1,    -1);
    }
    else if    (attitude == ATT_FRIENDLY)
    {
        PrintDebugNpc        (PD_ZS_CHECK,    "...to friendly!");
        Mdl_StartFaceAni    (self,    "S_NEUTRAL",    1,    -1);
    }
    else if    (attitude == ATT_NEUTRAL)
    {
        PrintDebugNpc        (PD_ZS_CHECK,    "...to neutral!");
        Mdl_StartFaceAni    (self,    "S_NEUTRAL",    1,    -1);
    }
    else if    (attitude == ATT_ANGRY)
    {
        PrintDebugNpc        (PD_ZS_CHECK,    "...to angry!");
        Mdl_StartFaceAni    (self,    "S_ANGRY",        1,    -1);
    }
    else if    (attitude == ATT_HOSTILE)
    {
        PrintDebugNpc        (PD_ZS_CHECK,    "...to hostile!");
        Mdl_StartFaceAni    (self,    "S_HOSTILE",    1,    -1);
    };
};


func void B_ResetFaceExpression (var C_NPC slf)
{
    PrintDebugNpc        (PD_ZS_FRAME,    "B_ResetFaceExpression");

    Mdl_StartFaceAni    (self,    "S_NEUTRAL",    1,    -1);
};
 

Вложения

  • B_MoveNpcWait.vdf
    32,3 KB · Просмотры: 3
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.862
Благодарности
6.742
Баллы
1.625
там еще что то то есть про смену анимации лица
Добавить, конечно, можно, но надо ли? за все 10 секунд болавнчик будет вести себя как болванчик, то скалиться, то обратно в нормальное состояние лица. Да и будет это почти не заметно для игрока.
------------------------
Что касается тестов - все гуд.
Можно немного поменять некоторые моменты:
Почти в самом конце ZS_MOVENPC:
Daedalus:
    // ------ Alle 2 Sekunden zu other ausrichten ------
    if (Npc_GetStateTime (self) != self.aivar[AIV_StateTime])
    {
        if (!Npc_CanSeeNpc(self, other))
        {  
            Npc_ClearAIQueue(self);
            B_StopLookAt (self);
            B_RemoveWeapon      (self);
            AI_ContinueRoutine  (self);
            return LOOP_END;
        };
        //Hlp_PrintConsole(Str_Format(" ZS_MoveNpcWait [%s %i]  -- > return LOOP_CONTINUE [AIV_StateTime %i]",self.name, self.id, self.aivar[AIV_StateTime]));
        self.aivar[AIV_StateTime] = Npc_GetStateTime (self);
    };
    //AI_Wait                (self,1);
    return LOOP_CONTINUE;
Т.е. если ГГ зашел за спину неписю - то функция прерывается и все хорошо, болванчик не поворачивается за ГГ, и не боится, что ГГ что-нибудь вытворит с ним сзади.
Предупреждающую фразу на 3-4 секунде изменил на B_Say(self, other, "$YouDareHitMe"); //Ну, подожди, сукин сын!\\Ты пожалеешь об этом!\\Сейчас ты получишь!
Так же саму атаку изменил на B_Attack (self, other, AR_ClearRoom , 0); т.к. AR_ReactToWeapon приводит к тому, что для непися происходит восприятие нарушения закона, в следствии чего закон действительно нарушается. Из за чего при виде ГГ непись будет постоянно атаковать, если ГГ сбежал в первый раз. И при таком восприятии атаки(AR_ClearRoom), непись чаще всего орет: "Сейчас я вышвырну тебя от сюда".
Так же убрал Npc_SetTempAttitude (self,ATT_HOSTILE); ибо лишнее.
В результате выходной черновик функции пока выглядит так:
Daedalus:
func int ZS_MoveNpcWait_Loop ()
{
    if (self.aivar[AIV_StateTime]  > 10)
    {
        Npc_SetStateTime(self,1);
        self.aivar[AIV_StateTime] = 0;
        self.aivar[AIV_TAPOSITION] = 0;
    };
   
    if (other.aivar[AIV_INVINCIBLE] == true)                // герой с кем то заговорил
    || (Npc_GetDistToNpc(self, other) > DIST_MoveNpc)       // герой уступил дорогу
    //|| (Npc_IsWayBlocked(self) == false)
    // || (self.aivar[AIV_StateTime]  >= 10)
    {
        Npc_ClearAIQueue(self);
        //C_StopLookAt        (self); // da in ZS_MoveNpc() der Blockierer nach dem Waffenziehen angeguckt wird!
        B_StopLookAt (self);
        B_RemoveWeapon      (self);
        AI_ContinueRoutine  (self);
        Hlp_PrintConsole(Str_Format("   ZS_MoveNpcWait [%s %i]  -- > return LOOP_END [AIV_StateTime %i]",self.name, self.id, self.aivar[AIV_StateTime]));
        return LOOP_END;  
    };
   

    if (self.aivar[AIV_StateTime]  >= 7)
    {
        if (self.aivar[AIV_TAPOSITION] == true)
        //&& (C_AmIStronger(self, other) == true)  // общая проверка
        {          
            //Npc_SetTempAttitude (self,ATT_HOSTILE);
            //B_Say(self,     other, "$YOUASKEDFORIT"); // реплика есть в ZS_Attack
            Npc_SetTarget    (self,    other);
            //AI_StartState    (self,     ZS_Attack, 1, "");
            B_Attack (self, other, AR_ClearRoom , 0);
            Hlp_PrintConsole(Str_Format("   ZS_MoveNpcWait [%s %i]  -- > B_Attack [AIV_StateTime %i]",self.name, self.id, self.aivar[AIV_StateTime]));
            return LOOP_END;      
        }
        else if  (self.aivar[AIV_TAPOSITION] != 7)          
        {
            Npc_ClearAIQueue(self);
            //AI_PlayAni(self, Ani_StateTime_7);
            AI_PlayAniBS (self,"T_JOINT_RANDOM_1",BS_ITEMINTERACT);
            self.aivar[AIV_TAPOSITION] = 7;
            Hlp_PrintConsole(Str_Format("   ZS_MoveNpcWait [%s %i]  -- > Ani_StateTime_7 [AIV_StateTime %i]",self.name, self.id, self.aivar[AIV_StateTime]));
        };
    }
    else if (self.aivar[AIV_StateTime]  >= 3) // 0,1,2,3. итого 4.
    {
        if (self.aivar[AIV_TAPOSITION] == FALSE)
        {
            if (C_AmIStronger(self, other) == true)  // общая проверка
            {
                B_SelectWeapon    (self,    other);
                //B_Say             (self,    other,  "$YOUDEAFORWHAT"); // G1 MDK
                B_Say             (self,    other,  "$YouDareHitMe");     //Ну, подожди, сукин сын!
                self.aivar[AIV_TAPOSITION] = TRUE; //PlayerHasBeenWarnedTwice
                Hlp_PrintConsole(Str_Format("   ZS_MoveNpcWait [%s %i]  -- > B_SelectWeapon [AIV_StateTime %i]",self.name, self.id, self.aivar[AIV_StateTime]));
            };
        };
    }
    else if (self.aivar[AIV_StateTime] == 0)
    {
        if (Npc_GetAttitude ( self, other) == ATT_FRIENDLY)
        || (self.npcType == NPCTYPE_FRIEND)
        {
            B_Say (self, other, "$whereto");  //
        }
        else if (C_AmIStronger(self, other) == true)
        {
            B_Say (self, other, "$WhatDidYouDoInThere");  //Что тебе здесь надо, а?!
        }
        else
        {
            B_Say (self, other, "$GetOutOfHere");   //Убирайся отсюда!
        };
        Hlp_PrintConsole(Str_Format("   ZS_MoveNpcWait [%s %i]  -- > B_Say [AIV_StateTime %i]",self.name, self.id, self.aivar[AIV_StateTime]));
    };
   
    // ------ Alle 2 Sekunden zu other ausrichten ------
    if (Npc_GetStateTime (self) != self.aivar[AIV_StateTime])
    {
        if (!Npc_CanSeeNpc(self, other))
        {  
            Npc_ClearAIQueue(self);
            B_StopLookAt (self);
            B_RemoveWeapon      (self);
            AI_ContinueRoutine  (self);
            return LOOP_END;
        };
        //Hlp_PrintConsole(Str_Format(" ZS_MoveNpcWait [%s %i]  -- > return LOOP_CONTINUE [AIV_StateTime %i]",self.name, self.id, self.aivar[AIV_StateTime]));
        self.aivar[AIV_StateTime] = Npc_GetStateTime (self);
    };

    //AI_Wait                (self,1);
    return LOOP_CONTINUE;
};
--------------------------
Что касается магов - то их думаю вынести к камикадзе, ибо если ударить мага в монастыре, то за него впрягутся все, и есть очень большая вероятность, что прилетит какой-нить фаербол, что приведет к смерти ГГ.
Охотников на драконов можно поместить между отпинанными и проверки на оружие
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
Т.е. если ГГ зашел за спину неписю - то функция прерывается и все хорошо,
не понятно. мы же тут вроде ИИ делаем. а тут герой забежал за спину что бы бахнуть НПС по голове? :) оно проверяется очень просто: выходим на улицу и пересекаем дорогу идущем наряду. после чего забегаем им за спину и смотрим на их реакцию ;-)
вообщем я к тому что получилась прекрасная правдоподобное поведение НПС, и то что НПС вокруг стоят и смотрят на героя, и НПС следит за героем. не стоит ломать эту логику скатываясь на забегание за спину и надевание на голову корзин.

Так же саму атаку изменил на B_Attack (self, other, AR_ClearRoom , 0); т.к. AR_ReactToWeapon приводит к тому, что для непися происходит восприятие нарушения закона, в следствии чего закон действительно нарушается. Из за чего при виде ГГ непись будет постоянно атаковать, если ГГ сбежал в первый раз. И при таком восприятии атаки(AR_ClearRoom), непись чаще всего орет: "Сейчас я вышвырну тебя от сюда".
а разве это плохо? AR_ClearRoom я уже ставил. а потом поменял AR_ClearRoom на AR_ReactToWeapon.


Так же убрал Npc_SetTempAttitude (self,ATT_HOSTILE); ибо лишнее.
почему лишнее? точнее не так: как это может быть лишним? или даже лучше вот так: в связи с чем это стало лишнем? или если НПС атакует героя он делает это от большой любви к герою? :) если игроку хочется снять негатив можно использовать свиток "забыть", он для этого и был введён в игру. Свитки можно купить сами знаете у кого. так же пару свитков хранит для личного пользования Маг Огня Дарон.
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.862
Благодарности
6.742
Баллы
1.625
не понятно. мы же тут вроде ИИ делаем. а тут герой забежал за спину что бы трахнуть героя по голове? :) оно проверяется очень просто: выходим на улицу и пересекаем дорогу идущем наряду. после чего забегаем им за спину и смотрим на их реакцию ;-)
вообщем я к тому что получилась прекрасная правдоподобное поведение НПС, и то что НПС вокруг стоят и смотрят на героя, и НПС следит за героем. не стоит ломать эту логику скатываясь на забегание за спину и надевание на голову корзин.
Уболтал, отменяем))
а разве это плохо?
Ну у них же слухи распространяются со скоростью света, т.е. перешел дорогу неписю, а через 10 секунд, когда непись напал на ГГ, ГГ уже нужно оплатить штраф Андре/Парлану/Ли. и при этом платить штраф за то, что не уступил вышибале-Мо дорогу?
почему лишнее? точнее не так: как это может быть лишним? или даже лучше вот так: в связи с чем это стало лишнем? или если НПС атакует героя он делает это от большой любви к герою?
Ну как... Он все равно перед атакой орет гневную фразу, что подразумевает для восприятия мозгом(в реале), как угроза - что собственно и есть "нелюбовь" ))
Ну а если оставлять. то Npc_SetTempAttitude - сколько по времени оно длится? Если хрен пойми сколько много - то мжет в ZS_MoveNpcWait_End добавить Npc_SetTempAttitude(self,Npc_GetPermAttitude(self,hero));
т.е. произошло восприятие непися на ГГ злое. непись атаковал, восприятие убралось обратно, но непись продолжает атаку... :oops:
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
971
Баллы
295
т.е. произошло восприятие непися на ГГ злое. непись атаковал, восприятие убралось обратно, но непись продолжает атаку... :oops:
непонятно. разве НПС не должен менять отношение к ГГ в связи с конфликтом?
 
Сверху Снизу