예제 #1
0
        private void listBox1_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            int n = listBox1.SelectedIndex;

            if (n == -1)
            {
                return;
            }
            n = Objects[n];
            lODToolStripMenuItem.Visible = false;
            UnCheckLODs();
            stm = null;
            skm = null;
            preview?.Dispose();
            preview                          = null;
            MaterialBox.Visible              = false;
            MaterialApplyButton.Visible      = false;
            MaterialIndexBox.Visible         = false;
            MaterialIndexApplyButton.Visible = false;
            if (Pcc.getExport(n).ClassName == "StaticMesh")
            {
                LoadStaticMesh(n);
            }
            if (Pcc.getExport(n).ClassName == "SkeletalMesh")
            {
                LoadSkeletalMesh(n);
            }
        }
예제 #2
0
        /// <summary>
        /// Do not remove this method - it is used by ME3Tweaks Rebuilding TFC Guide
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dEBUGEnsureFolderOfPackageFilesHasANameToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog d = new OpenFileDialog {
                Filter = "ME2/ME3 Package files|*.pcc"
            };

            if (d.ShowDialog() == DialogResult.OK)
            {
                var pccs = Directory.GetFiles(Path.GetDirectoryName(d.FileName), "*pcc");
                if (pccs.Count() > 0)
                {
                    string input = "Enter a name. This name will be added to every PCC in this folder if it does not already exist.";
                    string name  = PromptDialog.Prompt(null, input, "Enter name");
                    if (name != null)
                    {
                        foreach (string pccPath in pccs)
                        {
                            LoadMEPackage(pccPath);
                            int numNames = Pcc.Names.Count;
                            Pcc.FindNameOrAdd(name);
                            int afternumNames = Pcc.Names.Count;
                            if (numNames != afternumNames)
                            {
                                Pcc.save();
                                Debug.WriteLine("Added " + name + " to " + pccPath);
                            }
                        }
                    }
                }
            }
        }
예제 #3
0
        public void LoadFile(string path)
        {
            try
            {
                //LoadME3Package(path);
                LoadMEPackage(path);
                if (Pcc.Game != MEGame.ME3)
                {
                    MessageBox.Show(this, "Only files from Mass Effect 3 are supported.\nIf you want to help us debug loading ME1/ME2 files, please come to the ME3Tweaks Discord server.", "Unsupported game");
                    Pcc.Release();
                    return;
                }
                MeshplorerMode = 0;
                RefreshMaterialList();
                RefreshMeshList();
                lblStatus.Text = Path.GetFileName(path);

                AddRecent(path, false);
                SaveRecentList();
                RefreshRecent(true, RFiles);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error:\n" + ex.Message);
            }
        }
        /// <summary>
        /// Attempts to relink unreal property data using propertycollection when cross porting an export
        /// </summary>
        private List <string> relinkObjects2(IMEPackage importpcc)
        {
            List <string> relinkResults = new List <string>();
            //relink each modified export

            //We must convert this to a list, as this list will be updated as imports are cross mapped during relinking.
            //This process speeds up same-relinks later.
            //This is a list because otherwise we would get a concurrent modification exception.
            //Since we only enumerate exports and append imports to this list we will not need to worry about recursive links
            //I am sure this won't come back to be a pain for me.
            List <KeyValuePair <int, int> > crossPCCObjectMappingList = crossPCCObjectMap.ToList();

            for (int i = 0; i < crossPCCObjectMappingList.Count; i++)
            {
                KeyValuePair <int, int> entry = crossPCCObjectMappingList[i];
                if (entry.Key > 0)
                {
                    PropertyCollection transplantProps = importpcc.Exports[entry.Key].GetProperties();
                    relinkResults.AddRange(relinkPropertiesRecursive(importpcc, Pcc, transplantProps, crossPCCObjectMappingList));
                    Pcc.getExport(entry.Value).WriteProperties(transplantProps);
                }
            }

            return(relinkResults);
        }
예제 #5
0
        public override void handleUpdate(List <PackageUpdate> updates)
        {
            IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import &&
                                                                        x.change != PackageChange.ImportAdd &&
                                                                        x.change != PackageChange.Names);
            List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList();

            if (updatedExports.Contains(bank.ExportIndex))
            {
                int index = bank.ExportIndex;
                //loaded sequence is no longer a sequence
                if (Pcc.getExport(index).ClassName != "WwiseBank")
                {
                    bank = null;
                    listBox2.Items.Clear();
                    rtb1.Text               = "";
                    hb1.ByteProvider        = new DynamicByteProvider();
                    hircHexBox.ByteProvider = new DynamicByteProvider();
                }
                RefreshSelected();
                updatedExports.Remove(index);
            }
            if (updatedExports.Intersect(objects).Any())
            {
                ListRefresh();
            }
            foreach (var i in updatedExports)
            {
                if (Pcc.getExport(i).ClassName.Contains("WwiseBank"))
                {
                    ListRefresh();
                    break;
                }
            }
        }
예제 #6
0
        public void LoadStaticMesh(int index)
        {
            try
            {
                stm = ObjectBinary.From <StaticMesh>(Pcc.GetUExport(index));
                //var mesh = ObjectBinary.From <StaticMesh>(Pcc.getUExport(index));
                // Load meshes for the LODs
                preview?.Dispose();
                preview = new ModelPreview(view.Context.Device, stm, 0, view.Context.TextureCache);
                RefreshChosenMaterialsList();
                CenterView();

                // Update treeview
                treeView1.BeginUpdate();
                treeView1.Nodes.Clear();
                //treeView1.Nodes.Add(stm.ToTree());
                //treeView1.Nodes[0].Expand();
                treeView1.EndUpdate();
                MaterialBox.Visible              = false;
                MaterialApplyButton.Visible      = false;
                MaterialIndexBox.Visible         = false;
                MaterialIndexApplyButton.Visible = false;
            }
            catch (Exception e)
            {
                MessageBox.Show(ExceptionHandlerDialogWPF.FlattenException(e));
            }
        }
예제 #7
0
        public override void handleUpdate(List <PackageUpdate> updates)
        {
            IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import &&
                                                                        x.change != PackageChange.ImportAdd &&
                                                                        x.change != PackageChange.Names);
            List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList();

            if (Dialog != null && updatedExports.Contains(Dialog.MyIndex))
            {
                //loaded dialog is no longer a dialog
                if (Pcc.getExport(Dialog.MyIndex).ClassName != "BioConversation")
                {
                    listBox1.Items.Clear();
                    listBox2.Items.Clear();
                    listBox3.Items.Clear();
                    listBox4.Items.Clear();
                    listBox5.Items.Clear();
                    treeView1.Nodes.Clear();
                    treeView2.Nodes.Clear();
                }
                else
                {
                    Dialog = new ME1BioConversation(Pcc as ME1Package, Dialog.MyIndex);
                    RefreshTabs();
                }
                updatedExports.Remove(Dialog.MyIndex);
            }
            if (updatedExports.Intersect(Objs).Count() > 0)
            {
                Objs = new List <int>();
                for (int i = 0; i < Pcc.Exports.Count; i++)
                {
                    if (Pcc.Exports[i].ClassName == "BioConversation")
                    {
                        Objs.Add(i);
                    }
                }
                RefreshCombo();
            }
            else
            {
                foreach (var i in updatedExports)
                {
                    if (Pcc.getExport(i).ClassName == "BioConversation")
                    {
                        Objs = new List <int>();
                        for (int j = 0; j < Pcc.Exports.Count; j++)
                        {
                            if (Pcc.Exports[j].ClassName == "BioConversation")
                            {
                                Objs.Add(j);
                            }
                        }
                        RefreshCombo();
                        break;
                    }
                }
            }
        }
예제 #8
0
        public void SaveFile()
        {
            if (Pcc == null)
            {
                return;
            }

            if (CodexMapControl != null)
            {
                if (CodexMapView.TryFindCodexMap(Pcc, out IExportEntry export, out int _))
                {
                    using (var stream = new MemoryStream())
                    {
                        var codexMap       = CodexMapControl.ToCodexMap();
                        var binaryCodexMap = new BinaryBioCodexMap(codexMap.Sections, codexMap.Pages);

                        binaryCodexMap.Save(stream);

                        export.setBinaryData(stream.ToArray());
                    }
                }
            }

            if (QuestMapControl != null)
            {
                if (QuestMapControl.TryFindQuestMap(Pcc, out IExportEntry export, out int _))
                {
                    using (var stream = new MemoryStream())
                    {
                        var questMap       = QuestMapControl.ToQuestMap();
                        var binaryQuestMap = new BinaryBioQuestMap(questMap.Quests, questMap.BoolTaskEvals, questMap.IntTaskEvals, questMap.FloatTaskEvals);

                        binaryQuestMap.Save(stream);

                        export.setBinaryData(stream.ToArray());
                    }
                }
            }

            if (StateEventMapControl != null)
            {
                if (StateEventMapView.TryFindStateEventMap(Pcc, out IExportEntry export))
                {
                    using (var stream = new MemoryStream())
                    {
                        var stateEventMap       = StateEventMapControl.ToStateEventMap();
                        var binaryStateEventMap = new BinaryBioStateEventMap(stateEventMap.StateEvents);

                        binaryStateEventMap.Save(stream);

                        export.setBinaryData(stream.ToArray());
                    }
                }
            }

            Pcc.save();
        }
예제 #9
0
 private void saveToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (Pcc == null)
     {
         return;
     }
     Pcc.save();
     MessageBox.Show("Done");
 }
예제 #10
0
 private void Save_Executed(object sender, ExecutedRoutedEventArgs e)
 {
     if (Pcc != null)
     {
         SaveChanges();
         Pcc.save();
         MessageBox.Show("Done!");
     }
 }
예제 #11
0
 private void savePCCToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (Pcc == null)
     {
         return;
     }
     Pcc.save();
     MessageBox.Show("Done.", "Meshplorer", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
 }
예제 #12
0
 private void saveChangesToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (Dialog == null)
     {
         return;
     }
     Dialog.Save();
     Pcc.save();
     MessageBox.Show("Done.");
 }
예제 #13
0
        private void savePccToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveFileDialog d = new SaveFileDialog {
                Filter = "*.pcc|*.pcc"
            };

            if (d.ShowDialog() == DialogResult.OK)
            {
                Pcc.save(d.FileName);
                MessageBox.Show("Done.");
            }
        }
예제 #14
0
 public BinaryInterpreterHost(string fileName, int index)
 {
     InitializeComponent();
     LoadMEPackage(fileName);
     interpreter1.Pcc    = Pcc;
     interpreter1.export = Pcc.getExport(index);
     interpreter1.InitInterpreter();
     toolStripStatusLabel1.Text         = "Class: " + interpreter1.export.ClassName + ", Export Index: " + index;
     toolStripStatusLabel2.Text         = "@" + Path.GetFileName(Pcc.FileName);
     interpreter1.hb1.ReadOnly          = true;
     interpreter1.saveHexButton.Visible = false;
     interpreter1.exportButton.Visible  = true;
 }
        private void SavePackageAs()
        {
            string         extension = Path.GetExtension(Pcc.FileName);
            SaveFileDialog d         = new SaveFileDialog {
                Filter = $"*{extension}|*{extension}"
            };

            if (d.ShowDialog() == true)
            {
                Pcc.save(d.FileName);
                MessageBox.Show("Done");
            }
        }
예제 #16
0
        private void toEntrysReplyListToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode t = treeView1.SelectedNode;

            if (t == null || t.Parent == null)
            {
                return;
            }
            TreeNode p = t.Parent;
            int      Index;
            int      SubIndx = -1;

            if (p.Parent == null)
            {
                Index = p.Index;
            }
            else
            {
                Index   = p.Parent.Index;
                SubIndx = t.Index;
            }
            ME1BioConversation.EntryListStuct el = Dialog.EntryList[Index];
            AddReply ar = new AddReply();

            ar.pcc = Pcc as ME1Package;
            if (SubIndx != -1)
            {
                ME1BioConversation.EntryListReplyListStruct tr = el.ReplyList[SubIndx];
                ar.textBox1.Text          = tr.Paraphrase;
                ar.textBox2.Text          = tr.refParaphrase.ToString();
                ar.comboBox1.SelectedItem = Pcc.getNameEntry(tr.CategoryValue);
                ar.textBox4.Text          = tr.Index.ToString();
            }
            ar.Show();
            while (ar.state == 0)
            {
                Application.DoEvents();
            }
            ar.Close();
            if (ar.state == -1)
            {
                return;
            }
            if (el.ReplyList == null)
            {
                el.ReplyList = new List <ME1BioConversation.EntryListReplyListStruct>();
            }
            el.ReplyList.Add(ar.res);
            Dialog.EntryList[Index] = el;
            Dialog.Save();
        }
예제 #17
0
        private void SaveAsCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            SaveFileDialog d         = new SaveFileDialog();
            string         extension = System.IO.Path.GetExtension(pcc.FileName);

            d.Filter = $"*{extension}|*{extension}";
            bool?result = d.ShowDialog();

            if (result.HasValue && result.Value)
            {
                Pcc.save(d.FileName);
                MessageBox.Show("Done");
            }
        }
예제 #18
0
        private void dumpBinaryToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            int n;

            if (stm != null)
            {
                n = stm.Export.UIndex; //TODO: CHANGE FOR UINDEXING
            }
            else if (skm != null)
            {
                n = skm.Export.UIndex;
            }
            else
            {
                return;
            }

            ExportEntry export = Pcc.GetUExport(n);

            if (export.ClassName == "StaticMesh")
            {
                SaveFileDialog d = new SaveFileDialog();
                d.Filter   = "*.bin|*.bin";
                d.FileName = export.ObjectName.Instanced + ".bin";
                if (d.ShowDialog() == DialogResult.OK)
                {
                    FileStream fs = new FileStream(d.FileName, FileMode.Create, FileAccess.Write);
                    fs.WriteFromBuffer(export.getBinaryData());
                    fs.Close();
                    MessageBox.Show("Done.", "Meshplorer", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
                }
            }
            if (export.ClassName == "SkeletalMesh")
            {
                SaveFileDialog d = new SaveFileDialog();
                d.Filter   = "*.bin|*.bin";
                d.FileName = export.ObjectName.Instanced + ".bin";
                if (d.ShowDialog() == DialogResult.OK)
                {
                    using (FileStream fs = new FileStream(d.FileName, FileMode.Create, FileAccess.Write))
                    {
                        var data = export.getBinaryData();
                        fs.Write(data, 0, data.Length);
                    }

                    MessageBox.Show("Done.", "Meshplorer", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
                }
            }
        }
예제 #19
0
        private void hircHexbox_SelectionChanged(object sender, EventArgs e)
        {
            DynamicByteProvider hbp = hircHexBox.ByteProvider as DynamicByteProvider;

            byte[] memory = hbp.Bytes.ToArray();
            int    start  = (int)hircHexBox.SelectionStart;
            int    len    = (int)hircHexBox.SelectionLength;
            int    size   = (int)hircHexBox.ByteProvider.Length;

            try
            {
                if (memory.Length > 0 && start != -1 && start < size)
                {
                    string s = $"Byte: {memory[start]}"; //if selection is same as size this will crash.
                    if (start <= memory.Length - 4)
                    {
                        int val = BitConverter.ToInt32(memory, start);
                        s += $", Int: {val} (0x{val.ToString("X8")})";
                        if (Pcc.isName(val))
                        {
                            s += $", Name: {Pcc.getNameEntry(val)}";
                        }
                        if (Pcc.getEntry(val) is IExportEntry exp)
                        {
                            s += $", Export: {exp.ObjectName}";
                        }
                        else if (Pcc.getEntry(val) is ImportEntry imp)
                        {
                            s += $", Import: {imp.ObjectName}";
                        }
                    }
                    s += $" | Start=0x{start.ToString("X8")} ";
                    if (len > 0)
                    {
                        s += $"Length=0x{len.ToString("X8")} ";
                        s += $"End=0x{(start + len - 1).ToString("X8")}";
                    }
                    hircHexboxStatusLabel.Text = s;
                }
                else
                {
                    hircHexboxStatusLabel.Text = "Nothing Selected";
                }
            }
            catch (Exception)
            {
            }
        }
예제 #20
0
        public string GetDisplayableValue()
        {
            switch (Type)
            {
            case TYPE_INT:
                return(BitConverter.ToInt32(Data, 0).ToString());

            case TYPE_NAME:
                int name = BitConverter.ToInt32(Data, 0);
                return(Pcc.getNameEntry(name));

            case TYPE_FLOAT:
                return(BitConverter.ToSingle(Data, 0).ToString());
            }
            return("Unknown type " + Type);
        }
예제 #21
0
        private void serializeToFileToolStripMenuItem_Click(object sender, EventArgs e)
        {
            int n;

            if (stm != null)
            {
                n = stm.Export.UIndex; //TODO: CHANGE FOR UINDEXING
            }
            else if (skm != null)
            {
                n = skm.Export.UIndex;
            }
            else
            {
                return;
            }
            if (Pcc.GetUExport(n).ClassName == "StaticMesh")
            {
                SaveFileDialog d = new SaveFileDialog();
                d.Filter   = "*.bin|*.bin";
                d.FileName = Pcc.GetUExport(n).ObjectName.Instanced + ".bin";
                if (d.ShowDialog() == DialogResult.OK)
                {
                    //DISABLED TEMP
                    //stm.SerializeToFile(d.FileName);
                    MessageBox.Show("Done.", "Meshplorer", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
                }
            }
            if (Pcc.GetUExport(n).ClassName == "SkeletalMesh")
            {
                SaveFileDialog d = new SaveFileDialog();
                d.Filter   = "*.bin|*.bin";
                d.FileName = Pcc.GetUExport(n).ObjectName.Instanced + ".bin";
                if (d.ShowDialog() == DialogResult.OK)
                {
                    SerializingContainer c = new SerializingContainer();
                    c.Memory    = new MemoryStream();
                    c.isLoading = false;
                    skm.Serialize(c);
                    FileStream fs = new FileStream(d.FileName, FileMode.Create, FileAccess.Write);
                    fs.Write(c.Memory.ToArray(), 0, (int)c.Memory.Length);
                    fs.Close();
                    MessageBox.Show("Done.", "Meshplorer", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
                }
            }
        }
예제 #22
0
        public void LoadSkeletalMesh(int uindex)
        {
            DisableLODs();
            UnCheckLODs();
            try
            {
                skm = new SkeletalMesh(Pcc.GetUExport(uindex));

                // Load preview model
                preview?.Dispose();
                preview = new ModelPreview(view.Context.Device, skm, view.Context.TextureCache);
                RefreshChosenMaterialsList();
                CenterView();

                // Update treeview
                treeView1.BeginUpdate();
                treeView1.Nodes.Clear();
                treeView1.Nodes.Add(skm.ToTree());
                treeView1.Nodes[0].Expand();
                treeView1.EndUpdate();
                lODToolStripMenuItem.Visible  = true;
                lOD0ToolStripMenuItem.Enabled = true;
                lOD0ToolStripMenuItem.Checked = true;
                if (skm.LODModels.Count > 1)
                {
                    lOD1ToolStripMenuItem.Enabled = true;
                }
                if (skm.LODModels.Count > 2)
                {
                    lOD2ToolStripMenuItem.Enabled = true;
                }
                if (skm.LODModels.Count > 3)
                {
                    lOD3ToolStripMenuItem.Enabled = true;
                }
                MaterialBox.Visible              = false;
                MaterialApplyButton.Visible      = false;
                MaterialIndexBox.Visible         = false;
                MaterialIndexApplyButton.Visible = false;
            }
            catch (Exception e)
            {
                MessageBox.Show(ExceptionHandlerDialogWPF.FlattenException(e));
            }
        }
예제 #23
0
        public override void handleUpdate(List <PackageUpdate> updates)
        {
            IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import &&
                                                                        x.change != PackageChange.ImportAdd &&
                                                                        x.change != PackageChange.Names);
            List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList();

            if (FaceFX != null && updatedExports.Contains(FaceFX.Export.Index))
            {
                int index = FaceFX.Export.Index;
                //loaded FaceFXAnimset is no longer a FaceFXAnimset
                if (FaceFX.Export.ClassName != "FaceFXAnimSet")
                {
                    selectedLine = null;
                    FaceFX       = null;
                    treeView.Nodes.Clear();
                    linesListBox.ItemsSource     = null;
                    animationListBox.ItemsSource = null;
                    graph.Clear();
                }
                else if (!this.IsForegroundWindow())
                {
                    loadFaceFXAnimset();
                }
                updatedExports.Remove(index);
            }
            if (updatedExports.Intersect(animSets.Select(x => x.Index)).Any())
            {
                RefreshComboBox();
            }
            else
            {
                foreach (var i in updatedExports)
                {
                    if (Pcc.getExport(i).ClassName == "FaceFXAnimSet")
                    {
                        RefreshComboBox();
                        break;
                    }
                }
            }
        }
예제 #24
0
        public override void handleUpdate(List <PackageUpdate> updates)
        {
            IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import &&
                                                                        x.change != PackageChange.ImportAdd &&
                                                                        x.change != PackageChange.Names);
            List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList();

            if (FaceFX != null && updatedExports.Contains(FaceFX.export.Index))
            {
                int index = FaceFX.export.Index;
                //loaded FaceFXAnimset is no longer a FaceFXAnimset
                if (FaceFX.export.ClassName != "FaceFXAnimSet")
                {
                    FaceFX = null;
                    treeView1.Nodes.Clear();
                    treeView2.Nodes.Clear();
                    hb1.ByteProvider = new DynamicByteProvider();
                    ListRefresh();
                }
                else
                {
                    FaceFXRefresh(index);
                }
                updatedExports.Remove(index);
            }
            if (updatedExports.Intersect(Objects).Any())
            {
                ListRefresh();
            }
            else
            {
                foreach (var i in updatedExports)
                {
                    if (Pcc.getExport(i).ClassName == "FaceFXAnimSet")
                    {
                        ListRefresh();
                        break;
                    }
                }
            }
        }
예제 #25
0
 private void dEBUGAddAPropertyToExportsMatchingCriteriaToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (Pcc != null)
     {
         int count = 0;
         foreach (IExportEntry exp in Pcc.Exports)
         {
             if (exp.ObjectName == "StaticMeshCollectionActor")
             {
                 var smas = exp.GetProperty <ArrayProperty <ObjectProperty> >("StaticMeshComponents");
                 foreach (ObjectProperty item in smas)
                 {
                     var export = Pcc.getExport(item.Value - 1);
                     var props  = export.GetProperties();
                     props.AddOrReplaceProp(new BoolProperty(false, "bUsePrecomputedShadows"));
                     export.WriteProperties(props);
                     count++;
                 }
             }
         }
         System.Windows.MessageBox.Show($"Done. Updated {count} exports.");
     }
 }
예제 #26
0
 public void RefreshChosenMaterialsList()
 {
     ChosenMaterials.Clear();
     MaterialIndexBox.Items.Clear();
     if (skm != null)
     {
         for (int i = 0; i < skm.Materials.Count; i++)
         {
             ChosenMaterials.Add(skm.Materials[i]);
             string desc = "";
             if (skm.Materials[i] > 0)
             { // Material is export
                 IExportEntry export = Pcc.getExport(skm.Materials[i] - 1);
                 desc = " Export #" + skm.Materials[i] + " : " + export.ObjectName;
             }
             else if (skm.Materials[i] < 0)
             { // Material is import???
                 desc = "Import #" + -skm.Materials[i];
             }
             MaterialIndexBox.Items.Add(i + " - " + desc);
         }
     }
 }
예제 #27
0
        public override void handleUpdate(List <PackageUpdate> updates)
        {
            IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import &&
                                                                        x.change != PackageChange.ImportAdd &&
                                                                        x.change != PackageChange.Names);
            List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList();

            if (updatedExports.Contains(timeline.GroupList.index))
            {
                //loaded InterpData is no longer an InterpData
                if (Pcc.getExport(timeline.GroupList.index).ClassName != "InterpData")
                {
                    //?
                }
                else
                {
                    timeline.GroupList.LoadInterpData(timeline.GroupList.index, Pcc as ME3Package);
                }
                updatedExports.Remove(timeline.GroupList.index);
            }
            if (updatedExports.Intersect(objects).Count() > 0)
            {
                RefreshCombo();
            }
            else
            {
                foreach (var i in updatedExports)
                {
                    if (Pcc.getExport(i).ClassName == "InterpData")
                    {
                        RefreshCombo();
                        break;
                    }
                }
            }
        }
예제 #28
0
        public void SaveFile(string filepath = null)
        {
            if (Pcc == null)
            {
                return;
            }

            if (CodexMapControl != null)
            {
                if (CodexMapView.TryFindCodexMap(Pcc, out ExportEntry export, out int _))
                {
                    using (var stream = new MemoryStream())
                    {
                        var codexMap       = CodexMapControl.ToCodexMap();
                        var binaryCodexMap = new BinaryBioCodexMap(codexMap.Sections, codexMap.Pages);

                        binaryCodexMap.Save(stream);

                        export.WriteBinary(stream.ToArray());
                    }
                }
            }

            if (QuestMapControl != null)
            {
                if (QuestMapControl.TryFindQuestMap(Pcc, out ExportEntry export, out int _))
                {
                    using (var stream = new MemoryStream())
                    {
                        var questMap       = QuestMapControl.ToQuestMap();
                        var binaryQuestMap = new BinaryBioQuestMap(questMap.Quests, questMap.BoolTaskEvals, questMap.IntTaskEvals, questMap.FloatTaskEvals);

                        binaryQuestMap.Save(stream);

                        export.WriteBinary(stream.ToArray());
                    }
                }
            }

            if (StateEventMapControl != null)
            {
                if (StateEventMapView.TryFindStateEventMap(Pcc, out ExportEntry export))
                {
                    using (var stream = new MemoryStream())
                    {
                        var stateEventMap       = StateEventMapControl.ToStateEventMap();
                        var binaryStateEventMap = new BinaryBioStateEventMap(stateEventMap.StateEvents);

                        binaryStateEventMap.Save(stream);

                        export.WriteBinary(stream.ToArray());
                    }
                }
            }

            if (ConsequenceMapControl != null)
            {
                if (StateEventMapView.TryFindStateEventMap(Pcc, out ExportEntry export, "ConsequenceMap"))
                {
                    using (var stream = new MemoryStream())
                    {
                        var consequenceMap       = ConsequenceMapControl.ToStateEventMap();
                        var binaryConsequenceMap = new BinaryBioStateEventMap(consequenceMap.StateEvents);

                        binaryConsequenceMap.Save(stream);

                        export.WriteBinary(stream.ToArray());
                    }
                }
            }

            if (filepath == null)
            {
                filepath = Pcc.FilePath;
            }

            Pcc.Save(filepath);
        }
 private void SavePackage()
 {
     Pcc.save();
 }
예제 #30
0
        public override void handleUpdate(List <PackageUpdate> updates)
        {
            IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import &&
                                                                        x.change != PackageChange.ImportAdd &&
                                                                        x.change != PackageChange.Names);
            List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList();

            if (skm != null && updatedExports.Contains(skm.MyIndex))
            {
                int index = skm.MyIndex;
                //loaded SkeletalMesh is no longer a SkeletalMesh
                if (Pcc.getExport(index).ClassName != "SkeletalMesh")
                {
                    skm = null;
                    preview?.Dispose();
                    preview = null;
                    treeView1.Nodes.Clear();
                    RefreshMeshList();
                }
                else
                {
                    LoadSkeletalMesh(index);
                }
                updatedExports.Remove(index);
            }
            else if (stm != null && updatedExports.Contains(stm.index))
            {
                int index = stm.index;
                //loaded SkeletalMesh is no longer a SkeletalMesh
                if (Pcc.getExport(index).ClassName != "StaticMesh")
                {
                    stm = null;
                    preview?.Dispose();
                    preview = null;
                    treeView1.Nodes.Clear();
                    RefreshMeshList();
                }
                else
                {
                    LoadStaticMesh(index);
                }
                updatedExports.Remove(index);
            }
            if (updatedExports.Intersect(Materials).Count() > 0)
            {
                RefreshMaterialList();
            }
            else
            {
                foreach (var i in updatedExports)
                {
                    string className = Pcc.getExport(i).ClassName;
                    if (className == "MaterialInstanceConstant" || className == "Material")
                    {
                        RefreshMaterialList();
                        break;
                    }
                }
            }
            if (updatedExports.Intersect(Objects).Count() > 0)
            {
                RefreshMeshList();
            }
            else
            {
                foreach (var i in updatedExports)
                {
                    string className = Pcc.getExport(i).ClassName;
                    if (className == "SkeletalMesh" || className == "StaticMesh")
                    {
                        RefreshMeshList();
                        break;
                    }
                }
            }
        }