diff options
Diffstat (limited to 'OpenSim')
28 files changed, 416 insertions, 171 deletions
diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 729667c..f3490fb 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs | |||
@@ -439,18 +439,26 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
439 | // k, (string)requestData[k], ((string)requestData[k]).Length); | 439 | // k, (string)requestData[k], ((string)requestData[k]).Length); |
440 | // } | 440 | // } |
441 | 441 | ||
442 | CheckStringParameters(requestData, responseData, new string[] {"filename", "regionid"}); | 442 | CheckStringParameters(requestData, responseData, new string[] { "filename" }); |
443 | CheckRegionParams(requestData, responseData); | 443 | CheckRegionParams(requestData, responseData); |
444 | 444 | ||
445 | Scene scene = null; | 445 | Scene scene = null; |
446 | GetSceneFromRegionParams(requestData, responseData, out scene); | 446 | GetSceneFromRegionParams(requestData, responseData, out scene); |
447 | string file = (string)requestData["filename"]; | ||
448 | 447 | ||
449 | responseData["accepted"] = true; | 448 | if (scene != null) |
449 | { | ||
450 | string file = (string)requestData["filename"]; | ||
450 | 451 | ||
451 | LoadHeightmap(file, scene.RegionInfo.RegionID); | 452 | responseData["accepted"] = true; |
452 | 453 | ||
453 | responseData["success"] = true; | 454 | LoadHeightmap(file, scene.RegionInfo.RegionID); |
455 | |||
456 | responseData["success"] = true; | ||
457 | } | ||
458 | else | ||
459 | { | ||
460 | responseData["success"] = false; | ||
461 | } | ||
454 | 462 | ||
455 | m_log.Info("[RADMIN]: Load height maps request complete"); | 463 | m_log.Info("[RADMIN]: Load height maps request complete"); |
456 | } | 464 | } |
@@ -464,23 +472,30 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
464 | 472 | ||
465 | // m_log.DebugFormat("[RADMIN]: Save Terrain: XmlRpc {0}", request.ToString()); | 473 | // m_log.DebugFormat("[RADMIN]: Save Terrain: XmlRpc {0}", request.ToString()); |
466 | 474 | ||
467 | CheckStringParameters(requestData, responseData, new string[] { "filename", "regionid" }); | 475 | CheckStringParameters(requestData, responseData, new string[] { "filename" }); |
468 | CheckRegionParams(requestData, responseData); | 476 | CheckRegionParams(requestData, responseData); |
469 | 477 | ||
470 | Scene region = null; | 478 | Scene scene = null; |
471 | GetSceneFromRegionParams(requestData, responseData, out region); | 479 | GetSceneFromRegionParams(requestData, responseData, out scene); |
472 | 480 | ||
473 | string file = (string)requestData["filename"]; | 481 | if (scene != null) |
474 | m_log.InfoFormat("[RADMIN]: Terrain Saving: {0}", file); | 482 | { |
483 | string file = (string)requestData["filename"]; | ||
484 | m_log.InfoFormat("[RADMIN]: Terrain Saving: {0}", file); | ||
475 | 485 | ||
476 | responseData["accepted"] = true; | 486 | responseData["accepted"] = true; |
477 | 487 | ||
478 | ITerrainModule terrainModule = region.RequestModuleInterface<ITerrainModule>(); | 488 | ITerrainModule terrainModule = scene.RequestModuleInterface<ITerrainModule>(); |
479 | if (null == terrainModule) throw new Exception("terrain module not available"); | 489 | if (null == terrainModule) throw new Exception("terrain module not available"); |
480 | 490 | ||
481 | terrainModule.SaveToFile(file); | 491 | terrainModule.SaveToFile(file); |
482 | 492 | ||
483 | responseData["success"] = true; | 493 | responseData["success"] = true; |
494 | } | ||
495 | else | ||
496 | { | ||
497 | responseData["success"] = false; | ||
498 | } | ||
484 | 499 | ||
485 | m_log.Info("[RADMIN]: Save height maps request complete"); | 500 | m_log.Info("[RADMIN]: Save height maps request complete"); |
486 | } | 501 | } |
diff --git a/OpenSim/Framework/Monitoring/StatsManager.cs b/OpenSim/Framework/Monitoring/StatsManager.cs index 7cf1fa7..05ee4c5 100644 --- a/OpenSim/Framework/Monitoring/StatsManager.cs +++ b/OpenSim/Framework/Monitoring/StatsManager.cs | |||
@@ -267,7 +267,7 @@ namespace OpenSim.Framework.Monitoring | |||
267 | public static Hashtable HandleStatsRequest(Hashtable request) | 267 | public static Hashtable HandleStatsRequest(Hashtable request) |
268 | { | 268 | { |
269 | Hashtable responsedata = new Hashtable(); | 269 | Hashtable responsedata = new Hashtable(); |
270 | string regpath = request["uri"].ToString(); | 270 | // string regpath = request["uri"].ToString(); |
271 | int response_code = 200; | 271 | int response_code = 200; |
272 | string contenttype = "text/json"; | 272 | string contenttype = "text/json"; |
273 | 273 | ||
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/AvatarPickerSearchModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/AvatarPickerSearchModule.cs index 9f2aed0..10a4753 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/AvatarPickerSearchModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/AvatarPickerSearchModule.cs | |||
@@ -123,7 +123,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
123 | 123 | ||
124 | if (m_URL == "localhost") | 124 | if (m_URL == "localhost") |
125 | { | 125 | { |
126 | m_log.DebugFormat("[AVATAR PICKER SEARCH]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); | 126 | // m_log.DebugFormat("[AVATAR PICKER SEARCH]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); |
127 | caps.RegisterHandler( | 127 | caps.RegisterHandler( |
128 | "AvatarPickerSearch", | 128 | "AvatarPickerSearch", |
129 | new AvatarPickerSearchHandler("/CAPS/" + capID + "/", m_People, "AvatarPickerSearch", "Search for avatars by name")); | 129 | new AvatarPickerSearchHandler("/CAPS/" + capID + "/", m_People, "AvatarPickerSearch", "Search for avatars by name")); |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 0431b53..ad3f715 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | |||
@@ -108,6 +108,32 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
108 | 108 | ||
109 | StatsManager.RegisterStat( | 109 | StatsManager.RegisterStat( |
110 | new Stat( | 110 | new Stat( |
111 | "IncomingPacketsMalformedCount", | ||
112 | "Number of inbound UDP packets that could not be recognized as LL protocol packets.", | ||
113 | "", | ||
114 | "", | ||
115 | "clientstack", | ||
116 | scene.Name, | ||
117 | StatType.Pull, | ||
118 | MeasuresOfInterest.AverageChangeOverTime, | ||
119 | stat => stat.Value = m_udpServer.IncomingMalformedPacketCount, | ||
120 | StatVerbosity.Info)); | ||
121 | |||
122 | StatsManager.RegisterStat( | ||
123 | new Stat( | ||
124 | "IncomingPacketsOrphanedCount", | ||
125 | "Number of inbound packets that were not initial connections packets and could not be associated with a viewer.", | ||
126 | "", | ||
127 | "", | ||
128 | "clientstack", | ||
129 | scene.Name, | ||
130 | StatType.Pull, | ||
131 | MeasuresOfInterest.AverageChangeOverTime, | ||
132 | stat => stat.Value = m_udpServer.IncomingOrphanedPacketCount, | ||
133 | StatVerbosity.Info)); | ||
134 | |||
135 | StatsManager.RegisterStat( | ||
136 | new Stat( | ||
111 | "OutgoingUDPSendsCount", | 137 | "OutgoingUDPSendsCount", |
112 | "Number of UDP sends performed", | 138 | "Number of UDP sends performed", |
113 | "", | 139 | "", |
@@ -272,7 +298,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
272 | 298 | ||
273 | public Socket Server { get { return null; } } | 299 | public Socket Server { get { return null; } } |
274 | 300 | ||
275 | private int m_malformedCount = 0; // Guard against a spamming attack | 301 | /// <summary> |
302 | /// Record how many inbound packets could not be recognized as LLUDP packets. | ||
303 | /// </summary> | ||
304 | public int IncomingMalformedPacketCount { get; private set; } | ||
305 | |||
306 | /// <summary> | ||
307 | /// Record how many inbound packets could not be associated with a simulator circuit. | ||
308 | /// </summary> | ||
309 | public int IncomingOrphanedPacketCount { get; private set; } | ||
276 | 310 | ||
277 | /// <summary> | 311 | /// <summary> |
278 | /// Record current outgoing client for monitoring purposes. | 312 | /// Record current outgoing client for monitoring purposes. |
@@ -1193,6 +1227,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1193 | outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue; | 1227 | outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue; |
1194 | } | 1228 | } |
1195 | 1229 | ||
1230 | private void RecordMalformedInboundPacket(IPEndPoint endPoint) | ||
1231 | { | ||
1232 | // if (m_malformedCount < 100) | ||
1233 | // m_log.DebugFormat("[LLUDPSERVER]: Dropped malformed packet: " + e.ToString()); | ||
1234 | |||
1235 | IncomingMalformedPacketCount++; | ||
1236 | |||
1237 | if ((IncomingMalformedPacketCount % 10000) == 0) | ||
1238 | m_log.WarnFormat( | ||
1239 | "[LLUDPSERVER]: Received {0} malformed packets so far, probable network attack. Last was from {1}", | ||
1240 | IncomingMalformedPacketCount, endPoint); | ||
1241 | } | ||
1242 | |||
1196 | public override void PacketReceived(UDPPacketBuffer buffer) | 1243 | public override void PacketReceived(UDPPacketBuffer buffer) |
1197 | { | 1244 | { |
1198 | // Debugging/Profiling | 1245 | // Debugging/Profiling |
@@ -1214,6 +1261,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1214 | // "[LLUDPSERVER]: Dropping undersized packet with {0} bytes received from {1} in {2}", | 1261 | // "[LLUDPSERVER]: Dropping undersized packet with {0} bytes received from {1} in {2}", |
1215 | // buffer.DataLength, buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName); | 1262 | // buffer.DataLength, buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName); |
1216 | 1263 | ||
1264 | RecordMalformedInboundPacket(endPoint); | ||
1265 | |||
1217 | return; // Drop undersized packet | 1266 | return; // Drop undersized packet |
1218 | } | 1267 | } |
1219 | 1268 | ||
@@ -1232,6 +1281,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1232 | // "[LLUDPSERVER]: Dropping packet with malformed header received from {0} in {1}", | 1281 | // "[LLUDPSERVER]: Dropping packet with malformed header received from {0} in {1}", |
1233 | // buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName); | 1282 | // buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName); |
1234 | 1283 | ||
1284 | RecordMalformedInboundPacket(endPoint); | ||
1285 | |||
1235 | return; // Malformed header | 1286 | return; // Malformed header |
1236 | } | 1287 | } |
1237 | 1288 | ||
@@ -1247,34 +1298,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1247 | // Only allocate a buffer for zerodecoding if the packet is zerocoded | 1298 | // Only allocate a buffer for zerodecoding if the packet is zerocoded |
1248 | ((buffer.Data[0] & Helpers.MSG_ZEROCODED) != 0) ? new byte[4096] : null); | 1299 | ((buffer.Data[0] & Helpers.MSG_ZEROCODED) != 0) ? new byte[4096] : null); |
1249 | } | 1300 | } |
1250 | catch (MalformedDataException) | ||
1251 | { | ||
1252 | } | ||
1253 | catch (IndexOutOfRangeException) | ||
1254 | { | ||
1255 | // m_log.WarnFormat( | ||
1256 | // "[LLUDPSERVER]: Dropping short packet received from {0} in {1}", | ||
1257 | // buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName); | ||
1258 | |||
1259 | return; // Drop short packet | ||
1260 | } | ||
1261 | catch (Exception e) | 1301 | catch (Exception e) |
1262 | { | 1302 | { |
1263 | if (m_malformedCount < 100) | 1303 | if (IncomingMalformedPacketCount < 100) |
1264 | m_log.DebugFormat("[LLUDPSERVER]: Dropped malformed packet: " + e.ToString()); | 1304 | m_log.DebugFormat("[LLUDPSERVER]: Dropped malformed packet: " + e.ToString()); |
1265 | |||
1266 | m_malformedCount++; | ||
1267 | |||
1268 | if ((m_malformedCount % 100000) == 0) | ||
1269 | m_log.DebugFormat("[LLUDPSERVER]: Received {0} malformed packets so far, probable network attack.", m_malformedCount); | ||
1270 | } | 1305 | } |
1271 | 1306 | ||
1272 | // Fail-safe check | 1307 | // Fail-safe check |
1273 | if (packet == null) | 1308 | if (packet == null) |
1274 | { | 1309 | { |
1275 | m_log.ErrorFormat("[LLUDPSERVER]: Malformed data, cannot parse {0} byte packet from {1}:", | 1310 | if (IncomingMalformedPacketCount < 100) |
1276 | buffer.DataLength, buffer.RemoteEndPoint); | 1311 | { |
1277 | m_log.Error(Utils.BytesToHexString(buffer.Data, buffer.DataLength, null)); | 1312 | m_log.WarnFormat("[LLUDPSERVER]: Malformed data, cannot parse {0} byte packet from {1}, data {2}:", |
1313 | buffer.DataLength, buffer.RemoteEndPoint, Utils.BytesToHexString(buffer.Data, buffer.DataLength, null)); | ||
1314 | } | ||
1315 | |||
1316 | RecordMalformedInboundPacket(endPoint); | ||
1317 | |||
1278 | return; | 1318 | return; |
1279 | } | 1319 | } |
1280 | 1320 | ||
@@ -1337,6 +1377,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1337 | if (client == null || !(client is LLClientView)) | 1377 | if (client == null || !(client is LLClientView)) |
1338 | { | 1378 | { |
1339 | //m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName); | 1379 | //m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName); |
1380 | |||
1381 | IncomingOrphanedPacketCount++; | ||
1382 | |||
1383 | if ((IncomingOrphanedPacketCount % 10000) == 0) | ||
1384 | m_log.WarnFormat( | ||
1385 | "[LLUDPSERVER]: Received {0} orphaned packets so far. Last was from {1}", | ||
1386 | IncomingOrphanedPacketCount, endPoint); | ||
1387 | |||
1340 | return; | 1388 | return; |
1341 | } | 1389 | } |
1342 | 1390 | ||
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs b/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs index 1fdc410..5a2bcee 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs | |||
@@ -145,39 +145,32 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
145 | return packet; | 145 | return packet; |
146 | } | 146 | } |
147 | 147 | ||
148 | // private byte[] decoded_header = new byte[10]; | ||
149 | private static PacketType GetType(byte[] bytes) | 148 | private static PacketType GetType(byte[] bytes) |
150 | { | 149 | { |
151 | byte[] decoded_header = new byte[10 + 8]; | ||
152 | ushort id; | 150 | ushort id; |
153 | PacketFrequency freq; | 151 | PacketFrequency freq; |
152 | bool isZeroCoded = (bytes[0] & Helpers.MSG_ZEROCODED) != 0; | ||
154 | 153 | ||
155 | if ((bytes[0] & Helpers.MSG_ZEROCODED) != 0) | 154 | if (bytes[6] == 0xFF) |
156 | { | 155 | { |
157 | Helpers.ZeroDecode(bytes, 16, decoded_header); | 156 | if (bytes[7] == 0xFF) |
158 | } | ||
159 | else | ||
160 | { | ||
161 | Buffer.BlockCopy(bytes, 0, decoded_header, 0, 10); | ||
162 | } | ||
163 | |||
164 | if (decoded_header[6] == 0xFF) | ||
165 | { | ||
166 | if (decoded_header[7] == 0xFF) | ||
167 | { | 157 | { |
168 | id = (ushort) ((decoded_header[8] << 8) + decoded_header[9]); | ||
169 | freq = PacketFrequency.Low; | 158 | freq = PacketFrequency.Low; |
159 | if (isZeroCoded && bytes[8] == 0) | ||
160 | id = bytes[10]; | ||
161 | else | ||
162 | id = (ushort)((bytes[8] << 8) + bytes[9]); | ||
170 | } | 163 | } |
171 | else | 164 | else |
172 | { | 165 | { |
173 | id = decoded_header[7]; | ||
174 | freq = PacketFrequency.Medium; | 166 | freq = PacketFrequency.Medium; |
167 | id = bytes[7]; | ||
175 | } | 168 | } |
176 | } | 169 | } |
177 | else | 170 | else |
178 | { | 171 | { |
179 | id = decoded_header[6]; | ||
180 | freq = PacketFrequency.High; | 172 | freq = PacketFrequency.High; |
173 | id = bytes[6]; | ||
181 | } | 174 | } |
182 | 175 | ||
183 | return Packet.GetType(id, freq); | 176 | return Packet.GetType(id, freq); |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 62b25d0..95cc6b7 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -361,22 +361,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
361 | 361 | ||
362 | // If we're an NPC then skip all the item checks and manipulations since we don't have an | 362 | // If we're an NPC then skip all the item checks and manipulations since we don't have an |
363 | // inventory right now. | 363 | // inventory right now. |
364 | SceneObjectGroup objatt | 364 | RezSingleAttachmentFromInventoryInternal( |
365 | = RezSingleAttachmentFromInventoryInternal( | ||
366 | sp, sp.PresenceType == PresenceType.Npc ? UUID.Zero : attach.ItemID, attach.AssetID, attachmentPt, true, d); | 365 | sp, sp.PresenceType == PresenceType.Npc ? UUID.Zero : attach.ItemID, attach.AssetID, attachmentPt, true, d); |
367 | |||
368 | |||
369 | if (ThrottlePer100PrimsRezzed > 0) | ||
370 | { | ||
371 | int throttleMs = (int)Math.Round((float)objatt.PrimCount / 100 * ThrottlePer100PrimsRezzed); | ||
372 | |||
373 | if (DebugLevel > 0) | ||
374 | m_log.DebugFormat( | ||
375 | "[ATTACHMENTS MODULE]: Throttling by {0}ms after rez of {1} with {2} prims for attachment to {3} on point {4} in {5}", | ||
376 | throttleMs, objatt.Name, objatt.PrimCount, sp.Name, attachmentPt, m_scene.Name); | ||
377 | |||
378 | Thread.Sleep(throttleMs); | ||
379 | } | ||
380 | } | 366 | } |
381 | catch (Exception e) | 367 | catch (Exception e) |
382 | { | 368 | { |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 35045b5..62acd78 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs | |||
@@ -844,7 +844,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
844 | AgentCircuitData acd = SceneHelpers.GenerateAgentData(ua1.PrincipalID); | 844 | AgentCircuitData acd = SceneHelpers.GenerateAgentData(ua1.PrincipalID); |
845 | TestClient tc = new TestClient(acd, sceneA); | 845 | TestClient tc = new TestClient(acd, sceneA); |
846 | List<TestClient> destinationTestClients = new List<TestClient>(); | 846 | List<TestClient> destinationTestClients = new List<TestClient>(); |
847 | EntityTransferHelpers.SetUpInformClientOfNeighbour(tc, destinationTestClients); | 847 | EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients); |
848 | 848 | ||
849 | ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, tc, acd); | 849 | ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, tc, acd); |
850 | beforeTeleportSp.AbsolutePosition = new Vector3(30, 31, 32); | 850 | beforeTeleportSp.AbsolutePosition = new Vector3(30, 31, 32); |
@@ -925,7 +925,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
925 | IConfig modulesConfig = config.AddConfig("Modules"); | 925 | IConfig modulesConfig = config.AddConfig("Modules"); |
926 | modulesConfig.Set("EntityTransferModule", etmA.Name); | 926 | modulesConfig.Set("EntityTransferModule", etmA.Name); |
927 | modulesConfig.Set("SimulationServices", lscm.Name); | 927 | modulesConfig.Set("SimulationServices", lscm.Name); |
928 | IConfig entityTransferConfig = config.AddConfig("EntityTransfer"); | ||
929 | 928 | ||
930 | modulesConfig.Set("InventoryAccessModule", "BasicInventoryAccessModule"); | 929 | modulesConfig.Set("InventoryAccessModule", "BasicInventoryAccessModule"); |
931 | 930 | ||
@@ -944,7 +943,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
944 | AgentCircuitData acd = SceneHelpers.GenerateAgentData(ua1.PrincipalID); | 943 | AgentCircuitData acd = SceneHelpers.GenerateAgentData(ua1.PrincipalID); |
945 | TestClient tc = new TestClient(acd, sceneA); | 944 | TestClient tc = new TestClient(acd, sceneA); |
946 | List<TestClient> destinationTestClients = new List<TestClient>(); | 945 | List<TestClient> destinationTestClients = new List<TestClient>(); |
947 | EntityTransferHelpers.SetUpInformClientOfNeighbour(tc, destinationTestClients); | 946 | EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients); |
948 | 947 | ||
949 | ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, tc, acd); | 948 | ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, tc, acd); |
950 | beforeTeleportSp.AbsolutePosition = new Vector3(30, 31, 32); | 949 | beforeTeleportSp.AbsolutePosition = new Vector3(30, 31, 32); |
@@ -966,7 +965,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
966 | // Both these operations will occur on different threads and will wait for each other. | 965 | // Both these operations will occur on different threads and will wait for each other. |
967 | // We have to do this via ThreadPool directly since FireAndForget has been switched to sync for the V1 | 966 | // We have to do this via ThreadPool directly since FireAndForget has been switched to sync for the V1 |
968 | // test protocol, where we are trying to avoid unpredictable async operations in regression tests. | 967 | // test protocol, where we are trying to avoid unpredictable async operations in regression tests. |
969 | ((TestClient)beforeTeleportSp.ControllingClient).OnTestClientSendRegionTeleport | 968 | tc.OnTestClientSendRegionTeleport |
970 | += (regionHandle, simAccess, regionExternalEndPoint, locationID, flags, capsURL) | 969 | += (regionHandle, simAccess, regionExternalEndPoint, locationID, flags, capsURL) |
971 | => ThreadPool.UnsafeQueueUserWorkItem(o => destinationTestClients[0].CompleteMovement(), null); | 970 | => ThreadPool.UnsafeQueueUserWorkItem(o => destinationTestClients[0].CompleteMovement(), null); |
972 | 971 | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index c04098c..966a05c 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs | |||
@@ -307,7 +307,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
307 | } | 307 | } |
308 | 308 | ||
309 | string serverURI = string.Empty; | 309 | string serverURI = string.Empty; |
310 | bool foreign = GetUserProfileServerURI(targetID, out serverURI); | 310 | GetUserProfileServerURI(targetID, out serverURI); |
311 | UUID creatorId = UUID.Zero; | 311 | UUID creatorId = UUID.Zero; |
312 | 312 | ||
313 | OSDMap parameters= new OSDMap(); | 313 | OSDMap parameters= new OSDMap(); |
@@ -372,7 +372,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
372 | } | 372 | } |
373 | 373 | ||
374 | string serverURI = string.Empty; | 374 | string serverURI = string.Empty; |
375 | bool foreign = GetUserProfileServerURI(target, out serverURI); | 375 | GetUserProfileServerURI(target, out serverURI); |
376 | 376 | ||
377 | object Ad = (object)ad; | 377 | object Ad = (object)ad; |
378 | if(!JsonRpcRequest(ref Ad, "classifieds_info_query", serverURI, UUID.Random().ToString())) | 378 | if(!JsonRpcRequest(ref Ad, "classifieds_info_query", serverURI, UUID.Random().ToString())) |
@@ -441,10 +441,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
441 | Vector3 pos = remoteClient.SceneAgent.AbsolutePosition; | 441 | Vector3 pos = remoteClient.SceneAgent.AbsolutePosition; |
442 | ILandObject land = s.LandChannel.GetLandObject(pos.X, pos.Y); | 442 | ILandObject land = s.LandChannel.GetLandObject(pos.X, pos.Y); |
443 | ScenePresence p = FindPresence(remoteClient.AgentId); | 443 | ScenePresence p = FindPresence(remoteClient.AgentId); |
444 | Vector3 avaPos = p.AbsolutePosition; | 444 | // Vector3 avaPos = p.AbsolutePosition; |
445 | 445 | ||
446 | string serverURI = string.Empty; | 446 | string serverURI = string.Empty; |
447 | bool foreign = GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 447 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
448 | 448 | ||
449 | if (land == null) | 449 | if (land == null) |
450 | { | 450 | { |
@@ -470,7 +470,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
470 | 470 | ||
471 | object Ad = ad; | 471 | object Ad = ad; |
472 | 472 | ||
473 | OSD X = OSD.SerializeMembers(Ad); | 473 | OSD.SerializeMembers(Ad); |
474 | 474 | ||
475 | if(!JsonRpcRequest(ref Ad, "classified_update", serverURI, UUID.Random().ToString())) | 475 | if(!JsonRpcRequest(ref Ad, "classified_update", serverURI, UUID.Random().ToString())) |
476 | { | 476 | { |
@@ -491,7 +491,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
491 | public void ClassifiedDelete(UUID queryClassifiedID, IClientAPI remoteClient) | 491 | public void ClassifiedDelete(UUID queryClassifiedID, IClientAPI remoteClient) |
492 | { | 492 | { |
493 | string serverURI = string.Empty; | 493 | string serverURI = string.Empty; |
494 | bool foreign = GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 494 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
495 | 495 | ||
496 | UUID classifiedId; | 496 | UUID classifiedId; |
497 | OSDMap parameters= new OSDMap(); | 497 | OSDMap parameters= new OSDMap(); |
@@ -541,7 +541,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
541 | } | 541 | } |
542 | 542 | ||
543 | string serverURI = string.Empty; | 543 | string serverURI = string.Empty; |
544 | bool foreign = GetUserProfileServerURI(targetId, out serverURI); | 544 | GetUserProfileServerURI(targetId, out serverURI); |
545 | 545 | ||
546 | OSDMap parameters= new OSDMap(); | 546 | OSDMap parameters= new OSDMap(); |
547 | parameters.Add("creatorId", OSD.FromUUID(targetId)); | 547 | parameters.Add("creatorId", OSD.FromUUID(targetId)); |
@@ -592,7 +592,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
592 | UUID targetID; | 592 | UUID targetID; |
593 | UUID.TryParse(args[0], out targetID); | 593 | UUID.TryParse(args[0], out targetID); |
594 | string serverURI = string.Empty; | 594 | string serverURI = string.Empty; |
595 | bool foreign = GetUserProfileServerURI(targetID, out serverURI); | 595 | GetUserProfileServerURI(targetID, out serverURI); |
596 | IClientAPI remoteClient = (IClientAPI)sender; | 596 | IClientAPI remoteClient = (IClientAPI)sender; |
597 | 597 | ||
598 | UserProfilePick pick = new UserProfilePick(); | 598 | UserProfilePick pick = new UserProfilePick(); |
@@ -660,7 +660,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
660 | m_log.DebugFormat("[PROFILES]: Start PickInfoUpdate Name: {0} PickId: {1} SnapshotId: {2}", name, pickID.ToString(), snapshotID.ToString()); | 660 | m_log.DebugFormat("[PROFILES]: Start PickInfoUpdate Name: {0} PickId: {1} SnapshotId: {2}", name, pickID.ToString(), snapshotID.ToString()); |
661 | UserProfilePick pick = new UserProfilePick(); | 661 | UserProfilePick pick = new UserProfilePick(); |
662 | string serverURI = string.Empty; | 662 | string serverURI = string.Empty; |
663 | bool foreign = GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 663 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
664 | ScenePresence p = FindPresence(remoteClient.AgentId); | 664 | ScenePresence p = FindPresence(remoteClient.AgentId); |
665 | 665 | ||
666 | Vector3 avaPos = p.AbsolutePosition; | 666 | Vector3 avaPos = p.AbsolutePosition; |
@@ -720,7 +720,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
720 | public void PickDelete(IClientAPI remoteClient, UUID queryPickID) | 720 | public void PickDelete(IClientAPI remoteClient, UUID queryPickID) |
721 | { | 721 | { |
722 | string serverURI = string.Empty; | 722 | string serverURI = string.Empty; |
723 | bool foreign = GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 723 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
724 | 724 | ||
725 | OSDMap parameters= new OSDMap(); | 725 | OSDMap parameters= new OSDMap(); |
726 | parameters.Add("pickId", OSD.FromUUID(queryPickID)); | 726 | parameters.Add("pickId", OSD.FromUUID(queryPickID)); |
@@ -755,7 +755,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
755 | 755 | ||
756 | IClientAPI remoteClient = (IClientAPI)sender; | 756 | IClientAPI remoteClient = (IClientAPI)sender; |
757 | string serverURI = string.Empty; | 757 | string serverURI = string.Empty; |
758 | bool foreign = GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 758 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
759 | note.TargetId = remoteClient.AgentId; | 759 | note.TargetId = remoteClient.AgentId; |
760 | UUID.TryParse(args[0], out note.UserId); | 760 | UUID.TryParse(args[0], out note.UserId); |
761 | 761 | ||
@@ -791,7 +791,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
791 | note.Notes = queryNotes; | 791 | note.Notes = queryNotes; |
792 | 792 | ||
793 | string serverURI = string.Empty; | 793 | string serverURI = string.Empty; |
794 | bool foreign = GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 794 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
795 | 795 | ||
796 | object Note = note; | 796 | object Note = note; |
797 | if(!JsonRpcRequest(ref Note, "avatar_notes_update", serverURI, UUID.Random().ToString())) | 797 | if(!JsonRpcRequest(ref Note, "avatar_notes_update", serverURI, UUID.Random().ToString())) |
@@ -836,7 +836,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
836 | prop.Language = languages; | 836 | prop.Language = languages; |
837 | 837 | ||
838 | string serverURI = string.Empty; | 838 | string serverURI = string.Empty; |
839 | bool foreign = GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 839 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
840 | 840 | ||
841 | object Param = prop; | 841 | object Param = prop; |
842 | if(!JsonRpcRequest(ref Param, "avatar_interests_update", serverURI, UUID.Random().ToString())) | 842 | if(!JsonRpcRequest(ref Param, "avatar_interests_update", serverURI, UUID.Random().ToString())) |
@@ -958,7 +958,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
958 | prop.FirstLifeText = newProfile.FirstLifeAboutText; | 958 | prop.FirstLifeText = newProfile.FirstLifeAboutText; |
959 | 959 | ||
960 | string serverURI = string.Empty; | 960 | string serverURI = string.Empty; |
961 | bool foreign = GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 961 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
962 | 962 | ||
963 | object Prop = prop; | 963 | object Prop = prop; |
964 | 964 | ||
@@ -972,7 +972,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
972 | } | 972 | } |
973 | } | 973 | } |
974 | 974 | ||
975 | |||
976 | /// <summary> | 975 | /// <summary> |
977 | /// Gets the profile data. | 976 | /// Gets the profile data. |
978 | /// </summary> | 977 | /// </summary> |
@@ -997,7 +996,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
997 | } | 996 | } |
998 | 997 | ||
999 | string serverURI = string.Empty; | 998 | string serverURI = string.Empty; |
1000 | bool foreign = GetUserProfileServerURI(properties.UserId, out serverURI); | 999 | GetUserProfileServerURI(properties.UserId, out serverURI); |
1001 | 1000 | ||
1002 | // This is checking a friend on the home grid | 1001 | // This is checking a friend on the home grid |
1003 | // Not HG friend | 1002 | // Not HG friend |
@@ -1245,11 +1244,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
1245 | return false; | 1244 | return false; |
1246 | } | 1245 | } |
1247 | 1246 | ||
1248 | byte[] buf = new byte[8192]; | ||
1249 | Stream rstream = webResponse.GetResponseStream(); | 1247 | Stream rstream = webResponse.GetResponseStream(); |
1250 | OSDMap mret = (OSDMap)OSDParser.DeserializeJson(rstream); | 1248 | OSDMap mret = (OSDMap)OSDParser.DeserializeJson(rstream); |
1251 | 1249 | ||
1252 | if(mret.ContainsKey("error")) | 1250 | if (mret.ContainsKey("error")) |
1253 | return false; | 1251 | return false; |
1254 | 1252 | ||
1255 | // get params... | 1253 | // get params... |
@@ -1311,7 +1309,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles | |||
1311 | return false; | 1309 | return false; |
1312 | } | 1310 | } |
1313 | 1311 | ||
1314 | byte[] buf = new byte[8192]; | ||
1315 | Stream rstream = webResponse.GetResponseStream(); | 1312 | Stream rstream = webResponse.GetResponseStream(); |
1316 | 1313 | ||
1317 | OSDMap response = new OSDMap(); | 1314 | OSDMap response = new OSDMap(); |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 711167f..6ff9988 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -317,7 +317,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
317 | "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2}@{3} - agent is already in transit.", | 317 | "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2}@{3} - agent is already in transit.", |
318 | sp.Name, sp.UUID, position, regionHandle); | 318 | sp.Name, sp.UUID, position, regionHandle); |
319 | 319 | ||
320 | sp.ControllingClient.SendTeleportFailed("Slow down!"); | 320 | sp.ControllingClient.SendTeleportFailed("Previous teleport process incomplete. Please retry shortly."); |
321 | |||
321 | return; | 322 | return; |
322 | } | 323 | } |
323 | 324 | ||
@@ -1034,6 +1035,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1034 | agent.SenderWantsToWaitForRoot = true; | 1035 | agent.SenderWantsToWaitForRoot = true; |
1035 | //SetCallbackURL(agent, sp.Scene.RegionInfo); | 1036 | //SetCallbackURL(agent, sp.Scene.RegionInfo); |
1036 | 1037 | ||
1038 | // Reset the do not close flag. This must be done before the destination opens child connections (here | ||
1039 | // triggered by UpdateAgent) to avoid race conditions. However, we also want to reset it as late as possible | ||
1040 | // to avoid a situation where an unexpectedly early call to Scene.NewUserConnection() wrongly results | ||
1041 | // in no close. | ||
1042 | sp.DoNotCloseAfterTeleport = false; | ||
1043 | |||
1037 | // Send the Update. If this returns true, we know the client has contacted the destination | 1044 | // Send the Update. If this returns true, we know the client has contacted the destination |
1038 | // via CompleteMovementIntoRegion, so we can let go. | 1045 | // via CompleteMovementIntoRegion, so we can let go. |
1039 | // If it returns false, something went wrong, and we need to abort. | 1046 | // If it returns false, something went wrong, and we need to abort. |
@@ -1060,6 +1067,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1060 | 1067 | ||
1061 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); | 1068 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); |
1062 | 1069 | ||
1070 | // Need to signal neighbours whether child agents may need closing irrespective of whether this | ||
1071 | // one needed closing. We also need to close child agents as quickly as possible to avoid complicated | ||
1072 | // race conditions with rapid agent releporting (e.g. from A1 to a non-neighbour B, back | ||
1073 | // to a neighbour A2 then off to a non-neighbour C). Closing child agents any later requires complex | ||
1074 | // distributed checks to avoid problems in rapid reteleporting scenarios and where child agents are | ||
1075 | // abandoned without proper close by viewer but then re-used by an incoming connection. | ||
1076 | sp.CloseChildAgents(newRegionX, newRegionY); | ||
1077 | |||
1063 | // May need to logout or other cleanup | 1078 | // May need to logout or other cleanup |
1064 | AgentHasMovedAway(sp, logout); | 1079 | AgentHasMovedAway(sp, logout); |
1065 | 1080 | ||
@@ -1069,22 +1084,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1069 | // Now let's make it officially a child agent | 1084 | // Now let's make it officially a child agent |
1070 | sp.MakeChildAgent(); | 1085 | sp.MakeChildAgent(); |
1071 | 1086 | ||
1072 | // May still need to signal neighbours whether child agents may need closing irrespective of whether this | ||
1073 | // one needed closing. Neighbour regions also contain logic to prevent a close if a subsequent move or | ||
1074 | // teleport re-established the child connection. | ||
1075 | // | ||
1076 | // It may be possible to also close child agents after a pause but one needs to be very careful about | ||
1077 | // race conditions between different regions on rapid teleporting (e.g. from A1 to a non-neighbour B, back | ||
1078 | // to a neighbour A2 then off to a non-neighbour C. Also, closing child agents early may be more compatible | ||
1079 | // with complicated scenarios where there a mixture of V1 and V2 teleports, though this is conjecture. It's | ||
1080 | // easier to close immediately and greatly reduce the scope of race conditions if possible. | ||
1081 | sp.CloseChildAgents(newRegionX, newRegionY); | ||
1082 | |||
1083 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone | 1087 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone |
1084 | if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | 1088 | if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) |
1085 | { | 1089 | { |
1086 | sp.DoNotCloseAfterTeleport = false; | ||
1087 | |||
1088 | // RED ALERT!!!! | 1090 | // RED ALERT!!!! |
1089 | // PLEASE DO NOT DECREASE THIS WAIT TIME UNDER ANY CIRCUMSTANCES. | 1091 | // PLEASE DO NOT DECREASE THIS WAIT TIME UNDER ANY CIRCUMSTANCES. |
1090 | // THE VIEWERS SEEM TO NEED SOME TIME AFTER RECEIVING MoveAgentIntoRegion | 1092 | // THE VIEWERS SEEM TO NEED SOME TIME AFTER RECEIVING MoveAgentIntoRegion |
@@ -1093,17 +1095,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1093 | // IN THE AVIE BEING PLACED IN INFINITY FOR A COUPLE OF SECONDS. | 1095 | // IN THE AVIE BEING PLACED IN INFINITY FOR A COUPLE OF SECONDS. |
1094 | Thread.Sleep(15000); | 1096 | Thread.Sleep(15000); |
1095 | 1097 | ||
1096 | if (!sp.DoNotCloseAfterTeleport) | 1098 | // OK, it got this agent. Let's close everything |
1097 | { | 1099 | // If we shouldn't close the agent due to some other region renewing the connection |
1098 | // OK, it got this agent. Let's close everything | 1100 | // then this will be handled in IncomingCloseAgent under lock conditions |
1099 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Closing agent {0} in {1}", sp.Name, Scene.Name); | 1101 | m_log.DebugFormat( |
1100 | sp.Scene.IncomingCloseAgent(sp.UUID, false); | 1102 | "[ENTITY TRANSFER MODULE]: Closing agent {0} in {1} after teleport", sp.Name, Scene.Name); |
1101 | } | 1103 | sp.Scene.IncomingCloseAgent(sp.UUID, false); |
1102 | else | ||
1103 | { | ||
1104 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Not closing agent {0}, user is back in {1}", sp.Name, Scene.Name); | ||
1105 | sp.DoNotCloseAfterTeleport = false; | ||
1106 | } | ||
1107 | } | 1104 | } |
1108 | else | 1105 | else |
1109 | { | 1106 | { |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 4fa4a7c..56bdc63 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -3862,21 +3862,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
3862 | // In the case where, for example, an A B C D region layout, an avatar may | 3862 | // In the case where, for example, an A B C D region layout, an avatar may |
3863 | // teleport from A -> D, but then -> C before A has asked B to close its old child agent. When C | 3863 | // teleport from A -> D, but then -> C before A has asked B to close its old child agent. When C |
3864 | // renews the lease on the child agent at B, we must make sure that the close from A does not succeed. | 3864 | // renews the lease on the child agent at B, we must make sure that the close from A does not succeed. |
3865 | if (!acd.ChildrenCapSeeds.ContainsKey(RegionInfo.RegionHandle)) | 3865 | // |
3866 | { | 3866 | // XXX: In the end, this should not be necessary if child agents are closed without delay on |
3867 | m_log.DebugFormat( | 3867 | // teleport, since realistically, the close request should always be processed before any other |
3868 | "[SCENE]: Setting DoNotCloseAfterTeleport for child scene presence {0} in {1} because source will attempt close.", | 3868 | // region tried to re-establish a child agent. This is much simpler since the logic below is |
3869 | sp.Name, Name); | 3869 | // vulnerable to an issue when a viewer quits a region without sending a proper logout but then |
3870 | // re-establishes the connection on a relogin. This could wrongly set the DoNotCloseAfterTeleport | ||
3871 | // flag when no teleport had taken place (and hence no close was going to come). | ||
3872 | // if (!acd.ChildrenCapSeeds.ContainsKey(RegionInfo.RegionHandle)) | ||
3873 | // { | ||
3874 | // m_log.DebugFormat( | ||
3875 | // "[SCENE]: Setting DoNotCloseAfterTeleport for child scene presence {0} in {1} because source will attempt close.", | ||
3876 | // sp.Name, Name); | ||
3877 | // | ||
3878 | // sp.DoNotCloseAfterTeleport = true; | ||
3879 | // } | ||
3880 | // else if (EntityTransferModule.IsInTransit(sp.UUID)) | ||
3870 | 3881 | ||
3871 | sp.DoNotCloseAfterTeleport = true; | 3882 | if (EntityTransferModule.IsInTransit(sp.UUID)) |
3872 | } | ||
3873 | else if (EntityTransferModule.IsInTransit(sp.UUID)) | ||
3874 | { | 3883 | { |
3884 | sp.DoNotCloseAfterTeleport = true; | ||
3885 | |||
3875 | m_log.DebugFormat( | 3886 | m_log.DebugFormat( |
3876 | "[SCENE]: Setting DoNotCloseAfterTeleport for child scene presence {0} in {1} because this region will attempt previous end-of-teleport close.", | 3887 | "[SCENE]: Set DoNotCloseAfterTeleport for child scene presence {0} in {1} because this region will attempt end-of-teleport close from a previous close.", |
3877 | sp.Name, Name); | 3888 | sp.Name, Name); |
3878 | |||
3879 | sp.DoNotCloseAfterTeleport = true; | ||
3880 | } | 3889 | } |
3881 | } | 3890 | } |
3882 | } | 3891 | } |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 5301a82..3f4979e 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -223,7 +223,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
223 | private float m_sitAvatarHeight = 2.0f; | 223 | private float m_sitAvatarHeight = 2.0f; |
224 | 224 | ||
225 | private Vector3 m_lastChildAgentUpdatePosition; | 225 | private Vector3 m_lastChildAgentUpdatePosition; |
226 | private Vector3 m_lastChildAgentUpdateCamPosition; | 226 | // private Vector3 m_lastChildAgentUpdateCamPosition; |
227 | 227 | ||
228 | private const int LAND_VELOCITYMAG_MAX = 12; | 228 | private const int LAND_VELOCITYMAG_MAX = 12; |
229 | 229 | ||
@@ -2108,8 +2108,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2108 | if (m_movementUpdateCount < 1) | 2108 | if (m_movementUpdateCount < 1) |
2109 | m_movementUpdateCount = 1; | 2109 | m_movementUpdateCount = 1; |
2110 | 2110 | ||
2111 | 2111 | // AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags; | |
2112 | AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags; | ||
2113 | 2112 | ||
2114 | // Camera location in world. We'll need to raytrace | 2113 | // Camera location in world. We'll need to raytrace |
2115 | // from this location from time to time. | 2114 | // from this location from time to time. |
@@ -3241,7 +3240,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3241 | if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance) | 3240 | if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance) |
3242 | { | 3241 | { |
3243 | m_lastChildAgentUpdatePosition = AbsolutePosition; | 3242 | m_lastChildAgentUpdatePosition = AbsolutePosition; |
3244 | m_lastChildAgentUpdateCamPosition = CameraPosition; | 3243 | // m_lastChildAgentUpdateCamPosition = CameraPosition; |
3245 | 3244 | ||
3246 | ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); | 3245 | ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); |
3247 | cadu.ActiveGroupID = UUID.Zero.Guid; | 3246 | cadu.ActiveGroupID = UUID.Zero.Guid; |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs index d670dad..5b5fb92 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs | |||
@@ -147,7 +147,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
147 | AgentCircuitData acd = SceneHelpers.GenerateAgentData(uaB); | 147 | AgentCircuitData acd = SceneHelpers.GenerateAgentData(uaB); |
148 | TestClient clientB = new TestClient(acd, sceneB); | 148 | TestClient clientB = new TestClient(acd, sceneB); |
149 | List<TestClient> childClientsB = new List<TestClient>(); | 149 | List<TestClient> childClientsB = new List<TestClient>(); |
150 | EntityTransferHelpers.SetUpInformClientOfNeighbour(clientB, childClientsB); | 150 | EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(clientB, childClientsB); |
151 | 151 | ||
152 | SceneHelpers.AddScenePresence(sceneB, clientB, acd); | 152 | SceneHelpers.AddScenePresence(sceneB, clientB, acd); |
153 | 153 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs index 5df9aba..12a778b 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs | |||
@@ -97,7 +97,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
97 | AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); | 97 | AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); |
98 | TestClient tc = new TestClient(acd, sceneA); | 98 | TestClient tc = new TestClient(acd, sceneA); |
99 | List<TestClient> destinationTestClients = new List<TestClient>(); | 99 | List<TestClient> destinationTestClients = new List<TestClient>(); |
100 | EntityTransferHelpers.SetUpInformClientOfNeighbour(tc, destinationTestClients); | 100 | EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients); |
101 | 101 | ||
102 | ScenePresence originalSp = SceneHelpers.AddScenePresence(sceneA, tc, acd); | 102 | ScenePresence originalSp = SceneHelpers.AddScenePresence(sceneA, tc, acd); |
103 | originalSp.AbsolutePosition = new Vector3(128, 32, 10); | 103 | originalSp.AbsolutePosition = new Vector3(128, 32, 10); |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index afd2779..8c25dbc 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs | |||
@@ -30,6 +30,7 @@ using System.Collections.Generic; | |||
30 | using System.IO; | 30 | using System.IO; |
31 | using System.Net; | 31 | using System.Net; |
32 | using System.Text; | 32 | using System.Text; |
33 | using System.Threading; | ||
33 | using Nini.Config; | 34 | using Nini.Config; |
34 | using NUnit.Framework; | 35 | using NUnit.Framework; |
35 | using OpenMetaverse; | 36 | using OpenMetaverse; |
@@ -107,7 +108,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
107 | } | 108 | } |
108 | 109 | ||
109 | [Test] | 110 | [Test] |
110 | public void TestSameSimulatorIsolatedRegions() | 111 | public void TestSameSimulatorIsolatedRegionsV1() |
111 | { | 112 | { |
112 | TestHelpers.InMethod(); | 113 | TestHelpers.InMethod(); |
113 | // TestHelpers.EnableLogging(); | 114 | // TestHelpers.EnableLogging(); |
@@ -146,7 +147,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
146 | sp.AbsolutePosition = new Vector3(30, 31, 32); | 147 | sp.AbsolutePosition = new Vector3(30, 31, 32); |
147 | 148 | ||
148 | List<TestClient> destinationTestClients = new List<TestClient>(); | 149 | List<TestClient> destinationTestClients = new List<TestClient>(); |
149 | EntityTransferHelpers.SetUpInformClientOfNeighbour((TestClient)sp.ControllingClient, destinationTestClients); | 150 | EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate( |
151 | (TestClient)sp.ControllingClient, destinationTestClients); | ||
150 | 152 | ||
151 | sceneA.RequestTeleportLocation( | 153 | sceneA.RequestTeleportLocation( |
152 | sp.ControllingClient, | 154 | sp.ControllingClient, |
@@ -179,6 +181,67 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
179 | // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); | 181 | // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); |
180 | } | 182 | } |
181 | 183 | ||
184 | [Test] | ||
185 | public void TestSameSimulatorIsolatedRegionsV2() | ||
186 | { | ||
187 | TestHelpers.InMethod(); | ||
188 | // TestHelpers.EnableLogging(); | ||
189 | |||
190 | UUID userId = TestHelpers.ParseTail(0x1); | ||
191 | |||
192 | EntityTransferModule etmA = new EntityTransferModule(); | ||
193 | EntityTransferModule etmB = new EntityTransferModule(); | ||
194 | LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); | ||
195 | |||
196 | IConfigSource config = new IniConfigSource(); | ||
197 | IConfig modulesConfig = config.AddConfig("Modules"); | ||
198 | modulesConfig.Set("EntityTransferModule", etmA.Name); | ||
199 | modulesConfig.Set("SimulationServices", lscm.Name); | ||
200 | |||
201 | SceneHelpers sh = new SceneHelpers(); | ||
202 | TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); | ||
203 | TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); | ||
204 | |||
205 | SceneHelpers.SetupSceneModules(sceneA, config, etmA); | ||
206 | SceneHelpers.SetupSceneModules(sceneB, config, etmB); | ||
207 | SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); | ||
208 | |||
209 | Vector3 teleportPosition = new Vector3(10, 11, 12); | ||
210 | Vector3 teleportLookAt = new Vector3(20, 21, 22); | ||
211 | |||
212 | ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId); | ||
213 | sp.AbsolutePosition = new Vector3(30, 31, 32); | ||
214 | |||
215 | List<TestClient> destinationTestClients = new List<TestClient>(); | ||
216 | EntityTransferHelpers.SetupSendRegionTeleportTriggersDestinationClientCreateAndCompleteMovement( | ||
217 | (TestClient)sp.ControllingClient, destinationTestClients); | ||
218 | |||
219 | sceneA.RequestTeleportLocation( | ||
220 | sp.ControllingClient, | ||
221 | sceneB.RegionInfo.RegionHandle, | ||
222 | teleportPosition, | ||
223 | teleportLookAt, | ||
224 | (uint)TeleportFlags.ViaLocation); | ||
225 | |||
226 | Assert.That(sceneA.GetScenePresence(userId), Is.Null); | ||
227 | |||
228 | ScenePresence sceneBSp = sceneB.GetScenePresence(userId); | ||
229 | Assert.That(sceneBSp, Is.Not.Null); | ||
230 | Assert.That(sceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName)); | ||
231 | Assert.That(sceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition)); | ||
232 | |||
233 | Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(0)); | ||
234 | Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(0)); | ||
235 | Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(1)); | ||
236 | Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0)); | ||
237 | |||
238 | // TODO: Add assertions to check correct circuit details in both scenes. | ||
239 | |||
240 | // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera | ||
241 | // position instead). | ||
242 | // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); | ||
243 | } | ||
244 | |||
182 | /// <summary> | 245 | /// <summary> |
183 | /// Test teleport procedures when the target simulator returns false when queried about access. | 246 | /// Test teleport procedures when the target simulator returns false when queried about access. |
184 | /// </summary> | 247 | /// </summary> |
@@ -428,7 +491,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
428 | } | 491 | } |
429 | 492 | ||
430 | [Test] | 493 | [Test] |
431 | public void TestSameSimulatorNeighbouringRegions() | 494 | public void TestSameSimulatorNeighbouringRegionsV1() |
432 | { | 495 | { |
433 | TestHelpers.InMethod(); | 496 | TestHelpers.InMethod(); |
434 | // TestHelpers.EnableLogging(); | 497 | // TestHelpers.EnableLogging(); |
@@ -466,7 +529,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
466 | AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); | 529 | AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); |
467 | TestClient tc = new TestClient(acd, sceneA); | 530 | TestClient tc = new TestClient(acd, sceneA); |
468 | List<TestClient> destinationTestClients = new List<TestClient>(); | 531 | List<TestClient> destinationTestClients = new List<TestClient>(); |
469 | EntityTransferHelpers.SetUpInformClientOfNeighbour(tc, destinationTestClients); | 532 | EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients); |
470 | 533 | ||
471 | ScenePresence beforeSceneASp = SceneHelpers.AddScenePresence(sceneA, tc, acd); | 534 | ScenePresence beforeSceneASp = SceneHelpers.AddScenePresence(sceneA, tc, acd); |
472 | beforeSceneASp.AbsolutePosition = new Vector3(30, 31, 32); | 535 | beforeSceneASp.AbsolutePosition = new Vector3(30, 31, 32); |
@@ -512,5 +575,89 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
512 | 575 | ||
513 | // TestHelpers.DisableLogging(); | 576 | // TestHelpers.DisableLogging(); |
514 | } | 577 | } |
578 | |||
579 | [Test] | ||
580 | public void TestSameSimulatorNeighbouringRegionsV2() | ||
581 | { | ||
582 | TestHelpers.InMethod(); | ||
583 | // TestHelpers.EnableLogging(); | ||
584 | |||
585 | UUID userId = TestHelpers.ParseTail(0x1); | ||
586 | |||
587 | EntityTransferModule etmA = new EntityTransferModule(); | ||
588 | EntityTransferModule etmB = new EntityTransferModule(); | ||
589 | LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); | ||
590 | |||
591 | IConfigSource config = new IniConfigSource(); | ||
592 | IConfig modulesConfig = config.AddConfig("Modules"); | ||
593 | modulesConfig.Set("EntityTransferModule", etmA.Name); | ||
594 | modulesConfig.Set("SimulationServices", lscm.Name); | ||
595 | |||
596 | SceneHelpers sh = new SceneHelpers(); | ||
597 | TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); | ||
598 | TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1001, 1000); | ||
599 | |||
600 | SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); | ||
601 | SceneHelpers.SetupSceneModules(sceneA, config, new CapabilitiesModule(), etmA); | ||
602 | SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB); | ||
603 | |||
604 | Vector3 teleportPosition = new Vector3(10, 11, 12); | ||
605 | Vector3 teleportLookAt = new Vector3(20, 21, 22); | ||
606 | |||
607 | AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); | ||
608 | TestClient tc = new TestClient(acd, sceneA); | ||
609 | List<TestClient> destinationTestClients = new List<TestClient>(); | ||
610 | EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients); | ||
611 | |||
612 | ScenePresence beforeSceneASp = SceneHelpers.AddScenePresence(sceneA, tc, acd); | ||
613 | beforeSceneASp.AbsolutePosition = new Vector3(30, 31, 32); | ||
614 | |||
615 | Assert.That(beforeSceneASp, Is.Not.Null); | ||
616 | Assert.That(beforeSceneASp.IsChildAgent, Is.False); | ||
617 | |||
618 | ScenePresence beforeSceneBSp = sceneB.GetScenePresence(userId); | ||
619 | Assert.That(beforeSceneBSp, Is.Not.Null); | ||
620 | Assert.That(beforeSceneBSp.IsChildAgent, Is.True); | ||
621 | |||
622 | // Here, we need to make clientA's receipt of SendRegionTeleport trigger clientB's CompleteMovement(). This | ||
623 | // is to operate the teleport V2 mechanism where the EntityTransferModule will first request the client to | ||
624 | // CompleteMovement to the region and then call UpdateAgent to the destination region to confirm the receipt | ||
625 | // Both these operations will occur on different threads and will wait for each other. | ||
626 | // We have to do this via ThreadPool directly since FireAndForget has been switched to sync for the V1 | ||
627 | // test protocol, where we are trying to avoid unpredictable async operations in regression tests. | ||
628 | tc.OnTestClientSendRegionTeleport | ||
629 | += (regionHandle, simAccess, regionExternalEndPoint, locationID, flags, capsURL) | ||
630 | => ThreadPool.UnsafeQueueUserWorkItem(o => destinationTestClients[0].CompleteMovement(), null); | ||
631 | |||
632 | sceneA.RequestTeleportLocation( | ||
633 | beforeSceneASp.ControllingClient, | ||
634 | sceneB.RegionInfo.RegionHandle, | ||
635 | teleportPosition, | ||
636 | teleportLookAt, | ||
637 | (uint)TeleportFlags.ViaLocation); | ||
638 | |||
639 | ScenePresence afterSceneASp = sceneA.GetScenePresence(userId); | ||
640 | Assert.That(afterSceneASp, Is.Not.Null); | ||
641 | Assert.That(afterSceneASp.IsChildAgent, Is.True); | ||
642 | |||
643 | ScenePresence afterSceneBSp = sceneB.GetScenePresence(userId); | ||
644 | Assert.That(afterSceneBSp, Is.Not.Null); | ||
645 | Assert.That(afterSceneBSp.IsChildAgent, Is.False); | ||
646 | Assert.That(afterSceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName)); | ||
647 | Assert.That(afterSceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition)); | ||
648 | |||
649 | Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(0)); | ||
650 | Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(1)); | ||
651 | Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(1)); | ||
652 | Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0)); | ||
653 | |||
654 | // TODO: Add assertions to check correct circuit details in both scenes. | ||
655 | |||
656 | // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera | ||
657 | // position instead). | ||
658 | // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); | ||
659 | |||
660 | // TestHelpers.DisableLogging(); | ||
661 | } | ||
515 | } | 662 | } |
516 | } \ No newline at end of file | 663 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs index 5f232a4..68bc1b9 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs | |||
@@ -69,7 +69,9 @@ public class BSActorAvatarMove : BSActor | |||
69 | // BSActor.Dispose() | 69 | // BSActor.Dispose() |
70 | public override void Dispose() | 70 | public override void Dispose() |
71 | { | 71 | { |
72 | Enabled = false; | 72 | base.SetEnabled(false); |
73 | // Now that turned off, remove any state we have in the scene. | ||
74 | Refresh(); | ||
73 | } | 75 | } |
74 | 76 | ||
75 | // Called when physical parameters (properties set in Bullet) need to be re-applied. | 77 | // Called when physical parameters (properties set in Bullet) need to be re-applied. |
@@ -181,7 +183,7 @@ public class BSActorAvatarMove : BSActor | |||
181 | if (m_controllingPrim.IsColliding) | 183 | if (m_controllingPrim.IsColliding) |
182 | { | 184 | { |
183 | // If we are colliding with a stationary object, presume we're standing and don't move around | 185 | // If we are colliding with a stationary object, presume we're standing and don't move around |
184 | if (!m_controllingPrim.ColliderIsMoving) | 186 | if (!m_controllingPrim.ColliderIsMoving && !m_controllingPrim.ColliderIsVolumeDetect) |
185 | { | 187 | { |
186 | m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID); | 188 | m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID); |
187 | m_controllingPrim.IsStationary = true; | 189 | m_controllingPrim.IsStationary = true; |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index 502f85f..291dfcd 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -107,6 +107,8 @@ public sealed class BSCharacter : BSPhysObject | |||
107 | PhysicalActors.Add(AvatarMoveActorName, m_moveActor); | 107 | PhysicalActors.Add(AvatarMoveActorName, m_moveActor); |
108 | 108 | ||
109 | SetPhysicalProperties(); | 109 | SetPhysicalProperties(); |
110 | |||
111 | IsInitialized = true; | ||
110 | }); | 112 | }); |
111 | return; | 113 | return; |
112 | } | 114 | } |
@@ -114,6 +116,8 @@ public sealed class BSCharacter : BSPhysObject | |||
114 | // called when this character is being destroyed and the resources should be released | 116 | // called when this character is being destroyed and the resources should be released |
115 | public override void Destroy() | 117 | public override void Destroy() |
116 | { | 118 | { |
119 | IsInitialized = false; | ||
120 | |||
117 | base.Destroy(); | 121 | base.Destroy(); |
118 | 122 | ||
119 | DetailLog("{0},BSCharacter.Destroy", LocalID); | 123 | DetailLog("{0},BSCharacter.Destroy", LocalID); |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs index 27caf62..9dc52d5 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs | |||
@@ -72,6 +72,8 @@ public abstract class BSPhysObject : PhysicsActor | |||
72 | } | 72 | } |
73 | protected BSPhysObject(BSScene parentScene, uint localID, string name, string typeName) | 73 | protected BSPhysObject(BSScene parentScene, uint localID, string name, string typeName) |
74 | { | 74 | { |
75 | IsInitialized = false; | ||
76 | |||
75 | PhysScene = parentScene; | 77 | PhysScene = parentScene; |
76 | LocalID = localID; | 78 | LocalID = localID; |
77 | PhysObjectName = name; | 79 | PhysObjectName = name; |
@@ -130,6 +132,9 @@ public abstract class BSPhysObject : PhysicsActor | |||
130 | public string PhysObjectName { get; protected set; } | 132 | public string PhysObjectName { get; protected set; } |
131 | public string TypeName { get; protected set; } | 133 | public string TypeName { get; protected set; } |
132 | 134 | ||
135 | // Set to 'true' when the object is completely initialized. | ||
136 | // This mostly prevents property updates and collisions until the object is completely here. | ||
137 | public bool IsInitialized { get; protected set; } | ||
133 | 138 | ||
134 | // Return the object mass without calculating it or having side effects | 139 | // Return the object mass without calculating it or having side effects |
135 | public abstract float RawMass { get; } | 140 | public abstract float RawMass { get; } |
@@ -352,6 +357,8 @@ public abstract class BSPhysObject : PhysicsActor | |||
352 | // On a collision, check the collider and remember if the last collider was moving | 357 | // On a collision, check the collider and remember if the last collider was moving |
353 | // Used to modify the standing of avatars (avatars on stationary things stand still) | 358 | // Used to modify the standing of avatars (avatars on stationary things stand still) |
354 | public bool ColliderIsMoving; | 359 | public bool ColliderIsMoving; |
360 | // 'true' if the last collider was a volume detect object | ||
361 | public bool ColliderIsVolumeDetect; | ||
355 | // Used by BSCharacter to manage standing (and not slipping) | 362 | // Used by BSCharacter to manage standing (and not slipping) |
356 | public bool IsStationary; | 363 | public bool IsStationary; |
357 | 364 | ||
@@ -431,6 +438,7 @@ public abstract class BSPhysObject : PhysicsActor | |||
431 | 438 | ||
432 | // For movement tests, remember if we are colliding with an object that is moving. | 439 | // For movement tests, remember if we are colliding with an object that is moving. |
433 | ColliderIsMoving = collidee != null ? (collidee.RawVelocity != OMV.Vector3.Zero) : false; | 440 | ColliderIsMoving = collidee != null ? (collidee.RawVelocity != OMV.Vector3.Zero) : false; |
441 | ColliderIsVolumeDetect = collidee != null ? (collidee.IsVolumeDetect) : false; | ||
434 | 442 | ||
435 | // Make a collection of the collisions that happened the last simulation tick. | 443 | // Make a collection of the collisions that happened the last simulation tick. |
436 | // This is different than the collection created for sending up to the simulator as it is cleared every tick. | 444 | // This is different than the collection created for sending up to the simulator as it is cleared every tick. |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 6b5dea3..d5b999d 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -110,6 +110,8 @@ public class BSPrim : BSPhysObject | |||
110 | CreateGeomAndObject(true); | 110 | CreateGeomAndObject(true); |
111 | 111 | ||
112 | CurrentCollisionFlags = PhysScene.PE.GetCollisionFlags(PhysBody); | 112 | CurrentCollisionFlags = PhysScene.PE.GetCollisionFlags(PhysBody); |
113 | |||
114 | IsInitialized = true; | ||
113 | }); | 115 | }); |
114 | } | 116 | } |
115 | 117 | ||
@@ -117,6 +119,8 @@ public class BSPrim : BSPhysObject | |||
117 | public override void Destroy() | 119 | public override void Destroy() |
118 | { | 120 | { |
119 | // m_log.DebugFormat("{0}: Destroy, id={1}", LogHeader, LocalID); | 121 | // m_log.DebugFormat("{0}: Destroy, id={1}", LogHeader, LocalID); |
122 | IsInitialized = false; | ||
123 | |||
120 | base.Destroy(); | 124 | base.Destroy(); |
121 | 125 | ||
122 | // Undo any vehicle properties | 126 | // Undo any vehicle properties |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs index 79ac5a5..88d50b4 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | |||
@@ -639,7 +639,8 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters | |||
639 | BSPhysObject pobj; | 639 | BSPhysObject pobj; |
640 | if (PhysObjects.TryGetValue(entprop.ID, out pobj)) | 640 | if (PhysObjects.TryGetValue(entprop.ID, out pobj)) |
641 | { | 641 | { |
642 | pobj.UpdateProperties(entprop); | 642 | if (pobj.IsInitialized) |
643 | pobj.UpdateProperties(entprop); | ||
643 | } | 644 | } |
644 | } | 645 | } |
645 | } | 646 | } |
@@ -766,10 +767,13 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters | |||
766 | 767 | ||
767 | // DetailLog("{0},BSScene.SendCollision,collide,id={1},with={2}", DetailLogZero, localID, collidingWith); | 768 | // DetailLog("{0},BSScene.SendCollision,collide,id={1},with={2}", DetailLogZero, localID, collidingWith); |
768 | 769 | ||
769 | if (collider.Collide(collidingWith, collidee, collidePoint, collideNormal, penetration)) | 770 | if (collider.IsInitialized) |
770 | { | 771 | { |
771 | // If a collision was 'good', remember to send it to the simulator | 772 | if (collider.Collide(collidingWith, collidee, collidePoint, collideNormal, penetration)) |
772 | ObjectsWithCollisions.Add(collider); | 773 | { |
774 | // If a collision was 'good', remember to send it to the simulator | ||
775 | ObjectsWithCollisions.Add(collider); | ||
776 | } | ||
773 | } | 777 | } |
774 | 778 | ||
775 | return; | 779 | return; |
diff --git a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs index f37f2f1..04bb9e8 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs | |||
@@ -85,7 +85,7 @@ namespace OpenSim.Server.Handlers.Hypergrid | |||
85 | data.destinationServerURI = args["destination_serveruri"]; | 85 | data.destinationServerURI = args["destination_serveruri"]; |
86 | 86 | ||
87 | } | 87 | } |
88 | catch (InvalidCastException e) | 88 | catch (InvalidCastException) |
89 | { | 89 | { |
90 | m_log.ErrorFormat("[HOME AGENT HANDLER]: Bad cast in UnpackData"); | 90 | m_log.ErrorFormat("[HOME AGENT HANDLER]: Bad cast in UnpackData"); |
91 | } | 91 | } |
diff --git a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs index d9c1bd3..7137836 100644 --- a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs | |||
@@ -453,7 +453,6 @@ namespace OpenSim.Server.Handlers.Hypergrid | |||
453 | XmlRpcResponse response = new XmlRpcResponse(); | 453 | XmlRpcResponse response = new XmlRpcResponse(); |
454 | response.Value = hash; | 454 | response.Value = hash; |
455 | return response; | 455 | return response; |
456 | |||
457 | } | 456 | } |
458 | 457 | ||
459 | /// <summary> | 458 | /// <summary> |
@@ -471,9 +470,7 @@ namespace OpenSim.Server.Handlers.Hypergrid | |||
471 | //string portstr = (string)requestData["port"]; | 470 | //string portstr = (string)requestData["port"]; |
472 | if (requestData.ContainsKey("first") && requestData.ContainsKey("last")) | 471 | if (requestData.ContainsKey("first") && requestData.ContainsKey("last")) |
473 | { | 472 | { |
474 | UUID userID = UUID.Zero; | ||
475 | string first = (string)requestData["first"]; | 473 | string first = (string)requestData["first"]; |
476 | |||
477 | string last = (string)requestData["last"]; | 474 | string last = (string)requestData["last"]; |
478 | UUID uuid = m_HomeUsersService.GetUUID(first, last); | 475 | UUID uuid = m_HomeUsersService.GetUUID(first, last); |
479 | hash["UUID"] = uuid.ToString(); | 476 | hash["UUID"] = uuid.ToString(); |
@@ -482,7 +479,6 @@ namespace OpenSim.Server.Handlers.Hypergrid | |||
482 | XmlRpcResponse response = new XmlRpcResponse(); | 479 | XmlRpcResponse response = new XmlRpcResponse(); |
483 | response.Value = hash; | 480 | response.Value = hash; |
484 | return response; | 481 | return response; |
485 | |||
486 | } | 482 | } |
487 | } | 483 | } |
488 | } | 484 | } \ No newline at end of file |
diff --git a/OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs b/OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs index f9a520a..28dbbc2 100644 --- a/OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs +++ b/OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs | |||
@@ -39,8 +39,7 @@ namespace OpenSim.Server.Handlers.Profiles | |||
39 | { | 39 | { |
40 | public class UserProfilesConnector: ServiceConnector | 40 | public class UserProfilesConnector: ServiceConnector |
41 | { | 41 | { |
42 | static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 42 | // static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
43 | |||
44 | 43 | ||
45 | // Our Local Module | 44 | // Our Local Module |
46 | public IUserProfilesService ServiceModule | 45 | public IUserProfilesService ServiceModule |
@@ -110,5 +109,4 @@ namespace OpenSim.Server.Handlers.Profiles | |||
110 | Server.AddJsonRPCHandler("user_data_update", handler.UpdateUserAppData); | 109 | Server.AddJsonRPCHandler("user_data_update", handler.UpdateUserAppData); |
111 | } | 110 | } |
112 | } | 111 | } |
113 | } | 112 | } \ No newline at end of file |
114 | |||
diff --git a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs index b36fa23..245703c 100644 --- a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs +++ b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs | |||
@@ -98,7 +98,7 @@ namespace OpenSim.Services.Connectors | |||
98 | catch (Exception e) | 98 | catch (Exception e) |
99 | { | 99 | { |
100 | m_log.WarnFormat( | 100 | m_log.WarnFormat( |
101 | "[NEIGHBOUR SERVICE CONNCTOR]: Unable to parse uri {0} to send HelloNeighbour from {1} to {2}. Exception {3}{4}", | 101 | "[NEIGHBOUR SERVICES CONNECTOR]: Unable to parse uri {0} to send HelloNeighbour from {1} to {2}. Exception {3}{4}", |
102 | uri, thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); | 102 | uri, thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); |
103 | 103 | ||
104 | return false; | 104 | return false; |
@@ -117,7 +117,7 @@ namespace OpenSim.Services.Connectors | |||
117 | catch (Exception e) | 117 | catch (Exception e) |
118 | { | 118 | { |
119 | m_log.WarnFormat( | 119 | m_log.WarnFormat( |
120 | "[NEIGHBOUR SERVICE CONNCTOR]: PackRegionInfoData failed for HelloNeighbour from {0} to {1}. Exception {2}{3}", | 120 | "[NEIGHBOUR SERVICES CONNECTOR]: PackRegionInfoData failed for HelloNeighbour from {0} to {1}. Exception {2}{3}", |
121 | thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); | 121 | thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); |
122 | 122 | ||
123 | return false; | 123 | return false; |
@@ -137,7 +137,7 @@ namespace OpenSim.Services.Connectors | |||
137 | catch (Exception e) | 137 | catch (Exception e) |
138 | { | 138 | { |
139 | m_log.WarnFormat( | 139 | m_log.WarnFormat( |
140 | "[NEIGHBOUR SERVICE CONNCTOR]: Exception thrown on serialization of HelloNeighbour from {0} to {1}. Exception {2}{3}", | 140 | "[NEIGHBOUR SERVICES CONNECTOR]: Exception thrown on serialization of HelloNeighbour from {0} to {1}. Exception {2}{3}", |
141 | thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); | 141 | thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); |
142 | 142 | ||
143 | return false; | 143 | return false; |
@@ -175,7 +175,7 @@ namespace OpenSim.Services.Connectors | |||
175 | if (webResponse == null) | 175 | if (webResponse == null) |
176 | { | 176 | { |
177 | m_log.DebugFormat( | 177 | m_log.DebugFormat( |
178 | "[REST COMMS]: Null reply on DoHelloNeighbourCall post from {0} to {1}", | 178 | "[NEIGHBOUR SERVICES CONNECTOR]: Null reply on DoHelloNeighbourCall post from {0} to {1}", |
179 | thisRegion.RegionName, region.RegionName); | 179 | thisRegion.RegionName, region.RegionName); |
180 | } | 180 | } |
181 | 181 | ||
@@ -193,7 +193,7 @@ namespace OpenSim.Services.Connectors | |||
193 | catch (Exception e) | 193 | catch (Exception e) |
194 | { | 194 | { |
195 | m_log.WarnFormat( | 195 | m_log.WarnFormat( |
196 | "[NEIGHBOUR SERVICE CONNCTOR]: Exception on reply of DoHelloNeighbourCall from {0} back to {1}. Exception {2}{3}", | 196 | "[NEIGHBOUR SERVICES CONNECTOR]: Exception on reply of DoHelloNeighbourCall from {0} back to {1}. Exception {2}{3}", |
197 | region.RegionName, thisRegion.RegionName, e.Message, e.StackTrace); | 197 | region.RegionName, thisRegion.RegionName, e.Message, e.StackTrace); |
198 | 198 | ||
199 | return false; | 199 | return false; |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianExternalCapsModule.cs b/OpenSim/Services/Connectors/SimianGrid/SimianExternalCapsModule.cs index e85b0b7..764e71f 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianExternalCapsModule.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianExternalCapsModule.cs | |||
@@ -56,11 +56,8 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
56 | private Scene m_scene; | 56 | private Scene m_scene; |
57 | private String m_simianURL; | 57 | private String m_simianURL; |
58 | 58 | ||
59 | private IGridUserService m_GridUserService; | ||
60 | |||
61 | #region IRegionModule Members | 59 | #region IRegionModule Members |
62 | 60 | ||
63 | |||
64 | public string Name | 61 | public string Name |
65 | { | 62 | { |
66 | get { return this.GetType().Name; } | 63 | get { return this.GetType().Name; } |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs index e7d2f86..9898da9 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs | |||
@@ -29,11 +29,9 @@ using System; | |||
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Collections.Specialized; | 30 | using System.Collections.Specialized; |
31 | using System.Reflection; | 31 | using System.Reflection; |
32 | |||
33 | using log4net; | 32 | using log4net; |
34 | using Mono.Addins; | 33 | using Mono.Addins; |
35 | using Nini.Config; | 34 | using Nini.Config; |
36 | |||
37 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
38 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
39 | using OpenSim.Region.Framework.Scenes; | 37 | using OpenSim.Region.Framework.Scenes; |
@@ -52,7 +50,6 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
52 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
53 | 51 | ||
54 | private IConfig m_config = null; | 52 | private IConfig m_config = null; |
55 | private bool m_enabled = true; | ||
56 | 53 | ||
57 | private String m_simianURL; | 54 | private String m_simianURL; |
58 | 55 | ||
@@ -62,7 +59,6 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
62 | { | 59 | { |
63 | get { return this.GetType().Name; } | 60 | get { return this.GetType().Name; } |
64 | } | 61 | } |
65 | |||
66 | 62 | ||
67 | public void Initialise(IConfigSource config) | 63 | public void Initialise(IConfigSource config) |
68 | { | 64 | { |
@@ -76,7 +72,6 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
76 | if (String.IsNullOrEmpty(m_simianURL)) | 72 | if (String.IsNullOrEmpty(m_simianURL)) |
77 | { | 73 | { |
78 | // m_log.DebugFormat("[SimianGrid] service URL is not defined"); | 74 | // m_log.DebugFormat("[SimianGrid] service URL is not defined"); |
79 | m_enabled = false; | ||
80 | return; | 75 | return; |
81 | } | 76 | } |
82 | 77 | ||
@@ -141,6 +136,7 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
141 | } | 136 | } |
142 | 137 | ||
143 | #endregion | 138 | #endregion |
139 | |||
144 | public static String SimulatorCapability = UUID.Zero.ToString(); | 140 | public static String SimulatorCapability = UUID.Zero.ToString(); |
145 | public static OSDMap PostToService(string url, NameValueCollection data) | 141 | public static OSDMap PostToService(string url, NameValueCollection data) |
146 | { | 142 | { |
@@ -148,4 +144,4 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
148 | return WebUtil.PostToService(url, data); | 144 | return WebUtil.PostToService(url, data); |
149 | } | 145 | } |
150 | } | 146 | } |
151 | } | 147 | } \ No newline at end of file |
diff --git a/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs b/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs index 1b960b1..ff6608d 100644 --- a/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs | |||
@@ -31,6 +31,7 @@ using System.IO; | |||
31 | using System.Net; | 31 | using System.Net; |
32 | using System.Reflection; | 32 | using System.Reflection; |
33 | using System.Text; | 33 | using System.Text; |
34 | using System.Threading; | ||
34 | using log4net; | 35 | using log4net; |
35 | using Nini.Config; | 36 | using Nini.Config; |
36 | using NUnit.Framework; | 37 | using NUnit.Framework; |
@@ -59,7 +60,8 @@ namespace OpenSim.Tests.Common | |||
59 | /// A list that will be populated with any TestClients set up in response to | 60 | /// A list that will be populated with any TestClients set up in response to |
60 | /// being informed about a destination region. | 61 | /// being informed about a destination region. |
61 | /// </param> | 62 | /// </param> |
62 | public static void SetUpInformClientOfNeighbour(TestClient tc, List<TestClient> neighbourTcs) | 63 | public static void SetupInformClientOfNeighbourTriggersNeighbourClientCreate( |
64 | TestClient tc, List<TestClient> neighbourTcs) | ||
63 | { | 65 | { |
64 | // XXX: Confusingly, this is also used for non-neighbour notification (as in teleports that do not use the | 66 | // XXX: Confusingly, this is also used for non-neighbour notification (as in teleports that do not use the |
65 | // event queue). | 67 | // event queue). |
@@ -75,8 +77,6 @@ namespace OpenSim.Tests.Common | |||
75 | "[TEST CLIENT]: Processing inform client of neighbour located at {0},{1} at {2}", | 77 | "[TEST CLIENT]: Processing inform client of neighbour located at {0},{1} at {2}", |
76 | x, y, neighbourExternalEndPoint); | 78 | x, y, neighbourExternalEndPoint); |
77 | 79 | ||
78 | // In response to this message, we are going to make a teleport to the scene we've previous been told | ||
79 | // about by test code (this needs to be improved). | ||
80 | AgentCircuitData newAgent = tc.RequestClientInfo(); | 80 | AgentCircuitData newAgent = tc.RequestClientInfo(); |
81 | 81 | ||
82 | Scene neighbourScene; | 82 | Scene neighbourScene; |
@@ -87,5 +87,42 @@ namespace OpenSim.Tests.Common | |||
87 | neighbourScene.AddNewClient(neighbourTc, PresenceType.User); | 87 | neighbourScene.AddNewClient(neighbourTc, PresenceType.User); |
88 | }; | 88 | }; |
89 | } | 89 | } |
90 | |||
91 | /// <summary> | ||
92 | /// Set up correct handling of the InformClientOfNeighbour call from the source region that triggers the | ||
93 | /// viewer to setup a connection with the destination region. | ||
94 | /// </summary> | ||
95 | /// <param name='tc'></param> | ||
96 | /// <param name='neighbourTcs'> | ||
97 | /// A list that will be populated with any TestClients set up in response to | ||
98 | /// being informed about a destination region. | ||
99 | /// </param> | ||
100 | public static void SetupSendRegionTeleportTriggersDestinationClientCreateAndCompleteMovement( | ||
101 | TestClient client, List<TestClient> destinationClients) | ||
102 | { | ||
103 | client.OnTestClientSendRegionTeleport | ||
104 | += (regionHandle, simAccess, regionExternalEndPoint, locationID, flags, capsURL) => | ||
105 | { | ||
106 | uint x, y; | ||
107 | Utils.LongToUInts(regionHandle, out x, out y); | ||
108 | x /= Constants.RegionSize; | ||
109 | y /= Constants.RegionSize; | ||
110 | |||
111 | m_log.DebugFormat( | ||
112 | "[TEST CLIENT]: Processing send region teleport for destination at {0},{1} at {2}", | ||
113 | x, y, regionExternalEndPoint); | ||
114 | |||
115 | AgentCircuitData newAgent = client.RequestClientInfo(); | ||
116 | |||
117 | Scene destinationScene; | ||
118 | SceneManager.Instance.TryGetScene(x, y, out destinationScene); | ||
119 | |||
120 | TestClient destinationClient = new TestClient(newAgent, destinationScene); | ||
121 | destinationClients.Add(destinationClient); | ||
122 | destinationScene.AddNewClient(destinationClient, PresenceType.User); | ||
123 | |||
124 | ThreadPool.UnsafeQueueUserWorkItem(o => destinationClient.CompleteMovement(), null); | ||
125 | }; | ||
126 | } | ||
90 | } | 127 | } |
91 | } \ No newline at end of file | 128 | } \ No newline at end of file |
diff --git a/OpenSim/Tools/pCampBot/Bot.cs b/OpenSim/Tools/pCampBot/Bot.cs index dac8ccb..32bf32b 100644 --- a/OpenSim/Tools/pCampBot/Bot.cs +++ b/OpenSim/Tools/pCampBot/Bot.cs | |||
@@ -59,6 +59,11 @@ namespace pCampBot | |||
59 | public delegate void AnEvent(Bot callbot, EventType someevent); // event delegate for bot events | 59 | public delegate void AnEvent(Bot callbot, EventType someevent); // event delegate for bot events |
60 | 60 | ||
61 | /// <summary> | 61 | /// <summary> |
62 | /// Controls whether bots request textures for the object information they receive | ||
63 | /// </summary> | ||
64 | public bool RequestObjectTextures { get; set; } | ||
65 | |||
66 | /// <summary> | ||
62 | /// Bot manager. | 67 | /// Bot manager. |
63 | /// </summary> | 68 | /// </summary> |
64 | public BotManager Manager { get; private set; } | 69 | public BotManager Manager { get; private set; } |
@@ -469,6 +474,9 @@ namespace pCampBot | |||
469 | 474 | ||
470 | public void Objects_NewPrim(object sender, PrimEventArgs args) | 475 | public void Objects_NewPrim(object sender, PrimEventArgs args) |
471 | { | 476 | { |
477 | if (!RequestObjectTextures) | ||
478 | return; | ||
479 | |||
472 | Primitive prim = args.Prim; | 480 | Primitive prim = args.Prim; |
473 | 481 | ||
474 | if (prim != null) | 482 | if (prim != null) |
diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs index 397a98e..dee02c3 100644 --- a/OpenSim/Tools/pCampBot/BotManager.cs +++ b/OpenSim/Tools/pCampBot/BotManager.cs | |||
@@ -300,6 +300,7 @@ namespace pCampBot | |||
300 | Bot pb = new Bot(bm, behaviours, firstName, lastName, password, startLocation, loginUri); | 300 | Bot pb = new Bot(bm, behaviours, firstName, lastName, password, startLocation, loginUri); |
301 | pb.wear = wearSetting; | 301 | pb.wear = wearSetting; |
302 | pb.Client.Settings.SEND_AGENT_UPDATES = InitBotSendAgentUpdates; | 302 | pb.Client.Settings.SEND_AGENT_UPDATES = InitBotSendAgentUpdates; |
303 | pb.RequestObjectTextures = InitBotRequestObjectTextures; | ||
303 | 304 | ||
304 | pb.OnConnected += handlebotEvent; | 305 | pb.OnConnected += handlebotEvent; |
305 | pb.OnDisconnected += handlebotEvent; | 306 | pb.OnDisconnected += handlebotEvent; |