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

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

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

Blackshaman

Участник форума
Регистрация
21 Окт 2019
Сообщения
15
Благодарности
0
Баллы
100
//комментарии, которые не компилируются игрой, нужны чисто для себя, и чтобы потом вспомнить, что делал
Ну так, ты туда не то запихал.
Распаковываешь весь мод (Неофициальное обновление) куда-нибудь, например диск С:
После распаковки на диск С: в корне будет находится папка _WORK
Эту папку надо перекинуть в другую папку, например G2A_NR_SCRIPTPATCH
Должно быть так
С:\G2A_NR_SCRIPTPATCH\_WORK
Дальше в GothicSourcer надо изменить путь вставки файлов
Параметры-параметры вставки файлов в игру
галка безопасная вставка...
Готика 2
Указать путь к созданной выше папке С:\G2A_NR_SCRIPTPATCH
Компилируешь
В gothicvdfs в
Filename путь к игре C:\Games\Gothic II NoTR Systempack\Data\ModVDF и название мода
Builder Root path С:\G2A_NR_SCRIPTPATCH
В поле File Mask вводим значение *.* и нажимаем +.
Нажимаем кнопку Build Volume (Создать том).

Потом нужно создать отдельный ini файл для запуска твоего мода!
В C:\Games\Gothic II NoTR Systempack\System создаешь новый ini файл или просто сделай копию мода неоф.обновления G2a_NR_ScriptPatch_v22.ini
и отредактируй запуск твоего mod файла
VDF=название_твоего_мода.mod

Вообще надо скачать и изучать последовательно справочник модостроения
Там мой пост с новыми ссылками
В справочнике первый пункт уроков, простая скриптовая модификация, благо это не сложно.
Огромное спасибо за подробный ответ.
 

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
Добрового времени суток всем. Не знаю если правильный тред, но пока оставлю здесь. Вот недавно решил поиграться с AST/Union и следовал туториалам. Сделал замену oCNpc и oCObjectFactory как описано в уроке, но почему-то игра не запускается с моим плагином. Компилил под G2A Release

C++:
#include "UnionAfx.h"


string GetEngineVersionName(TEngineVersion version)
{
    switch (version)
    {
        case Engine_G1:  return "Gothic I Classic";
        case Engine_G1A: return "Gothic I Addon";
        case Engine_G2:  return "Gothic II Classic";
        case Engine_G2A: return "Gothic II Addon";
    }
    return "Unknown";
}

void Game_Entry()
{
}

void Game_Init()
{
    const CPlugin* plugin = CPlugin::GetCurrentPlugin();
    string pluginName = plugin->GetName();

    TVersion unionVersion = Union.GetUnionVersion();
    string unionVersionName = unionVersion.ToString();

    TEngineVersion engineVersion = Union.GetEngineVersion();
    string engineVersionName = GetEngineVersionName(engineVersion);

    Message::Info(string::Combine(
        "Plugin name: %s\nUnion version: %s\nEngine version: %s",
        pluginName,
        unionVersionName,
        engineVersionName
    ));
}

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()
{
}

extern void InitFactory();

void Game_DefineExternals()
{
    InitFactory();
}

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++:
#ifndef OCNPCEX_H
#define OCNPCEX_H

#include <UnionAfx.h>

using namespace Gothic_II_Addon;

class oCNpcEx : public oCNpc
{
    public:
        zCLASS_UNION_DECLARATION(oCNpcEx);

        CTimer Timer;

        virtual void ProcessNpc();
};

#endif
C++:
#include <oCNpcEx.h>
#include <UnionAfx.h>

using namespace Gothic_II_Addon;

zCLASS_UNION_DEFINITION(oCNpcEx, oCNpc, 0, 0);

void oCNpcEx::ProcessNpc()
{
    Timer.Attach();
    Timer.Suspend(0, ogame->singleStep);
    if (Timer(0, 1)) attribute[NPC_ATR_MANA] = max(attribute[NPC_ATR_MANAMAX], attribute[NPC_ATR_MANA] + 1);
    oCNpc::ProcessNpc();
}
C++:
#ifndef OCOBJECTFACTORYEX_H
#define OCOBJECTFACTORYEX_H

#include <UnionAfx.h>

using namespace Gothic_II_Addon;

class oCObjectFactoryEx : public oCObjectFactory
{
        zCLASS_UNION_DECLARATION(oCObjectFactoryEx);
    public:
        virtual oCNpc* CreateNpc(int index);
};

#endif
C++:
#include <oCObjectFactoryEx.h>
#include <oCNpcEx.h>
#include <UnionAfx.h>

using namespace Gothic_II_Addon;

zCLASS_UNION_DEFINITION(oCObjectFactoryEx, oCObjectFactoryEx, 0, 0);

oCNpc* oCObjectFactoryEx::CreateNpc(int index)
{
    oCNpc* npc = new oCNpcEx();
    if (index != zPAR_INDEX_UNDEF) npc->InitByScript(index, 0);
    return npc;
}

void InitFactory()
{
    zfactory = new oCObjectFactoryEx();
}

Заранее благодарю!
 

MEG@VOLT

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

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
MEG@VOLT, Его нет. Игра как бы запускается, но виснет с черным экраном
 

MEG@VOLT

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

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
MEG@VOLT, сразу после запуска черный экран. Даже интро видео не появляются. Без плагина все работает
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.777
Баллы
1.625
Костылеводы.
Тут уже по вашей части.
Помогайте человеку, иде он накосячил...
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
462
Благодарности
286
Баллы
230
Melonslise, попробуй убери мессадж бокс из функции таким образом:
C++:
void Game_Init()
{
    // выход из функции
    return;

    // твой код...
}

Или работай в оконном режиме.
 

Melonslise

Участник форума
Регистрация
19 Окт 2014
Сообщения
179
Благодарности
19
Баллы
175
Jr13San, да вроде как не в месседже дело. Все работало до того как я добавил новые классы. Попробовал все же убрать, но результат увы тот же
1571945469664.png
 

alexeich2019

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

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
462
Благодарности
286
Баллы
230
Все работало до того как я добавил новые классы. Попробовал все же убрать, но результат увы тот же
В общем пришлось сравнительно повторить пример.
Первое, на что я обратил внимание - это то, что используемый код не обёрнут в рабочее пространство имён.
Второе - невнимательный копи-паст (лишнее подчёркнуто):
zCLASS_UNION_DEFINITION(oCObjectFactoryEx, oCObjectFactoryEx, 0, 0);

В итоге код плагина в таком виде запустился:
C++:
// oCNpcEx.cpp
#include <oCNpcEx.h>
#include <UnionAfx.h>

namespace Gothic_II_Addon
{
    zCLASS_UNION_DEFINITION(oCNpcEx, oCNpc, 0, 0);

    void oCNpcEx::ProcessNpc()
    {
        Timer.Attach();
        Timer.Suspend(0, ogame->singleStep);
        if (Timer(0, 1)) attribute[NPC_ATR_MANA] = max(attribute[NPC_ATR_MANAMAX], attribute[NPC_ATR_MANA] + 1);
        oCNpc::ProcessNpc();
    }
}


// oCNpcEx.h
#ifndef OCNPCEX_H
#define OCNPCEX_H

#include <UnionAfx.h>

namespace Gothic_II_Addon
{
    class oCNpcEx : public oCNpc
    {
        public:
            zCLASS_UNION_DECLARATION(oCNpcEx);

            CTimer Timer;

            virtual void ProcessNpc();
    };
}

#endif


// oCObjectFactoryEx.cpp
#include <oCObjectFactoryEx.h>
#include <oCNpcEx.h>
#include <UnionAfx.h>

namespace Gothic_II_Addon
{
    zCLASS_UNION_DEFINITION(oCObjectFactoryEx, oCObjectFactory, 0, 0);

    oCNpc* oCObjectFactoryEx::CreateNpc(int index)
    {
        oCNpc* npc = new oCNpcEx();
        if (index != zPAR_INDEX_UNDEF) npc->InitByScript(index, 0);
        return npc;
    }

    void InitFactory()
    {
        zfactory = new oCObjectFactoryEx();
    }
}

void GameGlobal_OnInitFactory()
{
    Gothic_II_Addon::InitFactory();
}


// oCObjectFactoryEx.h
#ifndef OCOBJECTFACTORYEX_H
#define OCOBJECTFACTORYEX_H

#include <UnionAfx.h>

namespace Gothic_II_Addon
{
    class oCObjectFactoryEx : public oCObjectFactory
    {
            zCLASS_UNION_DECLARATION(oCObjectFactoryEx);
        public:
            virtual oCNpc* CreateNpc(int index);
    };
}

#endif


// Application.cpp
#include "UnionAfx.h"

string GetEngineVersionName(TEngineVersion version)
{
    switch (version)
    {
        case Engine_G1:  return "Gothic I Classic";
        case Engine_G1A: return "Gothic I Addon";
        case Engine_G2:  return "Gothic II Classic";
        case Engine_G2A: return "Gothic II Addon";
    }
    return "Unknown";
}

void Game_Entry()
{
}

void Game_Init()
{
   const CPlugin* plugin = CPlugin::GetCurrentPlugin();
    string pluginName = plugin->GetName();

    TVersion unionVersion = Union.GetUnionVersion();
    string unionVersionName = unionVersion.ToString();

    TEngineVersion engineVersion = Union.GetEngineVersion();
    string engineVersionName = GetEngineVersionName(engineVersion);

    Message::Info(string::Combine(
        "Plugin name: %s\nUnion version: %s\nEngine version: %s",
        pluginName,
        unionVersionName,
        engineVersionName
    ));
}

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()
{
}

extern void GameGlobal_OnInitFactory();

void Game_DefineExternals()
{
    GameGlobal_OnInitFactory();
}

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
  );

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

SpinningBullet

Участник форума
Регистрация
5 Ноя 2019
Сообщения
3
Благодарности
0
Баллы
95
Пытаюсь моддить Готику 1.

Вставил 1 монстра и 1 предмет на карту.

Сохранил в compiled binary.

Собрал мод в vdfs.

Скопировал в игру.

Открываю мод-стартер, новый мод в меню виден (только имя какое-то кривое)


Запускаю.... и ничего. Объекты не появились.


На всякий случай распаковал мод обратно, открыл - объекты на месте.

В чем может быть проблема ?
 

MEG@VOLT

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

SpinningBullet

Участник форума
Регистрация
5 Ноя 2019
Сообщения
3
Благодарности
0
Баллы
95
Чем компилил?

Что сделал?

Save zen -> compiled
как-то так

кинул сюда
C:\gothic\Data\ModVDF

ini файл мода покажи

Код:
[INFO]
title=xtest
description=
authors=
version=0.01
webpage=
icon=gothic.exe

[FILES]
vdf=xtest.mod
game=Content\Gothic
fightai=Content\Fight
menu=System\Menu
camera=System\Camera
music=System\Music
soundeffects=System\SFX
particleseffects=System\ParticleFX
visualeffects=System\VisualFX
outputunits=Content\Cutscene\OU

[SETTINGS]
world=world.zen
player=PC_HERO

[OPTIONS]
force_subtitles=0
show_info=0

[OVERRIDES]
INTERNAL.extendedMenu=1

впрочем, щас почему-то стало еще хуже
при попытке открыть любой zen ругается что не компилированый
даже если распаковать оригинальный из C:\gothic\Data\worlds.VDF
при попытке компилировать пустое окно
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.900
Благодарности
6.777
Баллы
1.625
SpinningBullet, Предметы - ладно, можно вставлять через спейсер. Но монстры вставляются скриптами.
Мир, который правил лежит в файле xtest.mod?
Покажи его структуру.
впрочем, щас почему-то стало еще хуже
при попытке открыть любой zen ругается что не компилированый
даже если распаковать оригинальный из C:\gothic\Data\worlds.VDF
при попытке компилировать пустое окно
При открытии миров смотри внимательно, там сейчас скорее всего расширение стоит как uncompilled
 

Vlad_Torop

Участник форума
Регистрация
2 Май 2014
Сообщения
873
Благодарности
501
Баллы
245
Помгите разобраться с парочкой вопросов:
1.Как вставлять новые видео в мод?
Есть,к примеру, видео kalabala.bik. Если я вставляю его в саму игру(G2\work\data\video),то при запуске мода(установленного на этой игре) видео проигрывается.
Но как мне его в сам мод вставить? Раскидал уже парочку модов с новыми катсценами,и что-то не нашел куда там видео воткнуты.
2.Примерно такая же ерундовина с новыми звуками.
К примеру,есть звук mumu.wave. Лежит он в папке мода mod\work\data\sound\sfx. Если запустить его через скрипты,скажем Snd_Play("mumu");,то игра его не воспримет.
А если переименовать,по примеру оригинального,скажем dog1.wave,то игра изменения прочитает.
Как научить игру считывать новый звук mumu,чтоб не косячить звуки оригинала?

Надеюсь,не путано объяснил?
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
Vlad_Torop, ролики надо в скриптах мода прописывать, меню дат и/или готик дат.. имя и регистр важны! учитывай это..
музыка аналогично в скриптах, сфх дат готик дат и тд.. распотрошишь все и поймешь..
зы, +в разделе уроков моддинга прочитай напутствия..
 

Vlad_Torop

Участник форума
Регистрация
2 Май 2014
Сообщения
873
Благодарности
501
Баллы
245
MaGoth, с музыкой понятно стало. Сам файл закидывается в mod\work\data\sound\sfx,а инициализация инстанций происходит в sfx.dat.

А вот с видео,так и не могу догнать.Во первых,сколько ни раскидывал моды(к примеру Странника),нигде папки с видео-файлами нет(в отличии от установленного оригинала,где наряду с папками анимы,меши,муз,скрипты,есть и папка видео).Куда их ложить-то?
В gothic.datниках, инстанций видосов тоже нет. Разбирал и акелловский готик дат,и оригинал,и модов.
Если мы вообще,про один и тот же готик дат говорим? Который получается при компиляции проекта в сурсере,так?
 
Последнее редактирование:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
А вот с видео,так и не могу догнать.
в оригинале игры, видео файл помещается в каталог видео оригинала, или в собственную папку которая как и название файла должно быть прописано в скриптах..
путь, имя файла и регистр важны и изменяться не могут.
в оригинале игры все видео находится здесь: "C:\Gothic II Addon\_work\Data\Video"
с Юнионом, видео можно паковать в виртуальные тома мод вдф, в свою папку или куда иначе но путь аналогично полностью должен быть прописан в скриптах.

В gothic.datниках, инстанций видосов тоже нет. Разбирал и акелловский готик дат,и оригинал,и модов.
Если мы вообще,про один и тот же готик дат говорим? Который получается при компиляции проекта в сурсере,так?
да про них.. если ГотикСурсер в поиске по файлам проекта для строки "bik" ничего не выдает декомпилируй меню дат и в нем смотри..
 
Сверху Снизу