Exemplo n.º 1
0
        public static bool WriteProperties(ThingType thing, DatFormat format, FlagsBinaryWriter writer)
        {
            if (format >= DatFormat.Format_1010)
            {
                if (!WriteProperties_1010_1093(thing, writer, format))
                {
                    return(false);
                }
            }

            return(true);
        }
Exemplo n.º 2
0
        private static bool WriteProperties_1010_1093(ThingType thing, FlagsBinaryWriter writer, DatFormat format)
        {
            if (thing.Category == ThingCategory.Item)
            {
                if (thing.StackOrder == StackOrder.Ground)
                {
                    writer.Write(DatFlags1010.Ground);
                    writer.Write(thing.GroundSpeed);
                }
                else if (thing.StackOrder == StackOrder.Border)
                {
                    writer.Write(DatFlags1010.GroundBorder);
                }
                else if (thing.StackOrder == StackOrder.Bottom)
                {
                    writer.Write(DatFlags1010.OnBottom);
                }
                else if (thing.StackOrder == StackOrder.Top)
                {
                    writer.Write(DatFlags1010.OnTop);
                }

                if (thing.IsContainer)
                {
                    writer.Write(DatFlags1010.Container);
                }

                if (thing.Stackable)
                {
                    writer.Write(DatFlags1010.Stackable);
                }

                if (thing.ForceUse)
                {
                    writer.Write(DatFlags1010.ForceUse);
                }

                if (thing.MultiUse)
                {
                    writer.Write(DatFlags1010.MultiUse);
                }

                if (thing.Writable)
                {
                    writer.Write(DatFlags1010.Writable);
                    writer.Write(thing.MaxTextLength);
                }

                if (thing.WritableOnce)
                {
                    writer.Write(DatFlags1010.WritableOnce);
                    writer.Write(thing.MaxTextLength);
                }

                if (thing.IsFluidContainer)
                {
                    writer.Write(DatFlags1010.FluidContainer);
                }

                if (thing.IsFluid)
                {
                    writer.Write(DatFlags1010.Fluid);
                }

                if (thing.Unpassable)
                {
                    writer.Write(DatFlags1010.IsUnpassable);
                }

                if (thing.Unmovable)
                {
                    writer.Write(DatFlags1010.IsUnmovable);
                }

                if (thing.BlockMissiles)
                {
                    writer.Write(DatFlags1010.BlockMissiles);
                }

                if (thing.BlockPathfinder)
                {
                    writer.Write(DatFlags1010.BlockPathfinder);
                }

                if (thing.NoMoveAnimation)
                {
                    writer.Write(DatFlags1010.NoMoveAnimation);
                }

                if (thing.Pickupable)
                {
                    writer.Write(DatFlags1010.Pickupable);
                }

                if (thing.Hangable)
                {
                    writer.Write(DatFlags1010.Hangable);
                }

                if (thing.HookSouth)
                {
                    writer.Write(DatFlags1010.HookSouth);
                }

                if (thing.HookEast)
                {
                    writer.Write(DatFlags1010.HookEast);
                }

                if (thing.Rotatable)
                {
                    writer.Write(DatFlags1010.Rotatable);
                }

                if (thing.DontHide)
                {
                    writer.Write(DatFlags1010.DontHide);
                }

                if (thing.Translucent)
                {
                    writer.Write(DatFlags1010.Translucent);
                }

                if (thing.HasElevation)
                {
                    writer.Write(DatFlags1010.HasElevation);
                    writer.Write(thing.Elevation);
                }
                if (thing.LyingObject)
                {
                    writer.Write(DatFlags1010.LyingObject);
                }

                if (thing.Minimap)
                {
                    writer.Write(DatFlags1010.Minimap);
                    writer.Write(thing.MinimapColor);
                }

                if (thing.IsLensHelp)
                {
                    writer.Write(DatFlags1010.LensHelp);
                    writer.Write(thing.LensHelp);
                }

                if (thing.FullGround)
                {
                    writer.Write(DatFlags1010.FullGround);
                }

                if (thing.IgnoreLook)
                {
                    writer.Write(DatFlags1010.IgnoreLook);
                }

                if (thing.IsCloth)
                {
                    writer.Write(DatFlags1010.Cloth);
                    writer.Write((ushort)thing.ClothSlot);
                }

                if (thing.IsMarketItem)
                {
                    writer.Write(DatFlags1010.Market);
                    writer.Write((ushort)thing.MarketCategory);
                    writer.Write(thing.MarketTradeAs);
                    writer.Write(thing.MarketShowAs);
                    writer.Write((ushort)thing.MarketName.Length);
                    writer.Write(Encoding.Default.GetBytes(thing.MarketName));
                    writer.Write(thing.MarketRestrictVocation);
                    writer.Write(thing.MarketRestrictLevel);
                }

                if (thing.HasAction)
                {
                    writer.Write(DatFlags1010.DefaultAction);
                    writer.Write((ushort)thing.DefaultAction);
                }

                if (format >= DatFormat.Format_1092)
                {
                    if (thing.Wrappable)
                    {
                        writer.Write(DatFlags1010.Wrappable);
                    }

                    if (thing.Unwrappable)
                    {
                        writer.Write(DatFlags1010.Unwrappable);
                    }
                }

                if (thing.Usable)
                {
                    writer.Write(DatFlags1010.Usable);
                }
            }

            if (thing.AnimateAlways)
            {
                writer.Write(DatFlags1010.AnimateAlways);
            }

            if (thing.HasLight)
            {
                writer.Write(DatFlags1010.HasLight);
                writer.Write(thing.LightLevel);
                writer.Write(thing.LightColor);
            }

            if (thing.HasOffset)
            {
                writer.Write(DatFlags1010.HasOffset);
                writer.Write(thing.OffsetX);
                writer.Write(thing.OffsetY);
            }

            if (thing.IsTopEffect && format >= DatFormat.Format_1093)
            {
                writer.Write(DatFlags1010.TopEffect);
            }

            // close flags
            writer.Write(DatFlags1010.LastFlag);
            return(true);
        }
Exemplo n.º 3
0
        private static byte[] EncodeV1(ObjectData data)
        {
            using (FlagsBinaryWriter writer = new FlagsBinaryWriter(new MemoryStream()))
            {
                // write client version
                writer.Write((ushort)DatFormat.Format_1010);

                // write category
                string category = string.Empty;
                switch (data.Category)
                {
                case ThingCategory.Item:
                    category = "item";
                    break;

                case ThingCategory.Outfit:
                    category = "outfit";
                    break;

                case ThingCategory.Effect:
                    category = "effect";
                    break;

                case ThingCategory.Missile:
                    category = "missile";
                    break;
                }

                writer.Write((ushort)category.Length);
                writer.Write(Encoding.UTF8.GetBytes(category));

                if (!ThingTypeSerializer.WriteProperties(data.ThingType, DatFormat.Format_1010, writer))
                {
                    return(null);
                }

                FrameGroup group = data.GetFrameGroup(FrameGroupType.Default);

                writer.Write(group.Width);
                writer.Write(group.Height);

                if (group.Width > 1 || group.Height > 1)
                {
                    writer.Write(group.ExactSize);
                }

                writer.Write(group.Layers);
                writer.Write(group.PatternX);
                writer.Write(group.PatternY);
                writer.Write(group.PatternZ);
                writer.Write(group.Frames);

                Sprite[] sprites = data.Sprites[FrameGroupType.Default];
                for (int i = 0; i < sprites.Length; i++)
                {
                    Sprite sprite = sprites[i];
                    byte[] pixels = sprite.GetARGBPixels();
                    writer.Write((uint)sprite.ID);
                    writer.Write((uint)pixels.Length);
                    writer.Write(pixels);
                }

                return(LZMACoder.Compress(((MemoryStream)writer.BaseStream).ToArray()));
            }
        }
Exemplo n.º 4
0
        public static bool WriteProperties(ThingType thing, FlagsBinaryWriter output)
        {
            if (thing.Category == ThingCategory.Item)
            {
                if (thing.StackOrder == StackOrder.Ground)
                {
                    output.Write(ObdFlags.Ground);
                    output.Write(thing.GroundSpeed);
                }
                else if (thing.StackOrder == StackOrder.Border)
                {
                    output.Write(ObdFlags.GroundBorder);
                }
                else if (thing.StackOrder == StackOrder.Bottom)
                {
                    output.Write(ObdFlags.OnBottom);
                }
                else if (thing.StackOrder == StackOrder.Top)
                {
                    output.Write(ObdFlags.OnTop);
                }

                if (thing.IsContainer)
                {
                    output.Write(ObdFlags.Container);
                }

                if (thing.Stackable)
                {
                    output.Write(ObdFlags.Stackable);
                }

                if (thing.ForceUse)
                {
                    output.Write(ObdFlags.ForceUse);
                }

                if (thing.MultiUse)
                {
                    output.Write(ObdFlags.MultiUse);
                }

                if (thing.Writable)
                {
                    output.Write(ObdFlags.Writable);
                    output.Write(thing.MaxTextLength);
                }

                if (thing.WritableOnce)
                {
                    output.Write(ObdFlags.WritableOnce);
                    output.Write(thing.MaxTextLength);
                }

                if (thing.IsFluidContainer)
                {
                    output.Write(ObdFlags.FluidContainer);
                }

                if (thing.IsFluid)
                {
                    output.Write(ObdFlags.Fluid);
                }

                if (thing.Unpassable)
                {
                    output.Write(ObdFlags.IsUnpassable);
                }

                if (thing.Unmovable)
                {
                    output.Write(ObdFlags.IsUnmovable);
                }

                if (thing.BlockMissiles)
                {
                    output.Write(ObdFlags.BlockMissiles);
                }

                if (thing.BlockPathfinder)
                {
                    output.Write(ObdFlags.BlockPathfinder);
                }

                if (thing.NoMoveAnimation)
                {
                    output.Write(ObdFlags.NoMoveAnimation);
                }

                if (thing.Pickupable)
                {
                    output.Write(ObdFlags.Pickupable);
                }

                if (thing.Hangable)
                {
                    output.Write(ObdFlags.Hangable);
                }

                if (thing.HookSouth)
                {
                    output.Write(ObdFlags.HookSouth);
                }

                if (thing.HookEast)
                {
                    output.Write(ObdFlags.HookEast);
                }

                if (thing.Rotatable)
                {
                    output.Write(ObdFlags.Rotatable);
                }

                if (thing.DontHide)
                {
                    output.Write(ObdFlags.DontHide);
                }

                if (thing.Translucent)
                {
                    output.Write(ObdFlags.Translucent);
                }

                if (thing.HasElevation)
                {
                    output.Write(ObdFlags.HasElevation);
                    output.Write(thing.Elevation);
                }

                if (thing.LyingObject)
                {
                    output.Write(ObdFlags.LyingObject);
                }

                if (thing.Minimap)
                {
                    output.Write(ObdFlags.Minimap);
                    output.Write(thing.MinimapColor);
                }

                if (thing.IsLensHelp)
                {
                    output.Write(ObdFlags.LensHelp);
                    output.Write(thing.LensHelp);
                }

                if (thing.FullGround)
                {
                    output.Write(ObdFlags.FullGround);
                }

                if (thing.IgnoreLook)
                {
                    output.Write(ObdFlags.IgnoreLook);
                }

                if (thing.IsCloth)
                {
                    output.Write(ObdFlags.Cloth);
                    output.Write((ushort)thing.ClothSlot);
                }

                if (thing.IsMarketItem)
                {
                    output.Write(ObdFlags.Market);
                    output.Write((ushort)thing.MarketCategory);
                    output.Write(thing.MarketTradeAs);
                    output.Write(thing.MarketShowAs);
                    output.Write((ushort)thing.MarketName.Length);
                    output.Write(thing.MarketName);
                    output.Write(thing.MarketRestrictVocation);
                    output.Write(thing.MarketRestrictLevel);
                }

                if (thing.HasAction)
                {
                    output.Write(ObdFlags.DefaultAction);
                    output.Write((ushort)thing.DefaultAction);
                }

                if (thing.HasCharges)
                {
                    output.Write(ObdFlags.HasChanges);
                }

                if (thing.FloorChange)
                {
                    output.Write(ObdFlags.FloorChange);
                }

                if (thing.Wrappable)
                {
                    output.Write(ObdFlags.Wrappable);
                }

                if (thing.Unwrappable)
                {
                    output.Write(ObdFlags.Unwrappable);
                }

                if (thing.IsTopEffect)
                {
                    output.Write(ObdFlags.TopEffect);
                }

                if (thing.Usable)
                {
                    output.Write(ObdFlags.Usable);
                }
            }

            if (thing.HasLight)
            {
                output.Write(ObdFlags.HasLight);
                output.Write(thing.LightLevel);
                output.Write(thing.LightColor);
            }

            if (thing.HasOffset)
            {
                output.Write(ObdFlags.HasOffset);
                output.Write(thing.OffsetX);
                output.Write(thing.OffsetY);
            }

            if (thing.AnimateAlways)
            {
                output.Write(ObdFlags.AnimateAlways);
            }

            // close flags
            output.Write(ObdFlags.LastFlag);
            return(true);
        }
Exemplo n.º 5
0
        private static byte[] EncodeV2(ObjectData data)
        {
            using (FlagsBinaryWriter writer = new FlagsBinaryWriter(new MemoryStream()))
            {
                // write obd version
                writer.Write((ushort)ObdVersion.Version2);

                // write client version
                writer.Write((ushort)DatFormat.Format_1050);

                // write category
                writer.Write((byte)data.Category);

                // skipping the texture patterns position.
                int patternsPosition = (int)writer.BaseStream.Position;
                writer.Seek(4, SeekOrigin.Current);

                if (!WriteProperties(data.ThingType, writer))
                {
                    return(null);
                }

                // write the texture patterns position.
                int position = (int)writer.BaseStream.Position;
                writer.Seek(patternsPosition, SeekOrigin.Begin);
                writer.Write((uint)writer.BaseStream.Position);
                writer.Seek(position, SeekOrigin.Begin);

                FrameGroup group = data.GetFrameGroup(FrameGroupType.Default);

                writer.Write(group.Width);
                writer.Write(group.Height);

                if (group.Width > 1 || group.Height > 1)
                {
                    writer.Write(group.ExactSize);
                }

                writer.Write(group.Layers);
                writer.Write(group.PatternX);
                writer.Write(group.PatternY);
                writer.Write(group.PatternZ);
                writer.Write(group.Frames);

                if (group.IsAnimation)
                {
                    writer.Write((byte)group.AnimationMode);
                    writer.Write(group.LoopCount);
                    writer.Write(group.StartFrame);

                    for (int i = 0; i < group.Frames; i++)
                    {
                        writer.Write((uint)group.FrameDurations[i].Minimum);
                        writer.Write((uint)group.FrameDurations[i].Maximum);
                    }
                }

                Sprite[] sprites = data.Sprites[FrameGroupType.Default];
                for (int i = 0; i < sprites.Length; i++)
                {
                    Sprite sprite = sprites[i];
                    byte[] pixels = sprite.GetARGBPixels();
                    writer.Write(sprite.ID);
                    writer.Write(pixels);
                }

                return(LZMACoder.Compress(((MemoryStream)writer.BaseStream).ToArray()));
            }
        }
Exemplo n.º 6
0
        public bool Save(string path, Core.Version version, ClientFeatures features)
        {
            if (path == null)
            {
                throw new ArgumentNullException(nameof(path));
            }

            if (version == null)
            {
                throw new ArgumentNullException(nameof(version));
            }

            if (this.Disposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            if (!this.Loaded)
            {
                return(false);
            }

            if (features == ClientFeatures.None || features == ClientFeatures.Transparency)
            {
                features |= version.Value >= (ushort)DatFormat.Format_755 ? ClientFeatures.PatternZ : features;
                features |= version.Value >= (ushort)DatFormat.Format_960 ? ClientFeatures.Extended : features;
                features |= version.Value >= (ushort)DatFormat.Format_1050 ? ClientFeatures.FrameDurations : features;
                features |= version.Value >= (ushort)DatFormat.Format_1057 ? ClientFeatures.FrameGroups : features;
            }

            string directory = Path.GetDirectoryName(path);

            if (!Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }

            if (!this.Changed && this.Version.Equals(version) && this.ClientFeatures == features &&
                this.FilePath != null && !this.FilePath.Equals(path))
            {
                // just copy the content if nothing has changed.
                File.Copy(this.FilePath, path, true);

                if (this.ProgressChanged != null)
                {
                    this.ProgressChanged(this, 100);
                }
            }
            else
            {
                string tmpPath = Path.Combine(directory, Path.GetFileNameWithoutExtension(path) + ".tmp");

                using (FlagsBinaryWriter writer = new FlagsBinaryWriter(new FileStream(tmpPath, FileMode.Create)))
                {
                    // write the signature.
                    writer.Write(version.DatSignature);

                    // write item, outfit, effect and missile count.
                    writer.Write(this.ItemCount);
                    writer.Write(this.OutfitCount);
                    writer.Write(this.EffectCount);
                    writer.Write(this.MissileCount);

                    int total    = this.ItemCount + this.OutfitCount + this.EffectCount + this.MissileCount;
                    int compiled = 0;

                    // write item list.
                    for (ushort id = 100; id <= this.ItemCount; id++)
                    {
                        ThingType item = this.Items[id];
                        if (!ThingTypeSerializer.WriteProperties(item, version.Format, writer) ||
                            !ThingTypeSerializer.WriteTexturePatterns(item, features, writer))
                        {
                            throw new Exception("Items list cannot be compiled.");
                        }
                    }

                    // update progress.
                    if (this.ProgressChanged != null)
                    {
                        compiled += this.ItemCount;
                        this.ProgressChanged(this, (compiled * 100) / total);
                    }

                    bool onlyOneGroup = ((this.ClientFeatures & ClientFeatures.FrameGroups) == ClientFeatures.FrameGroups) &&
                                        ((features & ClientFeatures.FrameGroups) != ClientFeatures.FrameGroups);

                    // write outfit list.
                    for (ushort id = 1; id <= this.OutfitCount; id++)
                    {
                        ThingType outfit = onlyOneGroup ? ThingType.ToSingleFrameGroup(this.Outfits[id]) : this.Outfits[id];
                        if (!ThingTypeSerializer.WriteProperties(outfit, version.Format, writer) ||
                            !ThingTypeSerializer.WriteTexturePatterns(outfit, features, writer))
                        {
                            throw new Exception("Outfits list cannot be compiled.");
                        }
                    }

                    // update progress.
                    if (this.ProgressChanged != null)
                    {
                        compiled += this.OutfitCount;
                        this.ProgressChanged(this, (compiled * 100) / total);
                    }

                    // write effect list.
                    for (ushort id = 1; id <= this.EffectCount; id++)
                    {
                        ThingType effect = this.Effects[id];
                        if (!ThingTypeSerializer.WriteProperties(effect, version.Format, writer) ||
                            !ThingTypeSerializer.WriteTexturePatterns(effect, features, writer))
                        {
                            throw new Exception("Effects list cannot be compiled.");
                        }
                    }

                    // update progress.
                    if (this.ProgressChanged != null)
                    {
                        compiled += this.EffectCount;
                        this.ProgressChanged(this, (compiled * 100) / total);
                    }

                    // write missile list.
                    for (ushort id = 1; id <= this.MissileCount; id++)
                    {
                        ThingType missile = this.Missiles[id];
                        if (!ThingTypeSerializer.WriteProperties(missile, version.Format, writer) ||
                            !ThingTypeSerializer.WriteTexturePatterns(missile, features, writer))
                        {
                            throw new Exception("Missiles list cannot be compiled.");
                        }
                    }

                    // update progress.
                    if (this.ProgressChanged != null)
                    {
                        compiled += this.MissileCount;
                        this.ProgressChanged(this, (compiled * 100) / total);
                    }
                }

                if (File.Exists(path))
                {
                    File.Delete(path);
                }

                File.Move(tmpPath, path);
            }

            this.FilePath       = path;
            this.Version        = version;
            this.ClientFeatures = features;
            this.Changed        = false;

            if (this.StorageCompiled != null)
            {
                this.StorageCompiled(this);
            }

            return(true);
        }