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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

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

В разработке... useWithItem и ConditionFunc для MobInter

Бене Гессерит это


  • Всего проголосовало
    9

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
  • Первое сообщение
  • #1
MobInter содержит «вшитую» проверку на предмет необходимый герою для взаимодействия с Mob'ом. Данный плагин «отвязывает» проверку на WithItem , осуществляя перехват функции разрешающий взаимодействие с объектом в новой общей Condition функции вызываемой из скриптов.

Спасибо ElderGamer за идею, спасибо Xeдин за реализацию, спасибо Gratt за то что лишил нас костылей, спасибо Slavemaster за то что делает Юнион совершенным.

***

После установки плагина на уровне скриптов надо добавить две функции:
  • G_MobInter_CanInteractWith – разрешает / запрещает взаимодействие с моб объектом.
  • G_MobInter_UseWithItem – заменяет Item(при необходимости)
  • G_MobInter_SendCallOnStateFunc - заменяет StateFunc функции(при необходимости)
Функция G_MobInter_CanInteractWith "общая" для всех МОБ'ов. В ней можно прописать вызов отдельных кондишен функцию для конктерных МОБ объектов с которыми взаимодействует герой.
Daedalus:
// функция вызывается движком если НПС - герой
func int G_MobInter_CanInteractWith(var string sceme, var int useWithItem)
{
    Hlp_PrintConsole(Str_Format("   G_MobInter_CanInteractWith:  sceme: %s useWithItem (%i)", sceme, useWithItem));
 
    if  (Hlp_StrCmp(sceme,"LAB"))       {   return C_Hero_GetInv_MobInterItem(ItMi_Flask);  };
    //if  (Hlp_StrCmp(sceme,"RMAKER"))    {    return hero_RMaker_Condition(useWithItem);   };// это рунный стол, делаем проверку внутри HERO_ALCHEMY_CONDITION
 
    if  (useWithItem == -1)              {   return true;    }; // Item не требуется
 
    return C_Hero_GetInv_MobInterItem(useWithItem);             // вроверка на наличие у героя Item
};
Внутри функции кондишион моба можно делать проверку на необходимые условия для взаимодействием с данным мобом, как в оригинальных скриптах: наличие у героя каких то вещей , навыков, времени суток, наличие друзей / врагов рядом и так далее.

Для прочих объектов я написал черновик универсальной функции C_Hero_GetInv_MobInterItem.
Daedalus:
func int C_Hero_GetInv_MobInterItem(var int useWithItem)
{
    if (Npc_GetInvItem(hero,useWithItem))
    {
        return true;    // у героя есть предмет -- > взаимодействие
    };
 
    // создаём красивый отказ от взаимодействия
    CreateInvItem(hero,useWithItem);
 
    var string msg;
    msg = ConcatStrings("Для использования необдим: ", item.name) ;
    PrintDialog( 1, msg , -1, -1, FONT_ScreenSmall, 2);
    AI_PlayAni(hero,"T_DONTKNOW");
 
    Npc_RemoveInvItem(hero,useWithItem);
 
    return false;
};
В ней проверяется есть ли у героя предмет для взаимодействия с МОБом, если его нет то выводится какое-то сообщение и/или герой машет руками и/или герой что то говорит. То есть данная функция дописывается/настраивается согласно тому как автор видит данное событие.
1686181406672.png
1686181427399.png

***

Из бонусов:
  • теперь предмет необходимый для взаимодействия с мобом не будет удалять у героя движок. То есть в диалоге выхода из производства не придётся создавать «неиспользованную» руну/колбу/заготовку.
  • в функции C_MobInter_UseWithItem можно заменить item который герой будет использовать при взаимодействие с МОБ'ом.

Daedalus:
// функция вызывается движком  если НПС - герой
func int G_MobInter_UseWithItem(var string sceme, var int useWithItem)
{
    Hlp_PrintConsole(Str_Format(" call G_MobInter_UseWithItem sceme: %s, useWithItem: %i", sceme, useWithItem));
 
    if (Hlp_StrCmp(sceme,"LAB"))    { return C_MobInter_UseNewItem(ItMi_Flask_fake); };
 
    // возвращаем оригинальную инстанцию
    return useWithItem;
};


***
Daedalus:
func int G_MobInter_SendCallOnStateFunc(var string sceme, var int state)
{
    Hlp_PrintConsole(Str_Format(" call G_MobInter_SendCallOnStateFunc sceme: %s, state: %i", sceme, state));
};
 

Вложения

  • 2023_06_16_zMobInet.zip
    92,9 KB · Просмотры: 3
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.409
Благодарности
3.239
Баллы
525
Дык, я тоже, вроде бы, слышал про это. Получается, что нет? Нужно проверить.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.409
Благодарности
3.239
Баллы
525
Установил zParserExtender.vdf через Resource Manager. Не помогло, функция не распознаётся.

Error-Mesage_01.jpg


Что бы это могло значить?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Ты же на Готики 2 НВ пробуешь? Скинь файл
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.409
Благодарности
3.239
Баллы
525
Не понимаю. Если таки речь идёт о скриптах, то пытаюсь воспользоваться приведёнными тобой примерами. Там функция, которую движок не узнаёт, упоминается один раз.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
в таком случае мы пришли к логическому концу:) оставайтесь с вашим непониманием на едини в интимной атмосфере. не буду мешать :)

***
хотя конечно можно пофантазировать на тему что там происходит :) если в новом отдельном файле сделать три строчки
Daedalus:
func void Npc_RemoveRightHandItem()
{
    Npc_RemoveFromSlot(hero,"ZS_RIGHTHAND",0);
};

тоже будет ругаться?
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.409
Благодарности
3.239
Баллы
525
будет ругаться?
Будет. А если закомментировать строчку с вызовом функции Npc_RemoveFromSlot, начнёт ругаться на функцию Npc_PutInSlot. Думаю, нужно автора спрашивать. Gratt, что скажешь?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.469
Благодарности
1.993
Баллы
365
Актуальный юнион со встроенным парсером старее, чем последний коммит в парсере.

1686356096541.png


1686355972101.png


Версия парсера в ресурс менеджере и в офлайн установщике еще старее. (2021 год). То есть то, что вы ставите zParserExtender.vdf в принципе не работает, так как во встроенном парсере из Union.vdf уже есть версионность и приоритет у актуальной версии. Новой собранной версии в отрытом доступе похоже нет. Только самому собирать.
MW 7 у тебя если работает, значит новее версия в Autorun скорее всего. Или более вероятный вариант что новая версия с каким-нибудь плагином от Slavemaster идет :) Можно включить и посмотреть откуда грузится
[CORE]
ShowDebugWindow = true
UseDebugWindowHost = true
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
@MW 7 у тебя если работает, значит новее версия в Autorun скорее всего. Или более вероятный вариант что новая версия с каким-нибудь плагином от Slavemaster идет :) Можно включить и посмотреть откуда грузится
Не бачу логики. Дело не в том что оно работает у меня, а в том что оно не работает у ElderGamer. Ввиду того что файла _work.d у меня нет, то получается угадайка: может быть дело в самом название файла _work.d , может быть дело в то что там написано внутри. Может быть с файлом всё в порядке, а действительно не грузится zParserExtender.
Лично я склонен считать что проблема заключается в том что ElderGamer не принял участие в голосование касательно ордена Бене Гессерит, в связи с чем был ограничен в правах.
 
Последнее редактирование:

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.469
Благодарности
1.993
Баллы
365
Не бачу логики.
Логика простая, в доступном парсер экстендере нет Npc_PutInSlot и Npc_RemoveFromSlot, так как они были добавлены позже. Смотри последний коммит и дату


не работает у ElderGamer
Они ни у кого не работают на актуальном парсере.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295

Вложения

  • zParserExtender.zip
    298,8 KB · Просмотры: 5

MEG@VOLT

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.638
Баллы
625
Ближайшее время вообще ничего не будет обновляться. Сейчас идет сложная работа над архитектурой самого Union, через какое-то время буду переводить на нее все плагины, в т.ч. со всеми вот этими не вошедшими функциями.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
проверка для FIREPLACE
Daedalus:
    if (Npc_IsPlayer(self))
    {
        var c_item LeftItm;     LeftItm = Npc_GetLeftHandItem(hero);    
        if (Hlp_IsItem(LeftItm, ItLsTorchburning) == true)
        {
            return true;
        };
        B_PrintMobsiFalse("Нужент факел!");
        return false;
    };


***

проверка на то горит или нет. это если сильно заморачиваться и/или хочется реализовать "прикуривание" от огня.
Daedalus:
class C_VOB {   };

class C_MobInter_DATA //- данные для интерактивного объекта oCMobInter
{
  var string TriggerTarget   ;  // - имя объекта, которое срабатывает при OnTrigger
  var string UseWithItem     ;  // - имя инстанции объекта, который необходим для взаимодействия
  var string Sceme           ;  // - имя сцены, которая соответствует анимациям объекта и персонажа
  var string ConditionFunc   ;  //- скриптовое условие, при котором взаимодействие может быть совершено
  var string OnStateFuncName ;  //- шаблон имени функций, которые будут вызываться при изменении состояния объекта
  var int State              ;  //- текущее состояние объекта
  var int State_num          ;  //- количество состояний объекта
  var int State_target       ;  //- текущее состояние объекта
  var int Rewind             ;  //- запрещает обновление объекта
  var int MobStateAni        ;  //- текущая анимация обоъекта
  var int NpcStateAni        ;  //- текущая анимация персонажа
};

class C_MOB_DATA //- данные для используемого объекта oCMOB
{
  var string VisibleName     ;  //- отображаемое над объектом имя
  var int Hitpoints          ;  //- количество 'здоровья'
  var int Damage             ;  //- урон, который может наносить объект
  var int IsDestroyed        ;  //- уничтожен ли объект
  var int Moveable           ;  //- может ли объект быть перемещен
  var int Takeable           ;  //- может ли объект быть взят
  var int FocusOverride      ;  //- будет ли объект переопределять фокус в режиме боя
  var int SndMat             ;  //- материал объекта (0 - дерево, 1 - камень, 2 - металл, 3 - кожа, 4 - глина, 5 - стекло)
  var string VisualDestroyed ;  //- модель, когда объект уничтожен
  var string OwnerStr        ;  //- имя инстанции хозяина объекта
  var string OwnerGuildStr   ;  //- имя гильдии объекта
  var int Owner              ;  //- инстанция хозяина
  var int OwnerGuild         ;  //- инстанция гильдии
  var int FocusNameIndex     ;  //- скриптовая строка отображаемого имени
};


Daedalus:
    var C_VOB zKA_Focus_VobFIREPLACE;      zKA_Focus_VobFIREPLACE = Hlp_GetFocusVob (hero);
   .
    if Cast_InstanceIsMob(zKA_Focus_VobFIREPLACE)                              
    {
        var C_MobInter_DATA MobInterFIREPLACE;    MobInterFIREPLACE = Vob_GetMobInterData(zKA_Focus_VobFIREPLACE);

        if MobInterFIREPLACE.State_target == 1 // уже горит
        {
            B_PrintMobsiFalse("Уже Горит!");
            return false;    
        };
    };
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.409
Благодарности
3.239
Баллы
525
Появилась возможность поэкспериментировать со сковородой. Или я что-то не так делаю, или имеется возможность получить следующую ситуацию:

Pan_Trouble_01.jpg


Взаимодействие со сковородой разрешается, даже если ГГ находится не в подходящей позиции.
 
Сверху Снизу