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

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

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.953
Благодарности
940
Баллы
275
  • Первое сообщение
  • #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 · Просмотры: 9
  • оно_2023_01_03_G2_OUTOFMYWAY_scripts.zip
    9,9 KB · Просмотры: 10
  • 2023_03_10_G2_OUTOFMYWAY_scripts.zip
    10,7 KB · Просмотры: 7
  • 2023_03_13_G2_OUTOFMYWAY_scripts.zip
    10,9 KB · Просмотры: 9
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.953
Благодарности
940
Баллы
275
можно попробовать использовать вместо
AI_StartState (self, ZS_Attack, 1, "");
B_Attack (self, other, AR_ReactToWeapon , 0);
const int AIV_ATTACKREASON = 9; //Причина нападения (по приоритетам)
const int AR_NONE = 0; //Причины нет
const int AR_LeftPortalRoom = 1; //ГГ находится в помещении с ограниченным доступом
const int AR_ClearRoom = 2; //ГГ находится в помещении другого НПС
const int AR_GuardCalledToRoom = 3; //Вызвана охрана для защиты помещения
const int AR_MonsterVsHuman = 4; //Монстр сражается с человеком, ГГ помогает человеку
const int AR_MonsterMurderedHuman = 5; //Монстр убил человека
const int AR_SheepKiller = 6; //Овца была атакована и убита (человеком или монстром)
const int AR_Theft = 7; //ГГ что-то украл
const int AR_UseMob = 8; //ГГ использовал МОВ с флагом принадлежности другому НПС
const int AR_GuardCalledToThief = 9; //Вызвана стража по факту воровства ГГ
const int AR_ReactToWeapon = 10; //Преступник не убрал оружие после двукратного пердупреждения или пустился в бега
const int AR_ReactToDamage = 11; //Преступник ранил НПС
const int AR_GuardStopsFight = 12; //Охрана прекращает атаковать преступника
const int AR_GuardCalledToKill = 13; //Вызвана охрана по факту убийства
const int AR_GuildEnemy = 14; //НПС является врагом гильдии (человек или монстр)
const int AR_HumanMurderedHuman = 15; //Человек убил человека
const int AR_MonsterCloseToGate = 16; //Охрана ворот атакует враждебного монстра
const int AR_GuardStopsIntruder = 17; //Охрана ворот атакует незваного гостя
const int AR_SuddenEnemyInferno = 18; //Немедленная атака противника (невзирая на блокировку)
const int AR_KILL = 19; //ГГ убил НПС

* убрал ZS_MoveNpcFriendlyWait, оставив одну ZS_MoveNpcWait
* перенёс проверку C_AmIStronger из B_MoveNpc в ZS_MoveNpcWait
* перенёс проверку Npc_GetAttitude из B_MoveNpc в C_AmIStronger
* переписал ZS_MoveNpcWait использую константы из AI_Constants Готики 2
* закомментировал проверку на (Npc_IsWayBlocked(self) == false) в ZS_MoveNpcWait
* заменил функции "остановки", томного взгляда и т.п. на штатные готики 2
* дистанции теперь можно настроил в файле ini

Gothic.ini
Код:
[ZB_MOVENPCWAIT]
DIST_MoveNpc=400
DIST_PERC_MOVENPC=300


****

Daedalus:
func void ZS_MoveNpcWait ()
{
    Hlp_PrintConsole(Str_Format("   ZS_MoveNpcWait [%s %i]",self.name, self.id));

    Perception_Set_MoveNpcWait();       // G1
//    Perception_Set_Minimal ();          // G2 - нет реакции на вытаскивание оружия
   
    AI_StandUp         (self);
    //    C_LookAtNpc            (self, other);  // G1
    B_LookAtNpc     (self, other);          // G2
    //B_TurnToNpc     (self, other);
   
     // ------ aNSCs warnen ------
    Npc_SendPassivePerc (self, PERC_ASSESSWARN, self, other);  
   
     // ------ aivars resetten -------
    self.aivar[AIV_TAPOSITION] = FALSE; //PlayerHasBeenWarnedTwice  
    self.aivar[AIV_StateTime] = 0;

};

func int ZS_MoveNpcWait_Loop ()
{
    if (other.aivar[AIV_INVINCIBLE] == true)                // герой с кем то заговорил
    || (Npc_GetDistToNpc(self, other) > DIST_MoveNpc)       // герой уступил дорогу
    //|| (Npc_IsWayBlocked(self) == false)                  // НПС решил что путь свободен
    || (self.aivar[AIV_StateTime]  >= 10)
    //|| (Npc_GetStateTime(self) >= 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)
    //else if (Npc_GetStateTime(self) >= 7)
    {
        if (C_AmIStronger(self, other) == true)  // общая проверка
        && (self.aivar[AIV_TAPOSITION] == 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_ReactToWeapon , 0);
            return LOOP_END;      
        };
    }
    else if (self.aivar[AIV_StateTime]  >= 3)
    //else if (Npc_GetStateTime(self) >= 3) // 0,1,2,3. итого 4.
    {
        if (C_AmIStronger(self, other) == true)  // общая проверка
        && (self.aivar[AIV_TAPOSITION] == FALSE)
        {
            B_SelectWeapon    (self,    other);
            //B_Say             (self,    other,  "$YOUDEAFORWHAT"); // G1 MDK
            B_Say             (self,    other,  "$ThenIBeatYouOutOfHere");     //Сейчас я вышвырну тебя отсюда!
            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_GetStateTime(self) == 0)
    {
        if (C_AmIStronger(self, other) == true)
        {
            B_Say (self, other, "$WhatDidYouDoInThere");  //Что тебе здесь надо, а?!
        }
        else
        {
            B_Say (self, other, "$GetOutOfHere");   //Убирайся отсюда!
        };
    };
   
    // ------ Alle 2 Sekunden zu other ausrichten ------
    if (Npc_GetStateTime (self) != self.aivar[AIV_StateTime])
    {
        if (!Npc_CanSeeNpc (self, other))
        {  
            B_TurnToNpc (self, other);
        };
        //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;
};

func void ZS_MoveNpcWait_End ()
{

};


//  G1 mdk
/*
func void ZS_MoveNpcWait ()
{
    PrintDebugNpc        (PD_ZS_FRAME, "ZS_MoveNpcWait" );                
    Npc_PercEnable      (self,    PERC_ASSESSDAMAGE,        ZS_ReactToDamage);        
    Npc_PercEnable      (self,     PERC_ASSESSMAGIC,        B_AssessMagic);        
    Npc_PercEnable      (self,    PERC_ASSESSWARN,         B_AssessWarn );        
    Npc_PercEnable      (self,    PERC_ASSESSFIGHTSOUND,    B_AssessFightSound);
    Npc_PercEnable      (self,    PERC_CATCHTHIEF,        ZS_CatchThief );        
    Npc_PercEnable      (self,     PERC_ASSESSTALK,        B_AssessTalk );        
    Npc_PercEnable      (self,     PERC_ASSESSTHREAT,        B_AssessFighter);
    Npc_PercEnable      (self,     PERC_ASSESSENTERROOM,    B_AssessEnterRoom);            
    
    C_LookAtNpc            (self,    other);
};

func void ZS_MoveNpcWait_Loop ()
{
    PrintDebugNpc( PD_ZS_LOOP, "ZS_MoveNpcWait_Loop" );                

    if (Npc_GetStateTime ( self) > 2 )
    {
        if    Npc_IsWayBlocked(self)                    // Weg immer noch blockiert?
        &&    (Npc_GetDistToNpc(self, other)<200)        // kцnnte ja auch ein anderer NSC sein, also checken, ob SC noch in der Nдhe!
        &&    (other.aivar[AIV_INVINCIBLE] == FALSE)    // SC kцnnte mittlerweile reden
        {
            B_DrawWeapon     (self,    other);
            B_Say             (self,    other,  "$YOUDEAFORWHAT");
            AI_StartState     (self,    ZS_MoveNpcWait1, 0, "");    
            return;
        }
        else
        {
            AI_ContinueRoutine (self);
            return;
        };
    };
    AI_Wait                (self,1);
};

func void ZS_MoveNpcWait_End ()
{
    PrintDebugNpc        (PD_ZS_FRAME, "ZS_MoveNpcWait_End" );                
};

func void ZS_MoveNpcWait1 ()
{
    PrintDebugNpc        (PD_ZS_FRAME, "ZS_MoveNpcWait1" );                
    
    Npc_PercEnable      (self,    PERC_ASSESSDAMAGE,        ZS_ReactToDamage);        
    Npc_PercEnable      (self,     PERC_ASSESSMAGIC,        B_AssessMagic);        
    Npc_PercEnable      (self,    PERC_ASSESSWARN,         B_AssessWarn );        
    Npc_PercEnable      (self,    PERC_ASSESSFIGHTSOUND,    B_AssessFightSound);
    Npc_PercEnable      (self,    PERC_CATCHTHIEF,        ZS_CatchThief );        
    Npc_PercEnable      (self,     PERC_ASSESSTALK,        B_AssessTalk );        
    Npc_PercEnable      (self,     PERC_ASSESSTHREAT,        B_AssessFighter);
    Npc_PercEnable      (self,     PERC_ASSESSENTERROOM,    B_AssessEnterRoom);            
};

func void ZS_MoveNpcWait1_Loop ()
{
    PrintDebugNpc( PD_ZS_LOOP, "ZS_MoveNpcWait1_Loop" );                
    if (Npc_GetStateTime ( self) > 2 )
    {
        if    Npc_IsWayBlocked(self)                    // Weg immer noch blockiert?
        &&    (Npc_GetDistToNpc(self, other)<200)        // kцnnte ja auch ein anderer NSC sein, also checken, ob SC noch in der Nдhe!
        &&    (other.aivar[AIV_INVINCIBLE] == FALSE)    // SC kцnnte mittlerweile reden
        {
            Npc_SetTempAttitude (self,ATT_HOSTILE);
            B_Say            (self,     other, "$YOUASKEDFORIT");
            Npc_SetTarget    (self,    other);
            AI_StartState    (self,     ZS_Attack, 1, "");
            return;
        }
        else
        {
            C_StopLookAt        (self);        // da in ZS_MoveNpc() der Blockierer nach dem Waffenziehen angeguckt wird!
            AI_ContinueRoutine (self);
            return;
        };
    };
    AI_Wait                (self,1);
};

func void ZS_MoveNpcWait1_End ()
{
    PrintDebugNpc        (PD_ZS_FRAME, "ZS_MoveNpcWait1_End" );                
    B_RemoveWeapon        (self);
};
*/
 

Вложения

  • B_MoveNpcWait.zip
    7,4 KB · Просмотры: 3

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.308
Благодарности
6.285
Баллы
1.595
MW 7, Протестировал. Уже лучше, но есть недоработки:
Без разницы кому преграждаешь путь, когда непись говорит: убирайся, все болванчики вокруг начинают глазеть на ГГ
Пример с Ватрасом.
5.png

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.953
Благодарности
940
Баллы
275
При этом непись, которому преграждаешь путь, скажет один раз фразу "убирайся", тупит 10 секунд. делаешь полшага-шаг и опять: Убирайсяя, стоит опять тупит 10 секунд, и так по кругу.
а что не так? цикл выше в спойлере, предлагай что поменять :)

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

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

ГГ преступник: менты/маги/послушники - Убирайся, 10 секунд, убирайся, и покругу. Палы - Убирайся, достает оружие, я тебя сейччас вышвырну, начинает пинать ГГ, при этом другие палы тоже присоединяется к футторсу.
у палов и ментов стоят одинаковые условия. возможно герой не был преступником или был преступником в другой месте (ферма,монастырь,город,замок).

друзья(Проверил на Ксардасе), не реагируют на преграду, тупо идут, а упиревшись в ГГ продолжают выполнять движения ходьбы.
ты в третей главе смотрел? или в каком то месте далеко от башни вставлял Ксардаса через консоль, преграждая ему путь? или в башне на старте?
Пост автоматически объединён:

тупит 10 секунд. делаешь полшага-шаг и опять

можно им что нибудь добавить, какую нибудь анимацию например. на AIV_StateTime 3 или 7.

C_AmIStronger == trueC_AmIStronger == false
self.aivar[AIV_StateTime] == 0WhatDidYouDoInThere // Что тебе здесь надо, а?!GetOutOfHere //Убирайся отсюда!
self.aivar[AIV_StateTime] >= 3 B_SelectWeapon (self, other);
//B_Say (self, other, "$YOUDEAFORWHAT"); // G1 MDK
B_Say (self, other, "$ThenIBeatYouOutOfHere"); //Сейчас я вышвырну тебя отсюда!
self.aivar[AIV_StateTime] >= 7 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_ReactToWeapon , 0);
выход
self.aivar[AIV_StateTime] >= 10выходвыход
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.308
Благодарности
6.285
Баллы
1.595
а что не так? цикл выше в спойлере, предлагай что поменять :)
Я туплю видимо....
а тут что не так? :) народ видимо интересуется
Ну мне показалось это как-то странным. *sorry*
у палов и ментов стоят одинаковые условия. возможно герой не был преступником или был преступником в другой месте (ферма,монастырь,город,замок).
менты и палы - все происходило в городе.
Т.е. для того, чтобы маги и послушники агрились - надо накосячить в монастыре? Пойду в монастырь косячить.
ты в третей главе смотрел? или в каком то месте далеко от башни вставлял Ксардаса через консоль, преграждая ему путь? или в башне на старте?
в самом начале, в башне. Пойду где-нить в другом месте его спаунить.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.953
Благодарности
940
Баллы
275
Т.е. для того, чтобы маги и послушники агрились - надо накосячить в монастыре? Пойду в монастырь косячить.
да. я старался максимально использовать те ресурсы и методы что есть в Готики 2 , минимизировав новодел.

оригинальная проверка проверяет принадлежность НПС к "локации" по npctype и преступления в той "локации"

Daedalus:
// ********************************************************************
// C_NpcBelongsTo -
// ----------------
// - OldCamp
// - City
// - Monastery
// - Farm
// Checks werden vor allem von Crime/News/Absolution - System verwendet
// ********************************************************************

func int C_NpcBelongsToOldCamp (var C_NPC slf)
{
    if (slf.npctype == NPCTYPE_OCMAIN)
    || (slf.npctype == NPCTYPE_OCAMBIENT)
    {
        if (slf.guild == GIL_VLK)
        || (slf.guild == GIL_MIL)
        || (slf.guild == GIL_PAL)
        {
            return TRUE;
        };
    };
    
    return FALSE;
};

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

func int C_NpcBelongsToCity (var C_NPC slf)
{
    if (! C_NpcBelongsToOldCamp (slf))
    {
        if (slf.guild == GIL_VLK)
        || (slf.guild == GIL_MIL)
        || (slf.guild == GIL_PAL)
        {
            return TRUE;
        };
    };
    
    return FALSE;
};

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

func int C_NpcBelongsToMonastery (var C_NPC slf)
{
    if (slf.guild == GIL_KDF)
    || (slf.guild == GIL_NOV)
    {
        return TRUE;
    };
    
    return FALSE;
};

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

func int C_NpcBelongsToFarm (var C_NPC slf)
{
    if (slf.guild == GIL_BAU)
    || (slf.guild == GIL_SLD)
    {
        return TRUE;
    };
    
    return FALSE;
};
// ---------------------------------------------------------------------

func int C_NpcBelongsToBL (var C_NPC slf)
{
    if (slf.npctype == NPCTYPE_BL_AMBIENT)
    || (slf.npctype == NPCTYPE_BL_MAIN)
    {
        return TRUE;
    };
    
    return FALSE;
};
Daedalus:
// ****************************************************
// B_GetPetzCrime
// --------------
// Liefert Petzcrime in Abhдngigkeit von Home-Location
// wenn NSC keine Home-Location angehцrt --> CRIME_NONE
// ****************************************************

func int B_GetGreatestPetzCrime (var C_NPC slf)
{
    // ------ OldCamp ------
    if (C_NpcBelongsToOldCamp(slf))
    {
        if (PETZCOUNTER_OldCamp_Murder > 0)
        {
            return CRIME_MURDER;
        };
        
        if (PETZCOUNTER_OldCamp_Theft > 0)
        {
            return CRIME_THEFT;
        };
        
        if (PETZCOUNTER_OldCamp_Attack > 0)
        {
            return CRIME_ATTACK;
        };
        
        if (PETZCOUNTER_OldCamp_Sheepkiller > 0)
        {
            return CRIME_SHEEPKILLER;
        };
    };
    
    // ------ City ------
    if (C_NpcBelongsToCity(slf))
    {
        if (PETZCOUNTER_City_Murder > 0)
        {
            return CRIME_MURDER;
        };
        
        if (PETZCOUNTER_City_Theft > 0)
        {
            return CRIME_THEFT;
        };
        
        if (PETZCOUNTER_City_Attack > 0)
        {
            return CRIME_ATTACK;
        };
        
        if (PETZCOUNTER_City_Sheepkiller > 0)
        {
            return CRIME_SHEEPKILLER;
        };
    };
    
    // ------ Monastery ------
    if (C_NpcBelongsToMonastery(slf))
    {
        if (PETZCOUNTER_Monastery_Murder > 0)
        {
            return CRIME_MURDER;
        };
        
        if (PETZCOUNTER_Monastery_Theft > 0)
        {
            return CRIME_THEFT;
        };
        
        if (PETZCOUNTER_Monastery_Attack > 0)
        {
            return CRIME_ATTACK;
        };
        
        if (PETZCOUNTER_Monastery_Sheepkiller > 0)
        {
            return CRIME_SHEEPKILLER;
        };
    };
    
    // ------ Farm ------
    if (C_NpcBelongsToFarm(slf))
    {
        if (PETZCOUNTER_Farm_Murder > 0)
        {
            return CRIME_MURDER;
        };
        
        if (PETZCOUNTER_Farm_Theft > 0)
        {
            return CRIME_THEFT;
        };
        
        if (PETZCOUNTER_Farm_Attack > 0)
        {
            return CRIME_ATTACK;
        };
        
        if (PETZCOUNTER_Farm_Sheepkiller > 0)
        {
            return CRIME_SHEEPKILLER;
        };
    };
    
    // ------ Banditenlager Addon ------
    if (C_NpcBelongsToBL(slf))
    {
        if (PETZCOUNTER_BL_Murder > 0)
        {
            return CRIME_MURDER;
        };
        
        if (PETZCOUNTER_BL_Theft > 0)
        {
            return CRIME_THEFT;
        };
        
        if (PETZCOUNTER_BL_Attack > 0)
        {
            return CRIME_ATTACK;
        };
    };
        
    return CRIME_NONE;
};
Пост автоматически объединён:

Ну мне показалось это как-то странным. *sorry*
тогда надо смотреть где это уместно где нет. и исходя из этого делать какие то обобщения и разделения :)
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.308
Благодарности
6.285
Баллы
1.595
в самом начале, в башне. Пойду где-нить в другом месте его спаунить.
Другое место не помогло. Он так же уперся в ГГ и продолжает анимацию ходьбы. Третья глава так же не помогает)) Или в третью главу надо, чтобы он пошел к кругу огня?
менты и палы - все происходило в городе.
Т.е. для того, чтобы маги и послушники агрились - надо накосячить в монастыре? Пойду в монастырь косячить.
В монастыре все прекрасно - мне понравилось.
По ментам и палам - я дурак, забыл накосячить перед тем как ментам мешаться. В общем тоже все путем.
тогда надо смотреть где это уместно где нет. и исходя из этого делать какие то обобщения и разделения :)
Ну в монастыре это можно оставить. там вечное умиротворение и тишина, а тут кто-то орет, естессно всем интересно ))
В городе думаю это убрать, т.к. город - это в принципе постоянная рутина, галдеж, шум и прочее...
На ферме Онара, если преграждаешь наемникам - то, мне кажется, всем должно быть пофиг, пока наем не начал атаку. Если преграждаешь крестьянину - то тут не знаю, либо чтоб все обращали внимание, либо что только крестьяне... Наверно всем, т.к. наемам по приколу если кто-то будет драться...
Таверна Мертвая Гарпия - там толпа алкашей, думаю постоянно в драках и кто-то кому-то мешает - мне кажется всем должно быть пофиг.
Старый лагерь - думаю всем должно быть пофиг, до момента атаки.
Лагерь бандитов - можно всем оставить, т.к. так же как наемам - по приколу видеть драку.
-------------
Я забыл "борзых" проверить. Проверил - не работают)) К ним можно еще и Грега приплести.
-------------
Глюк в 10 секундах, даже если ГГ отошел - непись все равно стоит и смотрит на ГГ, даже если ГГ уже за спину ушел. И только по истечении 10 секунд, непись продолжает движение.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.953
Благодарности
940
Баллы
275
Глюк в 10 секундах, даже если ГГ отошел - непись все равно стоит и смотрит на ГГ, даже если ГГ уже за спину ушел. И только по истечении 10 секунд, непись продолжает движение.
А если дистанции поменять в gothic.ini? Он по идеи должен из цикла выходит при проверки дистанции.

***
Борзых именных пока не добавлял. Давай с болванчиками сначала доразберемся :)

***
Ксардаса, вечером посмотрю.

***

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

В городе думаю это убрать, т.к. город - это в принципе постоянная рутина, галдеж, шум и прочее...

На ферме Онара, если преграждаешь наемникам - то, мне кажется, всем должно быть пофиг, пока наем не начал атаку. Если преграждаешь крестьянину - то тут не знаю, либо чтоб все обращали внимание, либо что только крестьяне... Наверно всем, т.к. наемам по приколу если кто-то будет драться...

Таверна Мертвая Гарпия - там толпа алкашей, думаю постоянно в драках и кто-то кому-то мешает - мне кажется всем должно быть пофиг.

Старый лагерь - думаю всем должно быть пофиг, до момента атаки.

Лагерь бандитов - можно всем оставить, т.к. так же как наемам - по приколу видеть драку.
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.308
Благодарности
6.285
Баллы
1.595
А если дистанции поменять в gothic.ini? Он по идеи должен из цикла выходит при проверки дистанции.
вот с такими параметрами норм пошло:
INI:
[ZB_MOVENPCWAIT]
DIST_MoveNpc=400
DIST_PERC_MOVENPC=200
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.953
Благодарности
940
Баллы
275
Надо борзых НПС собрать в табличку :) тут есть соответствующие столбцы, что бы понять в какую часть кода их ставить, до проверка на то какое оружие у ГГ или после, до того как идёт проверка на то бил ли ГГ непися или после.

Инстанцияпроверка на оружиепроверка на то был ли он побитпримечание
SLD_806_Sylvioнет?нет
SLD_807_Bullcoнет?нет
SLD_814_Sentenzaда?нет
Онарнападает в случае, если ГГ послушник или нейтрал, в остальных случаях только предупреждает вытащив оружие
Маг Огня Дарон
Грег
Пост автоматически объединён:

про Ксардаса: он попадал в проверку на "друга" в B_MoveNpc.

* убрал проверку на "друзей" из B_MoveNpc
* проверка на "друзей" в C_AmIStronger уже была
* добавил какую то реплику для друзей в ZS_MoveNpc

Daedalus:
    else if (self.aivar[AIV_StateTime] == 0)
    //if (Npc_GetStateTime(self) == 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");   //Убирайся отсюда!
        };
    };
 

Вложения

  • B_MoveNpcWait_2023_01_25.zip
    7,5 KB · Просмотры: 2
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.308
Благодарности
6.285
Баллы
1.595
борзых НПС собрать
Инстанцияпроверка на оружиепроверка на то был ли он побитпримечание
SLD_806_Sylvioнетнетотмороженный на всю башку
SLD_807_Bullcoнетнетподражает своему другу
SLD_814_Sentenzaдада
Онарнетнетнападает в случае, если ГГ послушник или нейтрал, в остальных случаях только предупреждает вытащив оружие
Маг Огня ДароннетнетДумаю, из за того что он Маг, за него впрягутся многие, по этому как такового, страха нет.
Грегнети да и нетЕсли побит, то действует как Онар - достает пушку и просто предупреждает.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.953
Благодарности
940
Баллы
275
у Дарона стоит гильдия GIL_VLK . поэтому он и выносится в исключения из общих правил ;-)
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.308
Благодарности
6.285
Баллы
1.595

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.953
Благодарности
940
Баллы
275
Просто сужу из челевеческого фаткора...
это как раз то чего так порой не хватает в Готики 2 :-D

* Добавил пару борзых НПС
Daedalus:
//////////////////////////////////////////////////////////////////////////
//    C_AmIStronger
//    =============
//    Ьberfrьft, ob der NSC 'slf' stдrker als der NSC 'her' ist. Diese
//    Funktion ist genau das gegenteil von C_AmIWeaker().
//////////////////////////////////////////////////////////////////////////

func int C_AmIStronger (var C_Npc slf, var C_Npc her)   // her это герой
{
    /* // проверка из G1 MDK
    if ((2*slf.level) > her.level)  { return             TRUE;   }
    else                            { return             FALSE;    };
    */
        
    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,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 (slf.guild == GIL_MIL)   // НПС MIL
    {
         if (B_GetGreatestPetzCrime(slf) > 0)
        {
            if (her.guild == GIL_NONE)   { return   true; };
            if (her.guild == GIL_SLD)    { return   true; };
            if (her.guild == GIL_DJG)    { return   true; };       
        };
        return FALSE;
    };

    /******************************************************************************************/
    // Паладины  город + замок
      
       if (slf.guild == GIL_PAL)   // НПС PAL
    {
        if (B_GetGreatestPetzCrime(slf) > 0)
        {
            if (her.guild == GIL_NONE)   { return   true; };
            if (her.guild == GIL_SLD)    { return   true; };
            if (her.guild == GIL_DJG)    { return   true; };       
        };
        return FALSE;
    };
    
    /******************************************************************************************/
    // GIL_KDF  МОНАСТЫРЬ 

       if (slf.guild == GIL_KDF)   // НПС маг
    {
        // проверка на приступление для нейтрала / онд / наёма
        if (B_GetGreatestPetzCrime(slf) > 0)
        {
            if (her.guild == GIL_NONE)   { return   true; };
            if (her.guild == GIL_SLD)    { return   true; };
            if (her.guild == GIL_DJG)    { return   true; };       
        };
        return FALSE;
    };
    
    /******************************************************************************************/
    // GIL_NOV  МОНАСТЫРЬ   

      if (slf.guild == GIL_NOV)   // НПС послушник
    {
        // проверка на приступление для нейтрала / онд / наёма
        if (B_GetGreatestPetzCrime(slf) > 0)
        {
            if (her.guild == GIL_NONE)   { return   true; };
            if (her.guild == GIL_SLD)    { return   true; };
            if (her.guild == GIL_DJG)    { return   true; };       
        };
        return FALSE;
    };

  
    /******************************************************************************************/
    // Наёмники Ферма Онара   

    if (slf.guild == GIL_SLD)   // НПС наём
    {
         if (her.guild == GIL_KDF)   { return   FALSE; };
        return true;
    };

      if (slf.guild == GIL_DJG)   // НПС ОНД
    {
        return true;
    };
    
    
      if (slf.guild == GIL_PIR)   // НПС пират
    {
       if (MIS_Addon_Greg_ClearCanyon == LOG_SUCCESS)    // герой очистил Canyon
       {
            return   false;
       };
       return true;
    };
  
      if (slf.guild == GIL_BDT)   // НПС бандит
    {
        if (MIS_Send_Buddler == LOG_SUCCESS)                        // или герой убил Эстебена
        || (Npc_KnowsInfo(hero,DIA_Addon_Thorus_Speech) == true)    // или герой убир Бладвина
        || (RavenIsDead == true)                                    // или герой убил Равена
        {
            return false;
        };
        return true;
    };



    // наверное надо выташить проверки прям сюда
    if (C_NpcIsWorker(slf) == true)
    {
        return FALSE;   
    };

    // проверка на то достаточно ли сильный НПС и сможет ли вломить ГГ
    // проверка брони ГГ
    // проверка на то сколько людей убил ГГ
    // проверка еще на что то
 
    // подстраховка, старая версия
     if (her.guild == GIL_PAL)   // герой паладин
    {
        if  (slf.guild == GIL_DJG)   { return    TRUE; };    // НПС ОНД
        return   FALSE;
        /*
        if      (slf.guild == GIL_PAL)   { return    FALSE; }    // НПС Паладин
        else if (slf.guild == GIL_MIL)   { return    FALSE; }    // НПС Мент
        else if (slf.guild == GIL_KDF)   { return    FALSE; }    // НПС Маг Огня
        else if (slf.guild == GIL_KDW)   { return    FALSE; };   // НПС Маг Воды
        */
    };

    // подстраховка, старая версия
     if (her.guild == GIL_KDF)   // герой маг огня
    {
        if  (slf.guild == GIL_DJG)   { return    TRUE; };    // НПС ОНД
        return   FALSE;
        /*
        if      (slf.guild == GIL_PAL)   { return    FALSE; }    // НПС Паладин
        else if (slf.guild == GIL_MIL)   { return    FALSE; }    // НПС Мент
        else if (slf.guild == GIL_KDF)   { return    FALSE; }    // НПС Маг Огня
        else if (slf.guild == GIL_KDW)   { return    FALSE; };   // НПС Маг Воды
        */
    };
 
    return             TRUE;
};

***

Надо еще наверное добавить борзых горожан и крестьян с доп проверкой на гильдию ГГ.
* где то был крестьянин который деньги сшибал
* в портовом квартале всякие вышибалы есть.
* телохранители ростовщика
* наёмный убийца,
* авторитетный нагур
* организатор "бойцовского клуба" за складам

кто то там еще :)
 

Вложения

  • B_MoveNpcWait_2023_01_25.zip
    7,8 KB · Просмотры: 3

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.904
Благодарности
538
Баллы
275
где то был крестьянин который деньги сшибал
Бронко, на дворе Секоба.

* в портовом квартале всякие вышибалы есть.
Мо, Борка, Охранник склада.

* организатор "бойцовского клуба" за складам
Альрик.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.308
Благодарности
6.285
Баллы
1.595
Борзые, дополнено:
Инстанцияпроверка на оружиепроверка на то был ли он побитпримечание
SLD_806_Sylvioнетнетотмороженный на всю башку
SLD_807_Bullcoнетнетподражает своему другу
SLD_814_Sentenzaдада
Онарнетнетнападает в случае, если ГГ послушник или нейтрал, в остальных случаях только предупреждает вытащив оружие
Маг Огня ДароннетнетДумаю, из за того что он Маг, за него впрягутся многие, по этому как такового, страха нет.
Грегнети да и нетЕсли побит, то действует как Онар - достает пушку и просто предупреждает.
БронкодадаАгрится только на нейтрала
МодадаАгрится только на нейтрала
БоркададаАгрится только на нейтрала
Охранник складададаАгрится только на нейтрала и наема/ОнД
АльрикдадаАгрится только на нейтрала
Растовщик(Лемар)нетнетАгрится на всех кроме мента, пала и мага
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.308
Благодарности
6.285
Баллы
1.595
* Добавил пару борзых НПС
И так, очередной тест:
Борзые:
Убирайся, достает оружие, тут же убирает, убирайся, и так по кругу.
Она ведет себя так же, если ГГ нейтрал или послушник, в остальных случая просто - убирайся.
Отпинал Булко, он начал себя нормально вести, т.е. убирайся, достает оружие(кулаки), потом нападает.
Друзья, включая Ксардаса - все путем.
ГГ преступник в городе:
Палы - все путем. Менты через раз как борзые. т.е. то нормально, то ведут себя как борзые.
ГГ преступник в монастыре - все путем.
Бандиты все так же игнорируют преграду.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.953
Благодарности
940
Баллы
275
MEG@VOLT, менты не должны отличаться по поведению от палов. если если есть отличая значит всё таки проблемы с дистанцией.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.953
Благодарности
940
Баллы
275
Грег Если побит, то
Грег в первой локации бессмертный. а во второй локации когда становится смертный тупо сидит на лавке. то есть он вообще не должен попадать в такую историю ;-)

нападает в случае, если ГГ послушник или нейтрал, в остальных случаях только предупреждает вытащив оружие[/TD]
предупреждает вытащив оружия, потом выходит из цикла, прячет оружие, потом запускает цикл опять что то говорит, после чего вытаскивает оружие и так далее.
а вообще Онар хозяин это его дом. он нанял наёмников. В принципе он может просто звать на помощь всех подряд и все вокруг в том числе и Ли должны бить героя ;-)
 
Сверху Снизу