Ejemplo n.º 1
0
        public static Falcon4EntityClassType[] ReadClassTable(string classTableFilePath)
        {
            if (classTableFilePath == null)
            {
                throw new ArgumentNullException(nameof(classTableFilePath));
            }
            var ctFileInfo = new FileInfo(classTableFilePath);

            if (!ctFileInfo.Exists)
            {
                throw new FileNotFoundException(classTableFilePath);
            }
            byte[] bytes = new byte[ctFileInfo.Length];
            using (var stream = new FileStream(classTableFilePath, FileMode.Open, FileAccess.Read))
                using (var reader = new BinaryReader(stream, Encoding.Default, leaveOpen: true))
                {
                    short numEntities = reader.ReadInt16();
                    var   classTable  = new Falcon4EntityClassType[numEntities];
                    for (int i = 0; i < numEntities; i++)
                    {
                        var thisClass = new Falcon4EntityClassType();
                        thisClass.vuClassData                  = new VuEntityType();
                        thisClass.vuClassData.id_              = reader.ReadUInt16();
                        thisClass.vuClassData.collisionType_   = reader.ReadUInt16();
                        thisClass.vuClassData.collisionRadius_ = reader.ReadSingle();
                        thisClass.vuClassData.classInfo_       = new byte[8];
                        for (int j = 0; j < 8; j++)
                        {
                            thisClass.vuClassData.classInfo_[j] = reader.ReadByte();
                        }
                        thisClass.vuClassData.updateRate_           = reader.ReadUInt32();
                        thisClass.vuClassData.updateTolerance_      = reader.ReadUInt32();
                        thisClass.vuClassData.fineUpdateRange_      = reader.ReadSingle();
                        thisClass.vuClassData.fineUpdateForceRange_ = reader.ReadSingle();
                        thisClass.vuClassData.fineUpdateMultiplier_ = reader.ReadSingle();
                        thisClass.vuClassData.damageSeed_           = reader.ReadUInt32();
                        thisClass.vuClassData.hitpoints_            = reader.ReadInt32();
                        thisClass.vuClassData.majorRevisionNumber_  = reader.ReadUInt16();
                        thisClass.vuClassData.minorRevisionNumber_  = reader.ReadUInt16();
                        thisClass.vuClassData.createPriority_       = reader.ReadUInt16();
                        thisClass.vuClassData.managementDomain_     = reader.ReadByte();
                        thisClass.vuClassData.transferable_         = reader.ReadByte();
                        thisClass.vuClassData.private_    = reader.ReadByte();
                        thisClass.vuClassData.tangible_   = reader.ReadByte();
                        thisClass.vuClassData.collidable_ = reader.ReadByte();
                        thisClass.vuClassData.global_     = reader.ReadByte();
                        thisClass.vuClassData.persistent_ = reader.ReadByte();
                        reader.ReadBytes(3);        //align on int32 boundary


                        thisClass.visType = new short[7];
                        for (int j = 0; j < 7; j++)
                        {
                            thisClass.visType[j] = reader.ReadInt16();
                        }
                        thisClass.vehicleDataIndex = reader.ReadInt16();
                        thisClass.dataType         = reader.ReadByte();
                        thisClass.dataPtr          = reader.ReadInt32();
                        classTable[i] = thisClass;
                    }
                    return(classTable);
                }
        }
Ejemplo n.º 2
0
        protected void Decode(byte[] bytes, int version, short numUnits, Falcon4EntityClassType[] classTable)
        {
            using (var stream = new MemoryStream(bytes))
                using (var reader = new BinaryReader(stream, Encoding.Default, leaveOpen: true))
                {
                    units = new Unit[numUnits];
                    int i = 0;
                    while (i < numUnits)
                    {
                        Unit thisUnit     = null;
                        var  thisUnitType = reader.ReadInt16();
                        if (thisUnitType > 0)
                        {
                            Falcon4EntityClassType classTableEntry = classTable[thisUnitType - 100];
                            if (classTableEntry.vuClassData.classInfo_[(int)VuClassHierarchy.VU_DOMAIN] == (byte)Classtable_Domains.DOMAIN_AIR)
                            {
                                if (classTableEntry.vuClassData.classInfo_[(int)VuClassHierarchy.VU_TYPE] == (byte)Classtable_Types.TYPE_FLIGHT)
                                {
                                    thisUnit = new Flight(stream, version)
                                    {
                                        unitType = thisUnitType
                                    };
                                }
                                else if (classTableEntry.vuClassData.classInfo_[(int)VuClassHierarchy.VU_TYPE] == (byte)Classtable_Types.TYPE_SQUADRON)
                                {
                                    thisUnit = new Squadron(stream, version)
                                    {
                                        unitType = thisUnitType
                                    };
                                }
                                else if (classTableEntry.vuClassData.classInfo_[(int)VuClassHierarchy.VU_TYPE] == (byte)Classtable_Types.TYPE_PACKAGE)
                                {
                                    thisUnit = new Package(stream, version)
                                    {
                                        unitType = thisUnitType
                                    };
                                }
                                else
                                {
                                    thisUnit = null;
                                }
                            }
                            else if (classTableEntry.vuClassData.classInfo_[(int)VuClassHierarchy.VU_DOMAIN] == (byte)Classtable_Domains.DOMAIN_LAND)
                            {
                                if (classTableEntry.vuClassData.classInfo_[(int)VuClassHierarchy.VU_TYPE] == (byte)Classtable_Types.TYPE_BRIGADE)
                                {
                                    thisUnit = new Brigade(stream, version)
                                    {
                                        unitType = thisUnitType
                                    };
                                }
                                else if (classTableEntry.vuClassData.classInfo_[(int)VuClassHierarchy.VU_TYPE] == (byte)Classtable_Types.TYPE_BATTALION)
                                {
                                    thisUnit = new Battalion(stream, version)
                                    {
                                        unitType = thisUnitType
                                    };
                                }
                                else
                                {
                                    thisUnit = null;
                                }
                            }
                            else if (classTableEntry.vuClassData.classInfo_[(int)VuClassHierarchy.VU_DOMAIN] == (byte)Classtable_Domains.DOMAIN_SEA)
                            {
                                if (classTableEntry.vuClassData.classInfo_[(int)VuClassHierarchy.VU_TYPE] == (byte)Classtable_Types.TYPE_TASKFORCE)
                                {
                                    thisUnit = new TaskForce(stream, version)
                                    {
                                        unitType = thisUnitType
                                    };
                                }
                                else
                                {
                                    thisUnit = null;
                                }
                            }
                            else
                            {
                                thisUnit = null;
                            }
                        }
                        if (thisUnit != null)
                        {
                            units[i] = thisUnit;
                            i++;
                        }
                        else
                        {
                            Log.ErrorFormat("unexpected unit type:{0} at location: {1}", thisUnitType, stream.Position);
                        }
                    }

                    if (stream.Position < stream.Length - 1)
                    {
                        throw new InvalidOperationException();
                    }
                }
        }