diff options
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/ODECharacter.cs')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 111 |
1 files changed, 100 insertions, 11 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index c160cda..dae19c3 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -137,6 +137,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
137 | 137 | ||
138 | if (PhysicsVector.isFinite(pos)) | 138 | if (PhysicsVector.isFinite(pos)) |
139 | { | 139 | { |
140 | if (pos.Z > 9999999) | ||
141 | { | ||
142 | pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5; | ||
143 | } | ||
144 | if (pos.Z < -90000) | ||
145 | { | ||
146 | pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5; | ||
147 | } | ||
140 | _position = pos; | 148 | _position = pos; |
141 | m_taintPosition.X = pos.X; | 149 | m_taintPosition.X = pos.X; |
142 | m_taintPosition.Y = pos.Y; | 150 | m_taintPosition.Y = pos.Y; |
@@ -396,6 +404,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
396 | { | 404 | { |
397 | if (PhysicsVector.isFinite(value)) | 405 | if (PhysicsVector.isFinite(value)) |
398 | { | 406 | { |
407 | if (value.Z > 9999999) | ||
408 | { | ||
409 | value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5; | ||
410 | } | ||
411 | if (value.Z < -90000) | ||
412 | { | ||
413 | value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5; | ||
414 | } | ||
415 | |||
399 | _position.X = value.X; | 416 | _position.X = value.X; |
400 | _position.Y = value.Y; | 417 | _position.Y = value.Y; |
401 | _position.Z = value.Z; | 418 | _position.Z = value.Z; |
@@ -780,6 +797,41 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
780 | } | 797 | } |
781 | //PidStatus = true; | 798 | //PidStatus = true; |
782 | 799 | ||
800 | d.Vector3 localpos = d.BodyGetPosition(Body); | ||
801 | PhysicsVector localPos = new PhysicsVector(localpos.X, localpos.Y, localpos.Z); | ||
802 | if (!PhysicsVector.isFinite(localPos)) | ||
803 | { | ||
804 | |||
805 | m_log.Warn("[PHYSICS]: Avatar Position is non-finite!"); | ||
806 | _parent_scene.RemoveCharacter(this); | ||
807 | // destroy avatar capsule and related ODE data | ||
808 | if (Amotor != IntPtr.Zero) | ||
809 | { | ||
810 | // Kill the Amotor | ||
811 | d.JointDestroy(Amotor); | ||
812 | Amotor = IntPtr.Zero; | ||
813 | } | ||
814 | //kill the Geometry | ||
815 | _parent_scene.waitForSpaceUnlock(_parent_scene.space); | ||
816 | |||
817 | if (Body != IntPtr.Zero) | ||
818 | { | ||
819 | //kill the body | ||
820 | d.BodyDestroy(Body); | ||
821 | |||
822 | Body = IntPtr.Zero; | ||
823 | } | ||
824 | |||
825 | if (Shell != IntPtr.Zero) | ||
826 | { | ||
827 | d.GeomDestroy(Shell); | ||
828 | _parent_scene.geom_name_map.Remove(Shell); | ||
829 | Shell = IntPtr.Zero; | ||
830 | } | ||
831 | |||
832 | return; | ||
833 | } | ||
834 | |||
783 | PhysicsVector vec = new PhysicsVector(); | 835 | PhysicsVector vec = new PhysicsVector(); |
784 | d.Vector3 vel = d.BodyGetLinearVel(Body); | 836 | d.Vector3 vel = d.BodyGetLinearVel(Body); |
785 | float movementdivisor = 1f; | 837 | float movementdivisor = 1f; |
@@ -901,6 +953,34 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
901 | else | 953 | else |
902 | { | 954 | { |
903 | m_log.Warn("[PHYSICS]: Got a NaN force vector in Move()"); | 955 | m_log.Warn("[PHYSICS]: Got a NaN force vector in Move()"); |
956 | m_log.Warn("[PHYSICS]: Avatar Position is non-finite!"); | ||
957 | _parent_scene.RemoveCharacter(this); | ||
958 | // destroy avatar capsule and related ODE data | ||
959 | if (Amotor != IntPtr.Zero) | ||
960 | { | ||
961 | // Kill the Amotor | ||
962 | d.JointDestroy(Amotor); | ||
963 | Amotor = IntPtr.Zero; | ||
964 | } | ||
965 | //kill the Geometry | ||
966 | _parent_scene.waitForSpaceUnlock(_parent_scene.space); | ||
967 | |||
968 | if (Body != IntPtr.Zero) | ||
969 | { | ||
970 | //kill the body | ||
971 | d.BodyDestroy(Body); | ||
972 | |||
973 | Body = IntPtr.Zero; | ||
974 | } | ||
975 | |||
976 | if (Shell != IntPtr.Zero) | ||
977 | { | ||
978 | d.GeomDestroy(Shell); | ||
979 | _parent_scene.geom_name_map.Remove(Shell); | ||
980 | Shell = IntPtr.Zero; | ||
981 | } | ||
982 | |||
983 | return; | ||
904 | } | 984 | } |
905 | } | 985 | } |
906 | 986 | ||
@@ -1044,21 +1124,30 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1044 | { | 1124 | { |
1045 | _parent_scene.RemoveCharacter(this); | 1125 | _parent_scene.RemoveCharacter(this); |
1046 | // destroy avatar capsule and related ODE data | 1126 | // destroy avatar capsule and related ODE data |
1047 | 1127 | if (Amotor != IntPtr.Zero) | |
1048 | // Kill the Amotor | 1128 | { |
1049 | d.JointDestroy(Amotor); | 1129 | // Kill the Amotor |
1050 | Amotor = IntPtr.Zero; | 1130 | d.JointDestroy(Amotor); |
1051 | 1131 | Amotor = IntPtr.Zero; | |
1132 | } | ||
1052 | //kill the Geometry | 1133 | //kill the Geometry |
1053 | _parent_scene.waitForSpaceUnlock(_parent_scene.space); | 1134 | _parent_scene.waitForSpaceUnlock(_parent_scene.space); |
1054 | 1135 | ||
1055 | d.GeomDestroy(Shell); | 1136 | if (Body != IntPtr.Zero) |
1056 | _parent_scene.geom_name_map.Remove(Shell); | 1137 | { |
1057 | Shell = IntPtr.Zero; | 1138 | //kill the body |
1139 | d.BodyDestroy(Body); | ||
1140 | |||
1141 | Body = IntPtr.Zero; | ||
1142 | } | ||
1143 | |||
1144 | if (Shell != IntPtr.Zero) | ||
1145 | { | ||
1146 | d.GeomDestroy(Shell); | ||
1147 | _parent_scene.geom_name_map.Remove(Shell); | ||
1148 | Shell = IntPtr.Zero; | ||
1149 | } | ||
1058 | 1150 | ||
1059 | //kill the body | ||
1060 | d.BodyDestroy(Body); | ||
1061 | Body=IntPtr.Zero; | ||
1062 | } | 1151 | } |
1063 | 1152 | ||
1064 | m_isPhysical = m_tainted_isPhysical; | 1153 | m_isPhysical = m_tainted_isPhysical; |