diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | 60 |
1 files changed, 55 insertions, 5 deletions
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 7149aad..e85b7a2 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | |||
@@ -1395,15 +1395,65 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1395 | 1395 | ||
1396 | public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient) | 1396 | public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient) |
1397 | { | 1397 | { |
1398 | ILandObject selectedParcel = null; | 1398 | if (localID != -1) |
1399 | lock (m_landList) | ||
1400 | { | 1399 | { |
1401 | m_landList.TryGetValue(localID, out selectedParcel); | 1400 | ILandObject selectedParcel = null; |
1401 | lock (m_landList) | ||
1402 | { | ||
1403 | m_landList.TryGetValue(localID, out selectedParcel); | ||
1404 | } | ||
1405 | |||
1406 | if (selectedParcel == null) return; | ||
1407 | |||
1408 | selectedParcel.ReturnLandObjects(returnType, agentIDs, taskIDs, remoteClient); | ||
1402 | } | 1409 | } |
1410 | else | ||
1411 | { | ||
1412 | if (returnType != 1) | ||
1413 | { | ||
1414 | m_log.WarnFormat("[LAND MANAGEMENT MODULE] ReturnObjectsInParcel: unknown return type {0}", returnType); | ||
1415 | return; | ||
1416 | } | ||
1417 | |||
1418 | // We get here when the user returns objects from the list of Top Colliders or Top Scripts. | ||
1419 | // In that case we receive specific object UUID's, but no parcel ID. | ||
1403 | 1420 | ||
1404 | if (selectedParcel == null) return; | 1421 | Dictionary<UUID, HashSet<SceneObjectGroup>> returns = new Dictionary<UUID, HashSet<SceneObjectGroup>>(); |
1405 | 1422 | ||
1406 | selectedParcel.ReturnLandObjects(returnType, agentIDs, taskIDs, remoteClient); | 1423 | foreach (UUID groupID in taskIDs) |
1424 | { | ||
1425 | SceneObjectGroup obj = m_scene.GetSceneObjectGroup(groupID); | ||
1426 | if (obj != null) | ||
1427 | { | ||
1428 | if (!returns.ContainsKey(obj.OwnerID)) | ||
1429 | returns[obj.OwnerID] = new HashSet<SceneObjectGroup>(); | ||
1430 | returns[obj.OwnerID].Add(obj); | ||
1431 | } | ||
1432 | else | ||
1433 | { | ||
1434 | m_log.WarnFormat("[LAND MANAGEMENT MODULE] ReturnObjectsInParcel: unknown object {0}", groupID); | ||
1435 | } | ||
1436 | } | ||
1437 | |||
1438 | int num = 0; | ||
1439 | foreach (HashSet<SceneObjectGroup> objs in returns.Values) | ||
1440 | num += objs.Count; | ||
1441 | m_log.DebugFormat("[LAND MANAGEMENT MODULE] Returning {0} specific object(s)", num); | ||
1442 | |||
1443 | foreach (HashSet<SceneObjectGroup> objs in returns.Values) | ||
1444 | { | ||
1445 | List<SceneObjectGroup> objs2 = new List<SceneObjectGroup>(objs); | ||
1446 | if (m_scene.Permissions.CanReturnObjects(null, remoteClient.AgentId, objs2)) | ||
1447 | { | ||
1448 | m_scene.returnObjects(objs2.ToArray(), remoteClient.AgentId); | ||
1449 | } | ||
1450 | else | ||
1451 | { | ||
1452 | m_log.WarnFormat("[LAND MANAGEMENT MODULE] ReturnObjectsInParcel: not permitted to return {0} object(s) belonging to user {1}", | ||
1453 | objs2.Count, objs2[0].OwnerID); | ||
1454 | } | ||
1455 | } | ||
1456 | } | ||
1407 | } | 1457 | } |
1408 | 1458 | ||
1409 | public void EventManagerOnNoLandDataFromStorage() | 1459 | public void EventManagerOnNoLandDataFromStorage() |