public frmGroupInfo(Group group, SecondLife client) { InitializeComponent(); while (!IsHandleCreated) { // Force handle creation IntPtr temp = Handle; } GroupProfileCallback = new GroupManager.GroupProfileCallback(GroupProfileHandler); GroupMembersCallback = new GroupManager.GroupMembersCallback(GroupMembersHandler); GroupTitlesCallback = new GroupManager.GroupTitlesCallback(GroupTitlesHandler); AvatarNamesCallback = new AvatarManager.AvatarNamesCallback(AvatarNamesHandler); Group = group; Client = client; Assets = new AssetManager(Client); Assets.OnImageReceived += new AssetManager.ImageReceivedCallback(Assets_OnImageReceived); // Register the callbacks for this form Client.Groups.OnGroupProfile += GroupProfileCallback; Client.Groups.OnGroupMembers += GroupMembersCallback; Client.Groups.OnGroupTitles += GroupTitlesCallback; Client.Avatars.OnAvatarNames += AvatarNamesCallback; // Request the group information Client.Groups.BeginGetGroupProfile(Group.ID); Client.Groups.BeginGetGroupMembers(Group.ID); Client.Groups.BeginGetGroupTitles(Group.ID); }
/// <summary> /// Default constructor /// </summary> public SecondLife() { // These are order-dependant Network = new NetworkManager(this); Settings = new Settings(this); Parcels = new ParcelManager(this); Self = new AgentManager(this); Avatars = new AvatarManager(this); Friends = new FriendsManager(this); Grid = new GridManager(this); Objects = new ObjectManager(this); Groups = new GroupManager(this); Assets = new AssetManager(this); Appearance = new AppearanceManager(this, Assets); Inventory = new InventoryManager(this); Directory = new DirectoryManager(this); Terrain = new TerrainManager(this); Sound = new SoundManager(this); Throttle = new AgentThrottle(this); }
static void Main(string[] args) { if (args.Length != 8) { Console.WriteLine("Usage: importprimscript.exe [firstname] [lastname] [password] " + "[Simulator] [x] [y] [z] [input.primscript]" + Environment.NewLine + "Example: importprimscript.exe My Bot password " + "Hooper 128 128 40 maya-export" + Path.DirectorySeparatorChar + "ant.primscript"); Environment.Exit(-1); } // Strip quotes from any arguments for (int i = 0; i < args.Length; i++) args[i] = args[i].Trim(new char[] { '"' }); // Parse the primscript file string error; List<Sculpt> sculpties = ParsePrimscript(args[7], out error); // Check for parsing errors if (error != String.Empty) { Console.WriteLine("An error was encountered reading the input file: " + error); Environment.Exit(-2); } else if (sculpties.Count == 0) { Console.WriteLine("No primitives were read from the input file"); Environment.Exit(-3); } // Initialize libsecondlife Client = new SecondLife(); Assets = new AssetManager(Client); // Add callback handlers for asset uploads finishing. new prims spotted, and logging Assets.OnAssetUploaded += new AssetManager.AssetUploadedCallback(Assets_OnAssetUploaded); Client.Objects.OnNewPrim += new ObjectManager.NewPrimCallback(Objects_OnNewPrim); Client.OnLogMessage += new SecondLife.LogCallback(Client_OnLogMessage); // Optimize the connection for our purposes Client.Self.Status.Camera.Far = 32.0f; Client.Settings.MULTIPLE_SIMS = false; Client.Settings.SEND_AGENT_UPDATES = true; Client.Settings.ENABLE_CAPS = false; Client.Settings.DEBUG = false; Client.Settings.ENABLE_SIMSTATS = false; Client.Settings.ALWAYS_REQUEST_OBJECTS = true; Client.Settings.ALWAYS_DECODE_OBJECTS = true; Client.Throttle.Land = 0; Client.Throttle.Wind = 0; Client.Throttle.Cloud = 0; // Not sure if Asset or Texture will help with uploads, but it won't hurt Client.Throttle.Asset = 220000.0f; Client.Throttle.Texture = 446000.0f; Client.Throttle.Task = 446000.0f; int x = Int32.Parse(args[4]); int y = Int32.Parse(args[5]); int z = Int32.Parse(args[6]); string start = NetworkManager.StartLocation(args[3], x, y, z); // Attempt to login if (!Client.Network.Login(args[0], args[1], args[2], "importprimscript 1.0.0", start, "John Hurliman <*****@*****.**>")) { Console.WriteLine("Login failed: " + Client.Network.LoginMessage); Environment.Exit(-4); } // Wait a moment for the initial flood of packets to die down Console.WriteLine("Login succeeded, pausing for a moment..."); System.Threading.Thread.Sleep(1000 * 10); // Set the root position for the import RootPosition = Client.Self.Position; RootPosition.Z += 3.0f; for (int i = 0; i < sculpties.Count; i++) { // Upload the sculpt map and texture sculpties[i].SculptID = UploadImage(sculpties[i].SculptFile, true); sculpties[i].TextureID = UploadImage(sculpties[i].TextureFile, false); // Check for failed uploads if (sculpties[i].SculptID == LLUUID.Zero) { Client.Log("Sculpt map " + sculpties[i].SculptFile + " failed to upload, skipping " + sculpties[i].Name, Helpers.LogLevel.Warning); continue; } else if (sculpties[i].TextureID == LLUUID.Zero) { Client.Log("Texture " + sculpties[i].TextureFile + " failed to upload, skipping " + sculpties[i].Name, Helpers.LogLevel.Warning); continue; } LLObject.ObjectData prim = new LLObject.ObjectData(); prim.PCode = ObjectManager.PCode.Prim; prim.Material = LLObject.MaterialType.Wood; prim.PathScaleY = 0.5f; prim.PathCurve = 32; // Rez this prim CurrentSculpt = sculpties[i]; Client.Objects.AddPrim(Client.Network.CurrentSim, prim, LLUUID.Zero, RootPosition + CurrentSculpt.Offset, CurrentSculpt.Scale, LLQuaternion.Identity); // Wait for the prim to rez and the properties be set for it if (!RezzedEvent.WaitOne(1000 * 10, false)) { Console.WriteLine("Timed out waiting for prim " + CurrentSculpt.Name + " to rez, skipping"); continue; } } CurrentSculpt = null; lock (RezzedPrims) { // Set the permissions Client.Objects.SetPermissions(Client.Network.CurrentSim, RezzedPrims, PermissionWho.All, PermissionMask.All, true); // Link the object together Client.Objects.LinkPrims(Client.Network.CurrentSim, RezzedPrims); } Console.WriteLine("Rezzed, textured, and linked " + RezzedPrims.Count + " sculpted prims, logging out..."); Client.Network.Logout(); }
static void Main(string[] args) { if (args.Length != 8) { Console.WriteLine("Usage: importprimscript.exe [firstname] [lastname] [password] " + "[Simulator] [x] [y] [z] [input.primscript]" + Environment.NewLine + "Example: importprimscript.exe My Bot password " + "Hooper 128 128 40 maya-export" + Path.DirectorySeparatorChar + "ant.primscript"); Environment.Exit(-1); } // Strip quotes from any arguments for (int i = 0; i < args.Length; i++) args[i] = args[i].Trim(new char[] { '"' }); // Parse the primscript file string scriptfilename = args[7]; string error; List<Sculpt> sculpties = ParsePrimscript(scriptfilename, out error); scriptfilename = Path.GetFileNameWithoutExtension(scriptfilename); // Check for parsing errors if (error != String.Empty) { Console.WriteLine("An error was encountered reading the input file: " + error); Environment.Exit(-2); } else if (sculpties.Count == 0) { Console.WriteLine("No primitives were read from the input file"); Environment.Exit(-3); } // Initialize libsecondlife Client = new SecondLife(); Assets = new AssetManager(Client); // Add callback handlers for asset uploads finishing. new prims spotted, and logging Client.Objects.OnNewPrim += new ObjectManager.NewPrimCallback(Objects_OnNewPrim); Client.OnLogMessage += new SecondLife.LogCallback(Client_OnLogMessage); // Optimize the connection for our purposes Client.Self.Movement.Camera.Far = 64f; Client.Settings.MULTIPLE_SIMS = false; Client.Settings.SEND_AGENT_UPDATES = true; Client.Settings.CONTINUOUS_AGENT_UPDATES = true; Client.Settings.DEBUG = false; Client.Settings.ALWAYS_REQUEST_OBJECTS = true; Client.Settings.ALWAYS_DECODE_OBJECTS = true; Client.Throttle.Land = 0; Client.Throttle.Wind = 0; Client.Throttle.Cloud = 0; // Not sure if Asset or Texture will help with uploads, but it won't hurt Client.Throttle.Asset = 220000.0f; Client.Throttle.Texture = 446000.0f; Client.Throttle.Task = 446000.0f; // Create a handler for the event queue connecting, so we know when // it is safe to start uploading AutoResetEvent eventQueueEvent = new AutoResetEvent(false); NetworkManager.EventQueueRunningCallback eventQueueCallback = delegate(Simulator simulator) { if (simulator == Client.Network.CurrentSim) eventQueueEvent.Set(); }; Client.Network.OnEventQueueRunning += eventQueueCallback; int x = Int32.Parse(args[4]); int y = Int32.Parse(args[5]); int z = Int32.Parse(args[6]); string start = NetworkManager.StartLocation(args[3], x, y, z); // Attempt to login if (!Client.Network.Login(args[0], args[1], args[2], "importprimscript 1.1.0", start, "John Hurliman <*****@*****.**>")) { Console.WriteLine("Login failed: " + Client.Network.LoginMessage); Environment.Exit(-4); } // Need to be connected to the event queue before we can upload Console.WriteLine("Login succeeded, waiting for the event handler to connect..."); if (!eventQueueEvent.WaitOne(1000 * 90, false)) { Console.WriteLine("Event queue connection timed out, disconnecting..."); Client.Network.Logout(); Environment.Exit(-5); } // Don't need this anymore Client.Network.OnEventQueueRunning -= eventQueueCallback; // Set the root position for the import RootPosition = Client.Self.SimPosition; RootPosition.Z += 3.0f; // TODO: Check if our account balance is high enough to upload everything // // Create a folder to hold all of our texture uploads UploadFolderID = Client.Inventory.CreateFolder(Client.Inventory.Store.RootFolder.UUID, AssetType.Unknown, scriptfilename); // Loop through each sculpty and do what we need to do for (int i = 0; i < sculpties.Count; i++) { // Upload the sculpt map and texture sculpties[i].SculptID = UploadImage(sculpties[i].SculptFile, true); sculpties[i].TextureID = UploadImage(sculpties[i].TextureFile, false); // Check for failed uploads if (sculpties[i].SculptID == LLUUID.Zero) { Console.WriteLine("Sculpt map " + sculpties[i].SculptFile + " failed to upload, skipping " + sculpties[i].Name); continue; } else if (sculpties[i].TextureID == LLUUID.Zero) { Console.WriteLine("Texture " + sculpties[i].TextureFile + " failed to upload, skipping " + sculpties[i].Name); continue; } // Create basic spherical volume parameters. It will be set to // a scultpy in the callback for new objects being created LLObject.ObjectData volume = new LLObject.ObjectData(); volume.PCode = ObjectManager.PCode.Prim; volume.Material = LLObject.MaterialType.Wood; volume.PathScaleY = 0.5f; volume.PathCurve = LLObject.PathCurve.Circle; volume.ProfileCurve = LLObject.ProfileCurve.ProfileCircle; // Rez this prim CurrentSculpt = sculpties[i]; Client.Objects.AddPrim(Client.Network.CurrentSim, volume, LLUUID.Zero, RootPosition + CurrentSculpt.Offset, CurrentSculpt.Scale, LLQuaternion.Identity); // Wait for the prim to rez and the properties be set for it if (!RezzedEvent.WaitOne(1000 * 10, false)) { Console.WriteLine("Timed out waiting for prim " + CurrentSculpt.Name + " to rez, skipping"); continue; } } CurrentSculpt = null; lock (RezzedPrims) { // Set full permissions for all of the objects Client.Objects.SetPermissions(Client.Network.CurrentSim, RezzedPrims, PermissionWho.All, PermissionMask.All, true); // Link the entire object together Client.Objects.LinkPrims(Client.Network.CurrentSim, RezzedPrims); } Console.WriteLine("Rezzed, textured, and linked " + RezzedPrims.Count + " sculpted prims, logging out..."); Client.Network.Logout(); }
// FIXME: Create a class-level appearance thread so multiple threads can't be launched /// <summary> /// Default constructor /// </summary> /// <param name="client">This agents <seealso cref="libsecondlife.SecondLife"/> Object</param> /// <param name="assets">Reference to an AssetManager object</param> public AppearanceManager(SecondLife client, AssetManager assets) { Client = client; Assets = assets; // Initialize AgentTextures to zero UUIDs for (int i = 0; i < AgentTextures.Length; i++) AgentTextures[i] = LLUUID.Zero; Client.Network.RegisterCallback(PacketType.AgentWearablesUpdate, new NetworkManager.PacketCallback(AgentWearablesUpdateHandler)); Client.Network.RegisterCallback(PacketType.AgentCachedTextureResponse, new NetworkManager.PacketCallback(AgentCachedTextureResponseHandler)); Client.Network.OnDisconnected += new NetworkManager.DisconnectedCallback(Network_OnDisconnected); }