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

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.430
Благодарности
4.771
Баллы
625
  • Первое сообщение
  • #1
1767600363729.png

RU EN

 

Вложения

  • Union_Primary_Universal 12.02.2022.zip
    44 MB · Просмотры: 28.400
  • Union 1.0m 26.06.2022.zip
    11,8 MB · Просмотры: 967
  • Union 1.0m 26.06.2022 v2.zip
    11,8 MB · Просмотры: 621
  • Union 1.0m 26.06.2022 v3.zip
    11,8 MB · Просмотры: 30.712

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.337
Баллы
315
Ну не почему то, а потому что я ваще не одуплял что мы г1 будет мучать, лол
 

alexeich2019

Участник форума
Регистрация
28 Июн 2019
Сообщения
191
Благодарности
73
Баллы
175
Кто-нибудь может пояснить, в чем проблема? Пытаюсь запустить модфикс с Union.
Без Union запускается нормально. Пробовал как 1.0b, таки 1.0е версии.

kiss_126kb.1571668170[1].jpg

p/s. Это что-то с порядком загрузки ресурсов. Перевел модфикс в vdf, все заработало.
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.979
Благодарности
582
Баллы
275
Приветствую всех. Насколько я понимаю, Безымянный НЕвосприимчив к атакам врагов в плане прерывания анимации.
Поясните, пожалуйста, а возможно ли на Union написать плагин делающий ГГ столь же уязвимым к ошеломлению от атак? Т.е. чтобы на нас также распространялся "стан" и невозможность двигаться/атаковать в анимации повреждения?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.430
Благодарности
4.771
Баллы
625
alexeich2019, какой именно? Дай ссылку.
KirTheSeeker, это значит что где-то по условию идет проверка npc != player. Тогда достаточно крошечного .patch файлика, а не dll.
 

alexeich2019

Участник форума
Регистрация
28 Июн 2019
Сообщения
191
Благодарности
73
Баллы
175
Gratt, Gothic Mod Fix от снежков. Версию не подскажу, шла в комплекте с торрентом.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.377
Благодарности
7.861
Баллы
995

alexeich2019

Участник форума
Регистрация
28 Июн 2019
Сообщения
191
Благодарности
73
Баллы
175
Странно.
Gothic 1 Classic.
Накатил сдк 1.0с, перестала работать конструкция:
C++:
int instance2 = parser->GetIndex(instanceName);
oCItem* pItem = dynamic_cast<oCItem*>((zCVob*)ogame->GetGameWorld()->CreateVob(zVOB_TYPE_ITEM, instance2));

Долго грешил на oCObjectFactoryEx, который начал тестировать сразу после установки 1.0с версии, но дело не в нем.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.430
Благодарности
4.771
Баллы
625
alexeich2019, давай в пм пообщаемся по последней сборке.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
500
Благодарности
355
Баллы
230
alexeich2019, как вариант попробовать сделать так:
C++:
#include "UnionAfx.h"

namespace Gothic_I_Classic {


// Проверить инстанцию "instName" на соответствие классу "className"
// Пример: Проверить_соответствие_классу(A "ITFOAPPLE", A "C_ITEM");
bool Проверить_соответствие_классу(string& instName, string& className)
{
    // если передаваемые строки пустые или указатель на парсер не валиден
    if (instName.IsEmpty() || className.IsEmpty() || !parser)
        // выходим
        return false;
    // иначе, пытаемся найти индекс строки в общей таблице символов
    int idx = parser->GetIndex(instName.ToChar());

    // если индекс не найден
    if (idx == -1)
        // выходим
        return false;

    // иначе индекс символьной строки найден
    // получаем информацию о строке
    zCPar_Symbol* ps = parser->GetSymbol(idx);
   
    // если указатель пуст или это не инстанция
    // (например, когда передали название прототипа/функции/переменной)
    if (!ps || ps->type != zPAR_TYPE_INSTANCE)
        // выходим
        return false;

    // иначе это инстанция
    // получаем индекс базового класса, для которого объявлена инстанция
    idx = parser->GetBase(idx);

    // получаем информацию о базе
    ps = parser->GetSymbol(idx);

    // здесь либо прототип, либо класс
    // если прототип, углубляемся ещё дальше
    if (ps && ps->type == zPAR_TYPE_PROTOTYPE)
        // ещё большее углубление(до класса):
        idx = parser->GetBase(idx);

    // на выходе в idx индекс чистого класса, от которого объявлена инстанция
    // и если индекс найденного и индекс заданного класса совпадают
    if (parser->GetIndex(className.ToChar()) == idx)
        // выходим с успешным сравнением
        return true;

    // в остальных случаях - просто выход
    return false;
}


void Game_Init()
{
    // Тест:
    string instanceName = "ITFOAPPLE";
    //instanceName = "ITFOAPPLE1";
    //instanceName = "PC_Thief";
    //instanceName = "UseApple";
    //instanceName = "C_ITEM";

    // если класс инстанции соответствует C_ITEM
    if (Проверить_соответствие_классу(instanceName, A "C_ITEM") == true)
    {
        // берём индекс символьной строки инстанции
        int idx = parser->GetIndex(instanceName.ToChar());

        // создаём воб и напрямую, с уверенностью, преобразуем получившийся указатель в указатель на oCItem
        oCItem* pItem = static_cast<oCItem*>(ogame->GetGameWorld()->CreateVob(zVOB_TYPE_ITEM, idx));
       
        // если указатель валиден
        if (pItem)
            // выводим сообщение с названием предмета
            Say::Box(pItem->name);
    }
}


void Game_Entry() {
}

void Game_Exit() {
}

void Game_Loop()
{
}

void Game_SaveBegin() {
}

void Game_SaveEnd() {
}

void LoadBegin() {
}

void LoadEnd() {
}

void Game_LoadBegin_NewGame() {
  LoadBegin();
}

void Game_LoadEnd_NewGame() {
LoadEnd();
}

void Game_LoadBegin_SaveGame() {
LoadBegin();
}

void Game_LoadEnd_SaveGame() {
LoadEnd();
}

void Game_LoadBegin_ChangeLevel() {
LoadBegin();
}

void Game_LoadEnd_ChangeLevel() {
LoadEnd();
}

void Game_LoadBegin_Trigger() {
}

void Game_LoadEnd_Trigger() {
}

void Game_Pause() {
}

void Game_Unpause() {
}

void Game_DefineExternals() {
}

CApplication* lpApplication = CApplication::CreateRefApplication (
  Game_Entry,
  Game_Init,
  Game_Exit,
  Game_Loop,
  Game_SaveBegin,
  Game_SaveEnd,
  Game_LoadBegin_NewGame,
  Game_LoadEnd_NewGame,
  Game_LoadBegin_SaveGame,
  Game_LoadEnd_SaveGame,
  Game_LoadBegin_ChangeLevel,
  Game_LoadEnd_ChangeLevel,
  Game_LoadBegin_Trigger,
  Game_LoadEnd_Trigger,
  Game_Pause,
  Game_Unpause,
  Game_DefineExternals
  );

}

Или если уверен, что инстанция будет относиться к классу C_ITEM, можешь не делать проверку на соответствие.
 

alexeich2019

Участник форума
Регистрация
28 Июн 2019
Сообщения
191
Благодарности
73
Баллы
175
Jr13San, да, через static_cast все вставляется нормально
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.979
Благодарности
582
Баллы
275
Приветствую всех. Подскажите, пожалуйста, в чем может быть проблема в совместимости между Union и данным модом?
Выглядит она следующим образом:
Удалось скачать мод (нашел в Spine и перекинул все файлы) и открыть его из мод-стартера (на переустановленной игре БЕЗ Spine), НО при начале новой игры в моде я вижу лишь черный экран с полоской здоровья. Могу управлять ГГ (если подвигаться, то и тело появляется), но ничего не происходит.

Заранее благодарен.
Пост автоматически объединён:

Еще вопрос в догонку - Если установить только Union, БЕЗ предварительной установки SystemPack, то появится ли в папке игры SystemPack.ini?
 

N1kX

Участник форума
Регистрация
13 Ноя 2009
Сообщения
6.590
Благодарности
6.197
Баллы
940
Вкратце, Ikarus+Lego используют адреса, которые Union тоже использует, поэтому возможны баги при переходе из локации, при сохранении и загрузке и т.п. Поэтому в моды с Ikarus+Lego играть без Union (А это все новые немецкие/польские моды). Авторы вряд-ли пойдут на уступки и переделки.
Инструкция по установке была где-то выше...
Установка всегда происходит без Systempack...

1. Игра
2. Из менеджера Union скачать и установить union patch в игру
3. Установить сам Union 1.0e в игру. Без всяких Systempack!!!
4. Установить GothicSourcer 2.8

Правки все вносить в union.ini
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.430
Благодарности
4.771
Баллы
625
Вкратце, Ikarus+Lego используют адреса, которые Union тоже использует
Ну я думаю этот вопрос будет частично решен, поскольку некоторые хуки я хочу выключить, если ни один плагин не пошлет запрос на необходимость их использования. Такое решение подойдет там, кому вот прям очень нужно получить функции SP в любом (даже самом кривом) моде.

Собственно что будет в следующей сборке помимо этого:
1. 4гб патч на все движки. Игра на всех системах использует не более 2гб оперативной памяти, а данный патч расширяет лимит до 4гб.
2. Стабильная библиотека Union и Union.patch, умеющие работать с 4гб патчем.
3. Обновленный SDK, содержащий еще больший Gothic API, дополнительные функции Union API и шаблон плагина, УЖЕ настроенного на мультиплатформенную компиляцию.
Собственно в сборке не будет каких-то наворотов, она нацелена конкретно на повышение стабильности библиотеки.

Из важных новостей - заканчиваю новый менеджер ресурсов. Одно из главных отличий - шустрый сервак, так что закачка больших объемов больше не будет создавать неудобства.
Из функциональных особенностей:
1. Продукт помимо названия будет содержать его описание.
2. В списках ресурсов можно будет встретить подкаталоги, ссылки и заголовки, разделяющие контент на разные группы.
3. Если какой-то продукт получит обновление, то он окрасится в рыжий цвет. Такой файл можно как обновить, так и использовать в текущем состоянии.
4. Быстрое меню навигации без ожиданий между переходами.
Все последующие ресурсы будут загружаться исключительно в эту программу. После релиза все старые менеджеры сами обновятся до актуального.
Так что если есть пара желающих поучаствовать в небольшом краштесте - черканите в ЛС.


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

N1kX

Участник форума
Регистрация
13 Ноя 2009
Сообщения
6.590
Благодарности
6.197
Баллы
940

alexeich2019

Участник форума
Регистрация
28 Июн 2019
Сообщения
191
Благодарности
73
Баллы
175
Подскажите, как можно изменить дальность прорисовки нпц в текущей сессии?

Знаю что дальность прорисовки меша можно изменить с помощью этих методов:
C++:
zCSkyControler::SetFarZScalability();
zCSkyControler::SetFarZ();

Дальность прорисовки вобов - с помощью этих параметров и соответствующих методов:
C++:
zCWorld::vobFarClipZ;
zCWorld::vobFarClipZScalability;
zCWorld::SetVobFarClipZScalability();


Проблема в том, что на нпц это не действует. Сначала я подумал, что мне нужно увеличить радиус вставки нпц в поле зрения камеры, но... Это не решает проблему.
SPAWN_INSERTRANGE
SPAWN_REMOVERANGE

Если выставить скейл через Системпак, то дистанция увеличится. Но это не изменение в текущей сессии, а правка ПЕРЕД стартом игры.
DrawDistanceMultiplier
OutDoorPortalDistanceMultiplier
InDoorPortalDistanceMultiplier

Кто может подсказать?


З/ы. Хотя, я гоню чего-то. Я тестировал через vobFarClipZScalability и у меня ничего не получалось. Сейчас попробовал через vobFarClipZ и все получилось. Естественно, предварительно нужно поставить SPAWN_INSERTRANGE/SPAWN_REMOVERANGE.
Вопрос исчерпан.
 
Последнее редактирование:

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.958
Благодарности
3.111
Баллы
495
killer-m мне Гратт сказал, что ты 1 фпс баг зафиксил, в чем там причина в итоге была? Я байт-код посмотрел, но по нему сложно сказать, я никогда напрямую не патчил код.
 

killer-m


Модостроитель
Регистрация
24 Мар 2013
Сообщения
1.359
Благодарности
1.362
Баллы
265
killer-m мне Гратт сказал, что ты 1 фпс баг зафиксил, в чем там причина в итоге была? Я байт-код посмотрел, но по нему сложно сказать, я никогда напрямую не патчил код.
Для Готики 1 возможная причина - Gothic ½ - SystemPack

Способ воспроизвести баг такой:
Удаляем патч #patch [LOW_FPS_FIX] из Union.patch
Начинаем новую игру
В консоль вводим cheat god
В консоль вводим goto waypoint ow_fogdungeon_03 спускаемся со ступеней
В консоль вводим goto waypoint ow_om_entrance04 идём в шахту и выходим из шахты
В консоль вводим goto waypoint ow_fogdungeon_03 спускаемся со ступеней
В консоль вводим goto waypoint ow_om_entrance04 идём в шахту и выходим из шахты
В консоль вводим goto waypoint ow_fogdungeon_03 спускаемся со ступеней
В консоль вводим goto waypoint ow_om_entrance04 идём в шахту и выходим из шахты
В консоль вводим goto waypoint ow_fogdungeon_03 спускаемся со ступеней
В консоль вводим goto waypoint ow_om_entrance04 идём в шахту и выходим из шахты
В консоль вводим goto waypoint ow_fogdungeon_03 спускаемся со ступеней
В консоль вводим goto waypoint ow_om_entrance04 идём в шахту и выходим из шахты
На ~4-6 раз начинаются тормоза

С течением времени значения векторов увеличиваются/уменьшаются до тех пор пока не станут NaN, а дальше значение NaN попадает в функцию zCPolygon::CheckRayPolyIntersection которая и подвешивает игру.

Начало игры:
Код:
dataRaw=raw:d45a15c4d5bd9cc3baad12c46829cd422b42c1434492e2424c6b77c35a111242dbb66cc3afda803f8977ddb9817ead3bae50deb9dd5c813fb26ac8ba8a7fad3bfd34c8ba5df9803f0100

Через ~12 часов игрового времени:
Код:
dataRaw=raw:59bd36c6c5c7dc44ff0b33c64acd2bc6dd231a45fb1b28c64a4531c6e3430445fb932dc62d61a43f1ebaefbcda6f703e8c79f0bc1f4cc33f7190b2bd9872703e0560b2bd6023aa3f0100

1-й вход/выход из шахты:
Код:
dataRaw=raw:24512ac8cacc8a47190537c824a229c8ca2a8c47195636c8a4f929c8ca7b8b4799ad36c85e79e7432f15d9c3b52008449b4edac30e257844a0c412c418340844181e12c4750024440100

2-й вход/выход из шахты:
Код:
dataRaw=raw:ee8d596155b1a1e1eae98761ee8d596155b1a1e1eae98761ee8d596155b1a1e1eae987616a046167cd7ba5e7035c8c67723da7e7fbfcf567bba3d0e77c938c675ec4cee7f75faf670100

3-й вход/выход из шахты:
Код:
dataRaw=raw:0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0000c0ff0100

Визуально баг проявляется так

Начало игры
g_1.jpg

1-й вход/выход из шахты
g_1m.jpg

3-й вход/выход из шахты
g_3m.jpg


Для Готики 2 у меня нет последовательности действий для 100% воспроизведения бага, но проблема там тоже в значении NaN.
 
Сверху Снизу