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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в оценке работ на конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык
    Ссылка на тему с работами участников- тык

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

Quasar767

Участник форума
Регистрация
14 Июн 2017
Сообщения
130
Благодарности
15
Баллы
185
Здравствуйте готоманы,возможно ли сделать так в коде GS что бы с помощью одежды я мог стать одним из нпс? к примеру,одел я доспех,и я ящер или дракон,снял доспехи,и снова я человек,возможно ли такое сделать? именно на доспех
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.181
Баллы
525
одел я доспех,и я ящер
Возможно, как-то получится прикрутить заклинание трансформации без проигрывания анимации и с мгновенным кастом.

снял доспехи,и снова я человек
А вот это, думаю, не получится, поскольку в инвентарь монстра тебя не пустит движок. Снять "доспех" не получится.
 

Quasar767

Участник форума
Регистрация
14 Июн 2017
Сообщения
130
Благодарности
15
Баллы
185
. Снять "доспех" не получится.
а что если сделать отдельные скрипты для нпс,и поменять им гильдию к примеру на паладина,таким образом,у них инвентари начинают работать,но есть одно но,останутся ли вещи в инвентаре после *превращения"
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
Здравствуйте готоманы,возможно ли сделать так в коде GS что бы с помощью одежды я мог стать одним из нпс? к примеру,одел я доспех,и я ящер или дракон,снял доспехи,и снова я человек,возможно ли такое сделать? именно на доспех
Это можно сделать с помощью оверлеев, те через аниму скриптами такое не потянуть..
 

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.226
Благодарности
1.907
Баллы
370
Один из возможных вариантов так называемой фичи "Приручение животных" при помощи подкидывания им пищи. Однако есть баги с инициализацией нужного предмета, несмотря на то, что в условии активации состояния ZS_MM_EatItem прописаны нужные предметы, монстры почему то фокусируются на рандомных предметах... :(
Как то можно пофиксить эту хрень на уровне скриптов?
Функция пока разумеется тестовая, заместо полноценного состояния "Приручения" на данный момент используется состояние "Призванного" существа:
Daedalus:
func void B_MM_AssessItem()        // kann auch durch QuietSound aufgerufen werden
{
    if(Npc_GetDistToItem(self,item) < 1500 && (Hlp_IsItem(item,ItfoApple) && self.guild == GIL_SCAVENGER) || (Hlp_IsItem(item,ItfoMutton) && (self.guild == GIL_WOLF || self.guild == GIL_SHADOWBEAST || self.guild == GIL_ORCDOG || self.guild == GIL_SNAPPER || self.guild == GIL_SCAVENGER || self.guild == GIL_LURKER)))
    {
        AI_StartState    (self, ZS_MM_EatItem, 0 ,"");
    };
};
// ----------------------------------------------------------------------------
func void ZS_MM_EatItem()
{
    Npc_PercEnable        (self,    PERC_ASSESSDAMAGE,    B_MM_ReactToDamage);
    Npc_PercEnable        (self,    PERC_ASSESSMAGIC,    B_AssessMagic);
    Npc_PercEnable        (self,    PERC_ASSESSENEMY,    B_MM_AssessEnemy);
    Npc_PercEnable        (self,    PERC_ASSESSWARN,    B_MM_AssessWarn);
    PrintScreen(item.name,-1,-1,"font_old_20_white.tga",3);
    if(Hlp_IsItem(item,ItfoApple) || Hlp_IsItem(item,ItfoMutton))
    {
    AI_SetWalkmode        (self, NPC_RUN);
    AI_PlayAni            (self,    "T_PERCEPTION");
    AI_GotoItem            (self,    item);
    AI_PlayAni            (self,    "T_STAND_2_EAT");
    }
    else
    {
    Npc_ClearAIQueue(self);
    Npc_PercDisable        (self,PERC_ASSESSITEM);
    Npc_PercEnable(self,PERC_ASSESSITEM,B_MM_AssessItem);
    };
};

func int ZS_MM_EatItem_loop()
{
  if(Hlp_IsItem(item,ItfoApple) || Hlp_IsItem(item,ItfoMutton))
  {
    if (Npc_GetStateTime(self) > 10)
    {
        PrintScreen("ok",-1,-1,"font_old_20_white.tga",3);
        return 1;
    };
    if (!Hlp_IsValidItem(item))    //Item weg
    {
        return 1;
    };
    return 0;
   };
   Npc_SetPercTime(self,0.1);
   return 1;
};

func void ZS_MM_EatItem_end()
{
if(Hlp_IsItem(item,ItfoApple) || Hlp_IsItem(item,ItfoMutton))
{
    if (Hlp_IsValidItem    (item))
    {
        Wld_RemoveItem    (item);
    };
    AI_PlayAni        (self,    "T_EAT_2_STAND");
    AI_StartState    (self,ZS_MM_SummonedByPC, 0 ,"");
};
};

 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.125
Благодарности
3.218
Баллы
485
несмотря на то, что в условии активации состояния ZS_MM_EatItem прописаны нужные предметы, монстры почему то фокусируются на рандомных предметах...
Мне кажется, или ZS_MM_EatItem_loop() всегда возвращает 1 (TRUE), сразу переходя к ZS_MM_EatItem_end? Тут нужен LOOP_CONTINUE, пока предмет не будет съеден.
И вроде информация об обнаруженном предмете никак не передается в ZS_MM_EatItem? item там может быть чем угодно.
Попробуй так:
Daedalus:
if(Hlp_IsItem(item,ItfoApple) || Hlp_IsItem(item,ItfoMutton))
{
    PrintScreen(item.name,-1,-1,"font_old_20_white.tga",3);
    AI_SetWalkmode        (self, NPC_RUN);
    AI_PlayAni            (self,    "T_PERCEPTION");
    AI_GotoItem            (self,    item);
    AI_PlayAni            (self,    "T_STAND_2_EAT");
}

Далее, можно подсмотреть проверку предметов у ищущего огонька из Г2НВ:
PHP:
SearchFlags = ITEM_KAT_NONE | ITEM_KAT_KEYS | ITEM_KAT_ARMOR;
if(Wld_DetectItem(self,SearchFlags))
{
   ....
};
А SP позволяет назначать особый флаг предмету, который выбрасывает ГГ:
— Выброшенные предметы получают флаг ITEM_DROPPED.
В файл скриптов constants.d нужно добавить:
Код:
const int ITEM_DROPPED = 1<<24;
 
Последнее редактирование:

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.226
Благодарности
1.907
Баллы
370
Мне кажется, или ZS_MM_EatItem_loop() всегда возвращает 1 (TRUE), сразу переходя к ZS_MM_EatItem_end? Тут нужен LOOP_CONTINUE, пока предмет не будет съеден.
Нет, здесь всё нормально, данная часть функции возвращает 1 если: предмет не является яблоком или куском мяса, если ссылка на кусок мяса или яблоко больше не действительна и если нпс находится в состоянии 10 секунд.
Далее, можно подсмотреть проверку предметов у ищущего огонька из Г2НВ:
PHP:
SearchFlags = ITEM_KAT_NONE | ITEM_KAT_KEYS | ITEM_KAT_ARMOR;
if(Wld_DetectItem(self,SearchFlags))
{
   ....
};
С этой функцией тоже уже намучился, в условии активации состояния толку от неё 0, потому как её работа дублирует активацию самого восприятия - Npc_PercEnable(self,PERC_ASSESSITEM,B_MM_AssessItem);
И проблема еще в том, что эта функция определяет только лишь категорию предмета, а не саму инстанцию...
А SP позволяет назначать особый флаг предмету, который выбрасывает ГГ:
Так, это может оказаться полезным... Будем пробовать..
 

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.226
Благодарности
1.907
Баллы
370
Потестировал инициализирование предмета конкретным нпс через диалог (как это реализовано у магического огонька), в таком случае всегда инициализируется нужный предмет, вот как пример:
Daedalus:
instance Info_Diego_Test(C_Info)
{
    npc = PC_Thief;
    nr = 1;
    condition = Info_Diego_Test_Condition;
    information = Info_Diego_Test_Info;
    permanent = 1;
    description = "Тест";
};


func int Info_Diego_Test_Condition()
{
        if(Npc_KnowsInfo(hero,Info_Diego_Gamestart))
        {
            return TRUE;
        };
};

func void Info_Diego_Test_Info()
{
    AI_Output(hero,self,"Info_Diego_Test_15_01");    //Эй Диего, принеси-ка мне вон то яблоко...
    AI_Output(self,hero,"Info_Diego_Test_11_01");    //Окей..
    B_StandUp(self);
    AI_PlayAni            (self,    "T_SEARCH");
    Npc_PerceiveAll(self);
    if(Npc_GetDistToItem(self,item) < 1500 && (Hlp_IsItem(item,ItfoApple) && Wld_DetectItem (self,ITEM_THROW)))
    {
        AI_SetWalkmode        (self, NPC_RUN);
        PrintScreen(item.name,-1,-1,"font_old_20_white.tga",3);
        AI_GotoItem            (self,    item);
        AI_TakeItem            (self,    item);
        AI_TurnToNPC (self,hero);
        AI_GotoNpc            (self,    hero);
        AI_Output(self,hero,"Info_Diego_Test_11_02");    //Держи.
        AI_DropItem(self, itfoapple);
    //    AI_StartState    (self, ZS_MM_EatItem, 0 ,"");
    }
    else
    {
    AI_Output(self,hero,"Info_Diego_Test_11_03");    //Я не вижу никаких яблок.
    };  
};

Daedalus:
if(Npc_GetDistToItem(self,item) < 1500 && (Hlp_IsItem(item,ItfoApple) && Wld_DetectItem (self,ITEM_THROW)))
Но если же данное условие использовать в функции B_MM_AssessItem активируемой восприятием предмета -
Daedalus:
Npc_PercEnable(self,PERC_ASSESSITEM,B_MM_AssessItem);
то нпс будет инициализироваться любой рандомный предмет (!)
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
А откуда этот фетиш? Приду домой гляну че у вас не работает, если время найду конечно. Мне кажется вы слегка неправильно понимаете процедуру поиска.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
Ну пока примерно так. небольшая функция-расширение на стандартный вызов восприятия.
Для ее работы в скрипте должна быть определена функция func int PerceptionCheckItems(var C_NPC npc, var C_ITEM itm)
1554326159847.png

За каждый проход цикла в данную функцию будут переданы все предметы в доступном окружении нпс, где первый подходящий объект создает ИИ стек и завершает перебор списка.
Daedalus:
const int find_next = 1;
const int find_stop = 0;

func int PerceptionCheckItems(var C_NPC npc, var C_ITEM itm)
{
    if(Hlp_IsItem(itm, ItfoApple))
    {
        // действие над предметом (из примера @MaGoth)
        AI_SetWalkmode  (npc,  NPC_RUN);
        AI_PlayAni            (npc, "T_PERCEPTION");
        AI_GotoItem         (npc, itm);
        AI_PlayAni            (npc, "T_STAND_2_EAT");
        return find_stop;
    }
    return find_next;
};
 

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.226
Благодарности
1.907
Баллы
370
Gratt , использую данную функцию для перевода нпс в состояние восприятия предмета ZS_MM_EatItem. Такой вариант вроде как нормально работает, PerceptionCheckItems перебирает предметы и когда находит нужный запускает состояние поедания предмета, сама эта функция вызывается прямо из B_MM_AssessItem:
Daedalus:
const int find_next = 1;
const int finc_stop = 0;

func int PerceptionCheckItems(var C_NPC npc,var C_item itm)
{
    if(Hlp_IsItem(itm,ItfoApple))
    {
        if(npc.guild == GIL_SCAVENGER)
        {
            Npc_PercDisable(npc,PERC_ASSESSITEM);
            Npc_ClearAIQueue(npc);
            AI_StartState (npc, ZS_MM_EatItem, 0 ,"");
        };
        return finc_stop;
    };
  
    if(Hlp_IsItem(itm,ItFoLoaf))
    {
        if(npc.guild == GIL_SCAVENGER)
        {
            Npc_PercDisable(npc,PERC_ASSESSITEM);
            Npc_ClearAIQueue(npc);
            AI_StartState (npc, ZS_MM_EatItem, 0 ,"");
        };
        return finc_stop;
    };
  
    if(Hlp_IsItem(itm,ItfoMutton))
    {
        if((npc.guild == GIL_WOLF) || (npc.guild == GIL_SHADOWBEAST) || (npc.guild == GIL_ORCDOG) || (npc.guild == GIL_SNAPPER) || (npc.guild == GIL_SCAVENGER) || (npc.guild == GIL_LURKER))
        {
            Npc_PercDisable(npc,PERC_ASSESSITEM);
            Npc_ClearAIQueue(npc);
            AI_StartState (npc, ZS_MM_EatItem, 0 ,"");
        };
        return finc_stop;
    };
  
    if(Hlp_IsItem(itm,ItfoMuttonRaw))
    {
        if((npc.guild == GIL_WOLF) || (npc.guild == GIL_SHADOWBEAST) || (npc.guild == GIL_ORCDOG) || (npc.guild == GIL_SNAPPER) || (npc.guild == GIL_SCAVENGER) || (npc.guild == GIL_LURKER))
        {
            Npc_PercDisable(npc,PERC_ASSESSITEM);
            Npc_ClearAIQueue(npc);
            AI_StartState (npc, ZS_MM_EatItem, 0 ,"");
        };
        return finc_stop;
    };
  
    if(Hlp_IsItem(itm,ItFo_mutton_01))
    {
        if((npc.guild == GIL_WOLF) || (npc.guild == GIL_SHADOWBEAST) || (npc.guild == GIL_ORCDOG) || (npc.guild == GIL_SNAPPER) || (npc.guild == GIL_SCAVENGER) || (npc.guild == GIL_LURKER))
        {
            Npc_PercDisable(npc,PERC_ASSESSITEM);
            Npc_ClearAIQueue(npc);
            AI_StartState (npc, ZS_MM_EatItem, 0 ,"");
        };
        return finc_stop;
    };
  return find_next;
};

func void B_MM_AssessItem()
{
    PerceptionCheckItems(self,item);
};

// ----------------------------------------------------------------------------
func void ZS_MM_EatItem()
{
    Npc_PercEnable        (self,    PERC_ASSESSDAMAGE,    B_MM_ReactToDamage);
    Npc_PercEnable        (self,    PERC_ASSESSMAGIC,    B_AssessMagic); 
    Npc_PercEnable        (self,    PERC_ASSESSENEMY,    B_MM_AssessEnemy);
    Npc_PercEnable        (self,    PERC_ASSESSWARN,    B_MM_AssessWarn);
    PrintScreen(item.name,-1,-1,"font_old_20_white.tga",3);
    if(Hlp_IsItem(item,ItfoApple) || Hlp_IsItem(item,ItfoMutton) || Hlp_IsItem(item,ItFoLoaf) || Hlp_IsItem(item,ItfoMuttonRaw) || Hlp_IsItem(item,ItFo_mutton_01))
    {
    AI_SetWalkmode        (self, NPC_RUN);
    AI_PlayAni            (self,    "T_PERCEPTION");
    AI_GotoItem            (self,    item);
    AI_PlayAni            (self,    "T_STAND_2_EAT");
    }
    else
    {
    Npc_ClearAIQueue(self);
    Npc_PercDisable        (self,PERC_ASSESSITEM);
    Npc_PercEnable(self,PERC_ASSESSITEM,B_MM_AssessItem);
    };
};

func int ZS_MM_EatItem_loop()
{
  if(Hlp_IsItem(item,ItfoApple) || Hlp_IsItem(item,ItfoMutton) || Hlp_IsItem(item,ItFoLoaf) || Hlp_IsItem(item,ItfoMuttonRaw) || Hlp_IsItem(item,ItFo_mutton_01))
  {
    if (Npc_GetStateTime(self) > 10)
    {
        PrintScreen("ok",-1,-1,"font_old_20_white.tga",3);
        return 1;
    };
    if (!Hlp_IsValidItem(item))    //Item weg
    {
        return 1;
    };
    return 0;
  };
   return 1;
};

func void ZS_MM_EatItem_end()
{
if(Hlp_IsItem(item,ItfoApple) || Hlp_IsItem(item,ItfoMutton) || Hlp_IsItem(item,ItFoLoaf) || Hlp_IsItem(item,ItfoMuttonRaw) || Hlp_IsItem(item,ItFo_mutton_01))
{
    if (Hlp_IsValidItem    (item))
    {
        Wld_RemoveItem    (item);
    };
    AI_PlayAni        (self,    "T_EAT_2_STAND");
//    AI_StartState    (self,ZS_MM_SummonedByPC, 0 ,"");
};
};
Ложные инициализации при подобной реализации практически не появляются, лишь в очень редких случаях, но они никак практически не влияют на общий результат..
 
Последнее редактирование:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
Phantom95
Твой код в корне неверен. Функция PerceptionCheckItems не должна вызываться скриптом, поскольку вызов идет на уровне движка => ложных срабатываний не может быть в принципе. Кинь мне свои данные скайпа в лс, проще объяснить на пальцах.
 

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.226
Благодарности
1.907
Баллы
370
Phantom95
Твой код в корне неверен. Функция PerceptionCheckItems не должна вызываться скриптом, поскольку вызов идет на уровне движка => ложных срабатываний не может быть в принципе.
На данный момент как-то можно сделать по другому?

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.181
Баллы
525
За каждый проход цикла в данную функцию будут переданы все предметы в доступном окружении нпс, где первый подходящий объект создает ИИ стек и завершает перебор списка.
Daedalus:
const int find_next = 1;
const int find_stop = 0;

func int PerceptionCheckItems(var C_NPC npc, var C_ITEM itm)
{
    if(Hlp_IsItem(itm, ItfoApple))
    {
        // действие над предметом (из примера @MaGoth)
        AI_SetWalkmode  (npc,  NPC_RUN);
        AI_PlayAni            (npc, "T_PERCEPTION");
        AI_GotoItem         (npc, itm);
        AI_PlayAni            (npc, "T_STAND_2_EAT");
        return find_stop;
    }
    return find_next;
};
Проблема в том, что "действие" должно происходить в полноценном ZS-состоянии, включающем в себя стартовую, циклическую и завершающую функции. Это нужно хотя бы потому, что в конце процесса предмет должен быть "съеден", то есть, он должен исчезнуть из мира. Так вот, при старте этого состояния туда, похоже, не передаётся ссылка на обнаруженный функцией предмет. Или передаётся, но не запоминается. Если алгоритм работает у одного болванчика, и глобальная ссылка item не обновляется, то всё работает более-менее гладко. Но если рядом есть куча болванчиков, то ссылка item обновляется по ходу работы агоритма, и он не работает правильно. Возможно, причина в том, что болванчики в данном случае являются клонами одной инстанции. :confused:
 

LittleLight

Участник форума
Регистрация
5 Апр 2019
Сообщения
6
Благодарности
0
Баллы
100
Приветствую! Возможно ли как-то получить координаты (т.е просто положение на карте) игрока и каким-то образом вывести это в текстовый документ в папке с игрой?
 

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.226
Благодарности
1.907
Баллы
370
Кто-нибудь помнит используется ли данная текстура листвы в релизе готики 2?

bandicam 2019-04-05 14-41-08-940.png
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
Приветствую! Возможно ли как-то получить координаты (т.е просто положение на карте) игрока и каким-то образом вывести это в текстовый документ в папке с игрой?
Нет, но возможно с костылями получиться..
 

LittleLight

Участник форума
Регистрация
5 Апр 2019
Сообщения
6
Благодарности
0
Баллы
100
Извините за возможно крайне тупой вопрос, но можно ли как-то добавить свою музыку в игру? Как-то сконвертировать .mp3 в .sgt или что-то в этом духе.
 
Сверху Снизу