public Items(AionData data) { InitializeComponent(); Thread t = new Thread(() => { XDocument doc = AionData.BXMLToXML(data.ReadXMLFile(@"Data\Items\Items.pak", "client_items.xml")); Dictionary <string, int> columns = new Dictionary <string, int>(); BeginInvoke(new Action(() => { DataGridViewImageColumn iconColumn = new DataGridViewImageColumn(); iconColumn.Name = "icon"; iconColumn.HeaderText = "icon"; dataGridView1.Columns.Add(iconColumn); foreach (var node in doc.Elements().First().Elements().First().Elements()) { dataGridView1.Columns.Add(node.Name.LocalName, node.Name.LocalName); columns[node.Name.LocalName] = columns.Count; } })); foreach (var node in doc.Elements().First().Elements()) { BeginInvoke(new Action <XElement>(x => { string[] values = new string[columns.Count]; foreach (XElement val in x.Elements()) { if (!columns.ContainsKey(val.Name.LocalName)) { dataGridView1.Columns.Add(val.Name.LocalName, val.Name.LocalName); columns[val.Name.LocalName] = columns.Count; Array.Resize(ref values, columns.Count); } values[columns[val.Name.LocalName]] = (val.Value); } var iconname = values[columns["icon_name"]]; Bitmap b = data.ReadDDSFile(@"Data\Items\Items.pak", iconname + ".dds"); object[] rowValues = new object[] { b }.Concat(values).ToArray(); int rowIndex = dataGridView1.Rows.Add(rowValues); dataGridView1.Rows[rowIndex].Height = 64; }), node); Thread.Sleep(10); if (dataGridView1.Rows.Count > 10000) { return; } } }); t.IsBackground = true; t.Priority = ThreadPriority.Lowest; t.Start(); }
public Items(AionData data) { InitializeComponent(); Thread t = new Thread(() => { XDocument doc = AionData.BXMLToXML(data.ReadXMLFile(@"Data\Items\Items.pak", "client_items.xml")); Dictionary<string, int> columns = new Dictionary<string, int>(); BeginInvoke(new Action(() => { DataGridViewImageColumn iconColumn = new DataGridViewImageColumn(); iconColumn.Name = "icon"; iconColumn.HeaderText = "icon"; dataGridView1.Columns.Add(iconColumn); foreach (var node in doc.Elements().First().Elements().First().Elements()) { dataGridView1.Columns.Add(node.Name.LocalName, node.Name.LocalName); columns[node.Name.LocalName] = columns.Count; } })); foreach (var node in doc.Elements().First().Elements()) { BeginInvoke(new Action<XElement>(x => { string[] values = new string[columns.Count]; foreach (XElement val in x.Elements()) { if (!columns.ContainsKey(val.Name.LocalName)) { dataGridView1.Columns.Add(val.Name.LocalName, val.Name.LocalName); columns[val.Name.LocalName] = columns.Count; Array.Resize(ref values, columns.Count); } values[columns[val.Name.LocalName]] = (val.Value); } var iconname = values[columns["icon_name"]]; Bitmap b = data.ReadDDSFile(@"Data\Items\Items.pak", iconname + ".dds"); object[] rowValues = new object[] { b }.Concat(values).ToArray(); int rowIndex = dataGridView1.Rows.Add(rowValues); dataGridView1.Rows[rowIndex].Height = 64; }), node); Thread.Sleep(10); if (dataGridView1.Rows.Count > 10000) { return; } } }); t.IsBackground = true; t.Priority = ThreadPriority.Lowest; t.Start(); }
static void Main() { AionData data = new AionData(@"C:\Downloads\aion"); //DataAnalysisTools.MakeFileWithStructForBXML(data, "itemsAnalysis.cs", // new PakFile(@"Data\Items\Items.pak", "client_items.xml"), // new PakFile(@"Data\Housing\Housing.pak", "client_housing_object.xml")); //DataAnalysisTools.MakeFileWithStructForBXML(data, @"L10N\1_enu\data\data.pak", "strings/client_strings_item2.xml", "clientstring.cs"); using (SQLiteConnection conn = new SQLiteConnection("aion.sqlite")) { conn.CreateTable <Item>("items"); var itemsxml = data.ReadXMLFile(@"Data\Items\Items.pak", "client_items.xml"); var housingobjectxml = data.ReadXMLFile(@"Data\Housing\Housing.pak", "client_housing_object.xml"); Dictionary <string, string> nameToCoords = CreateTextureMapOfIcons(data, itemsxml, housingobjectxml); conn.CreateTable <ClientString>("stringtable"); var clientStringItem = data.ReadXMLFile(@"L10N\1_enu\data\data.pak", "strings/client_strings_item.xml"); var clientStringItem2 = data.ReadXMLFile(@"L10N\1_enu\data\data.pak", "strings/client_strings_item2.xml"); using (SQLiteTransaction transaction = new SQLiteTransaction(conn)) { InsertBXMLData <Item>(conn, "items", itemsxml, (fi, str) => { if (fi.Name == "name") { return("str_" + str.ToLowerInvariant()); } if (fi.Name == "icon_name") { return(nameToCoords[str + ".dds"]); } return(str.ToLowerInvariant()); }); InsertBXMLData <Item>(conn, "items", housingobjectxml, (fi, str) => { if (fi.Name == "name") { return("str_" + str.ToLowerInvariant()); } if (fi.Name == "icon_name") { return(nameToCoords[str + ".dds"]); } return(str.ToLowerInvariant()); }); InsertBXMLData <ClientString>(conn, "stringtable", clientStringItem, (fi, str) => fi.Name == "body" ? str : str.ToLowerInvariant()); InsertBXMLData <ClientString>(conn, "stringtable", clientStringItem2, (fi, str) => fi.Name == "body" ? str : str.ToLowerInvariant()); } conn.Index("stringtable", "name"); conn.Index("items", "name"); conn.Index("stringtable", "body"); } return; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Items(data)); }
private static Dictionary <string, string> CreateTextureMapOfIcons(AionData data, params BinaryXmlFile[] xmls) { int width = 64; int height = 64; HashSet <string> filesUsed = new HashSet <string>(); foreach (var itemsxml in xmls) { foreach (var node in itemsxml.Root.Children) { if (node.Children.Count(x => x.Name == "icon_name") != 0) { string iconname = node.Children.First(x => x.Name == "icon_name").Value; filesUsed.Add(iconname + ".dds"); } } } Bitmap def = new Bitmap(1, 1); List <Bmp> bitmaps = new List <Bmp>(); foreach (var file in filesUsed) { Bitmap b = data.ReadDDSFile(@"Data\Items\Items.pak", file); if (b == null) { b = def; } var bmp = new Bmp() { name = file, bmp = b }; bitmaps.Add(bmp); Console.WriteLine("Processed Icon {0}", bmp.name); } bitmaps.Sort((y, x) => x.area.CompareTo(y.area)); restart: RBSPNode <Bmp, string> rbsp = new RBSPNode <Bmp, string>(new FRectangle() { x1 = 0, x2 = width, y1 = 0, y2 = height }, 1); foreach (var bmp in bitmaps) { bool success = rbsp.Insert( new FRectangle() { x1 = 0, x2 = 40, y1 = 0, y2 = 40 }, bmp); if (!success) { width *= 2; height *= 2; Console.WriteLine("Texture map too small, resizing to {0}x{1} and restarting", width, height); goto restart; } } Bitmap superbitmap = new Bitmap(width, height); Dictionary <string, string> nameToCoords = new Dictionary <string, string>(); using (Graphics g = Graphics.FromImage(superbitmap)) { rbsp.RetrieveRectangles((rect, bmp, z) => { nameToCoords[bmp.name] = string.Join(",", rect.x1, rect.y1, rect.Width(), rect.Height()); g.DrawImage(bmp.bmp, rect.x1, rect.y1, new RectangleF(0, 0, rect.Width(), rect.Height()), GraphicsUnit.Pixel); }, ""); } superbitmap.Save("icons.png", ImageFormat.Png); return(nameToCoords); }