diff options
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | 182 |
1 files changed, 92 insertions, 90 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index ddb621d..7295383 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -1106,119 +1106,121 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1106 | ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, | 1106 | ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, |
1107 | bool isFlying, string version) | 1107 | bool isFlying, string version) |
1108 | { | 1108 | { |
1109 | if (neighbourRegion == null) | ||
1110 | return agent; | ||
1111 | |||
1109 | try | 1112 | try |
1110 | { | 1113 | { |
1111 | ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); | 1114 | ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); |
1112 | 1115 | ||
1113 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3} running version {4}", agent.Firstname, agent.Lastname, neighbourx, neighboury, version); | 1116 | m_log.DebugFormat( |
1117 | "[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3} running version {4}", | ||
1118 | agent.Firstname, agent.Lastname, neighbourx, neighboury, version); | ||
1114 | 1119 | ||
1115 | Scene m_scene = agent.Scene; | 1120 | Scene m_scene = agent.Scene; |
1116 | |||
1117 | if (neighbourRegion != null) | ||
1118 | { | ||
1119 | if (!agent.ValidateAttachments()) | ||
1120 | m_log.DebugFormat( | ||
1121 | "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.", | ||
1122 | agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName); | ||
1123 | 1121 | ||
1124 | pos = pos + agent.Velocity; | 1122 | if (!agent.ValidateAttachments()) |
1125 | Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0); | 1123 | m_log.DebugFormat( |
1124 | "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.", | ||
1125 | agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName); | ||
1126 | 1126 | ||
1127 | agent.RemoveFromPhysicalScene(); | 1127 | pos = pos + agent.Velocity; |
1128 | Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0); | ||
1128 | 1129 | ||
1129 | SetInTransit(agent.UUID); | 1130 | agent.RemoveFromPhysicalScene(); |
1130 | 1131 | ||
1131 | AgentData cAgent = new AgentData(); | 1132 | SetInTransit(agent.UUID); |
1132 | agent.CopyTo(cAgent); | ||
1133 | cAgent.Position = pos; | ||
1134 | if (isFlying) | ||
1135 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | ||
1136 | 1133 | ||
1137 | // We don't need the callback anymnore | 1134 | AgentData cAgent = new AgentData(); |
1138 | cAgent.CallbackURI = String.Empty; | 1135 | agent.CopyTo(cAgent); |
1136 | cAgent.Position = pos; | ||
1137 | if (isFlying) | ||
1138 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | ||
1139 | 1139 | ||
1140 | // Beyond this point, extra cleanup is needed beyond removing transit state | 1140 | // We don't need the callback anymnore |
1141 | UpdateInTransit(agent.UUID, AgentTransferState.Transferring); | 1141 | cAgent.CallbackURI = String.Empty; |
1142 | 1142 | ||
1143 | if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) | 1143 | // Beyond this point, extra cleanup is needed beyond removing transit state |
1144 | { | 1144 | UpdateInTransit(agent.UUID, AgentTransferState.Transferring); |
1145 | // region doesn't take it | ||
1146 | ReInstantiateScripts(agent); | ||
1147 | agent.AddToPhysicalScene(isFlying); | ||
1148 | ResetFromTransit(agent.UUID); | ||
1149 | return agent; | ||
1150 | } | ||
1151 | |||
1152 | //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); | ||
1153 | agent.ControllingClient.RequestClientInfo(); | ||
1154 | |||
1155 | //m_log.Debug("BEFORE CROSS"); | ||
1156 | //Scene.DumpChildrenSeeds(UUID); | ||
1157 | //DumpKnownRegions(); | ||
1158 | string agentcaps; | ||
1159 | if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps)) | ||
1160 | { | ||
1161 | m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: No ENTITY TRANSFER MODULE information for region handle {0}, exiting CrossToNewRegion.", | ||
1162 | neighbourRegion.RegionHandle); | ||
1163 | return agent; | ||
1164 | } | ||
1165 | // No turning back | ||
1166 | agent.IsChildAgent = true; | ||
1167 | 1145 | ||
1168 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); | 1146 | if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) |
1169 | 1147 | { | |
1170 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); | 1148 | // region doesn't take it |
1149 | ReInstantiateScripts(agent); | ||
1150 | agent.AddToPhysicalScene(isFlying); | ||
1151 | ResetFromTransit(agent.UUID); | ||
1152 | return agent; | ||
1153 | } | ||
1171 | 1154 | ||
1172 | if (m_eqModule != null) | 1155 | //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); |
1173 | { | 1156 | agent.ControllingClient.RequestClientInfo(); |
1174 | m_eqModule.CrossRegion( | ||
1175 | neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint, | ||
1176 | capsPath, agent.UUID, agent.ControllingClient.SessionId); | ||
1177 | } | ||
1178 | else | ||
1179 | { | ||
1180 | agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, | ||
1181 | capsPath); | ||
1182 | } | ||
1183 | 1157 | ||
1184 | // SUCCESS! | 1158 | //m_log.Debug("BEFORE CROSS"); |
1185 | UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); | 1159 | //Scene.DumpChildrenSeeds(UUID); |
1160 | //DumpKnownRegions(); | ||
1161 | string agentcaps; | ||
1162 | if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps)) | ||
1163 | { | ||
1164 | m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: No ENTITY TRANSFER MODULE information for region handle {0}, exiting CrossToNewRegion.", | ||
1165 | neighbourRegion.RegionHandle); | ||
1166 | return agent; | ||
1167 | } | ||
1168 | // No turning back | ||
1169 | agent.IsChildAgent = true; | ||
1186 | 1170 | ||
1187 | // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. | 1171 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); |
1188 | UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); | ||
1189 | 1172 | ||
1190 | agent.MakeChildAgent(); | 1173 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); |
1191 | 1174 | ||
1192 | // FIXME: Possibly this should occur lower down after other commands to close other agents, | 1175 | if (m_eqModule != null) |
1193 | // but not sure yet what the side effects would be. | 1176 | { |
1194 | ResetFromTransit(agent.UUID); | 1177 | m_eqModule.CrossRegion( |
1178 | neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint, | ||
1179 | capsPath, agent.UUID, agent.ControllingClient.SessionId); | ||
1180 | } | ||
1181 | else | ||
1182 | { | ||
1183 | agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, | ||
1184 | capsPath); | ||
1185 | } | ||
1195 | 1186 | ||
1196 | // now we have a child agent in this region. Request all interesting data about other (root) agents | 1187 | // SUCCESS! |
1197 | agent.SendOtherAgentsAvatarDataToMe(); | 1188 | UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); |
1198 | agent.SendOtherAgentsAppearanceToMe(); | ||
1199 | 1189 | ||
1200 | // Backwards compatibility. Best effort | 1190 | // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. |
1201 | if (version == "Unknown" || version == string.Empty) | 1191 | UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); |
1202 | { | ||
1203 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); | ||
1204 | Thread.Sleep(3000); // wait a little now that we're not waiting for the callback | ||
1205 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); | ||
1206 | } | ||
1207 | 1192 | ||
1193 | agent.MakeChildAgent(); | ||
1208 | 1194 | ||
1209 | // Next, let's close the child agent connections that are too far away. | 1195 | // FIXME: Possibly this should occur lower down after other commands to close other agents, |
1210 | agent.CloseChildAgents(neighbourx, neighboury); | 1196 | // but not sure yet what the side effects would be. |
1211 | 1197 | ResetFromTransit(agent.UUID); | |
1212 | AgentHasMovedAway(agent, false); | 1198 | |
1213 | 1199 | // now we have a child agent in this region. Request all interesting data about other (root) agents | |
1214 | // the user may change their profile information in other region, | 1200 | agent.SendOtherAgentsAvatarDataToMe(); |
1215 | // so the userinfo in UserProfileCache is not reliable any more, delete it | 1201 | agent.SendOtherAgentsAppearanceToMe(); |
1216 | // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! | 1202 | |
1217 | if (agent.Scene.NeedSceneCacheClear(agent.UUID)) | 1203 | // Backwards compatibility. Best effort |
1218 | { | 1204 | if (version == "Unknown" || version == string.Empty) |
1219 | m_log.DebugFormat( | 1205 | { |
1220 | "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID); | 1206 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); |
1221 | } | 1207 | Thread.Sleep(3000); // wait a little now that we're not waiting for the callback |
1208 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); | ||
1209 | } | ||
1210 | |||
1211 | |||
1212 | // Next, let's close the child agent connections that are too far away. | ||
1213 | agent.CloseChildAgents(neighbourx, neighboury); | ||
1214 | |||
1215 | AgentHasMovedAway(agent, false); | ||
1216 | |||
1217 | // the user may change their profile information in other region, | ||
1218 | // so the userinfo in UserProfileCache is not reliable any more, delete it | ||
1219 | // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! | ||
1220 | if (agent.Scene.NeedSceneCacheClear(agent.UUID)) | ||
1221 | { | ||
1222 | m_log.DebugFormat( | ||
1223 | "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID); | ||
1222 | } | 1224 | } |
1223 | 1225 | ||
1224 | //m_log.Debug("AFTER CROSS"); | 1226 | //m_log.Debug("AFTER CROSS"); |