diff options
author | Justin Clark-Casey (justincc) | 2013-08-08 23:29:30 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2013-08-08 23:29:30 +0100 |
commit | b1c26a56b3d615f3709363e3a2f91b5423f5891f (patch) | |
tree | ea87893e6a13813dcf383d064fe33d3b3740c7ce /OpenSim/Region/Framework/Scenes/ScenePresence.cs | |
parent | minor: Remove console lines at bottom of FakeParcelIDTests() regression test ... (diff) | |
download | opensim-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.cs | 36 |
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) |