Пример #1
0
        protected GenericRcol LoadTXTR(GenericRcol txmt)
        {
            if (txmt == null)
            {
                return(null);
            }

            try
            {
                MaterialDefinition md       = (MaterialDefinition)txmt.Blocks[0];
                string             txtrname = md.FindProperty("stdMatBaseTextureName").Value.Trim().ToLower();
                if (!txtrname.EndsWith("_txtr"))
                {
                    txtrname += "_txtr";
                }

                Interfaces.Scenegraph.IScenegraphFileIndexItem item = FileTable.FileIndex.FindFileByName(txtrname, Data.MetaData.TXTR, Data.MetaData.LOCAL_GROUP, true);
                if (item != null)
                {
                    SimPe.Plugin.GenericRcol rcol = new GenericRcol(null, false);
                    rcol.ProcessData(item, false);

                    return(rcol);
                }
            }
            catch {}

            return(null);
        }
Пример #2
0
        /// <summary>
        /// Create a clone of the Descriptor, so changes won't affect the source Package anymore!
        /// </summary>
        /// <param name="item">Clone the Descriptor in this Item</param>
        public static void Clone(Interfaces.Scenegraph.IScenegraphFileIndexItem item)
        {
            SimPe.Packages.PackedFileDescriptor pfd = new SimPe.Packages.PackedFileDescriptor();
            pfd.Type         = item.FileDescriptor.Type;
            pfd.Group        = item.FileDescriptor.Group;
            pfd.LongInstance = item.FileDescriptor.LongInstance;

            pfd.Offset = item.FileDescriptor.Offset;
            pfd.Size   = item.FileDescriptor.Size;

            pfd.UserData = item.FileDescriptor.UserData;

            item.FileDescriptor = pfd;
        }
Пример #3
0
        /// <summary>
        /// Load a ANIM Resource
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        protected ArrayList LoadAnim(string name)
        {
            ArrayList anim = new ArrayList();

            name = name.Trim().ToLower();
            if (!name.EndsWith("_anim"))
            {
                name += "_anim";
            }

            Interfaces.Scenegraph.IScenegraphFileIndexItem item = FileTable.FileIndex.FindFileByName(name, Data.MetaData.ANIM, Data.MetaData.LOCAL_GROUP, true);
            if (item != null)
            {
                anim.Add(item);
            }

            return(anim);
        }
Пример #4
0
        /// <summary>
        /// Load all pending CRES Files
        /// </summary>
        /// <param name="modelnames"></param>
        /// <returns></returns>
        protected ArrayList LoadCres(string[] modelnames)
        {
            ArrayList cres = new ArrayList();

            for (int i = 0; i < modelnames.Length; i++)
            {
                modelnames[i] = modelnames[i].Trim().ToLower();
                if (!modelnames[i].EndsWith("_cres"))
                {
                    modelnames[i] += "_cres";
                }
                Interfaces.Scenegraph.IScenegraphFileIndexItem item = FileTable.FileIndex.FindFileByName(modelnames[i], Data.MetaData.CRES, Data.MetaData.LOCAL_GROUP, true);
                //Clone(item);

                if (item != null)
                {
                    cres.Add(item);
                }
            }

            return(cres);
        }
Пример #5
0
 public void ProcessData(Interfaces.Scenegraph.IScenegraphFileIndexItem item, bool catchex)
 {
     ProcessData(item.FileDescriptor, item.Package, catchex);
 }
Пример #6
0
 public void ProcessData(Interfaces.Scenegraph.IScenegraphFileIndexItem item)
 {
     ProcessData(item, true);
 }
Пример #7
0
        void ProduceByXObj(uint type)
        {
            ArrayList pitems = new ArrayList();
            ArrayList groups = new ArrayList();
            int       ct     = 0;

            //this is the first part loading by objd Resources
            Interfaces.Scenegraph.IScenegraphFileIndexItem[] nrefitems = FileTable.FileIndex.Sort(FileTable.FileIndex.FindFile(type, true));
            string len = " / " + nrefitems.Length.ToString();

            SimPe.Data.MetaData.Languages deflang = Helper.WindowsRegistry.LanguageCode;
            Wait.Message     = "Loading Walls, Fences and Floors";
            Wait.MaxProgress = nrefitems.Length;
            foreach (Interfaces.Scenegraph.IScenegraphFileIndexItem lnrefitem in nrefitems)
            {
                ct++;
                Interfaces.Scenegraph.IScenegraphFileIndexItem nrefitem = lnrefitem;
                if (ct % 134 == 1)
                {
                    Wait.Progress = ct;
                }

#if MAC
                Console.WriteLine(ct.ToString() + len);
#endif

                //if (nrefitem.FileDescriptor.Instance != 0x41A7) continue;
                if (nrefitem.LocalGroup == Data.MetaData.LOCAL_GROUP)
                {
                    continue;
                }
                if (pitems.Contains(nrefitem))
                {
                    continue;
                }
                if (groups.Contains(nrefitem.FileDescriptor.Instance))
                {
                    continue;
                }


                //try to find the best objd



                Interfaces.Scenegraph.IScenegraphFileIndexItem[] cacheitems = cachefile.FileIndex.FindFile(nrefitem.FileDescriptor, nrefitem.Package);

                //find the correct File
                int    cindex = -1;
                string pname  = nrefitem.Package.FileName.Trim().ToLower();
                for (int i = 0; i < cacheitems.Length; i++)
                {
                    Interfaces.Scenegraph.IScenegraphFileIndexItem citem = cacheitems[i];

                    if (citem.FileDescriptor.Filename == pname)
                    {
                        cindex = i;
                        break;
                    }
                }

                if (cindex != -1)               //found in the cache
                {
                    SimPe.Cache.ObjectCacheItem oci = (SimPe.Cache.ObjectCacheItem)cacheitems[cindex].FileDescriptor.Tag;
                    if (!oci.Useable)
                    {
                        continue;
                    }
                    pitems.Add(nrefitem);
                    groups.Add(nrefitem.FileDescriptor.Instance);

                    oci.Tag = nrefitem;
                    this.AddToBuffer(oci);
                }
                else
                {
                    pitems.Add(nrefitem);
                    groups.Add(nrefitem.FileDescriptor.Instance);

                    SimPe.Cache.ObjectCacheItem oci = new SimPe.Cache.ObjectCacheItem();
                    oci.Tag     = nrefitem;
                    oci.Useable = false;
                    cachechg    = true;
                    cachefile.AddItem(oci, nrefitem.Package.FileName);

                    this.AddToBuffer(oci);
                }
            }
        }
Пример #8
0
        internal static bool DoConsume(Object o, ObjectLoader.LoadItemHandler LoadedItem, SimPe.Data.MetaData.Languages deflang)
        {
            SimPe.Cache.ObjectCacheItem oci = (SimPe.Cache.ObjectCacheItem)o;
            Interfaces.Scenegraph.IScenegraphFileIndexItem nrefitem = (Interfaces.Scenegraph.IScenegraphFileIndexItem)oci.Tag;


            //this item is new to the cache, so load the Data
            if ((!oci.Useable || oci.ObjectVersion != SimPe.Cache.ObjectCacheItemVersions.DockableOW) && nrefitem.FileDescriptor.Type == Data.MetaData.OBJD_FILE)
            {
                SimPe.PackedFiles.Wrapper.ExtObjd objd = new SimPe.PackedFiles.Wrapper.ExtObjd();
                nrefitem.FileDescriptor.UserData = nrefitem.Package.Read(nrefitem.FileDescriptor).UncompressedData;
                objd.ProcessData(nrefitem);

                oci.FileDescriptor     = nrefitem.FileDescriptor;
                oci.LocalGroup         = nrefitem.LocalGroup;
                oci.ObjectType         = objd.Type;
                oci.ObjectFunctionSort = (uint)objd.FunctionSubSort;
                oci.ObjectFileName     = objd.FileName;
                oci.Useable            = true;
                oci.Class = SimPe.Cache.ObjectClass.Object;

                //this is needed, so that objects get sorted into the right categories

                /*if (objd.Type == Data.ObjectTypes.Normal && objd.CTSSInstance==0)
                 * {
                 *      oci.Useable = false;
                 *      return true;
                 * }*/

                //Get the Name of the Object
                Interfaces.Scenegraph.IScenegraphFileIndexItem[] ctssitems = FileTable.FileIndex.FindFile(Data.MetaData.CTSS_FILE, nrefitem.LocalGroup);
                if (ctssitems.Length > 0)
                {
                    SimPe.PackedFiles.Wrapper.Str str = new SimPe.PackedFiles.Wrapper.Str();
                    str.ProcessData(ctssitems[0]);
                    SimPe.PackedFiles.Wrapper.StrItemList items = str.LanguageItems(deflang);
                    if (items.Length > 0)
                    {
                        oci.Name = items[0].Title;
                    }
                    else
                    {
                        items = str.LanguageItems(1);
                        if (items.Length > 0)
                        {
                            oci.Name = items[0].Title;
                        }
                        else
                        {
                            oci.Name = "";
                        }
                    }
                }
                else
                {
                    oci.Name = "";
                }

                if (oci.Name == "")
                {
                    oci.Name = objd.FileName;
                }

                //now the ModeName File
                Interfaces.Scenegraph.IScenegraphFileIndexItem[] txtitems = FileTable.FileIndex.FindFile(Data.MetaData.STRING_FILE, nrefitem.LocalGroup, 0x85, null);
                if (txtitems.Length > 0)
                {
                    SimPe.PackedFiles.Wrapper.Str str = new SimPe.PackedFiles.Wrapper.Str(2);
                    str.ProcessData(txtitems[0]);
                    SimPe.PackedFiles.Wrapper.StrItemList items = str.LanguageItems(1);
                    if (items.Length > 1)
                    {
                        oci.ModelName = items[1].Title;
                    }
                }

                ObjectReader.changedcache = true;
            }             //if not loaded from objd

            if ((!oci.Useable || oci.ObjectVersion != SimPe.Cache.ObjectCacheItemVersions.DockableOW) && nrefitem.FileDescriptor.Type != Data.MetaData.OBJD_FILE)
            {
                ConsumeFromXobj(oci, nrefitem, deflang);
            }

            if (oci.Thumbnail == null)
            {
                oci.Thumbnail = ObjectPreview.GetThumbnail(nrefitem.FileDescriptor.Group, oci.ModelName);

                if (oci.Thumbnail != null)
                {
                    Wait.Image = oci.Thumbnail;
                    ObjectReader.changedcache = true;
                }
            }

#if DEBUG
            Data.Alias a = new Data.Alias(oci.FileDescriptor.Group, "---");            //, "{name} ({id}: {1}, {2}) ");
#else
            Data.Alias a = new Data.Alias(oci.FileDescriptor.Group, "---");            //, "{name} ({id}: {1}) ");
#endif
            object[] os = new object[4];
            os[0] = nrefitem.FileDescriptor;
            os[1] = nrefitem.LocalGroup;
            os[2] = oci.ModelName;
            os[3] = oci;

            a.Tag = os;

            if (Helper.WindowsRegistry.ShowObjdNames)
            {
                a.Name = oci.ObjectFileName;
            }
            else
            {
                a.Name = oci.Name;
            }
            a.Name += " (cached)";
            Image img = oci.Thumbnail;

            if (LoadedItem != null)
            {
                LoadedItem(oci, nrefitem, a);
            }

            return(true);
        }
Пример #9
0
        static void ConsumeFromXobj(SimPe.Cache.ObjectCacheItem oci, Interfaces.Scenegraph.IScenegraphFileIndexItem nrefitem, SimPe.Data.MetaData.Languages deflang)
        {
            SimPe.PackedFiles.Wrapper.Cpf cpf = new SimPe.PackedFiles.Wrapper.Cpf();
            nrefitem.FileDescriptor.UserData = nrefitem.Package.Read(nrefitem.FileDescriptor).UncompressedData;
            cpf.ProcessData(nrefitem);

            oci.FileDescriptor = nrefitem.FileDescriptor;
            oci.LocalGroup     = nrefitem.LocalGroup;
            oci.ObjectType     = SimPe.Data.ObjectTypes.Normal;

            SetFunctionSortForXObj(cpf, oci);

            oci.ObjectFileName = cpf.GetSaveItem("filename").StringValue;
            if (oci.ObjectFileName == "")
            {
                oci.ObjectFileName = cpf.GetSaveItem("name").StringValue;
            }

            oci.Useable = true;
            oci.Class   = SimPe.Cache.ObjectClass.XObject;



            Interfaces.Scenegraph.IScenegraphFileIndexItem[] ctssitems = FileTable.FileIndex.FindFile(cpf.GetSaveItem("stringsetrestypeid").UIntegerValue, cpf.GetSaveItem("stringsetgroupid").UIntegerValue, cpf.GetSaveItem("stringsetid").UIntegerValue, null);             //Data.MetaData.STRING_FILE
            if (ctssitems.Length > 0)
            {
                SimPe.PackedFiles.Wrapper.Str str = new SimPe.PackedFiles.Wrapper.Str();
                str.ProcessData(ctssitems[0]);
                SimPe.PackedFiles.Wrapper.StrItemList items = str.LanguageItems(deflang);
                if (items.Length > 0)
                {
                    oci.Name = items[0].Title;
                }
                else
                {
                    items = str.LanguageItems(1);
                    if (items.Length > 0)
                    {
                        oci.Name = items[0].Title;
                    }
                    else
                    {
                        oci.Name = "";
                    }
                }
            }
            else
            {
                oci.Name = "";
            }

            if (oci.Name == "")
            {
                oci.Name = oci.ObjectFileName;
            }

            //now the ModeName File
            if (cpf.GetItem("texturetname") != null)
            {
                oci.ModelName = cpf.GetItem("texturetname").StringValue;
            }
            else if (cpf.GetItem("filename") != null)
            {
                oci.ModelName = cpf.GetItem("filename").StringValue;
            }
            else
            {
                oci.ModelName = cpf.GetSaveItem("material").StringValue;
            }

            //oci.Name = cpf.GetSaveItem("type").StringValue + " - "+ cpf.GetSaveItem("subsort").StringValue;


            if (oci.Thumbnail == null)
            {
                oci.Thumbnail = ObjectPreview.GetXThumbnail(cpf);
            }
            ObjectReader.changedcache = true;
        }
Пример #10
0
        protected override void Produce()
        {
            LoadCachIndex();
            changedcache = false;


            ArrayList pitems = new ArrayList();
            ArrayList groups = new ArrayList();
            int       ct     = 0;

            //this is the first part loading by objd Resources
            Interfaces.Scenegraph.IScenegraphFileIndexItem[] nrefitems = FileTable.FileIndex.Sort(FileTable.FileIndex.FindFile(Data.MetaData.OBJD_FILE, true));

            string len = " / " + nrefitems.Length.ToString();

            SimPe.Data.MetaData.Languages deflang = Helper.WindowsRegistry.LanguageCode;
            Wait.Message     = "Loading Objects";
            Wait.MaxProgress = nrefitems.Length;
            foreach (Interfaces.Scenegraph.IScenegraphFileIndexItem lnrefitem in nrefitems)
            {
                ct++;
                Interfaces.Scenegraph.IScenegraphFileIndexItem nrefitem = lnrefitem;
                if (ct % 134 == 1)
                {
                    Wait.Progress = ct;
                }

                //if (nrefitem.FileDescriptor.Instance != 0x41A7) continue;
                if (nrefitem.LocalGroup == Data.MetaData.LOCAL_GROUP)
                {
                    continue;
                }
                if (pitems.Contains(nrefitem))
                {
                    continue;
                }
                if (groups.Contains(nrefitem.LocalGroup))
                {
                    continue;
                }


                //try to find the best objd
                Interfaces.Scenegraph.IScenegraphFileIndexItem[] oitems = FileTable.FileIndex.FindFile(nrefitem.FileDescriptor.Type, nrefitem.LocalGroup);
                if (oitems.Length > 1)
                {
                    for (int i = 0; i < oitems.Length; i++)
                    {
                        if (oitems[i].FileDescriptor.Instance == 0x41A7 || oitems[i].FileDescriptor.Instance == 0x41AF)
                        {
                            nrefitem = oitems[i];
                            break;
                        }
                    }
                }



                Interfaces.Scenegraph.IScenegraphFileIndexItem[] cacheitems = cachefile.FileIndex.FindFile(nrefitem.FileDescriptor, nrefitem.Package);

                //find the correct File
                int    cindex = -1;
                string pname  = nrefitem.Package.FileName.Trim().ToLower();
                for (int i = 0; i < cacheitems.Length; i++)
                {
                    Interfaces.Scenegraph.IScenegraphFileIndexItem citem = cacheitems[i];

                    if (citem.FileDescriptor.Filename == pname)
                    {
                        cindex = i;
                        break;
                    }
                }

                if (cindex != -1)               //found in the cache
                {
                    SimPe.Cache.ObjectCacheItem oci = (SimPe.Cache.ObjectCacheItem)cacheitems[cindex].FileDescriptor.Tag;
                    if (!oci.Useable)
                    {
                        continue;
                    }
                    pitems.Add(nrefitem);
                    groups.Add(nrefitem.LocalGroup);

                    oci.Tag = nrefitem;
                    this.AddToBuffer(oci);
                }
                else
                {
                    pitems.Add(nrefitem);
                    groups.Add(nrefitem.LocalGroup);

                    SimPe.Cache.ObjectCacheItem oci = new SimPe.Cache.ObjectCacheItem();
                    oci.Tag     = nrefitem;
                    oci.Useable = false;
                    cachechg    = true;
                    cachefile.AddItem(oci, nrefitem.Package.FileName);

                    this.AddToBuffer(oci);
                }
            }

            if (Helper.WindowsRegistry.HiddenMode)
            {
                //In the second pass we use ObjectXml Resources to load Objects like Walls
                ProduceByXObj(Data.MetaData.XOBJ);
                ProduceByXObj(Data.MetaData.XROF);
                ProduceByXObj(Data.MetaData.XFLR);
                ProduceByXObj(Data.MetaData.XFNC);
                ProduceByXObj(Data.MetaData.XNGB);
            }
        }
Пример #11
0
        /// <summary>
        /// Load all pending Wallmask Files
        /// </summary>
        /// <param name="modelname"></param>
        /// <returns></returns>
        protected ArrayList LoadWallmask(string modelname)
        {
            ArrayList txmt = new ArrayList();

            //known types (based on a List created by Numenor)
            string[] list =
            {
                "0_0_0_n",                                                      //for all the straight doors/windows/arches
                "0_1s_0_s",                                                     //for all the straight doors/windows/arches
                "1e_0_0_n",                                                     //in addition to them, the 2-tile straight doors/windows/arches
                "1e_1s_0_s",                                                    //in addition to them, the 2-tile straight doors/windows/arches
                "0_0_0_nw",                                                     //all the diagonal doors/window/arches have
                "0_0_0_se",                                                     //all the diagonal doors/window/arches have
                "1e_1n_0_nw",                                                   // in addition to them, the 2-tile diagonals have
                "1e_1n_0_se"                                                    // in addition to them, the 2-tile diagonals have
            };

            modelname = modelname.Trim().ToLower();
            if (modelname.EndsWith("_cres"))
            {
                modelname = modelname.Substring(0, modelname.Length - 5);
            }

            //no Modelname => no Wallmask
            if (modelname == "")
            {
                return(txmt);
            }

            //this applies to all found NameMaps for TXTR Files
            ArrayList foundnames = new ArrayList();

            Interfaces.Scenegraph.IScenegraphFileIndexItem[] namemapitems = FileTable.FileIndex.FindFile(Data.MetaData.NAME_MAP, 0x52737256, Data.MetaData.TXMT, null);
            foreach (Interfaces.Scenegraph.IScenegraphFileIndexItem namemap in namemapitems)
            {
                SimPe.Plugin.Nmap nmap = new Nmap(null);
                nmap.ProcessData(namemap);

                foreach (NmapItem ni in nmap.Items)
                {
                    string name = ni.Filename.Trim().ToLower();
                    if (name.StartsWith(modelname) && name.EndsWith("_wallmask_txmt"))
                    {
                        Interfaces.Scenegraph.IScenegraphFileIndexItem item = FileTable.FileIndex.FindFileByName(name, Data.MetaData.TXMT, ni.Group, true);

                        if (item != null)
                        {
                            if (!foundnames.Contains(item.FileDescriptor))
                            {
                                foundnames.Add(item.FileDescriptor);
                                txmt.Add(item);
                            }
                        }
                    }
                }
            }

            /*foreach (string s in list)
             * {
             *      string nmn = modelname + "_" + s + "_wallmask_txmt";
             *
             *      Interfaces.Scenegraph.IScenegraphFileIndexItem item = FileTable.FileIndex.FindFileByName(nmn, Data.MetaData.TXMT, Data.MetaData.LOCAL_GROUP, true);
             *
             *      if (item!=null) txmt.Add(item);
             * }*/

            return(txmt);
        }
Пример #12
0
        private void ImportFiles(object sender, System.EventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;

            //first find the highest Instance of a BHAV, BCON in the package
            Interfaces.Files.IPackedFileDescriptor[] pfds = package.FindFiles(Data.MetaData.BHAV_FILE);
            uint maxbhavinst = 0x1000;

            foreach (Interfaces.Files.IPackedFileDescriptor pfd in pfds)
            {
                if ((pfd.Instance < 0x2000) && (pfd.Instance > maxbhavinst))
                {
                    maxbhavinst = pfd.Instance;
                }
            }
            Hashtable bhavalias = new Hashtable();

            maxbhavinst++;

            //her is the BCOn part
            pfds = package.FindFiles(0x42434F4E);
            uint maxbconinst = 0x1000;

            foreach (Interfaces.Files.IPackedFileDescriptor pfd in pfds)
            {
                if ((pfd.Instance < 0x2000) && (pfd.Instance > maxbconinst))
                {
                    maxbconinst = pfd.Instance;
                }
            }
            Hashtable bconalias = new Hashtable();

            maxbconinst++;


            ArrayList bhavs = new ArrayList();
            ArrayList ttabs = new ArrayList();

            package.BeginUpdate();
            try
            {
                for (int i = 0; i < lbfiles.Items.Count; i++)
                {
                    if (!lbfiles.GetItemChecked(i))
                    {
                        continue;
                    }
                    Interfaces.Scenegraph.IScenegraphFileIndexItem item = (Interfaces.Scenegraph.IScenegraphFileIndexItem)lbfiles.Items[i];
                    SimPe.Packages.PackedFileDescriptor            npfd = new SimPe.Packages.PackedFileDescriptor();
                    npfd.Type     = item.FileDescriptor.Type;
                    npfd.Group    = item.FileDescriptor.Group;
                    npfd.Instance = item.FileDescriptor.Instance;
                    npfd.SubType  = item.FileDescriptor.SubType;
                    npfd.UserData = item.Package.Read(item.FileDescriptor).UncompressedData;
                    package.Add(npfd);

                    if (npfd.Type == Data.MetaData.BHAV_FILE)
                    {
                        maxbhavinst++;
                        npfd.Group = 0xffffffff;
                        bhavalias[(ushort)npfd.Instance] = (ushort)maxbhavinst;
                        npfd.Instance = maxbhavinst;

                        SimPe.Plugin.Bhav bhav = new SimPe.Plugin.Bhav(prov.OpcodeProvider);
                        bhav.ProcessData(npfd, package);
                        if (cbname.Checked)
                        {
                            bhav.FileName = "[" + cbsemi.Text + "] " + bhav.FileName;
                        }
                        bhav.SynchronizeUserData();

                        bhavs.Add(bhav);
                    }
                    else if (npfd.Type == 0x42434F4E)                     //BCON
                    {
                        npfd.Instance = maxbconinst++;
                        npfd.Group    = 0xffffffff;
                        bconalias[(ushort)npfd.Instance] = (ushort)npfd.Instance;

                        SimPe.Plugin.Bcon bcon = new SimPe.Plugin.Bcon();
                        bcon.ProcessData(npfd, package);
                        if (cbname.Checked)
                        {
                            bcon.FileName = "[" + cbsemi.Text + "] " + bcon.FileName;
                        }
                        bcon.SynchronizeUserData();
                    }
                    else if (npfd.Type == 0x54544142)                      //TTAB
                    {
                        SimPe.Plugin.Ttab ttab = new SimPe.Plugin.Ttab(prov.OpcodeProvider);
                        ttab.ProcessData(npfd, package);

                        ttabs.Add(ttab);
                    }
                }

                if (cbfix.Checked)
                {
                    pfds = package.FindFiles(Data.MetaData.BHAV_FILE);
                    foreach (Interfaces.Files.IPackedFileDescriptor pfd in pfds)
                    {
                        SimPe.Plugin.Bhav bhav = new SimPe.Plugin.Bhav(prov.OpcodeProvider);
                        bhav.ProcessData(pfd, package);

                        bhavs.Add(bhav);
                    }

                    pfds = package.FindFiles(0x54544142);
                    foreach (Interfaces.Files.IPackedFileDescriptor pfd in pfds)
                    {
                        SimPe.Plugin.Ttab ttab = new SimPe.Plugin.Ttab(prov.OpcodeProvider);
                        ttab.ProcessData(pfd, package);

                        ttabs.Add(ttab);
                    }
                }

                //Relink all SemiGlobals in imported BHAV's
                foreach (SimPe.Plugin.Bhav bhav in bhavs)
                {
                    foreach (SimPe.PackedFiles.Wrapper.Instruction i in bhav)
                    {
                        if (bhavalias.Contains(i.OpCode))
                        {
                            i.OpCode = (ushort)bhavalias[i.OpCode];
                        }
                    }
                    bhav.SynchronizeUserData();
                }

                //Relink all TTAbs
                foreach (SimPe.Plugin.Ttab ttab in ttabs)
                {
                    foreach (SimPe.PackedFiles.Wrapper.TtabItem item in ttab)
                    {
                        if (bhavalias.Contains(item.Guardian))
                        {
                            item.Guardian = (ushort)bhavalias[item.Guardian];
                        }
                        if (bhavalias.Contains(item.Action))
                        {
                            item.Action = (ushort)bhavalias[item.Action];
                        }
                    }
                    ttab.SynchronizeUserData();
                }
            }
            finally
            {
                package.EndUpdate();
            }
            this.Cursor = Cursors.Default;
            Close();
        }