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

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

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

Не стесняюсь спросить....

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
Кстати, *lupa* а что ещё полезного во временных метках, кроме определения порядка загрузки томов?
Ну так собственно все. Если ты оперируешь только именами, то у тебя есть ряд ограничений в их подборе. Хотя бы эстетический. А метки мало того, что позволяют всегда сохранять оригинальное название архива, но также делать под него оверлеи. Всякие текстурные паки; текстурные паки на текстурные паки и тп. Ну то есть просто дает больше степеней свобод в плане менеджмента игрового контента.
 

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
Не собрался ли ты коммерциализировать свою vdfs тулзу? :)
Нет. Но коды могут быть частью другого проекта, и это могут заметить.

Я скачал GothicVDFS с сайта Нико Бендлина и там в ReadMe.txt написано:
Note: VDFS is Copyright (c) 1994-2002, Peter Sabath / TRIACOM Software GmbH
Видимо нужно разделять авторство самого формата VDFS и кодов которые его используют. Авторство кодов мне неинтересно ибо я пишу свои. А что касается формата, ведь какой-нибудь LibreOffice открывает коммерческие форматы MS-Word'а и вроде бы всё ОК. Я думаю что могу читать VDFS без проблем. Если потребуется, то как в упомянутом выше случае с Valve, немного поменяю формат и представлю как свой и сделаю конвертер из оригинального.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.176
Благодарности
6.158
Баллы
1.565
sam0delk1n, Если это будет твое самописное, с нуля, произведение.
В котором ни капельки нет оригинала - то делай с ним что хочешь
 

Lurkorrion

Участник форума
Регистрация
25 Авг 2021
Сообщения
35
Благодарности
11
Баллы
60
Пусть расцветают сто цветов, пусть соперничают сто школ *ded*
 

MaGoth

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

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
У меня есть ещё ряд вопросов по формату файловых томов VDF.

После заголовка тома идут вхождения (entries). И в структуре вхождения есть флаги атрибутов файла. Я правильно понимаю что их значения соответствуют аналогичным из файла WinNT.h?

C++:
#define FILE_ATTRIBUTE_READONLY 0x01
#define FILE_ATTRIBUTE_HIDDEN 0x02
#define FILE_ATTRIBUTE_SYSTEM 0x04
#define FILE_ATTRIBUTE_ARCHIVE 0x20

В WinNT.h флагов больше, но формат VDF предполагает только эти четыре? Например есть в WinNT.h флаг FILE_ATTRIBUTE_DIRECTORY, но в VDF для этих целей добавили ещё одно поле в четыре байта из которых, я так понимаю, используются только два старших бита.

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
sam0delk1n, распарси вхождения готовых vdf и найди закономерность. Флаг (+72) определяет является ли вхождение концом последовательности. А тип (+76) определяет чем является вхождение, папкой или файлом. Когда игра собиралась более ранними версиями сборщика томов (имеет место быть в г1) - тип не указывался. Про это поле можно сразу забыть и строить проверку по указанному индексу во вхождении (+64).
 

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
Флаг (+72) определяет является ли вхождение концом последовательности. А тип (+76) определяет чем является вхождение, папкой или файлом.
Вы кажется в смещениях ошиблись. По смещению (+72) находится uint32_t в котором бит 31 - флаг директории, а бит 30 - флаг последнего элемента. А по смещению (+76) находятся атрибуты файла.

У меня получилось вот так.
C++:
#define VDF_FTYPE_DIR 0x80000000
#define VDF_FTYPE_LAST 0x40000000

//==================================================================================================
// Значения атрибутов файла взяты из WinNT.h
//
// FILE_ATTRIBUTE_READONLY 0x00000001
// FILE_ATTRIBUTE_HIDDEN 0x00000002
// FILE_ATTRIBUTE_SYSTEM 0x00000004
// FILE_ATTRIBUTE_ARCHIVE 0x00000020
//==================================================================================================
#define VDF_FATTR_READONLY 0x00000001
#define VDF_FATTR_HIDDEN 0x00000002
#define VDF_FATTR_SYSTEM 0x00000004
#define VDF_FATTR_ARCHIVE 0x00000020

typedef struct vdf_entry {
    char     name[64];
    uint32_t offset;
    uint32_t size;
    uint32_t type;
    uint32_t attributes;
} vdf_entry_t;

static_assert(80 == sizeof(vdf_entry_t));

Ещё нужно отметить что многобайтные типы данных записаны в файле в порядке Little-endian, и нет никаких полей в заголовке тома сигнализирующих об этом.
 

СырGuy

Участник форума
Регистрация
4 Мар 2022
Сообщения
22
Благодарности
2
Баллы
25
Добрый день, знатоки. С вами играет СырGuy из Зеленопупинска. Но у игрока несколько вопросов, что немного нарушает правила игры "Что?Где?Когда?". Внимание, вопросы:
1) Если я создам класс в плагине, то могу ли я обратиться к нему через скрипты .d,? Если да, то как? И тыкните носом, пожалуйста, где можно почитать про то, как расширить возможности GS (добавлять внешние функции, классы и т.д.)
2) Мне требуется удалить из контейнера Mobа какие-то предметы, которые там находятся. Через скрипты нас послали лесом. Через Union есть класс oCMobContainer, но как его использовать, пока не догоняю, потому что слишком зеленый я послушник. Если не трудно, то объясните, как проще реализовать это дело.

На размышление 10^10 минут.
 
Последнее редактирование:

Scarecrow

Участник форума
Регистрация
11 Авг 2014
Сообщения
158
Благодарности
85
Баллы
220
Подскажите пожалуйста, как нужно правильно редактировать морфируемые меши (вот голову нпс отредактировать получилось и все нормально работает), но вот другие объекты - типа травы и флагов изменить не получается. Загружаю меш и анимацию в 3дмакс, правлю (мне только размер флага надо увеличить), и экспортирую - и меш, и анимацию. Но несмотря на изменения, все экспортируется в первоначальном виде, словно и не было никаких изменений (хотя с головами нпс все получалось). Как это исправить??
 

ExCluD3D

Участник форума
Регистрация
19 Мар 2009
Сообщения
218
Благодарности
370
Баллы
210
Подскажите пожалуйста, как нужно правильно редактировать морфируемые меши (вот голову нпс отредактировать получилось и все нормально работает), но вот другие объекты - типа травы и флагов изменить не получается. Загружаю меш и анимацию в 3дмакс, правлю (мне только размер флага надо увеличить), и экспортирую - и меш, и анимацию. Но несмотря на изменения, все экспортируется в первоначальном виде, словно и не было никаких изменений (хотя с головами нпс все получалось). Как это исправить??
Примени "Reset xForm" перед экспортом. Находится в утилитах
 

psychedelic_soul

Участник форума
Регистрация
2 Авг 2015
Сообщения
11
Благодарности
0
Баллы
155
Всех приветствую!
Готику 2 Новый баланс.
Хочу вернуть старые текстуры мечам:
Легкий двуручник.jpg

Двуручный меч  паладина.jpg

двуручный рудный меч.jpg


Лёгкий двуручник - ITMW_ZWEIHAENDER1
Двуручник рыцаря - ITMW_2H_PAL_SWORD
Двуручный рудный меч itmw_2h_special_01

У меня два вопроса:
1. Знает кто, сохранились ли в текущей базе игры их прежние текстуры?
2. И может кто скинуть код-строчки на их прежние текстуры
"ITMW_2H_DJG_CRAFT_01.3DS"
"ItMw_Zweihaender2_New.3DS"
 
Последнее редактирование:

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.818
Баллы
240
Если я создам класс в плагине, то могу ли я обратиться к нему через скрипты .d,? Если да, то как?
Если хочешь, чтобы скриптовая переменная соответствующего типа указывала на объект определённого класса, то используешь такой С++ код:
parser.SetInstance("SOME_SCRIPT_VAR", someObject);
Примером скриптового класса, может являться класс C_NPC.
GS считает что смещение первого поля класса относительно начала объекта равно нулю и все поля расположены в памяти непрерывно. Если для твоего C++ класса это не так, то ты должен после загрузки скриптов установить правильные смещения для символов описывающих поля этого класса.
2) Мне требуется удалить из контейнера Mobа какие-то предметы, которые там находятся. Через скрипты нас послали лесом. Через Union есть класс oCMobContainer, но как его использовать, пока не догоняю, потому что слишком зеленый я послушник. Если не трудно, то объясните, как проще реализовать это дело.
Используй внешние функции из этого плагина: https://worldofplayers.ru/threads/41999/
расширить возможности GS (добавлять внешние функции, классы и т.д.)
Последний GS, который доступен из Resource Manager, позволяет добавлять сигнатуры новых внешних функций с помощью меню: Справка -> Показать внешние функции. Пример:
Daedalus:
func void Mob_RemoveItems(var instance object,var int item, var int cnt);
Реализация функции должна предоставляться плагином. Примеры функций сможешь найти в исходниках плагина zParserExtender.
Регистрация функций осуществляется с помощью вызова parser->DefineExternal по событию DefineExternals, где указываются имя функции, её адрес, тип возвращаемого значения, типы аргументов и zPAR_TYPE_VOID в конце. Например:
C++:
parser->DefineExternal("AI_UseMob",            AI_MobInteract,        zPAR_TYPE_INT, zPAR_TYPE_INSTANCE, zPAR_TYPE_STRING, zPAR_TYPE_INT, zPAR_TYPE_VOID);
 

СырGuy

Участник форума
Регистрация
4 Мар 2022
Сообщения
22
Благодарности
2
Баллы
25
Если хочешь, чтобы скриптовая переменная соответствующего типа указывала на объект определённого класса, то используешь такой С++ код:
parser.SetInstance("SOME_SCRIPT_VAR", someObject);
Примером скриптового класса, может являться класс C_NPC.
GS считает что смещение первого поля класса относительно начала объекта равно нулю и все поля расположены в памяти непрерывно. Если для твоего C++ класса это не так, то ты должен после загрузки скриптов установить правильные смещения для символов описывающих поля этого класса.
Используй внешние функции из этого плагина: https://worldofplayers.ru/threads/41999/
Последний GS, который доступен из Resource Manager, позволяет добавлять сигнатуры новых внешних функций с помощью меню: Справка -> Показать внешние функции. Пример:
Daedalus:
func void Mob_RemoveItems(var instance object,var int item, var int cnt);
Реализация функции должна предоставляться плагином. Примеры функций сможешь найти в исходниках плагина zParserExtender.
Регистрация функций осуществляется с помощью вызова parser->DefineExternal по событию DefineExternals, где указываются имя функции, её адрес, тип возвращаемого значения, типы аргументов и zPAR_TYPE_VOID в конце. Например:
C++:
parser->DefineExternal("AI_UseMob",            AI_MobInteract,        zPAR_TYPE_INT, zPAR_TYPE_INSTANCE, zPAR_TYPE_STRING, zPAR_TYPE_INT, zPAR_TYPE_VOID);
Спасибо за большой и довольно развернутый ответ. Опробую и отпишусь.
 

СырGuy

Участник форума
Регистрация
4 Мар 2022
Сообщения
22
Благодарности
2
Баллы
25
Slavemaster, почему GS 3.16 ругается на то, что в 3.15 не воспринимается, как ошибка? Пишет, что не определена функция и причем после комментирования этой функции нормально компилируется, а при повторной компиляции находит еще одну функцию, которая тоже не определена. В чем подвох?
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.818
Баллы
240
Slavemaster, почему GS 3.16 ругается на то, что в 3.15 не воспринимается, как ошибка? Пишет, что не определена функция и причем после комментирования этой функции нормально компилируется, а при повторной компиляции находит еще одну функцию, которая тоже не определена. В чем подвох?
Такие вопросы не ко мне. Пиши в соответствующую тему.
 

СырGuy

Участник форума
Регистрация
4 Мар 2022
Сообщения
22
Благодарности
2
Баллы
25
Если хочешь, чтобы скриптовая переменная соответствующего типа указывала на объект определённого класса, то используешь такой С++ код:
parser.SetInstance("SOME_SCRIPT_VAR", someObject);
Примером скриптового класса, может являться класс C_NPC.
GS считает что смещение первого поля класса относительно начала объекта равно нулю и все поля расположены в памяти непрерывно. Если для твоего C++ класса это не так, то ты должен после загрузки скриптов установить правильные смещения для символов описывающих поля этого класса.

Используй внешние функции из этого плагина: https://worldofplayers.ru/threads/41999/

Последний GS, который доступен из Resource Manager, позволяет добавлять сигнатуры новых внешних функций с помощью меню: Справка -> Показать внешние функции. Пример:
Daedalus:
func void Mob_RemoveItems(var instance object,var int item, var int cnt);
Реализация функции должна предоставляться плагином. Примеры функций сможешь найти в исходниках плагина zParserExtender.
Регистрация функций осуществляется с помощью вызова parser->DefineExternal по событию DefineExternals, где указываются имя функции, её адрес, тип возвращаемого значения, типы аргументов и zPAR_TYPE_VOID в конце. Например:
C++:
parser->DefineExternal("AI_UseMob",            AI_MobInteract,        zPAR_TYPE_INT, zPAR_TYPE_INSTANCE, zPAR_TYPE_STRING, zPAR_TYPE_INT, zPAR_TYPE_VOID);
Подскажи, пожалуйста
var instance object -что я должен сюда поместить? Имя моба?
И как можно в через Union с помощью хука перехватить момент взаимодействия с мобом?
00720870 .text Debug data ?CallOnStateFunc@oCMobInter@@UAEXPAVoCNpc@@H@Z
00720AD0 .text Debug data ?SendCallOnStateFunc@oCMobInter@@UAEXPAVoCNpc@@H@Z
Эти ли функции нужно перехватывать и если да, то какую из них?

И я чет не очень догоняю. подскажи, пожалуйста, где можно узнать про порядок действий при использований функций из плагина в gothic sourcer? Вот я в эксетерналс прописал функцию. В GS она не видится при компиляции. Шо надо делать?
 
Последнее редактирование:
Сверху Снизу