aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
diff options
context:
space:
mode:
authorUbitUmarov2015-09-01 14:54:35 +0100
committerUbitUmarov2015-09-01 14:54:35 +0100
commit371c9dd2af01a2e7422ec901ee1f80757284a78c (patch)
tree058d2a513cacb12efcce0c0df0ae14ad135dbfe2 /OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
parentremove lixo (diff)
parentdont change camera on crossings (diff)
downloadopensim-SC_OLD-371c9dd2af01a2e7422ec901ee1f80757284a78c.zip
opensim-SC_OLD-371c9dd2af01a2e7422ec901ee1f80757284a78c.tar.gz
opensim-SC_OLD-371c9dd2af01a2e7422ec901ee1f80757284a78c.tar.bz2
opensim-SC_OLD-371c9dd2af01a2e7422ec901ee1f80757284a78c.tar.xz
bad merge?
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs160
1 files changed, 122 insertions, 38 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index ef2125b..3d9c028 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -50,7 +50,7 @@ namespace OpenSim.Region.Framework.Scenes
50 /// <param name='targetID'></param> 50 /// <param name='targetID'></param>
51 /// <param name='fromAgent'></param> 51 /// <param name='fromAgent'></param>
52 /// <param name='broadcast'></param> 52 /// <param name='broadcast'></param>
53 protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, 53 public void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName,
54 UUID fromID, UUID targetID, bool fromAgent, bool broadcast) 54 UUID fromID, UUID targetID, bool fromAgent, bool broadcast)
55 { 55 {
56 OSChatMessage args = new OSChatMessage(); 56 OSChatMessage args = new OSChatMessage();
@@ -61,6 +61,7 @@ namespace OpenSim.Region.Framework.Scenes
61 args.Position = fromPos; 61 args.Position = fromPos;
62 args.SenderUUID = fromID; 62 args.SenderUUID = fromID;
63 args.Scene = this; 63 args.Scene = this;
64 args.Destination = targetID;
64 65
65 if (fromAgent) 66 if (fromAgent)
66 { 67 {
@@ -75,7 +76,7 @@ namespace OpenSim.Region.Framework.Scenes
75 } 76 }
76 77
77 args.From = fromName; 78 args.From = fromName;
78 args.TargetUUID = targetID; 79 //args.
79 80
80// m_log.DebugFormat( 81// m_log.DebugFormat(
81// "[SCENE]: Sending message {0} on channel {1}, type {2} from {3}, broadcast {4}", 82// "[SCENE]: Sending message {0} on channel {1}, type {2} from {3}, broadcast {4}",
@@ -86,7 +87,7 @@ namespace OpenSim.Region.Framework.Scenes
86 else 87 else
87 EventManager.TriggerOnChatFromWorld(this, args); 88 EventManager.TriggerOnChatFromWorld(this, args);
88 } 89 }
89 90
90 protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, 91 protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName,
91 UUID fromID, bool fromAgent, bool broadcast) 92 UUID fromID, bool fromAgent, bool broadcast)
92 { 93 {
@@ -130,19 +131,6 @@ namespace OpenSim.Region.Framework.Scenes
130 { 131 {
131 SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true); 132 SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true);
132 } 133 }
133 /// <summary>
134 ///
135 /// </summary>
136 /// <param name="message"></param>
137 /// <param name="type"></param>
138 /// <param name="fromPos"></param>
139 /// <param name="fromName"></param>
140 /// <param name="fromAgentID"></param>
141 /// <param name="targetID"></param>
142 public void SimChatToAgent(UUID targetID, byte[] message, Vector3 fromPos, string fromName, UUID fromID, bool fromAgent)
143 {
144 SimChat(message, ChatTypeEnum.Say, 0, fromPos, fromName, fromID, targetID, fromAgent, false);
145 }
146 134
147 /// <summary> 135 /// <summary>
148 /// 136 ///
@@ -179,27 +167,47 @@ namespace OpenSim.Region.Framework.Scenes
179 /// <param name="remoteClient"></param> 167 /// <param name="remoteClient"></param>
180 public void SelectPrim(uint primLocalID, IClientAPI remoteClient) 168 public void SelectPrim(uint primLocalID, IClientAPI remoteClient)
181 { 169 {
170 /*
171 SceneObjectPart part = GetSceneObjectPart(primLocalID);
172
173 if (null == part)
174 return;
175
176 if (part.IsRoot)
177 {
178 SceneObjectGroup sog = part.ParentGroup;
179 sog.SendPropertiesToClient(remoteClient);
180
181 // A prim is only tainted if it's allowed to be edited by the person clicking it.
182 if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId)
183 || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId))
184 {
185 sog.IsSelected = true;
186 EventManager.TriggerParcelPrimCountTainted();
187 }
188 }
189 else
190 {
191 part.SendPropertiesToClient(remoteClient);
192 }
193 */
182 SceneObjectPart part = GetSceneObjectPart(primLocalID); 194 SceneObjectPart part = GetSceneObjectPart(primLocalID);
183 195
184 if (null == part) 196 if (null == part)
185 return; 197 return;
186 198
187 if (part.IsRoot) 199 SceneObjectGroup sog = part.ParentGroup;
188 { 200 if (sog == null)
189 SceneObjectGroup sog = part.ParentGroup; 201 return;
190 sog.SendPropertiesToClient(remoteClient);
191 sog.IsSelected = true;
192 202
193 // A prim is only tainted if it's allowed to be edited by the person clicking it. 203 part.SendPropertiesToClient(remoteClient);
194 if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) 204
195 || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId)) 205 // A prim is only tainted if it's allowed to be edited by the person clicking it.
196 { 206 if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId)
197 EventManager.TriggerParcelPrimCountTainted(); 207 || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId))
198 }
199 }
200 else
201 { 208 {
202 part.SendPropertiesToClient(remoteClient); 209 part.IsSelected = true;
210 EventManager.TriggerParcelPrimCountTainted();
203 } 211 }
204 } 212 }
205 213
@@ -252,7 +260,7 @@ namespace OpenSim.Region.Framework.Scenes
252 SceneObjectPart part = GetSceneObjectPart(primLocalID); 260 SceneObjectPart part = GetSceneObjectPart(primLocalID);
253 if (part == null) 261 if (part == null)
254 return; 262 return;
255 263 /*
256 // A deselect packet contains all the local prims being deselected. However, since selection is still 264 // A deselect packet contains all the local prims being deselected. However, since selection is still
257 // group based we only want the root prim to trigger a full update - otherwise on objects with many prims 265 // group based we only want the root prim to trigger a full update - otherwise on objects with many prims
258 // we end up sending many duplicate ObjectUpdates 266 // we end up sending many duplicate ObjectUpdates
@@ -263,7 +271,9 @@ namespace OpenSim.Region.Framework.Scenes
263 // handled by group, but by prim. Legacy cruft. 271 // handled by group, but by prim. Legacy cruft.
264 // TODO: Make selection flagging per prim! 272 // TODO: Make selection flagging per prim!
265 // 273 //
266 part.ParentGroup.IsSelected = false; 274 if (Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId)
275 || Permissions.CanMoveObject(part.ParentGroup.UUID, remoteClient.AgentId))
276 part.ParentGroup.IsSelected = false;
267 277
268 part.ParentGroup.ScheduleGroupForFullUpdate(); 278 part.ParentGroup.ScheduleGroupForFullUpdate();
269 279
@@ -280,6 +290,26 @@ namespace OpenSim.Region.Framework.Scenes
280 part.UUID, remoteClient.AgentId)) 290 part.UUID, remoteClient.AgentId))
281 EventManager.TriggerParcelPrimCountTainted(); 291 EventManager.TriggerParcelPrimCountTainted();
282 } 292 }
293 */
294
295 bool oldgprSelect = part.ParentGroup.IsSelected;
296
297 // This is wrong, wrong, wrong. Selection should not be
298 // handled by group, but by prim. Legacy cruft.
299 // TODO: Make selection flagging per prim!
300 //
301 if (Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId)
302 || Permissions.CanMoveObject(part.ParentGroup.UUID, remoteClient.AgentId))
303 {
304 part.IsSelected = false;
305 if (!part.ParentGroup.IsAttachment && oldgprSelect != part.ParentGroup.IsSelected)
306 EventManager.TriggerParcelPrimCountTainted();
307 }
308
309 // restore targetOmega
310 if (part.AngularVelocity != Vector3.Zero)
311 part.ScheduleTerseUpdate();
312
283 } 313 }
284 314
285 public virtual void ProcessMoneyTransferRequest(UUID source, UUID destination, int amount, 315 public virtual void ProcessMoneyTransferRequest(UUID source, UUID destination, int amount,
@@ -434,12 +464,26 @@ namespace OpenSim.Region.Framework.Scenes
434 } 464 }
435 }); 465 });
436 } 466 }
437 467
438 private bool ShouldSendDiscardableEffect(IClientAPI thisClient, ScenePresence other) 468 private bool ShouldSendDiscardableEffect(IClientAPI thisClient, ScenePresence other)
439 { 469 {
440 return Vector3.Distance(other.CameraPosition, thisClient.SceneAgent.AbsolutePosition) < 10; 470 return Vector3.Distance(other.CameraPosition, thisClient.SceneAgent.AbsolutePosition) < 10;
441 } 471 }
442 472
473 private class DescendentsRequestData
474 {
475 public IClientAPI RemoteClient;
476 public UUID FolderID;
477 public UUID OwnerID;
478 public bool FetchFolders;
479 public bool FetchItems;
480 public int SortOrder;
481 }
482
483 private Queue<DescendentsRequestData> m_descendentsRequestQueue = new Queue<DescendentsRequestData>();
484 private Object m_descendentsRequestLock = new Object();
485 private bool m_descendentsRequestProcessing = false;
486
443 /// <summary> 487 /// <summary>
444 /// Tell the client about the various child items and folders contained in the requested folder. 488 /// Tell the client about the various child items and folders contained in the requested folder.
445 /// </summary> 489 /// </summary>
@@ -476,17 +520,38 @@ namespace OpenSim.Region.Framework.Scenes
476 } 520 }
477 } 521 }
478 522
479 // We're going to send the reply async, because there may be 523 lock (m_descendentsRequestLock)
480 // an enormous quantity of packets -- basically the entire inventory! 524 {
481 // We don't want to block the client thread while all that is happening. 525 if (!m_descendentsRequestProcessing)
482 SendInventoryDelegate d = SendInventoryAsync; 526 {
483 d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d); 527 m_descendentsRequestProcessing = true;
528
529 // We're going to send the reply async, because there may be
530 // an enormous quantity of packets -- basically the entire inventory!
531 // We don't want to block the client thread while all that is happening.
532 SendInventoryDelegate d = SendInventoryAsync;
533 d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d);
534
535 return;
536 }
537
538 DescendentsRequestData req = new DescendentsRequestData();
539 req.RemoteClient = remoteClient;
540 req.FolderID = folderID;
541 req.OwnerID = ownerID;
542 req.FetchFolders = fetchFolders;
543 req.FetchItems = fetchItems;
544 req.SortOrder = sortOrder;
545
546 m_descendentsRequestQueue.Enqueue(req);
547 }
484 } 548 }
485 549
486 delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder); 550 delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder);
487 551
488 void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) 552 void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder)
489 { 553 {
554<<<<<<< HEAD
490 try 555 try
491 { 556 {
492 SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems); 557 SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems);
@@ -497,12 +562,31 @@ namespace OpenSim.Region.Framework.Scenes
497 string.Format( 562 string.Format(
498 "[AGENT INVENTORY]: Error in SendInventoryAsync() for {0} with folder ID {1}. Exception ", e)); 563 "[AGENT INVENTORY]: Error in SendInventoryAsync() for {0} with folder ID {1}. Exception ", e));
499 } 564 }
565=======
566 Thread.Sleep(20);
567 SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems);
568>>>>>>> avn/ubitvar
500 } 569 }
501 570
502 void SendInventoryComplete(IAsyncResult iar) 571 void SendInventoryComplete(IAsyncResult iar)
503 { 572 {
504 SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState; 573 SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState;
505 d.EndInvoke(iar); 574 d.EndInvoke(iar);
575
576 lock (m_descendentsRequestLock)
577 {
578 if (m_descendentsRequestQueue.Count > 0)
579 {
580 DescendentsRequestData req = m_descendentsRequestQueue.Dequeue();
581
582 d = SendInventoryAsync;
583 d.BeginInvoke(req.RemoteClient, req.FolderID, req.OwnerID, req.FetchFolders, req.FetchItems, req.SortOrder, SendInventoryComplete, d);
584
585 return;
586 }
587
588 m_descendentsRequestProcessing = false;
589 }
506 } 590 }
507 591
508 /// <summary> 592 /// <summary>