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

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

Gratt


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

RU EN

 

Вложения

  • Union_Primary_Universal 12.02.2022.zip
    44 MB · Просмотры: 28.432
  • Union 1.0m 26.06.2022.zip
    11,8 MB · Просмотры: 977
  • Union 1.0m 26.06.2022 v2.zip
    11,8 MB · Просмотры: 627
  • Union 1.0m 26.06.2022 v3.zip
    11,8 MB · Просмотры: 30.732

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.432
Благодарности
4.771
Баллы
625
Slavemaster, да. У него старый экстендер. В оригинальной игре в момент конструирования предмета в инстанцию item не пишется текущий экземпляр, экстендер это правит. Модфикс использует item в одной из функций, чтобы отобразить имя украденного предмета, но перед этим происходит создание нового экземпляра через CreateItem, в котором происходит перезапись item. В актуальных версиях значение item возвращается к прежнему сразу после конструирования инстанции.
 

Orc Hunter


Модостроитель
Регистрация
12 Окт 2013
Сообщения
1.269
Благодарности
1.671
Баллы
305
Игра теперь запускается, но при попытке модифицировать оружие происходит вылет. Но похоже что происходит это конкретно у меня, в демо все нормально. Буду разбираться. Спасибо за помощь.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.432
Благодарности
4.771
Баллы
625
Игра теперь запускается, но при попытке модифицировать оружие происходит вылет. Но похоже что происходит это конкретно у меня, в демо все нормально. Буду разбираться. Спасибо за помощь.
В демо у меня создался какой-то огненный кинжал, который вроде сохраняется и загружается. Я как-то не особо понимаю что там написано по-немецки :)
 
Последнее редактирование:

Orc Hunter


Модостроитель
Регистрация
12 Окт 2013
Сообщения
1.269
Благодарности
1.671
Баллы
305
В моде или демо? В демо у меня создался какой-то огненный кинжал, который вроде сохраняется и загружается. Я как-то не особо понимаю что там написано по-немецки :)
У меня вроде все тоже заработало. Не могу воспроизвести ту ошибку.
 

Orc Hunter


Модостроитель
Регистрация
12 Окт 2013
Сообщения
1.269
Благодарности
1.671
Баллы
305
Gratt, мне очень нужна помощь с еще одной функцией. Моя функция настройки дальности прорисовки травы вышла довольно кривой и очень нагружает игру в момент применения. Возможно вам удастся ее улучшить или реализовать при помощи Union?
Код:
/*
 * Search all or given vobs by base class
 *//*
 * Retrieve class definition address by string
 */
func int GetClassDefByString(var string classDefName) {
    const int zCClassDef__GetClassDef_G1 = 5809264; //0x58A470
    const int zCClassDef__GetClassDef_G2 = 5939168; //0x5A9FE0

    var int classDefNamePtr; classDefNamePtr = _@s(classDefName);

    const int call = 0;
    if (CALL_Begin(call)) {
        CALL_PtrParam(_@(classDefNamePtr));
        CALL__cdecl(MEMINT_SwitchG1G2(zCClassDef__GetClassDef_G1, zCClassDef__GetClassDef_G2));
        call = CALL_End();
    };
    return CALL_RetValAsPtr();
};

func int SearchVobsByClass(var string className, var int vobListPtr) {
    const int zCWorld__SearchVobListByBaseClass_G1 = 6250016; //0x5F5E20
    const int zCWorld__SearchVobListByBaseClass_G2 = 6439712; //0x624320

    var zCArray vobList; vobList = _^(vobListPtr);
    if (!vobList.numInArray) {
        var int vobTreePtr; vobTreePtr = _@(MEM_Vobtree);
        var int worldPtr;   worldPtr   = _@(MEM_World);
        var int classDef;   classDef   = GetClassDefByString(className);

        const int call = 0;
        if (CALL_Begin(call)) {
            CALL_PtrParam(_@(vobTreePtr));
            CALL_PtrParam(_@(vobListPtr));
            CALL_PtrParam(_@(classDef));
            CALL__thiscall(_@(worldPtr), MEMINT_SwitchG1G2(zCWorld__SearchVobListByBaseClass_G1,
                                                           zCWorld__SearchVobListByBaseClass_G2));
            call = CALL_End();
        };
    } else {
        // Iterate over all vobs and remove the ones not matching the criteria
        var int i; i = 0;
        while(i < vobList.numInArray);
            var int vobPtr; vobPtr = MEM_ArrayRead(vobListPtr, i);
            if (objCheckInheritance(vobPtr, classDef)) {
                // Keep vob
                i += 1;
            } else {
                // Otherwise remove vob from array
                MEM_ArrayRemoveIndex(vobListPtr, i);
            };
        end;
    };

    return vobList.numInArray;
};


/*
 * Search all or given vobs by visual
 */
func int SearchVobsByVisual(var string visual, var int vobListPtr) {
    // Create vob list if empty
    var zCArray vobList; vobList = _^(vobListPtr);
    if (!vobList.numInArray) {
        if (!SearchVobsByClass("zCVob", vobListPtr)) {
            return 0;
        };
    };

    // Iterate over all vobs and remove the ones not matching the criteria
    var int i; i = 0;
    while(i < vobList.numInArray);
        var int vobPtr; vobPtr = MEM_ArrayRead(vobListPtr, i);
        if (vobPtr) {
            // Check for visual
            var zCVob vob; vob = _^(vobPtr);
            if (vob.visual) {
                // Compare visual
                var zCObject visualObj; visualObj = _^(vob.visual);
                if (Hlp_StrCmp(visualObj.objectname, visual)) {
                    // Keep vob
                    i += 1;
                    continue;
                };
            };
        };

        // Otherwise remove vob from array
        MEM_ArrayRemoveIndex(vobListPtr, i);
    end;

    return vobList.numInArray;
};


/*
 * Search all or given vobs by proximity
 */
func int SearchVobsByProximity(var int posPtr, var int maxDist, var int vobListPtr) {
    // Create vob list if empty
    var zCArray vobList; vobList = _^(vobListPtr);
    if (!vobList.numInArray) {
        if (!SearchVobsByClass("zCVob", vobListPtr)) {
            return 0;
        };
    };

    var int pos[3];
    MEM_CopyWords(posPtr, _@(pos), 3);

    // Iterate over all vobs and remove the ones not matching the criteria
    var int i; i = 0;
    while(i < vobList.numInArray);
        var int vobPtr; vobPtr = MEM_ArrayRead(vobListPtr, i);
        if (vobPtr) {
            // Check distance
            var zCVob vob; vob = _^(vobPtr);

            // Compute distance between vob and position
            var int dist[3];
            dist[0] = subf(vob.trafoObjToWorld[ 3], pos[0]);
            dist[1] = subf(vob.trafoObjToWorld[ 7], pos[1]);
            dist[2] = subf(vob.trafoObjToWorld[11], pos[2]);
            var int distance;
            distance = sqrtf(addf(addf(sqrf(dist[0]), sqrf(dist[1])), sqrf(dist[2])));

            // Check if distance is with in maxDist
            if (lef(distance, maxDist)) {
                // Keep vob
                i += 1;
                continue;
            };
        };

        // Otherwise remove vob from array
        MEM_ArrayRemoveIndex(vobListPtr, i);
    end;

    return vobList.numInArray;
};


/*
 * Search all or given vobs by remoteness
 */
func int SearchVobsByRemoteness(var int posPtr, var int minDist, var int vobListPtr) {
    // Create vob list if empty
    var zCArray vobList; vobList = _^(vobListPtr);
    if (!vobList.numInArray) {
        if (!SearchVobsByClass("zCVob", vobListPtr)) {
            return 0;
        };
    };

    var int pos[3];
    MEM_CopyWords(posPtr, _@(pos), 3);

    // Iterate over all vobs and remove the ones not matching the criteria
    var int i; i = 0;
    while(i < vobList.numInArray);
        var int vobPtr; vobPtr = MEM_ArrayRead(vobListPtr, i);
        if (vobPtr) {
            // Check distance
            var zCVob vob; vob = _^(vobPtr);

            // Compute distance between vob and position
            var int dist[3];
            dist[0] = subf(vob.trafoObjToWorld[ 3], pos[0]);
            dist[1] = subf(vob.trafoObjToWorld[ 7], pos[1]);
            dist[2] = subf(vob.trafoObjToWorld[11], pos[2]);
            var int distance;
            distance = sqrtf(addf(addf(sqrf(dist[0]), sqrf(dist[1])), sqrf(dist[2])));

            // Check if distance is beyond minDist
            if (gf(distance, minDist)) {
                // Keep vob
                i += 1;
                continue;
            };
        };

        // Otherwise remove vob from array
        MEM_ArrayRemoveIndex(vobListPtr, i);
    end;

    return vobList.numInArray;
};

var int Grass_Dist;

func void FixMobSwitches_Restore_Sub(var int vobArrayPtr)
{
    var zCArray vobList;
    vobList = _^(vobArrayPtr);
    repeat(i, vobList.numInArray);
    var int i;
    var int vobPtr; vobPtr = MEM_ArrayRead(vobArrayPtr, i);
    var oCMobInter mob;
    mob = _^ (vobPtr);
 
    if(Grass_Dist == 0)
    {
        mob._zCVob_m_fVobFarClipZScale = 1036831949;
    }
    else if(Grass_Dist == 1)
    {
        mob._zCVob_m_fVobFarClipZScale = 1045220557;
    }
    else if(Grass_Dist == 2)
    {
        mob._zCVob_m_fVobFarClipZScale = 1050253722;
    }
    else if(Grass_Dist == 3)
    {
        mob._zCVob_m_fVobFarClipZScale = 1053609165;
    }
    else if(Grass_Dist == 4)
    {
        mob._zCVob_m_fVobFarClipZScale = 1056964608;
    }
    else if(Grass_Dist == 5)
    {
        mob._zCVob_m_fVobFarClipZScale = 1058642330;
    }
    else if(Grass_Dist == 6)
    {
        mob._zCVob_m_fVobFarClipZScale = 1060320051;
    }
    else if(Grass_Dist == 7)
    {
        mob._zCVob_m_fVobFarClipZScale = 1061997773;
    }
    else if(Grass_Dist == 8)
    {
        mob._zCVob_m_fVobFarClipZScale = 1063675494;
    }
    else if(Grass_Dist == 9)
    {
        mob._zCVob_m_fVobFarClipZScale = 1065353216;
    }
    else if(Grass_Dist == 10)
    {
        mob._zCVob_m_fVobFarClipZScale = 0;
    };
    end;
};

func void FixMobSwitches_Restore()
{
    var int vobArrayPtr;
    vobArrayPtr = MEM_ArrayCreate();
    if(SearchVobsByVisual("GRAS1X1.3DS", vobArrayPtr))
    {
        FixMobSwitches_Restore_Sub(vobArrayPtr);
    };
    MEM_ArrayClear(vobArrayPtr);
    MEM_ArrayFree(vobArrayPtr);
    if(SearchVobsByVisual("GRAS1X1_G.3DS", vobArrayPtr))
    {
        FixMobSwitches_Restore_Sub(vobArrayPtr);
    };
    MEM_ArrayClear(vobArrayPtr);
    MEM_ArrayFree(vobArrayPtr);
    if(SearchVobsByVisual("GRAS1X0.3DS", vobArrayPtr))
    {
        FixMobSwitches_Restore_Sub(vobArrayPtr);
    };
    MEM_ArrayClear(vobArrayPtr);
    MEM_ArrayFree(vobArrayPtr);
    if(SearchVobsByVisual("GRAS1X0_G.3DS", vobArrayPtr))
    {
        FixMobSwitches_Restore_Sub(vobArrayPtr);
    };
    MEM_ArrayClear(vobArrayPtr);
    MEM_ArrayFree(vobArrayPtr);
    if(SearchVobsByVisual("GRAS2X2.3DS", vobArrayPtr))
    {
        FixMobSwitches_Restore_Sub(vobArrayPtr);
    };
    MEM_ArrayClear(vobArrayPtr);
    MEM_ArrayFree(vobArrayPtr);
    if(SearchVobsByVisual("OW_NATURE_BUSH_02_01.3DS", vobArrayPtr))
    {
        FixMobSwitches_Restore_Sub(vobArrayPtr);
    };
    MEM_ArrayClear(vobArrayPtr);
    MEM_ArrayFree(vobArrayPtr);
};
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.432
Благодарности
4.771
Баллы
625
Orc Hunter, а в чем особенность этой функции? В Union уже есть реализация динамической дальности, как пример. Нужно что-то такое, но только по определенному флагу воба?
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.147
Благодарности
2.021
Баллы
320
а в чем особенность этой функции?
Ищет вобы с определёнными визуалами и устанавливает им поля vobFarClipZScale в зависимости от значения скриптовой константы Grass_dist.
 

Orc Hunter


Модостроитель
Регистрация
12 Окт 2013
Сообщения
1.269
Благодарности
1.671
Баллы
305
Orc Hunter, а в чем особенность этой функции? В Union уже есть реализация динамической дальности, как пример. Нужно что-то такое, но только по определенному флагу воба?
Она меняет _zCVob_m_fVobFarClipZScale соответственно значению из настроек для всех вобов из списка.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.432
Благодарности
4.771
Баллы
625
Orc Hunter, это я понял. Я немного о другом. Откуда (при каком условии) и как часто происходят запросы на изменение дистанции отрисовки. И сколько времени занимает выполнение этих функций.
 

Orc Hunter


Модостроитель
Регистрация
12 Окт 2013
Сообщения
1.269
Благодарности
1.671
Баллы
305
Orc Hunter, это я понял. Я немного о другом. Откуда (при каком условии) и как часто происходят запросы на изменение дистанции отрисовки. И сколько времени занимает выполнение этих функций.
Запросы из зацикленной функции, но выполнение происходит один раз в начале игры, или в случае если параметр был изменен. Само выполнение занимает примерно секунду реального времени. И все бы ничего, но у некоторых игроков от нагрузки в эту секунду вылетает игра...
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.432
Благодарности
4.771
Баллы
625
Orc Hunter, могу предложить это. zGrassClipDistance.dll - сам плагин. zGrassClipDistance_Test.d - тестовый скрипт. То и другое кладется в Autorun.
Для работы в скриптах объявляются две константы:
1. const string GrassVisualNames[] - массив имен визуалов, множители отсечения которых могут меняться.
2. const float GrassClipDistanceScale - общий множитель отсечения. По умолчанию = 1.0. Все что ниже - снижает дистанцию. Все что выше - увеличивает.
Скорость изменения всех свойств вобов менее 1мс в L'Hiver NewWorld + несколько мс требуется самому движку, чтобы обновить уровень альфы вобов. Дополнительная память в момент вычисления не требуется. Потестил тупо через покадровый цикл.

Daedalus:
const string GrassVisualNames[7] = {
    "GRAS1X1.3DS",
    "GRAS1X1_G.3DS",
    "GRAS1X0.3DS",
    "GRAS1X0_G.3DS",
    "GRAS2X2.3DS",
    "OW_NATURE_BUSH_02_01.3DS",
    "NW_NATG5_BS.3DS"
};

const float GrassClipDistanceScale = 1.0;

// test
func event GameLoop()
{
    var int random; random = Hlp_Random(5);
    if (random == 0)
    {
        GrassClipDistanceScale = 0.2;
    }
    else if (random == 1)
    {
        GrassClipDistanceScale = 0.4;
    }
    else if (random == 2)
    {
        GrassClipDistanceScale = 0.6;
    }
    else if (random == 3)
    {
        GrassClipDistanceScale = 0.8;
    }
    else if (random == 4)
    {
        GrassClipDistanceScale = 1.0;
    };
};

C++:
  Array<zCVob*> GrassVobs;
  Array<string> GrassVisualNames;
  float* GrassClipDistanceScale = Null;
  float GrassClipDistanceScalePrev = FLT_MIN;
  bool SymbolsInitialized = false;

  void RegisterGrassVob( zCVob* vob ) {
    vob->AddRef();
    GrassVobs.Insert( vob );
  }

  void UnregisterGrassVob( zCVob* vob ) {
    uint index = GrassVobs.SearchEqual( vob );
    if( index == Invalid )
      return;

    vob->Release();
    GrassVobs.FastRemoveAt( index );
  }

  void UnregisterAllGrassVobs() {
    for each( auto vob in GrassVobs )
      vob->Release();
    
    GrassVobs.Clear();
  }

  bool VobIsGrass( zCVob* vob ) {
    if( !vob || !vob->visual )
      return false;

    for each( auto& visualName in GrassVisualNames )
      if( visualName == vob->visual->GetVisualName().ToChar() )
        return true;
    
    return false;
  }

  void CollectGrassVobs( zCTree<zCVob>* tree ) {
    zCVob* vob = tree->GetData();
    if( VobIsGrass( vob ) )
      RegisterGrassVob( vob );

    zCTree<zCVob>* child = tree->GetFirstChild();
    while( child ) {
      CollectGrassVobs( child );
      child = child->GetNextChild();
    }
  }

  bool InitializeGrassVisualNames() {
    zCPar_Symbol* sym = parser->GetSymbol( "GrassVisualNames" );
    if( !sym )
      return false;

    zSTRING value;
    for( int i = 0; i < sym->ele; i++ ) {
      sym->GetValue( value, i );
      GrassVisualNames.Insert( value );
    }

    return true;
  }

  bool InitializeGrassClipDistance() {
    zCPar_Symbol* sym = parser->GetSymbol( "GrassClipDistanceScale" );
    if( !sym )
      return false;

    GrassClipDistanceScale = &sym->single_floatdata;
    return true;
  }

  void CheckGrassClipDistance() {
    if( *GrassClipDistanceScale != GrassClipDistanceScalePrev ) {
      for each( auto vob in GrassVobs )
        vob->m_fVobFarClipZScale = *GrassClipDistanceScale;

      GrassClipDistanceScalePrev = *GrassClipDistanceScale;
    }
  }

  void Game_Init() {
    SymbolsInitialized =
      InitializeGrassVisualNames() &&
      InitializeGrassClipDistance();
  }

  void Game_Loop() {
    if( SymbolsInitialized )
      CheckGrassClipDistance();
  }

  void LoadBegin() {
    if( SymbolsInitialized )
      UnregisterAllGrassVobs();
  }

  void LoadEnd() {
    if( SymbolsInitialized ) {
      oCWorld* world = ogame->GetGameWorld();
      CollectGrassVobs( &world->globalVobTree );
    }
  }
 

Вложения

  • zGrassClipDistance.7z
    115 KB · Просмотры: 19

Orc Hunter


Модостроитель
Регистрация
12 Окт 2013
Сообщения
1.269
Благодарности
1.671
Баллы
305
Orc Hunter, могу предложить это. zGrassClipDistance.dll - сам плагин. zGrassClipDistance_Test.d - тестовый скрипт. То и другое кладется в Autorun.
Для работы в скриптах объявляются две константы:
1. const string GrassVisualNames[] - массив имен визуалов, множители отсечения которых могут меняться.
2. const float GrassClipDistanceScale - общий множитель отсечения. По умолчанию = 1.0. Все что ниже - снижает дистанцию. Все что выше - увеличивает.
Скорость изменения всех свойств вобов менее 1мс в L'Hiver NewWorld + несколько мс требуется самому движку, чтобы обновить уровень альфы вобов. Дополнительная память в момент вычисления не требуется. Потестил тупо через покадровый цикл.

Daedalus:
const string GrassVisualNames[7] = {
    "GRAS1X1.3DS",
    "GRAS1X1_G.3DS",
    "GRAS1X0.3DS",
    "GRAS1X0_G.3DS",
    "GRAS2X2.3DS",
    "OW_NATURE_BUSH_02_01.3DS",
    "NW_NATG5_BS.3DS"
};

const float GrassClipDistanceScale = 1.0;

// test
func event GameLoop()
{
    var int random; random = Hlp_Random(5);
    if (random == 0)
    {
        GrassClipDistanceScale = 0.2;
    }
    else if (random == 1)
    {
        GrassClipDistanceScale = 0.4;
    }
    else if (random == 2)
    {
        GrassClipDistanceScale = 0.6;
    }
    else if (random == 3)
    {
        GrassClipDistanceScale = 0.8;
    }
    else if (random == 4)
    {
        GrassClipDistanceScale = 1.0;
    };
};

C++:
  Array<zCVob*> GrassVobs;
  Array<string> GrassVisualNames;
  float* GrassClipDistanceScale = Null;
  float GrassClipDistanceScalePrev = FLT_MIN;
  bool SymbolsInitialized = false;

  void RegisterGrassVob( zCVob* vob ) {
    vob->AddRef();
    GrassVobs.Insert( vob );
  }

  void UnregisterGrassVob( zCVob* vob ) {
    uint index = GrassVobs.SearchEqual( vob );
    if( index == Invalid )
      return;

    vob->Release();
    GrassVobs.FastRemoveAt( index );
  }

  void UnregisterAllGrassVobs() {
    for each( auto vob in GrassVobs )
      vob->Release();
   
    GrassVobs.Clear();
  }

  bool VobIsGrass( zCVob* vob ) {
    if( !vob || !vob->visual )
      return false;

    for each( auto& visualName in GrassVisualNames )
      if( visualName == vob->visual->GetVisualName().ToChar() )
        return true;
   
    return false;
  }

  void CollectGrassVobs( zCTree<zCVob>* tree ) {
    zCVob* vob = tree->GetData();
    if( VobIsGrass( vob ) )
      RegisterGrassVob( vob );

    zCTree<zCVob>* child = tree->GetFirstChild();
    while( child ) {
      CollectGrassVobs( child );
      child = child->GetNextChild();
    }
  }

  bool InitializeGrassVisualNames() {
    zCPar_Symbol* sym = parser->GetSymbol( "GrassVisualNames" );
    if( !sym )
      return false;

    zSTRING value;
    for( int i = 0; i < sym->ele; i++ ) {
      sym->GetValue( value, i );
      GrassVisualNames.Insert( value );
    }

    return true;
  }

  bool InitializeGrassClipDistance() {
    zCPar_Symbol* sym = parser->GetSymbol( "GrassClipDistanceScale" );
    if( !sym )
      return false;

    GrassClipDistanceScale = &sym->single_floatdata;
    return true;
  }

  void CheckGrassClipDistance() {
    if( *GrassClipDistanceScale != GrassClipDistanceScalePrev ) {
      for each( auto vob in GrassVobs )
        vob->m_fVobFarClipZScale = *GrassClipDistanceScale;

      GrassClipDistanceScalePrev = *GrassClipDistanceScale;
    }
  }

  void Game_Init() {
    SymbolsInitialized =
      InitializeGrassVisualNames() &&
      InitializeGrassClipDistance();
  }

  void Game_Loop() {
    if( SymbolsInitialized )
      CheckGrassClipDistance();
  }

  void LoadBegin() {
    if( SymbolsInitialized )
      UnregisterAllGrassVobs();
  }

  void LoadEnd() {
    if( SymbolsInitialized ) {
      oCWorld* world = ogame->GetGameWorld();
      CollectGrassVobs( &world->globalVobTree );
    }
  }
Спасибо большое! Все отлично работает, нагрузки и вылетов нет.
 

Orc Hunter


Модостроитель
Регистрация
12 Окт 2013
Сообщения
1.269
Благодарности
1.671
Баллы
305
Orc Hunter, скинь крешлог, если вдруг повторится.
Воспроизвести получилось только один раз. Начал новую игру, тролль 5 минут кидал в меня камни и гоблинов, а после я заточил меч и вылетел. Лог не вывелся.
изображение_viber_2021-12-05_12-53-13-660.jpg
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.432
Благодарности
4.771
Баллы
625
Orc Hunter, эта ошибка говорит о том, что экземпляр полиморфного класса был поврежден, либо где-то в GII не был корректно приведен один тип к другому. Например static_cast, вместо dynamic_cast. Класс, к которому произошло обращение, имел чисто виртуальную функцию (не имеющую реализации). Эта ошибка имеет скорее логические корни, чем какую-то поломку.
Давай чтобы не гадать, я чуть позже напишу небольшую библиотеку, которая конкретно покажет, откуда и для какого объекта произошло обращение к чисто виртуальной функции.
 

Venzern

Участник форума
Регистрация
24 Фев 2008
Сообщения
694
Благодарности
211
Баллы
220
Gratt, MaGoth

Эээм. У меня появился вопрос такой странный, в стиле "то ли я тупой, то ли лыжи не едут".
Вы же вроде что-то делали не так давно в обновах с ползунками "Яркость" и т.д. в меню?
Просто у меня (и не только у меня кстати) они по сути "отвалились" и не реагируют ни на что (можно полностью сместить "Яркость" в любую сторону и изменений не будет).
Что с этим сделать можно?

Конкретно в моем случае стоит стим-версия Г2:НВ + стим фикс последний + Юня "l" (Dx11 не стоит)
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.377
Благодарности
7.861
Баллы
995
Venzern, возможно ты с плагином попутал ?!
этим: https://worldofplayers.ru/threads/42023/ как вариант, в манагере Юни его можно установить..
ничего другого по этой теме не помню... *lupa*
 

Venzern

Участник форума
Регистрация
24 Фев 2008
Сообщения
694
Благодарности
211
Баллы
220
MaGoth, может кстати и путаю, но у меня его нет.
плагины.jpg

Xeдин, предложил поменять в SystemPack.ini
[DEBUG]
BorderFix=1;

на

BorderFix=True;

Это тоже не дало результата. Плюс в NotePad++ после изменения, сохранения и запуска игры и последующего открытия файла, появилась надпись "этот файл был изменен другой программой".
 
Сверху Снизу