Demande d'aide D2o reader

Vlooz

Membre
Inscrit
12 Aout 2021
Messages
35
Reactions
6
#1
Hey, bonjour, bonsoir à tous

Voilà j'ai un gros soucis, mon Reader D2o récupère normalement tout, sauf les Vector, mais ça m'est pas très utile donc à la limite je m'en fou mais !
En gros, j'ai ma classe Monster (du datacenter) qui a un champ : "isQuestMonster" donc jusque là on est good, pourtant, ce champ est toujours faux, absolument toujours
et je trouve ça assez bizarre

Par exemple, lorsce que j'init mon D2o reader pour la classe Monster (donc le fichier D2o) je regarde toutes les valeurs et le Reader ne lis aucun isQuestMonster : true
Du coup je me demande si ça vient du fait que je ne lis pas les Vector (parce que ça boucle infinie) que du coup le Reader ne read pas correctement les informations qui se trouve après un Vector dans les classes definitions des D2o (Y'a de fortes probabilités que ça viennent effectivement de là et que ce post soit useless) mais j'aimerai quand même un avis avant de me lancer dans mon propre D2o reader.

Le D2o reader que j'ai trouvé je sais plus où:
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
using TestBot1.D2o.Utils;
using TestBot1.Datacenter;

namespace TestBot1.D2o
{
    public class D2oIndividualManager
    {
        public int classCount;

        public D2oReader _Reader;
        Dictionary<int, int> objectPointerTable;
        Dictionary<int, GameDataClassDefinition> classDefinitions;
        int contentOffset = 0;

        Type _Type;

        public D2oIndividualManager(string d2oFilePath, Type Type)
        {
            _Type = Type;
            objectPointerTable = new Dictionary<int, int>();
            classDefinitions = new Dictionary<int, GameDataClassDefinition>();

            _Reader = new D2oReader(new FileStream(d2oFilePath, FileMode.Open, FileAccess.Read));

            string headerString = _Reader.ReadAscii(3);

            if (!headerString.Equals("D2O"))
            {
                _Reader.Pointer = 0;
                string headers = _Reader.ReadUtf8();
                short formatVersion = _Reader.ReadShort();
                int len = _Reader.ReadInt();
                _Reader.Pointer = _Reader.Pointer + len;
                contentOffset = _Reader.Pointer;
                int streamStartIndex = (contentOffset + 7); //or uint?
                headers = _Reader.ReadAscii(3);
                if (!headers.Equals("D2O"))
                {
                    throw new InvalidDataException("Header doesn't equal the string 'D2O' : Corrupted file");
                }
            }
            readObjectPointerTable();
            readClassTable();
            AddObjects();
        }

        private void readObjectPointerTable()
        {
            int tablePointer = _Reader.ReadInt();
            _Reader.Pointer = tablePointer + contentOffset;

            int objectPointerTableLen = _Reader.ReadInt();

            int key;
            int pointer;

            for (uint i = 0; i < objectPointerTableLen; i += sizeof(int) * 2)
            {
                key = _Reader.ReadInt();
                pointer = _Reader.ReadInt();

                objectPointerTable.Add(key, pointer + contentOffset);
            }
        }
        private void readClassTable()
        {
            classCount = _Reader.ReadInt();
            int classId;

            int j = 0;
            while (j < classCount)
            {
                classId = _Reader.ReadInt();
                readClassDefinition(classId);

                j++;
            }
        }
        private void readClassDefinition(int classId)
        {
            string className = _Reader.ReadUtf8();
            string packageName = _Reader.ReadUtf8();
            GameDataClassDefinition classDefinition = new GameDataClassDefinition(packageName, className);
            int fieldsCount = _Reader.ReadInt();
            uint i=0;
            while(i < fieldsCount)
            {
                classDefinition.AddField(_Reader);
                i++;
            }
            classDefinitions.Add(classId, classDefinition);
        }
        #region UnpackManagement

        private void AddObjects()
        {
            int[] indexTablesKeys = objectPointerTable.Keys.ToArray<int>();

            for(int i = 0; i < indexTablesKeys.Length; i++)
            {
                GetObject(indexTablesKeys[i]);
            }
        }
        public object GetObject(int objectId)
        {
            try
            {
                int objectPointer = objectPointerTable[objectId];
                _Reader.Pointer = objectPointer;

                int objectClassId = _Reader.ReadInt();

                object Object = Activator.CreateInstance(_Type);

                getObjectBuilder(objectClassId, Object);
                return Object;
            }
            catch
            {
                return null;
            }
        }

        private void getObjectBuilder(int classId, object Object)
        {
            GameDataClassDefinition classDefinition = classDefinitions[classId];
            getFieldsBuilder(classDefinition, Object);
        }
        private void getFieldsBuilder(GameDataClassDefinition classDefinition, object Object)
        {
            int numberOfFields = classDefinition.Fields.Count;
            for (int i = 0; i < numberOfFields; i++)
            {
                getFieldBuilder(classDefinition.Fields[i], Object);
            }
        }
        private void getFieldBuilder(GameDataField field, object Object)
        {
            FieldInfo[] fields = Object.GetType().GetFields();
            FieldInfo correspondedField = null;
            foreach(FieldInfo FI in fields)
            {
                if(FI.Name.ToLower() == field.fieldName.ToLower())
                {
                    correspondedField = FI;
                    break;
                }
            }
            if (correspondedField != null)
                correspondedField.SetValue(Object, getFieldValueBuilder(field, Object));
        }
        private object getFieldValueBuilder(GameDataField field, object Object)
        {
            switch (field.fieldType)
            {
                case GameDataTypeEnum.Int:
                    return _Reader.ReadInt();
                case GameDataTypeEnum.UInt:
                    return _Reader.ReadUInt();
                case GameDataTypeEnum.I18N:
                    return _Reader.ReadInt();
                case GameDataTypeEnum.String:
                    return _Reader.ReadUtf8();
                case GameDataTypeEnum.Bool:
                    return _Reader.ReadBool();
                case GameDataTypeEnum.Double:
                    return _Reader.ReadDouble();
/*
                case GameDataTypeEnum.Vector:
                        ArrayList Vector = new ArrayList();
                        int vectorLength = _Reader.ReadInt();
                        for (int i = 0; i < vectorLength; i++)
                            Vector.Add(getFieldValueBuilder(field.innerField, Object));
                    return Vector;

                Le code ci dessus créer une boucle infinie, ce qui est relativement logique, mais j'arrive pas à le fix
*/
                default:
                    if (field.fieldType > 0) //if type is an object
                    {
                        int classId = _Reader.ReadInt();
                        if (classDefinitions.ContainsKey(classId))
                        {
                            getObjectBuilder(classId, Object);
                        }
                    }
                    /*
                    else
                    {
                        Console.WriteLine("Error: invalid type( {0} ) for field {1}", field.fieldType, field.fieldName);
                    }
                    */
                    break;
            }
            return null;
        }

        #endregion


    }
}
Merci à ceux qui sauront m'aider
 
Haut Bas