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

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

В разработке... Union. Пожелания насчёт плагинов

almighty061

Участник форума
Регистрация
12 Фев 2022
Сообщения
7
Благодарности
2
Баллы
20
Hi, sorry for using English but I don't know Russian.

Could someone make a plugin to switch inventory tabs exactly like in Archolos? Shift + arrows. I've seen the inventory plugins, but the original inventory look is cool, I'd like to keep it
 

Vic7im

Участник форума
Регистрация
15 Мар 2016
Сообщения
49
Благодарности
18
Баллы
175
Hello everyone!

I wonder if it's possible to unlock the full front combos for NPCs or at least pick from front attack frames 1-2 and 3-4 from time to time, to spice combat up...
Or at the very least adding different damage frames inside a single animation (IE: animation is NPC swinging twice, but dmg is calculated once, can something be done to that so that the game registers 2 damage instances instead of 1?)
 

Vzhik

Участник форума
Регистрация
27 Фев 2020
Сообщения
233
Благодарности
37
Баллы
140
Пожелание одно - добавить в репозитой боьлше плагинов. А что чтоб найти нужный на форуме приходиться спрашивать. Дичь. если честно.
 

Orc Hunter


Модостроитель
Регистрация
12 Окт 2013
Сообщения
1.269
Благодарности
1.667
Баллы
305
Приветствую! В Сиквеле хотели разнообразить ремесло, в частности за счет визуализации процесса, в чем помогали функции "AI_RemoveItemfromSlot" и "AI_CreateIteminSlot". Поместить предмет в слот не является проблемой, но вот заставить это работать в порядке очереди, как это работало в Сиквеле у меня не вышло.
Вот пример того о чем я говорю:
Код:
    ai_createiteminslot(self,"ZS_LEFTHAND",4477);
    AI_PlayAni(self,"T_BSANVIL_RANDOM_1");
    ai_removeitemfromslot(self,"ZS_LEFTHAND");
    ai_createiteminslot(self,"ZS_LEFTHAND",4481);
    AI_PlayAni(self,"T_BSANVIL_RANDOM_2");
Можно ли сделать плагин восстанавливающий эти две функции?
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.077
Благодарности
1.896
Баллы
290
Можно ли сделать плагин восстанавливающий эти две функции?
Эти функции достаточно низкоуровневые, поэтому предложу альтернативу: имитацию событий анимаций. Будет 2 функции:
  1. Npc_TriggerAniEvent - обрабатывает событие мгновенно
  2. AI_TriggerAniEvent - ставит событие в очередь
Аргументы:
  1. NPC
  2. Идентификатор события: число от 6 до 11, соответствующее этим константам
    1645383374996.png


  3. Строка - название связанного слота
  4. Целое число - индекс предмета или -1
Пример вызова: AI_TriggerAniEvent(hero, 11, "ZS_LEFTHAND", ItFo_Bread)

Чтобы новые функции корректно добавились, необходимо активировать плагин zParserExtender.
C++:
namespace NAMESPACE
{
    oCMsgManipulate* TriggerAniEventImpl(oCNpc*& npc)
    {
        int subtype;
        zSTRING slotName;
        int instance;

        ZARGS(npc, subtype, slotName, instance);

        if (npc && npc->homeWorld && subtype >= oCMsgManipulate::EV_INSERTINTERACTITEM && subtype <= oCMsgManipulate::EV_EXCHANGEINTERACTITEM)
        {
            zSTRING itemName = (instance > 0) ? COA(parser, GetSymbol(instance), name) : "";
            return new oCMsgManipulate(static_cast<oCMsgManipulate::TManipulateSubType>(subtype), itemName, slotName);
        }

        return nullptr;
    }

    int __cdecl AI_TriggerAniEvent()
    {
        ParserScope scope{ parser };
        oCNpc* npc;

        if (oCMsgManipulate* message = TriggerAniEventImpl(npc))
            npc->GetEM()->OnMessage(message, npc);

        return false;
    }

    int __cdecl Npc_TriggerAniEvent()
    {
        ParserScope scope{ parser };
        oCNpc* npc;

        if (ZOwner<oCMsgManipulate> message{ TriggerAniEventImpl(npc) })
            npc->OnMessage(message.get(), npc);

        return false;
    }

    ZEXTERNAL(void, AI_TriggerAniEvent, oCNpc*, int, zSTRING, int);
    ZEXTERNAL(void, Npc_TriggerAniEvent, oCNpc*, int, zSTRING, int);
}
 

Вложения

  • zOrcHunter.vdf
    94,5 KB · Просмотры: 9
Последнее редактирование:

Orc Hunter


Модостроитель
Регистрация
12 Окт 2013
Сообщения
1.269
Благодарности
1.667
Баллы
305
Эти функции достаточно низкоуровневые, поэтому предложу альтернативу: имитацию событий анимаций. Будет 2 функции:
  1. Npc_TriggerAniEvent - обрабатывает событие мгновенно
  2. AI_TriggerAniEvent - ставит событие в очередь
Аргументы:
  1. NPC
  2. Идентификатор события: число от 6 до 11, соответствующее этим константам
    Посмотреть вложение 103905

  3. Строка - название связанного слота
  4. Целое число - индекс предмета или -1
Пример вызова: AI_TriggerAniEvent(hero, 11, "ZS_LEFTHAND", ItFo_Bread)

Чтобы новые функции корректно добавились, необходимо активировать плагин zParserExtender.
C++:
namespace NAMESPACE
{
    oCMsgManipulate* TriggerAniEventImpl(oCNpc*& npc)
    {
        int subtype;
        zSTRING slotName;
        int instance;

        ZARGS(npc, subtype, slotName, instance);

        if (npc && npc->homeWorld && subtype >= oCMsgManipulate::EV_INSERTINTERACTITEM && subtype <= oCMsgManipulate::EV_EXCHANGEINTERACTITEM)
        {
            zSTRING itemName = (instance > 0) ? COA(parser, GetSymbol(instance), name) : "";
            return new oCMsgManipulate(static_cast<oCMsgManipulate::TManipulateSubType>(subtype), itemName, slotName);
        }

        return nullptr;
    }

    int __cdecl AI_TriggerAniEvent()
    {
        ParserScope scope{ parser };
        oCNpc* npc;

        if (oCMsgManipulate* message = TriggerAniEventImpl(npc))
            npc->GetEM()->OnMessage(message, npc);

        return false;
    }

    int __cdecl Npc_TriggerAniEvent()
    {
        ParserScope scope{ parser };
        oCNpc* npc;

        if (ZOwner<oCMsgManipulate> message{ TriggerAniEventImpl(npc) })
            npc->OnMessage(message.get(), npc);

        return false;
    }

    ZEXTERNAL(void, AI_TriggerAniEvent, oCNpc*, int, zSTRING, int);
    ZEXTERNAL(void, Npc_TriggerAniEvent, oCNpc*, int, zSTRING, int);
}
Вещи которые были в руках(от стандартной анимации наковальни) исчезают вовремя, но замена не появляется. Что я сделал неправильно? Возможно неправильно добавил функции в ExternalFuncs.d?
Код:
void Npc_TriggerAniEvent(instance,int,string,int);
void AI_TriggerAniEvent(instance,int,string,int);

p.s. Разобрался, все отлично работает. Спасибо!
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.231
Баллы
525
В связи с вопросом, описанным выше, есть ещё одно пожелание. В Сиквеле разрабы отказались от точного указания предмета для взаимодействия с интерактивным объектом в свойствах самого объекта (useWithItem). Проверка соблюдения необходимых условий взаимодействия производится в скриптовой функции (conditionFunc), а предметы в слотах вставляются, удаляются и заменяются с помощью упомянутых выше функций. Это означает, что внесение изменений в процесс крафта требует внесения правок в игровой мир, в свойства всех соответствующих объектов.

Есть ли возможность заставить движок игнорировать инстанцию, прописанную в параметре useWithItem объекта? Если да, то можно ли это сделать только для взаимодействия ГГ с определённым набором объектов (объекты для крафта).
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.077
Благодарности
1.896
Баллы
290
Есть ли возможность заставить движок игнорировать инстанцию, прописанную в параметре useWithItem объекта? Если да, то можно ли это сделать только для взаимодействия ГГ с определённым набором объектов (объекты для крафта).
Наверняка можно.
 

4YBAK

Участник форума
Регистрация
27 Окт 2009
Сообщения
155
Благодарности
81
Баллы
300
Здравствуйте, товарищи!
Я тут занимаюсь созданием машинимы, и мне ужасно нужна ваша помощь. Мне помогал Осмит, но я не знаю, найдётся ли у него ещё свободное время для меня.
1. Смогли бы вы сделать плагин, который позволял бы замораживать/размораживать NPC на манер функции клавиши F9 (заморозка мира) при включённом марвине, как одинокую цель, так и всех, кто стоит вокруг игрока на определенном расстоянии? Это нужно для того, чтобы выдавать чит-кодом анимации NPC, чтобы при снятии заморозки они начинали проигрывать их единовременно. У Осмита это работало таким образом, что нужно было вводить ZSETFREEZE в марвине, при наведении на одинокого NPC, чтобы заморозить его, и ZSETFREEZE 3000, чтобы разморозить Всех NPC в указанном радиусе. К сожалению, я вовремя не затестил его плагин, и оказалось, что он при работе отключает полностью все чит-коды игры, кроме вышеобозначенной ZSETFREEZE. Исходники он удалил, и не помнит, как делал :C
2. Плагин для снятия коллизии с NPC, чтобы они проходили сквозь друг друга. Позволит производить парные анимации (объятия, например), чтобы при этом коллизия не мешала персонажам взаимодействовать друг с другом. Вводилась команда ZSWITCHCOLLISION при наведении фокуса на NPC. При повторном вводе коллизия возвращалась. Проблема та же самая - плагин отключал все чит-коды игры, оставляя рабочей лишь ZSWITCHCOLLISION.

Кто чем может помочь? :C
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.077
Благодарности
1.896
Баллы
290
4YBAK, попробуй его плагины вместе с моим. Если я правильно понял причину проблемы, то должно заработать.
 

Вложения

  • zUnlimitedConsole_G2A.vdf
    58 KB · Просмотры: 5

4YBAK

Участник форума
Регистрация
27 Окт 2009
Сообщения
155
Благодарности
81
Баллы
300
4YBAK, попробуй его плагины вместе с моим. Если я правильно понял причину проблемы, то должно заработать.
Сработало, спасибо! Только всё равно не работает у него функция разморозки НПС в указанном радиусе, только по одиночной цели, находящейся в фокусе, и без значения. Но это уже недоработка Осмита, похоже.
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.077
Благодарности
1.896
Баллы
290
4YBAK,
C++:
    int __cdecl Hlp_ToggleFocusSleep()
    {
        if (zCVob* vob = COA(player, GetFocusVob()))
            vob->SetSleeping(vob->sleepingMode == zVOB_AWAKE);

        return 0;
    }

    int __cdecl Hlp_ToggleMassSleep()
    {
        int radius;
        ZARGS(radius);

        if (!player)
            return 0;

        player->CreateVobList(static_cast<float>(radius));
        
        for (zCVob* vob : player->vobList)
            if (oCNpc* npc = dynamic_cast<oCNpc*>(vob))
                vob->SetSleeping(vob->sleepingMode == zVOB_AWAKE);

        return 0;
    }

    int __cdecl Hlp_ToggleFocusCollisions()
    {
        if (zCVob* vob = COA(player, GetFocusVob()))
            vob->SetCollDetDyn(!vob->collDetectionDynamic);

        return 0;
    }

    int __cdecl Hlp_ToggleMassCollisions()
    {
        int radius;
        ZARGS(radius);

        if (!player)
            return 0;

        player->CreateVobList(static_cast<float>(radius));

        for (zCVob* vob : player->vobList)
            if (oCNpc* npc = dynamic_cast<oCNpc*>(vob))
                vob->SetCollDetDyn(!vob->collDetectionDynamic);

        return 0;
    }

    ZEXTERNAL(void, Hlp_ToggleFocusSleep);
    ZEXTERNAL(void, Hlp_ToggleMassSleep, int);
    ZEXTERNAL(void, Hlp_ToggleFocusCollisions);
    ZEXTERNAL(void, Hlp_ToggleMassCollisions, int);
Вызывать функции можно с помощью команды call из плагина Union_MarvinHelper
 

Вложения

  • zCollisionsAndSleeping.vdf
    71,5 KB · Просмотры: 5

4YBAK

Участник форума
Регистрация
27 Окт 2009
Сообщения
155
Благодарности
81
Баллы
300
4YBAK,
C++:
    int __cdecl Hlp_ToggleFocusSleep()
    {
        if (zCVob* vob = COA(player, GetFocusVob()))
            vob->SetSleeping(vob->sleepingMode == zVOB_AWAKE);

        return 0;
    }

    int __cdecl Hlp_ToggleMassSleep()
    {
        int radius;
        ZARGS(radius);

        if (!player)
            return 0;

        player->CreateVobList(static_cast<float>(radius));
      
        for (zCVob* vob : player->vobList)
            if (oCNpc* npc = dynamic_cast<oCNpc*>(vob))
                vob->SetSleeping(vob->sleepingMode == zVOB_AWAKE);

        return 0;
    }

    int __cdecl Hlp_ToggleFocusCollisions()
    {
        if (zCVob* vob = COA(player, GetFocusVob()))
            vob->SetCollDetDyn(!vob->collDetectionDynamic);

        return 0;
    }

    int __cdecl Hlp_ToggleMassCollisions()
    {
        int radius;
        ZARGS(radius);

        if (!player)
            return 0;

        player->CreateVobList(static_cast<float>(radius));

        for (zCVob* vob : player->vobList)
            if (oCNpc* npc = dynamic_cast<oCNpc*>(vob))
                vob->SetCollDetDyn(!vob->collDetectionDynamic);

        return 0;
    }

    ZEXTERNAL(void, Hlp_ToggleFocusSleep);
    ZEXTERNAL(void, Hlp_ToggleMassSleep, int);
    ZEXTERNAL(void, Hlp_ToggleFocusCollisions);
    ZEXTERNAL(void, Hlp_ToggleMassCollisions, int);
Вызывать функции можно с помощью команды call из плагина Union_MarvinHelper
Игра не цепляет Union_MarvinHelper. Аналогичная проблема была с ремастером анимаций от Алекса в сборке Гратта. Ни ошибок, ничего, просто тупо игнорирует эти плагины.

upd.
Ан нет, цепанул. Только пришлось из VDF выдернуть DLL прямиком в Autorun. Правда там не обнаружил новых функций коллизии и заморозки.
 
Последнее редактирование:

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.077
Благодарности
1.896
Баллы
290
Игра не цепляет Union_MarvinHelper. Аналогичная проблема была с ремастером анимаций от Алекса в сборке Гратта. Ни ошибок, ничего, просто тупо игнорирует эти плагины.
Юнион какой версии стоит? Старые версии не читают тома из подпапки \Data\Plugins. Если версия 1.0L, то надо смотреть логи с ShowDebugWindow=true.
 

4YBAK

Участник форума
Регистрация
27 Окт 2009
Сообщения
155
Благодарности
81
Баллы
300
Юнион какой версии стоит? Старые версии не читают тома из подпапки \Data\Plugins. Если версия 1.0L, то надо смотреть логи с ShowDebugWindow=true.
Поставил Юнион последней версии. Папка Плагинов начала работать. При попытке вызвать коллизию или заморозку, просто пишет, что команда Call неизвестна, и ничего не происходит.
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.077
Благодарности
1.896
Баллы
290

Marek33

Участник форума
Регистрация
4 Апр 2015
Сообщения
8
Благодарности
4
Баллы
150
Здравствуйте!

Я хотел бы спросить, есть ли плагин, или если кто-то может сделать плагин с перемещающимся текстом (при получении XP, изучении вещей и т.д.), как в некоторых модах, или как в Gothic 3.
 

Czudak

Участник форума
Регистрация
29 Июн 2019
Сообщения
182
Благодарности
96
Баллы
175
Эти функции достаточно низкоуровневые, поэтому предложу альтернативу: имитацию событий анимаций. Будет 2 функции:
  1. Npc_TriggerAniEvent - обрабатывает событие мгновенно
  2. AI_TriggerAniEvent - ставит событие в очередь
Аргументы:
  1. NPC
  2. Идентификатор события: число от 6 до 11, соответствующее этим константам
    Посмотреть вложение 103905

  3. Строка - название связанного слота
  4. Целое число - индекс предмета или -1
Пример вызова: AI_TriggerAniEvent(hero, 11, "ZS_LEFTHAND", ItFo_Bread)

Чтобы новые функции корректно добавились, необходимо активировать плагин zParserExtender.
C++:
namespace NAMESPACE
{
    oCMsgManipulate* TriggerAniEventImpl(oCNpc*& npc)
    {
        int subtype;
        zSTRING slotName;
        int instance;

        ZARGS(npc, subtype, slotName, instance);

        if (npc && npc->homeWorld && subtype >= oCMsgManipulate::EV_INSERTINTERACTITEM && subtype <= oCMsgManipulate::EV_EXCHANGEINTERACTITEM)
        {
            zSTRING itemName = (instance > 0) ? COA(parser, GetSymbol(instance), name) : "";
            return new oCMsgManipulate(static_cast<oCMsgManipulate::TManipulateSubType>(subtype), itemName, slotName);
        }

        return nullptr;
    }

    int __cdecl AI_TriggerAniEvent()
    {
        ParserScope scope{ parser };
        oCNpc* npc;

        if (oCMsgManipulate* message = TriggerAniEventImpl(npc))
            npc->GetEM()->OnMessage(message, npc);

        return false;
    }

    int __cdecl Npc_TriggerAniEvent()
    {
        ParserScope scope{ parser };
        oCNpc* npc;

        if (ZOwner<oCMsgManipulate> message{ TriggerAniEventImpl(npc) })
            npc->OnMessage(message.get(), npc);

        return false;
    }

    ZEXTERNAL(void, AI_TriggerAniEvent, oCNpc*, int, zSTRING, int);
    ZEXTERNAL(void, Npc_TriggerAniEvent, oCNpc*, int, zSTRING, int);
}

What the frag? How and why these juicy externals were buried inside a thread? Can't anyone edit the first post to make a collection of what was posted or start a new thread for that, maybe with an addition of short descriptions? Just a suggestion, but worth it, since most people won't even know any of that exists in the first place.

EDIT: Holy shit, that SetFPS for Parser Extender is exactly what I have been looking for.
 
Последнее редактирование:

Czudak

Участник форума
Регистрация
29 Июн 2019
Сообщения
182
Благодарности
96
Баллы
175
Could anyone create a plugin/memory patch that would enable the player to collect items that are underwater, please? I remember there was an inkling of that in the source code, according to the forum's thread, since PB wanted to make it possible in NotR, but they didn't finish it.
 
Сверху Снизу