diff options
author | Melanie Thielker | 2014-08-20 04:39:48 +0200 |
---|---|---|
committer | Melanie Thielker | 2014-08-20 04:39:48 +0200 |
commit | 24b4f6ad7b9e9b54b3efb80aec462fa03e226c32 (patch) | |
tree | 3128c12ea30a35b30caaf598a8a023c5987d279d | |
parent | Expect a missing directory, the asset cache is shared. Prevent spew if (diff) | |
parent | also send attachment pre-kills on crossings (diff) | |
download | opensim-SC-24b4f6ad7b9e9b54b3efb80aec462fa03e226c32.zip opensim-SC-24b4f6ad7b9e9b54b3efb80aec462fa03e226c32.tar.gz opensim-SC-24b4f6ad7b9e9b54b3efb80aec462fa03e226c32.tar.bz2 opensim-SC-24b4f6ad7b9e9b54b3efb80aec462fa03e226c32.tar.xz |
Merge branch 'ubitworkmaster'
Diffstat (limited to '')
15 files changed, 748 insertions, 397 deletions
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs index 5beb37d..91df64d 100644 --- a/OpenSim/Framework/ChildAgentDataUpdate.cs +++ b/OpenSim/Framework/ChildAgentDataUpdate.cs | |||
@@ -431,6 +431,8 @@ namespace OpenSim.Framework | |||
431 | // The code to pack textures, visuals, wearables and attachments | 431 | // The code to pack textures, visuals, wearables and attachments |
432 | // should be removed; packed appearance contains the full appearance | 432 | // should be removed; packed appearance contains the full appearance |
433 | // This is retained for backward compatibility only | 433 | // This is retained for backward compatibility only |
434 | |||
435 | /* then lets remove | ||
434 | if (Appearance.Texture != null) | 436 | if (Appearance.Texture != null) |
435 | { | 437 | { |
436 | byte[] rawtextures = Appearance.Texture.GetBytes(); | 438 | byte[] rawtextures = Appearance.Texture.GetBytes(); |
@@ -459,7 +461,7 @@ namespace OpenSim.Framework | |||
459 | args["attachments"] = attachs; | 461 | args["attachments"] = attachs; |
460 | } | 462 | } |
461 | // End of code to remove | 463 | // End of code to remove |
462 | 464 | */ | |
463 | if ((Controllers != null) && (Controllers.Length > 0)) | 465 | if ((Controllers != null) && (Controllers.Length > 0)) |
464 | { | 466 | { |
465 | OSDArray controls = new OSDArray(Controllers.Length); | 467 | OSDArray controls = new OSDArray(Controllers.Length); |
@@ -647,58 +649,71 @@ namespace OpenSim.Framework | |||
647 | // AgentTextures[i++] = o.AsUUID(); | 649 | // AgentTextures[i++] = o.AsUUID(); |
648 | //} | 650 | //} |
649 | 651 | ||
650 | Appearance = new AvatarAppearance(); | ||
651 | 652 | ||
652 | // The code to unpack textures, visuals, wearables and attachments | 653 | // packed_appearence should contain all appearance information |
653 | // should be removed; packed appearance contains the full appearance | 654 | if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map) |
654 | // This is retained for backward compatibility only | ||
655 | if (args["texture_entry"] != null) | ||
656 | { | 655 | { |
657 | byte[] rawtextures = args["texture_entry"].AsBinary(); | 656 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] got packed appearance"); |
658 | Primitive.TextureEntry textures = new Primitive.TextureEntry(rawtextures,0,rawtextures.Length); | 657 | Appearance = new AvatarAppearance((OSDMap)args["packed_appearance"]); |
659 | Appearance.SetTextureEntries(textures); | ||
660 | } | 658 | } |
659 | else | ||
660 | { | ||
661 | // if missing try the old pack method | ||
662 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance, checking old method"); | ||
661 | 663 | ||
662 | if (args["visual_params"] != null) | 664 | Appearance = new AvatarAppearance(); |
663 | Appearance.SetVisualParams(args["visual_params"].AsBinary()); | ||
664 | 665 | ||
665 | if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array) | 666 | // The code to unpack textures, visuals, wearables and attachments |
666 | { | 667 | // should be removed; packed appearance contains the full appearance |
667 | OSDArray wears = (OSDArray)(args["wearables"]); | 668 | // This is retained for backward compatibility only |
669 | if (args["texture_entry"] != null) | ||
670 | { | ||
671 | byte[] rawtextures = args["texture_entry"].AsBinary(); | ||
672 | Primitive.TextureEntry textures = new Primitive.TextureEntry(rawtextures, 0, rawtextures.Length); | ||
673 | Appearance.SetTextureEntries(textures); | ||
674 | } | ||
668 | 675 | ||
669 | int count = wears.Count; | 676 | if (args["visual_params"] != null) |
670 | if (count > AvatarWearable.MAX_WEARABLES) | 677 | Appearance.SetVisualParams(args["visual_params"].AsBinary()); |
671 | count = AvatarWearable.MAX_WEARABLES; | ||
672 | 678 | ||
673 | for (int i = 0; i < count / 2; i++) | 679 | if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array) |
674 | { | 680 | { |
675 | AvatarWearable awear = new AvatarWearable((OSDArray)wears[i]); | 681 | OSDArray wears = (OSDArray)(args["wearables"]); |
676 | Appearance.SetWearable(i,awear); | 682 | |
683 | int count = wears.Count; | ||
684 | if (count > AvatarWearable.MAX_WEARABLES) | ||
685 | count = AvatarWearable.MAX_WEARABLES; | ||
686 | |||
687 | for (int i = 0; i < count / 2; i++) | ||
688 | { | ||
689 | AvatarWearable awear = new AvatarWearable((OSDArray)wears[i]); | ||
690 | Appearance.SetWearable(i, awear); | ||
691 | } | ||
677 | } | 692 | } |
678 | } | ||
679 | 693 | ||
680 | if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) | 694 | if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) |
681 | { | ||
682 | OSDArray attachs = (OSDArray)(args["attachments"]); | ||
683 | foreach (OSD o in attachs) | ||
684 | { | 695 | { |
685 | if (o.Type == OSDType.Map) | 696 | OSDArray attachs = (OSDArray)(args["attachments"]); |
697 | foreach (OSD o in attachs) | ||
686 | { | 698 | { |
687 | // We know all of these must end up as attachments so we | 699 | if (o.Type == OSDType.Map) |
688 | // append rather than replace to ensure multiple attachments | 700 | { |
689 | // per point continues to work | 701 | // We know all of these must end up as attachments so we |
690 | // m_log.DebugFormat("[CHILDAGENTDATAUPDATE]: Appending attachments for {0}", AgentID); | 702 | // append rather than replace to ensure multiple attachments |
691 | Appearance.AppendAttachment(new AvatarAttachment((OSDMap)o)); | 703 | // per point continues to work |
704 | // m_log.DebugFormat("[CHILDAGENTDATAUPDATE]: Appending attachments for {0}", AgentID); | ||
705 | Appearance.AppendAttachment(new AvatarAttachment((OSDMap)o)); | ||
706 | } | ||
692 | } | 707 | } |
693 | } | 708 | } |
709 | // end of code to remove | ||
694 | } | 710 | } |
695 | // end of code to remove | 711 | /* moved above |
696 | |||
697 | if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map) | 712 | if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map) |
698 | Appearance = new AvatarAppearance((OSDMap)args["packed_appearance"]); | 713 | Appearance = new AvatarAppearance((OSDMap)args["packed_appearance"]); |
699 | else | 714 | else |
700 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance"); | 715 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance"); |
701 | 716 | */ | |
702 | if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array) | 717 | if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array) |
703 | { | 718 | { |
704 | OSDArray controls = (OSDArray)(args["controllers"]); | 719 | OSDArray controls = (OSDArray)(args["controllers"]); |
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 22cc79d..3b0430b 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs | |||
@@ -755,6 +755,8 @@ namespace OpenSim.Framework | |||
755 | /// </summary> | 755 | /// </summary> |
756 | bool IsActive { get; set; } | 756 | bool IsActive { get; set; } |
757 | 757 | ||
758 | int PingTimeMS { get; } | ||
759 | |||
758 | /// <summary> | 760 | /// <summary> |
759 | /// Set if the client is closing due to a logout request | 761 | /// Set if the client is closing due to a logout request |
760 | /// </summary> | 762 | /// </summary> |
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index 33ef8e0..86e5293 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs | |||
@@ -81,7 +81,7 @@ namespace OpenSim.Framework | |||
81 | /// Number of milliseconds a call can take before it is considered | 81 | /// Number of milliseconds a call can take before it is considered |
82 | /// a "long" call for warning & debugging purposes | 82 | /// a "long" call for warning & debugging purposes |
83 | /// </summary> | 83 | /// </summary> |
84 | public const int LongCallTime = 3000; | 84 | public const int LongCallTime = 500; |
85 | 85 | ||
86 | /// <summary> | 86 | /// <summary> |
87 | /// The maximum length of any data logged because of a long request time. | 87 | /// The maximum length of any data logged because of a long request time. |
@@ -208,6 +208,9 @@ namespace OpenSim.Framework | |||
208 | string errorMessage = "unknown error"; | 208 | string errorMessage = "unknown error"; |
209 | int tickstart = Util.EnvironmentTickCount(); | 209 | int tickstart = Util.EnvironmentTickCount(); |
210 | int tickdata = 0; | 210 | int tickdata = 0; |
211 | int tickcompressdata = 0; | ||
212 | int tickJsondata = 0; | ||
213 | int compsize = 0; | ||
211 | string strBuffer = null; | 214 | string strBuffer = null; |
212 | 215 | ||
213 | try | 216 | try |
@@ -225,6 +228,8 @@ namespace OpenSim.Framework | |||
225 | { | 228 | { |
226 | strBuffer = OSDParser.SerializeJsonString(data); | 229 | strBuffer = OSDParser.SerializeJsonString(data); |
227 | 230 | ||
231 | tickJsondata = Util.EnvironmentTickCountSubtract(tickstart); | ||
232 | |||
228 | if (DebugLevel >= 5) | 233 | if (DebugLevel >= 5) |
229 | LogOutgoingDetail(strBuffer); | 234 | LogOutgoingDetail(strBuffer); |
230 | 235 | ||
@@ -243,13 +248,19 @@ namespace OpenSim.Framework | |||
243 | // gets written on the strteam upon Dispose() | 248 | // gets written on the strteam upon Dispose() |
244 | } | 249 | } |
245 | byte[] buf = ms.ToArray(); | 250 | byte[] buf = ms.ToArray(); |
251 | |||
252 | tickcompressdata = Util.EnvironmentTickCountSubtract(tickstart); | ||
253 | |||
246 | request.ContentLength = buf.Length; //Count bytes to send | 254 | request.ContentLength = buf.Length; //Count bytes to send |
255 | compsize = buf.Length; | ||
247 | using (Stream requestStream = request.GetRequestStream()) | 256 | using (Stream requestStream = request.GetRequestStream()) |
248 | requestStream.Write(buf, 0, (int)buf.Length); | 257 | requestStream.Write(buf, 0, (int)buf.Length); |
249 | } | 258 | } |
250 | } | 259 | } |
251 | else | 260 | else |
252 | { | 261 | { |
262 | tickcompressdata = tickJsondata; | ||
263 | compsize = buffer.Length; | ||
253 | request.ContentType = "application/json"; | 264 | request.ContentType = "application/json"; |
254 | request.ContentLength = buffer.Length; //Count bytes to send | 265 | request.ContentLength = buffer.Length; //Count bytes to send |
255 | using (Stream requestStream = request.GetRequestStream()) | 266 | using (Stream requestStream = request.GetRequestStream()) |
@@ -291,12 +302,16 @@ namespace OpenSim.Framework | |||
291 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); | 302 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); |
292 | if (tickdiff > LongCallTime) | 303 | if (tickdiff > LongCallTime) |
293 | m_log.InfoFormat( | 304 | m_log.InfoFormat( |
294 | "[WEB UTIL]: Slow ServiceOSD request {0} {1} {2} took {3}ms, {4}ms writing, {5}", | 305 | "[WEB UTIL]: Slow ServiceOSD request {0} {1} {2} took {3}ms, {4}ms writing({5} at Json; {6} at comp), {7} bytes ({8} uncomp): {9}", |
295 | reqnum, | 306 | reqnum, |
296 | method, | 307 | method, |
297 | url, | 308 | url, |
298 | tickdiff, | 309 | tickdiff, |
299 | tickdata, | 310 | tickdata, |
311 | tickJsondata, | ||
312 | tickcompressdata, | ||
313 | compsize, | ||
314 | strBuffer != null ? strBuffer.Length : 0, | ||
300 | strBuffer != null | 315 | strBuffer != null |
301 | ? (strBuffer.Length > MaxRequestDiagLength ? strBuffer.Remove(MaxRequestDiagLength) : strBuffer) | 316 | ? (strBuffer.Length > MaxRequestDiagLength ? strBuffer.Remove(MaxRequestDiagLength) : strBuffer) |
302 | : ""); | 317 | : ""); |
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 85049c9..e1e3d87 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs | |||
@@ -978,15 +978,25 @@ namespace OpenSim | |||
978 | cdt.AddColumn("Circuit code", 12); | 978 | cdt.AddColumn("Circuit code", 12); |
979 | cdt.AddColumn("Endpoint", 23); | 979 | cdt.AddColumn("Endpoint", 23); |
980 | cdt.AddColumn("Active?", 7); | 980 | cdt.AddColumn("Active?", 7); |
981 | cdt.AddColumn("ChildAgent?", 7); | ||
982 | cdt.AddColumn("ping(ms)", 8); | ||
981 | 983 | ||
982 | SceneManager.ForEachScene( | 984 | SceneManager.ForEachScene( |
983 | s => s.ForEachClient( | 985 | s => s.ForEachClient( |
984 | c => cdt.AddRow( | 986 | c => |
985 | s.Name, | 987 | { |
986 | c.Name, | 988 | bool child = false; |
987 | c.CircuitCode.ToString(), | 989 | if(c.SceneAgent != null && c.SceneAgent.IsChildAgent) |
988 | c.RemoteEndPoint.ToString(), | 990 | child = true; |
989 | c.IsActive.ToString()))); | 991 | cdt.AddRow( |
992 | s.Name, | ||
993 | c.Name, | ||
994 | c.CircuitCode.ToString(), | ||
995 | c.RemoteEndPoint.ToString(), | ||
996 | c.IsActive.ToString(), | ||
997 | child.ToString(), | ||
998 | c.PingTimeMS); | ||
999 | })); | ||
990 | 1000 | ||
991 | MainConsole.Instance.Output(cdt.ToString()); | 1001 | MainConsole.Instance.Output(cdt.ToString()); |
992 | } | 1002 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 59d1c69..b0cb4ea 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -358,7 +358,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
358 | // protected HashSet<uint> m_attachmentsSent; | 358 | // protected HashSet<uint> m_attachmentsSent; |
359 | 359 | ||
360 | private bool m_deliverPackets = true; | 360 | private bool m_deliverPackets = true; |
361 | private int m_animationSequenceNumber = 1; | 361 | |
362 | private bool m_SendLogoutPacketWhenClosing = true; | 362 | private bool m_SendLogoutPacketWhenClosing = true; |
363 | 363 | ||
364 | /// <summary> | 364 | /// <summary> |
@@ -419,6 +419,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
419 | public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } } | 419 | public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } } |
420 | public bool IsGroupMember(UUID groupID) { return m_groupPowers.ContainsKey(groupID); } | 420 | public bool IsGroupMember(UUID groupID) { return m_groupPowers.ContainsKey(groupID); } |
421 | 421 | ||
422 | public int PingTimeMS | ||
423 | { | ||
424 | get | ||
425 | { | ||
426 | if (UDPClient != null) | ||
427 | return UDPClient.PingTimeMS; | ||
428 | return 0; | ||
429 | } | ||
430 | } | ||
431 | |||
422 | /// <summary> | 432 | /// <summary> |
423 | /// Entity update queues | 433 | /// Entity update queues |
424 | /// </summary> | 434 | /// </summary> |
@@ -440,7 +450,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
440 | public string Name { get { return FirstName + " " + LastName; } } | 450 | public string Name { get { return FirstName + " " + LastName; } } |
441 | 451 | ||
442 | public uint CircuitCode { get { return m_circuitCode; } } | 452 | public uint CircuitCode { get { return m_circuitCode; } } |
443 | public int NextAnimationSequenceNumber { get { return m_animationSequenceNumber++; } } | 453 | public int NextAnimationSequenceNumber |
454 | { | ||
455 | get { return m_udpServer.NextAnimationSequenceNumber; } | ||
456 | } | ||
444 | 457 | ||
445 | /// <summary> | 458 | /// <summary> |
446 | /// As well as it's function in IClientAPI, in LLClientView we are locking on this property in order to | 459 | /// As well as it's function in IClientAPI, in LLClientView we are locking on this property in order to |
@@ -461,6 +474,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
461 | set { m_disableFacelights = value; } | 474 | set { m_disableFacelights = value; } |
462 | } | 475 | } |
463 | 476 | ||
477 | |||
464 | public bool SendLogoutPacketWhenClosing { set { m_SendLogoutPacketWhenClosing = value; } } | 478 | public bool SendLogoutPacketWhenClosing { set { m_SendLogoutPacketWhenClosing = value; } } |
465 | 479 | ||
466 | 480 | ||
@@ -1638,6 +1652,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1638 | pc.PingID.OldestUnacked = 0; | 1652 | pc.PingID.OldestUnacked = 0; |
1639 | 1653 | ||
1640 | OutPacket(pc, ThrottleOutPacketType.Unknown); | 1654 | OutPacket(pc, ThrottleOutPacketType.Unknown); |
1655 | UDPClient.m_lastStartpingTimeMS = Util.EnvironmentTickCount(); | ||
1641 | } | 1656 | } |
1642 | 1657 | ||
1643 | public void SendKillObject(List<uint> localIDs) | 1658 | public void SendKillObject(List<uint> localIDs) |
@@ -3813,8 +3828,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3813 | { | 3828 | { |
3814 | SceneObjectPart e = (SceneObjectPart)entity; | 3829 | SceneObjectPart e = (SceneObjectPart)entity; |
3815 | SceneObjectGroup g = e.ParentGroup; | 3830 | SceneObjectGroup g = e.ParentGroup; |
3816 | if (g.RootPart.Shape.State > 30 && g.RootPart.Shape.State < 39) // HUD | 3831 | if (g.HasPrivateAttachmentPoint && g.OwnerID != AgentId) |
3817 | if (g.OwnerID != AgentId) | ||
3818 | return; // Don't send updates for other people's HUDs | 3832 | return; // Don't send updates for other people's HUDs |
3819 | } | 3833 | } |
3820 | 3834 | ||
@@ -3932,8 +3946,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3932 | 3946 | ||
3933 | if (part.ParentGroup.IsAttachment) | 3947 | if (part.ParentGroup.IsAttachment) |
3934 | { // Someone else's HUD, why are we getting these? | 3948 | { // Someone else's HUD, why are we getting these? |
3935 | if (part.ParentGroup.OwnerID != AgentId && | 3949 | if (part.ParentGroup.OwnerID != AgentId && part.ParentGroup.HasPrivateAttachmentPoint) |
3936 | part.ParentGroup.RootPart.Shape.State > 30 && part.ParentGroup.RootPart.Shape.State < 39) | ||
3937 | continue; | 3950 | continue; |
3938 | ScenePresence sp; | 3951 | ScenePresence sp; |
3939 | // Owner is not in the sim, don't update it to | 3952 | // Owner is not in the sim, don't update it to |
@@ -5278,16 +5291,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5278 | 5291 | ||
5279 | byte[] objectData = new byte[76]; | 5292 | byte[] objectData = new byte[76]; |
5280 | 5293 | ||
5281 | data.CollisionPlane.ToBytes(objectData, 0); | ||
5282 | offsetPosition.ToBytes(objectData, 16); | ||
5283 | Vector3 velocity = new Vector3(0, 0, 0); | 5294 | Vector3 velocity = new Vector3(0, 0, 0); |
5284 | Vector3 acceleration = new Vector3(0, 0, 0); | 5295 | Vector3 acceleration = new Vector3(0, 0, 0); |
5296 | rotation.Normalize(); | ||
5297 | Vector3 vrot = new Vector3(rotation.X, rotation.Y, rotation.Z); | ||
5298 | |||
5299 | data.CollisionPlane.ToBytes(objectData, 0); | ||
5300 | offsetPosition.ToBytes(objectData, 16); | ||
5285 | velocity.ToBytes(objectData, 28); | 5301 | velocity.ToBytes(objectData, 28); |
5286 | acceleration.ToBytes(objectData, 40); | 5302 | acceleration.ToBytes(objectData, 40); |
5287 | // data.Velocity.ToBytes(objectData, 28); | 5303 | vrot.ToBytes(objectData, 52); |
5288 | // data.Acceleration.ToBytes(objectData, 40); | 5304 | data.AngularVelocity.ToBytes(objectData, 64); |
5289 | rotation.ToBytes(objectData, 52); | ||
5290 | //data.AngularVelocity.ToBytes(objectData, 64); | ||
5291 | 5305 | ||
5292 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); | 5306 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); |
5293 | 5307 | ||
@@ -5343,15 +5357,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5343 | data.RelativePosition.ToBytes(objectData, 0); | 5357 | data.RelativePosition.ToBytes(objectData, 0); |
5344 | data.Velocity.ToBytes(objectData, 12); | 5358 | data.Velocity.ToBytes(objectData, 12); |
5345 | data.Acceleration.ToBytes(objectData, 24); | 5359 | data.Acceleration.ToBytes(objectData, 24); |
5346 | try | 5360 | |
5347 | { | 5361 | Quaternion rotation = data.RotationOffset; |
5348 | data.RotationOffset.ToBytes(objectData, 36); | 5362 | rotation.Normalize(); |
5349 | } | 5363 | Vector3 vrot = new Vector3(rotation.X, rotation.Y, rotation.Z); |
5350 | catch (Exception e) | 5364 | vrot.ToBytes(objectData, 36); |
5351 | { | ||
5352 | m_log.Warn("[LLClientView]: exception converting quaternion to bytes, using Quaternion.Identity. Exception: " + e.ToString()); | ||
5353 | OpenMetaverse.Quaternion.Identity.ToBytes(objectData, 36); | ||
5354 | } | ||
5355 | data.AngularVelocity.ToBytes(objectData, 48); | 5365 | data.AngularVelocity.ToBytes(objectData, 48); |
5356 | 5366 | ||
5357 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); | 5367 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs index bd4e617..fe31bd9 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs | |||
@@ -163,6 +163,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
163 | private int m_maxRTO = 60000; | 163 | private int m_maxRTO = 60000; |
164 | public bool m_deliverPackets = true; | 164 | public bool m_deliverPackets = true; |
165 | 165 | ||
166 | public int m_lastStartpingTimeMS; | ||
167 | public int m_pingMS; | ||
168 | |||
169 | public int PingTimeMS | ||
170 | { | ||
171 | get | ||
172 | { | ||
173 | if (m_pingMS < 10) | ||
174 | return 10; | ||
175 | if(m_pingMS > 2000) | ||
176 | return 2000; | ||
177 | return m_pingMS; | ||
178 | } | ||
179 | } | ||
180 | |||
166 | /// <summary> | 181 | /// <summary> |
167 | /// This is the percentage of the udp texture queue to add to the task queue since | 182 | /// This is the percentage of the udp texture queue to add to the task queue since |
168 | /// textures are now generally handled through http. | 183 | /// textures are now generally handled through http. |
@@ -225,6 +240,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
225 | 240 | ||
226 | // Initialize this to a sane value to prevent early disconnects | 241 | // Initialize this to a sane value to prevent early disconnects |
227 | TickLastPacketReceived = Environment.TickCount & Int32.MaxValue; | 242 | TickLastPacketReceived = Environment.TickCount & Int32.MaxValue; |
243 | m_pingMS = (int)(3.0 * server.TickCountResolution); // so filter doesnt start at 0; | ||
228 | } | 244 | } |
229 | 245 | ||
230 | /// <summary> | 246 | /// <summary> |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index fe79f87..3b0312d 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | |||
@@ -293,6 +293,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
293 | /// <summary>Flag to signal when clients should send pings</summary> | 293 | /// <summary>Flag to signal when clients should send pings</summary> |
294 | protected bool m_sendPing; | 294 | protected bool m_sendPing; |
295 | 295 | ||
296 | private int m_animationSequenceNumber; | ||
297 | |||
298 | public int NextAnimationSequenceNumber | ||
299 | { | ||
300 | get | ||
301 | { | ||
302 | m_animationSequenceNumber++; | ||
303 | if (m_animationSequenceNumber > 2147482624) | ||
304 | m_animationSequenceNumber = 1; | ||
305 | return m_animationSequenceNumber; | ||
306 | } | ||
307 | } | ||
308 | |||
309 | |||
310 | |||
296 | private ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>> m_pendingCache = new ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>>(); | 311 | private ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>> m_pendingCache = new ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>>(); |
297 | 312 | ||
298 | /// <summary> | 313 | /// <summary> |
@@ -369,16 +384,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
369 | 384 | ||
370 | // Measure the resolution of Environment.TickCount | 385 | // Measure the resolution of Environment.TickCount |
371 | TickCountResolution = 0f; | 386 | TickCountResolution = 0f; |
372 | for (int i = 0; i < 5; i++) | 387 | for (int i = 0; i < 10; i++) |
373 | { | 388 | { |
374 | int start = Environment.TickCount; | 389 | int start = Environment.TickCount; |
375 | int now = start; | 390 | int now = start; |
376 | while (now == start) | 391 | while (now == start) |
377 | now = Environment.TickCount; | 392 | now = Environment.TickCount; |
378 | TickCountResolution += (float)(now - start) * 0.2f; | 393 | TickCountResolution += (float)(now - start) * 0.1f; |
379 | } | 394 | } |
380 | m_log.Info("[LLUDPSERVER]: Average Environment.TickCount resolution: " + TickCountResolution + "ms"); | ||
381 | TickCountResolution = (float)Math.Ceiling(TickCountResolution); | 395 | TickCountResolution = (float)Math.Ceiling(TickCountResolution); |
396 | m_log.Info("[LLUDPSERVER]: Average Environment.TickCount resolution: " + TickCountResolution + "ms"); | ||
382 | 397 | ||
383 | #endregion Environment.TickCount Measurement | 398 | #endregion Environment.TickCount Measurement |
384 | 399 | ||
@@ -386,6 +401,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
386 | int sceneThrottleBps = 0; | 401 | int sceneThrottleBps = 0; |
387 | bool usePools = false; | 402 | bool usePools = false; |
388 | 403 | ||
404 | |||
405 | |||
389 | IConfig config = configSource.Configs["ClientStack.LindenUDP"]; | 406 | IConfig config = configSource.Configs["ClientStack.LindenUDP"]; |
390 | if (config != null) | 407 | if (config != null) |
391 | { | 408 | { |
@@ -435,6 +452,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
435 | m_throttle = new TokenBucket(null, sceneThrottleBps); | 452 | m_throttle = new TokenBucket(null, sceneThrottleBps); |
436 | ThrottleRates = new ThrottleRates(configSource); | 453 | ThrottleRates = new ThrottleRates(configSource); |
437 | 454 | ||
455 | Random rnd = new Random(Util.EnvironmentTickCount()); | ||
456 | m_animationSequenceNumber = rnd.Next(11474826); | ||
457 | |||
438 | if (usePools) | 458 | if (usePools) |
439 | EnablePools(); | 459 | EnablePools(); |
440 | } | 460 | } |
@@ -1128,6 +1148,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1128 | pc.PingID.OldestUnacked = 0; | 1148 | pc.PingID.OldestUnacked = 0; |
1129 | 1149 | ||
1130 | SendPacket(udpClient, pc, ThrottleOutPacketType.Unknown, false, null); | 1150 | SendPacket(udpClient, pc, ThrottleOutPacketType.Unknown, false, null); |
1151 | udpClient.m_lastStartpingTimeMS = Util.EnvironmentTickCount(); | ||
1131 | } | 1152 | } |
1132 | 1153 | ||
1133 | public void CompletePing(LLUDPClient udpClient, byte pingID) | 1154 | public void CompletePing(LLUDPClient udpClient, byte pingID) |
@@ -1567,7 +1588,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1567 | // We don't need to do anything else with ping checks | 1588 | // We don't need to do anything else with ping checks |
1568 | StartPingCheckPacket startPing = (StartPingCheckPacket)packet; | 1589 | StartPingCheckPacket startPing = (StartPingCheckPacket)packet; |
1569 | CompletePing(udpClient, startPing.PingID.PingID); | 1590 | CompletePing(udpClient, startPing.PingID.PingID); |
1570 | 1591 | ||
1571 | if ((Environment.TickCount - m_elapsedMSSinceLastStatReport) >= 3000) | 1592 | if ((Environment.TickCount - m_elapsedMSSinceLastStatReport) >= 3000) |
1572 | { | 1593 | { |
1573 | udpClient.SendPacketStats(); | 1594 | udpClient.SendPacketStats(); |
@@ -1577,7 +1598,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1577 | } | 1598 | } |
1578 | else if (packet.Type == PacketType.CompletePingCheck) | 1599 | else if (packet.Type == PacketType.CompletePingCheck) |
1579 | { | 1600 | { |
1580 | // We don't currently track client ping times | 1601 | int t = Util.EnvironmentTickCountSubtract(udpClient.m_lastStartpingTimeMS); |
1602 | int c = udpClient.m_pingMS; | ||
1603 | c = 800 * c + 200 * t; | ||
1604 | c /= 1000; | ||
1605 | udpClient.m_pingMS = c; | ||
1581 | return; | 1606 | return; |
1582 | } | 1607 | } |
1583 | 1608 | ||
diff --git a/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs b/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs index de8925d..498cc2f 100644 --- a/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs +++ b/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs | |||
@@ -120,10 +120,16 @@ namespace OpenSim.Region.CoreModules.Framework | |||
120 | 120 | ||
121 | public void CreateCaps(UUID agentId, uint circuitCode) | 121 | public void CreateCaps(UUID agentId, uint circuitCode) |
122 | { | 122 | { |
123 | // int ts = Util.EnvironmentTickCount(); | ||
124 | /* this as no business here... | ||
125 | * must be done elsewhere ( and is ) | ||
123 | int flags = m_scene.GetUserFlags(agentId); | 126 | int flags = m_scene.GetUserFlags(agentId); |
127 | |||
128 | m_log.ErrorFormat("[CreateCaps]: banCheck {0} ", Util.EnvironmentTickCountSubtract(ts)); | ||
129 | |||
124 | if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId, flags)) | 130 | if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId, flags)) |
125 | return; | 131 | return; |
126 | 132 | */ | |
127 | Caps caps; | 133 | Caps caps; |
128 | String capsObjectPath = GetCapsPath(agentId); | 134 | String capsObjectPath = GetCapsPath(agentId); |
129 | 135 | ||
@@ -132,19 +138,27 @@ namespace OpenSim.Region.CoreModules.Framework | |||
132 | if (m_capsObjects.ContainsKey(circuitCode)) | 138 | if (m_capsObjects.ContainsKey(circuitCode)) |
133 | { | 139 | { |
134 | Caps oldCaps = m_capsObjects[circuitCode]; | 140 | Caps oldCaps = m_capsObjects[circuitCode]; |
135 | 141 | ||
136 | //m_log.WarnFormat( | 142 | // if (capsObjectPath == oldCaps.CapsObjectPath) |
137 | // "[CAPS]: Recreating caps for agent {0} in region {1}. Old caps path {2}, new caps path {3}. ", | 143 | // { |
138 | // agentId, m_scene.RegionInfo.RegionName, oldCaps.CapsObjectPath, capsObjectPath); | 144 | // m_log.WarnFormat( |
145 | // "[CAPS]: Reusing caps for agent {0} in region {1}. Old caps path {2}, new caps path {3}. ", | ||
146 | // agentId, m_scene.RegionInfo.RegionName, oldCaps.CapsObjectPath, capsObjectPath); | ||
147 | // return; | ||
148 | // } | ||
139 | } | 149 | } |
140 | 150 | ||
141 | caps = new Caps(MainServer.Instance, m_scene.RegionInfo.ExternalHostName, | 151 | caps = new Caps(MainServer.Instance, m_scene.RegionInfo.ExternalHostName, |
142 | (MainServer.Instance == null) ? 0: MainServer.Instance.Port, | 152 | (MainServer.Instance == null) ? 0: MainServer.Instance.Port, |
143 | capsObjectPath, agentId, m_scene.RegionInfo.RegionName); | 153 | capsObjectPath, agentId, m_scene.RegionInfo.RegionName); |
144 | 154 | ||
155 | // m_log.ErrorFormat("[CreateCaps]: new caps {0} ", Util.EnvironmentTickCountSubtract(ts)); | ||
156 | |||
145 | m_capsObjects[circuitCode] = caps; | 157 | m_capsObjects[circuitCode] = caps; |
146 | } | 158 | } |
147 | m_scene.EventManager.TriggerOnRegisterCaps(agentId, caps); | 159 | m_scene.EventManager.TriggerOnRegisterCaps(agentId, caps); |
160 | // m_log.ErrorFormat("[CreateCaps]: end {0} ", Util.EnvironmentTickCountSubtract(ts)); | ||
161 | |||
148 | } | 162 | } |
149 | 163 | ||
150 | public void RemoveCaps(UUID agentId, uint circuitCode) | 164 | public void RemoveCaps(UUID agentId, uint circuitCode) |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 71148ea..d5eca03 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -430,7 +430,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
430 | } | 430 | } |
431 | 431 | ||
432 | // TODO: Get proper AVG Height | 432 | // TODO: Get proper AVG Height |
433 | float localAVHeight = 1.56f; | 433 | float localHalfAVHeight = 0.8f; |
434 | if (sp.Appearance != null) | ||
435 | localHalfAVHeight = sp.Appearance.AvatarHeight / 2; | ||
436 | |||
434 | float posZLimit = 22; | 437 | float posZLimit = 22; |
435 | 438 | ||
436 | // TODO: Check other Scene HeightField | 439 | // TODO: Check other Scene HeightField |
@@ -439,10 +442,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
439 | posZLimit = (float)sp.Scene.Heightmap[(int)position.X, (int)position.Y]; | 442 | posZLimit = (float)sp.Scene.Heightmap[(int)position.X, (int)position.Y]; |
440 | } | 443 | } |
441 | 444 | ||
442 | float newPosZ = posZLimit + localAVHeight; | 445 | posZLimit += localHalfAVHeight + 0.1f; |
443 | if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) | 446 | |
447 | if ((position.Z < posZLimit) && !(Single.IsInfinity(posZLimit) || Single.IsNaN(posZLimit))) | ||
444 | { | 448 | { |
445 | position.Z = newPosZ; | 449 | position.Z = posZLimit; |
446 | } | 450 | } |
447 | 451 | ||
448 | if (sp.Flying) | 452 | if (sp.Flying) |
@@ -720,7 +724,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
720 | AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo(); | 724 | AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo(); |
721 | agentCircuit.startpos = position; | 725 | agentCircuit.startpos = position; |
722 | agentCircuit.child = true; | 726 | agentCircuit.child = true; |
723 | agentCircuit.Appearance = sp.Appearance; | 727 | |
728 | // agentCircuit.Appearance = sp.Appearance; | ||
729 | // agentCircuit.Appearance = new AvatarAppearance(sp.Appearance, true, false); | ||
730 | agentCircuit.Appearance = new AvatarAppearance(); | ||
731 | agentCircuit.Appearance.AvatarHeight = sp.Appearance.AvatarHeight; | ||
732 | |||
724 | if (currentAgentCircuit != null) | 733 | if (currentAgentCircuit != null) |
725 | { | 734 | { |
726 | agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs; | 735 | agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs; |
@@ -971,7 +980,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
971 | } | 980 | } |
972 | 981 | ||
973 | // May need to logout or other cleanup | 982 | // May need to logout or other cleanup |
974 | AgentHasMovedAway(sp, logout); | 983 | // AgentHasMovedAway(sp, logout); |
984 | AgentHasMovedAway(sp, true); // until logout use is checked | ||
975 | 985 | ||
976 | // Well, this is it. The agent is over there. | 986 | // Well, this is it. The agent is over there. |
977 | KillEntity(sp.Scene, sp.LocalId); | 987 | KillEntity(sp.Scene, sp.LocalId); |
@@ -1138,7 +1148,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1138 | sp.CloseChildAgents(newRegionX, newRegionY); | 1148 | sp.CloseChildAgents(newRegionX, newRegionY); |
1139 | 1149 | ||
1140 | // May need to logout or other cleanup | 1150 | // May need to logout or other cleanup |
1141 | AgentHasMovedAway(sp, logout); | 1151 | // AgentHasMovedAway(sp, logout); |
1152 | AgentHasMovedAway(sp, true); | ||
1142 | 1153 | ||
1143 | // Well, this is it. The agent is over there. | 1154 | // Well, this is it. The agent is over there. |
1144 | KillEntity(sp.Scene, sp.LocalId); | 1155 | KillEntity(sp.Scene, sp.LocalId); |
@@ -1253,7 +1264,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1253 | protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) | 1264 | protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) |
1254 | { | 1265 | { |
1255 | if (sp.Scene.AttachmentsModule != null) | 1266 | if (sp.Scene.AttachmentsModule != null) |
1256 | sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, true); | 1267 | sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, logout); |
1257 | } | 1268 | } |
1258 | 1269 | ||
1259 | protected void KillEntity(Scene scene, uint localID) | 1270 | protected void KillEntity(Scene scene, uint localID) |
@@ -1381,10 +1392,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1381 | 1392 | ||
1382 | 1393 | ||
1383 | #region Agent Crossings | 1394 | #region Agent Crossings |
1384 | |||
1385 | public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out uint xDest, out uint yDest, out string version, out Vector3 newpos) | 1395 | public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out uint xDest, out uint yDest, out string version, out Vector3 newpos) |
1386 | { | 1396 | { |
1397 | string r = String.Empty; | ||
1398 | return GetDestination(scene, agentID, pos, out xDest, out yDest, out version, out newpos, out r); | ||
1399 | } | ||
1400 | |||
1401 | public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out uint xDest, out uint yDest, out string version, out Vector3 newpos, out string reason) | ||
1402 | { | ||
1387 | version = String.Empty; | 1403 | version = String.Empty; |
1404 | reason = String.Empty; | ||
1388 | newpos = pos; | 1405 | newpos = pos; |
1389 | 1406 | ||
1390 | // m_log.DebugFormat( | 1407 | // m_log.DebugFormat( |
@@ -1498,8 +1515,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1498 | } | 1515 | } |
1499 | 1516 | ||
1500 | GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); | 1517 | GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); |
1501 | 1518 | ||
1502 | string reason; | ||
1503 | if (!scene.SimulationService.QueryAccess(neighbourRegion, agentID, newpos, out version, out reason)) | 1519 | if (!scene.SimulationService.QueryAccess(neighbourRegion, agentID, newpos, out version, out reason)) |
1504 | { | 1520 | { |
1505 | if (r == null) | 1521 | if (r == null) |
@@ -1525,11 +1541,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1525 | uint y; | 1541 | uint y; |
1526 | Vector3 newpos; | 1542 | Vector3 newpos; |
1527 | string version; | 1543 | string version; |
1544 | string reason; | ||
1528 | 1545 | ||
1529 | GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, agent.AbsolutePosition, out x, out y, out version, out newpos); | 1546 | GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, agent.AbsolutePosition, out x, out y, out version, out newpos, out reason); |
1530 | if (neighbourRegion == null) | 1547 | if (neighbourRegion == null) |
1531 | { | 1548 | { |
1532 | agent.ControllingClient.SendAlertMessage("Cannot region cross into void"); | 1549 | if (reason == String.Empty) |
1550 | agent.ControllingClient.SendAlertMessage("Cannot cross to region"); | ||
1551 | else | ||
1552 | agent.ControllingClient.SendAlertMessage("Cannot cross to region: " + reason); | ||
1533 | return false; | 1553 | return false; |
1534 | } | 1554 | } |
1535 | 1555 | ||
@@ -1656,10 +1676,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1656 | 1676 | ||
1657 | public bool CrossAgentIntoNewRegionMain(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying) | 1677 | public bool CrossAgentIntoNewRegionMain(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying) |
1658 | { | 1678 | { |
1679 | int ts = Util.EnvironmentTickCount(); | ||
1659 | try | 1680 | try |
1660 | { | 1681 | { |
1682 | |||
1661 | AgentData cAgent = new AgentData(); | 1683 | AgentData cAgent = new AgentData(); |
1662 | agent.CopyTo(cAgent); | 1684 | agent.CopyTo(cAgent); |
1685 | |||
1686 | // agent.Appearance.WearableCacheItems = null; | ||
1687 | |||
1663 | cAgent.Position = pos + agent.Velocity; | 1688 | cAgent.Position = pos + agent.Velocity; |
1664 | if (isFlying) | 1689 | if (isFlying) |
1665 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | 1690 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; |
@@ -1686,6 +1711,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1686 | return false; | 1711 | return false; |
1687 | } | 1712 | } |
1688 | 1713 | ||
1714 | m_log.DebugFormat("[CrossAgentIntoNewRegionMain] ok, time {0}ms",Util.EnvironmentTickCountSubtract(ts)); | ||
1715 | |||
1689 | } | 1716 | } |
1690 | catch (Exception e) | 1717 | catch (Exception e) |
1691 | { | 1718 | { |
@@ -1703,6 +1730,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1703 | public void CrossAgentToNewRegionPost(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, | 1730 | public void CrossAgentToNewRegionPost(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, |
1704 | bool isFlying, string version) | 1731 | bool isFlying, string version) |
1705 | { | 1732 | { |
1733 | |||
1706 | agent.ControllingClient.RequestClientInfo(); | 1734 | agent.ControllingClient.RequestClientInfo(); |
1707 | 1735 | ||
1708 | string agentcaps; | 1736 | string agentcaps; |
@@ -1714,6 +1742,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1714 | } | 1742 | } |
1715 | 1743 | ||
1716 | // No turning back | 1744 | // No turning back |
1745 | |||
1746 | |||
1747 | |||
1717 | agent.IsChildAgent = true; | 1748 | agent.IsChildAgent = true; |
1718 | 1749 | ||
1719 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); | 1750 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); |
@@ -1737,12 +1768,25 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1737 | capsPath); | 1768 | capsPath); |
1738 | } | 1769 | } |
1739 | 1770 | ||
1771 | // Backwards compatibility. Best effort | ||
1772 | if (version == "Unknown" || version == string.Empty) | ||
1773 | { | ||
1774 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); | ||
1775 | Thread.Sleep(3000); // wait a little now that we're not waiting for the callback | ||
1776 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); | ||
1777 | } | ||
1778 | |||
1740 | // SUCCESS! | 1779 | // SUCCESS! |
1741 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); | 1780 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); |
1742 | 1781 | ||
1743 | // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. | 1782 | // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. |
1744 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); | 1783 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); |
1745 | 1784 | ||
1785 | // this may need the attachments | ||
1786 | agent.parcelRegionCross(); | ||
1787 | |||
1788 | AgentHasMovedAway(agent, true); | ||
1789 | |||
1746 | agent.MakeChildAgent(); | 1790 | agent.MakeChildAgent(); |
1747 | 1791 | ||
1748 | // FIXME: Possibly this should occur lower down after other commands to close other agents, | 1792 | // FIXME: Possibly this should occur lower down after other commands to close other agents, |
@@ -1756,16 +1800,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1756 | // agent.SendOtherAgentsAvatarDataToMe(); | 1800 | // agent.SendOtherAgentsAvatarDataToMe(); |
1757 | // agent.SendOtherAgentsAppearanceToMe(); | 1801 | // agent.SendOtherAgentsAppearanceToMe(); |
1758 | 1802 | ||
1759 | agent.parcelRegionCross(false); | ||
1760 | |||
1761 | // Backwards compatibility. Best effort | ||
1762 | if (version == "Unknown" || version == string.Empty) | ||
1763 | { | ||
1764 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); | ||
1765 | Thread.Sleep(3000); // wait a little now that we're not waiting for the callback | ||
1766 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); | ||
1767 | } | ||
1768 | |||
1769 | // Next, let's close the child agent connections that are too far away. | 1803 | // Next, let's close the child agent connections that are too far away. |
1770 | uint neighbourx; | 1804 | uint neighbourx; |
1771 | uint neighboury; | 1805 | uint neighboury; |
@@ -1777,7 +1811,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1777 | 1811 | ||
1778 | agent.CloseChildAgents(neighbourx, neighboury); | 1812 | agent.CloseChildAgents(neighbourx, neighboury); |
1779 | 1813 | ||
1780 | AgentHasMovedAway(agent, false); | 1814 | |
1781 | 1815 | ||
1782 | // the user may change their profile information in other region, | 1816 | // the user may change their profile information in other region, |
1783 | // so the userinfo in UserProfileCache is not reliable any more, delete it | 1817 | // so the userinfo in UserProfileCache is not reliable any more, delete it |
@@ -1817,7 +1851,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1817 | #region Enable Child Agent | 1851 | #region Enable Child Agent |
1818 | 1852 | ||
1819 | /// <summary> | 1853 | /// <summary> |
1820 | /// This informs a single neighbouring region about agent "avatar". | 1854 | /// This informs a single neighbouring region about agent "avatar", and avatar about it |
1821 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. | 1855 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. |
1822 | /// </summary> | 1856 | /// </summary> |
1823 | /// <param name="sp"></param> | 1857 | /// <param name="sp"></param> |
@@ -1833,8 +1867,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1833 | agent.startpos = new Vector3(128, 128, 70); | 1867 | agent.startpos = new Vector3(128, 128, 70); |
1834 | agent.child = true; | 1868 | agent.child = true; |
1835 | 1869 | ||
1836 | //agent.Appearance = sp.Appearance; | 1870 | agent.Appearance = new AvatarAppearance(); |
1837 | agent.Appearance = new AvatarAppearance(sp.Appearance, true, false); // guess this should be a lot less | 1871 | agent.Appearance.AvatarHeight = sp.Appearance.AvatarHeight; |
1838 | 1872 | ||
1839 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | 1873 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); |
1840 | 1874 | ||
@@ -1866,6 +1900,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1866 | agent.Id0 = currentAgentCircuit.Id0; | 1900 | agent.Id0 = currentAgentCircuit.Id0; |
1867 | } | 1901 | } |
1868 | 1902 | ||
1903 | Thread.Sleep(200); // the original delay that was at InformClientOfNeighbourAsync start | ||
1904 | |||
1869 | IPEndPoint external = region.ExternalEndPoint; | 1905 | IPEndPoint external = region.ExternalEndPoint; |
1870 | if (external != null) | 1906 | if (external != null) |
1871 | { | 1907 | { |
@@ -1884,6 +1920,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1884 | 1920 | ||
1885 | /// <summary> | 1921 | /// <summary> |
1886 | /// This informs all neighbouring regions about agent "avatar". | 1922 | /// This informs all neighbouring regions about agent "avatar". |
1923 | /// and as important informs the avatar about then | ||
1887 | /// </summary> | 1924 | /// </summary> |
1888 | /// <param name="sp"></param> | 1925 | /// <param name="sp"></param> |
1889 | public void EnableChildAgents(ScenePresence sp) | 1926 | public void EnableChildAgents(ScenePresence sp) |
@@ -1900,81 +1937,77 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1900 | m_log.Debug("[ENTITY TRANSFER MODULE]: m_regionInfo was null in EnableChildAgents, is this a NPC?"); | 1937 | m_log.Debug("[ENTITY TRANSFER MODULE]: m_regionInfo was null in EnableChildAgents, is this a NPC?"); |
1901 | } | 1938 | } |
1902 | 1939 | ||
1903 | /// We need to find the difference between the new regions where there are no child agents | 1940 | LinkedList<ulong> previousRegionNeighbourHandles; |
1904 | /// and the regions where there are already child agents. We only send notification to the former. | 1941 | |
1905 | List<ulong> neighbourHandles = NeighbourHandles(neighbours); // on this region | 1942 | Dictionary<ulong, string> seeds; |
1906 | neighbourHandles.Add(sp.Scene.RegionInfo.RegionHandle); // add this region too | ||
1907 | List<ulong> previousRegionNeighbourHandles; | ||
1908 | 1943 | ||
1909 | if (sp.Scene.CapsModule != null) | 1944 | if (sp.Scene.CapsModule != null) |
1910 | { | 1945 | { |
1911 | previousRegionNeighbourHandles = | 1946 | seeds = new Dictionary<ulong, string>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID)); |
1912 | new List<ulong>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID).Keys); | 1947 | previousRegionNeighbourHandles = new LinkedList<ulong>(seeds.Keys); |
1913 | } | 1948 | } |
1914 | else | 1949 | else |
1915 | { | 1950 | { |
1916 | previousRegionNeighbourHandles = new List<ulong>(); | ||
1917 | } | ||
1918 | |||
1919 | List<ulong> newRegions = NewNeighbours(neighbourHandles, previousRegionNeighbourHandles); | ||
1920 | List<ulong> oldRegions = OldNeighbours(neighbourHandles, previousRegionNeighbourHandles); | ||
1921 | |||
1922 | // Dump("Current Neighbors", neighbourHandles); | ||
1923 | // Dump("Previous Neighbours", previousRegionNeighbourHandles); | ||
1924 | // Dump("New Neighbours", newRegions); | ||
1925 | // Dump("Old Neighbours", oldRegions); | ||
1926 | |||
1927 | /// Update the scene presence's known regions here on this region | ||
1928 | sp.DropOldNeighbours(oldRegions); | ||
1929 | |||
1930 | /// Collect as many seeds as possible | ||
1931 | Dictionary<ulong, string> seeds; | ||
1932 | if (sp.Scene.CapsModule != null) | ||
1933 | seeds = new Dictionary<ulong, string>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID)); | ||
1934 | else | ||
1935 | seeds = new Dictionary<ulong, string>(); | 1951 | seeds = new Dictionary<ulong, string>(); |
1952 | previousRegionNeighbourHandles = new LinkedList<ulong>(); | ||
1953 | } | ||
1936 | 1954 | ||
1937 | //m_log.Debug(" !!! No. of seeds: " + seeds.Count); | ||
1938 | if (!seeds.ContainsKey(sp.Scene.RegionInfo.RegionHandle)) | 1955 | if (!seeds.ContainsKey(sp.Scene.RegionInfo.RegionHandle)) |
1939 | seeds.Add(sp.Scene.RegionInfo.RegionHandle, sp.ControllingClient.RequestClientInfo().CapsPath); | 1956 | seeds.Add(sp.Scene.RegionInfo.RegionHandle, sp.ControllingClient.RequestClientInfo().CapsPath); |
1940 | 1957 | ||
1941 | /// Create the necessary child agents | 1958 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); |
1959 | |||
1960 | List<ulong> newneighbours = new List<ulong>(); | ||
1942 | List<AgentCircuitData> cagents = new List<AgentCircuitData>(); | 1961 | List<AgentCircuitData> cagents = new List<AgentCircuitData>(); |
1962 | |||
1963 | ulong currentRegionHandler = sp.Scene.RegionInfo.RegionHandle; | ||
1964 | |||
1943 | foreach (GridRegion neighbour in neighbours) | 1965 | foreach (GridRegion neighbour in neighbours) |
1944 | { | 1966 | { |
1945 | if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) | 1967 | ulong handler = neighbour.RegionHandle; |
1946 | { | ||
1947 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | ||
1948 | AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); | ||
1949 | agent.BaseFolder = UUID.Zero; | ||
1950 | agent.InventoryFolder = UUID.Zero; | ||
1951 | agent.startpos = sp.AbsolutePosition + CalculateOffset(sp, neighbour); | ||
1952 | agent.child = true; | ||
1953 | // agent.Appearance = sp.Appearance; | ||
1954 | agent.Appearance = new AvatarAppearance(sp.Appearance, true, false); // guess this should be a lot less | ||
1955 | if (currentAgentCircuit != null) | ||
1956 | { | ||
1957 | agent.ServiceURLs = currentAgentCircuit.ServiceURLs; | ||
1958 | agent.IPAddress = currentAgentCircuit.IPAddress; | ||
1959 | agent.Viewer = currentAgentCircuit.Viewer; | ||
1960 | agent.Channel = currentAgentCircuit.Channel; | ||
1961 | agent.Mac = currentAgentCircuit.Mac; | ||
1962 | agent.Id0 = currentAgentCircuit.Id0; | ||
1963 | } | ||
1964 | 1968 | ||
1965 | if (newRegions.Contains(neighbour.RegionHandle)) | 1969 | if (handler == currentRegionHandler) |
1966 | { | 1970 | continue; |
1967 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | 1971 | |
1968 | sp.AddNeighbourRegion(neighbour.RegionHandle, agent.CapsPath); | 1972 | AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); |
1969 | seeds.Add(neighbour.RegionHandle, agent.CapsPath); | 1973 | agent.BaseFolder = UUID.Zero; |
1970 | } | 1974 | agent.InventoryFolder = UUID.Zero; |
1971 | else | 1975 | agent.startpos = sp.AbsolutePosition + CalculateOffset(sp, neighbour); |
1972 | { | 1976 | agent.child = true; |
1973 | agent.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, neighbour.RegionHandle); | 1977 | agent.Appearance = new AvatarAppearance(); |
1974 | } | 1978 | agent.Appearance.AvatarHeight = sp.Appearance.AvatarHeight; |
1979 | |||
1980 | if (currentAgentCircuit != null) | ||
1981 | { | ||
1982 | agent.ServiceURLs = currentAgentCircuit.ServiceURLs; | ||
1983 | agent.IPAddress = currentAgentCircuit.IPAddress; | ||
1984 | agent.Viewer = currentAgentCircuit.Viewer; | ||
1985 | agent.Channel = currentAgentCircuit.Channel; | ||
1986 | agent.Mac = currentAgentCircuit.Mac; | ||
1987 | agent.Id0 = currentAgentCircuit.Id0; | ||
1988 | } | ||
1975 | 1989 | ||
1976 | cagents.Add(agent); | 1990 | if (previousRegionNeighbourHandles.Contains(handler)) |
1991 | { | ||
1992 | previousRegionNeighbourHandles.Remove(handler); | ||
1993 | agent.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, handler); | ||
1977 | } | 1994 | } |
1995 | else | ||
1996 | { | ||
1997 | newneighbours.Add(handler); | ||
1998 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
1999 | sp.AddNeighbourRegion(handler, agent.CapsPath); | ||
2000 | seeds.Add(handler, agent.CapsPath); | ||
2001 | } | ||
2002 | |||
2003 | cagents.Add(agent); | ||
2004 | } | ||
2005 | |||
2006 | //sp.DropOldNeighbours(previousRegionNeighbourHandles); | ||
2007 | foreach (ulong handle in previousRegionNeighbourHandles) | ||
2008 | { | ||
2009 | sp.RemoveNeighbourRegion(handle); | ||
2010 | Scene.CapsModule.DropChildSeed(sp.UUID, handle); | ||
1978 | } | 2011 | } |
1979 | 2012 | ||
1980 | /// Update all child agent with everyone's seeds | 2013 | /// Update all child agent with everyone's seeds |
@@ -1987,34 +2020,23 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1987 | { | 2020 | { |
1988 | sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, seeds); | 2021 | sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, seeds); |
1989 | } | 2022 | } |
2023 | |||
1990 | sp.KnownRegions = seeds; | 2024 | sp.KnownRegions = seeds; |
1991 | //avatar.Scene.DumpChildrenSeeds(avatar.UUID); | 2025 | //avatar.Scene.DumpChildrenSeeds(avatar.UUID); |
1992 | //avatar.DumpKnownRegions(); | 2026 | //avatar.DumpKnownRegions(); |
1993 | 2027 | ||
1994 | bool newAgent = false; | 2028 | Util.FireAndForget(delegate |
1995 | int count = 0; | ||
1996 | foreach (GridRegion neighbour in neighbours) | ||
1997 | { | 2029 | { |
1998 | //m_log.WarnFormat("--> Going to send child agent to {0}", neighbour.RegionName); | 2030 | Thread.Sleep(200); // the original delay that was at InformClientOfNeighbourAsync start |
1999 | // Don't do it if there's already an agent in that region | 2031 | int count = 0; |
2000 | if (newRegions.Contains(neighbour.RegionHandle)) | 2032 | bool newagent; |
2001 | newAgent = true; | ||
2002 | else | ||
2003 | newAgent = false; | ||
2004 | // continue; | ||
2005 | 2033 | ||
2006 | if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) | 2034 | foreach (GridRegion neighbour in neighbours) |
2007 | { | 2035 | { |
2008 | try | 2036 | try |
2009 | { | 2037 | { |
2010 | // Let's put this back at sync, so that it doesn't clog | 2038 | newagent = newneighbours.Contains(neighbour.RegionHandle); |
2011 | // the network, especially for regions in the same physical server. | 2039 | InformClientOfNeighbourAsync(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newagent); |
2012 | // We're really not in a hurry here. | ||
2013 | InformClientOfNeighbourAsync(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent); | ||
2014 | //InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; | ||
2015 | //d.BeginInvoke(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent, | ||
2016 | // InformClientOfNeighbourCompleted, | ||
2017 | // d); | ||
2018 | } | 2040 | } |
2019 | 2041 | ||
2020 | catch (ArgumentOutOfRangeException) | 2042 | catch (ArgumentOutOfRangeException) |
@@ -2022,9 +2044,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2022 | m_log.ErrorFormat( | 2044 | m_log.ErrorFormat( |
2023 | "[ENTITY TRANSFER MODULE]: Neighbour Regions response included the current region in the neighbour list. The following region will not display to the client: {0} for region {1} ({2}, {3}).", | 2045 | "[ENTITY TRANSFER MODULE]: Neighbour Regions response included the current region in the neighbour list. The following region will not display to the client: {0} for region {1} ({2}, {3}).", |
2024 | neighbour.ExternalHostName, | 2046 | neighbour.ExternalHostName, |
2025 | neighbour.RegionHandle, | 2047 | neighbour.RegionHandle, |
2026 | neighbour.RegionLocX, | 2048 | neighbour.RegionLocX, |
2027 | neighbour.RegionLocY); | 2049 | neighbour.RegionLocY); |
2028 | } | 2050 | } |
2029 | catch (Exception e) | 2051 | catch (Exception e) |
2030 | { | 2052 | { |
@@ -2041,11 +2063,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2041 | 2063 | ||
2042 | // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes. | 2064 | // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes. |
2043 | // throw e; | 2065 | // throw e; |
2044 | |||
2045 | } | 2066 | } |
2067 | count++; | ||
2046 | } | 2068 | } |
2047 | count++; | 2069 | }); |
2048 | } | ||
2049 | } | 2070 | } |
2050 | 2071 | ||
2051 | Vector3 CalculateOffset(ScenePresence sp, GridRegion neighbour) | 2072 | Vector3 CalculateOffset(ScenePresence sp, GridRegion neighbour) |
@@ -2079,11 +2100,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2079 | private void InformClientOfNeighbourAsync(ScenePresence sp, AgentCircuitData a, GridRegion reg, | 2100 | private void InformClientOfNeighbourAsync(ScenePresence sp, AgentCircuitData a, GridRegion reg, |
2080 | IPEndPoint endPoint, bool newAgent) | 2101 | IPEndPoint endPoint, bool newAgent) |
2081 | { | 2102 | { |
2082 | // Let's wait just a little to give time to originating regions to catch up with closing child agents | 2103 | Scene scene = sp.Scene; |
2083 | // after a cross here | 2104 | if (!newAgent) |
2084 | Thread.Sleep(500); | 2105 | return; |
2085 | |||
2086 | Scene scene = sp.Scene; | ||
2087 | 2106 | ||
2088 | m_log.DebugFormat( | 2107 | m_log.DebugFormat( |
2089 | "[ENTITY TRANSFER MODULE]: Informing {0} {1} about neighbour {2} {3} at ({4},{5})", | 2108 | "[ENTITY TRANSFER MODULE]: Informing {0} {1} about neighbour {2} {3} at ({4},{5})", |
@@ -2097,6 +2116,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2097 | 2116 | ||
2098 | if (regionAccepted && newAgent) | 2117 | if (regionAccepted && newAgent) |
2099 | { | 2118 | { |
2119 | // give time for createAgent to finish, since it is async and does grid services access | ||
2120 | Thread.Sleep(500); | ||
2121 | |||
2100 | if (m_eqModule != null) | 2122 | if (m_eqModule != null) |
2101 | { | 2123 | { |
2102 | #region IP Translation for NAT | 2124 | #region IP Translation for NAT |
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index ecd6a09..668087f 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | |||
@@ -557,6 +557,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
557 | /// <param name="objectIDs"></param> | 557 | /// <param name="objectIDs"></param> |
558 | public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs) | 558 | public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs) |
559 | { | 559 | { |
560 | /* | ||
560 | if (m_scenePresence.IsChildAgent) | 561 | if (m_scenePresence.IsChildAgent) |
561 | return; | 562 | return; |
562 | 563 | ||
@@ -571,6 +572,8 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
571 | { | 572 | { |
572 | client.SendAnimations(animations, seqs, m_scenePresence.ControllingClient.AgentId, objectIDs); | 573 | client.SendAnimations(animations, seqs, m_scenePresence.ControllingClient.AgentId, objectIDs); |
573 | }); | 574 | }); |
575 | */ | ||
576 | m_scenePresence.SendAnimPack(animations, seqs, objectIDs); | ||
574 | } | 577 | } |
575 | 578 | ||
576 | public void SendAnimPackToClient(IClientAPI client) | 579 | public void SendAnimPackToClient(IClientAPI client) |
@@ -602,7 +605,8 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
602 | 605 | ||
603 | m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); | 606 | m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); |
604 | 607 | ||
605 | SendAnimPack(animIDs, sequenceNums, objectIDs); | 608 | // SendAnimPack(animIDs, sequenceNums, objectIDs); |
609 | m_scenePresence.SendAnimPack(animIDs, sequenceNums, objectIDs); | ||
606 | } | 610 | } |
607 | 611 | ||
608 | public string GetAnimName(UUID animId) | 612 | public string GetAnimName(UUID animId) |
diff --git a/OpenSim/Region/Framework/Scenes/Prioritizer.cs b/OpenSim/Region/Framework/Scenes/Prioritizer.cs index ddae073..19d2689 100644 --- a/OpenSim/Region/Framework/Scenes/Prioritizer.cs +++ b/OpenSim/Region/Framework/Scenes/Prioritizer.cs | |||
@@ -91,6 +91,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
91 | return 0; | 91 | return 0; |
92 | 92 | ||
93 | uint priority; | 93 | uint priority; |
94 | |||
95 | |||
96 | // HACK | ||
97 | return GetPriorityByBestAvatarResponsiveness(client, entity); | ||
98 | |||
94 | 99 | ||
95 | switch (m_scene.UpdatePrioritizationScheme) | 100 | switch (m_scene.UpdatePrioritizationScheme) |
96 | { | 101 | { |
@@ -157,30 +162,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
157 | 162 | ||
158 | private uint GetPriorityByBestAvatarResponsiveness(IClientAPI client, ISceneEntity entity) | 163 | private uint GetPriorityByBestAvatarResponsiveness(IClientAPI client, ISceneEntity entity) |
159 | { | 164 | { |
160 | uint pqueue = ComputeDistancePriority(client,entity,false); | 165 | uint pqueue = 2; // keep compiler happy |
161 | 166 | ||
162 | ScenePresence presence = m_scene.GetScenePresence(client.AgentId); | 167 | ScenePresence presence = m_scene.GetScenePresence(client.AgentId); |
163 | if (presence != null) | 168 | if (presence != null) |
164 | { | 169 | { |
165 | if (!presence.IsChildAgent) | 170 | // All avatars other than our own go into pqueue 1 |
171 | if (entity is ScenePresence) | ||
172 | return 1; | ||
173 | |||
174 | if (entity is SceneObjectPart) | ||
166 | { | 175 | { |
167 | // All avatars other than our own go into pqueue 1 | 176 | // Attachments are high priority, |
168 | if (entity is ScenePresence) | 177 | if (((SceneObjectPart)entity).ParentGroup.IsAttachment) |
169 | return 1; | 178 | return 1; |
170 | |||
171 | if (entity is SceneObjectPart) | ||
172 | { | ||
173 | // Attachments are high priority, | ||
174 | if (((SceneObjectPart)entity).ParentGroup.IsAttachment) | ||
175 | return 1; | ||
176 | 179 | ||
177 | // Non physical prims are lower priority than physical prims | 180 | pqueue = ComputeDistancePriority(client, entity, false); |
178 | PhysicsActor physActor = ((SceneObjectPart)entity).ParentGroup.RootPart.PhysActor; | 181 | |
179 | if (physActor == null || !physActor.IsPhysical) | 182 | // Non physical prims are lower priority than physical prims |
180 | pqueue++; | 183 | PhysicsActor physActor = ((SceneObjectPart)entity).ParentGroup.RootPart.PhysActor; |
181 | } | 184 | if (physActor == null || !physActor.IsPhysical) |
185 | pqueue++; | ||
182 | } | 186 | } |
183 | } | 187 | } |
188 | else | ||
189 | pqueue = ComputeDistancePriority(client, entity, false); | ||
184 | 190 | ||
185 | return pqueue; | 191 | return pqueue; |
186 | } | 192 | } |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 0f67d07..a0c3ba9 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -1400,7 +1400,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1400 | else | 1400 | else |
1401 | Animator.ResetAnimations(); | 1401 | Animator.ResetAnimations(); |
1402 | 1402 | ||
1403 | 1403 | ||
1404 | // m_log.DebugFormat( | 1404 | // m_log.DebugFormat( |
1405 | // "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", | 1405 | // "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", |
1406 | // Name, UUID, m_scene.RegionInfo.RegionName); | 1406 | // Name, UUID, m_scene.RegionInfo.RegionName); |
@@ -1754,7 +1754,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1754 | /// </param> | 1754 | /// </param> |
1755 | public void CompleteMovement(IClientAPI client, bool openChildAgents) | 1755 | public void CompleteMovement(IClientAPI client, bool openChildAgents) |
1756 | { | 1756 | { |
1757 | // DateTime startTime = DateTime.Now; | 1757 | int ts = Util.EnvironmentTickCount(); |
1758 | 1758 | ||
1759 | m_log.InfoFormat( | 1759 | m_log.InfoFormat( |
1760 | "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}", | 1760 | "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}", |
@@ -1767,6 +1767,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1767 | // Make sure it's not a login agent. We don't want to wait for updates during login | 1767 | // Make sure it's not a login agent. We don't want to wait for updates during login |
1768 | if (!isNPC && (m_teleportFlags & TeleportFlags.ViaLogin) == 0) | 1768 | if (!isNPC && (m_teleportFlags & TeleportFlags.ViaLogin) == 0) |
1769 | { | 1769 | { |
1770 | |||
1770 | // Let's wait until UpdateAgent (called by departing region) is done | 1771 | // Let's wait until UpdateAgent (called by departing region) is done |
1771 | if (!WaitForUpdateAgent(client)) | 1772 | if (!WaitForUpdateAgent(client)) |
1772 | // The sending region never sent the UpdateAgent data, we have to refuse | 1773 | // The sending region never sent the UpdateAgent data, we have to refuse |
@@ -1786,6 +1787,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1786 | AbsolutePosition = pos; | 1787 | AbsolutePosition = pos; |
1787 | } | 1788 | } |
1788 | */ | 1789 | */ |
1790 | |||
1791 | m_log.DebugFormat("[CompleteMovement] WaitForUpdateAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1792 | |||
1789 | bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); | 1793 | bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); |
1790 | if (!MakeRootAgent(AbsolutePosition, flying)) | 1794 | if (!MakeRootAgent(AbsolutePosition, flying)) |
1791 | { | 1795 | { |
@@ -1796,6 +1800,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1796 | return; | 1800 | return; |
1797 | } | 1801 | } |
1798 | 1802 | ||
1803 | m_log.DebugFormat("[CompleteMovement] MakeRootAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1804 | |||
1799 | Vector3 look = Lookat; | 1805 | Vector3 look = Lookat; |
1800 | if ((Math.Abs(look.X) < 0.01) && (Math.Abs(look.Y) < 0.01)) | 1806 | if ((Math.Abs(look.X) < 0.01) && (Math.Abs(look.Y) < 0.01)) |
1801 | { | 1807 | { |
@@ -1806,6 +1812,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
1806 | look = new Vector3(0.99f, 0.042f, 0); | 1812 | look = new Vector3(0.99f, 0.042f, 0); |
1807 | } | 1813 | } |
1808 | 1814 | ||
1815 | if (!IsChildAgent) | ||
1816 | { | ||
1817 | InventoryFolderBase cof = m_scene.InventoryService.GetFolderForType(client.AgentId, (AssetType)46); | ||
1818 | if (cof == null) | ||
1819 | COF = UUID.Zero; | ||
1820 | else | ||
1821 | COF = cof.ID; | ||
1822 | |||
1823 | m_log.DebugFormat("[ScenePresence]: CompleteMovement COF for {0} is {1}", client.AgentId, COF); | ||
1824 | } | ||
1825 | |||
1809 | // Tell the client that we're totally ready | 1826 | // Tell the client that we're totally ready |
1810 | ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); | 1827 | ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); |
1811 | 1828 | ||
@@ -1816,6 +1833,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1816 | 1833 | ||
1817 | // m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); | 1834 | // m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); |
1818 | 1835 | ||
1836 | m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1837 | |||
1819 | if (!string.IsNullOrEmpty(m_callbackURI)) | 1838 | if (!string.IsNullOrEmpty(m_callbackURI)) |
1820 | { | 1839 | { |
1821 | // We cannot sleep here since this would hold up the inbound packet processing thread, as | 1840 | // We cannot sleep here since this would hold up the inbound packet processing thread, as |
@@ -1844,6 +1863,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1844 | // client.Name, client.AgentId, m_scene.RegionInfo.RegionName); | 1863 | // client.Name, client.AgentId, m_scene.RegionInfo.RegionName); |
1845 | // } | 1864 | // } |
1846 | 1865 | ||
1866 | m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1867 | |||
1847 | m_previusParcelHide = false; | 1868 | m_previusParcelHide = false; |
1848 | m_previusParcelUUID = UUID.Zero; | 1869 | m_previusParcelUUID = UUID.Zero; |
1849 | m_currentParcelHide = false; | 1870 | m_currentParcelHide = false; |
@@ -1856,15 +1877,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1856 | 1877 | ||
1857 | if (!IsChildAgent) | 1878 | if (!IsChildAgent) |
1858 | { | 1879 | { |
1859 | newhide = m_currentParcelHide; | ||
1860 | m_currentParcelHide = false; | ||
1861 | 1880 | ||
1862 | // take this region out of children Neighbours list | ||
1863 | // possible should be done elsewhere | ||
1864 | DropThisRootRegionFromNeighbours(); | ||
1865 | 1881 | ||
1866 | ValidateAndSendAppearanceAndAgentData(); | 1882 | ValidateAndSendAppearanceAndAgentData(); |
1867 | 1883 | ||
1884 | m_log.DebugFormat("[CompleteMovement] ValidateAndSendAppearanceAndAgentData: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1885 | |||
1868 | // attachments | 1886 | // attachments |
1869 | if (isNPC || (TeleportFlags & TeleportFlags.ViaLogin) != 0) | 1887 | if (isNPC || (TeleportFlags & TeleportFlags.ViaLogin) != 0) |
1870 | { | 1888 | { |
@@ -1877,23 +1895,46 @@ namespace OpenSim.Region.Framework.Scenes | |||
1877 | } | 1895 | } |
1878 | else | 1896 | else |
1879 | { | 1897 | { |
1880 | List<SceneObjectGroup> attachments = GetAttachments(); | 1898 | if (m_attachments.Count > 0) |
1881 | |||
1882 | if (attachments.Count > 0) | ||
1883 | { | 1899 | { |
1884 | m_log.DebugFormat( | 1900 | m_log.DebugFormat( |
1885 | "[SCENE PRESENCE]: Restarting scripts in attachments for {0} in {1}", Name, Scene.Name); | 1901 | "[SCENE PRESENCE]: Restarting scripts in attachments for {0} in {1}", Name, Scene.Name); |
1886 | 1902 | ||
1903 | List<uint> kk = new List<uint>(); | ||
1904 | |||
1887 | // Resume scripts this possible should also be moved down after sending the avatar to viewer ? | 1905 | // Resume scripts this possible should also be moved down after sending the avatar to viewer ? |
1888 | foreach (SceneObjectGroup sog in attachments) | 1906 | foreach (SceneObjectGroup sog in m_attachments) |
1889 | { | 1907 | { |
1890 | sog.ScheduleGroupForFullUpdate(); | 1908 | foreach (SceneObjectPart part in sog.Parts) |
1909 | kk.Add(part.LocalId); | ||
1910 | |||
1911 | sog.SendFullUpdateToClient(ControllingClient); | ||
1912 | SendFullUpdateToClient(ControllingClient); | ||
1913 | |||
1914 | // sog.ScheduleGroupForFullUpdate(); | ||
1915 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | ||
1916 | { | ||
1917 | if (p == this) | ||
1918 | return; | ||
1919 | if (sog.HasPrivateAttachmentPoint) | ||
1920 | return; | ||
1921 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
1922 | return; | ||
1923 | |||
1924 | p.ControllingClient.SendKillObject(kk); | ||
1925 | sog.SendFullUpdateToClient(p.ControllingClient); | ||
1926 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path | ||
1927 | }); | ||
1928 | |||
1891 | sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); | 1929 | sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); |
1892 | sog.ResumeScripts(); | 1930 | sog.ResumeScripts(); |
1931 | kk.Clear(); | ||
1893 | } | 1932 | } |
1894 | } | 1933 | } |
1895 | } | 1934 | } |
1896 | 1935 | ||
1936 | m_log.DebugFormat("[CompleteMovement] attachments: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1937 | |||
1897 | // Create child agents in neighbouring regions | 1938 | // Create child agents in neighbouring regions |
1898 | if (openChildAgents) | 1939 | if (openChildAgents) |
1899 | { | 1940 | { |
@@ -1903,10 +1944,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1903 | } | 1944 | } |
1904 | } | 1945 | } |
1905 | 1946 | ||
1947 | m_log.DebugFormat("[CompleteMovement] openChildAgents: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1948 | |||
1906 | // send the rest of the world | 1949 | // send the rest of the world |
1907 | if (m_teleportFlags > 0 && !isNPC) | 1950 | if (m_teleportFlags > 0 && !isNPC || m_currentParcelHide) |
1908 | SendInitialDataToMe(); | 1951 | SendInitialDataToMe(); |
1909 | 1952 | ||
1953 | m_log.DebugFormat("[CompleteMovement] SendInitialDataToMe: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1954 | |||
1910 | if (!IsChildAgent) | 1955 | if (!IsChildAgent) |
1911 | { | 1956 | { |
1912 | // moved from makeroot missing in sendInitialDataToMe | 1957 | // moved from makeroot missing in sendInitialDataToMe |
@@ -1923,6 +1968,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1923 | IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); | 1968 | IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); |
1924 | if (friendsModule != null) | 1969 | if (friendsModule != null) |
1925 | friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); | 1970 | friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); |
1971 | |||
1972 | m_log.DebugFormat("[CompleteMovement] friendsModule: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1926 | } | 1973 | } |
1927 | } | 1974 | } |
1928 | } | 1975 | } |
@@ -1931,11 +1978,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
1931 | m_inTransit = false; | 1978 | m_inTransit = false; |
1932 | } | 1979 | } |
1933 | // if hide force a check | 1980 | // if hide force a check |
1934 | if (!IsChildAgent && newhide) | 1981 | // if (!IsChildAgent && newhide) |
1935 | { | 1982 | // { |
1936 | ParcelLoginCheck(m_currentParcelUUID); | 1983 | // ParcelLoginCheck(m_currentParcelUUID); |
1937 | m_currentParcelHide = newhide; | 1984 | // m_currentParcelHide = newhide; |
1938 | } | 1985 | // } |
1986 | |||
1987 | m_log.DebugFormat("[CompleteMovement] end: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1939 | } | 1988 | } |
1940 | 1989 | ||
1941 | /// <summary> | 1990 | /// <summary> |
@@ -2776,34 +2825,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
2776 | 2825 | ||
2777 | if (satOnObject) | 2826 | if (satOnObject) |
2778 | { | 2827 | { |
2779 | // SendAvatarDataToAllAgents(); | ||
2780 | m_requestedSitTargetID = 0; | 2828 | m_requestedSitTargetID = 0; |
2781 | |||
2782 | part.RemoveSittingAvatar(UUID); | 2829 | part.RemoveSittingAvatar(UUID); |
2783 | |||
2784 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); | 2830 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); |
2785 | } | ||
2786 | 2831 | ||
2787 | else if (PhysicsActor == null) | 2832 | SendAvatarDataToAllAgents(); |
2788 | AddToPhysicalScene(false); | 2833 | } |
2789 | 2834 | ||
2790 | Animator.TrySetMovementAnimation("STAND"); | 2835 | Animator.TrySetMovementAnimation("STAND"); |
2791 | 2836 | ||
2792 | if (satOnObject) | ||
2793 | { | ||
2794 | ILandObject land = m_scene.LandChannel.GetLandObject(AbsolutePosition.X,AbsolutePosition.Y); | ||
2795 | if (land != null) | ||
2796 | { | ||
2797 | UUID parcelID = land.LandData.GlobalID; | ||
2798 | if (m_currentParcelUUID != parcelID) | ||
2799 | currentParcelUUID = parcelID; | ||
2800 | else | ||
2801 | SendAvatarDataToAllAgents(); | ||
2802 | } | ||
2803 | else | ||
2804 | SendAvatarDataToAllAgents(); | ||
2805 | } | ||
2806 | |||
2807 | TriggerScenePresenceUpdated(); | 2837 | TriggerScenePresenceUpdated(); |
2808 | } | 2838 | } |
2809 | 2839 | ||
@@ -3078,11 +3108,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
3078 | 3108 | ||
3079 | ParentPart = part; | 3109 | ParentPart = part; |
3080 | ParentID = part.LocalId; | 3110 | ParentID = part.LocalId; |
3111 | |||
3112 | SendAvatarDataToAllAgents(); | ||
3113 | |||
3081 | if(status == 3) | 3114 | if(status == 3) |
3082 | Animator.TrySetMovementAnimation("SIT_GROUND"); | 3115 | Animator.TrySetMovementAnimation("SIT_GROUND"); |
3083 | else | 3116 | else |
3084 | Animator.TrySetMovementAnimation("SIT"); | 3117 | Animator.TrySetMovementAnimation("SIT"); |
3085 | SendAvatarDataToAllAgents(); | 3118 | |
3086 | 3119 | ||
3087 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); | 3120 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); |
3088 | } | 3121 | } |
@@ -3182,13 +3215,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
3182 | Velocity = Vector3.Zero; | 3215 | Velocity = Vector3.Zero; |
3183 | RemoveFromPhysicalScene(); | 3216 | RemoveFromPhysicalScene(); |
3184 | 3217 | ||
3218 | SendAvatarDataToAllAgents(); | ||
3219 | |||
3185 | String sitAnimation = "SIT"; | 3220 | String sitAnimation = "SIT"; |
3186 | if (!String.IsNullOrEmpty(part.SitAnimation)) | 3221 | if (!String.IsNullOrEmpty(part.SitAnimation)) |
3187 | { | 3222 | { |
3188 | sitAnimation = part.SitAnimation; | 3223 | sitAnimation = part.SitAnimation; |
3189 | } | 3224 | } |
3190 | Animator.TrySetMovementAnimation(sitAnimation); | 3225 | Animator.TrySetMovementAnimation(sitAnimation); |
3191 | SendAvatarDataToAllAgents(); | ||
3192 | TriggerScenePresenceUpdated(); | 3226 | TriggerScenePresenceUpdated(); |
3193 | } | 3227 | } |
3194 | } | 3228 | } |
@@ -3349,8 +3383,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
3349 | 3383 | ||
3350 | #region Update Client(s) | 3384 | #region Update Client(s) |
3351 | 3385 | ||
3386 | public void SendUpdateToAgent(ScenePresence p) | ||
3387 | { | ||
3388 | IClientAPI remoteClient = p.ControllingClient; | ||
3389 | |||
3390 | if (remoteClient.IsActive) | ||
3391 | { | ||
3392 | //m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, Rotation, m_velocity); | ||
3393 | remoteClient.SendEntityUpdate(this, PrimUpdateFlags.FullUpdate); | ||
3394 | m_scene.StatsReporter.AddAgentUpdates(1); | ||
3395 | } | ||
3396 | } | ||
3397 | |||
3398 | public void SendFullUpdateToClient(IClientAPI remoteClient) | ||
3399 | { | ||
3400 | if (remoteClient.IsActive) | ||
3401 | { | ||
3402 | //m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, Rotation, m_velocity); | ||
3403 | remoteClient.SendEntityUpdate(this, PrimUpdateFlags.FullUpdate); | ||
3404 | m_scene.StatsReporter.AddAgentUpdates(1); | ||
3405 | } | ||
3406 | } | ||
3407 | |||
3352 | // this is diferente from SendTerseUpdateToClient | 3408 | // this is diferente from SendTerseUpdateToClient |
3353 | // this sends bypassing ententies updates | 3409 | // this sends bypassing entities updates |
3354 | public void SendAgentTerseUpdate(ISceneEntity p) | 3410 | public void SendAgentTerseUpdate(ISceneEntity p) |
3355 | { | 3411 | { |
3356 | ControllingClient.SendAgentTerseUpdate(p); | 3412 | ControllingClient.SendAgentTerseUpdate(p); |
@@ -3377,7 +3433,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3377 | } | 3433 | } |
3378 | } | 3434 | } |
3379 | 3435 | ||
3380 | public void SendTerseUpdateToAgentClient(ScenePresence p) | 3436 | public void SendTerseUpdateToAgent(ScenePresence p) |
3381 | { | 3437 | { |
3382 | IClientAPI remoteClient = p.ControllingClient; | 3438 | IClientAPI remoteClient = p.ControllingClient; |
3383 | 3439 | ||
@@ -3396,6 +3452,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
3396 | m_scene.StatsReporter.AddAgentUpdates(1); | 3452 | m_scene.StatsReporter.AddAgentUpdates(1); |
3397 | } | 3453 | } |
3398 | 3454 | ||
3455 | public void SendTerseUpdateToAgentNF(ScenePresence p) | ||
3456 | { | ||
3457 | IClientAPI remoteClient = p.ControllingClient; | ||
3458 | if (remoteClient.IsActive) | ||
3459 | { | ||
3460 | //m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, Rotation, m_velocity); | ||
3461 | remoteClient.SendEntityUpdate(this, PrimUpdateFlags.FullUpdate); | ||
3462 | m_scene.StatsReporter.AddAgentUpdates(1); | ||
3463 | } | ||
3464 | } | ||
3465 | |||
3466 | |||
3399 | // vars to support reduced update frequency when velocity is unchanged | 3467 | // vars to support reduced update frequency when velocity is unchanged |
3400 | private Vector3 lastVelocitySentToAllClients = Vector3.Zero; | 3468 | private Vector3 lastVelocitySentToAllClients = Vector3.Zero; |
3401 | private Vector3 lastPositionSentToAllClients = Vector3.Zero; | 3469 | private Vector3 lastPositionSentToAllClients = Vector3.Zero; |
@@ -3437,7 +3505,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3437 | 3505 | ||
3438 | // Console.WriteLine("Scheduled update for {0} in {1}", Name, Scene.Name); | 3506 | // Console.WriteLine("Scheduled update for {0} in {1}", Name, Scene.Name); |
3439 | // m_scene.ForEachClient(SendTerseUpdateToClient); | 3507 | // m_scene.ForEachClient(SendTerseUpdateToClient); |
3440 | m_scene.ForEachScenePresence(SendTerseUpdateToAgentClient); | 3508 | m_scene.ForEachScenePresence(SendTerseUpdateToAgent); |
3441 | } | 3509 | } |
3442 | TriggerScenePresenceUpdated(); | 3510 | TriggerScenePresenceUpdated(); |
3443 | } | 3511 | } |
@@ -3478,8 +3546,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3478 | landch.sendClientInitialLandInfo(ControllingClient); | 3546 | landch.sendClientInitialLandInfo(ControllingClient); |
3479 | } | 3547 | } |
3480 | } | 3548 | } |
3481 | SendOtherAgentsAvatarDataToMe(); | 3549 | |
3482 | SendOtherAgentsAppearanceToMe(); | 3550 | SendOtherAgentsAvatarFullToMe(); |
3483 | 3551 | ||
3484 | EntityBase[] entities = Scene.Entities.GetEntities(); | 3552 | EntityBase[] entities = Scene.Entities.GetEntities(); |
3485 | foreach (EntityBase e in entities) | 3553 | foreach (EntityBase e in entities) |
@@ -3508,40 +3576,56 @@ namespace OpenSim.Region.Framework.Scenes | |||
3508 | // to see if all the baked textures are already here. | 3576 | // to see if all the baked textures are already here. |
3509 | if (m_scene.AvatarFactory != null) | 3577 | if (m_scene.AvatarFactory != null) |
3510 | cachedappearance = m_scene.AvatarFactory.ValidateBakedTextureCache(this); | 3578 | cachedappearance = m_scene.AvatarFactory.ValidateBakedTextureCache(this); |
3511 | 3579 | ||
3512 | // If we aren't using a cached appearance, then clear out the baked textures | 3580 | // If we aren't using a cached appearance, then clear out the baked textures |
3513 | if (!cachedappearance) | 3581 | if (!cachedappearance) |
3514 | { | 3582 | { |
3515 | // Appearance.ResetAppearance(); | ||
3516 | // save what ???? | ||
3517 | // maybe needed so the tryretry repair works? | ||
3518 | if (m_scene.AvatarFactory != null) | 3583 | if (m_scene.AvatarFactory != null) |
3519 | m_scene.AvatarFactory.QueueAppearanceSave(UUID); | 3584 | m_scene.AvatarFactory.QueueAppearanceSave(UUID); |
3520 | } | 3585 | } |
3521 | 3586 | ||
3587 | bool newhide = m_currentParcelHide; | ||
3588 | m_currentParcelHide = false; | ||
3522 | 3589 | ||
3523 | // This agent just became root. We are going to tell everyone about it. The process of | ||
3524 | // getting other avatars information was initiated elsewhere immediately after the child circuit connected... don't do it | ||
3525 | // again here... this comes after the cached appearance check because the avatars | ||
3526 | // appearance goes into the avatar update packet | ||
3527 | SendAvatarDataToAllAgents(); | 3590 | SendAvatarDataToAllAgents(); |
3528 | 3591 | ||
3529 | // This invocation always shows up in the viewer logs as an error. Is it needed? | 3592 | if (newhide) |
3530 | // send all information we have | 3593 | { |
3531 | // possible not needed since viewer should ask about it | 3594 | ParcelLoginCheck(m_currentParcelUUID); |
3532 | // least it all ask for baked | 3595 | m_currentParcelHide = true; |
3596 | } | ||
3597 | |||
3533 | SendAppearanceToAgent(this); | 3598 | SendAppearanceToAgent(this); |
3534 | 3599 | ||
3535 | // If we are using the the cached appearance then send it out to everyone | 3600 | // if (cachedappearance) |
3536 | // send even grays | 3601 | // { |
3537 | if (cachedappearance) | 3602 | SendAppearanceToAllOtherAgents(); |
3603 | // } | ||
3604 | if(Animator!= null) | ||
3605 | Animator.SendAnimPack(); | ||
3606 | } | ||
3607 | |||
3608 | /// <summary> | ||
3609 | /// Send avatar full data appearance and animations for all other root agents to this agent, this agent | ||
3610 | /// can be either a child or root | ||
3611 | /// </summary> | ||
3612 | public void SendOtherAgentsAvatarFullToMe() | ||
3613 | { | ||
3614 | int count = 0; | ||
3615 | m_scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence) | ||
3538 | { | 3616 | { |
3539 | // m_log.DebugFormat("[SCENE PRESENCE]: Baked textures are in the cache for {0} in {1}", Name, m_scene.Name); | 3617 | // only send information about other root agents |
3540 | // If the avatars baked textures are all in the cache, then we have a | 3618 | if (scenePresence.UUID == UUID) |
3541 | // complete appearance... send it out, if not, then we'll send it when | 3619 | return; |
3542 | // the avatar finishes updating its appearance | 3620 | |
3543 | SendAppearanceToAllOtherAgents(); | 3621 | scenePresence.SendAvatarDataToAgent(this); |
3544 | } | 3622 | scenePresence.SendAppearanceToAgent(this); |
3623 | scenePresence.SendAnimPackToAgent(this); | ||
3624 | // for now attachments are sent with all SOG | ||
3625 | count++; | ||
3626 | }); | ||
3627 | |||
3628 | m_scene.StatsReporter.AddAgentUpdates(count); | ||
3545 | } | 3629 | } |
3546 | 3630 | ||
3547 | /// <summary> | 3631 | /// <summary> |
@@ -3566,33 +3650,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3566 | 3650 | ||
3567 | m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) | 3651 | m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) |
3568 | { | 3652 | { |
3569 | SendAvatarDataToAgent(scenePresence); | 3653 | SendAvatarDataToAgent(scenePresence); |
3570 | count++; | 3654 | count++; |
3571 | }); | 3655 | }); |
3572 | 3656 | ||
3573 | m_scene.StatsReporter.AddAgentUpdates(count); | 3657 | m_scene.StatsReporter.AddAgentUpdates(count); |
3574 | } | 3658 | } |
3575 | |||
3576 | /// <summary> | ||
3577 | /// Send avatar data for all other root agents to this agent, this agent | ||
3578 | /// can be either a child or root | ||
3579 | /// </summary> | ||
3580 | public void SendOtherAgentsAvatarDataToMe() | ||
3581 | { | ||
3582 | int count = 0; | ||
3583 | |||
3584 | m_scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence) | ||
3585 | { | ||
3586 | // only send information about other root agents | ||
3587 | if (scenePresence.UUID == UUID) | ||
3588 | return; | ||
3589 | |||
3590 | scenePresence.SendAvatarDataToAgent(this); | ||
3591 | count++; | ||
3592 | }); | ||
3593 | |||
3594 | m_scene.StatsReporter.AddAgentUpdates(count); | ||
3595 | } | ||
3596 | 3659 | ||
3597 | /// <summary> | 3660 | /// <summary> |
3598 | /// Send avatar data to an agent. | 3661 | /// Send avatar data to an agent. |
@@ -3604,7 +3667,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
3604 | if (ParcelHideThisAvatar && currentParcelUUID != avatar.currentParcelUUID && avatar.GodLevel < 200) | 3667 | if (ParcelHideThisAvatar && currentParcelUUID != avatar.currentParcelUUID && avatar.GodLevel < 200) |
3605 | return; | 3668 | return; |
3606 | avatar.ControllingClient.SendAvatarDataImmediate(this); | 3669 | avatar.ControllingClient.SendAvatarDataImmediate(this); |
3607 | Animator.SendAnimPackToClient(avatar.ControllingClient); | 3670 | } |
3671 | |||
3672 | public void SendAvatarDataToAgentNF(ScenePresence avatar) | ||
3673 | { | ||
3674 | avatar.ControllingClient.SendAvatarDataImmediate(this); | ||
3608 | } | 3675 | } |
3609 | 3676 | ||
3610 | /// <summary> | 3677 | /// <summary> |
@@ -3639,28 +3706,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3639 | } | 3706 | } |
3640 | 3707 | ||
3641 | /// <summary> | 3708 | /// <summary> |
3642 | /// Send appearance from all other root agents to this agent. this agent | ||
3643 | /// can be either root or child | ||
3644 | /// </summary> | ||
3645 | public void SendOtherAgentsAppearanceToMe() | ||
3646 | { | ||
3647 | // m_log.DebugFormat("[SCENE PRESENCE] SendOtherAgentsAppearanceToMe: {0} {1}", Name, UUID); | ||
3648 | |||
3649 | int count = 0; | ||
3650 | m_scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence) | ||
3651 | { | ||
3652 | // only send information about other root agents | ||
3653 | if (scenePresence.UUID == UUID) | ||
3654 | return; | ||
3655 | |||
3656 | scenePresence.SendAppearanceToAgent(this); | ||
3657 | count++; | ||
3658 | }); | ||
3659 | |||
3660 | m_scene.StatsReporter.AddAgentUpdates(count); | ||
3661 | } | ||
3662 | |||
3663 | /// <summary> | ||
3664 | /// Send appearance data to an agent. | 3709 | /// Send appearance data to an agent. |
3665 | /// </summary> | 3710 | /// </summary> |
3666 | /// <param name="avatar"></param> | 3711 | /// <param name="avatar"></param> |
@@ -3674,6 +3719,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
3674 | UUID, Appearance.VisualParams, Appearance.Texture.GetBytes()); | 3719 | UUID, Appearance.VisualParams, Appearance.Texture.GetBytes()); |
3675 | } | 3720 | } |
3676 | 3721 | ||
3722 | public void SendAnimPackToAgent(ScenePresence p) | ||
3723 | { | ||
3724 | if (IsChildAgent || Animator == null) | ||
3725 | return; | ||
3726 | |||
3727 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
3728 | return; | ||
3729 | |||
3730 | Animator.SendAnimPackToClient(p.ControllingClient); | ||
3731 | } | ||
3732 | |||
3733 | public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs) | ||
3734 | { | ||
3735 | if (IsChildAgent) | ||
3736 | return; | ||
3737 | |||
3738 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | ||
3739 | { | ||
3740 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
3741 | return; | ||
3742 | p.ControllingClient.SendAnimations(animations, seqs, ControllingClient.AgentId, objectIDs); | ||
3743 | }); | ||
3744 | } | ||
3745 | |||
3677 | #endregion | 3746 | #endregion |
3678 | 3747 | ||
3679 | #region Significant Movement Method | 3748 | #region Significant Movement Method |
@@ -4193,13 +4262,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
4193 | } | 4262 | } |
4194 | catch { } | 4263 | catch { } |
4195 | 4264 | ||
4265 | Animator.ResetAnimations(); | ||
4266 | |||
4196 | // FIXME: Why is this null check necessary? Where are the cases where we get a null Anims object? | 4267 | // FIXME: Why is this null check necessary? Where are the cases where we get a null Anims object? |
4197 | if (cAgent.Anims != null) | ||
4198 | Animator.Animations.FromArray(cAgent.Anims); | ||
4199 | if (cAgent.DefaultAnim != null) | 4268 | if (cAgent.DefaultAnim != null) |
4200 | Animator.Animations.SetDefaultAnimation(cAgent.DefaultAnim.AnimID, cAgent.DefaultAnim.SequenceNum, UUID.Zero); | 4269 | Animator.Animations.SetDefaultAnimation(cAgent.DefaultAnim.AnimID, cAgent.DefaultAnim.SequenceNum, UUID.Zero); |
4201 | if (cAgent.AnimState != null) | 4270 | if (cAgent.AnimState != null) |
4202 | Animator.Animations.SetImplicitDefaultAnimation(cAgent.AnimState.AnimID, cAgent.AnimState.SequenceNum, UUID.Zero); | 4271 | Animator.Animations.SetImplicitDefaultAnimation(cAgent.AnimState.AnimID, cAgent.AnimState.SequenceNum, UUID.Zero); |
4272 | if (cAgent.Anims != null) | ||
4273 | Animator.Animations.FromArray(cAgent.Anims); | ||
4203 | 4274 | ||
4204 | if (Scene.AttachmentsModule != null) | 4275 | if (Scene.AttachmentsModule != null) |
4205 | Scene.AttachmentsModule.CopyAttachments(cAgent, this); | 4276 | Scene.AttachmentsModule.CopyAttachments(cAgent, this); |
@@ -4653,18 +4724,186 @@ namespace OpenSim.Region.Framework.Scenes | |||
4653 | return validated; | 4724 | return validated; |
4654 | } | 4725 | } |
4655 | 4726 | ||
4727 | public void SendAttachmentsToAllAgents() | ||
4728 | { | ||
4729 | lock (m_attachments) | ||
4730 | { | ||
4731 | foreach (SceneObjectGroup sog in m_attachments) | ||
4732 | { | ||
4733 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | ||
4734 | { | ||
4735 | if (p != this && sog.HasPrivateAttachmentPoint) | ||
4736 | return; | ||
4737 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
4738 | return; | ||
4739 | sog.SendFullUpdateToClient(p.ControllingClient); | ||
4740 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path | ||
4741 | }); | ||
4742 | } | ||
4743 | } | ||
4744 | } | ||
4656 | 4745 | ||
4657 | public void SendAttachmentsToClient(IClientAPI client) | 4746 | // send attachments to a client without filters except for huds |
4747 | // for now they are checked in several places down the line... | ||
4748 | public void SendAttachmentsToAgentNF(ScenePresence p) | ||
4658 | { | 4749 | { |
4659 | lock (m_attachments) | 4750 | lock (m_attachments) |
4660 | { | 4751 | { |
4661 | foreach (SceneObjectGroup gobj in m_attachments) | 4752 | foreach (SceneObjectGroup sog in m_attachments) |
4753 | { | ||
4754 | if (p == this || !sog.HasPrivateAttachmentPoint) | ||
4755 | sog.SendFullUpdateToClient(p.ControllingClient); | ||
4756 | } | ||
4757 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path | ||
4758 | } | ||
4759 | } | ||
4760 | |||
4761 | public void SendAttachmentsToAgentNFPK(ScenePresence p) | ||
4762 | { | ||
4763 | lock (m_attachments) | ||
4764 | { | ||
4765 | List<uint> pk = new List<uint>(); | ||
4766 | foreach (SceneObjectGroup sog in m_attachments) | ||
4767 | { | ||
4768 | foreach (SceneObjectPart part in sog.Parts) | ||
4769 | pk.Add(part.LocalId); | ||
4770 | } | ||
4771 | |||
4772 | p.ControllingClient.SendKillObject(pk); | ||
4773 | |||
4774 | foreach (SceneObjectGroup sog in m_attachments) | ||
4662 | { | 4775 | { |
4663 | gobj.SendFullUpdateToClient(client); | 4776 | if (p == this || !sog.HasPrivateAttachmentPoint) |
4777 | sog.SendFullUpdateToClient(p.ControllingClient); | ||
4664 | } | 4778 | } |
4779 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path | ||
4665 | } | 4780 | } |
4666 | } | 4781 | } |
4667 | 4782 | ||
4783 | |||
4784 | public void SendAttachmentScheduleUpdate(SceneObjectGroup sog) | ||
4785 | { | ||
4786 | if (IsChildAgent) | ||
4787 | return; | ||
4788 | |||
4789 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | ||
4790 | { | ||
4791 | if (p != this && sog.HasPrivateAttachmentPoint) | ||
4792 | return; | ||
4793 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
4794 | return; | ||
4795 | |||
4796 | SceneObjectPart[] parts = sog.Parts; | ||
4797 | |||
4798 | for (int i = 0; i < parts.Length; i++) | ||
4799 | { | ||
4800 | SceneObjectPart part = parts[i]; | ||
4801 | if (part.UpdateFlag == UpdateRequired.TERSE) | ||
4802 | { | ||
4803 | p.ControllingClient.SendEntityUpdate(part, | ||
4804 | PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4805 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); | ||
4806 | part.UpdateFlag = 0; | ||
4807 | } | ||
4808 | else if (part.UpdateFlag == UpdateRequired.FULL) | ||
4809 | { | ||
4810 | p.ControllingClient.SendEntityUpdate(part, PrimUpdateFlags.FullUpdate); | ||
4811 | part.UpdateFlag = 0; | ||
4812 | } | ||
4813 | } | ||
4814 | }); | ||
4815 | } | ||
4816 | |||
4817 | public void SendAttachmentScheduleUpdate(SceneObjectPart part) | ||
4818 | { | ||
4819 | if (IsChildAgent) | ||
4820 | return; | ||
4821 | |||
4822 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | ||
4823 | { | ||
4824 | if (p != this && part.ParentGroup.HasPrivateAttachmentPoint) | ||
4825 | return; | ||
4826 | |||
4827 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
4828 | return; | ||
4829 | |||
4830 | if (part.UpdateFlag == UpdateRequired.TERSE) | ||
4831 | { | ||
4832 | p.ControllingClient.SendEntityUpdate(part, | ||
4833 | PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4834 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); | ||
4835 | part.UpdateFlag = 0; | ||
4836 | } | ||
4837 | else if (part.UpdateFlag == UpdateRequired.FULL) | ||
4838 | { | ||
4839 | p.ControllingClient.SendEntityUpdate(part, PrimUpdateFlags.FullUpdate); | ||
4840 | part.UpdateFlag = 0; | ||
4841 | } | ||
4842 | }); | ||
4843 | } | ||
4844 | |||
4845 | public void SendAttachmentUpdate(SceneObjectGroup sog, UpdateRequired UpdateFlag) | ||
4846 | { | ||
4847 | if (IsChildAgent) | ||
4848 | return; | ||
4849 | |||
4850 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | ||
4851 | { | ||
4852 | if (p != this && sog.HasPrivateAttachmentPoint) | ||
4853 | return; | ||
4854 | |||
4855 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
4856 | return; | ||
4857 | |||
4858 | SceneObjectPart[] parts = sog.Parts; | ||
4859 | |||
4860 | for (int i = 0; i < parts.Length; i++) | ||
4861 | { | ||
4862 | SceneObjectPart part = parts[i]; | ||
4863 | if (UpdateFlag == UpdateRequired.TERSE) | ||
4864 | { | ||
4865 | p.ControllingClient.SendEntityUpdate(part, | ||
4866 | PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4867 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); | ||
4868 | part.UpdateFlag = 0; | ||
4869 | } | ||
4870 | else if (UpdateFlag == UpdateRequired.FULL) | ||
4871 | { | ||
4872 | p.ControllingClient.SendEntityUpdate(part, PrimUpdateFlags.FullUpdate); | ||
4873 | part.UpdateFlag = 0; | ||
4874 | } | ||
4875 | } | ||
4876 | }); | ||
4877 | } | ||
4878 | |||
4879 | public void SendAttachmentUpdate(SceneObjectPart part, UpdateRequired UpdateFlag) | ||
4880 | { | ||
4881 | if (IsChildAgent) | ||
4882 | return; | ||
4883 | |||
4884 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | ||
4885 | { | ||
4886 | if (p != this && part.ParentGroup.HasPrivateAttachmentPoint) | ||
4887 | return; | ||
4888 | |||
4889 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
4890 | return; | ||
4891 | |||
4892 | if (UpdateFlag == UpdateRequired.TERSE) | ||
4893 | { | ||
4894 | p.ControllingClient.SendEntityUpdate(part, | ||
4895 | PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4896 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); | ||
4897 | part.UpdateFlag = 0; | ||
4898 | } | ||
4899 | else if (UpdateFlag == UpdateRequired.FULL) | ||
4900 | { | ||
4901 | p.ControllingClient.SendEntityUpdate(part, PrimUpdateFlags.FullUpdate); | ||
4902 | part.UpdateFlag = 0; | ||
4903 | } | ||
4904 | }); | ||
4905 | } | ||
4906 | |||
4668 | /// <summary> | 4907 | /// <summary> |
4669 | /// Send a script event to this scene presence's attachments | 4908 | /// Send a script event to this scene presence's attachments |
4670 | /// </summary> | 4909 | /// </summary> |
@@ -5436,12 +5675,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
5436 | { | 5675 | { |
5437 | if (p.IsChildAgent) | 5676 | if (p.IsChildAgent) |
5438 | continue; | 5677 | continue; |
5439 | m_log.Debug("[AVATAR]: viewMe: " + Lastname + " " + p.Lastname); | 5678 | |
5440 | ControllingClient.SendAvatarDataImmediate(p); | 5679 | p.SendAvatarDataToAgentNF(this); |
5441 | p.SendAppearanceToAgent(this); | 5680 | p.SendAppearanceToAgent(this); |
5442 | p.SendAttachmentsToClient(ControllingClient); | ||
5443 | if (p.Animator != null) | 5681 | if (p.Animator != null) |
5444 | p.Animator.SendAnimPackToClient(ControllingClient); | 5682 | p.Animator.SendAnimPackToClient(ControllingClient); |
5683 | p.SendAttachmentsToAgentNFPK(this); | ||
5445 | } | 5684 | } |
5446 | } | 5685 | } |
5447 | } | 5686 | } |
@@ -5476,7 +5715,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5476 | private void ParcelLoginCheck(UUID currentParcelID) | 5715 | private void ParcelLoginCheck(UUID currentParcelID) |
5477 | { | 5716 | { |
5478 | List<ScenePresence> killsToSendto = new List<ScenePresence>(); | 5717 | List<ScenePresence> killsToSendto = new List<ScenePresence>(); |
5479 | List<ScenePresence> killsToSendme = new List<ScenePresence>(); | 5718 | List<uint> killsToSendme = new List<uint>(); |
5480 | List<ScenePresence> viewsToSendto = new List<ScenePresence>(); | 5719 | List<ScenePresence> viewsToSendto = new List<ScenePresence>(); |
5481 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); | 5720 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); |
5482 | List<ScenePresence> allpresences = null; | 5721 | List<ScenePresence> allpresences = null; |
@@ -5492,8 +5731,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
5492 | { | 5731 | { |
5493 | if (p.GodLevel < 200) | 5732 | if (p.GodLevel < 200) |
5494 | killsToSendto.Add(p); | 5733 | killsToSendto.Add(p); |
5495 | if (GodLevel < 200 && p.ParcelHideThisAvatar) | 5734 | // if (GodLevel < 200 && p.ParcelHideThisAvatar) |
5496 | killsToSendme.Add(p); | 5735 | // killsToSendme.Add(p.LocalId); |
5497 | } | 5736 | } |
5498 | else | 5737 | else |
5499 | { | 5738 | { |
@@ -5517,14 +5756,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
5517 | 5756 | ||
5518 | if (killsToSendme.Count > 0) | 5757 | if (killsToSendme.Count > 0) |
5519 | { | 5758 | { |
5520 | foreach (ScenePresence p in killsToSendme) | 5759 | m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + killsToSendme.Count.ToString()); |
5760 | try | ||
5521 | { | 5761 | { |
5522 | m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + p.Lastname); | 5762 | ControllingClient.SendKillObject(killsToSendme); |
5523 | try { ControllingClient.SendKillObject(new List<uint> { p.LocalId }); } | ||
5524 | catch (NullReferenceException) { } | ||
5525 | } | 5763 | } |
5526 | } | 5764 | catch (NullReferenceException) { } |
5527 | 5765 | ||
5766 | } | ||
5767 | /* | ||
5528 | if (viewsToSendto.Count > 0 && PresenceType != PresenceType.Npc) | 5768 | if (viewsToSendto.Count > 0 && PresenceType != PresenceType.Npc) |
5529 | { | 5769 | { |
5530 | foreach (ScenePresence p in viewsToSendto) | 5770 | foreach (ScenePresence p in viewsToSendto) |
@@ -5552,81 +5792,46 @@ namespace OpenSim.Region.Framework.Scenes | |||
5552 | p.Animator.SendAnimPackToClient(ControllingClient); | 5792 | p.Animator.SendAnimPackToClient(ControllingClient); |
5553 | } | 5793 | } |
5554 | } | 5794 | } |
5795 | */ | ||
5555 | } | 5796 | } |
5556 | 5797 | ||
5557 | public void parcelRegionCross(bool abort) | 5798 | |
5799 | public void parcelRegionCross() | ||
5558 | { | 5800 | { |
5559 | if (!ParcelHideThisAvatar) | 5801 | if (!ParcelHideThisAvatar || GodLevel >= 200) |
5560 | return; | 5802 | return; |
5561 | 5803 | ||
5562 | List<ScenePresence> allpresences = null; | 5804 | List<ScenePresence> allpresences = null; |
5563 | allpresences = m_scene.GetScenePresences(); | 5805 | allpresences = m_scene.GetScenePresences(); |
5564 | 5806 | ||
5565 | if (abort) | 5807 | List<uint> killsToSendme = new List<uint>(); |
5566 | { | ||
5567 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); | ||
5568 | |||
5569 | foreach (ScenePresence p in allpresences) | ||
5570 | { | ||
5571 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | ||
5572 | continue; | ||
5573 | |||
5574 | if (p.currentParcelUUID == m_currentParcelUUID) | ||
5575 | { | ||
5576 | viewsToSendme.Add(p); | ||
5577 | } | ||
5578 | } | ||
5579 | 5808 | ||
5580 | if (viewsToSendme.Count > 0) | 5809 | foreach (ScenePresence p in allpresences) |
5581 | { | ||
5582 | foreach (ScenePresence p in viewsToSendme) | ||
5583 | { | ||
5584 | if (p.IsChildAgent) | ||
5585 | continue; | ||
5586 | // m_log.Debug("[AVATAR]: viewMe: " + Lastname + " " + p.Lastname); | ||
5587 | ControllingClient.SendAvatarDataImmediate(p); | ||
5588 | p.SendAppearanceToAgent(this); | ||
5589 | p.SendAttachmentsToClient(ControllingClient); | ||
5590 | if (p.Animator != null) | ||
5591 | p.Animator.SendAnimPackToClient(ControllingClient); | ||
5592 | } | ||
5593 | } | ||
5594 | } | ||
5595 | else | ||
5596 | { | 5810 | { |
5597 | if (GodLevel >= 200) | 5811 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) |
5598 | return; | 5812 | continue; |
5599 | 5813 | ||
5600 | List<ScenePresence> killsToSendme = new List<ScenePresence>(); | 5814 | if (p.currentParcelUUID == m_currentParcelUUID) |
5601 | foreach (ScenePresence p in allpresences) | ||
5602 | { | 5815 | { |
5603 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | 5816 | killsToSendme.Add(p.LocalId); |
5604 | continue; | ||
5605 | |||
5606 | if (p.currentParcelUUID == m_currentParcelUUID) | ||
5607 | { | ||
5608 | killsToSendme.Add(p); | ||
5609 | } | ||
5610 | } | 5817 | } |
5818 | } | ||
5611 | 5819 | ||
5612 | if (killsToSendme.Count > 0) | 5820 | if (killsToSendme.Count > 0) |
5821 | { | ||
5822 | try | ||
5613 | { | 5823 | { |
5614 | foreach (ScenePresence p in killsToSendme) | 5824 | ControllingClient.SendKillObject(killsToSendme); |
5615 | { | ||
5616 | m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + p.Lastname); | ||
5617 | try { ControllingClient.SendKillObject(new List<uint> { p.LocalId }); } | ||
5618 | catch (NullReferenceException) { } | ||
5619 | } | ||
5620 | } | 5825 | } |
5826 | catch (NullReferenceException) { } | ||
5621 | } | 5827 | } |
5622 | } | 5828 | } |
5623 | |||
5624 | 5829 | ||
5625 | private void ParcelCrossCheck(UUID currentParcelID,UUID previusParcelID, | 5830 | private void ParcelCrossCheck(UUID currentParcelID,UUID previusParcelID, |
5626 | bool currentParcelHide, bool previusParcelHide, bool oldhide,bool check) | 5831 | bool currentParcelHide, bool previusParcelHide, bool oldhide,bool check) |
5627 | { | 5832 | { |
5628 | List<ScenePresence> killsToSendto = new List<ScenePresence>(); | 5833 | List<ScenePresence> killsToSendto = new List<ScenePresence>(); |
5629 | List<ScenePresence> killsToSendme = new List<ScenePresence>(); | 5834 | List<uint> killsToSendme = new List<uint>(); |
5630 | List<ScenePresence> viewsToSendto = new List<ScenePresence>(); | 5835 | List<ScenePresence> viewsToSendto = new List<ScenePresence>(); |
5631 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); | 5836 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); |
5632 | List<ScenePresence> allpresences = null; | 5837 | List<ScenePresence> allpresences = null; |
@@ -5697,7 +5902,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5697 | if(p.GodLevel < 200) | 5902 | if(p.GodLevel < 200) |
5698 | killsToSendto.Add(p); // they dont see me | 5903 | killsToSendto.Add(p); // they dont see me |
5699 | if(GodLevel < 200) | 5904 | if(GodLevel < 200) |
5700 | killsToSendme.Add(p); // i dont see them | 5905 | killsToSendme.Add(p.LocalId); // i dont see them |
5701 | } | 5906 | } |
5702 | // only those on new parcel need see | 5907 | // only those on new parcel need see |
5703 | if (currentParcelID == p.currentParcelUUID) | 5908 | if (currentParcelID == p.currentParcelUUID) |
@@ -5746,7 +5951,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5746 | // only those old parcel need receive kills | 5951 | // only those old parcel need receive kills |
5747 | if (previusParcelID == p.currentParcelUUID && GodLevel < 200) | 5952 | if (previusParcelID == p.currentParcelUUID && GodLevel < 200) |
5748 | { | 5953 | { |
5749 | killsToSendme.Add(p); // i dont see them | 5954 | killsToSendme.Add(p.LocalId); // i dont see them |
5750 | } | 5955 | } |
5751 | else | 5956 | else |
5752 | { | 5957 | { |
@@ -5771,26 +5976,26 @@ namespace OpenSim.Region.Framework.Scenes | |||
5771 | } | 5976 | } |
5772 | } | 5977 | } |
5773 | 5978 | ||
5774 | if (killsToSendme.Count > 0 ) | 5979 | if (killsToSendme.Count > 0) |
5775 | { | 5980 | { |
5776 | foreach (ScenePresence p in killsToSendme) | 5981 | m_log.Debug("[AVATAR]: killtoMe: " + Lastname + " " + killsToSendme.Count.ToString()); |
5982 | try | ||
5777 | { | 5983 | { |
5778 | m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + p.Lastname); | 5984 | ControllingClient.SendKillObject(killsToSendme); |
5779 | try {ControllingClient.SendKillObject(new List<uint> { p.LocalId }); } | ||
5780 | catch (NullReferenceException) { } | ||
5781 | } | 5985 | } |
5986 | catch (NullReferenceException) { } | ||
5987 | |||
5782 | } | 5988 | } |
5783 | 5989 | ||
5784 | if (viewsToSendto.Count > 0 && PresenceType != PresenceType.Npc) | 5990 | if (viewsToSendto.Count > 0 && PresenceType != PresenceType.Npc) |
5785 | { | 5991 | { |
5786 | foreach (ScenePresence p in viewsToSendto) | 5992 | foreach (ScenePresence p in viewsToSendto) |
5787 | { | 5993 | { |
5788 | p.ControllingClient.SendAvatarDataImmediate(this); | 5994 | SendAvatarDataToAgentNF(p); |
5789 | // m_log.Debug("[AVATAR]: viewTo: " + Lastname + " " + p.Lastname); | ||
5790 | SendAppearanceToAgent(p); | 5995 | SendAppearanceToAgent(p); |
5791 | SendAttachmentsToClient(p.ControllingClient); | ||
5792 | if (Animator != null) | 5996 | if (Animator != null) |
5793 | Animator.SendAnimPackToClient(p.ControllingClient); | 5997 | Animator.SendAnimPackToClient(p.ControllingClient); |
5998 | SendAttachmentsToAgentNFPK(p); | ||
5794 | } | 5999 | } |
5795 | } | 6000 | } |
5796 | 6001 | ||
@@ -5801,11 +6006,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
5801 | if (p.IsChildAgent) | 6006 | if (p.IsChildAgent) |
5802 | continue; | 6007 | continue; |
5803 | // m_log.Debug("[AVATAR]: viewMe: " + Lastname + "<-" + p.Lastname); | 6008 | // m_log.Debug("[AVATAR]: viewMe: " + Lastname + "<-" + p.Lastname); |
5804 | ControllingClient.SendAvatarDataImmediate(p); | 6009 | |
6010 | p.SendAvatarDataToAgentNF(this); | ||
5805 | p.SendAppearanceToAgent(this); | 6011 | p.SendAppearanceToAgent(this); |
5806 | p.SendAttachmentsToClient(ControllingClient); | ||
5807 | if (p.Animator != null) | 6012 | if (p.Animator != null) |
5808 | p.Animator.SendAnimPackToClient(ControllingClient); | 6013 | p.Animator.SendAnimPackToClient(ControllingClient); |
6014 | p.SendAttachmentsToAgentNFPK(this); | ||
5809 | } | 6015 | } |
5810 | } | 6016 | } |
5811 | } | 6017 | } |
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 373ed41..f35ea92 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs | |||
@@ -58,6 +58,8 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
58 | 58 | ||
59 | public ISceneAgent SceneAgent { get; set; } | 59 | public ISceneAgent SceneAgent { get; set; } |
60 | 60 | ||
61 | public int PingTimeMS { get { return 0; } } | ||
62 | |||
61 | private string m_username; | 63 | private string m_username; |
62 | private string m_nick; | 64 | private string m_nick; |
63 | 65 | ||
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index c88ccc5..7002d75 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | |||
@@ -81,6 +81,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
81 | get { return m_scene; } | 81 | get { return m_scene; } |
82 | } | 82 | } |
83 | 83 | ||
84 | public int PingTimeMS { get { return 0; } } | ||
85 | |||
84 | public UUID OwnerID | 86 | public UUID OwnerID |
85 | { | 87 | { |
86 | get { return m_ownerID; } | 88 | get { return m_ownerID; } |
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 52e0134..f3eaed3 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs | |||
@@ -379,6 +379,8 @@ namespace OpenSim.Tests.Common.Mock | |||
379 | get { return FirstName + " " + LastName; } | 379 | get { return FirstName + " " + LastName; } |
380 | } | 380 | } |
381 | 381 | ||
382 | public int PingTimeMS { get { return 0; } } | ||
383 | |||
382 | public bool IsActive | 384 | public bool IsActive |
383 | { | 385 | { |
384 | get { return true; } | 386 | get { return true; } |