Ищу помочь со структурой файлов Unreal Engine

MrKirill1232

Прославленный
Проверенный
Победитель в номинации 2023
Мастер реакций
Неукротимое пламя
Медаль Благодарности
Победитель в номинации 2022
Старожил I степени
Сообщения
1 787
Розыгрыши
0
Решения
34
Репутация
1 025
Реакции
1 381
Баллы
1 408
Вообщем как и написано - ищу помощь со структурой файлов Unreal Engine на которой работает Л2.

Что вообще хочу... Хочу разобрать весь Unreal Engine файл и повтороно его запаковать.

Хочу открыть файл unreal engine, а именно полностью разобрать его и собрать его в том же виде, в каком он был.

Я его разобрал до уровня:
* Header
* Name
* Imports
* Exports
* t3d

Я разобрал и собрал первые 4 блока, но у меня сейчас проблема с t3d обьектами, а если более точно - с обьектами, которые имеют флаг HasStack.

Обьекты, которые не имеют этого блока, я могу разобрать без каких либо проблем, но вот блоки с HasStack.
У них как минимум есть "заголовок", который еще и имеет динамический заголовок, но не могу понять что именно там и как он должен читаться.

Условно, даже если я могу прочитать этот заголовок - дальше получается идет сам блок has stack...

В начале идет просто 0 и все. Даже если ноль этот обойти - посреди блока опять же идет 0.

Как я думаю:

Условно блоке has stack 2 под_блока записано и чтение должно происходить как

HEADER
0
SUB_BLOCK_01
0
SUB_BLOCK_02
0

Но опять же, так тоже не получается. Как минимум я не знаю сколько под блоков, а в header, если его читать так, как я это делаю, то там вообще непонятно что.

Прошу помощи ! :)

Сам заголовок читаю так:
Код:
        _nodeIndex      = Lineage2DataReaderBuffer.readCompactInt(buffer, crypt);
        _stateNodeIndex = Lineage2DataReaderBuffer.readCompactInt(buffer, crypt);
        _stateNode      = Lineage2DataReaderBuffer.readInt(buffer, crypt);
        _probeMask      = Lineage2DataReaderBuffer.readLong(buffer, crypt);
        _latentAction   = Lineage2DataReaderBuffer.readInt(buffer, crypt);
 

Вообщем как и написано - ищу помощь со структурой файлов Unreal Engine на которой работает Л2.

Что вообще хочу... Хочу разобрать весь Unreal Engine файл и повтороно его запаковать.

Хочу открыть файл unreal engine, а именно полностью разобрать его и собрать его в том же виде, в каком он был.

Я его разобрал до уровня:
* Header
* Name
* Imports
* Exports
* t3d

Я разобрал и собрал первые 4 блока, но у меня сейчас проблема с t3d обьектами, а если более точно - с обьектами, которые имеют флаг HasStack.

Обьекты, которые не имеют этого блока, я могу разобрать без каких либо проблем, но вот блоки с HasStack.
У них как минимум есть "заголовок", который еще и имеет динамический заголовок, но не могу понять что именно там и как он должен читаться.

Условно, даже если я могу прочитать этот заголовок - дальше получается идет сам блок has stack...

В начале идет просто 0 и все. Даже если ноль этот обойти - посреди блока опять же идет 0.

Как я думаю:

Условно блоке has stack 2 под_блока записано и чтение должно происходить как

HEADER
0
SUB_BLOCK_01
0
SUB_BLOCK_02
0

Но опять же, так тоже не получается. Как минимум я не знаю сколько под блоков, а в header, если его читать так, как я это делаю, то там вообще непонятно что.

Прошу помощи ! :)

Сам заголовок читаю так:
Код:
        _nodeIndex      = Lineage2DataReaderBuffer.readCompactInt(buffer, crypt);
        _stateNodeIndex = Lineage2DataReaderBuffer.readCompactInt(buffer, crypt);
        _stateNode      = Lineage2DataReaderBuffer.readInt(buffer, crypt);
        _probeMask      = Lineage2DataReaderBuffer.readLong(buffer, crypt);
        _latentAction   = Lineage2DataReaderBuffer.readInt(buffer, crypt);
Глянь тута

 
у stateFrame нет цикла.
цикл идет после него и это properties. Размера у него нету а чтение идет пока не встретит none.

ниже пример чтения в либе acmi
1.png
 
и чего же я мог ещё ожидать...
 

    ArtToKill

    Баллов: 1
    Ну там все есть))
открой тогда исходники и там все видно

1.png
 
Штрафные баллы за скрин с выделением параметра это мощно.
Ответ типа "и чего же я мог ещё ожидать..." когда тебе помогают отбивает все желание помочь.
Так же как писал мне и посреди разговора закрыл переписку.

Без понятия что у тебя за класс но скажем берем TerrainInfo из карты.
Код:
node = -31
stateNode = -31
probeMask = -1
latentAction = 7471205
offset = -1

в дебаге ( 18446744073709551615 это -1 в long )
123.png


дальше читаем properties ( ошибки так как нету структур и они пропускаются )

Код:
Engine.TerrainInfo: Property template not found: TerrainMap
Engine.TerrainInfo: Property template not found: TerrainScale
Engine.TerrainInfo: Property template not found: Layers
Engine.TerrainInfo: Property template not found: Layers
Engine.TerrainInfo: Property template not found: Layers
Engine.TerrainInfo: Property template not found: Layers
Engine.TerrainInfo: Property template not found: Layers
Engine.TerrainInfo: Property template not found: Layers
Engine.TerrainInfo: Property template not found: Layers
Engine.TerrainInfo: Property template not found: Layers
Engine.TerrainInfo: Property template not found: Layers
Engine.TerrainInfo: Property template not found: Layers
Engine.TerrainInfo: Property template not found: QuadVisibilityBitmap
Engine.TerrainInfo: Property template not found: EdgeTurnBitmap
Engine.TerrainInfo: Property template not found: MapX
Engine.TerrainInfo: Property template not found: MapY
Engine.TerrainInfo: Property template not found: QuadVisibilityBitmapOrig
Engine.TerrainInfo: Property template not found: EdgeTurnBitmapOrig
Engine.TerrainInfo: Property template not found: GeneratedSectorCounter
Engine.TerrainInfo: Property template not found: NumIntMap
Engine.TerrainInfo: Property template not found: bAutoTimeGeneration
Engine.TerrainInfo: Property template not found: TIntMap
Engine.TerrainInfo: Property template not found: TickTime
Engine.TerrainInfo: Property template not found: LightMapWidth
Engine.TerrainInfo: Property template not found: LightMapHeight
Engine.TerrainInfo: Property template not found: bLightChanged
Engine.TerrainInfo: Property template not found: bSunAffect
Engine.TerrainInfo: Property template not found: Level
Engine.TerrainInfo: Property template not found: Region
Engine.TerrainInfo: Property template not found: Tag
Engine.TerrainInfo: Property template not found: PhysicsVolume
Engine.TerrainInfo: Property template not found: Location
Engine.TerrainInfo: Property template not found: Rotation
Engine.TerrainInfo: Property template not found: DrawScale
Engine.TerrainInfo: Property template not found: SwayRotationOrig
Engine.TerrainInfo: Property template not found: TexModifyInfo

что у тебя не получается мне не понятно
 
  • Мне нравится
Реакции: kick
Глянь тута

Я с ним около недели развлекался, но до меня так и не дошли некоторые моменты.
и чего же я мог ещё ожидать...
Ответ типа "и чего же я мог ещё ожидать..." когда тебе помогают отбивает все желание помочь.
Так же как писал мне и посреди разговора закрыл переписку.
Прошу прощения, но прошлый разговор не сильно прошел успешно, та и на меня тогда Дизер воздействовал своим отношением "иди *****", по-этому Ваш ответ меня немного, удивил. Вообще он просто удивил своим наличием, все равно он мне помог в кой-то мере. Ну, а мой ответ в этой теме - это результат того, что я уже баловался с L2PE как только мог, но результата не достиг.
открой тогда исходники и там все видно

Посмотреть вложение 73586
Понял. Примерно совпадают данные, если брать тот же TerrianInfo
Java:
    private int preparations(byte[] inputArray, CommonPair<Integer, Integer> crypt)
    {
        ByteBuffer buffer = ByteBuffer.wrap(inputArray);
        UnrealPackageFile urPackage = getEntryObject().getPackage();

        if ((getEntryObject().getObjectFlags() & ObjectFlag.RF_Transient.getMask()) != 0)
        {
            return 0;
        }

        if ((getEntryObject().getObjectFlags() & ObjectFlag.RF_HasStack.getMask()) == 0)
        {
            return 0;
        }

        _nodeIndex      = Lineage2DataReaderBuffer.readCompactInt(buffer, crypt);
        _nodeEntry      = (ImportEntryObject) urPackage.getObjectReference(_nodeIndex.getValue());
        _stateNodeIndex = Lineage2DataReaderBuffer.readCompactInt(buffer, crypt);
        _stateNodeEntry = (ImportEntryObject) urPackage.getObjectReference(_stateNodeIndex.getValue());
//        _stateNode      = Lineage2DataReaderBuffer.readInt(buffer, crypt);
        _probeMask      = Lineage2DataReaderBuffer.readLong(buffer, crypt);
        _latentAction   = Lineage2DataReaderBuffer.readInt(buffer, crypt);

//        _replicationOffset = (_probeMask & ClassPropertyFlags.CPF_Net.getMask()) != 0 ? Lineage2DataReaderBuffer.readShort(buffer, crypt) : -200;

        _offset = Lineage2DataReaderBuffer.readCompactInt(buffer, crypt);

        return buffer.position();
    }
НО!
в середине блока наличиствивует 0, который не хочет иметь со мной никаких дел и после него начинается сущий ад.
1709930589885.png
 
так где у тебя чтение properties ?
 
так где у тебя чтение properties ?
Java:
public final class SerializedTypeReader
{
    private final UnrealPackageFile _urPackage;
    private final UnrealPackageFile _importURPackage;

    private CompactIntHolder    _t3dEntryIndex;
    private NameEntryObject     _t3dEntryName;
    private CompactIntHolder    _t3dAdditionalEntryIndex;
    private NameEntryObject     _t3dAdditionalEntryName;
    private UnrealDataType      _unrealDataType;
    private int                 _indexOfArray = -1;
    private AbstractUnrealData  _deserializedData;

    public SerializedTypeReader(UnrealPackageFile urPackage,  UnrealPackageFile importURPackage, ByteBuffer buffer, CommonPair<Integer, Integer> xorCrypt)
    {
        _urPackage = urPackage;
        _importURPackage = importURPackage;
        guessAndReadData(buffer, xorCrypt);
    }

    public SerializedTypeReader(UnrealPackageFile urPackage, ByteBuffer buffer, CommonPair<Integer, Integer> xorCrypt)
    {
        _urPackage = urPackage;
        _importURPackage = null;
        guessAndReadData(buffer, xorCrypt);
    }

    private void guessAndReadData(ByteBuffer buffer, CommonPair<Integer, Integer> xorCrypt)
    {
        _t3dEntryIndex = Lineage2DataReaderBuffer.readCompactInt(buffer, xorCrypt);
        _t3dEntryName = _urPackage.getNameFromTable(_t3dEntryIndex.getValue());

        int unrealDataType = Lineage2DataReaderBuffer.readUnsignedByte(buffer, xorCrypt);
        _unrealDataType = UnrealDataType.getTypeDataById(unrealDataType);

        if (_unrealDataType.isRequiredAdditionalNameRead())
        {
            _t3dAdditionalEntryIndex = Lineage2DataReaderBuffer.readCompactInt(buffer, xorCrypt);
            _t3dAdditionalEntryName = _urPackage.getNameFromTable(_t3dAdditionalEntryIndex.getValue());
        }

        int sizeOfData = _unrealDataType.getMinimalContainsByte() == -1 ? getSizeOfSerialisedData(buffer, xorCrypt, unrealDataType) : Math.max(_unrealDataType.getMinimalContainsByte(), getSizeOfSerialisedData(buffer, xorCrypt, unrealDataType));
        _indexOfArray = isArray(unrealDataType) && _unrealDataType != UnrealDataType.BOOLEAN ? Lineage2DataReaderBuffer.readCompactInt(buffer, xorCrypt).getValue() : -1;

        if (_unrealDataType.getDataClass() == null)
        {
            MainClass.getInstance().addNewMainType(_unrealDataType.name());
             System.err.println(getClass().getSimpleName() + ": Skipped " + sizeOfData + " bytes. UnrealDataType \"" + _unrealDataType + "\" dont have data class. Implement me please, oni-chan ;*");
            buffer.position(buffer.position() + sizeOfData);
            return;
        }

        byte[] rawData = null;
        try
        {
            rawData = Lineage2DataReaderBuffer.readBytes(buffer, null, 0, sizeOfData);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        ByteBuffer rawBuffer = ByteBuffer.wrap(rawData);
        if (_unrealDataType.isRequiredAdditionalNameRead() && _unrealDataType.isRequiredVariableName())
        {
            try
            {
                _deserializedData = AbstractUnrealData.valueOf(_urPackage, _unrealDataType, xorCrypt, rawBuffer, _t3dAdditionalEntryName);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        else if (_unrealDataType.isRequiredVariableName())
        {
            _deserializedData = AbstractUnrealData.valueOf((_importURPackage == null ? _urPackage : _importURPackage), _unrealDataType, xorCrypt, rawBuffer, _t3dEntryName);
        }
        else
        {
            _deserializedData = AbstractUnrealData.valueOf((_importURPackage == null ? _urPackage : _importURPackage), _unrealDataType, xorCrypt, rawBuffer, null);
        }
    }

    public int getIndexOfArray()
    {
        return _indexOfArray;
    }

    public static boolean isArray(int unrealDataType)
    {
        return unrealDataType >> 7 != 0;
    }

    public static int getSizeOfSerialisedData(ByteBuffer buffer, CommonPair<Integer, Integer> xorCrypt, int unreadDataType)
    {
        int dataType = unreadDataType >> 4 & 7;

        switch(dataType)
        {
            case 0:
            {
                return 1;
            }
            case 1:
            {
                return 2;
            }
            case 2:
            {
                return 4;
            }
            case 3:
            {
                return 12;
            }
            case 4:
            {
                return 16;
            }
            case 5:
            {
                return Lineage2DataReaderBuffer.readUnsignedByte(buffer, xorCrypt);
            }
            case 6:
            {
                return Lineage2DataReaderBuffer.readUnsignedShort(buffer, xorCrypt);
            }
            case 7:
            {
                return Lineage2DataReaderBuffer.readInt(buffer, xorCrypt);
            }
            default:
            {
                throw new IllegalArgumentException(String.valueOf(dataType));
            }
        }
    }
}
 
Вообщем из-за чего была создана тема:
Думал что блок состоит из T3D данных, но что-то переоценил я свои знания.
То-есть я разобрал все параметры правильно, а оставшиеся данные это что-то такое, то зависит от версии пакета и наверное может не понадобится.
В любом случае - спасибо всем за помощь :)
 
Назад
Сверху Снизу