aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs19
-rw-r--r--OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs10
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs26
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Permissions.cs17
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs92
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs89
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs10
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs150
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs243
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs10
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs10
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs154
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs130
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs19
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs304
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs2
31 files changed, 948 insertions, 390 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index f5623bd..14ae287 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -1,4 +1,4 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
@@ -278,6 +278,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation
278 return "FALLDOWN"; 278 return "FALLDOWN";
279 } 279 }
280 280
281 // Check if the user has stopped walking just now
282 if (CurrentMovementAnimation == "WALK" && (move == Vector3.Zero))
283 return "STAND";
284
281 return CurrentMovementAnimation; 285 return CurrentMovementAnimation;
282 } 286 }
283 287
@@ -402,13 +406,16 @@ namespace OpenSim.Region.Framework.Scenes.Animation
402 /// </summary> 406 /// </summary>
403 public void UpdateMovementAnimations() 407 public void UpdateMovementAnimations()
404 { 408 {
405 CurrentMovementAnimation = DetermineMovementAnimation(); 409 lock (m_animations)
410 {
411 CurrentMovementAnimation = DetermineMovementAnimation();
406 412
407// m_log.DebugFormat( 413// m_log.DebugFormat(
408// "[SCENE PRESENCE ANIMATOR]: Determined animation {0} for {1} in UpdateMovementAnimations()", 414// "[SCENE PRESENCE ANIMATOR]: Determined animation {0} for {1} in UpdateMovementAnimations()",
409// CurrentMovementAnimation, m_scenePresence.Name); 415// CurrentMovementAnimation, m_scenePresence.Name);
410 416
411 TrySetMovementAnimation(CurrentMovementAnimation); 417 TrySetMovementAnimation(CurrentMovementAnimation);
418 }
412 } 419 }
413 420
414 public UUID[] GetAnimationArray() 421 public UUID[] GetAnimationArray()
diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
index f678d07..834464b 100644
--- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
+++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
@@ -117,7 +117,7 @@ namespace OpenSim.Region.Framework.Scenes
117 117
118 private void InventoryRunDeleteTimer(object sender, ElapsedEventArgs e) 118 private void InventoryRunDeleteTimer(object sender, ElapsedEventArgs e)
119 { 119 {
120 m_log.Debug("[ASYNC DELETER]: Starting send to inventory loop"); 120// m_log.Debug("[ASYNC DELETER]: Starting send to inventory loop");
121 121
122 // We must set appearance parameters in the en_US culture in order to avoid issues where values are saved 122 // We must set appearance parameters in the en_US culture in order to avoid issues where values are saved
123 // in a culture where decimal points are commas and then reloaded in a culture which just treats them as 123 // in a culture where decimal points are commas and then reloaded in a culture which just treats them as
@@ -147,9 +147,9 @@ namespace OpenSim.Region.Framework.Scenes
147 { 147 {
148 x = m_inventoryDeletes.Dequeue(); 148 x = m_inventoryDeletes.Dequeue();
149 149
150 m_log.DebugFormat( 150// m_log.DebugFormat(
151 "[ASYNC DELETER]: Sending object to user's inventory, action {1}, count {2}, {0} item(s) remaining.", 151// "[ASYNC DELETER]: Sending object to user's inventory, action {1}, count {2}, {0} item(s) remaining.",
152 left, x.action, x.objectGroups.Count); 152// left, x.action, x.objectGroups.Count);
153 153
154 try 154 try
155 { 155 {
@@ -185,7 +185,7 @@ namespace OpenSim.Region.Framework.Scenes
185 e.StackTrace); 185 e.StackTrace);
186 } 186 }
187 187
188 m_log.Debug("[ASYNC DELETER]: No objects left in inventory send queue."); 188// m_log.Debug("[ASYNC DELETER]: No objects left in inventory send queue.");
189 189
190 return false; 190 return false;
191 } 191 }
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index 3ef1e29..cf68ff4 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -38,8 +38,9 @@ namespace OpenSim.Region.Framework.Scenes
38{ 38{
39 public partial class Scene 39 public partial class Scene
40 { 40 {
41
41 protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, 42 protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName,
42 UUID fromID, bool fromAgent, bool broadcast) 43 UUID fromID, UUID targetID, bool fromAgent, bool broadcast)
43 { 44 {
44 OSChatMessage args = new OSChatMessage(); 45 OSChatMessage args = new OSChatMessage();
45 46
@@ -63,14 +64,20 @@ namespace OpenSim.Region.Framework.Scenes
63 } 64 }
64 65
65 args.From = fromName; 66 args.From = fromName;
66 //args. 67 args.TargetUUID = targetID;
67 68
68 if (broadcast) 69 if (broadcast)
69 EventManager.TriggerOnChatBroadcast(this, args); 70 EventManager.TriggerOnChatBroadcast(this, args);
70 else 71 else
71 EventManager.TriggerOnChatFromWorld(this, args); 72 EventManager.TriggerOnChatFromWorld(this, args);
72 } 73 }
73 74
75 protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName,
76 UUID fromID, bool fromAgent, bool broadcast)
77 {
78 SimChat(message, type, channel, fromPos, fromName, fromID, UUID.Zero, fromAgent, broadcast);
79 }
80
74 /// <summary> 81 /// <summary>
75 /// 82 ///
76 /// </summary> 83 /// </summary>
@@ -108,6 +115,19 @@ namespace OpenSim.Region.Framework.Scenes
108 { 115 {
109 SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true); 116 SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true);
110 } 117 }
118 /// <summary>
119 ///
120 /// </summary>
121 /// <param name="message"></param>
122 /// <param name="type"></param>
123 /// <param name="fromPos"></param>
124 /// <param name="fromName"></param>
125 /// <param name="fromAgentID"></param>
126 /// <param name="targetID"></param>
127 public void SimChatToAgent(UUID targetID, byte[] message, Vector3 fromPos, string fromName, UUID fromID, bool fromAgent)
128 {
129 SimChat(message, ChatTypeEnum.Say, 0, fromPos, fromName, fromID, targetID, fromAgent, false);
130 }
111 131
112 /// <summary> 132 /// <summary>
113 /// Invoked when the client requests a prim. 133 /// Invoked when the client requests a prim.
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
index e1fedf4..535d87a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
@@ -67,6 +67,7 @@ namespace OpenSim.Region.Framework.Scenes
67 public delegate bool RunConsoleCommandHandler(UUID user, Scene requestFromScene); 67 public delegate bool RunConsoleCommandHandler(UUID user, Scene requestFromScene);
68 public delegate bool IssueEstateCommandHandler(UUID user, Scene requestFromScene, bool ownerCommand); 68 public delegate bool IssueEstateCommandHandler(UUID user, Scene requestFromScene, bool ownerCommand);
69 public delegate bool IsGodHandler(UUID user, Scene requestFromScene); 69 public delegate bool IsGodHandler(UUID user, Scene requestFromScene);
70 public delegate bool IsGridGodHandler(UUID user, Scene requestFromScene);
70 public delegate bool IsAdministratorHandler(UUID user); 71 public delegate bool IsAdministratorHandler(UUID user);
71 public delegate bool EditParcelHandler(UUID user, ILandObject parcel, Scene scene); 72 public delegate bool EditParcelHandler(UUID user, ILandObject parcel, Scene scene);
72 public delegate bool EditParcelPropertiesHandler(UUID user, ILandObject parcel, GroupPowers p, Scene scene); 73 public delegate bool EditParcelPropertiesHandler(UUID user, ILandObject parcel, GroupPowers p, Scene scene);
@@ -134,6 +135,7 @@ namespace OpenSim.Region.Framework.Scenes
134 public event RunConsoleCommandHandler OnRunConsoleCommand; 135 public event RunConsoleCommandHandler OnRunConsoleCommand;
135 public event IssueEstateCommandHandler OnIssueEstateCommand; 136 public event IssueEstateCommandHandler OnIssueEstateCommand;
136 public event IsGodHandler OnIsGod; 137 public event IsGodHandler OnIsGod;
138 public event IsGridGodHandler OnIsGridGod;
137 public event IsAdministratorHandler OnIsAdministrator; 139 public event IsAdministratorHandler OnIsAdministrator;
138// public event EditParcelHandler OnEditParcel; 140// public event EditParcelHandler OnEditParcel;
139 public event EditParcelPropertiesHandler OnEditParcelProperties; 141 public event EditParcelPropertiesHandler OnEditParcelProperties;
@@ -728,6 +730,21 @@ namespace OpenSim.Region.Framework.Scenes
728 return true; 730 return true;
729 } 731 }
730 732
733 public bool IsGridGod(UUID user)
734 {
735 IsGridGodHandler handler = OnIsGridGod;
736 if (handler != null)
737 {
738 Delegate[] list = handler.GetInvocationList();
739 foreach (IsGridGodHandler h in list)
740 {
741 if (h(user, m_scene) == false)
742 return false;
743 }
744 }
745 return true;
746 }
747
731 public bool IsAdministrator(UUID user) 748 public bool IsAdministrator(UUID user)
732 { 749 {
733 IsAdministratorHandler handler = OnIsAdministrator; 750 IsAdministratorHandler handler = OnIsAdministrator;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index a9a4cda..ff2c46f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -103,6 +103,7 @@ namespace OpenSim.Region.Framework.Scenes
103 public bool m_trustBinaries; 103 public bool m_trustBinaries;
104 public bool m_allowScriptCrossings; 104 public bool m_allowScriptCrossings;
105 public bool m_useFlySlow; 105 public bool m_useFlySlow;
106 public bool m_useTrashOnDelete = true;
106 107
107 /// <summary> 108 /// <summary>
108 /// Temporarily setting to trigger appearance resends at 60 second intervals. 109 /// Temporarily setting to trigger appearance resends at 60 second intervals.
@@ -458,6 +459,7 @@ namespace OpenSim.Region.Framework.Scenes
458 { 459 {
459 if (m_simulationService == null) 460 if (m_simulationService == null)
460 m_simulationService = RequestModuleInterface<ISimulationService>(); 461 m_simulationService = RequestModuleInterface<ISimulationService>();
462
461 return m_simulationService; 463 return m_simulationService;
462 } 464 }
463 } 465 }
@@ -735,6 +737,7 @@ namespace OpenSim.Region.Framework.Scenes
735 m_clampPrimSize = true; 737 m_clampPrimSize = true;
736 } 738 }
737 739
740 m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete);
738 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); 741 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries);
739 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); 742 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings);
740 m_dontPersistBefore = 743 m_dontPersistBefore =
@@ -833,13 +836,11 @@ namespace OpenSim.Region.Framework.Scenes
833 StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; 836 StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats;
834 } 837 }
835 838
836 /// <summary>
837 /// Mock constructor for scene group persistency unit tests.
838 /// SceneObjectGroup RegionId property is delegated to Scene.
839 /// </summary>
840 /// <param name="regInfo"></param>
841 public Scene(RegionInfo regInfo) 839 public Scene(RegionInfo regInfo)
842 { 840 {
841 PhysicalPrims = true;
842 CollidablePrims = true;
843
843 BordersLocked = true; 844 BordersLocked = true;
844 Border northBorder = new Border(); 845 Border northBorder = new Border();
845 northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- 846 northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<---
@@ -866,8 +867,6 @@ namespace OpenSim.Region.Framework.Scenes
866 m_eventManager = new EventManager(); 867 m_eventManager = new EventManager();
867 868
868 m_permissions = new ScenePermissions(this); 869 m_permissions = new ScenePermissions(this);
869
870// m_lastUpdate = Util.EnvironmentTickCount();
871 } 870 }
872 871
873 #endregion 872 #endregion
@@ -3382,8 +3381,8 @@ namespace OpenSim.Region.Framework.Scenes
3382 try 3381 try
3383 { 3382 {
3384 m_log.DebugFormat( 3383 m_log.DebugFormat(
3385 "[SCENE]: Removing {0} agent {1} from region {2}", 3384 "[SCENE]: Removing {0} agent {1} {2} from region {3}",
3386 (isChildAgent ? "child" : "root"), agentID, RegionInfo.RegionName); 3385 (isChildAgent ? "child" : "root"), avatar.Name, agentID, RegionInfo.RegionName);
3387 3386
3388 m_sceneGraph.removeUserCount(!isChildAgent); 3387 m_sceneGraph.removeUserCount(!isChildAgent);
3389 3388
@@ -3981,41 +3980,41 @@ namespace OpenSim.Region.Framework.Scenes
3981 return m_authenticateHandler.TryChangeCiruitCode(oldcc, newcc); 3980 return m_authenticateHandler.TryChangeCiruitCode(oldcc, newcc);
3982 } 3981 }
3983 3982
3984 /// <summary> 3983// /// <summary>
3985 /// The Grid has requested that we log-off a user. Log them off. 3984// /// The Grid has requested that we log-off a user. Log them off.
3986 /// </summary> 3985// /// </summary>
3987 /// <param name="AvatarID">Unique ID of the avatar to log-off</param> 3986// /// <param name="AvatarID">Unique ID of the avatar to log-off</param>
3988 /// <param name="RegionSecret">SecureSessionID of the user, or the RegionSecret text when logging on to the grid</param> 3987// /// <param name="RegionSecret">SecureSessionID of the user, or the RegionSecret text when logging on to the grid</param>
3989 /// <param name="message">message to display to the user. Reason for being logged off</param> 3988// /// <param name="message">message to display to the user. Reason for being logged off</param>
3990 public void HandleLogOffUserFromGrid(UUID AvatarID, UUID RegionSecret, string message) 3989// public void HandleLogOffUserFromGrid(UUID AvatarID, UUID RegionSecret, string message)
3991 { 3990// {
3992 ScenePresence loggingOffUser = GetScenePresence(AvatarID); 3991// ScenePresence loggingOffUser = GetScenePresence(AvatarID);
3993 if (loggingOffUser != null) 3992// if (loggingOffUser != null)
3994 { 3993// {
3995 UUID localRegionSecret = UUID.Zero; 3994// UUID localRegionSecret = UUID.Zero;
3996 bool parsedsecret = UUID.TryParse(m_regInfo.regionSecret, out localRegionSecret); 3995// bool parsedsecret = UUID.TryParse(m_regInfo.regionSecret, out localRegionSecret);
3997 3996//
3998 // Region Secret is used here in case a new sessionid overwrites an old one on the user server. 3997// // Region Secret is used here in case a new sessionid overwrites an old one on the user server.
3999 // Will update the user server in a few revisions to use it. 3998// // Will update the user server in a few revisions to use it.
4000 3999//
4001 if (RegionSecret == loggingOffUser.ControllingClient.SecureSessionId || (parsedsecret && RegionSecret == localRegionSecret)) 4000// if (RegionSecret == loggingOffUser.ControllingClient.SecureSessionId || (parsedsecret && RegionSecret == localRegionSecret))
4002 { 4001// {
4003 m_sceneGridService.SendCloseChildAgentConnections(loggingOffUser.UUID, loggingOffUser.KnownRegionHandles); 4002// m_sceneGridService.SendCloseChildAgentConnections(loggingOffUser.UUID, loggingOffUser.KnownRegionHandles);
4004 loggingOffUser.ControllingClient.Kick(message); 4003// loggingOffUser.ControllingClient.Kick(message);
4005 // Give them a second to receive the message! 4004// // Give them a second to receive the message!
4006 Thread.Sleep(1000); 4005// Thread.Sleep(1000);
4007 loggingOffUser.ControllingClient.Close(); 4006// loggingOffUser.ControllingClient.Close();
4008 } 4007// }
4009 else 4008// else
4010 { 4009// {
4011 m_log.Info("[USERLOGOFF]: System sending the LogOff user message failed to sucessfully authenticate"); 4010// m_log.Info("[USERLOGOFF]: System sending the LogOff user message failed to sucessfully authenticate");
4012 } 4011// }
4013 } 4012// }
4014 else 4013// else
4015 { 4014// {
4016 m_log.InfoFormat("[USERLOGOFF]: Got a logoff request for {0} but the user isn't here. The user might already have been logged out", AvatarID.ToString()); 4015// m_log.InfoFormat("[USERLOGOFF]: Got a logoff request for {0} but the user isn't here. The user might already have been logged out", AvatarID.ToString());
4017 } 4016// }
4018 } 4017// }
4019 4018
4020 /// <summary> 4019 /// <summary>
4021 /// Triggered when an agent crosses into this sim. Also happens on initial login. 4020 /// Triggered when an agent crosses into this sim. Also happens on initial login.
@@ -4071,7 +4070,10 @@ namespace OpenSim.Region.Framework.Scenes
4071 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2); 4070 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2);
4072 if (nearestParcel == null) 4071 if (nearestParcel == null)
4073 { 4072 {
4074 m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: no allowed parcel", cAgentData.AgentID); 4073 m_log.DebugFormat(
4074 "[SCENE]: Denying root agent entry to {0} in {1}: no allowed parcel",
4075 cAgentData.AgentID, RegionInfo.RegionName);
4076
4075 return false; 4077 return false;
4076 } 4078 }
4077 4079
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index b806d91..77e808e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -156,7 +156,9 @@ namespace OpenSim.Region.Framework.Scenes
156 // that the region position is cached or performance will degrade 156 // that the region position is cached or performance will degrade
157 Utils.LongToUInts(regionHandle, out x, out y); 157 Utils.LongToUInts(regionHandle, out x, out y);
158 GridRegion dest = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); 158 GridRegion dest = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
159// bool v = true; 159 if (dest == null)
160 continue;
161
160 if (!simulatorList.Contains(dest.ServerURI)) 162 if (!simulatorList.Contains(dest.ServerURI))
161 { 163 {
162 // we havent seen this simulator before, add it to the list 164 // we havent seen this simulator before, add it to the list
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index d4965ea..982913a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -101,6 +101,9 @@ namespace OpenSim.Region.Framework.Scenes
101 /// </summary> 101 /// </summary>
102 protected internal Dictionary<uint, SceneObjectGroup> SceneObjectGroupsByLocalPartID = new Dictionary<uint, SceneObjectGroup>(); 102 protected internal Dictionary<uint, SceneObjectGroup> SceneObjectGroupsByLocalPartID = new Dictionary<uint, SceneObjectGroup>();
103 103
104 /// <summary>
105 /// Lock to prevent object group update, linking and delinking operations from running concurrently.
106 /// </summary>
104 private Object m_updateLock = new Object(); 107 private Object m_updateLock = new Object();
105 108
106 #endregion 109 #endregion
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 8e1f447..42b6bc5 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2637,6 +2637,10 @@ namespace OpenSim.Region.Framework.Scenes
2637 /// <summary> 2637 /// <summary>
2638 /// Link the prims in a given group to this group 2638 /// Link the prims in a given group to this group
2639 /// </summary> 2639 /// </summary>
2640 /// <remarks>
2641 /// Do not call this method directly - use Scene.LinkObjects() instead to avoid races between threads.
2642 /// FIXME: There are places where scripts call these methods directly without locking. This is a potential race condition.
2643 /// </remarks>
2640 /// <param name="objectGroup">The group of prims which should be linked to this group</param> 2644 /// <param name="objectGroup">The group of prims which should be linked to this group</param>
2641 public void LinkToGroup(SceneObjectGroup objectGroup) 2645 public void LinkToGroup(SceneObjectGroup objectGroup)
2642 { 2646 {
@@ -2718,6 +2722,7 @@ namespace OpenSim.Region.Framework.Scenes
2718 } 2722 }
2719 2723
2720 linkPart.LinkNum = linkNum++; 2724 linkPart.LinkNum = linkNum++;
2725 linkPart.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false);
2721 2726
2722 SceneObjectPart[] ogParts = objectGroup.Parts; 2727 SceneObjectPart[] ogParts = objectGroup.Parts;
2723 Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b) 2728 Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b)
@@ -2769,6 +2774,11 @@ namespace OpenSim.Region.Framework.Scenes
2769 /// Delink the given prim from this group. The delinked prim is established as 2774 /// Delink the given prim from this group. The delinked prim is established as
2770 /// an independent SceneObjectGroup. 2775 /// an independent SceneObjectGroup.
2771 /// </summary> 2776 /// </summary>
2777 /// <remarks>
2778 /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race
2779 /// condition. But currently there is no
2780 /// alternative method that does take a lonk to delink a single prim.
2781 /// </remarks>
2772 /// <param name="partID"></param> 2782 /// <param name="partID"></param>
2773 /// <returns>The object group of the newly delinked prim. Null if part could not be found</returns> 2783 /// <returns>The object group of the newly delinked prim. Null if part could not be found</returns>
2774 public SceneObjectGroup DelinkFromGroup(uint partID) 2784 public SceneObjectGroup DelinkFromGroup(uint partID)
@@ -2780,6 +2790,11 @@ namespace OpenSim.Region.Framework.Scenes
2780 /// Delink the given prim from this group. The delinked prim is established as 2790 /// Delink the given prim from this group. The delinked prim is established as
2781 /// an independent SceneObjectGroup. 2791 /// an independent SceneObjectGroup.
2782 /// </summary> 2792 /// </summary>
2793 /// <remarks>
2794 /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race
2795 /// condition. But currently there is no
2796 /// alternative method that does take a lonk to delink a single prim.
2797 /// </remarks>
2783 /// <param name="partID"></param> 2798 /// <param name="partID"></param>
2784 /// <param name="sendEvents"></param> 2799 /// <param name="sendEvents"></param>
2785 /// <returns>The object group of the newly delinked prim. Null if part could not be found</returns> 2800 /// <returns>The object group of the newly delinked prim. Null if part could not be found</returns>
@@ -2805,6 +2820,11 @@ namespace OpenSim.Region.Framework.Scenes
2805 /// Delink the given prim from this group. The delinked prim is established as 2820 /// Delink the given prim from this group. The delinked prim is established as
2806 /// an independent SceneObjectGroup. 2821 /// an independent SceneObjectGroup.
2807 /// </summary> 2822 /// </summary>
2823 /// <remarks>
2824 /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race
2825 /// condition. But currently there is no
2826 /// alternative method that does take a lonk to delink a single prim.
2827 /// </remarks>
2808 /// <param name="partID"></param> 2828 /// <param name="partID"></param>
2809 /// <param name="sendEvents"></param> 2829 /// <param name="sendEvents"></param>
2810 /// <returns>The object group of the newly delinked prim.</returns> 2830 /// <returns>The object group of the newly delinked prim.</returns>
@@ -2938,6 +2958,8 @@ namespace OpenSim.Region.Framework.Scenes
2938 oldRot = part.RotationOffset; 2958 oldRot = part.RotationOffset;
2939 Quaternion newRot = Quaternion.Conjugate(parentRot) * worldRot; 2959 Quaternion newRot = Quaternion.Conjugate(parentRot) * worldRot;
2940 part.RotationOffset = newRot; 2960 part.RotationOffset = newRot;
2961
2962 part.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false);
2941 } 2963 }
2942 2964
2943 /// <summary> 2965 /// <summary>
@@ -4148,7 +4170,72 @@ namespace OpenSim.Region.Framework.Scenes
4148 for (int i = 0; i < parts.Length; i++) 4170 for (int i = 0; i < parts.Length; i++)
4149 parts[i].TriggerScriptChangedEvent(val); 4171 parts[i].TriggerScriptChangedEvent(val);
4150 } 4172 }
4151 4173
4174 /// <summary>
4175 /// Returns a count of the number of scripts in this groups parts.
4176 /// </summary>
4177 public int ScriptCount()
4178 {
4179 int count = 0;
4180 SceneObjectPart[] parts = m_parts.GetArray();
4181 for (int i = 0; i < parts.Length; i++)
4182 count += parts[i].Inventory.ScriptCount();
4183
4184 return count;
4185 }
4186
4187 /// <summary>
4188 /// A float the value is a representative execution time in milliseconds of all scripts in the link set.
4189 /// </summary>
4190 public float ScriptExecutionTime()
4191 {
4192 IScriptModule[] engines = Scene.RequestModuleInterfaces<IScriptModule>();
4193
4194 if (engines.Length == 0) // No engine at all
4195 return 0.0f;
4196
4197 float time = 0.0f;
4198
4199 // get all the scripts in all parts
4200 SceneObjectPart[] parts = m_parts.GetArray();
4201 List<TaskInventoryItem> scripts = new List<TaskInventoryItem>();
4202 for (int i = 0; i < parts.Length; i++)
4203 {
4204 scripts.AddRange(parts[i].Inventory.GetInventoryItems(InventoryType.LSL));
4205 }
4206 // extract the UUIDs
4207 List<UUID> ids = new List<UUID>(scripts.Count);
4208 foreach (TaskInventoryItem script in scripts)
4209 {
4210 if (!ids.Contains(script.ItemID))
4211 {
4212 ids.Add(script.ItemID);
4213 }
4214 }
4215 // Offer the list of script UUIDs to each engine found and accumulate the time
4216 foreach (IScriptModule e in engines)
4217 {
4218 if (e != null)
4219 {
4220 time += e.GetScriptExecutionTime(ids);
4221 }
4222 }
4223 return time;
4224 }
4225
4226 /// <summary>
4227 /// Returns a count of the number of running scripts in this groups parts.
4228 /// </summary>
4229 public int RunningScriptCount()
4230 {
4231 int count = 0;
4232 SceneObjectPart[] parts = m_parts.GetArray();
4233 for (int i = 0; i < parts.Length; i++)
4234 count += parts[i].Inventory.RunningScriptCount();
4235
4236 return count;
4237 }
4238
4152 public override string ToString() 4239 public override string ToString()
4153 { 4240 {
4154 return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition); 4241 return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index b0bc188..843c426 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -2091,6 +2091,9 @@ namespace OpenSim.Region.Framework.Scenes
2091 /// <param name="isNew"></param> 2091 /// <param name="isNew"></param>
2092 public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew) 2092 public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew)
2093 { 2093 {
2094 if (ParentGroup.Scene == null)
2095 return;
2096
2094 if (!ParentGroup.Scene.PhysicalPrims && UsePhysics) 2097 if (!ParentGroup.Scene.PhysicalPrims && UsePhysics)
2095 return; 2098 return;
2096 2099
@@ -4582,7 +4585,7 @@ namespace OpenSim.Region.Framework.Scenes
4582 // For now, we use the NINJA naming scheme for identifying joints. 4585 // For now, we use the NINJA naming scheme for identifying joints.
4583 // In the future, we can support other joint specification schemes such as a 4586 // In the future, we can support other joint specification schemes such as a
4584 // custom checkbox in the viewer GUI. 4587 // custom checkbox in the viewer GUI.
4585 if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) 4588 if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints)
4586 { 4589 {
4587 string hingeString = "hingejoint"; 4590 string hingeString = "hingejoint";
4588 return (Name.Length >= hingeString.Length && Name.Substring(0, hingeString.Length) == hingeString); 4591 return (Name.Length >= hingeString.Length && Name.Substring(0, hingeString.Length) == hingeString);
@@ -4598,7 +4601,7 @@ namespace OpenSim.Region.Framework.Scenes
4598 // For now, we use the NINJA naming scheme for identifying joints. 4601 // For now, we use the NINJA naming scheme for identifying joints.
4599 // In the future, we can support other joint specification schemes such as a 4602 // In the future, we can support other joint specification schemes such as a
4600 // custom checkbox in the viewer GUI. 4603 // custom checkbox in the viewer GUI.
4601 if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) 4604 if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints)
4602 { 4605 {
4603 string ballString = "balljoint"; 4606 string ballString = "balljoint";
4604 return (Name.Length >= ballString.Length && Name.Substring(0, ballString.Length) == ballString); 4607 return (Name.Length >= ballString.Length && Name.Substring(0, ballString.Length) == ballString);
@@ -4614,7 +4617,7 @@ namespace OpenSim.Region.Framework.Scenes
4614 // For now, we use the NINJA naming scheme for identifying joints. 4617 // For now, we use the NINJA naming scheme for identifying joints.
4615 // In the future, we can support other joint specification schemes such as a 4618 // In the future, we can support other joint specification schemes such as a
4616 // custom checkbox in the viewer GUI. 4619 // custom checkbox in the viewer GUI.
4617 if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) 4620 if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints)
4618 { 4621 {
4619 return IsHingeJoint() || IsBallJoint(); 4622 return IsHingeJoint() || IsBallJoint();
4620 } 4623 }
@@ -4733,7 +4736,6 @@ namespace OpenSim.Region.Framework.Scenes
4733 } 4736 }
4734 } 4737 }
4735 } 4738 }
4736
4737 else // it already has a physical representation 4739 else // it already has a physical representation
4738 { 4740 {
4739 DoPhysicsPropertyUpdate(UsePhysics, false); // Update physical status. 4741 DoPhysicsPropertyUpdate(UsePhysics, false); // Update physical status.
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 959046a..a190efe 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -267,14 +267,9 @@ namespace OpenSim.Region.Framework.Scenes
267 /// </summary> 267 /// </summary>
268 public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) 268 public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
269 { 269 {
270 Items.LockItemsForRead(true); 270 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
271 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); 271 foreach (TaskInventoryItem item in scripts)
272 Items.LockItemsForRead(false); 272 CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
273 foreach (TaskInventoryItem item in items)
274 {
275 if ((int)InventoryType.LSL == item.InvType)
276 CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
277 }
278 } 273 }
279 274
280 public ArrayList GetScriptErrors(UUID itemID) 275 public ArrayList GetScriptErrors(UUID itemID)
@@ -305,17 +300,11 @@ namespace OpenSim.Region.Framework.Scenes
305 /// </param> 300 /// </param>
306 public void RemoveScriptInstances(bool sceneObjectBeingDeleted) 301 public void RemoveScriptInstances(bool sceneObjectBeingDeleted)
307 { 302 {
308 Items.LockItemsForRead(true); 303 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
309 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); 304 foreach (TaskInventoryItem item in scripts)
310 Items.LockItemsForRead(false);
311
312 foreach (TaskInventoryItem item in items)
313 { 305 {
314 if ((int)InventoryType.LSL == item.InvType) 306 RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted);
315 { 307 m_part.RemoveScriptEvents(item.ItemID);
316 RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted);
317 m_part.RemoveScriptEvents(item.ItemID);
318 }
319 } 308 }
320 } 309 }
321 310
@@ -1281,9 +1270,57 @@ namespace OpenSim.Region.Framework.Scenes
1281 return true; 1270 return true;
1282 } 1271 }
1283 } 1272 }
1273
1284 return false; 1274 return false;
1285 } 1275 }
1286 1276
1277 /// <summary>
1278 /// Returns the count of scripts in this parts inventory.
1279 /// </summary>
1280 /// <returns></returns>
1281 public int ScriptCount()
1282 {
1283 int count = 0;
1284 Items.LockItemsForRead(true);
1285 foreach (TaskInventoryItem item in m_items.Values)
1286 {
1287 if (item.InvType == (int)InventoryType.LSL)
1288 {
1289 count++;
1290 }
1291 }
1292 Items.LockItemsForRead(false);
1293 return count;
1294 }
1295 /// <summary>
1296 /// Returns the count of running scripts in this parts inventory.
1297 /// </summary>
1298 /// <returns></returns>
1299 public int RunningScriptCount()
1300 {
1301 IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
1302 if (engines.Length == 0)
1303 return 0;
1304
1305 int count = 0;
1306 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
1307
1308 foreach (TaskInventoryItem item in scripts)
1309 {
1310 foreach (IScriptModule engine in engines)
1311 {
1312 if (engine != null)
1313 {
1314 if (engine.GetScriptState(item.ItemID))
1315 {
1316 count++;
1317 }
1318 }
1319 }
1320 }
1321 return count;
1322 }
1323
1287 public List<UUID> GetInventoryList() 1324 public List<UUID> GetInventoryList()
1288 { 1325 {
1289 List<UUID> ret = new List<UUID>(); 1326 List<UUID> ret = new List<UUID>();
@@ -1298,22 +1335,24 @@ namespace OpenSim.Region.Framework.Scenes
1298 { 1335 {
1299 List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); 1336 List<TaskInventoryItem> ret = new List<TaskInventoryItem>();
1300 1337
1301 lock (m_items) 1338 Items.LockItemsForRead(true);
1302 ret = new List<TaskInventoryItem>(m_items.Values); 1339 ret = new List<TaskInventoryItem>(m_items.Values);
1340 Items.LockItemsForRead(false);
1303 1341
1304 return ret; 1342 return ret;
1305 } 1343 }
1306 1344
1307 public List<TaskInventoryItem> GetInventoryScripts() 1345 public List<TaskInventoryItem> GetInventoryItems(InventoryType type)
1308 { 1346 {
1309 List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); 1347 List<TaskInventoryItem> ret = new List<TaskInventoryItem>();
1310 1348
1311 lock (m_items) 1349 Items.LockItemsForRead(true);
1312 { 1350
1313 foreach (TaskInventoryItem item in m_items.Values) 1351 foreach (TaskInventoryItem item in m_items.Values)
1314 if (item.InvType == (int)InventoryType.LSL) 1352 if (item.InvType == (int)type)
1315 ret.Add(item); 1353 ret.Add(item);
1316 } 1354
1355 Items.LockItemsForRead(false);
1317 1356
1318 return ret; 1357 return ret;
1319 } 1358 }
@@ -1335,35 +1374,32 @@ namespace OpenSim.Region.Framework.Scenes
1335 if (engines.Length == 0) // No engine at all 1374 if (engines.Length == 0) // No engine at all
1336 return ret; 1375 return ret;
1337 1376
1338 Items.LockItemsForRead(true); 1377 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
1339 foreach (TaskInventoryItem item in m_items.Values) 1378
1379 foreach (TaskInventoryItem item in scripts)
1340 { 1380 {
1341 if (item.InvType == (int)InventoryType.LSL) 1381 foreach (IScriptModule e in engines)
1342 { 1382 {
1343 foreach (IScriptModule e in engines) 1383 if (e != null)
1344 { 1384 {
1345 if (e != null) 1385 string n = e.GetXMLState(item.ItemID);
1386 if (n != String.Empty)
1346 { 1387 {
1347 string n = e.GetXMLState(item.ItemID); 1388 if (oldIDs)
1348 if (n != String.Empty) 1389 {
1390 if (!ret.ContainsKey(item.OldItemID))
1391 ret[item.OldItemID] = n;
1392 }
1393 else
1349 { 1394 {
1350 if (oldIDs) 1395 if (!ret.ContainsKey(item.ItemID))
1351 { 1396 ret[item.ItemID] = n;
1352 if (!ret.ContainsKey(item.OldItemID))
1353 ret[item.OldItemID] = n;
1354 }
1355 else
1356 {
1357 if (!ret.ContainsKey(item.ItemID))
1358 ret[item.ItemID] = n;
1359 }
1360 break;
1361 } 1397 }
1398 break;
1362 } 1399 }
1363 } 1400 }
1364 } 1401 }
1365 } 1402 }
1366 Items.LockItemsForRead(false);
1367 return ret; 1403 return ret;
1368 } 1404 }
1369 1405
@@ -1373,27 +1409,21 @@ namespace OpenSim.Region.Framework.Scenes
1373 if (engines.Length == 0) 1409 if (engines.Length == 0)
1374 return; 1410 return;
1375 1411
1412 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
1376 1413
1377 Items.LockItemsForRead(true); 1414 foreach (TaskInventoryItem item in scripts)
1378
1379 foreach (TaskInventoryItem item in m_items.Values)
1380 { 1415 {
1381 if (item.InvType == (int)InventoryType.LSL) 1416 foreach (IScriptModule engine in engines)
1382 { 1417 {
1383 foreach (IScriptModule engine in engines) 1418 if (engine != null)
1384 { 1419 {
1385 if (engine != null) 1420 if (item.OwnerChanged)
1386 { 1421 engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER });
1387 if (item.OwnerChanged) 1422 item.OwnerChanged = false;
1388 engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER }); 1423 engine.ResumeScript(item.ItemID);
1389 item.OwnerChanged = false;
1390 engine.ResumeScript(item.ItemID);
1391 }
1392 } 1424 }
1393 } 1425 }
1394 } 1426 }
1395
1396 Items.LockItemsForRead(false);
1397 } 1427 }
1398 } 1428 }
1399} 1429}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 80f21ce..35c920b 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1,4 +1,4 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
@@ -45,6 +45,7 @@ using TeleportFlags = OpenSim.Framework.Constants.TeleportFlags;
45 45
46namespace OpenSim.Region.Framework.Scenes 46namespace OpenSim.Region.Framework.Scenes
47{ 47{
48 [Flags]
48 enum ScriptControlled : uint 49 enum ScriptControlled : uint
49 { 50 {
50 CONTROL_ZERO = 0, 51 CONTROL_ZERO = 0,
@@ -1065,19 +1066,7 @@ namespace OpenSim.Region.Framework.Scenes
1065 /// <param name="pos"></param> 1066 /// <param name="pos"></param>
1066 public void Teleport(Vector3 pos) 1067 public void Teleport(Vector3 pos)
1067 { 1068 {
1068 bool isFlying = Flying; 1069 TeleportWithMomentum(pos, Vector3.Zero);
1069 RemoveFromPhysicalScene();
1070 Velocity = Vector3.Zero;
1071 CheckLandingPoint(ref pos);
1072 AbsolutePosition = pos;
1073 AddToPhysicalScene(isFlying);
1074
1075 SendTerseUpdateToAllClients();
1076 }
1077
1078 public void TeleportWithMomentum(Vector3 pos)
1079 {
1080 TeleportWithMomentum(pos, null);
1081 } 1070 }
1082 1071
1083 public void TeleportWithMomentum(Vector3 pos, Vector3? v) 1072 public void TeleportWithMomentum(Vector3 pos, Vector3? v)
@@ -1264,7 +1253,10 @@ namespace OpenSim.Region.Framework.Scenes
1264 1253
1265 if ((m_callbackURI != null) && !m_callbackURI.Equals("")) 1254 if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
1266 { 1255 {
1267 m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI); 1256 m_log.DebugFormat(
1257 "[SCENE PRESENCE]: Releasing {0} {1} with callback to {2}",
1258 client.Name, client.AgentId, m_callbackURI);
1259
1268 Scene.SimulationService.ReleaseAgent(m_originRegionID, UUID, m_callbackURI); 1260 Scene.SimulationService.ReleaseAgent(m_originRegionID, UUID, m_callbackURI);
1269 m_callbackURI = null; 1261 m_callbackURI = null;
1270 } 1262 }
@@ -1339,7 +1331,7 @@ namespace OpenSim.Region.Framework.Scenes
1339 { 1331 {
1340// m_log.DebugFormat( 1332// m_log.DebugFormat(
1341// "[SCENE PRESENCE]: In {0} received agent update from {1}, flags {2}", 1333// "[SCENE PRESENCE]: In {0} received agent update from {1}, flags {2}",
1342// Scene.RegionInfo.RegionName, remoteClient.Name, agentData.ControlFlags); 1334// Scene.RegionInfo.RegionName, remoteClient.Name, (AgentManager.ControlFlags)agentData.ControlFlags);
1343 1335
1344 if (IsChildAgent) 1336 if (IsChildAgent)
1345 { 1337 {
@@ -1449,14 +1441,8 @@ namespace OpenSim.Region.Framework.Scenes
1449 } 1441 }
1450 } 1442 }
1451 1443
1452 lock (scriptedcontrols) 1444 uint flagsForScripts = (uint)flags;
1453 { 1445 flags = RemoveIgnoredControls(flags, IgnoredControls);
1454 if (scriptedcontrols.Count > 0)
1455 {
1456 SendControlToScripts((uint)flags);
1457 flags = RemoveIgnoredControls(flags, IgnoredControls);
1458 }
1459 }
1460 1446
1461 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) 1447 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
1462 HandleAgentSitOnGround(); 1448 HandleAgentSitOnGround();
@@ -1470,6 +1456,7 @@ namespace OpenSim.Region.Framework.Scenes
1470 PhysicsActor actor = PhysicsActor; 1456 PhysicsActor actor = PhysicsActor;
1471 if (actor == null) 1457 if (actor == null)
1472 { 1458 {
1459 SendControlsToScripts(flagsForScripts);
1473 return; 1460 return;
1474 } 1461 }
1475 1462
@@ -1549,7 +1536,7 @@ namespace OpenSim.Region.Framework.Scenes
1549 MovementFlag |= (byte)nudgehack; 1536 MovementFlag |= (byte)nudgehack;
1550 } 1537 }
1551 1538
1552// m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); 1539 //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF);
1553 MovementFlag += (byte)(uint)DCF; 1540 MovementFlag += (byte)(uint)DCF;
1554 update_movementflag = true; 1541 update_movementflag = true;
1555 } 1542 }
@@ -1562,7 +1549,7 @@ namespace OpenSim.Region.Framework.Scenes
1562 && ((MovementFlag & (byte)nudgehack) == nudgehack)) 1549 && ((MovementFlag & (byte)nudgehack) == nudgehack))
1563 ) // This or is for Nudge forward 1550 ) // This or is for Nudge forward
1564 { 1551 {
1565// m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with lack of {1}", Name, DCF); 1552 //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with lack of {1}", Name, DCF);
1566 MovementFlag -= ((byte)(uint)DCF); 1553 MovementFlag -= ((byte)(uint)DCF);
1567 update_movementflag = true; 1554 update_movementflag = true;
1568 1555
@@ -1643,8 +1630,10 @@ namespace OpenSim.Region.Framework.Scenes
1643// } 1630// }
1644// } 1631// }
1645 1632
1646// if (update_movementflag && ParentID == 0) 1633 if (update_movementflag && ParentID == 0)
1647// Animator.UpdateMovementAnimations(); 1634 Animator.UpdateMovementAnimations();
1635
1636 SendControlsToScripts(flagsForScripts);
1648 } 1637 }
1649 1638
1650 m_scene.EventManager.TriggerOnClientMovement(this); 1639 m_scene.EventManager.TriggerOnClientMovement(this);
@@ -3060,8 +3049,8 @@ namespace OpenSim.Region.Framework.Scenes
3060 x = x / Constants.RegionSize; 3049 x = x / Constants.RegionSize;
3061 y = y / Constants.RegionSize; 3050 y = y / Constants.RegionSize;
3062 3051
3063 //m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX))); 3052// m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX)));
3064 //m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY))); 3053// m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY)));
3065 if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY)) 3054 if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY))
3066 { 3055 {
3067 byebyeRegions.Add(handle); 3056 byebyeRegions.Add(handle);
@@ -3580,6 +3569,63 @@ namespace OpenSim.Region.Framework.Scenes
3580 return m_attachments.Count > 0; 3569 return m_attachments.Count > 0;
3581 } 3570 }
3582 3571
3572 /// <summary>
3573 /// Returns the total count of scripts in all parts inventories.
3574 /// </summary>
3575 public int ScriptCount()
3576 {
3577 int count = 0;
3578 lock (m_attachments)
3579 {
3580 foreach (SceneObjectGroup gobj in m_attachments)
3581 {
3582 if (gobj != null)
3583 {
3584 count += gobj.ScriptCount();
3585 }
3586 }
3587 }
3588 return count;
3589 }
3590
3591 /// <summary>
3592 /// A float the value is a representative execution time in milliseconds of all scripts in all attachments.
3593 /// </summary>
3594 public float ScriptExecutionTime()
3595 {
3596 float time = 0.0f;
3597 lock (m_attachments)
3598 {
3599 foreach (SceneObjectGroup gobj in m_attachments)
3600 {
3601 if (gobj != null)
3602 {
3603 time += gobj.ScriptExecutionTime();
3604 }
3605 }
3606 }
3607 return time;
3608 }
3609
3610 /// <summary>
3611 /// Returns the total count of running scripts in all parts.
3612 /// </summary>
3613 public int RunningScriptCount()
3614 {
3615 int count = 0;
3616 lock (m_attachments)
3617 {
3618 foreach (SceneObjectGroup gobj in m_attachments)
3619 {
3620 if (gobj != null)
3621 {
3622 count += gobj.RunningScriptCount();
3623 }
3624 }
3625 }
3626 return count;
3627 }
3628
3583 public bool HasScriptedAttachments() 3629 public bool HasScriptedAttachments()
3584 { 3630 {
3585 lock (m_attachments) 3631 lock (m_attachments)
@@ -3777,77 +3823,92 @@ namespace OpenSim.Region.Framework.Scenes
3777 } 3823 }
3778 } 3824 }
3779 3825
3780 internal void SendControlToScripts(uint flags) 3826 private void SendControlsToScripts(uint flags)
3781 { 3827 {
3782 ScriptControlled allflags = ScriptControlled.CONTROL_ZERO; 3828 // Notify the scripts only after calling UpdateMovementAnimations(), so that if a script
3783 3829 // (e.g., a walking script) checks which animation is active it will be the correct animation.
3784 if (MouseDown) 3830 lock (scriptedcontrols)
3785 { 3831 {
3786 allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON); 3832 if (scriptedcontrols.Count <= 0)
3787 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 || (flags & unchecked((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0) 3833 return;
3834
3835 ScriptControlled allflags = ScriptControlled.CONTROL_ZERO;
3836
3837 if (MouseDown)
3838 {
3839 allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON);
3840 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 || (flags & unchecked((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0)
3841 {
3842 allflags = ScriptControlled.CONTROL_ZERO;
3843 MouseDown = true;
3844 }
3845 }
3846
3847 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0)
3788 { 3848 {
3789 allflags = ScriptControlled.CONTROL_ZERO; 3849 allflags |= ScriptControlled.CONTROL_ML_LBUTTON;
3790 MouseDown = true; 3850 MouseDown = true;
3791 } 3851 }
3792 } 3852
3853 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0)
3854 {
3855 allflags |= ScriptControlled.CONTROL_LBUTTON;
3856 MouseDown = true;
3857 }
3858
3859 // find all activated controls, whether the scripts are interested in them or not
3860 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0)
3861 {
3862 allflags |= ScriptControlled.CONTROL_FWD;
3863 }
3864
3865 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0)
3866 {
3867 allflags |= ScriptControlled.CONTROL_BACK;
3868 }
3869
3870 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0)
3871 {
3872 allflags |= ScriptControlled.CONTROL_UP;
3873 }
3874
3875 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)
3876 {
3877 allflags |= ScriptControlled.CONTROL_DOWN;
3878 }
3793 3879
3794 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0) 3880 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0)
3795 { 3881 {
3796 allflags |= ScriptControlled.CONTROL_ML_LBUTTON; 3882 allflags |= ScriptControlled.CONTROL_LEFT;
3797 MouseDown = true; 3883 }
3798 } 3884
3799 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0) 3885 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0)
3800 { 3886 {
3801 allflags |= ScriptControlled.CONTROL_LBUTTON; 3887 allflags |= ScriptControlled.CONTROL_RIGHT;
3802 MouseDown = true; 3888 }
3803 } 3889
3890 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)
3891 {
3892 allflags |= ScriptControlled.CONTROL_ROT_RIGHT;
3893 }
3894
3895 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)
3896 {
3897 allflags |= ScriptControlled.CONTROL_ROT_LEFT;
3898 }
3804 3899
3805 // find all activated controls, whether the scripts are interested in them or not 3900 // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that
3806 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0) 3901 if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands)
3807 {
3808 allflags |= ScriptControlled.CONTROL_FWD;
3809 }
3810 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0)
3811 {
3812 allflags |= ScriptControlled.CONTROL_BACK;
3813 }
3814 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0)
3815 {
3816 allflags |= ScriptControlled.CONTROL_UP;
3817 }
3818 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)
3819 {
3820 allflags |= ScriptControlled.CONTROL_DOWN;
3821 }
3822 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0)
3823 {
3824 allflags |= ScriptControlled.CONTROL_LEFT;
3825 }
3826 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0)
3827 {
3828 allflags |= ScriptControlled.CONTROL_RIGHT;
3829 }
3830 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)
3831 {
3832 allflags |= ScriptControlled.CONTROL_ROT_RIGHT;
3833 }
3834 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)
3835 {
3836 allflags |= ScriptControlled.CONTROL_ROT_LEFT;
3837 }
3838 // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that
3839 if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands)
3840 {
3841 lock (scriptedcontrols)
3842 { 3902 {
3843 foreach (KeyValuePair<UUID, ScriptControllers> kvp in scriptedcontrols) 3903 foreach (KeyValuePair<UUID, ScriptControllers> kvp in scriptedcontrols)
3844 { 3904 {
3845 UUID scriptUUID = kvp.Key; 3905 UUID scriptUUID = kvp.Key;
3846 ScriptControllers scriptControlData = kvp.Value; 3906 ScriptControllers scriptControlData = kvp.Value;
3847 3907
3848 ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us 3908 ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us
3849 ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle 3909 ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle
3850 ScriptControlled localChange = localHeld ^ localLast; // the changed bits 3910 ScriptControlled localChange = localHeld ^ localLast; // the changed bits
3911
3851 if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO) 3912 if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO)
3852 { 3913 {
3853 // only send if still pressed or just changed 3914 // only send if still pressed or just changed
@@ -3855,9 +3916,9 @@ namespace OpenSim.Region.Framework.Scenes
3855 } 3916 }
3856 } 3917 }
3857 } 3918 }
3919
3920 LastCommands = allflags;
3858 } 3921 }
3859
3860 LastCommands = allflags;
3861 } 3922 }
3862 3923
3863 internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored) 3924 internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored)
@@ -3937,7 +3998,7 @@ namespace OpenSim.Region.Framework.Scenes
3937 land.LandData.UserLocation != Vector3.Zero && 3998 land.LandData.UserLocation != Vector3.Zero &&
3938 land.LandData.OwnerID != m_uuid && 3999 land.LandData.OwnerID != m_uuid &&
3939 (!m_scene.Permissions.IsGod(m_uuid)) && 4000 (!m_scene.Permissions.IsGod(m_uuid)) &&
3940 (!m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid))) 4001 (!m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid)))
3941 { 4002 {
3942 float curr = Vector3.Distance(AbsolutePosition, pos); 4003 float curr = Vector3.Distance(AbsolutePosition, pos);
3943 if (Vector3.Distance(land.LandData.UserLocation, pos) < curr) 4004 if (Vector3.Distance(land.LandData.UserLocation, pos) < curr)
@@ -3957,7 +4018,7 @@ namespace OpenSim.Region.Framework.Scenes
3957 { 4018 {
3958 if (GodLevel < 200 && 4019 if (GodLevel < 200 &&
3959 ((!m_scene.Permissions.IsGod(m_uuid) && 4020 ((!m_scene.Permissions.IsGod(m_uuid) &&
3960 !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid)) || 4021 !m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid)) ||
3961 (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || 4022 (m_teleportFlags & TeleportFlags.ViaLocation) != 0 ||
3962 (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0)) 4023 (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0))
3963 { 4024 {
@@ -4031,7 +4092,7 @@ namespace OpenSim.Region.Framework.Scenes
4031 GodLevel < 200 && 4092 GodLevel < 200 &&
4032 ((land.LandData.OwnerID != m_uuid && 4093 ((land.LandData.OwnerID != m_uuid &&
4033 !m_scene.Permissions.IsGod(m_uuid) && 4094 !m_scene.Permissions.IsGod(m_uuid) &&
4034 !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid)) || 4095 !m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid)) ||
4035 (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || 4096 (m_teleportFlags & TeleportFlags.ViaLocation) != 0 ||
4036 (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0)) 4097 (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0))
4037 { 4098 {
diff --git a/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs b/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs
index ab6311b..4a21dc9 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.IO;
30using System.Text; 31using System.Text;
31using NUnit.Framework; 32using NUnit.Framework;
32using OpenMetaverse; 33using OpenMetaverse;
@@ -68,11 +69,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
68 Vector3 position = new Vector3(200,200,21); 69 Vector3 position = new Vector3(200,200,21);
69 70
70 foreach (Border b in testborders) 71 foreach (Border b in testborders)
71 {
72 Assert.That(!b.TestCross(position)); 72 Assert.That(!b.TestCross(position));
73 73
74 }
75
76 position = new Vector3(200,280,21); 74 position = new Vector3(200,280,21);
77 Assert.That(NorthBorder.TestCross(position)); 75 Assert.That(NorthBorder.TestCross(position));
78 76
diff --git a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs
index a5d2b23..ea9fc93 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs
@@ -45,7 +45,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
45 { 45 {
46 static public Random random; 46 static public Random random;
47 SceneObjectGroup found; 47 SceneObjectGroup found;
48 Scene scene = SceneHelpers.SetupScene(); 48 Scene scene = new SceneHelpers().SetupScene();
49 49
50 [Test] 50 [Test]
51 public void T010_AddObjects() 51 public void T010_AddObjects()
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs
index 9a60e50..d23c965 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs
@@ -26,7 +26,9 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.IO;
29using System.Reflection; 30using System.Reflection;
31using System.Text;
30using NUnit.Framework; 32using NUnit.Framework;
31using OpenMetaverse; 33using OpenMetaverse;
32using OpenSim.Framework; 34using OpenSim.Framework;
@@ -44,7 +46,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests
44 public void TestDuplicateObject() 46 public void TestDuplicateObject()
45 { 47 {
46 TestHelpers.InMethod(); 48 TestHelpers.InMethod();
47 Scene scene = SceneHelpers.SetupScene(); 49// TestHelpers.EnableLogging();
50
51 Scene scene = new SceneHelpers().SetupScene();
48 52
49 UUID ownerId = new UUID("00000000-0000-0000-0000-000000000010"); 53 UUID ownerId = new UUID("00000000-0000-0000-0000-000000000010");
50 string part1Name = "part1"; 54 string part1Name = "part1";
@@ -82,6 +86,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
82 Assert.That(dupePart1.PhysActor, Is.Not.Null); 86 Assert.That(dupePart1.PhysActor, Is.Not.Null);
83 Assert.That(dupePart2.PhysActor, Is.Not.Null); 87 Assert.That(dupePart2.PhysActor, Is.Not.Null);
84 */ 88 */
89
90// TestHelpers.DisableLogging();
85 } 91 }
86 } 92 }
87} \ No newline at end of file 93} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs
index 7737d8e..453e077 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs
@@ -88,7 +88,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
88 { 88 {
89 TestHelpers.InMethod(); 89 TestHelpers.InMethod();
90 90
91 Scene scene = SceneHelpers.SetupScene(); 91 Scene scene = new SceneHelpers().SetupScene();
92 int partsToTestCount = 3; 92 int partsToTestCount = 3;
93 93
94 SceneObjectGroup so 94 SceneObjectGroup so
@@ -118,7 +118,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
118 { 118 {
119 TestHelpers.InMethod(); 119 TestHelpers.InMethod();
120 120
121 Scene scene = SceneHelpers.SetupScene(); 121 Scene scene = new SceneHelpers().SetupScene();
122 122
123 string obj1Name = "Alfred"; 123 string obj1Name = "Alfred";
124 string obj2Name = "Betty"; 124 string obj2Name = "Betty";
@@ -152,7 +152,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
152 { 152 {
153 TestHelpers.InMethod(); 153 TestHelpers.InMethod();
154 154
155 Scene scene = SceneHelpers.SetupScene(); 155 Scene scene = new SceneHelpers().SetupScene();
156 int partsToTestCount = 3; 156 int partsToTestCount = 3;
157 157
158 SceneObjectGroup so 158 SceneObjectGroup so
@@ -185,7 +185,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
185 { 185 {
186 TestHelpers.InMethod(); 186 TestHelpers.InMethod();
187 187
188 TestScene scene = SceneHelpers.SetupScene(); 188 TestScene scene = new SceneHelpers().SetupScene();
189 SceneObjectPart part = SceneHelpers.AddSceneObject(scene); 189 SceneObjectPart part = SceneHelpers.AddSceneObject(scene);
190 scene.DeleteSceneObject(part.ParentGroup, false); 190 scene.DeleteSceneObject(part.ParentGroup, false);
191 191
@@ -204,7 +204,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
204 204
205 UUID agentId = UUID.Parse("00000000-0000-0000-0000-000000000001"); 205 UUID agentId = UUID.Parse("00000000-0000-0000-0000-000000000001");
206 206
207 TestScene scene = SceneHelpers.SetupScene(); 207 TestScene scene = new SceneHelpers().SetupScene();
208 208
209 // Turn off the timer on the async sog deleter - we'll crank it by hand for this test. 209 // Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
210 AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter; 210 AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter;
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs
index 654b1a2..0076f41 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs
@@ -61,7 +61,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
61 61
62 UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); 62 UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001");
63 63
64 TestScene scene = SceneHelpers.SetupScene(); 64 TestScene scene = new SceneHelpers().SetupScene();
65 IConfigSource configSource = new IniConfigSource(); 65 IConfigSource configSource = new IniConfigSource();
66 IConfig config = configSource.AddConfig("Startup"); 66 IConfig config = configSource.AddConfig("Startup");
67 config.Set("serverside_object_permissions", true); 67 config.Set("serverside_object_permissions", true);
@@ -100,7 +100,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
100 UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); 100 UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001");
101 UUID objectOwnerId = UUID.Parse("20000000-0000-0000-0000-000000000001"); 101 UUID objectOwnerId = UUID.Parse("20000000-0000-0000-0000-000000000001");
102 102
103 TestScene scene = SceneHelpers.SetupScene(); 103 TestScene scene = new SceneHelpers().SetupScene();
104 IConfigSource configSource = new IniConfigSource(); 104 IConfigSource configSource = new IniConfigSource();
105 IConfig config = configSource.AddConfig("Startup"); 105 IConfig config = configSource.AddConfig("Startup");
106 config.Set("serverside_object_permissions", true); 106 config.Set("serverside_object_permissions", true);
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs
index be5b4a8..1add3dd 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs
@@ -55,7 +55,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
55 UUID ownerId = TestHelpers.ParseTail(0x1); 55 UUID ownerId = TestHelpers.ParseTail(0x1);
56 int nParts = 3; 56 int nParts = 3;
57 57
58 TestScene scene = SceneHelpers.SetupScene(); 58 TestScene scene = new SceneHelpers().SetupScene();
59 SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(nParts, ownerId, "TestLinkToSelf_", 0x10); 59 SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(nParts, ownerId, "TestLinkToSelf_", 0x10);
60 scene.AddSceneObject(sog1); 60 scene.AddSceneObject(sog1);
61 scene.LinkObjects(ownerId, sog1.LocalId, new List<uint>() { sog1.Parts[1].LocalId }); 61 scene.LinkObjects(ownerId, sog1.LocalId, new List<uint>() { sog1.Parts[1].LocalId });
@@ -71,7 +71,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
71 71
72 bool debugtest = false; 72 bool debugtest = false;
73 73
74 Scene scene = SceneHelpers.SetupScene(); 74 Scene scene = new SceneHelpers().SetupScene();
75 SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene); 75 SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene);
76 SceneObjectGroup grp1 = part1.ParentGroup; 76 SceneObjectGroup grp1 = part1.ParentGroup;
77 SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene); 77 SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene);
@@ -153,7 +153,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
153 153
154 bool debugtest = false; 154 bool debugtest = false;
155 155
156 Scene scene = SceneHelpers.SetupScene(); 156 Scene scene = new SceneHelpers().SetupScene();
157 SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene); 157 SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene);
158 SceneObjectGroup grp1 = part1.ParentGroup; 158 SceneObjectGroup grp1 = part1.ParentGroup;
159 SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene); 159 SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene);
@@ -286,7 +286,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
286 TestHelpers.InMethod(); 286 TestHelpers.InMethod();
287 //log4net.Config.XmlConfigurator.Configure(); 287 //log4net.Config.XmlConfigurator.Configure();
288 288
289 TestScene scene = SceneHelpers.SetupScene(); 289 TestScene scene = new SceneHelpers().SetupScene();
290 290
291 string rootPartName = "rootpart"; 291 string rootPartName = "rootpart";
292 UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); 292 UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001");
@@ -325,7 +325,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
325 TestHelpers.InMethod(); 325 TestHelpers.InMethod();
326 //log4net.Config.XmlConfigurator.Configure(); 326 //log4net.Config.XmlConfigurator.Configure();
327 327
328 TestScene scene = SceneHelpers.SetupScene(); 328 TestScene scene = new SceneHelpers().SetupScene();
329 329
330 string rootPartName = "rootpart"; 330 string rootPartName = "rootpart";
331 UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); 331 UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001");
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs
index b49c6e7..0a94c19 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs
@@ -52,7 +52,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
52 TestHelpers.InMethod(); 52 TestHelpers.InMethod();
53// log4net.Config.XmlConfigurator.Configure(); 53// log4net.Config.XmlConfigurator.Configure();
54 54
55 Scene scene = SceneHelpers.SetupScene(); 55 Scene scene = new SceneHelpers().SetupScene();
56 SceneObjectGroup g1 = SceneHelpers.AddSceneObject(scene).ParentGroup; 56 SceneObjectGroup g1 = SceneHelpers.AddSceneObject(scene).ParentGroup;
57 57
58 g1.GroupResize(new Vector3(2, 3, 4)); 58 g1.GroupResize(new Vector3(2, 3, 4));
@@ -75,7 +75,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
75 TestHelpers.InMethod(); 75 TestHelpers.InMethod();
76 //log4net.Config.XmlConfigurator.Configure(); 76 //log4net.Config.XmlConfigurator.Configure();
77 77
78 Scene scene = SceneHelpers.SetupScene(); 78 Scene scene = new SceneHelpers().SetupScene();
79 79
80 SceneObjectGroup g1 = SceneHelpers.CreateSceneObject(2, UUID.Zero); 80 SceneObjectGroup g1 = SceneHelpers.CreateSceneObject(2, UUID.Zero);
81 g1.RootPart.Scale = new Vector3(2, 3, 4); 81 g1.RootPart.Scale = new Vector3(2, 3, 4);
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs
index c582cf6..d2361f8 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs
@@ -52,7 +52,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
52// UUID itemId = TestHelpers.ParseTail(0x2); 52// UUID itemId = TestHelpers.ParseTail(0x2);
53 string itemName = "Test Script Item"; 53 string itemName = "Test Script Item";
54 54
55 Scene scene = SceneHelpers.SetupScene(); 55 Scene scene = new SceneHelpers().SetupScene();
56 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); 56 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId);
57 scene.AddNewSceneObject(so, true); 57 scene.AddNewSceneObject(so, true);
58 58
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs
new file mode 100644
index 0000000..6d255aa
--- /dev/null
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs
@@ -0,0 +1,154 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Reflection;
30using System.Threading;
31using NUnit.Framework;
32using OpenMetaverse;
33using OpenSim.Framework;
34using OpenSim.Framework.Communications;
35using OpenSim.Region.Framework.Scenes;
36using OpenSim.Tests.Common;
37using OpenSim.Tests.Common.Mock;
38
39namespace OpenSim.Region.Framework.Scenes.Tests
40{
41 /// <summary>
42 /// Spatial scene object tests (will eventually cover root and child part position, rotation properties, etc.)
43 /// </summary>
44 [TestFixture]
45 public class SceneObjectSpatialTests
46 {
47 TestScene m_scene;
48 UUID m_ownerId = TestHelpers.ParseTail(0x1);
49
50 [SetUp]
51 public void SetUp()
52 {
53 m_scene = new SceneHelpers().SetupScene();
54 }
55
56 [Test]
57 public void TestGetSceneObjectGroupPosition()
58 {
59 TestHelpers.InMethod();
60
61 Vector3 position = new Vector3(10, 20, 30);
62
63 SceneObjectGroup so
64 = SceneHelpers.CreateSceneObject(1, m_ownerId, "obj1", 0x10);
65 so.AbsolutePosition = position;
66 m_scene.AddNewSceneObject(so, false);
67
68 Assert.That(so.AbsolutePosition, Is.EqualTo(position));
69 }
70
71 [Test]
72 public void TestGetRootPartPosition()
73 {
74 TestHelpers.InMethod();
75
76 Vector3 partPosition = new Vector3(10, 20, 30);
77
78 SceneObjectGroup so
79 = SceneHelpers.CreateSceneObject(1, m_ownerId, "obj1", 0x10);
80 so.AbsolutePosition = partPosition;
81 m_scene.AddNewSceneObject(so, false);
82
83 Assert.That(so.RootPart.AbsolutePosition, Is.EqualTo(partPosition));
84 Assert.That(so.RootPart.GroupPosition, Is.EqualTo(partPosition));
85 Assert.That(so.RootPart.GetWorldPosition(), Is.EqualTo(partPosition));
86 Assert.That(so.RootPart.RelativePosition, Is.EqualTo(partPosition));
87 Assert.That(so.RootPart.OffsetPosition, Is.EqualTo(Vector3.Zero));
88 }
89
90 [Test]
91 public void TestGetChildPartPosition()
92 {
93 TestHelpers.InMethod();
94
95 Vector3 rootPartPosition = new Vector3(10, 20, 30);
96 Vector3 childOffsetPosition = new Vector3(2, 3, 4);
97
98 SceneObjectGroup so
99 = SceneHelpers.CreateSceneObject(2, m_ownerId, "obj1", 0x10);
100 so.AbsolutePosition = rootPartPosition;
101 so.Parts[1].OffsetPosition = childOffsetPosition;
102
103 m_scene.AddNewSceneObject(so, false);
104
105 // Calculate child absolute position.
106 Vector3 childPosition = new Vector3(rootPartPosition + childOffsetPosition);
107
108 SceneObjectPart childPart = so.Parts[1];
109 Assert.That(childPart.AbsolutePosition, Is.EqualTo(childPosition));
110 Assert.That(childPart.GroupPosition, Is.EqualTo(rootPartPosition));
111 Assert.That(childPart.GetWorldPosition(), Is.EqualTo(childPosition));
112 Assert.That(childPart.RelativePosition, Is.EqualTo(childOffsetPosition));
113 Assert.That(childPart.OffsetPosition, Is.EqualTo(childOffsetPosition));
114 }
115
116 [Test]
117 public void TestGetChildPartPositionAfterObjectRotation()
118 {
119 TestHelpers.InMethod();
120
121 Vector3 rootPartPosition = new Vector3(10, 20, 30);
122 Vector3 childOffsetPosition = new Vector3(2, 3, 4);
123
124 SceneObjectGroup so
125 = SceneHelpers.CreateSceneObject(2, m_ownerId, "obj1", 0x10);
126 so.AbsolutePosition = rootPartPosition;
127 so.Parts[1].OffsetPosition = childOffsetPosition;
128
129 m_scene.AddNewSceneObject(so, false);
130
131 so.UpdateGroupRotationR(Quaternion.CreateFromEulers(0, 0, -90 * Utils.DEG_TO_RAD));
132
133 // Calculate child absolute position.
134 Vector3 rotatedChildOffsetPosition
135 = new Vector3(childOffsetPosition.Y, -childOffsetPosition.X, childOffsetPosition.Z);
136
137 Vector3 childPosition = new Vector3(rootPartPosition + rotatedChildOffsetPosition);
138
139 SceneObjectPart childPart = so.Parts[1];
140
141 // FIXME: Should be childPosition after rotation?
142 Assert.That(childPart.AbsolutePosition, Is.EqualTo(rootPartPosition + childOffsetPosition));
143
144 Assert.That(childPart.GroupPosition, Is.EqualTo(rootPartPosition));
145 Assert.That(childPart.GetWorldPosition(), Is.EqualTo(childPosition));
146
147 // Relative to root part as (0, 0, 0)
148 Assert.That(childPart.RelativePosition, Is.EqualTo(childOffsetPosition));
149
150 // Relative to root part as (0, 0, 0)
151 Assert.That(childPart.OffsetPosition, Is.EqualTo(childOffsetPosition));
152 }
153 }
154} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs
index 2a342d5..742c769 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs
@@ -26,6 +26,7 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections.Generic;
29using System.Reflection; 30using System.Reflection;
30using NUnit.Framework; 31using NUnit.Framework;
31using OpenMetaverse; 32using OpenMetaverse;
@@ -43,24 +44,141 @@ namespace OpenSim.Region.Framework.Scenes.Tests
43 [TestFixture] 44 [TestFixture]
44 public class SceneObjectStatusTests 45 public class SceneObjectStatusTests
45 { 46 {
47 private TestScene m_scene;
48 private UUID m_ownerId = TestHelpers.ParseTail(0x1);
49 private SceneObjectGroup m_so1;
50 private SceneObjectGroup m_so2;
51
52 [SetUp]
53 public void Init()
54 {
55 m_scene = new SceneHelpers().SetupScene();
56 m_so1 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so1", 0x10);
57 m_so2 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so2", 0x20);
58 }
59
46 [Test] 60 [Test]
47 public void TestSetPhantom() 61 public void TestSetPhantomSinglePrim()
48 { 62 {
49 TestHelpers.InMethod(); 63 TestHelpers.InMethod();
50 64
51// Scene scene = SceneSetupHelpers.SetupScene(); 65 m_scene.AddSceneObject(m_so1);
52 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, UUID.Zero); 66
53 SceneObjectPart rootPart = so.RootPart; 67 SceneObjectPart rootPart = m_so1.RootPart;
54 Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); 68 Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None));
55 69
56 so.ScriptSetPhantomStatus(true); 70 m_so1.ScriptSetPhantomStatus(true);
57 71
58// Console.WriteLine("so.RootPart.Flags [{0}]", so.RootPart.Flags); 72// Console.WriteLine("so.RootPart.Flags [{0}]", so.RootPart.Flags);
59 Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.Phantom)); 73 Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.Phantom));
60 74
61 so.ScriptSetPhantomStatus(false); 75 m_so1.ScriptSetPhantomStatus(false);
62 76
63 Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); 77 Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None));
64 } 78 }
79
80 [Test]
81 public void TestSetPhysicsSinglePrim()
82 {
83 TestHelpers.InMethod();
84
85 m_scene.AddSceneObject(m_so1);
86
87 SceneObjectPart rootPart = m_so1.RootPart;
88 Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None));
89
90 m_so1.ScriptSetPhysicsStatus(true);
91
92// Console.WriteLine("so.RootPart.Flags [{0}]", so.RootPart.Flags);
93 Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.Physics));
94
95 m_so1.ScriptSetPhysicsStatus(false);
96
97 Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None));
98 }
99
100 [Test]
101 public void TestSetPhysicsLinkset()
102 {
103 TestHelpers.InMethod();
104
105 m_scene.AddSceneObject(m_so1);
106 m_scene.AddSceneObject(m_so2);
107
108 m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId });
109
110 m_so1.ScriptSetPhysicsStatus(true);
111
112 Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics));
113 Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics));
114
115 m_so1.ScriptSetPhysicsStatus(false);
116
117 Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.None));
118 Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.None));
119
120 m_so1.ScriptSetPhysicsStatus(true);
121
122 Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics));
123 Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics));
124 }
125
126 /// <summary>
127 /// Test that linking results in the correct physical status for all linkees.
128 /// </summary>
129 [Test]
130 public void TestLinkPhysicsBothPhysical()
131 {
132 TestHelpers.InMethod();
133
134 m_scene.AddSceneObject(m_so1);
135 m_scene.AddSceneObject(m_so2);
136
137 m_so1.ScriptSetPhysicsStatus(true);
138 m_so2.ScriptSetPhysicsStatus(true);
139
140 m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId });
141
142 Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics));
143 Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics));
144 }
145
146 /// <summary>
147 /// Test that linking results in the correct physical status for all linkees.
148 /// </summary>
149 [Test]
150 public void TestLinkPhysicsRootPhysicalOnly()
151 {
152 TestHelpers.InMethod();
153
154 m_scene.AddSceneObject(m_so1);
155 m_scene.AddSceneObject(m_so2);
156
157 m_so1.ScriptSetPhysicsStatus(true);
158
159 m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId });
160
161 Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics));
162 Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics));
163 }
164
165 /// <summary>
166 /// Test that linking results in the correct physical status for all linkees.
167 /// </summary>
168 [Test]
169 public void TestLinkPhysicsChildPhysicalOnly()
170 {
171 TestHelpers.InMethod();
172
173 m_scene.AddSceneObject(m_so1);
174 m_scene.AddSceneObject(m_so2);
175
176 m_so2.ScriptSetPhysicsStatus(true);
177
178 m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId });
179
180 Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.None));
181 Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.None));
182 }
65 } 183 }
66} \ No newline at end of file 184} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs
index c13d82e..c7eaff9 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs
@@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
58 58
59 UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); 59 UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001");
60 60
61 TestScene scene = SceneHelpers.SetupScene(); 61 TestScene scene = new SceneHelpers().SetupScene();
62 IConfigSource configSource = new IniConfigSource(); 62 IConfigSource configSource = new IniConfigSource();
63 63
64 IConfig startupConfig = configSource.AddConfig("Startup"); 64 IConfig startupConfig = configSource.AddConfig("Startup");
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs
index ed9b179..1aa48d7 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs
@@ -67,10 +67,12 @@ namespace OpenSim.Region.Framework.Scenes.Tests
67 public void Init() 67 public void Init()
68 { 68 {
69 TestHelpers.InMethod(); 69 TestHelpers.InMethod();
70 70
71 scene = SceneHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); 71 SceneHelpers sh = new SceneHelpers();
72 scene2 = SceneHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); 72
73 scene3 = SceneHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000); 73 scene = sh.SetupScene("Neighbour x", UUID.Random(), 1000, 1000);
74 scene2 = sh.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000);
75 scene3 = sh.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000);
74 76
75 ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); 77 ISharedRegionModule interregionComms = new LocalSimulationConnectorModule();
76 interregionComms.Initialise(new IniConfigSource()); 78 interregionComms.Initialise(new IniConfigSource());
@@ -101,7 +103,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
101 TestHelpers.InMethod(); 103 TestHelpers.InMethod();
102// log4net.Config.XmlConfigurator.Configure(); 104// log4net.Config.XmlConfigurator.Configure();
103 105
104 TestScene scene = SceneHelpers.SetupScene(); 106 TestScene scene = new SceneHelpers().SetupScene();
105 ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); 107 ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1));
106 108
107 Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Not.Null); 109 Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Not.Null);
@@ -126,7 +128,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
126 IConfig config = configSource.AddConfig("Modules"); 128 IConfig config = configSource.AddConfig("Modules");
127 config.Set("SimulationServices", "LocalSimulationConnectorModule"); 129 config.Set("SimulationServices", "LocalSimulationConnectorModule");
128 130
129 TestScene scene = SceneHelpers.SetupScene(); 131 SceneHelpers sceneHelpers = new SceneHelpers();
132 TestScene scene = sceneHelpers.SetupScene();
130 SceneHelpers.SetupSceneModules(scene, configSource, lsc); 133 SceneHelpers.SetupSceneModules(scene, configSource, lsc);
131 134
132 UUID agentId = TestHelpers.ParseTail(0x01); 135 UUID agentId = TestHelpers.ParseTail(0x01);
@@ -176,8 +179,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
176 179
177// UUID agent1Id = UUID.Parse("00000000-0000-0000-0000-000000000001"); 180// UUID agent1Id = UUID.Parse("00000000-0000-0000-0000-000000000001");
178 181
179 TestScene myScene1 = SceneHelpers.SetupScene("Neighbour y", UUID.Random(), 1000, 1000); 182 TestScene myScene1 = new SceneHelpers().SetupScene("Neighbour y", UUID.Random(), 1000, 1000);
180 TestScene myScene2 = SceneHelpers.SetupScene("Neighbour y + 1", UUID.Random(), 1001, 1000); 183 TestScene myScene2 = new SceneHelpers().SetupScene("Neighbour y + 1", UUID.Random(), 1001, 1000);
181 184
182 IConfigSource configSource = new IniConfigSource(); 185 IConfigSource configSource = new IniConfigSource();
183 IConfig config = configSource.AddConfig("Startup"); 186 IConfig config = configSource.AddConfig("Startup");
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs
index 89f8007..646e5fa 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs
@@ -59,7 +59,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
59 TestHelpers.InMethod(); 59 TestHelpers.InMethod();
60// log4net.Config.XmlConfigurator.Configure(); 60// log4net.Config.XmlConfigurator.Configure();
61 61
62 TestScene scene = SceneHelpers.SetupScene(); 62 TestScene scene = new SceneHelpers().SetupScene();
63 ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); 63 ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1));
64 sp.Flying = true; 64 sp.Flying = true;
65 sp.PhysicsCollisionUpdate(new CollisionEventUpdate()); 65 sp.PhysicsCollisionUpdate(new CollisionEventUpdate());
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs
index cfea10d..1d1ff88 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs
@@ -64,7 +64,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
64 [SetUp] 64 [SetUp]
65 public void Init() 65 public void Init()
66 { 66 {
67 m_scene = SceneHelpers.SetupScene(); 67 m_scene = new SceneHelpers().SetupScene();
68 } 68 }
69 69
70 [Test] 70 [Test]
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs
index b7b8db4..313e350 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs
@@ -50,7 +50,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
50 [SetUp] 50 [SetUp]
51 public void Init() 51 public void Init()
52 { 52 {
53 m_scene = SceneHelpers.SetupScene(); 53 m_scene = new SceneHelpers().SetupScene();
54 m_sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1)); 54 m_sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
55 } 55 }
56 56
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
index bebc10c..ea4fb66 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
@@ -34,10 +34,13 @@ using OpenSim.Framework;
34using OpenSim.Framework.Communications; 34using OpenSim.Framework.Communications;
35using OpenSim.Framework.Servers; 35using OpenSim.Framework.Servers;
36using OpenSim.Region.Framework.Interfaces; 36using OpenSim.Region.Framework.Interfaces;
37using OpenSim.Region.CoreModules.Framework;
38using OpenSim.Region.CoreModules.Framework.EntityTransfer;
37using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; 39using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
38using OpenSim.Tests.Common; 40using OpenSim.Tests.Common;
39using OpenSim.Tests.Common.Mock; 41using OpenSim.Tests.Common.Mock;
40using System.Threading; 42using System.IO;
43using System.Text;
41 44
42namespace OpenSim.Region.Framework.Scenes.Tests 45namespace OpenSim.Region.Framework.Scenes.Tests
43{ 46{
@@ -47,145 +50,190 @@ namespace OpenSim.Region.Framework.Scenes.Tests
47 [TestFixture] 50 [TestFixture]
48 public class ScenePresenceTeleportTests 51 public class ScenePresenceTeleportTests
49 { 52 {
50 /// <summary> 53 [TestFixtureSetUp]
51 /// Test a teleport between two regions that are not neighbours and do not share any neighbours in common. 54 public void FixtureInit()
52 /// </summary> 55 {
53 /// Does not yet do what is says on the tin. 56 // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
54 /// Commenting for now 57 Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
55 //[Test, LongRunning] 58 }
56 public void TestSimpleNotNeighboursTeleport() 59
60 [TestFixtureTearDown]
61 public void TearDown()
62 {
63 // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
64 // threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
65 // tests really shouldn't).
66 Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
67 }
68
69 [Test]
70 public void TestSameRegionTeleport()
57 { 71 {
58 TestHelpers.InMethod(); 72 TestHelpers.InMethod();
59 ThreadRunResults results = new ThreadRunResults(); 73// log4net.Config.XmlConfigurator.Configure();
60 results.Result = false;
61 results.Message = "Test did not run";
62 TestRunning testClass = new TestRunning(results);
63 74
64 Thread testThread = new Thread(testClass.run); 75 EntityTransferModule etm = new EntityTransferModule();
65 76
66 // Seems kind of redundant to start a thread and then join it, however.. We need to protect against 77 IConfigSource config = new IniConfigSource();
67 // A thread abort exception in the simulator code. 78 config.AddConfig("Modules");
68 testThread.Start(); 79 // Not strictly necessary since FriendsModule assumes it is the default (!)
69 testThread.Join(); 80 config.Configs["Modules"].Set("EntityTransferModule", etm.Name);
70 81
71 Assert.That(testClass.results.Result, Is.EqualTo(true), testClass.results.Message); 82 TestScene scene = new SceneHelpers().SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
72 // Console.WriteLine("Beginning test {0}", MethodBase.GetCurrentMethod()); 83 SceneHelpers.SetupSceneModules(scene, config, etm);
84
85 Vector3 teleportPosition = new Vector3(10, 11, 12);
86 Vector3 teleportLookAt = new Vector3(20, 21, 22);
87
88 ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1));
89 sp.AbsolutePosition = new Vector3(30, 31, 32);
90 scene.RequestTeleportLocation(
91 sp.ControllingClient,
92 scene.RegionInfo.RegionHandle,
93 teleportPosition,
94 teleportLookAt,
95 (uint)TeleportFlags.ViaLocation);
96
97 Assert.That(sp.AbsolutePosition, Is.EqualTo(teleportPosition));
98
99 // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera
100 // position instead).
101// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt));
73 } 102 }
74 103
75 [TearDown] 104 [Test]
76 public void TearDown() 105 public void TestSameSimulatorSeparatedRegionsTeleport()
77 { 106 {
78 try 107 TestHelpers.InMethod();
79 { 108// log4net.Config.XmlConfigurator.Configure();
80 if (MainServer.Instance != null) MainServer.Instance.Stop();
81 }
82 catch (NullReferenceException)
83 { }
84 }
85 109
86 } 110 UUID userId = TestHelpers.ParseTail(0x1);
87 111
88 public class ThreadRunResults 112 EntityTransferModule etm = new EntityTransferModule();
89 { 113 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
90 public bool Result = false;
91 public string Message = string.Empty;
92 }
93 114
94 public class TestRunning 115 IConfigSource config = new IniConfigSource();
95 { 116 IConfig modulesConfig = config.AddConfig("Modules");
96 public ThreadRunResults results; 117 modulesConfig.Set("EntityTransferModule", etm.Name);
97 public TestRunning(ThreadRunResults t) 118 modulesConfig.Set("SimulationServices", lscm.Name);
98 { 119 IConfig entityTransferConfig = config.AddConfig("EntityTransfer");
99 results = t; 120
121 // In order to run a single threaded regression test we do not want the entity transfer module waiting
122 // for a callback from the destination scene before removing its avatar data.
123 entityTransferConfig.Set("wait_for_callback", false);
124
125 SceneHelpers sh = new SceneHelpers();
126 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
127 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000);
128
129 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm);
130
131 Vector3 teleportPosition = new Vector3(10, 11, 12);
132 Vector3 teleportLookAt = new Vector3(20, 21, 22);
133
134 ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager);
135 sp.AbsolutePosition = new Vector3(30, 31, 32);
136
137 // XXX: A very nasty hack to tell the client about the destination scene without having to crank the whole
138 // UDP stack (?)
139// ((TestClient)sp.ControllingClient).TeleportTargetScene = sceneB;
140
141 sceneA.RequestTeleportLocation(
142 sp.ControllingClient,
143 sceneB.RegionInfo.RegionHandle,
144 teleportPosition,
145 teleportLookAt,
146 (uint)TeleportFlags.ViaLocation);
147
148 ((TestClient)sp.ControllingClient).CompleteTeleportClientSide();
149
150 Assert.That(sceneA.GetScenePresence(userId), Is.Null);
151
152 ScenePresence sceneBSp = sceneB.GetScenePresence(userId);
153 Assert.That(sceneBSp, Is.Not.Null);
154 Assert.That(sceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName));
155 Assert.That(sceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition));
156
157 // TODO: Add assertions to check correct circuit details in both scenes.
158
159 // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera
160 // position instead).
161// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt));
100 } 162 }
101 public void run(object o) 163
164 [Test]
165 public void TestSameSimulatorNeighbouringRegionsTeleport()
102 { 166 {
103 167 TestHelpers.InMethod();
104 //results.Result = true; 168// TestHelpers.EnableLogging();
105 log4net.Config.XmlConfigurator.Configure(); 169
106 170 UUID userId = TestHelpers.ParseTail(0x1);
107 UUID sceneAId = UUID.Parse("00000000-0000-0000-0000-000000000100"); 171
108 UUID sceneBId = UUID.Parse("00000000-0000-0000-0000-000000000200"); 172 EntityTransferModule etm = new EntityTransferModule();
109 173 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
110 // shared module 174
111 ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); 175 IConfigSource config = new IniConfigSource();
112 176 IConfig modulesConfig = config.AddConfig("Modules");
113 177 modulesConfig.Set("EntityTransferModule", etm.Name);
114 Scene sceneB = SceneHelpers.SetupScene("sceneB", sceneBId, 1010, 1010); 178 modulesConfig.Set("SimulationServices", lscm.Name);
115 SceneHelpers.SetupSceneModules(sceneB, new IniConfigSource(), interregionComms); 179 IConfig entityTransferConfig = config.AddConfig("EntityTransfer");
116 sceneB.RegisterRegionWithGrid(); 180
117 181 // In order to run a single threaded regression test we do not want the entity transfer module waiting
118 Scene sceneA = SceneHelpers.SetupScene("sceneA", sceneAId, 1000, 1000); 182 // for a callback from the destination scene before removing its avatar data.
119 SceneHelpers.SetupSceneModules(sceneA, new IniConfigSource(), interregionComms); 183 entityTransferConfig.Set("wait_for_callback", false);
120 sceneA.RegisterRegionWithGrid(); 184
121 185 SceneHelpers sh = new SceneHelpers();
122 UUID agentId = UUID.Parse("00000000-0000-0000-0000-000000000041"); 186 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
123 TestClient client = (TestClient)SceneHelpers.AddScenePresence(sceneA, agentId).ControllingClient; 187 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1001, 1000);
124 188
125 ICapabilitiesModule sceneACapsModule = sceneA.RequestModuleInterface<ICapabilitiesModule>(); 189 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm);
126 190 SceneHelpers.SetupSceneModules(sceneA, new CapabilitiesModule());
127 results.Result = (sceneACapsModule.GetCapsPath(agentId) == client.CapsSeedUrl); 191 SceneHelpers.SetupSceneModules(sceneB, new CapabilitiesModule());
128 192
129 if (!results.Result) 193 Vector3 teleportPosition = new Vector3(10, 11, 12);
130 { 194 Vector3 teleportLookAt = new Vector3(20, 21, 22);
131 results.Message = "Incorrect caps object path set up in sceneA"; 195
132 return; 196 ScenePresence originalSp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager);
133 } 197 originalSp.AbsolutePosition = new Vector3(30, 31, 32);
134 198
135 /* 199 ScenePresence beforeSceneASp = sceneA.GetScenePresence(userId);
136 Assert.That( 200 Assert.That(beforeSceneASp, Is.Not.Null);
137 sceneACapsModule.GetCapsPath(agentId), 201 Assert.That(beforeSceneASp.IsChildAgent, Is.False);
138 Is.EqualTo(client.CapsSeedUrl), 202
139 "Incorrect caps object path set up in sceneA"); 203 ScenePresence beforeSceneBSp = sceneB.GetScenePresence(userId);
140 */ 204 Assert.That(beforeSceneBSp, Is.Not.Null);
141 // FIXME: This is a hack to get the test working - really the normal OpenSim mechanisms should be used. 205 Assert.That(beforeSceneBSp.IsChildAgent, Is.True);
142 206
143 207 // XXX: A very nasty hack to tell the client about the destination scene without having to crank the whole
144 client.TeleportTargetScene = sceneB; 208 // UDP stack (?)
145 client.Teleport(sceneB.RegionInfo.RegionHandle, new Vector3(100, 100, 100), new Vector3(40, 40, 40)); 209// ((TestClient)beforeSceneASp.ControllingClient).TeleportTargetScene = sceneB;
146 210
147 results.Result = (sceneB.GetScenePresence(agentId) != null); 211 sceneA.RequestTeleportLocation(
148 if (!results.Result) 212 beforeSceneASp.ControllingClient,
149 { 213 sceneB.RegionInfo.RegionHandle,
150 results.Message = "Client does not have an agent in sceneB"; 214 teleportPosition,
151 return; 215 teleportLookAt,
152 } 216 (uint)TeleportFlags.ViaLocation);
153 217
154 //Assert.That(sceneB.GetScenePresence(agentId), Is.Not.Null, "Client does not have an agent in sceneB"); 218 ((TestClient)beforeSceneASp.ControllingClient).CompleteTeleportClientSide();
155 219
156 //Assert.That(sceneA.GetScenePresence(agentId), Is.Null, "Client still had an agent in sceneA"); 220 ScenePresence afterSceneASp = sceneA.GetScenePresence(userId);
157 221 Assert.That(afterSceneASp, Is.Not.Null);
158 results.Result = (sceneA.GetScenePresence(agentId) == null); 222 Assert.That(afterSceneASp.IsChildAgent, Is.True);
159 if (!results.Result) 223
160 { 224 ScenePresence afterSceneBSp = sceneB.GetScenePresence(userId);
161 results.Message = "Client still had an agent in sceneA"; 225 Assert.That(afterSceneBSp, Is.Not.Null);
162 return; 226 Assert.That(afterSceneBSp.IsChildAgent, Is.False);
163 } 227 Assert.That(afterSceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName));
164 228 Assert.That(afterSceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition));
165 ICapabilitiesModule sceneBCapsModule = sceneB.RequestModuleInterface<ICapabilitiesModule>(); 229
166 230 // TODO: Add assertions to check correct circuit details in both scenes.
167 231
168 results.Result = ("http://" + sceneB.RegionInfo.ExternalHostName + ":" + sceneB.RegionInfo.HttpPort + 232 // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera
169 "/CAPS/" + sceneBCapsModule.GetCapsPath(agentId) + "0000/" == client.CapsSeedUrl); 233 // position instead).
170 if (!results.Result) 234// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt));
171 { 235
172 results.Message = "Incorrect caps object path set up in sceneB"; 236// TestHelpers.DisableLogging();
173 return;
174 }
175
176 // Temporary assertion - caps url construction should at least be doable through a method.
177 /*
178 Assert.That(
179 "http://" + sceneB.RegionInfo.ExternalHostName + ":" + sceneB.RegionInfo.HttpPort + "/CAPS/" + sceneBCapsModule.GetCapsPath(agentId) + "0000/",
180 Is.EqualTo(client.CapsSeedUrl),
181 "Incorrect caps object path set up in sceneB");
182 */
183 // This assertion will currently fail since we don't remove the caps paths when no longer needed
184 //Assert.That(sceneACapsModule.GetCapsPath(agentId), Is.Null, "sceneA still had a caps object path");
185
186 // TODO: Check that more of everything is as it should be
187
188 // TODO: test what happens if we try to teleport to a region that doesn't exist
189 } 237 }
190 } 238 }
191} 239} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
index 5c9a77d..d722a09 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
@@ -60,7 +60,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
60 { 60 {
61 TestHelpers.InMethod(); 61 TestHelpers.InMethod();
62 62
63 Scene scene = SceneHelpers.SetupScene(); 63 Scene scene = new SceneHelpers().SetupScene();
64 scene.Update(1); 64 scene.Update(1);
65 65
66 Assert.That(scene.Frame, Is.EqualTo(1)); 66 Assert.That(scene.Frame, Is.EqualTo(1));
diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs
index 55c80f5..d15141b 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs
@@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Tests
58 TestHelpers.InMethod(); 58 TestHelpers.InMethod();
59// log4net.Config.XmlConfigurator.Configure(); 59// log4net.Config.XmlConfigurator.Configure();
60 60
61 Scene scene = SceneHelpers.SetupScene(); 61 Scene scene = new SceneHelpers().SetupScene();
62 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); 62 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene);
63 SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); 63 SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID);
64 SceneObjectPart sop1 = sog1.RootPart; 64 SceneObjectPart sop1 = sog1.RootPart;
@@ -81,7 +81,7 @@ namespace OpenSim.Region.Framework.Tests
81 TestHelpers.InMethod(); 81 TestHelpers.InMethod();
82// log4net.Config.XmlConfigurator.Configure(); 82// log4net.Config.XmlConfigurator.Configure();
83 83
84 Scene scene = SceneHelpers.SetupScene(); 84 Scene scene = new SceneHelpers().SetupScene();
85 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); 85 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene);
86 SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); 86 SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID);
87 SceneObjectPart sop1 = sog1.RootPart; 87 SceneObjectPart sop1 = sog1.RootPart;
@@ -124,7 +124,7 @@ namespace OpenSim.Region.Framework.Tests
124 TestHelpers.InMethod(); 124 TestHelpers.InMethod();
125// log4net.Config.XmlConfigurator.Configure(); 125// log4net.Config.XmlConfigurator.Configure();
126 126
127 Scene scene = SceneHelpers.SetupScene(); 127 Scene scene = new SceneHelpers().SetupScene();
128 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); 128 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene);
129 SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); 129 SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID);
130 SceneObjectPart sop1 = sog1.RootPart; 130 SceneObjectPart sop1 = sog1.RootPart;
@@ -153,7 +153,7 @@ namespace OpenSim.Region.Framework.Tests
153 TestHelpers.InMethod(); 153 TestHelpers.InMethod();
154// log4net.Config.XmlConfigurator.Configure(); 154// log4net.Config.XmlConfigurator.Configure();
155 155
156 Scene scene = SceneHelpers.SetupScene(); 156 Scene scene = new SceneHelpers().SetupScene();
157 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); 157 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene);
158 SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); 158 SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID);
159 SceneObjectPart sop1 = sog1.RootPart; 159 SceneObjectPart sop1 = sog1.RootPart;
diff --git a/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs
index 55fc1e7..44d2d45 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs
@@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Tests
58 TestHelpers.InMethod(); 58 TestHelpers.InMethod();
59// log4net.Config.XmlConfigurator.Configure(); 59// log4net.Config.XmlConfigurator.Configure();
60 60
61 Scene scene = SceneHelpers.SetupScene(); 61 Scene scene = new SceneHelpers().SetupScene();
62 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1001)); 62 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1001));
63 UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002)); 63 UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002));
64 InventoryItemBase item1 = UserInventoryHelpers.CreateInventoryItem(scene, "item1", user1.PrincipalID); 64 InventoryItemBase item1 = UserInventoryHelpers.CreateInventoryItem(scene, "item1", user1.PrincipalID);
@@ -85,7 +85,7 @@ namespace OpenSim.Region.Framework.Tests
85 TestHelpers.InMethod(); 85 TestHelpers.InMethod();
86// log4net.Config.XmlConfigurator.Configure(); 86// log4net.Config.XmlConfigurator.Configure();
87 87
88 Scene scene = SceneHelpers.SetupScene(); 88 Scene scene = new SceneHelpers().SetupScene();
89 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1001)); 89 UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1001));
90 UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002)); 90 UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002));
91 InventoryFolderBase folder1 91 InventoryFolderBase folder1
diff --git a/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs b/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs
index d9fe87c..198e487 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs
@@ -47,7 +47,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
47 public void Init() 47 public void Init()
48 { 48 {
49 // FIXME: We don't need a full scene here - it would be enough to set up the asset service. 49 // FIXME: We don't need a full scene here - it would be enough to set up the asset service.
50 Scene scene = SceneHelpers.SetupScene(); 50 Scene scene = new SceneHelpers().SetupScene();
51 m_assetService = scene.AssetService; 51 m_assetService = scene.AssetService;
52 m_uuidGatherer = new UuidGatherer(m_assetService); 52 m_uuidGatherer = new UuidGatherer(m_assetService);
53 } 53 }