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

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

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

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

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.086
Благодарности
1.909
Баллы
320
  • Первое сообщение
  • #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). Позволяет затаптывать мясных жуков.
  31. Плагин ezFistMode (Автор: fyryNy). Хоткей для перехода в режим кулачного боя.
  32. Плагин Union_2hSplash (Автор: Strange). Урон по площади для двуручного оружия.
 
Последнее редактирование:

ElderGamer


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

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.086
Благодарности
1.909
Баллы
320
N1kX, не уверен, что понял чего требуется, но сделал такие логи, когда материалам с одним именем присваиваются разные текстуры:
1688057990517.png

C++:
    std::unordered_multimap<zSTRING, zSTRING> map;

    void Log(zCMaterial* material)
    {
        if (!material || !material->texture || material->objectName.IsEmpty() || material->texture->objectName.IsEmpty())
            return;

        const zSTRING& key = material->objectName;
        const zSTRING& value = material->texture->objectName;

        const auto& range = map.equal_range(key);

        if (range.first != range.second)
        {
            for (auto it = range.first; it != range.second; it++)
                if (it->second == value)
                    return;

            zSTRING dublicateList = value;
            dublicateList = "\"" + dublicateList + "\"";

            for (auto it = range.first; it != range.second; it++)
            {
                dublicateList += ", \"";
                dublicateList += it->second;
                dublicateList += "\"";
            }

            cmd << Col16{ CMD_RED } << "Material: \"" << key << "\" Textures: " << dublicateList  << endl << Col16{CMD_WHITE};
            COA(ogame, GetTextView(), Printwin("Inconsistent material found"));
        }

        map.insert({ key, value });
    }

    ActiveValue<bool> trackMaterials = true;

    Sub testKeys(ZSUB(GameEvent::Loop), []
        {
            if (KeyCombo{ { KEY_LSHIFT, KEY_I } }.GetToggled())
            {
                trackMaterials = !trackMaterials;
                COA(ogame, GetTextView(), Printwin("Track mateials: " + zSTRING{ static_cast<int>(trackMaterials) }));
            }
        });

    void __fastcall Hook_zCMaterial_SetTexture(zCMaterial*, void*, zSTRING&);
    Hook<void(__thiscall*)(zCMaterial*, zSTRING&), ActiveValue<bool>> Ivk_zCMaterial_SetTexture(ZENFOR(0x0054DAC0, 0x00565EF0, 0x0055F7C0, 0x005649E0), &Hook_zCMaterial_SetTexture, HookMode::Patch, trackMaterials);
    void __fastcall Hook_zCMaterial_SetTexture(zCMaterial* _this, void* vtable, zSTRING& a0)
    {
        Ivk_zCMaterial_SetTexture(_this, a0);
        Log(_this);
    }

    void __fastcall Hook_zCMaterial_SetTexture_2(zCMaterial*, void*, zCTexture*);
    Hook<void(__thiscall*)(zCMaterial*, zCTexture*), ActiveValue<bool>> Ivk_zCMaterial_SetTexture_2(ZENFOR(0x0054DC30, 0x00566070, 0x0055F900, 0x00564B20), &Hook_zCMaterial_SetTexture_2, HookMode::Patch, trackMaterials);
    void __fastcall Hook_zCMaterial_SetTexture_2(zCMaterial* _this, void* vtable, zCTexture* a0)
    {
        Ivk_zCMaterial_SetTexture_2(_this, a0);
        Log(_this);
    }

Кстати, загрузил на диск новую версию zBugFixes, в котором должна быть исправлена загрузка во время диалога или при открытом инвентаре. Актуально для быстрых загрузок в Г2. Может, еще в Одиссее баг при переходе между локаций пропадёт, не уверен.
 
Последнее редактирование:

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.176
Благодарности
5.697
Баллы
910
Проверил в трех модах, пока что молчком в консоле, хотя в одном моде для теста специально вставил 3 объекта, у которых был один материал, но у троих разные текстуры, консоль ж молчала.
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.086
Благодарности
1.909
Баллы
320
N1kX, а в чём суть бага? Что происходит, если разные текстуры используются?

Короче, сделал так, чтобы материалы каждый раз читались из файлов, даже если в пуле уже есть материалы с такими именами. Попробуй.
 
Последнее редактирование:

ElderGamer


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

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.176
Благодарности
5.697
Баллы
910
N1kX, а в чём суть бага? Что происходит, если разные текстуры используются?

Короче, сделал так, чтобы материалы каждый раз читались из файлов, даже если в пуле уже есть материалы с такими именами. Попробуй.
Как подметил Элдер, на модели просто будет не та текстура, которая задумана.
Ближайший пример, 2 доспеха и меш в инвентаре.
Когда надет один доспехи, иконки в инвентаре одни, надеваем другой доспех. Иконки в инвентаре другие - явно 1 материал на 4 объекта с разными текстурами.

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

Вложения

  • 1688091243434.png
    1688091243434.png
    973,7 KB · Просмотры: 94
  • 1688091329289.png
    1688091329289.png
    999,6 KB · Просмотры: 94

ElderGamer


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

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.176
Благодарности
5.697
Баллы
910
asc-модели можешь исключить
Увы не так. Есть моделька, которая использует название материала дерева, но свою текстуру. В зен файле у этого материала прописана другая текстура. Так вот, что первым зашло в память при загрузке, то и будет рендерится, то есть дерево станет с текстурой asc модели, либо дерево будет со свой текстурой, ну или asc модель будет деревянная или со своей текстурой.
 

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.469
Благодарности
1.993
Баллы
365
Кстати, загрузил на диск новую версию zBugFixes, в котором должна быть исправлена загрузка во время диалога или при открытом инвентаре. Актуально для быстрых загрузок в Г2. Может, еще в Одиссее баг при переходе между локаций пропадёт, не уверен.
Спасибо, похоже те вылеты в Одиссее, которые были во время загрузки локаций после диалогов поправились. У меня был один сейв от игрока, я его проверил, не вылетает. Выйдет 2.7.3, проверю тщательнее.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.176
Благодарности
5.697
Баллы
910
Короче, сделал так, чтобы материалы каждый раз читались из файлов, даже если в пуле уже есть материалы с такими именами. Попробуй
Детально потестил. С плагином сейчас zspy просто сыпет при загрузке
Warn: 0 D: OBJ: SetObjectName() on shared object class 'zCMaterial' failed: object with that name already exists! ARMOR_SKEL_WARK-BONES .... <zObject.cpp,#299>
Без плагина сообщений от SetObjectName нет.

Попроверял некоторые сообщения, ошибок у моделей с материалами нет.

Проверяю если что в Новом Балансе.
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.086
Благодарности
1.909
Баллы
320
Как я увидел из лога, ошибка может показаться только при загрузке, если просто надевать доспехи с проблемным материалам в запущенной игре, то не будет лога, видимо особенность.
Когда модель создаётся, тогда и проверка будет происходить. Если бы доспеха в сейве не было и ты бы его вставил во время игры, то проверка произошла бы в этот момент.
С плагином сейчас zspy просто сыпет при загрузке
Перезалил.
C++:
std::unordered_multimap<zSTRING, zSTRING> map;

void Log(zCMaterial* material)
{
    if (!material || !material->texture || material->objectName.IsEmpty() || material->texture->objectName.IsEmpty())
        return;

    const zSTRING& key = material->objectName;
    const zSTRING& value = material->texture->objectName;

    const auto& range = map.equal_range(key);

    if (range.first != range.second)
    {
        for (auto it = range.first; it != range.second; it++)
            if (it->second == value)
                return;

        zSTRING dublicateList = value;
        dublicateList = "\"" + dublicateList + "\"";

        for (auto it = range.first; it != range.second; it++)
        {
            dublicateList += ", \"";
            dublicateList += it->second;
            dublicateList += "\"";
        }

        cmd << Col16{ CMD_RED } << "Material: \"" << key << "\" Textures: " << dublicateList  << endl << Col16{CMD_WHITE};
        COA(ogame, GetTextView(), Printwin("Inconsistent material found"));
    }

    map.insert({ key, value });
}

ActiveValue<bool> trackMaterials = true;

Sub testKeys(ZSUB(GameEvent::Loop), []
    {
        if (KeyCombo{ { KEY_LSHIFT, KEY_I } }.GetToggled())
        {
            trackMaterials = !trackMaterials;
            COA(ogame, GetTextView(), Printwin("Track mateials: " + zSTRING{ static_cast<int>(trackMaterials) }));
        }
    });

zCObject* __fastcall Hook_zCClassDef_SearchHashTable(zCClassDef*, void*, zSTRING const&);
Hook<zCObject* (__thiscall*)(zCClassDef*, zSTRING const&)> Ivk_zCClassDef_SearchHashTable(ZENFOR(0x0058B2B0, 0x005A67C0, 0x005A5880, 0x005AADE0), &Hook_zCClassDef_SearchHashTable, HookMode::Patch);
zCObject* __fastcall Hook_zCClassDef_SearchHashTable(zCClassDef* _this, void* vtable, zSTRING const& a0)
{
    if (_this == zCMaterial::classDef)
        return nullptr;

    zCObject* result = Ivk_zCClassDef_SearchHashTable(_this, a0);
    return result;
}

int __fastcall Hook_zCObject_SetObjectName(zCObject*, void*, zSTRING const&);
Hook<int(__thiscall*)(zCObject*, zSTRING const&)> Ivk_zCObject_SetObjectName(ZENFOR(0x0058A170, 0x005A5500, 0x005A4780, 0x005A9CE0), &Hook_zCObject_SetObjectName, HookMode::Patch);
int __fastcall Hook_zCObject_SetObjectName(zCObject* _this, void* vtable, zSTRING const& a0)
{
    if (_this->_GetClassDef() == zCMaterial::classDef)
    {
        _this->objectName = a0;
        return true;
    }

    int result = Ivk_zCObject_SetObjectName(_this, a0);
    return result;
}

void __fastcall Hook_zCMaterial_SetTexture(zCMaterial*, void*, zSTRING&);
Hook<void(__thiscall*)(zCMaterial*, zSTRING&), ActiveValue<bool>> Ivk_zCMaterial_SetTexture(ZENFOR(0x0054DAC0, 0x00565EF0, 0x0055F7C0, 0x005649E0), &Hook_zCMaterial_SetTexture, HookMode::Patch, trackMaterials);
void __fastcall Hook_zCMaterial_SetTexture(zCMaterial* _this, void* vtable, zSTRING& a0)
{
    Ivk_zCMaterial_SetTexture(_this, a0);
    Log(_this);
}

void __fastcall Hook_zCMaterial_SetTexture_2(zCMaterial*, void*, zCTexture*);
Hook<void(__thiscall*)(zCMaterial*, zCTexture*), ActiveValue<bool>> Ivk_zCMaterial_SetTexture_2(ZENFOR(0x0054DC30, 0x00566070, 0x0055F900, 0x00564B20), &Hook_zCMaterial_SetTexture_2, HookMode::Patch, trackMaterials);
void __fastcall Hook_zCMaterial_SetTexture_2(zCMaterial* _this, void* vtable, zCTexture* a0)
{
    Ivk_zCMaterial_SetTexture_2(_this, a0);
    Log(_this);
}
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.176
Благодарности
5.697
Баллы
910

Вложения

  • image (2).png
    image (2).png
    26,5 KB · Просмотры: 70

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.777
Баллы
1.625
И в ресурсманагере версия чуть ли не первая...
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.176
Благодарности
5.697
Баллы
910

Gotoman-Gothic

Участник форума
Регистрация
11 Янв 2015
Сообщения
275
Благодарности
133
Баллы
210
Нажимаем на первом сообщении с ферму на 11 пункт, переходим к сообщению, где опубликовывался плагин, там же и находится ссылку на Гугл диск с плагинами.
Union - мини плагины
Да, я находил этот гугл диск. Только дата изменения плагина там 18 июня, когда Slavemaster про новую версию написал в этот четверг. Я и подумал, что это не актуальная версия.
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.086
Благодарности
1.909
Баллы
320
Изменения:
Union_MarvinHelper - интегрировано меню (для некоторых опций)
zMiscUtils - исправлен баг, возникающий при изменении SecondsPerGameHour во время игры.
zBugFixes - отключены по умолчанию опции DayMusicFix и WaterWeaponFix (рекомендуется использовать патчи вместо них). Добавлен фикс загрузки во время диалога или с открытым инвентарём. PutInInvFix по умолчанию равен 2 (авто), для автоматического отключения в Хрониках Миртаны. Интегрировано меню:
1689096752278.png
zSavesBackuper - использует другой алгоритм копирования по умолчанию (не вызывает проблем с Windows 11)
 
Последнее редактирование:

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.086
Благодарности
1.909
Баллы
320
zImprovedLegacyFrying
Диалоговые опции для жарки мяса
Google Drive
Функции плагина
  • Добавляет диалоговые опции для жарки мяса на костре или плите
Совместимость
  • Не функционирует, если костёр или плита изменены модом
Скриншоты
1689180805170.png
Исходные коды
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Union_MarvinHelper - интегрировано меню (для некоторых опций)
zMiscUtils - исправлен баг, возникающий при изменении SecondsPerGameHour во время игры.
zBugFixes - отключены по умолчанию опции DayMusicFix и WaterWeaponFix (рекомендуется использовать патчи вместо них). Добавлен фикс загрузки во время диалога или с открытым инвентарём.
Подскажи, пожалуйста, а по какой конкретно ссылке можно скачать обновленные версии плагинов?
Просто в первом сообщении закреплено 2 архива "Patches", а ссылка с текстом BugFixes приводит к сообщению от 15 апреля 2021 года.
 

Сумрак

Участник форума
Регистрация
25 Окт 2021
Сообщения
1.636
Благодарности
679
Баллы
175
Сверху Снизу