aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Application/OpenSimMain.cs8
-rw-r--r--OpenSim/Region/ClientStack/ClientView.cs29
-rw-r--r--OpenSim/Region/ClientStack/PacketQueue.cs2
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1GridServices.cs198
-rw-r--r--OpenSim/Region/Environment/Scenes/InnerScene.cs30
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs19
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs33
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs58
-rw-r--r--OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs5
9 files changed, 270 insertions, 112 deletions
diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs
index 7d83df7..e84e239 100644
--- a/OpenSim/Region/Application/OpenSimMain.cs
+++ b/OpenSim/Region/Application/OpenSimMain.cs
@@ -276,8 +276,8 @@ namespace OpenSim
276 276
277 m_dumpAssetsToFile = standaloneConfig.GetBoolean("dump_assets_to_file", false); 277 m_dumpAssetsToFile = standaloneConfig.GetBoolean("dump_assets_to_file", false);
278 } 278 }
279 if (!m_sandbox) 279 //if (!m_sandbox)
280 m_SendChildAgentTaskData = false; 280 //m_SendChildAgentTaskData = false;
281 281
282 282
283 m_networkServersInfo.loadFromConfiguration(m_config); 283 m_networkServersInfo.loadFromConfiguration(m_config);
@@ -485,8 +485,8 @@ namespace OpenSim
485 if (m_SendChildAgentTaskData) 485 if (m_SendChildAgentTaskData)
486 { 486 {
487 MainLog.Instance.Error("WARNING", 487 MainLog.Instance.Error("WARNING",
488 "Send Child Agent Task Updates is enabled. This is for testing only. It doesn't work on grid mode!"); 488 "Send Child Agent Task Updates is enabled. This is for testing only.");
489 Thread.Sleep(12000); 489 //Thread.Sleep(12000);
490 } 490 }
491 return 491 return
492 new Scene(regionInfo, circuitManager, permissionManager, m_commsManager, sceneGridService, m_assetCache, 492 new Scene(regionInfo, circuitManager, permissionManager, m_commsManager, sceneGridService, m_assetCache,
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
index f37ffc9..9d9a792 100644
--- a/OpenSim/Region/ClientStack/ClientView.cs
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -641,7 +641,8 @@ namespace OpenSim.Region.ClientStack
641 } 641 }
642 mov.Data.LookAt = look; 642 mov.Data.LookAt = look;
643 643
644 OutPacket(mov, ThrottleOutPacketType.Task); 644 // Hack to get this out immediately and skip the throttles
645 OutPacket(mov, ThrottleOutPacketType.Unknown);
645 } 646 }
646 647
647 /// <summary> 648 /// <summary>
@@ -824,7 +825,8 @@ namespace OpenSim.Region.ClientStack
824 newSimPack.RegionData.SimPort = (ushort)externalIPEndPoint.Port; 825 newSimPack.RegionData.SimPort = (ushort)externalIPEndPoint.Port;
825 newSimPack.RegionData.SeedCapability = Helpers.StringToField(capsURL); 826 newSimPack.RegionData.SeedCapability = Helpers.StringToField(capsURL);
826 827
827 OutPacket(newSimPack, ThrottleOutPacketType.Task); 828 // Hack to get this out immediately and skip throttles
829 OutPacket(newSimPack, ThrottleOutPacketType.Unknown);
828 } 830 }
829 831
830 public void SendMapBlock(List<MapBlockData> mapBlocks) 832 public void SendMapBlock(List<MapBlockData> mapBlocks)
@@ -858,7 +860,9 @@ namespace OpenSim.Region.ClientStack
858 tpLocal.Info.LocationID = 2; 860 tpLocal.Info.LocationID = 2;
859 tpLocal.Info.LookAt = lookAt; 861 tpLocal.Info.LookAt = lookAt;
860 tpLocal.Info.Position = position; 862 tpLocal.Info.Position = position;
861 OutPacket(tpLocal, ThrottleOutPacketType.Task); 863
864 // Hack to get this out immediately and skip throttles
865 OutPacket(tpLocal, ThrottleOutPacketType.Unknown);
862 } 866 }
863 867
864 public void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint newRegionEndPoint, uint locationID, 868 public void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint newRegionEndPoint, uint locationID,
@@ -884,7 +888,9 @@ namespace OpenSim.Region.ClientStack
884 teleport.Info.SimPort = (ushort)newRegionEndPoint.Port; 888 teleport.Info.SimPort = (ushort)newRegionEndPoint.Port;
885 teleport.Info.LocationID = 4; 889 teleport.Info.LocationID = 4;
886 teleport.Info.TeleportFlags = 1 << 4; 890 teleport.Info.TeleportFlags = 1 << 4;
887 OutPacket(teleport, ThrottleOutPacketType.Task); 891
892 // Hack to get this out immediately and skip throttles.
893 OutPacket(teleport, ThrottleOutPacketType.Unknown);
888 } 894 }
889 895
890 /// <summary> 896 /// <summary>
@@ -895,7 +901,9 @@ namespace OpenSim.Region.ClientStack
895 TeleportFailedPacket tpFailed = (TeleportFailedPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFailed); 901 TeleportFailedPacket tpFailed = (TeleportFailedPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFailed);
896 tpFailed.Info.AgentID = AgentId; 902 tpFailed.Info.AgentID = AgentId;
897 tpFailed.Info.Reason = Helpers.StringToField(reason); 903 tpFailed.Info.Reason = Helpers.StringToField(reason);
898 OutPacket(tpFailed, ThrottleOutPacketType.Task); 904
905 // Hack to get this out immediately and skip throttles
906 OutPacket(tpFailed, ThrottleOutPacketType.Unknown);
899 } 907 }
900 908
901 /// <summary> 909 /// <summary>
@@ -906,7 +914,9 @@ namespace OpenSim.Region.ClientStack
906 //TeleportStartPacket tpStart = (TeleportStartPacket)PacketPool.Instance.GetPacket(PacketType.TeleportStart); 914 //TeleportStartPacket tpStart = (TeleportStartPacket)PacketPool.Instance.GetPacket(PacketType.TeleportStart);
907 TeleportStartPacket tpStart = new TeleportStartPacket(); 915 TeleportStartPacket tpStart = new TeleportStartPacket();
908 tpStart.Info.TeleportFlags = 16; // Teleport via location 916 tpStart.Info.TeleportFlags = 16; // Teleport via location
909 OutPacket(tpStart, ThrottleOutPacketType.Task); 917
918 // Hack to get this out immediately and skip throttles
919 OutPacket(tpStart, ThrottleOutPacketType.Unknown);
910 } 920 }
911 921
912 public void SendMoneyBalance(LLUUID transaction, bool success, byte[] description, int balance) 922 public void SendMoneyBalance(LLUUID transaction, bool success, byte[] description, int balance)
@@ -1882,7 +1892,7 @@ namespace OpenSim.Region.ClientStack
1882 objectData.PathTwistBegin = primData.PathTwistBegin; 1892 objectData.PathTwistBegin = primData.PathTwistBegin;
1883 objectData.ExtraParams = primData.ExtraParams; 1893 objectData.ExtraParams = primData.ExtraParams;
1884 } 1894 }
1885 1895
1886 /// <summary> 1896 /// <summary>
1887 /// Set some default values in a ObjectUpdatePacket 1897 /// Set some default values in a ObjectUpdatePacket
1888 /// </summary> 1898 /// </summary>
@@ -2222,6 +2232,11 @@ namespace OpenSim.Region.ClientStack
2222 */ 2232 */
2223 } 2233 }
2224 2234
2235 public byte[] GetThrottlesPacked(float multiplier)
2236 {
2237 return m_packetQueue.GetThrottlesPacked(multiplier);
2238 }
2239
2225 public void SetChildAgentThrottle(byte[] throttles) 2240 public void SetChildAgentThrottle(byte[] throttles)
2226 { 2241 {
2227 m_packetQueue.SetThrottleFromClient(throttles); 2242 m_packetQueue.SetThrottleFromClient(throttles);
diff --git a/OpenSim/Region/ClientStack/PacketQueue.cs b/OpenSim/Region/ClientStack/PacketQueue.cs
index 1065f63..685f91b 100644
--- a/OpenSim/Region/ClientStack/PacketQueue.cs
+++ b/OpenSim/Region/ClientStack/PacketQueue.cs
@@ -356,7 +356,7 @@ namespace OpenSim.Region.ClientStack
356 return (int) (((float) value/(float) curmax)*newmax); 356 return (int) (((float) value/(float) curmax)*newmax);
357 } 357 }
358 358
359 private byte[] GetThrottlesPacked(float multiplier) 359 public byte[] GetThrottlesPacked(float multiplier)
360 { 360 {
361 int singlefloat = 4; 361 int singlefloat = 4;
362 float tResend = ResendThrottle.Throttle*multiplier; 362 float tResend = ResendThrottle.Throttle*multiplier;
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
index 73cd061..8429d00 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
@@ -50,6 +50,7 @@ namespace OpenSim.Region.Communications.OGS1
50 private LocalBackEndServices m_localBackend = new LocalBackEndServices(); 50 private LocalBackEndServices m_localBackend = new LocalBackEndServices();
51 private Dictionary<ulong, RegionInfo> m_remoteRegionInfoCache = new Dictionary<ulong, RegionInfo>(); 51 private Dictionary<ulong, RegionInfo> m_remoteRegionInfoCache = new Dictionary<ulong, RegionInfo>();
52 private List<SimpleRegionInfo> m_knownRegions = new List<SimpleRegionInfo>(); 52 private List<SimpleRegionInfo> m_knownRegions = new List<SimpleRegionInfo>();
53 private Dictionary<ulong, int> m_deadRegionCache = new Dictionary<ulong, int>();
53 private Dictionary<string, string> m_queuedGridSettings = new Dictionary<string, string>(); 54 private Dictionary<string, string> m_queuedGridSettings = new Dictionary<string, string>();
54 55
55 public BaseHttpServer httpListener; 56 public BaseHttpServer httpListener;
@@ -499,79 +500,99 @@ namespace OpenSim.Region.Communications.OGS1
499 500
500 public bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) 501 public bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData)
501 { 502 {
502 RegionInfo regInfo = null; 503 int failures = 0;
503 try 504 lock (m_deadRegionCache)
504 { 505 {
505 if (m_localBackend.ChildAgentUpdate(regionHandle, cAgentData)) 506 if (m_deadRegionCache.ContainsKey(regionHandle))
506 { 507 {
507 return true; 508 failures = m_deadRegionCache[regionHandle];
508 } 509 }
509 510 }
510 regInfo = RequestNeighbourInfo(regionHandle); 511 if (failures <= 3)
511 if (regInfo != null) 512 {
513 RegionInfo regInfo = null;
514 try
512 { 515 {
513 //don't want to be creating a new link to the remote instance every time like we are here 516 if (m_localBackend.ChildAgentUpdate(regionHandle, cAgentData))
514 bool retValue = false;
515
516
517 OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting) Activator.GetObject(
518 typeof (OGS1InterRegionRemoting),
519 "tcp://" + regInfo.RemotingAddress +
520 ":" + regInfo.RemotingPort +
521 "/InterRegions");
522
523 if (remObject != null)
524 { 517 {
525 retValue = remObject.ChildAgentUpdate(regionHandle, cAgentData); 518 return true;
526 } 519 }
527 else 520
521 regInfo = RequestNeighbourInfo(regionHandle);
522 if (regInfo != null)
528 { 523 {
529 Console.WriteLine("remoting object not found"); 524 //don't want to be creating a new link to the remote instance every time like we are here
525 bool retValue = false;
526
527
528 OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject(
529 typeof(OGS1InterRegionRemoting),
530 "tcp://" + regInfo.RemotingAddress +
531 ":" + regInfo.RemotingPort +
532 "/InterRegions");
533
534 if (remObject != null)
535 {
536 retValue = remObject.ChildAgentUpdate(regionHandle, cAgentData);
537 }
538 else
539 {
540 Console.WriteLine("remoting object not found");
541 }
542 remObject = null;
543 //MainLog.Instance.Verbose("INTER",
544 //gdebugRegionName +
545 //": OGS1 tried to Update Child Agent data on outside region and got " +
546 //retValue.ToString());
547
548 return retValue;
530 } 549 }
531 remObject = null; 550 NoteDeadRegion(regionHandle);
532 MainLog.Instance.Verbose("INTER",
533 gdebugRegionName +
534 ": OGS1 tried to Update Child Agent data on outside region and got " +
535 retValue.ToString());
536 551
537 return retValue; 552 return false;
553 }
554 catch (RemotingException e)
555 {
556 NoteDeadRegion(regionHandle);
557 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " +
558 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
559 MainLog.Instance.Debug(e.ToString());
560 return false;
561 }
562 catch (SocketException e)
563 {
564 NoteDeadRegion(regionHandle);
565 MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + " " +
566 regInfo.RegionLocX + "," + regInfo.RegionLocY);
567 MainLog.Instance.Debug(e.ToString());
568 return false;
569 }
570 catch (InvalidCredentialException e)
571 {
572 NoteDeadRegion(regionHandle);
573 MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " +
574 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
575 MainLog.Instance.Debug(e.ToString());
576 return false;
577 }
578 catch (AuthenticationException e)
579 {
580 NoteDeadRegion(regionHandle);
581 MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " +
582 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
583 MainLog.Instance.Debug(e.ToString());
584 return false;
585 }
586 catch (Exception e)
587 {
588 NoteDeadRegion(regionHandle);
589 MainLog.Instance.Debug(e.ToString());
590 return false;
538 } 591 }
539
540 return false;
541 }
542 catch (RemotingException e)
543 {
544 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName +
545 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
546 MainLog.Instance.Debug(e.ToString());
547 return false;
548 }
549 catch (SocketException e)
550 {
551 MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " +
552 regInfo.RegionLocX + "," + regInfo.RegionLocY);
553 MainLog.Instance.Debug(e.ToString());
554 return false;
555 }
556 catch (InvalidCredentialException e)
557 {
558 MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionName +
559 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
560 MainLog.Instance.Debug(e.ToString());
561 return false;
562 }
563 catch (AuthenticationException e)
564 {
565 MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " +
566 regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
567 MainLog.Instance.Debug(e.ToString());
568 return false;
569 } 592 }
570 catch (Exception e) 593 else
571 { 594 {
572 MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionName + 595 //MainLog.Instance.Verbose("INTERREGION", "Skipped Sending Child Update to a region because it failed too many times:" + regionHandle.ToString());
573 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
574 MainLog.Instance.Debug(e.ToString());
575 return false; 596 return false;
576 } 597 }
577 } 598 }
@@ -622,11 +643,12 @@ namespace OpenSim.Region.Communications.OGS1
622 return retValue; 643 return retValue;
623 644
624 } 645 }
625 646 NoteDeadRegion(regionHandle);
626 return false; 647 return false;
627 } 648 }
628 catch (RemotingException e) 649 catch (RemotingException e)
629 { 650 {
651 NoteDeadRegion(regionHandle);
630 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName + 652 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName +
631 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 653 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
632 MainLog.Instance.Debug(e.ToString()); 654 MainLog.Instance.Debug(e.ToString());
@@ -634,6 +656,7 @@ namespace OpenSim.Region.Communications.OGS1
634 } 656 }
635 catch (SocketException e) 657 catch (SocketException e)
636 { 658 {
659 NoteDeadRegion(regionHandle);
637 MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + 660 MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " +
638 regInfo.RegionLocX + "," + regInfo.RegionLocY); 661 regInfo.RegionLocX + "," + regInfo.RegionLocY);
639 MainLog.Instance.Debug(e.ToString()); 662 MainLog.Instance.Debug(e.ToString());
@@ -641,6 +664,7 @@ namespace OpenSim.Region.Communications.OGS1
641 } 664 }
642 catch (InvalidCredentialException e) 665 catch (InvalidCredentialException e)
643 { 666 {
667 NoteDeadRegion(regionHandle);
644 MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionName + 668 MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionName +
645 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 669 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
646 MainLog.Instance.Debug(e.ToString()); 670 MainLog.Instance.Debug(e.ToString());
@@ -648,6 +672,7 @@ namespace OpenSim.Region.Communications.OGS1
648 } 672 }
649 catch (AuthenticationException e) 673 catch (AuthenticationException e)
650 { 674 {
675 NoteDeadRegion(regionHandle);
651 MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " + 676 MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " +
652 regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 677 regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
653 MainLog.Instance.Debug(e.ToString()); 678 MainLog.Instance.Debug(e.ToString());
@@ -655,6 +680,7 @@ namespace OpenSim.Region.Communications.OGS1
655 } 680 }
656 catch (Exception e) 681 catch (Exception e)
657 { 682 {
683 NoteDeadRegion(regionHandle);
658 MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionName + 684 MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionName +
659 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 685 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
660 MainLog.Instance.Debug(e.ToString()); 686 MainLog.Instance.Debug(e.ToString());
@@ -813,11 +839,12 @@ namespace OpenSim.Region.Communications.OGS1
813 839
814 return retValue; 840 return retValue;
815 } 841 }
816 842 NoteDeadRegion(regionHandle);
817 return false; 843 return false;
818 } 844 }
819 catch (RemotingException e) 845 catch (RemotingException e)
820 { 846 {
847 NoteDeadRegion(regionHandle);
821 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName + 848 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName +
822 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 849 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
823 MainLog.Instance.Debug(e.ToString()); 850 MainLog.Instance.Debug(e.ToString());
@@ -825,6 +852,7 @@ namespace OpenSim.Region.Communications.OGS1
825 } 852 }
826 catch (SocketException e) 853 catch (SocketException e)
827 { 854 {
855 NoteDeadRegion(regionHandle);
828 MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + 856 MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " +
829 regInfo.RegionLocX + "," + regInfo.RegionLocY); 857 regInfo.RegionLocX + "," + regInfo.RegionLocY);
830 MainLog.Instance.Debug(e.ToString()); 858 MainLog.Instance.Debug(e.ToString());
@@ -832,6 +860,7 @@ namespace OpenSim.Region.Communications.OGS1
832 } 860 }
833 catch (InvalidCredentialException e) 861 catch (InvalidCredentialException e)
834 { 862 {
863 NoteDeadRegion(regionHandle);
835 MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionName + 864 MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionName +
836 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 865 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
837 MainLog.Instance.Debug(e.ToString()); 866 MainLog.Instance.Debug(e.ToString());
@@ -839,6 +868,7 @@ namespace OpenSim.Region.Communications.OGS1
839 } 868 }
840 catch (AuthenticationException e) 869 catch (AuthenticationException e)
841 { 870 {
871 NoteDeadRegion(regionHandle);
842 MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " + 872 MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " +
843 regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 873 regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
844 MainLog.Instance.Debug(e.ToString()); 874 MainLog.Instance.Debug(e.ToString());
@@ -846,6 +876,7 @@ namespace OpenSim.Region.Communications.OGS1
846 } 876 }
847 catch (Exception e) 877 catch (Exception e)
848 { 878 {
879 NoteDeadRegion(regionHandle);
849 MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionName + 880 MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionName +
850 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 881 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
851 MainLog.Instance.Debug(e.ToString()); 882 MainLog.Instance.Debug(e.ToString());
@@ -895,10 +926,12 @@ namespace OpenSim.Region.Communications.OGS1
895 } 926 }
896 //TODO need to see if we know about where this region is and use .net remoting 927 //TODO need to see if we know about where this region is and use .net remoting
897 // to inform it. 928 // to inform it.
929 NoteDeadRegion(regionHandle);
898 return false; 930 return false;
899 } 931 }
900 catch (RemotingException e) 932 catch (RemotingException e)
901 { 933 {
934 NoteDeadRegion(regionHandle);
902 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName + 935 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName +
903 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 936 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
904 MainLog.Instance.Debug(e.ToString()); 937 MainLog.Instance.Debug(e.ToString());
@@ -906,6 +939,7 @@ namespace OpenSim.Region.Communications.OGS1
906 } 939 }
907 catch 940 catch
908 { 941 {
942 NoteDeadRegion(regionHandle);
909 return false; 943 return false;
910 } 944 }
911 } 945 }
@@ -945,10 +979,12 @@ namespace OpenSim.Region.Communications.OGS1
945 } 979 }
946 //TODO need to see if we know about where this region is and use .net remoting 980 //TODO need to see if we know about where this region is and use .net remoting
947 // to inform it. 981 // to inform it.
982 NoteDeadRegion(regionHandle);
948 return false; 983 return false;
949 } 984 }
950 catch (RemotingException e) 985 catch (RemotingException e)
951 { 986 {
987 NoteDeadRegion(regionHandle);
952 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName + 988 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName +
953 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 989 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
954 MainLog.Instance.Debug(e.ToString()); 990 MainLog.Instance.Debug(e.ToString());
@@ -956,6 +992,7 @@ namespace OpenSim.Region.Communications.OGS1
956 } 992 }
957 catch 993 catch
958 { 994 {
995 NoteDeadRegion(regionHandle);
959 return false; 996 return false;
960 } 997 }
961 } 998 }
@@ -994,10 +1031,12 @@ namespace OpenSim.Region.Communications.OGS1
994 } 1031 }
995 //TODO need to see if we know about where this region is and use .net remoting 1032 //TODO need to see if we know about where this region is and use .net remoting
996 // to inform it. 1033 // to inform it.
1034 NoteDeadRegion(regionHandle);
997 return false; 1035 return false;
998 } 1036 }
999 catch (RemotingException e) 1037 catch (RemotingException e)
1000 { 1038 {
1039 NoteDeadRegion(regionHandle);
1001 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region to tell it to close child agents: " + regInfo.RegionName + 1040 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region to tell it to close child agents: " + regInfo.RegionName +
1002 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 1041 " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
1003 //MainLog.Instance.Debug(e.ToString()); 1042 //MainLog.Instance.Debug(e.ToString());
@@ -1006,6 +1045,7 @@ namespace OpenSim.Region.Communications.OGS1
1006 1045
1007 catch (SocketException e) 1046 catch (SocketException e)
1008 { 1047 {
1048 NoteDeadRegion(regionHandle);
1009 MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region using tcp://" + 1049 MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region using tcp://" +
1010 regInfo.RemotingAddress + 1050 regInfo.RemotingAddress +
1011 ":" + regInfo.RemotingPort + 1051 ":" + regInfo.RemotingPort +
@@ -1016,6 +1056,7 @@ namespace OpenSim.Region.Communications.OGS1
1016 } 1056 }
1017 catch (InvalidCredentialException e) 1057 catch (InvalidCredentialException e)
1018 { 1058 {
1059 NoteDeadRegion(regionHandle);
1019 MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region using tcp://" + 1060 MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region using tcp://" +
1020 regInfo.RemotingAddress + 1061 regInfo.RemotingAddress +
1021 ":" + regInfo.RemotingPort + 1062 ":" + regInfo.RemotingPort +
@@ -1025,6 +1066,7 @@ namespace OpenSim.Region.Communications.OGS1
1025 } 1066 }
1026 catch (AuthenticationException e) 1067 catch (AuthenticationException e)
1027 { 1068 {
1069 NoteDeadRegion(regionHandle);
1028 MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region using tcp://" + 1070 MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region using tcp://" +
1029 regInfo.RemotingAddress + 1071 regInfo.RemotingAddress +
1030 ":" + regInfo.RemotingPort + 1072 ":" + regInfo.RemotingPort +
@@ -1034,6 +1076,7 @@ namespace OpenSim.Region.Communications.OGS1
1034 } 1076 }
1035 catch (WebException e) 1077 catch (WebException e)
1036 { 1078 {
1079 NoteDeadRegion(regionHandle);
1037 MainLog.Instance.Warn("WebException exception: Unable to connect to adjacent region using tcp://" + 1080 MainLog.Instance.Warn("WebException exception: Unable to connect to adjacent region using tcp://" +
1038 regInfo.RemotingAddress + 1081 regInfo.RemotingAddress +
1039 ":" + regInfo.RemotingPort + 1082 ":" + regInfo.RemotingPort +
@@ -1043,6 +1086,7 @@ namespace OpenSim.Region.Communications.OGS1
1043 } 1086 }
1044 catch (Exception e) 1087 catch (Exception e)
1045 { 1088 {
1089 NoteDeadRegion(regionHandle);
1046 // This line errors with a Null Reference Exception.. Why? @.@ 1090 // This line errors with a Null Reference Exception.. Why? @.@
1047 //MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region using tcp://" + regInfo.RemotingAddress + 1091 //MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region using tcp://" + regInfo.RemotingAddress +
1048 // ":" + regInfo.RemotingPort + 1092 // ":" + regInfo.RemotingPort +
@@ -1091,11 +1135,21 @@ namespace OpenSim.Region.Communications.OGS1
1091 { 1135 {
1092 MainLog.Instance.Verbose("INTER", 1136 MainLog.Instance.Verbose("INTER",
1093 gdebugRegionName + "Incoming OGS1 RegionUpReport: " + "(" + regionData.RegionLocX + 1137 gdebugRegionName + "Incoming OGS1 RegionUpReport: " + "(" + regionData.RegionLocX +
1094 "," + regionData.RegionLocY + ")"); 1138 "," + regionData.RegionLocY + "). Giving this region a fresh set of 'dead' tries");
1095 1139
1096 try 1140 try
1097 { 1141 {
1142 lock (m_deadRegionCache)
1143 {
1144 if (m_deadRegionCache.ContainsKey(regionData.RegionHandle))
1145 {
1146
1147 m_deadRegionCache.Remove(regionData.RegionHandle);
1148 }
1149 }
1150
1098 return m_localBackend.TriggerRegionUp(new RegionInfo(regionData), regionhandle); 1151 return m_localBackend.TriggerRegionUp(new RegionInfo(regionData), regionhandle);
1152
1099 } 1153 }
1100 1154
1101 catch (RemotingException e) 1155 catch (RemotingException e)
@@ -1107,7 +1161,7 @@ namespace OpenSim.Region.Communications.OGS1
1107 1161
1108 public bool TriggerChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) 1162 public bool TriggerChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData)
1109 { 1163 {
1110 MainLog.Instance.Verbose("INTER", "Incoming OGS1 Child Agent Data Update"); 1164 //MainLog.Instance.Verbose("INTER", "Incoming OGS1 Child Agent Data Update");
1111 1165
1112 try 1166 try
1113 { 1167 {
@@ -1227,6 +1281,20 @@ namespace OpenSim.Region.Communications.OGS1
1227 } 1281 }
1228 socket.Close(); 1282 socket.Close();
1229 } 1283 }
1284 public void NoteDeadRegion(ulong regionhandle)
1285 {
1286 lock (m_deadRegionCache)
1287 {
1288 if (m_deadRegionCache.ContainsKey(regionhandle))
1289 {
1290 m_deadRegionCache[regionhandle] = m_deadRegionCache[regionhandle] + 1;
1291 }
1292 else
1293 {
1294 m_deadRegionCache.Add(regionhandle, 1);
1295 }
1296 }
1297 }
1230 } 1298 }
1231 1299
1232} \ No newline at end of file 1300} \ No newline at end of file
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs
index 9aa3f20..6c0ed28 100644
--- a/OpenSim/Region/Environment/Scenes/InnerScene.cs
+++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs
@@ -537,20 +537,24 @@ namespace OpenSim.Region.Environment.Scenes
537 // the initial update for and what we'll use to limit the 537 // the initial update for and what we'll use to limit the
538 // space we check for new objects on movement. 538 // space we check for new objects on movement.
539 539
540 if (presence.IsChildAgent) 540 if (presence.IsChildAgent && m_parentScene.m_sendTasksToChild)
541 { 541 {
542 //Vector3 avPosition = new Vector3(presence.AbsolutePosition.X,presence.AbsolutePosition.Y,presence.AbsolutePosition.Z); 542 LLVector3 oLoc = ((SceneObjectGroup)ent).AbsolutePosition;
543 //LLVector3 oLoc = ((SceneObjectGroup)ent).AbsolutePosition; 543 float distResult = (float)Util.GetDistanceTo(presence.AbsolutePosition,oLoc);
544 //Vector3 objPosition = new Vector3(oLoc.X,oLoc.Y,oLoc.Z); 544
545 //float distResult = Vector3Distance(avPosition, objPosition); 545 //MainLog.Instance.Verbose("DISTANCE", distResult.ToString());
546 //if (distResult > 512) 546
547 //{ 547 if (distResult > 60)
548 //int x = 0; 548 {
549 //} 549 int x = 0;
550 //if (distResult < presence.DrawDistance) 550 }
551 //{ 551 if (distResult < presence.DrawDistance)
552 ((SceneObjectGroup) ent).ScheduleFullUpdateToAvatar(presence); 552 {
553 //} 553 // Send Only if we don't already know about it.
554 // KnownPrim also makes the prim known when called.
555 if (!presence.KnownPrim(((SceneObjectGroup) ent).UUID))
556 ((SceneObjectGroup) ent).ScheduleFullUpdateToAvatar(presence);
557 }
554 } 558 }
555 else 559 else
556 { 560 {
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 64b9abb..f32de2e 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -1391,6 +1391,8 @@ namespace OpenSim.Region.Environment.Scenes
1391 m_sceneGridService.OnCloseAgentConnection += CloseConnection; 1391 m_sceneGridService.OnCloseAgentConnection += CloseConnection;
1392 m_sceneGridService.OnRegionUp += OtherRegionUp; 1392 m_sceneGridService.OnRegionUp += OtherRegionUp;
1393 m_sceneGridService.OnChildAgentUpdate += IncomingChildAgentDataUpdate; 1393 m_sceneGridService.OnChildAgentUpdate += IncomingChildAgentDataUpdate;
1394
1395
1394 1396
1395 1397
1396 1398
@@ -1492,19 +1494,25 @@ namespace OpenSim.Region.Environment.Scenes
1492 public virtual bool IncomingChildAgentDataUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) 1494 public virtual bool IncomingChildAgentDataUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData)
1493 { 1495 {
1494 ScenePresence childAgentUpdate = GetScenePresence(new LLUUID(cAgentData.AgentID)); 1496 ScenePresence childAgentUpdate = GetScenePresence(new LLUUID(cAgentData.AgentID));
1495 if (!(childAgentUpdate.Equals(null))) 1497 if (childAgentUpdate != null)
1496 { 1498 {
1497 // I can't imagine *yet* why we would get an update if the agent is a root agent.. 1499 // I can't imagine *yet* why we would get an update if the agent is a root agent..
1498 // however to avoid a race condition crossing borders.. 1500 // however to avoid a race condition crossing borders..
1499 if (childAgentUpdate.IsChildAgent) 1501 if (childAgentUpdate.IsChildAgent)
1500 { 1502 {
1503 uint rRegionX = (uint)(cAgentData.regionHandle >> 40);
1504 uint rRegionY = (((uint)(cAgentData.regionHandle)) >> 8);
1505 uint tRegionX = RegionInfo.RegionLocX;
1506 uint tRegionY = RegionInfo.RegionLocY;
1501 //Send Data to ScenePresence 1507 //Send Data to ScenePresence
1502 childAgentUpdate.ChildAgentDataUpdate(cAgentData); 1508 childAgentUpdate.ChildAgentDataUpdate(cAgentData, tRegionX, tRegionY, rRegionX, rRegionY);
1503 // Not Implemented: 1509 // Not Implemented:
1504 //TODO: Do we need to pass the message on to one of our neighbors? 1510 //TODO: Do we need to pass the message on to one of our neighbors?
1511
1505 } 1512 }
1513 return true;
1506 } 1514 }
1507 return true; 1515 return false;
1508 } 1516 }
1509 1517
1510 /// <summary> 1518 /// <summary>
@@ -1614,6 +1622,11 @@ namespace OpenSim.Region.Environment.Scenes
1614 return m_sceneGridService.CrossToNeighbouringRegion(regionHandle, agentID, position, isFlying); 1622 return m_sceneGridService.CrossToNeighbouringRegion(regionHandle, agentID, position, isFlying);
1615 } 1623 }
1616 1624
1625 public void SendOutChildAgentUpdates(ChildAgentDataUpdate cadu, ScenePresence presence)
1626 {
1627 m_sceneGridService.SendChildAgentDataUpdate(cadu, presence);
1628 }
1629
1617 #endregion 1630 #endregion
1618 1631
1619 #region Module Methods 1632 #region Module Methods
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
index a9c2c2f..805b44c 100644
--- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
@@ -332,7 +332,7 @@ namespace OpenSim.Region.Environment.Scenes
332 //bool val = m_commsProvider.InterRegion.RegionUp(new SearializableRegionInfo(region)); 332 //bool val = m_commsProvider.InterRegion.RegionUp(new SearializableRegionInfo(region));
333 } 333 }
334 334
335 public delegate void SendChildAgentDataUpdateDelegate(ulong regionHandle, ChildAgentDataUpdate cAgentData); 335 public delegate void SendChildAgentDataUpdateDelegate(ChildAgentDataUpdate cAgentData, ScenePresence presence);
336 336
337 /// <summary> 337 /// <summary>
338 /// This informs all neighboring regions about the settings of it's child agent. 338 /// This informs all neighboring regions about the settings of it's child agent.
@@ -341,18 +341,22 @@ namespace OpenSim.Region.Environment.Scenes
341 /// This contains information, such as, Draw Distance, Camera location, Current Position, Current throttle settings, etc. 341 /// This contains information, such as, Draw Distance, Camera location, Current Position, Current throttle settings, etc.
342 /// 342 ///
343 /// </summary> 343 /// </summary>
344 private void SendChildAgentDataUpdateAsync(ulong regionHandle, ChildAgentDataUpdate cAgentData) 344 private void SendChildAgentDataUpdateAsync(ChildAgentDataUpdate cAgentData, ScenePresence presence)
345 { 345 {
346 MainLog.Instance.Notice("INTERGRID", "Informing a neighbor about my agent."); 346 //MainLog.Instance.Notice("INTERGRID", "Informing neighbors about my agent.");
347 bool regionAccepted = m_commsProvider.InterRegion.ChildAgentUpdate(regionHandle, cAgentData);
348 347
349 if (regionAccepted) 348 foreach (ulong regionHandle in presence.KnownChildRegions)
350 {
351 MainLog.Instance.Notice("INTERGRID", "Completed sending a neighbor an update about my agent");
352 }
353 else
354 { 349 {
355 MainLog.Instance.Notice("INTERGRID", "Failed sending a neighbor an update about my agent"); 350 bool regionAccepted = m_commsProvider.InterRegion.ChildAgentUpdate(regionHandle, cAgentData);
351
352 if (regionAccepted)
353 {
354 //MainLog.Instance.Notice("INTERGRID", "Completed sending a neighbor an update about my agent");
355 }
356 else
357 {
358 //MainLog.Instance.Notice("INTERGRID", "Failed sending a neighbor an update about my agent");
359 }
356 } 360 }
357 } 361 }
358 362
@@ -362,11 +366,11 @@ namespace OpenSim.Region.Environment.Scenes
362 icon.EndInvoke(iar); 366 icon.EndInvoke(iar);
363 } 367 }
364 368
365 public void SendChildAgentDataUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) 369 public void SendChildAgentDataUpdate(ChildAgentDataUpdate cAgentData, ScenePresence presence)
366 { 370 {
367 // This assumes that we know what our neighbors are. 371 // This assumes that we know what our neighbors are.
368 SendChildAgentDataUpdateDelegate d = SendChildAgentDataUpdateAsync; 372 SendChildAgentDataUpdateDelegate d = SendChildAgentDataUpdateAsync;
369 d.BeginInvoke(regionHandle, cAgentData, 373 d.BeginInvoke(cAgentData,presence,
370 SendChildAgentDataUpdateCompleted, 374 SendChildAgentDataUpdateCompleted,
371 d); 375 d);
372 } 376 }
@@ -374,11 +378,8 @@ namespace OpenSim.Region.Environment.Scenes
374 public delegate void SendCloseChildAgentDelegate( ScenePresence presence); 378 public delegate void SendCloseChildAgentDelegate( ScenePresence presence);
375 379
376 /// <summary> 380 /// <summary>
377 /// This informs all neighboring regions about the settings of it's child agent. 381 /// This Closes child agents on neighboring regions
378 /// Calls an asynchronous method to do so.. so it doesn't lag the sim. 382 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
379 ///
380 /// This contains information, such as, Draw Distance, Camera location, Current Position, Current throttle settings, etc.
381 ///
382 /// </summary> 383 /// </summary>
383 private void SendCloseChildAgentAsync(ScenePresence presence) 384 private void SendCloseChildAgentAsync(ScenePresence presence)
384 { 385 {
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index c8310e4..f37b38b 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -55,6 +55,7 @@ namespace OpenSim.Region.Environment.Scenes
55 private LLVector3 m_requestedSitOffset = new LLVector3(); 55 private LLVector3 m_requestedSitOffset = new LLVector3();
56 private float m_sitAvatarHeight = 2.0f; 56 private float m_sitAvatarHeight = 2.0f;
57 private float m_godlevel = 0; 57 private float m_godlevel = 0;
58 private LLVector3 m_LastChildAgentUpdatePosition = new LLVector3();
58 59
59 private int m_perfMonMS = 0; 60 private int m_perfMonMS = 0;
60 61
@@ -90,6 +91,8 @@ namespace OpenSim.Region.Environment.Scenes
90 private LLQuaternion m_headrotation = new LLQuaternion(); 91 private LLQuaternion m_headrotation = new LLQuaternion();
91 private byte m_state = (byte) 0; 92 private byte m_state = (byte) 0;
92 93
94 private List<LLUUID> m_knownPrimUUID = new List<LLUUID>();
95
93 // Agent's Draw distance. 96 // Agent's Draw distance.
94 protected float m_DrawDistance = 0f; 97 protected float m_DrawDistance = 0f;
95 98
@@ -136,6 +139,17 @@ namespace OpenSim.Region.Environment.Scenes
136 get { return m_physicsActor; } 139 get { return m_physicsActor; }
137 } 140 }
138 141
142 public bool KnownPrim(LLUUID primID)
143 {
144 if (m_knownPrimUUID.Contains(primID))
145 {
146 return true;
147 }
148 m_knownPrimUUID.Add(primID);
149 return false;
150 }
151
152
139 public bool Updated 153 public bool Updated
140 { 154 {
141 set { m_updateflag = value; } 155 set { m_updateflag = value; }
@@ -499,7 +513,7 @@ namespace OpenSim.Region.Environment.Scenes
499 m_scene.CommsManager.UserProfileCacheService.UpdateUserInventory(m_uuid); 513 m_scene.CommsManager.UserProfileCacheService.UpdateUserInventory(m_uuid);
500 //if (!m_gotAllObjectsInScene) 514 //if (!m_gotAllObjectsInScene)
501 //{ 515 //{
502 //m_scene.SendAllSceneObjectsToClient(this); 516 m_scene.SendAllSceneObjectsToClient(this);
503 //m_gotAllObjectsInScene = true; 517 //m_gotAllObjectsInScene = true;
504 //} 518 //}
505 } 519 }
@@ -1408,6 +1422,29 @@ namespace OpenSim.Region.Environment.Scenes
1408 m_scene.NotifyMyCoarseLocationChange(); 1422 m_scene.NotifyMyCoarseLocationChange();
1409 } 1423 }
1410 } 1424 }
1425
1426 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
1427 if (Util.GetDistanceTo(AbsolutePosition,m_LastChildAgentUpdatePosition) > 32)
1428 {
1429 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
1430 cadu.ActiveGroupID=LLUUID.Zero.UUID;
1431 cadu.AgentID = UUID.UUID;
1432 cadu.alwaysrun = m_setAlwaysRun;
1433 cadu.AVHeight = m_avHeight;
1434 LLVector3 tempCameraCenter = new LLVector3(m_CameraCenter.x, m_CameraCenter.y, m_CameraCenter.z);
1435 cadu.cameraPosition = new sLLVector3(tempCameraCenter);
1436 cadu.drawdistance = m_DrawDistance;
1437 cadu.godlevel = m_godlevel;
1438 cadu.GroupAccess = 0;
1439 cadu.Position = new sLLVector3(AbsolutePosition);
1440 cadu.regionHandle = m_scene.RegionInfo.RegionHandle;
1441 cadu.throttles = ControllingClient.GetThrottlesPacked(1f);
1442 cadu.Velocity = new sLLVector3(Velocity);
1443 m_scene.SendOutChildAgentUpdates(cadu,this);
1444 m_LastChildAgentUpdatePosition.X = AbsolutePosition.X;
1445 m_LastChildAgentUpdatePosition.Y = AbsolutePosition.Y;
1446 m_LastChildAgentUpdatePosition.Z = AbsolutePosition.Z;
1447 }
1411 } 1448 }
1412 1449
1413 #endregion 1450 #endregion
@@ -1532,15 +1569,30 @@ namespace OpenSim.Region.Environment.Scenes
1532 /// This updates important decision making data about a child agent 1569 /// This updates important decision making data about a child agent
1533 /// The main purpose is to figure out what objects to send to a child agent that's in a neighboring region 1570 /// The main purpose is to figure out what objects to send to a child agent that's in a neighboring region
1534 /// </summary> 1571 /// </summary>
1535 public void ChildAgentDataUpdate(ChildAgentDataUpdate cAgentData) 1572 public void ChildAgentDataUpdate(ChildAgentDataUpdate cAgentData, uint tRegionX, uint tRegionY, uint rRegionX, uint rRegionY)
1536 { 1573 {
1537 // 1574 //
1575 int shiftx = ((int)rRegionX - (int)tRegionX) * 256;
1576 int shifty = ((int)rRegionY - (int)tRegionY) * 256;
1577
1538 m_DrawDistance = cAgentData.drawdistance; 1578 m_DrawDistance = cAgentData.drawdistance;
1539 m_pos = new LLVector3(cAgentData.Position.x, cAgentData.Position.y, cAgentData.Position.z); 1579 m_pos = new LLVector3(cAgentData.Position.x + shiftx, cAgentData.Position.y + shifty, cAgentData.Position.z);
1580
1581 // It's hard to say here.. We can't really tell where the camera position is unless it's in world cordinates from the sending region
1540 m_CameraCenter = 1582 m_CameraCenter =
1541 new Vector3(cAgentData.cameraPosition.x, cAgentData.cameraPosition.y, cAgentData.cameraPosition.z); 1583 new Vector3(cAgentData.cameraPosition.x, cAgentData.cameraPosition.y, cAgentData.cameraPosition.z);
1584
1585
1542 m_godlevel = cAgentData.godlevel; 1586 m_godlevel = cAgentData.godlevel;
1587 SetHeight(cAgentData.AVHeight);
1588
1543 ControllingClient.SetChildAgentThrottle(cAgentData.throttles); 1589 ControllingClient.SetChildAgentThrottle(cAgentData.throttles);
1590
1591
1592
1593 // Sends out the objects in the user's draw distance if m_sendTasksToChild is true.
1594 if (m_scene.m_sendTasksToChild)
1595 m_scene.SendAllSceneObjectsToClient(this);
1544 //cAgentData.AVHeight; 1596 //cAgentData.AVHeight;
1545 //cAgentData.regionHandle; 1597 //cAgentData.regionHandle;
1546 //m_velocity = cAgentData.Velocity; 1598 //m_velocity = cAgentData.Velocity;
diff --git a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
index 69060f1..ea1e28e 100644
--- a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
@@ -226,7 +226,12 @@ namespace SimpleApp
226 public virtual void SetChildAgentThrottle(byte[] throttle) 226 public virtual void SetChildAgentThrottle(byte[] throttle)
227 { 227 {
228 } 228 }
229 public byte[] GetThrottlesPacked(float multiplier)
230 {
231 return new byte[0];
232 }
229 233
234
230 public virtual void SendAnimations(LLUUID[] animations, int[] seqs, LLUUID sourceAgentId) 235 public virtual void SendAnimations(LLUUID[] animations, int[] seqs, LLUUID sourceAgentId)
231 { 236 {
232 } 237 }