diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs | 8 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Interfaces/IGroupsModule.cs | 39 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 16 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 204 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneBase.cs | 6 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneGraph.cs | 186 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneManager.cs | 12 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 21 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 58 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Tests/SceneBaseTests.cs | 2 |
10 files changed, 324 insertions, 228 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs b/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs index 668ff98..87c7a05 100644 --- a/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs +++ b/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs | |||
@@ -25,6 +25,7 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System.Collections.Generic; | ||
28 | using OpenMetaverse; | 29 | using OpenMetaverse; |
29 | using OpenSim.Framework; | 30 | using OpenSim.Framework; |
30 | 31 | ||
@@ -34,7 +35,12 @@ namespace OpenSim.Region.Framework.Interfaces | |||
34 | { | 35 | { |
35 | void Initialise(string connectstring); | 36 | void Initialise(string connectstring); |
36 | 37 | ||
37 | EstateSettings LoadEstateSettings(UUID regionID); | 38 | EstateSettings LoadEstateSettings(UUID regionID, bool create); |
39 | EstateSettings LoadEstateSettings(int estateID); | ||
38 | void StoreEstateSettings(EstateSettings es); | 40 | void StoreEstateSettings(EstateSettings es); |
41 | List<int> GetEstates(string search); | ||
42 | bool LinkRegion(UUID regionID, int estateID); | ||
43 | List<UUID> GetRegions(int estateID); | ||
44 | bool DeleteEstate(int estateID); | ||
39 | } | 45 | } |
40 | } | 46 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs index 8980b2d..2c091e7 100644 --- a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs | |||
@@ -37,21 +37,51 @@ namespace OpenSim.Region.Framework.Interfaces | |||
37 | { | 37 | { |
38 | event NewGroupNotice OnNewGroupNotice; | 38 | event NewGroupNotice OnNewGroupNotice; |
39 | 39 | ||
40 | /// <summary> | ||
41 | /// Create a group | ||
42 | /// </summary> | ||
43 | /// <param name="remoteClient"></param> | ||
44 | /// <param name="name"></param> | ||
45 | /// <param name="charter"></param> | ||
46 | /// <param name="showInList"></param> | ||
47 | /// <param name="insigniaID"></param> | ||
48 | /// <param name="membershipFee"></param> | ||
49 | /// <param name="openEnrollment"></param> | ||
50 | /// <param name="allowPublish"></param> | ||
51 | /// <param name="maturePublish"></param> | ||
52 | /// <returns>The UUID of the created group</returns> | ||
53 | UUID CreateGroup( | ||
54 | IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, | ||
55 | bool openEnrollment, bool allowPublish, bool maturePublish); | ||
56 | |||
57 | /// <summary> | ||
58 | /// Get a group | ||
59 | /// </summary> | ||
60 | /// <param name="name">Name of the group</param> | ||
61 | /// <returns>The group's data. Null if there is no such group.</returns> | ||
62 | GroupRecord GetGroupRecord(string name); | ||
63 | |||
64 | /// <summary> | ||
65 | /// Get a group | ||
66 | /// </summary> | ||
67 | /// <param name="GroupID">ID of the group</param> | ||
68 | /// <returns>The group's data. Null if there is no such group.</returns> | ||
69 | GroupRecord GetGroupRecord(UUID GroupID); | ||
70 | |||
40 | void ActivateGroup(IClientAPI remoteClient, UUID groupID); | 71 | void ActivateGroup(IClientAPI remoteClient, UUID groupID); |
41 | List<GroupTitlesData> GroupTitlesRequest(IClientAPI remoteClient, UUID groupID); | 72 | List<GroupTitlesData> GroupTitlesRequest(IClientAPI remoteClient, UUID groupID); |
42 | List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID); | 73 | List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID); |
43 | List<GroupRolesData> GroupRoleDataRequest(IClientAPI remoteClient, UUID groupID); | 74 | List<GroupRolesData> GroupRoleDataRequest(IClientAPI remoteClient, UUID groupID); |
44 | List<GroupRoleMembersData> GroupRoleMembersRequest(IClientAPI remoteClient, UUID groupID); | 75 | List<GroupRoleMembersData> GroupRoleMembersRequest(IClientAPI remoteClient, UUID groupID); |
45 | GroupProfileData GroupProfileRequest(IClientAPI remoteClient, UUID groupID); | 76 | GroupProfileData GroupProfileRequest(IClientAPI remoteClient, UUID groupID); |
46 | GroupMembershipData[] GetMembershipData(UUID UserID); | 77 | GroupMembershipData[] GetMembershipData(UUID UserID); |
47 | GroupMembershipData GetMembershipData(UUID GroupID, UUID UserID); | 78 | GroupMembershipData GetMembershipData(UUID GroupID, UUID UserID); |
48 | 79 | ||
49 | void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish); | 80 | void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish); |
50 | 81 | ||
51 | void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile); | 82 | void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile); |
52 | 83 | ||
53 | void GroupTitleUpdate(IClientAPI remoteClient, UUID GroupID, UUID TitleRoleID); | 84 | void GroupTitleUpdate(IClientAPI remoteClient, UUID GroupID, UUID TitleRoleID); |
54 | UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish); | ||
55 | 85 | ||
56 | GroupNoticeData[] GroupNoticesListRequest(IClientAPI remoteClient, UUID GroupID); | 86 | GroupNoticeData[] GroupNoticesListRequest(IClientAPI remoteClient, UUID GroupID); |
57 | string GetGroupTitle(UUID avatarID); | 87 | string GetGroupTitle(UUID avatarID); |
@@ -64,7 +94,6 @@ namespace OpenSim.Region.Framework.Interfaces | |||
64 | void LeaveGroupRequest(IClientAPI remoteClient, UUID GroupID); | 94 | void LeaveGroupRequest(IClientAPI remoteClient, UUID GroupID); |
65 | void EjectGroupMemberRequest(IClientAPI remoteClient, UUID GroupID, UUID EjecteeID); | 95 | void EjectGroupMemberRequest(IClientAPI remoteClient, UUID GroupID, UUID EjecteeID); |
66 | void InviteGroupRequest(IClientAPI remoteClient, UUID GroupID, UUID InviteeID, UUID RoleID); | 96 | void InviteGroupRequest(IClientAPI remoteClient, UUID GroupID, UUID InviteeID, UUID RoleID); |
67 | GroupRecord GetGroupRecord(UUID GroupID); | ||
68 | void NotifyChange(UUID GroupID); | 97 | void NotifyChange(UUID GroupID); |
69 | } | 98 | } |
70 | } | 99 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index cadb858..1875c48 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -132,7 +132,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
132 | { | 132 | { |
133 | ScenePresence avatar; | 133 | ScenePresence avatar; |
134 | 134 | ||
135 | if (TryGetAvatar(avatarId, out avatar)) | 135 | if (TryGetScenePresence(avatarId, out avatar)) |
136 | { | 136 | { |
137 | IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>(); | 137 | IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>(); |
138 | if (invAccess != null) | 138 | if (invAccess != null) |
@@ -230,7 +230,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
230 | { | 230 | { |
231 | ScenePresence avatar; | 231 | ScenePresence avatar; |
232 | 232 | ||
233 | if (TryGetAvatar(avatarId, out avatar)) | 233 | if (TryGetScenePresence(avatarId, out avatar)) |
234 | { | 234 | { |
235 | return CapsUpdateTaskInventoryScriptAsset( | 235 | return CapsUpdateTaskInventoryScriptAsset( |
236 | avatar.ControllingClient, itemId, primId, isScriptRunning, data); | 236 | avatar.ControllingClient, itemId, primId, isScriptRunning, data); |
@@ -683,7 +683,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
683 | if (transactionID == UUID.Zero) | 683 | if (transactionID == UUID.Zero) |
684 | { | 684 | { |
685 | ScenePresence presence; | 685 | ScenePresence presence; |
686 | if (TryGetAvatar(remoteClient.AgentId, out presence)) | 686 | if (TryGetScenePresence(remoteClient.AgentId, out presence)) |
687 | { | 687 | { |
688 | byte[] data = null; | 688 | byte[] data = null; |
689 | 689 | ||
@@ -945,7 +945,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
945 | { | 945 | { |
946 | ScenePresence avatar; | 946 | ScenePresence avatar; |
947 | 947 | ||
948 | if (TryGetAvatar(avatarId, out avatar)) | 948 | if (TryGetScenePresence(avatarId, out avatar)) |
949 | { | 949 | { |
950 | return MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId); | 950 | return MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId); |
951 | } | 951 | } |
@@ -1059,7 +1059,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1059 | 1059 | ||
1060 | ScenePresence avatar; | 1060 | ScenePresence avatar; |
1061 | 1061 | ||
1062 | if (TryGetAvatar(srcTaskItem.OwnerID, out avatar)) | 1062 | if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) |
1063 | { | 1063 | { |
1064 | destPart.GetProperties(avatar.ControllingClient); | 1064 | destPart.GetProperties(avatar.ControllingClient); |
1065 | } | 1065 | } |
@@ -1087,7 +1087,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1087 | } | 1087 | } |
1088 | 1088 | ||
1089 | ScenePresence avatar = null; | 1089 | ScenePresence avatar = null; |
1090 | if (TryGetAvatar(destID, out avatar)) | 1090 | if (TryGetScenePresence(destID, out avatar)) |
1091 | { | 1091 | { |
1092 | //profile.SendInventoryDecendents(avatar.ControllingClient, | 1092 | //profile.SendInventoryDecendents(avatar.ControllingClient, |
1093 | // profile.RootFolder.ID, true, false); | 1093 | // profile.RootFolder.ID, true, false); |
@@ -1424,7 +1424,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1424 | 1424 | ||
1425 | ScenePresence avatar; | 1425 | ScenePresence avatar; |
1426 | 1426 | ||
1427 | if (TryGetAvatar(srcTaskItem.OwnerID, out avatar)) | 1427 | if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) |
1428 | { | 1428 | { |
1429 | destPart.GetProperties(avatar.ControllingClient); | 1429 | destPart.GetProperties(avatar.ControllingClient); |
1430 | } | 1430 | } |
@@ -1865,7 +1865,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1865 | UUID inventoryID = part.ParentGroup.GetFromItemID(); | 1865 | UUID inventoryID = part.ParentGroup.GetFromItemID(); |
1866 | 1866 | ||
1867 | ScenePresence presence; | 1867 | ScenePresence presence; |
1868 | if (TryGetAvatar(remoteClient.AgentId, out presence)) | 1868 | if (TryGetScenePresence(remoteClient.AgentId, out presence)) |
1869 | { | 1869 | { |
1870 | if (!Permissions.CanRezObject(part.ParentGroup.Children.Count, remoteClient.AgentId, presence.AbsolutePosition)) | 1870 | if (!Permissions.CanRezObject(part.ParentGroup.Children.Count, remoteClient.AgentId, presence.AbsolutePosition)) |
1871 | return; | 1871 | return; |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index b2c8dfd..2b6f80b 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -606,7 +606,46 @@ namespace OpenSim.Region.Framework.Scenes | |||
606 | 606 | ||
607 | if (m_storageManager.EstateDataStore != null) | 607 | if (m_storageManager.EstateDataStore != null) |
608 | { | 608 | { |
609 | m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID); | 609 | m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID, false); |
610 | if (m_regInfo.EstateSettings.EstateID == 0) // No record at all | ||
611 | { | ||
612 | MainConsole.Instance.Output("Your region is not part of an estate."); | ||
613 | while (true) | ||
614 | { | ||
615 | string response = MainConsole.Instance.CmdPrompt("Do you wish to join an existing estate?", "no", new List<string>() {"yes", "no"}); | ||
616 | if (response == "no") | ||
617 | { | ||
618 | // Create a new estate | ||
619 | m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID, true); | ||
620 | |||
621 | m_regInfo.EstateSettings.EstateName = MainConsole.Instance.CmdPrompt("New estate name", m_regInfo.EstateSettings.EstateName); | ||
622 | m_regInfo.EstateSettings.Save(); | ||
623 | break; | ||
624 | } | ||
625 | else | ||
626 | { | ||
627 | response = MainConsole.Instance.CmdPrompt("Estate name to join", "None"); | ||
628 | if (response == "None") | ||
629 | continue; | ||
630 | |||
631 | List<int> estateIDs = m_storageManager.EstateDataStore.GetEstates(response); | ||
632 | if (estateIDs.Count < 1) | ||
633 | { | ||
634 | MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again"); | ||
635 | continue; | ||
636 | } | ||
637 | |||
638 | int estateID = estateIDs[0]; | ||
639 | |||
640 | m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(estateID); | ||
641 | |||
642 | if (m_storageManager.EstateDataStore.LinkRegion(m_regInfo.RegionID, estateID)) | ||
643 | break; | ||
644 | |||
645 | MainConsole.Instance.Output("Joining the estate failed. Please try again."); | ||
646 | } | ||
647 | } | ||
648 | } | ||
610 | } | 649 | } |
611 | 650 | ||
612 | //Bind Storage Manager functions to some land manager functions for this scene | 651 | //Bind Storage Manager functions to some land manager functions for this scene |
@@ -1229,6 +1268,84 @@ namespace OpenSim.Region.Framework.Scenes | |||
1229 | m_dialogModule = RequestModuleInterface<IDialogModule>(); | 1268 | m_dialogModule = RequestModuleInterface<IDialogModule>(); |
1230 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); | 1269 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); |
1231 | m_teleportModule = RequestModuleInterface<IEntityTransferModule>(); | 1270 | m_teleportModule = RequestModuleInterface<IEntityTransferModule>(); |
1271 | |||
1272 | // Shoving this in here for now, because we have the needed | ||
1273 | // interfaces at this point | ||
1274 | // | ||
1275 | // TODO: Find a better place for this | ||
1276 | // | ||
1277 | while (m_regInfo.EstateSettings.EstateOwner == UUID.Zero && MainConsole.Instance != null) | ||
1278 | { | ||
1279 | MainConsole.Instance.Output("The current estate has no owner set."); | ||
1280 | string first = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test"); | ||
1281 | string last = MainConsole.Instance.CmdPrompt("Estate owner last name", "User"); | ||
1282 | |||
1283 | UserAccount account = UserAccountService.GetUserAccount(m_regInfo.ScopeID, first, last); | ||
1284 | |||
1285 | if (account == null) | ||
1286 | { | ||
1287 | // Create a new account | ||
1288 | account = new UserAccount(m_regInfo.ScopeID, first, last, String.Empty); | ||
1289 | if (account.ServiceURLs == null || (account.ServiceURLs != null && account.ServiceURLs.Count == 0)) | ||
1290 | { | ||
1291 | account.ServiceURLs = new Dictionary<string, object>(); | ||
1292 | account.ServiceURLs["HomeURI"] = string.Empty; | ||
1293 | account.ServiceURLs["GatekeeperURI"] = string.Empty; | ||
1294 | account.ServiceURLs["InventoryServerURI"] = string.Empty; | ||
1295 | account.ServiceURLs["AssetServerURI"] = string.Empty; | ||
1296 | } | ||
1297 | |||
1298 | if (UserAccountService.StoreUserAccount(account)) | ||
1299 | { | ||
1300 | string password = MainConsole.Instance.PasswdPrompt("Password"); | ||
1301 | string email = MainConsole.Instance.CmdPrompt("Email", ""); | ||
1302 | |||
1303 | account.Email = email; | ||
1304 | UserAccountService.StoreUserAccount(account); | ||
1305 | |||
1306 | bool success = false; | ||
1307 | success = AuthenticationService.SetPassword(account.PrincipalID, password); | ||
1308 | if (!success) | ||
1309 | m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to set password for account {0} {1}.", | ||
1310 | first, last); | ||
1311 | |||
1312 | GridRegion home = null; | ||
1313 | if (GridService != null) | ||
1314 | { | ||
1315 | List<GridRegion> defaultRegions = GridService.GetDefaultRegions(UUID.Zero); | ||
1316 | if (defaultRegions != null && defaultRegions.Count >= 1) | ||
1317 | home = defaultRegions[0]; | ||
1318 | |||
1319 | if (PresenceService != null && home != null) | ||
1320 | PresenceService.SetHomeLocation(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); | ||
1321 | else | ||
1322 | m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to set home for account {0} {1}.", | ||
1323 | first, last); | ||
1324 | |||
1325 | } | ||
1326 | else | ||
1327 | m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to retrieve home region for account {0} {1}.", | ||
1328 | first, last); | ||
1329 | |||
1330 | if (InventoryService != null) | ||
1331 | success = InventoryService.CreateUserInventory(account.PrincipalID); | ||
1332 | if (!success) | ||
1333 | m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to create inventory for account {0} {1}.", | ||
1334 | first, last); | ||
1335 | |||
1336 | |||
1337 | m_log.InfoFormat("[USER ACCOUNT SERVICE]: Account {0} {1} created successfully", first, last); | ||
1338 | |||
1339 | m_regInfo.EstateSettings.EstateOwner = account.PrincipalID; | ||
1340 | m_regInfo.EstateSettings.Save(); | ||
1341 | } | ||
1342 | } | ||
1343 | else | ||
1344 | { | ||
1345 | m_regInfo.EstateSettings.EstateOwner = account.PrincipalID; | ||
1346 | m_regInfo.EstateSettings.Save(); | ||
1347 | } | ||
1348 | } | ||
1232 | } | 1349 | } |
1233 | 1350 | ||
1234 | #endregion | 1351 | #endregion |
@@ -3296,7 +3413,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3296 | } | 3413 | } |
3297 | } | 3414 | } |
3298 | 3415 | ||
3299 | ScenePresence sp = m_sceneGraph.GetScenePresence(agent.AgentID); | 3416 | ScenePresence sp = GetScenePresence(agent.AgentID); |
3300 | if (sp != null) | 3417 | if (sp != null) |
3301 | { | 3418 | { |
3302 | m_log.DebugFormat( | 3419 | m_log.DebugFormat( |
@@ -3594,8 +3711,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3594 | /// <param name="message">message to display to the user. Reason for being logged off</param> | 3711 | /// <param name="message">message to display to the user. Reason for being logged off</param> |
3595 | public void HandleLogOffUserFromGrid(UUID AvatarID, UUID RegionSecret, string message) | 3712 | public void HandleLogOffUserFromGrid(UUID AvatarID, UUID RegionSecret, string message) |
3596 | { | 3713 | { |
3597 | ScenePresence loggingOffUser = null; | 3714 | ScenePresence loggingOffUser = GetScenePresence(AvatarID); |
3598 | loggingOffUser = GetScenePresence(AvatarID); | ||
3599 | if (loggingOffUser != null) | 3715 | if (loggingOffUser != null) |
3600 | { | 3716 | { |
3601 | UUID localRegionSecret = UUID.Zero; | 3717 | UUID localRegionSecret = UUID.Zero; |
@@ -3631,8 +3747,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3631 | /// <param name="isFlying"></param> | 3747 | /// <param name="isFlying"></param> |
3632 | public virtual void AgentCrossing(UUID agentID, Vector3 position, bool isFlying) | 3748 | public virtual void AgentCrossing(UUID agentID, Vector3 position, bool isFlying) |
3633 | { | 3749 | { |
3634 | ScenePresence presence; | 3750 | ScenePresence presence = GetScenePresence(agentID); |
3635 | if(m_sceneGraph.TryGetAvatar(agentID, out presence)) | 3751 | if(presence != null) |
3636 | { | 3752 | { |
3637 | try | 3753 | try |
3638 | { | 3754 | { |
@@ -3806,8 +3922,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3806 | public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, Vector3 position, | 3922 | public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, Vector3 position, |
3807 | Vector3 lookAt, uint teleportFlags) | 3923 | Vector3 lookAt, uint teleportFlags) |
3808 | { | 3924 | { |
3809 | ScenePresence sp; | 3925 | ScenePresence sp = GetScenePresence(remoteClient.AgentId); |
3810 | if(m_sceneGraph.TryGetAvatar(remoteClient.AgentId, out sp)) | 3926 | if (sp != null) |
3811 | { | 3927 | { |
3812 | uint regionX = m_regInfo.RegionLocX; | 3928 | uint regionX = m_regInfo.RegionLocX; |
3813 | uint regionY = m_regInfo.RegionLocY; | 3929 | uint regionY = m_regInfo.RegionLocY; |
@@ -3985,17 +4101,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
3985 | m_log.ErrorFormat("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16}{5,-16}{6,-16}", "Firstname", "Lastname", | 4101 | m_log.ErrorFormat("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16}{5,-16}{6,-16}", "Firstname", "Lastname", |
3986 | "Agent ID", "Session ID", "Circuit", "IP", "World"); | 4102 | "Agent ID", "Session ID", "Circuit", "IP", "World"); |
3987 | 4103 | ||
3988 | foreach (ScenePresence scenePresence in GetAvatars()) | 4104 | ForEachScenePresence(delegate(ScenePresence sp) |
3989 | { | 4105 | { |
3990 | m_log.ErrorFormat("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}{6,-16}", | 4106 | m_log.ErrorFormat("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}{6,-16}", |
3991 | scenePresence.Firstname, | 4107 | sp.Firstname, |
3992 | scenePresence.Lastname, | 4108 | sp.Lastname, |
3993 | scenePresence.UUID, | 4109 | sp.UUID, |
3994 | scenePresence.ControllingClient.AgentId, | 4110 | sp.ControllingClient.AgentId, |
3995 | "Unknown", | 4111 | "Unknown", |
3996 | "Unknown", | 4112 | "Unknown", |
3997 | RegionInfo.RegionName); | 4113 | RegionInfo.RegionName); |
3998 | } | 4114 | }); |
3999 | 4115 | ||
4000 | break; | 4116 | break; |
4001 | } | 4117 | } |
@@ -4161,72 +4277,42 @@ namespace OpenSim.Region.Framework.Scenes | |||
4161 | m_sceneGraph.RemovePhysicalPrim(num); | 4277 | m_sceneGraph.RemovePhysicalPrim(num); |
4162 | } | 4278 | } |
4163 | 4279 | ||
4164 | //The idea is to have a group of method that return a list of avatars meeting some requirement | 4280 | public int GetRootAgentCount() |
4165 | // ie it could be all m_scenePresences within a certain range of the calling prim/avatar. | ||
4166 | // | ||
4167 | // GetAvatars returns a new list of all root agent presences in the scene | ||
4168 | // GetScenePresences returns a new list of all presences in the scene or a filter may be passed. | ||
4169 | // GetScenePresence returns the presence with matching UUID or first/last name. | ||
4170 | // ForEachScenePresence requests the Scene to run a delegate function against all presences. | ||
4171 | |||
4172 | /// <summary> | ||
4173 | /// Return a list of all avatars in this region. | ||
4174 | /// This list is a new object, so it can be iterated over without locking. | ||
4175 | /// </summary> | ||
4176 | /// <returns></returns> | ||
4177 | public List<ScenePresence> GetAvatars() | ||
4178 | { | 4281 | { |
4179 | return m_sceneGraph.GetAvatars(); | 4282 | return m_sceneGraph.GetRootAgentCount(); |
4180 | } | 4283 | } |
4181 | 4284 | ||
4182 | /// <summary> | 4285 | public int GetChildAgentCount() |
4183 | /// Return a list of all ScenePresences in this region. This returns child agents as well as root agents. | ||
4184 | /// This list is a new object, so it can be iterated over without locking. | ||
4185 | /// </summary> | ||
4186 | /// <returns></returns> | ||
4187 | public List<ScenePresence> GetScenePresences() | ||
4188 | { | 4286 | { |
4189 | return m_sceneGraph.GetScenePresences(); | 4287 | return m_sceneGraph.GetChildAgentCount(); |
4190 | } | 4288 | } |
4191 | 4289 | ||
4192 | /// <summary> | 4290 | /// <summary> |
4193 | /// Request a filtered list of ScenePresences in this region. | 4291 | /// Request a scene presence by UUID. Fast, indexed lookup. |
4194 | /// This list is a new object, so it can be iterated over without locking. | ||
4195 | /// </summary> | 4292 | /// </summary> |
4196 | /// <param name="filter"></param> | 4293 | /// <param name="agentID"></param> |
4197 | /// <returns></returns> | 4294 | /// <returns>null if the presence was not found</returns> |
4198 | public List<ScenePresence> GetScenePresences(FilterAvatarList filter) | 4295 | public ScenePresence GetScenePresence(UUID agentID) |
4199 | { | ||
4200 | return m_sceneGraph.GetScenePresences(filter); | ||
4201 | } | ||
4202 | |||
4203 | /// <summary> | ||
4204 | /// Request a scene presence by UUID | ||
4205 | /// </summary> | ||
4206 | /// <param name="avatarID"></param> | ||
4207 | /// <returns></returns> | ||
4208 | public ScenePresence GetScenePresence(UUID avatarID) | ||
4209 | { | 4296 | { |
4210 | return m_sceneGraph.GetScenePresence(avatarID); | 4297 | return m_sceneGraph.GetScenePresence(agentID); |
4211 | } | 4298 | } |
4212 | 4299 | ||
4213 | /// <summary> | 4300 | /// <summary> |
4214 | /// Request the ScenePresence in this region by first/last name. | 4301 | /// Request the scene presence by name. |
4215 | /// Should normally only be a single match, but first is always returned | ||
4216 | /// </summary> | 4302 | /// </summary> |
4217 | /// <param name="firstName"></param> | 4303 | /// <param name="firstName"></param> |
4218 | /// <param name="lastName"></param> | 4304 | /// <param name="lastName"></param> |
4219 | /// <returns></returns> | 4305 | /// <returns>null if the presence was not found</returns> |
4220 | public ScenePresence GetScenePresence(string firstName, string lastName) | 4306 | public ScenePresence GetScenePresence(string firstName, string lastName) |
4221 | { | 4307 | { |
4222 | return m_sceneGraph.GetScenePresence(firstName, lastName); | 4308 | return m_sceneGraph.GetScenePresence(firstName, lastName); |
4223 | } | 4309 | } |
4224 | 4310 | ||
4225 | /// <summary> | 4311 | /// <summary> |
4226 | /// Request the ScenePresence in this region by localID. | 4312 | /// Request the scene presence by localID. |
4227 | /// </summary> | 4313 | /// </summary> |
4228 | /// <param name="localID"></param> | 4314 | /// <param name="localID"></param> |
4229 | /// <returns></returns> | 4315 | /// <returns>null if the presence was not found</returns> |
4230 | public ScenePresence GetScenePresence(uint localID) | 4316 | public ScenePresence GetScenePresence(uint localID) |
4231 | { | 4317 | { |
4232 | return m_sceneGraph.GetScenePresence(localID); | 4318 | return m_sceneGraph.GetScenePresence(localID); |
@@ -4318,9 +4404,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
4318 | return m_sceneGraph.GetGroupByPrim(localID); | 4404 | return m_sceneGraph.GetGroupByPrim(localID); |
4319 | } | 4405 | } |
4320 | 4406 | ||
4321 | public override bool TryGetAvatar(UUID avatarId, out ScenePresence avatar) | 4407 | public override bool TryGetScenePresence(UUID avatarId, out ScenePresence avatar) |
4322 | { | 4408 | { |
4323 | return m_sceneGraph.TryGetAvatar(avatarId, out avatar); | 4409 | return m_sceneGraph.TryGetScenePresence(avatarId, out avatar); |
4324 | } | 4410 | } |
4325 | 4411 | ||
4326 | public bool TryGetAvatarByName(string avatarName, out ScenePresence avatar) | 4412 | public bool TryGetAvatarByName(string avatarName, out ScenePresence avatar) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index 74476ed..3218dad 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs | |||
@@ -190,11 +190,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
190 | /// <param name="agentID"></param> | 190 | /// <param name="agentID"></param> |
191 | public abstract void RemoveClient(UUID agentID); | 191 | public abstract void RemoveClient(UUID agentID); |
192 | 192 | ||
193 | public bool TryGetAvatar(UUID agentID, out object scenePresence) | 193 | public bool TryGetScenePresence(UUID agentID, out object scenePresence) |
194 | { | 194 | { |
195 | scenePresence = null; | 195 | scenePresence = null; |
196 | ScenePresence sp = null; | 196 | ScenePresence sp = null; |
197 | if (TryGetAvatar(agentID, out sp)) | 197 | if (TryGetScenePresence(agentID, out sp)) |
198 | { | 198 | { |
199 | scenePresence = sp; | 199 | scenePresence = sp; |
200 | return true; | 200 | return true; |
@@ -203,7 +203,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
203 | return false; | 203 | return false; |
204 | } | 204 | } |
205 | 205 | ||
206 | public abstract bool TryGetAvatar(UUID agentID, out ScenePresence scenePresence); | 206 | public abstract bool TryGetScenePresence(UUID agentID, out ScenePresence scenePresence); |
207 | 207 | ||
208 | #endregion | 208 | #endregion |
209 | 209 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 19298d2..3a1962c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -723,116 +723,84 @@ namespace OpenSim.Region.Framework.Scenes | |||
723 | return null; | 723 | return null; |
724 | } | 724 | } |
725 | 725 | ||
726 | // The idea is to have a group of method that return a list of avatars meeting some requirement | ||
727 | // ie it could be all m_scenePresences within a certain range of the calling prim/avatar. | ||
728 | // | ||
729 | // GetAvatars returns a new list of all root agent presences in the scene | ||
730 | // GetScenePresences returns a new list of all presences in the scene or a filter may be passed. | ||
731 | // GetScenePresence returns the presence with matching UUID or the first presence matching the passed filter. | ||
732 | // ForEachScenePresence requests the Scene to run a delegate function against all presences. | ||
733 | |||
734 | /// <summary> | 726 | /// <summary> |
735 | /// Request a list of all avatars in this region (no child agents) | 727 | /// Request a copy of m_scenePresences in this World |
736 | /// This list is a new object, so it can be iterated over without locking. | 728 | /// There is no guarantee that presences will remain in the scene after the list is returned. |
729 | /// This list should remain private to SceneGraph. Callers wishing to iterate should instead | ||
730 | /// pass a delegate to ForEachScenePresence. | ||
737 | /// </summary> | 731 | /// </summary> |
738 | /// <returns></returns> | 732 | /// <returns></returns> |
739 | public List<ScenePresence> GetAvatars() | 733 | private List<ScenePresence> GetScenePresences() |
740 | { | 734 | { |
741 | return GetScenePresences(delegate(ScenePresence scenePresence) | 735 | lock (m_scenePresences) |
742 | { | 736 | return new List<ScenePresence>(m_scenePresenceArray); |
743 | return !scenePresence.IsChildAgent; | ||
744 | }); | ||
745 | } | 737 | } |
746 | 738 | ||
747 | /// <summary> | 739 | /// <summary> |
748 | /// Request a list of m_scenePresences in this World | 740 | /// Request a scene presence by UUID. Fast, indexed lookup. |
749 | /// Returns a copy so it can be iterated without a lock. | ||
750 | /// There is no guarantee that presences will remain in the scene after the list is returned. | ||
751 | /// </summary> | 741 | /// </summary> |
752 | /// <returns></returns> | 742 | /// <param name="agentID"></param> |
753 | protected internal List<ScenePresence> GetScenePresences() | 743 | /// <returns>null if the presence was not found</returns> |
744 | protected internal ScenePresence GetScenePresence(UUID agentID) | ||
754 | { | 745 | { |
755 | List<ScenePresence> result; | 746 | ScenePresence sp; |
756 | lock (m_scenePresences) | 747 | lock (m_scenePresences) |
757 | { | 748 | { |
758 | result = new List<ScenePresence>(m_scenePresenceArray.Length); | 749 | m_scenePresences.TryGetValue(agentID, out sp); |
759 | result.AddRange(m_scenePresenceArray); | ||
760 | } | 750 | } |
761 | return result; | 751 | return sp; |
762 | } | 752 | } |
763 | 753 | ||
764 | /// <summary> | 754 | /// <summary> |
765 | /// Request a filtered list of m_scenePresences in this World | 755 | /// Request the scene presence by name. |
766 | /// Returns a copy so it can be iterated without a lock. | ||
767 | /// There is no guarantee that presences will remain in the scene after the list is returned. | ||
768 | /// </summary> | 756 | /// </summary> |
769 | /// <returns></returns> | 757 | /// <param name="firstName"></param> |
770 | protected internal List<ScenePresence> GetScenePresences(FilterAvatarList filter) | 758 | /// <param name="lastName"></param> |
759 | /// <returns>null if the presence was not found</returns> | ||
760 | protected internal ScenePresence GetScenePresence(string firstName, string lastName) | ||
771 | { | 761 | { |
772 | List<ScenePresence> result = new List<ScenePresence>(); | 762 | foreach (ScenePresence presence in GetScenePresences()) |
773 | // Check each ScenePresence against the filter | ||
774 | ForEachScenePresence(delegate(ScenePresence presence) | ||
775 | { | 763 | { |
776 | if (filter(presence)) | 764 | if (presence.Firstname == firstName && presence.Lastname == lastName) |
777 | result.Add(presence); | 765 | return presence; |
778 | }); | 766 | } |
779 | return result; | 767 | return null; |
780 | } | 768 | } |
781 | 769 | ||
782 | /// <summary> | 770 | /// <summary> |
783 | /// Request the ScenePresence in this region matching filter. | 771 | /// Request the scene presence by localID. |
784 | /// Only the first match is returned. | ||
785 | /// | ||
786 | /// </summary> | 772 | /// </summary> |
787 | /// <param name="filter"></param> | 773 | /// <param name="localID"></param> |
788 | /// <returns></returns> | 774 | /// <returns>null if the presence was not found</returns> |
789 | protected internal ScenePresence GetScenePresence(FilterAvatarList filter) | 775 | protected internal ScenePresence GetScenePresence(uint localID) |
790 | { | 776 | { |
791 | ScenePresence result = null; | 777 | foreach (ScenePresence presence in GetScenePresences()) |
792 | // Get all of the ScenePresences | 778 | if (presence.LocalId == localID) |
793 | List<ScenePresence> presences = GetScenePresences(); | 779 | return presence; |
794 | foreach (ScenePresence presence in presences) | 780 | return null; |
795 | { | ||
796 | if (filter(presence)) | ||
797 | { | ||
798 | result = presence; | ||
799 | break; | ||
800 | } | ||
801 | } | ||
802 | return result; | ||
803 | } | 781 | } |
804 | 782 | ||
805 | protected internal ScenePresence GetScenePresence(string firstName, string lastName) | 783 | protected internal bool TryGetScenePresence(UUID agentID, out ScenePresence avatar) |
806 | { | 784 | { |
807 | return GetScenePresence(delegate(ScenePresence presence) | 785 | lock (m_scenePresences) |
808 | { | 786 | { |
809 | return(presence.Firstname == firstName && presence.Lastname == lastName); | 787 | m_scenePresences.TryGetValue(agentID, out avatar); |
810 | }); | 788 | } |
811 | } | 789 | return (avatar != null); |
812 | |||
813 | /// <summary> | ||
814 | /// Request a scene presence by UUID | ||
815 | /// </summary> | ||
816 | /// <param name="agentID"></param> | ||
817 | /// <returns>null if the agent was not found</returns> | ||
818 | protected internal ScenePresence GetScenePresence(UUID agentID) | ||
819 | { | ||
820 | ScenePresence sp; | ||
821 | TryGetAvatar(agentID, out sp); | ||
822 | return sp; | ||
823 | } | 790 | } |
824 | 791 | ||
825 | /// <summary> | 792 | protected internal bool TryGetAvatarByName(string name, out ScenePresence avatar) |
826 | /// Request the ScenePresence in this region by localID. | ||
827 | /// </summary> | ||
828 | /// <param name="localID"></param> | ||
829 | /// <returns></returns> | ||
830 | protected internal ScenePresence GetScenePresence(uint localID) | ||
831 | { | 793 | { |
832 | return GetScenePresence(delegate(ScenePresence presence) | 794 | avatar = null; |
795 | foreach (ScenePresence presence in GetScenePresences()) | ||
833 | { | 796 | { |
834 | return (presence.LocalId == localID); | 797 | if (String.Compare(name, presence.ControllingClient.Name, true) == 0) |
835 | }); | 798 | { |
799 | avatar = presence; | ||
800 | break; | ||
801 | } | ||
802 | } | ||
803 | return (avatar != null); | ||
836 | } | 804 | } |
837 | 805 | ||
838 | /// <summary> | 806 | /// <summary> |
@@ -986,24 +954,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
986 | return group.GetChildPart(fullID); | 954 | return group.GetChildPart(fullID); |
987 | } | 955 | } |
988 | 956 | ||
989 | protected internal bool TryGetAvatar(UUID avatarId, out ScenePresence avatar) | ||
990 | { | ||
991 | lock (m_scenePresences) | ||
992 | { | ||
993 | m_scenePresences.TryGetValue(avatarId, out avatar); | ||
994 | } | ||
995 | return (avatar != null); | ||
996 | } | ||
997 | |||
998 | protected internal bool TryGetAvatarByName(string avatarName, out ScenePresence avatar) | ||
999 | { | ||
1000 | avatar = GetScenePresence(delegate(ScenePresence presence) | ||
1001 | { | ||
1002 | return (String.Compare(avatarName, presence.ControllingClient.Name, true) == 0); | ||
1003 | }); | ||
1004 | return (avatar != null); | ||
1005 | } | ||
1006 | |||
1007 | /// <summary> | 957 | /// <summary> |
1008 | /// Returns a list of the entities in the scene. This is a new list so no locking is required to iterate over | 958 | /// Returns a list of the entities in the scene. This is a new list so no locking is required to iterate over |
1009 | /// it | 959 | /// it |
@@ -1066,6 +1016,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1066 | return UUID.Zero; | 1016 | return UUID.Zero; |
1067 | } | 1017 | } |
1068 | 1018 | ||
1019 | /// <summary> | ||
1020 | /// Performs action on all scene object groups. | ||
1021 | /// </summary> | ||
1022 | /// <param name="action"></param> | ||
1069 | protected internal void ForEachSOG(Action<SceneObjectGroup> action) | 1023 | protected internal void ForEachSOG(Action<SceneObjectGroup> action) |
1070 | { | 1024 | { |
1071 | List<SceneObjectGroup> objlist = new List<SceneObjectGroup>(SceneObjectGroupsByFullID.Values); | 1025 | List<SceneObjectGroup> objlist = new List<SceneObjectGroup>(SceneObjectGroupsByFullID.Values); |
@@ -1085,23 +1039,41 @@ namespace OpenSim.Region.Framework.Scenes | |||
1085 | 1039 | ||
1086 | 1040 | ||
1087 | /// <summary> | 1041 | /// <summary> |
1088 | /// Performs action on all scene presences. | 1042 | /// Performs action on all scene presences. This can ultimately run the actions in parallel but |
1043 | /// any delegates passed in will need to implement their own locking on data they reference and | ||
1044 | /// modify outside of the scope of the delegate. | ||
1089 | /// </summary> | 1045 | /// </summary> |
1090 | /// <param name="action"></param> | 1046 | /// <param name="action"></param> |
1091 | public void ForEachScenePresence(Action<ScenePresence> action) | 1047 | public void ForEachScenePresence(Action<ScenePresence> action) |
1092 | { | 1048 | { |
1093 | List<ScenePresence> presences = GetScenePresences(); | 1049 | // Once all callers have their delegates configured for parallelism, we can unleash this |
1094 | try | 1050 | /* |
1051 | Action<ScenePresence> protectedAction = new Action<ScenePresence>(delegate(ScenePresence sp) | ||
1052 | { | ||
1053 | try | ||
1054 | { | ||
1055 | action(sp); | ||
1056 | } | ||
1057 | catch (Exception e) | ||
1058 | { | ||
1059 | m_log.Info("[BUG] in " + m_parentScene.RegionInfo.RegionName + ": " + e.ToString()); | ||
1060 | m_log.Info("[BUG] Stack Trace: " + e.StackTrace); | ||
1061 | } | ||
1062 | }); | ||
1063 | Parallel.ForEach<ScenePresence>(GetScenePresences(), protectedAction); | ||
1064 | */ | ||
1065 | // For now, perform actiona serially | ||
1066 | foreach (ScenePresence sp in GetScenePresences()) | ||
1095 | { | 1067 | { |
1096 | foreach(ScenePresence presence in presences) | 1068 | try |
1097 | { | 1069 | { |
1098 | action(presence); | 1070 | action(sp); |
1071 | } | ||
1072 | catch (Exception e) | ||
1073 | { | ||
1074 | m_log.Info("[BUG] in " + m_parentScene.RegionInfo.RegionName + ": " + e.ToString()); | ||
1075 | m_log.Info("[BUG] Stack Trace: " + e.StackTrace); | ||
1099 | } | 1076 | } |
1100 | } | ||
1101 | catch (Exception e) | ||
1102 | { | ||
1103 | m_log.Info("[BUG] in " + m_parentScene.RegionInfo.RegionName + ": " + e.ToString()); | ||
1104 | m_log.Info("[BUG] Stack Trace: " + e.StackTrace); | ||
1105 | } | 1077 | } |
1106 | } | 1078 | } |
1107 | 1079 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs index a955532..3b84734 100644 --- a/OpenSim/Region/Framework/Scenes/SceneManager.cs +++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs | |||
@@ -454,8 +454,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
454 | 454 | ||
455 | ForEachCurrentScene(delegate(Scene scene) | 455 | ForEachCurrentScene(delegate(Scene scene) |
456 | { | 456 | { |
457 | List<ScenePresence> scenePresences = scene.GetScenePresences(); | 457 | scene.ForEachScenePresence(delegate(ScenePresence sp) |
458 | presences.AddRange(scenePresences); | 458 | { |
459 | presences.Add(sp); | ||
460 | }); | ||
459 | }); | 461 | }); |
460 | 462 | ||
461 | return presences; | 463 | return presences; |
@@ -484,11 +486,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
484 | ForEachCurrentScene(delegate(Scene scene) { scene.HandleEditCommand(cmdparams); }); | 486 | ForEachCurrentScene(delegate(Scene scene) { scene.HandleEditCommand(cmdparams); }); |
485 | } | 487 | } |
486 | 488 | ||
487 | public bool TryGetAvatar(UUID avatarId, out ScenePresence avatar) | 489 | public bool TryGetScenePresence(UUID avatarId, out ScenePresence avatar) |
488 | { | 490 | { |
489 | foreach (Scene scene in m_localScenes) | 491 | foreach (Scene scene in m_localScenes) |
490 | { | 492 | { |
491 | if (scene.TryGetAvatar(avatarId, out avatar)) | 493 | if (scene.TryGetScenePresence(avatarId, out avatar)) |
492 | { | 494 | { |
493 | return true; | 495 | return true; |
494 | } | 496 | } |
@@ -503,7 +505,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
503 | ScenePresence avatar = null; | 505 | ScenePresence avatar = null; |
504 | foreach (Scene mScene in m_localScenes) | 506 | foreach (Scene mScene in m_localScenes) |
505 | { | 507 | { |
506 | if (mScene.TryGetAvatar(avatarId, out avatar)) | 508 | if (mScene.TryGetScenePresence(avatarId, out avatar)) |
507 | { | 509 | { |
508 | scene = mScene; | 510 | scene = mScene; |
509 | return true; | 511 | return true; |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 539f2b1..4b2641c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -682,7 +682,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
682 | if (m_parentGroup != null) // TODO can there be a SOP without a SOG? | 682 | if (m_parentGroup != null) // TODO can there be a SOP without a SOG? |
683 | { | 683 | { |
684 | ScenePresence avatar; | 684 | ScenePresence avatar; |
685 | if (m_parentGroup.Scene.TryGetAvatar(m_sitTargetAvatar, out avatar)) | 685 | if (m_parentGroup.Scene.TryGetScenePresence(m_sitTargetAvatar, out avatar)) |
686 | { | 686 | { |
687 | avatar.ParentPosition = GetWorldPosition(); | 687 | avatar.ParentPosition = GetWorldPosition(); |
688 | } | 688 | } |
@@ -1332,11 +1332,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1332 | if (volume < 0) | 1332 | if (volume < 0) |
1333 | volume = 0; | 1333 | volume = 0; |
1334 | 1334 | ||
1335 | List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars(); | 1335 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence sp) |
1336 | foreach (ScenePresence p in avatarts) | ||
1337 | { | 1336 | { |
1338 | p.ControllingClient.SendAttachedSoundGainChange(UUID, (float)volume); | 1337 | if(!sp.IsChildAgent) |
1339 | } | 1338 | sp.ControllingClient.SendAttachedSoundGainChange(UUID, (float)volume); |
1339 | }); | ||
1340 | } | 1340 | } |
1341 | 1341 | ||
1342 | /// <summary> | 1342 | /// <summary> |
@@ -2626,12 +2626,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2626 | TaskInventory.LockItemsForRead(false); | 2626 | TaskInventory.LockItemsForRead(false); |
2627 | } | 2627 | } |
2628 | 2628 | ||
2629 | List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars(); | 2629 | m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence sp) |
2630 | foreach (ScenePresence p in avatarts) | ||
2631 | { | 2630 | { |
2632 | if (!(Util.GetDistanceTo(p.AbsolutePosition, AbsolutePosition) >= 100)) | 2631 | if (sp.IsChildAgent) |
2633 | p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID); | 2632 | return; |
2634 | } | 2633 | if (!(Util.GetDistanceTo(sp.AbsolutePosition, AbsolutePosition) >= 100)) |
2634 | sp.ControllingClient.SendPreLoadSound(objectID, objectID, soundID); | ||
2635 | }); | ||
2635 | } | 2636 | } |
2636 | 2637 | ||
2637 | public void RemFlag(PrimFlags flag) | 2638 | public void RemFlag(PrimFlags flag) |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 1e530e1..5c54616 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2598,35 +2598,33 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos); | |||
2598 | 2598 | ||
2599 | List<Vector3> CoarseLocations = new List<Vector3>(); | 2599 | List<Vector3> CoarseLocations = new List<Vector3>(); |
2600 | List<UUID> AvatarUUIDs = new List<UUID>(); | 2600 | List<UUID> AvatarUUIDs = new List<UUID>(); |
2601 | List<ScenePresence> avatars = m_scene.GetAvatars(); | 2601 | m_scene.ForEachScenePresence(delegate(ScenePresence sp) |
2602 | for (int i = 0; i < avatars.Count; i++) | ||
2603 | { | 2602 | { |
2604 | // Requested by LibOMV. Send Course Location on self. | 2603 | if (sp.IsChildAgent) |
2605 | //if (avatars[i] != this) | 2604 | return; |
2606 | //{ | 2605 | |
2607 | if (avatars[i].ParentID != 0) | 2606 | if (sp.ParentID != 0) |
2607 | { | ||
2608 | // sitting avatar | ||
2609 | SceneObjectPart sop = m_scene.GetSceneObjectPart(sp.ParentID); | ||
2610 | if (sop != null) | ||
2608 | { | 2611 | { |
2609 | // sitting avatar | 2612 | CoarseLocations.Add(sop.AbsolutePosition + sp.m_pos); |
2610 | SceneObjectPart sop = m_scene.GetSceneObjectPart(avatars[i].ParentID); | 2613 | AvatarUUIDs.Add(sp.UUID); |
2611 | if (sop != null) | ||
2612 | { | ||
2613 | CoarseLocations.Add(sop.AbsolutePosition + avatars[i].m_pos); | ||
2614 | AvatarUUIDs.Add(avatars[i].UUID); | ||
2615 | } | ||
2616 | else | ||
2617 | { | ||
2618 | // we can't find the parent.. ! arg! | ||
2619 | CoarseLocations.Add(avatars[i].m_pos); | ||
2620 | AvatarUUIDs.Add(avatars[i].UUID); | ||
2621 | } | ||
2622 | } | 2614 | } |
2623 | else | 2615 | else |
2624 | { | 2616 | { |
2625 | CoarseLocations.Add(avatars[i].m_pos); | 2617 | // we can't find the parent.. ! arg! |
2626 | AvatarUUIDs.Add(avatars[i].UUID); | 2618 | CoarseLocations.Add(sp.m_pos); |
2619 | AvatarUUIDs.Add(sp.UUID); | ||
2627 | } | 2620 | } |
2628 | //} | 2621 | } |
2629 | } | 2622 | else |
2623 | { | ||
2624 | CoarseLocations.Add(sp.m_pos); | ||
2625 | AvatarUUIDs.Add(sp.UUID); | ||
2626 | } | ||
2627 | }); | ||
2630 | 2628 | ||
2631 | m_controllingClient.SendCoarseLocationUpdate(AvatarUUIDs, CoarseLocations); | 2629 | m_controllingClient.SendCoarseLocationUpdate(AvatarUUIDs, CoarseLocations); |
2632 | 2630 | ||
@@ -2700,13 +2698,15 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos); | |||
2700 | m_perfMonMS = Util.EnvironmentTickCount(); | 2698 | m_perfMonMS = Util.EnvironmentTickCount(); |
2701 | 2699 | ||
2702 | // only send update from root agents to other clients; children are only "listening posts" | 2700 | // only send update from root agents to other clients; children are only "listening posts" |
2703 | List<ScenePresence> avatars = m_scene.GetAvatars(); | 2701 | int count = 0; |
2704 | foreach (ScenePresence avatar in avatars) | 2702 | m_scene.ForEachScenePresence(delegate(ScenePresence sp) |
2705 | { | 2703 | { |
2706 | SendFullUpdateToOtherClient(avatar); | 2704 | if (sp.IsChildAgent) |
2707 | 2705 | return; | |
2708 | } | 2706 | SendFullUpdateToOtherClient(sp); |
2709 | m_scene.StatsReporter.AddAgentUpdates(avatars.Count); | 2707 | ++count; |
2708 | }); | ||
2709 | m_scene.StatsReporter.AddAgentUpdates(count); | ||
2710 | m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); | 2710 | m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); |
2711 | 2711 | ||
2712 | Animator.SendAnimPack(); | 2712 | Animator.SendAnimPack(); |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneBaseTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneBaseTests.cs index 840039c..dd9f8f6 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneBaseTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneBaseTests.cs | |||
@@ -66,7 +66,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
66 | throw new NotImplementedException(); | 66 | throw new NotImplementedException(); |
67 | } | 67 | } |
68 | 68 | ||
69 | public override bool TryGetAvatar(UUID agentID, out ScenePresence scenePresence) | 69 | public override bool TryGetScenePresence(UUID agentID, out ScenePresence scenePresence) |
70 | { | 70 | { |
71 | throw new NotImplementedException(); | 71 | throw new NotImplementedException(); |
72 | } | 72 | } |