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

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

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

Union - мини плагины

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
  • Первое сообщение
  • #1
Здесь будут собираться плагины, создание отдельной темы для которых было бы излишним.


Плагины, распространяемые с помощью exe-инсталлятора, можно деинсталлировать им же.
Плагины, распространяемые в виде vdf тома, следует помещать в папку Data/Plugins/.
Каждый плагин, если не указано иного, должен работать на любых версиях игры: Gothic I Classic (G1), Gothic I Sequel (G1A), Gothic II Classic (G2), Gothic II Addon (G2A).
Код плагинов и сами плагины, автором которых являюсь я, можно распространять и использовать без ограничений.


При наличии нескольких одноименных вложений в одном посте следует скачивать последнее. Удалять старые вложения прав нет.

  1. Плагин zNoFocusFlag (Автор: Slavemaster). Для модостроителей. Делает NPC с флагом NPC_FLAG_NFOCUS полностью прозрачными для фокуса ГГ.
  2. Плагин AlterDamage (Автор: Slavemaster). Есть проблемы с совместимостью. Меняет формулы урона. Добавляет всплывающие сообщения о нанесённом уроне.
  3. Плагин zSavesBackuper (Автор: Slavemaster). Осуществляет резервное копирование сделанных сохранений.
  4. Плагин Union_Hotbar_1.0k (Автор: Haart). Добавляет панель быстрого доступа для предметов из инвентаря.
  5. Плагин QuickLoot (Автор: Slavemaster). Быстрый сбор предметов при помощи правой кнопки мыши.
  6. Плагин MarvinHelper (Автор: Slavemaster). Дополнительные возможности для консоли разработчика.
  7. Плагин MunitionInfo (Автор: Xeдин). Отображает кол-во стрел/болтов в инвентаре.
  8. Плагин zAsyncSaveLoad. (Автор: Slavemaster).Плагин делает окно игры отзывчивым к сочетанию Alt+Tab во время загрузки, сохранения и просмотра видео.
  9. Плагин Union_SaveLoadManager_i (Автор: Haart). Позволяет сохраняться в разные слоты без лишних усилий.
  10. Плагин zBugFixes (Автор: Slavemaster). Плагин содержит исправления некоторых ошибок движка Готики.
  11. Плагин zTorchControl (Автор: Slavemaster). Плагин предотвращает удаление горящих факелов при загрузке, а также позволяет их использовать по горячей клавише.
  12. Плагин zMarkItems (Автор: Slavemaster).Плагин осуществляет маркировку предметов внутри ячеек инвентаря.
  13. Плагин zMiscUtils (Автор: Slavemaster). Плагин реализует множество функций, не объединённых единой тематикой.
  14. Плагин SimpleRegen (Автор: Xeдин). Плагин реализует простой алгоритм регенерации жизни и/или маны.
  15. Плагин Union_Thief_Helper (Автор: Xeдин). Помощник вора. Маркировка не обворованных и обворованных NPC и подсказки при взломе.
  16. Плагин Union_XP_Bar (Автор: Xeдин). Плагин для отображения полоски опыта.
  17. Плагин OdyAlt (Автор: N1kX). Подробное многостраничное меню навыков для мода Одиссея 2.6.4.
  18. Плагин OdyAltMenu (Автор: N1kX). Подробное многостраничное меню навыков для мода Одиссея 2.7.0+.
  19. Плагин zUtilities (Автор: Franisz). Несколько удобных функций.
  20. Плагин oDamageHelper (Автор: Gratt). Для модостроителей. Позволяет менять наносимый урон с помощью скриптов.
  21. Плагин Union_DamageInfo (Автор: Xeдин). Плагин выводит урон по врагам и по главному герою.
  22. Плагин Union_RandomRainDX11 (Автор: Haart). При использовании с DX11 дождь будет начинаться в случайное время суток.
  23. Плагин Union_Ext_Stat (Автор: Xeдин). Небольшая дополнительная статистика по количеству убитых, выпитых зелий, квестам и времени игры.
  24. Плагин Union_Show_FPS (Автор: Xeдин). Простенький плагин на показ FPS для всех версий Готики, с возможностью отключения в меню и задания позиции отображения.
  25. Плагин zImprovedLegacyFrying (Автор: Slavemaster). Добавляет диалоги жарки мяса для костра и плиты.
  26. Плагин Union_Keep_Last_Save (Авторы: Gratt, Xeдин). Плагин для удобной работы с последним слотом записи.
  27. Плагин EquippedWeapon (Автор: MEG@VOLT). Для модостроителей. Добавляет функции экипировки / деэкипировки оружия.
  28. Плагин TradeMissItems (Автор: MEG@VOLT). Плагин создан для защиты от случайной продажи квестовых предметов.
  29. Плагин zUnstuckSlidingPlayer (Автор: Slavemaster). Автоматическая телепортация игрока при длительном скольжении.
  30. Плагин KillMeatBugs (Автор: MEG@VOLT). Позволяет затаптывать мясных жуков.
 
Последнее редактирование:

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
Пока понятно, что в инвентаре невалидный предмет появляется (битый указатель), так как при виртуальном вызове oCItem :: GetInstanceName уходит по разным адресам.
 

Xeдин


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

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
N1kX, если есть возможность воспроизвести, то вот плаг, который может показать больше информации: он сканирует инвентари всех НПС каждый кадр и делает некоторые проверки. Также, делает проверку перед вызовом PackItemsInCategory. В случае обнаружения проблемы, будут выскакивать окошки с дополнительной инфой. Рассчитываю на то, что плагин поможет определить момент, когда возникает ошибка и с каким предметом эта ошибка связана.
C++:
#include <intrin.h>

namespace NAMESPACE
{
    string title;
    void CheckItem(oCItem* item, oCNpc* owner);

    std::unordered_map<oCItem*, string> createdItems;

    Sub clearCreatedItems(ZSUB(GameEvent::LoadEnd), []
        {
            createdItems.clear();
        });

    oCItem* __fastcall Hook_oCObjectFactory_CreateItem(oCObjectFactory*, void*, int);
    Hook<oCItem* (__thiscall*)(oCObjectFactory*, int)> Ivk_oCObjectFactory_CreateItem(ZENFOR(0x006C8660, 0x006FE4C0, 0x00710870, 0x0076FDE0), &Hook_oCObjectFactory_CreateItem, HookMode::Hook);
    oCItem* __fastcall Hook_oCObjectFactory_CreateItem(oCObjectFactory* _this, void* vtable, int a0)
    {
        oCItem* result = Ivk_oCObjectFactory_CreateItem(_this, a0);
        CheckItem(result, nullptr);
        createdItems[result] = A result->objectName;
        return result;
    }

    void ShowError(oCItem* item)
    {
        auto it = createdItems.find(item);

        if (it == createdItems.end())
            return;

        Message::Error(A"Supposed item: " + it->second, title);
    }

    void CheckItem(oCItem* item, oCNpc* owner)
    {
        if (!item)
        {
            string message = "An item is null.";

            if (owner)
                message += A" Owner = " + A owner->objectName;

            Message::Error(message, title);
            return;
        }

        if (IsBadReadPtr(item, 4))
        {
            string message = "Can not read memory.";

            if (owner)
                message += A" Owner = " + A owner->objectName;

            Message::Error(message, title);
            ShowError(item);
            return;
        }

        if (*(uint*)item != vftable_oCItem::GetAddress())
        {
            string message = "An item has wrong VT.";

            if (owner)
                message += A" Owner = " + A owner->objectName;

            Message::Error(message, title);
            ShowError(item);
            Message::Error(A"refCtr = " + item->refCtr, title);
            return;
        }

        if (item->refCtr <= 0)
        {
            string message = "An item has negative refCtr.";

            if (owner)
                message += A" Owner = " + A owner->objectName;

            Message::Error(message, title);
            ShowError(item);
            Message::Error(A"refCtr = " + item->refCtr, title);
            return;
        }
    }

    void CheckInventory(oCNpcInventory* inventory)
    {
        for (oCItem* item : *inventory)
            CheckItem(item, inventory->owner);
    }

    void CheckInventories()
    {
        if (!ogame || !ogame->GetGameWorld())
            return;

        for (oCNpc* npc : ogame->GetGameWorld()->voblist_npcs)
            if (npc)
                CheckInventory(&npc->inventory2);
    }
    
    Sub test(ZSUB(GameEvent::Loop), []
        {
            if (KeyCombo{ { KEY_LSHIFT, KEY_O } }.GetToggled())
                player->inventory2.inventory.next->data->Release();
        });

    Sub onLoop(ZSUB(GameEvent::Loop), []
        {
            title = "Game Loop";
            CheckInventories();
        });

    // WARNING: supported versions are G2, G2A
    void __fastcall Hook_oCNpcInventory_PackItemsInCategory(oCNpcInventory*, void*, int);
    Hook<void(__thiscall*)(oCNpcInventory*, int)> Ivk_oCNpcInventory_PackItemsInCategory(ZENFOR(0x00000000, 0x00000000, 0x006B23A0, 0x00710040), &Hook_oCNpcInventory_PackItemsInCategory, HookMode::Hook);
    void __fastcall Hook_oCNpcInventory_PackItemsInCategory(oCNpcInventory* _this, void* vtable, int a0)
    {
        title = "PackItemsInCategory";
        CheckInventory(_this);
        Ivk_oCNpcInventory_PackItemsInCategory(_this, a0);
    }
}
 

Вложения

  • zTest.vdf
    186 KB · Просмотры: 14

Slavemaster


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

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.847
Благодарности
5.275
Баллы
910
Может лучше по умолчанию будет без постоянного включенного режима марвина в MarvinHelper?
ActivateMarvinMode=0
 

Fabiosek

Участник форума
Регистрация
17 Июн 2017
Сообщения
147
Благодарности
47
Баллы
190
Может лучше по умолчанию будет без постоянного включенного режима марвина в MarvinHelper?
ActivateMarvinMode=0
But why? This is a plugin that is used with the cheat console by default. There may be such an option, but it should be "on" by default.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.847
Благодарности
5.275
Баллы
910
Нет, постоянный режим марвина не допустим в обычной игре для обычного игрока, который с ним сломает все характеристики игрока. Плагин должен только улучшать консоль, а не добавлять дискомфорт.
 

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
Тестовая версия плагина zSavesBackuper, который станет заменой старого плагина Union_SavesBackuper. Основные отличия от предыдущей версии:
1. Не используются никакие нестандартные хуки, поэтому плагин должен быть максимально совместим с другими модами/патчами
2. Имена папок с резервными сохранениями теперь содержат информацию о внутриигровом времени
3. Резервные сохранения делаются синхронно. Если ваш жёсткий диск интенсивно используется другой программой, то вы заметите задержку.
INI:
[ZSAVESBACKUPER]

BackupToDirPath=\backups\
; ... absolute or relative path to the directory where the backuped saves are stored in

BackupToDirLimit=50
; ... maximum amount of stored saves in the directory (per mod)
; set -1 for unlimited storage
; set 0 to disable backing up to the folder

BackupToSlotMin=10
BackupToSlotMax=20
; ... range of save slots used to store backups
; to disable set the maximum slot to be less than the minimum

DoNotBackupSlotMin=0
DoNotBackupSlotMax=-1
; ... range of slots saving to which does not result in backups
; to allow backup from all the slots set the maximum slot to be less than the minimum

Slavemaster А релизить эту версию не будешь? А то везде старая еще. Я ее использую, вроде проблем нет. Правда я ее немного нестандартно использую. Только для бэкапа последнего слота. Например в Одиссее
[ZSAVESBACKUPER]
BackupToDirPath=G:\Saves\Odissey\Chapter2\2_Тамора
BackupToDirLimit=-1
BackupToSlotMin=10
BackupToSlotMax=-1
DoNotBackupSlotMin=0
DoNotBackupSlotMax=19

Тут кстати было бы прикольно и удобно еще сделать возможность номер главы и название местности автоматически подставлять (опционально).
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
Может лучше по умолчанию будет без постоянного включенного режима марвина в MarvinHelper?
ActivateMarvinMode=0
Сделал.
А релизить эту версию не будешь?
Буду. Просто не тороплюсь с релизом, так как сам его не тестирую.
Тут кстати было бы прикольно и удобно еще сделать возможность номер главы и название местности автоматически подставлять (опционально).
Возможно, но сейчас не буду этого делать, так как есть другой проект, который надо бы доделать. К тому же, лазанье по скриптам в поисках номера главы несколько выбивается из общей архитектуры плагина.
 

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
Плагин: Небольшая дополнительная статистика по количеству убитых, выпитых зелий, квестам и времени игры.
Поддержка: G1, G1A, G2, G2A
Требования: Union 1.0L и выше.

Установка: Разархивировать архив плагина и cкопировать актуальный Union_Ext_Stat_XX_XX_XXXXX.vdf в GOTHIC_FOLDER/Data/Plugins/, удалив все старые версии Union_Ext_Stat_XX_XX_XXXXX.vdf
Удаление: Удалить Union_Ext_Stat_XX_XX_XXXXX.vdf из GOTHIC_FOLDER/Data/Plugins/

extstat.jpg


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

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
Небольшое обновление.
- Поправил потерю статистики для убитых людей.
- Добавил новые параметры в возможность конфигурирования.
shiftRecordsByY=200
shiftTopicsByY=400
[UNION_EXT_STAT]
backgroundSizeX=1500
backgroundSizeY=6300
textColor=204,153,102
names=Задания|Выполнено заданий|Провалено заданий|В процессе|Количество убитых|Люди|Гоблины|Орки|Монстры|Остальные|Общее количество|Выпито элексиров|Элексир силы|Элексир ловкости|Элексир жизни|Элексир маны|Приключения|Общее время игры|Прошло дней
shiftRecordsByY=200
shiftTopicsByY=400

Update. Поправил дефолтные имена для эликсиров. Перекачать и удалить параметр names
 
Последнее редактирование:

Raswen

Гражданин Хориниса
Регистрация
18 Фев 2014
Сообщения
1.278
Благодарности
745
Баллы
260

.Unreal

Участник форума
Регистрация
21 Июн 2012
Сообщения
654
Благодарности
89
Баллы
210
Плагин AlterDamage. (Автор: @Slavemaster). Меняет формулы урона. Добавляет всплывающие сообщения о нанесённом уроне.
Огромная просьба.. прикрутить к плагину ф-ю вкл.\выкл. его в игре на Shift+ {x}, где {x} - любая клавиша на клаве (по умолчанию, например, P (англ.)) с возможностью самому задавать эту клавишу через ини-файл, для удобства каждому. Буду очень благодарен!!! Данная ф-я в этом плагине была бы очень кстати. И можно было бы даже играть полноценно с данным плагином, например, в том же Архолосе. Будучи в игре выключаем плагин, например, на шифт + А и расстреливаем с далека мобов с лука. А если кто то добежал до вас - вкл. плагин и допиливаем мобов с ближнего оружия. И не надо выходить из игры, чтобы постоянно убирать\возвращать плагин на место.
 

dorumia

Участник форума
Регистрация
11 Июл 2020
Сообщения
17
Благодарности
1
Баллы
65
Hello Hedin. I check Union_Ext_Stat and game don't count killing npc from weapon, if you finish him when he lie on ground(with Melee weapon). I don't know if it's bug or not, so i want ask about it. And Draconian are counted as Orcs in killing stats, when he propably should be on Other or Monster category.
 

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.345
Благодарности
1.888
Баллы
335
dorumia, Oк thanks, i will add checks in the next version.
 

Valeriy57

Участник форума
Регистрация
18 Окт 2012
Сообщения
1.674
Благодарности
320
Баллы
245
Union_AcrobaticSwitch.vdf подскажите, где можно скачать этот плагин, сам что-то не нашел на растиражированных ссылках.
 

dorumia

Участник форума
Регистрация
11 Июл 2020
Сообщения
17
Благодарности
1
Баллы
65
Сверху Снизу