aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorTeravus Ovares2008-01-22 08:52:51 +0000
committerTeravus Ovares2008-01-22 08:52:51 +0000
commit5cf96daaf29209e065b852a0eefeb7f5dbd88b48 (patch)
tree34518c3c3609fbe6654a651d6ad357d257f60f26
parent* Renamed a number of TerrainEngine functions to conform naming standards bet... (diff)
downloadopensim-SC-5cf96daaf29209e065b852a0eefeb7f5dbd88b48.zip
opensim-SC-5cf96daaf29209e065b852a0eefeb7f5dbd88b48.tar.gz
opensim-SC-5cf96daaf29209e065b852a0eefeb7f5dbd88b48.tar.bz2
opensim-SC-5cf96daaf29209e065b852a0eefeb7f5dbd88b48.tar.xz
* Enabled dead region tracking for ChildAgentDataUpdates
** If the region fails 3 times, then ChildAgentDataUpdates no longer get sent to that region * Enabled Child_Get_Tasks in grid mode. * When Child_Get_Tasks is enabled on neighbor regions, the neighbor region uses the client's draw distance to send out prim. This is a lot less likely to flood the client now since the ChildAgentDataUpdate contains both the throttle settings and the draw distance. This means that with this enabled, you can see prim in other regions in grid mode. Very experimental.
-rw-r--r--OpenSim/Framework/ChildAgentDataUpdate.cs3
-rw-r--r--OpenSim/Framework/IClientAPI.cs3
-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
11 files changed, 276 insertions, 112 deletions
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs
index 32ce4ab..4bb33f9 100644
--- a/OpenSim/Framework/ChildAgentDataUpdate.cs
+++ b/OpenSim/Framework/ChildAgentDataUpdate.cs
@@ -46,5 +46,8 @@ namespace OpenSim.Framework
46 public Guid AgentID; 46 public Guid AgentID;
47 public float godlevel; 47 public float godlevel;
48 public byte[] throttles; 48 public byte[] throttles;
49 public bool alwaysrun;
50 public Guid ActiveGroupID;
51 public uint GroupAccess;
49 } 52 }
50} \ No newline at end of file 53} \ No newline at end of file
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index a84443b..d163ae7 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -613,6 +613,9 @@ namespace OpenSim.Framework
613 void SendAvatarProperties(LLUUID avatarID, string aboutText, string bornOn, string charterMember, string flAbout, 613 void SendAvatarProperties(LLUUID avatarID, string aboutText, string bornOn, string charterMember, string flAbout,
614 uint flags, LLUUID flImageID, LLUUID imageID, string profileURL, LLUUID partnerID); 614 uint flags, LLUUID flImageID, LLUUID imageID, string profileURL, LLUUID partnerID);
615 615
616 byte[] GetThrottlesPacked(float multiplier);
617
618
616 void SetDebug(int newDebug); 619 void SetDebug(int newDebug);
617 void InPacket(Packet NewPack); 620 void InPacket(Packet NewPack);
618 void Close(bool ShutdownCircuit); 621 void Close(bool ShutdownCircuit);
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 }