aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs39
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs26
3 files changed, 56 insertions, 10 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 19f748a..c898946 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -1511,6 +1511,30 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1511 1511
1512 public bool Cross(ScenePresence agent, bool isFlying) 1512 public bool Cross(ScenePresence agent, bool isFlying)
1513 { 1513 {
1514 agent.IsInTransit = true;
1515 CrossAsyncDelegate d = CrossAsync;
1516 d.BeginInvoke(agent, isFlying, CrossCompleted, d);
1517 return true;
1518 }
1519
1520 private void CrossCompleted(IAsyncResult iar)
1521 {
1522 CrossAsyncDelegate icon = (CrossAsyncDelegate)iar.AsyncState;
1523 ScenePresence agent = icon.EndInvoke(iar);
1524
1525 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname);
1526
1527 if(!agent.IsChildAgent)
1528 {
1529 // crossing failed
1530 agent.CrossToNewRegionFail();
1531 }
1532 agent.IsInTransit = false;
1533 }
1534
1535
1536 public ScenePresence CrossAsync(ScenePresence agent, bool isFlying)
1537 {
1514 uint x; 1538 uint x;
1515 uint y; 1539 uint y;
1516 Vector3 newpos; 1540 Vector3 newpos;
@@ -1525,16 +1549,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1525 if (reason == String.Empty) 1549 if (reason == String.Empty)
1526 agent.ControllingClient.SendAlertMessage("Cannot cross to region"); 1550 agent.ControllingClient.SendAlertMessage("Cannot cross to region");
1527 else 1551 else
1528 agent.ControllingClient.SendAlertMessage("Cannot cross to region: " + reason); 1552 agent.ControllingClient.SendAlertMessage("Cannot cross to region: " + reason);
1529 return false; 1553 return agent;
1530 } 1554 }
1531 1555
1532 agent.IsInTransit = true; 1556// agent.IsInTransit = true;
1533
1534 CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync;
1535 d.BeginInvoke(agent, newpos, neighbourRegion, isFlying, version, CrossAgentToNewRegionCompleted, d);
1536 1557
1537 return true; 1558 CrossAgentToNewRegionAsync(agent, newpos, neighbourRegion, isFlying, version);
1559 agent.IsInTransit = false;
1560 return agent;
1538 } 1561 }
1539 1562
1540 1563
@@ -1787,8 +1810,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1787 1810
1788 agent.CloseChildAgents(neighbourx, neighboury); 1811 agent.CloseChildAgents(neighbourx, neighboury);
1789 1812
1790
1791
1792 // the user may change their profile information in other region, 1813 // the user may change their profile information in other region,
1793 // so the userinfo in UserProfileCache is not reliable any more, delete it 1814 // so the userinfo in UserProfileCache is not reliable any more, delete it
1794 // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! 1815 // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE!
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs
index 214b07a..0c34c90 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs
@@ -36,6 +36,7 @@ using OpenSim.Region.Framework.Scenes;
36namespace OpenSim.Region.Framework.Interfaces 36namespace OpenSim.Region.Framework.Interfaces
37{ 37{
38 public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, string version); 38 public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, string version);
39 public delegate ScenePresence CrossAsyncDelegate(ScenePresence agent, bool isFlying);
39 40
40 public interface IEntityTransferModule 41 public interface IEntityTransferModule
41 { 42 {
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 754dd96..b746e3a 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3980,6 +3980,30 @@ namespace OpenSim.Region.Framework.Scenes
3980 3980
3981 } 3981 }
3982 3982
3983 public void CrossToNewRegionFail()
3984 {
3985 if (m_requestedSitTargetUUID == UUID.Zero)
3986 {
3987 bool isFlying = Flying;
3988 RemoveFromPhysicalScene();
3989
3990 Vector3 pos = AbsolutePosition;
3991 if (AbsolutePosition.X < 0)
3992 pos.X += Velocity.X * 2;
3993 else if (AbsolutePosition.X > Constants.RegionSize)
3994 pos.X -= Velocity.X * 2;
3995 if (AbsolutePosition.Y < 0)
3996 pos.Y += Velocity.Y * 2;
3997 else if (AbsolutePosition.Y > Constants.RegionSize)
3998 pos.Y -= Velocity.Y * 2;
3999 Velocity = Vector3.Zero;
4000 AbsolutePosition = pos;
4001
4002 AddToPhysicalScene(isFlying);
4003 }
4004
4005 }
4006
3983 /// <summary> 4007 /// <summary>
3984 /// Moves the agent outside the region bounds 4008 /// Moves the agent outside the region bounds
3985 /// Tells neighbor region that we're crossing to it 4009 /// Tells neighbor region that we're crossing to it
@@ -3996,7 +4020,7 @@ namespace OpenSim.Region.Framework.Scenes
3996 } 4020 }
3997 catch 4021 catch
3998 { 4022 {
3999 result = m_scene.CrossAgentToNewRegion(this, false); 4023// result = m_scene.CrossAgentToNewRegion(this, false);
4000 } 4024 }
4001 // if(!result) 4025 // if(!result)
4002 // parcelRegionCross(true); 4026 // parcelRegionCross(true);