aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs215
1 files changed, 156 insertions, 59 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index df2690e..a0e5521 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -154,6 +154,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
154 public event RequestTaskInventory OnRequestTaskInventory; 154 public event RequestTaskInventory OnRequestTaskInventory;
155 public event UpdateInventoryItem OnUpdateInventoryItem; 155 public event UpdateInventoryItem OnUpdateInventoryItem;
156 public event CopyInventoryItem OnCopyInventoryItem; 156 public event CopyInventoryItem OnCopyInventoryItem;
157 public event MoveItemsAndLeaveCopy OnMoveItemsAndLeaveCopy;
157 public event MoveInventoryItem OnMoveInventoryItem; 158 public event MoveInventoryItem OnMoveInventoryItem;
158 public event RemoveInventoryItem OnRemoveInventoryItem; 159 public event RemoveInventoryItem OnRemoveInventoryItem;
159 public event RemoveInventoryFolder OnRemoveInventoryFolder; 160 public event RemoveInventoryFolder OnRemoveInventoryFolder;
@@ -335,11 +336,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
335// protected HashSet<uint> m_attachmentsSent; 336// protected HashSet<uint> m_attachmentsSent;
336 337
337 private int m_moneyBalance; 338 private int m_moneyBalance;
339 private bool m_deliverPackets = true;
338 private int m_animationSequenceNumber = 1; 340 private int m_animationSequenceNumber = 1;
339 private bool m_SendLogoutPacketWhenClosing = true; 341 private bool m_SendLogoutPacketWhenClosing = true;
340 private AgentUpdateArgs lastarg; 342 private AgentUpdateArgs lastarg;
341 private bool m_IsActive = true; 343 private bool m_IsActive = true;
342 private bool m_IsLoggingOut = false; 344 private bool m_IsLoggingOut = false;
345 private bool m_IsPresenceReady = false;
343 346
344 protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); 347 protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>();
345 protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers 348 protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers
@@ -362,6 +365,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
362 365
363 private Timer m_propertiesPacketTimer; 366 private Timer m_propertiesPacketTimer;
364 private List<ObjectPropertiesPacket.ObjectDataBlock> m_propertiesBlocks = new List<ObjectPropertiesPacket.ObjectDataBlock>(); 367 private List<ObjectPropertiesPacket.ObjectDataBlock> m_propertiesBlocks = new List<ObjectPropertiesPacket.ObjectDataBlock>();
368 private List<Packet> m_pendingPackets;
365 369
366 #endregion Class Members 370 #endregion Class Members
367 371
@@ -377,6 +381,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
377 get { return m_startpos; } 381 get { return m_startpos; }
378 set { m_startpos = value; } 382 set { m_startpos = value; }
379 } 383 }
384 public bool DeliverPackets
385 {
386 get { return m_deliverPackets; }
387 set {
388 m_deliverPackets = value;
389 m_udpClient.m_deliverPackets = value;
390 }
391 }
380 public UUID AgentId { get { return m_agentId; } } 392 public UUID AgentId { get { return m_agentId; } }
381 public UUID ActiveGroupId { get { return m_activeGroupID; } } 393 public UUID ActiveGroupId { get { return m_activeGroupID; } }
382 public string ActiveGroupName { get { return m_activeGroupName; } } 394 public string ActiveGroupName { get { return m_activeGroupName; } }
@@ -402,6 +414,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
402 get { return m_IsActive; } 414 get { return m_IsActive; }
403 set { m_IsActive = value; } 415 set { m_IsActive = value; }
404 } 416 }
417
405 public bool IsLoggingOut 418 public bool IsLoggingOut
406 { 419 {
407 get { return m_IsLoggingOut; } 420 get { return m_IsLoggingOut; }
@@ -471,18 +484,30 @@ namespace OpenSim.Region.ClientStack.LindenUDP
471 484
472 #region Client Methods 485 #region Client Methods
473 486
487
474 /// <summary> 488 /// <summary>
475 /// Shut down the client view 489 /// Shut down the client view
476 /// </summary> 490 /// </summary>
477 public void Close() 491 public void Close()
478 { 492 {
493 Close(true);
494 }
495
496 /// <summary>
497 /// Shut down the client view
498 /// </summary>
499 public void Close(bool sendStop)
500 {
479 m_log.DebugFormat( 501 m_log.DebugFormat(
480 "[CLIENT]: Close has been called for {0} attached to scene {1}", 502 "[CLIENT]: Close has been called for {0} attached to scene {1}",
481 Name, m_scene.RegionInfo.RegionName); 503 Name, m_scene.RegionInfo.RegionName);
482 504
483 // Send the STOP packet 505 if (sendStop)
484 DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator); 506 {
485 OutPacket(disable, ThrottleOutPacketType.Unknown); 507 // Send the STOP packet
508 DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator);
509 OutPacket(disable, ThrottleOutPacketType.Unknown);
510 }
486 511
487 IsActive = false; 512 IsActive = false;
488 513
@@ -1048,6 +1073,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1048 public virtual void SendLayerData(float[] map) 1073 public virtual void SendLayerData(float[] map)
1049 { 1074 {
1050 Util.FireAndForget(DoSendLayerData, map); 1075 Util.FireAndForget(DoSendLayerData, map);
1076
1077 // Send it sync, and async. It's not that much data
1078 // and it improves user experience just so much!
1079 DoSendLayerData(map);
1051 } 1080 }
1052 1081
1053 /// <summary> 1082 /// <summary>
@@ -1060,16 +1089,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1060 1089
1061 try 1090 try
1062 { 1091 {
1063 //for (int y = 0; y < 16; y++) 1092 for (int y = 0; y < 16; y++)
1064 //{ 1093 {
1065 // for (int x = 0; x < 16; x++) 1094 for (int x = 0; x < 16; x+=4)
1066 // { 1095 {
1067 // SendLayerData(x, y, map); 1096 SendLayerPacket(x, y, map);
1068 // } 1097 }
1069 //} 1098 }
1070
1071 // Send LayerData in a spiral pattern. Fun!
1072 SendLayerTopRight(map, 0, 0, 15, 15);
1073 } 1099 }
1074 catch (Exception e) 1100 catch (Exception e)
1075 { 1101 {
@@ -1077,51 +1103,35 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1077 } 1103 }
1078 } 1104 }
1079 1105
1080 private void SendLayerTopRight(float[] map, int x1, int y1, int x2, int y2)
1081 {
1082 // Row
1083 for (int i = x1; i <= x2; i++)
1084 SendLayerData(i, y1, map);
1085
1086 // Column
1087 for (int j = y1 + 1; j <= y2; j++)
1088 SendLayerData(x2, j, map);
1089
1090 if (x2 - x1 > 0)
1091 SendLayerBottomLeft(map, x1, y1 + 1, x2 - 1, y2);
1092 }
1093
1094 void SendLayerBottomLeft(float[] map, int x1, int y1, int x2, int y2)
1095 {
1096 // Row in reverse
1097 for (int i = x2; i >= x1; i--)
1098 SendLayerData(i, y2, map);
1099
1100 // Column in reverse
1101 for (int j = y2 - 1; j >= y1; j--)
1102 SendLayerData(x1, j, map);
1103
1104 if (x2 - x1 > 0)
1105 SendLayerTopRight(map, x1 + 1, y1, x2, y2 - 1);
1106 }
1107
1108 /// <summary> 1106 /// <summary>
1109 /// Sends a set of four patches (x, x+1, ..., x+3) to the client 1107 /// Sends a set of four patches (x, x+1, ..., x+3) to the client
1110 /// </summary> 1108 /// </summary>
1111 /// <param name="map">heightmap</param> 1109 /// <param name="map">heightmap</param>
1112 /// <param name="px">X coordinate for patches 0..12</param> 1110 /// <param name="px">X coordinate for patches 0..12</param>
1113 /// <param name="py">Y coordinate for patches 0..15</param> 1111 /// <param name="py">Y coordinate for patches 0..15</param>
1114 // private void SendLayerPacket(float[] map, int y, int x) 1112 private void SendLayerPacket(int x, int y, float[] map)
1115 // { 1113 {
1116 // int[] patches = new int[4]; 1114 int[] patches = new int[4];
1117 // patches[0] = x + 0 + y * 16; 1115 patches[0] = x + 0 + y * 16;
1118 // patches[1] = x + 1 + y * 16; 1116 patches[1] = x + 1 + y * 16;
1119 // patches[2] = x + 2 + y * 16; 1117 patches[2] = x + 2 + y * 16;
1120 // patches[3] = x + 3 + y * 16; 1118 patches[3] = x + 3 + y * 16;
1121 1119
1122 // Packet layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches); 1120 float[] heightmap = (map.Length == 65536) ?
1123 // OutPacket(layerpack, ThrottleOutPacketType.Land); 1121 map :
1124 // } 1122 LLHeightFieldMoronize(map);
1123
1124 try
1125 {
1126 Packet layerpack = TerrainCompressor.CreateLandPacket(heightmap, patches);
1127 OutPacket(layerpack, ThrottleOutPacketType.Land);
1128 }
1129 catch
1130 {
1131 for (int px = x ; px < x + 4 ; px++)
1132 SendLayerData(px, y, map);
1133 }
1134 }
1125 1135
1126 /// <summary> 1136 /// <summary>
1127 /// Sends a specified patch to a client 1137 /// Sends a specified patch to a client
@@ -1141,7 +1151,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1141 LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(heightmap, patches); 1151 LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(heightmap, patches);
1142 layerpack.Header.Reliable = true; 1152 layerpack.Header.Reliable = true;
1143 1153
1144 OutPacket(layerpack, ThrottleOutPacketType.Land); 1154 OutPacket(layerpack, ThrottleOutPacketType.Task);
1145 } 1155 }
1146 catch (Exception e) 1156 catch (Exception e)
1147 { 1157 {
@@ -2213,6 +2223,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2213 OutPacket(sound, ThrottleOutPacketType.Task); 2223 OutPacket(sound, ThrottleOutPacketType.Task);
2214 } 2224 }
2215 2225
2226 public void SendTransferAbort(TransferRequestPacket transferRequest)
2227 {
2228 TransferAbortPacket abort = (TransferAbortPacket)PacketPool.Instance.GetPacket(PacketType.TransferAbort);
2229 abort.TransferInfo.TransferID = transferRequest.TransferInfo.TransferID;
2230 abort.TransferInfo.ChannelType = transferRequest.TransferInfo.ChannelType;
2231 m_log.Debug("[Assets] Aborting transfer; asset request failed");
2232 OutPacket(abort, ThrottleOutPacketType.Task);
2233 }
2234
2216 public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle, Vector3 position, float gain) 2235 public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle, Vector3 position, float gain)
2217 { 2236 {
2218 SoundTriggerPacket sound = (SoundTriggerPacket)PacketPool.Instance.GetPacket(PacketType.SoundTrigger); 2237 SoundTriggerPacket sound = (SoundTriggerPacket)PacketPool.Instance.GetPacket(PacketType.SoundTrigger);
@@ -3474,6 +3493,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3474 /// </summary> 3493 /// </summary>
3475 public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) 3494 public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags)
3476 { 3495 {
3496 if (entity is SceneObjectPart)
3497 {
3498 SceneObjectPart e = (SceneObjectPart)entity;
3499 SceneObjectGroup g = e.ParentGroup;
3500 if (g.RootPart.Shape.State > 30) // HUD
3501 if (g.OwnerID != AgentId)
3502 return; // Don't send updates for other people's HUDs
3503 }
3504
3477 double priority = m_prioritizer.GetUpdatePriority(this, entity); 3505 double priority = m_prioritizer.GetUpdatePriority(this, entity);
3478 3506
3479 lock (m_entityUpdates.SyncRoot) 3507 lock (m_entityUpdates.SyncRoot)
@@ -3494,9 +3522,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3494 EntityUpdate update; 3522 EntityUpdate update;
3495 while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update)) 3523 while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update))
3496 { 3524 {
3525 // If we have sent a kill packet for this object
3526 // drop any updates on the floor
3497 if (update.Entity is SceneObjectPart) 3527 if (update.Entity is SceneObjectPart)
3498 { 3528 {
3499 SceneObjectPart part = (SceneObjectPart)update.Entity; 3529 SceneObjectPart part = (SceneObjectPart)update.Entity;
3530 if (m_killRecord.Contains(part.ParentGroup.RootPart.LocalId))
3531 continue;
3500 3532
3501 if (part.ParentGroup.IsAttachment && m_disableFacelights) 3533 if (part.ParentGroup.IsAttachment && m_disableFacelights)
3502 { 3534 {
@@ -3930,6 +3962,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3930 { 3962 {
3931 m_propertiesPacketTimer.Stop(); 3963 m_propertiesPacketTimer.Stop();
3932 3964
3965 if (m_propertiesBlocks.Count == 0)
3966 return;
3967
3933 proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[m_propertiesBlocks.Count]; 3968 proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[m_propertiesBlocks.Count];
3934 3969
3935 int index = 0; 3970 int index = 0;
@@ -4821,6 +4856,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4821 AddLocalPacketHandler(PacketType.TransferAbort, HandleTransferAbort, false); 4856 AddLocalPacketHandler(PacketType.TransferAbort, HandleTransferAbort, false);
4822 AddLocalPacketHandler(PacketType.MuteListRequest, HandleMuteListRequest, false); 4857 AddLocalPacketHandler(PacketType.MuteListRequest, HandleMuteListRequest, false);
4823 AddLocalPacketHandler(PacketType.UseCircuitCode, HandleUseCircuitCode); 4858 AddLocalPacketHandler(PacketType.UseCircuitCode, HandleUseCircuitCode);
4859 AddLocalPacketHandler(PacketType.CreateNewOutfitAttachments, HandleCreateNewOutfitAttachments);
4824 AddLocalPacketHandler(PacketType.AgentHeightWidth, HandleAgentHeightWidth, false); 4860 AddLocalPacketHandler(PacketType.AgentHeightWidth, HandleAgentHeightWidth, false);
4825 AddLocalPacketHandler(PacketType.InventoryDescendents, HandleInventoryDescendents); 4861 AddLocalPacketHandler(PacketType.InventoryDescendents, HandleInventoryDescendents);
4826 AddLocalPacketHandler(PacketType.DirPlacesQuery, HandleDirPlacesQuery); 4862 AddLocalPacketHandler(PacketType.DirPlacesQuery, HandleDirPlacesQuery);
@@ -4920,6 +4956,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4920 (x.CameraLeftAxis != lastarg.CameraLeftAxis) || 4956 (x.CameraLeftAxis != lastarg.CameraLeftAxis) ||
4921 (x.CameraUpAxis != lastarg.CameraUpAxis) || 4957 (x.CameraUpAxis != lastarg.CameraUpAxis) ||
4922 (x.ControlFlags != lastarg.ControlFlags) || 4958 (x.ControlFlags != lastarg.ControlFlags) ||
4959 (x.ControlFlags != 0) ||
4923 (x.Far != lastarg.Far) || 4960 (x.Far != lastarg.Far) ||
4924 (x.Flags != lastarg.Flags) || 4961 (x.Flags != lastarg.Flags) ||
4925 (x.State != lastarg.State) || 4962 (x.State != lastarg.State) ||
@@ -5291,7 +5328,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5291 args.Channel = ch; 5328 args.Channel = ch;
5292 args.From = String.Empty; 5329 args.From = String.Empty;
5293 args.Message = Utils.BytesToString(msg); 5330 args.Message = Utils.BytesToString(msg);
5294 args.Type = ChatTypeEnum.Shout; 5331 args.Type = ChatTypeEnum.Region; //Behaviour in SL is that the response can be heard from any distance
5295 args.Position = new Vector3(); 5332 args.Position = new Vector3();
5296 args.Scene = Scene; 5333 args.Scene = Scene;
5297 args.Sender = this; 5334 args.Sender = this;
@@ -9329,6 +9366,37 @@ namespace OpenSim.Region.ClientStack.LindenUDP
9329 { 9366 {
9330 return true; 9367 return true;
9331 } 9368 }
9369
9370 private bool HandleCreateNewOutfitAttachments(IClientAPI sender, Packet Pack)
9371 {
9372 CreateNewOutfitAttachmentsPacket packet = (CreateNewOutfitAttachmentsPacket)Pack;
9373
9374 #region Packet Session and User Check
9375 if (m_checkPackets)
9376 {
9377 if (packet.AgentData.SessionID != SessionId ||
9378 packet.AgentData.AgentID != AgentId)
9379 return true;
9380 }
9381 #endregion
9382 MoveItemsAndLeaveCopy handlerMoveItemsAndLeaveCopy = null;
9383 List<InventoryItemBase> items = new List<InventoryItemBase>();
9384 foreach (CreateNewOutfitAttachmentsPacket.ObjectDataBlock n in packet.ObjectData)
9385 {
9386 InventoryItemBase b = new InventoryItemBase();
9387 b.ID = n.OldItemID;
9388 b.Folder = n.OldFolderID;
9389 items.Add(b);
9390 }
9391
9392 handlerMoveItemsAndLeaveCopy = OnMoveItemsAndLeaveCopy;
9393 if (handlerMoveItemsAndLeaveCopy != null)
9394 {
9395 handlerMoveItemsAndLeaveCopy(this, items, packet.HeaderData.NewFolderID);
9396 }
9397
9398 return true;
9399 }
9332 9400
9333 private bool HandleAgentHeightWidth(IClientAPI sender, Packet Pack) 9401 private bool HandleAgentHeightWidth(IClientAPI sender, Packet Pack)
9334 { 9402 {
@@ -11172,18 +11240,44 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11172 } 11240 }
11173 11241
11174 /// <summary> 11242 /// <summary>
11243 /// This processes packets which have accumulated while the presence was still in the process of initialising.
11244 /// </summary>
11245 public void ProcessPendingPackets()
11246 {
11247 m_IsPresenceReady = true;
11248 if (m_pendingPackets == null)
11249 return;
11250 foreach (Packet p in m_pendingPackets)
11251 {
11252 ProcessInPacket(p);
11253 }
11254 m_pendingPackets.Clear();
11255 }
11256
11257 /// <summary>
11175 /// Entryway from the client to the simulator. All UDP packets from the client will end up here 11258 /// Entryway from the client to the simulator. All UDP packets from the client will end up here
11176 /// </summary> 11259 /// </summary>
11177 /// <param name="Pack">OpenMetaverse.packet</param> 11260 /// <param name="Pack">OpenMetaverse.packet</param>
11178 public void ProcessInPacket(Packet Pack) 11261 public void ProcessInPacket(Packet Pack)
11179 { 11262 {
11180 if (m_debugPacketLevel >= 255) 11263 if (!m_IsPresenceReady)
11181 m_log.DebugFormat("[CLIENT]: Packet IN {0}", Pack.Type); 11264 {
11265 if (m_pendingPackets == null)
11266 {
11267 m_pendingPackets = new List<Packet>();
11268 }
11269 m_pendingPackets.Add(Pack);
11270 }
11271 else
11272 {
11273 if (m_debugPacketLevel >= 255)
11274 m_log.DebugFormat("[CLIENT]: Packet IN {0}", Pack.Type);
11182 11275
11183 if (!ProcessPacketMethod(Pack)) 11276 if (!ProcessPacketMethod(Pack))
11184 m_log.Warn("[CLIENT]: unhandled packet " + Pack.Type); 11277 m_log.Warn("[CLIENT]: unhandled packet " + Pack.Type);
11185 11278
11186 PacketPool.Instance.ReturnPacket(Pack); 11279 PacketPool.Instance.ReturnPacket(Pack);
11280 }
11187 } 11281 }
11188 11282
11189 private static PrimitiveBaseShape GetShapeFromAddPacket(ObjectAddPacket addPacket) 11283 private static PrimitiveBaseShape GetShapeFromAddPacket(ObjectAddPacket addPacket)
@@ -11420,7 +11514,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11420 11514
11421// m_log.DebugFormat("[CLIENT]: {0} requesting asset {1}", Name, requestID); 11515// m_log.DebugFormat("[CLIENT]: {0} requesting asset {1}", Name, requestID);
11422 11516
11517
11518 //Note, the bool returned from the below function is useless since it is always false.
11423 m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived); 11519 m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived);
11520
11424 } 11521 }
11425 11522
11426 /// <summary> 11523 /// <summary>