diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 124 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 26 |
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 | } |