aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/ScenePresence.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs445
1 files changed, 368 insertions, 77 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index b5f789b..ac791ae 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -92,7 +92,7 @@ namespace OpenSim.Region.Framework.Scenes
92 /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis 92 /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
93 /// issue #1716 93 /// issue #1716
94 /// </summary> 94 /// </summary>
95 public static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.418f); 95 public static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.4f);
96 96
97 /// <summary> 97 /// <summary>
98 /// Movement updates for agents in neighboring regions are sent directly to clients. 98 /// Movement updates for agents in neighboring regions are sent directly to clients.
@@ -169,6 +169,7 @@ namespace OpenSim.Region.Framework.Scenes
169// private int m_lastColCount = -1; //KF: Look for Collision chnages 169// private int m_lastColCount = -1; //KF: Look for Collision chnages
170// private int m_updateCount = 0; //KF: Update Anims for a while 170// private int m_updateCount = 0; //KF: Update Anims for a while
171// private static readonly int UPDATE_COUNT = 10; // how many frames to update for 171// private static readonly int UPDATE_COUNT = 10; // how many frames to update for
172 private List<uint> m_lastColliders = new List<uint>();
172 173
173 private TeleportFlags m_teleportFlags; 174 private TeleportFlags m_teleportFlags;
174 public TeleportFlags TeleportFlags 175 public TeleportFlags TeleportFlags
@@ -230,6 +231,13 @@ namespace OpenSim.Region.Framework.Scenes
230 //private int m_moveToPositionStateStatus; 231 //private int m_moveToPositionStateStatus;
231 //***************************************************** 232 //*****************************************************
232 233
234 private bool m_collisionEventFlag = false;
235 private object m_collisionEventLock = new Object();
236
237 private int m_movementAnimationUpdateCounter = 0;
238
239 private Vector3 m_prevSitOffset;
240
233 protected AvatarAppearance m_appearance; 241 protected AvatarAppearance m_appearance;
234 242
235 public AvatarAppearance Appearance 243 public AvatarAppearance Appearance
@@ -569,6 +577,13 @@ namespace OpenSim.Region.Framework.Scenes
569 /// </summary> 577 /// </summary>
570 public uint ParentID { get; set; } 578 public uint ParentID { get; set; }
571 579
580 public UUID ParentUUID
581 {
582 get { return m_parentUUID; }
583 set { m_parentUUID = value; }
584 }
585 private UUID m_parentUUID = UUID.Zero;
586
572 /// <summary> 587 /// <summary>
573 /// If the avatar is sitting, the prim that it's sitting on. If not sitting then null. 588 /// If the avatar is sitting, the prim that it's sitting on. If not sitting then null.
574 /// </summary> 589 /// </summary>
@@ -729,6 +744,26 @@ namespace OpenSim.Region.Framework.Scenes
729 Appearance = appearance; 744 Appearance = appearance;
730 } 745 }
731 746
747 private void RegionHeartbeatEnd(Scene scene)
748 {
749 if (IsChildAgent)
750 return;
751
752 m_movementAnimationUpdateCounter ++;
753 if (m_movementAnimationUpdateCounter >= 2)
754 {
755 m_movementAnimationUpdateCounter = 0;
756 if (Animator != null && ParentID == 0) // skip it if sitting
757 {
758 Animator.UpdateMovementAnimations();
759 }
760 else
761 {
762 m_scene.EventManager.OnRegionHeartbeatEnd -= RegionHeartbeatEnd;
763 }
764 }
765 }
766
732 public void RegisterToEvents() 767 public void RegisterToEvents()
733 { 768 {
734 ControllingClient.OnCompleteMovementToRegion += CompleteMovement; 769 ControllingClient.OnCompleteMovementToRegion += CompleteMovement;
@@ -798,10 +833,38 @@ namespace OpenSim.Region.Framework.Scenes
798 "[SCENE]: Upgrading child to root agent for {0} in {1}", 833 "[SCENE]: Upgrading child to root agent for {0} in {1}",
799 Name, m_scene.RegionInfo.RegionName); 834 Name, m_scene.RegionInfo.RegionName);
800 835
801 //m_log.DebugFormat("[SCENE]: known regions in {0}: {1}", Scene.RegionInfo.RegionName, KnownChildRegionHandles.Count);
802
803 bool wasChild = IsChildAgent; 836 bool wasChild = IsChildAgent;
804 IsChildAgent = false; 837
838 if (ParentUUID != UUID.Zero)
839 {
840 m_log.DebugFormat("[SCENE PRESENCE]: Sitting avatar back on prim {0}", ParentUUID);
841 SceneObjectPart part = m_scene.GetSceneObjectPart(ParentUUID);
842 if (part == null)
843 {
844 m_log.ErrorFormat("[SCENE PRESENCE]: Can't find prim {0} to sit on", ParentUUID);
845 }
846 else
847 {
848 part.ParentGroup.AddAvatar(UUID);
849 if (part.SitTargetPosition != Vector3.Zero)
850 part.SitTargetAvatar = UUID;
851 ParentPosition = part.GetWorldPosition();
852 ParentID = part.LocalId;
853 ParentPart = part;
854 m_pos = m_prevSitOffset;
855 pos = ParentPosition;
856 }
857 ParentUUID = UUID.Zero;
858
859 IsChildAgent = false;
860
861 Animator.TrySetMovementAnimation("SIT");
862 }
863 else
864 {
865 IsChildAgent = false;
866 }
867
805 868
806 IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>(); 869 IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>();
807 if (gm != null) 870 if (gm != null)
@@ -811,62 +874,64 @@ namespace OpenSim.Region.Framework.Scenes
811 874
812 m_scene.EventManager.TriggerSetRootAgentScene(m_uuid, m_scene); 875 m_scene.EventManager.TriggerSetRootAgentScene(m_uuid, m_scene);
813 876
814 // Moved this from SendInitialData to ensure that Appearance is initialized 877 if (ParentID == 0)
815 // before the inventory is processed in MakeRootAgent. This fixes a race condition
816 // related to the handling of attachments
817 //m_scene.GetAvatarAppearance(ControllingClient, out Appearance);
818 if (m_scene.TestBorderCross(pos, Cardinals.E))
819 { 878 {
820 Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E); 879 // Moved this from SendInitialData to ensure that Appearance is initialized
821 pos.X = crossedBorder.BorderLine.Z - 1; 880 // before the inventory is processed in MakeRootAgent. This fixes a race condition
822 } 881 // related to the handling of attachments
882 //m_scene.GetAvatarAppearance(ControllingClient, out Appearance);
883 if (m_scene.TestBorderCross(pos, Cardinals.E))
884 {
885 Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E);
886 pos.X = crossedBorder.BorderLine.Z - 1;
887 }
823 888
824 if (m_scene.TestBorderCross(pos, Cardinals.N)) 889 if (m_scene.TestBorderCross(pos, Cardinals.N))
825 { 890 {
826 Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N); 891 Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N);
827 pos.Y = crossedBorder.BorderLine.Z - 1; 892 pos.Y = crossedBorder.BorderLine.Z - 1;
828 } 893 }
829 894
830 CheckAndAdjustLandingPoint(ref pos); 895 CheckAndAdjustLandingPoint(ref pos);
831 896
832 if (pos.X < 0f || pos.Y < 0f || pos.Z < 0f) 897 if (pos.X < 0f || pos.Y < 0f || pos.Z < 0f)
833 { 898 {
834 m_log.WarnFormat( 899 m_log.WarnFormat(
835 "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Clamping", 900 "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Clamping",
836 pos, Name, UUID); 901 pos, Name, UUID);
837 902
838 if (pos.X < 0f) pos.X = 0f; 903 if (pos.X < 0f) pos.X = 0f;
839 if (pos.Y < 0f) pos.Y = 0f; 904 if (pos.Y < 0f) pos.Y = 0f;
840 if (pos.Z < 0f) pos.Z = 0f; 905 if (pos.Z < 0f) pos.Z = 0f;
841 } 906 }
842 907
843 float localAVHeight = 1.56f; 908 float localAVHeight = 1.56f;
844 if (Appearance.AvatarHeight > 0) 909 if (Appearance.AvatarHeight > 0)
845 localAVHeight = Appearance.AvatarHeight; 910 localAVHeight = Appearance.AvatarHeight;
846 911
847 float posZLimit = 0; 912 float posZLimit = 0;
848 913
849 if (pos.X < Constants.RegionSize && pos.Y < Constants.RegionSize) 914 if (pos.X < Constants.RegionSize && pos.Y < Constants.RegionSize)
850 posZLimit = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y]; 915 posZLimit = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y];
851 916
852 float newPosZ = posZLimit + localAVHeight / 2; 917 float newPosZ = posZLimit + localAVHeight / 2;
853 if (posZLimit >= (pos.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) 918 if (posZLimit >= (pos.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ)))
854 { 919 {
855 pos.Z = newPosZ; 920 pos.Z = newPosZ;
856 } 921 }
857 AbsolutePosition = pos; 922 AbsolutePosition = pos;
858 923
859 AddToPhysicalScene(isFlying); 924 AddToPhysicalScene(isFlying);
860 925
861 if (ForceFly) 926 if (ForceFly)
862 { 927 {
863 Flying = true; 928 Flying = true;
864 } 929 }
865 else if (FlyDisabled) 930 else if (FlyDisabled)
866 { 931 {
867 Flying = false; 932 Flying = false;
933 }
868 } 934 }
869
870 // Don't send an animation pack here, since on a region crossing this will sometimes cause a flying 935 // Don't send an animation pack here, since on a region crossing this will sometimes cause a flying
871 // avatar to return to the standing position in mid-air. On login it looks like this is being sent 936 // avatar to return to the standing position in mid-air. On login it looks like this is being sent
872 // elsewhere anyway 937 // elsewhere anyway
@@ -884,14 +949,19 @@ namespace OpenSim.Region.Framework.Scenes
884 { 949 {
885 m_log.DebugFormat("[SCENE PRESENCE]: Restarting scripts in attachments..."); 950 m_log.DebugFormat("[SCENE PRESENCE]: Restarting scripts in attachments...");
886 // Resume scripts 951 // Resume scripts
887 foreach (SceneObjectGroup sog in m_attachments) 952 Util.FireAndForget(delegate(object x) {
888 { 953 foreach (SceneObjectGroup sog in m_attachments)
889 sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); 954 {
890 sog.ResumeScripts(); 955 sog.ScheduleGroupForFullUpdate();
891 } 956 sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource());
957 sog.ResumeScripts();
958 }
959 });
892 } 960 }
893 } 961 }
894 962
963 SendAvatarDataToAllAgents();
964
895 // send the animations of the other presences to me 965 // send the animations of the other presences to me
896 m_scene.ForEachRootScenePresence(delegate(ScenePresence presence) 966 m_scene.ForEachRootScenePresence(delegate(ScenePresence presence)
897 { 967 {
@@ -905,6 +975,8 @@ namespace OpenSim.Region.Framework.Scenes
905 MovementFlag = 0; 975 MovementFlag = 0;
906 976
907 m_scene.EventManager.TriggerOnMakeRootAgent(this); 977 m_scene.EventManager.TriggerOnMakeRootAgent(this);
978
979 m_scene.EventManager.OnRegionHeartbeatEnd += RegionHeartbeatEnd;
908 } 980 }
909 981
910 public int GetStateSource() 982 public int GetStateSource()
@@ -932,6 +1004,8 @@ namespace OpenSim.Region.Framework.Scenes
932 /// </remarks> 1004 /// </remarks>
933 public void MakeChildAgent() 1005 public void MakeChildAgent()
934 { 1006 {
1007 m_scene.EventManager.OnRegionHeartbeatEnd -= RegionHeartbeatEnd;
1008
935 m_log.DebugFormat("[SCENE PRESENCE]: Making {0} a child agent in {1}", Name, Scene.RegionInfo.RegionName); 1009 m_log.DebugFormat("[SCENE PRESENCE]: Making {0} a child agent in {1}", Name, Scene.RegionInfo.RegionName);
936 1010
937 // Reset these so that teleporting in and walking out isn't seen 1011 // Reset these so that teleporting in and walking out isn't seen
@@ -1002,11 +1076,24 @@ namespace OpenSim.Region.Framework.Scenes
1002 1076
1003 public void TeleportWithMomentum(Vector3 pos) 1077 public void TeleportWithMomentum(Vector3 pos)
1004 { 1078 {
1079 TeleportWithMomentum(pos, null);
1080 }
1081
1082 public void TeleportWithMomentum(Vector3 pos, Vector3? v)
1083 {
1005 bool isFlying = Flying; 1084 bool isFlying = Flying;
1085 Vector3 vel = Velocity;
1006 RemoveFromPhysicalScene(); 1086 RemoveFromPhysicalScene();
1007 CheckLandingPoint(ref pos); 1087 CheckLandingPoint(ref pos);
1008 AbsolutePosition = pos; 1088 AbsolutePosition = pos;
1009 AddToPhysicalScene(isFlying); 1089 AddToPhysicalScene(isFlying);
1090 if (PhysicsActor != null)
1091 {
1092 if (v.HasValue)
1093 PhysicsActor.SetMomentum((Vector3)v);
1094 else
1095 PhysicsActor.SetMomentum(vel);
1096 }
1010 1097
1011 SendTerseUpdateToAllClients(); 1098 SendTerseUpdateToAllClients();
1012 } 1099 }
@@ -1311,8 +1398,16 @@ namespace OpenSim.Region.Framework.Scenes
1311 { 1398 {
1312 if (m_followCamAuto) 1399 if (m_followCamAuto)
1313 { 1400 {
1314 Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT; 1401 // Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
1315 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(CameraPosition - posAdjusted), Vector3.Distance(CameraPosition, posAdjusted) + 0.3f, RayCastCameraCallback); 1402 // m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(CameraPosition - posAdjusted), Vector3.Distance(CameraPosition, posAdjusted) + 0.3f, RayCastCameraCallback);
1403 Vector3 posAdjusted = AbsolutePosition + HEAD_ADJUSTMENT;
1404 Vector3 distTocam = CameraPosition - posAdjusted;
1405 float distTocamlen = distTocam.Length();
1406 if (distTocamlen > 0)
1407 {
1408 distTocam *= 1.0f / distTocamlen;
1409 m_scene.PhysicsScene.RaycastWorld(posAdjusted, distTocam, distTocamlen + 0.3f, RayCastCameraCallback);
1410 }
1316 } 1411 }
1317 } 1412 }
1318 1413
@@ -1689,9 +1784,9 @@ namespace OpenSim.Region.Framework.Scenes
1689 if (pos.Z - terrainHeight < 0.2) 1784 if (pos.Z - terrainHeight < 0.2)
1690 pos.Z = terrainHeight; 1785 pos.Z = terrainHeight;
1691 1786
1692 m_log.DebugFormat( 1787// m_log.DebugFormat(
1693 "[SCENE PRESENCE]: Avatar {0} set move to target {1} (terrain height {2}) in {3}", 1788// "[SCENE PRESENCE]: Avatar {0} set move to target {1} (terrain height {2}) in {3}",
1694 Name, pos, terrainHeight, m_scene.RegionInfo.RegionName); 1789// Name, pos, terrainHeight, m_scene.RegionInfo.RegionName);
1695 1790
1696 if (noFly) 1791 if (noFly)
1697 Flying = false; 1792 Flying = false;
@@ -1748,8 +1843,11 @@ namespace OpenSim.Region.Framework.Scenes
1748// m_log.DebugFormat("[SCENE PRESENCE]: StandUp() for {0}", Name); 1843// m_log.DebugFormat("[SCENE PRESENCE]: StandUp() for {0}", Name);
1749 1844
1750 SitGround = false; 1845 SitGround = false;
1846
1847/* move this down so avatar gets physical in the new position and not where it is siting
1751 if (PhysicsActor == null) 1848 if (PhysicsActor == null)
1752 AddToPhysicalScene(false); 1849 AddToPhysicalScene(false);
1850 */
1753 1851
1754 if (ParentID != 0) 1852 if (ParentID != 0)
1755 { 1853 {
@@ -1773,6 +1871,7 @@ namespace OpenSim.Region.Framework.Scenes
1773 if (part.SitTargetAvatar == UUID) 1871 if (part.SitTargetAvatar == UUID)
1774 part.SitTargetAvatar = UUID.Zero; 1872 part.SitTargetAvatar = UUID.Zero;
1775 1873
1874 part.ParentGroup.DeleteAvatar(UUID);
1776 ParentPosition = part.GetWorldPosition(); 1875 ParentPosition = part.GetWorldPosition();
1777 ControllingClient.SendClearFollowCamProperties(part.ParentUUID); 1876 ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
1778 1877
@@ -1781,6 +1880,10 @@ namespace OpenSim.Region.Framework.Scenes
1781 1880
1782 ParentID = 0; 1881 ParentID = 0;
1783 ParentPart = null; 1882 ParentPart = null;
1883
1884 if (PhysicsActor == null)
1885 AddToPhysicalScene(false);
1886
1784 SendAvatarDataToAllAgents(); 1887 SendAvatarDataToAllAgents();
1785 m_requestedSitTargetID = 0; 1888 m_requestedSitTargetID = 0;
1786 1889
@@ -1788,6 +1891,9 @@ namespace OpenSim.Region.Framework.Scenes
1788 part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); 1891 part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK);
1789 } 1892 }
1790 1893
1894 else if (PhysicsActor == null)
1895 AddToPhysicalScene(false);
1896
1791 Animator.TrySetMovementAnimation("STAND"); 1897 Animator.TrySetMovementAnimation("STAND");
1792 } 1898 }
1793 1899
@@ -1911,7 +2017,7 @@ namespace OpenSim.Region.Framework.Scenes
1911 forceMouselook = part.GetForceMouselook(); 2017 forceMouselook = part.GetForceMouselook();
1912 2018
1913 ControllingClient.SendSitResponse( 2019 ControllingClient.SendSitResponse(
1914 targetID, offset, sitOrientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook); 2020 part.UUID, offset, sitOrientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook);
1915 2021
1916 m_requestedSitTargetUUID = targetID; 2022 m_requestedSitTargetUUID = targetID;
1917 2023
@@ -2193,14 +2299,36 @@ namespace OpenSim.Region.Framework.Scenes
2193 2299
2194 //Quaternion result = (sitTargetOrient * vq) * nq; 2300 //Quaternion result = (sitTargetOrient * vq) * nq;
2195 2301
2196 m_pos = sitTargetPos + SIT_TARGET_ADJUSTMENT; 2302 double x, y, z, m;
2303
2304 Quaternion r = sitTargetOrient;
2305 m = r.X * r.X + r.Y * r.Y + r.Z * r.Z + r.W * r.W;
2306
2307 if (Math.Abs(1.0 - m) > 0.000001)
2308 {
2309 m = 1.0 / Math.Sqrt(m);
2310 r.X *= (float)m;
2311 r.Y *= (float)m;
2312 r.Z *= (float)m;
2313 r.W *= (float)m;
2314 }
2315
2316 x = 2 * (r.X * r.Z + r.Y * r.W);
2317 y = 2 * (-r.X * r.W + r.Y * r.Z);
2318 z = -r.X * r.X - r.Y * r.Y + r.Z * r.Z + r.W * r.W;
2319
2320 Vector3 up = new Vector3((float)x, (float)y, (float)z);
2321 Vector3 sitOffset = up * Appearance.AvatarHeight * 0.02638f;
2322 m_pos = sitTargetPos + sitOffset + SIT_TARGET_ADJUSTMENT;
2197 Rotation = sitTargetOrient; 2323 Rotation = sitTargetOrient;
2198 ParentPosition = part.AbsolutePosition; 2324 ParentPosition = part.AbsolutePosition;
2325 part.ParentGroup.AddAvatar(UUID);
2199 } 2326 }
2200 else 2327 else
2201 { 2328 {
2202 m_pos -= part.AbsolutePosition; 2329 m_pos -= part.AbsolutePosition;
2203 ParentPosition = part.AbsolutePosition; 2330 ParentPosition = part.AbsolutePosition;
2331 part.ParentGroup.AddAvatar(UUID);
2204 2332
2205// m_log.DebugFormat( 2333// m_log.DebugFormat(
2206// "[SCENE PRESENCE]: Sitting {0} at position {1} ({2} + {3}) on part {4} {5} without sit target", 2334// "[SCENE PRESENCE]: Sitting {0} at position {1} ({2} + {3}) on part {4} {5} without sit target",
@@ -2298,14 +2426,15 @@ namespace OpenSim.Region.Framework.Scenes
2298 direc.Z *= 2.6f; 2426 direc.Z *= 2.6f;
2299 2427
2300 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored. 2428 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored.
2301 Animator.TrySetMovementAnimation("PREJUMP"); 2429// Animator.TrySetMovementAnimation("PREJUMP");
2302 Animator.TrySetMovementAnimation("JUMP"); 2430// Animator.TrySetMovementAnimation("JUMP");
2303 } 2431 }
2304 } 2432 }
2305 } 2433 }
2306 2434
2307 // TODO: Add the force instead of only setting it to support multiple forces per frame? 2435 // TODO: Add the force instead of only setting it to support multiple forces per frame?
2308 m_forceToApply = direc; 2436 m_forceToApply = direc;
2437 Animator.UpdateMovementAnimations();
2309 } 2438 }
2310 2439
2311 #endregion 2440 #endregion
@@ -3039,6 +3168,9 @@ namespace OpenSim.Region.Framework.Scenes
3039 cAgent.AlwaysRun = SetAlwaysRun; 3168 cAgent.AlwaysRun = SetAlwaysRun;
3040 3169
3041 cAgent.Appearance = new AvatarAppearance(Appearance); 3170 cAgent.Appearance = new AvatarAppearance(Appearance);
3171
3172 cAgent.ParentPart = ParentUUID;
3173 cAgent.SitOffset = m_pos;
3042 3174
3043 lock (scriptedcontrols) 3175 lock (scriptedcontrols)
3044 { 3176 {
@@ -3098,6 +3230,8 @@ namespace OpenSim.Region.Framework.Scenes
3098 CameraAtAxis = cAgent.AtAxis; 3230 CameraAtAxis = cAgent.AtAxis;
3099 CameraLeftAxis = cAgent.LeftAxis; 3231 CameraLeftAxis = cAgent.LeftAxis;
3100 CameraUpAxis = cAgent.UpAxis; 3232 CameraUpAxis = cAgent.UpAxis;
3233 ParentUUID = cAgent.ParentPart;
3234 m_prevSitOffset = cAgent.SitOffset;
3101 3235
3102 // When we get to the point of re-computing neighbors everytime this 3236 // When we get to the point of re-computing neighbors everytime this
3103 // changes, then start using the agent's drawdistance rather than the 3237 // changes, then start using the agent's drawdistance rather than the
@@ -3250,18 +3384,6 @@ namespace OpenSim.Region.Framework.Scenes
3250 if (IsChildAgent) 3384 if (IsChildAgent)
3251 return; 3385 return;
3252 3386
3253 //if ((Math.Abs(Velocity.X) > 0.1e-9f) || (Math.Abs(Velocity.Y) > 0.1e-9f))
3254 // The Physics Scene will send updates every 500 ms grep: PhysicsActor.SubscribeEvents(
3255 // as of this comment the interval is set in AddToPhysicalScene
3256 if (Animator != null)
3257 {
3258// if (m_updateCount > 0)
3259// {
3260 Animator.UpdateMovementAnimations();
3261// m_updateCount--;
3262// }
3263 }
3264
3265 CollisionEventUpdate collisionData = (CollisionEventUpdate)e; 3387 CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
3266 Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList; 3388 Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList;
3267 3389
@@ -3304,6 +3426,8 @@ namespace OpenSim.Region.Framework.Scenes
3304 } 3426 }
3305 } 3427 }
3306 3428
3429 RaiseCollisionScriptEvents(coldata);
3430
3307 if (Invulnerable) 3431 if (Invulnerable)
3308 return; 3432 return;
3309 3433
@@ -3888,6 +4012,12 @@ namespace OpenSim.Region.Framework.Scenes
3888 4012
3889 private void CheckAndAdjustLandingPoint(ref Vector3 pos) 4013 private void CheckAndAdjustLandingPoint(ref Vector3 pos)
3890 { 4014 {
4015 string reason;
4016
4017 // Honor bans
4018 if (!m_scene.TestLandRestrictions(UUID, out reason, ref pos.X, ref pos.Y))
4019 return;
4020
3891 SceneObjectGroup telehub = null; 4021 SceneObjectGroup telehub = null;
3892 if (m_scene.RegionInfo.RegionSettings.TelehubObject != UUID.Zero && (telehub = m_scene.GetSceneObjectGroup(m_scene.RegionInfo.RegionSettings.TelehubObject)) != null) 4022 if (m_scene.RegionInfo.RegionSettings.TelehubObject != UUID.Zero && (telehub = m_scene.GetSceneObjectGroup(m_scene.RegionInfo.RegionSettings.TelehubObject)) != null)
3893 { 4023 {
@@ -3927,11 +4057,173 @@ namespace OpenSim.Region.Framework.Scenes
3927 pos = land.LandData.UserLocation; 4057 pos = land.LandData.UserLocation;
3928 } 4058 }
3929 } 4059 }
3930 4060
3931 land.SendLandUpdateToClient(ControllingClient); 4061 land.SendLandUpdateToClient(ControllingClient);
3932 } 4062 }
3933 } 4063 }
3934 4064
4065 private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata)
4066 {
4067 lock(m_collisionEventLock)
4068 {
4069 if (m_collisionEventFlag)
4070 return;
4071 m_collisionEventFlag = true;
4072 }
4073
4074 Util.FireAndForget(delegate(object x)
4075 {
4076 try
4077 {
4078 List<uint> thisHitColliders = new List<uint>();
4079 List<uint> endedColliders = new List<uint>();
4080 List<uint> startedColliders = new List<uint>();
4081
4082 foreach (uint localid in coldata.Keys)
4083 {
4084 thisHitColliders.Add(localid);
4085 if (!m_lastColliders.Contains(localid))
4086 {
4087 startedColliders.Add(localid);
4088 }
4089 //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
4090 }
4091
4092 // calculate things that ended colliding
4093 foreach (uint localID in m_lastColliders)
4094 {
4095 if (!thisHitColliders.Contains(localID))
4096 {
4097 endedColliders.Add(localID);
4098 }
4099 }
4100 //add the items that started colliding this time to the last colliders list.
4101 foreach (uint localID in startedColliders)
4102 {
4103 m_lastColliders.Add(localID);
4104 }
4105 // remove things that ended colliding from the last colliders list
4106 foreach (uint localID in endedColliders)
4107 {
4108 m_lastColliders.Remove(localID);
4109 }
4110
4111 // do event notification
4112 if (startedColliders.Count > 0)
4113 {
4114 ColliderArgs StartCollidingMessage = new ColliderArgs();
4115 List<DetectedObject> colliding = new List<DetectedObject>();
4116 foreach (uint localId in startedColliders)
4117 {
4118 if (localId == 0)
4119 continue;
4120
4121 SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
4122 string data = "";
4123 if (obj != null)
4124 {
4125 DetectedObject detobj = new DetectedObject();
4126 detobj.keyUUID = obj.UUID;
4127 detobj.nameStr = obj.Name;
4128 detobj.ownerUUID = obj.OwnerID;
4129 detobj.posVector = obj.AbsolutePosition;
4130 detobj.rotQuat = obj.GetWorldRotation();
4131 detobj.velVector = obj.Velocity;
4132 detobj.colliderType = 0;
4133 detobj.groupUUID = obj.GroupID;
4134 colliding.Add(detobj);
4135 }
4136 }
4137
4138 if (colliding.Count > 0)
4139 {
4140 StartCollidingMessage.Colliders = colliding;
4141
4142 foreach (SceneObjectGroup att in GetAttachments())
4143 Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage);
4144 }
4145 }
4146
4147 if (endedColliders.Count > 0)
4148 {
4149 ColliderArgs EndCollidingMessage = new ColliderArgs();
4150 List<DetectedObject> colliding = new List<DetectedObject>();
4151 foreach (uint localId in endedColliders)
4152 {
4153 if (localId == 0)
4154 continue;
4155
4156 SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
4157 string data = "";
4158 if (obj != null)
4159 {
4160 DetectedObject detobj = new DetectedObject();
4161 detobj.keyUUID = obj.UUID;
4162 detobj.nameStr = obj.Name;
4163 detobj.ownerUUID = obj.OwnerID;
4164 detobj.posVector = obj.AbsolutePosition;
4165 detobj.rotQuat = obj.GetWorldRotation();
4166 detobj.velVector = obj.Velocity;
4167 detobj.colliderType = 0;
4168 detobj.groupUUID = obj.GroupID;
4169 colliding.Add(detobj);
4170 }
4171 }
4172
4173 if (colliding.Count > 0)
4174 {
4175 EndCollidingMessage.Colliders = colliding;
4176
4177 foreach (SceneObjectGroup att in GetAttachments())
4178 Scene.EventManager.TriggerScriptCollidingEnd(att.LocalId, EndCollidingMessage);
4179 }
4180 }
4181
4182 if (thisHitColliders.Count > 0)
4183 {
4184 ColliderArgs CollidingMessage = new ColliderArgs();
4185 List<DetectedObject> colliding = new List<DetectedObject>();
4186 foreach (uint localId in thisHitColliders)
4187 {
4188 if (localId == 0)
4189 continue;
4190
4191 SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
4192 string data = "";
4193 if (obj != null)
4194 {
4195 DetectedObject detobj = new DetectedObject();
4196 detobj.keyUUID = obj.UUID;
4197 detobj.nameStr = obj.Name;
4198 detobj.ownerUUID = obj.OwnerID;
4199 detobj.posVector = obj.AbsolutePosition;
4200 detobj.rotQuat = obj.GetWorldRotation();
4201 detobj.velVector = obj.Velocity;
4202 detobj.colliderType = 0;
4203 detobj.groupUUID = obj.GroupID;
4204 colliding.Add(detobj);
4205 }
4206 }
4207
4208 if (colliding.Count > 0)
4209 {
4210 CollidingMessage.Colliders = colliding;
4211
4212 lock (m_attachments)
4213 {
4214 foreach (SceneObjectGroup att in m_attachments)
4215 Scene.EventManager.TriggerScriptColliding(att.LocalId, CollidingMessage);
4216 }
4217 }
4218 }
4219 }
4220 finally
4221 {
4222 m_collisionEventFlag = false;
4223 }
4224 });
4225 }
4226
3935 private void TeleportFlagsDebug() { 4227 private void TeleportFlagsDebug() {
3936 4228
3937 // Some temporary debugging help to show all the TeleportFlags we have... 4229 // Some temporary debugging help to show all the TeleportFlags we have...
@@ -3956,6 +4248,5 @@ namespace OpenSim.Region.Framework.Scenes
3956 m_log.InfoFormat("[SCENE PRESENCE]: TELEPORT ******************"); 4248 m_log.InfoFormat("[SCENE PRESENCE]: TELEPORT ******************");
3957 4249
3958 } 4250 }
3959
3960 } 4251 }
3961} 4252}