diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 139 |
1 files changed, 88 insertions, 51 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 13854c7..429fc06 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -233,6 +233,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
233 | private bool m_collisionEventFlag = false; | 233 | private bool m_collisionEventFlag = false; |
234 | private object m_collisionEventLock = new Object(); | 234 | private object m_collisionEventLock = new Object(); |
235 | 235 | ||
236 | private Vector3 m_prevSitOffset; | ||
237 | |||
236 | protected AvatarAppearance m_appearance; | 238 | protected AvatarAppearance m_appearance; |
237 | 239 | ||
238 | public AvatarAppearance Appearance | 240 | public AvatarAppearance Appearance |
@@ -644,6 +646,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
644 | } | 646 | } |
645 | private uint m_parentID; | 647 | private uint m_parentID; |
646 | 648 | ||
649 | public UUID ParentUUID | ||
650 | { | ||
651 | get { return m_parentUUID; } | ||
652 | set { m_parentUUID = value; } | ||
653 | } | ||
654 | private UUID m_parentUUID = UUID.Zero; | ||
655 | |||
647 | public float Health | 656 | public float Health |
648 | { | 657 | { |
649 | get { return m_health; } | 658 | get { return m_health; } |
@@ -865,7 +874,26 @@ namespace OpenSim.Region.Framework.Scenes | |||
865 | "[SCENE]: Upgrading child to root agent for {0} in {1}", | 874 | "[SCENE]: Upgrading child to root agent for {0} in {1}", |
866 | Name, m_scene.RegionInfo.RegionName); | 875 | Name, m_scene.RegionInfo.RegionName); |
867 | 876 | ||
868 | //m_log.DebugFormat("[SCENE]: known regions in {0}: {1}", Scene.RegionInfo.RegionName, KnownChildRegionHandles.Count); | 877 | if (ParentUUID != UUID.Zero) |
878 | { | ||
879 | m_log.DebugFormat("[SCENE PRESENCE]: Sitting avatar back on prim {0}", ParentUUID); | ||
880 | SceneObjectPart part = m_scene.GetSceneObjectPart(ParentUUID); | ||
881 | if (part == null) | ||
882 | { | ||
883 | m_log.ErrorFormat("[SCENE PRESENCE]: Can't find prim {0} to sit on", ParentUUID); | ||
884 | } | ||
885 | else | ||
886 | { | ||
887 | part.ParentGroup.AddAvatar(UUID); | ||
888 | if (part.SitTargetPosition != Vector3.Zero) | ||
889 | part.SitTargetAvatar = UUID; | ||
890 | ParentPosition = part.GetWorldPosition(); | ||
891 | ParentID = part.LocalId; | ||
892 | m_pos = m_prevSitOffset; | ||
893 | pos = ParentPosition; | ||
894 | } | ||
895 | ParentUUID = UUID.Zero; | ||
896 | } | ||
869 | 897 | ||
870 | bool wasChild = IsChildAgent; | 898 | bool wasChild = IsChildAgent; |
871 | IsChildAgent = false; | 899 | IsChildAgent = false; |
@@ -878,62 +906,64 @@ namespace OpenSim.Region.Framework.Scenes | |||
878 | 906 | ||
879 | m_scene.EventManager.TriggerSetRootAgentScene(m_uuid, m_scene); | 907 | m_scene.EventManager.TriggerSetRootAgentScene(m_uuid, m_scene); |
880 | 908 | ||
881 | // Moved this from SendInitialData to ensure that Appearance is initialized | 909 | if (ParentID == 0) |
882 | // before the inventory is processed in MakeRootAgent. This fixes a race condition | ||
883 | // related to the handling of attachments | ||
884 | //m_scene.GetAvatarAppearance(ControllingClient, out Appearance); | ||
885 | if (m_scene.TestBorderCross(pos, Cardinals.E)) | ||
886 | { | 910 | { |
887 | Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E); | 911 | // Moved this from SendInitialData to ensure that Appearance is initialized |
888 | pos.X = crossedBorder.BorderLine.Z - 1; | 912 | // before the inventory is processed in MakeRootAgent. This fixes a race condition |
889 | } | 913 | // related to the handling of attachments |
914 | //m_scene.GetAvatarAppearance(ControllingClient, out Appearance); | ||
915 | if (m_scene.TestBorderCross(pos, Cardinals.E)) | ||
916 | { | ||
917 | Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E); | ||
918 | pos.X = crossedBorder.BorderLine.Z - 1; | ||
919 | } | ||
890 | 920 | ||
891 | if (m_scene.TestBorderCross(pos, Cardinals.N)) | 921 | if (m_scene.TestBorderCross(pos, Cardinals.N)) |
892 | { | 922 | { |
893 | Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N); | 923 | Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N); |
894 | pos.Y = crossedBorder.BorderLine.Z - 1; | 924 | pos.Y = crossedBorder.BorderLine.Z - 1; |
895 | } | 925 | } |
896 | 926 | ||
897 | CheckAndAdjustLandingPoint(ref pos); | 927 | CheckAndAdjustLandingPoint(ref pos); |
898 | 928 | ||
899 | if (pos.X < 0f || pos.Y < 0f || pos.Z < 0f) | 929 | if (pos.X < 0f || pos.Y < 0f || pos.Z < 0f) |
900 | { | 930 | { |
901 | m_log.WarnFormat( | 931 | m_log.WarnFormat( |
902 | "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Clamping", | 932 | "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Clamping", |
903 | pos, Name, UUID); | 933 | pos, Name, UUID); |
904 | 934 | ||
905 | if (pos.X < 0f) pos.X = 0f; | 935 | if (pos.X < 0f) pos.X = 0f; |
906 | if (pos.Y < 0f) pos.Y = 0f; | 936 | if (pos.Y < 0f) pos.Y = 0f; |
907 | if (pos.Z < 0f) pos.Z = 0f; | 937 | if (pos.Z < 0f) pos.Z = 0f; |
908 | } | 938 | } |
909 | 939 | ||
910 | float localAVHeight = 1.56f; | 940 | float localAVHeight = 1.56f; |
911 | if (Appearance.AvatarHeight > 0) | 941 | if (Appearance.AvatarHeight > 0) |
912 | localAVHeight = Appearance.AvatarHeight; | 942 | localAVHeight = Appearance.AvatarHeight; |
913 | 943 | ||
914 | float posZLimit = 0; | 944 | float posZLimit = 0; |
915 | 945 | ||
916 | if (pos.X < Constants.RegionSize && pos.Y < Constants.RegionSize) | 946 | if (pos.X < Constants.RegionSize && pos.Y < Constants.RegionSize) |
917 | posZLimit = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y]; | 947 | posZLimit = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y]; |
918 | 948 | ||
919 | float newPosZ = posZLimit + localAVHeight / 2; | 949 | float newPosZ = posZLimit + localAVHeight / 2; |
920 | if (posZLimit >= (pos.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) | 950 | if (posZLimit >= (pos.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) |
921 | { | 951 | { |
922 | pos.Z = newPosZ; | 952 | pos.Z = newPosZ; |
923 | } | 953 | } |
924 | AbsolutePosition = pos; | 954 | AbsolutePosition = pos; |
925 | 955 | ||
926 | AddToPhysicalScene(isFlying); | 956 | AddToPhysicalScene(isFlying); |
927 | 957 | ||
928 | if (ForceFly) | 958 | if (ForceFly) |
929 | { | 959 | { |
930 | Flying = true; | 960 | Flying = true; |
931 | } | 961 | } |
932 | else if (FlyDisabled) | 962 | else if (FlyDisabled) |
933 | { | 963 | { |
934 | Flying = false; | 964 | Flying = false; |
965 | } | ||
935 | } | 966 | } |
936 | |||
937 | // Don't send an animation pack here, since on a region crossing this will sometimes cause a flying | 967 | // Don't send an animation pack here, since on a region crossing this will sometimes cause a flying |
938 | // avatar to return to the standing position in mid-air. On login it looks like this is being sent | 968 | // avatar to return to the standing position in mid-air. On login it looks like this is being sent |
939 | // elsewhere anyway | 969 | // elsewhere anyway |
@@ -951,11 +981,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
951 | { | 981 | { |
952 | m_log.DebugFormat("[SCENE PRESENCE]: Restarting scripts in attachments..."); | 982 | m_log.DebugFormat("[SCENE PRESENCE]: Restarting scripts in attachments..."); |
953 | // Resume scripts | 983 | // Resume scripts |
954 | foreach (SceneObjectGroup sog in m_attachments) | 984 | Util.FireAndForget(delegate(object x) { |
955 | { | 985 | foreach (SceneObjectGroup sog in m_attachments) |
956 | sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); | 986 | { |
957 | sog.ResumeScripts(); | 987 | sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); |
958 | } | 988 | sog.ResumeScripts(); |
989 | } | ||
990 | }); | ||
959 | } | 991 | } |
960 | } | 992 | } |
961 | 993 | ||
@@ -3109,6 +3141,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3109 | cAgent.AlwaysRun = SetAlwaysRun; | 3141 | cAgent.AlwaysRun = SetAlwaysRun; |
3110 | 3142 | ||
3111 | cAgent.Appearance = new AvatarAppearance(Appearance); | 3143 | cAgent.Appearance = new AvatarAppearance(Appearance); |
3144 | |||
3145 | cAgent.ParentPart = ParentUUID; | ||
3146 | cAgent.SitOffset = m_pos; | ||
3112 | 3147 | ||
3113 | lock (scriptedcontrols) | 3148 | lock (scriptedcontrols) |
3114 | { | 3149 | { |
@@ -3168,6 +3203,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3168 | CameraAtAxis = cAgent.AtAxis; | 3203 | CameraAtAxis = cAgent.AtAxis; |
3169 | CameraLeftAxis = cAgent.LeftAxis; | 3204 | CameraLeftAxis = cAgent.LeftAxis; |
3170 | m_CameraUpAxis = cAgent.UpAxis; | 3205 | m_CameraUpAxis = cAgent.UpAxis; |
3206 | ParentUUID = cAgent.ParentPart; | ||
3207 | m_prevSitOffset = cAgent.SitOffset; | ||
3171 | 3208 | ||
3172 | // When we get to the point of re-computing neighbors everytime this | 3209 | // When we get to the point of re-computing neighbors everytime this |
3173 | // changes, then start using the agent's drawdistance rather than the | 3210 | // changes, then start using the agent's drawdistance rather than the |