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

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

    Ссылка на конкурсную тему - тык

Union SDK - Инструменты разработчика

Gratt


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


Union SDK

инструменты разработчика

Тема находится в состоянии наполнения



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

Рекомендуется смотреть на YouTube, поскольку там имеется сегментированный таймлайн.






Схемы классов движка
1600263933953.png
1600263981919.png
1600264017579.png
 

Вложения

  • sizeof.xlsx
    896,7 KB · Просмотры: 47
  • Union_SDK_1_0m.zip
    20,6 MB · Просмотры: 21
Последнее редактирование:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
OsmithREV, как именно ругается? Конкретнее.
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
117
Благодарности
183
Баллы
230
OsmithREV, как именно ругается? Конкретнее.

1591526945734.png

Вот. Сделал новый проект, сделал 2 файла - oCNpcEx.h и oCNpcEx.cpp, и скопировал туда код из той темы без каких либо изменений. В .cpp файле подключение в таком порядке:

C++:
#include "UnionAfx.h"
#include "oCNpcEx.h"

К слову, в основном проекте ругается !CHECK_THIS_ENGINE, так что вполне вероятно, что как-то не так подключаю все это дело, но в старых версиях всё работало ¯\_(ツ)_/¯
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
Добавил в шапку небольшой ролик про то, как правильно работать с файлами исходного кода в SDK 1.0h и выше.
В нем рассказывается о трёх важных вещах:
1. О правильном добавлении файлов .cpp & .h и почему следует добавлять именно Union .cpp и .h
2. О том, как правильно добавлять данные в классы готики и при этом ничего не сломать.
3. О решении проблемы, когда необходимо разделить логику кода для разных движков в одном файле исходного кода.
 

Raven25

Участник форума
Регистрация
18 Дек 2018
Сообщения
186
Благодарности
74
Баллы
190
Gratt подскажи пожалуйста как быть, я решил по пробовать сделать так как ты описал в 31 посте, и проблема заключается в том что компилятор ругается на "CFX_BASE_PROTO", подскажи пожалуйста как быть
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
Voron25, не в тот датник добавляешь значит.
 

zeratul47

Участник форума
Регистрация
10 Янв 2020
Сообщения
21
Благодарности
0
Баллы
60
zeratul47, тут подход требует комплексных решений. Главная проблема в том, что oCItem в первой готике не имеет части полей, пришедших в ночи ворона. И тут два варианта. Либо написать производный от oCItem, либо немного изменить поля существующего.
Последний чуть быстрее в реализации. Смотри, в скриптах никогда не используются C_ITEM.nameID и C_ITEM.weight, поэтому забираем их в свои нужды.

Создаем какую-нибудь инстанцию эффекта и присваиваем предмету

А в плагине делаем привязку эффекта к экземпляру предмета.
C++:
void oCVisualFX::SetPFXShapeVisual_Union( zCVisual* visual );
C++:
  void oCVisualFX::SetPFXShapeVisual_Union( zCVisual* visual ) {
    zCParticleFX* pfx = GetVisual()->CastTo<zCParticleFX>();
    if( !pfx )
      return;

    zCMesh* mesh = visual->CastTo<zCMesh>();
    if( !mesh )
      return;

    if( emAdjustShpToOrigin ) {
      zCParticleEmitter* emitter = pfx->emitter;

      if( emitter->shpMesh == visual )
        return;

      if( emitter->shpMesh ) {
        emitter->shpMesh->Release();
        emitter->shpMesh = Null;
      }

      emitter->shpMesh = mesh;
      mesh->AddRef();
    }
  }

C++:
oCVisualFX* oCItem::InsertEffect();
void oCItem::RemoveEffect();
void oCItem::ThisVobAddedToWorld_Union( zCWorld* world );
void oCItem::ThisVobRemovedFromWorld_Union( zCWorld* world );

C++:
  oCVisualFX* oCItem::InsertEffect() {
    oCVisualFX*& visualFX = (oCVisualFX*&)weight;
    visualFX = Null;

    if( nameID.Length() > 0 ) {
      oCVisualFX* effect = oCVisualFX::CreateAndPlay( nameID, this, Null, 0, 0.0f, 0, 0 );
      if( effect ) {
        visualFX = effect;

        if( visual )
          effect->SetPFXShapeVisual_Union( visual );

        effect->homeWorld->RemoveVob( effect );
        ogame->GetGameWorld()->AddVobAsChild_novt( effect, this );
      }
    }

    return visualFX;
  }

  void oCItem::ThisVobAddedToWorld_Union( zCWorld* world ) {
    THISCALL( oCItem_ThisVobAddedToWorld )(world);
    if( homeWorld == ogame->GetGameWorld() )
      InsertEffect();
  }

  void oCItem::RemoveEffect() {
    oCVisualFX*& visualFX = (oCVisualFX*&)weight;
    if( visualFX ) {
      cmd << "Remove effect" << endl;
      visualFX->Kill();
      //visualFX->Release();
      visualFX = Null;
    }
  }

  void oCItem::ThisVobRemovedFromWorld_Union( zCWorld* world ) {
    if( homeWorld == ogame->GetGameWorld() )
      RemoveEffect();
    THISCALL( oCItem_ThisVobRemovedFromWorld )(world);
  }

Для функций oCItem::ThisVobAddedToWorld и oCItem::ThisVobRemovedFromWorld определяем хуки, чтобы произвести создание эффекта в момент вставки объекта в мир
C++:
  HOOK oCItem_ThisVobAddedToWorld AS( &oCItem::ThisVobAddedToWorld, &oCItem::ThisVobAddedToWorld_Union );
  HOOK oCItem_ThisVobRemovedFromWorld AS( &oCItem::ThisVobRemovedFromWorld, &oCItem::ThisVobRemovedFromWorld_Union );
Посмотреть вложение 85197

Вооот, это программа минимум. Но когда надеваешь предмет на персонажа, там нужно сделать все тоже самое, но из функций экипировки. Правда есть нюанс, в г1 матрица предмета в слоте всегда будет возвращать 0 0 0, из-за чего эффект будет всегда висеть в нулевой точке координат локации. Сравнивать движки мне пока некогда, возможно Saturas поищет разницу.

И да, важное замечание. Существуют эффекты, частицы которых порождаются на полигонах модели, в г1 такое возможно только для 3ds моделей.


Здрасьте ещё раз.

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

Добавил я такой код.
C++:
void oCNpc::Equip_Union(oCItem* item);
void oCNpc::UnequipItem_Union(oCItem* item);

C++:
  HOOK oCNpc_Equip AS(&oCNpc::Equip, &oCNpc::Equip_Union);
  HOOK oCNpc_UnequipItem AS(&oCNpc::UnequipItem, &oCNpc::UnequipItem_Union);

  void oCNpc::Equip_Union(oCItem* item) {
      THISCALL(oCNpc_Equip)(item);
    
      if (item)
      {
          // zSTRING info = item->GetVobInfo();
          // if (info)
          //     screen->Print(200, 400, info);

          item->InsertEffect();
      }
  }

  void oCNpc::UnequipItem_Union(oCItem* item) {
      THISCALL(oCNpc_UnequipItem)(item);

      if (item)
      {
          // zSTRING info = item->GetVobInfo();
          // zVEC3 world_vec = item->GetAtVectorWorld();
          
          // if (world_vec.n) {
          //     screen->Print(200, 600, new zSTRING(world_vec.n[0]));
          //     screen->Print(500, 600, new zSTRING(world_vec.n[1]));
          //     screen->Print(800, 600, new zSTRING(world_vec.n[2]));
          // }

          // if (info)
          //     screen->Print(200, 400, info);

          item->RemoveEffect();
      }
  }

Пытался понять какие координаты берутся для отрисовки и где она происходит, но что-то не смог.

Единственное до чего добрался после долгого созерцания сурсов.
C++:
void oCNpc::PutInSlot(TNpcSlot* pSlot, oCVob* pVob, BOOL bRemoveContent)
{
........
if(!pVob->m_pWorld)
    {
        pVob->SetPositionWorld(zVEC3(0, 0, 0));
        ogame->GetGameWorld()->EnableVob(pVob, NULL);
        SetToSlotPosition(pVob, pSlot->m_sNodeName);
    }
............
}

Я так понял зануление происходит здесь, и связано это с тем, что после экипировки позиция предмета зависит от позиции нпс/игрока.

Если будет подсказка в какие методы посмотреть, я был бы очень благодарен.

Также столкнулся с проблемой, что если предмет выкидывается из инвентаря, то эффект начинается проигрываться не сразу, а только если повернуть камеру (убрать предмет из камеры) и навестись снова. С чем такая трабла может быть связана?
 

zeratul47

Участник форума
Регистрация
10 Янв 2020
Сообщения
21
Благодарности
0
Баллы
60
Подскажите, плз в чем может быть проблема. Свежесозданый проект на юнионе при попытке скомпилировать выдает кучу ошибок на две строки


Ошибка C2079 "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader" WeaponEffects_UnionPlugin_G1 d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h 48

Ошибка C2079 "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage" WeaponEffects_UnionPlugin_G1 d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h 49

1>------ Сборка начата: проект: WeaponEffects_UnionPlugin_G1, Конфигурация: G1 Release Win32 ------
1>DllMain.cpp
1>Interface.cpp
1>ClassDeclarators_G2A.cpp
1>Globals_G2A.cpp
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>Statics_G2A.cpp
1>ClassDeclarators_G2.cpp
1>Globals_G2.cpp
1>Statics_G2.cpp
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>ClassDeclarators_G1A.cpp
1>Globals_G1A.cpp
1>Statics_G1A.cpp
1>ClassDeclarators_G1.cpp
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>Globals_G1.cpp
1>Statics_G1.cpp
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(48): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shader" использует неопределенный class "Gothic_I_Classic::zCShader"
1>d:\gothicmodes\test\weaponeffects_unionplugin_g1\weaponeffects_unionplugin_g1\zengin\gothic_i_classic\api\zSky_Outdoor.h(49): error C2079: "Gothic_I_Classic::zCOutdoorRainFX::m_shaderStage" использует неопределенный class "Gothic_I_Classic::zCShaderStage"
1>Сборка проекта "WeaponEffects_UnionPlugin_G1.vcxproj" завершена с ошибкой.
========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Как это исправить?
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
zeratul47, какая версия СДК? Что за файлы
1>ClassDeclarators_G2A.cpp
1>Globals_G2A.cpp ?
В 1.0h их нету.
 

zeratul47

Участник форума
Регистрация
10 Янв 2020
Сообщения
21
Благодарности
0
Баллы
60
Union 1.0h

До этого стоял Union 1.0f

Обновлял юнион через ресурс менеджер. По времени - сегодня пару часов назад обновил.
Пост автоматически объединён:

Эти файлы есть проекте, если просто проводником полазить.
 
Последнее редактирование:

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.816
Баллы
240
Эти файлы есть проекте, если просто проводником полазить.
Проверил шаблоны проектов 1.0h и 1.0f для студии 2019 - нет там таких файлов
Обновлял юнион через ресурс менеджер.
Юнион, или Юнион СДК? Проект после создания назывался UnionPlugin_1_0h1?
 
Последнее редактирование:

zeratul47

Участник форума
Регистрация
10 Янв 2020
Сообщения
21
Благодарности
0
Баллы
60
Ну мне видос записать?)
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
Там в г1 и г1а надо просто в файлах zSky_OutDoor.h до неймспейса добавить заголовок zRenderManager.h. Сорри, мне вообще некогда заниматься обновлениями, о косяке знаю.
 
Последнее редактирование:

zeratul47

Участник форума
Регистрация
10 Янв 2020
Сообщения
21
Благодарности
0
Баллы
60
спасибо
 

zeratul47

Участник форума
Регистрация
10 Янв 2020
Сообщения
21
Благодарности
0
Баллы
60
Подскажите, как можно сделать инсталятор для мода, и включить туда так обновление юнион для готики?
И есть ли G2MDK для готики1?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
zeratul47, не понял задачу. Какого мода? Какого обновления?
 

zeratul47

Участник форума
Регистрация
10 Янв 2020
Сообщения
21
Благодарности
0
Баллы
60
Ну есть длл сделанная в юнионе (то что я делал для эффектов оружия), есть модификация (новый игровой мир с квестами и тд, где есть оружие с эффектами).
Нужно из этого сделать инсталятор, чтобы простой юзер мог просто установить модификацию на чистую готику
 
Сверху Снизу