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); }
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); }
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())); } }
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); }
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())); } }
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); }