diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs')
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | 1027 |
1 files changed, 773 insertions, 254 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 4be19f0..7937383 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -154,12 +154,25 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
154 | // Add this agent in this region as a banned person | 154 | // Add this agent in this region as a banned person |
155 | public void Add(ulong pRegionHandle, UUID pAgentID) | 155 | public void Add(ulong pRegionHandle, UUID pAgentID) |
156 | { | 156 | { |
157 | <<<<<<< HEAD | ||
157 | if (!m_bannedRegions.TryGetValue(pAgentID, out m_idCache)) | 158 | if (!m_bannedRegions.TryGetValue(pAgentID, out m_idCache)) |
158 | { | 159 | { |
159 | m_idCache = new ExpiringCache<ulong, DateTime>(); | 160 | m_idCache = new ExpiringCache<ulong, DateTime>(); |
160 | m_bannedRegions.Add(pAgentID, m_idCache, TimeSpan.FromSeconds(45)); | 161 | m_bannedRegions.Add(pAgentID, m_idCache, TimeSpan.FromSeconds(45)); |
161 | } | 162 | } |
162 | m_idCache.Add(pRegionHandle, DateTime.Now + TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15)); | 163 | m_idCache.Add(pRegionHandle, DateTime.Now + TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15)); |
164 | ======= | ||
165 | this.Add(pRegionHandle, pAgentID, 45, 15); | ||
166 | } | ||
167 | public void Add(ulong pRegionHandle, UUID pAgentID, double newTime, double extendTime) | ||
168 | { | ||
169 | if (!m_bannedRegions.TryGetValue(pAgentID, out m_idCache)) | ||
170 | { | ||
171 | m_idCache = new ExpiringCache<ulong, DateTime>(); | ||
172 | m_bannedRegions.Add(pAgentID, m_idCache, TimeSpan.FromSeconds(newTime)); | ||
173 | } | ||
174 | m_idCache.Add(pRegionHandle, DateTime.Now + TimeSpan.FromSeconds(extendTime), TimeSpan.FromSeconds(extendTime)); | ||
175 | >>>>>>> avn/ubitvar | ||
163 | } | 176 | } |
164 | // Remove the agent from the region's banned list | 177 | // Remove the agent from the region's banned list |
165 | public void Remove(ulong pRegionHandle, UUID pAgentID) | 178 | public void Remove(ulong pRegionHandle, UUID pAgentID) |
@@ -209,6 +222,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
209 | { | 222 | { |
210 | string transferVersionName = "SIMULATION"; | 223 | string transferVersionName = "SIMULATION"; |
211 | float maxTransferVersion = 0.3f; | 224 | float maxTransferVersion = 0.3f; |
225 | <<<<<<< HEAD | ||
212 | 226 | ||
213 | IConfig hypergridConfig = source.Configs["Hypergrid"]; | 227 | IConfig hypergridConfig = source.Configs["Hypergrid"]; |
214 | if (hypergridConfig != null) | 228 | if (hypergridConfig != null) |
@@ -221,6 +235,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
221 | if (m_GatekeeperURI != string.Empty && !m_GatekeeperURI.EndsWith("/")) | 235 | if (m_GatekeeperURI != string.Empty && !m_GatekeeperURI.EndsWith("/")) |
222 | m_GatekeeperURI += '/'; | 236 | m_GatekeeperURI += '/'; |
223 | } | 237 | } |
238 | ======= | ||
239 | >>>>>>> avn/ubitvar | ||
224 | 240 | ||
225 | IConfig transferConfig = source.Configs["EntityTransfer"]; | 241 | IConfig transferConfig = source.Configs["EntityTransfer"]; |
226 | if (transferConfig != null) | 242 | if (transferConfig != null) |
@@ -491,16 +507,23 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
491 | } | 507 | } |
492 | 508 | ||
493 | // TODO: Get proper AVG Height | 509 | // TODO: Get proper AVG Height |
494 | float localAVHeight = 1.56f; | 510 | float localHalfAVHeight = 0.8f; |
511 | if (sp.Appearance != null) | ||
512 | localHalfAVHeight = sp.Appearance.AvatarHeight / 2; | ||
513 | |||
495 | float posZLimit = 22; | 514 | float posZLimit = 22; |
496 | 515 | ||
497 | // TODO: Check other Scene HeightField | 516 | // TODO: Check other Scene HeightField |
498 | posZLimit = (float)sp.Scene.Heightmap[(int)position.X, (int)position.Y]; | 517 | posZLimit = (float)sp.Scene.Heightmap[(int)position.X, (int)position.Y]; |
518 | <<<<<<< HEAD | ||
519 | ======= | ||
520 | |||
521 | posZLimit += localHalfAVHeight + 0.1f; | ||
522 | >>>>>>> avn/ubitvar | ||
499 | 523 | ||
500 | float newPosZ = posZLimit + localAVHeight; | 524 | if ((position.Z < posZLimit) && !(Single.IsInfinity(posZLimit) || Single.IsNaN(posZLimit))) |
501 | if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) | ||
502 | { | 525 | { |
503 | position.Z = newPosZ; | 526 | position.Z = posZLimit; |
504 | } | 527 | } |
505 | 528 | ||
506 | if (sp.Flying) | 529 | if (sp.Flying) |
@@ -599,9 +622,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
599 | Util.RegionHandleToRegionLoc(regionHandle, out regX, out regY); | 622 | Util.RegionHandleToRegionLoc(regionHandle, out regX, out regY); |
600 | 623 | ||
601 | MapBlockData block = new MapBlockData(); | 624 | MapBlockData block = new MapBlockData(); |
625 | <<<<<<< HEAD | ||
602 | block.X = (ushort)regX; | 626 | block.X = (ushort)regX; |
603 | block.Y = (ushort)regY; | 627 | block.Y = (ushort)regY; |
604 | block.Access = (byte)SimAccess.Down; | 628 | block.Access = (byte)SimAccess.Down; |
629 | ======= | ||
630 | block.X = (ushort)(regX); | ||
631 | block.Y = (ushort)(regY); | ||
632 | block.Access = (byte)SimAccess.Down; // == not there | ||
633 | >>>>>>> avn/ubitvar | ||
605 | 634 | ||
606 | List<MapBlockData> blocks = new List<MapBlockData>(); | 635 | List<MapBlockData> blocks = new List<MapBlockData>(); |
607 | blocks.Add(block); | 636 | blocks.Add(block); |
@@ -736,10 +765,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
736 | return; | 765 | return; |
737 | } | 766 | } |
738 | 767 | ||
768 | <<<<<<< HEAD | ||
739 | uint newRegionX, newRegionY, oldRegionX, oldRegionY; | 769 | uint newRegionX, newRegionY, oldRegionX, oldRegionY; |
740 | Util.RegionHandleToRegionLoc(reg.RegionHandle, out newRegionX, out newRegionY); | 770 | Util.RegionHandleToRegionLoc(reg.RegionHandle, out newRegionX, out newRegionY); |
741 | Util.RegionHandleToRegionLoc(sp.Scene.RegionInfo.RegionHandle, out oldRegionX, out oldRegionY); | 771 | Util.RegionHandleToRegionLoc(sp.Scene.RegionInfo.RegionHandle, out oldRegionX, out oldRegionY); |
742 | 772 | ||
773 | ======= | ||
774 | >>>>>>> avn/ubitvar | ||
743 | ulong destinationHandle = finalDestination.RegionHandle; | 775 | ulong destinationHandle = finalDestination.RegionHandle; |
744 | 776 | ||
745 | // Let's do DNS resolution only once in this process, please! | 777 | // Let's do DNS resolution only once in this process, please! |
@@ -762,7 +794,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
762 | string version; | 794 | string version; |
763 | string myversion = string.Format("{0}/{1}", OutgoingTransferVersionName, MaxOutgoingTransferVersion); | 795 | string myversion = string.Format("{0}/{1}", OutgoingTransferVersionName, MaxOutgoingTransferVersion); |
764 | if (!Scene.SimulationService.QueryAccess( | 796 | if (!Scene.SimulationService.QueryAccess( |
797 | <<<<<<< HEAD | ||
765 | finalDestination, sp.ControllingClient.AgentId, homeURI, true, position, myversion, sp.Scene.GetFormatsOffered(), out version, out reason)) | 798 | finalDestination, sp.ControllingClient.AgentId, homeURI, true, position, myversion, sp.Scene.GetFormatsOffered(), out version, out reason)) |
799 | ======= | ||
800 | finalDestination, sp.ControllingClient.AgentId, homeURI, true, position, myversion, out version, out reason)) | ||
801 | >>>>>>> avn/ubitvar | ||
766 | { | 802 | { |
767 | sp.ControllingClient.SendTeleportFailed(reason); | 803 | sp.ControllingClient.SendTeleportFailed(reason); |
768 | 804 | ||
@@ -808,7 +844,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
808 | AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo(); | 844 | AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo(); |
809 | agentCircuit.startpos = position; | 845 | agentCircuit.startpos = position; |
810 | agentCircuit.child = true; | 846 | agentCircuit.child = true; |
811 | agentCircuit.Appearance = sp.Appearance; | 847 | |
848 | // agentCircuit.Appearance = sp.Appearance; | ||
849 | // agentCircuit.Appearance = new AvatarAppearance(sp.Appearance, true, false); | ||
850 | agentCircuit.Appearance = new AvatarAppearance(); | ||
851 | agentCircuit.Appearance.AvatarHeight = sp.Appearance.AvatarHeight; | ||
852 | |||
812 | if (currentAgentCircuit != null) | 853 | if (currentAgentCircuit != null) |
813 | { | 854 | { |
814 | agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs; | 855 | agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs; |
@@ -819,14 +860,48 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
819 | agentCircuit.Id0 = currentAgentCircuit.Id0; | 860 | agentCircuit.Id0 = currentAgentCircuit.Id0; |
820 | } | 861 | } |
821 | 862 | ||
863 | <<<<<<< HEAD | ||
822 | // if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) | 864 | // if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) |
823 | float dist = (float)Math.Max(sp.Scene.DefaultDrawDistance, | 865 | float dist = (float)Math.Max(sp.Scene.DefaultDrawDistance, |
824 | (float)Math.Max(sp.Scene.RegionInfo.RegionSizeX, sp.Scene.RegionInfo.RegionSizeY)); | 866 | (float)Math.Max(sp.Scene.RegionInfo.RegionSizeX, sp.Scene.RegionInfo.RegionSizeY)); |
825 | if (NeedsNewAgent(dist, oldRegionX, newRegionX, oldRegionY, newRegionY)) | 867 | if (NeedsNewAgent(dist, oldRegionX, newRegionX, oldRegionY, newRegionY)) |
868 | ======= | ||
869 | IClientIPEndpoint ipepClient; | ||
870 | |||
871 | uint newRegionX, newRegionY, oldRegionX, oldRegionY; | ||
872 | Util.RegionHandleToRegionLoc(destinationHandle, out newRegionX, out newRegionY); | ||
873 | Util.RegionHandleToRegionLoc(sourceRegion.RegionHandle, out oldRegionX, out oldRegionY); | ||
874 | int oldSizeX = (int)sourceRegion.RegionSizeX; | ||
875 | int oldSizeY = (int)sourceRegion.RegionSizeY; | ||
876 | int newSizeX = finalDestination.RegionSizeX; | ||
877 | int newSizeY = finalDestination.RegionSizeY; | ||
878 | |||
879 | bool OutSideViewRange = NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, | ||
880 | oldSizeX, oldSizeY, newSizeX, newSizeY); | ||
881 | |||
882 | if (OutSideViewRange) | ||
883 | >>>>>>> avn/ubitvar | ||
826 | { | 884 | { |
827 | // brand new agent, let's create a new caps seed | 885 | m_log.DebugFormat( |
886 | "[ENTITY TRANSFER MODULE]: Determined that region {0} at {1},{2} needs new child agent for agent {3} from {4}", | ||
887 | finalDestination.RegionName, newRegionX, newRegionY, sp.Name, Scene.Name); | ||
888 | |||
889 | //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); | ||
890 | #region IP Translation for NAT | ||
891 | // Uses ipepClient above | ||
892 | if (sp.ClientView.TryGet(out ipepClient)) | ||
893 | { | ||
894 | endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); | ||
895 | } | ||
896 | #endregion | ||
828 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | 897 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); |
829 | } | 898 | } |
899 | else | ||
900 | { | ||
901 | agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle); | ||
902 | if (agentCircuit.CapsPath == null) | ||
903 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
904 | } | ||
830 | 905 | ||
831 | // We're going to fallback to V1 if the destination gives us anything smaller than 0.2 or we're forcing | 906 | // We're going to fallback to V1 if the destination gives us anything smaller than 0.2 or we're forcing |
832 | // use of the earlier protocol | 907 | // use of the earlier protocol |
@@ -836,13 +911,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
836 | float.TryParse(versionComponents[1], out versionNumber); | 911 | float.TryParse(versionComponents[1], out versionNumber); |
837 | 912 | ||
838 | if (versionNumber >= 0.2f && MaxOutgoingTransferVersion >= versionNumber) | 913 | if (versionNumber >= 0.2f && MaxOutgoingTransferVersion >= versionNumber) |
914 | <<<<<<< HEAD | ||
839 | TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason); | 915 | TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason); |
916 | ======= | ||
917 | TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, OutSideViewRange , version, out reason); | ||
918 | >>>>>>> avn/ubitvar | ||
840 | else | 919 | else |
841 | TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason); | 920 | TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, OutSideViewRange, version, out reason); |
842 | } | 921 | } |
843 | 922 | ||
844 | private void TransferAgent_V1(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, | 923 | private void TransferAgent_V1(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, |
845 | IPEndPoint endPoint, uint teleportFlags, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, string version, out string reason) | 924 | IPEndPoint endPoint, uint teleportFlags, bool OutSideViewRange, string version, out string reason) |
846 | { | 925 | { |
847 | ulong destinationHandle = finalDestination.RegionHandle; | 926 | ulong destinationHandle = finalDestination.RegionHandle; |
848 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | 927 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); |
@@ -851,6 +930,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
851 | "[ENTITY TRANSFER MODULE]: Using TP V1 for {0} going from {1} to {2}", | 930 | "[ENTITY TRANSFER MODULE]: Using TP V1 for {0} going from {1} to {2}", |
852 | sp.Name, Scene.Name, finalDestination.RegionName); | 931 | sp.Name, Scene.Name, finalDestination.RegionName); |
853 | 932 | ||
933 | string capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | ||
934 | |||
854 | // Let's create an agent there if one doesn't exist yet. | 935 | // Let's create an agent there if one doesn't exist yet. |
855 | // NOTE: logout will always be false for a non-HG teleport. | 936 | // NOTE: logout will always be false for a non-HG teleport. |
856 | bool logout = false; | 937 | bool logout = false; |
@@ -892,6 +973,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
892 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring); | 973 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring); |
893 | 974 | ||
894 | // OK, it got this agent. Let's close some child agents | 975 | // OK, it got this agent. Let's close some child agents |
976 | <<<<<<< HEAD | ||
895 | sp.CloseChildAgents(newRegionX, newRegionY); | 977 | sp.CloseChildAgents(newRegionX, newRegionY); |
896 | 978 | ||
897 | IClientIPEndpoint ipepClient; | 979 | IClientIPEndpoint ipepClient; |
@@ -903,17 +985,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
903 | m_log.DebugFormat( | 985 | m_log.DebugFormat( |
904 | "[ENTITY TRANSFER MODULE]: Determined that region {0} at {1},{2} needs new child agent for incoming agent {3} from {4}", | 986 | "[ENTITY TRANSFER MODULE]: Determined that region {0} at {1},{2} needs new child agent for incoming agent {3} from {4}", |
905 | finalDestination.RegionName, newRegionX, newRegionY, sp.Name, Scene.Name); | 987 | finalDestination.RegionName, newRegionX, newRegionY, sp.Name, Scene.Name); |
988 | ======= | ||
989 | >>>>>>> avn/ubitvar | ||
906 | 990 | ||
907 | //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); | ||
908 | #region IP Translation for NAT | ||
909 | // Uses ipepClient above | ||
910 | if (sp.ClientView.TryGet(out ipepClient)) | ||
911 | { | ||
912 | endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); | ||
913 | } | ||
914 | #endregion | ||
915 | capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | ||
916 | 991 | ||
992 | if (OutSideViewRange) | ||
993 | { | ||
917 | if (m_eqModule != null) | 994 | if (m_eqModule != null) |
918 | { | 995 | { |
919 | // The EnableSimulator message makes the client establish a connection with the destination | 996 | // The EnableSimulator message makes the client establish a connection with the destination |
@@ -943,15 +1020,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
943 | sp.ControllingClient.InformClientOfNeighbour(destinationHandle, endPoint); | 1020 | sp.ControllingClient.InformClientOfNeighbour(destinationHandle, endPoint); |
944 | } | 1021 | } |
945 | } | 1022 | } |
946 | else | ||
947 | { | ||
948 | agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle); | ||
949 | capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | ||
950 | } | ||
951 | 1023 | ||
952 | // Let's send a full update of the agent. This is a synchronous call. | 1024 | // Let's send a full update of the agent. This is a synchronous call. |
953 | AgentData agent = new AgentData(); | 1025 | AgentData agent = new AgentData(); |
954 | sp.CopyTo(agent); | 1026 | sp.CopyTo(agent); |
1027 | |||
1028 | if ((teleportFlags & (uint)TeleportFlags.IsFlying) != 0) | ||
1029 | agent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | ||
1030 | |||
955 | agent.Position = agentCircuit.startpos; | 1031 | agent.Position = agentCircuit.startpos; |
956 | SetCallbackURL(agent, sp.Scene.RegionInfo); | 1032 | SetCallbackURL(agent, sp.Scene.RegionInfo); |
957 | 1033 | ||
@@ -1053,7 +1129,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1053 | return; | 1129 | return; |
1054 | } | 1130 | } |
1055 | 1131 | ||
1056 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); | ||
1057 | 1132 | ||
1058 | // For backwards compatibility | 1133 | // For backwards compatibility |
1059 | if (version == "Unknown" || version == string.Empty) | 1134 | if (version == "Unknown" || version == string.Empty) |
@@ -1063,18 +1138,30 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1063 | CrossAttachmentsIntoNewRegion(finalDestination, sp, true); | 1138 | CrossAttachmentsIntoNewRegion(finalDestination, sp, true); |
1064 | } | 1139 | } |
1065 | 1140 | ||
1141 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); | ||
1142 | |||
1143 | |||
1066 | // May need to logout or other cleanup | 1144 | // May need to logout or other cleanup |
1067 | AgentHasMovedAway(sp, logout); | 1145 | // AgentHasMovedAway(sp, logout); |
1146 | // AgentHasMovedAway(sp, true); // until logout use is checked | ||
1068 | 1147 | ||
1069 | // Well, this is it. The agent is over there. | 1148 | // Well, this is it. The agent is over there. |
1070 | KillEntity(sp.Scene, sp.LocalId); | 1149 | // KillEntity(sp.Scene, sp.LocalId); |
1150 | |||
1151 | sp.HasMovedAway(!OutSideViewRange); | ||
1152 | |||
1153 | sp.CloseChildAgents(destinationHandle,finalDestination.RegionSizeX,finalDestination.RegionSizeY); | ||
1071 | 1154 | ||
1072 | // Now let's make it officially a child agent | 1155 | // Now let's make it officially a child agent |
1073 | sp.MakeChildAgent(); | 1156 | sp.MakeChildAgent(destinationHandle); |
1074 | 1157 | ||
1075 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone | 1158 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone |
1076 | 1159 | ||
1160 | <<<<<<< HEAD | ||
1077 | if (NeedsClosing(sp.Scene.DefaultDrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | 1161 | if (NeedsClosing(sp.Scene.DefaultDrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) |
1162 | ======= | ||
1163 | if (OutSideViewRange) | ||
1164 | >>>>>>> avn/ubitvar | ||
1078 | { | 1165 | { |
1079 | if (!sp.Scene.IncomingPreCloseClient(sp)) | 1166 | if (!sp.Scene.IncomingPreCloseClient(sp)) |
1080 | return; | 1167 | return; |
@@ -1089,19 +1176,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1089 | 1176 | ||
1090 | sp.Scene.CloseAgent(sp.UUID, false); | 1177 | sp.Scene.CloseAgent(sp.UUID, false); |
1091 | } | 1178 | } |
1092 | else | ||
1093 | { | ||
1094 | // now we have a child agent in this region. | ||
1095 | sp.Reset(); | ||
1096 | } | ||
1097 | } | 1179 | } |
1098 | 1180 | ||
1099 | private void TransferAgent_V2(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, | 1181 | private void TransferAgent_V2(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, |
1100 | IPEndPoint endPoint, uint teleportFlags, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, string version, out string reason) | 1182 | IPEndPoint endPoint, uint teleportFlags, bool OutSideViewRange, string version, out string reason) |
1101 | { | 1183 | { |
1102 | ulong destinationHandle = finalDestination.RegionHandle; | 1184 | ulong destinationHandle = finalDestination.RegionHandle; |
1103 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | 1185 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); |
1104 | 1186 | ||
1187 | string capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);; | ||
1188 | |||
1105 | // Let's create an agent there if one doesn't exist yet. | 1189 | // Let's create an agent there if one doesn't exist yet. |
1106 | // NOTE: logout will always be false for a non-HG teleport. | 1190 | // NOTE: logout will always be false for a non-HG teleport. |
1107 | bool logout = false; | 1191 | bool logout = false; |
@@ -1142,6 +1226,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1142 | // Past this point we have to attempt clean up if the teleport fails, so update transfer state. | 1226 | // Past this point we have to attempt clean up if the teleport fails, so update transfer state. |
1143 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring); | 1227 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring); |
1144 | 1228 | ||
1229 | <<<<<<< HEAD | ||
1145 | IClientIPEndpoint ipepClient; | 1230 | IClientIPEndpoint ipepClient; |
1146 | string capsPath = String.Empty; | 1231 | string capsPath = String.Empty; |
1147 | float dist = (float)Math.Max(sp.Scene.DefaultDrawDistance, | 1232 | float dist = (float)Math.Max(sp.Scene.DefaultDrawDistance, |
@@ -1168,6 +1253,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1168 | capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | 1253 | capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); |
1169 | } | 1254 | } |
1170 | 1255 | ||
1256 | ======= | ||
1257 | >>>>>>> avn/ubitvar | ||
1171 | // We need to set this here to avoid an unlikely race condition when teleporting to a neighbour simulator, | 1258 | // We need to set this here to avoid an unlikely race condition when teleporting to a neighbour simulator, |
1172 | // where that neighbour simulator could otherwise request a child agent create on the source which then | 1259 | // where that neighbour simulator could otherwise request a child agent create on the source which then |
1173 | // closes our existing agent which is still signalled as root. | 1260 | // closes our existing agent which is still signalled as root. |
@@ -1189,6 +1276,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1189 | AgentData agent = new AgentData(); | 1276 | AgentData agent = new AgentData(); |
1190 | sp.CopyTo(agent); | 1277 | sp.CopyTo(agent); |
1191 | agent.Position = agentCircuit.startpos; | 1278 | agent.Position = agentCircuit.startpos; |
1279 | |||
1280 | if ((teleportFlags & (uint)TeleportFlags.IsFlying) != 0) | ||
1281 | agent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | ||
1282 | |||
1192 | agent.SenderWantsToWaitForRoot = true; | 1283 | agent.SenderWantsToWaitForRoot = true; |
1193 | //SetCallbackURL(agent, sp.Scene.RegionInfo); | 1284 | //SetCallbackURL(agent, sp.Scene.RegionInfo); |
1194 | 1285 | ||
@@ -1224,25 +1315,29 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1224 | 1315 | ||
1225 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); | 1316 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); |
1226 | 1317 | ||
1318 | sp.HasMovedAway(!OutSideViewRange); | ||
1319 | |||
1227 | // Need to signal neighbours whether child agents may need closing irrespective of whether this | 1320 | // Need to signal neighbours whether child agents may need closing irrespective of whether this |
1228 | // one needed closing. We also need to close child agents as quickly as possible to avoid complicated | 1321 | // one needed closing. We also need to close child agents as quickly as possible to avoid complicated |
1229 | // race conditions with rapid agent releporting (e.g. from A1 to a non-neighbour B, back | 1322 | // race conditions with rapid agent releporting (e.g. from A1 to a non-neighbour B, back |
1230 | // to a neighbour A2 then off to a non-neighbour C). Closing child agents any later requires complex | 1323 | // to a neighbour A2 then off to a non-neighbour C). Closing child agents any later requires complex |
1231 | // distributed checks to avoid problems in rapid reteleporting scenarios and where child agents are | 1324 | // distributed checks to avoid problems in rapid reteleporting scenarios and where child agents are |
1232 | // abandoned without proper close by viewer but then re-used by an incoming connection. | 1325 | // abandoned without proper close by viewer but then re-used by an incoming connection. |
1233 | sp.CloseChildAgents(newRegionX, newRegionY); | 1326 | sp.CloseChildAgents(destinationHandle, finalDestination.RegionSizeX, finalDestination.RegionSizeY); |
1234 | |||
1235 | // May need to logout or other cleanup | ||
1236 | AgentHasMovedAway(sp, logout); | ||
1237 | 1327 | ||
1328 | // AgentHasMovedAway(sp, true); | ||
1238 | // Well, this is it. The agent is over there. | 1329 | // Well, this is it. The agent is over there. |
1239 | KillEntity(sp.Scene, sp.LocalId); | 1330 | // KillEntity(sp.Scene, sp.LocalId); |
1240 | 1331 | ||
1241 | // Now let's make it officially a child agent | 1332 | // Now let's make it officially a child agent |
1242 | sp.MakeChildAgent(); | 1333 | sp.MakeChildAgent(destinationHandle); |
1243 | 1334 | ||
1244 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone | 1335 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone |
1336 | <<<<<<< HEAD | ||
1245 | if (NeedsClosing(sp.Scene.DefaultDrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | 1337 | if (NeedsClosing(sp.Scene.DefaultDrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) |
1338 | ======= | ||
1339 | if (OutSideViewRange) | ||
1340 | >>>>>>> avn/ubitvar | ||
1246 | { | 1341 | { |
1247 | if (!sp.Scene.IncomingPreCloseClient(sp)) | 1342 | if (!sp.Scene.IncomingPreCloseClient(sp)) |
1248 | return; | 1343 | return; |
@@ -1263,11 +1358,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1263 | 1358 | ||
1264 | sp.Scene.CloseAgent(sp.UUID, false); | 1359 | sp.Scene.CloseAgent(sp.UUID, false); |
1265 | } | 1360 | } |
1361 | /* | ||
1266 | else | 1362 | else |
1267 | { | 1363 | { |
1268 | // now we have a child agent in this region. | 1364 | // now we have a child agent in this region. |
1269 | sp.Reset(); | 1365 | sp.Reset(); |
1270 | } | 1366 | } |
1367 | */ | ||
1271 | } | 1368 | } |
1272 | 1369 | ||
1273 | /// <summary> | 1370 | /// <summary> |
@@ -1351,7 +1448,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1351 | protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) | 1448 | protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) |
1352 | { | 1449 | { |
1353 | if (sp.Scene.AttachmentsModule != null) | 1450 | if (sp.Scene.AttachmentsModule != null) |
1354 | sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, true); | 1451 | sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, logout); |
1355 | } | 1452 | } |
1356 | 1453 | ||
1357 | protected void KillEntity(Scene scene, uint localID) | 1454 | protected void KillEntity(Scene scene, uint localID) |
@@ -1368,7 +1465,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1368 | // This returns 'true' if the new region already has a child agent for our | 1465 | // This returns 'true' if the new region already has a child agent for our |
1369 | // incoming agent. The implication is that, if 'false', we have to create the | 1466 | // incoming agent. The implication is that, if 'false', we have to create the |
1370 | // child and then teleport into the region. | 1467 | // child and then teleport into the region. |
1468 | <<<<<<< HEAD | ||
1371 | protected virtual bool NeedsNewAgent(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY) | 1469 | protected virtual bool NeedsNewAgent(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY) |
1470 | ======= | ||
1471 | protected virtual bool NeedsNewAgent(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, | ||
1472 | int oldsizeX, int oldsizeY, int newsizeX, int newsizeY) | ||
1473 | >>>>>>> avn/ubitvar | ||
1372 | { | 1474 | { |
1373 | if (m_regionCombinerModule != null && m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID)) | 1475 | if (m_regionCombinerModule != null && m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID)) |
1374 | { | 1476 | { |
@@ -1381,17 +1483,23 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1381 | 1483 | ||
1382 | return !(newRegionX >= swCorner.X && newRegionX <= neCorner.X && newRegionY >= swCorner.Y && newRegionY <= neCorner.Y); | 1484 | return !(newRegionX >= swCorner.X && newRegionX <= neCorner.X && newRegionY >= swCorner.Y && newRegionY <= neCorner.Y); |
1383 | } | 1485 | } |
1384 | else | 1486 | |
1385 | { | 1487 | return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, |
1386 | return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY); | 1488 | oldsizeX, oldsizeY, newsizeX, newsizeY); |
1387 | } | ||
1388 | } | 1489 | } |
1490 | <<<<<<< HEAD | ||
1389 | 1491 | ||
1390 | protected virtual bool NeedsClosing(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, GridRegion reg) | 1492 | ======= |
1493 | /* | ||
1494 | protected virtual bool NeedsClosing(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, | ||
1495 | uint oldsizeX, uint oldsizeY, uint newsizeX, uint newsizeY, GridRegion reg) | ||
1391 | { | 1496 | { |
1392 | return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY); | ||
1393 | } | ||
1394 | 1497 | ||
1498 | return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, | ||
1499 | oldsizeX, oldsizeY, newsizeX, newsizeY); | ||
1500 | } | ||
1501 | */ | ||
1502 | >>>>>>> avn/ubitvar | ||
1395 | #endregion | 1503 | #endregion |
1396 | 1504 | ||
1397 | #region Landmark Teleport | 1505 | #region Landmark Teleport |
@@ -1472,14 +1580,20 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1472 | 1580 | ||
1473 | #region Agent Crossings | 1581 | #region Agent Crossings |
1474 | 1582 | ||
1583 | <<<<<<< HEAD | ||
1475 | // Given a position relative to the current region (which has previously been tested to | 1584 | // Given a position relative to the current region (which has previously been tested to |
1476 | // see that it is actually outside the current region), find the new region that the | 1585 | // see that it is actually outside the current region), find the new region that the |
1477 | // point is actually in. | 1586 | // point is actually in. |
1478 | // Returns the coordinates and information of the new region or 'null' of it doesn't exist. | 1587 | // Returns the coordinates and information of the new region or 'null' of it doesn't exist. |
1479 | public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, | 1588 | public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, |
1480 | out string version, out Vector3 newpos, out string failureReason) | 1589 | out string version, out Vector3 newpos, out string failureReason) |
1590 | ======= | ||
1591 | public bool checkAgentAccessToRegion(ScenePresence agent, GridRegion destiny, Vector3 position, out string version, out string reason) | ||
1592 | >>>>>>> avn/ubitvar | ||
1481 | { | 1593 | { |
1594 | reason = String.Empty; | ||
1482 | version = String.Empty; | 1595 | version = String.Empty; |
1596 | <<<<<<< HEAD | ||
1483 | newpos = pos; | 1597 | newpos = pos; |
1484 | failureReason = string.Empty; | 1598 | failureReason = string.Empty; |
1485 | string homeURI = scene.GetAgentHomeURI(agentID); | 1599 | string homeURI = scene.GetAgentHomeURI(agentID); |
@@ -1541,32 +1655,180 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1541 | LogHeader, neighbourRegion.RegionName, | 1655 | LogHeader, neighbourRegion.RegionName, |
1542 | neighbourRegion.RegionLocX, neighbourRegion.RegionLocY, neighbourRegion.RegionSizeX, neighbourRegion.RegionSizeY, | 1656 | neighbourRegion.RegionLocX, neighbourRegion.RegionLocY, neighbourRegion.RegionSizeX, neighbourRegion.RegionSizeY, |
1543 | newpos.X, newpos.Y); | 1657 | newpos.X, newpos.Y); |
1658 | ======= | ||
1659 | |||
1660 | UUID agentID = agent.UUID; | ||
1661 | ulong destinyHandle = destiny.RegionHandle; | ||
1662 | |||
1663 | if (m_bannedRegionCache.IfBanned(destinyHandle, agentID)) | ||
1664 | { | ||
1665 | reason = "Cannot connect to region"; | ||
1666 | return false; | ||
1667 | } | ||
1668 | |||
1669 | Scene ascene = agent.Scene; | ||
1670 | string homeURI = ascene.GetAgentHomeURI(agentID); | ||
1671 | string myversion = string.Format("{0}/{1}", OutgoingTransferVersionName, MaxOutgoingTransferVersion); | ||
1672 | |||
1673 | |||
1674 | if (!ascene.SimulationService.QueryAccess(destiny, agentID, homeURI, false, position, | ||
1675 | myversion, out version, out reason)) | ||
1676 | { | ||
1677 | m_bannedRegionCache.Add(destinyHandle, agentID, 30.0, 30.0); | ||
1678 | return false; | ||
1679 | } | ||
1680 | |||
1681 | return true; | ||
1682 | } | ||
1683 | |||
1684 | public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out string version, out Vector3 newpos) | ||
1685 | { | ||
1686 | string r = String.Empty; | ||
1687 | return GetDestination(scene, agentID, pos, out version, out newpos, out r); | ||
1688 | } | ||
1689 | |||
1690 | // Given a position relative to the current region (which has previously been tested to | ||
1691 | // see that it is actually outside the current region), find the new region that the | ||
1692 | // point is actually in. | ||
1693 | // Returns the coordinates and information of the new region or 'null' of it doesn't exist. | ||
1694 | |||
1695 | // now only works for crossings | ||
1696 | |||
1697 | public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, | ||
1698 | out string version, out Vector3 newpos, out string failureReason) | ||
1699 | { | ||
1700 | version = String.Empty; | ||
1701 | newpos = pos; | ||
1702 | failureReason = string.Empty; | ||
1703 | |||
1704 | // m_log.DebugFormat( | ||
1705 | // "[ENTITY TRANSFER MODULE]: Crossing agent {0} at pos {1} in {2}", agent.Name, pos, scene.Name); | ||
1706 | |||
1707 | // Compute world location of the object's position | ||
1708 | double presenceWorldX = (double)scene.RegionInfo.WorldLocX + pos.X; | ||
1709 | double presenceWorldY = (double)scene.RegionInfo.WorldLocY + pos.Y; | ||
1710 | |||
1711 | // Call the grid service to lookup the region containing the new position. | ||
1712 | GridRegion neighbourRegion = GetRegionContainingWorldLocation(scene.GridService, scene.RegionInfo.ScopeID, | ||
1713 | presenceWorldX, presenceWorldY, | ||
1714 | Math.Max(scene.RegionInfo.RegionSizeX, scene.RegionInfo.RegionSizeY)); | ||
1715 | |||
1716 | if (neighbourRegion != null) | ||
1717 | { | ||
1718 | // Compute the entity's position relative to the new region | ||
1719 | newpos = new Vector3((float)(presenceWorldX - (double)neighbourRegion.RegionLocX), | ||
1720 | (float)(presenceWorldY - (double)neighbourRegion.RegionLocY), | ||
1721 | pos.Z); | ||
1722 | |||
1723 | if (m_bannedRegionCache.IfBanned(neighbourRegion.RegionHandle, agentID)) | ||
1724 | { | ||
1725 | failureReason = "Cannot region cross into banned parcel"; | ||
1726 | neighbourRegion = null; | ||
1727 | } | ||
1728 | else | ||
1729 | { | ||
1730 | // If not banned, make sure this agent is not in the list. | ||
1731 | m_bannedRegionCache.Remove(neighbourRegion.RegionHandle, agentID); | ||
1732 | } | ||
1733 | |||
1734 | // Check to see if we have access to the target region. | ||
1735 | string myversion = string.Format("{0}/{1}", OutgoingTransferVersionName, MaxOutgoingTransferVersion); | ||
1736 | string homeURI = scene.GetAgentHomeURI(agentID); | ||
1737 | if (neighbourRegion != null | ||
1738 | && !scene.SimulationService.QueryAccess(neighbourRegion, agentID, homeURI, false, newpos, myversion, out version, out failureReason)) | ||
1739 | { | ||
1740 | // remember banned | ||
1741 | m_bannedRegionCache.Add(neighbourRegion.RegionHandle, agentID); | ||
1742 | neighbourRegion = null; | ||
1743 | } | ||
1744 | } | ||
1745 | else | ||
1746 | { | ||
1747 | // The destination region just doesn't exist | ||
1748 | failureReason = "Cannot cross into non-existent region"; | ||
1749 | } | ||
1750 | >>>>>>> avn/ubitvar | ||
1751 | |||
1752 | if (neighbourRegion == null) | ||
1753 | m_log.DebugFormat("{0} GetDestination: region not found. Old region name={1} at <{2},{3}> of size <{4},{5}>. Old pos={6}", | ||
1754 | LogHeader, scene.RegionInfo.RegionName, | ||
1755 | scene.RegionInfo.RegionLocX, scene.RegionInfo.RegionLocY, | ||
1756 | scene.RegionInfo.RegionSizeX, scene.RegionInfo.RegionSizeY, | ||
1757 | pos); | ||
1758 | else | ||
1759 | m_log.DebugFormat("{0} GetDestination: new region={1} at <{2},{3}> of size <{4},{5}>, newpos=<{6},{7}>", | ||
1760 | LogHeader, neighbourRegion.RegionName, | ||
1761 | neighbourRegion.RegionLocX, neighbourRegion.RegionLocY, neighbourRegion.RegionSizeX, neighbourRegion.RegionSizeY, | ||
1762 | newpos.X, newpos.Y); | ||
1544 | 1763 | ||
1545 | return neighbourRegion; | 1764 | return neighbourRegion; |
1546 | } | 1765 | } |
1547 | 1766 | ||
1548 | public bool Cross(ScenePresence agent, bool isFlying) | 1767 | public bool Cross(ScenePresence agent, bool isFlying) |
1549 | { | 1768 | { |
1769 | <<<<<<< HEAD | ||
1770 | ======= | ||
1771 | agent.IsInTransit = true; | ||
1772 | CrossAsyncDelegate d = CrossAsync; | ||
1773 | d.BeginInvoke(agent, isFlying, CrossCompleted, d); | ||
1774 | return true; | ||
1775 | } | ||
1776 | |||
1777 | private void CrossCompleted(IAsyncResult iar) | ||
1778 | { | ||
1779 | CrossAsyncDelegate icon = (CrossAsyncDelegate)iar.AsyncState; | ||
1780 | ScenePresence agent = icon.EndInvoke(iar); | ||
1781 | |||
1782 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); | ||
1783 | |||
1784 | if(!agent.IsChildAgent) | ||
1785 | { | ||
1786 | // crossing failed | ||
1787 | agent.CrossToNewRegionFail(); | ||
1788 | } | ||
1789 | agent.IsInTransit = false; | ||
1790 | } | ||
1791 | |||
1792 | public ScenePresence CrossAsync(ScenePresence agent, bool isFlying) | ||
1793 | { | ||
1794 | uint x; | ||
1795 | uint y; | ||
1796 | >>>>>>> avn/ubitvar | ||
1550 | Vector3 newpos; | 1797 | Vector3 newpos; |
1551 | string version; | 1798 | string version; |
1552 | string failureReason; | 1799 | string failureReason; |
1553 | 1800 | ||
1801 | <<<<<<< HEAD | ||
1554 | GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, agent.AbsolutePosition, | 1802 | GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, agent.AbsolutePosition, |
1555 | out version, out newpos, out failureReason); | 1803 | out version, out newpos, out failureReason); |
1556 | if (neighbourRegion == null) | 1804 | if (neighbourRegion == null) |
1557 | { | 1805 | { |
1558 | agent.ControllingClient.SendAlertMessage(failureReason); | 1806 | agent.ControllingClient.SendAlertMessage(failureReason); |
1559 | return false; | 1807 | return false; |
1560 | } | 1808 | ======= |
1809 | Vector3 pos = agent.AbsolutePosition + agent.Velocity; | ||
1561 | 1810 | ||
1562 | agent.IsInTransit = true; | 1811 | GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, pos, |
1812 | out version, out newpos, out failureReason); | ||
1813 | if (neighbourRegion == null) | ||
1814 | { | ||
1815 | if (failureReason != String.Empty) | ||
1816 | agent.ControllingClient.SendAlertMessage(failureReason); | ||
1817 | return agent; | ||
1818 | >>>>>>> avn/ubitvar | ||
1819 | } | ||
1563 | 1820 | ||
1564 | CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync; | 1821 | // agent.IsInTransit = true; |
1565 | d.BeginInvoke(agent, newpos, neighbourRegion, isFlying, version, CrossAgentToNewRegionCompleted, d); | ||
1566 | 1822 | ||
1823 | <<<<<<< HEAD | ||
1567 | Scene.EventManager.TriggerCrossAgentToNewRegion(agent, isFlying, neighbourRegion); | 1824 | Scene.EventManager.TriggerCrossAgentToNewRegion(agent, isFlying, neighbourRegion); |
1568 | 1825 | ||
1569 | return true; | 1826 | return true; |
1827 | ======= | ||
1828 | CrossAgentToNewRegionAsync(agent, newpos, neighbourRegion, isFlying, version); | ||
1829 | agent.IsInTransit = false; | ||
1830 | return agent; | ||
1831 | >>>>>>> avn/ubitvar | ||
1570 | } | 1832 | } |
1571 | 1833 | ||
1572 | 1834 | ||
@@ -1691,12 +1953,23 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1691 | 1953 | ||
1692 | public bool CrossAgentIntoNewRegionMain(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying) | 1954 | public bool CrossAgentIntoNewRegionMain(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying) |
1693 | { | 1955 | { |
1956 | int ts = Util.EnvironmentTickCount(); | ||
1694 | try | 1957 | try |
1695 | { | 1958 | { |
1696 | AgentData cAgent = new AgentData(); | 1959 | AgentData cAgent = new AgentData(); |
1697 | agent.CopyTo(cAgent); | 1960 | agent.CopyTo(cAgent); |
1961 | <<<<<<< HEAD | ||
1698 | cAgent.Position = pos; | 1962 | cAgent.Position = pos; |
1699 | 1963 | ||
1964 | ======= | ||
1965 | |||
1966 | // agent.Appearance.WearableCacheItems = null; | ||
1967 | |||
1968 | cAgent.Position = pos; | ||
1969 | |||
1970 | cAgent.ChildrenCapSeeds = agent.KnownRegions; | ||
1971 | |||
1972 | >>>>>>> avn/ubitvar | ||
1700 | if (isFlying) | 1973 | if (isFlying) |
1701 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | 1974 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; |
1702 | 1975 | ||
@@ -1716,11 +1989,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1716 | neighbourRegion.RegionName, agent.Name); | 1989 | neighbourRegion.RegionName, agent.Name); |
1717 | 1990 | ||
1718 | ReInstantiateScripts(agent); | 1991 | ReInstantiateScripts(agent); |
1719 | agent.AddToPhysicalScene(isFlying); | 1992 | if(agent.ParentID == 0 && agent.ParentUUID == UUID.Zero) |
1993 | agent.AddToPhysicalScene(isFlying); | ||
1720 | 1994 | ||
1721 | return false; | 1995 | return false; |
1722 | } | 1996 | } |
1723 | 1997 | ||
1998 | m_log.DebugFormat("[CrossAgentIntoNewRegionMain] ok, time {0}ms",Util.EnvironmentTickCountSubtract(ts)); | ||
1999 | |||
1724 | } | 2000 | } |
1725 | catch (Exception e) | 2001 | catch (Exception e) |
1726 | { | 2002 | { |
@@ -1738,7 +2014,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1738 | public void CrossAgentToNewRegionPost(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, | 2014 | public void CrossAgentToNewRegionPost(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, |
1739 | bool isFlying, string version) | 2015 | bool isFlying, string version) |
1740 | { | 2016 | { |
1741 | agent.ControllingClient.RequestClientInfo(); | ||
1742 | 2017 | ||
1743 | string agentcaps; | 2018 | string agentcaps; |
1744 | if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps)) | 2019 | if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps)) |
@@ -1749,6 +2024,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1749 | } | 2024 | } |
1750 | 2025 | ||
1751 | // No turning back | 2026 | // No turning back |
2027 | |||
1752 | agent.IsChildAgent = true; | 2028 | agent.IsChildAgent = true; |
1753 | 2029 | ||
1754 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); | 2030 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); |
@@ -1760,7 +2036,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1760 | if (m_eqModule != null) | 2036 | if (m_eqModule != null) |
1761 | { | 2037 | { |
1762 | m_eqModule.CrossRegion( | 2038 | m_eqModule.CrossRegion( |
1763 | neighbourRegion.RegionHandle, pos + agent.Velocity, vel2 /* agent.Velocity */, | 2039 | neighbourRegion.RegionHandle, pos, vel2 /* agent.Velocity */, |
1764 | neighbourRegion.ExternalEndPoint, | 2040 | neighbourRegion.ExternalEndPoint, |
1765 | capsPath, agent.UUID, agent.ControllingClient.SessionId, | 2041 | capsPath, agent.UUID, agent.ControllingClient.SessionId, |
1766 | neighbourRegion.RegionSizeX, neighbourRegion.RegionSizeY); | 2042 | neighbourRegion.RegionSizeX, neighbourRegion.RegionSizeY); |
@@ -1768,10 +2044,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1768 | else | 2044 | else |
1769 | { | 2045 | { |
1770 | m_log.ErrorFormat("{0} Using old CrossRegion packet. Varregion will not work!!", LogHeader); | 2046 | m_log.ErrorFormat("{0} Using old CrossRegion packet. Varregion will not work!!", LogHeader); |
1771 | agent.ControllingClient.CrossRegion(neighbourRegion.RegionHandle, pos + agent.Velocity, agent.Velocity, neighbourRegion.ExternalEndPoint, | 2047 | agent.ControllingClient.CrossRegion(neighbourRegion.RegionHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, |
1772 | capsPath); | 2048 | capsPath); |
1773 | } | 2049 | } |
1774 | 2050 | ||
2051 | <<<<<<< HEAD | ||
1775 | // SUCCESS! | 2052 | // SUCCESS! |
1776 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); | 2053 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); |
1777 | 2054 | ||
@@ -1788,6 +2065,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1788 | agent.SendOtherAgentsAvatarDataToClient(); | 2065 | agent.SendOtherAgentsAvatarDataToClient(); |
1789 | agent.SendOtherAgentsAppearanceToClient(); | 2066 | agent.SendOtherAgentsAppearanceToClient(); |
1790 | 2067 | ||
2068 | ======= | ||
2069 | >>>>>>> avn/ubitvar | ||
1791 | // Backwards compatibility. Best effort | 2070 | // Backwards compatibility. Best effort |
1792 | if (version == "Unknown" || version == string.Empty) | 2071 | if (version == "Unknown" || version == string.Empty) |
1793 | { | 2072 | { |
@@ -1796,14 +2075,31 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1796 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); | 2075 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); |
1797 | } | 2076 | } |
1798 | 2077 | ||
2078 | <<<<<<< HEAD | ||
1799 | // Next, let's close the child agent connections that are too far away. | 2079 | // Next, let's close the child agent connections that are too far away. |
1800 | uint neighbourx; | 2080 | uint neighbourx; |
1801 | uint neighboury; | 2081 | uint neighboury; |
1802 | Util.RegionHandleToRegionLoc(neighbourRegion.RegionHandle, out neighbourx, out neighboury); | 2082 | Util.RegionHandleToRegionLoc(neighbourRegion.RegionHandle, out neighbourx, out neighboury); |
2083 | ======= | ||
2084 | // SUCCESS! | ||
2085 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); | ||
2086 | |||
2087 | // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. | ||
2088 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); | ||
1803 | 2089 | ||
1804 | agent.CloseChildAgents(neighbourx, neighboury); | 2090 | // this may need the attachments |
2091 | |||
2092 | agent.HasMovedAway(true); | ||
2093 | |||
2094 | agent.MakeChildAgent(neighbourRegion.RegionHandle); | ||
2095 | |||
2096 | // FIXME: Possibly this should occur lower down after other commands to close other agents, | ||
2097 | // but not sure yet what the side effects would be. | ||
2098 | m_entityTransferStateMachine.ResetFromTransit(agent.UUID); | ||
2099 | >>>>>>> avn/ubitvar | ||
2100 | |||
2101 | agent.CloseChildAgents(neighbourRegion.RegionHandle, neighbourRegion.RegionSizeX, neighbourRegion.RegionSizeY); | ||
1805 | 2102 | ||
1806 | AgentHasMovedAway(agent, false); | ||
1807 | 2103 | ||
1808 | // the user may change their profile information in other region, | 2104 | // the user may change their profile information in other region, |
1809 | // so the userinfo in UserProfileCache is not reliable any more, delete it | 2105 | // so the userinfo in UserProfileCache is not reliable any more, delete it |
@@ -1843,7 +2139,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1843 | #region Enable Child Agent | 2139 | #region Enable Child Agent |
1844 | 2140 | ||
1845 | /// <summary> | 2141 | /// <summary> |
1846 | /// This informs a single neighbouring region about agent "avatar". | 2142 | /// This informs a single neighbouring region about agent "avatar", and avatar about it |
1847 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. | 2143 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. |
1848 | /// </summary> | 2144 | /// </summary> |
1849 | /// <param name="sp"></param> | 2145 | /// <param name="sp"></param> |
@@ -1852,22 +2148,36 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1852 | { | 2148 | { |
1853 | m_log.DebugFormat("[ENTITY TRANSFER]: Enabling child agent in new neighbour {0}", region.RegionName); | 2149 | m_log.DebugFormat("[ENTITY TRANSFER]: Enabling child agent in new neighbour {0}", region.RegionName); |
1854 | 2150 | ||
2151 | ulong currentRegionHandler = sp.Scene.RegionInfo.RegionHandle; | ||
2152 | ulong regionhandler = region.RegionHandle; | ||
2153 | |||
2154 | Dictionary<ulong, string> seeds = new Dictionary<ulong, string>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID)); | ||
2155 | |||
2156 | if (seeds.ContainsKey(regionhandler)) | ||
2157 | seeds.Remove(regionhandler); | ||
2158 | /* | ||
2159 | List<ulong> oldregions = new List<ulong>(seeds.Keys); | ||
2160 | |||
2161 | if (oldregions.Contains(currentRegionHandler)) | ||
2162 | oldregions.Remove(currentRegionHandler); | ||
2163 | */ | ||
2164 | if (!seeds.ContainsKey(currentRegionHandler)) | ||
2165 | seeds.Add(currentRegionHandler, sp.ControllingClient.RequestClientInfo().CapsPath); | ||
2166 | |||
1855 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | 2167 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); |
1856 | AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); | 2168 | AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); |
1857 | agent.BaseFolder = UUID.Zero; | 2169 | agent.BaseFolder = UUID.Zero; |
1858 | agent.InventoryFolder = UUID.Zero; | 2170 | agent.InventoryFolder = UUID.Zero; |
1859 | agent.startpos = new Vector3(128, 128, 70); | 2171 | agent.startpos = sp.AbsolutePosition + CalculateOffset(sp, region); |
1860 | agent.child = true; | 2172 | agent.child = true; |
1861 | agent.Appearance = sp.Appearance; | 2173 | agent.Appearance = new AvatarAppearance(); |
1862 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | 2174 | agent.Appearance.AvatarHeight = sp.Appearance.AvatarHeight; |
1863 | 2175 | ||
1864 | agent.ChildrenCapSeeds = new Dictionary<ulong, string>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID)); | 2176 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); |
1865 | //m_log.DebugFormat("[XXX] Seeds 1 {0}", agent.ChildrenCapSeeds.Count); | ||
1866 | 2177 | ||
1867 | if (!agent.ChildrenCapSeeds.ContainsKey(sp.Scene.RegionInfo.RegionHandle)) | 2178 | seeds.Add(regionhandler, agent.CapsPath); |
1868 | agent.ChildrenCapSeeds.Add(sp.Scene.RegionInfo.RegionHandle, sp.ControllingClient.RequestClientInfo().CapsPath); | ||
1869 | //m_log.DebugFormat("[XXX] Seeds 2 {0}", agent.ChildrenCapSeeds.Count); | ||
1870 | 2179 | ||
2180 | <<<<<<< HEAD | ||
1871 | sp.AddNeighbourRegion(region.RegionHandle, agent.CapsPath); | 2181 | sp.AddNeighbourRegion(region.RegionHandle, agent.CapsPath); |
1872 | //foreach (ulong h in agent.ChildrenCapSeeds.Keys) | 2182 | //foreach (ulong h in agent.ChildrenCapSeeds.Keys) |
1873 | // m_log.DebugFormat("[XXX] --> {0}", h); | 2183 | // m_log.DebugFormat("[XXX] --> {0}", h); |
@@ -1881,12 +2191,19 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1881 | } | 2191 | } |
1882 | 2192 | ||
1883 | agent.ChildrenCapSeeds[region.RegionHandle] = agent.CapsPath; | 2193 | agent.ChildrenCapSeeds[region.RegionHandle] = agent.CapsPath; |
2194 | ======= | ||
2195 | // agent.ChildrenCapSeeds = new Dictionary<ulong, string>(seeds); | ||
2196 | agent.ChildrenCapSeeds = null; | ||
2197 | >>>>>>> avn/ubitvar | ||
1884 | 2198 | ||
1885 | if (sp.Scene.CapsModule != null) | 2199 | if (sp.Scene.CapsModule != null) |
1886 | { | 2200 | { |
1887 | sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, agent.ChildrenCapSeeds); | 2201 | sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, seeds); |
1888 | } | 2202 | } |
1889 | 2203 | ||
2204 | sp.KnownRegions = seeds; | ||
2205 | sp.AddNeighbourRegionSizeInfo(region); | ||
2206 | |||
1890 | if (currentAgentCircuit != null) | 2207 | if (currentAgentCircuit != null) |
1891 | { | 2208 | { |
1892 | agent.ServiceURLs = currentAgentCircuit.ServiceURLs; | 2209 | agent.ServiceURLs = currentAgentCircuit.ServiceURLs; |
@@ -1896,7 +2213,24 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1896 | agent.Mac = currentAgentCircuit.Mac; | 2213 | agent.Mac = currentAgentCircuit.Mac; |
1897 | agent.Id0 = currentAgentCircuit.Id0; | 2214 | agent.Id0 = currentAgentCircuit.Id0; |
1898 | } | 2215 | } |
1899 | 2216 | /* | |
2217 | AgentPosition agentpos = null; | ||
2218 | |||
2219 | if (oldregions.Count > 0) | ||
2220 | { | ||
2221 | agentpos = new AgentPosition(); | ||
2222 | agentpos.AgentID = new UUID(sp.UUID.Guid); | ||
2223 | agentpos.SessionID = sp.ControllingClient.SessionId; | ||
2224 | agentpos.Size = sp.Appearance.AvatarSize; | ||
2225 | agentpos.Center = sp.CameraPosition; | ||
2226 | agentpos.Far = sp.DrawDistance; | ||
2227 | agentpos.Position = sp.AbsolutePosition; | ||
2228 | agentpos.Velocity = sp.Velocity; | ||
2229 | agentpos.RegionHandle = currentRegionHandler; | ||
2230 | agentpos.Throttles = sp.ControllingClient.GetThrottlesPacked(1); | ||
2231 | agentpos.ChildrenCapSeeds = seeds; | ||
2232 | } | ||
2233 | */ | ||
1900 | IPEndPoint external = region.ExternalEndPoint; | 2234 | IPEndPoint external = region.ExternalEndPoint; |
1901 | if (external != null) | 2235 | if (external != null) |
1902 | { | 2236 | { |
@@ -1905,7 +2239,23 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1905 | InformClientOfNeighbourCompleted, | 2239 | InformClientOfNeighbourCompleted, |
1906 | d); | 2240 | d); |
1907 | } | 2241 | } |
2242 | /* | ||
2243 | if(oldregions.Count >0) | ||
2244 | { | ||
2245 | uint neighbourx; | ||
2246 | uint neighboury; | ||
2247 | UUID scope = sp.Scene.RegionInfo.ScopeID; | ||
2248 | foreach (ulong handler in oldregions) | ||
2249 | { | ||
2250 | // crap code | ||
2251 | Utils.LongToUInts(handler, out neighbourx, out neighboury); | ||
2252 | GridRegion neighbour = sp.Scene.GridService.GetRegionByPosition(scope, (int)neighbourx, (int)neighboury); | ||
2253 | sp.Scene.SimulationService.UpdateAgent(neighbour, agentpos); | ||
2254 | } | ||
2255 | } | ||
2256 | */ | ||
1908 | } | 2257 | } |
2258 | |||
1909 | #endregion | 2259 | #endregion |
1910 | 2260 | ||
1911 | #region Enable Child Agents | 2261 | #region Enable Child Agents |
@@ -1915,146 +2265,157 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1915 | 2265 | ||
1916 | /// <summary> | 2266 | /// <summary> |
1917 | /// This informs all neighbouring regions about agent "avatar". | 2267 | /// This informs all neighbouring regions about agent "avatar". |
2268 | /// and as important informs the avatar about then | ||
1918 | /// </summary> | 2269 | /// </summary> |
1919 | /// <param name="sp"></param> | 2270 | /// <param name="sp"></param> |
1920 | public void EnableChildAgents(ScenePresence sp) | 2271 | public void EnableChildAgents(ScenePresence sp) |
1921 | { | 2272 | { |
2273 | // assumes that out of view range regions are disconnected by the previus region | ||
2274 | |||
1922 | List<GridRegion> neighbours = new List<GridRegion>(); | 2275 | List<GridRegion> neighbours = new List<GridRegion>(); |
1923 | RegionInfo m_regionInfo = sp.Scene.RegionInfo; | 2276 | Scene spScene = sp.Scene; |
2277 | RegionInfo m_regionInfo = spScene.RegionInfo; | ||
1924 | 2278 | ||
1925 | if (m_regionInfo != null) | 2279 | if (m_regionInfo != null) |
1926 | { | 2280 | { |
2281 | <<<<<<< HEAD | ||
1927 | neighbours = GetNeighbours(sp, m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); | 2282 | neighbours = GetNeighbours(sp, m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); |
2283 | ======= | ||
2284 | neighbours = GetNeighbors(sp, m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); | ||
2285 | >>>>>>> avn/ubitvar | ||
1928 | } | 2286 | } |
1929 | else | 2287 | else |
1930 | { | 2288 | { |
1931 | m_log.Debug("[ENTITY TRANSFER MODULE]: m_regionInfo was null in EnableChildAgents, is this a NPC?"); | 2289 | m_log.Debug("[ENTITY TRANSFER MODULE]: m_regionInfo was null in EnableChildAgents, is this a NPC?"); |
1932 | } | 2290 | } |
1933 | 2291 | ||
1934 | /// We need to find the difference between the new regions where there are no child agents | 2292 | ulong currentRegionHandler = m_regionInfo.RegionHandle; |
1935 | /// and the regions where there are already child agents. We only send notification to the former. | ||
1936 | List<ulong> neighbourHandles = NeighbourHandles(neighbours); // on this region | ||
1937 | neighbourHandles.Add(sp.Scene.RegionInfo.RegionHandle); // add this region too | ||
1938 | List<ulong> previousRegionNeighbourHandles; | ||
1939 | 2293 | ||
1940 | if (sp.Scene.CapsModule != null) | 2294 | LinkedList<ulong> previousRegionNeighbourHandles; |
2295 | Dictionary<ulong, string> seeds; | ||
2296 | ICapabilitiesModule capsModule = spScene.CapsModule; | ||
2297 | |||
2298 | if (capsModule != null) | ||
1941 | { | 2299 | { |
1942 | previousRegionNeighbourHandles = | 2300 | seeds = new Dictionary<ulong, string>(capsModule.GetChildrenSeeds(sp.UUID)); |
1943 | new List<ulong>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID).Keys); | 2301 | previousRegionNeighbourHandles = new LinkedList<ulong>(seeds.Keys); |
1944 | } | 2302 | } |
1945 | else | 2303 | else |
1946 | { | 2304 | { |
1947 | previousRegionNeighbourHandles = new List<ulong>(); | 2305 | seeds = new Dictionary<ulong, string>(); |
2306 | previousRegionNeighbourHandles = new LinkedList<ulong>(); | ||
1948 | } | 2307 | } |
1949 | 2308 | ||
1950 | List<ulong> newRegions = NewNeighbours(neighbourHandles, previousRegionNeighbourHandles); | 2309 | IClientAPI spClient = sp.ControllingClient; |
1951 | List<ulong> oldRegions = OldNeighbours(neighbourHandles, previousRegionNeighbourHandles); | ||
1952 | |||
1953 | // Dump("Current Neighbors", neighbourHandles); | ||
1954 | // Dump("Previous Neighbours", previousRegionNeighbourHandles); | ||
1955 | // Dump("New Neighbours", newRegions); | ||
1956 | // Dump("Old Neighbours", oldRegions); | ||
1957 | 2310 | ||
1958 | /// Update the scene presence's known regions here on this region | 2311 | if (!seeds.ContainsKey(currentRegionHandler)) |
1959 | sp.DropOldNeighbours(oldRegions); | 2312 | seeds.Add(currentRegionHandler, spClient.RequestClientInfo().CapsPath); |
1960 | 2313 | ||
1961 | /// Collect as many seeds as possible | 2314 | AgentCircuitData currentAgentCircuit = |
1962 | Dictionary<ulong, string> seeds; | 2315 | spScene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); |
1963 | if (sp.Scene.CapsModule != null) | ||
1964 | seeds = new Dictionary<ulong, string>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID)); | ||
1965 | else | ||
1966 | seeds = new Dictionary<ulong, string>(); | ||
1967 | 2316 | ||
1968 | //m_log.Debug(" !!! No. of seeds: " + seeds.Count); | ||
1969 | if (!seeds.ContainsKey(sp.Scene.RegionInfo.RegionHandle)) | ||
1970 | seeds.Add(sp.Scene.RegionInfo.RegionHandle, sp.ControllingClient.RequestClientInfo().CapsPath); | ||
1971 | |||
1972 | /// Create the necessary child agents | ||
1973 | List<AgentCircuitData> cagents = new List<AgentCircuitData>(); | 2317 | List<AgentCircuitData> cagents = new List<AgentCircuitData>(); |
2318 | List<ulong> newneighbours = new List<ulong>(); | ||
2319 | |||
1974 | foreach (GridRegion neighbour in neighbours) | 2320 | foreach (GridRegion neighbour in neighbours) |
1975 | { | 2321 | { |
1976 | if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) | 2322 | ulong handler = neighbour.RegionHandle; |
2323 | |||
2324 | if (previousRegionNeighbourHandles.Contains(handler)) | ||
1977 | { | 2325 | { |
1978 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | 2326 | // agent already knows this region |
1979 | AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); | 2327 | previousRegionNeighbourHandles.Remove(handler); |
1980 | agent.BaseFolder = UUID.Zero; | 2328 | continue; |
1981 | agent.InventoryFolder = UUID.Zero; | 2329 | } |
1982 | agent.startpos = sp.AbsolutePosition + CalculateOffset(sp, neighbour); | ||
1983 | agent.child = true; | ||
1984 | agent.Appearance = sp.Appearance; | ||
1985 | if (currentAgentCircuit != null) | ||
1986 | { | ||
1987 | agent.ServiceURLs = currentAgentCircuit.ServiceURLs; | ||
1988 | agent.IPAddress = currentAgentCircuit.IPAddress; | ||
1989 | agent.Viewer = currentAgentCircuit.Viewer; | ||
1990 | agent.Channel = currentAgentCircuit.Channel; | ||
1991 | agent.Mac = currentAgentCircuit.Mac; | ||
1992 | agent.Id0 = currentAgentCircuit.Id0; | ||
1993 | } | ||
1994 | 2330 | ||
1995 | if (newRegions.Contains(neighbour.RegionHandle)) | 2331 | if (handler == currentRegionHandler) |
1996 | { | 2332 | continue; |
1997 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
1998 | sp.AddNeighbourRegion(neighbour.RegionHandle, agent.CapsPath); | ||
1999 | seeds.Add(neighbour.RegionHandle, agent.CapsPath); | ||
2000 | } | ||
2001 | else | ||
2002 | { | ||
2003 | agent.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, neighbour.RegionHandle); | ||
2004 | } | ||
2005 | 2333 | ||
2006 | cagents.Add(agent); | 2334 | // a new region to add |
2335 | AgentCircuitData agent = spClient.RequestClientInfo(); | ||
2336 | agent.BaseFolder = UUID.Zero; | ||
2337 | agent.InventoryFolder = UUID.Zero; | ||
2338 | agent.startpos = sp.AbsolutePosition + CalculateOffset(sp, neighbour); | ||
2339 | agent.child = true; | ||
2340 | agent.Appearance = new AvatarAppearance(); | ||
2341 | agent.Appearance.AvatarHeight = sp.Appearance.AvatarHeight; | ||
2342 | |||
2343 | if (currentAgentCircuit != null) | ||
2344 | { | ||
2345 | agent.ServiceURLs = currentAgentCircuit.ServiceURLs; | ||
2346 | agent.IPAddress = currentAgentCircuit.IPAddress; | ||
2347 | agent.Viewer = currentAgentCircuit.Viewer; | ||
2348 | agent.Channel = currentAgentCircuit.Channel; | ||
2349 | agent.Mac = currentAgentCircuit.Mac; | ||
2350 | agent.Id0 = currentAgentCircuit.Id0; | ||
2007 | } | 2351 | } |
2008 | } | ||
2009 | 2352 | ||
2010 | /// Update all child agent with everyone's seeds | 2353 | newneighbours.Add(handler); |
2011 | foreach (AgentCircuitData a in cagents) | 2354 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); |
2012 | { | 2355 | seeds.Add(handler, agent.CapsPath); |
2013 | a.ChildrenCapSeeds = new Dictionary<ulong, string>(seeds); | ||
2014 | } | ||
2015 | 2356 | ||
2016 | if (sp.Scene.CapsModule != null) | 2357 | agent.ChildrenCapSeeds = null; |
2017 | { | 2358 | cagents.Add(agent); |
2018 | sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, seeds); | ||
2019 | } | 2359 | } |
2020 | sp.KnownRegions = seeds; | ||
2021 | //avatar.Scene.DumpChildrenSeeds(avatar.UUID); | ||
2022 | //avatar.DumpKnownRegions(); | ||
2023 | 2360 | ||
2024 | bool newAgent = false; | 2361 | if (previousRegionNeighbourHandles.Contains(currentRegionHandler)) |
2025 | int count = 0; | 2362 | previousRegionNeighbourHandles.Remove(currentRegionHandler); |
2026 | foreach (GridRegion neighbour in neighbours) | 2363 | |
2027 | { | 2364 | // previousRegionNeighbourHandles now contains regions to forget |
2028 | //m_log.WarnFormat("--> Going to send child agent to {0}", neighbour.RegionName); | 2365 | foreach (ulong handler in previousRegionNeighbourHandles) |
2029 | // Don't do it if there's already an agent in that region | 2366 | seeds.Remove(handler); |
2030 | if (newRegions.Contains(neighbour.RegionHandle)) | 2367 | |
2031 | newAgent = true; | 2368 | /// Update all child agent with everyone's seeds |
2032 | else | 2369 | // foreach (AgentCircuitData a in cagents) |
2033 | newAgent = false; | 2370 | // a.ChildrenCapSeeds = new Dictionary<ulong, string>(seeds); |
2034 | // continue; | 2371 | |
2372 | if (capsModule != null) | ||
2373 | capsModule.SetChildrenSeed(sp.UUID, seeds); | ||
2035 | 2374 | ||
2036 | if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) | 2375 | sp.KnownRegions = seeds; |
2376 | sp.SetNeighbourRegionSizeInfo(neighbours); | ||
2377 | |||
2378 | AgentPosition agentpos = new AgentPosition(); | ||
2379 | agentpos.AgentID = new UUID(sp.UUID.Guid); | ||
2380 | agentpos.SessionID = spClient.SessionId; | ||
2381 | agentpos.Size = sp.Appearance.AvatarSize; | ||
2382 | agentpos.Center = sp.CameraPosition; | ||
2383 | agentpos.Far = sp.DrawDistance; | ||
2384 | agentpos.Position = sp.AbsolutePosition; | ||
2385 | agentpos.Velocity = sp.Velocity; | ||
2386 | agentpos.RegionHandle = currentRegionHandler; | ||
2387 | agentpos.Throttles = spClient.GetThrottlesPacked(1); | ||
2388 | // agentpos.ChildrenCapSeeds = seeds; | ||
2389 | |||
2390 | Util.FireAndForget(delegate | ||
2391 | { | ||
2392 | Thread.Sleep(200); // the original delay that was at InformClientOfNeighbourAsync start | ||
2393 | int count = 0; | ||
2394 | |||
2395 | foreach (GridRegion neighbour in neighbours) | ||
2037 | { | 2396 | { |
2397 | ulong handler = neighbour.RegionHandle; | ||
2038 | try | 2398 | try |
2039 | { | 2399 | { |
2040 | // Let's put this back at sync, so that it doesn't clog | 2400 | if (newneighbours.Contains(handler)) |
2041 | // the network, especially for regions in the same physical server. | 2401 | { |
2042 | // We're really not in a hurry here. | 2402 | InformClientOfNeighbourAsync(sp, cagents[count], neighbour, |
2043 | InformClientOfNeighbourAsync(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent); | 2403 | neighbour.ExternalEndPoint, true); |
2044 | //InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; | 2404 | count++; |
2045 | //d.BeginInvoke(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent, | 2405 | } |
2046 | // InformClientOfNeighbourCompleted, | 2406 | else if (!previousRegionNeighbourHandles.Contains(handler)) |
2047 | // d); | 2407 | { |
2408 | spScene.SimulationService.UpdateAgent(neighbour, agentpos); | ||
2409 | } | ||
2048 | } | 2410 | } |
2049 | |||
2050 | catch (ArgumentOutOfRangeException) | 2411 | catch (ArgumentOutOfRangeException) |
2051 | { | 2412 | { |
2052 | m_log.ErrorFormat( | 2413 | m_log.ErrorFormat( |
2053 | "[ENTITY TRANSFER MODULE]: Neighbour Regions response included the current region in the neighbour list. The following region will not display to the client: {0} for region {1} ({2}, {3}).", | 2414 | "[ENTITY TRANSFER MODULE]: Neighbour Regions response included the current region in the neighbour list. The following region will not display to the client: {0} for region {1} ({2}, {3}).", |
2054 | neighbour.ExternalHostName, | 2415 | neighbour.ExternalHostName, |
2055 | neighbour.RegionHandle, | 2416 | neighbour.RegionHandle, |
2056 | neighbour.RegionLocX, | 2417 | neighbour.RegionLocX, |
2057 | neighbour.RegionLocY); | 2418 | neighbour.RegionLocY); |
2058 | } | 2419 | } |
2059 | catch (Exception e) | 2420 | catch (Exception e) |
2060 | { | 2421 | { |
@@ -2071,13 +2432,106 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2071 | 2432 | ||
2072 | // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes. | 2433 | // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes. |
2073 | // throw e; | 2434 | // throw e; |
2435 | } | ||
2436 | } | ||
2437 | }); | ||
2438 | } | ||
2439 | |||
2440 | // Computes the difference between two region bases. | ||
2441 | // Returns a vector of world coordinates (meters) from base of first region to the second. | ||
2442 | // The first region is the home region of the passed scene presence. | ||
2443 | Vector3 CalculateOffset(ScenePresence sp, GridRegion neighbour) | ||
2444 | { | ||
2445 | return new Vector3(sp.Scene.RegionInfo.WorldLocX - neighbour.RegionLocX, | ||
2446 | sp.Scene.RegionInfo.WorldLocY - neighbour.RegionLocY, | ||
2447 | 0f); | ||
2448 | } | ||
2449 | |||
2074 | 2450 | ||
2451 | #region NotFoundLocationCache class | ||
2452 | // A collection of not found locations to make future lookups 'not found' lookups quick. | ||
2453 | // A simple expiring cache that keeps not found locations for some number of seconds. | ||
2454 | // A 'not found' location is presumed to be anywhere in the minimum sized region that | ||
2455 | // contains that point. A conservitive estimate. | ||
2456 | private class NotFoundLocationCache | ||
2457 | { | ||
2458 | private struct NotFoundLocation | ||
2459 | { | ||
2460 | public double minX, maxX, minY, maxY; | ||
2461 | public DateTime expireTime; | ||
2462 | } | ||
2463 | private List<NotFoundLocation> m_notFoundLocations = new List<NotFoundLocation>(); | ||
2464 | public NotFoundLocationCache() | ||
2465 | { | ||
2466 | } | ||
2467 | // Add an area to the list of 'not found' places. The area is the snapped region | ||
2468 | // area around the added point. | ||
2469 | public void Add(double pX, double pY) | ||
2470 | { | ||
2471 | lock (m_notFoundLocations) | ||
2472 | { | ||
2473 | if (!LockedContains(pX, pY)) | ||
2474 | { | ||
2475 | NotFoundLocation nfl = new NotFoundLocation(); | ||
2476 | // A not found location is not found for at least a whole region sized area | ||
2477 | nfl.minX = pX - (pX % (double)Constants.RegionSize); | ||
2478 | nfl.minY = pY - (pY % (double)Constants.RegionSize); | ||
2479 | nfl.maxX = nfl.minX + (double)Constants.RegionSize; | ||
2480 | nfl.maxY = nfl.minY + (double)Constants.RegionSize; | ||
2481 | nfl.expireTime = DateTime.Now + TimeSpan.FromSeconds(30); | ||
2482 | m_notFoundLocations.Add(nfl); | ||
2483 | } | ||
2484 | } | ||
2485 | |||
2486 | } | ||
2487 | // Test to see of this point is in any of the 'not found' areas. | ||
2488 | // Return 'true' if the point is found inside the 'not found' areas. | ||
2489 | public bool Contains(double pX, double pY) | ||
2490 | { | ||
2491 | bool ret = false; | ||
2492 | lock (m_notFoundLocations) | ||
2493 | ret = LockedContains(pX, pY); | ||
2494 | return ret; | ||
2495 | } | ||
2496 | private bool LockedContains(double pX, double pY) | ||
2497 | { | ||
2498 | bool ret = false; | ||
2499 | this.DoExpiration(); | ||
2500 | foreach (NotFoundLocation nfl in m_notFoundLocations) | ||
2501 | { | ||
2502 | if (pX >= nfl.minX && pX < nfl.maxX && pY >= nfl.minY && pY < nfl.maxY) | ||
2503 | { | ||
2504 | ret = true; | ||
2505 | break; | ||
2075 | } | 2506 | } |
2076 | } | 2507 | } |
2077 | count++; | 2508 | return ret; |
2509 | } | ||
2510 | private void DoExpiration() | ||
2511 | { | ||
2512 | List<NotFoundLocation> m_toRemove = null; | ||
2513 | DateTime now = DateTime.Now; | ||
2514 | foreach (NotFoundLocation nfl in m_notFoundLocations) | ||
2515 | { | ||
2516 | if (nfl.expireTime < now) | ||
2517 | { | ||
2518 | if (m_toRemove == null) | ||
2519 | m_toRemove = new List<NotFoundLocation>(); | ||
2520 | m_toRemove.Add(nfl); | ||
2521 | } | ||
2522 | } | ||
2523 | if (m_toRemove != null) | ||
2524 | { | ||
2525 | foreach (NotFoundLocation nfl in m_toRemove) | ||
2526 | m_notFoundLocations.Remove(nfl); | ||
2527 | m_toRemove.Clear(); | ||
2528 | } | ||
2078 | } | 2529 | } |
2079 | } | 2530 | } |
2531 | #endregion // NotFoundLocationCache class | ||
2532 | private NotFoundLocationCache m_notFoundLocationCache = new NotFoundLocationCache(); | ||
2080 | 2533 | ||
2534 | <<<<<<< HEAD | ||
2081 | // Computes the difference between two region bases. | 2535 | // Computes the difference between two region bases. |
2082 | // Returns a vector of world coordinates (meters) from base of first region to the second. | 2536 | // Returns a vector of world coordinates (meters) from base of first region to the second. |
2083 | // The first region is the home region of the passed scene presence. | 2537 | // The first region is the home region of the passed scene presence. |
@@ -2197,6 +2651,27 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2197 | double px, double py, uint pSizeHint) | 2651 | double px, double py, uint pSizeHint) |
2198 | { | 2652 | { |
2199 | m_log.DebugFormat("{0} GetRegionContainingWorldLocation: query, loc=<{1},{2}>", LogHeader, px, py); | 2653 | m_log.DebugFormat("{0} GetRegionContainingWorldLocation: query, loc=<{1},{2}>", LogHeader, px, py); |
2654 | ======= | ||
2655 | // needed for current OSG or old grid code | ||
2656 | |||
2657 | public GridRegion GetRegionContainingWorldLocation(IGridService pGridService, UUID pScopeID, double px, double py) | ||
2658 | { | ||
2659 | // Since we don't know how big the regions could be, we have to search a very large area | ||
2660 | // to find possible regions. | ||
2661 | return GetRegionContainingWorldLocation(pGridService, pScopeID, px, py, Constants.MaximumRegionSize); | ||
2662 | } | ||
2663 | |||
2664 | // Given a world position, get the GridRegion info for | ||
2665 | // the region containing that point. | ||
2666 | // Someday this should be a method on GridService. | ||
2667 | // 'pSizeHint' is the size of the source region but since the destination point can be anywhere | ||
2668 | // the size of the target region is unknown thus the search area might have to be very large. | ||
2669 | // Return 'null' if no such region exists. | ||
2670 | public GridRegion GetRegionContainingWorldLocation(IGridService pGridService, UUID pScopeID, | ||
2671 | double px, double py, uint pSizeHint) | ||
2672 | { | ||
2673 | m_log.DebugFormat("{0} GetRegionContainingWorldLocation: call, XY=<{1},{2}>", LogHeader, px, py); | ||
2674 | >>>>>>> avn/ubitvar | ||
2200 | GridRegion ret = null; | 2675 | GridRegion ret = null; |
2201 | const double fudge = 2.0; | 2676 | const double fudge = 2.0; |
2202 | 2677 | ||
@@ -2289,55 +2764,71 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2289 | private void InformClientOfNeighbourAsync(ScenePresence sp, AgentCircuitData a, GridRegion reg, | 2764 | private void InformClientOfNeighbourAsync(ScenePresence sp, AgentCircuitData a, GridRegion reg, |
2290 | IPEndPoint endPoint, bool newAgent) | 2765 | IPEndPoint endPoint, bool newAgent) |
2291 | { | 2766 | { |
2292 | // Let's wait just a little to give time to originating regions to catch up with closing child agents | ||
2293 | // after a cross here | ||
2294 | Thread.Sleep(500); | ||
2295 | 2767 | ||
2768 | <<<<<<< HEAD | ||
2296 | Scene scene = sp.Scene; | 2769 | Scene scene = sp.Scene; |
2297 | 2770 | ||
2298 | m_log.DebugFormat( | 2771 | m_log.DebugFormat( |
2299 | "[ENTITY TRANSFER MODULE]: Informing {0} {1} about neighbour {2} {3} at ({4},{5})", | 2772 | "[ENTITY TRANSFER MODULE]: Informing {0} {1} about neighbour {2} {3} at ({4},{5})", |
2300 | sp.Name, sp.UUID, reg.RegionName, endPoint, reg.RegionCoordX, reg.RegionCoordY); | 2773 | sp.Name, sp.UUID, reg.RegionName, endPoint, reg.RegionCoordX, reg.RegionCoordY); |
2774 | ======= | ||
2775 | if (newAgent) | ||
2776 | { | ||
2777 | Scene scene = sp.Scene; | ||
2778 | |||
2779 | m_log.DebugFormat( | ||
2780 | "[ENTITY TRANSFER MODULE]: Informing {0} {1} about neighbour {2} {3} at ({4},{5})", | ||
2781 | sp.Name, sp.UUID, reg.RegionName, endPoint, reg.RegionCoordX, reg.RegionCoordY); | ||
2782 | >>>>>>> avn/ubitvar | ||
2301 | 2783 | ||
2302 | string capsPath = reg.ServerURI + CapsUtil.GetCapsSeedPath(a.CapsPath); | 2784 | string capsPath = reg.ServerURI + CapsUtil.GetCapsSeedPath(a.CapsPath); |
2303 | 2785 | ||
2304 | string reason = String.Empty; | 2786 | string reason = String.Empty; |
2305 | 2787 | ||
2788 | <<<<<<< HEAD | ||
2306 | bool regionAccepted = scene.SimulationService.CreateAgent(null, reg, a, (uint)TeleportFlags.Default, out reason); | 2789 | bool regionAccepted = scene.SimulationService.CreateAgent(null, reg, a, (uint)TeleportFlags.Default, out reason); |
2790 | ======= | ||
2791 | bool regionAccepted = scene.SimulationService.CreateAgent(reg, a, (uint)TeleportFlags.Default, out reason); | ||
2792 | >>>>>>> avn/ubitvar | ||
2307 | 2793 | ||
2308 | if (regionAccepted && newAgent) | 2794 | if (regionAccepted) |
2309 | { | ||
2310 | if (m_eqModule != null) | ||
2311 | { | 2795 | { |
2312 | #region IP Translation for NAT | 2796 | // give time for createAgent to finish, since it is async and does grid services access |
2313 | IClientIPEndpoint ipepClient; | 2797 | Thread.Sleep(500); |
2314 | if (sp.ClientView.TryGet(out ipepClient)) | 2798 | |
2799 | if (m_eqModule != null) | ||
2315 | { | 2800 | { |
2316 | endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); | 2801 | #region IP Translation for NAT |
2317 | } | 2802 | IClientIPEndpoint ipepClient; |
2318 | #endregion | 2803 | if (sp.ClientView.TryGet(out ipepClient)) |
2804 | { | ||
2805 | endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); | ||
2806 | } | ||
2807 | #endregion | ||
2319 | 2808 | ||
2320 | m_log.DebugFormat("{0} {1} is sending {2} EnableSimulator for neighbour region {3}(loc=<{4},{5}>,siz=<{6},{7}>) " + | 2809 | m_log.DebugFormat("{0} {1} is sending {2} EnableSimulator for neighbour region {3}(loc=<{4},{5}>,siz=<{6},{7}>) " + |
2321 | "and EstablishAgentCommunication with seed cap {8}", LogHeader, | 2810 | "and EstablishAgentCommunication with seed cap {8}", LogHeader, |
2322 | scene.RegionInfo.RegionName, sp.Name, | 2811 | scene.RegionInfo.RegionName, sp.Name, |
2323 | reg.RegionName, reg.RegionLocX, reg.RegionLocY, reg.RegionSizeX, reg.RegionSizeY , capsPath); | 2812 | reg.RegionName, reg.RegionLocX, reg.RegionLocY, reg.RegionSizeX, reg.RegionSizeY, capsPath); |
2324 | 2813 | ||
2325 | m_eqModule.EnableSimulator(reg.RegionHandle, endPoint, sp.UUID, reg.RegionSizeX, reg.RegionSizeY); | 2814 | m_eqModule.EnableSimulator(reg.RegionHandle, endPoint, sp.UUID, reg.RegionSizeX, reg.RegionSizeY); |
2326 | m_eqModule.EstablishAgentCommunication(sp.UUID, endPoint, capsPath, reg.RegionHandle, reg.RegionSizeX, reg.RegionSizeY); | 2815 | m_eqModule.EstablishAgentCommunication(sp.UUID, endPoint, capsPath, reg.RegionHandle, reg.RegionSizeX, reg.RegionSizeY); |
2327 | } | 2816 | } |
2328 | else | 2817 | else |
2329 | { | 2818 | { |
2330 | sp.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, endPoint); | 2819 | sp.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, endPoint); |
2331 | // TODO: make Event Queue disablable! | 2820 | // TODO: make Event Queue disablable! |
2821 | } | ||
2822 | |||
2823 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Completed inform {0} {1} about neighbour {2}", sp.Name, sp.UUID, endPoint); | ||
2332 | } | 2824 | } |
2333 | 2825 | ||
2334 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Completed inform {0} {1} about neighbour {2}", sp.Name, sp.UUID, endPoint); | 2826 | if (!regionAccepted) |
2827 | m_log.WarnFormat( | ||
2828 | "[ENTITY TRANSFER MODULE]: Region {0} did not accept {1} {2}: {3}", | ||
2829 | reg.RegionName, sp.Name, sp.UUID, reason); | ||
2335 | } | 2830 | } |
2336 | 2831 | ||
2337 | if (!regionAccepted) | ||
2338 | m_log.WarnFormat( | ||
2339 | "[ENTITY TRANSFER MODULE]: Region {0} did not accept {1} {2}: {3}", | ||
2340 | reg.RegionName, sp.Name, sp.UUID, reason); | ||
2341 | } | 2832 | } |
2342 | 2833 | ||
2343 | /// <summary> | 2834 | /// <summary> |
@@ -2357,6 +2848,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2357 | extent.Y = (float)Util.WorldToRegionLoc((uint)megaRegionSize.Y); | 2848 | extent.Y = (float)Util.WorldToRegionLoc((uint)megaRegionSize.Y); |
2358 | } | 2849 | } |
2359 | 2850 | ||
2851 | <<<<<<< HEAD | ||
2852 | ======= | ||
2853 | |||
2854 | >>>>>>> avn/ubitvar | ||
2360 | swCorner.X = Scene.RegionInfo.RegionLocX - 1; | 2855 | swCorner.X = Scene.RegionInfo.RegionLocX - 1; |
2361 | swCorner.Y = Scene.RegionInfo.RegionLocY - 1; | 2856 | swCorner.Y = Scene.RegionInfo.RegionLocY - 1; |
2362 | neCorner.X = Scene.RegionInfo.RegionLocX + extent.X; | 2857 | neCorner.X = Scene.RegionInfo.RegionLocX + extent.X; |
@@ -2370,7 +2865,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2370 | /// <param name="pRegionLocX"></param> | 2865 | /// <param name="pRegionLocX"></param> |
2371 | /// <param name="pRegionLocY"></param> | 2866 | /// <param name="pRegionLocY"></param> |
2372 | /// <returns></returns> | 2867 | /// <returns></returns> |
2868 | <<<<<<< HEAD | ||
2373 | protected List<GridRegion> GetNeighbours(ScenePresence avatar, uint pRegionLocX, uint pRegionLocY) | 2869 | protected List<GridRegion> GetNeighbours(ScenePresence avatar, uint pRegionLocX, uint pRegionLocY) |
2870 | ======= | ||
2871 | protected List<GridRegion> GetNeighbors(ScenePresence avatar, uint pRegionLocX, uint pRegionLocY) | ||
2872 | >>>>>>> avn/ubitvar | ||
2374 | { | 2873 | { |
2375 | Scene pScene = avatar.Scene; | 2874 | Scene pScene = avatar.Scene; |
2376 | RegionInfo m_regionInfo = pScene.RegionInfo; | 2875 | RegionInfo m_regionInfo = pScene.RegionInfo; |
@@ -2381,6 +2880,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2381 | // view to include everything in the megaregion | 2880 | // view to include everything in the megaregion |
2382 | if (m_regionCombinerModule == null || !m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID)) | 2881 | if (m_regionCombinerModule == null || !m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID)) |
2383 | { | 2882 | { |
2883 | <<<<<<< HEAD | ||
2384 | // The area to check is as big as the current region. | 2884 | // The area to check is as big as the current region. |
2385 | // We presume all adjacent regions are the same size as this region. | 2885 | // We presume all adjacent regions are the same size as this region. |
2386 | uint dd = Math.Max((uint)avatar.Scene.DefaultDrawDistance, | 2886 | uint dd = Math.Max((uint)avatar.Scene.DefaultDrawDistance, |
@@ -2395,6 +2895,32 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2395 | neighbours | 2895 | neighbours |
2396 | = avatar.Scene.GridService.GetRegionRange( | 2896 | = avatar.Scene.GridService.GetRegionRange( |
2397 | m_regionInfo.ScopeID, (int)startX, (int)endX, (int)startY, (int)endY); | 2897 | m_regionInfo.ScopeID, (int)startX, (int)endX, (int)startY, (int)endY); |
2898 | ======= | ||
2899 | uint dd = (uint)avatar.DrawDistance; | ||
2900 | |||
2901 | // until avatar movement updates client connections, we need to seend at least this current region imediate Neighbors | ||
2902 | uint ddX = Math.Max(dd, Constants.RegionSize); | ||
2903 | uint ddY = Math.Max(dd, Constants.RegionSize); | ||
2904 | |||
2905 | ddX--; | ||
2906 | ddY--; | ||
2907 | |||
2908 | // reference to region edges. Should be avatar position | ||
2909 | uint startX = Util.RegionToWorldLoc(pRegionLocX); | ||
2910 | uint endX = startX + m_regionInfo.RegionSizeX; | ||
2911 | uint startY = Util.RegionToWorldLoc(pRegionLocY); | ||
2912 | uint endY = startY + m_regionInfo.RegionSizeY; | ||
2913 | |||
2914 | startX -= ddX; | ||
2915 | startY -= ddY; | ||
2916 | endX += ddX; | ||
2917 | endY += ddY; | ||
2918 | |||
2919 | neighbours | ||
2920 | = avatar.Scene.GridService.GetRegionRange( | ||
2921 | m_regionInfo.ScopeID, (int)startX, (int)endX, (int)startY, (int)endY); | ||
2922 | |||
2923 | >>>>>>> avn/ubitvar | ||
2398 | } | 2924 | } |
2399 | else | 2925 | else |
2400 | { | 2926 | { |
@@ -2408,6 +2934,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2408 | (int)Util.RegionToWorldLoc((uint)swCorner.Y), (int)Util.RegionToWorldLoc((uint)neCorner.Y)); | 2934 | (int)Util.RegionToWorldLoc((uint)swCorner.Y), (int)Util.RegionToWorldLoc((uint)neCorner.Y)); |
2409 | } | 2935 | } |
2410 | 2936 | ||
2937 | <<<<<<< HEAD | ||
2411 | // neighbours.ForEach( | 2938 | // neighbours.ForEach( |
2412 | // n => | 2939 | // n => |
2413 | // m_log.DebugFormat( | 2940 | // m_log.DebugFormat( |
@@ -2420,59 +2947,72 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2420 | r.RegionID == m_regionInfo.RegionID | 2947 | r.RegionID == m_regionInfo.RegionID |
2421 | || (r.RegionFlags != null && (r.RegionFlags & OpenSim.Framework.RegionFlags.RegionOnline) == 0)); | 2948 | || (r.RegionFlags != null && (r.RegionFlags & OpenSim.Framework.RegionFlags.RegionOnline) == 0)); |
2422 | 2949 | ||
2950 | ======= | ||
2951 | // The r.RegionFlags == null check only needs to be made for simulators before 2015-01-14 (pre 0.8.1). | ||
2952 | neighbours.RemoveAll( r => r.RegionID == m_regionInfo.RegionID ); | ||
2953 | |||
2954 | >>>>>>> avn/ubitvar | ||
2423 | return neighbours; | 2955 | return neighbours; |
2424 | } | 2956 | } |
2957 | #endregion | ||
2958 | |||
2959 | #region Agent Arrived | ||
2425 | 2960 | ||
2426 | private List<ulong> NewNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours) | 2961 | public void AgentArrivedAtDestination(UUID id) |
2427 | { | 2962 | { |
2428 | return currentNeighbours.FindAll(delegate(ulong handle) { return !previousNeighbours.Contains(handle); }); | 2963 | m_entityTransferStateMachine.SetAgentArrivedAtDestination(id); |
2429 | } | 2964 | } |
2430 | 2965 | ||
2431 | // private List<ulong> CommonNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours) | 2966 | #endregion |
2432 | // { | 2967 | |
2433 | // return currentNeighbours.FindAll(delegate(ulong handle) { return previousNeighbours.Contains(handle); }); | 2968 | #region Object Transfers |
2434 | // } | ||
2435 | 2969 | ||
2436 | private List<ulong> OldNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours) | 2970 | public GridRegion GetObjectDestination(SceneObjectGroup grp, Vector3 targetPosition,out Vector3 newpos) |
2437 | { | 2971 | { |
2438 | return previousNeighbours.FindAll(delegate(ulong handle) { return !currentNeighbours.Contains(handle); }); | 2972 | newpos = targetPosition; |
2439 | } | ||
2440 | 2973 | ||
2441 | private List<ulong> NeighbourHandles(List<GridRegion> neighbours) | 2974 | Scene scene = grp.Scene; |
2442 | { | 2975 | if (scene == null) |
2443 | List<ulong> handles = new List<ulong>(); | 2976 | return null; |
2444 | foreach (GridRegion reg in neighbours) | 2977 | |
2978 | int x = (int)targetPosition.X + (int)scene.RegionInfo.WorldLocX; | ||
2979 | if (targetPosition.X >= 0) | ||
2980 | x++; | ||
2981 | else | ||
2982 | x--; | ||
2983 | |||
2984 | int y = (int)targetPosition.Y + (int)scene.RegionInfo.WorldLocY; | ||
2985 | if (targetPosition.Y >= 0) | ||
2986 | y++; | ||
2987 | else | ||
2988 | y--; | ||
2989 | |||
2990 | |||
2991 | GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID,x,y); | ||
2992 | if (neighbourRegion == null) | ||
2445 | { | 2993 | { |
2446 | handles.Add(reg.RegionHandle); | 2994 | return null; |
2447 | } | 2995 | } |
2448 | return handles; | ||
2449 | } | ||
2450 | 2996 | ||
2451 | // private void Dump(string msg, List<ulong> handles) | 2997 | float newRegionSizeX = neighbourRegion.RegionSizeX; |
2452 | // { | 2998 | float newRegionSizeY = neighbourRegion.RegionSizeY; |
2453 | // m_log.InfoFormat("-------------- HANDLE DUMP ({0}) ---------", msg); | 2999 | if (newRegionSizeX == 0) |
2454 | // foreach (ulong handle in handles) | 3000 | newRegionSizeX = Constants.RegionSize; |
2455 | // { | 3001 | if (newRegionSizeY == 0) |
2456 | // uint x, y; | 3002 | newRegionSizeY = Constants.RegionSize; |
2457 | // Utils.LongToUInts(handle, out x, out y); | ||
2458 | // x = x / Constants.RegionSize; | ||
2459 | // y = y / Constants.RegionSize; | ||
2460 | // m_log.InfoFormat("({0}, {1})", x, y); | ||
2461 | // } | ||
2462 | // } | ||
2463 | 3003 | ||
2464 | #endregion | ||
2465 | 3004 | ||
2466 | #region Agent Arrived | 3005 | newpos.X = targetPosition.X - (neighbourRegion.RegionLocX - (int)scene.RegionInfo.WorldLocX); |
3006 | newpos.Y = targetPosition.Y - (neighbourRegion.RegionLocY - (int)scene.RegionInfo.WorldLocY); | ||
2467 | 3007 | ||
2468 | public void AgentArrivedAtDestination(UUID id) | ||
2469 | { | ||
2470 | m_entityTransferStateMachine.SetAgentArrivedAtDestination(id); | ||
2471 | } | ||
2472 | 3008 | ||
2473 | #endregion | 3009 | const float enterDistance = 0.2f; |
3010 | newpos.X = Util.Clamp(newpos.X, enterDistance, newRegionSizeX - enterDistance); | ||
3011 | newpos.Y = Util.Clamp(newpos.Y, enterDistance, newRegionSizeY - enterDistance); | ||
3012 | |||
3013 | return neighbourRegion; | ||
3014 | } | ||
2474 | 3015 | ||
2475 | #region Object Transfers | ||
2476 | 3016 | ||
2477 | /// <summary> | 3017 | /// <summary> |
2478 | /// Move the given scene object into a new region depending on which region its absolute position has moved | 3018 | /// Move the given scene object into a new region depending on which region its absolute position has moved |
@@ -2496,6 +3036,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2496 | if (scene == null) | 3036 | if (scene == null) |
2497 | return; | 3037 | return; |
2498 | 3038 | ||
3039 | <<<<<<< HEAD | ||
2499 | if (grp.RootPart.DIE_AT_EDGE) | 3040 | if (grp.RootPart.DIE_AT_EDGE) |
2500 | { | 3041 | { |
2501 | // We remove the object here | 3042 | // We remove the object here |
@@ -2510,6 +3051,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2510 | return; | 3051 | return; |
2511 | } | 3052 | } |
2512 | 3053 | ||
3054 | ======= | ||
3055 | >>>>>>> avn/ubitvar | ||
2513 | // Remember the old group position in case the region lookup fails so position can be restored. | 3056 | // Remember the old group position in case the region lookup fails so position can be restored. |
2514 | Vector3 oldGroupPosition = grp.RootPart.GroupPosition; | 3057 | Vector3 oldGroupPosition = grp.RootPart.GroupPosition; |
2515 | 3058 | ||
@@ -2562,7 +3105,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2562 | /// true if the crossing itself was successful, false on failure | 3105 | /// true if the crossing itself was successful, false on failure |
2563 | /// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region | 3106 | /// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region |
2564 | /// </returns> | 3107 | /// </returns> |
2565 | protected bool CrossPrimGroupIntoNewRegion(GridRegion destination, Vector3 newPosition, SceneObjectGroup grp, bool silent) | 3108 | public bool CrossPrimGroupIntoNewRegion(GridRegion destination, Vector3 newPosition, SceneObjectGroup grp, bool silent) |
2566 | { | 3109 | { |
2567 | //m_log.Debug(" >>> CrossPrimGroupIntoNewRegion <<<"); | 3110 | //m_log.Debug(" >>> CrossPrimGroupIntoNewRegion <<<"); |
2568 | 3111 | ||
@@ -2603,30 +3146,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2603 | grp, e); | 3146 | grp, e); |
2604 | } | 3147 | } |
2605 | } | 3148 | } |
2606 | /* | ||
2607 | * done on caller ( not in attachments crossing for now) | ||
2608 | else | ||
2609 | { | ||
2610 | |||
2611 | if (!grp.IsDeleted) | ||
2612 | { | ||
2613 | PhysicsActor pa = grp.RootPart.PhysActor; | ||
2614 | if (pa != null) | ||
2615 | { | ||
2616 | pa.CrossingFailure(); | ||
2617 | if (grp.RootPart.KeyframeMotion != null) | ||
2618 | { | ||
2619 | // moved to KeyframeMotion.CrossingFailure | ||
2620 | // grp.RootPart.Velocity = Vector3.Zero; | ||
2621 | grp.RootPart.KeyframeMotion.CrossingFailure(); | ||
2622 | // grp.SendGroupRootTerseUpdate(); | ||
2623 | } | ||
2624 | } | ||
2625 | } | ||
2626 | |||
2627 | m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: Prim crossing failed for {0}", grp); | ||
2628 | } | ||
2629 | */ | ||
2630 | } | 3149 | } |
2631 | else | 3150 | else |
2632 | { | 3151 | { |