コード例 #1
0
        private void CreateOARFile(ImportSettings settings, string filename)
        {
            string rootDir = ExportCommand.dumpDir + "../oarfile/";

            OarFile.PrepareDir(rootDir);

            // Objects
            foreach (PrimToCreate parent in parents)
            {
                var ls = new Linkset()
                {
                    Parent = parent
                };
                parent.Link = ls;
                LocalScene.Links.Add(ls);
            }
            foreach (PrimToCreate ch in childs)
            {
                var pp = ch.ParentPrim;
                if (pp == null)
                {
                    continue;
                }
                pp.Link.ChildAdd(ch);
            }
            foreach (var ls in LockInfo.CopyOf(LocalScene.Links))
            {
                ls.Children.Sort(compareLocalIDs);
                if (ls.Parent.IsAsset)
                {
                    LocalScene.AssetLinks.Add(ls);
                    LocalScene.Links.Remove(ls);
                }
            }
            foreach (var ls in LocalScene.Links)
            {
                OarFile.SaveLinkset(ls, rootDir + "objects/" + ls.Parent.NewID + ArchiveConstants.ASSET_TYPE_TO_EXTENSION[AssetType.Object], false, settings);
            }
            // Assets
            foreach (ItemToCreate asset in LocalScene.Assets)
            {
                File.WriteAllBytes(rootDir + "assets/" + asset.OldID + ArchiveConstants.ASSET_TYPE_TO_EXTENSION[asset.AssetType], asset.AssetData);
            }
            foreach (var ls in LocalScene.AssetLinks)
            {
                OarFile.SaveLinkset(ls, rootDir + "assets/" + ls.Parent.NewID + ArchiveConstants.ASSET_TYPE_TO_EXTENSION[AssetType.Object], true, settings);
            }
            // Terrain
            if (settings.ContainsKey("terrain"))
            {
                ExportCommand.Exporting.SaveTerrainRaw32(rootDir + "terrains/heightmap.raw");
            }

            string parcelDirs = rootDir + "landdata/";

            Directory.CreateDirectory(parcelDirs);

            OarFile.PackageArchive(rootDir, filename, settings.ContainsKey("terrain"), settings.ContainsKey("land"));
        }
コード例 #2
0
        public static void SavePrims(DoubleDictionary <uint, UUID, Primitive> prims, string path, ImportSettings options)
        {
            // Delete all of the old linkset files
            try
            {
                Directory.Delete(path, true);
                Directory.CreateDirectory(path);
            }
            catch (Exception ex)
            {
                Logger.Log("Failed saving prims: " + ex.Message, Helpers.LogLevel.Error);
                return;
            }

            // Copy the double dictionary to a temporary list for iterating
            List <Primitive> primList = new List <Primitive>();

            prims.ForEach(delegate(Primitive prim)
            {
                primList.Add(prim);
            });

            foreach (Primitive p in primList)
            {
                if (p.ParentID == 0)
                {
                    Linkset linkset = new Linkset();
                    linkset.Parent = ImportCommand.Importing.APrimToCreate(p);

                    prims.ForEach(delegate(Primitive q)
                    {
                        if (q.ParentID == p.LocalID)
                        {
                            linkset.Children.Add(ImportCommand.Importing.APrimToCreate(q));
                        }
                    });

                    OarFile.SaveLinkset(linkset, path + "/Primitive_" + linkset.Parent.NewID.ToString() + ".xml", false,
                                        options);
                }
            }
        }
コード例 #3
0
        private void SaveParcelInfo(ImportSettings settings)
        {
            var CurSim = settings.CurSim;

            Client.Parcels.RequestAllSimParcels(CurSim);

            if (CurSim.IsParcelMapFull())
            {
                ParcelsDownloaded.Set();
            }

            if (ParcelsDownloaded.WaitOne(30000, false) && Client.Network.Connected)
            {
                Success(string.Format("Downloaded {0} Parcels in {1} " + Environment.NewLine, CurSim.Parcels.Count, CurSim.Name));
                IDictionary <int, Parcel> curSimParcels = null;
                lock (CurSim.Parcels.Dictionary)
                {
                    curSimParcels = LockInfo.CopyOf(CurSim.Parcels.Dictionary);
                }

                List <UUID> ParcelPrimOwners = new List <UUID>();
                List <uint> ParcelObjectIDS  = new List <uint>();
                foreach (KeyValuePair <int, Parcel> simParcel in curSimParcels)
                {
                    var parcel   = simParcel.Value;
                    int parcelID = parcel.LocalID;

                    Success(string.Format(
                                "Parcel[{0}]: Name: \"{1}\", Description: \"{2}\" ACLBlacklist Count: {3}, ACLWhiteList Count: {5} Traffic: {4}" +
                                Environment.NewLine,
                                parcel.LocalID, parcel.Name, parcel.Desc,
                                parcel.AccessBlackList.Count, parcel.Dwell,
                                parcel.AccessWhiteList.Count));
                    AddExportUser(parcel.OwnerID);
                    AddExportGroup(parcel.GroupID);

                    Success(Helpers.StructToString(parcel));
                    foreach (
                        ParcelManager.ParcelAccessEntry white in parcel.AccessWhiteList)
                    {
                        if (white.AgentID != UUID.Zero)
                        {
                            Success(string.Format(
                                        "\tAllowed Avatar {0}" + Environment.NewLine,
                                        white.AgentID));
                        }
                    }
                    foreach (
                        ParcelManager.ParcelAccessEntry black in parcel.AccessBlackList)
                    {
                        //    if(black.AgentID != UUID.Zero)
                        Success(string.Format("\t Banned Avatar {0}" + Environment.NewLine,
                                              black.AgentID));
                    }
                    {
                        AutoResetEvent parcelOwnerWait = new AutoResetEvent(false);

                        EventHandler <ParcelObjectOwnersReplyEventArgs> callback =
                            delegate(object sender, ParcelObjectOwnersReplyEventArgs e)
                        {
                            for (int i = 0; i < e.PrimOwners.Count; i++)
                            {
                                ParcelManager.ParcelPrimOwners ownerse = e.PrimOwners[i];
                                if (ownerse.IsGroupOwned)
                                {
                                    AddExportGroup(ownerse.OwnerID);
                                }
                                else
                                {
                                    AddExportUser(ownerse.OwnerID);
                                }
                                Success(string.Format("Owner: {0} Count: {1}" + Environment.NewLine,
                                                      ownerse.OwnerID, ownerse.Count));
                                if (!CogbotHelpers.IsNullOrZero(ownerse.OwnerID))
                                {
                                    ParcelPrimOwners.Add(ownerse.OwnerID);
                                }
                            }
                            parcelOwnerWait.Set();
                        };

                        Client.Parcels.ParcelObjectOwnersReply += callback;
                        try
                        {
                            Client.Parcels.RequestObjectOwners(CurSim, parcelID);
                            if (!parcelOwnerWait.WaitOne(10000, false))
                            {
                                Failure("Timed out waiting for packet.");
                            }
                        }
                        finally
                        {
                            Client.Parcels.ParcelObjectOwnersReply -= callback;
                        }
                    }
                    foreach (UUID ownerUUID in ParcelPrimOwners)
                    {
                        AutoResetEvent wait = new AutoResetEvent(false);
                        EventHandler <ForceSelectObjectsReplyEventArgs> callback = delegate(object sender, ForceSelectObjectsReplyEventArgs e)
                        {
                            ParcelObjectIDS.AddRange(e.ObjectIDs);

                            for (int i = 0; i < e.ObjectIDs.Count; i++)
                            {
                                // Success(string.Format(e.ObjectIDs[i].ToString() + " "));
                                // counter++;
                            }

                            if (e.ObjectIDs.Count < 251)
                            {
                                wait.Set();
                            }
                        };


                        Client.Parcels.ForceSelectObjectsReply += callback;
                        Client.Parcels.RequestSelectObjects(parcelID, (ObjectReturnType)16, ownerUUID);
                        wait.WaitOne(10000);
                    }
                }
                foreach (uint u in ParcelObjectIDS)
                {
                    RequiredForExportLocalIDs.Add(u);
                }
                Success("Parcel LocalIDs=" + ParcelObjectIDS.Count + " ParcelOwners=" + ParcelPrimOwners.Count);
            }
            else
            {
                Failure("Failed to retrieve information on all the simulator parcels");
            }

            string parcelDirs = settings.OarDir + "landdata/";

            Directory.CreateDirectory(parcelDirs);


            SimRegion r = SimRegion.GetRegion(CurSim);

            foreach (var p in r.ParcelMap)
            {
                Parcel parcel = p.Value;
                if (CogbotHelpers.IsNullOrZero(parcel.GlobalID))
                {
                    parcel.GlobalID = UUID.Random();
                }
                File.WriteAllText(parcelDirs + "" + parcel.GlobalID + ".xml", OarFile.Serialize(parcel));
            }
        }
コード例 #4
0
        /*
         * void texturePipeline_OnDownloadFinished(UUID id, bool success)
         * {
         *  if (success)
         *  {
         *      // Save this texture to the hard drive
         *      ImageDownload image = texturePipeline.GetTextureToRender(id);
         *      try
         *      {
         *          File.WriteAllBytes(directoryname + "/assets/" + id.ToString() + "_texture.jp2", image.AssetData);
         *          lock (texturesFinished) texturesFinished[id] = id;
         *      }
         *      catch (Exception ex)
         *      {
         *          Logger.Log("Failed to save texture: " + ex.Message, Helpers.LogLevel.Error);
         *      }
         *  }
         *  else
         *  {
         *      Logger.Log("Texture failed to download: " + id.ToString(), Helpers.LogLevel.Warning);
         *  }
         * }
         */
        void Run()
        {
            // Start the thread that monitors the queue of prims that need ObjectSelect packets sent
            Thread thread = new Thread(new ThreadStart(MonitorPrimsAwaitingSelect));

            thread.Start();

            while (running)
            {
                string command = Console.ReadLine();

                switch (command)
                {
                case "queue":
                    Logger.Log(String.Format("Client Outbox contains {0} packets, ObjectSelect queue contains {1} prims",
                                             client.Network.OutboxCount, primsAwaitingSelect.Count), Helpers.LogLevel.Info);
                    break;

                case "prims":
                    Logger.Log(String.Format("Prims captured: {0}, Total: {1}", prims.Count, totalPrims), Helpers.LogLevel.Info);
                    break;

                case "parcels":
                    if (!client.Network.CurrentSim.IsParcelMapFull())
                    {
                        Logger.Log("Downloading sim parcel information and prim totals", Helpers.LogLevel.Info);
                        client.Parcels.RequestAllSimParcels(client.Network.CurrentSim, false, 10);
                    }
                    else
                    {
                        Logger.Log("Sim parcel information has been retrieved", Helpers.LogLevel.Info);
                    }
                    break;

                case "camera":
                    Thread cameraThread = new Thread(new ThreadStart(MoveCamera));
                    cameraThread.Start();
                    Logger.Log("Started random camera movement thread", Helpers.LogLevel.Info);
                    break;

                case "movement":
                    Vector3 destination = RandomPosition();
                    Logger.Log("Teleporting to " + destination.ToString(), Helpers.LogLevel.Info);
                    client.Self.Teleport(client.Network.CurrentSim.Handle, destination, RandomPosition());
                    break;

                case "textures":
                    Logger.Log(String.Format("Current texture requests: {0}, queued texture requests: {1}, completed textures: {2}",
                                             texturePipeline.TransferCount, /*texturePipeline.QueuedCount*/ float.NaN, /*texturesFinished.Count*/ float.NaN), Helpers.LogLevel.Info);
                    break;

                case "terrain":
                    TerrainPatch[] patches = client.Network.CurrentSim.Terrain;
                    if (patches != null)
                    {
                        int count = 0;
                        for (int i = 0; i < patches.Length; i++)
                        {
                            if (patches[i] != null)
                            {
                                ++count;
                            }
                        }

                        Logger.Log(count + " terrain patches have been received for the current simulator", Helpers.LogLevel.Info);
                    }
                    else
                    {
                        Logger.Log("No terrain information received for the current simulator", Helpers.LogLevel.Info);
                    }
                    break;

                case "saveterrain":
                    patches = client.Network.CurrentSim.Terrain;
                    if (patches != null)
                    {
                        try
                        {
                            using (FileStream stream = new FileStream(directoryname + "/terrains/heightmap.r32", FileMode.Create, FileAccess.Write))
                            {
                                for (int y = 0; y < 256; y++)
                                {
                                    for (int x = 0; x < 256; x++)
                                    {
                                        int xBlock = x / 16;
                                        int yBlock = y / 16;
                                        int xOff   = x - (xBlock * 16);
                                        int yOff   = y - (yBlock * 16);

                                        TerrainPatch patch = patches[yBlock * 16 + xBlock];
                                        float        t     = 0f;

                                        if (patch != null)
                                        {
                                            t = patch.Data[yOff * 16 + xOff];
                                        }
                                        else
                                        {
                                            Logger.Log(String.Format("Skipping missing patch at {0},{1}", xBlock, yBlock),
                                                       Helpers.LogLevel.Warning);
                                        }

                                        stream.Write(BitConverter.GetBytes(t), 0, 4);
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.Log("Failed saving terrain: " + ex.Message, Helpers.LogLevel.Error);
                        }
                    }
                    else
                    {
                        Logger.Log("No terrain information received for the current simulator", Helpers.LogLevel.Info);
                    }
                    break;

                case "save":
                    Logger.Log(String.Format("Preparing to serialize {0} objects", prims.Count), Helpers.LogLevel.Info);
                    SavePrims(prims, directoryname + "/objects", importSettings);
                    Logger.Log("Saving " + directoryname, Helpers.LogLevel.Info);
                    OarFile.PackageArchive(directoryname, filename, true, false);
                    Logger.Log("Done", Helpers.LogLevel.Info);
                    break;

                case "quit":
                    End();
                    break;
                }
            }
        }
コード例 #5
0
        public CmdResult Execute(string[] args, UUID fromAgentID, OutputDelegate writeLine)
        {
            if (!IsLocalScene)
            {
                ExportCommand.IsExporting = false;
            }
            else
            {
                ExportCommand.IsExporting = true;
            }
            const string hlp = @"
            
            Toplevel Directives

            // todo  = shows what must be done for import to be complete (suggest adding verbose)
            // perms  = shows what perms are going to be a problem (suggest adding verbose)
            // clear - clear the export dir
            // reset - reset the exporter state
            // cache - blow away asset cache

            // prims [spec] - do only prims meeting spec (default is prims $region) 
            // incr - do only do what is 'todo'
            // nonincr - do things 'todo' but also 'redo' things already done

            // noperms = dont skip things when perms might be a problem
            // quietly = terser output
            // verbose = more verbose
            // request = will rerequest missing things like textures
            // force = will allow unequal LLSD files - this should only be used as last resort

            // users - load users files 
            // prims - load llsd files 
            // trees - load trees files 
            // terrain - load terrain files 
            // links - operate on linkset
            // tasks - save task files
            // taskobjs - task objects
            // all = users llsd tasks deps links (dl and taskobj not included)           
            ";

            if (args == null || args.Length == 0)
            {
                return(Failure(hlp));
            }
            ImportSettings importSettings = new ImportSettings();

            ExportCommand.Exporting.settings = importSettings;
            importSettings.GroupID           = (args.Length > 1) ? TheBotClient.GroupID : UUID.Zero;
            importSettings.CurSim            = Client.Network.CurrentSim;
            var arglist = importSettings;

            writeLine("Starting SimImport...");
            foreach (string s in args)
            {
                arglist.Add(s);
            }
            if (arglist.Contains("reoar"))
            {
                OarFile.PackageArchive("cog_export/oarfile/", "repack.oar", false, false);
                return(SuccessOrFailure());
            }
            if (arglist.Contains("nolldie"))
            {
                ReplaceLSLText(ExportCommand.assetDumpDir, "llDie()",
                               "llOwnerSay((string)llGetKey() + \",script caused die ,\" + llGetObjectName() + \",\" + (string)llGetPos() + \",\" + llGetScriptName() + \",\" + llGetLinkNumber())",
                               arglist);
                return(SuccessOrFailure());
            }
            if (arglist.Contains("hhp"))
            {
                //arglist.Add("keepmissing");
                //arglist.Add("all");
                //arglist.Add("oar");
                arglist.Add("fullperms");
                // arglist.Add("lslprims");
                //arglist.Add("request");
                //arglist.Add("KillMissing");
                arglist.Add("reztaskobj");
                arglist.Add("prim");
                arglist.Add("confirm");
                arglist.Add("link");
                arglist.Add("checktasks");
                arglist.Add("tasklsl");
            }
            bool doRez = false;

            if (arglist.Contains("all"))
            {
                //  arglist.Add("terrain");
                arglist.Add("asset");
                arglist.Add("user");
                arglist.Add("group");
                arglist.Add("prim");
                arglist.Add("confirm");
                arglist.Add("link");
                arglist.Add("task");
                arglist.Add("taskobj");
                arglist.Add("CountReady");
            }
            if (arglist.Contains("prim"))
            {
                doRez = true;
                arglist.Add("asset");
                arglist.Add("link");
            }
            if (arglist.Contains("nolink"))
            {
                arglist.Remove("link");
            }
            if (arglist.Contains("noasset"))
            {
                arglist.Remove("asset");
            }
            if (arglist.Contains("link"))
            {
                arglist.Add("confirm");
            }
            if (arglist.Contains("user") || arglist.Contains("group") || true)
            {
                LoadUsersAndGroups(arglist);
            }
            if (arglist.Contains("asset") || true)
            {
                UploadAllAssets(arglist);
            }
            GleanUUIDsFrom(GetAssetUploadsFolder());
            ScanForChangeList();
            if (arglist.Contains("terrain"))
            {
                UploadTerrain(importSettings);
            }
            WriteLine("NewAsset ChangeList Size is " + ChangeList.Count);

            if (arglist.Contains("confirm"))
            {
                ImportPTCFiles(importSettings, false, doRez);
            }
            if (arglist.Contains("prim"))
            {
                ImportPrims(importSettings, doRez);
            }
            if (doRez)
            {
                RezPrims(importSettings);
            }
            if (arglist.Contains("confirm"))
            {
                ConfirmLocalIDs(importSettings);
            }
            if (arglist.Contains("link"))
            {
                ImportLinks(importSettings);
            }
            if (arglist.Contains("move"))
            {
                MoveToKnownObjects();
                Success("Moving to " + _parents.Count);
            }
            bool tasksObjs = arglist.Contains("taskobj") && !IsLocalScene;

            if (tasksObjs || arglist.Contains("checktasks"))
            {
                ImportTaskObjects(importSettings);
            }
            if (arglist.Contains("task") || tasksObjs)
            {
                ImportTaskFiles(importSettings, tasksObjs);
            }
            GleanUUIDsFrom(GetAssetUploadsFolder());
            SaveMissingIDs();
            if (arglist.Contains("request"))
            {
                RequestMissingIDs(importSettings);
            }
            if (arglist.Contains("locate"))
            {
                LocatePrims(importSettings);
            }
            DivideTaskObjects(importSettings);
            if (arglist.Contains("killmissing"))
            {
                KillMissing(importSettings);
            }
            if (arglist.Contains("lslprims"))
            {
                ConfirmLSLPrims(importSettings);
            }
            if (arglist.Contains("todo"))
            {
                DoTodo(importSettings);
            }
            if (arglist.Contains("checktasks"))
            {
                CheckTasks(importSettings);
            }
            if (arglist.Contains("upackobjs"))
            {
                UnpackTaskObjs(importSettings);
            }
            if (arglist.Contains("oar"))
            {
                CreateOARFile(importSettings, "exported.oar");
            }
            if (arglist.Contains("CountReady"))
            {
                CountReady(importSettings);
            }
            if (arglist.Contains("cleanup"))
            {
                CleanupPrims(importSettings);
            }
            if (arglist.Contains("cleanuptasks"))
            {
                CleanupTasks(importSettings);
            }
            writeLine("Completed SimImport");
            return(SuccessOrFailure());
        }