Gildor's Forums

Author Topic: Ошибка декодирования property  (Read 4390 times)
kisly00
Full Member
***
Posts: 89



View Profile WWW
Ошибка декодирования property
« on: July 06, 2015, 00:32 »

Для выдергивания инфы из la2 использую Eliot.UElib. Немного наркоманит, но пойдёт. Сегодня заметил явную ошибку:
Code:
        "TerrainMatrix": {
          "XPlane": {
            "V": {
              "X": 14981480000000,
              "Y": 0,
              "Z": 0
            },
            "W": 0
          },
          "YPlane": {
            "V": {
              "X": 0.0078125,
              "Y": 0,
              "Z": 0
            },
            "W": 0
          },
          "ZPlane": {
            "V": {
              "X": 0,
              "Y": 0,
              "Z": 0
            },
            "W": 2
          },
          "WPlane": {
            "V": {
              "X": 0,
              "Y": 0,
              "Z": 0.0078125
            },
            "W": 0
          }
        }

XYZW - имеют тип float. 14981480000000 - это, мать их, на 12 бит больше, чем вообще возможно.

Quote
                    case PropertyType.Matrix:
                        {
                            string xPlane = DeserializeDefaultPropertyValue(PropertyType.Plane, ref deserializeFlags);
                            string yPlane = DeserializeDefaultPropertyValue(PropertyType.Plane, ref deserializeFlags);
                            string zPlane = DeserializeDefaultPropertyValue(PropertyType.Plane, ref deserializeFlags);
                            string wPlane = DeserializeDefaultPropertyValue(PropertyType.Plane, ref deserializeFlags);
                            propertyValue += "\"XPlane\":{" + xPlane + "}" +
                                ",\"YPlane\":{" + yPlane + "}" +
                                ",\"ZPlane\":{" + zPlane + "}" +
                                ",\"WPlane\":{" + wPlane + "}";
                            break;
                        }
                    case PropertyType.Plane:
                        {
                            string w = DeserializeDefaultPropertyValue(PropertyType.FloatProperty, ref deserializeFlags);
                            string v = DeserializeDefaultPropertyValue(PropertyType.Vector, ref deserializeFlags);
                            //string w = DeserializeDefaultPropertyValue(PropertyType.FloatProperty, ref deserializeFlags);

                            propertyValue += "\"V\":{" + v + "},\"W\":" + w;
                            break;
                        }

                    case PropertyType.Vector:
                        {
                            string x = DeserializeDefaultPropertyValue(PropertyType.FloatProperty, ref deserializeFlags);
                            string y = DeserializeDefaultPropertyValue(PropertyType.FloatProperty, ref deserializeFlags);
                            string z = DeserializeDefaultPropertyValue(PropertyType.FloatProperty, ref deserializeFlags);

                            propertyValue += "\"X\":" + x +
                                ",\"Y\":" + y +
                                ",\"Z\":" + z;
                            break;
                        }


                    case PropertyType.FloatProperty:
                        propertyValue = _Buffer.ReadFloat().ToUFloat();
                        break;

Притом если верить отладочной информации _Buffer.Position меняется с 116 до 120 что как раз равно 32 32 битам float. В чем может быть косяк ?

ПС остальные property после Matrix либа не видит.
если верить сторонним тулзам должно быть так:

всё что за синей линией - не читается
« Last Edit: July 06, 2015, 00:36 by kisly00 » Logged

Lineage2 + unity3D
Gildor
Administrator
Hero Member
*****
Posts: 7818



View Profile WWW
Re: Ошибка декодирования property
« Reply #1 on: July 06, 2015, 00:54 »

В UE2 есть ошибка с полем "Size" для свойств, которые являются частью вложенной структуры. Может быть здесь проблема именно в этом. Я с этой библиоткеой не знаком, конкретного ничего сказать не могу.
Logged
kisly00
Full Member
***
Posts: 89



View Profile WWW
Re: Ошибка декодирования property
« Reply #2 on: July 06, 2015, 01:44 »

может подскажите аналогичную либу ?
Logged

Lineage2 + unity3D
Gildor
Administrator
Hero Member
*****
Posts: 7818



View Profile WWW
Re: Ошибка декодирования property
« Reply #3 on: July 06, 2015, 01:47 »

Все эти библиотеки основаны на старой доброй "UTPackages". Она лежит в основе UTPT. Можете проверить объект в UTPT - если там тоже будут проблемы, то скорее всего они будут у всех.
Logged
kisly00
Full Member
***
Posts: 89



View Profile WWW
Re: Ошибка декодирования property
« Reply #4 on: July 06, 2015, 02:22 »

Странно UTPT стала виснуть на этом UObject.
Logged

Lineage2 + unity3D
kisly00
Full Member
***
Posts: 89



View Profile WWW
Re: Ошибка декодирования property
« Reply #5 on: July 06, 2015, 03:11 »

В общем я в тупике: _Buffer.ReadFloat() сводится к BinaryReader.ReadSingle(), который
Quote
Считывает число с плавающей запятой длиной 4 байта из текущего потока и перемещает текущую позицию в потоке на четыре байта вперед.

У меня число занимающее 6-8 байт. Что это за магия ?
Logged

Lineage2 + unity3D
Gildor
Administrator
Hero Member
*****
Posts: 7818



View Profile WWW
Re: Ошибка декодирования property
« Reply #6 on: July 06, 2015, 10:54 »

Может, пакет битый? Если даже UTPT не берёт.
Logged
kisly00
Full Member
***
Posts: 89



View Profile WWW
Re: Ошибка декодирования property
« Reply #7 on: July 08, 2015, 01:01 »

не ) что-то с виндой ибо в каждом пакете на этом UObj "TerrainInfo" виснет. Раньше такого не было.
Ну не важно
Logged

Lineage2 + unity3D
kisly00
Full Member
***
Posts: 89



View Profile WWW
Re: Ошибка декодирования property
« Reply #8 on: July 08, 2015, 01:14 »

В UE2 есть ошибка с полем "Size" для свойств, которые являются частью вложенной структуры.

А можно поподробнее ?
Logged

Lineage2 + unity3D
Gildor
Administrator
Hero Member
*****
Posts: 7818



View Profile WWW
Re: Ошибка декодирования property
« Reply #9 on: July 08, 2015, 01:27 »

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

В этом заголовке есть поле "Size" которое должно содержать размер данных после заголовка. Так вот, в некоторых случаях это поле содержит неверное значение. По сути оно нужно движку только тогда, когда свойство ему незнакомо по какой-то причине (например, оно было убрано в более новой версии движка) - тогда движок просто "перематывает" поток данных на Size байтов вперёд и работает с другими свойствами. Но если Size неверный, перемотка быдет сделана в неправильную позицию, и движок упадёт.

У UModel есть такая проблема, и чтобы её решить, мне приходится описывать некоторые свойства даже если они мне не нужны.
Вроде как эта проблема возникает только если идёт сериализация property, которое является вложенной структурой. То есть при сериализации простых свойств типа "float", "Object", "Name" и т.п. всё нормально. Но к примеру если свойство типа "Color" (а это структура с 3 или 4 полями) - тут Size уже неправильный.
Logged
Jump to:  

Powered by SMF | SMF © 2006-2009, Simple Machines LLC
Leviathan design by Bloc | XHTML | CSS