do agent crossing async, including QUERYACCESS ( need to check vehicles for
this also ), so it doesn't stop heartbeatavinationmerge
parent
afa9b4a002
commit
59413adcee
|
@ -1510,6 +1510,30 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
}
|
||||
|
||||
public bool Cross(ScenePresence agent, bool isFlying)
|
||||
{
|
||||
agent.IsInTransit = true;
|
||||
CrossAsyncDelegate d = CrossAsync;
|
||||
d.BeginInvoke(agent, isFlying, CrossCompleted, d);
|
||||
return true;
|
||||
}
|
||||
|
||||
private void CrossCompleted(IAsyncResult iar)
|
||||
{
|
||||
CrossAsyncDelegate icon = (CrossAsyncDelegate)iar.AsyncState;
|
||||
ScenePresence agent = icon.EndInvoke(iar);
|
||||
|
||||
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname);
|
||||
|
||||
if(!agent.IsChildAgent)
|
||||
{
|
||||
// crossing failed
|
||||
agent.CrossToNewRegionFail();
|
||||
}
|
||||
agent.IsInTransit = false;
|
||||
}
|
||||
|
||||
|
||||
public ScenePresence CrossAsync(ScenePresence agent, bool isFlying)
|
||||
{
|
||||
uint x;
|
||||
uint y;
|
||||
|
@ -1526,15 +1550,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
agent.ControllingClient.SendAlertMessage("Cannot cross to region");
|
||||
else
|
||||
agent.ControllingClient.SendAlertMessage("Cannot cross to region: " + reason);
|
||||
return false;
|
||||
return agent;
|
||||
}
|
||||
|
||||
agent.IsInTransit = true;
|
||||
// agent.IsInTransit = true;
|
||||
|
||||
CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync;
|
||||
d.BeginInvoke(agent, newpos, neighbourRegion, isFlying, version, CrossAgentToNewRegionCompleted, d);
|
||||
|
||||
return true;
|
||||
CrossAgentToNewRegionAsync(agent, newpos, neighbourRegion, isFlying, version);
|
||||
agent.IsInTransit = false;
|
||||
return agent;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1787,8 +1810,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
|
||||
agent.CloseChildAgents(neighbourx, neighboury);
|
||||
|
||||
|
||||
|
||||
// the user may change their profile information in other region,
|
||||
// so the userinfo in UserProfileCache is not reliable any more, delete it
|
||||
// REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE!
|
||||
|
|
|
@ -36,6 +36,7 @@ using OpenSim.Region.Framework.Scenes;
|
|||
namespace OpenSim.Region.Framework.Interfaces
|
||||
{
|
||||
public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, string version);
|
||||
public delegate ScenePresence CrossAsyncDelegate(ScenePresence agent, bool isFlying);
|
||||
|
||||
public interface IEntityTransferModule
|
||||
{
|
||||
|
|
|
@ -3980,6 +3980,30 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
}
|
||||
|
||||
public void CrossToNewRegionFail()
|
||||
{
|
||||
if (m_requestedSitTargetUUID == UUID.Zero)
|
||||
{
|
||||
bool isFlying = Flying;
|
||||
RemoveFromPhysicalScene();
|
||||
|
||||
Vector3 pos = AbsolutePosition;
|
||||
if (AbsolutePosition.X < 0)
|
||||
pos.X += Velocity.X * 2;
|
||||
else if (AbsolutePosition.X > Constants.RegionSize)
|
||||
pos.X -= Velocity.X * 2;
|
||||
if (AbsolutePosition.Y < 0)
|
||||
pos.Y += Velocity.Y * 2;
|
||||
else if (AbsolutePosition.Y > Constants.RegionSize)
|
||||
pos.Y -= Velocity.Y * 2;
|
||||
Velocity = Vector3.Zero;
|
||||
AbsolutePosition = pos;
|
||||
|
||||
AddToPhysicalScene(isFlying);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Moves the agent outside the region bounds
|
||||
/// Tells neighbor region that we're crossing to it
|
||||
|
@ -3996,7 +4020,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
catch
|
||||
{
|
||||
result = m_scene.CrossAgentToNewRegion(this, false);
|
||||
// result = m_scene.CrossAgentToNewRegion(this, false);
|
||||
}
|
||||
// if(!result)
|
||||
// parcelRegionCross(true);
|
||||
|
|
Loading…
Reference in New Issue