* This resolves the null exceptions when a script is manipulating a physical object in ODE and you delete the object. The script is still running and trying to add force, but the object reference is null.

ThreadPoolClientBranch
Teravus Ovares 2008-02-12 00:01:55 +00:00
parent f603e57e9a
commit c926962862
3 changed files with 13 additions and 4 deletions

View File

@ -580,11 +580,17 @@ namespace OpenSim.Region.Environment.Scenes
public void applyImpulse(PhysicsVector impulse) public void applyImpulse(PhysicsVector impulse)
{ {
// We check if rootpart is null here because scripts don't delete if you delete the host.
// This means that unfortunately, we can pass a null physics actor to Simulate!
// Make sure we don't do that!
SceneObjectPart rootpart = m_rootPart; SceneObjectPart rootpart = m_rootPart;
if (m_rootPart.PhysActor != null) if (rootpart != null)
{ {
m_rootPart.PhysActor.AddForce(impulse); if (rootpart.PhysActor != null)
m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); {
rootpart.PhysActor.AddForce(impulse);
m_scene.PhysicsScene.AddPhysicsActorTaint(rootpart.PhysActor);
}
} }
} }

View File

@ -429,6 +429,7 @@ namespace OpenSim.Region.Physics.OdePlugin
public void ProcessTaints(float timestep) public void ProcessTaints(float timestep)
{ {
System.Threading.Thread.Sleep(5);
if (m_taintposition != _position) if (m_taintposition != _position)
Move(timestep); Move(timestep);
@ -712,6 +713,7 @@ namespace OpenSim.Region.Physics.OdePlugin
public void changeAddForce(float timestamp) public void changeAddForce(float timestamp)
{ {
System.Threading.Thread.Sleep(2);
lock (m_forcelist) lock (m_forcelist)
{ {
//m_log.Info("[PHYSICS]: dequeing forcelist"); //m_log.Info("[PHYSICS]: dequeing forcelist");

View File

@ -639,6 +639,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
lock (OdeLock) lock (OdeLock)
{ {
System.Threading.Thread.Sleep(20);
if (prim.IsPhysical) if (prim.IsPhysical)
{ {
prim.disableBody(); prim.disableBody();
@ -733,7 +734,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// never be called if the prim is physical(active) // never be called if the prim is physical(active)
// All physical prim end up in the root space // All physical prim end up in the root space
System.Threading.Thread.Sleep(20);
if (currentspace != space) if (currentspace != space)
{ {
if (d.SpaceQuery(currentspace, geom) && currentspace != (IntPtr) 0) if (d.SpaceQuery(currentspace, geom) && currentspace != (IntPtr) 0)