Example #1
0
        public static Zone LoadFromStream(string name, string displayName, Stream stream)
        {
            BinaryReader binaryReader = new BinaryReader(stream);

            //Header
            byte[] magic = binaryReader.ReadBytes(4);

            if (magic[0] != 'Z' ||
                magic[1] != 'O' ||
                magic[2] != 'N' ||
                magic[3] != 'E')
            {
                return(null);
            }

            Zone zone = new Zone();

            zone.Name        = name;
            zone.DisplayName = displayName;
            zone.Version     = binaryReader.ReadUInt32();

            if (!Enum.IsDefined(typeof(ZoneType), (int)zone.Version))
            {
                Debug.LogWarning("Could not decode zone " + name + ". Unknown ZONE version " + zone.Version);
                return(null);
            }

            zone.ZoneType = (ZoneType)(int)zone.Version;

            if (zone.ZoneType == ZoneType.H1Z1 ||
                zone.ZoneType == ZoneType.H1Z1Old)
            {
                binaryReader.ReadUInt32();
            }

            zone.Offsets                   = new Dictionary <string, uint>();
            zone.Offsets["ecos"]           = binaryReader.ReadUInt32();
            zone.Offsets["floras"]         = binaryReader.ReadUInt32();
            zone.Offsets["invisibleWalls"] = binaryReader.ReadUInt32();
            zone.Offsets["objects"]        = binaryReader.ReadUInt32();
            zone.Offsets["lights"]         = binaryReader.ReadUInt32();
            zone.Offsets["unknowns"]       = binaryReader.ReadUInt32();

            if (zone.ZoneType == ZoneType.H1Z1 ||
                zone.ZoneType == ZoneType.H1Z1Old)
            {
                zone.Offsets["decals"] = binaryReader.ReadUInt32();
            }

            zone.QuadsPerTile  = binaryReader.ReadUInt32();
            zone.TileSize      = binaryReader.ReadSingle();
            zone.TileHeight    = binaryReader.ReadSingle();
            zone.VertsPerTile  = binaryReader.ReadUInt32();
            zone.TilesPerChunk = binaryReader.ReadUInt32();
            zone.StartX        = binaryReader.ReadInt32();
            zone.StartY        = binaryReader.ReadInt32();
            zone.ChunksX       = binaryReader.ReadUInt32();
            zone.ChunksY       = binaryReader.ReadUInt32();

            //Ecos
            zone.Ecos = new List <Eco>();
            uint ecosLength = binaryReader.ReadUInt32();

            for (int i = 0; i < ecosLength; i++)
            {
                zone.Ecos.Add(Eco.ReadFromStream(binaryReader.BaseStream));
                //Debug.Log(zone.Ecos[i].Name + "\n" + zone.Ecos[i].BlendStrength);
            }

            //Floras
            zone.Floras = new List <Flora>();
            uint florasLength = binaryReader.ReadUInt32();

            for (int i = 0; i < florasLength; i++)
            {
                zone.Floras.Add(Flora.ReadFromStream(binaryReader.BaseStream, zone.ZoneType));
                //Debug.Log(zone.Floras[i].Name + "\n" + zone.Floras[i].Texture);
            }

            //Invisible Walls
            zone.InvisibleWalls = new List <InvisibleWall>();
            uint invisibleWallsLength = binaryReader.ReadUInt32();

            for (uint i = 0; i < invisibleWallsLength; i++)
            {
                zone.InvisibleWalls.Add(InvisibleWall.ReadFromStream(binaryReader.BaseStream));
            }

            //Objects
            zone.Objects = new List <Object>();
            uint objectsLength = binaryReader.ReadUInt32();

            for (int i = 0; i < objectsLength; i++)
            {
                zone.Objects.Add(Object.ReadFromStream(binaryReader.BaseStream, zone.ZoneType));
                //Debug.Log(zone.Objects[i].ActorDefinition + "\n" + zone.Objects[i].RenderDistance);
            }

            //Lights
            zone.Lights = new List <Light>();
            uint lightsLength = binaryReader.ReadUInt32();

            for (int i = 0; i < lightsLength; i++)
            {
                zone.Lights.Add(Light.ReadFromStream(binaryReader.BaseStream));
                //Debug.Log(zone.Lights[i].Name + "\n" + zone.Lights[i].ColorName);
            }

            //Unknowns
            uint unknownsLength = binaryReader.ReadUInt32();

            zone.Unknowns = new List <Unknown>((int)unknownsLength);

            //for (int i = 0; i < unknownsLength; i++)
            //{
            //    //zone.Unknowns.Add(Unknown.ReadFromStream(binaryReader.BaseStream));
            //    //???
            //}

            //Decals
            if (zone.ZoneType == ZoneType.H1Z1 ||
                zone.ZoneType == ZoneType.H1Z1Old)
            {
                binaryReader.BaseStream.Position = zone.Offsets["decals"];

                uint decalsLength = binaryReader.ReadUInt32();
                zone.Decals = new List <Decal>((int)decalsLength);

                for (int i = 0; i < decalsLength; i++)
                {
                    zone.Decals.Add(Decal.ReadFromStream(binaryReader.BaseStream));
                    //Debug.Log(zone.Decals[i].Name + "\n" + zone.Decals[i].Position);
                }
            }

            return(zone);
        }