diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/Application/OpenSimMain.cs | 8 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/ClientView.cs | 29 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/PacketQueue.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Communications/OGS1/OGS1GridServices.cs | 198 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/InnerScene.cs | 30 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 19 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs | 33 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/ScenePresence.cs | 58 | ||||
-rw-r--r-- | OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs | 5 |
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 | } |