public void CreateEmptyOTB(string filePath, SupportedClient client, bool isTemporary = true) { ServerItem item = new ServerItem(); item.SpriteHash = new byte[16]; item.ClientId = 100; item.ID = 100; ServerItemList items = new ServerItemList(); items.MajorVersion = 3; items.MinorVersion = client.OtbVersion; items.BuildNumber = 1; items.ClientVersion = client.Version; items.Add(item); if (!File.Exists(filePath)) { using (File.Create(filePath)) { //// } } OtbWriter writer = new OtbWriter(items); if (writer.Write(filePath)) { this.Open(filePath); this.IsTemporary = isTemporary; this.Saved = !isTemporary; } }
public List<SupportedClient> GetSupportedClientList() { List<SupportedClient> list = new List<SupportedClient>(); XmlNodeList nodes = xmlDocument.SelectNodes("/settings/clients/client"); if (nodes != null) { foreach (XmlNode node in nodes) { try { UInt32 version = UInt32.Parse(node.Attributes["version"].Value); string description = node.Attributes["description"].Value; UInt32 otbVersion = UInt32.Parse(node.Attributes["otbversion"].Value); UInt32 datSignature = (UInt32)System.Int32.Parse(node.Attributes["datsignature"].Value, System.Globalization.NumberStyles.HexNumber); UInt32 sprSignature = (UInt32)System.Int32.Parse(node.Attributes["sprsignature"].Value, System.Globalization.NumberStyles.HexNumber); SupportedClient client = new SupportedClient(version, description, otbVersion, datSignature, sprSignature); list.Add(client); } catch { System.Windows.Forms.MessageBox.Show(String.Format("Error loading file {0}", SettingFilename)); } } } return list; }
private void CreateButton_Click(object sender, EventArgs e) { if (clientVersionComboBox.SelectedItem != null) { this.selectedClient = clientVersionComboBox.SelectedItem as SupportedClient; this.DialogResult = DialogResult.OK; Close(); } }
private void CreateButton_Click(object sender, EventArgs e) { if (this.clientVersionComboBox.SelectedItem != null) { this.selectedClient = this.clientVersionComboBox.SelectedItem as SupportedClient; this.DialogResult = DialogResult.OK; this.Close(); } }
public bool loadClient(Host.Types.Plugin plugin, UInt32 otbVersion) { SupportedClient client = plugin.Instance.SupportedClients.Find( delegate(SupportedClient sc) { return(sc.otbVersion == otbVersion); }); if (client == null) { MessageBox.Show("The selected plugin does not support this version."); return(false); } string dataFolder = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "data"); if (Directory.Exists(dataFolder) == false) { Directory.CreateDirectory(dataFolder); } string datPath = FindClientFile(Path.Combine(dataFolder, client.version.ToString()), ".dat"); string sprPath = FindClientFile(Path.Combine(dataFolder, client.version.ToString()), ".spr"); if (File.Exists(datPath) == false || File.Exists(sprPath) == false) { string text = String.Empty; if (File.Exists(datPath) == false) { text = String.Format("Unable to load dat file, please place a valid dat in 'data\\{0}\\'.", client.version); } if (File.Exists(sprPath) == false) { if (text != String.Empty) { text += "\n"; } text += String.Format("Unable to load spr file, please place a valid spr in 'data\\{0}\\'.", client.version); } MessageBox.Show(text); return(false); } bool result = plugin.Instance.LoadClient(client, datPath, sprPath); if (!result) { MessageBox.Show(String.Format("The plugin could not load dat or spr.")); } items.clientVersion = client.version; return(result); }
private void SelectBtn_Click(object sender, EventArgs e) { if (this.pluginsListBox.SelectedItem != null) { this.SelectedPlugin = Program.plugins.AvailablePlugins.Find(this.pluginsListBox.SelectedItem.ToString()); this.UpdateClient = this.pluginsListBox.SelectedItem as SupportedClient; this.DialogResult = DialogResult.OK; this.Close(); } }
private void selectBtn_Click(object sender, EventArgs e) { if(pluginsListBox.SelectedItem != null){ selectedPlugin = Program.plugins.AvailablePlugins.Find(pluginsListBox.SelectedItem.ToString()); updateClient = clientList[(Int32)pluginsListBox.SelectedIndex]; this.DialogResult = DialogResult.OK; Close(); } }
private void selectBtn_Click(object sender, EventArgs e) { if (pluginsListBox.SelectedItem != null) { selectedPlugin = Program.plugins.AvailablePlugins.Find(pluginsListBox.SelectedItem.ToString()); updateClient = clientList[(Int32)pluginsListBox.SelectedIndex]; this.DialogResult = DialogResult.OK; Close(); } }
public bool LoadClient(SupportedClient client, string datFullPath, string sprFullPath) { if (!loadDat(datFullPath, client.datSignature)) { Trace.WriteLine("Failed to load dat"); return false; } if (!loadSprites(sprFullPath, client.sprSignature)) { Trace.WriteLine("Failed to load spr"); return false; } return true; }
public bool LoadClient(SupportedClient client, bool extended, bool transparency, string datFullPath, string sprFullPath) { if (!LoadDat(datFullPath, client, extended)) { Trace.WriteLine("Failed to load dat."); return(false); } if (!LoadSprites(sprFullPath, client, extended, transparency)) { Trace.WriteLine("Failed to load spr."); return(false); } return(true); }
public bool LoadClient(SupportedClient client, string datFullPath, string sprFullPath) { if (!loadDat(datFullPath, client.datSignature)) { Trace.WriteLine("Failed to load dat"); return(false); } if (!loadSprites(sprFullPath, client.sprSignature)) { Trace.WriteLine("Failed to load spr"); return(false); } return(true); }
public bool LoadClient(SupportedClient client, bool extended, bool frameDurations, bool transparency, string datFullPath, string sprFullPath) { if (this.Loaded) { this.Dispose(); } if (!LoadDat(datFullPath, client, extended, frameDurations)) { Trace.WriteLine("Failed to load dat."); return(false); } if (!LoadSprites(sprFullPath, client, extended, transparency)) { Trace.WriteLine("Failed to load spr."); return(false); } this.Loaded = true; return(true); }
private void OnSelectFiles(string directory) { this.alertLabel.Text = string.Empty; if (string.IsNullOrEmpty(directory) || !Directory.Exists(directory)) { this.alertLabel.Text = "Directory not found"; return; } string datPath = Utils.FindClientFile(directory, ".dat"); string sprPath = Utils.FindClientFile(directory, ".spr"); if (!File.Exists(datPath) || !File.Exists(sprPath)) { this.alertLabel.Text = "Client files not found"; return; } uint datSignature = this.GetSignature(datPath); uint sprSignature = this.GetSignature(sprPath); this.Plugin = Program.plugins.AvailablePlugins.Find(datSignature, sprSignature); if (this.Plugin == null) { alertLabel.Text = string.Format("Unsupported version\nDat Signature: {0:X}\nSpr Signature: {1:X}", datSignature, sprSignature); return; } this.Client = this.Plugin.Instance.GetClientBySignatures(datSignature, sprSignature); this.extendedCheckBox.Checked = this.extendedCheckBox.Checked || this.Client.Version >= 960; this.extendedCheckBox.Enabled = this.Client.Version < 960; this.frameDurationsCheckBox.Checked = this.frameDurationsCheckBox.Checked || this.Client.Version >= 1050; this.frameDurationsCheckBox.Enabled = this.Client.Version < 1050; this.datSignature = datSignature; this.sprSignature = sprSignature; this.directoryPathTextBox.Text = directory; }
public bool LoadSprites(string filename, SupportedClient client, bool extended, bool transparency) { return Sprite.LoadSprites(filename, ref sprites, client, extended, transparency); }
public static bool LoadSprites(string filename, ref Dictionary <uint, Sprite> sprites, SupportedClient client, bool extended, bool transparency) { FileStream fileStream = new FileStream(filename, FileMode.Open); try { using (BinaryReader reader = new BinaryReader(fileStream)) { uint sprSignature = reader.ReadUInt32(); if (client.SprSignature != sprSignature) { string message = "Bad spr signature. Expected signature is {0:X} and loaded signature is {1:X}."; Trace.WriteLine(string.Format(message, client.SprSignature, sprSignature)); return(false); } uint totalPics; if (extended) { totalPics = reader.ReadUInt32(); } else { totalPics = reader.ReadUInt16(); } List <uint> spriteIndexes = new List <uint>(); for (uint i = 0; i < totalPics; ++i) { uint index = reader.ReadUInt32(); spriteIndexes.Add(index); } uint id = 1; foreach (uint element in spriteIndexes) { uint index = element + 3; reader.BaseStream.Seek(index, SeekOrigin.Begin); ushort size = reader.ReadUInt16(); Sprite sprite; if (sprites.TryGetValue(id, out sprite)) { if (sprite != null && size > 0) { if (sprite.Size > 0) { // generate warning } else { sprite.ID = id; sprite.Size = size; sprite.CompressedPixels = reader.ReadBytes(size); sprite.Transparent = transparency; sprites[id] = sprite; } } } else { reader.BaseStream.Seek(size, SeekOrigin.Current); } ++id; } } } finally { fileStream.Close(); } return(true); }
private bool LoadClient(Plugin plugin, uint otbVersion) { SupportedClient client = plugin.Instance.SupportedClients.Find( delegate(SupportedClient sc) { return(sc.OtbVersion == otbVersion); }); if (client == null) { MessageBox.Show("The selected plugin does not support this version."); return(false); } uint datSignature = (uint)Properties.Settings.Default["DatSignature"]; uint sprSignature = (uint)Properties.Settings.Default["SprSignature"]; if (client.DatSignature != datSignature || client.SprSignature != sprSignature) { string message; if (datSignature == 0 || sprSignature == 0) { message = "No client is selected. Please navigate to the client folder."; } else { message = string.Format("The selected client is not compatible with this otb. Please navigate to the folder of a compatible client {0}.", client.Version); } MessageBox.Show(message); PreferencesForm form = new PreferencesForm(); if (form.ShowDialog() == DialogResult.OK && form.Plugin != null) { return(this.LoadClient(form.Plugin, otbVersion)); } else { return(false); } } string clientFolder = (string)Properties.Settings.Default["ClientDirectory"]; if (string.IsNullOrEmpty(clientFolder)) { return(false); } string datPath = Utils.FindClientFile(clientFolder, ".dat"); string sprPath = Utils.FindClientFile(clientFolder, ".spr"); bool extended = (bool)Properties.Settings.Default["Extended"]; bool transparency = (bool)Properties.Settings.Default["Transparency"]; extended = extended || client.Version >= 960; if (!File.Exists(datPath) || !File.Exists(sprPath)) { MessageBox.Show("Client files not found."); return(false); } Trace.WriteLine(string.Format("OTB version {0}.", otbVersion)); bool result; try { result = plugin.Instance.LoadClient(client, extended, transparency, datPath, sprPath); } catch (UnauthorizedAccessException error) { MessageBox.Show(error.Message + " Please run this program as administrator."); return(false); } Trace.WriteLine("Loading client files."); if (!result) { MessageBox.Show(string.Format("The plugin could not load dat or spr.")); } this.serverItems.ClientVersion = client.Version; Trace.WriteLine(string.Format("Client version {0}.", client.Version)); return(result); }
public void CreateEmptyOTB(string filePath, SupportedClient client, bool isTemp = true) { ServerItem item = new ServerItem(); item.SpriteHash = new byte[16]; item.spriteId = 100; item.id = 100; ServerItemList items = new ServerItemList(); items.dwMajorVersion = 3; items.dwMinorVersion = client.OtbVersion; items.dwBuildNumber = 1; items.clientVersion = client.Version; items.Add(item); if (!File.Exists(filePath)) { using (File.Create(filePath)) { } } if (Otb.Save(filePath, ref items)) { this.Open(filePath); this.isTemp = isTemp; this.saved = !isTemp; } }
private void ToolsUpdateVersionMenuItem_Click(object sender, EventArgs e) { UpdateForm form = new UpdateForm(); form.MainForm = this; DialogResult result = form.ShowDialog(); if (result == DialogResult.OK) { // Update OTB Plugin updatePlugin = form.SelectedPlugin; SupportedClient updateClient = form.UpdateClient; if (updatePlugin == null) { return; } if (!this.LoadClient(updatePlugin, updateClient.OtbVersion)) { return; } UpdateSettingsForm updateSettingsForm = new UpdateSettingsForm(); result = updateSettingsForm.ShowDialog(); if (result != DialogResult.OK) { return; } if (updateSettingsForm.generateSignatureCheck.Checked) { // Calculate an image signature using fourier transformation and calculate a signature we can // use to compare it to other images (kinda similar to md5 hash) except this // can also be used to find images with some variation. ClientItems currentClientItems = this.CurrentPlugin.Instance.Items; this.GenerateSpriteSignatures(ref currentClientItems); ClientItems updateClientItems = updatePlugin.Instance.Items; this.GenerateSpriteSignatures(ref updateClientItems); } ClientItems currentItems = this.CurrentPlugin.Instance.Items; ClientItems updateItems = updatePlugin.Instance.Items; List <ushort> assignedSpriteIdList = new List <ushort>(); // store the previous plugin (so we can display previous sprite, and do other comparisions) this.PreviousPlugin = this.CurrentPlugin; // update the current plugin the one we are updating to this.CurrentPlugin = updatePlugin; // update version information this.serverItems.ClientVersion = updateClient.Version; this.serverItems.MinorVersion = updateClient.OtbVersion; this.serverItems.BuildNumber = this.serverItems.BuildNumber + 1; this.CurrentOtbVersion = this.serverItems.MinorVersion; // Most items does have the same sprite after an update, so lets try that first uint foundItemCounter = 0; foreach (ServerItem item in this.serverItems) { item.SpriteAssigned = false; if (item.Type == ServerItemType.Deprecated) { continue; } ClientItem updateClientItem; if (updateItems.TryGetValue(item.ClientId, out updateClientItem)) { bool compareResult = updateClientItem.Equals(item); if (Utils.ByteArrayCompare(updateClientItem.SpriteHash, item.SpriteHash)) { if (compareResult) { item.PreviousClientId = item.ClientId; item.ClientId = updateClientItem.ID; item.SpriteAssigned = true; assignedSpriteIdList.Add(updateClientItem.ID); ++foundItemCounter; // Trace.WriteLine(String.Format("Match found id: {0}, clientid: {1}", item.otb.id, item.dat.id)); } else { // Sprite matches, but not the other attributes. // Trace.WriteLine(String.Format("Attribute changes found id: {0}.", item.id)); } } } } if (updateSettingsForm.reassignUnmatchedSpritesCheck.Checked) { foreach (Item updateItem in updateItems.Values) { foreach (ServerItem item in this.serverItems) { if (item.Type == ServerItemType.Deprecated) { continue; } if (item.SpriteAssigned) { continue; } if (Utils.ByteArrayCompare(updateItem.SpriteHash, item.SpriteHash)) { if (updateItem.Equals(item)) { if (updateItem.ID != item.ClientId) { Trace.WriteLine(string.Format("New sprite found id: {0}, old: {1}, new: {2}.", item.ID, item.ClientId, updateItem.ID)); } item.PreviousClientId = item.ClientId; item.ClientId = updateItem.ID; item.SpriteAssigned = true; assignedSpriteIdList.Add(updateItem.ID); ++foundItemCounter; break; } } } } } Trace.WriteLine(string.Format("Found {0} of {1}.", foundItemCounter, this.serverItems.MaxId)); if (updateSettingsForm.reloadItemAttributesCheck.Checked) { uint reloadedItemCounter = 0; foreach (ServerItem item in this.serverItems) { if (item.Type == ServerItemType.Deprecated) { continue; } // implicit assigned item.PreviousClientId = item.ClientId; item.SpriteAssigned = true; if (!assignedSpriteIdList.Contains(item.ClientId)) { assignedSpriteIdList.Add(item.ClientId); } if (!this.CompareItem(item, true)) { // sync with dat info this.ReloadItem(item); ++reloadedItemCounter; } } Trace.WriteLine(string.Format("Reloaded {0} of {1} items.", reloadedItemCounter, this.serverItems.MaxId)); } if (updateSettingsForm.createNewItemsCheck.Checked) { uint newItemCounter = 0; foreach (Item updateItem in updateItems.Values) { if (!assignedSpriteIdList.Contains(updateItem.ID)) { ++newItemCounter; ServerItem newItem = this.CreateItem(updateItem); this.serverItems.Add(newItem); Trace.WriteLine(string.Format("Creating item id {0}", newItem.ID)); } } Trace.WriteLine(string.Format("Created {0} new items.", newItemCounter)); } // done this.BuildItemsListBox(); } }
public bool LoadDat(string filename, SupportedClient client, bool extended) { using (FileStream fileStream = new FileStream(filename, FileMode.Open)) { BinaryReader reader = new BinaryReader(fileStream); uint datSignature = reader.ReadUInt32(); if (client.DatSignature != datSignature) { string message = "PluginTwo: Bad dat signature. Expected signature is {0:X} and loaded signature is {1:X}."; Trace.WriteLine(String.Format(message, client.DatSignature, datSignature)); return false; } // get max id this.itemCount = reader.ReadUInt16(); reader.ReadUInt16(); // skipping outfits count reader.ReadUInt16(); // skipping effects count reader.ReadUInt16(); // skipping missiles count ushort id = 100; while (id <= this.itemCount) { ClientItem item = new ClientItem(); item.ID = id; this.Items[id] = item; // read the options until we find 0xff ItemFlag flag; do { flag = (ItemFlag)reader.ReadByte(); switch (flag) { case ItemFlag.Ground: item.Type = ServerItemType.Ground; item.GroundSpeed = reader.ReadUInt16(); break; case ItemFlag.GroundBorder: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Border; break; case ItemFlag.OnBottom: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Bottom; break; case ItemFlag.OnTop: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Top; break; case ItemFlag.Container: item.Type = ServerItemType.Container; break; case ItemFlag.Stackable: item.Stackable = true; break; case ItemFlag.ForceUse: break; case ItemFlag.MultiUse: item.MultiUse = true; break; case ItemFlag.Writable: item.Readable = true; item.MaxReadWriteChars = reader.ReadUInt16(); break; case ItemFlag.WritableOnce: item.Readable = true; item.MaxReadChars = reader.ReadUInt16(); break; case ItemFlag.FluidContainer: item.Type = ServerItemType.Fluid; break; case ItemFlag.Fluid: item.Type = ServerItemType.Splash; break; case ItemFlag.IsUnpassable: item.Unpassable = true; break; case ItemFlag.IsUnmoveable: item.Movable = false; break; case ItemFlag.BlockMissiles: item.BlockMissiles = true; break; case ItemFlag.BlockPathfinder: item.BlockPathfinder = true; break; case ItemFlag.Pickupable: item.Pickupable = true; break; case ItemFlag.Hangable: item.Hangable = true; break; case ItemFlag.IsHorizontal: item.HookEast = true; break; case ItemFlag.IsVertical: item.HookSouth = true; break; case ItemFlag.Rotatable: item.Rotatable = true; break; case ItemFlag.HasLight: item.LightLevel = reader.ReadUInt16(); item.LightColor = reader.ReadUInt16(); break; case ItemFlag.DontHide: break; case ItemFlag.Translucent: break; case ItemFlag.HasOffset: reader.ReadUInt16(); // OffsetX reader.ReadUInt16(); // OffsetY break; case ItemFlag.HasElevation: item.HasElevation = true; reader.ReadUInt16(); // Height break; case ItemFlag.Lying: break; case ItemFlag.AnimateAlways: break; case ItemFlag.Minimap: item.MinimapColor = reader.ReadUInt16(); break; case ItemFlag.LensHelp: ushort opt = reader.ReadUInt16(); if (opt == 1112) { item.Readable = true; } break; case ItemFlag.FullGround: item.FullGround = true; break; case ItemFlag.IgnoreLook: item.IgnoreLook = true; break; case ItemFlag.Cloth: reader.ReadUInt16(); break; case ItemFlag.Market: reader.ReadUInt16(); // category item.TradeAs = reader.ReadUInt16(); // trade as reader.ReadUInt16(); // show as ushort nameLength = reader.ReadUInt16(); byte[] buffer = reader.ReadBytes(nameLength); item.Name = Encoding.UTF8.GetString(buffer, 0, buffer.Length); reader.ReadUInt16(); // profession reader.ReadUInt16(); // level break; case ItemFlag.LastFlag: break; default: Trace.WriteLine(String.Format("PluginTwo: Error while parsing, unknown flag 0x{0:X} at id {1}.", flag, id)); return false; } } while (flag != ItemFlag.LastFlag); item.Width = reader.ReadByte(); item.Height = reader.ReadByte(); if ((item.Width > 1) || (item.Height > 1)) { reader.BaseStream.Position++; } item.Layers = reader.ReadByte(); item.PatternX = reader.ReadByte(); item.PatternY = reader.ReadByte(); item.PatternZ = reader.ReadByte(); item.Frames = reader.ReadByte(); item.IsAnimation = item.Frames > 1; item.NumSprites = (uint)item.Width * item.Height * item.Layers * item.PatternX * item.PatternY * item.PatternZ * item.Frames; // Read the sprite ids for (uint i = 0; i < item.NumSprites; ++i) { uint spriteId; if (extended) { spriteId = reader.ReadUInt32(); } else { spriteId = reader.ReadUInt16(); } Sprite sprite; if (!sprites.TryGetValue(spriteId, out sprite)) { sprite = new Sprite(); sprite.ID = spriteId; sprites[spriteId] = sprite; } item.SpriteList.Add(sprite); } ++id; } } return true; }
public bool LoadDat(string filename, SupportedClient client, bool extended) { FileStream fileStream = new FileStream(filename, FileMode.Open); try { using (BinaryReader reader = new BinaryReader(fileStream)) { UInt32 datSignature = reader.ReadUInt32(); if (client.DatSignature != datSignature) { string message = "PluginTwo: Bad dat signature. Expected signature is {0:X} and loaded signature is {1:X}."; Trace.WriteLine(String.Format(message, client.DatSignature, datSignature)); return(false); } //get max id UInt16 itemCount = reader.ReadUInt16(); UInt16 creatureCount = reader.ReadUInt16(); UInt16 effectCount = reader.ReadUInt16(); UInt16 distanceCount = reader.ReadUInt16(); UInt16 minclientID = 100; //items starts at 100 UInt16 maxclientID = itemCount; UInt16 id = minclientID; while (id <= maxclientID) { ClientItem item = new ClientItem(); item.id = id; items[id] = item; // read the options until we find 0xff ItemFlag flag; do { flag = (ItemFlag)reader.ReadByte(); switch (flag) { case ItemFlag.Ground: item.type = ItemType.Ground; item.groundSpeed = reader.ReadUInt16(); break; case ItemFlag.GroundBorder: item.alwaysOnTop = true; item.alwaysOnTopOrder = 1; break; case ItemFlag.OnBottom: item.alwaysOnTop = true; item.alwaysOnTopOrder = 2; break; case ItemFlag.OnTop: item.alwaysOnTop = true; item.alwaysOnTopOrder = 3; break; case ItemFlag.Container: item.type = ItemType.Container; break; case ItemFlag.Stackable: item.isStackable = true; break; case ItemFlag.ForceUse: break; case ItemFlag.MultiUse: item.multiUse = true; break; case ItemFlag.Writable: item.isReadable = true; item.maxReadWriteChars = reader.ReadUInt16(); break; case ItemFlag.WritableOnce: item.isReadable = true; item.maxReadChars = reader.ReadUInt16(); break; case ItemFlag.FluidContainer: item.type = ItemType.Fluid; break; case ItemFlag.Fluid: item.type = ItemType.Splash; break; case ItemFlag.IsUnpassable: item.isUnpassable = true; break; case ItemFlag.IsUnmoveable: item.isMoveable = false; break; case ItemFlag.BlockMissiles: item.blockMissiles = true; break; case ItemFlag.BlockPathfinder: item.blockPathfinder = true; break; case ItemFlag.Pickupable: item.isPickupable = true; break; case ItemFlag.Hangable: item.isHangable = true; break; case ItemFlag.IsHorizontal: item.isHorizontal = true; break; case ItemFlag.IsVertical: item.isVertical = true; break; case ItemFlag.Rotatable: item.isRotatable = true; break; case ItemFlag.HasLight: item.lightLevel = reader.ReadUInt16(); item.lightColor = reader.ReadUInt16(); break; case ItemFlag.DontHide: break; case ItemFlag.Translucent: break; case ItemFlag.HasOffset: reader.ReadUInt16(); // OffsetX reader.ReadUInt16(); // OffsetY break; case ItemFlag.HasElevation: item.hasElevation = true; reader.ReadUInt16(); // Height break; case ItemFlag.Lying: break; case ItemFlag.AnimateAlways: break; case ItemFlag.Minimap: item.minimapColor = reader.ReadUInt16(); break; case ItemFlag.LensHelp: UInt16 opt = reader.ReadUInt16(); if (opt == 1112) { item.isReadable = true; } break; case ItemFlag.FullGround: item.fullGround = true; break; case ItemFlag.IgnoreLook: item.ignoreLook = true; break; case ItemFlag.Cloth: reader.ReadUInt16(); break; case ItemFlag.Market: reader.ReadUInt16(); // category item.tradeAs = reader.ReadUInt16(); // trade as reader.ReadUInt16(); // show as var size = reader.ReadUInt16(); item.name = new string(reader.ReadChars(size)); reader.ReadUInt16(); // profession reader.ReadUInt16(); // level break; case ItemFlag.LastFlag: break; default: Trace.WriteLine(String.Format("PluginTwo: Error while parsing, unknown flag 0x{0:X} at id {1}.", flag, id)); return(false); } } while (flag != ItemFlag.LastFlag); item.width = reader.ReadByte(); item.height = reader.ReadByte(); if ((item.width > 1) || (item.height > 1)) { reader.BaseStream.Position++; } item.layers = reader.ReadByte(); item.patternX = reader.ReadByte(); item.patternY = reader.ReadByte(); item.patternZ = reader.ReadByte(); item.frames = reader.ReadByte(); item.isAnimation = item.frames > 1; item.numSprites = (UInt32)item.width * item.height * item.layers * item.patternX * item.patternY * item.patternZ * item.frames; // Read the sprite ids for (UInt32 i = 0; i < item.numSprites; ++i) { uint spriteId; if (extended) { spriteId = reader.ReadUInt32(); } else { spriteId = reader.ReadUInt16(); } Sprite sprite; if (!sprites.TryGetValue(spriteId, out sprite)) { sprite = new Sprite(); sprite.id = spriteId; sprites[spriteId] = sprite; } item.spriteList.Add(sprite); } ++id; } } } finally { fileStream.Close(); } return(true); }
public bool LoadDat(string filename, SupportedClient client, bool extended) { using (FileStream fileStream = new FileStream(filename, FileMode.Open)) { BinaryReader reader = new BinaryReader(fileStream); uint datSignature = reader.ReadUInt32(); if (client.DatSignature != datSignature) { string message = "PluginThree: Bad dat signature. Expected signature is {0:X} and loaded signature is {1:X}."; Trace.WriteLine(string.Format(message, client.DatSignature, datSignature)); return(false); } // get max id this.itemCount = reader.ReadUInt16(); reader.ReadUInt16(); // skipping outfits count reader.ReadUInt16(); // skipping effects count reader.ReadUInt16(); // skipping missiles count bool skipFrameDuration = (client.Version >= 1050); ushort id = 100; while (id <= this.itemCount) { ClientItem item = new ClientItem(); item.ID = id; this.Items[id] = item; // read the options until we find 0xff ItemFlag flag; do { flag = (ItemFlag)reader.ReadByte(); switch (flag) { case ItemFlag.Ground: item.Type = ServerItemType.Ground; item.GroundSpeed = reader.ReadUInt16(); break; case ItemFlag.GroundBorder: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Border; break; case ItemFlag.OnBottom: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Bottom; break; case ItemFlag.OnTop: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Top; break; case ItemFlag.Container: item.Type = ServerItemType.Container; break; case ItemFlag.Stackable: item.Stackable = true; break; case ItemFlag.ForceUse: item.ForceUse = true; break; case ItemFlag.MultiUse: item.MultiUse = true; break; case ItemFlag.Writable: item.Readable = true; item.MaxReadWriteChars = reader.ReadUInt16(); break; case ItemFlag.WritableOnce: item.Readable = true; item.MaxReadChars = reader.ReadUInt16(); break; case ItemFlag.FluidContainer: item.Type = ServerItemType.Fluid; break; case ItemFlag.Fluid: item.Type = ServerItemType.Splash; break; case ItemFlag.IsUnpassable: item.Unpassable = true; break; case ItemFlag.IsUnmoveable: item.Movable = false; break; case ItemFlag.BlockMissiles: item.BlockMissiles = true; break; case ItemFlag.BlockPathfinder: item.BlockPathfinder = true; break; case ItemFlag.NoMoveAnimation: // item.noMoveAnimation = true; break; case ItemFlag.Pickupable: item.Pickupable = true; break; case ItemFlag.Hangable: item.Hangable = true; break; case ItemFlag.IsHorizontal: item.HookEast = true; break; case ItemFlag.IsVertical: item.HookSouth = true; break; case ItemFlag.Rotatable: item.Rotatable = true; break; case ItemFlag.HasLight: item.LightLevel = reader.ReadUInt16(); item.LightColor = reader.ReadUInt16(); break; case ItemFlag.DontHide: break; case ItemFlag.Translucent: break; case ItemFlag.HasOffset: reader.ReadUInt16(); // OffsetX reader.ReadUInt16(); // OffsetY break; case ItemFlag.HasElevation: item.HasElevation = true; reader.ReadUInt16(); // Height break; case ItemFlag.Lying: break; case ItemFlag.AnimateAlways: break; case ItemFlag.Minimap: item.MinimapColor = reader.ReadUInt16(); break; case ItemFlag.LensHelp: ushort opt = reader.ReadUInt16(); if (opt == 1112) { item.Readable = true; } break; case ItemFlag.FullGround: item.FullGround = true; break; case ItemFlag.IgnoreLook: item.IgnoreLook = true; break; case ItemFlag.Cloth: reader.ReadUInt16(); break; case ItemFlag.Market: reader.ReadUInt16(); // category item.TradeAs = reader.ReadUInt16(); // trade as reader.ReadUInt16(); // show as ushort nameLength = reader.ReadUInt16(); byte[] buffer = reader.ReadBytes(nameLength); item.Name = Encoding.UTF8.GetString(buffer, 0, buffer.Length); reader.ReadUInt16(); // profession reader.ReadUInt16(); // level break; case ItemFlag.DefaultAction: reader.ReadUInt16(); break; case ItemFlag.Usable: break; case ItemFlag.LastFlag: break; default: Trace.WriteLine(string.Format("PluginThree: Error while parsing, unknown flag 0x{0:X} at id {1}.", flag, id)); return(false); } } while (flag != ItemFlag.LastFlag); item.Width = reader.ReadByte(); item.Height = reader.ReadByte(); if ((item.Width > 1) || (item.Height > 1)) { reader.BaseStream.Position++; } item.Layers = reader.ReadByte(); item.PatternX = reader.ReadByte(); item.PatternY = reader.ReadByte(); item.PatternZ = reader.ReadByte(); item.Frames = reader.ReadByte(); item.IsAnimation = item.Frames > 1; item.NumSprites = (uint)item.Width * item.Height * item.Layers * item.PatternX * item.PatternY * item.PatternZ * item.Frames; if (item.IsAnimation && skipFrameDuration) { reader.ReadBytes(6 + 8 * item.Frames); } // Read the sprite ids for (uint i = 0; i < item.NumSprites; ++i) { uint spriteId = reader.ReadUInt32(); Sprite sprite; if (!sprites.TryGetValue(spriteId, out sprite)) { sprite = new Sprite(); sprite.ID = spriteId; sprites[spriteId] = sprite; } item.SpriteList.Add(sprite); } ++id; } } return(true); }
private void updateToolStripMenuItem_Click(object sender, EventArgs e) { UpdateForm form = new UpdateForm(); form.mainForm = this; DialogResult result = form.ShowDialog(); if (result == DialogResult.OK) { //Update OTB Host.Types.Plugin updatePlugin = form.selectedPlugin; SupportedClient updateClient = form.updateClient; if (updatePlugin == null) { return; } if (!loadClient(updatePlugin, updateClient.otbVersion)) { return; } UpdateSettingsForm updateSettingsForm = new UpdateSettingsForm(); result = updateSettingsForm.ShowDialog(); if (result != DialogResult.OK) { return; } if (updateSettingsForm.generateSignatureCheck.Checked) { //Calculate an image signature using fourier transformation and calculate a signature we can //use to compare it to other images (kinda similar to md5 hash) except this //can also be used to find images with some variation. SpriteItems currentSpriteItems = currentPlugin.Instance.Items; generateSpriteSignatures(ref currentSpriteItems); SpriteItems updateSpriteItems = updatePlugin.Instance.Items; generateSpriteSignatures(ref updateSpriteItems); } SpriteItems currentItems = currentPlugin.Instance.Items; SpriteItems updateItems = updatePlugin.Instance.Items; List <UInt16> assignedSpriteIdList = new List <UInt16>(); //store the previous plugin (so we can display previous sprite, and do other comparisions) previousPlugin = currentPlugin; //update the current plugin the one we are updating to currentPlugin = updatePlugin; //update version information items.clientVersion = updateClient.version; items.dwMinorVersion = updateClient.otbVersion; items.dwBuildNumber = items.dwBuildNumber + 1; currentOtbVersion = items.dwMinorVersion; //Most items does have the same sprite after an update, so lets try that first UInt32 foundItemCounter = 0; foreach (OtbItem item in items) { item.spriteAssigned = false; if (item.type == ItemType.Deprecated) { continue; } SpriteItem updateSpriteItem; if (updateItems.TryGetValue(item.spriteId, out updateSpriteItem)) { bool compareResult = updateSpriteItem.isEqual(item); if (Utils.ByteArrayCompare(updateSpriteItem.spriteHash, item.spriteHash)) { if (compareResult) { item.prevSpriteId = item.spriteId; item.spriteId = updateSpriteItem.id; item.spriteAssigned = true; assignedSpriteIdList.Add(updateSpriteItem.id); ++foundItemCounter; if (showUpdateOutput) { //Trace.WriteLine(String.Format("Match found id: {0}, clientid: {1}", item.otb.id, item.dat.id)); } } else { //Sprite matches, but not the other attributes. if (showUpdateOutput) { Trace.WriteLine(String.Format("Attribute changes found id: {0}", item.id)); } } } } } if (updateSettingsForm.reassignUnmatchedSpritesCheck.Checked) { foreach (Item updateItem in updateItems.Values) { foreach (OtbItem item in items) { if (item.type == ItemType.Deprecated) { continue; } if (item.spriteAssigned) { continue; } if (Utils.ByteArrayCompare(updateItem.spriteHash, item.spriteHash)) { if (updateItem.isEqual(item)) { if (updateItem.id != item.spriteId) { if (showUpdateOutput) { Trace.WriteLine(String.Format("New sprite found id: {0}, old: {1}, new: {2}", item.id, item.spriteId, updateItem.id)); } } item.prevSpriteId = item.spriteId; item.spriteId = updateItem.id; item.spriteAssigned = true; assignedSpriteIdList.Add(updateItem.id); ++foundItemCounter; break; } } } } } if (showUpdateOutput) { Trace.WriteLine(String.Format("Found {0} of {1}", foundItemCounter, items.maxId)); } if (updateSettingsForm.reloadItemAttributesCheck.Checked) { UInt32 reloadedItemCounter = 0; foreach (OtbItem item in items) { if (item.type == ItemType.Deprecated) { continue; } //implicit assigned item.prevSpriteId = item.spriteId; item.spriteAssigned = true; if (!assignedSpriteIdList.Contains(item.spriteId)) { assignedSpriteIdList.Add(item.spriteId); } if (!compareItem(item, true)) { //sync with dat info reloadItem(item); ++reloadedItemCounter; } } if (showUpdateOutput) { Trace.WriteLine(String.Format("Reloaded {0} of {1}", reloadedItemCounter, items.maxId)); } } if (updateSettingsForm.createNewItemsCheck.Checked) { UInt32 newItemCounter = 0; foreach (Item updateItem in updateItems.Values) { if (!assignedSpriteIdList.Contains(updateItem.id)) { ++newItemCounter; UInt16 newId = createItem(updateItem); if (showUpdateOutput) { Trace.WriteLine(String.Format("Creating item id {0}", newId)); } } } if (showUpdateOutput) { Trace.WriteLine(String.Format("Created {0} new items", newItemCounter)); } } //done buildTreeView(); } }
public bool LoadDat(string filename, SupportedClient client, bool extended, bool frameDurations) { using (FileStream fileStream = new FileStream(filename, FileMode.Open)) { BinaryReader reader = new BinaryReader(fileStream); uint datSignature = reader.ReadUInt32(); if (client.DatSignature != datSignature) { string message = "PluginFour: Bad dat signature. Expected signature is {0:X} and loaded signature is {1:X}."; Trace.WriteLine(string.Format(message, client.DatSignature, datSignature)); return(false); } // get max id this.itemCount = reader.ReadUInt16(); reader.ReadUInt16(); // skipping outfits count reader.ReadUInt16(); // skipping effects count reader.ReadUInt16(); // skipping missiles count ushort id = 100; while (id <= this.itemCount) { ClientItem item = new ClientItem(); item.ID = id; this.Items[id] = item; // read the options until we find 0xff ItemFlag flag; do { flag = (ItemFlag)reader.ReadByte(); switch (flag) { case ItemFlag.Ground: item.Type = ServerItemType.Ground; item.GroundSpeed = reader.ReadUInt16(); break; case ItemFlag.GroundBorder: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Border; break; case ItemFlag.OnBottom: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Bottom; break; case ItemFlag.OnTop: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Top; break; case ItemFlag.Container: item.Type = ServerItemType.Container; break; case ItemFlag.Stackable: item.Stackable = true; break; case ItemFlag.ForceUse: item.ForceUse = true; break; case ItemFlag.MultiUse: item.MultiUse = true; break; case ItemFlag.Writable: item.Readable = true; item.MaxReadWriteChars = reader.ReadUInt16(); break; case ItemFlag.Readable: item.Readable = true; item.MaxReadChars = reader.ReadUInt16(); break; case ItemFlag.FluidContainer: item.Type = ServerItemType.Fluid; break; case ItemFlag.Fluid: item.Type = ServerItemType.Splash; break; case ItemFlag.IsUnpassable: item.Unpassable = true; break; case ItemFlag.IsUnmoveable: item.Movable = false; break; case ItemFlag.BlockMissiles: item.BlockMissiles = true; break; case ItemFlag.BlockPathfinder: item.BlockPathfinder = true; break; case ItemFlag.Pickupable: item.Pickupable = true; break; case ItemFlag.Hangable: item.Hangable = true; break; case ItemFlag.IsHorizontal: item.HookEast = true; break; case ItemFlag.IsVertical: item.HookSouth = true; break; case ItemFlag.Rotatable: item.Rotatable = true; break; case ItemFlag.HasLight: item.LightLevel = reader.ReadUInt16(); item.LightColor = reader.ReadUInt16(); break; case ItemFlag.DontHide: break; case ItemFlag.Translucent: break; case ItemFlag.HasOffset: reader.ReadUInt16(); // OffsetX reader.ReadUInt16(); // OffsetY break; case ItemFlag.HasElevation: item.HasElevation = true; reader.ReadUInt16(); // Height break; case ItemFlag.Lying: break; case ItemFlag.AnimateAlways: break; case ItemFlag.Minimap: item.MinimapColor = reader.ReadUInt16(); break; case ItemFlag.Actions: // actions reader.ReadUInt16(); break; case ItemFlag.FullGround: item.FullGround = true; break; case ItemFlag.LastFlag: break; default: Trace.WriteLine(string.Format("PluginFour: Error while parsing, unknown flag 0x{0:X} at id {1}.", flag, id)); return(false); } } while (flag != ItemFlag.LastFlag); item.Width = reader.ReadByte(); item.Height = reader.ReadByte(); if (item.Width > 1 || item.Height > 1) { // Skipping exact size. reader.ReadByte(); } item.Layers = reader.ReadByte(); item.PatternX = reader.ReadByte(); item.PatternY = reader.ReadByte(); item.PatternZ = reader.ReadByte(); item.Frames = reader.ReadByte(); item.NumSprites = (uint)(item.Width * item.Height * item.Layers * item.PatternX * item.PatternY * item.PatternZ * item.Frames); // Read the sprite ids for (uint i = 0; i < item.NumSprites; ++i) { uint spriteId = reader.ReadUInt16(); Sprite sprite; if (!sprites.TryGetValue(spriteId, out sprite)) { sprite = new Sprite(); sprite.ID = spriteId; sprites[spriteId] = sprite; } item.SpriteList.Add(sprite); } ++id; } } return(true); }
public static bool LoadSprites(string filename, ref Dictionary<UInt32, Sprite> sprites, SupportedClient client, bool extended, bool transparency) { FileStream fileStream = new FileStream(filename, FileMode.Open); try { using (BinaryReader reader = new BinaryReader(fileStream)) { UInt32 sprSignature = reader.ReadUInt32(); if (client.SprSignature != sprSignature) { string message = "Bad spr signature. Expected signature is {0:X} and loaded signature is {1:X}."; Trace.WriteLine(String.Format(message, client.SprSignature, sprSignature)); return false; } UInt32 totalPics; if (extended) { totalPics = reader.ReadUInt32(); } else { totalPics = reader.ReadUInt16(); } List<UInt32> spriteIndexes = new List<UInt32>(); for (uint i = 0; i < totalPics; ++i) { UInt32 index = reader.ReadUInt32(); spriteIndexes.Add(index); } UInt32 id = 1; foreach (UInt32 element in spriteIndexes) { UInt32 index = element + 3; reader.BaseStream.Seek(index, SeekOrigin.Begin); UInt16 size = reader.ReadUInt16(); Sprite sprite; if (sprites.TryGetValue(id, out sprite)) { if (sprite != null && size > 0) { if (sprite.size > 0) { //generate warning } else { sprite.id = id; sprite.size = size; sprite.dump = reader.ReadBytes(size); sprite.useAlpha = transparency; sprites[id] = sprite; } } } else { reader.BaseStream.Seek(size, SeekOrigin.Current); } ++id; } } } finally { fileStream.Close(); } return true; }
public bool LoadClient(SupportedClient client, string datFullPath, string sprFullPath) { return loadDat(datFullPath, client.datSignature) && loadSprites(sprFullPath, client.sprSignature); }
public bool LoadDat(string filename, SupportedClient client, bool extended) { FileStream fileStream = new FileStream(filename, FileMode.Open); try { using (BinaryReader reader = new BinaryReader(fileStream)) { UInt32 datSignature = reader.ReadUInt32(); if (client.DatSignature != datSignature) { string message = "PluginOne: Bad dat signature. Expected signature is {0:X} and loaded signature is {1:X}."; Trace.WriteLine(String.Format(message, client.DatSignature, datSignature)); return false; } //get max id UInt16 itemCount = reader.ReadUInt16(); UInt16 creatureCount = reader.ReadUInt16(); UInt16 effectCount = reader.ReadUInt16(); UInt16 distanceCount = reader.ReadUInt16(); UInt16 minclientID = 100; //items starts at 100 UInt16 maxclientID = itemCount; UInt16 id = minclientID; while (id <= maxclientID) { ClientItem item = new ClientItem(); item.id = id; items[id] = item; // read the options until we find 0xff ItemFlag flag; do { flag = (ItemFlag)reader.ReadByte(); switch (flag) { case ItemFlag.Ground: item.type = ItemType.Ground; item.groundSpeed = reader.ReadUInt16(); break; case ItemFlag.GroundBorder: item.alwaysOnTop = true; item.alwaysOnTopOrder = 1; break; case ItemFlag.OnBottom: item.alwaysOnTop = true; item.alwaysOnTopOrder = 2; break; case ItemFlag.OnTop: item.alwaysOnTop = true; item.alwaysOnTopOrder = 3; break; case ItemFlag.Container: item.type = ItemType.Container; break; case ItemFlag.Stackable: item.isStackable = true; break; case ItemFlag.ForceUse: break; case ItemFlag.MultiUse: item.multiUse = true; break; case ItemFlag.HasCharges: break; case ItemFlag.Writable: item.isReadable = true; item.maxReadWriteChars = reader.ReadUInt16(); break; case ItemFlag.WritableOnce: item.isReadable = true; item.maxReadChars = reader.ReadUInt16(); break; case ItemFlag.FluidContainer: item.type = ItemType.Fluid; break; case ItemFlag.Fluid: item.type = ItemType.Splash; break; case ItemFlag.IsUnpassable: item.isUnpassable = true; break; case ItemFlag.IsUnmoveable: item.isMoveable = false; break; case ItemFlag.BlockMissiles: item.blockMissiles = true; break; case ItemFlag.BlockPathfinder: item.blockPathfinder = true; break; case ItemFlag.Pickupable: item.isPickupable = true; break; case ItemFlag.Hangable: item.isHangable = true; break; case ItemFlag.IsHorizontal: item.isHorizontal = true; break; case ItemFlag.IsVertical: item.isVertical = true; break; case ItemFlag.Rotatable: item.isRotatable = true; break; case ItemFlag.HasLight: item.lightLevel = reader.ReadUInt16(); item.lightColor = reader.ReadUInt16(); break; case ItemFlag.DontHide: break; case ItemFlag.FloorChange: break; case ItemFlag.HasOffset: reader.ReadUInt16(); // OffsetX reader.ReadUInt16(); // OffsetY break; case ItemFlag.HasElevation: item.hasElevation = true; reader.ReadUInt16(); // Height break; case ItemFlag.Lying: break; case ItemFlag.AnimateAlways: break; case ItemFlag.Minimap: item.minimapColor = reader.ReadUInt16(); break; case ItemFlag.LensHelp: UInt16 opt = reader.ReadUInt16(); if (opt == 1112) { item.isReadable = true; } break; case ItemFlag.FullGround: item.fullGround = true; break; case ItemFlag.IgnoreLook: item.ignoreLook = true; break; case ItemFlag.LastFlag: break; default: Trace.WriteLine(String.Format("PluginOne: Error while parsing, unknown flag 0x{0:X} at id {1}.", flag, id)); return false; } } while (flag != ItemFlag.LastFlag); item.width = reader.ReadByte(); item.height = reader.ReadByte(); if ((item.width > 1) || (item.height > 1)) { reader.BaseStream.Position++; } item.layers = reader.ReadByte(); item.patternX = reader.ReadByte(); item.patternY = reader.ReadByte(); item.patternZ = reader.ReadByte(); item.frames = reader.ReadByte(); item.isAnimation = item.frames > 1; item.numSprites = (UInt32)item.width * item.height * item.layers * item.patternX * item.patternY * item.patternZ * item.frames; // Read the sprite ids for (UInt32 i = 0; i < item.numSprites; ++i) { uint spriteId; if (extended) { spriteId = reader.ReadUInt32(); } else { spriteId = reader.ReadUInt16(); } Sprite sprite; if (!sprites.TryGetValue(spriteId, out sprite)) { sprite = new Sprite(); sprite.id = spriteId; sprites[spriteId] = sprite; } item.spriteList.Add(sprite); } ++id; } } } finally { fileStream.Close(); } return true; }
public bool LoadSprites(string filename, SupportedClient client, bool extended, bool transparency) { return(Sprite.LoadSprites(filename, ref sprites, client, extended, transparency)); }
public bool LoadClient(SupportedClient client, bool extended, bool transparency, string datFullPath, string sprFullPath) { if (!LoadDat(datFullPath, client, extended)) { Trace.WriteLine("Failed to load dat."); return false; } if (!LoadSprites(sprFullPath, client, extended, transparency)) { Trace.WriteLine("Failed to load spr."); return false; } return true; }
public bool LoadClient(SupportedClient client, string datFullPath, string sprFullPath) { return(loadDat(datFullPath, client.datSignature) && loadSprites(sprFullPath, client.sprSignature)); }
public bool LoadDat(string filename, SupportedClient client, bool extended, bool frameDurations) { using (FileStream fileStream = new FileStream(filename, FileMode.Open)) { BinaryReader reader = new BinaryReader(fileStream); uint datSignature = reader.ReadUInt32(); if (client.DatSignature != datSignature) { string message = "PluginZero: Bad dat signature. Expected signature is {0:X} and loaded signature is {1:X}."; Trace.WriteLine(String.Format(message, client.DatSignature, datSignature)); return(false); } // get max id this.itemCount = reader.ReadUInt16(); reader.ReadUInt16(); // skipping outfits count reader.ReadUInt16(); // skipping effects count reader.ReadUInt16(); // skipping missiles count ushort id = 100; while (id <= this.itemCount) { ClientItem item = new ClientItem(); item.ID = id; this.Items[id] = item; // read the options until we find 0xff ItemFlag flag; do { flag = (ItemFlag)reader.ReadByte(); //flags need to be adjusted before. if (client.Version >= 780) { /* In 7.80-8.54 all attributes from 8 and higher were * incremented by 1 to make space for 8 as * "Item Charges" flag. */ if (Convert.ToInt32(flag) == 8) { item.HasCharges = true; continue; } else if (Convert.ToInt32(flag) > 8) { flag -= 1; } } else if (client.Version >= 755) { /* In 7.55-7.72 attributes 23 is "Floor Change". */ if (Convert.ToInt32(flag) == 23) { flag = ItemFlag.FloorChange; } } else if (client.Version >= 740) { /* In 7.4-7.5 attribute "Ground Border" did not exist * attributes 1-15 have to be adjusted. * Several other changes in the format. */ if (Convert.ToInt32(flag) > 0 && Convert.ToInt32(flag) <= 15) { flag += 1; } else if (Convert.ToInt32(flag) == 16) { flag = ItemFlag.HasLight; } else if (Convert.ToInt32(flag) == 17) { flag = ItemFlag.FloorChange; } else if (Convert.ToInt32(flag) == 18) { flag = ItemFlag.FullGround; } else if (Convert.ToInt32(flag) == 19) { flag = ItemFlag.HasElevation; } else if (Convert.ToInt32(flag) == 20) { flag = ItemFlag.HasOffset; } else if (Convert.ToInt32(flag) == 22) { flag = ItemFlag.Minimap; } else if (Convert.ToInt32(flag) == 23) { flag = ItemFlag.Rotatable; } else if (Convert.ToInt32(flag) == 24) { flag = ItemFlag.Lying; } else if (Convert.ToInt32(flag) == 25) { flag = ItemFlag.Hangable; } else if (Convert.ToInt32(flag) == 26) { flag = ItemFlag.IsHorizontal; } else if (Convert.ToInt32(flag) == 27) { flag = ItemFlag.IsVertical; } else if (Convert.ToInt32(flag) == 28) { flag = ItemFlag.AnimateAlways; } /* "Multi Use" and "Force Use" are swapped */ if (flag == ItemFlag.MultiUse) { flag = ItemFlag.ForceUse; } else if (flag == ItemFlag.ForceUse) { flag = ItemFlag.MultiUse; } } switch (flag) { case ItemFlag.Ground: item.GroundSpeed = reader.ReadUInt16(); item.Type = ServerItemType.Ground; break; case ItemFlag.GroundBorder: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Border; break; case ItemFlag.OnBottom: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Bottom; break; case ItemFlag.OnTop: item.HasStackOrder = true; item.StackOrder = TileStackOrder.Top; break; case ItemFlag.Container: item.Type = ServerItemType.Container; break; case ItemFlag.Stackable: item.Stackable = true; break; case ItemFlag.ForceUse: break; case ItemFlag.MultiUse: item.MultiUse = true; break; case ItemFlag.Writable: item.Readable = true; item.MaxReadWriteChars = reader.ReadUInt16(); break; case ItemFlag.WritableOnce: item.Readable = true; item.MaxReadChars = reader.ReadUInt16(); break; case ItemFlag.FluidContainer: item.Type = ServerItemType.Fluid; break; case ItemFlag.Fluid: item.Type = ServerItemType.Splash; break; case ItemFlag.IsUnpassable: item.Unpassable = true; break; case ItemFlag.IsUnmoveable: item.Movable = false; break; case ItemFlag.BlockMissiles: item.BlockMissiles = true; break; case ItemFlag.BlockPathfinder: item.BlockPathfinder = true; break; case ItemFlag.Pickupable: item.Pickupable = true; break; case ItemFlag.Hangable: item.Hangable = true; break; case ItemFlag.IsHorizontal: item.HookEast = true; break; case ItemFlag.IsVertical: item.HookSouth = true; break; case ItemFlag.Rotatable: item.Rotatable = true; break; case ItemFlag.HasLight: item.LightLevel = reader.ReadUInt16(); item.LightColor = reader.ReadUInt16(); break; case ItemFlag.DontHide: break; case ItemFlag.FloorChange: break; case ItemFlag.HasOffset: if (client.Version >= 755) { reader.ReadUInt16(); // OffsetX reader.ReadUInt16(); // OffsetY } break; case ItemFlag.HasElevation: item.HasElevation = true; reader.ReadUInt16(); // Height break; case ItemFlag.Lying: break; case ItemFlag.AnimateAlways: break; case ItemFlag.Minimap: item.MinimapColor = reader.ReadUInt16(); break; case ItemFlag.LensHelp: ushort opt = reader.ReadUInt16(); if (opt == 1112) { item.Readable = true; } break; case ItemFlag.FullGround: break; case ItemFlag.LastFlag: break; default: Trace.WriteLine(String.Format("PluginZero: Error while parsing, unknown flag 0x{0:X} at id {1}.", flag, id)); return(false); } } while (flag != ItemFlag.LastFlag); item.Width = reader.ReadByte(); item.Height = reader.ReadByte(); if ((item.Width > 1) || (item.Height > 1)) { reader.BaseStream.Position++; } item.Layers = reader.ReadByte(); item.PatternX = reader.ReadByte(); item.PatternY = reader.ReadByte(); if (client.Version >= 755) { item.PatternZ = reader.ReadByte(); } else { item.PatternZ = 1; } item.Frames = reader.ReadByte(); item.IsAnimation = item.Frames > 1; item.NumSprites = (uint)item.Width * item.Height * item.Layers * item.PatternX * item.PatternY * item.PatternZ * item.Frames; // Read the sprite ids for (UInt32 i = 0; i < item.NumSprites; ++i) { UInt16 spriteId = reader.ReadUInt16(); Sprite sprite; if (!sprites.TryGetValue(spriteId, out sprite)) { sprite = new Sprite(); sprite.ID = spriteId; sprites[spriteId] = sprite; } item.SpriteList.Add(sprite); } ++id; } } return(true); }