aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/Communications/Hypergrid/HGInventoryService.cs11
-rw-r--r--OpenSim/Region/CoreModules/Communications/Local/LocalInterregionComms.cs13
-rw-r--r--OpenSim/Region/CoreModules/Communications/REST/RESTInterregionComms.cs53
-rw-r--r--OpenSim/Region/CoreModules/Hypergrid/HGStandaloneInventoryModule.cs42
-rw-r--r--OpenSim/Region/Framework/Interfaces/IInterregionComms.cs10
-rw-r--r--OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs66
-rw-r--r--OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs11
8 files changed, 171 insertions, 42 deletions
diff --git a/OpenSim/Region/Communications/Hypergrid/HGInventoryService.cs b/OpenSim/Region/Communications/Hypergrid/HGInventoryService.cs
index 2e402a4..a2b2c84 100644
--- a/OpenSim/Region/Communications/Hypergrid/HGInventoryService.cs
+++ b/OpenSim/Region/Communications/Hypergrid/HGInventoryService.cs
@@ -113,6 +113,17 @@ namespace OpenSim.Region.Communications.Hypergrid
113 113
114 m_log.ErrorFormat("[HGrid INVENTORY SERVICE]: Request inventory operation failed, {0} {1}", 114 m_log.ErrorFormat("[HGrid INVENTORY SERVICE]: Request inventory operation failed, {0} {1}",
115 e.Source, e.Message); 115 e.Source, e.Message);
116
117 // Well, let's synthesize one
118 InventoryCollection icol = new InventoryCollection();
119 icol.UserID = userID;
120 icol.Items = new List<InventoryItemBase>();
121 icol.Folders = new List<InventoryFolderBase>();
122 InventoryFolderBase rootFolder = new InventoryFolderBase();
123 rootFolder.ID = UUID.Random();
124 rootFolder.Owner = userID;
125 icol.Folders.Add(rootFolder);
126 InventoryResponse(icol);
116 } 127 }
117 } 128 }
118 else 129 else
diff --git a/OpenSim/Region/CoreModules/Communications/Local/LocalInterregionComms.cs b/OpenSim/Region/CoreModules/Communications/Local/LocalInterregionComms.cs
index fb293e8..1e430e5 100644
--- a/OpenSim/Region/CoreModules/Communications/Local/LocalInterregionComms.cs
+++ b/OpenSim/Region/CoreModules/Communications/Local/LocalInterregionComms.cs
@@ -244,6 +244,19 @@ namespace OpenSim.Region.CoreModules.Communications.Local
244 return false; 244 return false;
245 } 245 }
246 246
247 public bool SendCreateObject(ulong regionHandle, UUID userID, UUID itemID)
248 {
249 foreach (Scene s in m_sceneList)
250 {
251 if (s.RegionInfo.RegionHandle == regionHandle)
252 {
253 return s.IncomingCreateObject(userID, itemID);
254 }
255 }
256 return false;
257 }
258
259
247 /** 260 /**
248 * Region-related communications 261 * Region-related communications
249 */ 262 */
diff --git a/OpenSim/Region/CoreModules/Communications/REST/RESTInterregionComms.cs b/OpenSim/Region/CoreModules/Communications/REST/RESTInterregionComms.cs
index b507bdd..90104f2 100644
--- a/OpenSim/Region/CoreModules/Communications/REST/RESTInterregionComms.cs
+++ b/OpenSim/Region/CoreModules/Communications/REST/RESTInterregionComms.cs
@@ -276,6 +276,12 @@ namespace OpenSim.Region.CoreModules.Communications.REST
276 return false; 276 return false;
277 } 277 }
278 278
279 public bool SendCreateObject(ulong regionHandle, UUID userID, UUID itemID)
280 {
281 // Not Implemented
282 return false;
283 }
284
279 /** 285 /**
280 * Region-related communications 286 * Region-related communications
281 */ 287 */
@@ -527,13 +533,13 @@ namespace OpenSim.Region.CoreModules.Communications.REST
527 533
528 public Hashtable ObjectHandler(Hashtable request) 534 public Hashtable ObjectHandler(Hashtable request)
529 { 535 {
530 //m_log.Debug("[CONNECTION DEBUGGING]: ObjectHandler Called"); 536 m_log.Debug("[CONNECTION DEBUGGING]: ObjectHandler Called");
531 537
532 //m_log.Debug("---------------------------"); 538 m_log.Debug("---------------------------");
533 //m_log.Debug(" >> uri=" + request["uri"]); 539 m_log.Debug(" >> uri=" + request["uri"]);
534 //m_log.Debug(" >> content-type=" + request["content-type"]); 540 m_log.Debug(" >> content-type=" + request["content-type"]);
535 //m_log.Debug(" >> http-method=" + request["http-method"]); 541 m_log.Debug(" >> http-method=" + request["http-method"]);
536 //m_log.Debug("---------------------------\n"); 542 m_log.Debug("---------------------------\n");
537 543
538 Hashtable responsedata = new Hashtable(); 544 Hashtable responsedata = new Hashtable();
539 responsedata["content_type"] = "text/html"; 545 responsedata["content_type"] = "text/html";
@@ -557,11 +563,11 @@ namespace OpenSim.Region.CoreModules.Communications.REST
557 DoObjectPost(request, responsedata, regionHandle); 563 DoObjectPost(request, responsedata, regionHandle);
558 return responsedata; 564 return responsedata;
559 } 565 }
560 //else if (method.Equals("PUT")) 566 else if (method.Equals("PUT"))
561 //{ 567 {
562 // DoObjectPut(request, responsedata, agentID); 568 DoObjectPut(request, responsedata, regionHandle);
563 // return responsedata; 569 return responsedata;
564 //} 570 }
565 //else if (method.Equals("DELETE")) 571 //else if (method.Equals("DELETE"))
566 //{ 572 //{
567 // DoObjectDelete(request, responsedata, agentID, action, regionHandle); 573 // DoObjectDelete(request, responsedata, agentID, action, regionHandle);
@@ -632,6 +638,31 @@ namespace OpenSim.Region.CoreModules.Communications.REST
632 responsedata["str_response_string"] = result.ToString(); 638 responsedata["str_response_string"] = result.ToString();
633 } 639 }
634 640
641 protected virtual void DoObjectPut(Hashtable request, Hashtable responsedata, ulong regionhandle)
642 {
643 OSDMap args = RegionClient.GetOSDMap((string)request["body"]);
644 if (args == null)
645 {
646 responsedata["int_response_code"] = 400;
647 responsedata["str_response_string"] = "false";
648 return;
649 }
650
651 UUID userID = UUID.Zero, itemID = UUID.Zero;
652 if (args["userid"] != null)
653 userID = args["userid"].AsUUID();
654 if (args["itemid"] != null)
655 itemID = args["itemid"].AsUUID();
656
657 UUID regionID = m_localBackend.GetRegionID(regionhandle);
658
659 // This is the meaning of PUT object
660 bool result = m_localBackend.SendCreateObject(regionhandle, userID, itemID);
661
662 responsedata["int_response_code"] = 200;
663 responsedata["str_response_string"] = result.ToString();
664 }
665
635 /* 666 /*
636 * Region-related incoming calls 667 * Region-related incoming calls
637 * 668 *
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneInventoryModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneInventoryModule.cs
index 741075c..3675583 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneInventoryModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneInventoryModule.cs
@@ -54,6 +54,7 @@ namespace OpenSim.Region.CoreModules.Hypergrid
54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55 private static bool initialized = false; 55 private static bool initialized = false;
56 private static bool enabled = false; 56 private static bool enabled = false;
57 private static bool safemode = false;
57 58
58 private bool m_doLookup = false; 59 private bool m_doLookup = false;
59 Scene m_scene; 60 Scene m_scene;
@@ -77,6 +78,8 @@ namespace OpenSim.Region.CoreModules.Hypergrid
77 78
78 // This module is only on for standalones 79 // This module is only on for standalones
79 enabled = !config.Configs["Startup"].GetBoolean("gridmode", true) && config.Configs["Startup"].GetBoolean("hypergrid", false); 80 enabled = !config.Configs["Startup"].GetBoolean("gridmode", true) && config.Configs["Startup"].GetBoolean("hypergrid", false);
81 if (config.Configs["Hypergrid"] != null)
82 safemode = config.Configs["Hypergrid"].GetBoolean("safemode", false);
80 } 83 }
81 } 84 }
82 85
@@ -116,34 +119,35 @@ namespace OpenSim.Region.CoreModules.Hypergrid
116 119
117 public virtual void AddHttpHandlers(IHttpServer httpServer) 120 public virtual void AddHttpHandlers(IHttpServer httpServer)
118 { 121 {
119 122 if (!safemode)
120 httpServer.AddStreamHandler( 123 {
121 new RestDeserialiseSecureHandler<Guid, InventoryCollection>( 124 httpServer.AddStreamHandler(
122 "POST", "/GetInventory/", m_inventoryService.GetUserInventory, CheckAuthSession)); 125 new RestDeserialiseSecureHandler<Guid, InventoryCollection>(
126 "POST", "/GetInventory/", m_inventoryService.GetUserInventory, CheckAuthSession));
127 httpServer.AddStreamHandler(
128 new RestDeserialiseSecureHandler<InventoryItemBase, bool>(
129 "POST", "/DeleteItem/", m_inventoryBase.DeleteItem, CheckAuthSession));
130 httpServer.AddStreamHandler(
131 new RestDeserialiseSecureHandler<InventoryFolderBase, bool>(
132 "POST", "/UpdateFolder/", m_inventoryBase.UpdateFolder, CheckAuthSession));
133
134 httpServer.AddStreamHandler(
135 new RestDeserialiseSecureHandler<InventoryFolderBase, bool>(
136 "POST", "/MoveFolder/", m_inventoryBase.MoveFolder, CheckAuthSession));
137
138 httpServer.AddStreamHandler(
139 new RestDeserialiseSecureHandler<InventoryFolderBase, bool>(
140 "POST", "/PurgeFolder/", m_inventoryBase.PurgeFolder, CheckAuthSession));
141 }
123 142
124 httpServer.AddStreamHandler( 143 httpServer.AddStreamHandler(
125 new RestDeserialiseSecureHandler<InventoryFolderBase, bool>( 144 new RestDeserialiseSecureHandler<InventoryFolderBase, bool>(
126 "POST", "/NewFolder/", m_inventoryBase.AddFolder, CheckAuthSession)); 145 "POST", "/NewFolder/", m_inventoryBase.AddFolder, CheckAuthSession));
127 146
128 httpServer.AddStreamHandler( 147 httpServer.AddStreamHandler(
129 new RestDeserialiseSecureHandler<InventoryFolderBase, bool>(
130 "POST", "/UpdateFolder/", m_inventoryBase.UpdateFolder, CheckAuthSession));
131
132 httpServer.AddStreamHandler(
133 new RestDeserialiseSecureHandler<InventoryFolderBase, bool>(
134 "POST", "/MoveFolder/", m_inventoryBase.MoveFolder, CheckAuthSession));
135
136 httpServer.AddStreamHandler(
137 new RestDeserialiseSecureHandler<InventoryFolderBase, bool>(
138 "POST", "/PurgeFolder/", m_inventoryBase.PurgeFolder, CheckAuthSession));
139
140 httpServer.AddStreamHandler(
141 new RestDeserialiseSecureHandler<InventoryItemBase, bool>( 148 new RestDeserialiseSecureHandler<InventoryItemBase, bool>(
142 "POST", "/NewItem/", m_inventoryBase.AddItem, CheckAuthSession)); 149 "POST", "/NewItem/", m_inventoryBase.AddItem, CheckAuthSession));
143 150
144 httpServer.AddStreamHandler(
145 new RestDeserialiseSecureHandler<InventoryItemBase, bool>(
146 "POST", "/DeleteItem/", m_inventoryBase.DeleteItem, CheckAuthSession));
147 151
148 } 152 }
149 153
diff --git a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
index ef3cb51..b57b5ed 100644
--- a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
+++ b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
@@ -89,6 +89,16 @@ namespace OpenSim.Region.Framework.Interfaces
89 /// <returns></returns> 89 /// <returns></returns>
90 bool SendCreateObject(ulong regionHandle, ISceneObject sog, bool isLocalCall); 90 bool SendCreateObject(ulong regionHandle, ISceneObject sog, bool isLocalCall);
91 91
92 /// <summary>
93 /// Create an object from the user's inventory in the destination region.
94 /// This message is used primarily for prim crossing.
95 /// </summary>
96 /// <param name="regionHandle"></param>
97 /// <param name="sog"></param>
98 /// <param name="isLocalCall"></param>
99 /// <returns></returns>
100 bool SendCreateObject(ulong regionHandle, UUID userID, UUID itemID);
101
92 #endregion Objects 102 #endregion Objects
93 103
94 #region Regions 104 #region Regions
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs
index e9106e5..b192101 100644
--- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs
+++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs
@@ -33,6 +33,7 @@ using log4net;
33using OpenMetaverse; 33using OpenMetaverse;
34using OpenSim.Framework; 34using OpenSim.Framework;
35using OpenSim.Framework.Communications.Cache; 35using OpenSim.Framework.Communications.Cache;
36using OpenSim.Framework.Communications.Clients;
36 37
37//using HyperGrid.Framework; 38//using HyperGrid.Framework;
38//using OpenSim.Region.Communications.Hypergrid; 39//using OpenSim.Region.Communications.Hypergrid;
@@ -50,6 +51,10 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
50 // This maps between asset UUIDs and asset servers 51 // This maps between asset UUIDs and asset servers
51 private Dictionary<UUID, GridAssetClient> m_assetMap = new Dictionary<UUID, GridAssetClient>(); 52 private Dictionary<UUID, GridAssetClient> m_assetMap = new Dictionary<UUID, GridAssetClient>();
52 53
54 // This maps between inventory server urls and inventory server clients
55 private Dictionary<string, InventoryClient> m_inventoryServers = new Dictionary<string, InventoryClient>();
56
57
53 private Scene m_scene; 58 private Scene m_scene;
54 #endregion 59 #endregion
55 60
@@ -72,6 +77,14 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
72 return null; 77 return null;
73 } 78 }
74 79
80 private string UserInventoryURL(UUID userID)
81 {
82 CachedUserInfo uinfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userID);
83 if (uinfo != null)
84 return (uinfo.UserProfile.UserInventoryURI == "") ? null : uinfo.UserProfile.UserInventoryURI;
85 return null;
86 }
87
75 private bool IsLocalUser(UUID userID) 88 private bool IsLocalUser(UUID userID)
76 { 89 {
77 CachedUserInfo uinfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userID); 90 CachedUserInfo uinfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userID);
@@ -275,9 +288,9 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
275 288
276 #region Public interface 289 #region Public interface
277 290
278 public void Get(UUID itemID, UUID ownerID) 291 public void Get(UUID assetID, UUID ownerID)
279 { 292 {
280 if (!IsInAssetMap(itemID) && !IsLocalUser(ownerID)) 293 if (!IsInAssetMap(assetID) && !IsLocalUser(ownerID))
281 { 294 {
282 // Get the item from the remote asset server onto the local AssetCache 295 // Get the item from the remote asset server onto the local AssetCache
283 // and place an entry in m_assetMap 296 // and place an entry in m_assetMap
@@ -295,11 +308,11 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
295 m_assetServers.Add(userAssetURL, asscli); 308 m_assetServers.Add(userAssetURL, asscli);
296 } 309 }
297 310
298 m_log.Debug("[HGScene]: Fetching object " + itemID + " to asset server " + userAssetURL); 311 m_log.Debug("[HGScene]: Fetching object " + assetID + " to asset server " + userAssetURL);
299 bool success = FetchAsset(asscli, itemID, false); // asscli.RequestAsset(item.ItemID, false); 312 bool success = FetchAsset(asscli, assetID, false); // asscli.RequestAsset(item.ItemID, false);
300 313
301 // OK, now fetch the inside. 314 // OK, now fetch the inside.
302 Dictionary<UUID, bool> ids = SniffUUIDs(itemID); 315 Dictionary<UUID, bool> ids = SniffUUIDs(assetID);
303 Dump(ids); 316 Dump(ids);
304 foreach (KeyValuePair<UUID, bool> kvp in ids) 317 foreach (KeyValuePair<UUID, bool> kvp in ids)
305 FetchAsset(asscli, kvp.Key, kvp.Value); 318 FetchAsset(asscli, kvp.Key, kvp.Value);
@@ -308,7 +321,7 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
308 if (success) 321 if (success)
309 { 322 {
310 m_log.Debug("[HGScene]: Successfully fetched item from remote asset server " + userAssetURL); 323 m_log.Debug("[HGScene]: Successfully fetched item from remote asset server " + userAssetURL);
311 m_assetMap.Add(itemID, asscli); 324 m_assetMap.Add(assetID, asscli);
312 } 325 }
313 else 326 else
314 m_log.Warn("[HGScene]: Could not fetch asset from remote asset server " + userAssetURL); 327 m_log.Warn("[HGScene]: Could not fetch asset from remote asset server " + userAssetURL);
@@ -318,7 +331,36 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
318 } 331 }
319 } 332 }
320 333
321 public void Post(UUID itemID, UUID ownerID) 334 public InventoryItemBase Get(InventoryItemBase item, UUID rootFolder, CachedUserInfo userInfo)
335 {
336 if (!IsLocalUser(item.Owner))
337 {
338 InventoryClient invCli = null;
339 string inventoryURL = UserInventoryURL(item.Owner);
340 if (!m_inventoryServers.TryGetValue(inventoryURL, out invCli))
341 {
342 m_log.Debug("[HGScene]: Starting new InventorytClient for " + inventoryURL);
343 invCli = new InventoryClient(inventoryURL);
344 m_inventoryServers.Add(inventoryURL, invCli);
345 }
346
347 item = invCli.GetInventoryItem(item);
348 if (item != null)
349 {
350 // Change the folder, stick it in root folder, all items flattened out here in this region cache
351 item.Folder = rootFolder;
352 //userInfo.AddItem(item); don't use this, it calls back to the inventory server
353 lock (userInfo.RootFolder.Items)
354 {
355 userInfo.RootFolder.Items[item.ID] = item;
356 }
357
358 }
359 }
360 return item;
361 }
362
363 public void Post(UUID assetID, UUID ownerID)
322 { 364 {
323 if (!IsLocalUser(ownerID)) 365 if (!IsLocalUser(ownerID))
324 { 366 {
@@ -337,11 +379,11 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
337 asscli.SetReceiver(m_scene.CommsManager.AssetCache); // Straight to the asset cache! 379 asscli.SetReceiver(m_scene.CommsManager.AssetCache); // Straight to the asset cache!
338 m_assetServers.Add(userAssetURL, asscli); 380 m_assetServers.Add(userAssetURL, asscli);
339 } 381 }
340 m_log.Debug("[HGScene]: Posting object " + itemID + " to asset server " + userAssetURL); 382 m_log.Debug("[HGScene]: Posting object " + assetID + " to asset server " + userAssetURL);
341 bool success = PostAsset(asscli, itemID); 383 bool success = PostAsset(asscli, assetID);
342 384
343 // Now the inside 385 // Now the inside
344 Dictionary<UUID, bool> ids = SniffUUIDs(itemID); 386 Dictionary<UUID, bool> ids = SniffUUIDs(assetID);
345 Dump(ids); 387 Dump(ids);
346 foreach (KeyValuePair<UUID, bool> kvp in ids) 388 foreach (KeyValuePair<UUID, bool> kvp in ids)
347 PostAsset(asscli, kvp.Key); 389 PostAsset(asscli, kvp.Key);
@@ -349,8 +391,8 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
349 if (success) 391 if (success)
350 { 392 {
351 m_log.Debug("[HGScene]: Successfully posted item to remote asset server " + userAssetURL); 393 m_log.Debug("[HGScene]: Successfully posted item to remote asset server " + userAssetURL);
352 if (!m_assetMap.ContainsKey(itemID)) 394 if (!m_assetMap.ContainsKey(assetID))
353 m_assetMap.Add(itemID, asscli); 395 m_assetMap.Add(assetID, asscli);
354 } 396 }
355 else 397 else
356 m_log.Warn("[HGScene]: Could not post asset to remote asset server " + userAssetURL); 398 m_log.Warn("[HGScene]: Could not post asset to remote asset server " + userAssetURL);
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs
index 93b81e0..4fde9bb 100644
--- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs
@@ -120,6 +120,13 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
120 { 120 {
121 InventoryItemBase item = userInfo.RootFolder.FindItem(itemID); 121 InventoryItemBase item = userInfo.RootFolder.FindItem(itemID);
122 122
123 if (item == null)
124 { // Fetch the item
125 item = new InventoryItemBase();
126 item.Owner = remoteClient.AgentId;
127 item.ID = itemID;
128 item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo);
129 }
123 if (item != null) 130 if (item != null)
124 { 131 {
125 m_assMapper.Get(item.AssetID, remoteClient.AgentId); 132 m_assMapper.Get(item.AssetID, remoteClient.AgentId);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 5f68ccb..30257f1 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1731,6 +1731,17 @@ namespace OpenSim.Region.Framework.Scenes
1731 return true; 1731 return true;
1732 } 1732 }
1733 1733
1734 public virtual bool IncomingCreateObject(UUID userID, UUID itemID)
1735 {
1736 ScenePresence sp = GetScenePresence(userID);
1737 if (sp != null)
1738 {
1739 uint attPt = (uint)sp.Appearance.GetAttachpoint(itemID);
1740 SceneObjectGroup sog = m_sceneGraph.RezSingleAttachment(sp.ControllingClient, itemID, attPt);
1741 }
1742 return false;
1743 }
1744
1734 public bool AddSceneObject(UUID primID, SceneObjectGroup sceneObject) 1745 public bool AddSceneObject(UUID primID, SceneObjectGroup sceneObject)
1735 { 1746 {
1736 // If the user is banned, we won't let any of their objects 1747 // If the user is banned, we won't let any of their objects