aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/ScenePresence.cs
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2013-08-08 23:29:30 +0100
committerJustin Clark-Casey (justincc)2013-08-08 23:29:30 +0100
commitb1c26a56b3d615f3709363e3a2f91b5423f5891f (patch)
treeea87893e6a13813dcf383d064fe33d3b3740c7ce /OpenSim/Region/Framework/Scenes/ScenePresence.cs
parentminor: Remove console lines at bottom of FakeParcelIDTests() regression test ... (diff)
downloadopensim-SC_OLD-b1c26a56b3d615f3709363e3a2f91b5423f5891f.zip
opensim-SC_OLD-b1c26a56b3d615f3709363e3a2f91b5423f5891f.tar.gz
opensim-SC_OLD-b1c26a56b3d615f3709363e3a2f91b5423f5891f.tar.bz2
opensim-SC_OLD-b1c26a56b3d615f3709363e3a2f91b5423f5891f.tar.xz
Fix an issue where under teleport v2 protocol, teleporting from regions in an line from A->B->C would not close region A when reaching C
The root cause was that v2 was only closing neighbour agents if the root connection also needed a close. However, fixing this requires the neighbour regions also detect when they should not close due to re-teleports re-establishing the child connection. This involves restructuring the code to introduce a scene presence state machine that can serialize the different add and remove client calls that are now possible with the late close of the This commit appears to fix these issues and improve teleport, but still has holes on at least quick reteleporting (and possibly occasionally on ordinary teleports). Also, has not been completely tested yet in scenarios where regions are running on different simulators
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs36
1 files changed, 32 insertions, 4 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 7fd1302..bdcdf03 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -74,6 +74,8 @@ namespace OpenSim.Region.Framework.Scenes
74 74
75 public class ScenePresence : EntityBase, IScenePresence 75 public class ScenePresence : EntityBase, IScenePresence
76 { 76 {
77 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
78
77// ~ScenePresence() 79// ~ScenePresence()
78// { 80// {
79// m_log.DebugFormat("[SCENE PRESENCE]: Destructor called on {0}", Name); 81// m_log.DebugFormat("[SCENE PRESENCE]: Destructor called on {0}", Name);
@@ -85,10 +87,27 @@ namespace OpenSim.Region.Framework.Scenes
85 m_scene.EventManager.TriggerScenePresenceUpdated(this); 87 m_scene.EventManager.TriggerScenePresenceUpdated(this);
86 } 88 }
87 89
88 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
89
90 public PresenceType PresenceType { get; private set; } 90 public PresenceType PresenceType { get; private set; }
91 91
92 private ScenePresenceStateMachine m_stateMachine;
93
94 /// <summary>
95 /// The current state of this presence. Governs only the existence lifecycle. See ScenePresenceStateMachine
96 /// for more details.
97 /// </summary>
98 public ScenePresenceState LifecycleState
99 {
100 get
101 {
102 return m_stateMachine.GetState();
103 }
104
105 set
106 {
107 m_stateMachine.SetState(value);
108 }
109 }
110
92// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes(); 111// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
93 private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags)); 112 private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
94 private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f); 113 private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
@@ -766,7 +785,7 @@ namespace OpenSim.Region.Framework.Scenes
766 785
767 public ScenePresence( 786 public ScenePresence(
768 IClientAPI client, Scene world, AvatarAppearance appearance, PresenceType type) 787 IClientAPI client, Scene world, AvatarAppearance appearance, PresenceType type)
769 { 788 {
770 AttachmentsSyncLock = new Object(); 789 AttachmentsSyncLock = new Object();
771 AllowMovement = true; 790 AllowMovement = true;
772 IsChildAgent = true; 791 IsChildAgent = true;
@@ -811,6 +830,8 @@ namespace OpenSim.Region.Framework.Scenes
811 SetDirectionVectors(); 830 SetDirectionVectors();
812 831
813 Appearance = appearance; 832 Appearance = appearance;
833
834 m_stateMachine = new ScenePresenceStateMachine(this);
814 } 835 }
815 836
816 public void RegisterToEvents() 837 public void RegisterToEvents()
@@ -879,7 +900,7 @@ namespace OpenSim.Region.Framework.Scenes
879 /// </summary> 900 /// </summary>
880 public void MakeRootAgent(Vector3 pos, bool isFlying) 901 public void MakeRootAgent(Vector3 pos, bool isFlying)
881 { 902 {
882 m_log.DebugFormat( 903 m_log.InfoFormat(
883 "[SCENE]: Upgrading child to root agent for {0} in {1}", 904 "[SCENE]: Upgrading child to root agent for {0} in {1}",
884 Name, m_scene.RegionInfo.RegionName); 905 Name, m_scene.RegionInfo.RegionName);
885 906
@@ -887,6 +908,11 @@ namespace OpenSim.Region.Framework.Scenes
887 908
888 IsChildAgent = false; 909 IsChildAgent = false;
889 910
911 // Must reset this here so that a teleport to a region next to an existing region does not keep the flag
912 // set and prevent the close of the connection on a subsequent re-teleport.
913 // Should not be needed if we are not trying to tell this region to close
914// DoNotCloseAfterTeleport = false;
915
890 IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>(); 916 IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>();
891 if (gm != null) 917 if (gm != null)
892 Grouptitle = gm.GetGroupTitle(m_uuid); 918 Grouptitle = gm.GetGroupTitle(m_uuid);
@@ -3738,6 +3764,8 @@ namespace OpenSim.Region.Framework.Scenes
3738 // m_reprioritizationTimer.Dispose(); 3764 // m_reprioritizationTimer.Dispose();
3739 3765
3740 RemoveFromPhysicalScene(); 3766 RemoveFromPhysicalScene();
3767
3768 LifecycleState = ScenePresenceState.Removed;
3741 } 3769 }
3742 3770
3743 public void AddAttachment(SceneObjectGroup gobj) 3771 public void AddAttachment(SceneObjectGroup gobj)