Fix more SOP.PhysActor race conditions in LSL_Api

0.7.3-extended
Justin Clark-Casey (justincc) 2012-04-03 06:01:05 +01:00
parent d9585ba37e
commit 54e59099b7
1 changed files with 19 additions and 7 deletions

View File

@ -1362,7 +1362,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (scale.z < 0.01) if (scale.z < 0.01)
scale.z = 0.01; scale.z = 0.01;
if (part.ParentGroup.RootPart.PhysActor != null && part.ParentGroup.RootPart.PhysActor.IsPhysical) PhysicsActor pa = part.ParentGroup.RootPart.PhysActor;
if (pa != null && pa.IsPhysical)
{ {
if (scale.x > World.m_maxPhys) if (scale.x > World.m_maxPhys)
scale.x = World.m_maxPhys; scale.x = World.m_maxPhys;
@ -2088,7 +2090,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// but only if the object is not physial and active. This is important for rotating doors. // but only if the object is not physial and active. This is important for rotating doors.
// without the absoluteposition = absoluteposition happening, the doors do not move in the physics // without the absoluteposition = absoluteposition happening, the doors do not move in the physics
// scene // scene
if (part.PhysActor != null && !part.PhysActor.IsPhysical) PhysicsActor pa = part.PhysActor;
if (pa != null && !pa.IsPhysical)
{ {
part.ParentGroup.ResetChildPrimPhysicsPositions(); part.ParentGroup.ResetChildPrimPhysicsPositions();
} }
@ -2819,7 +2823,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
float groupmass = new_group.GetMass(); float groupmass = new_group.GetMass();
if (new_group.RootPart.PhysActor != null && new_group.RootPart.PhysActor.IsPhysical && llvel != Vector3.Zero) PhysicsActor pa = new_group.RootPart.PhysActor;
if (pa != null && pa.IsPhysical && llvel != Vector3.Zero)
{ {
//Recoil. //Recoil.
llApplyImpulse(new LSL_Vector(llvel.X * groupmass, llvel.Y * groupmass, llvel.Z * groupmass), 0); llApplyImpulse(new LSL_Vector(llvel.X * groupmass, llvel.Y * groupmass, llvel.Z * groupmass), 0);
@ -2860,12 +2866,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// we need to convert from a vector describing // we need to convert from a vector describing
// the angles of rotation in radians into rotation value // the angles of rotation in radians into rotation value
LSL_Rotation rot = llEuler2Rot(angle); LSL_Rotation rot = llEuler2Rot(angle);
// Per discussion with Melanie, for non-physical objects llLookAt appears to simply // Per discussion with Melanie, for non-physical objects llLookAt appears to simply
// set the rotation of the object, copy that behavior // set the rotation of the object, copy that behavior
if (strength == 0 || m_host.PhysActor == null || !m_host.PhysActor.IsPhysical) PhysicsActor pa = m_host.PhysActor;
if (strength == 0 || pa == null || !pa.IsPhysical)
{ {
llSetRot(rot); llSetRot(rot);
} }
@ -3201,6 +3208,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llSetHoverHeight(double height, int water, double tau) public void llSetHoverHeight(double height, int water, double tau)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
if (m_host.PhysActor != null) if (m_host.PhysActor != null)
{ {
PIDHoverType hoverType = PIDHoverType.Ground; PIDHoverType hoverType = PIDHoverType.Ground;
@ -3251,7 +3259,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// Per discussion with Melanie, for non-physical objects llLookAt appears to simply // Per discussion with Melanie, for non-physical objects llLookAt appears to simply
// set the rotation of the object, copy that behavior // set the rotation of the object, copy that behavior
if (strength == 0 || m_host.PhysActor == null || !m_host.PhysActor.IsPhysical) PhysicsActor pa = m_host.PhysActor;
if (strength == 0 || pa == null || !pa.IsPhysical)
{ {
llSetLocalRot(target); llSetLocalRot(target);
} }
@ -10735,7 +10745,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (entity is SceneObjectPart) if (entity is SceneObjectPart)
{ {
if (((SceneObjectPart)entity).PhysActor != null && ((SceneObjectPart)entity).PhysActor.IsPhysical) PhysicsActor pa = ((SceneObjectPart)entity).PhysActor;
if (pa != null && pa.IsPhysical)
{ {
if (!checkPhysical) if (!checkPhysical)
continue; continue;