aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs124
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs26
2 files changed, 135 insertions, 15 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 1c71a99..b38148b 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -1074,7 +1074,7 @@ namespace OpenSim.Region.Framework.Scenes
1074 if (eq != null) 1074 if (eq != null)
1075 { 1075 {
1076 eq.TeleportFinishEvent(reg.RegionHandle, 13, endPoint, 1076 eq.TeleportFinishEvent(reg.RegionHandle, 13, endPoint,
1077 4, teleportFlags, capsPath, avatar.UUID); 1077 0, teleportFlags, capsPath, avatar.UUID);
1078 } 1078 }
1079 else 1079 else
1080 { 1080 {
@@ -1269,16 +1269,53 @@ namespace OpenSim.Region.Framework.Scenes
1269 if (scene.TestBorderCross(pos + northCross, Cardinals.N)) 1269 if (scene.TestBorderCross(pos + northCross, Cardinals.N))
1270 { 1270 {
1271 Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N); 1271 Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N);
1272 neighboury += (uint)(int)(b.BorderLine.Z/(int)Constants.RegionSize); 1272 neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize);
1273 } 1273 }
1274 else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) 1274 else if (scene.TestBorderCross(pos + southCross, Cardinals.S))
1275 { 1275 {
1276 neighboury--; 1276 Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S);
1277 newpos.Y = Constants.RegionSize - enterDistance; 1277 if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0)
1278 {
1279 neighboury--;
1280 newpos.Y = Constants.RegionSize - enterDistance;
1281 }
1282 else
1283 {
1284 neighboury = b.TriggerRegionY;
1285 neighbourx = b.TriggerRegionX;
1286
1287 Vector3 newposition = pos;
1288 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
1289 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
1290 agent.ControllingClient.SendAgentAlertMessage(
1291 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
1292 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
1293 return;
1294 }
1278 } 1295 }
1279 1296
1280 neighbourx--; 1297 Border ba = scene.GetCrossedBorder(pos + westCross, Cardinals.W);
1281 newpos.X = Constants.RegionSize - enterDistance; 1298 if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0)
1299 {
1300 neighbourx--;
1301 newpos.X = Constants.RegionSize - enterDistance;
1302 }
1303 else
1304 {
1305 neighboury = ba.TriggerRegionY;
1306 neighbourx = ba.TriggerRegionX;
1307
1308
1309 Vector3 newposition = pos;
1310 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
1311 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
1312 agent.ControllingClient.SendAgentAlertMessage(
1313 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
1314 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
1315
1316
1317 return;
1318 }
1282 1319
1283 } 1320 }
1284 else if (scene.TestBorderCross(pos + eastCross, Cardinals.E)) 1321 else if (scene.TestBorderCross(pos + eastCross, Cardinals.E))
@@ -1289,8 +1326,24 @@ namespace OpenSim.Region.Framework.Scenes
1289 1326
1290 if (scene.TestBorderCross(pos + southCross, Cardinals.S)) 1327 if (scene.TestBorderCross(pos + southCross, Cardinals.S))
1291 { 1328 {
1292 neighboury--; 1329 Border ba = scene.GetCrossedBorder(pos + southCross, Cardinals.S);
1293 newpos.Y = Constants.RegionSize - enterDistance; 1330 if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0)
1331 {
1332 neighboury--;
1333 newpos.Y = Constants.RegionSize - enterDistance;
1334 }
1335 else
1336 {
1337 neighboury = ba.TriggerRegionY;
1338 neighbourx = ba.TriggerRegionX;
1339 Vector3 newposition = pos;
1340 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
1341 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
1342 agent.ControllingClient.SendAgentAlertMessage(
1343 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
1344 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
1345 return;
1346 }
1294 } 1347 }
1295 else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) 1348 else if (scene.TestBorderCross(pos + northCross, Cardinals.N))
1296 { 1349 {
@@ -1298,16 +1351,33 @@ namespace OpenSim.Region.Framework.Scenes
1298 neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize); 1351 neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize);
1299 newpos.Y = enterDistance; 1352 newpos.Y = enterDistance;
1300 } 1353 }
1301 1354
1302 1355
1303 } 1356 }
1304 else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) 1357 else if (scene.TestBorderCross(pos + southCross, Cardinals.S))
1305 { 1358 {
1306 neighboury--; 1359 Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S);
1307 newpos.Y = Constants.RegionSize - enterDistance; 1360 if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0)
1361 {
1362 neighboury--;
1363 newpos.Y = Constants.RegionSize - enterDistance;
1364 }
1365 else
1366 {
1367 neighboury = b.TriggerRegionY;
1368 neighbourx = b.TriggerRegionX;
1369 Vector3 newposition = pos;
1370 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
1371 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
1372 agent.ControllingClient.SendAgentAlertMessage(
1373 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
1374 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
1375 return;
1376 }
1308 } 1377 }
1309 else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) 1378 else if (scene.TestBorderCross(pos + northCross, Cardinals.N))
1310 { 1379 {
1380
1311 Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N); 1381 Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N);
1312 neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); 1382 neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize);
1313 newpos.Y = enterDistance; 1383 newpos.Y = enterDistance;
@@ -1342,6 +1412,38 @@ namespace OpenSim.Region.Framework.Scenes
1342 d.BeginInvoke(agent, newpos, neighbourx, neighboury, isFlying, CrossAgentToNewRegionCompleted, d); 1412 d.BeginInvoke(agent, newpos, neighbourx, neighboury, isFlying, CrossAgentToNewRegionCompleted, d);
1343 } 1413 }
1344 1414
1415 public void InformClientToInitateTeleportToLocation(ScenePresence agent, uint regionX, uint regionY, Vector3 position, Scene initiatingScene)
1416 {
1417 Util.FireAndForget(delegate
1418 {
1419 Thread.Sleep(10000);
1420 IMessageTransferModule im = initiatingScene.RequestModuleInterface<IMessageTransferModule>();
1421 if (im != null)
1422 {
1423 UUID gotoLocation = Util.BuildFakeParcelID(
1424 Util.UIntsToLong(
1425 (regionX *
1426 (uint)Constants.RegionSize),
1427 (regionY *
1428 (uint)Constants.RegionSize)),
1429 (uint)(int)position.X,
1430 (uint)(int)position.Y,
1431 (uint)(int)position.Z);
1432 GridInstantMessage m = new GridInstantMessage(initiatingScene, UUID.Zero,
1433 "Region", agent.UUID,
1434 (byte)InstantMessageDialog.GodLikeRequestTeleport, false,
1435 "", gotoLocation, false, new Vector3(127, 0, 0),
1436 new Byte[0]);
1437 im.SendInstantMessage(m, delegate(bool success)
1438 {
1439 m_log.DebugFormat("[CLIENT]: Client Initiating Teleport sending IM success = {0}", success);
1440 });
1441
1442 }
1443
1444 });
1445 }
1446
1345 public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, bool isFlying); 1447 public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, bool isFlying);
1346 1448
1347 /// <summary> 1449 /// <summary>
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 1024857..23fe2d3 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -776,8 +776,20 @@ namespace OpenSim.Region.Framework.Scenes
776 // before the inventory is processed in MakeRootAgent. This fixes a race condition 776 // before the inventory is processed in MakeRootAgent. This fixes a race condition
777 // related to the handling of attachments 777 // related to the handling of attachments
778 //m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); 778 //m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
779 if (m_scene.TestBorderCross(pos, Cardinals.E))
780 {
781 Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E);
782 pos.X = crossedBorder.BorderLine.Z - 1;
783 }
784
785 if (m_scene.TestBorderCross(pos, Cardinals.N))
786 {
787 Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N);
788 pos.Y = crossedBorder.BorderLine.Z - 1;
789 }
790
779 791
780 if (pos.X < 0 || pos.X >= (int)Constants.RegionSize || pos.Y < 0 || pos.Y >= (int)Constants.RegionSize || pos.Z < 0) 792 if (pos.X < 0 || pos.Y < 0 || pos.Z < 0)
781 { 793 {
782 Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128); 794 Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128);
783 795
@@ -795,7 +807,11 @@ namespace OpenSim.Region.Framework.Scenes
795 localAVHeight = m_avHeight; 807 localAVHeight = m_avHeight;
796 } 808 }
797 809
798 float posZLimit = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y]; 810 float posZLimit = 0;
811
812 if (pos.X <Constants.RegionSize && pos.Y < Constants.RegionSize)
813 posZLimit = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y];
814
799 float newPosZ = posZLimit + localAVHeight / 2; 815 float newPosZ = posZLimit + localAVHeight / 2;
800 if (posZLimit >= (pos.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) 816 if (posZLimit >= (pos.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ)))
801 { 817 {
@@ -877,6 +893,7 @@ namespace OpenSim.Region.Framework.Scenes
877 m_isChildAgent = true; 893 m_isChildAgent = true;
878 m_scene.SwapRootAgentCount(true); 894 m_scene.SwapRootAgentCount(true);
879 RemoveFromPhysicalScene(); 895 RemoveFromPhysicalScene();
896
880 m_scene.EventManager.TriggerOnMakeChildAgent(this); 897 m_scene.EventManager.TriggerOnMakeChildAgent(this);
881 } 898 }
882 899
@@ -904,7 +921,7 @@ namespace OpenSim.Region.Framework.Scenes
904 bool isFlying = false; 921 bool isFlying = false;
905 if (m_physicsActor != null) 922 if (m_physicsActor != null)
906 isFlying = m_physicsActor.Flying; 923 isFlying = m_physicsActor.Flying;
907 924
908 RemoveFromPhysicalScene(); 925 RemoveFromPhysicalScene();
909 Velocity = new Vector3(0, 0, 0); 926 Velocity = new Vector3(0, 0, 0);
910 AbsolutePosition = pos; 927 AbsolutePosition = pos;
@@ -2412,7 +2429,8 @@ namespace OpenSim.Region.Framework.Scenes
2412 } 2429 }
2413 2430
2414 // followed suggestion from mic bowman. reversed the two lines below. 2431 // followed suggestion from mic bowman. reversed the two lines below.
2415 CheckForBorderCrossing(); 2432 if (m_parentID == 0 && m_physicsActor != null || m_parentID != 0) // Check that we have a physics actor or we're sitting on something
2433 CheckForBorderCrossing();
2416 CheckForSignificantMovement(); // sends update to the modules. 2434 CheckForSignificantMovement(); // sends update to the modules.
2417 } 2435 }
2418 } 2436 }