Fix a nullref issue in SitAltitudeCallback
parent
fc76b5f589
commit
f77f9ecd8f
|
@ -128,7 +128,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
|
||||
private Vector3 m_avUnscriptedSitPos; // for non-scripted prims
|
||||
private Vector3 m_lastPosition;
|
||||
private Vector3 m_lastPosition;
|
||||
private Vector3 m_lastWorldPosition;
|
||||
private Quaternion m_lastRotation;
|
||||
private Vector3 m_lastVelocity;
|
||||
|
@ -857,22 +857,22 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N);
|
||||
pos.Y = crossedBorder.BorderLine.Z - 1;
|
||||
}
|
||||
|
||||
//If they're TP'ing in or logging in, we haven't had time to add any known child regions yet.
|
||||
//This has the unfortunate consequence that if somebody is TP'ing who is already a child agent,
|
||||
//they'll bypass the landing point. But I can't think of any decent way of fixing this.
|
||||
if (KnownChildRegionHandles.Count == 0)
|
||||
{
|
||||
ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
|
||||
if (land != null)
|
||||
{
|
||||
//Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
|
||||
if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && m_godlevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
|
||||
{
|
||||
pos = land.LandData.UserLocation;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//If they're TP'ing in or logging in, we haven't had time to add any known child regions yet.
|
||||
//This has the unfortunate consequence that if somebody is TP'ing who is already a child agent,
|
||||
//they'll bypass the landing point. But I can't think of any decent way of fixing this.
|
||||
if (KnownChildRegionHandles.Count == 0)
|
||||
{
|
||||
ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
|
||||
if (land != null)
|
||||
{
|
||||
//Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
|
||||
if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && m_godlevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
|
||||
{
|
||||
pos = land.LandData.UserLocation;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pos.X < 0 || pos.Y < 0 || pos.Z < 0)
|
||||
|
@ -1036,8 +1036,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
bool isFlying = false;
|
||||
|
||||
if (m_physicsActor != null)
|
||||
isFlying = m_physicsActor.Flying;
|
||||
|
||||
isFlying = m_physicsActor.Flying;
|
||||
|
||||
RemoveFromPhysicalScene();
|
||||
Velocity = Vector3.Zero;
|
||||
AbsolutePosition = pos;
|
||||
|
@ -1048,7 +1048,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
SetHeight(m_appearance.AvatarHeight);
|
||||
}
|
||||
|
||||
SendTerseUpdateToAllClients();
|
||||
SendTerseUpdateToAllClients();
|
||||
|
||||
}
|
||||
|
||||
|
@ -1736,14 +1736,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// else
|
||||
// { // single or child prim
|
||||
|
||||
// }
|
||||
if (part == null) //CW: Part may be gone. llDie() for example.
|
||||
{
|
||||
partRot = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
partRot = part.GetWorldRotation();
|
||||
// }
|
||||
if (part == null) //CW: Part may be gone. llDie() for example.
|
||||
{
|
||||
partRot = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
partRot = part.GetWorldRotation();
|
||||
}
|
||||
|
||||
Quaternion partIRot = Quaternion.Inverse(partRot);
|
||||
|
@ -1751,22 +1751,22 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
Quaternion avatarRot = Quaternion.Inverse(Quaternion.Inverse(Rotation) * partIRot); // world or. of the av
|
||||
Vector3 avStandUp = new Vector3(1.0f, 0f, 0f) * avatarRot; // 1M infront of av
|
||||
|
||||
|
||||
if (m_physicsActor == null)
|
||||
{
|
||||
AddToPhysicalScene(false);
|
||||
|
||||
if (m_physicsActor == null)
|
||||
{
|
||||
AddToPhysicalScene(false);
|
||||
}
|
||||
//CW: If the part isn't null then we can set the current position
|
||||
if (part != null)
|
||||
{
|
||||
Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + (m_pos * partRot); // + av sit offset!
|
||||
AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
|
||||
part.IsOccupied = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//CW: Since the part doesn't exist, a coarse standup position isn't an issue
|
||||
AbsolutePosition = m_lastWorldPosition;
|
||||
//CW: If the part isn't null then we can set the current position
|
||||
if (part != null)
|
||||
{
|
||||
Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + (m_pos * partRot); // + av sit offset!
|
||||
AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
|
||||
part.IsOccupied = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//CW: Since the part doesn't exist, a coarse standup position isn't an issue
|
||||
AbsolutePosition = m_lastWorldPosition;
|
||||
}
|
||||
|
||||
m_parentPosition = Vector3.Zero;
|
||||
|
@ -1920,7 +1920,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5)
|
||||
if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 2.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 2.0f) )
|
||||
{
|
||||
autopilot = false; // close enough
|
||||
autopilot = false; // close enough
|
||||
m_lastWorldPosition = m_pos; /* CW - This give us a position to return the avatar to if the part is killed before standup.
|
||||
Not using the part's position because returning the AV to the last known standing
|
||||
position is likely to be more friendly, isn't it? */
|
||||
|
@ -1929,7 +1929,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
} // else the autopilot will get us close
|
||||
}
|
||||
else
|
||||
{ // its a scripted sit
|
||||
{ // its a scripted sit
|
||||
m_lastWorldPosition = part.AbsolutePosition; /* CW - This give us a position to return the avatar to if the part is killed before standup.
|
||||
I *am* using the part's position this time because we have no real idea how far away
|
||||
the avatar is from the sit target. */
|
||||
|
@ -2357,11 +2357,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// { // single or child prim
|
||||
partIRot = Quaternion.Inverse(part.GetWorldRotation());
|
||||
// }
|
||||
float offZ = collisionPoint.Z - m_initialSitTarget.Z;
|
||||
Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
|
||||
//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
|
||||
m_pos += offset;
|
||||
// ControllingClient.SendClearFollowCamProperties(part.UUID);
|
||||
if (m_initialSitTarget != null)
|
||||
{
|
||||
float offZ = collisionPoint.Z - m_initialSitTarget.Z;
|
||||
Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
|
||||
//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
|
||||
m_pos += offset;
|
||||
// ControllingClient.SendClearFollowCamProperties(part.UUID);
|
||||
}
|
||||
|
||||
}
|
||||
} // End SitAltitudeCallback KF.
|
||||
|
|
Loading…
Reference in New Issue