diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
6 files changed, 55 insertions, 14 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index dd4c14b..a18bf76 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -256,7 +256,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
256 | 256 | ||
257 | if (isScriptRunning) | 257 | if (isScriptRunning) |
258 | { | 258 | { |
259 | part.Inventory.RemoveScriptInstance(item.ItemID); | 259 | part.Inventory.RemoveScriptInstance(item.ItemID, false); |
260 | } | 260 | } |
261 | 261 | ||
262 | // Update item with new asset | 262 | // Update item with new asset |
@@ -859,8 +859,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
859 | 859 | ||
860 | if (item.Type == 10) | 860 | if (item.Type == 10) |
861 | { | 861 | { |
862 | part.RemoveScriptEvents(itemID); | ||
862 | EventManager.TriggerRemoveScript(localID, itemID); | 863 | EventManager.TriggerRemoveScript(localID, itemID); |
863 | } | 864 | } |
865 | |||
864 | group.RemoveInventoryItem(localID, itemID); | 866 | group.RemoveInventoryItem(localID, itemID); |
865 | part.GetProperties(remoteClient); | 867 | part.GetProperties(remoteClient); |
866 | } | 868 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index db21bf9..23db482 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -1023,7 +1023,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1023 | { | 1023 | { |
1024 | if (ent is SceneObjectGroup) | 1024 | if (ent is SceneObjectGroup) |
1025 | { | 1025 | { |
1026 | ((SceneObjectGroup) ent).RemoveScriptInstances(); | 1026 | ((SceneObjectGroup) ent).RemoveScriptInstances(false); |
1027 | } | 1027 | } |
1028 | } | 1028 | } |
1029 | } | 1029 | } |
@@ -1911,13 +1911,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
1911 | /// <param name="silent">Suppress broadcasting changes to other clients.</param> | 1911 | /// <param name="silent">Suppress broadcasting changes to other clients.</param> |
1912 | public void DeleteSceneObject(SceneObjectGroup group, bool silent) | 1912 | public void DeleteSceneObject(SceneObjectGroup group, bool silent) |
1913 | { | 1913 | { |
1914 | // m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID); | ||
1915 | |||
1914 | //SceneObjectPart rootPart = group.GetChildPart(group.UUID); | 1916 | //SceneObjectPart rootPart = group.GetChildPart(group.UUID); |
1915 | 1917 | ||
1916 | // Serialise calls to RemoveScriptInstances to avoid | 1918 | // Serialise calls to RemoveScriptInstances to avoid |
1917 | // deadlocking on m_parts inside SceneObjectGroup | 1919 | // deadlocking on m_parts inside SceneObjectGroup |
1918 | lock (m_deleting_scene_object) | 1920 | lock (m_deleting_scene_object) |
1919 | { | 1921 | { |
1920 | group.RemoveScriptInstances(); | 1922 | group.RemoveScriptInstances(true); |
1921 | } | 1923 | } |
1922 | 1924 | ||
1923 | foreach (SceneObjectPart part in group.Children.Values) | 1925 | foreach (SceneObjectPart part in group.Children.Values) |
@@ -1945,6 +1947,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1945 | } | 1947 | } |
1946 | 1948 | ||
1947 | group.DeleteGroup(silent); | 1949 | group.DeleteGroup(silent); |
1950 | |||
1951 | // m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID); | ||
1948 | } | 1952 | } |
1949 | 1953 | ||
1950 | /// <summary> | 1954 | /// <summary> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs index 65ce13a..aea005e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs | |||
@@ -46,8 +46,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
46 | /// </summary> | 46 | /// </summary> |
47 | public void ForceInventoryPersistence() | 47 | public void ForceInventoryPersistence() |
48 | { | 48 | { |
49 | lockPartsForRead(true); | 49 | lockPartsForRead(true); |
50 | List<SceneObjectPart> values = new List<SceneObjectPart>(m_parts.Values); | 50 | List<SceneObjectPart> values = new List<SceneObjectPart>(m_parts.Values); |
51 | lockPartsForRead(false); | 51 | lockPartsForRead(false); |
52 | foreach (SceneObjectPart part in values) | 52 | foreach (SceneObjectPart part in values) |
53 | { | 53 | { |
@@ -75,9 +75,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
75 | /// Stop the scripts contained in all the prims in this group | 75 | /// Stop the scripts contained in all the prims in this group |
76 | /// </summary> | 76 | /// </summary> |
77 | public void RemoveScriptInstances() | 77 | public void RemoveScriptInstances() |
78 | { | 78 | { |
79 | lockPartsForRead(true); | 79 | lockPartsForRead(true); |
80 | List<SceneObjectPart> values = new List<SceneObjectPart>(m_parts.Values); | 80 | List<SceneObjectPart> values = new List<SceneObjectPart>(m_parts.Values); |
81 | lockPartsForRead(false); | 81 | lockPartsForRead(false); |
82 | 82 | ||
83 | foreach (SceneObjectPart part in values) | 83 | foreach (SceneObjectPart part in values) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 04be9fc..da7ec44 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -2489,7 +2489,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2489 | //m_log.Debug("prev: " + prevflag.ToString() + " curr: " + Flags.ToString()); | 2489 | //m_log.Debug("prev: " + prevflag.ToString() + " curr: " + Flags.ToString()); |
2490 | //ScheduleFullUpdate(); | 2490 | //ScheduleFullUpdate(); |
2491 | } | 2491 | } |
2492 | 2492 | ||
2493 | public void RemoveScriptEvents(UUID scriptid) | 2493 | public void RemoveScriptEvents(UUID scriptid) |
2494 | { | 2494 | { |
2495 | lock (m_scriptEvents) | 2495 | lock (m_scriptEvents) |
@@ -2543,6 +2543,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2543 | /// </summary> | 2543 | /// </summary> |
2544 | public void ScheduleFullUpdate() | 2544 | public void ScheduleFullUpdate() |
2545 | { | 2545 | { |
2546 | // m_log.DebugFormat("[SCENE OBJECT PART]: Scheduling full update for {0} {1}", Name, LocalId); | ||
2547 | |||
2546 | if (m_parentGroup != null) | 2548 | if (m_parentGroup != null) |
2547 | { | 2549 | { |
2548 | m_parentGroup.QueueForUpdateCheck(); | 2550 | m_parentGroup.QueueForUpdateCheck(); |
@@ -4069,6 +4071,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
4069 | 4071 | ||
4070 | if (m_parentGroup == null) | 4072 | if (m_parentGroup == null) |
4071 | { | 4073 | { |
4074 | // m_log.DebugFormat( | ||
4075 | // "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents() since m_parentGroup == null", Name, LocalId); | ||
4072 | ScheduleFullUpdate(); | 4076 | ScheduleFullUpdate(); |
4073 | return; | 4077 | return; |
4074 | } | 4078 | } |
@@ -4085,9 +4089,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
4085 | LocalFlags=(PrimFlags)objectflagupdate; | 4089 | LocalFlags=(PrimFlags)objectflagupdate; |
4086 | 4090 | ||
4087 | if (m_parentGroup != null && m_parentGroup.RootPart == this) | 4091 | if (m_parentGroup != null && m_parentGroup.RootPart == this) |
4092 | { | ||
4088 | m_parentGroup.aggregateScriptEvents(); | 4093 | m_parentGroup.aggregateScriptEvents(); |
4094 | } | ||
4089 | else | 4095 | else |
4096 | { | ||
4097 | // m_log.DebugFormat( | ||
4098 | // "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents()", Name, LocalId); | ||
4090 | ScheduleFullUpdate(); | 4099 | ScheduleFullUpdate(); |
4100 | } | ||
4091 | } | 4101 | } |
4092 | 4102 | ||
4093 | public int registerTargetWaypoint(Vector3 target, float tolerance) | 4103 | public int registerTargetWaypoint(Vector3 target, float tolerance) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index c3c6342..1de0092 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -235,7 +235,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
235 | /// <summary> | 235 | /// <summary> |
236 | /// Stop all the scripts in this prim. | 236 | /// Stop all the scripts in this prim. |
237 | /// </summary> | 237 | /// </summary> |
238 | public void RemoveScriptInstances() | 238 | /// <param name="sceneObjectBeingDeleted"> |
239 | /// Should be true if these scripts are being removed because the scene | ||
240 | /// object is being deleted. This will prevent spurious updates to the client. | ||
241 | /// </param> | ||
242 | public void RemoveScriptInstances(bool sceneObjectBeingDeleted) | ||
239 | { | 243 | { |
240 | Items.LockItemsForRead(true); | 244 | Items.LockItemsForRead(true); |
241 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | 245 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); |
@@ -412,10 +416,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
412 | /// Stop a script which is in this prim's inventory. | 416 | /// Stop a script which is in this prim's inventory. |
413 | /// </summary> | 417 | /// </summary> |
414 | /// <param name="itemId"></param> | 418 | /// <param name="itemId"></param> |
415 | public void RemoveScriptInstance(UUID itemId) | 419 | /// <param name="sceneObjectBeingDeleted"> |
420 | /// Should be true if this script is being removed because the scene | ||
421 | /// object is being deleted. This will prevent spurious updates to the client. | ||
422 | /// </param> | ||
423 | public void RemoveScriptInstance(UUID itemId, bool sceneObjectBeingDeleted) | ||
416 | { | 424 | { |
417 | if (m_items.ContainsKey(itemId)) | 425 | if (m_items.ContainsKey(itemId)) |
418 | { | 426 | { |
427 | if (!sceneObjectBeingDeleted) | ||
428 | m_part.RemoveScriptEvents(itemId); | ||
429 | |||
419 | m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemId); | 430 | m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemId); |
420 | m_part.ParentGroup.AddActiveScriptCount(-1); | 431 | m_part.ParentGroup.AddActiveScriptCount(-1); |
421 | } | 432 | } |
@@ -496,7 +507,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
496 | if (i.Name == item.Name) | 507 | if (i.Name == item.Name) |
497 | { | 508 | { |
498 | if (i.InvType == (int)InventoryType.LSL) | 509 | if (i.InvType == (int)InventoryType.LSL) |
499 | RemoveScriptInstance(i.ItemID); | 510 | RemoveScriptInstance(i.ItemID, false); |
500 | 511 | ||
501 | RemoveInventoryItem(i.ItemID); | 512 | RemoveInventoryItem(i.ItemID); |
502 | break; | 513 | break; |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 64bfaba..27df3b2 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -1319,6 +1319,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1319 | 1319 | ||
1320 | if (m_allowMovement) | 1320 | if (m_allowMovement) |
1321 | { | 1321 | { |
1322 | if (agentData.UseClientAgentPosition) | ||
1323 | { | ||
1324 | m_moveToPositionInProgress = (agentData.ClientAgentPosition - AbsolutePosition).Length() > 0.2f; | ||
1325 | m_moveToPositionTarget = agentData.ClientAgentPosition; | ||
1326 | } | ||
1327 | |||
1322 | int i = 0; | 1328 | int i = 0; |
1323 | 1329 | ||
1324 | bool update_rotation = false; | 1330 | bool update_rotation = false; |
@@ -1421,7 +1427,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1421 | if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving)) | 1427 | if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving)) |
1422 | { | 1428 | { |
1423 | //Check the error term of the current position in relation to the target position | 1429 | //Check the error term of the current position in relation to the target position |
1424 | if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 1.5f) | 1430 | if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 0.5f) |
1425 | { | 1431 | { |
1426 | // we are close enough to the target | 1432 | // we are close enough to the target |
1427 | m_moveToPositionTarget = Vector3.Zero; | 1433 | m_moveToPositionTarget = Vector3.Zero; |
@@ -2969,7 +2975,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
2969 | protected void CrossToNewRegion() | 2975 | protected void CrossToNewRegion() |
2970 | { | 2976 | { |
2971 | InTransit(); | 2977 | InTransit(); |
2972 | m_scene.CrossAgentToNewRegion(this, m_physicsActor.Flying); | 2978 | try |
2979 | { | ||
2980 | m_scene.CrossAgentToNewRegion(this, m_physicsActor.Flying); | ||
2981 | } | ||
2982 | catch(Exception ex) | ||
2983 | { | ||
2984 | m_scene.CrossAgentToNewRegion(this, false); | ||
2985 | } | ||
2986 | |||
2973 | } | 2987 | } |
2974 | 2988 | ||
2975 | public void InTransit() | 2989 | public void InTransit() |