diff options
Diffstat (limited to 'OpenSim')
18 files changed, 995 insertions, 659 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..d73802e 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> |
@@ -1114,6 +1116,8 @@ namespace OpenSim.Framework | |||
1114 | /// <param name="localID"></param> | 1116 | /// <param name="localID"></param> |
1115 | void SendKillObject(List<uint> localID); | 1117 | void SendKillObject(List<uint> localID); |
1116 | 1118 | ||
1119 | void SendPartFullUpdate(ISceneEntity ent, uint? parentID); | ||
1120 | |||
1117 | void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs); | 1121 | void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs); |
1118 | void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args); | 1122 | void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args); |
1119 | 1123 | ||
diff --git a/OpenSim/Framework/PriorityQueue.cs b/OpenSim/Framework/PriorityQueue.cs index e4f1111..d6c39a7 100644 --- a/OpenSim/Framework/PriorityQueue.cs +++ b/OpenSim/Framework/PriorityQueue.cs | |||
@@ -62,7 +62,9 @@ namespace OpenSim.Framework | |||
62 | private uint m_nextQueue = 0; | 62 | private uint m_nextQueue = 0; |
63 | private uint m_countFromQueue = 0; | 63 | private uint m_countFromQueue = 0; |
64 | // first queues are imediate, so no counts | 64 | // first queues are imediate, so no counts |
65 | private uint[] m_queueCounts = {0, 0, 8, 4, 4, 2, 2, 2, 2, 1, 1, 1}; | 65 | // private uint[] m_queueCounts = { 0, 0, 8, 4, 4, 2, 2, 2, 2, 1, 1, 1 }; |
66 | private uint[] m_queueCounts = {0, 0, 8, 8, 5, 4, 3, 2, 1, 1, 1, 1}; | ||
67 | // this is ava, ava, attach, <10m, 20,40,80,160m,320,640,1280, + | ||
66 | 68 | ||
67 | // next request is a counter of the number of updates queued, it provides | 69 | // next request is a counter of the number of updates queued, it provides |
68 | // a total ordering on the updates coming through the queue and is more | 70 | // a total ordering on the updates coming through the queue and is more |
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..06f1301 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 | ||
@@ -3824,47 +3838,53 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3824 | m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags, m_scene.TimeDilation)); | 3838 | m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags, m_scene.TimeDilation)); |
3825 | } | 3839 | } |
3826 | 3840 | ||
3827 | /// <summary> | 3841 | /* dont use this |
3828 | /// Requeue an EntityUpdate when it was not acknowledged by the client. | 3842 | udp packet resent must be done at udp level only |
3829 | /// We will update the priority and put it in the correct queue, merging update flags | 3843 | re map from a packet to original updates just doesnt work |
3830 | /// with any other updates that may be queued for the same entity. | ||
3831 | /// The original update time is used for the merged update. | ||
3832 | /// </summary> | ||
3833 | private void ResendPrimUpdate(EntityUpdate update) | ||
3834 | { | ||
3835 | // If the update exists in priority queue, it will be updated. | ||
3836 | // If it does not exist then it will be added with the current (rather than its original) priority | ||
3837 | uint priority = m_prioritizer.GetUpdatePriority(this, update.Entity); | ||
3838 | 3844 | ||
3839 | lock (m_entityUpdates.SyncRoot) | 3845 | /// <summary> |
3840 | m_entityUpdates.Enqueue(priority, update); | 3846 | /// Requeue an EntityUpdate when it was not acknowledged by the client. |
3841 | } | 3847 | /// We will update the priority and put it in the correct queue, merging update flags |
3848 | /// with any other updates that may be queued for the same entity. | ||
3849 | /// The original update time is used for the merged update. | ||
3850 | /// </summary> | ||
3851 | private void ResendPrimUpdate(EntityUpdate update) | ||
3852 | { | ||
3853 | // If the update exists in priority queue, it will be updated. | ||
3854 | // If it does not exist then it will be added with the current (rather than its original) priority | ||
3855 | uint priority = m_prioritizer.GetUpdatePriority(this, update.Entity); | ||
3842 | 3856 | ||
3843 | /// <summary> | 3857 | lock (m_entityUpdates.SyncRoot) |
3844 | /// Requeue a list of EntityUpdates when they were not acknowledged by the client. | 3858 | m_entityUpdates.Enqueue(priority, update); |
3845 | /// We will update the priority and put it in the correct queue, merging update flags | 3859 | } |
3846 | /// with any other updates that may be queued for the same entity. | ||
3847 | /// The original update time is used for the merged update. | ||
3848 | /// </summary> | ||
3849 | private void ResendPrimUpdates(List<EntityUpdate> updates, OutgoingPacket oPacket) | ||
3850 | { | ||
3851 | // m_log.WarnFormat("[CLIENT] resending prim updates {0}, packet sequence number {1}", updates[0].UpdateTime, oPacket.SequenceNumber); | ||
3852 | 3860 | ||
3853 | // Remove the update packet from the list of packets waiting for acknowledgement | ||
3854 | // because we are requeuing the list of updates. They will be resent in new packets | ||
3855 | // with the most recent state and priority. | ||
3856 | m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber); | ||
3857 | 3861 | ||
3858 | // Count this as a resent packet since we are going to requeue all of the updates contained in it | 3862 | /// <summary> |
3859 | Interlocked.Increment(ref m_udpClient.PacketsResent); | 3863 | /// Requeue a list of EntityUpdates when they were not acknowledged by the client. |
3864 | /// We will update the priority and put it in the correct queue, merging update flags | ||
3865 | /// with any other updates that may be queued for the same entity. | ||
3866 | /// The original update time is used for the merged update. | ||
3867 | /// </summary> | ||
3868 | private void ResendPrimUpdates(List<EntityUpdate> updates, OutgoingPacket oPacket) | ||
3869 | { | ||
3870 | // m_log.WarnFormat("[CLIENT] resending prim updates {0}, packet sequence number {1}", updates[0].UpdateTime, oPacket.SequenceNumber); | ||
3860 | 3871 | ||
3861 | // We're not going to worry about interlock yet since its not currently critical that this total count | 3872 | // Remove the update packet from the list of packets waiting for acknowledgement |
3862 | // is 100% correct | 3873 | // because we are requeuing the list of updates. They will be resent in new packets |
3863 | m_udpServer.PacketsResentCount++; | 3874 | // with the most recent state and priority. |
3875 | m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber); | ||
3864 | 3876 | ||
3865 | foreach (EntityUpdate update in updates) | 3877 | // Count this as a resent packet since we are going to requeue all of the updates contained in it |
3866 | ResendPrimUpdate(update); | 3878 | Interlocked.Increment(ref m_udpClient.PacketsResent); |
3867 | } | 3879 | |
3880 | // We're not going to worry about interlock yet since its not currently critical that this total count | ||
3881 | // is 100% correct | ||
3882 | m_udpServer.PacketsResentCount++; | ||
3883 | |||
3884 | foreach (EntityUpdate update in updates) | ||
3885 | ResendPrimUpdate(update); | ||
3886 | } | ||
3887 | */ | ||
3868 | 3888 | ||
3869 | // OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); | 3889 | // OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); |
3870 | // OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>> compressedUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>>(); | 3890 | // OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>> compressedUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>>(); |
@@ -3932,8 +3952,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3932 | 3952 | ||
3933 | if (part.ParentGroup.IsAttachment) | 3953 | if (part.ParentGroup.IsAttachment) |
3934 | { // Someone else's HUD, why are we getting these? | 3954 | { // Someone else's HUD, why are we getting these? |
3935 | if (part.ParentGroup.OwnerID != AgentId && | 3955 | if (part.ParentGroup.OwnerID != AgentId && part.ParentGroup.HasPrivateAttachmentPoint) |
3936 | part.ParentGroup.RootPart.Shape.State > 30 && part.ParentGroup.RootPart.Shape.State < 39) | ||
3937 | continue; | 3956 | continue; |
3938 | ScenePresence sp; | 3957 | ScenePresence sp; |
3939 | // Owner is not in the sim, don't update it to | 3958 | // Owner is not in the sim, don't update it to |
@@ -4184,12 +4203,40 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4184 | for (int i = 0; i < blocks.Count; i++) | 4203 | for (int i = 0; i < blocks.Count; i++) |
4185 | packet.ObjectData[i] = blocks[i]; | 4204 | packet.ObjectData[i] = blocks[i]; |
4186 | 4205 | ||
4187 | OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); | 4206 | // OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); |
4207 | // use default udp retry | ||
4208 | OutPacket(packet, ThrottleOutPacketType.Task, true); | ||
4188 | } | 4209 | } |
4189 | 4210 | ||
4211 | |||
4212 | |||
4190 | #endregion Packet Sending | 4213 | #endregion Packet Sending |
4214 | |||
4191 | } | 4215 | } |
4192 | 4216 | ||
4217 | // hack.. dont use | ||
4218 | public void SendPartFullUpdate(ISceneEntity ent, uint? parentID) | ||
4219 | { | ||
4220 | if (ent is SceneObjectPart) | ||
4221 | { | ||
4222 | SceneObjectPart part = (SceneObjectPart)ent; | ||
4223 | ObjectUpdatePacket packet = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate); | ||
4224 | packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; | ||
4225 | packet.RegionData.TimeDilation = 1; | ||
4226 | packet.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; | ||
4227 | |||
4228 | ObjectUpdatePacket.ObjectDataBlock blk = CreatePrimUpdateBlock(part, this.m_agentId); | ||
4229 | if (parentID.HasValue) | ||
4230 | { | ||
4231 | blk.ParentID = parentID.Value; | ||
4232 | } | ||
4233 | |||
4234 | packet.ObjectData[0] = blk; | ||
4235 | |||
4236 | OutPacket(packet, ThrottleOutPacketType.Task, true); | ||
4237 | } | ||
4238 | } | ||
4239 | |||
4193 | public void ReprioritizeUpdates() | 4240 | public void ReprioritizeUpdates() |
4194 | { | 4241 | { |
4195 | lock (m_entityUpdates.SyncRoot) | 4242 | lock (m_entityUpdates.SyncRoot) |
@@ -5278,16 +5325,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5278 | 5325 | ||
5279 | byte[] objectData = new byte[76]; | 5326 | byte[] objectData = new byte[76]; |
5280 | 5327 | ||
5281 | data.CollisionPlane.ToBytes(objectData, 0); | ||
5282 | offsetPosition.ToBytes(objectData, 16); | ||
5283 | Vector3 velocity = new Vector3(0, 0, 0); | 5328 | Vector3 velocity = new Vector3(0, 0, 0); |
5284 | Vector3 acceleration = new Vector3(0, 0, 0); | 5329 | Vector3 acceleration = new Vector3(0, 0, 0); |
5330 | rotation.Normalize(); | ||
5331 | Vector3 vrot = new Vector3(rotation.X, rotation.Y, rotation.Z); | ||
5332 | |||
5333 | data.CollisionPlane.ToBytes(objectData, 0); | ||
5334 | offsetPosition.ToBytes(objectData, 16); | ||
5285 | velocity.ToBytes(objectData, 28); | 5335 | velocity.ToBytes(objectData, 28); |
5286 | acceleration.ToBytes(objectData, 40); | 5336 | acceleration.ToBytes(objectData, 40); |
5287 | // data.Velocity.ToBytes(objectData, 28); | 5337 | vrot.ToBytes(objectData, 52); |
5288 | // data.Acceleration.ToBytes(objectData, 40); | 5338 | data.AngularVelocity.ToBytes(objectData, 64); |
5289 | rotation.ToBytes(objectData, 52); | ||
5290 | //data.AngularVelocity.ToBytes(objectData, 64); | ||
5291 | 5339 | ||
5292 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); | 5340 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); |
5293 | 5341 | ||
@@ -5343,15 +5391,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5343 | data.RelativePosition.ToBytes(objectData, 0); | 5391 | data.RelativePosition.ToBytes(objectData, 0); |
5344 | data.Velocity.ToBytes(objectData, 12); | 5392 | data.Velocity.ToBytes(objectData, 12); |
5345 | data.Acceleration.ToBytes(objectData, 24); | 5393 | data.Acceleration.ToBytes(objectData, 24); |
5346 | try | 5394 | |
5347 | { | 5395 | Quaternion rotation = data.RotationOffset; |
5348 | data.RotationOffset.ToBytes(objectData, 36); | 5396 | rotation.Normalize(); |
5349 | } | 5397 | Vector3 vrot = new Vector3(rotation.X, rotation.Y, rotation.Z); |
5350 | catch (Exception e) | 5398 | 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); | 5399 | data.AngularVelocity.ToBytes(objectData, 48); |
5356 | 5400 | ||
5357 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); | 5401 | 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..781fc40 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,10 +980,13 @@ 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); |
988 | |||
989 | sp.HasMovedAway(); | ||
978 | 990 | ||
979 | // Now let's make it officially a child agent | 991 | // Now let's make it officially a child agent |
980 | sp.MakeChildAgent(); | 992 | sp.MakeChildAgent(); |
@@ -1137,11 +1149,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1137 | // abandoned without proper close by viewer but then re-used by an incoming connection. | 1149 | // abandoned without proper close by viewer but then re-used by an incoming connection. |
1138 | sp.CloseChildAgents(newRegionX, newRegionY); | 1150 | sp.CloseChildAgents(newRegionX, newRegionY); |
1139 | 1151 | ||
1152 | sp.HasMovedAway(); | ||
1140 | // May need to logout or other cleanup | 1153 | // May need to logout or other cleanup |
1141 | AgentHasMovedAway(sp, logout); | 1154 | // AgentHasMovedAway(sp, logout); |
1155 | // AgentHasMovedAway(sp, true); | ||
1142 | 1156 | ||
1143 | // Well, this is it. The agent is over there. | 1157 | // Well, this is it. The agent is over there. |
1144 | KillEntity(sp.Scene, sp.LocalId); | 1158 | // KillEntity(sp.Scene, sp.LocalId); |
1145 | 1159 | ||
1146 | // Now let's make it officially a child agent | 1160 | // Now let's make it officially a child agent |
1147 | sp.MakeChildAgent(); | 1161 | sp.MakeChildAgent(); |
@@ -1253,7 +1267,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1253 | protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) | 1267 | protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) |
1254 | { | 1268 | { |
1255 | if (sp.Scene.AttachmentsModule != null) | 1269 | if (sp.Scene.AttachmentsModule != null) |
1256 | sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, true); | 1270 | sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, logout); |
1257 | } | 1271 | } |
1258 | 1272 | ||
1259 | protected void KillEntity(Scene scene, uint localID) | 1273 | protected void KillEntity(Scene scene, uint localID) |
@@ -1381,10 +1395,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1381 | 1395 | ||
1382 | 1396 | ||
1383 | #region Agent Crossings | 1397 | #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) | 1398 | public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out uint xDest, out uint yDest, out string version, out Vector3 newpos) |
1386 | { | 1399 | { |
1400 | string r = String.Empty; | ||
1401 | return GetDestination(scene, agentID, pos, out xDest, out yDest, out version, out newpos, out r); | ||
1402 | } | ||
1403 | |||
1404 | public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out uint xDest, out uint yDest, out string version, out Vector3 newpos, out string reason) | ||
1405 | { | ||
1387 | version = String.Empty; | 1406 | version = String.Empty; |
1407 | reason = String.Empty; | ||
1388 | newpos = pos; | 1408 | newpos = pos; |
1389 | 1409 | ||
1390 | // m_log.DebugFormat( | 1410 | // m_log.DebugFormat( |
@@ -1498,8 +1518,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1498 | } | 1518 | } |
1499 | 1519 | ||
1500 | GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); | 1520 | GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); |
1501 | 1521 | ||
1502 | string reason; | ||
1503 | if (!scene.SimulationService.QueryAccess(neighbourRegion, agentID, newpos, out version, out reason)) | 1522 | if (!scene.SimulationService.QueryAccess(neighbourRegion, agentID, newpos, out version, out reason)) |
1504 | { | 1523 | { |
1505 | if (r == null) | 1524 | if (r == null) |
@@ -1525,11 +1544,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1525 | uint y; | 1544 | uint y; |
1526 | Vector3 newpos; | 1545 | Vector3 newpos; |
1527 | string version; | 1546 | string version; |
1547 | string reason; | ||
1528 | 1548 | ||
1529 | GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, agent.AbsolutePosition, out x, out y, out version, out newpos); | 1549 | GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, agent.AbsolutePosition, out x, out y, out version, out newpos, out reason); |
1530 | if (neighbourRegion == null) | 1550 | if (neighbourRegion == null) |
1531 | { | 1551 | { |
1532 | agent.ControllingClient.SendAlertMessage("Cannot region cross into void"); | 1552 | if (reason == String.Empty) |
1553 | agent.ControllingClient.SendAlertMessage("Cannot cross to region"); | ||
1554 | else | ||
1555 | agent.ControllingClient.SendAlertMessage("Cannot cross to region: " + reason); | ||
1533 | return false; | 1556 | return false; |
1534 | } | 1557 | } |
1535 | 1558 | ||
@@ -1656,10 +1679,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1656 | 1679 | ||
1657 | public bool CrossAgentIntoNewRegionMain(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying) | 1680 | public bool CrossAgentIntoNewRegionMain(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying) |
1658 | { | 1681 | { |
1682 | int ts = Util.EnvironmentTickCount(); | ||
1659 | try | 1683 | try |
1660 | { | 1684 | { |
1685 | |||
1661 | AgentData cAgent = new AgentData(); | 1686 | AgentData cAgent = new AgentData(); |
1662 | agent.CopyTo(cAgent); | 1687 | agent.CopyTo(cAgent); |
1688 | |||
1689 | // agent.Appearance.WearableCacheItems = null; | ||
1690 | |||
1663 | cAgent.Position = pos + agent.Velocity; | 1691 | cAgent.Position = pos + agent.Velocity; |
1664 | if (isFlying) | 1692 | if (isFlying) |
1665 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | 1693 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; |
@@ -1686,6 +1714,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1686 | return false; | 1714 | return false; |
1687 | } | 1715 | } |
1688 | 1716 | ||
1717 | m_log.DebugFormat("[CrossAgentIntoNewRegionMain] ok, time {0}ms",Util.EnvironmentTickCountSubtract(ts)); | ||
1718 | |||
1689 | } | 1719 | } |
1690 | catch (Exception e) | 1720 | catch (Exception e) |
1691 | { | 1721 | { |
@@ -1703,6 +1733,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1703 | public void CrossAgentToNewRegionPost(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, | 1733 | public void CrossAgentToNewRegionPost(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, |
1704 | bool isFlying, string version) | 1734 | bool isFlying, string version) |
1705 | { | 1735 | { |
1736 | |||
1706 | agent.ControllingClient.RequestClientInfo(); | 1737 | agent.ControllingClient.RequestClientInfo(); |
1707 | 1738 | ||
1708 | string agentcaps; | 1739 | string agentcaps; |
@@ -1714,6 +1745,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1714 | } | 1745 | } |
1715 | 1746 | ||
1716 | // No turning back | 1747 | // No turning back |
1748 | |||
1749 | |||
1750 | |||
1717 | agent.IsChildAgent = true; | 1751 | agent.IsChildAgent = true; |
1718 | 1752 | ||
1719 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); | 1753 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); |
@@ -1737,12 +1771,25 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1737 | capsPath); | 1771 | capsPath); |
1738 | } | 1772 | } |
1739 | 1773 | ||
1774 | // Backwards compatibility. Best effort | ||
1775 | if (version == "Unknown" || version == string.Empty) | ||
1776 | { | ||
1777 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); | ||
1778 | Thread.Sleep(3000); // wait a little now that we're not waiting for the callback | ||
1779 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); | ||
1780 | } | ||
1781 | |||
1740 | // SUCCESS! | 1782 | // SUCCESS! |
1741 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); | 1783 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); |
1742 | 1784 | ||
1743 | // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. | 1785 | // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. |
1744 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); | 1786 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); |
1745 | 1787 | ||
1788 | // this may need the attachments | ||
1789 | agent.parcelRegionCross(); | ||
1790 | |||
1791 | AgentHasMovedAway(agent, true); | ||
1792 | |||
1746 | agent.MakeChildAgent(); | 1793 | agent.MakeChildAgent(); |
1747 | 1794 | ||
1748 | // FIXME: Possibly this should occur lower down after other commands to close other agents, | 1795 | // FIXME: Possibly this should occur lower down after other commands to close other agents, |
@@ -1756,16 +1803,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1756 | // agent.SendOtherAgentsAvatarDataToMe(); | 1803 | // agent.SendOtherAgentsAvatarDataToMe(); |
1757 | // agent.SendOtherAgentsAppearanceToMe(); | 1804 | // agent.SendOtherAgentsAppearanceToMe(); |
1758 | 1805 | ||
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. | 1806 | // Next, let's close the child agent connections that are too far away. |
1770 | uint neighbourx; | 1807 | uint neighbourx; |
1771 | uint neighboury; | 1808 | uint neighboury; |
@@ -1777,7 +1814,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1777 | 1814 | ||
1778 | agent.CloseChildAgents(neighbourx, neighboury); | 1815 | agent.CloseChildAgents(neighbourx, neighboury); |
1779 | 1816 | ||
1780 | AgentHasMovedAway(agent, false); | 1817 | |
1781 | 1818 | ||
1782 | // the user may change their profile information in other region, | 1819 | // the user may change their profile information in other region, |
1783 | // so the userinfo in UserProfileCache is not reliable any more, delete it | 1820 | // so the userinfo in UserProfileCache is not reliable any more, delete it |
@@ -1817,7 +1854,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1817 | #region Enable Child Agent | 1854 | #region Enable Child Agent |
1818 | 1855 | ||
1819 | /// <summary> | 1856 | /// <summary> |
1820 | /// This informs a single neighbouring region about agent "avatar". | 1857 | /// 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. | 1858 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. |
1822 | /// </summary> | 1859 | /// </summary> |
1823 | /// <param name="sp"></param> | 1860 | /// <param name="sp"></param> |
@@ -1833,8 +1870,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1833 | agent.startpos = new Vector3(128, 128, 70); | 1870 | agent.startpos = new Vector3(128, 128, 70); |
1834 | agent.child = true; | 1871 | agent.child = true; |
1835 | 1872 | ||
1836 | //agent.Appearance = sp.Appearance; | 1873 | agent.Appearance = new AvatarAppearance(); |
1837 | agent.Appearance = new AvatarAppearance(sp.Appearance, true, false); // guess this should be a lot less | 1874 | agent.Appearance.AvatarHeight = sp.Appearance.AvatarHeight; |
1838 | 1875 | ||
1839 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | 1876 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); |
1840 | 1877 | ||
@@ -1866,6 +1903,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1866 | agent.Id0 = currentAgentCircuit.Id0; | 1903 | agent.Id0 = currentAgentCircuit.Id0; |
1867 | } | 1904 | } |
1868 | 1905 | ||
1906 | Thread.Sleep(200); // the original delay that was at InformClientOfNeighbourAsync start | ||
1907 | |||
1869 | IPEndPoint external = region.ExternalEndPoint; | 1908 | IPEndPoint external = region.ExternalEndPoint; |
1870 | if (external != null) | 1909 | if (external != null) |
1871 | { | 1910 | { |
@@ -1884,6 +1923,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1884 | 1923 | ||
1885 | /// <summary> | 1924 | /// <summary> |
1886 | /// This informs all neighbouring regions about agent "avatar". | 1925 | /// This informs all neighbouring regions about agent "avatar". |
1926 | /// and as important informs the avatar about then | ||
1887 | /// </summary> | 1927 | /// </summary> |
1888 | /// <param name="sp"></param> | 1928 | /// <param name="sp"></param> |
1889 | public void EnableChildAgents(ScenePresence sp) | 1929 | public void EnableChildAgents(ScenePresence sp) |
@@ -1900,81 +1940,77 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1900 | m_log.Debug("[ENTITY TRANSFER MODULE]: m_regionInfo was null in EnableChildAgents, is this a NPC?"); | 1940 | m_log.Debug("[ENTITY TRANSFER MODULE]: m_regionInfo was null in EnableChildAgents, is this a NPC?"); |
1901 | } | 1941 | } |
1902 | 1942 | ||
1903 | /// We need to find the difference between the new regions where there are no child agents | 1943 | LinkedList<ulong> previousRegionNeighbourHandles; |
1904 | /// and the regions where there are already child agents. We only send notification to the former. | 1944 | |
1905 | List<ulong> neighbourHandles = NeighbourHandles(neighbours); // on this region | 1945 | Dictionary<ulong, string> seeds; |
1906 | neighbourHandles.Add(sp.Scene.RegionInfo.RegionHandle); // add this region too | ||
1907 | List<ulong> previousRegionNeighbourHandles; | ||
1908 | 1946 | ||
1909 | if (sp.Scene.CapsModule != null) | 1947 | if (sp.Scene.CapsModule != null) |
1910 | { | 1948 | { |
1911 | previousRegionNeighbourHandles = | 1949 | seeds = new Dictionary<ulong, string>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID)); |
1912 | new List<ulong>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID).Keys); | 1950 | previousRegionNeighbourHandles = new LinkedList<ulong>(seeds.Keys); |
1913 | } | 1951 | } |
1914 | else | 1952 | else |
1915 | { | 1953 | { |
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>(); | 1954 | seeds = new Dictionary<ulong, string>(); |
1955 | previousRegionNeighbourHandles = new LinkedList<ulong>(); | ||
1956 | } | ||
1936 | 1957 | ||
1937 | //m_log.Debug(" !!! No. of seeds: " + seeds.Count); | ||
1938 | if (!seeds.ContainsKey(sp.Scene.RegionInfo.RegionHandle)) | 1958 | if (!seeds.ContainsKey(sp.Scene.RegionInfo.RegionHandle)) |
1939 | seeds.Add(sp.Scene.RegionInfo.RegionHandle, sp.ControllingClient.RequestClientInfo().CapsPath); | 1959 | seeds.Add(sp.Scene.RegionInfo.RegionHandle, sp.ControllingClient.RequestClientInfo().CapsPath); |
1940 | 1960 | ||
1941 | /// Create the necessary child agents | 1961 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); |
1962 | |||
1963 | List<ulong> newneighbours = new List<ulong>(); | ||
1942 | List<AgentCircuitData> cagents = new List<AgentCircuitData>(); | 1964 | List<AgentCircuitData> cagents = new List<AgentCircuitData>(); |
1965 | |||
1966 | ulong currentRegionHandler = sp.Scene.RegionInfo.RegionHandle; | ||
1967 | |||
1943 | foreach (GridRegion neighbour in neighbours) | 1968 | foreach (GridRegion neighbour in neighbours) |
1944 | { | 1969 | { |
1945 | if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) | 1970 | 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 | 1971 | ||
1965 | if (newRegions.Contains(neighbour.RegionHandle)) | 1972 | if (handler == currentRegionHandler) |
1966 | { | 1973 | continue; |
1967 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | 1974 | |
1968 | sp.AddNeighbourRegion(neighbour.RegionHandle, agent.CapsPath); | 1975 | AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); |
1969 | seeds.Add(neighbour.RegionHandle, agent.CapsPath); | 1976 | agent.BaseFolder = UUID.Zero; |
1970 | } | 1977 | agent.InventoryFolder = UUID.Zero; |
1971 | else | 1978 | agent.startpos = sp.AbsolutePosition + CalculateOffset(sp, neighbour); |
1972 | { | 1979 | agent.child = true; |
1973 | agent.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, neighbour.RegionHandle); | 1980 | agent.Appearance = new AvatarAppearance(); |
1974 | } | 1981 | agent.Appearance.AvatarHeight = sp.Appearance.AvatarHeight; |
1982 | |||
1983 | if (currentAgentCircuit != null) | ||
1984 | { | ||
1985 | agent.ServiceURLs = currentAgentCircuit.ServiceURLs; | ||
1986 | agent.IPAddress = currentAgentCircuit.IPAddress; | ||
1987 | agent.Viewer = currentAgentCircuit.Viewer; | ||
1988 | agent.Channel = currentAgentCircuit.Channel; | ||
1989 | agent.Mac = currentAgentCircuit.Mac; | ||
1990 | agent.Id0 = currentAgentCircuit.Id0; | ||
1991 | } | ||
1975 | 1992 | ||
1976 | cagents.Add(agent); | 1993 | if (previousRegionNeighbourHandles.Contains(handler)) |
1994 | { | ||
1995 | previousRegionNeighbourHandles.Remove(handler); | ||
1996 | agent.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, handler); | ||
1977 | } | 1997 | } |
1998 | else | ||
1999 | { | ||
2000 | newneighbours.Add(handler); | ||
2001 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
2002 | sp.AddNeighbourRegion(handler, agent.CapsPath); | ||
2003 | seeds.Add(handler, agent.CapsPath); | ||
2004 | } | ||
2005 | |||
2006 | cagents.Add(agent); | ||
2007 | } | ||
2008 | |||
2009 | //sp.DropOldNeighbours(previousRegionNeighbourHandles); | ||
2010 | foreach (ulong handle in previousRegionNeighbourHandles) | ||
2011 | { | ||
2012 | sp.RemoveNeighbourRegion(handle); | ||
2013 | Scene.CapsModule.DropChildSeed(sp.UUID, handle); | ||
1978 | } | 2014 | } |
1979 | 2015 | ||
1980 | /// Update all child agent with everyone's seeds | 2016 | /// Update all child agent with everyone's seeds |
@@ -1987,34 +2023,23 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1987 | { | 2023 | { |
1988 | sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, seeds); | 2024 | sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, seeds); |
1989 | } | 2025 | } |
2026 | |||
1990 | sp.KnownRegions = seeds; | 2027 | sp.KnownRegions = seeds; |
1991 | //avatar.Scene.DumpChildrenSeeds(avatar.UUID); | 2028 | //avatar.Scene.DumpChildrenSeeds(avatar.UUID); |
1992 | //avatar.DumpKnownRegions(); | 2029 | //avatar.DumpKnownRegions(); |
1993 | 2030 | ||
1994 | bool newAgent = false; | 2031 | Util.FireAndForget(delegate |
1995 | int count = 0; | ||
1996 | foreach (GridRegion neighbour in neighbours) | ||
1997 | { | 2032 | { |
1998 | //m_log.WarnFormat("--> Going to send child agent to {0}", neighbour.RegionName); | 2033 | 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 | 2034 | int count = 0; |
2000 | if (newRegions.Contains(neighbour.RegionHandle)) | 2035 | bool newagent; |
2001 | newAgent = true; | ||
2002 | else | ||
2003 | newAgent = false; | ||
2004 | // continue; | ||
2005 | 2036 | ||
2006 | if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) | 2037 | foreach (GridRegion neighbour in neighbours) |
2007 | { | 2038 | { |
2008 | try | 2039 | try |
2009 | { | 2040 | { |
2010 | // Let's put this back at sync, so that it doesn't clog | 2041 | newagent = newneighbours.Contains(neighbour.RegionHandle); |
2011 | // the network, especially for regions in the same physical server. | 2042 | 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 | } | 2043 | } |
2019 | 2044 | ||
2020 | catch (ArgumentOutOfRangeException) | 2045 | catch (ArgumentOutOfRangeException) |
@@ -2022,9 +2047,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2022 | m_log.ErrorFormat( | 2047 | 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}).", | 2048 | "[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, | 2049 | neighbour.ExternalHostName, |
2025 | neighbour.RegionHandle, | 2050 | neighbour.RegionHandle, |
2026 | neighbour.RegionLocX, | 2051 | neighbour.RegionLocX, |
2027 | neighbour.RegionLocY); | 2052 | neighbour.RegionLocY); |
2028 | } | 2053 | } |
2029 | catch (Exception e) | 2054 | catch (Exception e) |
2030 | { | 2055 | { |
@@ -2041,11 +2066,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2041 | 2066 | ||
2042 | // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes. | 2067 | // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes. |
2043 | // throw e; | 2068 | // throw e; |
2044 | |||
2045 | } | 2069 | } |
2070 | count++; | ||
2046 | } | 2071 | } |
2047 | count++; | 2072 | }); |
2048 | } | ||
2049 | } | 2073 | } |
2050 | 2074 | ||
2051 | Vector3 CalculateOffset(ScenePresence sp, GridRegion neighbour) | 2075 | Vector3 CalculateOffset(ScenePresence sp, GridRegion neighbour) |
@@ -2079,11 +2103,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2079 | private void InformClientOfNeighbourAsync(ScenePresence sp, AgentCircuitData a, GridRegion reg, | 2103 | private void InformClientOfNeighbourAsync(ScenePresence sp, AgentCircuitData a, GridRegion reg, |
2080 | IPEndPoint endPoint, bool newAgent) | 2104 | IPEndPoint endPoint, bool newAgent) |
2081 | { | 2105 | { |
2082 | // Let's wait just a little to give time to originating regions to catch up with closing child agents | 2106 | Scene scene = sp.Scene; |
2083 | // after a cross here | 2107 | if (!newAgent) |
2084 | Thread.Sleep(500); | 2108 | return; |
2085 | |||
2086 | Scene scene = sp.Scene; | ||
2087 | 2109 | ||
2088 | m_log.DebugFormat( | 2110 | m_log.DebugFormat( |
2089 | "[ENTITY TRANSFER MODULE]: Informing {0} {1} about neighbour {2} {3} at ({4},{5})", | 2111 | "[ENTITY TRANSFER MODULE]: Informing {0} {1} about neighbour {2} {3} at ({4},{5})", |
@@ -2097,6 +2119,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2097 | 2119 | ||
2098 | if (regionAccepted && newAgent) | 2120 | if (regionAccepted && newAgent) |
2099 | { | 2121 | { |
2122 | // give time for createAgent to finish, since it is async and does grid services access | ||
2123 | Thread.Sleep(500); | ||
2124 | |||
2100 | if (m_eqModule != null) | 2125 | if (m_eqModule != null) |
2101 | { | 2126 | { |
2102 | #region IP Translation for NAT | 2127 | #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..c0405ad 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 2; |
170 | 179 | ||
171 | if (entity is SceneObjectPart) | 180 | pqueue = ComputeDistancePriority(client, entity, false); |
172 | { | 181 | |
173 | // Attachments are high priority, | 182 | // Non physical prims are lower priority than physical prims |
174 | if (((SceneObjectPart)entity).ParentGroup.IsAttachment) | 183 | PhysicsActor physActor = ((SceneObjectPart)entity).ParentGroup.RootPart.PhysActor; |
175 | return 1; | 184 | if (physActor == null || !physActor.IsPhysical) |
176 | 185 | pqueue++; | |
177 | // Non physical prims are lower priority than physical prims | ||
178 | PhysicsActor physActor = ((SceneObjectPart)entity).ParentGroup.RootPart.PhysActor; | ||
179 | if (physActor == null || !physActor.IsPhysical) | ||
180 | pqueue++; | ||
181 | } | ||
182 | } | 186 | } |
183 | } | 187 | } |
188 | else | ||
189 | pqueue = ComputeDistancePriority(client, entity, false); | ||
184 | 190 | ||
185 | return pqueue; | 191 | return pqueue; |
186 | } | 192 | } |
@@ -227,16 +233,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
227 | 233 | ||
228 | // And convert the distance to a priority queue, this computation gives queues | 234 | // And convert the distance to a priority queue, this computation gives queues |
229 | // at 10, 20, 40, 80, 160, 320, 640, and 1280m | 235 | // at 10, 20, 40, 80, 160, 320, 640, and 1280m |
230 | uint pqueue = PriorityQueue.NumberOfImmediateQueues; | 236 | uint pqueue = PriorityQueue.NumberOfImmediateQueues + 1; // reserve attachments queue |
231 | uint queues = PriorityQueue.NumberOfQueues - PriorityQueue.NumberOfImmediateQueues; | 237 | uint queues = PriorityQueue.NumberOfQueues - PriorityQueue.NumberOfImmediateQueues; |
232 | 238 | /* | |
233 | for (int i = 0; i < queues - 1; i++) | 239 | for (int i = 0; i < queues - 1; i++) |
234 | { | 240 | { |
235 | if (distance < 30 * Math.Pow(2.0,i)) | 241 | if (distance < 30 * Math.Pow(2.0,i)) |
236 | break; | 242 | break; |
237 | pqueue++; | 243 | pqueue++; |
238 | } | 244 | } |
239 | 245 | */ | |
246 | if (distance > 10f) | ||
247 | { | ||
248 | float tmp = (float)Math.Log((double)distance) * 1.4426950408889634073599246810019f - 3.3219280948873623478703194294894f; | ||
249 | // for a map identical to original: | ||
250 | // now | ||
251 | // 1st constant is 1/(log(2)) (natural log) so we get log2(distance) | ||
252 | // 2st constant makes it be log2(distance/10) | ||
253 | pqueue += (uint)tmp; | ||
254 | if (pqueue > queues - 1) | ||
255 | pqueue = queues - 1; | ||
256 | } | ||
257 | |||
240 | // If this is a root agent, then determine front & back | 258 | // If this is a root agent, then determine front & back |
241 | // Bump up the priority queue (drop the priority) for any objects behind the avatar | 259 | // Bump up the priority queue (drop the priority) for any objects behind the avatar |
242 | if (useFrontBack && ! presence.IsChildAgent) | 260 | if (useFrontBack && ! presence.IsChildAgent) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index dd0c828..f5be7a7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs | |||
@@ -295,6 +295,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
295 | 295 | ||
296 | return myID; | 296 | return myID; |
297 | } | 297 | } |
298 | |||
299 | public uint AllocatePresenceLocalId() | ||
300 | { | ||
301 | uint myID; | ||
302 | |||
303 | _primAllocateMutex.WaitOne(); | ||
304 | myID = ++m_lastAllocatedLocalId; | ||
305 | ++m_lastAllocatedLocalId; | ||
306 | _primAllocateMutex.ReleaseMutex(); | ||
307 | |||
308 | return myID; | ||
309 | } | ||
298 | 310 | ||
299 | #region Module Methods | 311 | #region Module Methods |
300 | 312 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 28758a9..dd5ee65 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -2636,6 +2636,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
2636 | m_rootPart.UpdateFlag = UpdateRequired.TERSE; | 2636 | m_rootPart.UpdateFlag = UpdateRequired.TERSE; |
2637 | } | 2637 | } |
2638 | 2638 | ||
2639 | if (IsAttachment) | ||
2640 | { | ||
2641 | ScenePresence sp = m_scene.GetScenePresence(AttachedAvatar); | ||
2642 | if (sp != null) | ||
2643 | { | ||
2644 | sp.SendAttachmentScheduleUpdate(this); | ||
2645 | return; | ||
2646 | } | ||
2647 | } | ||
2648 | |||
2639 | SceneObjectPart[] parts = m_parts.GetArray(); | 2649 | SceneObjectPart[] parts = m_parts.GetArray(); |
2640 | for (int i = 0; i < parts.Length; i++) | 2650 | for (int i = 0; i < parts.Length; i++) |
2641 | { | 2651 | { |
@@ -2697,6 +2707,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
2697 | return; | 2707 | return; |
2698 | 2708 | ||
2699 | // m_log.DebugFormat("[SOG]: Sending immediate full group update for {0} {1}", Name, UUID); | 2709 | // m_log.DebugFormat("[SOG]: Sending immediate full group update for {0} {1}", Name, UUID); |
2710 | |||
2711 | if (IsAttachment) | ||
2712 | { | ||
2713 | ScenePresence sp = m_scene.GetScenePresence(AttachedAvatar); | ||
2714 | if (sp != null) | ||
2715 | { | ||
2716 | sp.SendAttachmentUpdate(this,UpdateRequired.FULL); | ||
2717 | return; | ||
2718 | } | ||
2719 | } | ||
2700 | 2720 | ||
2701 | RootPart.SendFullUpdateToAllClients(); | 2721 | RootPart.SendFullUpdateToAllClients(); |
2702 | 2722 | ||
@@ -2720,6 +2740,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
2720 | if (IsDeleted) | 2740 | if (IsDeleted) |
2721 | return; | 2741 | return; |
2722 | 2742 | ||
2743 | if (IsAttachment) | ||
2744 | { | ||
2745 | ScenePresence sp = m_scene.GetScenePresence(AttachedAvatar); | ||
2746 | if (sp != null) | ||
2747 | { | ||
2748 | sp.SendAttachmentUpdate(RootPart, UpdateRequired.TERSE); | ||
2749 | return; | ||
2750 | } | ||
2751 | } | ||
2752 | |||
2723 | RootPart.SendTerseUpdateToAllClients(); | 2753 | RootPart.SendTerseUpdateToAllClients(); |
2724 | } | 2754 | } |
2725 | 2755 | ||
@@ -2739,6 +2769,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
2739 | if (IsDeleted) | 2769 | if (IsDeleted) |
2740 | return; | 2770 | return; |
2741 | 2771 | ||
2772 | if (IsAttachment) | ||
2773 | { | ||
2774 | ScenePresence sp = m_scene.GetScenePresence(AttachedAvatar); | ||
2775 | if (sp != null) | ||
2776 | { | ||
2777 | sp.SendAttachmentUpdate(this, UpdateRequired.TERSE); | ||
2778 | return; | ||
2779 | } | ||
2780 | } | ||
2781 | |||
2742 | SceneObjectPart[] parts = m_parts.GetArray(); | 2782 | SceneObjectPart[] parts = m_parts.GetArray(); |
2743 | for (int i = 0; i < parts.Length; i++) | 2783 | for (int i = 0; i < parts.Length; i++) |
2744 | parts[i].SendTerseUpdateToAllClients(); | 2784 | parts[i].SendTerseUpdateToAllClients(); |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 0f67d07..5bfc640 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -969,7 +969,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
969 | m_name = String.Format("{0} {1}", Firstname, Lastname); | 969 | m_name = String.Format("{0} {1}", Firstname, Lastname); |
970 | m_scene = world; | 970 | m_scene = world; |
971 | m_uuid = client.AgentId; | 971 | m_uuid = client.AgentId; |
972 | LocalId = m_scene.AllocateLocalId(); | 972 | LocalId = m_scene.AllocatePresenceLocalId(); |
973 | 973 | ||
974 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid); | 974 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid); |
975 | if (account != null) | 975 | if (account != null) |
@@ -1268,79 +1268,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1268 | 1268 | ||
1269 | m_scene.SwapRootAgentCount(false); | 1269 | m_scene.SwapRootAgentCount(false); |
1270 | 1270 | ||
1271 | // The initial login scene presence is already root when it gets here | ||
1272 | // and it has already rezzed the attachments and started their scripts. | ||
1273 | // We do the following only for non-login agents, because their scripts | ||
1274 | // haven't started yet. | ||
1275 | /* moved down | ||
1276 | if (PresenceType == PresenceType.Npc || (TeleportFlags & TeleportFlags.ViaLogin) != 0) | ||
1277 | { | ||
1278 | // Viewers which have a current outfit folder will actually rez their own attachments. However, | ||
1279 | // viewers without (e.g. v1 viewers) will not, so we still need to make this call. | ||
1280 | if (Scene.AttachmentsModule != null) | ||
1281 | Util.FireAndForget( | ||
1282 | o => | ||
1283 | { | ||
1284 | // if (PresenceType != PresenceType.Npc && Util.FireAndForgetMethod != FireAndForgetMethod.None) | ||
1285 | // System.Threading.Thread.Sleep(7000); | ||
1286 | |||
1287 | Scene.AttachmentsModule.RezAttachments(this); | ||
1288 | }); | ||
1289 | } | ||
1290 | else | ||
1291 | |||
1292 | { | ||
1293 | // We need to restart scripts here so that they receive the correct changed events (CHANGED_TELEPORT | ||
1294 | // and CHANGED_REGION) when the attachments have been rezzed in the new region. This cannot currently | ||
1295 | // be done in AttachmentsModule.CopyAttachments(AgentData ad, IScenePresence sp) itself since we are | ||
1296 | // not transporting the required data. | ||
1297 | // | ||
1298 | // We need to restart scripts here so that they receive the correct changed events (CHANGED_TELEPORT | ||
1299 | // and CHANGED_REGION) when the attachments have been rezzed in the new region. This cannot currently | ||
1300 | // be done in AttachmentsModule.CopyAttachments(AgentData ad, IScenePresence sp) itself since we are | ||
1301 | // not transporting the required data. | ||
1302 | // | ||
1303 | // We must take a copy of the attachments list here (rather than locking) to avoid a deadlock where a script in one of | ||
1304 | // the attachments may start processing an event (which locks ScriptInstance.m_Script) that then calls a method here | ||
1305 | // which needs to lock m_attachments. ResumeScripts() needs to take a ScriptInstance.m_Script lock to try to unset the Suspend status. | ||
1306 | // | ||
1307 | // FIXME: In theory, this deadlock should not arise since scripts should not be processing events until ResumeScripts(). | ||
1308 | // But XEngine starts all scripts unsuspended. Starting them suspended will not currently work because script rezzing | ||
1309 | // is placed in an asynchronous queue in XEngine and so the ResumeScripts() call will almost certainly execute before the | ||
1310 | // script is rezzed. This means the ResumeScripts() does absolutely nothing when using XEngine. | ||
1311 | // | ||
1312 | // One cannot simply iterate over attachments in a fire and forget thread because this would no longer | ||
1313 | // be locked, allowing race conditions if other code changes the attachments list. | ||
1314 | |||
1315 | List<SceneObjectGroup> attachments = GetAttachments(); | ||
1316 | |||
1317 | if (attachments.Count > 0) | ||
1318 | { | ||
1319 | m_log.DebugFormat( | ||
1320 | "[SCENE PRESENCE]: Restarting scripts in attachments for {0} in {1}", Name, Scene.Name); | ||
1321 | |||
1322 | // Resume scripts this possible should also be moved down after sending the avatar to viewer ? | ||
1323 | foreach (SceneObjectGroup sog in attachments) | ||
1324 | { | ||
1325 | // sending attachments before the avatar ? | ||
1326 | // moved to completemovement where it already was | ||
1327 | // sog.ScheduleGroupForFullUpdate(); | ||
1328 | sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); | ||
1329 | sog.ResumeScripts(); | ||
1330 | } | ||
1331 | } | ||
1332 | } | ||
1333 | */ | ||
1334 | /* | ||
1335 | SendAvatarDataToAllAgents(); | ||
1336 | |||
1337 | // send the animations of the other presences to me | ||
1338 | m_scene.ForEachRootScenePresence(delegate(ScenePresence presence) | ||
1339 | { | ||
1340 | if (presence != this) | ||
1341 | presence.Animator.SendAnimPackToClient(ControllingClient); | ||
1342 | }); | ||
1343 | */ | ||
1344 | 1271 | ||
1345 | // If we don't reset the movement flag here, an avatar that crosses to a neighbouring sim and returns will | 1272 | // If we don't reset the movement flag here, an avatar that crosses to a neighbouring sim and returns will |
1346 | // stall on the border crossing since the existing child agent will still have the last movement | 1273 | // stall on the border crossing since the existing child agent will still have the last movement |
@@ -1400,7 +1327,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1400 | else | 1327 | else |
1401 | Animator.ResetAnimations(); | 1328 | Animator.ResetAnimations(); |
1402 | 1329 | ||
1403 | 1330 | ||
1404 | // m_log.DebugFormat( | 1331 | // m_log.DebugFormat( |
1405 | // "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", | 1332 | // "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", |
1406 | // Name, UUID, m_scene.RegionInfo.RegionName); | 1333 | // Name, UUID, m_scene.RegionInfo.RegionName); |
@@ -1754,7 +1681,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1754 | /// </param> | 1681 | /// </param> |
1755 | public void CompleteMovement(IClientAPI client, bool openChildAgents) | 1682 | public void CompleteMovement(IClientAPI client, bool openChildAgents) |
1756 | { | 1683 | { |
1757 | // DateTime startTime = DateTime.Now; | 1684 | int ts = Util.EnvironmentTickCount(); |
1758 | 1685 | ||
1759 | m_log.InfoFormat( | 1686 | m_log.InfoFormat( |
1760 | "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}", | 1687 | "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}", |
@@ -1767,6 +1694,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 | 1694 | // 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) | 1695 | if (!isNPC && (m_teleportFlags & TeleportFlags.ViaLogin) == 0) |
1769 | { | 1696 | { |
1697 | |||
1770 | // Let's wait until UpdateAgent (called by departing region) is done | 1698 | // Let's wait until UpdateAgent (called by departing region) is done |
1771 | if (!WaitForUpdateAgent(client)) | 1699 | if (!WaitForUpdateAgent(client)) |
1772 | // The sending region never sent the UpdateAgent data, we have to refuse | 1700 | // The sending region never sent the UpdateAgent data, we have to refuse |
@@ -1786,6 +1714,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1786 | AbsolutePosition = pos; | 1714 | AbsolutePosition = pos; |
1787 | } | 1715 | } |
1788 | */ | 1716 | */ |
1717 | |||
1718 | m_log.DebugFormat("[CompleteMovement] WaitForUpdateAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1719 | |||
1789 | bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); | 1720 | bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); |
1790 | if (!MakeRootAgent(AbsolutePosition, flying)) | 1721 | if (!MakeRootAgent(AbsolutePosition, flying)) |
1791 | { | 1722 | { |
@@ -1796,6 +1727,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1796 | return; | 1727 | return; |
1797 | } | 1728 | } |
1798 | 1729 | ||
1730 | m_log.DebugFormat("[CompleteMovement] MakeRootAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1731 | |||
1799 | Vector3 look = Lookat; | 1732 | Vector3 look = Lookat; |
1800 | if ((Math.Abs(look.X) < 0.01) && (Math.Abs(look.Y) < 0.01)) | 1733 | if ((Math.Abs(look.X) < 0.01) && (Math.Abs(look.Y) < 0.01)) |
1801 | { | 1734 | { |
@@ -1806,6 +1739,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
1806 | look = new Vector3(0.99f, 0.042f, 0); | 1739 | look = new Vector3(0.99f, 0.042f, 0); |
1807 | } | 1740 | } |
1808 | 1741 | ||
1742 | if (!IsChildAgent) | ||
1743 | { | ||
1744 | InventoryFolderBase cof = m_scene.InventoryService.GetFolderForType(client.AgentId, (AssetType)46); | ||
1745 | if (cof == null) | ||
1746 | COF = UUID.Zero; | ||
1747 | else | ||
1748 | COF = cof.ID; | ||
1749 | |||
1750 | m_log.DebugFormat("[ScenePresence]: CompleteMovement COF for {0} is {1}", client.AgentId, COF); | ||
1751 | } | ||
1752 | |||
1809 | // Tell the client that we're totally ready | 1753 | // Tell the client that we're totally ready |
1810 | ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); | 1754 | ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); |
1811 | 1755 | ||
@@ -1816,6 +1760,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1816 | 1760 | ||
1817 | // m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); | 1761 | // m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); |
1818 | 1762 | ||
1763 | m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1764 | |||
1819 | if (!string.IsNullOrEmpty(m_callbackURI)) | 1765 | if (!string.IsNullOrEmpty(m_callbackURI)) |
1820 | { | 1766 | { |
1821 | // We cannot sleep here since this would hold up the inbound packet processing thread, as | 1767 | // We cannot sleep here since this would hold up the inbound packet processing thread, as |
@@ -1844,6 +1790,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1844 | // client.Name, client.AgentId, m_scene.RegionInfo.RegionName); | 1790 | // client.Name, client.AgentId, m_scene.RegionInfo.RegionName); |
1845 | // } | 1791 | // } |
1846 | 1792 | ||
1793 | m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1794 | |||
1847 | m_previusParcelHide = false; | 1795 | m_previusParcelHide = false; |
1848 | m_previusParcelUUID = UUID.Zero; | 1796 | m_previusParcelUUID = UUID.Zero; |
1849 | m_currentParcelHide = false; | 1797 | m_currentParcelHide = false; |
@@ -1856,15 +1804,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1856 | 1804 | ||
1857 | if (!IsChildAgent) | 1805 | if (!IsChildAgent) |
1858 | { | 1806 | { |
1859 | newhide = m_currentParcelHide; | ||
1860 | m_currentParcelHide = false; | ||
1861 | |||
1862 | // take this region out of children Neighbours list | ||
1863 | // possible should be done elsewhere | ||
1864 | DropThisRootRegionFromNeighbours(); | ||
1865 | 1807 | ||
1866 | ValidateAndSendAppearanceAndAgentData(); | 1808 | ValidateAndSendAppearanceAndAgentData(); |
1867 | 1809 | ||
1810 | m_log.DebugFormat("[CompleteMovement] ValidateAndSendAppearanceAndAgentData: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1811 | |||
1868 | // attachments | 1812 | // attachments |
1869 | if (isNPC || (TeleportFlags & TeleportFlags.ViaLogin) != 0) | 1813 | if (isNPC || (TeleportFlags & TeleportFlags.ViaLogin) != 0) |
1870 | { | 1814 | { |
@@ -1877,23 +1821,40 @@ namespace OpenSim.Region.Framework.Scenes | |||
1877 | } | 1821 | } |
1878 | else | 1822 | else |
1879 | { | 1823 | { |
1880 | List<SceneObjectGroup> attachments = GetAttachments(); | 1824 | if (m_attachments.Count > 0) |
1881 | |||
1882 | if (attachments.Count > 0) | ||
1883 | { | 1825 | { |
1884 | m_log.DebugFormat( | 1826 | m_log.DebugFormat( |
1885 | "[SCENE PRESENCE]: Restarting scripts in attachments for {0} in {1}", Name, Scene.Name); | 1827 | "[SCENE PRESENCE]: Restarting scripts in attachments for {0} in {1}", Name, Scene.Name); |
1886 | 1828 | ||
1887 | // Resume scripts this possible should also be moved down after sending the avatar to viewer ? | 1829 | // Resume scripts this possible should also be moved down after sending the avatar to viewer ? |
1888 | foreach (SceneObjectGroup sog in attachments) | 1830 | foreach (SceneObjectGroup sog in m_attachments) |
1889 | { | 1831 | { |
1890 | sog.ScheduleGroupForFullUpdate(); | 1832 | sog.SendFullUpdateToClient(ControllingClient); |
1833 | SendFullUpdateToClient(ControllingClient); | ||
1834 | |||
1835 | if (!sog.HasPrivateAttachmentPoint) | ||
1836 | { | ||
1837 | // sog.ScheduleGroupForFullUpdate(); | ||
1838 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | ||
1839 | { | ||
1840 | if (p == this) | ||
1841 | return; | ||
1842 | |||
1843 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
1844 | return; | ||
1845 | |||
1846 | sog.SendFullUpdateToClient(p.ControllingClient); | ||
1847 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path | ||
1848 | }); | ||
1849 | } | ||
1891 | sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); | 1850 | sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); |
1892 | sog.ResumeScripts(); | 1851 | sog.ResumeScripts(); |
1893 | } | 1852 | } |
1894 | } | 1853 | } |
1895 | } | 1854 | } |
1896 | 1855 | ||
1856 | m_log.DebugFormat("[CompleteMovement] attachments: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1857 | |||
1897 | // Create child agents in neighbouring regions | 1858 | // Create child agents in neighbouring regions |
1898 | if (openChildAgents) | 1859 | if (openChildAgents) |
1899 | { | 1860 | { |
@@ -1903,10 +1864,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1903 | } | 1864 | } |
1904 | } | 1865 | } |
1905 | 1866 | ||
1867 | m_log.DebugFormat("[CompleteMovement] openChildAgents: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1868 | |||
1906 | // send the rest of the world | 1869 | // send the rest of the world |
1907 | if (m_teleportFlags > 0 && !isNPC) | 1870 | if (m_teleportFlags > 0 && !isNPC || m_currentParcelHide) |
1908 | SendInitialDataToMe(); | 1871 | SendInitialDataToMe(); |
1909 | 1872 | ||
1873 | m_log.DebugFormat("[CompleteMovement] SendInitialDataToMe: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1874 | |||
1910 | if (!IsChildAgent) | 1875 | if (!IsChildAgent) |
1911 | { | 1876 | { |
1912 | // moved from makeroot missing in sendInitialDataToMe | 1877 | // moved from makeroot missing in sendInitialDataToMe |
@@ -1923,6 +1888,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1923 | IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); | 1888 | IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); |
1924 | if (friendsModule != null) | 1889 | if (friendsModule != null) |
1925 | friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); | 1890 | friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); |
1891 | |||
1892 | m_log.DebugFormat("[CompleteMovement] friendsModule: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1926 | } | 1893 | } |
1927 | } | 1894 | } |
1928 | } | 1895 | } |
@@ -1931,11 +1898,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
1931 | m_inTransit = false; | 1898 | m_inTransit = false; |
1932 | } | 1899 | } |
1933 | // if hide force a check | 1900 | // if hide force a check |
1934 | if (!IsChildAgent && newhide) | 1901 | // if (!IsChildAgent && newhide) |
1935 | { | 1902 | // { |
1936 | ParcelLoginCheck(m_currentParcelUUID); | 1903 | // ParcelLoginCheck(m_currentParcelUUID); |
1937 | m_currentParcelHide = newhide; | 1904 | // m_currentParcelHide = newhide; |
1938 | } | 1905 | // } |
1906 | |||
1907 | m_log.DebugFormat("[CompleteMovement] end: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
1939 | } | 1908 | } |
1940 | 1909 | ||
1941 | /// <summary> | 1910 | /// <summary> |
@@ -2776,34 +2745,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
2776 | 2745 | ||
2777 | if (satOnObject) | 2746 | if (satOnObject) |
2778 | { | 2747 | { |
2779 | // SendAvatarDataToAllAgents(); | ||
2780 | m_requestedSitTargetID = 0; | 2748 | m_requestedSitTargetID = 0; |
2781 | |||
2782 | part.RemoveSittingAvatar(UUID); | 2749 | part.RemoveSittingAvatar(UUID); |
2783 | |||
2784 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); | 2750 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); |
2785 | } | ||
2786 | 2751 | ||
2787 | else if (PhysicsActor == null) | 2752 | SendAvatarDataToAllAgents(); |
2788 | AddToPhysicalScene(false); | 2753 | } |
2789 | 2754 | ||
2790 | Animator.TrySetMovementAnimation("STAND"); | 2755 | Animator.TrySetMovementAnimation("STAND"); |
2791 | 2756 | ||
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(); | 2757 | TriggerScenePresenceUpdated(); |
2808 | } | 2758 | } |
2809 | 2759 | ||
@@ -3078,11 +3028,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
3078 | 3028 | ||
3079 | ParentPart = part; | 3029 | ParentPart = part; |
3080 | ParentID = part.LocalId; | 3030 | ParentID = part.LocalId; |
3031 | |||
3032 | SendAvatarDataToAllAgents(); | ||
3033 | |||
3081 | if(status == 3) | 3034 | if(status == 3) |
3082 | Animator.TrySetMovementAnimation("SIT_GROUND"); | 3035 | Animator.TrySetMovementAnimation("SIT_GROUND"); |
3083 | else | 3036 | else |
3084 | Animator.TrySetMovementAnimation("SIT"); | 3037 | Animator.TrySetMovementAnimation("SIT"); |
3085 | SendAvatarDataToAllAgents(); | 3038 | |
3086 | 3039 | ||
3087 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); | 3040 | part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); |
3088 | } | 3041 | } |
@@ -3182,13 +3135,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
3182 | Velocity = Vector3.Zero; | 3135 | Velocity = Vector3.Zero; |
3183 | RemoveFromPhysicalScene(); | 3136 | RemoveFromPhysicalScene(); |
3184 | 3137 | ||
3138 | SendAvatarDataToAllAgents(); | ||
3139 | |||
3185 | String sitAnimation = "SIT"; | 3140 | String sitAnimation = "SIT"; |
3186 | if (!String.IsNullOrEmpty(part.SitAnimation)) | 3141 | if (!String.IsNullOrEmpty(part.SitAnimation)) |
3187 | { | 3142 | { |
3188 | sitAnimation = part.SitAnimation; | 3143 | sitAnimation = part.SitAnimation; |
3189 | } | 3144 | } |
3190 | Animator.TrySetMovementAnimation(sitAnimation); | 3145 | Animator.TrySetMovementAnimation(sitAnimation); |
3191 | SendAvatarDataToAllAgents(); | ||
3192 | TriggerScenePresenceUpdated(); | 3146 | TriggerScenePresenceUpdated(); |
3193 | } | 3147 | } |
3194 | } | 3148 | } |
@@ -3349,8 +3303,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
3349 | 3303 | ||
3350 | #region Update Client(s) | 3304 | #region Update Client(s) |
3351 | 3305 | ||
3306 | public void SendUpdateToAgent(ScenePresence p) | ||
3307 | { | ||
3308 | IClientAPI remoteClient = p.ControllingClient; | ||
3309 | |||
3310 | if (remoteClient.IsActive) | ||
3311 | { | ||
3312 | //m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, Rotation, m_velocity); | ||
3313 | remoteClient.SendEntityUpdate(this, PrimUpdateFlags.FullUpdate); | ||
3314 | m_scene.StatsReporter.AddAgentUpdates(1); | ||
3315 | } | ||
3316 | } | ||
3317 | |||
3318 | public void SendFullUpdateToClient(IClientAPI remoteClient) | ||
3319 | { | ||
3320 | if (remoteClient.IsActive) | ||
3321 | { | ||
3322 | //m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, Rotation, m_velocity); | ||
3323 | remoteClient.SendEntityUpdate(this, PrimUpdateFlags.FullUpdate); | ||
3324 | m_scene.StatsReporter.AddAgentUpdates(1); | ||
3325 | } | ||
3326 | } | ||
3327 | |||
3352 | // this is diferente from SendTerseUpdateToClient | 3328 | // this is diferente from SendTerseUpdateToClient |
3353 | // this sends bypassing ententies updates | 3329 | // this sends bypassing entities updates |
3354 | public void SendAgentTerseUpdate(ISceneEntity p) | 3330 | public void SendAgentTerseUpdate(ISceneEntity p) |
3355 | { | 3331 | { |
3356 | ControllingClient.SendAgentTerseUpdate(p); | 3332 | ControllingClient.SendAgentTerseUpdate(p); |
@@ -3377,7 +3353,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3377 | } | 3353 | } |
3378 | } | 3354 | } |
3379 | 3355 | ||
3380 | public void SendTerseUpdateToAgentClient(ScenePresence p) | 3356 | public void SendTerseUpdateToAgent(ScenePresence p) |
3381 | { | 3357 | { |
3382 | IClientAPI remoteClient = p.ControllingClient; | 3358 | IClientAPI remoteClient = p.ControllingClient; |
3383 | 3359 | ||
@@ -3396,6 +3372,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
3396 | m_scene.StatsReporter.AddAgentUpdates(1); | 3372 | m_scene.StatsReporter.AddAgentUpdates(1); |
3397 | } | 3373 | } |
3398 | 3374 | ||
3375 | public void SendTerseUpdateToAgentNF(ScenePresence p) | ||
3376 | { | ||
3377 | IClientAPI remoteClient = p.ControllingClient; | ||
3378 | if (remoteClient.IsActive) | ||
3379 | { | ||
3380 | //m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, Rotation, m_velocity); | ||
3381 | remoteClient.SendEntityUpdate(this, PrimUpdateFlags.FullUpdate); | ||
3382 | m_scene.StatsReporter.AddAgentUpdates(1); | ||
3383 | } | ||
3384 | } | ||
3385 | |||
3386 | |||
3399 | // vars to support reduced update frequency when velocity is unchanged | 3387 | // vars to support reduced update frequency when velocity is unchanged |
3400 | private Vector3 lastVelocitySentToAllClients = Vector3.Zero; | 3388 | private Vector3 lastVelocitySentToAllClients = Vector3.Zero; |
3401 | private Vector3 lastPositionSentToAllClients = Vector3.Zero; | 3389 | private Vector3 lastPositionSentToAllClients = Vector3.Zero; |
@@ -3437,7 +3425,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3437 | 3425 | ||
3438 | // Console.WriteLine("Scheduled update for {0} in {1}", Name, Scene.Name); | 3426 | // Console.WriteLine("Scheduled update for {0} in {1}", Name, Scene.Name); |
3439 | // m_scene.ForEachClient(SendTerseUpdateToClient); | 3427 | // m_scene.ForEachClient(SendTerseUpdateToClient); |
3440 | m_scene.ForEachScenePresence(SendTerseUpdateToAgentClient); | 3428 | m_scene.ForEachScenePresence(SendTerseUpdateToAgent); |
3441 | } | 3429 | } |
3442 | TriggerScenePresenceUpdated(); | 3430 | TriggerScenePresenceUpdated(); |
3443 | } | 3431 | } |
@@ -3478,16 +3466,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
3478 | landch.sendClientInitialLandInfo(ControllingClient); | 3466 | landch.sendClientInitialLandInfo(ControllingClient); |
3479 | } | 3467 | } |
3480 | } | 3468 | } |
3481 | SendOtherAgentsAvatarDataToMe(); | ||
3482 | SendOtherAgentsAppearanceToMe(); | ||
3483 | 3469 | ||
3470 | SendOtherAgentsAvatarFullToMe(); | ||
3484 | EntityBase[] entities = Scene.Entities.GetEntities(); | 3471 | EntityBase[] entities = Scene.Entities.GetEntities(); |
3485 | foreach (EntityBase e in entities) | 3472 | foreach (EntityBase e in entities) |
3486 | { | 3473 | { |
3487 | if (e != null && e is SceneObjectGroup) | 3474 | if (e != null && e is SceneObjectGroup) |
3488 | ((SceneObjectGroup)e).SendFullUpdateToClient(ControllingClient); | 3475 | ((SceneObjectGroup)e).SendFullUpdateToClient(ControllingClient); |
3489 | } | 3476 | } |
3490 | |||
3491 | }); | 3477 | }); |
3492 | } | 3478 | } |
3493 | 3479 | ||
@@ -3508,40 +3494,56 @@ namespace OpenSim.Region.Framework.Scenes | |||
3508 | // to see if all the baked textures are already here. | 3494 | // to see if all the baked textures are already here. |
3509 | if (m_scene.AvatarFactory != null) | 3495 | if (m_scene.AvatarFactory != null) |
3510 | cachedappearance = m_scene.AvatarFactory.ValidateBakedTextureCache(this); | 3496 | cachedappearance = m_scene.AvatarFactory.ValidateBakedTextureCache(this); |
3511 | 3497 | ||
3512 | // If we aren't using a cached appearance, then clear out the baked textures | 3498 | // If we aren't using a cached appearance, then clear out the baked textures |
3513 | if (!cachedappearance) | 3499 | if (!cachedappearance) |
3514 | { | 3500 | { |
3515 | // Appearance.ResetAppearance(); | ||
3516 | // save what ???? | ||
3517 | // maybe needed so the tryretry repair works? | ||
3518 | if (m_scene.AvatarFactory != null) | 3501 | if (m_scene.AvatarFactory != null) |
3519 | m_scene.AvatarFactory.QueueAppearanceSave(UUID); | 3502 | m_scene.AvatarFactory.QueueAppearanceSave(UUID); |
3520 | } | 3503 | } |
3521 | 3504 | ||
3505 | bool newhide = m_currentParcelHide; | ||
3506 | m_currentParcelHide = false; | ||
3522 | 3507 | ||
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(); | 3508 | SendAvatarDataToAllAgents(); |
3528 | 3509 | ||
3529 | // This invocation always shows up in the viewer logs as an error. Is it needed? | 3510 | if (newhide) |
3530 | // send all information we have | 3511 | { |
3531 | // possible not needed since viewer should ask about it | 3512 | ParcelLoginCheck(m_currentParcelUUID); |
3532 | // least it all ask for baked | 3513 | m_currentParcelHide = true; |
3514 | } | ||
3515 | |||
3533 | SendAppearanceToAgent(this); | 3516 | SendAppearanceToAgent(this); |
3534 | 3517 | ||
3535 | // If we are using the the cached appearance then send it out to everyone | 3518 | m_inTransit = false; |
3536 | // send even grays | 3519 | |
3537 | if (cachedappearance) | 3520 | SendAppearanceToAllOtherAgents(); |
3521 | |||
3522 | if(Animator!= null) | ||
3523 | Animator.SendAnimPack(); | ||
3524 | } | ||
3525 | |||
3526 | /// <summary> | ||
3527 | /// Send avatar full data appearance and animations for all other root agents to this agent, this agent | ||
3528 | /// can be either a child or root | ||
3529 | /// </summary> | ||
3530 | public void SendOtherAgentsAvatarFullToMe() | ||
3531 | { | ||
3532 | int count = 0; | ||
3533 | m_scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence) | ||
3538 | { | 3534 | { |
3539 | // m_log.DebugFormat("[SCENE PRESENCE]: Baked textures are in the cache for {0} in {1}", Name, m_scene.Name); | 3535 | // only send information about other root agents |
3540 | // If the avatars baked textures are all in the cache, then we have a | 3536 | if (scenePresence.UUID == UUID) |
3541 | // complete appearance... send it out, if not, then we'll send it when | 3537 | return; |
3542 | // the avatar finishes updating its appearance | 3538 | |
3543 | SendAppearanceToAllOtherAgents(); | 3539 | scenePresence.SendAvatarDataToAgent(this); |
3544 | } | 3540 | scenePresence.SendAppearanceToAgent(this); |
3541 | scenePresence.SendAnimPackToAgent(this); | ||
3542 | // for now attachments are sent with all SOG | ||
3543 | count++; | ||
3544 | }); | ||
3545 | |||
3546 | m_scene.StatsReporter.AddAgentUpdates(count); | ||
3545 | } | 3547 | } |
3546 | 3548 | ||
3547 | /// <summary> | 3549 | /// <summary> |
@@ -3566,33 +3568,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3566 | 3568 | ||
3567 | m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) | 3569 | m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) |
3568 | { | 3570 | { |
3569 | SendAvatarDataToAgent(scenePresence); | 3571 | SendAvatarDataToAgent(scenePresence); |
3570 | count++; | 3572 | count++; |
3571 | }); | 3573 | }); |
3572 | 3574 | ||
3573 | m_scene.StatsReporter.AddAgentUpdates(count); | 3575 | m_scene.StatsReporter.AddAgentUpdates(count); |
3574 | } | 3576 | } |
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 | 3577 | ||
3597 | /// <summary> | 3578 | /// <summary> |
3598 | /// Send avatar data to an agent. | 3579 | /// Send avatar data to an agent. |
@@ -3604,7 +3585,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
3604 | if (ParcelHideThisAvatar && currentParcelUUID != avatar.currentParcelUUID && avatar.GodLevel < 200) | 3585 | if (ParcelHideThisAvatar && currentParcelUUID != avatar.currentParcelUUID && avatar.GodLevel < 200) |
3605 | return; | 3586 | return; |
3606 | avatar.ControllingClient.SendAvatarDataImmediate(this); | 3587 | avatar.ControllingClient.SendAvatarDataImmediate(this); |
3607 | Animator.SendAnimPackToClient(avatar.ControllingClient); | 3588 | } |
3589 | |||
3590 | public void SendAvatarDataToAgentNF(ScenePresence avatar) | ||
3591 | { | ||
3592 | avatar.ControllingClient.SendAvatarDataImmediate(this); | ||
3608 | } | 3593 | } |
3609 | 3594 | ||
3610 | /// <summary> | 3595 | /// <summary> |
@@ -3639,28 +3624,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3639 | } | 3624 | } |
3640 | 3625 | ||
3641 | /// <summary> | 3626 | /// <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. | 3627 | /// Send appearance data to an agent. |
3665 | /// </summary> | 3628 | /// </summary> |
3666 | /// <param name="avatar"></param> | 3629 | /// <param name="avatar"></param> |
@@ -3674,6 +3637,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
3674 | UUID, Appearance.VisualParams, Appearance.Texture.GetBytes()); | 3637 | UUID, Appearance.VisualParams, Appearance.Texture.GetBytes()); |
3675 | } | 3638 | } |
3676 | 3639 | ||
3640 | public void SendAnimPackToAgent(ScenePresence p) | ||
3641 | { | ||
3642 | if (IsChildAgent || Animator == null) | ||
3643 | return; | ||
3644 | |||
3645 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
3646 | return; | ||
3647 | |||
3648 | Animator.SendAnimPackToClient(p.ControllingClient); | ||
3649 | } | ||
3650 | |||
3651 | public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs) | ||
3652 | { | ||
3653 | if (IsChildAgent) | ||
3654 | return; | ||
3655 | |||
3656 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | ||
3657 | { | ||
3658 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
3659 | return; | ||
3660 | p.ControllingClient.SendAnimations(animations, seqs, ControllingClient.AgentId, objectIDs); | ||
3661 | }); | ||
3662 | } | ||
3663 | |||
3677 | #endregion | 3664 | #endregion |
3678 | 3665 | ||
3679 | #region Significant Movement Method | 3666 | #region Significant Movement Method |
@@ -4072,19 +4059,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4072 | cAgent.Far = DrawDistance; | 4059 | cAgent.Far = DrawDistance; |
4073 | 4060 | ||
4074 | // Throttles | 4061 | // Throttles |
4075 | float multiplier = 1; | 4062 | cAgent.Throttles = ControllingClient.GetThrottlesPacked(1); |
4076 | |||
4077 | /* this is also used to send to new main regions not children | ||
4078 | |||
4079 | int childRegions = KnownRegionCount; | ||
4080 | if (childRegions != 0) | ||
4081 | multiplier = 1f / childRegions; | ||
4082 | |||
4083 | // Minimum throttle for a child region is 1/4 of the root region throttle | ||
4084 | if (multiplier <= 0.25f) | ||
4085 | multiplier = 0.25f; | ||
4086 | */ | ||
4087 | cAgent.Throttles = ControllingClient.GetThrottlesPacked(multiplier); | ||
4088 | 4063 | ||
4089 | cAgent.HeadRotation = m_headrotation; | 4064 | cAgent.HeadRotation = m_headrotation; |
4090 | cAgent.BodyRotation = Rotation; | 4065 | cAgent.BodyRotation = Rotation; |
@@ -4193,13 +4168,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
4193 | } | 4168 | } |
4194 | catch { } | 4169 | catch { } |
4195 | 4170 | ||
4171 | Animator.ResetAnimations(); | ||
4172 | |||
4196 | // FIXME: Why is this null check necessary? Where are the cases where we get a null Anims object? | 4173 | // 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) | 4174 | if (cAgent.DefaultAnim != null) |
4200 | Animator.Animations.SetDefaultAnimation(cAgent.DefaultAnim.AnimID, cAgent.DefaultAnim.SequenceNum, UUID.Zero); | 4175 | Animator.Animations.SetDefaultAnimation(cAgent.DefaultAnim.AnimID, cAgent.DefaultAnim.SequenceNum, UUID.Zero); |
4201 | if (cAgent.AnimState != null) | 4176 | if (cAgent.AnimState != null) |
4202 | Animator.Animations.SetImplicitDefaultAnimation(cAgent.AnimState.AnimID, cAgent.AnimState.SequenceNum, UUID.Zero); | 4177 | Animator.Animations.SetImplicitDefaultAnimation(cAgent.AnimState.AnimID, cAgent.AnimState.SequenceNum, UUID.Zero); |
4178 | if (cAgent.Anims != null) | ||
4179 | Animator.Animations.FromArray(cAgent.Anims); | ||
4203 | 4180 | ||
4204 | if (Scene.AttachmentsModule != null) | 4181 | if (Scene.AttachmentsModule != null) |
4205 | Scene.AttachmentsModule.CopyAttachments(cAgent, this); | 4182 | Scene.AttachmentsModule.CopyAttachments(cAgent, this); |
@@ -4653,15 +4630,245 @@ namespace OpenSim.Region.Framework.Scenes | |||
4653 | return validated; | 4630 | return validated; |
4654 | } | 4631 | } |
4655 | 4632 | ||
4633 | public void SendAttachmentsToAllAgents() | ||
4634 | { | ||
4635 | lock (m_attachments) | ||
4636 | { | ||
4637 | foreach (SceneObjectGroup sog in m_attachments) | ||
4638 | { | ||
4639 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | ||
4640 | { | ||
4641 | if (p != this && sog.HasPrivateAttachmentPoint) | ||
4642 | return; | ||
4643 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
4644 | return; | ||
4645 | sog.SendFullUpdateToClient(p.ControllingClient); | ||
4646 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path | ||
4647 | }); | ||
4648 | } | ||
4649 | } | ||
4650 | } | ||
4656 | 4651 | ||
4657 | public void SendAttachmentsToClient(IClientAPI client) | 4652 | // send attachments to a client without filters except for huds |
4653 | // for now they are checked in several places down the line... | ||
4654 | public void SendAttachmentsToAgentNF(ScenePresence p) | ||
4658 | { | 4655 | { |
4659 | lock (m_attachments) | 4656 | lock (m_attachments) |
4660 | { | 4657 | { |
4661 | foreach (SceneObjectGroup gobj in m_attachments) | 4658 | foreach (SceneObjectGroup sog in m_attachments) |
4662 | { | 4659 | { |
4663 | gobj.SendFullUpdateToClient(client); | 4660 | if (p == this || !sog.HasPrivateAttachmentPoint) |
4661 | { | ||
4662 | sog.SendFullUpdateToClient(p.ControllingClient); | ||
4663 | } | ||
4664 | } | 4664 | } |
4665 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path | ||
4666 | } | ||
4667 | } | ||
4668 | |||
4669 | public void SendAttachmentScheduleUpdate(SceneObjectGroup sog) | ||
4670 | { | ||
4671 | if (IsChildAgent || IsInTransit) | ||
4672 | return; | ||
4673 | |||
4674 | SceneObjectPart[] origparts = sog.Parts; | ||
4675 | SceneObjectPart[] parts = new SceneObjectPart[origparts.Length]; | ||
4676 | PrimUpdateFlags[] flags = new PrimUpdateFlags[origparts.Length]; | ||
4677 | |||
4678 | SceneObjectPart rootpart = sog.RootPart; | ||
4679 | UpdateRequired rootreq = sog.RootPart.UpdateFlag; | ||
4680 | |||
4681 | int j = 0; | ||
4682 | bool allterse = true; | ||
4683 | |||
4684 | for (int i = 0; i < origparts.Length; i++) | ||
4685 | { | ||
4686 | switch (origparts[i].UpdateFlag) | ||
4687 | { | ||
4688 | case UpdateRequired.TERSE: | ||
4689 | flags[j] = PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4690 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity; | ||
4691 | parts[j] = origparts[i]; | ||
4692 | j++; | ||
4693 | break; | ||
4694 | |||
4695 | case UpdateRequired.FULL: | ||
4696 | flags[j] = PrimUpdateFlags.FullUpdate; | ||
4697 | parts[j] = origparts[i]; | ||
4698 | j++; | ||
4699 | allterse = false; | ||
4700 | break; | ||
4701 | } | ||
4702 | origparts[i].UpdateFlag = 0; | ||
4703 | } | ||
4704 | |||
4705 | if (j == 0) | ||
4706 | return; | ||
4707 | |||
4708 | if (rootreq == UpdateRequired.NONE) | ||
4709 | { | ||
4710 | if (allterse) | ||
4711 | rootreq = UpdateRequired.TERSE; | ||
4712 | else | ||
4713 | rootreq = UpdateRequired.FULL; | ||
4714 | } | ||
4715 | |||
4716 | PrimUpdateFlags rootflag = PrimUpdateFlags.FullUpdate; | ||
4717 | if (rootreq == UpdateRequired.TERSE) | ||
4718 | rootflag = PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4719 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity; | ||
4720 | |||
4721 | int nparts = j; | ||
4722 | |||
4723 | bool priv = sog.HasPrivateAttachmentPoint; | ||
4724 | |||
4725 | List<ScenePresence> allPresences = m_scene.GetScenePresences(); | ||
4726 | foreach (ScenePresence p in allPresences) | ||
4727 | { | ||
4728 | if (p != this) | ||
4729 | { | ||
4730 | if (priv || | ||
4731 | (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200)) | ||
4732 | continue; | ||
4733 | } | ||
4734 | |||
4735 | p.ControllingClient.SendEntityUpdate(rootpart, rootflag); | ||
4736 | |||
4737 | for (int i = 0; i < nparts; i++) | ||
4738 | { | ||
4739 | SceneObjectPart part = parts[i]; | ||
4740 | if (part == rootpart) | ||
4741 | continue; | ||
4742 | p.ControllingClient.SendEntityUpdate(part, flags[i]); | ||
4743 | } | ||
4744 | } | ||
4745 | } | ||
4746 | |||
4747 | public void SendAttachmentUpdate(SceneObjectGroup sog, UpdateRequired UpdateFlag) | ||
4748 | { | ||
4749 | if (IsChildAgent || IsInTransit) | ||
4750 | return; | ||
4751 | |||
4752 | PrimUpdateFlags flag; | ||
4753 | switch (UpdateFlag) | ||
4754 | { | ||
4755 | case UpdateRequired.TERSE: | ||
4756 | flag = PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4757 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity; | ||
4758 | break; | ||
4759 | |||
4760 | case UpdateRequired.FULL: | ||
4761 | flag = PrimUpdateFlags.FullUpdate; | ||
4762 | break; | ||
4763 | |||
4764 | default: | ||
4765 | return; | ||
4766 | } | ||
4767 | |||
4768 | SceneObjectPart[] parts = sog.Parts; | ||
4769 | SceneObjectPart rootpart = sog.RootPart; | ||
4770 | |||
4771 | bool priv = sog.HasPrivateAttachmentPoint; | ||
4772 | |||
4773 | List<ScenePresence> allPresences = m_scene.GetScenePresences(); | ||
4774 | foreach (ScenePresence p in allPresences) | ||
4775 | { | ||
4776 | if (p != this) | ||
4777 | { | ||
4778 | if (priv || | ||
4779 | (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200)) | ||
4780 | continue; | ||
4781 | } | ||
4782 | |||
4783 | p.ControllingClient.SendEntityUpdate(rootpart, flag); | ||
4784 | rootpart.UpdateFlag = 0; | ||
4785 | |||
4786 | for (int i = 0; i < parts.Length; i++) | ||
4787 | { | ||
4788 | SceneObjectPart part = parts[i]; | ||
4789 | if (part == rootpart) | ||
4790 | continue; | ||
4791 | p.ControllingClient.SendEntityUpdate(part, flag); | ||
4792 | part.UpdateFlag = 0; | ||
4793 | } | ||
4794 | } | ||
4795 | } | ||
4796 | |||
4797 | public void SendAttachmentScheduleUpdate(SceneObjectPart part) | ||
4798 | { | ||
4799 | if (IsChildAgent || IsInTransit) | ||
4800 | return; | ||
4801 | |||
4802 | |||
4803 | PrimUpdateFlags flag; | ||
4804 | switch (part.UpdateFlag) | ||
4805 | { | ||
4806 | case UpdateRequired.TERSE: | ||
4807 | flag = PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4808 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity; | ||
4809 | break; | ||
4810 | |||
4811 | case UpdateRequired.FULL: | ||
4812 | flag = PrimUpdateFlags.FullUpdate; | ||
4813 | break; | ||
4814 | |||
4815 | default: | ||
4816 | return; | ||
4817 | } | ||
4818 | |||
4819 | bool priv = part.ParentGroup.HasPrivateAttachmentPoint; | ||
4820 | |||
4821 | List<ScenePresence> allPresences = m_scene.GetScenePresences(); | ||
4822 | foreach (ScenePresence p in allPresences) | ||
4823 | { | ||
4824 | if (p != this) | ||
4825 | { | ||
4826 | |||
4827 | if (priv || | ||
4828 | (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200)) | ||
4829 | continue; | ||
4830 | } | ||
4831 | |||
4832 | p.ControllingClient.SendEntityUpdate(part, flag); | ||
4833 | part.UpdateFlag = 0; | ||
4834 | } | ||
4835 | } | ||
4836 | |||
4837 | public void SendAttachmentUpdate(SceneObjectPart part, UpdateRequired UpdateFlag) | ||
4838 | { | ||
4839 | if (IsChildAgent || IsInTransit) | ||
4840 | return; | ||
4841 | |||
4842 | PrimUpdateFlags flag; | ||
4843 | switch (UpdateFlag) | ||
4844 | { | ||
4845 | case UpdateRequired.TERSE: | ||
4846 | flag = PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4847 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity; | ||
4848 | break; | ||
4849 | |||
4850 | case UpdateRequired.FULL: | ||
4851 | flag = PrimUpdateFlags.FullUpdate; | ||
4852 | break; | ||
4853 | |||
4854 | default: | ||
4855 | return; | ||
4856 | } | ||
4857 | |||
4858 | bool priv = part.ParentGroup.HasPrivateAttachmentPoint; | ||
4859 | |||
4860 | List<ScenePresence> allPresences = m_scene.GetScenePresences(); | ||
4861 | foreach (ScenePresence p in allPresences) | ||
4862 | { | ||
4863 | if (p != this) | ||
4864 | { | ||
4865 | if ( priv || | ||
4866 | (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200)) | ||
4867 | continue; | ||
4868 | } | ||
4869 | |||
4870 | p.ControllingClient.SendEntityUpdate(part, flag); | ||
4871 | part.UpdateFlag = 0; | ||
4665 | } | 4872 | } |
4666 | } | 4873 | } |
4667 | 4874 | ||
@@ -5410,217 +5617,58 @@ namespace OpenSim.Region.Framework.Scenes | |||
5410 | 5617 | ||
5411 | private void parcelGodCheck(UUID currentParcelID, bool isGod) | 5618 | private void parcelGodCheck(UUID currentParcelID, bool isGod) |
5412 | { | 5619 | { |
5413 | List<ScenePresence> allpresences = null; | 5620 | List<ScenePresence> allpresences = m_scene.GetScenePresences(); |
5414 | |||
5415 | |||
5416 | allpresences = m_scene.GetScenePresences(); | ||
5417 | |||
5418 | if (isGod) | ||
5419 | { | ||
5420 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); | ||
5421 | |||
5422 | foreach (ScenePresence p in allpresences) | ||
5423 | { | ||
5424 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | ||
5425 | continue; | ||
5426 | 5621 | ||
5427 | if (p.ParcelHideThisAvatar && p.currentParcelUUID != currentParcelID) | 5622 | foreach (ScenePresence p in allpresences) |
5428 | { | ||
5429 | viewsToSendme.Add(p); // i see them | ||
5430 | } | ||
5431 | } | ||
5432 | |||
5433 | if (viewsToSendme.Count > 0) | ||
5434 | { | ||
5435 | foreach (ScenePresence p in viewsToSendme) | ||
5436 | { | ||
5437 | if (p.IsChildAgent) | ||
5438 | continue; | ||
5439 | m_log.Debug("[AVATAR]: viewMe: " + Lastname + " " + p.Lastname); | ||
5440 | ControllingClient.SendAvatarDataImmediate(p); | ||
5441 | p.SendAppearanceToAgent(this); | ||
5442 | p.SendAttachmentsToClient(ControllingClient); | ||
5443 | if (p.Animator != null) | ||
5444 | p.Animator.SendAnimPackToClient(ControllingClient); | ||
5445 | } | ||
5446 | } | ||
5447 | } | ||
5448 | else | ||
5449 | { | 5623 | { |
5450 | List<ScenePresence> killsToSendme = new List<ScenePresence>(); | 5624 | if (p.IsDeleted || p.IsChildAgent || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) |
5451 | 5625 | continue; | |
5452 | foreach (ScenePresence p in allpresences) | ||
5453 | { | ||
5454 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | ||
5455 | continue; | ||
5456 | |||
5457 | if (p.ParcelHideThisAvatar && p.currentParcelUUID != currentParcelID) | ||
5458 | { | ||
5459 | killsToSendme.Add(p); | ||
5460 | } | ||
5461 | } | ||
5462 | 5626 | ||
5463 | if (killsToSendme.Count > 0) | 5627 | if (p.ParcelHideThisAvatar && p.currentParcelUUID != currentParcelID) |
5464 | { | 5628 | { |
5465 | foreach (ScenePresence p in killsToSendme) | 5629 | if (isGod) |
5466 | { | 5630 | p.SendViewTo(this); |
5467 | m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + p.Lastname); | 5631 | else |
5468 | try { ControllingClient.SendKillObject(new List<uint> { p.LocalId }); } | 5632 | p.SendKillTo(this); |
5469 | catch (NullReferenceException) { } | ||
5470 | } | ||
5471 | } | 5633 | } |
5472 | } | 5634 | } |
5473 | |||
5474 | } | 5635 | } |
5475 | 5636 | ||
5476 | private void ParcelLoginCheck(UUID currentParcelID) | 5637 | private void ParcelLoginCheck(UUID currentParcelID) |
5477 | { | 5638 | { |
5478 | List<ScenePresence> killsToSendto = new List<ScenePresence>(); | 5639 | List<ScenePresence> allpresences = m_scene.GetScenePresences(); |
5479 | List<ScenePresence> killsToSendme = new List<ScenePresence>(); | ||
5480 | List<ScenePresence> viewsToSendto = new List<ScenePresence>(); | ||
5481 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); | ||
5482 | List<ScenePresence> allpresences = null; | ||
5483 | |||
5484 | allpresences = m_scene.GetScenePresences(); | ||
5485 | 5640 | ||
5486 | foreach (ScenePresence p in allpresences) | 5641 | foreach (ScenePresence p in allpresences) |
5487 | { | 5642 | { |
5488 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | 5643 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) |
5489 | continue; | 5644 | continue; |
5490 | 5645 | ||
5491 | if (currentParcelID != p.currentParcelUUID) | 5646 | if (currentParcelID != p.currentParcelUUID && p.GodLevel < 200) |
5492 | { | 5647 | { |
5493 | if (p.GodLevel < 200) | 5648 | SendKillTo(p); |
5494 | killsToSendto.Add(p); | ||
5495 | if (GodLevel < 200 && p.ParcelHideThisAvatar) | ||
5496 | killsToSendme.Add(p); | ||
5497 | } | ||
5498 | else | ||
5499 | { | ||
5500 | viewsToSendto.Add(p); | ||
5501 | viewsToSendme.Add(p); | ||
5502 | } | ||
5503 | } | ||
5504 | allpresences.Clear(); | ||
5505 | |||
5506 | // send the things | ||
5507 | // kill main avatar object | ||
5508 | if (killsToSendto.Count > 0 && PresenceType != PresenceType.Npc) | ||
5509 | { | ||
5510 | foreach (ScenePresence p in killsToSendto) | ||
5511 | { | ||
5512 | m_log.Debug("[AVATAR]: killTo: " + Lastname + " " + p.Lastname); | ||
5513 | try { p.ControllingClient.SendKillObject(new List<uint> { LocalId }); } | ||
5514 | catch (NullReferenceException) { } | ||
5515 | } | ||
5516 | } | ||
5517 | |||
5518 | if (killsToSendme.Count > 0) | ||
5519 | { | ||
5520 | foreach (ScenePresence p in killsToSendme) | ||
5521 | { | ||
5522 | m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + p.Lastname); | ||
5523 | try { ControllingClient.SendKillObject(new List<uint> { p.LocalId }); } | ||
5524 | catch (NullReferenceException) { } | ||
5525 | } | ||
5526 | } | ||
5527 | |||
5528 | if (viewsToSendto.Count > 0 && PresenceType != PresenceType.Npc) | ||
5529 | { | ||
5530 | foreach (ScenePresence p in viewsToSendto) | ||
5531 | { | ||
5532 | m_log.Debug("[AVATAR]: viewTo: " + Lastname + " " + p.Lastname); | ||
5533 | p.ControllingClient.SendAvatarDataImmediate(this); | ||
5534 | SendAppearanceToAgent(p); | ||
5535 | SendAttachmentsToClient(p.ControllingClient); | ||
5536 | if (Animator != null) | ||
5537 | Animator.SendAnimPackToClient(p.ControllingClient); | ||
5538 | } | ||
5539 | } | ||
5540 | |||
5541 | if (viewsToSendme.Count > 0) | ||
5542 | { | ||
5543 | foreach (ScenePresence p in viewsToSendme) | ||
5544 | { | ||
5545 | m_log.Debug("[AVATAR]: viewMe: " + Lastname + "<-" + p.Lastname); | ||
5546 | if (p.IsChildAgent) | ||
5547 | continue; | ||
5548 | ControllingClient.SendAvatarDataImmediate(p); | ||
5549 | p.SendAppearanceToAgent(this); | ||
5550 | p.SendAttachmentsToClient(ControllingClient); | ||
5551 | if (p.Animator != null) | ||
5552 | p.Animator.SendAnimPackToClient(ControllingClient); | ||
5553 | } | 5649 | } |
5554 | } | 5650 | } |
5555 | } | 5651 | } |
5556 | 5652 | ||
5557 | public void parcelRegionCross(bool abort) | 5653 | public void parcelRegionCross() |
5558 | { | 5654 | { |
5559 | if (!ParcelHideThisAvatar) | 5655 | if (!ParcelHideThisAvatar || GodLevel >= 200) |
5560 | return; | 5656 | return; |
5561 | 5657 | ||
5562 | List<ScenePresence> allpresences = null; | 5658 | List<ScenePresence> allpresences = null; |
5563 | allpresences = m_scene.GetScenePresences(); | 5659 | allpresences = m_scene.GetScenePresences(); |
5564 | 5660 | ||
5565 | if (abort) | 5661 | foreach (ScenePresence p in allpresences) |
5566 | { | 5662 | { |
5567 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); | 5663 | if (p.IsDeleted || p == this || p.IsChildAgent || p.ControllingClient == null || !p.ControllingClient.IsActive) |
5568 | 5664 | continue; | |
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 | 5665 | ||
5580 | if (viewsToSendme.Count > 0) | 5666 | if (p.currentParcelUUID == m_currentParcelUUID) |
5581 | { | 5667 | { |
5582 | foreach (ScenePresence p in viewsToSendme) | 5668 | p.SendKillTo(this); |
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 | { | ||
5597 | if (GodLevel >= 200) | ||
5598 | return; | ||
5599 | |||
5600 | List<ScenePresence> killsToSendme = new List<ScenePresence>(); | ||
5601 | foreach (ScenePresence p in allpresences) | ||
5602 | { | ||
5603 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | ||
5604 | continue; | ||
5605 | |||
5606 | if (p.currentParcelUUID == m_currentParcelUUID) | ||
5607 | { | ||
5608 | killsToSendme.Add(p); | ||
5609 | } | ||
5610 | } | ||
5611 | |||
5612 | if (killsToSendme.Count > 0) | ||
5613 | { | ||
5614 | foreach (ScenePresence p in 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 | } | 5669 | } |
5621 | } | 5670 | } |
5622 | } | 5671 | } |
5623 | |||
5624 | 5672 | ||
5625 | private void ParcelCrossCheck(UUID currentParcelID,UUID previusParcelID, | 5673 | private void ParcelCrossCheck(UUID currentParcelID,UUID previusParcelID, |
5626 | bool currentParcelHide, bool previusParcelHide, bool oldhide,bool check) | 5674 | bool currentParcelHide, bool previusParcelHide, bool oldhide,bool check) |
@@ -5631,10 +5679,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5631 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); | 5679 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); |
5632 | List<ScenePresence> allpresences = null; | 5680 | List<ScenePresence> allpresences = null; |
5633 | 5681 | ||
5634 | if (IsInTransit) | 5682 | if (IsInTransit || IsChildAgent) |
5635 | return; | ||
5636 | |||
5637 | if (IsChildAgent) | ||
5638 | return; | 5683 | return; |
5639 | 5684 | ||
5640 | if (check) | 5685 | if (check) |
@@ -5743,7 +5788,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5743 | { | 5788 | { |
5744 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | 5789 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) |
5745 | continue; | 5790 | continue; |
5746 | // only those old parcel need receive kills | 5791 | // only those old parcel need kills |
5747 | if (previusParcelID == p.currentParcelUUID && GodLevel < 200) | 5792 | if (previusParcelID == p.currentParcelUUID && GodLevel < 200) |
5748 | { | 5793 | { |
5749 | killsToSendme.Add(p); // i dont see them | 5794 | killsToSendme.Add(p); // i dont see them |
@@ -5760,37 +5805,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
5760 | } | 5805 | } |
5761 | 5806 | ||
5762 | // send the things | 5807 | // send the things |
5763 | // kill main avatar object | 5808 | |
5764 | if (killsToSendto.Count > 0 && PresenceType != PresenceType.Npc) | 5809 | if (killsToSendto.Count > 0) |
5765 | { | 5810 | { |
5766 | foreach (ScenePresence p in killsToSendto) | 5811 | foreach (ScenePresence p in killsToSendto) |
5767 | { | 5812 | { |
5768 | m_log.Debug("[AVATAR]: killTo: " + Lastname + " " + p.Lastname); | 5813 | m_log.Debug("[AVATAR]: killTo: " + Lastname + " " + p.Lastname); |
5769 | try { p.ControllingClient.SendKillObject(new List<uint> { LocalId }); } | 5814 | SendKillTo(p); |
5770 | catch (NullReferenceException) { } | ||
5771 | } | 5815 | } |
5772 | } | 5816 | } |
5773 | 5817 | ||
5774 | if (killsToSendme.Count > 0 ) | 5818 | if (killsToSendme.Count > 0) |
5775 | { | 5819 | { |
5820 | m_log.Debug("[AVATAR]: killtoMe: " + Lastname + " " + killsToSendme.Count.ToString()); | ||
5821 | |||
5776 | foreach (ScenePresence p in killsToSendme) | 5822 | foreach (ScenePresence p in killsToSendme) |
5777 | { | 5823 | { |
5778 | m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + p.Lastname); | 5824 | m_log.Debug("[AVATAR]: killToMe: " + Lastname + " " + p.Lastname); |
5779 | try {ControllingClient.SendKillObject(new List<uint> { p.LocalId }); } | 5825 | p.SendKillTo(this); |
5780 | catch (NullReferenceException) { } | ||
5781 | } | 5826 | } |
5782 | } | 5827 | } |
5783 | 5828 | ||
5784 | if (viewsToSendto.Count > 0 && PresenceType != PresenceType.Npc) | 5829 | if (viewsToSendto.Count > 0) |
5785 | { | 5830 | { |
5786 | foreach (ScenePresence p in viewsToSendto) | 5831 | foreach (ScenePresence p in viewsToSendto) |
5787 | { | 5832 | { |
5788 | p.ControllingClient.SendAvatarDataImmediate(this); | 5833 | SendViewTo(p); |
5789 | // m_log.Debug("[AVATAR]: viewTo: " + Lastname + " " + p.Lastname); | ||
5790 | SendAppearanceToAgent(p); | ||
5791 | SendAttachmentsToClient(p.ControllingClient); | ||
5792 | if (Animator != null) | ||
5793 | Animator.SendAnimPackToClient(p.ControllingClient); | ||
5794 | } | 5834 | } |
5795 | } | 5835 | } |
5796 | 5836 | ||
@@ -5801,13 +5841,48 @@ namespace OpenSim.Region.Framework.Scenes | |||
5801 | if (p.IsChildAgent) | 5841 | if (p.IsChildAgent) |
5802 | continue; | 5842 | continue; |
5803 | // m_log.Debug("[AVATAR]: viewMe: " + Lastname + "<-" + p.Lastname); | 5843 | // m_log.Debug("[AVATAR]: viewMe: " + Lastname + "<-" + p.Lastname); |
5804 | ControllingClient.SendAvatarDataImmediate(p); | 5844 | p.SendViewTo(this); |
5805 | p.SendAppearanceToAgent(this); | ||
5806 | p.SendAttachmentsToClient(ControllingClient); | ||
5807 | if (p.Animator != null) | ||
5808 | p.Animator.SendAnimPackToClient(ControllingClient); | ||
5809 | } | 5845 | } |
5810 | } | 5846 | } |
5811 | } | 5847 | } |
5848 | |||
5849 | public void HasMovedAway() | ||
5850 | { | ||
5851 | List<ScenePresence> allpresences = m_scene.GetScenePresences(); | ||
5852 | foreach (ScenePresence p in allpresences) | ||
5853 | { | ||
5854 | if (p == this) | ||
5855 | continue; | ||
5856 | SendKillTo(p); | ||
5857 | p.SendKillTo(this); | ||
5858 | } | ||
5859 | if (Scene.AttachmentsModule != null) | ||
5860 | Scene.AttachmentsModule.DeleteAttachmentsFromScene(this, true); | ||
5861 | } | ||
5862 | |||
5863 | public void SendFullKillsTo(ScenePresence p) | ||
5864 | { | ||
5865 | List<uint> ids = new List<uint>(); | ||
5866 | foreach (SceneObjectGroup sog in m_attachments) | ||
5867 | p.ControllingClient.SendPartFullUpdate(sog.RootPart, LocalId + 1); | ||
5868 | ids.Add(LocalId); | ||
5869 | p.ControllingClient.SendKillObject(ids); | ||
5870 | } | ||
5871 | |||
5872 | public void SendKillTo(ScenePresence p) | ||
5873 | { | ||
5874 | foreach (SceneObjectGroup sog in m_attachments) | ||
5875 | p.ControllingClient.SendPartFullUpdate(sog.RootPart, LocalId + 1); | ||
5876 | p.ControllingClient.SendKillObject(new List<uint> { LocalId }); | ||
5877 | } | ||
5878 | |||
5879 | public void SendViewTo(ScenePresence p) | ||
5880 | { | ||
5881 | SendAvatarDataToAgentNF(p); | ||
5882 | SendAppearanceToAgent(p); | ||
5883 | if (Animator != null) | ||
5884 | Animator.SendAnimPackToClient(p.ControllingClient); | ||
5885 | SendAttachmentsToAgentNF(p); | ||
5886 | } | ||
5812 | } | 5887 | } |
5813 | } | 5888 | } |
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 373ed41..2112b71 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 | ||
@@ -1700,5 +1702,8 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
1700 | { | 1702 | { |
1701 | } | 1703 | } |
1702 | 1704 | ||
1705 | public void SendPartFullUpdate(ISceneEntity ent, uint? parentID) | ||
1706 | { | ||
1707 | } | ||
1703 | } | 1708 | } |
1704 | } | 1709 | } |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index c88ccc5..fa1d38a 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; } |
@@ -1270,5 +1272,9 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
1270 | { | 1272 | { |
1271 | } | 1273 | } |
1272 | 1274 | ||
1275 | public void SendPartFullUpdate(ISceneEntity ent, uint? parentID) | ||
1276 | { | ||
1277 | } | ||
1278 | |||
1273 | } | 1279 | } |
1274 | } | 1280 | } |
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 52e0134..2758030 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; } |
@@ -534,6 +536,10 @@ namespace OpenSim.Tests.Common.Mock | |||
534 | ReceivedKills.AddRange(localID); | 536 | ReceivedKills.AddRange(localID); |
535 | } | 537 | } |
536 | 538 | ||
539 | public void SendPartFullUpdate(ISceneEntity ent, uint? parentID) | ||
540 | { | ||
541 | } | ||
542 | |||
537 | public virtual void SetChildAgentThrottle(byte[] throttle) | 543 | public virtual void SetChildAgentThrottle(byte[] throttle) |
538 | { | 544 | { |
539 | } | 545 | } |