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

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

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

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

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
к пожеланиям - очень был бы полезным плагин, который бы не позволял торговцам одевать лучшее оружие после продажи им этого оружия.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.847
Благодарности
5.275
Баллы
910
к пожеланиям - очень был бы полезным плагин, который бы не позволял торговцам одевать лучшее оружие после продажи им этого оружия.
Опять же, mud-freak это давно сделал для всех на патче Ninja
Хотите переводите на юню
Daedalus:
/*
 * This script is taken from https://forum.worldofplayers.de/forum/threads/?p=25954713
 */


/*
 * Intercept default equipping of best ranged and melee weapons of NPCs. Best weapons will now only be equipped if no
 * weapon of respective type is not already equipped. This will prevent trading NPCs to block the best weapon.
 *
 * - Requires Ikarus, LeGo (HookEngine)
 * - Compatible with Gothic 1 and Gothic 2
 *
 * Call FixEquipBestWeapons_Init from Init_Global.
 */
func void FixEquipBestWeapons_Init() {
    const int once = 0;
    if (!once) {
        MEM_InitAll();

        const int oCNpc__Enable_equipBestWeapons_G1 = 6955616; //0x6A2260
        const int oCNpc__Enable_equipBestWeapons_G2 = 7626662; //0x745FA6
        var int addr; addr = MEMINT_SwitchG1G2(oCNpc__Enable_equipBestWeapons_G1, oCNpc__Enable_equipBestWeapons_G2);

        // Remove default equipping of best melee and ranged weapon to add more conditions
        const int nop20Bytes[5] = { -1869574000, -1869574000, -1869574000, -1869574000, -1869574000 }; //0x90 * 20
        MemoryProtectionOverride(addr, 18);
        MEM_CopyBytes(_@(nop20Bytes), addr, 18);

        HookEngineF(addr, 5, _FixEquipBestWeapons);

        once = 1;
    };
};

func void NpcEquipBestWeaponByType(var C_Npc npc, var int type) {
    const int oCNpc__EquipBestWeapon_G1 = 6988320; //0x6AA220
    const int oCNpc__EquipBestWeapon_G2 = 7663408; //0x74EF30
    var int npcPtr; npcPtr = _@(npc);
    const int call = 0;
    if (CALL_Begin(call)) {
        CALL_IntParam(_@(type));
        CALL__thiscall(_@(npcPtr), MEMINT_SwitchG1G2(oCNpc__EquipBestWeapon_G1, oCNpc__EquipBestWeapon_G2));
        call = CALL_End();
    };
};

func void _FixEquipBestWeapons() {
    var C_Npc npc; npc = _^(ESI);

    if (!Npc_HasEquippedMeleeWeapon(npc))
    && (!Npc_HasReadiedMeleeWeapon(npc)) {
        NpcEquipBestWeaponByType(npc, ITEM_KAT_NF);
    };

    if (!Npc_HasEquippedRangedWeapon(npc))
    && (!Npc_HasReadiedRangedWeapon(npc)) {
        NpcEquipBestWeaponByType(npc, ITEM_KAT_FF);
    };
};
 

Den Kor

Участник форума
Регистрация
13 Авг 2014
Сообщения
134
Благодарности
19
Баллы
185
к пожеланиям - очень был бы полезным плагин, который бы не позволял торговцам одевать лучшее оружие после продажи им этого оружия.
А в чём проблема? Продают обычно неактуальное для гг оружие.
Или из-за этого он одевает - то, которое он продаёт сам?
 

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
Trazege, на юне вроде так получается. Доп. условия в хуках можно сделать какие нужно.

C++:
// Supported with union (c) 2020 Union team
// User API for oCNpc
// Add your methods here
void EquipBestWeaponNew(int);
void EquipBestArmorNew();
C++:
// Supported with union (c) 2020 Union team
// Union SOURCE file

namespace GOTHIC_ENGINE {
    // Add your code here . . .

    bool isNeedDisableBestWeapons() {
        return zoptions->ReadBool("myplugin", "isNeedDisableBestWeapons", 0);
    }

    bool isNeedDisableBestArmor() {
        return zoptions->ReadBool("myplugin", "isNeedDisableBestArmor", 0);
    }
 
    HOOK Ivk_oCNpc_EquipBestWeaponNew   PATCH_IF(&oCNpc::EquipBestWeapon, &oCNpc::EquipBestWeaponNew, isNeedDisableBestWeapons());
    void oCNpc::EquipBestWeaponNew(int v) {
        if (this == player) {
            THISCALL(EquipBestWeaponNew)(v);
        }
    }

    HOOK Ivk_oCNpc_EquipBestArmorNew   PATCH_IF(&oCNpc::EquipBestArmor, &oCNpc::EquipBestArmorNew, isNeedDisableBestArmor());
    void oCNpc::EquipBestArmorNew() {
        if (this == player) {
            THISCALL(EquipBestArmorNew)();
        }
    }

}
 
Последнее редактирование:

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
А в чём проблема? Продают обычно неактуальное для гг оружие.
Или из-за этого он одевает - то, которое он продаёт сам?
второе. Точнее он одевает лучшее оружие из тех что ему продали.
 

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
Trazege, на юне вроде так получается. Доп. условия в хуках можно сделать какие нужно.

C++:
// Supported with union (c) 2020 Union team
// User API for oCNpc
// Add your methods here
void EquipBestWeaponNew(int);
void EquipBestArmorNew();
C++:
// Supported with union (c) 2020 Union team
// Union SOURCE file

namespace GOTHIC_ENGINE {
    // Add your code here . . .

    bool isNeedDisableBestWeapons() {
        return zoptions->ReadBool("myplugin", "isNeedDisableBestWeapons", 0);
    }

    bool isNeedDisableBestArmor() {
        return zoptions->ReadBool("myplugin", "isNeedDisableBestArmor", 0);
    }
 
    HOOK Ivk_oCNpc_EquipBestWeaponNew   PATCH_IF(&oCNpc::EquipBestWeapon, &oCNpc::EquipBestWeaponNew, isNeedDisableBestWeapons());
    void oCNpc::EquipBestWeaponNew(int v) {
        if (this == player) {
            THISCALL(EquipBestWeaponNew)(v);
        }
    }

    HOOK Ivk_oCNpc_EquipBestArmorNew   PATCH_IF(&oCNpc::EquipBestArmor, &oCNpc::EquipBestArmorNew, isNeedDisableBestArmor());
    void oCNpc::EquipBestArmorNew() {
        if (this == player) {
            THISCALL(EquipBestArmorNew)();
        }
    }

}

не очень вкурил код.. ты хукаешь корную функцию EquipBestArmor для плеера?

Насколько я понимаю уши от этой вещи растут из скриптовой функции B_RefreshAtInsert, которую вызывает движок, когда будит нпс. Или я ошибаюсь?
 
Последнее редактирование:

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
Trazege, EquipBestWeapon и EquipBestArmor будут выполнятся только для игрока, для всех остальных не будет вызываться и соответственно броня и оружие не будут выбираться.
 

Den Kor

Участник форума
Регистрация
13 Авг 2014
Сообщения
134
Благодарности
19
Баллы
185
второе. Точнее он одевает лучшее оружие из тех что ему продали.
Это нормально. Кроме гг ему никто оружие не продаёт. Было такое, что он одевал оружие которое у него появлялось в продаже без участия гг :)
 

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
Trazege, EquipBestWeapon и EquipBestArmor будут выполнятся только для игрока, для всех остальных не будет вызываться и соответственно броня и оружие не будут выбираться.

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

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
а вот какая логика..ясно ) а если мне надо экипировать скриптово лучшее оружие неписю в конкретном месте, то я получу от осла уши? )
Ну если в таком виде, то да. Тут будет работать только для игрока, все остальные отдыхают. Но можно в плагине нужную логику попробовать и прикрутить, что бы это не для всех NPC работало и не всегда. Как со скриптами подружить не подскажу, может через zParserExtender как-нибудь. Не сталкивался.
 

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
Trazege, сейчас подумал что один из вариантов как подружить напрямую, это задействовать неиспользуемые флаги/поля у нпс, управлять ими в скриптах, а в хуке просто по ним принимать решение разрешать или нет одевать оружие/броню. Возможно не совсем красиво или правильно, но по идее должно работать.
 

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
Trazege, сейчас подумал что один из вариантов как подружить напрямую, это задействовать неиспользуемые флаги/поля у нпс, управлять ими в скриптах, а в хуке просто по ним принимать решение разрешать или нет одевать оружие/броню. Возможно не совсем красиво или правильно, но по идее должно работать.
Уже нет свободных. Все заняты.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
Приветствую всех.
Возможно ли составить плагин, форсирующий включение "максимального эффекта жестокости" (чтобы начиналось кровотечение, при снижении здоровья ниже 50%, для всех "живых" существ), который будет добавлять к визуальному эффекту ещё и снижение здоровья на 1 ед./сек? И добавить запрет на сон, пока действует данный эффект?
Короче, внедрить в игру элемент "тяжелого ранения", который НЕ будет позволять ГГ, и прочим, свободно разгуливать с низким уровнем здоровья, обливая мир кровью.
 

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
Приветствую всех.
Возможно ли составить плагин, форсирующий включение "максимального эффекта жестокости" (чтобы начиналось кровотечение, при снижении здоровья ниже 50%, для всех "живых" существ), который будет добавлять к визуальному эффекту ещё и снижение здоровья на 1 ед./сек? И добавить запрет на сон, пока действует данный эффект?
Короче, внедрить в игру элемент "тяжелого ранения", который НЕ будет позволять ГГ, и прочим, свободно разгуливать с низким уровнем здоровья, обливая мир кровью.
Я бы пошел дальше и отрегулировал бы эффект крови для разного уровня хп. А вот снижение здоровья как то не очень смотрится.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
Я бы пошел дальше и отрегулировал бы эффект крови для разного уровня хп.
Согласен, было бы здорово.
А вот снижение здоровья как то не очень смотрится.
Почему? Существо истекает кровью, т.е. вполне заметно "теряет здоровье".
Это процесс можно спокойно прервать, подлечившись до 50%+.
 

Trazege

Участник форума
Регистрация
20 Фев 2008
Сообщения
1.760
Благодарности
1.394
Баллы
340
Согласен, было бы здорово.

Почему? Существо истекает кровью, т.е. вполне заметно "теряет здоровье".
Это процесс можно спокойно прервать, подлечившись до 50%+.
Тогда интервал потери хп должен быть больше
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
через какое время будет происходить очередная потеря ХП, пока происходит кровотечение.
Не думал об этом, но если так ставить вопрос, то через 12 игровых часов, например?
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.900
Благодарности
536
Баллы
275
Приветствую всех.
Если не сложно, прошу сведущих людей составить плагин, вводящий для всех NPC "эффективность блока" (именно для парирования на месте, а НЕ отскока), растущую с уровнем владения оружием?
Например, это может выглядеть так:
- При уровне владения "Новичок" (0-29%) блок позволяет отвести 60% входящего урона;
- При уровне владения "Боец" (30-59%) блок позволяет отвести 80% входящего урона;
- При уровне владения "Мастер" (60%+) блок позволяет отвести 100% входящего урона;
Подозреваю, что эффективность блока логичнее привязывать именно к типу используемых анимаций, а не к процентам, дабы плагин был актуален как для G1, так и для G2.
 
Сверху Снизу