diff options
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 1534 |
1 files changed, 947 insertions, 587 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 110e50e..7c62f90 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -100,6 +100,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
100 | public event AvatarPickerRequest OnAvatarPickerRequest; | 100 | public event AvatarPickerRequest OnAvatarPickerRequest; |
101 | public event StartAnim OnStartAnim; | 101 | public event StartAnim OnStartAnim; |
102 | public event StopAnim OnStopAnim; | 102 | public event StopAnim OnStopAnim; |
103 | public event ChangeAnim OnChangeAnim; | ||
103 | public event Action<IClientAPI> OnRequestAvatarsData; | 104 | public event Action<IClientAPI> OnRequestAvatarsData; |
104 | public event LinkObjects OnLinkObjects; | 105 | public event LinkObjects OnLinkObjects; |
105 | public event DelinkObjects OnDelinkObjects; | 106 | public event DelinkObjects OnDelinkObjects; |
@@ -127,6 +128,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
127 | public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily; | 128 | public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily; |
128 | public event UpdatePrimFlags OnUpdatePrimFlags; | 129 | public event UpdatePrimFlags OnUpdatePrimFlags; |
129 | public event UpdatePrimTexture OnUpdatePrimTexture; | 130 | public event UpdatePrimTexture OnUpdatePrimTexture; |
131 | public event ClientChangeObject onClientChangeObject; | ||
130 | public event UpdateVector OnUpdatePrimGroupPosition; | 132 | public event UpdateVector OnUpdatePrimGroupPosition; |
131 | public event UpdateVector OnUpdatePrimSinglePosition; | 133 | public event UpdateVector OnUpdatePrimSinglePosition; |
132 | public event UpdatePrimRotation OnUpdatePrimGroupRotation; | 134 | public event UpdatePrimRotation OnUpdatePrimGroupRotation; |
@@ -160,6 +162,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
160 | public event RequestTaskInventory OnRequestTaskInventory; | 162 | public event RequestTaskInventory OnRequestTaskInventory; |
161 | public event UpdateInventoryItem OnUpdateInventoryItem; | 163 | public event UpdateInventoryItem OnUpdateInventoryItem; |
162 | public event CopyInventoryItem OnCopyInventoryItem; | 164 | public event CopyInventoryItem OnCopyInventoryItem; |
165 | public event MoveItemsAndLeaveCopy OnMoveItemsAndLeaveCopy; | ||
163 | public event MoveInventoryItem OnMoveInventoryItem; | 166 | public event MoveInventoryItem OnMoveInventoryItem; |
164 | public event RemoveInventoryItem OnRemoveInventoryItem; | 167 | public event RemoveInventoryItem OnRemoveInventoryItem; |
165 | public event RemoveInventoryFolder OnRemoveInventoryFolder; | 168 | public event RemoveInventoryFolder OnRemoveInventoryFolder; |
@@ -258,7 +261,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
258 | public event ClassifiedInfoRequest OnClassifiedInfoRequest; | 261 | public event ClassifiedInfoRequest OnClassifiedInfoRequest; |
259 | public event ClassifiedInfoUpdate OnClassifiedInfoUpdate; | 262 | public event ClassifiedInfoUpdate OnClassifiedInfoUpdate; |
260 | public event ClassifiedDelete OnClassifiedDelete; | 263 | public event ClassifiedDelete OnClassifiedDelete; |
261 | public event ClassifiedDelete OnClassifiedGodDelete; | 264 | public event ClassifiedGodDelete OnClassifiedGodDelete; |
262 | public event EventNotificationAddRequest OnEventNotificationAddRequest; | 265 | public event EventNotificationAddRequest OnEventNotificationAddRequest; |
263 | public event EventNotificationRemoveRequest OnEventNotificationRemoveRequest; | 266 | public event EventNotificationRemoveRequest OnEventNotificationRemoveRequest; |
264 | public event EventGodDelete OnEventGodDelete; | 267 | public event EventGodDelete OnEventGodDelete; |
@@ -289,10 +292,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
289 | public event GroupVoteHistoryRequest OnGroupVoteHistoryRequest; | 292 | public event GroupVoteHistoryRequest OnGroupVoteHistoryRequest; |
290 | public event SimWideDeletesDelegate OnSimWideDeletes; | 293 | public event SimWideDeletesDelegate OnSimWideDeletes; |
291 | public event SendPostcard OnSendPostcard; | 294 | public event SendPostcard OnSendPostcard; |
295 | public event ChangeInventoryItemFlags OnChangeInventoryItemFlags; | ||
292 | public event MuteListEntryUpdate OnUpdateMuteListEntry; | 296 | public event MuteListEntryUpdate OnUpdateMuteListEntry; |
293 | public event MuteListEntryRemove OnRemoveMuteListEntry; | 297 | public event MuteListEntryRemove OnRemoveMuteListEntry; |
294 | public event GodlikeMessage onGodlikeMessage; | 298 | public event GodlikeMessage onGodlikeMessage; |
295 | public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate; | 299 | public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate; |
300 | public event GenericCall2 OnUpdateThrottles; | ||
296 | 301 | ||
297 | #endregion Events | 302 | #endregion Events |
298 | 303 | ||
@@ -327,6 +332,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
327 | private Prioritizer m_prioritizer; | 332 | private Prioritizer m_prioritizer; |
328 | private bool m_disableFacelights = false; | 333 | private bool m_disableFacelights = false; |
329 | 334 | ||
335 | private bool m_VelocityInterpolate = false; | ||
336 | private const uint MaxTransferBytesPerPacket = 600; | ||
337 | |||
338 | |||
330 | /// <value> | 339 | /// <value> |
331 | /// List used in construction of data blocks for an object update packet. This is to stop us having to | 340 | /// List used in construction of data blocks for an object update packet. This is to stop us having to |
332 | /// continually recreate it. | 341 | /// continually recreate it. |
@@ -338,14 +347,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
338 | /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an | 347 | /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an |
339 | /// ownerless phantom. | 348 | /// ownerless phantom. |
340 | /// | 349 | /// |
341 | /// All manipulation of this set has to occur under a lock | 350 | /// All manipulation of this set has to occur under an m_entityUpdates.SyncRoot lock |
342 | /// | 351 | /// |
343 | /// </value> | 352 | /// </value> |
344 | protected HashSet<uint> m_killRecord; | 353 | // protected HashSet<uint> m_killRecord; |
345 | 354 | ||
346 | // protected HashSet<uint> m_attachmentsSent; | 355 | // protected HashSet<uint> m_attachmentsSent; |
347 | 356 | ||
348 | private int m_moneyBalance; | 357 | private bool m_deliverPackets = true; |
349 | private int m_animationSequenceNumber = 1; | 358 | private int m_animationSequenceNumber = 1; |
350 | private bool m_SendLogoutPacketWhenClosing = true; | 359 | private bool m_SendLogoutPacketWhenClosing = true; |
351 | 360 | ||
@@ -392,6 +401,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
392 | get { return m_startpos; } | 401 | get { return m_startpos; } |
393 | set { m_startpos = value; } | 402 | set { m_startpos = value; } |
394 | } | 403 | } |
404 | public bool DeliverPackets | ||
405 | { | ||
406 | get { return m_deliverPackets; } | ||
407 | set { | ||
408 | m_deliverPackets = value; | ||
409 | m_udpClient.m_deliverPackets = value; | ||
410 | } | ||
411 | } | ||
395 | public UUID AgentId { get { return m_agentId; } } | 412 | public UUID AgentId { get { return m_agentId; } } |
396 | public ISceneAgent SceneAgent { get; set; } | 413 | public ISceneAgent SceneAgent { get; set; } |
397 | public UUID ActiveGroupId { get { return m_activeGroupID; } } | 414 | public UUID ActiveGroupId { get { return m_activeGroupID; } } |
@@ -420,7 +437,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
420 | public string Name { get { return FirstName + " " + LastName; } } | 437 | public string Name { get { return FirstName + " " + LastName; } } |
421 | 438 | ||
422 | public uint CircuitCode { get { return m_circuitCode; } } | 439 | public uint CircuitCode { get { return m_circuitCode; } } |
423 | public int MoneyBalance { get { return m_moneyBalance; } } | ||
424 | public int NextAnimationSequenceNumber { get { return m_animationSequenceNumber++; } } | 440 | public int NextAnimationSequenceNumber { get { return m_animationSequenceNumber++; } } |
425 | 441 | ||
426 | /// <summary> | 442 | /// <summary> |
@@ -443,6 +459,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
443 | } | 459 | } |
444 | 460 | ||
445 | public bool SendLogoutPacketWhenClosing { set { m_SendLogoutPacketWhenClosing = value; } } | 461 | public bool SendLogoutPacketWhenClosing { set { m_SendLogoutPacketWhenClosing = value; } } |
462 | |||
446 | 463 | ||
447 | #endregion Properties | 464 | #endregion Properties |
448 | 465 | ||
@@ -469,7 +486,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
469 | m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); | 486 | m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); |
470 | m_entityProps = new PriorityQueue(m_scene.Entities.Count); | 487 | m_entityProps = new PriorityQueue(m_scene.Entities.Count); |
471 | m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>(); | 488 | m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>(); |
472 | m_killRecord = new HashSet<uint>(); | 489 | // m_killRecord = new HashSet<uint>(); |
473 | // m_attachmentsSent = new HashSet<uint>(); | 490 | // m_attachmentsSent = new HashSet<uint>(); |
474 | 491 | ||
475 | m_assetService = m_scene.RequestModuleInterface<IAssetService>(); | 492 | m_assetService = m_scene.RequestModuleInterface<IAssetService>(); |
@@ -483,7 +500,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
483 | m_firstName = sessionInfo.LoginInfo.First; | 500 | m_firstName = sessionInfo.LoginInfo.First; |
484 | m_lastName = sessionInfo.LoginInfo.Last; | 501 | m_lastName = sessionInfo.LoginInfo.Last; |
485 | m_startpos = sessionInfo.LoginInfo.StartPos; | 502 | m_startpos = sessionInfo.LoginInfo.StartPos; |
486 | m_moneyBalance = 1000; | ||
487 | 503 | ||
488 | m_udpServer = udpServer; | 504 | m_udpServer = udpServer; |
489 | m_udpClient = udpClient; | 505 | m_udpClient = udpClient; |
@@ -499,12 +515,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
499 | 515 | ||
500 | #region Client Methods | 516 | #region Client Methods |
501 | 517 | ||
518 | |||
519 | /// <summary> | ||
520 | /// Close down the client view | ||
521 | /// </summary> | ||
502 | public void Close() | 522 | public void Close() |
503 | { | 523 | { |
504 | Close(false); | 524 | Close(true, false); |
505 | } | 525 | } |
506 | 526 | ||
507 | public void Close(bool force) | 527 | public void Close(bool sendStop, bool force) |
508 | { | 528 | { |
509 | // We lock here to prevent race conditions between two threads calling close simultaneously (e.g. | 529 | // We lock here to prevent race conditions between two threads calling close simultaneously (e.g. |
510 | // a simultaneous relog just as a client is being closed out due to no packet ack from the old connection. | 530 | // a simultaneous relog just as a client is being closed out due to no packet ack from the old connection. |
@@ -516,7 +536,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
516 | return; | 536 | return; |
517 | 537 | ||
518 | IsActive = false; | 538 | IsActive = false; |
519 | CloseWithoutChecks(); | 539 | CloseWithoutChecks(sendStop); |
520 | } | 540 | } |
521 | } | 541 | } |
522 | 542 | ||
@@ -529,12 +549,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
529 | /// | 549 | /// |
530 | /// Callers must lock ClosingSyncLock before calling. | 550 | /// Callers must lock ClosingSyncLock before calling. |
531 | /// </remarks> | 551 | /// </remarks> |
532 | public void CloseWithoutChecks() | 552 | public void CloseWithoutChecks(bool sendStop) |
533 | { | 553 | { |
534 | m_log.DebugFormat( | 554 | m_log.DebugFormat( |
535 | "[CLIENT]: Close has been called for {0} attached to scene {1}", | 555 | "[CLIENT]: Close has been called for {0} attached to scene {1}", |
536 | Name, m_scene.RegionInfo.RegionName); | 556 | Name, m_scene.RegionInfo.RegionName); |
537 | 557 | ||
558 | if (sendStop) | ||
559 | { | ||
560 | // Send the STOP packet | ||
561 | DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator); | ||
562 | OutPacket(disable, ThrottleOutPacketType.Unknown); | ||
563 | } | ||
564 | |||
538 | // Shutdown the image manager | 565 | // Shutdown the image manager |
539 | ImageManager.Close(); | 566 | ImageManager.Close(); |
540 | 567 | ||
@@ -557,6 +584,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
557 | // Disable UDP handling for this client | 584 | // Disable UDP handling for this client |
558 | m_udpClient.Shutdown(); | 585 | m_udpClient.Shutdown(); |
559 | 586 | ||
587 | |||
560 | //m_log.InfoFormat("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false)); | 588 | //m_log.InfoFormat("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false)); |
561 | //GC.Collect(); | 589 | //GC.Collect(); |
562 | //m_log.InfoFormat("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true)); | 590 | //m_log.InfoFormat("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true)); |
@@ -791,9 +819,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
791 | handshake.RegionInfo3.ColoName = Utils.EmptyBytes; | 819 | handshake.RegionInfo3.ColoName = Utils.EmptyBytes; |
792 | handshake.RegionInfo3.ProductName = Util.StringToBytes256(regionInfo.RegionType); | 820 | handshake.RegionInfo3.ProductName = Util.StringToBytes256(regionInfo.RegionType); |
793 | handshake.RegionInfo3.ProductSKU = Utils.EmptyBytes; | 821 | handshake.RegionInfo3.ProductSKU = Utils.EmptyBytes; |
822 | |||
794 | handshake.RegionInfo4 = new RegionHandshakePacket.RegionInfo4Block[0]; | 823 | handshake.RegionInfo4 = new RegionHandshakePacket.RegionInfo4Block[0]; |
795 | 824 | // OutPacket(handshake, ThrottleOutPacketType.Task); | |
796 | OutPacket(handshake, ThrottleOutPacketType.Task); | 825 | // use same as MoveAgentIntoRegion (both should be task ) |
826 | OutPacket(handshake, ThrottleOutPacketType.Unknown); | ||
797 | } | 827 | } |
798 | 828 | ||
799 | public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look) | 829 | public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look) |
@@ -833,7 +863,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
833 | reply.ChatData.OwnerID = ownerID; | 863 | reply.ChatData.OwnerID = ownerID; |
834 | reply.ChatData.SourceID = fromAgentID; | 864 | reply.ChatData.SourceID = fromAgentID; |
835 | 865 | ||
836 | OutPacket(reply, ThrottleOutPacketType.Task); | 866 | OutPacket(reply, ThrottleOutPacketType.Unknown); |
837 | } | 867 | } |
838 | 868 | ||
839 | /// <summary> | 869 | /// <summary> |
@@ -866,38 +896,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
866 | msg.MessageBlock.Message = Util.StringToBytes1024(im.message); | 896 | msg.MessageBlock.Message = Util.StringToBytes1024(im.message); |
867 | msg.MessageBlock.BinaryBucket = im.binaryBucket; | 897 | msg.MessageBlock.BinaryBucket = im.binaryBucket; |
868 | 898 | ||
869 | if (im.message.StartsWith("[grouptest]")) | 899 | OutPacket(msg, ThrottleOutPacketType.Task); |
870 | { // this block is test code for implementing group IM - delete when group IM is finished | ||
871 | IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>(); | ||
872 | if (eq != null) | ||
873 | { | ||
874 | im.dialog = 17; | ||
875 | |||
876 | //eq.ChatterboxInvitation( | ||
877 | // new UUID("00000000-68f9-1111-024e-222222111123"), | ||
878 | // "OpenSimulator Testing", im.fromAgentID, im.message, im.toAgentID, im.fromAgentName, im.dialog, 0, | ||
879 | // false, 0, new Vector3(), 1, im.imSessionID, im.fromGroup, im.binaryBucket); | ||
880 | |||
881 | eq.ChatterboxInvitation( | ||
882 | new UUID("00000000-68f9-1111-024e-222222111123"), | ||
883 | "OpenSimulator Testing", new UUID(im.fromAgentID), im.message, new UUID(im.toAgentID), im.fromAgentName, im.dialog, 0, | ||
884 | false, 0, new Vector3(), 1, new UUID(im.imSessionID), im.fromGroup, Util.StringToBytes256("OpenSimulator Testing")); | ||
885 | |||
886 | eq.ChatterBoxSessionAgentListUpdates( | ||
887 | new UUID("00000000-68f9-1111-024e-222222111123"), | ||
888 | new UUID(im.fromAgentID), new UUID(im.toAgentID), false, false, false); | ||
889 | } | ||
890 | |||
891 | Console.WriteLine("SendInstantMessage: " + msg); | ||
892 | } | ||
893 | else | ||
894 | OutPacket(msg, ThrottleOutPacketType.Task); | ||
895 | } | 900 | } |
896 | } | 901 | } |
897 | 902 | ||
898 | public void SendGenericMessage(string method, List<string> message) | 903 | public void SendGenericMessage(string method, UUID invoice, List<string> message) |
899 | { | 904 | { |
900 | GenericMessagePacket gmp = new GenericMessagePacket(); | 905 | GenericMessagePacket gmp = new GenericMessagePacket(); |
906 | |||
907 | gmp.AgentData.AgentID = AgentId; | ||
908 | gmp.AgentData.SessionID = m_sessionId; | ||
909 | gmp.AgentData.TransactionID = invoice; | ||
910 | |||
901 | gmp.MethodData.Method = Util.StringToBytes256(method); | 911 | gmp.MethodData.Method = Util.StringToBytes256(method); |
902 | gmp.ParamList = new GenericMessagePacket.ParamListBlock[message.Count]; | 912 | gmp.ParamList = new GenericMessagePacket.ParamListBlock[message.Count]; |
903 | int i = 0; | 913 | int i = 0; |
@@ -910,9 +920,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
910 | OutPacket(gmp, ThrottleOutPacketType.Task); | 920 | OutPacket(gmp, ThrottleOutPacketType.Task); |
911 | } | 921 | } |
912 | 922 | ||
913 | public void SendGenericMessage(string method, List<byte[]> message) | 923 | public void SendGenericMessage(string method, UUID invoice, List<byte[]> message) |
914 | { | 924 | { |
915 | GenericMessagePacket gmp = new GenericMessagePacket(); | 925 | GenericMessagePacket gmp = new GenericMessagePacket(); |
926 | |||
927 | gmp.AgentData.AgentID = AgentId; | ||
928 | gmp.AgentData.SessionID = m_sessionId; | ||
929 | gmp.AgentData.TransactionID = invoice; | ||
930 | |||
916 | gmp.MethodData.Method = Util.StringToBytes256(method); | 931 | gmp.MethodData.Method = Util.StringToBytes256(method); |
917 | gmp.ParamList = new GenericMessagePacket.ParamListBlock[message.Count]; | 932 | gmp.ParamList = new GenericMessagePacket.ParamListBlock[message.Count]; |
918 | int i = 0; | 933 | int i = 0; |
@@ -1119,6 +1134,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1119 | public virtual void SendLayerData(float[] map) | 1134 | public virtual void SendLayerData(float[] map) |
1120 | { | 1135 | { |
1121 | Util.FireAndForget(DoSendLayerData, map); | 1136 | Util.FireAndForget(DoSendLayerData, map); |
1137 | |||
1138 | // Send it sync, and async. It's not that much data | ||
1139 | // and it improves user experience just so much! | ||
1140 | DoSendLayerData(map); | ||
1122 | } | 1141 | } |
1123 | 1142 | ||
1124 | /// <summary> | 1143 | /// <summary> |
@@ -1131,16 +1150,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1131 | 1150 | ||
1132 | try | 1151 | try |
1133 | { | 1152 | { |
1134 | //for (int y = 0; y < 16; y++) | 1153 | for (int y = 0; y < 16; y++) |
1135 | //{ | 1154 | { |
1136 | // for (int x = 0; x < 16; x++) | 1155 | for (int x = 0; x < 16; x+=4) |
1137 | // { | 1156 | { |
1138 | // SendLayerData(x, y, map); | 1157 | SendLayerPacket(x, y, map); |
1139 | // } | 1158 | } |
1140 | //} | 1159 | } |
1141 | |||
1142 | // Send LayerData in a spiral pattern. Fun! | ||
1143 | SendLayerTopRight(map, 0, 0, 15, 15); | ||
1144 | } | 1160 | } |
1145 | catch (Exception e) | 1161 | catch (Exception e) |
1146 | { | 1162 | { |
@@ -1148,51 +1164,35 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1148 | } | 1164 | } |
1149 | } | 1165 | } |
1150 | 1166 | ||
1151 | private void SendLayerTopRight(float[] map, int x1, int y1, int x2, int y2) | ||
1152 | { | ||
1153 | // Row | ||
1154 | for (int i = x1; i <= x2; i++) | ||
1155 | SendLayerData(i, y1, map); | ||
1156 | |||
1157 | // Column | ||
1158 | for (int j = y1 + 1; j <= y2; j++) | ||
1159 | SendLayerData(x2, j, map); | ||
1160 | |||
1161 | if (x2 - x1 > 0) | ||
1162 | SendLayerBottomLeft(map, x1, y1 + 1, x2 - 1, y2); | ||
1163 | } | ||
1164 | |||
1165 | void SendLayerBottomLeft(float[] map, int x1, int y1, int x2, int y2) | ||
1166 | { | ||
1167 | // Row in reverse | ||
1168 | for (int i = x2; i >= x1; i--) | ||
1169 | SendLayerData(i, y2, map); | ||
1170 | |||
1171 | // Column in reverse | ||
1172 | for (int j = y2 - 1; j >= y1; j--) | ||
1173 | SendLayerData(x1, j, map); | ||
1174 | |||
1175 | if (x2 - x1 > 0) | ||
1176 | SendLayerTopRight(map, x1 + 1, y1, x2, y2 - 1); | ||
1177 | } | ||
1178 | |||
1179 | /// <summary> | 1167 | /// <summary> |
1180 | /// Sends a set of four patches (x, x+1, ..., x+3) to the client | 1168 | /// Sends a set of four patches (x, x+1, ..., x+3) to the client |
1181 | /// </summary> | 1169 | /// </summary> |
1182 | /// <param name="map">heightmap</param> | 1170 | /// <param name="map">heightmap</param> |
1183 | /// <param name="px">X coordinate for patches 0..12</param> | 1171 | /// <param name="px">X coordinate for patches 0..12</param> |
1184 | /// <param name="py">Y coordinate for patches 0..15</param> | 1172 | /// <param name="py">Y coordinate for patches 0..15</param> |
1185 | // private void SendLayerPacket(float[] map, int y, int x) | 1173 | private void SendLayerPacket(int x, int y, float[] map) |
1186 | // { | 1174 | { |
1187 | // int[] patches = new int[4]; | 1175 | int[] patches = new int[4]; |
1188 | // patches[0] = x + 0 + y * 16; | 1176 | patches[0] = x + 0 + y * 16; |
1189 | // patches[1] = x + 1 + y * 16; | 1177 | patches[1] = x + 1 + y * 16; |
1190 | // patches[2] = x + 2 + y * 16; | 1178 | patches[2] = x + 2 + y * 16; |
1191 | // patches[3] = x + 3 + y * 16; | 1179 | patches[3] = x + 3 + y * 16; |
1192 | 1180 | ||
1193 | // Packet layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches); | 1181 | float[] heightmap = (map.Length == 65536) ? |
1194 | // OutPacket(layerpack, ThrottleOutPacketType.Land); | 1182 | map : |
1195 | // } | 1183 | LLHeightFieldMoronize(map); |
1184 | |||
1185 | try | ||
1186 | { | ||
1187 | Packet layerpack = TerrainCompressor.CreateLandPacket(heightmap, patches); | ||
1188 | OutPacket(layerpack, ThrottleOutPacketType.Land); | ||
1189 | } | ||
1190 | catch | ||
1191 | { | ||
1192 | for (int px = x ; px < x + 4 ; px++) | ||
1193 | SendLayerData(px, y, map); | ||
1194 | } | ||
1195 | } | ||
1196 | 1196 | ||
1197 | /// <summary> | 1197 | /// <summary> |
1198 | /// Sends a specified patch to a client | 1198 | /// Sends a specified patch to a client |
@@ -1212,7 +1212,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1212 | LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(heightmap, patches); | 1212 | LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(heightmap, patches); |
1213 | layerpack.Header.Reliable = true; | 1213 | layerpack.Header.Reliable = true; |
1214 | 1214 | ||
1215 | OutPacket(layerpack, ThrottleOutPacketType.Land); | 1215 | OutPacket(layerpack, ThrottleOutPacketType.Task); |
1216 | } | 1216 | } |
1217 | catch (Exception e) | 1217 | catch (Exception e) |
1218 | { | 1218 | { |
@@ -1523,7 +1523,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1523 | OutPacket(tpProgress, ThrottleOutPacketType.Unknown); | 1523 | OutPacket(tpProgress, ThrottleOutPacketType.Unknown); |
1524 | } | 1524 | } |
1525 | 1525 | ||
1526 | public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance) | 1526 | public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance, int transactionType, UUID sourceID, bool sourceIsGroup, UUID destID, bool destIsGroup, int amount, string item) |
1527 | { | 1527 | { |
1528 | MoneyBalanceReplyPacket money = (MoneyBalanceReplyPacket)PacketPool.Instance.GetPacket(PacketType.MoneyBalanceReply); | 1528 | MoneyBalanceReplyPacket money = (MoneyBalanceReplyPacket)PacketPool.Instance.GetPacket(PacketType.MoneyBalanceReply); |
1529 | money.MoneyData.AgentID = AgentId; | 1529 | money.MoneyData.AgentID = AgentId; |
@@ -1531,7 +1531,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1531 | money.MoneyData.TransactionSuccess = success; | 1531 | money.MoneyData.TransactionSuccess = success; |
1532 | money.MoneyData.Description = description; | 1532 | money.MoneyData.Description = description; |
1533 | money.MoneyData.MoneyBalance = balance; | 1533 | money.MoneyData.MoneyBalance = balance; |
1534 | money.TransactionInfo.ItemDescription = Util.StringToBytes256("NONE"); | 1534 | money.TransactionInfo.TransactionType = transactionType; |
1535 | money.TransactionInfo.SourceID = sourceID; | ||
1536 | money.TransactionInfo.IsSourceGroup = sourceIsGroup; | ||
1537 | money.TransactionInfo.DestID = destID; | ||
1538 | money.TransactionInfo.IsDestGroup = destIsGroup; | ||
1539 | money.TransactionInfo.Amount = amount; | ||
1540 | money.TransactionInfo.ItemDescription = Util.StringToBytes256(item); | ||
1541 | |||
1535 | OutPacket(money, ThrottleOutPacketType.Task); | 1542 | OutPacket(money, ThrottleOutPacketType.Task); |
1536 | } | 1543 | } |
1537 | 1544 | ||
@@ -1575,7 +1582,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1575 | 1582 | ||
1576 | public void SendKillObject(ulong regionHandle, List<uint> localIDs) | 1583 | public void SendKillObject(ulong regionHandle, List<uint> localIDs) |
1577 | { | 1584 | { |
1578 | // m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, localID, regionHandle); | 1585 | // foreach (uint id in localIDs) |
1586 | // m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, id, regionHandle); | ||
1579 | 1587 | ||
1580 | KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject); | 1588 | KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject); |
1581 | // TODO: don't create new blocks if recycling an old packet | 1589 | // TODO: don't create new blocks if recycling an old packet |
@@ -1597,17 +1605,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1597 | // We MUST lock for both manipulating the kill record and sending the packet, in order to avoid a race | 1605 | // We MUST lock for both manipulating the kill record and sending the packet, in order to avoid a race |
1598 | // condition where a kill can be processed before an out-of-date update for the same object. | 1606 | // condition where a kill can be processed before an out-of-date update for the same object. |
1599 | // ProcessEntityUpdates() also takes the m_killRecord lock. | 1607 | // ProcessEntityUpdates() also takes the m_killRecord lock. |
1600 | lock (m_killRecord) | 1608 | // lock (m_killRecord) |
1601 | { | 1609 | // { |
1602 | foreach (uint localID in localIDs) | 1610 | // foreach (uint localID in localIDs) |
1603 | m_killRecord.Add(localID); | 1611 | // m_killRecord.Add(localID); |
1604 | 1612 | ||
1605 | // The throttle queue used here must match that being used for updates. Otherwise, there is a | 1613 | // The throttle queue used here must match that being used for updates. Otherwise, there is a |
1606 | // chance that a kill packet put on a separate queue will be sent to the client before an existing | 1614 | // chance that a kill packet put on a separate queue will be sent to the client before an existing |
1607 | // update packet on another queue. Receiving updates after kills results in unowned and undeletable | 1615 | // update packet on another queue. Receiving updates after kills results in unowned and undeletable |
1608 | // scene objects in a viewer until that viewer is relogged in. | 1616 | // scene objects in a viewer until that viewer is relogged in. |
1609 | OutPacket(kill, ThrottleOutPacketType.Task); | 1617 | OutPacket(kill, ThrottleOutPacketType.Task); |
1610 | } | 1618 | // } |
1611 | } | 1619 | } |
1612 | } | 1620 | } |
1613 | 1621 | ||
@@ -1729,7 +1737,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1729 | newBlock.CreationDate = item.CreationDate; | 1737 | newBlock.CreationDate = item.CreationDate; |
1730 | newBlock.SalePrice = item.SalePrice; | 1738 | newBlock.SalePrice = item.SalePrice; |
1731 | newBlock.SaleType = item.SaleType; | 1739 | newBlock.SaleType = item.SaleType; |
1732 | newBlock.Flags = item.Flags; | 1740 | newBlock.Flags = item.Flags & 0xff; |
1733 | 1741 | ||
1734 | newBlock.CRC = | 1742 | newBlock.CRC = |
1735 | Helpers.InventoryCRC(newBlock.CreationDate, newBlock.SaleType, | 1743 | Helpers.InventoryCRC(newBlock.CreationDate, newBlock.SaleType, |
@@ -1983,7 +1991,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1983 | itemBlock.GroupID = item.GroupID; | 1991 | itemBlock.GroupID = item.GroupID; |
1984 | itemBlock.GroupOwned = item.GroupOwned; | 1992 | itemBlock.GroupOwned = item.GroupOwned; |
1985 | itemBlock.GroupMask = item.GroupPermissions; | 1993 | itemBlock.GroupMask = item.GroupPermissions; |
1986 | itemBlock.Flags = item.Flags; | 1994 | itemBlock.Flags = item.Flags & 0xff; |
1987 | itemBlock.SalePrice = item.SalePrice; | 1995 | itemBlock.SalePrice = item.SalePrice; |
1988 | itemBlock.SaleType = item.SaleType; | 1996 | itemBlock.SaleType = item.SaleType; |
1989 | itemBlock.CreationDate = item.CreationDate; | 1997 | itemBlock.CreationDate = item.CreationDate; |
@@ -2050,7 +2058,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2050 | bulkUpdate.ItemData[0].GroupID = item.GroupID; | 2058 | bulkUpdate.ItemData[0].GroupID = item.GroupID; |
2051 | bulkUpdate.ItemData[0].GroupOwned = item.GroupOwned; | 2059 | bulkUpdate.ItemData[0].GroupOwned = item.GroupOwned; |
2052 | bulkUpdate.ItemData[0].GroupMask = item.GroupPermissions; | 2060 | bulkUpdate.ItemData[0].GroupMask = item.GroupPermissions; |
2053 | bulkUpdate.ItemData[0].Flags = item.Flags; | 2061 | bulkUpdate.ItemData[0].Flags = item.Flags & 0xff; |
2054 | bulkUpdate.ItemData[0].SalePrice = item.SalePrice; | 2062 | bulkUpdate.ItemData[0].SalePrice = item.SalePrice; |
2055 | bulkUpdate.ItemData[0].SaleType = item.SaleType; | 2063 | bulkUpdate.ItemData[0].SaleType = item.SaleType; |
2056 | 2064 | ||
@@ -2066,9 +2074,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2066 | OutPacket(bulkUpdate, ThrottleOutPacketType.Asset); | 2074 | OutPacket(bulkUpdate, ThrottleOutPacketType.Asset); |
2067 | } | 2075 | } |
2068 | 2076 | ||
2069 | /// <see>IClientAPI.SendInventoryItemCreateUpdate(InventoryItemBase)</see> | ||
2070 | public void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId) | 2077 | public void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId) |
2071 | { | 2078 | { |
2079 | SendInventoryItemCreateUpdate(Item, UUID.Zero, callbackId); | ||
2080 | } | ||
2081 | |||
2082 | /// <see>IClientAPI.SendInventoryItemCreateUpdate(InventoryItemBase)</see> | ||
2083 | public void SendInventoryItemCreateUpdate(InventoryItemBase Item, UUID transactionID, uint callbackId) | ||
2084 | { | ||
2072 | const uint FULL_MASK_PERMISSIONS = (uint)0x7fffffff; | 2085 | const uint FULL_MASK_PERMISSIONS = (uint)0x7fffffff; |
2073 | 2086 | ||
2074 | UpdateCreateInventoryItemPacket InventoryReply | 2087 | UpdateCreateInventoryItemPacket InventoryReply |
@@ -2078,6 +2091,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2078 | // TODO: don't create new blocks if recycling an old packet | 2091 | // TODO: don't create new blocks if recycling an old packet |
2079 | InventoryReply.AgentData.AgentID = AgentId; | 2092 | InventoryReply.AgentData.AgentID = AgentId; |
2080 | InventoryReply.AgentData.SimApproved = true; | 2093 | InventoryReply.AgentData.SimApproved = true; |
2094 | InventoryReply.AgentData.TransactionID = transactionID; | ||
2081 | InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1]; | 2095 | InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1]; |
2082 | InventoryReply.InventoryData[0] = new UpdateCreateInventoryItemPacket.InventoryDataBlock(); | 2096 | InventoryReply.InventoryData[0] = new UpdateCreateInventoryItemPacket.InventoryDataBlock(); |
2083 | InventoryReply.InventoryData[0].ItemID = Item.ID; | 2097 | InventoryReply.InventoryData[0].ItemID = Item.ID; |
@@ -2098,7 +2112,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2098 | InventoryReply.InventoryData[0].GroupID = Item.GroupID; | 2112 | InventoryReply.InventoryData[0].GroupID = Item.GroupID; |
2099 | InventoryReply.InventoryData[0].GroupOwned = Item.GroupOwned; | 2113 | InventoryReply.InventoryData[0].GroupOwned = Item.GroupOwned; |
2100 | InventoryReply.InventoryData[0].GroupMask = Item.GroupPermissions; | 2114 | InventoryReply.InventoryData[0].GroupMask = Item.GroupPermissions; |
2101 | InventoryReply.InventoryData[0].Flags = Item.Flags; | 2115 | InventoryReply.InventoryData[0].Flags = Item.Flags & 0xff; |
2102 | InventoryReply.InventoryData[0].SalePrice = Item.SalePrice; | 2116 | InventoryReply.InventoryData[0].SalePrice = Item.SalePrice; |
2103 | InventoryReply.InventoryData[0].SaleType = Item.SaleType; | 2117 | InventoryReply.InventoryData[0].SaleType = Item.SaleType; |
2104 | InventoryReply.InventoryData[0].CreationDate = Item.CreationDate; | 2118 | InventoryReply.InventoryData[0].CreationDate = Item.CreationDate; |
@@ -2147,16 +2161,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2147 | replytask.InventoryData.TaskID = taskID; | 2161 | replytask.InventoryData.TaskID = taskID; |
2148 | replytask.InventoryData.Serial = serial; | 2162 | replytask.InventoryData.Serial = serial; |
2149 | replytask.InventoryData.Filename = fileName; | 2163 | replytask.InventoryData.Filename = fileName; |
2150 | OutPacket(replytask, ThrottleOutPacketType.Asset); | 2164 | OutPacket(replytask, ThrottleOutPacketType.Task); |
2151 | } | 2165 | } |
2152 | 2166 | ||
2153 | public void SendXferPacket(ulong xferID, uint packet, byte[] data) | 2167 | public void SendXferPacket(ulong xferID, uint packet, byte[] data, bool isTaskInventory) |
2154 | { | 2168 | { |
2169 | ThrottleOutPacketType type = ThrottleOutPacketType.Asset; | ||
2170 | if (isTaskInventory) | ||
2171 | type = ThrottleOutPacketType.Task; | ||
2172 | |||
2155 | SendXferPacketPacket sendXfer = (SendXferPacketPacket)PacketPool.Instance.GetPacket(PacketType.SendXferPacket); | 2173 | SendXferPacketPacket sendXfer = (SendXferPacketPacket)PacketPool.Instance.GetPacket(PacketType.SendXferPacket); |
2156 | sendXfer.XferID.ID = xferID; | 2174 | sendXfer.XferID.ID = xferID; |
2157 | sendXfer.XferID.Packet = packet; | 2175 | sendXfer.XferID.Packet = packet; |
2158 | sendXfer.DataPacket.Data = data; | 2176 | sendXfer.DataPacket.Data = data; |
2159 | OutPacket(sendXfer, ThrottleOutPacketType.Asset); | 2177 | OutPacket(sendXfer, type); |
2160 | } | 2178 | } |
2161 | 2179 | ||
2162 | public void SendAbortXferPacket(ulong xferID) | 2180 | public void SendAbortXferPacket(ulong xferID) |
@@ -2215,9 +2233,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2215 | 2233 | ||
2216 | public void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle) | 2234 | public void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle) |
2217 | { | 2235 | { |
2218 | m_activeGroupID = activegroupid; | 2236 | if (agentid == AgentId) |
2219 | m_activeGroupName = groupname; | 2237 | { |
2220 | m_activeGroupPowers = grouppowers; | 2238 | m_activeGroupID = activegroupid; |
2239 | m_activeGroupName = groupname; | ||
2240 | m_activeGroupPowers = grouppowers; | ||
2241 | } | ||
2221 | 2242 | ||
2222 | AgentDataUpdatePacket sendAgentDataUpdate = (AgentDataUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentDataUpdate); | 2243 | AgentDataUpdatePacket sendAgentDataUpdate = (AgentDataUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentDataUpdate); |
2223 | sendAgentDataUpdate.AgentData.ActiveGroupID = activegroupid; | 2244 | sendAgentDataUpdate.AgentData.ActiveGroupID = activegroupid; |
@@ -2264,6 +2285,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2264 | /// <returns></returns> | 2285 | /// <returns></returns> |
2265 | public AgentAlertMessagePacket BuildAgentAlertPacket(string message, bool modal) | 2286 | public AgentAlertMessagePacket BuildAgentAlertPacket(string message, bool modal) |
2266 | { | 2287 | { |
2288 | // Prepend a slash to make the message come up in the top right | ||
2289 | // again. | ||
2290 | // Allow special formats to be sent from aware modules. | ||
2291 | if (!modal && !message.StartsWith("ALERT: ") && !message.StartsWith("NOTIFY: ") && message != "Home position set." && message != "You died and have been teleported to your home location") | ||
2292 | message = "/" + message; | ||
2267 | AgentAlertMessagePacket alertPack = (AgentAlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage); | 2293 | AgentAlertMessagePacket alertPack = (AgentAlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage); |
2268 | alertPack.AgentData.AgentID = AgentId; | 2294 | alertPack.AgentData.AgentID = AgentId; |
2269 | alertPack.AlertData.Message = Util.StringToBytes256(message); | 2295 | alertPack.AlertData.Message = Util.StringToBytes256(message); |
@@ -2338,6 +2364,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2338 | OutPacket(sound, ThrottleOutPacketType.Task); | 2364 | OutPacket(sound, ThrottleOutPacketType.Task); |
2339 | } | 2365 | } |
2340 | 2366 | ||
2367 | public void SendTransferAbort(TransferRequestPacket transferRequest) | ||
2368 | { | ||
2369 | TransferAbortPacket abort = (TransferAbortPacket)PacketPool.Instance.GetPacket(PacketType.TransferAbort); | ||
2370 | abort.TransferInfo.TransferID = transferRequest.TransferInfo.TransferID; | ||
2371 | abort.TransferInfo.ChannelType = transferRequest.TransferInfo.ChannelType; | ||
2372 | m_log.Debug("[Assets] Aborting transfer; asset request failed"); | ||
2373 | OutPacket(abort, ThrottleOutPacketType.Task); | ||
2374 | } | ||
2375 | |||
2341 | public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle, Vector3 position, float gain) | 2376 | public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle, Vector3 position, float gain) |
2342 | { | 2377 | { |
2343 | SoundTriggerPacket sound = (SoundTriggerPacket)PacketPool.Instance.GetPacket(PacketType.SoundTrigger); | 2378 | SoundTriggerPacket sound = (SoundTriggerPacket)PacketPool.Instance.GetPacket(PacketType.SoundTrigger); |
@@ -2646,6 +2681,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2646 | float friction = part.Friction; | 2681 | float friction = part.Friction; |
2647 | float bounce = part.Restitution; | 2682 | float bounce = part.Restitution; |
2648 | float gravmod = part.GravityModifier; | 2683 | float gravmod = part.GravityModifier; |
2684 | |||
2649 | eq.partPhysicsProperties(localid, physshapetype, density, friction, bounce, gravmod,AgentId); | 2685 | eq.partPhysicsProperties(localid, physshapetype, density, friction, bounce, gravmod,AgentId); |
2650 | } | 2686 | } |
2651 | } | 2687 | } |
@@ -2716,8 +2752,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2716 | req.AssetInf.ID, req.AssetInf.Metadata.ContentType); | 2752 | req.AssetInf.ID, req.AssetInf.Metadata.ContentType); |
2717 | return; | 2753 | return; |
2718 | } | 2754 | } |
2755 | int WearableOut = 0; | ||
2756 | bool isWearable = false; | ||
2719 | 2757 | ||
2720 | //m_log.Debug("sending asset " + req.RequestAssetID); | 2758 | if (req.AssetInf != null) |
2759 | isWearable = | ||
2760 | ((AssetType) req.AssetInf.Type == | ||
2761 | AssetType.Bodypart || (AssetType) req.AssetInf.Type == AssetType.Clothing); | ||
2762 | |||
2763 | |||
2764 | //m_log.Debug("sending asset " + req.RequestAssetID + ", iswearable: " + isWearable); | ||
2765 | |||
2766 | |||
2767 | //if (isWearable) | ||
2768 | // m_log.Debug((AssetType)req.AssetInf.Type); | ||
2769 | |||
2721 | TransferInfoPacket Transfer = new TransferInfoPacket(); | 2770 | TransferInfoPacket Transfer = new TransferInfoPacket(); |
2722 | Transfer.TransferInfo.ChannelType = 2; | 2771 | Transfer.TransferInfo.ChannelType = 2; |
2723 | Transfer.TransferInfo.Status = 0; | 2772 | Transfer.TransferInfo.Status = 0; |
@@ -2739,7 +2788,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2739 | Transfer.TransferInfo.Size = req.AssetInf.Data.Length; | 2788 | Transfer.TransferInfo.Size = req.AssetInf.Data.Length; |
2740 | Transfer.TransferInfo.TransferID = req.TransferRequestID; | 2789 | Transfer.TransferInfo.TransferID = req.TransferRequestID; |
2741 | Transfer.Header.Zerocoded = true; | 2790 | Transfer.Header.Zerocoded = true; |
2742 | OutPacket(Transfer, ThrottleOutPacketType.Asset); | 2791 | OutPacket(Transfer, isWearable ? ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority : ThrottleOutPacketType.Asset); |
2743 | 2792 | ||
2744 | if (req.NumPackets == 1) | 2793 | if (req.NumPackets == 1) |
2745 | { | 2794 | { |
@@ -2750,12 +2799,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2750 | TransferPacket.TransferData.Data = req.AssetInf.Data; | 2799 | TransferPacket.TransferData.Data = req.AssetInf.Data; |
2751 | TransferPacket.TransferData.Status = 1; | 2800 | TransferPacket.TransferData.Status = 1; |
2752 | TransferPacket.Header.Zerocoded = true; | 2801 | TransferPacket.Header.Zerocoded = true; |
2753 | OutPacket(TransferPacket, ThrottleOutPacketType.Asset); | 2802 | OutPacket(TransferPacket, isWearable ? ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority : ThrottleOutPacketType.Asset); |
2754 | } | 2803 | } |
2755 | else | 2804 | else |
2756 | { | 2805 | { |
2757 | int processedLength = 0; | 2806 | int processedLength = 0; |
2758 | int maxChunkSize = Settings.MAX_PACKET_SIZE - 100; | 2807 | // int maxChunkSize = Settings.MAX_PACKET_SIZE - 100; |
2808 | |||
2809 | int maxChunkSize = (int) MaxTransferBytesPerPacket; | ||
2759 | int packetNumber = 0; | 2810 | int packetNumber = 0; |
2760 | 2811 | ||
2761 | while (processedLength < req.AssetInf.Data.Length) | 2812 | while (processedLength < req.AssetInf.Data.Length) |
@@ -2781,7 +2832,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2781 | TransferPacket.TransferData.Status = 1; | 2832 | TransferPacket.TransferData.Status = 1; |
2782 | } | 2833 | } |
2783 | TransferPacket.Header.Zerocoded = true; | 2834 | TransferPacket.Header.Zerocoded = true; |
2784 | OutPacket(TransferPacket, ThrottleOutPacketType.Asset); | 2835 | OutPacket(TransferPacket, isWearable ? ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority : ThrottleOutPacketType.Asset); |
2785 | 2836 | ||
2786 | processedLength += chunkSize; | 2837 | processedLength += chunkSize; |
2787 | packetNumber++; | 2838 | packetNumber++; |
@@ -2826,7 +2877,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2826 | reply.Data.ParcelID = parcelID; | 2877 | reply.Data.ParcelID = parcelID; |
2827 | reply.Data.OwnerID = land.OwnerID; | 2878 | reply.Data.OwnerID = land.OwnerID; |
2828 | reply.Data.Name = Utils.StringToBytes(land.Name); | 2879 | reply.Data.Name = Utils.StringToBytes(land.Name); |
2829 | reply.Data.Desc = Utils.StringToBytes(land.Description); | 2880 | if (land != null && land.Description != null && land.Description != String.Empty) |
2881 | reply.Data.Desc = Utils.StringToBytes(land.Description.Substring(0, land.Description.Length > 254 ? 254: land.Description.Length)); | ||
2882 | else | ||
2883 | reply.Data.Desc = new Byte[0]; | ||
2830 | reply.Data.ActualArea = land.Area; | 2884 | reply.Data.ActualArea = land.Area; |
2831 | reply.Data.BillableArea = land.Area; // TODO: what is this? | 2885 | reply.Data.BillableArea = land.Area; // TODO: what is this? |
2832 | 2886 | ||
@@ -3533,24 +3587,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3533 | aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[count]; | 3587 | aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[count]; |
3534 | AgentWearablesUpdatePacket.WearableDataBlock awb; | 3588 | AgentWearablesUpdatePacket.WearableDataBlock awb; |
3535 | int idx = 0; | 3589 | int idx = 0; |
3536 | for (int i = 0; i < wearables.Length; i++) | 3590 | |
3537 | { | 3591 | for (int i = 0; i < wearables.Length; i++) |
3538 | for (int j = 0; j < wearables[i].Count; j++) | 3592 | { |
3539 | { | 3593 | for (int j = 0; j < wearables[i].Count; j++) |
3540 | awb = new AgentWearablesUpdatePacket.WearableDataBlock(); | 3594 | { |
3541 | awb.WearableType = (byte)i; | 3595 | awb = new AgentWearablesUpdatePacket.WearableDataBlock(); |
3542 | awb.AssetID = wearables[i][j].AssetID; | 3596 | awb.WearableType = (byte) i; |
3543 | awb.ItemID = wearables[i][j].ItemID; | 3597 | awb.AssetID = wearables[i][j].AssetID; |
3544 | aw.WearableData[idx] = awb; | 3598 | awb.ItemID = wearables[i][j].ItemID; |
3545 | idx++; | 3599 | aw.WearableData[idx] = awb; |
3546 | 3600 | idx++; | |
3547 | // m_log.DebugFormat( | 3601 | |
3548 | // "[APPEARANCE]: Sending wearable item/asset {0} {1} (index {2}) for {3}", | 3602 | // m_log.DebugFormat( |
3549 | // awb.ItemID, awb.AssetID, i, Name); | 3603 | // "[APPEARANCE]: Sending wearable item/asset {0} {1} (index {2}) for {3}", |
3550 | } | 3604 | // awb.ItemID, awb.AssetID, i, Name); |
3551 | } | 3605 | } |
3606 | } | ||
3552 | 3607 | ||
3553 | OutPacket(aw, ThrottleOutPacketType.Task); | 3608 | OutPacket(aw, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority); |
3554 | } | 3609 | } |
3555 | 3610 | ||
3556 | public void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry) | 3611 | public void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry) |
@@ -3561,7 +3616,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3561 | 3616 | ||
3562 | AvatarAppearancePacket avp = (AvatarAppearancePacket)PacketPool.Instance.GetPacket(PacketType.AvatarAppearance); | 3617 | AvatarAppearancePacket avp = (AvatarAppearancePacket)PacketPool.Instance.GetPacket(PacketType.AvatarAppearance); |
3563 | // TODO: don't create new blocks if recycling an old packet | 3618 | // TODO: don't create new blocks if recycling an old packet |
3564 | avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218]; | 3619 | avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[visualParams.Length]; |
3565 | avp.ObjectData.TextureEntry = textureEntry; | 3620 | avp.ObjectData.TextureEntry = textureEntry; |
3566 | 3621 | ||
3567 | AvatarAppearancePacket.VisualParamBlock avblock = null; | 3622 | AvatarAppearancePacket.VisualParamBlock avblock = null; |
@@ -3692,7 +3747,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3692 | /// </summary> | 3747 | /// </summary> |
3693 | public void SendEntityUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) | 3748 | public void SendEntityUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) |
3694 | { | 3749 | { |
3695 | //double priority = m_prioritizer.GetUpdatePriority(this, entity); | 3750 | if (entity is SceneObjectPart) |
3751 | { | ||
3752 | SceneObjectPart e = (SceneObjectPart)entity; | ||
3753 | SceneObjectGroup g = e.ParentGroup; | ||
3754 | if (g.RootPart.Shape.State > 30) // HUD | ||
3755 | if (g.OwnerID != AgentId) | ||
3756 | return; // Don't send updates for other people's HUDs | ||
3757 | } | ||
3758 | |||
3696 | uint priority = m_prioritizer.GetUpdatePriority(this, entity); | 3759 | uint priority = m_prioritizer.GetUpdatePriority(this, entity); |
3697 | 3760 | ||
3698 | lock (m_entityUpdates.SyncRoot) | 3761 | lock (m_entityUpdates.SyncRoot) |
@@ -3759,27 +3822,74 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3759 | 3822 | ||
3760 | // We must lock for both manipulating the kill record and sending the packet, in order to avoid a race | 3823 | // We must lock for both manipulating the kill record and sending the packet, in order to avoid a race |
3761 | // condition where a kill can be processed before an out-of-date update for the same object. | 3824 | // condition where a kill can be processed before an out-of-date update for the same object. |
3762 | lock (m_killRecord) | 3825 | float avgTimeDilation = 1.0f; |
3826 | IEntityUpdate iupdate; | ||
3827 | Int32 timeinqueue; // this is just debugging code & can be dropped later | ||
3828 | |||
3829 | while (updatesThisCall < maxUpdates) | ||
3763 | { | 3830 | { |
3764 | float avgTimeDilation = 1.0f; | 3831 | lock (m_entityUpdates.SyncRoot) |
3765 | IEntityUpdate iupdate; | 3832 | if (!m_entityUpdates.TryDequeue(out iupdate, out timeinqueue)) |
3766 | Int32 timeinqueue; // this is just debugging code & can be dropped later | 3833 | break; |
3834 | |||
3835 | EntityUpdate update = (EntityUpdate)iupdate; | ||
3836 | |||
3837 | avgTimeDilation += update.TimeDilation; | ||
3838 | avgTimeDilation *= 0.5f; | ||
3767 | 3839 | ||
3768 | while (updatesThisCall < maxUpdates) | 3840 | if (update.Entity is SceneObjectPart) |
3769 | { | 3841 | { |
3770 | lock (m_entityUpdates.SyncRoot) | 3842 | SceneObjectPart part = (SceneObjectPart)update.Entity; |
3771 | if (!m_entityUpdates.TryDequeue(out iupdate, out timeinqueue)) | ||
3772 | break; | ||
3773 | 3843 | ||
3774 | EntityUpdate update = (EntityUpdate)iupdate; | 3844 | if (part.ParentGroup.IsDeleted) |
3775 | 3845 | continue; | |
3776 | avgTimeDilation += update.TimeDilation; | ||
3777 | avgTimeDilation *= 0.5f; | ||
3778 | 3846 | ||
3779 | if (update.Entity is SceneObjectPart) | 3847 | if (part.ParentGroup.IsAttachment) |
3848 | { // Someone else's HUD, why are we getting these? | ||
3849 | if (part.ParentGroup.OwnerID != AgentId && | ||
3850 | part.ParentGroup.RootPart.Shape.State > 30) | ||
3851 | continue; | ||
3852 | ScenePresence sp; | ||
3853 | // Owner is not in the sim, don't update it to | ||
3854 | // anyone | ||
3855 | if (!m_scene.TryGetScenePresence(part.OwnerID, out sp)) | ||
3856 | continue; | ||
3857 | |||
3858 | List<SceneObjectGroup> atts = sp.GetAttachments(); | ||
3859 | bool found = false; | ||
3860 | foreach (SceneObjectGroup att in atts) | ||
3861 | { | ||
3862 | if (att == part.ParentGroup) | ||
3863 | { | ||
3864 | found = true; | ||
3865 | break; | ||
3866 | } | ||
3867 | } | ||
3868 | |||
3869 | // It's an attachment of a valid avatar, but | ||
3870 | // doesn't seem to be attached, skip | ||
3871 | if (!found) | ||
3872 | continue; | ||
3873 | |||
3874 | // On vehicle crossing, the attachments are received | ||
3875 | // while the avatar is still a child. Don't send | ||
3876 | // updates here because the LocalId has not yet | ||
3877 | // been updated and the viewer will derender the | ||
3878 | // attachments until the avatar becomes root. | ||
3879 | if (sp.IsChildAgent) | ||
3880 | continue; | ||
3881 | |||
3882 | // If the object is an attachment we don't want it to be in the kill | ||
3883 | // record. Else attaching from inworld and subsequently dropping | ||
3884 | // it will no longer work. | ||
3885 | // lock (m_killRecord) | ||
3886 | // { | ||
3887 | // m_killRecord.Remove(part.LocalId); | ||
3888 | // m_killRecord.Remove(part.ParentGroup.RootPart.LocalId); | ||
3889 | // } | ||
3890 | } | ||
3891 | else | ||
3780 | { | 3892 | { |
3781 | SceneObjectPart part = (SceneObjectPart)update.Entity; | ||
3782 | |||
3783 | // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client | 3893 | // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client |
3784 | // will never receive an update after a prim kill. Even then, keeping the kill record may be a good | 3894 | // will never receive an update after a prim kill. Even then, keeping the kill record may be a good |
3785 | // safety measure. | 3895 | // safety measure. |
@@ -3790,21 +3900,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3790 | // | 3900 | // |
3791 | // This doesn't appear to apply to child prims - a client will happily ignore these updates | 3901 | // This doesn't appear to apply to child prims - a client will happily ignore these updates |
3792 | // after the root prim has been deleted. | 3902 | // after the root prim has been deleted. |
3793 | if (m_killRecord.Contains(part.LocalId)) | 3903 | // |
3794 | { | 3904 | // We ignore this for attachments because attaching something from inworld breaks unless we do. |
3795 | // m_log.WarnFormat( | 3905 | // lock (m_killRecord) |
3796 | // "[CLIENT]: Preventing update for prim with local id {0} after client for user {1} told it was deleted", | 3906 | // { |
3797 | // part.LocalId, Name); | 3907 | // if (m_killRecord.Contains(part.LocalId)) |
3798 | continue; | 3908 | // continue; |
3799 | } | 3909 | // if (m_killRecord.Contains(part.ParentGroup.RootPart.LocalId)) |
3800 | 3910 | // continue; | |
3801 | if (part.ParentGroup.IsAttachment && m_disableFacelights) | 3911 | // } |
3912 | } | ||
3913 | |||
3914 | if (part.ParentGroup.IsAttachment && m_disableFacelights) | ||
3915 | { | ||
3916 | if (part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.LeftHand && | ||
3917 | part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.RightHand) | ||
3802 | { | 3918 | { |
3803 | if (part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.LeftHand && | 3919 | part.Shape.LightEntry = false; |
3804 | part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.RightHand) | ||
3805 | { | ||
3806 | part.Shape.LightEntry = false; | ||
3807 | } | ||
3808 | } | 3920 | } |
3809 | 3921 | ||
3810 | if (part.Shape != null && (part.Shape.SculptType == (byte)SculptType.Mesh)) | 3922 | if (part.Shape != null && (part.Shape.SculptType == (byte)SculptType.Mesh)) |
@@ -3815,224 +3927,178 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3815 | part.Shape.ProfileHollow = 27500; | 3927 | part.Shape.ProfileHollow = 27500; |
3816 | } | 3928 | } |
3817 | } | 3929 | } |
3818 | 3930 | ||
3819 | #region UpdateFlags to packet type conversion | 3931 | if (part.Shape != null && (part.Shape.SculptType == (byte)SculptType.Mesh)) |
3820 | |||
3821 | PrimUpdateFlags updateFlags = (PrimUpdateFlags)update.Flags; | ||
3822 | |||
3823 | bool canUseCompressed = true; | ||
3824 | bool canUseImproved = true; | ||
3825 | |||
3826 | // Compressed object updates only make sense for LL primitives | ||
3827 | if (!(update.Entity is SceneObjectPart)) | ||
3828 | { | 3932 | { |
3829 | canUseCompressed = false; | 3933 | // Ensure that mesh has at least 8 valid faces |
3934 | part.Shape.ProfileBegin = 12500; | ||
3935 | part.Shape.ProfileEnd = 0; | ||
3936 | part.Shape.ProfileHollow = 27500; | ||
3830 | } | 3937 | } |
3831 | 3938 | } | |
3832 | if (updateFlags.HasFlag(PrimUpdateFlags.FullUpdate)) | 3939 | else if (update.Entity is ScenePresence) |
3940 | { | ||
3941 | ScenePresence presence = (ScenePresence)update.Entity; | ||
3942 | |||
3943 | // If ParentUUID is not UUID.Zero and ParentID is 0, this | ||
3944 | // avatar is in the process of crossing regions while | ||
3945 | // sat on an object. In this state, we don't want any | ||
3946 | // updates because they will visually orbit the avatar. | ||
3947 | // Update will be forced once crossing is completed anyway. | ||
3948 | if (presence.ParentUUID != UUID.Zero && presence.ParentID == 0) | ||
3949 | continue; | ||
3950 | } | ||
3951 | |||
3952 | ++updatesThisCall; | ||
3953 | |||
3954 | #region UpdateFlags to packet type conversion | ||
3955 | |||
3956 | PrimUpdateFlags updateFlags = (PrimUpdateFlags)update.Flags; | ||
3957 | |||
3958 | bool canUseCompressed = true; | ||
3959 | bool canUseImproved = true; | ||
3960 | |||
3961 | // Compressed object updates only make sense for LL primitives | ||
3962 | if (!(update.Entity is SceneObjectPart)) | ||
3963 | { | ||
3964 | canUseCompressed = false; | ||
3965 | } | ||
3966 | |||
3967 | if (updateFlags.HasFlag(PrimUpdateFlags.FullUpdate)) | ||
3968 | { | ||
3969 | canUseCompressed = false; | ||
3970 | canUseImproved = false; | ||
3971 | } | ||
3972 | else | ||
3973 | { | ||
3974 | if (updateFlags.HasFlag(PrimUpdateFlags.Velocity) || | ||
3975 | updateFlags.HasFlag(PrimUpdateFlags.Acceleration) || | ||
3976 | updateFlags.HasFlag(PrimUpdateFlags.CollisionPlane) || | ||
3977 | updateFlags.HasFlag(PrimUpdateFlags.Joint)) | ||
3833 | { | 3978 | { |
3834 | canUseCompressed = false; | 3979 | canUseCompressed = false; |
3835 | canUseImproved = false; | ||
3836 | } | 3980 | } |
3837 | else | 3981 | |
3982 | if (updateFlags.HasFlag(PrimUpdateFlags.PrimFlags) || | ||
3983 | updateFlags.HasFlag(PrimUpdateFlags.ParentID) || | ||
3984 | updateFlags.HasFlag(PrimUpdateFlags.Scale) || | ||
3985 | updateFlags.HasFlag(PrimUpdateFlags.PrimData) || | ||
3986 | updateFlags.HasFlag(PrimUpdateFlags.Text) || | ||
3987 | updateFlags.HasFlag(PrimUpdateFlags.NameValue) || | ||
3988 | updateFlags.HasFlag(PrimUpdateFlags.ExtraData) || | ||
3989 | updateFlags.HasFlag(PrimUpdateFlags.TextureAnim) || | ||
3990 | updateFlags.HasFlag(PrimUpdateFlags.Sound) || | ||
3991 | updateFlags.HasFlag(PrimUpdateFlags.Particles) || | ||
3992 | updateFlags.HasFlag(PrimUpdateFlags.Material) || | ||
3993 | updateFlags.HasFlag(PrimUpdateFlags.ClickAction) || | ||
3994 | updateFlags.HasFlag(PrimUpdateFlags.MediaURL) || | ||
3995 | updateFlags.HasFlag(PrimUpdateFlags.Joint)) | ||
3838 | { | 3996 | { |
3839 | if (updateFlags.HasFlag(PrimUpdateFlags.Velocity) || | 3997 | canUseImproved = false; |
3840 | updateFlags.HasFlag(PrimUpdateFlags.Acceleration) || | ||
3841 | updateFlags.HasFlag(PrimUpdateFlags.CollisionPlane) || | ||
3842 | updateFlags.HasFlag(PrimUpdateFlags.Joint)) | ||
3843 | { | ||
3844 | canUseCompressed = false; | ||
3845 | } | ||
3846 | |||
3847 | if (updateFlags.HasFlag(PrimUpdateFlags.PrimFlags) || | ||
3848 | updateFlags.HasFlag(PrimUpdateFlags.ParentID) || | ||
3849 | updateFlags.HasFlag(PrimUpdateFlags.Scale) || | ||
3850 | updateFlags.HasFlag(PrimUpdateFlags.PrimData) || | ||
3851 | updateFlags.HasFlag(PrimUpdateFlags.Text) || | ||
3852 | updateFlags.HasFlag(PrimUpdateFlags.NameValue) || | ||
3853 | updateFlags.HasFlag(PrimUpdateFlags.ExtraData) || | ||
3854 | updateFlags.HasFlag(PrimUpdateFlags.TextureAnim) || | ||
3855 | updateFlags.HasFlag(PrimUpdateFlags.Sound) || | ||
3856 | updateFlags.HasFlag(PrimUpdateFlags.Particles) || | ||
3857 | updateFlags.HasFlag(PrimUpdateFlags.Material) || | ||
3858 | updateFlags.HasFlag(PrimUpdateFlags.ClickAction) || | ||
3859 | updateFlags.HasFlag(PrimUpdateFlags.MediaURL) || | ||
3860 | updateFlags.HasFlag(PrimUpdateFlags.Joint)) | ||
3861 | { | ||
3862 | canUseImproved = false; | ||
3863 | } | ||
3864 | } | 3998 | } |
3999 | } | ||
3865 | 4000 | ||
3866 | #endregion UpdateFlags to packet type conversion | 4001 | #endregion UpdateFlags to packet type conversion |
3867 | |||
3868 | #region Block Construction | ||
3869 | |||
3870 | // TODO: Remove this once we can build compressed updates | ||
3871 | canUseCompressed = false; | ||
3872 | |||
3873 | if (!canUseImproved && !canUseCompressed) | ||
3874 | { | ||
3875 | ObjectUpdatePacket.ObjectDataBlock updateBlock; | ||
3876 | 4002 | ||
3877 | if (update.Entity is ScenePresence) | 4003 | #region Block Construction |
3878 | { | ||
3879 | updateBlock = CreateAvatarUpdateBlock((ScenePresence)update.Entity); | ||
3880 | } | ||
3881 | else | ||
3882 | { | ||
3883 | SceneObjectPart part = (SceneObjectPart)update.Entity; | ||
3884 | updateBlock = CreatePrimUpdateBlock(part, AgentId); | ||
3885 | |||
3886 | // If the part has become a private hud since the update was scheduled then we do not | ||
3887 | // want to send it to other avatars. | ||
3888 | if (part.ParentGroup.IsAttachment | ||
3889 | && part.ParentGroup.HasPrivateAttachmentPoint | ||
3890 | && part.ParentGroup.AttachedAvatar != AgentId) | ||
3891 | continue; | ||
3892 | |||
3893 | // If the part has since been deleted, then drop the update. In the case of attachments, | ||
3894 | // this is to avoid spurious updates to other viewers since post-processing of attachments | ||
3895 | // has to change the IsAttachment flag for various reasons (which will end up in a pass | ||
3896 | // of the test above). | ||
3897 | // | ||
3898 | // Actual deletions (kills) happen in another method. | ||
3899 | if (part.ParentGroup.IsDeleted) | ||
3900 | continue; | ||
3901 | } | ||
3902 | 4004 | ||
3903 | objectUpdateBlocks.Value.Add(updateBlock); | 4005 | // TODO: Remove this once we can build compressed updates |
3904 | objectUpdates.Value.Add(update); | 4006 | canUseCompressed = false; |
3905 | } | ||
3906 | else if (!canUseImproved) | ||
3907 | { | ||
3908 | SceneObjectPart part = (SceneObjectPart)update.Entity; | ||
3909 | ObjectUpdateCompressedPacket.ObjectDataBlock compressedBlock | ||
3910 | = CreateCompressedUpdateBlock(part, updateFlags); | ||
3911 | |||
3912 | // If the part has since been deleted, then drop the update. In the case of attachments, | ||
3913 | // this is to avoid spurious updates to other viewers since post-processing of attachments | ||
3914 | // has to change the IsAttachment flag for various reasons (which will end up in a pass | ||
3915 | // of the test above). | ||
3916 | // | ||
3917 | // Actual deletions (kills) happen in another method. | ||
3918 | if (part.ParentGroup.IsDeleted) | ||
3919 | continue; | ||
3920 | 4007 | ||
3921 | compressedUpdateBlocks.Value.Add(compressedBlock); | 4008 | if (!canUseImproved && !canUseCompressed) |
3922 | compressedUpdates.Value.Add(update); | 4009 | { |
4010 | if (update.Entity is ScenePresence) | ||
4011 | { | ||
4012 | objectUpdateBlocks.Value.Add(CreateAvatarUpdateBlock((ScenePresence)update.Entity)); | ||
3923 | } | 4013 | } |
3924 | else | 4014 | else |
3925 | { | 4015 | { |
3926 | if (update.Entity is ScenePresence && ((ScenePresence)update.Entity).UUID == AgentId) | 4016 | objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId)); |
3927 | { | ||
3928 | // Self updates go into a special list | ||
3929 | terseAgentUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures))); | ||
3930 | terseAgentUpdates.Value.Add(update); | ||
3931 | } | ||
3932 | else | ||
3933 | { | ||
3934 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseUpdateBlock | ||
3935 | = CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)); | ||
3936 | |||
3937 | // Everything else goes here | ||
3938 | if (update.Entity is SceneObjectPart) | ||
3939 | { | ||
3940 | SceneObjectPart part = (SceneObjectPart)update.Entity; | ||
3941 | |||
3942 | // If the part has become a private hud since the update was scheduled then we do not | ||
3943 | // want to send it to other avatars. | ||
3944 | if (part.ParentGroup.IsAttachment | ||
3945 | && part.ParentGroup.HasPrivateAttachmentPoint | ||
3946 | && part.ParentGroup.AttachedAvatar != AgentId) | ||
3947 | continue; | ||
3948 | |||
3949 | // If the part has since been deleted, then drop the update. In the case of attachments, | ||
3950 | // this is to avoid spurious updates to other viewers since post-processing of attachments | ||
3951 | // has to change the IsAttachment flag for various reasons (which will end up in a pass | ||
3952 | // of the test above). | ||
3953 | // | ||
3954 | // Actual deletions (kills) happen in another method. | ||
3955 | if (part.ParentGroup.IsDeleted) | ||
3956 | continue; | ||
3957 | } | ||
3958 | |||
3959 | terseUpdateBlocks.Value.Add(terseUpdateBlock); | ||
3960 | terseUpdates.Value.Add(update); | ||
3961 | } | ||
3962 | } | 4017 | } |
3963 | |||
3964 | ++updatesThisCall; | ||
3965 | |||
3966 | #endregion Block Construction | ||
3967 | } | 4018 | } |
3968 | 4019 | else if (!canUseImproved) | |
3969 | #region Packet Sending | ||
3970 | ushort timeDilation = Utils.FloatToUInt16(avgTimeDilation, 0.0f, 1.0f); | ||
3971 | |||
3972 | if (terseAgentUpdateBlocks.IsValueCreated) | ||
3973 | { | 4020 | { |
3974 | List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> blocks = terseAgentUpdateBlocks.Value; | 4021 | compressedUpdateBlocks.Value.Add(CreateCompressedUpdateBlock((SceneObjectPart)update.Entity, updateFlags)); |
4022 | } | ||
4023 | else | ||
4024 | { | ||
4025 | if (update.Entity is ScenePresence && ((ScenePresence)update.Entity).UUID == AgentId) | ||
4026 | // Self updates go into a special list | ||
4027 | terseAgentUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures))); | ||
4028 | else | ||
4029 | // Everything else goes here | ||
4030 | terseUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures))); | ||
4031 | } | ||
3975 | 4032 | ||
3976 | ImprovedTerseObjectUpdatePacket packet | 4033 | #endregion Block Construction |
3977 | = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate); | 4034 | } |
3978 | 4035 | ||
3979 | packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; | 4036 | #region Packet Sending |
3980 | packet.RegionData.TimeDilation = timeDilation; | 4037 | |
3981 | packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count]; | 4038 | const float TIME_DILATION = 1.0f; |
4039 | ushort timeDilation = Utils.FloatToUInt16(avgTimeDilation, 0.0f, 1.0f); | ||
4040 | |||
4041 | if (terseAgentUpdateBlocks.IsValueCreated) | ||
4042 | { | ||
4043 | List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> blocks = terseAgentUpdateBlocks.Value; | ||
3982 | 4044 | ||
3983 | for (int i = 0; i < blocks.Count; i++) | 4045 | ImprovedTerseObjectUpdatePacket packet |
3984 | packet.ObjectData[i] = blocks[i]; | 4046 | = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate); |
3985 | // If any of the packets created from this call go unacknowledged, all of the updates will be resent | 4047 | packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; |
3986 | OutPacket(packet, ThrottleOutPacketType.Unknown, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseAgentUpdates.Value, oPacket); }); | 4048 | packet.RegionData.TimeDilation = timeDilation; |
3987 | } | 4049 | packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count]; |
3988 | 4050 | ||
3989 | if (objectUpdateBlocks.IsValueCreated) | 4051 | for (int i = 0; i < blocks.Count; i++) |
3990 | { | 4052 | packet.ObjectData[i] = blocks[i]; |
3991 | List<ObjectUpdatePacket.ObjectDataBlock> blocks = objectUpdateBlocks.Value; | ||
3992 | |||
3993 | ObjectUpdatePacket packet = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate); | ||
3994 | packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; | ||
3995 | packet.RegionData.TimeDilation = timeDilation; | ||
3996 | packet.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[blocks.Count]; | ||
3997 | |||
3998 | for (int i = 0; i < blocks.Count; i++) | ||
3999 | packet.ObjectData[i] = blocks[i]; | ||
4000 | // If any of the packets created from this call go unacknowledged, all of the updates will be resent | ||
4001 | OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(objectUpdates.Value, oPacket); }); | ||
4002 | } | ||
4003 | |||
4004 | if (compressedUpdateBlocks.IsValueCreated) | ||
4005 | { | ||
4006 | List<ObjectUpdateCompressedPacket.ObjectDataBlock> blocks = compressedUpdateBlocks.Value; | ||
4007 | |||
4008 | ObjectUpdateCompressedPacket packet = (ObjectUpdateCompressedPacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdateCompressed); | ||
4009 | packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; | ||
4010 | packet.RegionData.TimeDilation = timeDilation; | ||
4011 | packet.ObjectData = new ObjectUpdateCompressedPacket.ObjectDataBlock[blocks.Count]; | ||
4012 | |||
4013 | for (int i = 0; i < blocks.Count; i++) | ||
4014 | packet.ObjectData[i] = blocks[i]; | ||
4015 | // If any of the packets created from this call go unacknowledged, all of the updates will be resent | ||
4016 | OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(compressedUpdates.Value, oPacket); }); | ||
4017 | } | ||
4018 | 4053 | ||
4019 | if (terseUpdateBlocks.IsValueCreated) | 4054 | OutPacket(packet, ThrottleOutPacketType.Unknown, true); |
4020 | { | 4055 | } |
4021 | List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> blocks = terseUpdateBlocks.Value; | ||
4022 | |||
4023 | ImprovedTerseObjectUpdatePacket packet | ||
4024 | = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket( | ||
4025 | PacketType.ImprovedTerseObjectUpdate); | ||
4026 | 4056 | ||
4027 | packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; | 4057 | if (objectUpdateBlocks.IsValueCreated) |
4028 | packet.RegionData.TimeDilation = timeDilation; | 4058 | { |
4029 | packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count]; | 4059 | List<ObjectUpdatePacket.ObjectDataBlock> blocks = objectUpdateBlocks.Value; |
4030 | 4060 | ||
4031 | for (int i = 0; i < blocks.Count; i++) | 4061 | ObjectUpdatePacket packet = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate); |
4032 | packet.ObjectData[i] = blocks[i]; | 4062 | packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; |
4033 | // If any of the packets created from this call go unacknowledged, all of the updates will be resent | 4063 | packet.RegionData.TimeDilation = timeDilation; |
4034 | OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); | 4064 | packet.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[blocks.Count]; |
4035 | } | 4065 | |
4066 | for (int i = 0; i < blocks.Count; i++) | ||
4067 | packet.ObjectData[i] = blocks[i]; | ||
4068 | |||
4069 | OutPacket(packet, ThrottleOutPacketType.Task, true); | ||
4070 | } | ||
4071 | |||
4072 | if (compressedUpdateBlocks.IsValueCreated) | ||
4073 | { | ||
4074 | List<ObjectUpdateCompressedPacket.ObjectDataBlock> blocks = compressedUpdateBlocks.Value; | ||
4075 | |||
4076 | ObjectUpdateCompressedPacket packet = (ObjectUpdateCompressedPacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdateCompressed); | ||
4077 | packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; | ||
4078 | packet.RegionData.TimeDilation = timeDilation; | ||
4079 | packet.ObjectData = new ObjectUpdateCompressedPacket.ObjectDataBlock[blocks.Count]; | ||
4080 | |||
4081 | for (int i = 0; i < blocks.Count; i++) | ||
4082 | packet.ObjectData[i] = blocks[i]; | ||
4083 | |||
4084 | OutPacket(packet, ThrottleOutPacketType.Task, true); | ||
4085 | } | ||
4086 | |||
4087 | if (terseUpdateBlocks.IsValueCreated) | ||
4088 | { | ||
4089 | List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> blocks = terseUpdateBlocks.Value; | ||
4090 | |||
4091 | ImprovedTerseObjectUpdatePacket packet | ||
4092 | = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket( | ||
4093 | PacketType.ImprovedTerseObjectUpdate); | ||
4094 | packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; | ||
4095 | packet.RegionData.TimeDilation = timeDilation; | ||
4096 | packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count]; | ||
4097 | |||
4098 | for (int i = 0; i < blocks.Count; i++) | ||
4099 | packet.ObjectData[i] = blocks[i]; | ||
4100 | |||
4101 | OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); | ||
4036 | } | 4102 | } |
4037 | 4103 | ||
4038 | #endregion Packet Sending | 4104 | #endregion Packet Sending |
@@ -4325,11 +4391,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4325 | 4391 | ||
4326 | // Pass in the delegate so that if this packet needs to be resent, we send the current properties | 4392 | // Pass in the delegate so that if this packet needs to be resent, we send the current properties |
4327 | // of the object rather than the properties when the packet was created | 4393 | // of the object rather than the properties when the packet was created |
4328 | OutPacket(packet, ThrottleOutPacketType.Task, true, | 4394 | // HACK : Remove intelligent resending until it's fixed in core |
4329 | delegate(OutgoingPacket oPacket) | 4395 | //OutPacket(packet, ThrottleOutPacketType.Task, true, |
4330 | { | 4396 | // delegate(OutgoingPacket oPacket) |
4331 | ResendPropertyUpdates(updates, oPacket); | 4397 | // { |
4332 | }); | 4398 | // ResendPropertyUpdates(updates, oPacket); |
4399 | // }); | ||
4400 | OutPacket(packet, ThrottleOutPacketType.Task, true); | ||
4333 | 4401 | ||
4334 | // pbcnt += blocks.Count; | 4402 | // pbcnt += blocks.Count; |
4335 | // ppcnt++; | 4403 | // ppcnt++; |
@@ -4355,11 +4423,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4355 | // of the object rather than the properties when the packet was created | 4423 | // of the object rather than the properties when the packet was created |
4356 | List<ObjectPropertyUpdate> updates = new List<ObjectPropertyUpdate>(); | 4424 | List<ObjectPropertyUpdate> updates = new List<ObjectPropertyUpdate>(); |
4357 | updates.Add(familyUpdates.Value[i]); | 4425 | updates.Add(familyUpdates.Value[i]); |
4358 | OutPacket(packet, ThrottleOutPacketType.Task, true, | 4426 | // HACK : Remove intelligent resending until it's fixed in core |
4359 | delegate(OutgoingPacket oPacket) | 4427 | //OutPacket(packet, ThrottleOutPacketType.Task, true, |
4360 | { | 4428 | // delegate(OutgoingPacket oPacket) |
4361 | ResendPropertyUpdates(updates, oPacket); | 4429 | // { |
4362 | }); | 4430 | // ResendPropertyUpdates(updates, oPacket); |
4431 | // }); | ||
4432 | OutPacket(packet, ThrottleOutPacketType.Task, true); | ||
4363 | 4433 | ||
4364 | // fpcnt++; | 4434 | // fpcnt++; |
4365 | // fbcnt++; | 4435 | // fbcnt++; |
@@ -4731,7 +4801,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4731 | 4801 | ||
4732 | if (landData.SimwideArea > 0) | 4802 | if (landData.SimwideArea > 0) |
4733 | { | 4803 | { |
4734 | int simulatorCapacity = (int)(((float)landData.SimwideArea / 65536.0f) * (float)m_scene.RegionInfo.ObjectCapacity * (float)m_scene.RegionInfo.RegionSettings.ObjectBonus); | 4804 | int simulatorCapacity = (int)((long)landData.SimwideArea * (long)m_scene.RegionInfo.ObjectCapacity * (long)m_scene.RegionInfo.RegionSettings.ObjectBonus / 65536L); |
4805 | // Never report more than sim total capacity | ||
4806 | if (simulatorCapacity > m_scene.RegionInfo.ObjectCapacity) | ||
4807 | simulatorCapacity = m_scene.RegionInfo.ObjectCapacity; | ||
4735 | updateMessage.SimWideMaxPrims = simulatorCapacity; | 4808 | updateMessage.SimWideMaxPrims = simulatorCapacity; |
4736 | } | 4809 | } |
4737 | else | 4810 | else |
@@ -4860,14 +4933,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4860 | 4933 | ||
4861 | if (notifyCount > 0) | 4934 | if (notifyCount > 0) |
4862 | { | 4935 | { |
4863 | if (notifyCount > 32) | 4936 | // if (notifyCount > 32) |
4864 | { | 4937 | // { |
4865 | m_log.InfoFormat( | 4938 | // m_log.InfoFormat( |
4866 | "[LAND]: More than {0} avatars own prims on this parcel. Only sending back details of first {0}" | 4939 | // "[LAND]: More than {0} avatars own prims on this parcel. Only sending back details of first {0}" |
4867 | + " - a developer might want to investigate whether this is a hard limit", 32); | 4940 | // + " - a developer might want to investigate whether this is a hard limit", 32); |
4868 | 4941 | // | |
4869 | notifyCount = 32; | 4942 | // notifyCount = 32; |
4870 | } | 4943 | // } |
4871 | 4944 | ||
4872 | ParcelObjectOwnersReplyPacket.DataBlock[] dataBlock | 4945 | ParcelObjectOwnersReplyPacket.DataBlock[] dataBlock |
4873 | = new ParcelObjectOwnersReplyPacket.DataBlock[notifyCount]; | 4946 | = new ParcelObjectOwnersReplyPacket.DataBlock[notifyCount]; |
@@ -4922,9 +4995,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4922 | { | 4995 | { |
4923 | ScenePresence presence = (ScenePresence)entity; | 4996 | ScenePresence presence = (ScenePresence)entity; |
4924 | 4997 | ||
4998 | position = presence.OffsetPosition; | ||
4999 | rotation = presence.Rotation; | ||
5000 | |||
5001 | if (presence.ParentID != 0) | ||
5002 | { | ||
5003 | SceneObjectPart part = m_scene.GetSceneObjectPart(presence.ParentID); | ||
5004 | if (part != null && part != part.ParentGroup.RootPart) | ||
5005 | { | ||
5006 | position = part.OffsetPosition + presence.OffsetPosition * part.RotationOffset; | ||
5007 | rotation = part.RotationOffset * presence.Rotation; | ||
5008 | } | ||
5009 | angularVelocity = Vector3.Zero; | ||
5010 | } | ||
5011 | else | ||
5012 | { | ||
5013 | angularVelocity = presence.AngularVelocity; | ||
5014 | rotation = presence.Rotation; | ||
5015 | } | ||
5016 | |||
4925 | attachPoint = 0; | 5017 | attachPoint = 0; |
4926 | collisionPlane = presence.CollisionPlane; | 5018 | collisionPlane = presence.CollisionPlane; |
4927 | position = presence.OffsetPosition; | ||
4928 | velocity = presence.Velocity; | 5019 | velocity = presence.Velocity; |
4929 | acceleration = Vector3.Zero; | 5020 | acceleration = Vector3.Zero; |
4930 | 5021 | ||
@@ -4933,9 +5024,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4933 | // may improve movement smoothness. | 5024 | // may improve movement smoothness. |
4934 | // acceleration = new Vector3(1, 0, 0); | 5025 | // acceleration = new Vector3(1, 0, 0); |
4935 | 5026 | ||
4936 | angularVelocity = presence.AngularVelocity; | ||
4937 | rotation = presence.Rotation; | ||
4938 | |||
4939 | if (sendTexture) | 5027 | if (sendTexture) |
4940 | textureEntry = presence.Appearance.Texture.GetBytes(); | 5028 | textureEntry = presence.Appearance.Texture.GetBytes(); |
4941 | else | 5029 | else |
@@ -5041,13 +5129,32 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5041 | 5129 | ||
5042 | protected ObjectUpdatePacket.ObjectDataBlock CreateAvatarUpdateBlock(ScenePresence data) | 5130 | protected ObjectUpdatePacket.ObjectDataBlock CreateAvatarUpdateBlock(ScenePresence data) |
5043 | { | 5131 | { |
5132 | Vector3 offsetPosition = data.OffsetPosition; | ||
5133 | Quaternion rotation = data.Rotation; | ||
5134 | uint parentID = data.ParentID; | ||
5135 | |||
5136 | if (parentID != 0) | ||
5137 | { | ||
5138 | SceneObjectPart part = m_scene.GetSceneObjectPart(parentID); | ||
5139 | if (part != null && part != part.ParentGroup.RootPart) | ||
5140 | { | ||
5141 | offsetPosition = part.OffsetPosition + data.OffsetPosition * part.RotationOffset; | ||
5142 | rotation = part.RotationOffset * data.Rotation; | ||
5143 | parentID = part.ParentGroup.RootPart.LocalId; | ||
5144 | } | ||
5145 | } | ||
5146 | |||
5044 | byte[] objectData = new byte[76]; | 5147 | byte[] objectData = new byte[76]; |
5045 | 5148 | ||
5046 | data.CollisionPlane.ToBytes(objectData, 0); | 5149 | data.CollisionPlane.ToBytes(objectData, 0); |
5047 | data.OffsetPosition.ToBytes(objectData, 16); | 5150 | offsetPosition.ToBytes(objectData, 16); |
5151 | Vector3 velocity = new Vector3(0, 0, 0); | ||
5152 | Vector3 acceleration = new Vector3(0, 0, 0); | ||
5153 | velocity.ToBytes(objectData, 28); | ||
5154 | acceleration.ToBytes(objectData, 40); | ||
5048 | // data.Velocity.ToBytes(objectData, 28); | 5155 | // data.Velocity.ToBytes(objectData, 28); |
5049 | // data.Acceleration.ToBytes(objectData, 40); | 5156 | // data.Acceleration.ToBytes(objectData, 40); |
5050 | data.Rotation.ToBytes(objectData, 52); | 5157 | rotation.ToBytes(objectData, 52); |
5051 | //data.AngularVelocity.ToBytes(objectData, 64); | 5158 | //data.AngularVelocity.ToBytes(objectData, 64); |
5052 | 5159 | ||
5053 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); | 5160 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); |
@@ -5061,14 +5168,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5061 | update.NameValue = Utils.StringToBytes("FirstName STRING RW SV " + data.Firstname + "\nLastName STRING RW SV " + | 5168 | update.NameValue = Utils.StringToBytes("FirstName STRING RW SV " + data.Firstname + "\nLastName STRING RW SV " + |
5062 | data.Lastname + "\nTitle STRING RW SV " + data.Grouptitle); | 5169 | data.Lastname + "\nTitle STRING RW SV " + data.Grouptitle); |
5063 | update.ObjectData = objectData; | 5170 | update.ObjectData = objectData; |
5064 | update.ParentID = data.ParentID; | 5171 | update.ParentID = parentID; |
5065 | update.PathCurve = 16; | 5172 | update.PathCurve = 16; |
5066 | update.PathScaleX = 100; | 5173 | update.PathScaleX = 100; |
5067 | update.PathScaleY = 100; | 5174 | update.PathScaleY = 100; |
5068 | update.PCode = (byte)PCode.Avatar; | 5175 | update.PCode = (byte)PCode.Avatar; |
5069 | update.ProfileCurve = 1; | 5176 | update.ProfileCurve = 1; |
5070 | update.PSBlock = Utils.EmptyBytes; | 5177 | update.PSBlock = Utils.EmptyBytes; |
5071 | update.Scale = new Vector3(0.45f, 0.6f, 1.9f); | 5178 | update.Scale = data.Appearance.AvatarSize; |
5179 | // update.Scale.Z -= 0.2f; | ||
5180 | |||
5072 | update.Text = Utils.EmptyBytes; | 5181 | update.Text = Utils.EmptyBytes; |
5073 | update.TextColor = new byte[4]; | 5182 | update.TextColor = new byte[4]; |
5074 | 5183 | ||
@@ -5079,10 +5188,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5079 | update.TextureEntry = Utils.EmptyBytes; | 5188 | update.TextureEntry = Utils.EmptyBytes; |
5080 | // update.TextureEntry = (data.Appearance.Texture != null) ? data.Appearance.Texture.GetBytes() : Utils.EmptyBytes; | 5189 | // update.TextureEntry = (data.Appearance.Texture != null) ? data.Appearance.Texture.GetBytes() : Utils.EmptyBytes; |
5081 | 5190 | ||
5191 | /* all this flags seem related to prims and not avatars. This allow for wrong viewer side move of a avatar in prim edition mode (anv mantis 854) | ||
5082 | update.UpdateFlags = (uint)( | 5192 | update.UpdateFlags = (uint)( |
5083 | PrimFlags.Physics | PrimFlags.ObjectModify | PrimFlags.ObjectCopy | PrimFlags.ObjectAnyOwner | | 5193 | PrimFlags.Physics | PrimFlags.ObjectModify | PrimFlags.ObjectCopy | PrimFlags.ObjectAnyOwner | |
5084 | PrimFlags.ObjectYouOwner | PrimFlags.ObjectMove | PrimFlags.InventoryEmpty | PrimFlags.ObjectTransfer | | 5194 | PrimFlags.ObjectYouOwner | PrimFlags.ObjectMove | PrimFlags.InventoryEmpty | PrimFlags.ObjectTransfer | |
5085 | PrimFlags.ObjectOwnerModify); | 5195 | PrimFlags.ObjectOwnerModify); |
5196 | */ | ||
5197 | update.UpdateFlags = 0; | ||
5086 | 5198 | ||
5087 | return update; | 5199 | return update; |
5088 | } | 5200 | } |
@@ -5253,8 +5365,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5253 | // If AgentUpdate is ever handled asynchronously, then we will also need to construct a new AgentUpdateArgs | 5365 | // If AgentUpdate is ever handled asynchronously, then we will also need to construct a new AgentUpdateArgs |
5254 | // for each AgentUpdate packet. | 5366 | // for each AgentUpdate packet. |
5255 | AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate, false); | 5367 | AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate, false); |
5256 | 5368 | ||
5257 | AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect, false); | 5369 | AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect, false); |
5370 | AddLocalPacketHandler(PacketType.VelocityInterpolateOff, HandleVelocityInterpolateOff, false); | ||
5371 | AddLocalPacketHandler(PacketType.VelocityInterpolateOn, HandleVelocityInterpolateOn, false); | ||
5258 | AddLocalPacketHandler(PacketType.AgentCachedTexture, HandleAgentTextureCached, false); | 5372 | AddLocalPacketHandler(PacketType.AgentCachedTexture, HandleAgentTextureCached, false); |
5259 | AddLocalPacketHandler(PacketType.MultipleObjectUpdate, HandleMultipleObjUpdate, false); | 5373 | AddLocalPacketHandler(PacketType.MultipleObjectUpdate, HandleMultipleObjUpdate, false); |
5260 | AddLocalPacketHandler(PacketType.MoneyTransferRequest, HandleMoneyTransferRequest, false); | 5374 | AddLocalPacketHandler(PacketType.MoneyTransferRequest, HandleMoneyTransferRequest, false); |
@@ -5406,6 +5520,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5406 | AddLocalPacketHandler(PacketType.TransferAbort, HandleTransferAbort, false); | 5520 | AddLocalPacketHandler(PacketType.TransferAbort, HandleTransferAbort, false); |
5407 | AddLocalPacketHandler(PacketType.MuteListRequest, HandleMuteListRequest, false); | 5521 | AddLocalPacketHandler(PacketType.MuteListRequest, HandleMuteListRequest, false); |
5408 | AddLocalPacketHandler(PacketType.UseCircuitCode, HandleUseCircuitCode); | 5522 | AddLocalPacketHandler(PacketType.UseCircuitCode, HandleUseCircuitCode); |
5523 | AddLocalPacketHandler(PacketType.CreateNewOutfitAttachments, HandleCreateNewOutfitAttachments); | ||
5409 | AddLocalPacketHandler(PacketType.AgentHeightWidth, HandleAgentHeightWidth, false); | 5524 | AddLocalPacketHandler(PacketType.AgentHeightWidth, HandleAgentHeightWidth, false); |
5410 | AddLocalPacketHandler(PacketType.InventoryDescendents, HandleInventoryDescendents); | 5525 | AddLocalPacketHandler(PacketType.InventoryDescendents, HandleInventoryDescendents); |
5411 | AddLocalPacketHandler(PacketType.DirPlacesQuery, HandleDirPlacesQuery); | 5526 | AddLocalPacketHandler(PacketType.DirPlacesQuery, HandleDirPlacesQuery); |
@@ -5472,6 +5587,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5472 | AddLocalPacketHandler(PacketType.GroupVoteHistoryRequest, HandleGroupVoteHistoryRequest); | 5587 | AddLocalPacketHandler(PacketType.GroupVoteHistoryRequest, HandleGroupVoteHistoryRequest); |
5473 | AddLocalPacketHandler(PacketType.SimWideDeletes, HandleSimWideDeletes); | 5588 | AddLocalPacketHandler(PacketType.SimWideDeletes, HandleSimWideDeletes); |
5474 | AddLocalPacketHandler(PacketType.SendPostcard, HandleSendPostcard); | 5589 | AddLocalPacketHandler(PacketType.SendPostcard, HandleSendPostcard); |
5590 | AddLocalPacketHandler(PacketType.ChangeInventoryItemFlags, HandleChangeInventoryItemFlags); | ||
5475 | 5591 | ||
5476 | AddGenericPacketHandler("autopilot", HandleAutopilot); | 5592 | AddGenericPacketHandler("autopilot", HandleAutopilot); |
5477 | } | 5593 | } |
@@ -5510,6 +5626,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5510 | (x.CameraLeftAxis != m_lastAgentUpdateArgs.CameraLeftAxis) || | 5626 | (x.CameraLeftAxis != m_lastAgentUpdateArgs.CameraLeftAxis) || |
5511 | (x.CameraUpAxis != m_lastAgentUpdateArgs.CameraUpAxis) || | 5627 | (x.CameraUpAxis != m_lastAgentUpdateArgs.CameraUpAxis) || |
5512 | (x.ControlFlags != m_lastAgentUpdateArgs.ControlFlags) || | 5628 | (x.ControlFlags != m_lastAgentUpdateArgs.ControlFlags) || |
5629 | (x.ControlFlags != 0) || | ||
5513 | (x.Far != m_lastAgentUpdateArgs.Far) || | 5630 | (x.Far != m_lastAgentUpdateArgs.Far) || |
5514 | (x.Flags != m_lastAgentUpdateArgs.Flags) || | 5631 | (x.Flags != m_lastAgentUpdateArgs.Flags) || |
5515 | (x.State != m_lastAgentUpdateArgs.State) || | 5632 | (x.State != m_lastAgentUpdateArgs.State) || |
@@ -5769,6 +5886,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5769 | return true; | 5886 | return true; |
5770 | } | 5887 | } |
5771 | 5888 | ||
5889 | private bool HandleVelocityInterpolateOff(IClientAPI sender, Packet Pack) | ||
5890 | { | ||
5891 | VelocityInterpolateOffPacket p = (VelocityInterpolateOffPacket)Pack; | ||
5892 | if (p.AgentData.SessionID != SessionId || | ||
5893 | p.AgentData.AgentID != AgentId) | ||
5894 | return true; | ||
5895 | |||
5896 | m_VelocityInterpolate = false; | ||
5897 | return true; | ||
5898 | } | ||
5899 | |||
5900 | private bool HandleVelocityInterpolateOn(IClientAPI sender, Packet Pack) | ||
5901 | { | ||
5902 | VelocityInterpolateOnPacket p = (VelocityInterpolateOnPacket)Pack; | ||
5903 | if (p.AgentData.SessionID != SessionId || | ||
5904 | p.AgentData.AgentID != AgentId) | ||
5905 | return true; | ||
5906 | |||
5907 | m_VelocityInterpolate = true; | ||
5908 | return true; | ||
5909 | } | ||
5910 | |||
5911 | |||
5772 | private bool HandleAvatarPropertiesRequest(IClientAPI sender, Packet Pack) | 5912 | private bool HandleAvatarPropertiesRequest(IClientAPI sender, Packet Pack) |
5773 | { | 5913 | { |
5774 | AvatarPropertiesRequestPacket avatarProperties = (AvatarPropertiesRequestPacket)Pack; | 5914 | AvatarPropertiesRequestPacket avatarProperties = (AvatarPropertiesRequestPacket)Pack; |
@@ -6189,17 +6329,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6189 | // Temporarily protect ourselves from the mantis #951 failure. | 6329 | // Temporarily protect ourselves from the mantis #951 failure. |
6190 | // However, we could do this for several other handlers where a failure isn't terminal | 6330 | // However, we could do this for several other handlers where a failure isn't terminal |
6191 | // for the client session anyway, in order to protect ourselves against bad code in plugins | 6331 | // for the client session anyway, in order to protect ourselves against bad code in plugins |
6332 | Vector3 avSize = appear.AgentData.Size; | ||
6192 | try | 6333 | try |
6193 | { | 6334 | { |
6194 | byte[] visualparams = new byte[appear.VisualParam.Length]; | 6335 | byte[] visualparams = new byte[appear.VisualParam.Length]; |
6195 | for (int i = 0; i < appear.VisualParam.Length; i++) | 6336 | for (int i = 0; i < appear.VisualParam.Length; i++) |
6196 | visualparams[i] = appear.VisualParam[i].ParamValue; | 6337 | visualparams[i] = appear.VisualParam[i].ParamValue; |
6197 | 6338 | //var b = appear.WearableData[0]; | |
6339 | |||
6198 | Primitive.TextureEntry te = null; | 6340 | Primitive.TextureEntry te = null; |
6199 | if (appear.ObjectData.TextureEntry.Length > 1) | 6341 | if (appear.ObjectData.TextureEntry.Length > 1) |
6200 | te = new Primitive.TextureEntry(appear.ObjectData.TextureEntry, 0, appear.ObjectData.TextureEntry.Length); | 6342 | te = new Primitive.TextureEntry(appear.ObjectData.TextureEntry, 0, appear.ObjectData.TextureEntry.Length); |
6343 | |||
6344 | WearableCacheItem[] cacheitems = new WearableCacheItem[appear.WearableData.Length]; | ||
6345 | for (int i=0; i<appear.WearableData.Length;i++) | ||
6346 | cacheitems[i] = new WearableCacheItem(){CacheId = appear.WearableData[i].CacheID,TextureIndex=Convert.ToUInt32(appear.WearableData[i].TextureIndex)}; | ||
6347 | |||
6348 | |||
6201 | 6349 | ||
6202 | handlerSetAppearance(sender, te, visualparams); | 6350 | handlerSetAppearance(sender, te, visualparams,avSize, cacheitems); |
6203 | } | 6351 | } |
6204 | catch (Exception e) | 6352 | catch (Exception e) |
6205 | { | 6353 | { |
@@ -6408,6 +6556,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6408 | { | 6556 | { |
6409 | handlerCompleteMovementToRegion(sender, true); | 6557 | handlerCompleteMovementToRegion(sender, true); |
6410 | } | 6558 | } |
6559 | else | ||
6560 | m_log.Debug("HandleCompleteAgentMovement NULL handler"); | ||
6561 | |||
6411 | handlerCompleteMovementToRegion = null; | 6562 | handlerCompleteMovementToRegion = null; |
6412 | 6563 | ||
6413 | return true; | 6564 | return true; |
@@ -6425,7 +6576,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6425 | return true; | 6576 | return true; |
6426 | } | 6577 | } |
6427 | #endregion | 6578 | #endregion |
6428 | 6579 | /* | |
6429 | StartAnim handlerStartAnim = null; | 6580 | StartAnim handlerStartAnim = null; |
6430 | StopAnim handlerStopAnim = null; | 6581 | StopAnim handlerStopAnim = null; |
6431 | 6582 | ||
@@ -6449,6 +6600,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6449 | } | 6600 | } |
6450 | } | 6601 | } |
6451 | return true; | 6602 | return true; |
6603 | */ | ||
6604 | ChangeAnim handlerChangeAnim = null; | ||
6605 | |||
6606 | for (int i = 0; i < AgentAni.AnimationList.Length; i++) | ||
6607 | { | ||
6608 | handlerChangeAnim = OnChangeAnim; | ||
6609 | if (handlerChangeAnim != null) | ||
6610 | { | ||
6611 | handlerChangeAnim(AgentAni.AnimationList[i].AnimID, AgentAni.AnimationList[i].StartAnim, false); | ||
6612 | } | ||
6613 | } | ||
6614 | |||
6615 | handlerChangeAnim = OnChangeAnim; | ||
6616 | if (handlerChangeAnim != null) | ||
6617 | { | ||
6618 | handlerChangeAnim(UUID.Zero, false, true); | ||
6619 | } | ||
6620 | |||
6621 | return true; | ||
6452 | } | 6622 | } |
6453 | 6623 | ||
6454 | private bool HandleAgentRequestSit(IClientAPI sender, Packet Pack) | 6624 | private bool HandleAgentRequestSit(IClientAPI sender, Packet Pack) |
@@ -6674,6 +6844,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6674 | #endregion | 6844 | #endregion |
6675 | 6845 | ||
6676 | m_udpClient.SetThrottles(atpack.Throttle.Throttles); | 6846 | m_udpClient.SetThrottles(atpack.Throttle.Throttles); |
6847 | GenericCall2 handler = OnUpdateThrottles; | ||
6848 | if (handler != null) | ||
6849 | { | ||
6850 | handler(); | ||
6851 | } | ||
6677 | return true; | 6852 | return true; |
6678 | } | 6853 | } |
6679 | 6854 | ||
@@ -7098,7 +7273,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7098 | physdata.Bounce = phsblock.Restitution; | 7273 | physdata.Bounce = phsblock.Restitution; |
7099 | physdata.Density = phsblock.Density; | 7274 | physdata.Density = phsblock.Density; |
7100 | physdata.Friction = phsblock.Friction; | 7275 | physdata.Friction = phsblock.Friction; |
7101 | physdata.GravitationModifier = phsblock.GravityMultiplier; | 7276 | physdata.GravitationModifier = phsblock.GravityMultiplier; |
7102 | } | 7277 | } |
7103 | 7278 | ||
7104 | handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, UsePhysics, IsTemporary, IsPhantom, physdata, this); | 7279 | handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, UsePhysics, IsTemporary, IsPhantom, physdata, this); |
@@ -7684,6 +7859,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7684 | // surrounding scene | 7859 | // surrounding scene |
7685 | if ((ImageType)block.Type == ImageType.Baked) | 7860 | if ((ImageType)block.Type == ImageType.Baked) |
7686 | args.Priority *= 2.0f; | 7861 | args.Priority *= 2.0f; |
7862 | int wearableout = 0; | ||
7687 | 7863 | ||
7688 | ImageManager.EnqueueReq(args); | 7864 | ImageManager.EnqueueReq(args); |
7689 | } | 7865 | } |
@@ -8702,16 +8878,61 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
8702 | 8878 | ||
8703 | #region Parcel related packets | 8879 | #region Parcel related packets |
8704 | 8880 | ||
8881 | // acumulate several HandleRegionHandleRequest consecutive overlaping requests | ||
8882 | // to be done with minimal resources as possible | ||
8883 | // variables temporary here while in test | ||
8884 | |||
8885 | Queue<UUID> RegionHandleRequests = new Queue<UUID>(); | ||
8886 | bool RegionHandleRequestsInService = false; | ||
8887 | |||
8705 | private bool HandleRegionHandleRequest(IClientAPI sender, Packet Pack) | 8888 | private bool HandleRegionHandleRequest(IClientAPI sender, Packet Pack) |
8706 | { | 8889 | { |
8707 | RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack; | 8890 | UUID currentUUID; |
8708 | 8891 | ||
8709 | RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest; | 8892 | RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest; |
8710 | if (handlerRegionHandleRequest != null) | 8893 | |
8894 | if (handlerRegionHandleRequest == null) | ||
8895 | return true; | ||
8896 | |||
8897 | RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack; | ||
8898 | |||
8899 | lock (RegionHandleRequests) | ||
8711 | { | 8900 | { |
8712 | handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID); | 8901 | if (RegionHandleRequestsInService) |
8902 | { | ||
8903 | // we are already busy doing a previus request | ||
8904 | // so enqueue it | ||
8905 | RegionHandleRequests.Enqueue(rhrPack.RequestBlock.RegionID); | ||
8906 | return true; | ||
8907 | } | ||
8908 | |||
8909 | // else do it | ||
8910 | currentUUID = rhrPack.RequestBlock.RegionID; | ||
8911 | RegionHandleRequestsInService = true; | ||
8713 | } | 8912 | } |
8714 | return true; | 8913 | |
8914 | while (true) | ||
8915 | { | ||
8916 | handlerRegionHandleRequest(this, currentUUID); | ||
8917 | |||
8918 | lock (RegionHandleRequests) | ||
8919 | { | ||
8920 | // exit condition, nothing to do or closed | ||
8921 | // current code seems to assume we may loose the handler at anytime, | ||
8922 | // so keep checking it | ||
8923 | handlerRegionHandleRequest = OnRegionHandleRequest; | ||
8924 | |||
8925 | if (RegionHandleRequests.Count == 0 || !IsActive || handlerRegionHandleRequest == null) | ||
8926 | { | ||
8927 | RegionHandleRequests.Clear(); | ||
8928 | RegionHandleRequestsInService = false; | ||
8929 | return true; | ||
8930 | } | ||
8931 | currentUUID = RegionHandleRequests.Dequeue(); | ||
8932 | } | ||
8933 | } | ||
8934 | |||
8935 | return true; // actually unreached | ||
8715 | } | 8936 | } |
8716 | 8937 | ||
8717 | private bool HandleParcelInfoRequest(IClientAPI sender, Packet Pack) | 8938 | private bool HandleParcelInfoRequest(IClientAPI sender, Packet Pack) |
@@ -9667,7 +9888,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
9667 | EconomyDataRequest handlerEconomoyDataRequest = OnEconomyDataRequest; | 9888 | EconomyDataRequest handlerEconomoyDataRequest = OnEconomyDataRequest; |
9668 | if (handlerEconomoyDataRequest != null) | 9889 | if (handlerEconomoyDataRequest != null) |
9669 | { | 9890 | { |
9670 | handlerEconomoyDataRequest(AgentId); | 9891 | handlerEconomoyDataRequest(this); |
9671 | } | 9892 | } |
9672 | return true; | 9893 | return true; |
9673 | } | 9894 | } |
@@ -9967,7 +10188,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
9967 | handlerUpdateMuteListEntry(this, UpdateMuteListEntry.MuteData.MuteID, | 10188 | handlerUpdateMuteListEntry(this, UpdateMuteListEntry.MuteData.MuteID, |
9968 | Utils.BytesToString(UpdateMuteListEntry.MuteData.MuteName), | 10189 | Utils.BytesToString(UpdateMuteListEntry.MuteData.MuteName), |
9969 | UpdateMuteListEntry.MuteData.MuteType, | 10190 | UpdateMuteListEntry.MuteData.MuteType, |
9970 | UpdateMuteListEntry.AgentData.AgentID); | 10191 | UpdateMuteListEntry.MuteData.MuteFlags); |
9971 | return true; | 10192 | return true; |
9972 | } | 10193 | } |
9973 | return false; | 10194 | return false; |
@@ -9982,8 +10203,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
9982 | { | 10203 | { |
9983 | handlerRemoveMuteListEntry(this, | 10204 | handlerRemoveMuteListEntry(this, |
9984 | RemoveMuteListEntry.MuteData.MuteID, | 10205 | RemoveMuteListEntry.MuteData.MuteID, |
9985 | Utils.BytesToString(RemoveMuteListEntry.MuteData.MuteName), | 10206 | Utils.BytesToString(RemoveMuteListEntry.MuteData.MuteName)); |
9986 | RemoveMuteListEntry.AgentData.AgentID); | ||
9987 | return true; | 10207 | return true; |
9988 | } | 10208 | } |
9989 | return false; | 10209 | return false; |
@@ -10027,10 +10247,55 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
10027 | return false; | 10247 | return false; |
10028 | } | 10248 | } |
10029 | 10249 | ||
10250 | private bool HandleChangeInventoryItemFlags(IClientAPI client, Packet packet) | ||
10251 | { | ||
10252 | ChangeInventoryItemFlagsPacket ChangeInventoryItemFlags = | ||
10253 | (ChangeInventoryItemFlagsPacket)packet; | ||
10254 | ChangeInventoryItemFlags handlerChangeInventoryItemFlags = OnChangeInventoryItemFlags; | ||
10255 | if (handlerChangeInventoryItemFlags != null) | ||
10256 | { | ||
10257 | foreach(ChangeInventoryItemFlagsPacket.InventoryDataBlock b in ChangeInventoryItemFlags.InventoryData) | ||
10258 | handlerChangeInventoryItemFlags(this, b.ItemID, b.Flags); | ||
10259 | return true; | ||
10260 | } | ||
10261 | return false; | ||
10262 | } | ||
10263 | |||
10030 | private bool HandleUseCircuitCode(IClientAPI sender, Packet Pack) | 10264 | private bool HandleUseCircuitCode(IClientAPI sender, Packet Pack) |
10031 | { | 10265 | { |
10032 | return true; | 10266 | return true; |
10033 | } | 10267 | } |
10268 | |||
10269 | private bool HandleCreateNewOutfitAttachments(IClientAPI sender, Packet Pack) | ||
10270 | { | ||
10271 | CreateNewOutfitAttachmentsPacket packet = (CreateNewOutfitAttachmentsPacket)Pack; | ||
10272 | |||
10273 | #region Packet Session and User Check | ||
10274 | if (m_checkPackets) | ||
10275 | { | ||
10276 | if (packet.AgentData.SessionID != SessionId || | ||
10277 | packet.AgentData.AgentID != AgentId) | ||
10278 | return true; | ||
10279 | } | ||
10280 | #endregion | ||
10281 | MoveItemsAndLeaveCopy handlerMoveItemsAndLeaveCopy = null; | ||
10282 | List<InventoryItemBase> items = new List<InventoryItemBase>(); | ||
10283 | foreach (CreateNewOutfitAttachmentsPacket.ObjectDataBlock n in packet.ObjectData) | ||
10284 | { | ||
10285 | InventoryItemBase b = new InventoryItemBase(); | ||
10286 | b.ID = n.OldItemID; | ||
10287 | b.Folder = n.OldFolderID; | ||
10288 | items.Add(b); | ||
10289 | } | ||
10290 | |||
10291 | handlerMoveItemsAndLeaveCopy = OnMoveItemsAndLeaveCopy; | ||
10292 | if (handlerMoveItemsAndLeaveCopy != null) | ||
10293 | { | ||
10294 | handlerMoveItemsAndLeaveCopy(this, items, packet.HeaderData.NewFolderID); | ||
10295 | } | ||
10296 | |||
10297 | return true; | ||
10298 | } | ||
10034 | 10299 | ||
10035 | private bool HandleAgentHeightWidth(IClientAPI sender, Packet Pack) | 10300 | private bool HandleAgentHeightWidth(IClientAPI sender, Packet Pack) |
10036 | { | 10301 | { |
@@ -10457,6 +10722,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
10457 | groupProfileReply.GroupData.MaturePublish = d.MaturePublish; | 10722 | groupProfileReply.GroupData.MaturePublish = d.MaturePublish; |
10458 | groupProfileReply.GroupData.OwnerRole = d.OwnerRole; | 10723 | groupProfileReply.GroupData.OwnerRole = d.OwnerRole; |
10459 | 10724 | ||
10725 | Scene scene = (Scene)m_scene; | ||
10726 | if (scene.Permissions.IsGod(sender.AgentId) && (!sender.IsGroupMember(groupProfileRequest.GroupData.GroupID))) | ||
10727 | { | ||
10728 | ScenePresence p; | ||
10729 | if (scene.TryGetScenePresence(sender.AgentId, out p)) | ||
10730 | { | ||
10731 | if (p.GodLevel >= 200) | ||
10732 | { | ||
10733 | groupProfileReply.GroupData.OpenEnrollment = true; | ||
10734 | groupProfileReply.GroupData.MembershipFee = 0; | ||
10735 | } | ||
10736 | } | ||
10737 | } | ||
10738 | |||
10460 | OutPacket(groupProfileReply, ThrottleOutPacketType.Task); | 10739 | OutPacket(groupProfileReply, ThrottleOutPacketType.Task); |
10461 | } | 10740 | } |
10462 | return true; | 10741 | return true; |
@@ -11030,11 +11309,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11030 | 11309 | ||
11031 | StartLure handlerStartLure = OnStartLure; | 11310 | StartLure handlerStartLure = OnStartLure; |
11032 | if (handlerStartLure != null) | 11311 | if (handlerStartLure != null) |
11033 | handlerStartLure(startLureRequest.Info.LureType, | 11312 | { |
11034 | Utils.BytesToString( | 11313 | for (int i = 0 ; i < startLureRequest.TargetData.Length ; i++) |
11035 | startLureRequest.Info.Message), | 11314 | { |
11036 | startLureRequest.TargetData[0].TargetID, | 11315 | handlerStartLure(startLureRequest.Info.LureType, |
11037 | this); | 11316 | Utils.BytesToString( |
11317 | startLureRequest.Info.Message), | ||
11318 | startLureRequest.TargetData[i].TargetID, | ||
11319 | this); | ||
11320 | } | ||
11321 | } | ||
11038 | return true; | 11322 | return true; |
11039 | } | 11323 | } |
11040 | private bool HandleTeleportLureRequest(IClientAPI sender, Packet Pack) | 11324 | private bool HandleTeleportLureRequest(IClientAPI sender, Packet Pack) |
@@ -11148,10 +11432,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11148 | } | 11432 | } |
11149 | #endregion | 11433 | #endregion |
11150 | 11434 | ||
11151 | ClassifiedDelete handlerClassifiedGodDelete = OnClassifiedGodDelete; | 11435 | ClassifiedGodDelete handlerClassifiedGodDelete = OnClassifiedGodDelete; |
11152 | if (handlerClassifiedGodDelete != null) | 11436 | if (handlerClassifiedGodDelete != null) |
11153 | handlerClassifiedGodDelete( | 11437 | handlerClassifiedGodDelete( |
11154 | classifiedGodDelete.Data.ClassifiedID, | 11438 | classifiedGodDelete.Data.ClassifiedID, |
11439 | classifiedGodDelete.Data.QueryID, | ||
11155 | this); | 11440 | this); |
11156 | return true; | 11441 | return true; |
11157 | } | 11442 | } |
@@ -11464,6 +11749,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11464 | 11749 | ||
11465 | if (cachedtex.AgentData.SessionID != SessionId) | 11750 | if (cachedtex.AgentData.SessionID != SessionId) |
11466 | return false; | 11751 | return false; |
11752 | |||
11467 | 11753 | ||
11468 | // TODO: don't create new blocks if recycling an old packet | 11754 | // TODO: don't create new blocks if recycling an old packet |
11469 | cachedresp.AgentData.AgentID = AgentId; | 11755 | cachedresp.AgentData.AgentID = AgentId; |
@@ -11473,14 +11759,140 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11473 | cachedresp.WearableData = | 11759 | cachedresp.WearableData = |
11474 | new AgentCachedTextureResponsePacket.WearableDataBlock[cachedtex.WearableData.Length]; | 11760 | new AgentCachedTextureResponsePacket.WearableDataBlock[cachedtex.WearableData.Length]; |
11475 | 11761 | ||
11476 | for (int i = 0; i < cachedtex.WearableData.Length; i++) | 11762 | //IAvatarFactoryModule fac = m_scene.RequestModuleInterface<IAvatarFactoryModule>(); |
11763 | // var item = fac.GetBakedTextureFaces(AgentId); | ||
11764 | //WearableCacheItem[] items = fac.GetCachedItems(AgentId); | ||
11765 | |||
11766 | IAssetService cache = m_scene.AssetService; | ||
11767 | IBakedTextureModule bakedTextureModule = m_scene.RequestModuleInterface<IBakedTextureModule>(); | ||
11768 | //bakedTextureModule = null; | ||
11769 | int maxWearablesLoop = cachedtex.WearableData.Length; | ||
11770 | if (maxWearablesLoop > AvatarWearable.MAX_WEARABLES) | ||
11771 | maxWearablesLoop = AvatarWearable.MAX_WEARABLES; | ||
11772 | |||
11773 | if (bakedTextureModule != null && cache != null) | ||
11477 | { | 11774 | { |
11478 | cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); | 11775 | // We need to make sure the asset stored in the bake is available on this server also by it's assetid before we map it to a Cacheid |
11479 | cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex; | 11776 | |
11480 | cachedresp.WearableData[i].TextureID = UUID.Zero; | 11777 | WearableCacheItem[] cacheItems = null; |
11481 | cachedresp.WearableData[i].HostName = new byte[0]; | 11778 | ScenePresence p = m_scene.GetScenePresence(AgentId); |
11779 | if (p.Appearance != null) | ||
11780 | if (p.Appearance.WearableCacheItems == null || p.Appearance.WearableCacheItemsDirty) | ||
11781 | { | ||
11782 | try | ||
11783 | { | ||
11784 | cacheItems = bakedTextureModule.Get(AgentId); | ||
11785 | p.Appearance.WearableCacheItems = cacheItems; | ||
11786 | p.Appearance.WearableCacheItemsDirty = false; | ||
11787 | } | ||
11788 | |||
11789 | /* | ||
11790 | * The following Catch types DO NOT WORK, it jumps to the General Packet Exception Handler if you don't catch Exception! | ||
11791 | * | ||
11792 | catch (System.Net.Sockets.SocketException) | ||
11793 | { | ||
11794 | cacheItems = null; | ||
11795 | } | ||
11796 | catch (WebException) | ||
11797 | { | ||
11798 | cacheItems = null; | ||
11799 | } | ||
11800 | catch (InvalidOperationException) | ||
11801 | { | ||
11802 | cacheItems = null; | ||
11803 | } */ | ||
11804 | catch (Exception) | ||
11805 | { | ||
11806 | cacheItems = null; | ||
11807 | } | ||
11808 | |||
11809 | } | ||
11810 | else if (p.Appearance.WearableCacheItems != null) | ||
11811 | { | ||
11812 | cacheItems = p.Appearance.WearableCacheItems; | ||
11813 | } | ||
11814 | |||
11815 | if (cache != null && cacheItems != null) | ||
11816 | { | ||
11817 | foreach (WearableCacheItem item in cacheItems) | ||
11818 | { | ||
11819 | |||
11820 | if (cache.GetCached(item.TextureID.ToString()) == null) | ||
11821 | { | ||
11822 | item.TextureAsset.Temporary = true; | ||
11823 | cache.Store(item.TextureAsset); | ||
11824 | } | ||
11825 | |||
11826 | |||
11827 | } | ||
11828 | } | ||
11829 | |||
11830 | if (cacheItems != null) | ||
11831 | { | ||
11832 | |||
11833 | for (int i = 0; i < maxWearablesLoop; i++) | ||
11834 | { | ||
11835 | WearableCacheItem item = | ||
11836 | WearableCacheItem.SearchTextureIndex(cachedtex.WearableData[i].TextureIndex,cacheItems); | ||
11837 | |||
11838 | cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); | ||
11839 | cachedresp.WearableData[i].TextureIndex= cachedtex.WearableData[i].TextureIndex; | ||
11840 | cachedresp.WearableData[i].HostName = new byte[0]; | ||
11841 | if (item != null && cachedtex.WearableData[i].ID == item.CacheId) | ||
11842 | { | ||
11843 | |||
11844 | cachedresp.WearableData[i].TextureID = item.TextureID; | ||
11845 | } | ||
11846 | else | ||
11847 | { | ||
11848 | cachedresp.WearableData[i].TextureID = UUID.Zero; | ||
11849 | } | ||
11850 | } | ||
11851 | } | ||
11852 | else | ||
11853 | { | ||
11854 | for (int i = 0; i < maxWearablesLoop; i++) | ||
11855 | { | ||
11856 | cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); | ||
11857 | cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex; | ||
11858 | cachedresp.WearableData[i].TextureID = UUID.Zero; | ||
11859 | //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46"); | ||
11860 | cachedresp.WearableData[i].HostName = new byte[0]; | ||
11861 | } | ||
11862 | } | ||
11482 | } | 11863 | } |
11864 | else | ||
11865 | { | ||
11866 | if (cache == null) | ||
11867 | { | ||
11868 | for (int i = 0; i < maxWearablesLoop; i++) | ||
11869 | { | ||
11870 | cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); | ||
11871 | cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex; | ||
11872 | cachedresp.WearableData[i].TextureID = UUID.Zero; | ||
11873 | //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46"); | ||
11874 | cachedresp.WearableData[i].HostName = new byte[0]; | ||
11875 | } | ||
11876 | } | ||
11877 | else | ||
11878 | { | ||
11879 | for (int i = 0; i < maxWearablesLoop; i++) | ||
11880 | { | ||
11881 | cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); | ||
11882 | cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex; | ||
11883 | |||
11483 | 11884 | ||
11885 | |||
11886 | if (cache.GetCached(cachedresp.WearableData[i].TextureID.ToString()) == null) | ||
11887 | cachedresp.WearableData[i].TextureID = UUID.Zero; | ||
11888 | //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46"); | ||
11889 | else | ||
11890 | cachedresp.WearableData[i].TextureID = UUID.Zero; | ||
11891 | // UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46"); | ||
11892 | cachedresp.WearableData[i].HostName = new byte[0]; | ||
11893 | } | ||
11894 | } | ||
11895 | } | ||
11484 | cachedresp.Header.Zerocoded = true; | 11896 | cachedresp.Header.Zerocoded = true; |
11485 | OutPacket(cachedresp, ThrottleOutPacketType.Task); | 11897 | OutPacket(cachedresp, ThrottleOutPacketType.Task); |
11486 | 11898 | ||
@@ -11517,209 +11929,147 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11517 | } | 11929 | } |
11518 | else | 11930 | else |
11519 | { | 11931 | { |
11520 | // m_log.DebugFormat( | 11932 | ClientChangeObject updatehandler = onClientChangeObject; |
11521 | // "[CLIENT]: Processing block {0} type {1} for {2} {3}", | ||
11522 | // i, block.Type, part.Name, part.LocalId); | ||
11523 | 11933 | ||
11524 | // // Do this once since fetch parts creates a new array. | 11934 | if (updatehandler != null) |
11525 | // SceneObjectPart[] parts = part.ParentGroup.Parts; | 11935 | { |
11526 | // for (int j = 0; j < parts.Length; j++) | 11936 | ObjectChangeData udata = new ObjectChangeData(); |
11527 | // { | ||
11528 | // part.StoreUndoState(); | ||
11529 | // parts[j].IgnoreUndoUpdate = true; | ||
11530 | // } | ||
11531 | 11937 | ||
11532 | UpdatePrimGroupRotation handlerUpdatePrimGroupRotation; | 11938 | /*ubit from ll JIRA: |
11939 | * 0x01 position | ||
11940 | * 0x02 rotation | ||
11941 | * 0x04 scale | ||
11942 | |||
11943 | * 0x08 LINK_SET | ||
11944 | * 0x10 UNIFORM for scale | ||
11945 | */ | ||
11533 | 11946 | ||
11534 | switch (block.Type) | 11947 | // translate to internal changes |
11535 | { | 11948 | // not all cases .. just the ones older code did |
11536 | case 1: | ||
11537 | Vector3 pos1 = new Vector3(block.Data, 0); | ||
11538 | 11949 | ||
11539 | UpdateVector handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; | 11950 | switch (block.Type) |
11540 | if (handlerUpdatePrimSinglePosition != null) | 11951 | { |
11541 | { | 11952 | case 1: //change position sp |
11542 | // m_log.Debug("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z); | 11953 | udata.position = new Vector3(block.Data, 0); |
11543 | handlerUpdatePrimSinglePosition(localId, pos1, this); | ||
11544 | } | ||
11545 | break; | ||
11546 | 11954 | ||
11547 | case 2: | 11955 | udata.change = ObjectChangeType.primP; |
11548 | Quaternion rot1 = new Quaternion(block.Data, 0, true); | 11956 | updatehandler(localId, udata, this); |
11957 | break; | ||
11549 | 11958 | ||
11550 | UpdatePrimSingleRotation handlerUpdatePrimSingleRotation = OnUpdatePrimSingleRotation; | 11959 | case 2: // rotation sp |
11551 | if (handlerUpdatePrimSingleRotation != null) | 11960 | udata.rotation = new Quaternion(block.Data, 0, true); |
11552 | { | ||
11553 | // m_log.Info("new tab rotation is " + rot1.X + " , " + rot1.Y + " , " + rot1.Z + " , " + rot1.W); | ||
11554 | handlerUpdatePrimSingleRotation(localId, rot1, this); | ||
11555 | } | ||
11556 | break; | ||
11557 | 11961 | ||
11558 | case 3: | 11962 | udata.change = ObjectChangeType.primR; |
11559 | Vector3 rotPos = new Vector3(block.Data, 0); | 11963 | updatehandler(localId, udata, this); |
11560 | Quaternion rot2 = new Quaternion(block.Data, 12, true); | 11964 | break; |
11561 | 11965 | ||
11562 | UpdatePrimSingleRotationPosition handlerUpdatePrimSingleRotationPosition = OnUpdatePrimSingleRotationPosition; | 11966 | case 3: // position plus rotation |
11563 | if (handlerUpdatePrimSingleRotationPosition != null) | 11967 | udata.position = new Vector3(block.Data, 0); |
11564 | { | 11968 | udata.rotation = new Quaternion(block.Data, 12, true); |
11565 | // m_log.Debug("new mouse rotation position is " + rotPos.X + " , " + rotPos.Y + " , " + rotPos.Z); | ||
11566 | // m_log.Info("new mouse rotation is " + rot2.X + " , " + rot2.Y + " , " + rot2.Z + " , " + rot2.W); | ||
11567 | handlerUpdatePrimSingleRotationPosition(localId, rot2, rotPos, this); | ||
11568 | } | ||
11569 | break; | ||
11570 | 11969 | ||
11571 | case 4: | 11970 | udata.change = ObjectChangeType.primPR; |
11572 | case 20: | 11971 | updatehandler(localId, udata, this); |
11573 | Vector3 scale4 = new Vector3(block.Data, 0); | 11972 | break; |
11574 | 11973 | ||
11575 | UpdateVector handlerUpdatePrimScale = OnUpdatePrimScale; | 11974 | case 4: // scale sp |
11576 | if (handlerUpdatePrimScale != null) | 11975 | udata.scale = new Vector3(block.Data, 0); |
11577 | { | 11976 | udata.change = ObjectChangeType.primS; |
11578 | // m_log.Debug("new scale is " + scale4.X + " , " + scale4.Y + " , " + scale4.Z); | ||
11579 | handlerUpdatePrimScale(localId, scale4, this); | ||
11580 | } | ||
11581 | break; | ||
11582 | 11977 | ||
11583 | case 5: | 11978 | updatehandler(localId, udata, this); |
11584 | Vector3 scale1 = new Vector3(block.Data, 12); | 11979 | break; |
11585 | Vector3 pos11 = new Vector3(block.Data, 0); | ||
11586 | 11980 | ||
11587 | handlerUpdatePrimScale = OnUpdatePrimScale; | 11981 | case 0x14: // uniform scale sp |
11588 | if (handlerUpdatePrimScale != null) | 11982 | udata.scale = new Vector3(block.Data, 0); |
11589 | { | ||
11590 | // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); | ||
11591 | handlerUpdatePrimScale(localId, scale1, this); | ||
11592 | 11983 | ||
11593 | handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; | 11984 | udata.change = ObjectChangeType.primUS; |
11594 | if (handlerUpdatePrimSinglePosition != null) | 11985 | updatehandler(localId, udata, this); |
11595 | { | 11986 | break; |
11596 | handlerUpdatePrimSinglePosition(localId, pos11, this); | ||
11597 | } | ||
11598 | } | ||
11599 | break; | ||
11600 | 11987 | ||
11601 | case 9: | 11988 | case 5: // scale and position sp |
11602 | Vector3 pos2 = new Vector3(block.Data, 0); | 11989 | udata.position = new Vector3(block.Data, 0); |
11990 | udata.scale = new Vector3(block.Data, 12); | ||
11603 | 11991 | ||
11604 | UpdateVector handlerUpdateVector = OnUpdatePrimGroupPosition; | 11992 | udata.change = ObjectChangeType.primPS; |
11993 | updatehandler(localId, udata, this); | ||
11994 | break; | ||
11605 | 11995 | ||
11606 | if (handlerUpdateVector != null) | 11996 | case 0x15: //uniform scale and position |
11607 | { | 11997 | udata.position = new Vector3(block.Data, 0); |
11608 | handlerUpdateVector(localId, pos2, this); | 11998 | udata.scale = new Vector3(block.Data, 12); |
11609 | } | ||
11610 | break; | ||
11611 | 11999 | ||
11612 | case 10: | 12000 | udata.change = ObjectChangeType.primPUS; |
11613 | Quaternion rot3 = new Quaternion(block.Data, 0, true); | 12001 | updatehandler(localId, udata, this); |
12002 | break; | ||
11614 | 12003 | ||
11615 | UpdatePrimRotation handlerUpdatePrimRotation = OnUpdatePrimGroupRotation; | 12004 | // now group related (bit 4) |
11616 | if (handlerUpdatePrimRotation != null) | 12005 | case 9: //( 8 + 1 )group position |
11617 | { | 12006 | udata.position = new Vector3(block.Data, 0); |
11618 | // Console.WriteLine("new rotation is " + rot3.X + " , " + rot3.Y + " , " + rot3.Z + " , " + rot3.W); | ||
11619 | handlerUpdatePrimRotation(localId, rot3, this); | ||
11620 | } | ||
11621 | break; | ||
11622 | 12007 | ||
11623 | case 11: | 12008 | udata.change = ObjectChangeType.groupP; |
11624 | Vector3 pos3 = new Vector3(block.Data, 0); | 12009 | updatehandler(localId, udata, this); |
11625 | Quaternion rot4 = new Quaternion(block.Data, 12, true); | 12010 | break; |
11626 | 12011 | ||
11627 | handlerUpdatePrimGroupRotation = OnUpdatePrimGroupMouseRotation; | 12012 | case 0x0A: // (8 + 2) group rotation |
11628 | if (handlerUpdatePrimGroupRotation != null) | 12013 | udata.rotation = new Quaternion(block.Data, 0, true); |
11629 | { | ||
11630 | // m_log.Debug("new rotation position is " + pos.X + " , " + pos.Y + " , " + pos.Z); | ||
11631 | // m_log.Debug("new group mouse rotation is " + rot4.X + " , " + rot4.Y + " , " + rot4.Z + " , " + rot4.W); | ||
11632 | handlerUpdatePrimGroupRotation(localId, pos3, rot4, this); | ||
11633 | } | ||
11634 | break; | ||
11635 | case 12: | ||
11636 | case 28: | ||
11637 | Vector3 scale7 = new Vector3(block.Data, 0); | ||
11638 | 12014 | ||
11639 | UpdateVector handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale; | 12015 | udata.change = ObjectChangeType.groupR; |
11640 | if (handlerUpdatePrimGroupScale != null) | 12016 | updatehandler(localId, udata, this); |
11641 | { | 12017 | break; |
11642 | // m_log.Debug("new scale is " + scale7.X + " , " + scale7.Y + " , " + scale7.Z); | ||
11643 | handlerUpdatePrimGroupScale(localId, scale7, this); | ||
11644 | } | ||
11645 | break; | ||
11646 | 12018 | ||
11647 | case 13: | 12019 | case 0x0B: //( 8 + 2 + 1) group rotation and position |
11648 | Vector3 scale2 = new Vector3(block.Data, 12); | 12020 | udata.position = new Vector3(block.Data, 0); |
11649 | Vector3 pos4 = new Vector3(block.Data, 0); | 12021 | udata.rotation = new Quaternion(block.Data, 12, true); |
11650 | 12022 | ||
11651 | handlerUpdatePrimScale = OnUpdatePrimScale; | 12023 | udata.change = ObjectChangeType.groupPR; |
11652 | if (handlerUpdatePrimScale != null) | 12024 | updatehandler(localId, udata, this); |
11653 | { | 12025 | break; |
11654 | //m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); | ||
11655 | handlerUpdatePrimScale(localId, scale2, this); | ||
11656 | 12026 | ||
11657 | // Change the position based on scale (for bug number 246) | 12027 | case 0x0C: // (8 + 4) group scale |
11658 | handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; | 12028 | // only afects root prim and only sent by viewer editor object tab scaling |
11659 | // m_log.Debug("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z); | 12029 | // mouse edition only allows uniform scaling |
11660 | if (handlerUpdatePrimSinglePosition != null) | 12030 | // SL MAY CHANGE THIS in viewers |
11661 | { | ||
11662 | handlerUpdatePrimSinglePosition(localId, pos4, this); | ||
11663 | } | ||
11664 | } | ||
11665 | break; | ||
11666 | 12031 | ||
11667 | case 29: | 12032 | udata.scale = new Vector3(block.Data, 0); |
11668 | Vector3 scale5 = new Vector3(block.Data, 12); | ||
11669 | Vector3 pos5 = new Vector3(block.Data, 0); | ||
11670 | 12033 | ||
11671 | handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale; | 12034 | udata.change = ObjectChangeType.groupS; |
11672 | if (handlerUpdatePrimGroupScale != null) | 12035 | updatehandler(localId, udata, this); |
11673 | { | ||
11674 | // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); | ||
11675 | part.StoreUndoState(true); | ||
11676 | part.IgnoreUndoUpdate = true; | ||
11677 | handlerUpdatePrimGroupScale(localId, scale5, this); | ||
11678 | handlerUpdateVector = OnUpdatePrimGroupPosition; | ||
11679 | 12036 | ||
11680 | if (handlerUpdateVector != null) | 12037 | break; |
11681 | { | ||
11682 | handlerUpdateVector(localId, pos5, this); | ||
11683 | } | ||
11684 | 12038 | ||
11685 | part.IgnoreUndoUpdate = false; | 12039 | case 0x0D: //(8 + 4 + 1) group scale and position |
11686 | } | 12040 | // exception as above |
11687 | 12041 | ||
11688 | break; | 12042 | udata.position = new Vector3(block.Data, 0); |
12043 | udata.scale = new Vector3(block.Data, 12); | ||
11689 | 12044 | ||
11690 | case 21: | 12045 | udata.change = ObjectChangeType.groupPS; |
11691 | Vector3 scale6 = new Vector3(block.Data, 12); | 12046 | updatehandler(localId, udata, this); |
11692 | Vector3 pos6 = new Vector3(block.Data, 0); | 12047 | break; |
11693 | 12048 | ||
11694 | handlerUpdatePrimScale = OnUpdatePrimScale; | 12049 | case 0x1C: // (0x10 + 8 + 4 ) group scale UNIFORM |
11695 | if (handlerUpdatePrimScale != null) | 12050 | udata.scale = new Vector3(block.Data, 0); |
11696 | { | ||
11697 | part.StoreUndoState(false); | ||
11698 | part.IgnoreUndoUpdate = true; | ||
11699 | 12051 | ||
11700 | // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); | 12052 | udata.change = ObjectChangeType.groupUS; |
11701 | handlerUpdatePrimScale(localId, scale6, this); | 12053 | updatehandler(localId, udata, this); |
11702 | handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; | 12054 | break; |
11703 | if (handlerUpdatePrimSinglePosition != null) | ||
11704 | { | ||
11705 | handlerUpdatePrimSinglePosition(localId, pos6, this); | ||
11706 | } | ||
11707 | 12055 | ||
11708 | part.IgnoreUndoUpdate = false; | 12056 | case 0x1D: // (UNIFORM + GROUP + SCALE + POS) |
11709 | } | 12057 | udata.position = new Vector3(block.Data, 0); |
11710 | break; | 12058 | udata.scale = new Vector3(block.Data, 12); |
11711 | 12059 | ||
11712 | default: | 12060 | udata.change = ObjectChangeType.groupPUS; |
11713 | m_log.Debug("[CLIENT]: MultipleObjUpdate recieved an unknown packet type: " + (block.Type)); | 12061 | updatehandler(localId, udata, this); |
11714 | break; | 12062 | break; |
12063 | |||
12064 | default: | ||
12065 | m_log.Debug("[CLIENT]: MultipleObjUpdate recieved an unknown packet type: " + (block.Type)); | ||
12066 | break; | ||
12067 | } | ||
11715 | } | 12068 | } |
11716 | 12069 | ||
11717 | // for (int j = 0; j < parts.Length; j++) | ||
11718 | // parts[j].IgnoreUndoUpdate = false; | ||
11719 | } | 12070 | } |
11720 | } | 12071 | } |
11721 | } | 12072 | } |
11722 | |||
11723 | return true; | 12073 | return true; |
11724 | } | 12074 | } |
11725 | 12075 | ||
@@ -11780,9 +12130,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11780 | public void SetChildAgentThrottle(byte[] throttles) | 12130 | public void SetChildAgentThrottle(byte[] throttles) |
11781 | { | 12131 | { |
11782 | m_udpClient.SetThrottles(throttles); | 12132 | m_udpClient.SetThrottles(throttles); |
12133 | GenericCall2 handler = OnUpdateThrottles; | ||
12134 | if (handler != null) | ||
12135 | { | ||
12136 | handler(); | ||
12137 | } | ||
11783 | } | 12138 | } |
11784 | 12139 | ||
11785 | /// <summary> | 12140 | /// <summary> |
12141 | /// Sets the throttles from values supplied by the client | ||
12142 | /// </summary> | ||
12143 | /// <param name="throttles"></param> | ||
12144 | public void SetAgentThrottleSilent(int throttle, int setting) | ||
12145 | { | ||
12146 | m_udpClient.ForceThrottleSetting(throttle,setting); | ||
12147 | //m_udpClient.SetThrottles(throttles); | ||
12148 | |||
12149 | } | ||
12150 | |||
12151 | |||
12152 | /// <summary> | ||
11786 | /// Get the current throttles for this client as a packed byte array | 12153 | /// Get the current throttles for this client as a packed byte array |
11787 | /// </summary> | 12154 | /// </summary> |
11788 | /// <param name="multiplier">Unused</param> | 12155 | /// <param name="multiplier">Unused</param> |
@@ -11874,17 +12241,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11874 | m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, doAutomaticSplitting, method); | 12241 | m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, doAutomaticSplitting, method); |
11875 | } | 12242 | } |
11876 | 12243 | ||
11877 | public bool AddMoney(int debit) | ||
11878 | { | ||
11879 | if (m_moneyBalance + debit >= 0) | ||
11880 | { | ||
11881 | m_moneyBalance += debit; | ||
11882 | SendMoneyBalance(UUID.Zero, true, Util.StringToBytes256("Poof Poof!"), m_moneyBalance); | ||
11883 | return true; | ||
11884 | } | ||
11885 | return false; | ||
11886 | } | ||
11887 | |||
11888 | protected void HandleAutopilot(Object sender, string method, List<String> args) | 12244 | protected void HandleAutopilot(Object sender, string method, List<String> args) |
11889 | { | 12245 | { |
11890 | float locx = 0; | 12246 | float locx = 0; |
@@ -12174,7 +12530,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
12174 | // "[LLCLIENTVIEW]: Received transfer request for {0} in {1} type {2} by {3}", | 12530 | // "[LLCLIENTVIEW]: Received transfer request for {0} in {1} type {2} by {3}", |
12175 | // requestID, taskID, (SourceType)sourceType, Name); | 12531 | // requestID, taskID, (SourceType)sourceType, Name); |
12176 | 12532 | ||
12533 | |||
12534 | //Note, the bool returned from the below function is useless since it is always false. | ||
12177 | m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived); | 12535 | m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived); |
12536 | |||
12178 | } | 12537 | } |
12179 | 12538 | ||
12180 | /// <summary> | 12539 | /// <summary> |
@@ -12240,7 +12599,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
12240 | /// <returns></returns> | 12599 | /// <returns></returns> |
12241 | private static int CalculateNumPackets(byte[] data) | 12600 | private static int CalculateNumPackets(byte[] data) |
12242 | { | 12601 | { |
12243 | const uint m_maxPacketSize = 600; | 12602 | // const uint m_maxPacketSize = 600; |
12603 | uint m_maxPacketSize = MaxTransferBytesPerPacket; | ||
12244 | int numPackets = 1; | 12604 | int numPackets = 1; |
12245 | 12605 | ||
12246 | if (data == null) | 12606 | if (data == null) |