Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
		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;
		}
Ejemplo n.º 3
0
 private void CreateButton_Click(object sender, EventArgs e)
 {
     if (clientVersionComboBox.SelectedItem != null)
     {
         this.selectedClient = clientVersionComboBox.SelectedItem as SupportedClient;
         this.DialogResult   = DialogResult.OK;
         Close();
     }
 }
Ejemplo n.º 4
0
 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();
     }
 }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
 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();
     }
 }
Ejemplo n.º 7
0
        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();
            }
        }
Ejemplo n.º 8
0
        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();
            }
        }
Ejemplo n.º 9
0
        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;
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 13
0
        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;
        }
Ejemplo n.º 14
0
		public bool LoadSprites(string filename, SupportedClient client, bool extended, bool transparency)
		{
			return Sprite.LoadSprites(filename, ref sprites, client, extended, transparency);
		}
Ejemplo n.º 15
0
        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);
        }
Ejemplo n.º 16
0
        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);
        }
Ejemplo n.º 17
0
		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;
			}
		}
Ejemplo n.º 18
0
        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();
            }
        }
Ejemplo n.º 19
0
        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;
        }
Ejemplo n.º 20
0
        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);
        }
Ejemplo n.º 21
0
 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();
     }
 }
Ejemplo n.º 22
0
        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);
        }
Ejemplo n.º 23
0
        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();
            }
        }
Ejemplo n.º 24
0
        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);
        }
Ejemplo n.º 25
0
        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;
            }
        }
Ejemplo n.º 26
0
		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;
		}
Ejemplo n.º 27
0
 public bool LoadClient(SupportedClient client, string datFullPath, string sprFullPath)
 {
     return loadDat(datFullPath, client.datSignature) && loadSprites(sprFullPath, client.sprSignature);
 }
Ejemplo n.º 28
0
		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;
		}
Ejemplo n.º 29
0
 public bool LoadSprites(string filename, SupportedClient client, bool extended, bool transparency)
 {
     return(Sprite.LoadSprites(filename, ref sprites, client, extended, transparency));
 }
Ejemplo n.º 30
0
		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;
		}
Ejemplo n.º 31
0
 public bool LoadClient(SupportedClient client, string datFullPath, string sprFullPath)
 {
     return(loadDat(datFullPath, client.datSignature) && loadSprites(sprFullPath, client.sprSignature));
 }
Ejemplo n.º 32
0
        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);
        }