aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules')
-rw-r--r--OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs127
-rw-r--r--OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs85
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs95
-rw-r--r--OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs17
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs104
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs202
-rw-r--r--OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs67
-rw-r--r--OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs97
-rw-r--r--OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs52
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs2
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs171
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs32
-rw-r--r--OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs3
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs212
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs19
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs121
-rw-r--r--OpenSim/Region/CoreModules/LightShare/LightShareModule.cs3
-rw-r--r--OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs31
-rw-r--r--OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs153
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs19
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs23
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs15
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs8
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs12
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs15
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs18
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs8
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs77
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs321
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandObject.cs34
-rw-r--r--OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs4
-rw-r--r--OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs7
-rw-r--r--OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Region/RestartModule.cs38
-rw-r--r--OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs30
-rw-r--r--OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs12
-rw-r--r--OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs50
39 files changed, 1692 insertions, 598 deletions
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs
index ec4dfd0..4cedfe6 100644
--- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs
+++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs
@@ -28,6 +28,7 @@
28using System; 28using System;
29using System.IO; 29using System.IO;
30using System.Reflection; 30using System.Reflection;
31using System.Collections.Generic;
31using log4net; 32using log4net;
32using OpenMetaverse; 33using OpenMetaverse;
33using OpenSim.Framework; 34using OpenSim.Framework;
@@ -38,6 +39,13 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
38{ 39{
39 public class AssetXferUploader 40 public class AssetXferUploader
40 { 41 {
42 // Viewer's notion of the default texture
43 private List<UUID> defaultIDs = new List<UUID> {
44 new UUID("5748decc-f629-461c-9a36-a35a221fe21f"),
45 new UUID("7ca39b4c-bd19-4699-aff7-f93fd03d3e7b"),
46 new UUID("6522e74d-1660-4e7f-b601-6f48c1659a77"),
47 new UUID("c228d1cf-4b5d-4ba8-84f4-899a0796aa97")
48 };
41 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
42 50
43 /// <summary> 51 /// <summary>
@@ -65,6 +73,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
65 private UUID TransactionID = UUID.Zero; 73 private UUID TransactionID = UUID.Zero;
66 private sbyte type = 0; 74 private sbyte type = 0;
67 private byte wearableType = 0; 75 private byte wearableType = 0;
76 private byte[] m_oldData = null;
68 public ulong XferID; 77 public ulong XferID;
69 private Scene m_Scene; 78 private Scene m_Scene;
70 79
@@ -302,6 +311,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
302 311
303 private void DoCreateItem(uint callbackID) 312 private void DoCreateItem(uint callbackID)
304 { 313 {
314 ValidateAssets();
305 m_Scene.AssetService.Store(m_asset); 315 m_Scene.AssetService.Store(m_asset);
306 316
307 InventoryItemBase item = new InventoryItemBase(); 317 InventoryItemBase item = new InventoryItemBase();
@@ -322,12 +332,84 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
322 item.Flags = (uint) wearableType; 332 item.Flags = (uint) wearableType;
323 item.CreationDate = Util.UnixTimeSinceEpoch(); 333 item.CreationDate = Util.UnixTimeSinceEpoch();
324 334
335 m_log.DebugFormat("[XFER]: Created item {0} with asset {1}",
336 item.ID, item.AssetID);
337
325 if (m_Scene.AddInventoryItem(item)) 338 if (m_Scene.AddInventoryItem(item))
326 ourClient.SendInventoryItemCreateUpdate(item, callbackID); 339 ourClient.SendInventoryItemCreateUpdate(item, callbackID);
327 else 340 else
328 ourClient.SendAlertMessage("Unable to create inventory item"); 341 ourClient.SendAlertMessage("Unable to create inventory item");
329 } 342 }
330 343
344 private void ValidateAssets()
345 {
346 if (m_asset.Type == (sbyte)AssetType.Clothing ||
347 m_asset.Type == (sbyte)AssetType.Bodypart)
348 {
349 string content = System.Text.Encoding.ASCII.GetString(m_asset.Data);
350 string[] lines = content.Split(new char[] {'\n'});
351
352 List<string> validated = new List<string>();
353
354 Dictionary<int, UUID> allowed = ExtractTexturesFromOldData();
355
356 int textures = 0;
357
358 foreach (string line in lines)
359 {
360 try
361 {
362 if (line.StartsWith("textures "))
363 {
364 textures = Convert.ToInt32(line.Substring(9));
365 validated.Add(line);
366 }
367 else if (textures > 0)
368 {
369 string[] parts = line.Split(new char[] {' '});
370
371 UUID tx = new UUID(parts[1]);
372 int id = Convert.ToInt32(parts[0]);
373
374 if (defaultIDs.Contains(tx) || tx == UUID.Zero ||
375 (allowed.ContainsKey(id) && allowed[id] == tx))
376 {
377 validated.Add(parts[0] + " " + tx.ToString());
378 }
379 else
380 {
381 int perms = m_Scene.InventoryService.GetAssetPermissions(ourClient.AgentId, tx);
382 int full = (int)(PermissionMask.Modify | PermissionMask.Transfer | PermissionMask.Copy);
383
384 if ((perms & full) != full)
385 {
386 m_log.ErrorFormat("[ASSET UPLOADER]: REJECTED update with texture {0} from {1} because they do not own the texture", tx, ourClient.AgentId);
387 validated.Add(parts[0] + " " + UUID.Zero.ToString());
388 }
389 else
390 {
391 validated.Add(line);
392 }
393 }
394 textures--;
395 }
396 else
397 {
398 validated.Add(line);
399 }
400 }
401 catch
402 {
403 // If it's malformed, skip it
404 }
405 }
406
407 string final = String.Join("\n", validated.ToArray());
408
409 m_asset.Data = System.Text.Encoding.ASCII.GetBytes(final);
410 }
411 }
412
331 /// <summary> 413 /// <summary>
332 /// Get the asset data uploaded in this transfer. 414 /// Get the asset data uploaded in this transfer.
333 /// </summary> 415 /// </summary>
@@ -336,10 +418,55 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
336 { 418 {
337 if (m_finished) 419 if (m_finished)
338 { 420 {
421 ValidateAssets();
339 return m_asset; 422 return m_asset;
340 } 423 }
341 424
342 return null; 425 return null;
343 } 426 }
427
428 public void SetOldData(byte[] d)
429 {
430 m_oldData = d;
431 }
432
433 private Dictionary<int,UUID> ExtractTexturesFromOldData()
434 {
435 Dictionary<int,UUID> result = new Dictionary<int,UUID>();
436 if (m_oldData == null)
437 return result;
438
439 string content = System.Text.Encoding.ASCII.GetString(m_oldData);
440 string[] lines = content.Split(new char[] {'\n'});
441
442 int textures = 0;
443
444 foreach (string line in lines)
445 {
446 try
447 {
448 if (line.StartsWith("textures "))
449 {
450 textures = Convert.ToInt32(line.Substring(9));
451 }
452 else if (textures > 0)
453 {
454 string[] parts = line.Split(new char[] {' '});
455
456 UUID tx = new UUID(parts[1]);
457 int id = Convert.ToInt32(parts[0]);
458 result[id] = tx;
459 textures--;
460 }
461 }
462 catch
463 {
464 // If it's malformed, skip it
465 }
466 }
467
468 return result;
469 }
344 } 470 }
345} 471}
472
diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
index 389fb7b..127ca1d 100644
--- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
+++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
@@ -257,53 +257,66 @@ namespace Flotsam.RegionModules.AssetCache
257 257
258 private void UpdateFileCache(string key, AssetBase asset) 258 private void UpdateFileCache(string key, AssetBase asset)
259 { 259 {
260 string filename = GetFileName(asset.ID); 260 // TODO: Spawn this off to some seperate thread to do the actual writing
261 261 if (asset != null)
262 try
263 { 262 {
264 // If the file is already cached, don't cache it, just touch it so access time is updated 263 string filename = GetFileName(key);
265 if (File.Exists(filename)) 264
266 { 265 try
267 File.SetLastAccessTime(filename, DateTime.Now);
268 }
269 else
270 { 266 {
271 // Once we start writing, make sure we flag that we're writing 267 // If the file is already cached, don't cache it, just touch it so access time is updated
272 // that object to the cache so that we don't try to write the 268 if (File.Exists(filename))
273 // same file multiple times.
274 lock (m_CurrentlyWriting)
275 { 269 {
276#if WAIT_ON_INPROGRESS_REQUESTS 270 // We don't really want to know about sharing
277 if (m_CurrentlyWriting.ContainsKey(filename)) 271 // violations here. If the file is locked, then
272 // the other thread has updated the time for us.
273 try
278 { 274 {
279 return; 275 File.SetLastAccessTime(filename, DateTime.Now);
280 } 276 }
281 else 277 catch
282 {
283 m_CurrentlyWriting.Add(filename, new ManualResetEvent(false));
284 }
285
286#else
287 if (m_CurrentlyWriting.Contains(filename))
288 { 278 {
289 return;
290 } 279 }
291 else 280 } else {
281
282 // Once we start writing, make sure we flag that we're writing
283 // that object to the cache so that we don't try to write the
284 // same file multiple times.
285 lock (m_CurrentlyWriting)
292 { 286 {
293 m_CurrentlyWriting.Add(filename); 287#if WAIT_ON_INPROGRESS_REQUESTS
294 } 288 if (m_CurrentlyWriting.ContainsKey(filename))
289 {
290 return;
291 }
292 else
293 {
294 m_CurrentlyWriting.Add(filename, new ManualResetEvent(false));
295 }
296
297#else
298 if (m_CurrentlyWriting.Contains(filename))
299 {
300 return;
301 }
302 else
303 {
304 m_CurrentlyWriting.Add(filename);
305 }
295#endif 306#endif
296 }
297 307
298 Util.FireAndForget( 308 }
299 delegate { WriteFileCache(filename, asset); }); 309
310 Util.FireAndForget(
311 delegate { WriteFileCache(filename, asset); });
312 }
313 }
314 catch (Exception e)
315 {
316 m_log.ErrorFormat(
317 "[FLOTSAM ASSET CACHE]: Failed to update cache for asset {0}. Exception {1} {2}",
318 asset.ID, e.Message, e.StackTrace);
300 } 319 }
301 }
302 catch (Exception e)
303 {
304 m_log.ErrorFormat(
305 "[FLOTSAM ASSET CACHE]: Failed to update cache for asset {0}. Exception {1} {2}",
306 asset.ID, e.Message, e.StackTrace);
307 } 320 }
308 } 321 }
309 322
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index faa413e..78ae5e9 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -28,6 +28,7 @@
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Reflection; 30using System.Reflection;
31using System.Xml;
31using log4net; 32using log4net;
32using Mono.Addins; 33using Mono.Addins;
33using Nini.Config; 34using Nini.Config;
@@ -38,6 +39,7 @@ using OpenSim.Region.Framework;
38using OpenSim.Region.Framework.Interfaces; 39using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes; 40using OpenSim.Region.Framework.Scenes;
40using OpenSim.Region.Framework.Scenes.Serialization; 41using OpenSim.Region.Framework.Scenes.Serialization;
42using OpenSim.Services.Interfaces;
41 43
42namespace OpenSim.Region.CoreModules.Avatar.Attachments 44namespace OpenSim.Region.CoreModules.Avatar.Attachments
43{ 45{
@@ -115,6 +117,40 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
115 117
116// m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing any attachments for {0}", sp.Name); 118// m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing any attachments for {0}", sp.Name);
117 119
120 XmlDocument doc = new XmlDocument();
121 string stateData = String.Empty;
122
123 IAttachmentsService attServ = m_scene.RequestModuleInterface<IAttachmentsService>();
124 if (attServ != null)
125 {
126 m_log.DebugFormat("[ATTACHMENT]: Loading attachment data from attachment service");
127 stateData = attServ.Get(sp.UUID.ToString());
128 if (stateData != String.Empty)
129 {
130 try
131 {
132 doc.LoadXml(stateData);
133 }
134 catch { }
135 }
136 }
137
138 Dictionary<UUID, string> itemData = new Dictionary<UUID, string>();
139
140 XmlNodeList nodes = doc.GetElementsByTagName("Attachment");
141 if (nodes.Count > 0)
142 {
143 foreach (XmlNode n in nodes)
144 {
145 XmlElement elem = (XmlElement)n;
146 string itemID = elem.GetAttribute("ItemID");
147 string xml = elem.InnerXml;
148
149 itemData[new UUID(itemID)] = xml;
150 }
151 }
152
153
118 List<AvatarAttachment> attachments = sp.Appearance.GetAttachments(); 154 List<AvatarAttachment> attachments = sp.Appearance.GetAttachments();
119 foreach (AvatarAttachment attach in attachments) 155 foreach (AvatarAttachment attach in attachments)
120 { 156 {
@@ -134,12 +170,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
134 170
135 try 171 try
136 { 172 {
173 string xmlData;
174 XmlDocument d = null;
175 UUID asset;
176 if (itemData.TryGetValue(attach.ItemID, out xmlData))
177 {
178 d = new XmlDocument();
179 d.LoadXml(xmlData);
180 m_log.InfoFormat("[ATTACHMENT]: Found saved state for item {0}, loading it", attach.ItemID);
181 }
182
137 // If we're an NPC then skip all the item checks and manipulations since we don't have an 183 // If we're an NPC then skip all the item checks and manipulations since we don't have an
138 // inventory right now. 184 // inventory right now.
139 if (sp.PresenceType == PresenceType.Npc) 185 if (sp.PresenceType == PresenceType.Npc)
140 RezSingleAttachmentFromInventoryInternal(sp, UUID.Zero, attach.AssetID, p); 186 RezSingleAttachmentFromInventoryInternal(sp, UUID.Zero, attach.AssetID, p, null);
141 else 187 else
142 RezSingleAttachmentFromInventory(sp, attach.ItemID, p); 188 RezSingleAttachmentFromInventory(sp, attach.ItemID, p, true, d);
143 } 189 }
144 catch (Exception e) 190 catch (Exception e)
145 { 191 {
@@ -264,6 +310,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
264 } 310 }
265 311
266 public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt) 312 public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt)
313 {
314 return RezSingleAttachmentFromInventory(sp, itemID, AttachmentPt, true, null);
315 }
316
317 public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc)
267 { 318 {
268 if (!Enabled) 319 if (!Enabled)
269 return null; 320 return null;
@@ -302,7 +353,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
302 return null; 353 return null;
303 } 354 }
304 355
305 SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt); 356 SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt, doc);
306 357
307 if (att == null) 358 if (att == null)
308 DetachSingleAttachmentToInv(sp, itemID); 359 DetachSingleAttachmentToInv(sp, itemID);
@@ -366,7 +417,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
366 so.AttachedAvatar = UUID.Zero; 417 so.AttachedAvatar = UUID.Zero;
367 rootPart.SetParentLocalId(0); 418 rootPart.SetParentLocalId(0);
368 so.ClearPartAttachmentData(); 419 so.ClearPartAttachmentData();
369 rootPart.ApplyPhysics(rootPart.GetEffectiveObjectFlags(), rootPart.VolumeDetectActive); 420 rootPart.ApplyPhysics(rootPart.GetEffectiveObjectFlags(), rootPart.VolumeDetectActive,false);
370 so.HasGroupChanged = true; 421 so.HasGroupChanged = true;
371 rootPart.Rezzed = DateTime.Now; 422 rootPart.Rezzed = DateTime.Now;
372 rootPart.RemFlag(PrimFlags.TemporaryOnRez); 423 rootPart.RemFlag(PrimFlags.TemporaryOnRez);
@@ -582,11 +633,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
582 633
583 Vector3 inventoryStoredPosition = new Vector3 634 Vector3 inventoryStoredPosition = new Vector3
584 (((grp.AbsolutePosition.X > (int)Constants.RegionSize) 635 (((grp.AbsolutePosition.X > (int)Constants.RegionSize)
585 ? Constants.RegionSize - 6 636 ? (float)Constants.RegionSize - 6
586 : grp.AbsolutePosition.X) 637 : grp.AbsolutePosition.X)
587 , 638 ,
588 (grp.AbsolutePosition.Y > (int)Constants.RegionSize) 639 (grp.AbsolutePosition.Y > (int)Constants.RegionSize)
589 ? Constants.RegionSize - 6 640 ? (float)Constants.RegionSize - 6
590 : grp.AbsolutePosition.Y, 641 : grp.AbsolutePosition.Y,
591 grp.AbsolutePosition.Z); 642 grp.AbsolutePosition.Z);
592 643
@@ -704,8 +755,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
704 } 755 }
705 } 756 }
706 757
707 private SceneObjectGroup RezSingleAttachmentFromInventoryInternal( 758 protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal(
708 IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt) 759 IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt, XmlDocument doc)
709 { 760 {
710 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); 761 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
711 if (invAccess != null) 762 if (invAccess != null)
@@ -713,7 +764,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
713 lock (sp.AttachmentsSyncLock) 764 lock (sp.AttachmentsSyncLock)
714 { 765 {
715 SceneObjectGroup objatt; 766 SceneObjectGroup objatt;
716 767
717 if (itemID != UUID.Zero) 768 if (itemID != UUID.Zero)
718 objatt = invAccess.RezObject(sp.ControllingClient, 769 objatt = invAccess.RezObject(sp.ControllingClient,
719 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, 770 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
@@ -722,11 +773,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
722 objatt = invAccess.RezObject(sp.ControllingClient, 773 objatt = invAccess.RezObject(sp.ControllingClient,
723 null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, 774 null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
724 false, false, sp.UUID, true); 775 false, false, sp.UUID, true);
725 776
726 // m_log.DebugFormat( 777 // m_log.DebugFormat(
727 // "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}", 778 // "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}",
728 // objatt.Name, remoteClient.Name, AttachmentPt); 779 // objatt.Name, remoteClient.Name, AttachmentPt);
729 780
730 if (objatt != null) 781 if (objatt != null)
731 { 782 {
732 // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller. 783 // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller.
@@ -734,7 +785,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
734 bool tainted = false; 785 bool tainted = false;
735 if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint) 786 if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint)
736 tainted = true; 787 tainted = true;
737 788
738 // This will throw if the attachment fails 789 // This will throw if the attachment fails
739 try 790 try
740 { 791 {
@@ -745,21 +796,27 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
745 m_log.ErrorFormat( 796 m_log.ErrorFormat(
746 "[ATTACHMENTS MODULE]: Failed to attach {0} {1} for {2}, exception {3}{4}", 797 "[ATTACHMENTS MODULE]: Failed to attach {0} {1} for {2}, exception {3}{4}",
747 objatt.Name, objatt.UUID, sp.Name, e.Message, e.StackTrace); 798 objatt.Name, objatt.UUID, sp.Name, e.Message, e.StackTrace);
748 799
749 // Make sure the object doesn't stick around and bail 800 // Make sure the object doesn't stick around and bail
750 sp.RemoveAttachment(objatt); 801 sp.RemoveAttachment(objatt);
751 m_scene.DeleteSceneObject(objatt, false); 802 m_scene.DeleteSceneObject(objatt, false);
752 return null; 803 return null;
753 } 804 }
754 805
755 if (tainted) 806 if (tainted)
756 objatt.HasGroupChanged = true; 807 objatt.HasGroupChanged = true;
808
809 if (doc != null)
810 {
811 objatt.LoadScriptState(doc);
812 objatt.ResetOwnerChangeFlag();
813 }
757 814
758 // Fire after attach, so we don't get messy perms dialogs 815 // Fire after attach, so we don't get messy perms dialogs
759 // 4 == AttachedRez 816 // 4 == AttachedRez
760 objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4); 817 objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4);
761 objatt.ResumeScripts(); 818 objatt.ResumeScripts();
762 819
763 // Do this last so that event listeners have access to all the effects of the attachment 820 // Do this last so that event listeners have access to all the effects of the attachment
764 m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, sp.UUID); 821 m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, sp.UUID);
765 822
@@ -773,7 +830,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
773 } 830 }
774 } 831 }
775 } 832 }
776 833
777 return null; 834 return null;
778 } 835 }
779 836
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
index b0cee03..2bebd30 100644
--- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
@@ -551,12 +551,17 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
551 /// <param name="client"></param> 551 /// <param name="client"></param>
552 private void Client_OnRequestWearables(IClientAPI client) 552 private void Client_OnRequestWearables(IClientAPI client)
553 { 553 {
554 // m_log.DebugFormat("[AVFACTORY]: Client_OnRequestWearables called for {0} ({1})", client.Name, client.AgentId); 554 Util.FireAndForget(delegate(object x)
555 ScenePresence sp = m_scene.GetScenePresence(client.AgentId); 555 {
556 if (sp != null) 556 Thread.Sleep(4000);
557 client.SendWearables(sp.Appearance.Wearables, sp.Appearance.Serial++); 557
558 else 558 // m_log.DebugFormat("[AVFACTORY]: Client_OnRequestWearables called for {0} ({1})", client.Name, client.AgentId);
559 m_log.WarnFormat("[AVFACTORY]: Client_OnRequestWearables unable to find presence for {0}", client.AgentId); 559 ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
560 if (sp != null)
561 client.SendWearables(sp.Appearance.Wearables, sp.Appearance.Serial++);
562 else
563 m_log.WarnFormat("[AVFACTORY]: Client_OnRequestWearables unable to find presence for {0}", client.AgentId);
564 });
560 } 565 }
561 566
562 /// <summary> 567 /// <summary>
diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
index e4452fb..6ffc7e6 100644
--- a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
@@ -49,7 +49,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
49 private int m_shoutdistance = 100; 49 private int m_shoutdistance = 100;
50 private int m_whisperdistance = 10; 50 private int m_whisperdistance = 10;
51 private List<Scene> m_scenes = new List<Scene>(); 51 private List<Scene> m_scenes = new List<Scene>();
52 52 private List<string> FreezeCache = new List<string>();
53 private string m_adminPrefix = "";
53 internal object m_syncy = new object(); 54 internal object m_syncy = new object();
54 55
55 internal IConfig m_config; 56 internal IConfig m_config;
@@ -76,6 +77,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
76 m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance", m_whisperdistance); 77 m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance", m_whisperdistance);
77 m_saydistance = config.Configs["Chat"].GetInt("say_distance", m_saydistance); 78 m_saydistance = config.Configs["Chat"].GetInt("say_distance", m_saydistance);
78 m_shoutdistance = config.Configs["Chat"].GetInt("shout_distance", m_shoutdistance); 79 m_shoutdistance = config.Configs["Chat"].GetInt("shout_distance", m_shoutdistance);
80 m_adminPrefix = config.Configs["Chat"].GetString("admin_prefix", "");
79 } 81 }
80 82
81 public virtual void AddRegion(Scene scene) 83 public virtual void AddRegion(Scene scene)
@@ -171,7 +173,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
171 return; 173 return;
172 } 174 }
173 175
174 DeliverChatToAvatars(ChatSourceType.Agent, c); 176 if (FreezeCache.Contains(c.Sender.AgentId.ToString()))
177 {
178 if (c.Type != ChatTypeEnum.StartTyping || c.Type != ChatTypeEnum.StopTyping)
179 c.Sender.SendAgentAlertMessage("You may not talk as you are frozen.", false);
180 }
181 else
182 {
183 DeliverChatToAvatars(ChatSourceType.Agent, c);
184 }
175 } 185 }
176 186
177 public virtual void OnChatFromWorld(Object sender, OSChatMessage c) 187 public virtual void OnChatFromWorld(Object sender, OSChatMessage c)
@@ -185,6 +195,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
185 protected virtual void DeliverChatToAvatars(ChatSourceType sourceType, OSChatMessage c) 195 protected virtual void DeliverChatToAvatars(ChatSourceType sourceType, OSChatMessage c)
186 { 196 {
187 string fromName = c.From; 197 string fromName = c.From;
198 string fromNamePrefix = "";
188 UUID fromID = UUID.Zero; 199 UUID fromID = UUID.Zero;
189 UUID targetID = c.TargetUUID; 200 UUID targetID = c.TargetUUID;
190 string message = c.Message; 201 string message = c.Message;
@@ -208,7 +219,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
208 fromPos = avatar.AbsolutePosition; 219 fromPos = avatar.AbsolutePosition;
209 fromName = avatar.Name; 220 fromName = avatar.Name;
210 fromID = c.Sender.AgentId; 221 fromID = c.Sender.AgentId;
211 222 if (avatar.GodLevel >= 200)
223 {
224 fromNamePrefix = m_adminPrefix;
225 }
212 break; 226 break;
213 227
214 case ChatSourceType.Object: 228 case ChatSourceType.Object:
@@ -248,8 +262,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
248 ScenePresence presence = s.GetScenePresence(targetID); 262 ScenePresence presence = s.GetScenePresence(targetID);
249 if (presence != null && !presence.IsChildAgent) 263 if (presence != null && !presence.IsChildAgent)
250 { 264 {
251 if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, ChatTypeEnum.Say, message, sourceType, true)) 265 ILandObject Presencecheck = s.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y);
252 receiverIDs.Add(presence.UUID); 266 if (Presencecheck != null)
267 {
268 // This will pass all chat from objects. Not
269 // perfect, but it will do. For now. Better
270 // than the prior behavior of muting all
271 // objects on a parcel with access restrictions
272 if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true)
273 {
274 if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix + fromName, c.Type, message, sourceType, false))
275 receiverIDs.Add(presence.UUID);
276 }
277 }
253 } 278 }
254 } 279 }
255 } 280 }
@@ -293,26 +318,29 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
293 } 318 }
294 319
295 // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType); 320 // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType);
296
297 HashSet<UUID> receiverIDs = new HashSet<UUID>(); 321 HashSet<UUID> receiverIDs = new HashSet<UUID>();
298 322
299 ((Scene)c.Scene).ForEachRootClient( 323 if (c.Scene != null)
300 delegate(IClientAPI client) 324 {
301 { 325 ((Scene)c.Scene).ForEachRootClient
302 // don't forward SayOwner chat from objects to 326 (
303 // non-owner agents 327 delegate(IClientAPI client)
304 if ((c.Type == ChatTypeEnum.Owner) && 328 {
305 (null != c.SenderObject) && 329 // don't forward SayOwner chat from objects to
306 (((SceneObjectPart)c.SenderObject).OwnerID != client.AgentId)) 330 // non-owner agents
307 return; 331 if ((c.Type == ChatTypeEnum.Owner) &&
308 332 (null != c.SenderObject) &&
309 client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID, 333 (((SceneObjectPart)c.SenderObject).OwnerID != client.AgentId))
310 (byte)sourceType, (byte)ChatAudibleLevel.Fully); 334 return;
311 receiverIDs.Add(client.AgentId); 335
312 }); 336 client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID,
313 337 (byte)sourceType, (byte)ChatAudibleLevel.Fully);
314 (c.Scene as Scene).EventManager.TriggerOnChatToClients( 338 receiverIDs.Add(client.AgentId);
315 fromID, receiverIDs, c.Message, cType, CenterOfRegion, fromName, sourceType, ChatAudibleLevel.Fully); 339 }
340 );
341 (c.Scene as Scene).EventManager.TriggerOnChatToClients(
342 fromID, receiverIDs, c.Message, cType, CenterOfRegion, fromName, sourceType, ChatAudibleLevel.Fully);
343 }
316 } 344 }
317 345
318 /// <summary> 346 /// <summary>
@@ -358,5 +386,35 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
358 386
359 return true; 387 return true;
360 } 388 }
389
390 Dictionary<UUID, System.Threading.Timer> Timers = new Dictionary<UUID, System.Threading.Timer>();
391 public void ParcelFreezeUser(IClientAPI client, UUID parcelowner, uint flags, UUID target)
392 {
393 System.Threading.Timer Timer;
394 if (flags == 0)
395 {
396 FreezeCache.Add(target.ToString());
397 System.Threading.TimerCallback timeCB = new System.Threading.TimerCallback(OnEndParcelFrozen);
398 Timer = new System.Threading.Timer(timeCB, target, 30000, 0);
399 Timers.Add(target, Timer);
400 }
401 else
402 {
403 FreezeCache.Remove(target.ToString());
404 Timers.TryGetValue(target, out Timer);
405 Timers.Remove(target);
406 Timer.Dispose();
407 }
408 }
409
410 private void OnEndParcelFrozen(object avatar)
411 {
412 UUID target = (UUID)avatar;
413 FreezeCache.Remove(target.ToString());
414 System.Threading.Timer Timer;
415 Timers.TryGetValue(target, out Timer);
416 Timers.Remove(target);
417 Timer.Dispose();
418 }
361 } 419 }
362} 420}
diff --git a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
index 325067c..3c294bb 100644
--- a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
@@ -216,4 +216,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
216 return result; 216 return result;
217 } 217 }
218 } 218 }
219} \ No newline at end of file 219}
diff --git a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs
index 2e3312f..1492302 100644
--- a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs
@@ -31,16 +31,40 @@ using OpenMetaverse;
31using OpenSim.Framework; 31using OpenSim.Framework;
32using OpenSim.Region.Framework.Scenes; 32using OpenSim.Region.Framework.Scenes;
33using OpenSim.Region.Framework.Interfaces; 33using OpenSim.Region.Framework.Interfaces;
34using System;
35using System.Reflection;
36using System.Collections;
37using System.Collections.Specialized;
38using System.Reflection;
39using System.IO;
40using System.Web;
41using System.Xml;
42using log4net;
43using Mono.Addins;
44using OpenMetaverse.Messages.Linden;
45using OpenMetaverse.StructuredData;
46using OpenSim.Framework.Capabilities;
47using OpenSim.Framework.Servers;
48using OpenSim.Framework.Servers.HttpServer;
49using Caps = OpenSim.Framework.Capabilities.Caps;
50using OSDArray = OpenMetaverse.StructuredData.OSDArray;
51using OSDMap = OpenMetaverse.StructuredData.OSDMap;
34 52
35namespace OpenSim.Region.CoreModules.Avatar.Gods 53namespace OpenSim.Region.CoreModules.Avatar.Gods
36{ 54{
37 public class GodsModule : IRegionModule, IGodsModule 55 public class GodsModule : IRegionModule, IGodsModule
38 { 56 {
57 private static readonly ILog m_log =
58 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
59
39 /// <summary>Special UUID for actions that apply to all agents</summary> 60 /// <summary>Special UUID for actions that apply to all agents</summary>
40 private static readonly UUID ALL_AGENTS = new UUID("44e87126-e794-4ded-05b3-7c42da3d5cdb"); 61 private static readonly UUID ALL_AGENTS = new UUID("44e87126-e794-4ded-05b3-7c42da3d5cdb");
41 62
42 protected Scene m_scene; 63 protected Scene m_scene;
43 protected IDialogModule m_dialogModule; 64 protected IDialogModule m_dialogModule;
65
66 protected Dictionary<UUID, string> m_capsDict =
67 new Dictionary<UUID, string>();
44 68
45 public void Initialise(Scene scene, IConfigSource source) 69 public void Initialise(Scene scene, IConfigSource source)
46 { 70 {
@@ -48,6 +72,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods
48 m_dialogModule = m_scene.RequestModuleInterface<IDialogModule>(); 72 m_dialogModule = m_scene.RequestModuleInterface<IDialogModule>();
49 m_scene.RegisterModuleInterface<IGodsModule>(this); 73 m_scene.RegisterModuleInterface<IGodsModule>(this);
50 m_scene.EventManager.OnNewClient += SubscribeToClientEvents; 74 m_scene.EventManager.OnNewClient += SubscribeToClientEvents;
75 m_scene.EventManager.OnRegisterCaps += OnRegisterCaps;
76 m_scene.EventManager.OnClientClosed += OnClientClosed;
77 scene.EventManager.OnIncomingInstantMessage +=
78 OnIncomingInstantMessage;
51 } 79 }
52 80
53 public void PostInitialise() {} 81 public void PostInitialise() {}
@@ -67,6 +95,54 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods
67 client.OnRequestGodlikePowers -= RequestGodlikePowers; 95 client.OnRequestGodlikePowers -= RequestGodlikePowers;
68 } 96 }
69 97
98 private void OnClientClosed(UUID agentID, Scene scene)
99 {
100 m_capsDict.Remove(agentID);
101 }
102
103 private void OnRegisterCaps(UUID agentID, Caps caps)
104 {
105 string uri = "/CAPS/" + UUID.Random();
106 m_capsDict[agentID] = uri;
107
108 caps.RegisterHandler("UntrustedSimulatorMessage",
109 new RestStreamHandler("POST", uri,
110 HandleUntrustedSimulatorMessage));
111 }
112
113 private string HandleUntrustedSimulatorMessage(string request,
114 string path, string param, IOSHttpRequest httpRequest,
115 IOSHttpResponse httpResponse)
116 {
117 OSDMap osd = (OSDMap)OSDParser.DeserializeLLSDXml(request);
118
119 string message = osd["message"].AsString();
120
121 if (message == "GodKickUser")
122 {
123 OSDMap body = (OSDMap)osd["body"];
124 OSDArray userInfo = (OSDArray)body["UserInfo"];
125 OSDMap userData = (OSDMap)userInfo[0];
126
127 UUID agentID = userData["AgentID"].AsUUID();
128 UUID godID = userData["GodID"].AsUUID();
129 UUID godSessionID = userData["GodSessionID"].AsUUID();
130 uint kickFlags = userData["KickFlags"].AsUInteger();
131 string reason = userData["Reason"].AsString();
132
133 ScenePresence god = m_scene.GetScenePresence(godID);
134 if (god == null || god.ControllingClient.SessionId != godSessionID)
135 return String.Empty;
136
137 KickUser(godID, godSessionID, agentID, kickFlags, Util.StringToBytes1024(reason));
138 }
139 else
140 {
141 m_log.ErrorFormat("[GOD]: Unhandled UntrustedSimulatorMessage: {0}", message);
142 }
143 return String.Empty;
144 }
145
70 public void RequestGodlikePowers( 146 public void RequestGodlikePowers(
71 UUID agentID, UUID sessionID, UUID token, bool godLike, IClientAPI controllingClient) 147 UUID agentID, UUID sessionID, UUID token, bool godLike, IClientAPI controllingClient)
72 { 148 {
@@ -115,69 +191,85 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods
115 /// <param name="reason">The message to send to the user after it's been turned into a field</param> 191 /// <param name="reason">The message to send to the user after it's been turned into a field</param>
116 public void KickUser(UUID godID, UUID sessionID, UUID agentID, uint kickflags, byte[] reason) 192 public void KickUser(UUID godID, UUID sessionID, UUID agentID, uint kickflags, byte[] reason)
117 { 193 {
118 UUID kickUserID = ALL_AGENTS; 194 if (!m_scene.Permissions.IsGod(godID))
119 195 return;
196
120 ScenePresence sp = m_scene.GetScenePresence(agentID); 197 ScenePresence sp = m_scene.GetScenePresence(agentID);
121 198
122 if (sp != null || agentID == kickUserID) 199 if (sp == null && agentID != ALL_AGENTS)
123 { 200 {
124 if (m_scene.Permissions.IsGod(godID)) 201 IMessageTransferModule transferModule =
202 m_scene.RequestModuleInterface<IMessageTransferModule>();
203 if (transferModule != null)
125 { 204 {
126 if (kickflags == 0) 205 m_log.DebugFormat("[GODS]: Sending nonlocal kill for agent {0}", agentID);
127 { 206 transferModule.SendInstantMessage(new GridInstantMessage(
128 if (agentID == kickUserID) 207 m_scene, godID, "God", agentID, (byte)250, false,
129 { 208 Utils.BytesToString(reason), UUID.Zero, true,
130 string reasonStr = Utils.BytesToString(reason); 209 new Vector3(), new byte[] {(byte)kickflags}),
131 210 delegate(bool success) {} );
132 m_scene.ForEachClient( 211 }
133 delegate(IClientAPI controller) 212 return;
134 { 213 }
135 if (controller.AgentId != godID)
136 controller.Kick(reasonStr);
137 }
138 );
139
140 // This is a bit crude. It seems the client will be null before it actually stops the thread
141 // The thread will kill itself eventually :/
142 // Is there another way to make sure *all* clients get this 'inter region' message?
143 m_scene.ForEachRootClient(
144 delegate(IClientAPI client)
145 {
146 if (client.AgentId != godID)
147 {
148 client.Close();
149 }
150 }
151 );
152 }
153 else
154 {
155 m_scene.SceneGraph.removeUserCount(!sp.IsChildAgent);
156 214
157 sp.ControllingClient.Kick(Utils.BytesToString(reason)); 215 switch (kickflags)
158 sp.ControllingClient.Close(); 216 {
159 } 217 case 0:
160 } 218 if (sp != null)
161 219 {
162 if (kickflags == 1) 220 KickPresence(sp, Utils.BytesToString(reason));
163 {
164 sp.AllowMovement = false;
165 m_dialogModule.SendAlertToUser(agentID, Utils.BytesToString(reason));
166 m_dialogModule.SendAlertToUser(godID, "User Frozen");
167 }
168
169 if (kickflags == 2)
170 {
171 sp.AllowMovement = true;
172 m_dialogModule.SendAlertToUser(agentID, Utils.BytesToString(reason));
173 m_dialogModule.SendAlertToUser(godID, "User Unfrozen");
174 }
175 } 221 }
176 else 222 else if (agentID == ALL_AGENTS)
177 { 223 {
178 m_dialogModule.SendAlertToUser(godID, "Kick request denied"); 224 m_scene.ForEachRootScenePresence(
225 delegate(ScenePresence p)
226 {
227 if (p.UUID != godID && (!m_scene.Permissions.IsGod(p.UUID)))
228 KickPresence(p, Utils.BytesToString(reason));
229 }
230 );
179 } 231 }
232 break;
233 case 1:
234 if (sp != null)
235 {
236 sp.AllowMovement = false;
237 m_dialogModule.SendAlertToUser(agentID, Utils.BytesToString(reason));
238 m_dialogModule.SendAlertToUser(godID, "User Frozen");
239 }
240 break;
241 case 2:
242 if (sp != null)
243 {
244 sp.AllowMovement = true;
245 m_dialogModule.SendAlertToUser(agentID, Utils.BytesToString(reason));
246 m_dialogModule.SendAlertToUser(godID, "User Unfrozen");
247 }
248 break;
249 default:
250 break;
251 }
252 }
253
254 private void KickPresence(ScenePresence sp, string reason)
255 {
256 if (sp.IsChildAgent)
257 return;
258 sp.ControllingClient.Kick(reason);
259 sp.Scene.IncomingCloseAgent(sp.UUID);
260 }
261
262 private void OnIncomingInstantMessage(GridInstantMessage msg)
263 {
264 if (msg.dialog == (uint)250) // Nonlocal kick
265 {
266 UUID agentID = new UUID(msg.toAgentID);
267 string reason = msg.message;
268 UUID godID = new UUID(msg.fromAgentID);
269 uint kickMode = (uint)msg.binaryBucket[0];
270
271 KickUser(godID, UUID.Zero, agentID, kickMode, Util.StringToBytes1024(reason));
180 } 272 }
181 } 273 }
182 } 274 }
183} \ No newline at end of file 275}
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs
index ca5d485..727f1c9 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs
@@ -27,6 +27,7 @@
27using System; 27using System;
28using System.Collections.Generic; 28using System.Collections.Generic;
29using System.Reflection; 29using System.Reflection;
30using System.Timers;
30using log4net; 31using log4net;
31using Nini.Config; 32using Nini.Config;
32using OpenMetaverse; 33using OpenMetaverse;
@@ -42,6 +43,10 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
42 private static readonly ILog m_log = LogManager.GetLogger( 43 private static readonly ILog m_log = LogManager.GetLogger(
43 MethodBase.GetCurrentMethod().DeclaringType); 44 MethodBase.GetCurrentMethod().DeclaringType);
44 45
46 private Timer m_logTimer = new Timer(10000);
47 private List<GridInstantMessage> m_logData = new List<GridInstantMessage>();
48 private string m_restUrl;
49
45 /// <value> 50 /// <value>
46 /// Is this module enabled? 51 /// Is this module enabled?
47 /// </value> 52 /// </value>
@@ -61,9 +66,12 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
61 "InstantMessageModule", "InstantMessageModule") != 66 "InstantMessageModule", "InstantMessageModule") !=
62 "InstantMessageModule") 67 "InstantMessageModule")
63 return; 68 return;
69 m_restUrl = config.Configs["Messaging"].GetString("LogURL", String.Empty);
64 } 70 }
65 71
66 m_enabled = true; 72 m_enabled = true;
73 m_logTimer.AutoReset = false;
74 m_logTimer.Elapsed += LogTimerElapsed;
67 } 75 }
68 76
69 public void AddRegion(Scene scene) 77 public void AddRegion(Scene scene)
@@ -148,6 +156,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
148 { 156 {
149 byte dialog = im.dialog; 157 byte dialog = im.dialog;
150 158
159 if (client != null && dialog == (byte)InstantMessageDialog.MessageFromAgent)
160 LogInstantMesssage(im);
161
151 if (dialog != (byte)InstantMessageDialog.MessageFromAgent 162 if (dialog != (byte)InstantMessageDialog.MessageFromAgent
152 && dialog != (byte)InstantMessageDialog.StartTyping 163 && dialog != (byte)InstantMessageDialog.StartTyping
153 && dialog != (byte)InstantMessageDialog.StopTyping 164 && dialog != (byte)InstantMessageDialog.StopTyping
@@ -157,6 +168,32 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
157 return; 168 return;
158 } 169 }
159 170
171 //DateTime dt = DateTime.UtcNow;
172
173 // Ticks from UtcNow, but make it look like local. Evil, huh?
174 //dt = DateTime.SpecifyKind(dt, DateTimeKind.Local);
175
176 //try
177 //{
178 // // Convert that to the PST timezone
179 // TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("America/Los_Angeles");
180 // dt = TimeZoneInfo.ConvertTime(dt, timeZoneInfo);
181 //}
182 //catch
183 //{
184 // //m_log.Info("[OFFLINE MESSAGING]: No PST timezone found on this machine. Saving with local timestamp.");
185 //}
186
187 //// And make it look local again to fool the unix time util
188 //dt = DateTime.SpecifyKind(dt, DateTimeKind.Utc);
189
190 // If client is null, this message comes from storage and IS offline
191 if (client != null)
192 im.offline = 0;
193
194 if (im.offline == 0)
195 im.timestamp = (uint)Util.UnixTimeSinceEpoch();
196
160 if (m_TransferModule != null) 197 if (m_TransferModule != null)
161 { 198 {
162 if (client != null) 199 if (client != null)
@@ -200,5 +237,35 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
200 // 237 //
201 OnInstantMessage(null, msg); 238 OnInstantMessage(null, msg);
202 } 239 }
240
241 private void LogInstantMesssage(GridInstantMessage im)
242 {
243 if (m_logData.Count < 20)
244 {
245 // Restart the log write timer
246 m_logTimer.Stop();
247 }
248 if (!m_logTimer.Enabled)
249 m_logTimer.Start();
250
251 lock (m_logData)
252 {
253 m_logData.Add(im);
254 }
255 }
256
257 private void LogTimerElapsed(object source, ElapsedEventArgs e)
258 {
259 lock (m_logData)
260 {
261 if (m_restUrl != String.Empty && m_logData.Count > 0)
262 {
263 bool success = SynchronousRestObjectRequester.MakeRequest<List<GridInstantMessage>, bool>("POST", m_restUrl + "/LogMessages/", m_logData);
264 if (!success)
265 m_log.ErrorFormat("[INSTANT MESSAGE]: Failed to save log data");
266 }
267 m_logData.Clear();
268 }
269 }
203 } 270 }
204} 271}
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
index 0dad3c4..6064ddc 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
@@ -48,6 +48,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49 49
50 private bool m_Enabled = false; 50 private bool m_Enabled = false;
51 protected string m_MessageKey = String.Empty;
51 protected List<Scene> m_Scenes = new List<Scene>(); 52 protected List<Scene> m_Scenes = new List<Scene>();
52 protected Dictionary<UUID, UUID> m_UserRegionMap = new Dictionary<UUID, UUID>(); 53 protected Dictionary<UUID, UUID> m_UserRegionMap = new Dictionary<UUID, UUID>();
53 54
@@ -67,14 +68,17 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
67 public virtual void Initialise(IConfigSource config) 68 public virtual void Initialise(IConfigSource config)
68 { 69 {
69 IConfig cnf = config.Configs["Messaging"]; 70 IConfig cnf = config.Configs["Messaging"];
70 if (cnf != null && cnf.GetString( 71 if (cnf != null)
71 "MessageTransferModule", "MessageTransferModule") !=
72 "MessageTransferModule")
73 { 72 {
74 m_log.Debug("[MESSAGE TRANSFER]: Disabled by configuration"); 73 if (cnf.GetString("MessageTransferModule",
75 return; 74 "MessageTransferModule") != "MessageTransferModule")
76 } 75 {
76 return;
77 }
77 78
79 m_MessageKey = cnf.GetString("MessageKey", String.Empty);
80 }
81 m_log.Debug("[MESSAGE TRANSFER]: Module enabled");
78 m_Enabled = true; 82 m_Enabled = true;
79 } 83 }
80 84
@@ -244,6 +248,19 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
244 && requestData.ContainsKey("position_z") && requestData.ContainsKey("region_id") 248 && requestData.ContainsKey("position_z") && requestData.ContainsKey("region_id")
245 && requestData.ContainsKey("binary_bucket")) 249 && requestData.ContainsKey("binary_bucket"))
246 { 250 {
251 if (m_MessageKey != String.Empty)
252 {
253 XmlRpcResponse error_resp = new XmlRpcResponse();
254 Hashtable error_respdata = new Hashtable();
255 error_respdata["success"] = "FALSE";
256 error_resp.Value = error_respdata;
257
258 if (!requestData.Contains("message_key"))
259 return error_resp;
260 if (m_MessageKey != (string)requestData["message_key"])
261 return error_resp;
262 }
263
247 // Do the easy way of validating the UUIDs 264 // Do the easy way of validating the UUIDs
248 UUID.TryParse((string)requestData["from_agent_id"], out fromAgentID); 265 UUID.TryParse((string)requestData["from_agent_id"], out fromAgentID);
249 UUID.TryParse((string)requestData["to_agent_id"], out toAgentID); 266 UUID.TryParse((string)requestData["to_agent_id"], out toAgentID);
@@ -420,24 +437,37 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
420 return resp; 437 return resp;
421 } 438 }
422 439
423 /// <summary> 440 private delegate void GridInstantMessageDelegate(GridInstantMessage im, MessageResultNotification result);
424 /// delegate for sending a grid instant message asynchronously
425 /// </summary>
426 public delegate void GridInstantMessageDelegate(GridInstantMessage im, MessageResultNotification result, UUID prevRegionID);
427 441
428 protected virtual void GridInstantMessageCompleted(IAsyncResult iar) 442 private class GIM {
429 { 443 public GridInstantMessage im;
430 GridInstantMessageDelegate icon = 444 public MessageResultNotification result;
431 (GridInstantMessageDelegate)iar.AsyncState; 445 };
432 icon.EndInvoke(iar);
433 }
434 446
447 private Queue<GIM> pendingInstantMessages = new Queue<GIM>();
448 private int numInstantMessageThreads = 0;
435 449
436 protected virtual void SendGridInstantMessageViaXMLRPC(GridInstantMessage im, MessageResultNotification result) 450 private void SendGridInstantMessageViaXMLRPC(GridInstantMessage im, MessageResultNotification result)
437 { 451 {
438 GridInstantMessageDelegate d = SendGridInstantMessageViaXMLRPCAsync; 452 lock (pendingInstantMessages) {
453 if (numInstantMessageThreads >= 4) {
454 GIM gim = new GIM();
455 gim.im = im;
456 gim.result = result;
457 pendingInstantMessages.Enqueue(gim);
458 } else {
459 ++ numInstantMessageThreads;
460 //m_log.DebugFormat("[SendGridInstantMessageViaXMLRPC]: ++numInstantMessageThreads={0}", numInstantMessageThreads);
461 GridInstantMessageDelegate d = SendGridInstantMessageViaXMLRPCAsyncMain;
462 d.BeginInvoke(im, result, GridInstantMessageCompleted, d);
463 }
464 }
465 }
439 466
440 d.BeginInvoke(im, result, UUID.Zero, GridInstantMessageCompleted, d); 467 private void GridInstantMessageCompleted(IAsyncResult iar)
468 {
469 GridInstantMessageDelegate d = (GridInstantMessageDelegate)iar.AsyncState;
470 d.EndInvoke(iar);
441 } 471 }
442 472
443 /// <summary> 473 /// <summary>
@@ -452,8 +482,31 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
452 /// Pass in 0 the first time this method is called. It will be called recursively with the last 482 /// Pass in 0 the first time this method is called. It will be called recursively with the last
453 /// regionhandle tried 483 /// regionhandle tried
454 /// </param> 484 /// </param>
455 protected virtual void SendGridInstantMessageViaXMLRPCAsync(GridInstantMessage im, MessageResultNotification result, UUID prevRegionID) 485 private void SendGridInstantMessageViaXMLRPCAsyncMain(GridInstantMessage im, MessageResultNotification result)
456 { 486 {
487 GIM gim;
488 do {
489 try {
490 SendGridInstantMessageViaXMLRPCAsync(im, result, UUID.Zero);
491 } catch (Exception e) {
492 m_log.Error("[SendGridInstantMessageViaXMLRPC]: exception " + e.Message);
493 }
494 lock (pendingInstantMessages) {
495 if (pendingInstantMessages.Count > 0) {
496 gim = pendingInstantMessages.Dequeue();
497 im = gim.im;
498 result = gim.result;
499 } else {
500 gim = null;
501 -- numInstantMessageThreads;
502 //m_log.DebugFormat("[SendGridInstantMessageViaXMLRPC]: --numInstantMessageThreads={0}", numInstantMessageThreads);
503 }
504 }
505 } while (gim != null);
506 }
507 private void SendGridInstantMessageViaXMLRPCAsync(GridInstantMessage im, MessageResultNotification result, UUID prevRegionID)
508 {
509
457 UUID toAgentID = new UUID(im.toAgentID); 510 UUID toAgentID = new UUID(im.toAgentID);
458 511
459 PresenceInfo upd = null; 512 PresenceInfo upd = null;
@@ -520,7 +573,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
520 573
521 if (upd != null) 574 if (upd != null)
522 { 575 {
523 GridRegion reginfo = m_Scenes[0].GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, 576 GridRegion reginfo = m_Scenes[0].GridService.GetRegionByUUID(UUID.Zero,
524 upd.RegionID); 577 upd.RegionID);
525 if (reginfo != null) 578 if (reginfo != null)
526 { 579 {
@@ -669,6 +722,8 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
669 gim["position_z"] = msg.Position.Z.ToString(); 722 gim["position_z"] = msg.Position.Z.ToString();
670 gim["region_id"] = msg.RegionID.ToString(); 723 gim["region_id"] = msg.RegionID.ToString();
671 gim["binary_bucket"] = Convert.ToBase64String(msg.binaryBucket,Base64FormattingOptions.None); 724 gim["binary_bucket"] = Convert.ToBase64String(msg.binaryBucket,Base64FormattingOptions.None);
725 if (m_MessageKey != String.Empty)
726 gim["message_key"] = m_MessageKey;
672 return gim; 727 return gim;
673 } 728 }
674 729
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs
index de25048..b27b07d 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs
@@ -171,7 +171,11 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
171 171
172 private void RetrieveInstantMessages(IClientAPI client) 172 private void RetrieveInstantMessages(IClientAPI client)
173 { 173 {
174 if (m_RestURL != "") 174 if (m_RestURL == String.Empty)
175 {
176 return;
177 }
178 else
175 { 179 {
176 m_log.DebugFormat("[OFFLINE MESSAGING]: Retrieving stored messages for {0}", client.AgentId); 180 m_log.DebugFormat("[OFFLINE MESSAGING]: Retrieving stored messages for {0}", client.AgentId);
177 181
@@ -179,22 +183,25 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
179 = SynchronousRestObjectRequester.MakeRequest<UUID, List<GridInstantMessage>>( 183 = SynchronousRestObjectRequester.MakeRequest<UUID, List<GridInstantMessage>>(
180 "POST", m_RestURL + "/RetrieveMessages/", client.AgentId); 184 "POST", m_RestURL + "/RetrieveMessages/", client.AgentId);
181 185
182 if (msglist == null) 186 if (msglist != null)
183 m_log.WarnFormat("[OFFLINE MESSAGING]: WARNING null message list.");
184
185 foreach (GridInstantMessage im in msglist)
186 { 187 {
187 // client.SendInstantMessage(im); 188 foreach (GridInstantMessage im in msglist)
188 189 {
189 // Send through scene event manager so all modules get a chance 190 // client.SendInstantMessage(im);
190 // to look at this message before it gets delivered. 191
191 // 192 // Send through scene event manager so all modules get a chance
192 // Needed for proper state management for stored group 193 // to look at this message before it gets delivered.
193 // invitations 194 //
194 // 195 // Needed for proper state management for stored group
195 Scene s = FindScene(client.AgentId); 196 // invitations
196 if (s != null) 197 //
197 s.EventManager.TriggerIncomingInstantMessage(im); 198
199 im.offline = 1;
200
201 Scene s = FindScene(client.AgentId);
202 if (s != null)
203 s.EventManager.TriggerIncomingInstantMessage(im);
204 }
198 } 205 }
199 } 206 }
200 } 207 }
@@ -205,24 +212,19 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
205 im.dialog != (byte)InstantMessageDialog.MessageFromAgent && 212 im.dialog != (byte)InstantMessageDialog.MessageFromAgent &&
206 im.dialog != (byte)InstantMessageDialog.GroupNotice && 213 im.dialog != (byte)InstantMessageDialog.GroupNotice &&
207 im.dialog != (byte)InstantMessageDialog.GroupInvitation && 214 im.dialog != (byte)InstantMessageDialog.GroupInvitation &&
208 im.dialog != (byte)InstantMessageDialog.InventoryOffered) 215 im.dialog != (byte)InstantMessageDialog.InventoryOffered &&
216 im.dialog != (byte)InstantMessageDialog.TaskInventoryOffered)
209 { 217 {
210 return; 218 return;
211 } 219 }
212 220
213 if (!m_ForwardOfflineGroupMessages)
214 {
215 if (im.dialog == (byte)InstantMessageDialog.GroupNotice ||
216 im.dialog != (byte)InstantMessageDialog.GroupInvitation)
217 return;
218 }
219
220 Scene scene = FindScene(new UUID(im.fromAgentID)); 221 Scene scene = FindScene(new UUID(im.fromAgentID));
221 if (scene == null) 222 if (scene == null)
222 scene = m_SceneList[0]; 223 scene = m_SceneList[0];
223 224
224 bool success = SynchronousRestObjectRequester.MakeRequest<GridInstantMessage, bool>( 225 bool success = SynchronousRestObjectRequester.MakeRequest<GridInstantMessage, bool>(
225 "POST", m_RestURL+"/SaveMessage/", im); 226 "POST", m_RestURL+"/SaveMessage/?scope=" +
227 scene.RegionInfo.ScopeID.ToString(), im);
226 228
227 if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent) 229 if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent)
228 { 230 {
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
index ee10d04..0833154 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
@@ -635,4 +635,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
635 m_assetsLoaded = true; 635 m_assetsLoaded = true;
636 } 636 }
637 } 637 }
638} \ No newline at end of file 638}
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
index 19c774f..80554fb 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
@@ -175,8 +175,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
175 if (im.binaryBucket.Length < 17) // Invalid 175 if (im.binaryBucket.Length < 17) // Invalid
176 return; 176 return;
177 177
178 UUID receipientID = new UUID(im.toAgentID); 178 UUID recipientID = new UUID(im.toAgentID);
179 ScenePresence user = scene.GetScenePresence(receipientID); 179 ScenePresence user = scene.GetScenePresence(recipientID);
180 UUID copyID; 180 UUID copyID;
181 181
182 // First byte is the asset type 182 // First byte is the asset type
@@ -191,7 +191,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
191 folderID, new UUID(im.toAgentID)); 191 folderID, new UUID(im.toAgentID));
192 192
193 InventoryFolderBase folderCopy 193 InventoryFolderBase folderCopy
194 = scene.GiveInventoryFolder(receipientID, client.AgentId, folderID, UUID.Zero); 194 = scene.GiveInventoryFolder(recipientID, client.AgentId, folderID, UUID.Zero);
195 195
196 if (folderCopy == null) 196 if (folderCopy == null)
197 { 197 {
@@ -244,6 +244,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
244 im.imSessionID = itemID.Guid; 244 im.imSessionID = itemID.Guid;
245 } 245 }
246 246
247 im.offline = 0;
248
247 // Send the IM to the recipient. The item is already 249 // Send the IM to the recipient. The item is already
248 // in their inventory, so it will not be lost if 250 // in their inventory, so it will not be lost if
249 // they are offline. 251 // they are offline.
@@ -263,8 +265,42 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
263 }); 265 });
264 } 266 }
265 } 267 }
266 else if (im.dialog == (byte) InstantMessageDialog.InventoryAccepted) 268 else if (im.dialog == (byte) InstantMessageDialog.InventoryAccepted ||
269 im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted)
267 { 270 {
271 UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
272 IInventoryService invService = scene.InventoryService;
273
274 // Special case: folder redirect.
275 // RLV uses this
276 if (im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted)
277 {
278 InventoryFolderBase folder = new InventoryFolderBase(inventoryID, client.AgentId);
279 folder = invService.GetFolder(folder);
280
281 if (folder != null)
282 {
283 if (im.binaryBucket.Length >= 16)
284 {
285 UUID destFolderID = new UUID(im.binaryBucket, 0);
286 if (destFolderID != UUID.Zero)
287 {
288 InventoryFolderBase destFolder = new InventoryFolderBase(destFolderID, client.AgentId);
289 destFolder = invService.GetFolder(destFolder);
290 if (destFolder != null)
291 {
292 if (folder.ParentID != destFolder.ID)
293 {
294 folder.ParentID = destFolder.ID;
295 invService.MoveFolder(folder);
296 client.SendBulkUpdateInventory(folder);
297 }
298 }
299 }
300 }
301 }
302 }
303
268 ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID)); 304 ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID));
269 305
270 if (user != null) // Local 306 if (user != null) // Local
@@ -274,30 +310,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
274 else 310 else
275 { 311 {
276 if (m_TransferModule != null) 312 if (m_TransferModule != null)
277 m_TransferModule.SendInstantMessage(im, delegate(bool success) { 313 m_TransferModule.SendInstantMessage(im, delegate(bool success) {});
278
279 // justincc - FIXME: Comment out for now. This code was added in commit db91044 Mon Aug 22 2011
280 // and is apparently supposed to fix bulk inventory updates after accepting items. But
281 // instead it appears to cause two copies of an accepted folder for the receiving user in
282 // at least some cases. Folder/item update is already done when the offer is made (see code above)
283
284// // Send BulkUpdateInventory
285// IInventoryService invService = scene.InventoryService;
286// UUID inventoryEntityID = new UUID(im.imSessionID); // The inventory item /folder, back from it's trip
287//
288// InventoryFolderBase folder = new InventoryFolderBase(inventoryEntityID, client.AgentId);
289// folder = invService.GetFolder(folder);
290//
291// ScenePresence fromUser = scene.GetScenePresence(new UUID(im.fromAgentID));
292//
293// // If the user has left the scene by the time the message comes back then we can't send
294// // them the update.
295// if (fromUser != null)
296// fromUser.ControllingClient.SendBulkUpdateInventory(folder);
297 });
298 } 314 }
299 } 315 }
300 else if (im.dialog == (byte) InstantMessageDialog.InventoryDeclined) 316 else if (im.dialog == (byte) InstantMessageDialog.InventoryDeclined ||
317 im.dialog == (byte) InstantMessageDialog.TaskInventoryDeclined)
301 { 318 {
302 // Here, the recipient is local and we can assume that the 319 // Here, the recipient is local and we can assume that the
303 // inventory is loaded. Courtesy of the above bulk update, 320 // inventory is loaded. Courtesy of the above bulk update,
@@ -333,6 +350,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
333 { 350 {
334 folder.ParentID = trashFolder.ID; 351 folder.ParentID = trashFolder.ID;
335 invService.MoveFolder(folder); 352 invService.MoveFolder(folder);
353 client.SendBulkUpdateInventory(folder);
336 } 354 }
337 } 355 }
338 356
@@ -433,22 +451,113 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
433 /// 451 ///
434 /// </summary> 452 /// </summary>
435 /// <param name="msg"></param> 453 /// <param name="msg"></param>
436 private void OnGridInstantMessage(GridInstantMessage msg) 454 private void OnGridInstantMessage(GridInstantMessage im)
437 { 455 {
438 // Check if this is ours to handle 456 // Check if this is ours to handle
439 // 457 //
440 Scene scene = FindClientScene(new UUID(msg.toAgentID)); 458 Scene scene = FindClientScene(new UUID(im.toAgentID));
441 459
442 if (scene == null) 460 if (scene == null)
443 return; 461 return;
444 462
445 // Find agent to deliver to 463 // Find agent to deliver to
446 // 464 //
447 ScenePresence user = scene.GetScenePresence(new UUID(msg.toAgentID)); 465 ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID));
466 if (user == null)
467 return;
468
469 // This requires a little bit of processing because we have to make the
470 // new item visible in the recipient's inventory here
471 //
472 if (im.dialog == (byte) InstantMessageDialog.InventoryOffered)
473 {
474 if (im.binaryBucket.Length < 17) // Invalid
475 return;
476
477 UUID recipientID = new UUID(im.toAgentID);
478
479 // First byte is the asset type
480 AssetType assetType = (AssetType)im.binaryBucket[0];
481
482 if (AssetType.Folder == assetType)
483 {
484 UUID folderID = new UUID(im.binaryBucket, 1);
448 485
449 // Just forward to local handling 486 InventoryFolderBase given =
450 OnInstantMessage(user.ControllingClient, msg); 487 new InventoryFolderBase(folderID, recipientID);
488 InventoryFolderBase folder =
489 scene.InventoryService.GetFolder(given);
451 490
491 if (folder != null)
492 user.ControllingClient.SendBulkUpdateInventory(folder);
493 }
494 else
495 {
496 UUID itemID = new UUID(im.binaryBucket, 1);
497
498 InventoryItemBase given =
499 new InventoryItemBase(itemID, recipientID);
500 InventoryItemBase item =
501 scene.InventoryService.GetItem(given);
502
503 if (item != null)
504 {
505 user.ControllingClient.SendBulkUpdateInventory(item);
506 }
507 }
508 user.ControllingClient.SendInstantMessage(im);
509 }
510 if (im.dialog == (byte) InstantMessageDialog.TaskInventoryOffered)
511 {
512 if (im.binaryBucket.Length < 1) // Invalid
513 return;
514
515 UUID recipientID = new UUID(im.toAgentID);
516
517 // Bucket is the asset type
518 AssetType assetType = (AssetType)im.binaryBucket[0];
519
520 if (AssetType.Folder == assetType)
521 {
522 UUID folderID = new UUID(im.imSessionID);
523
524 InventoryFolderBase given =
525 new InventoryFolderBase(folderID, recipientID);
526 InventoryFolderBase folder =
527 scene.InventoryService.GetFolder(given);
528
529 if (folder != null)
530 user.ControllingClient.SendBulkUpdateInventory(folder);
531 }
532 else
533 {
534 UUID itemID = new UUID(im.imSessionID);
535
536 InventoryItemBase given =
537 new InventoryItemBase(itemID, recipientID);
538 InventoryItemBase item =
539 scene.InventoryService.GetItem(given);
540
541 if (item != null)
542 {
543 user.ControllingClient.SendBulkUpdateInventory(item);
544 }
545 }
546
547 // Fix up binary bucket since this may be 17 chars long here
548 Byte[] bucket = new Byte[1];
549 bucket[0] = im.binaryBucket[0];
550 im.binaryBucket = bucket;
551
552 user.ControllingClient.SendInstantMessage(im);
553 }
554 else if (im.dialog == (byte) InstantMessageDialog.InventoryAccepted ||
555 im.dialog == (byte) InstantMessageDialog.InventoryDeclined ||
556 im.dialog == (byte) InstantMessageDialog.TaskInventoryDeclined ||
557 im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted)
558 {
559 user.ControllingClient.SendInstantMessage(im);
560 }
452 } 561 }
453 } 562 }
454} 563}
diff --git a/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs b/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs
index 2d4cffd..a889984 100644
--- a/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs
@@ -161,16 +161,29 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure
161 scene.RegionInfo.RegionHandle, 161 scene.RegionInfo.RegionHandle,
162 (uint)presence.AbsolutePosition.X, 162 (uint)presence.AbsolutePosition.X,
163 (uint)presence.AbsolutePosition.Y, 163 (uint)presence.AbsolutePosition.Y,
164 (uint)Math.Ceiling(presence.AbsolutePosition.Z)); 164 (uint)presence.AbsolutePosition.Z + 2);
165 165
166 m_log.DebugFormat("TP invite with message {0}", message); 166 m_log.DebugFormat("[LURE]: TP invite with message {0}", message);
167
168 GridInstantMessage m;
169
170 if (scene.Permissions.IsAdministrator(client.AgentId) && presence.GodLevel >= 200 && (!scene.Permissions.IsAdministrator(targetid)))
171 {
172 m = new GridInstantMessage(scene, client.AgentId,
173 client.FirstName+" "+client.LastName, targetid,
174 (byte)InstantMessageDialog.GodLikeRequestTeleport, false,
175 message, dest, false, presence.AbsolutePosition,
176 new Byte[0]);
177 }
178 else
179 {
180 m = new GridInstantMessage(scene, client.AgentId,
181 client.FirstName+" "+client.LastName, targetid,
182 (byte)InstantMessageDialog.RequestTeleport, false,
183 message, dest, false, presence.AbsolutePosition,
184 new Byte[0]);
185 }
167 186
168 GridInstantMessage m = new GridInstantMessage(scene, client.AgentId,
169 client.FirstName+" "+client.LastName, targetid,
170 (byte)InstantMessageDialog.RequestTeleport, false,
171 message, dest, false, presence.AbsolutePosition,
172 new Byte[0]);
173
174 if (m_TransferModule != null) 187 if (m_TransferModule != null)
175 { 188 {
176 m_TransferModule.SendInstantMessage(m, 189 m_TransferModule.SendInstantMessage(m,
@@ -205,7 +218,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure
205 { 218 {
206 // Forward remote teleport requests 219 // Forward remote teleport requests
207 // 220 //
208 if (msg.dialog != 22) 221 if (msg.dialog != (byte)InstantMessageDialog.RequestTeleport &&
222 msg.dialog != (byte)InstantMessageDialog.GodLikeRequestTeleport)
209 return; 223 return;
210 224
211 if (m_TransferModule != null) 225 if (m_TransferModule != null)
diff --git a/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs b/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs
index 4ea85a8..dbe75b5 100644
--- a/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs
@@ -102,7 +102,8 @@ namespace OpenSim.Region.CoreModules.Framework
102 102
103 public void CreateCaps(UUID agentId) 103 public void CreateCaps(UUID agentId)
104 { 104 {
105 if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId)) 105 int flags = m_scene.GetUserFlags(agentId);
106 if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId, flags))
106 return; 107 return;
107 108
108 String capsObjectPath = GetCapsPath(agentId); 109 String capsObjectPath = GetCapsPath(agentId);
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index fa9cd55..2b790f4 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -132,7 +132,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
132 132
133 protected virtual void OnNewClient(IClientAPI client) 133 protected virtual void OnNewClient(IClientAPI client)
134 { 134 {
135 client.OnTeleportHomeRequest += TeleportHome; 135 client.OnTeleportHomeRequest += TriggerTeleportHome;
136 client.OnTeleportLandmarkRequest += RequestTeleportLandmark; 136 client.OnTeleportLandmarkRequest += RequestTeleportLandmark;
137 } 137 }
138 138
@@ -210,6 +210,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
210 sp.ControllingClient.SendTeleportStart(teleportFlags); 210 sp.ControllingClient.SendTeleportStart(teleportFlags);
211 211
212 sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); 212 sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags);
213 sp.TeleportFlags = (Constants.TeleportFlags)teleportFlags;
213 sp.Teleport(position); 214 sp.Teleport(position);
214 215
215 foreach (SceneObjectGroup grp in sp.GetAttachments()) 216 foreach (SceneObjectGroup grp in sp.GetAttachments())
@@ -338,7 +339,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
338 // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, 339 // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field,
339 // it's actually doing a lot of work. 340 // it's actually doing a lot of work.
340 IPEndPoint endPoint = finalDestination.ExternalEndPoint; 341 IPEndPoint endPoint = finalDestination.ExternalEndPoint;
341 if (endPoint.Address != null) 342 if (endPoint != null && endPoint.Address != null)
342 { 343 {
343 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from 344 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from
344 // both regions 345 // both regions
@@ -655,7 +656,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
655 656
656 #region Teleport Home 657 #region Teleport Home
657 658
658 public virtual void TeleportHome(UUID id, IClientAPI client) 659 public virtual void TriggerTeleportHome(UUID id, IClientAPI client)
660 {
661 TeleportHome(id, client);
662 }
663
664 public virtual bool TeleportHome(UUID id, IClientAPI client)
659 { 665 {
660 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); 666 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName);
661 667
@@ -664,12 +670,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
664 670
665 if (uinfo != null) 671 if (uinfo != null)
666 { 672 {
673 if (uinfo.HomeRegionID == UUID.Zero)
674 {
675 // can't find the Home region: Tell viewer and abort
676 client.SendTeleportFailed("You don't have a home position set.");
677 return false;
678 }
667 GridRegion regionInfo = m_aScene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); 679 GridRegion regionInfo = m_aScene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID);
668 if (regionInfo == null) 680 if (regionInfo == null)
669 { 681 {
670 // can't find the Home region: Tell viewer and abort 682 // can't find the Home region: Tell viewer and abort
671 client.SendTeleportFailed("Your home region could not be found."); 683 client.SendTeleportFailed("Your home region could not be found.");
672 return; 684 return false;
673 } 685 }
674 686
675 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: User's home region is {0} {1} ({2}-{3})", 687 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: User's home region is {0} {1} ({2}-{3})",
@@ -680,6 +692,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
680 client, regionInfo.RegionHandle, uinfo.HomePosition, uinfo.HomeLookAt, 692 client, regionInfo.RegionHandle, uinfo.HomePosition, uinfo.HomeLookAt,
681 (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome)); 693 (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome));
682 } 694 }
695 else
696 {
697 // can't find the Home region: Tell viewer and abort
698 client.SendTeleportFailed("Your home region could not be found.");
699 return false;
700 }
701 return true;
683 } 702 }
684 703
685 #endregion 704 #endregion
@@ -687,11 +706,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
687 706
688 #region Agent Crossings 707 #region Agent Crossings
689 708
690 public bool Cross(ScenePresence agent, bool isFlying) 709 public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out uint xDest, out uint yDest, out string version, out Vector3 newpos)
691 { 710 {
692 Scene scene = agent.Scene; 711 version = String.Empty;
693 Vector3 pos = agent.AbsolutePosition; 712 newpos = new Vector3(pos.X, pos.Y, pos.Z);
694 Vector3 newpos = new Vector3(pos.X, pos.Y, pos.Z);
695 uint neighbourx = scene.RegionInfo.RegionLocX; 713 uint neighbourx = scene.RegionInfo.RegionLocX;
696 uint neighboury = scene.RegionInfo.RegionLocY; 714 uint neighboury = scene.RegionInfo.RegionLocY;
697 const float boundaryDistance = 1.7f; 715 const float boundaryDistance = 1.7f;
@@ -712,53 +730,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
712 } 730 }
713 else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) 731 else if (scene.TestBorderCross(pos + southCross, Cardinals.S))
714 { 732 {
715 Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S); 733 neighboury--;
716 if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0) 734 newpos.Y = Constants.RegionSize - enterDistance;
717 {
718 neighboury--;
719 newpos.Y = Constants.RegionSize - enterDistance;
720 }
721 else
722 {
723 agent.IsInTransit = true;
724
725 neighboury = b.TriggerRegionY;
726 neighbourx = b.TriggerRegionX;
727
728 Vector3 newposition = pos;
729 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
730 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
731 agent.ControllingClient.SendAgentAlertMessage(
732 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
733 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
734 return true;
735 }
736 }
737
738 Border ba = scene.GetCrossedBorder(pos + westCross, Cardinals.W);
739 if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0)
740 {
741 neighbourx--;
742 newpos.X = Constants.RegionSize - enterDistance;
743 } 735 }
744 else
745 {
746 agent.IsInTransit = true;
747
748 neighboury = ba.TriggerRegionY;
749 neighbourx = ba.TriggerRegionX;
750
751
752 Vector3 newposition = pos;
753 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
754 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
755 agent.ControllingClient.SendAgentAlertMessage(
756 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
757 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
758
759 736
760 return true; 737 neighbourx--;
761 } 738 newpos.X = Constants.RegionSize - enterDistance;
762 739
763 } 740 }
764 else if (scene.TestBorderCross(pos + eastCross, Cardinals.E)) 741 else if (scene.TestBorderCross(pos + eastCross, Cardinals.E))
@@ -769,26 +746,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
769 746
770 if (scene.TestBorderCross(pos + southCross, Cardinals.S)) 747 if (scene.TestBorderCross(pos + southCross, Cardinals.S))
771 { 748 {
772 Border ba = scene.GetCrossedBorder(pos + southCross, Cardinals.S); 749 neighboury--;
773 if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0) 750 newpos.Y = Constants.RegionSize - enterDistance;
774 {
775 neighboury--;
776 newpos.Y = Constants.RegionSize - enterDistance;
777 }
778 else
779 {
780 agent.IsInTransit = true;
781
782 neighboury = ba.TriggerRegionY;
783 neighbourx = ba.TriggerRegionX;
784 Vector3 newposition = pos;
785 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
786 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
787 agent.ControllingClient.SendAgentAlertMessage(
788 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
789 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
790 return true;
791 }
792 } 751 }
793 else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) 752 else if (scene.TestBorderCross(pos + northCross, Cardinals.N))
794 { 753 {
@@ -796,35 +755,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
796 neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize); 755 neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize);
797 newpos.Y = enterDistance; 756 newpos.Y = enterDistance;
798 } 757 }
799
800
801 } 758 }
802 else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) 759 else if (scene.TestBorderCross(pos + southCross, Cardinals.S))
803 { 760 {
804 Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S); 761 Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S);
805 if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0) 762 neighboury--;
806 { 763 newpos.Y = Constants.RegionSize - enterDistance;
807 neighboury--;
808 newpos.Y = Constants.RegionSize - enterDistance;
809 }
810 else
811 {
812 agent.IsInTransit = true;
813
814 neighboury = b.TriggerRegionY;
815 neighbourx = b.TriggerRegionX;
816 Vector3 newposition = pos;
817 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
818 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
819 agent.ControllingClient.SendAgentAlertMessage(
820 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
821 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
822 return true;
823 }
824 } 764 }
825 else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) 765 else if (scene.TestBorderCross(pos + northCross, Cardinals.N))
826 { 766 {
827
828 Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N); 767 Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N);
829 neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); 768 neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize);
830 newpos.Y = enterDistance; 769 newpos.Y = enterDistance;
@@ -855,19 +794,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
855 } 794 }
856 */ 795 */
857 796
858 ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); 797 xDest = neighbourx;
798 yDest = neighboury;
859 799
860 int x = (int)(neighbourx * Constants.RegionSize), y = (int)(neighboury * Constants.RegionSize); 800 int x = (int)(neighbourx * Constants.RegionSize), y = (int)(neighboury * Constants.RegionSize);
861 801
802 ulong neighbourHandle = Utils.UIntsToLong((uint)x, (uint)y);
803
862 ExpiringCache<ulong, DateTime> r; 804 ExpiringCache<ulong, DateTime> r;
863 DateTime banUntil; 805 DateTime banUntil;
864 806
865 if (m_bannedRegions.TryGetValue(agent.ControllingClient.AgentId, out r)) 807 if (m_bannedRegions.TryGetValue(agentID, out r))
866 { 808 {
867 if (r.TryGetValue(neighbourHandle, out banUntil)) 809 if (r.TryGetValue(neighbourHandle, out banUntil))
868 { 810 {
869 if (DateTime.Now < banUntil) 811 if (DateTime.Now < banUntil)
870 return false; 812 return null;
871 r.Remove(neighbourHandle); 813 r.Remove(neighbourHandle);
872 } 814 }
873 } 815 }
@@ -879,28 +821,43 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
879 GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); 821 GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
880 822
881 string reason; 823 string reason;
882 string version; 824 if (!scene.SimulationService.QueryAccess(neighbourRegion, agentID, newpos, out version, out reason))
883 if (!scene.SimulationService.QueryAccess(neighbourRegion, agent.ControllingClient.AgentId, newpos, out version, out reason))
884 { 825 {
885 agent.ControllingClient.SendAlertMessage("Cannot region cross into banned parcel");
886 if (r == null) 826 if (r == null)
887 { 827 {
888 r = new ExpiringCache<ulong, DateTime>(); 828 r = new ExpiringCache<ulong, DateTime>();
889 r.Add(neighbourHandle, DateTime.Now + TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15)); 829 r.Add(neighbourHandle, DateTime.Now + TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15));
890 830
891 m_bannedRegions.Add(agent.ControllingClient.AgentId, r, TimeSpan.FromSeconds(45)); 831 m_bannedRegions.Add(agentID, r, TimeSpan.FromSeconds(45));
892 } 832 }
893 else 833 else
894 { 834 {
895 r.Add(neighbourHandle, DateTime.Now + TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15)); 835 r.Add(neighbourHandle, DateTime.Now + TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15));
896 } 836 }
837 return null;
838 }
839
840 return neighbourRegion;
841 }
842
843 public bool Cross(ScenePresence agent, bool isFlying)
844 {
845 uint x;
846 uint y;
847 Vector3 newpos;
848 string version;
849
850 GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, agent.AbsolutePosition, out x, out y, out version, out newpos);
851 if (neighbourRegion == null)
852 {
853 agent.ControllingClient.SendAlertMessage("Cannot region cross into banned parcel");
897 return false; 854 return false;
898 } 855 }
899 856
900 agent.IsInTransit = true; 857 agent.IsInTransit = true;
901 858
902 CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync; 859 CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync;
903 d.BeginInvoke(agent, newpos, neighbourx, neighboury, neighbourRegion, isFlying, version, CrossAgentToNewRegionCompleted, d); 860 d.BeginInvoke(agent, newpos, x, y, neighbourRegion, isFlying, version, CrossAgentToNewRegionCompleted, d);
904 861
905 return true; 862 return true;
906 } 863 }
@@ -957,13 +914,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
957 icon.EndInvoke(iar); 914 icon.EndInvoke(iar);
958 } 915 }
959 916
960 public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, bool isFlying, string version);
961
962 /// <summary> 917 /// <summary>
963 /// This Closes child agents on neighbouring regions 918 /// This Closes child agents on neighbouring regions
964 /// Calls an asynchronous method to do so.. so it doesn't lag the sim. 919 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
965 /// </summary> 920 /// </summary>
966 protected ScenePresence CrossAgentToNewRegionAsync( 921 public ScenePresence CrossAgentToNewRegionAsync(
967 ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, 922 ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion,
968 bool isFlying, string version) 923 bool isFlying, string version)
969 { 924 {
@@ -1152,10 +1107,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1152 agent.Id0 = currentAgentCircuit.Id0; 1107 agent.Id0 = currentAgentCircuit.Id0;
1153 } 1108 }
1154 1109
1155 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; 1110 IPEndPoint external = region.ExternalEndPoint;
1156 d.BeginInvoke(sp, agent, region, region.ExternalEndPoint, true, 1111 if (external != null)
1112 {
1113 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
1114 d.BeginInvoke(sp, agent, region, external, true,
1157 InformClientOfNeighbourCompleted, 1115 InformClientOfNeighbourCompleted,
1158 d); 1116 d);
1117 }
1159 } 1118 }
1160 #endregion 1119 #endregion
1161 1120
@@ -1405,8 +1364,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1405 1364
1406 m_log.Debug("[ENTITY TRANSFER MODULE]: Completed inform client about neighbour " + endPoint.ToString()); 1365 m_log.Debug("[ENTITY TRANSFER MODULE]: Completed inform client about neighbour " + endPoint.ToString());
1407 } 1366 }
1408 if (!regionAccepted)
1409 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Region {0} did not accept agent: {1}", reg.RegionName, reason);
1410 } 1367 }
1411 1368
1412 /// <summary> 1369 /// <summary>
@@ -1735,27 +1692,28 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1735 Utils.LongToUInts(newRegionHandle, out x, out y); 1692 Utils.LongToUInts(newRegionHandle, out x, out y);
1736 GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); 1693 GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
1737 1694
1738 if (destination == null || !CrossPrimGroupIntoNewRegion(destination, pos, grp, silent)) 1695 if (destination != null)
1739 { 1696 {
1740 m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}",grp.UUID); 1697 if (CrossPrimGroupIntoNewRegion(destination, pos, grp, silent))
1698 return; // we did it
1699 }
1741 1700
1742 // We are going to move the object back to the old position so long as the old position 1701 // no one or failed lets go back and tell physics to go on
1743 // is in the region 1702 oldGroupPosition.X = Util.Clamp<float>(oldGroupPosition.X, 0.5f, (float)Constants.RegionSize - 0.5f);
1744 oldGroupPosition.X = Util.Clamp<float>(oldGroupPosition.X,1.0f,(float)Constants.RegionSize-1); 1703 oldGroupPosition.Y = Util.Clamp<float>(oldGroupPosition.Y, 0.5f, (float)Constants.RegionSize - 0.5f);
1745 oldGroupPosition.Y = Util.Clamp<float>(oldGroupPosition.Y,1.0f,(float)Constants.RegionSize-1); 1704 oldGroupPosition.Z = Util.Clamp<float>(oldGroupPosition.Z, 0.5f, 4096.0f);
1746 oldGroupPosition.Z = Util.Clamp<float>(oldGroupPosition.Z,1.0f,4096.0f);
1747 1705
1748 grp.RootPart.GroupPosition = oldGroupPosition; 1706 grp.AbsolutePosition = oldGroupPosition;
1707 grp.Velocity = Vector3.Zero;
1749 1708
1750 // Need to turn off the physics flags, otherwise the object will continue to attempt to 1709 if (grp.RootPart.PhysActor != null)
1751 // move out of the region creating an infinite loop of failed attempts to cross 1710 grp.RootPart.PhysActor.CrossingFailure();
1752 grp.UpdatePrimFlags(grp.RootPart.LocalId,false,grp.IsTemporary,grp.IsPhantom,false);
1753 1711
1754 grp.ScheduleGroupForFullUpdate(); 1712 grp.ScheduleGroupForFullUpdate();
1755 }
1756 } 1713 }
1757 1714
1758 1715
1716
1759 /// <summary> 1717 /// <summary>
1760 /// Move the given scene object into a new region 1718 /// Move the given scene object into a new region
1761 /// </summary> 1719 /// </summary>
@@ -1812,7 +1770,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1812 { 1770 {
1813 PhysicsActor pa = grp.RootPart.PhysActor; 1771 PhysicsActor pa = grp.RootPart.PhysActor;
1814 if (pa != null) 1772 if (pa != null)
1773 {
1815 pa.CrossingFailure(); 1774 pa.CrossingFailure();
1775 if (grp.RootPart.KeyframeMotion != null)
1776 {
1777 grp.RootPart.Velocity = Vector3.Zero;
1778 grp.RootPart.KeyframeMotion.CrossingFailure();
1779 grp.SendGroupRootTerseUpdate();
1780 }
1781 }
1816 } 1782 }
1817 1783
1818 m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: Prim crossing failed for {0}", grp); 1784 m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: Prim crossing failed for {0}", grp);
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
index 7f9175d..8b5ad23 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
@@ -85,7 +85,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
85 85
86 protected override void OnNewClient(IClientAPI client) 86 protected override void OnNewClient(IClientAPI client)
87 { 87 {
88 client.OnTeleportHomeRequest += TeleportHome; 88 client.OnTeleportHomeRequest += TriggerTeleportHome;
89 client.OnTeleportLandmarkRequest += RequestTeleportLandmark; 89 client.OnTeleportLandmarkRequest += RequestTeleportLandmark;
90 client.OnConnectionClosed += new Action<IClientAPI>(OnConnectionClosed); 90 client.OnConnectionClosed += new Action<IClientAPI>(OnConnectionClosed);
91 } 91 }
@@ -186,7 +186,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
186 return base.CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout); 186 return base.CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout);
187 } 187 }
188 188
189 public override void TeleportHome(UUID id, IClientAPI client) 189 public void TriggerTeleportHome(UUID id, IClientAPI client)
190 {
191 TeleportHome(id, client);
192 }
193
194 public override bool TeleportHome(UUID id, IClientAPI client)
190 { 195 {
191 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); 196 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName);
192 197
@@ -196,8 +201,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
196 { 201 {
197 // local grid user 202 // local grid user
198 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local"); 203 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local");
199 base.TeleportHome(id, client); 204 return base.TeleportHome(id, client);
200 return;
201 } 205 }
202 206
203 // Foreign user wants to go home 207 // Foreign user wants to go home
@@ -207,7 +211,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
207 { 211 {
208 client.SendTeleportFailed("Your information has been lost"); 212 client.SendTeleportFailed("Your information has been lost");
209 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Unable to locate agent's gateway information"); 213 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Unable to locate agent's gateway information");
210 return; 214 return false;
211 } 215 }
212 216
213 IUserAgentService userAgentService = new UserAgentServiceConnector(aCircuit.ServiceURLs["HomeURI"].ToString()); 217 IUserAgentService userAgentService = new UserAgentServiceConnector(aCircuit.ServiceURLs["HomeURI"].ToString());
@@ -217,7 +221,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
217 { 221 {
218 client.SendTeleportFailed("Your home region could not be found"); 222 client.SendTeleportFailed("Your home region could not be found");
219 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent's home region not found"); 223 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent's home region not found");
220 return; 224 return false;
221 } 225 }
222 226
223 ScenePresence sp = ((Scene)(client.Scene)).GetScenePresence(client.AgentId); 227 ScenePresence sp = ((Scene)(client.Scene)).GetScenePresence(client.AgentId);
@@ -225,7 +229,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
225 { 229 {
226 client.SendTeleportFailed("Internal error"); 230 client.SendTeleportFailed("Internal error");
227 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent not found in the scene where it is supposed to be"); 231 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent not found in the scene where it is supposed to be");
228 return; 232 return false;
229 } 233 }
230 234
231 IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); 235 IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>();
@@ -235,6 +239,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
235 aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ServerURI, homeGatekeeper.RegionName); 239 aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ServerURI, homeGatekeeper.RegionName);
236 240
237 DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq); 241 DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq);
242 return true;
238 } 243 }
239 244
240 /// <summary> 245 /// <summary>
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 8171487..f41e89e 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -355,6 +355,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
355 355
356 foreach (SceneObjectGroup objectGroup in objlist) 356 foreach (SceneObjectGroup objectGroup in objlist)
357 { 357 {
358 if (objectGroup.RootPart.KeyframeMotion != null)
359 objectGroup.RootPart.KeyframeMotion.Stop();
360 objectGroup.RootPart.SetForce(Vector3.Zero);
361 objectGroup.RootPart.SetAngularImpulse(Vector3.Zero, false);
362 objectGroup.RootPart.KeyframeMotion = null;
363
358 Vector3 inventoryStoredPosition = new Vector3 364 Vector3 inventoryStoredPosition = new Vector3
359 (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize) 365 (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
360 ? 250 366 ? 250
@@ -367,6 +373,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
367 373
368 originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition; 374 originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition;
369 375
376 // Restore attachment data after trip through the sim
377 if (objectGroup.RootPart.AttachPoint > 0)
378 inventoryStoredPosition = objectGroup.RootPart.AttachOffset;
379 objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint;
380
370 objectGroup.AbsolutePosition = inventoryStoredPosition; 381 objectGroup.AbsolutePosition = inventoryStoredPosition;
371 382
372 // Make sure all bits but the ones we want are clear 383 // Make sure all bits but the ones we want are clear
@@ -476,8 +487,17 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
476 IClientAPI remoteClient) 487 IClientAPI remoteClient)
477 { 488 {
478 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move) | 7; 489 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move) | 7;
490 // For the porposes of inventory, an object is modify if the prims
491 // are modify. This allows renaming an object that contains no
492 // mod items.
479 foreach (SceneObjectGroup grp in objsForEffectivePermissions) 493 foreach (SceneObjectGroup grp in objsForEffectivePermissions)
480 effectivePerms &= grp.GetEffectivePermissions(); 494 {
495 uint groupPerms = grp.GetEffectivePermissions(true);
496 if ((grp.RootPart.BaseMask & (uint)PermissionMask.Modify) != 0)
497 groupPerms |= (uint)PermissionMask.Modify;
498
499 effectivePerms &= groupPerms;
500 }
481 effectivePerms |= (uint)PermissionMask.Move; 501 effectivePerms |= (uint)PermissionMask.Move;
482 502
483 if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) 503 if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions())
@@ -657,7 +677,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
657 if (so.FromFolderID != UUID.Zero && userID == remoteClient.AgentId) 677 if (so.FromFolderID != UUID.Zero && userID == remoteClient.AgentId)
658 { 678 {
659 InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID); 679 InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID);
660 folder = m_Scene.InventoryService.GetFolder(f); 680 if (f != null)
681 folder = m_Scene.InventoryService.GetFolder(f);
661 } 682 }
662 } 683 }
663 684
@@ -687,15 +708,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
687 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) 708 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment)
688 { 709 {
689// m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID); 710// m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID);
690
691 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 711 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
692 item = m_Scene.InventoryService.GetItem(item); 712 item = m_Scene.InventoryService.GetItem(item);
693 713
694 if (item == null) 714 if (item == null)
695 { 715 {
696 m_log.WarnFormat(
697 "[InventoryAccessModule]: Could not find item {0} for {1} in RezObject()",
698 itemID, remoteClient.Name);
699 716
700 return null; 717 return null;
701 } 718 }
@@ -747,6 +764,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
747 if (e == null || attachment) // Single 764 if (e == null || attachment) // Single
748 { 765 {
749 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData); 766 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
767 if (!attachment)
768 {
769 g.RootPart.AttachPoint = g.RootPart.Shape.State;
770 g.RootPart.AttachOffset = g.AbsolutePosition;
771 g.RootPart.Shape.State = 0;
772 }
750 773
751 objlist.Add(g); 774 objlist.Add(g);
752 veclist.Add(new Vector3(0, 0, 0)); 775 veclist.Add(new Vector3(0, 0, 0));
@@ -776,6 +799,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
776 foreach (XmlNode n in groups) 799 foreach (XmlNode n in groups)
777 { 800 {
778 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml); 801 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml);
802 g.RootPart.AttachPoint = g.RootPart.Shape.State;
803 g.RootPart.AttachOffset = g.AbsolutePosition;
804 g.RootPart.Shape.State = 0;
779 805
780 objlist.Add(g); 806 objlist.Add(g);
781 XmlElement el = (XmlElement)n; 807 XmlElement el = (XmlElement)n;
@@ -795,12 +821,35 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
795 } 821 }
796 } 822 }
797 823
824 int primcount = 0;
825 foreach (SceneObjectGroup g in objlist)
826 primcount += g.PrimCount;
827
828 if (!m_Scene.Permissions.CanRezObject(
829 primcount, remoteClient.AgentId, pos)
830 && !attachment)
831 {
832 // The client operates in no fail mode. It will
833 // have already removed the item from the folder
834 // if it's no copy.
835 // Put it back if it's not an attachment
836 //
837 if (item != null)
838 {
839 if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!attachment))
840 remoteClient.SendBulkUpdateInventory(item);
841 }
842
843 return null;
844 }
845
798 if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, attachment)) 846 if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, attachment))
799 return null; 847 return null;
800 848
801 for (int i = 0; i < objlist.Count; i++) 849 for (int i = 0; i < objlist.Count; i++)
802 { 850 {
803 group = objlist[i]; 851 group = objlist[i];
852 SceneObjectPart rootPart = group.RootPart;
804 853
805// m_log.DebugFormat( 854// m_log.DebugFormat(
806// "[InventoryAccessModule]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", 855// "[InventoryAccessModule]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}",
@@ -861,8 +910,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
861 910
862 if (!attachment) 911 if (!attachment)
863 { 912 {
864 SceneObjectPart rootPart = group.RootPart;
865
866 if (rootPart.Shape.PCode == (byte)PCode.Prim) 913 if (rootPart.Shape.PCode == (byte)PCode.Prim)
867 group.ClearPartAttachmentData(); 914 group.ClearPartAttachmentData();
868 915
@@ -880,6 +927,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
880// remoteClient.Name); 927// remoteClient.Name);
881 } 928 }
882 929
930 group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
931
883 if (item != null) 932 if (item != null)
884 DoPostRezWhenFromItem(item, attachment); 933 DoPostRezWhenFromItem(item, attachment);
885 934
@@ -958,8 +1007,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
958 { 1007 {
959 rootPart.Name = item.Name; 1008 rootPart.Name = item.Name;
960 rootPart.Description = item.Description; 1009 rootPart.Description = item.Description;
961 rootPart.ObjectSaleType = item.SaleType; 1010 if ((item.Flags & (uint)InventoryItemFlags.ObjectSlamSale) != 0)
962 rootPart.SalePrice = item.SalePrice; 1011 {
1012 rootPart.ObjectSaleType = item.SaleType;
1013 rootPart.SalePrice = item.SalePrice;
1014 }
963 } 1015 }
964 1016
965 so.FromFolderID = item.Folder; 1017 so.FromFolderID = item.Folder;
@@ -968,7 +1020,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
968// rootPart.OwnerID, item.Owner, item.CurrentPermissions); 1020// rootPart.OwnerID, item.Owner, item.CurrentPermissions);
969 1021
970 if ((rootPart.OwnerID != item.Owner) || 1022 if ((rootPart.OwnerID != item.Owner) ||
971 (item.CurrentPermissions & 16) != 0) 1023 (item.CurrentPermissions & 16) != 0 ||
1024 (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0)
972 { 1025 {
973 //Need to kill the for sale here 1026 //Need to kill the for sale here
974 rootPart.ObjectSaleType = 0; 1027 rootPart.ObjectSaleType = 0;
@@ -978,31 +1031,43 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
978 { 1031 {
979 foreach (SceneObjectPart part in so.Parts) 1032 foreach (SceneObjectPart part in so.Parts)
980 { 1033 {
981 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
982 {
983 part.EveryoneMask = item.EveryOnePermissions;
984 part.NextOwnerMask = item.NextPermissions;
985 }
986 part.GroupMask = 0; // DO NOT propagate here 1034 part.GroupMask = 0; // DO NOT propagate here
1035
1036 part.LastOwnerID = part.OwnerID;
1037 part.OwnerID = item.Owner;
1038 part.Inventory.ChangeInventoryOwner(item.Owner);
987 } 1039 }
988 1040
989 so.ApplyNextOwnerPermissions(); 1041 so.ApplyNextOwnerPermissions();
1042
1043 // In case the user has changed flags on a received item
1044 // we have to apply those changes after the slam. Else we
1045 // get a net loss of permissions
1046 foreach (SceneObjectPart part in so.Parts)
1047 {
1048 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
1049 {
1050 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
1051 part.EveryoneMask = item.EveryOnePermissions & part.BaseMask;
1052 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
1053 part.NextOwnerMask = item.NextPermissions & part.BaseMask;
1054 }
1055 }
990 } 1056 }
991 } 1057 }
992 1058 else
993 foreach (SceneObjectPart part in so.Parts)
994 { 1059 {
995 part.FromUserInventoryItemID = fromUserInventoryItemId; 1060 foreach (SceneObjectPart part in so.Parts)
996
997 if ((part.OwnerID != item.Owner) ||
998 (item.CurrentPermissions & 16) != 0)
999 { 1061 {
1000 part.Inventory.ChangeInventoryOwner(item.Owner); 1062 part.FromUserInventoryItemID = fromUserInventoryItemId;
1001 part.GroupMask = 0; // DO NOT propagate here 1063
1064 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
1065 part.EveryoneMask = item.EveryOnePermissions;
1066 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
1067 part.NextOwnerMask = item.NextPermissions;
1068 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0)
1069 part.GroupMask = item.GroupPermissions;
1002 } 1070 }
1003
1004 part.EveryoneMask = item.EveryOnePermissions;
1005 part.NextOwnerMask = item.NextPermissions;
1006 } 1071 }
1007 1072
1008 rootPart.TrimPermissions(); 1073 rootPart.TrimPermissions();
@@ -1140,4 +1205,4 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
1140 1205
1141 #endregion 1206 #endregion
1142 } 1207 }
1143} \ No newline at end of file 1208}
diff --git a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs
index 16cbbf5..f49641f 100644
--- a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs
+++ b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs
@@ -170,7 +170,8 @@ namespace OpenSim.Region.CoreModules.World.LightShare
170 170
171 private void EventManager_OnMakeRootAgent(ScenePresence presence) 171 private void EventManager_OnMakeRootAgent(ScenePresence presence)
172 { 172 {
173 m_log.Debug("[WINDLIGHT]: Sending windlight scene to new client"); 173 if (m_enableWindlight && m_scene.RegionInfo.WindlightSettings.valid)
174 m_log.Debug("[WINDLIGHT]: Sending windlight scene to new client");
174 SendProfileToClient(presence.ControllingClient); 175 SendProfileToClient(presence.ControllingClient);
175 } 176 }
176 177
diff --git a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
index d328eb3..9dac6b9 100644
--- a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
+++ b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
@@ -382,6 +382,10 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
382 try 382 try
383 { 383 {
384 Request = (HttpWebRequest) WebRequest.Create(Url); 384 Request = (HttpWebRequest) WebRequest.Create(Url);
385
386 //This works around some buggy HTTP Servers like Lighttpd
387 Request.ServicePoint.Expect100Continue = false;
388
385 Request.Method = HttpMethod; 389 Request.Method = HttpMethod;
386 Request.ContentType = HttpMIMEType; 390 Request.ContentType = HttpMIMEType;
387 391
@@ -458,15 +462,36 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
458 462
459 // continue building the string 463 // continue building the string
460 sb.Append(tempString); 464 sb.Append(tempString);
465 if (sb.Length > 2048)
466 break;
461 } 467 }
462 } while (count > 0); // any more data to read? 468 } while (count > 0); // any more data to read?
463 469
464 ResponseBody = sb.ToString(); 470 ResponseBody = sb.ToString().Replace("\r", "");
465 } 471 }
466 catch (Exception e) 472 catch (Exception e)
467 { 473 {
468 Status = (int)OSHttpStatusCode.ClientErrorJoker; 474 if (e is WebException && ((WebException)e).Status == WebExceptionStatus.ProtocolError)
469 ResponseBody = e.Message; 475 {
476 HttpWebResponse webRsp = (HttpWebResponse)((WebException)e).Response;
477 Status = (int)webRsp.StatusCode;
478 try
479 {
480 using (Stream responseStream = webRsp.GetResponseStream())
481 {
482 ResponseBody = responseStream.GetStreamString();
483 }
484 }
485 catch
486 {
487 ResponseBody = webRsp.StatusDescription;
488 }
489 }
490 else
491 {
492 Status = (int)OSHttpStatusCode.ClientErrorJoker;
493 ResponseBody = e.Message;
494 }
470 495
471 _finished = true; 496 _finished = true;
472 return; 497 return;
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index 93e75b3..f4cf6b4 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -61,6 +61,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
61 //public ManualResetEvent ev; 61 //public ManualResetEvent ev;
62 public bool requestDone; 62 public bool requestDone;
63 public int startTime; 63 public int startTime;
64 public bool responseSent;
64 public string uri; 65 public string uri;
65 } 66 }
66 67
@@ -77,7 +78,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
77 new Dictionary<string, UrlData>(); 78 new Dictionary<string, UrlData>();
78 79
79 80
80 private int m_TotalUrls = 100; 81 private int m_TotalUrls = 5000;
81 82
82 private uint https_port = 0; 83 private uint https_port = 0;
83 private IHttpServer m_HttpServer = null; 84 private IHttpServer m_HttpServer = null;
@@ -157,7 +158,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
157 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" }); 158 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
158 return urlcode; 159 return urlcode;
159 } 160 }
160 string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/"; 161 string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString();
161 162
162 UrlData urlData = new UrlData(); 163 UrlData urlData = new UrlData();
163 urlData.hostID = host.UUID; 164 urlData.hostID = host.UUID;
@@ -166,10 +167,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
166 urlData.url = url; 167 urlData.url = url;
167 urlData.urlcode = urlcode; 168 urlData.urlcode = urlcode;
168 urlData.requests = new Dictionary<UUID, RequestData>(); 169 urlData.requests = new Dictionary<UUID, RequestData>();
169 170
170 m_UrlMap[url] = urlData; 171 m_UrlMap[url] = urlData;
171 172
172 string uri = "/lslhttp/" + urlcode.ToString() + "/"; 173 string uri = "/lslhttp/" + urlcode.ToString();
173 174
174 m_HttpServer.AddPollServiceHTTPHandler( 175 m_HttpServer.AddPollServiceHTTPHandler(
175 uri, 176 uri,
@@ -234,9 +235,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
234 return; 235 return;
235 } 236 }
236 237
237 foreach (UUID req in data.requests.Keys) 238 lock (m_RequestMap)
238 m_RequestMap.Remove(req); 239 {
239 240 foreach (UUID req in data.requests.Keys)
241 m_RequestMap.Remove(req);
242 }
243
240 RemoveUrl(data); 244 RemoveUrl(data);
241 m_UrlMap.Remove(url); 245 m_UrlMap.Remove(url);
242 } 246 }
@@ -244,32 +248,42 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
244 248
245 public void HttpResponse(UUID request, int status, string body) 249 public void HttpResponse(UUID request, int status, string body)
246 { 250 {
247 if (m_RequestMap.ContainsKey(request)) 251 lock (m_RequestMap)
248 {
249 UrlData urlData = m_RequestMap[request];
250 urlData.requests[request].responseCode = status;
251 urlData.requests[request].responseBody = body;
252 //urlData.requests[request].ev.Set();
253 urlData.requests[request].requestDone =true;
254 }
255 else
256 { 252 {
257 m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString()); 253 if (m_RequestMap.ContainsKey(request))
254 {
255 UrlData urlData = m_RequestMap[request];
256 if (!urlData.requests[request].responseSent)
257 {
258 urlData.requests[request].responseCode = status;
259 urlData.requests[request].responseBody = body;
260 //urlData.requests[request].ev.Set();
261 urlData.requests[request].requestDone = true;
262 urlData.requests[request].responseSent = true;
263 }
264 }
265 else
266 {
267 m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString());
268 }
258 } 269 }
259 } 270 }
260 271
261 public string GetHttpHeader(UUID requestId, string header) 272 public string GetHttpHeader(UUID requestId, string header)
262 { 273 {
263 if (m_RequestMap.ContainsKey(requestId)) 274 lock (m_RequestMap)
264 {
265 UrlData urlData=m_RequestMap[requestId];
266 string value;
267 if (urlData.requests[requestId].headers.TryGetValue(header,out value))
268 return value;
269 }
270 else
271 { 275 {
272 m_log.Warn("[HttpRequestHandler] There was no http-in request with id " + requestId); 276 if (m_RequestMap.ContainsKey(requestId))
277 {
278 UrlData urlData = m_RequestMap[requestId];
279 string value;
280 if (urlData.requests[requestId].headers.TryGetValue(header, out value))
281 return value;
282 }
283 else
284 {
285 m_log.Warn("[HttpRequestHandler] There was no http-in request with id " + requestId);
286 }
273 } 287 }
274 return String.Empty; 288 return String.Empty;
275 } 289 }
@@ -293,8 +307,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
293 { 307 {
294 RemoveUrl(url.Value); 308 RemoveUrl(url.Value);
295 removeURLs.Add(url.Key); 309 removeURLs.Add(url.Key);
296 foreach (UUID req in url.Value.requests.Keys) 310 lock (m_RequestMap)
297 m_RequestMap.Remove(req); 311 {
312 foreach (UUID req in url.Value.requests.Keys)
313 m_RequestMap.Remove(req);
314 }
298 } 315 }
299 } 316 }
300 317
@@ -315,8 +332,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
315 { 332 {
316 RemoveUrl(url.Value); 333 RemoveUrl(url.Value);
317 removeURLs.Add(url.Key); 334 removeURLs.Add(url.Key);
318 foreach (UUID req in url.Value.requests.Keys) 335 lock (m_RequestMap)
319 m_RequestMap.Remove(req); 336 {
337 foreach (UUID req in url.Value.requests.Keys)
338 m_RequestMap.Remove(req);
339 }
320 } 340 }
321 } 341 }
322 342
@@ -335,14 +355,16 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
335 { 355 {
336 Hashtable response = new Hashtable(); 356 Hashtable response = new Hashtable();
337 UrlData url; 357 UrlData url;
358 int startTime = 0;
338 lock (m_RequestMap) 359 lock (m_RequestMap)
339 { 360 {
340 if (!m_RequestMap.ContainsKey(requestID)) 361 if (!m_RequestMap.ContainsKey(requestID))
341 return response; 362 return response;
342 url = m_RequestMap[requestID]; 363 url = m_RequestMap[requestID];
364 startTime = url.requests[requestID].startTime;
343 } 365 }
344 366
345 if (System.Environment.TickCount - url.requests[requestID].startTime > 25000) 367 if (System.Environment.TickCount - startTime > 25000)
346 { 368 {
347 response["int_response_code"] = 500; 369 response["int_response_code"] = 500;
348 response["str_response_string"] = "Script timeout"; 370 response["str_response_string"] = "Script timeout";
@@ -351,9 +373,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
351 response["reusecontext"] = false; 373 response["reusecontext"] = false;
352 374
353 //remove from map 375 //remove from map
354 lock (url) 376 lock (url.requests)
355 { 377 {
356 url.requests.Remove(requestID); 378 url.requests.Remove(requestID);
379 }
380 lock (m_RequestMap)
381 {
357 m_RequestMap.Remove(requestID); 382 m_RequestMap.Remove(requestID);
358 } 383 }
359 384
@@ -375,22 +400,25 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
375 return false; 400 return false;
376 } 401 }
377 url = m_RequestMap[requestID]; 402 url = m_RequestMap[requestID];
403 }
404 lock (url.requests)
405 {
378 if (!url.requests.ContainsKey(requestID)) 406 if (!url.requests.ContainsKey(requestID))
379 { 407 {
380 return false; 408 return false;
381 } 409 }
410 else
411 {
412 if (System.Environment.TickCount - url.requests[requestID].startTime > 25000)
413 {
414 return true;
415 }
416 if (url.requests[requestID].requestDone)
417 return true;
418 else
419 return false;
420 }
382 } 421 }
383
384 if (System.Environment.TickCount-url.requests[requestID].startTime>25000)
385 {
386 return true;
387 }
388
389 if (url.requests[requestID].requestDone)
390 return true;
391 else
392 return false;
393
394 } 422 }
395 private Hashtable GetEvents(UUID requestID, UUID sessionID, string request) 423 private Hashtable GetEvents(UUID requestID, UUID sessionID, string request)
396 { 424 {
@@ -402,9 +430,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
402 if (!m_RequestMap.ContainsKey(requestID)) 430 if (!m_RequestMap.ContainsKey(requestID))
403 return NoEvents(requestID,sessionID); 431 return NoEvents(requestID,sessionID);
404 url = m_RequestMap[requestID]; 432 url = m_RequestMap[requestID];
433 }
434 lock (url.requests)
435 {
405 requestData = url.requests[requestID]; 436 requestData = url.requests[requestID];
406 } 437 }
407 438
408 if (!requestData.requestDone) 439 if (!requestData.requestDone)
409 return NoEvents(requestID,sessionID); 440 return NoEvents(requestID,sessionID);
410 441
@@ -427,14 +458,18 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
427 response["reusecontext"] = false; 458 response["reusecontext"] = false;
428 459
429 //remove from map 460 //remove from map
430 lock (url) 461 lock (url.requests)
431 { 462 {
432 url.requests.Remove(requestID); 463 url.requests.Remove(requestID);
464 }
465 lock (m_RequestMap)
466 {
433 m_RequestMap.Remove(requestID); 467 m_RequestMap.Remove(requestID);
434 } 468 }
435 469
436 return response; 470 return response;
437 } 471 }
472
438 public void HttpRequestHandler(UUID requestID, Hashtable request) 473 public void HttpRequestHandler(UUID requestID, Hashtable request)
439 { 474 {
440 lock (request) 475 lock (request)
@@ -450,8 +485,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
450 485
451 int pos1 = uri.IndexOf("/");// /lslhttp 486 int pos1 = uri.IndexOf("/");// /lslhttp
452 int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/ 487 int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/
453 int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp/<UUID>/ 488 int pos3 = pos2 + 37; // /lslhttp/urlcode
454 string uri_tmp = uri.Substring(0, pos3 + 1); 489 string uri_tmp = uri.Substring(0, pos3);
455 //HTTP server code doesn't provide us with QueryStrings 490 //HTTP server code doesn't provide us with QueryStrings
456 string pathInfo; 491 string pathInfo;
457 string queryString; 492 string queryString;
@@ -460,10 +495,21 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
460 pathInfo = uri.Substring(pos3); 495 pathInfo = uri.Substring(pos3);
461 496
462 UrlData url = null; 497 UrlData url = null;
498 string urlkey;
463 if (!is_ssl) 499 if (!is_ssl)
464 url = m_UrlMap["http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp]; 500 urlkey = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp;
501 //m_UrlMap[];
465 else 502 else
466 url = m_UrlMap["https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + uri_tmp]; 503 urlkey = "https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + uri_tmp;
504
505 if (m_UrlMap.ContainsKey(urlkey))
506 {
507 url = m_UrlMap[urlkey];
508 }
509 else
510 {
511 m_log.Warn("[HttpRequestHandler]: http-in request failed; no such url: "+urlkey.ToString());
512 }
467 513
468 //for llGetHttpHeader support we need to store original URI here 514 //for llGetHttpHeader support we need to store original URI here
469 //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers 515 //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers
@@ -493,7 +539,14 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
493 if (request.ContainsKey(key)) 539 if (request.ContainsKey(key))
494 { 540 {
495 string val = (String)request[key]; 541 string val = (String)request[key];
496 queryString = queryString + key + "=" + val + "&"; 542 if (key != "")
543 {
544 queryString = queryString + key + "=" + val + "&";
545 }
546 else
547 {
548 queryString = queryString + val + "&";
549 }
497 } 550 }
498 } 551 }
499 if (queryString.Length > 1) 552 if (queryString.Length > 1)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs
index 6d3ace9..3b862da 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs
@@ -93,8 +93,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.MapImage
93 if (config == null) 93 if (config == null)
94 return; 94 return;
95 95
96 int refreshminutes = Convert.ToInt32(config.GetString("RefreshTime")); 96 int refreshminutes = Convert.ToInt32(config.GetString("RefreshTime", "-1"));
97 if (refreshminutes <= 0) 97 if (refreshminutes < 0)
98 { 98 {
99 m_log.WarnFormat("[MAP IMAGE SERVICE MODULE]: No refresh time given in config. Module disabled."); 99 m_log.WarnFormat("[MAP IMAGE SERVICE MODULE]: No refresh time given in config. Module disabled.");
100 return; 100 return;
@@ -117,12 +117,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.MapImage
117 return; 117 return;
118 } 118 }
119 119
120 m_refreshTimer.Enabled = true; 120 if (m_refreshtime > 0)
121 m_refreshTimer.AutoReset = true; 121 {
122 m_refreshTimer.Interval = m_refreshtime; 122 m_refreshTimer.Enabled = true;
123 m_refreshTimer.Elapsed += new ElapsedEventHandler(HandleMaptileRefresh); 123 m_refreshTimer.AutoReset = true;
124 m_refreshTimer.Interval = m_refreshtime;
125 m_refreshTimer.Elapsed += new ElapsedEventHandler(HandleMaptileRefresh);
126 }
124 127
125 m_log.InfoFormat("[MAP IMAGE SERVICE MODULE]: enabled with refresh time {0}min and service object {1}", 128 m_log.InfoFormat("[MAP IMAGE SERVICE MODULE]: enabled with refresh time {0} min and service object {1}",
126 refreshminutes, service); 129 refreshminutes, service);
127 130
128 m_enabled = true; 131 m_enabled = true;
@@ -238,4 +241,4 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.MapImage
238 } 241 }
239 } 242 }
240 } 243 }
241} \ No newline at end of file 244}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
index 85e7e94..6e75692 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
@@ -271,7 +271,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
271 if (s.RegionInfo.RegionID == destination.RegionID) 271 if (s.RegionInfo.RegionID == destination.RegionID)
272 return s.QueryAccess(id, position, out reason); 272 return s.QueryAccess(id, position, out reason);
273 } 273 }
274 //m_log.Debug("[LOCAL COMMS]: region not found for QueryAccess");
275 return false; 274 return false;
276 } 275 }
277 276
@@ -301,10 +300,24 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
301 if (s.RegionInfo.RegionID == destination.RegionID) 300 if (s.RegionInfo.RegionID == destination.RegionID)
302 { 301 {
303 //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent"); 302 //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent");
304 // Let's spawn a threadlet right here, because this may take 303 return s.IncomingCloseAgent(id);
305 // a while 304 }
306 Util.FireAndForget(delegate { s.IncomingCloseAgent(id); }); 305 }
307 return true; 306 //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent");
307 return false;
308 }
309
310 public bool CloseChildAgent(GridRegion destination, UUID id)
311 {
312 if (destination == null)
313 return false;
314
315 foreach (Scene s in m_sceneList)
316 {
317 if (s.RegionInfo.RegionID == destination.RegionID)
318 {
319 //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent");
320 return s.IncomingCloseChildAgent(id);
308 } 321 }
309 } 322 }
310 //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent"); 323 //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent");
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
index eaf9506..4b70692 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
@@ -261,6 +261,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
261 return false; 261 return false;
262 } 262 }
263 263
264 public bool CloseChildAgent(GridRegion destination, UUID id)
265 {
266 if (destination == null)
267 return false;
268
269 // Try local first
270 if (m_localBackend.CloseChildAgent(destination, id))
271 return true;
272
273 // else do the remote thing
274 if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
275 return m_remoteConnector.CloseChildAgent(destination, id);
276
277 return false;
278 }
264 279
265 public bool CloseAgent(GridRegion destination, UUID id) 280 public bool CloseAgent(GridRegion destination, UUID id)
266 { 281 {
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
index 0a0ce3c..1ffd480 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
@@ -127,6 +127,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
127 // FIXME: Why do we bother setting this module and caching up if we just end up registering the inner 127 // FIXME: Why do we bother setting this module and caching up if we just end up registering the inner
128 // user account service?! 128 // user account service?!
129 scene.RegisterModuleInterface<IUserAccountService>(UserAccountService); 129 scene.RegisterModuleInterface<IUserAccountService>(UserAccountService);
130 scene.RegisterModuleInterface<IUserAccountCacheModule>(m_Cache);
130 } 131 }
131 132
132 public void RemoveRegion(Scene scene) 133 public void RemoveRegion(Scene scene)
@@ -179,6 +180,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
179 return UserAccountService.GetUserAccount(scopeID, Email); 180 return UserAccountService.GetUserAccount(scopeID, Email);
180 } 181 }
181 182
183 public List<UserAccount> GetUserAccountsWhere(UUID scopeID, string query)
184 {
185 return null;
186 }
187
182 public List<UserAccount> GetUserAccounts(UUID scopeID, string query) 188 public List<UserAccount> GetUserAccounts(UUID scopeID, string query)
183 { 189 {
184 return UserAccountService.GetUserAccounts(scopeID, query); 190 return UserAccountService.GetUserAccounts(scopeID, query);
@@ -193,4 +199,4 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
193 199
194 #endregion 200 #endregion
195 } 201 }
196} \ No newline at end of file 202}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs
index 3321b38..f6b6aeb 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs
@@ -33,6 +33,7 @@ using OpenSim.Region.Framework.Interfaces;
33using OpenSim.Region.Framework.Scenes; 33using OpenSim.Region.Framework.Scenes;
34using OpenSim.Services.Interfaces; 34using OpenSim.Services.Interfaces;
35using OpenSim.Services.Connectors; 35using OpenSim.Services.Connectors;
36using OpenSim.Framework;
36 37
37using OpenMetaverse; 38using OpenMetaverse;
38 39
@@ -101,6 +102,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
101 return; 102 return;
102 103
103 scene.RegisterModuleInterface<IUserAccountService>(this); 104 scene.RegisterModuleInterface<IUserAccountService>(this);
105 scene.RegisterModuleInterface<IUserAccountCacheModule>(m_Cache);
106
107 scene.EventManager.OnNewClient += OnNewClient;
104 } 108 }
105 109
106 public void RemoveRegion(Scene scene) 110 public void RemoveRegion(Scene scene)
@@ -115,6 +119,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
115 return; 119 return;
116 } 120 }
117 121
122 // When a user actually enters the sim, clear them from
123 // cache so the sim will have the current values for
124 // flags, title, etc. And country, don't forget country!
125 private void OnNewClient(IClientAPI client)
126 {
127 m_Cache.Remove(client.Name);
128 }
129
118 #region Overwritten methods from IUserAccountService 130 #region Overwritten methods from IUserAccountService
119 131
120 public override UserAccount GetUserAccount(UUID scopeID, UUID userID) 132 public override UserAccount GetUserAccount(UUID scopeID, UUID userID)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
index ddef75f..cbe2eaa 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
@@ -34,7 +34,7 @@ using log4net;
34 34
35namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts 35namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
36{ 36{
37 public class UserAccountCache 37 public class UserAccountCache : IUserAccountCacheModule
38 { 38 {
39 private const double CACHE_EXPIRATION_SECONDS = 120000.0; // 33 hours! 39 private const double CACHE_EXPIRATION_SECONDS = 120000.0; // 33 hours!
40 40
@@ -92,5 +92,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
92 92
93 return null; 93 return null;
94 } 94 }
95
96 public void Remove(string name)
97 {
98 if (!m_NameCache.Contains(name))
99 return;
100
101 UUID uuid = UUID.Zero;
102 if (m_NameCache.TryGetValue(name, out uuid))
103 {
104 m_NameCache.Remove(name);
105 m_UUIDCache.Remove(uuid);
106 }
107 }
95 } 108 }
96} 109}
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
index a6dbaba..38db239 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
@@ -298,6 +298,23 @@ namespace OpenSim.Region.CoreModules.World.Archiver
298 // being no copy/no mod for everyone 298 // being no copy/no mod for everyone
299 lock (part.TaskInventory) 299 lock (part.TaskInventory)
300 { 300 {
301 if (!ResolveUserUuid(part.CreatorID))
302 part.CreatorID = m_scene.RegionInfo.EstateSettings.EstateOwner;
303
304 if (!ResolveUserUuid(part.OwnerID))
305 part.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
306
307 if (!ResolveUserUuid(part.LastOwnerID))
308 part.LastOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
309
310 // And zap any troublesome sit target information
311 part.SitTargetOrientation = new Quaternion(0, 0, 0, 1);
312 part.SitTargetPosition = new Vector3(0, 0, 0);
313
314 // Fix ownership/creator of inventory items
315 // Not doing so results in inventory items
316 // being no copy/no mod for everyone
317 part.TaskInventory.LockItemsForRead(true);
301 TaskInventoryDictionary inv = part.TaskInventory; 318 TaskInventoryDictionary inv = part.TaskInventory;
302 foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv) 319 foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv)
303 { 320 {
@@ -313,6 +330,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
313 if (UserManager != null) 330 if (UserManager != null)
314 UserManager.AddUser(kvp.Value.CreatorID, kvp.Value.CreatorData); 331 UserManager.AddUser(kvp.Value.CreatorID, kvp.Value.CreatorData);
315 } 332 }
333 part.TaskInventory.LockItemsForRead(false);
316 } 334 }
317 } 335 }
318 336
diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
index 55110dc..1eb641d 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
@@ -253,18 +253,14 @@ namespace OpenSim.Region.CoreModules.World.Archiver
253 253
254 if (asset != null) 254 if (asset != null)
255 { 255 {
256 if (m_options.ContainsKey("verbose")) 256// m_log.DebugFormat("[ARCHIVER]: Writing asset {0}", id);
257 m_log.InfoFormat("[ARCHIVER]: Writing asset {0}", id);
258
259 m_foundAssetUuids.Add(asset.FullID); 257 m_foundAssetUuids.Add(asset.FullID);
260 258
261 m_assetsArchiver.WriteAsset(PostProcess(asset)); 259 m_assetsArchiver.WriteAsset(PostProcess(asset));
262 } 260 }
263 else 261 else
264 { 262 {
265 if (m_options.ContainsKey("verbose")) 263// m_log.DebugFormat("[ARCHIVER]: Recording asset {0} as not found", id);
266 m_log.InfoFormat("[ARCHIVER]: Recording asset {0} as not found", id);
267
268 m_notFoundAssetUuids.Add(new UUID(id)); 264 m_notFoundAssetUuids.Add(new UUID(id));
269 } 265 }
270 266
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index 58bbd24..ddc2a07 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -32,6 +32,7 @@ using System.IO;
32using System.Linq; 32using System.Linq;
33using System.Reflection; 33using System.Reflection;
34using System.Security; 34using System.Security;
35using System.Timers;
35using log4net; 36using log4net;
36using Mono.Addins; 37using Mono.Addins;
37using Nini.Config; 38using Nini.Config;
@@ -47,6 +48,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
47 { 48 {
48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49 50
51 private Timer m_regionChangeTimer = new Timer();
50 public Scene Scene { get; private set; } 52 public Scene Scene { get; private set; }
51 public IUserManagement UserManager { get; private set; } 53 public IUserManagement UserManager { get; private set; }
52 54
@@ -61,6 +63,12 @@ namespace OpenSim.Region.CoreModules.World.Estate
61 63
62 #region Packet Data Responders 64 #region Packet Data Responders
63 65
66 private void clientSendDetailedEstateData(IClientAPI remote_client, UUID invoice)
67 {
68 sendDetailedEstateData(remote_client, invoice);
69 sendEstateLists(remote_client, invoice);
70 }
71
64 private void sendDetailedEstateData(IClientAPI remote_client, UUID invoice) 72 private void sendDetailedEstateData(IClientAPI remote_client, UUID invoice)
65 { 73 {
66 uint sun = 0; 74 uint sun = 0;
@@ -83,7 +91,10 @@ namespace OpenSim.Region.CoreModules.World.Estate
83 (uint) Scene.RegionInfo.RegionSettings.CovenantChangedDateTime, 91 (uint) Scene.RegionInfo.RegionSettings.CovenantChangedDateTime,
84 Scene.RegionInfo.EstateSettings.AbuseEmail, 92 Scene.RegionInfo.EstateSettings.AbuseEmail,
85 estateOwner); 93 estateOwner);
94 }
86 95
96 private void sendEstateLists(IClientAPI remote_client, UUID invoice)
97 {
87 remote_client.SendEstateList(invoice, 98 remote_client.SendEstateList(invoice,
88 (int)Constants.EstateAccessCodex.EstateManagers, 99 (int)Constants.EstateAccessCodex.EstateManagers,
89 Scene.RegionInfo.EstateSettings.EstateManagers, 100 Scene.RegionInfo.EstateSettings.EstateManagers,
@@ -257,6 +268,12 @@ namespace OpenSim.Region.CoreModules.World.Estate
257 IRestartModule restartModule = Scene.RequestModuleInterface<IRestartModule>(); 268 IRestartModule restartModule = Scene.RequestModuleInterface<IRestartModule>();
258 if (restartModule != null) 269 if (restartModule != null)
259 { 270 {
271 if (timeInSeconds == -1)
272 {
273 restartModule.AbortRestart("Restart aborted by region manager");
274 return;
275 }
276
260 List<int> times = new List<int>(); 277 List<int> times = new List<int>();
261 while (timeInSeconds > 0) 278 while (timeInSeconds > 0)
262 { 279 {
@@ -269,7 +286,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
269 timeInSeconds -= 15; 286 timeInSeconds -= 15;
270 } 287 }
271 288
272 restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), true); 289 restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), false);
273 } 290 }
274 } 291 }
275 292
@@ -477,7 +494,11 @@ namespace OpenSim.Region.CoreModules.World.Estate
477 { 494 {
478 if (!s.IsChildAgent) 495 if (!s.IsChildAgent)
479 { 496 {
480 Scene.TeleportClientHome(user, s.ControllingClient); 497 if (!Scene.TeleportClientHome(user, s.ControllingClient))
498 {
499 s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out.");
500 s.ControllingClient.Close();
501 }
481 } 502 }
482 } 503 }
483 504
@@ -486,7 +507,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
486 { 507 {
487 remote_client.SendAlertMessage("User is already on the region ban list"); 508 remote_client.SendAlertMessage("User is already on the region ban list");
488 } 509 }
489 //m_scene.RegionInfo.regionBanlist.Add(Manager(user); 510 //Scene.RegionInfo.regionBanlist.Add(Manager(user);
490 remote_client.SendBannedUserList(invoice, Scene.RegionInfo.EstateSettings.EstateBans, Scene.RegionInfo.EstateSettings.EstateID); 511 remote_client.SendBannedUserList(invoice, Scene.RegionInfo.EstateSettings.EstateBans, Scene.RegionInfo.EstateSettings.EstateID);
491 } 512 }
492 else 513 else
@@ -541,7 +562,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
541 remote_client.SendAlertMessage("User is not on the region ban list"); 562 remote_client.SendAlertMessage("User is not on the region ban list");
542 } 563 }
543 564
544 //m_scene.RegionInfo.regionBanlist.Add(Manager(user); 565 //Scene.RegionInfo.regionBanlist.Add(Manager(user);
545 remote_client.SendBannedUserList(invoice, Scene.RegionInfo.EstateSettings.EstateBans, Scene.RegionInfo.EstateSettings.EstateID); 566 remote_client.SendBannedUserList(invoice, Scene.RegionInfo.EstateSettings.EstateBans, Scene.RegionInfo.EstateSettings.EstateID);
546 } 567 }
547 else 568 else
@@ -700,7 +721,11 @@ namespace OpenSim.Region.CoreModules.World.Estate
700 ScenePresence s = Scene.GetScenePresence(prey); 721 ScenePresence s = Scene.GetScenePresence(prey);
701 if (s != null) 722 if (s != null)
702 { 723 {
703 Scene.TeleportClientHome(prey, s.ControllingClient); 724 if (!Scene.TeleportClientHome(prey, s.ControllingClient))
725 {
726 s.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out.");
727 s.ControllingClient.Close();
728 }
704 } 729 }
705 } 730 }
706 } 731 }
@@ -718,7 +743,13 @@ namespace OpenSim.Region.CoreModules.World.Estate
718 // Also make sure they are actually in the region 743 // Also make sure they are actually in the region
719 ScenePresence p; 744 ScenePresence p;
720 if(Scene.TryGetScenePresence(client.AgentId, out p)) 745 if(Scene.TryGetScenePresence(client.AgentId, out p))
721 Scene.TeleportClientHome(p.UUID, p.ControllingClient); 746 {
747 if (!Scene.TeleportClientHome(p.UUID, p.ControllingClient))
748 {
749 p.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out.");
750 p.ControllingClient.Close();
751 }
752 }
722 } 753 }
723 }); 754 });
724 } 755 }
@@ -1081,6 +1112,10 @@ namespace OpenSim.Region.CoreModules.World.Estate
1081 1112
1082 public void AddRegion(Scene scene) 1113 public void AddRegion(Scene scene)
1083 { 1114 {
1115 m_regionChangeTimer.AutoReset = false;
1116 m_regionChangeTimer.Interval = 2000;
1117 m_regionChangeTimer.Elapsed += RaiseRegionInfoChange;
1118
1084 Scene = scene; 1119 Scene = scene;
1085 Scene.RegisterModuleInterface<IEstateModule>(this); 1120 Scene.RegisterModuleInterface<IEstateModule>(this);
1086 Scene.EventManager.OnNewClient += EventManager_OnNewClient; 1121 Scene.EventManager.OnNewClient += EventManager_OnNewClient;
@@ -1131,7 +1166,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
1131 1166
1132 private void EventManager_OnNewClient(IClientAPI client) 1167 private void EventManager_OnNewClient(IClientAPI client)
1133 { 1168 {
1134 client.OnDetailedEstateDataRequest += sendDetailedEstateData; 1169 client.OnDetailedEstateDataRequest += clientSendDetailedEstateData;
1135 client.OnSetEstateFlagsRequest += estateSetRegionInfoHandler; 1170 client.OnSetEstateFlagsRequest += estateSetRegionInfoHandler;
1136// client.OnSetEstateTerrainBaseTexture += setEstateTerrainBaseTexture; 1171// client.OnSetEstateTerrainBaseTexture += setEstateTerrainBaseTexture;
1137 client.OnSetEstateTerrainDetailTexture += setEstateTerrainBaseTexture; 1172 client.OnSetEstateTerrainDetailTexture += setEstateTerrainBaseTexture;
@@ -1183,6 +1218,10 @@ namespace OpenSim.Region.CoreModules.World.Estate
1183 flags |= RegionFlags.AllowParcelChanges; 1218 flags |= RegionFlags.AllowParcelChanges;
1184 if (Scene.RegionInfo.RegionSettings.BlockShowInSearch) 1219 if (Scene.RegionInfo.RegionSettings.BlockShowInSearch)
1185 flags |= RegionFlags.BlockParcelSearch; 1220 flags |= RegionFlags.BlockParcelSearch;
1221 if (Scene.RegionInfo.RegionSettings.GodBlockSearch)
1222 flags |= (RegionFlags)(1 << 11);
1223 if (Scene.RegionInfo.RegionSettings.Casino)
1224 flags |= (RegionFlags)(1 << 10);
1186 1225
1187 if (Scene.RegionInfo.RegionSettings.FixedSun) 1226 if (Scene.RegionInfo.RegionSettings.FixedSun)
1188 flags |= RegionFlags.SunFixed; 1227 flags |= RegionFlags.SunFixed;
@@ -1190,11 +1229,15 @@ namespace OpenSim.Region.CoreModules.World.Estate
1190 flags |= RegionFlags.Sandbox; 1229 flags |= RegionFlags.Sandbox;
1191 if (Scene.RegionInfo.EstateSettings.AllowVoice) 1230 if (Scene.RegionInfo.EstateSettings.AllowVoice)
1192 flags |= RegionFlags.AllowVoice; 1231 flags |= RegionFlags.AllowVoice;
1232 if (Scene.RegionInfo.EstateSettings.AllowLandmark)
1233 flags |= RegionFlags.AllowLandmark;
1234 if (Scene.RegionInfo.EstateSettings.AllowSetHome)
1235 flags |= RegionFlags.AllowSetHome;
1236 if (Scene.RegionInfo.EstateSettings.BlockDwell)
1237 flags |= RegionFlags.BlockDwell;
1238 if (Scene.RegionInfo.EstateSettings.ResetHomeOnTeleport)
1239 flags |= RegionFlags.ResetHomeOnTeleport;
1193 1240
1194 // Fudge these to always on, so the menu options activate
1195 //
1196 flags |= RegionFlags.AllowLandmark;
1197 flags |= RegionFlags.AllowSetHome;
1198 1241
1199 // TODO: SkipUpdateInterestList 1242 // TODO: SkipUpdateInterestList
1200 1243
@@ -1235,6 +1278,12 @@ namespace OpenSim.Region.CoreModules.World.Estate
1235 flags |= RegionFlags.ResetHomeOnTeleport; 1278 flags |= RegionFlags.ResetHomeOnTeleport;
1236 if (Scene.RegionInfo.EstateSettings.TaxFree) 1279 if (Scene.RegionInfo.EstateSettings.TaxFree)
1237 flags |= RegionFlags.TaxFree; 1280 flags |= RegionFlags.TaxFree;
1281 if (Scene.RegionInfo.EstateSettings.AllowLandmark)
1282 flags |= RegionFlags.AllowLandmark;
1283 if (Scene.RegionInfo.EstateSettings.AllowParcelChanges)
1284 flags |= RegionFlags.AllowParcelChanges;
1285 if (Scene.RegionInfo.EstateSettings.AllowSetHome)
1286 flags |= RegionFlags.AllowSetHome;
1238 if (Scene.RegionInfo.EstateSettings.DenyMinors) 1287 if (Scene.RegionInfo.EstateSettings.DenyMinors)
1239 flags |= (RegionFlags)(1 << 30); 1288 flags |= (RegionFlags)(1 << 30);
1240 1289
@@ -1255,6 +1304,12 @@ namespace OpenSim.Region.CoreModules.World.Estate
1255 1304
1256 public void TriggerRegionInfoChange() 1305 public void TriggerRegionInfoChange()
1257 { 1306 {
1307 m_regionChangeTimer.Stop();
1308 m_regionChangeTimer.Start();
1309 }
1310
1311 protected void RaiseRegionInfoChange(object sender, ElapsedEventArgs e)
1312 {
1258 ChangeDelegate change = OnRegionInfoChange; 1313 ChangeDelegate change = OnRegionInfoChange;
1259 1314
1260 if (change != null) 1315 if (change != null)
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index f6d4b40..02ac091 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -91,14 +91,13 @@ namespace OpenSim.Region.CoreModules.World.Land
91 private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1; 91 private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
92 92
93 private bool m_allowedForcefulBans = true; 93 private bool m_allowedForcefulBans = true;
94 private UUID DefaultGodParcelGroup;
95 private string DefaultGodParcelName;
94 96
95 // caches ExtendedLandData 97 // caches ExtendedLandData
96 private Cache parcelInfoCache; 98 private Cache parcelInfoCache;
97 99 private Dictionary<UUID, Vector3> forcedPosition =
98 /// <summary> 100 new Dictionary<UUID, Vector3>();
99 /// Record positions that avatar's are currently being forced to move to due to parcel entry restrictions.
100 /// </summary>
101 private Dictionary<UUID, Vector3> forcedPosition = new Dictionary<UUID, Vector3>();
102 101
103 #region INonSharedRegionModule Members 102 #region INonSharedRegionModule Members
104 103
@@ -109,6 +108,12 @@ namespace OpenSim.Region.CoreModules.World.Land
109 108
110 public void Initialise(IConfigSource source) 109 public void Initialise(IConfigSource source)
111 { 110 {
111 IConfig cnf = source.Configs["LandManagement"];
112 if (cnf != null)
113 {
114 DefaultGodParcelGroup = new UUID(cnf.GetString("DefaultAdministratorGroupUUID", UUID.Zero.ToString()));
115 DefaultGodParcelName = cnf.GetString("DefaultAdministratorParcelName", "Default Parcel");
116 }
112 } 117 }
113 118
114 public void AddRegion(Scene scene) 119 public void AddRegion(Scene scene)
@@ -160,13 +165,6 @@ namespace OpenSim.Region.CoreModules.World.Land
160 m_scene.UnregisterModuleCommander(m_commander.Name); 165 m_scene.UnregisterModuleCommander(m_commander.Name);
161 } 166 }
162 167
163// private bool OnVerifyUserConnection(ScenePresence scenePresence, out string reason)
164// {
165// ILandObject nearestParcel = m_scene.GetNearestAllowedParcel(scenePresence.UUID, scenePresence.AbsolutePosition.X, scenePresence.AbsolutePosition.Y);
166// reason = "You are not allowed to enter this sim.";
167// return nearestParcel != null;
168// }
169
170 /// <summary> 168 /// <summary>
171 /// Processes commandline input. Do not call directly. 169 /// Processes commandline input. Do not call directly.
172 /// </summary> 170 /// </summary>
@@ -207,6 +205,8 @@ namespace OpenSim.Region.CoreModules.World.Land
207 client.OnParcelInfoRequest += ClientOnParcelInfoRequest; 205 client.OnParcelInfoRequest += ClientOnParcelInfoRequest;
208 client.OnParcelDeedToGroup += ClientOnParcelDeedToGroup; 206 client.OnParcelDeedToGroup += ClientOnParcelDeedToGroup;
209 client.OnPreAgentUpdate += ClientOnPreAgentUpdate; 207 client.OnPreAgentUpdate += ClientOnPreAgentUpdate;
208 client.OnParcelEjectUser += ClientOnParcelEjectUser;
209 client.OnParcelFreezeUser += ClientOnParcelFreezeUser;
210 210
211 EntityBase presenceEntity; 211 EntityBase presenceEntity;
212 if (m_scene.Entities.TryGetValue(client.AgentId, out presenceEntity) && presenceEntity is ScenePresence) 212 if (m_scene.Entities.TryGetValue(client.AgentId, out presenceEntity) && presenceEntity is ScenePresence)
@@ -218,48 +218,6 @@ namespace OpenSim.Region.CoreModules.World.Land
218 218
219 void ClientOnPreAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) 219 void ClientOnPreAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
220 { 220 {
221 //If we are forcing a position for them to go
222 if (forcedPosition.ContainsKey(remoteClient.AgentId))
223 {
224 ScenePresence clientAvatar = m_scene.GetScenePresence(remoteClient.AgentId);
225
226 //Putting the user into flying, both keeps the avatar in fligth when it bumps into something and stopped from going another direction AND
227 //When the avatar walks into a ban line on the ground, it prevents getting stuck
228 agentData.ControlFlags = (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY;
229
230 //Make sure we stop if they get about to the right place to prevent yoyo and prevents getting stuck on banlines
231 if (Vector3.Distance(clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]) < .2)
232 {
233// m_log.DebugFormat(
234// "[LAND MANAGEMENT MODULE]: Stopping force position of {0} because {1} is close enough to {2}",
235// clientAvatar.Name, clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]);
236
237 forcedPosition.Remove(remoteClient.AgentId);
238 }
239 //if we are far away, teleport
240 else if (Vector3.Distance(clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]) > 3)
241 {
242 Vector3 forcePosition = forcedPosition[remoteClient.AgentId];
243// m_log.DebugFormat(
244// "[LAND MANAGEMENT MODULE]: Teleporting out {0} because {1} is too far from avatar position {2}",
245// clientAvatar.Name, clientAvatar.AbsolutePosition, forcePosition);
246
247 m_scene.RequestTeleportLocation(remoteClient, m_scene.RegionInfo.RegionHandle,
248 forcePosition, clientAvatar.Lookat, (uint)Constants.TeleportFlags.ForceRedirect);
249
250 forcedPosition.Remove(remoteClient.AgentId);
251 }
252 else
253 {
254// m_log.DebugFormat(
255// "[LAND MANAGEMENT MODULE]: Forcing {0} from {1} to {2}",
256// clientAvatar.Name, clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]);
257
258 //Forces them toward the forced position we want if they aren't there yet
259 agentData.UseClientAgentPosition = true;
260 agentData.ClientAgentPosition = forcedPosition[remoteClient.AgentId];
261 }
262 }
263 } 221 }
264 222
265 public void Close() 223 public void Close()
@@ -378,10 +336,16 @@ namespace OpenSim.Region.CoreModules.World.Land
378 private void ForceAvatarToPosition(ScenePresence avatar, Vector3? position) 336 private void ForceAvatarToPosition(ScenePresence avatar, Vector3? position)
379 { 337 {
380 if (m_scene.Permissions.IsGod(avatar.UUID)) return; 338 if (m_scene.Permissions.IsGod(avatar.UUID)) return;
381 if (position.HasValue) 339
382 { 340 if (!position.HasValue)
383 forcedPosition[avatar.ControllingClient.AgentId] = (Vector3)position; 341 return;
384 } 342
343 bool isFlying = avatar.PhysicsActor.Flying;
344 avatar.RemoveFromPhysicalScene();
345
346 avatar.AbsolutePosition = (Vector3)position;
347
348 avatar.AddToPhysicalScene(isFlying);
385 } 349 }
386 350
387 public void SendYouAreRestrictedNotice(ScenePresence avatar) 351 public void SendYouAreRestrictedNotice(ScenePresence avatar)
@@ -401,29 +365,7 @@ namespace OpenSim.Region.CoreModules.World.Land
401 } 365 }
402 366
403 if (parcelAvatarIsEntering != null) 367 if (parcelAvatarIsEntering != null)
404 { 368 EnforceBans(parcelAvatarIsEntering, avatar);
405 if (avatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT)
406 {
407 if (parcelAvatarIsEntering.IsBannedFromLand(avatar.UUID))
408 {
409 SendYouAreBannedNotice(avatar);
410 ForceAvatarToPosition(avatar, m_scene.GetNearestAllowedPosition(avatar));
411 }
412 else if (parcelAvatarIsEntering.IsRestrictedFromLand(avatar.UUID))
413 {
414 SendYouAreRestrictedNotice(avatar);
415 ForceAvatarToPosition(avatar, m_scene.GetNearestAllowedPosition(avatar));
416 }
417 else
418 {
419 avatar.sentMessageAboutRestrictedParcelFlyingDown = true;
420 }
421 }
422 else
423 {
424 avatar.sentMessageAboutRestrictedParcelFlyingDown = true;
425 }
426 }
427 } 369 }
428 } 370 }
429 371
@@ -527,6 +469,7 @@ namespace OpenSim.Region.CoreModules.World.Land
527 //when we are finally in a safe place, lets release the forced position lock 469 //when we are finally in a safe place, lets release the forced position lock
528 forcedPosition.Remove(clientAvatar.ControllingClient.AgentId); 470 forcedPosition.Remove(clientAvatar.ControllingClient.AgentId);
529 } 471 }
472 EnforceBans(parcel, clientAvatar);
530 } 473 }
531 } 474 }
532 475
@@ -735,7 +678,7 @@ namespace OpenSim.Region.CoreModules.World.Land
735 int x; 678 int x;
736 int y; 679 int y;
737 680
738 if (x_float >= Constants.RegionSize || x_float < 0 || y_float >= Constants.RegionSize || y_float < 0) 681 if (x_float > Constants.RegionSize || x_float < 0 || y_float > Constants.RegionSize || y_float < 0)
739 return null; 682 return null;
740 683
741 try 684 try
@@ -785,14 +728,13 @@ namespace OpenSim.Region.CoreModules.World.Land
785 { 728 {
786 try 729 try
787 { 730 {
788 return m_landList[m_landIDList[x / 4, y / 4]]; 731 //if (m_landList.ContainsKey(m_landIDList[x / 4, y / 4]))
732 return m_landList[m_landIDList[x / 4, y / 4]];
733 //else
734 // return null;
789 } 735 }
790 catch (IndexOutOfRangeException) 736 catch (IndexOutOfRangeException)
791 { 737 {
792// m_log.WarnFormat(
793// "[LAND MANAGEMENT MODULE]: Tried to retrieve land object from out of bounds co-ordinate ({0},{1}) in {2}",
794// x, y, m_scene.RegionInfo.RegionName);
795
796 return null; 738 return null;
797 } 739 }
798 } 740 }
@@ -1075,6 +1017,10 @@ namespace OpenSim.Region.CoreModules.World.Land
1075 //Owner Flag 1017 //Owner Flag
1076 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_OWNED_BY_REQUESTER); 1018 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_OWNED_BY_REQUESTER);
1077 } 1019 }
1020 else if (currentParcelBlock.LandData.IsGroupOwned && remote_client.IsGroupMember(currentParcelBlock.LandData.GroupID))
1021 {
1022 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_OWNED_BY_GROUP);
1023 }
1078 else if (currentParcelBlock.LandData.SalePrice > 0 && 1024 else if (currentParcelBlock.LandData.SalePrice > 0 &&
1079 (currentParcelBlock.LandData.AuthBuyerID == UUID.Zero || 1025 (currentParcelBlock.LandData.AuthBuyerID == UUID.Zero ||
1080 currentParcelBlock.LandData.AuthBuyerID == remote_client.AgentId)) 1026 currentParcelBlock.LandData.AuthBuyerID == remote_client.AgentId))
@@ -1375,18 +1321,31 @@ namespace OpenSim.Region.CoreModules.World.Land
1375 1321
1376 public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data) 1322 public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data)
1377 { 1323 {
1378 for (int i = 0; i < data.Count; i++) 1324 lock (m_landList)
1379 { 1325 {
1380 IncomingLandObjectFromStorage(data[i]); 1326 //Remove all the land objects in the sim and then process our new data
1327 foreach (int n in m_landList.Keys)
1328 {
1329 m_scene.EventManager.TriggerLandObjectRemoved(m_landList[n].LandData.GlobalID);
1330 }
1331 m_landIDList.Initialize();
1332 m_landList.Clear();
1333
1334 for (int i = 0; i < data.Count; i++)
1335 {
1336 IncomingLandObjectFromStorage(data[i]);
1337 }
1381 } 1338 }
1382 } 1339 }
1383 1340
1384 public void IncomingLandObjectFromStorage(LandData data) 1341 public void IncomingLandObjectFromStorage(LandData data)
1385 { 1342 {
1343
1386 ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene); 1344 ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene);
1387 new_land.LandData = data.Copy(); 1345 new_land.LandData = data.Copy();
1388 new_land.SetLandBitmapFromByteArray(); 1346 new_land.SetLandBitmapFromByteArray();
1389 AddLandObject(new_land); 1347 AddLandObject(new_land);
1348 new_land.SendLandUpdateToAvatarsOverMe();
1390 } 1349 }
1391 1350
1392 public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient) 1351 public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient)
@@ -1664,6 +1623,168 @@ namespace OpenSim.Region.CoreModules.World.Land
1664 1623
1665 UpdateLandObject(localID, land.LandData); 1624 UpdateLandObject(localID, land.LandData);
1666 } 1625 }
1626
1627 public void ClientOnParcelGodMark(IClientAPI client, UUID god, int landID)
1628 {
1629 ILandObject land = null;
1630 List<ILandObject> Land = ((Scene)client.Scene).LandChannel.AllParcels();
1631 foreach (ILandObject landObject in Land)
1632 {
1633 if (landObject.LandData.LocalID == landID)
1634 {
1635 land = landObject;
1636 }
1637 }
1638 land.DeedToGroup(DefaultGodParcelGroup);
1639 land.LandData.Name = DefaultGodParcelName;
1640 land.SendLandUpdateToAvatarsOverMe();
1641 }
1642
1643 private void ClientOnSimWideDeletes(IClientAPI client, UUID agentID, int flags, UUID targetID)
1644 {
1645 ScenePresence SP;
1646 ((Scene)client.Scene).TryGetScenePresence(client.AgentId, out SP);
1647 List<SceneObjectGroup> returns = new List<SceneObjectGroup>();
1648 if (SP.UserLevel != 0)
1649 {
1650 if (flags == 0) //All parcels, scripted or not
1651 {
1652 ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e)
1653 {
1654 if (e.OwnerID == targetID)
1655 {
1656 returns.Add(e);
1657 }
1658 }
1659 );
1660 }
1661 if (flags == 4) //All parcels, scripted object
1662 {
1663 ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e)
1664 {
1665 if (e.OwnerID == targetID)
1666 {
1667 if (e.ContainsScripts())
1668 {
1669 returns.Add(e);
1670 }
1671 }
1672 }
1673 );
1674 }
1675 if (flags == 4) //not target parcel, scripted object
1676 {
1677 ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e)
1678 {
1679 if (e.OwnerID == targetID)
1680 {
1681 ILandObject landobject = ((Scene)client.Scene).LandChannel.GetLandObject(e.AbsolutePosition.X, e.AbsolutePosition.Y);
1682 if (landobject.LandData.OwnerID != e.OwnerID)
1683 {
1684 if (e.ContainsScripts())
1685 {
1686 returns.Add(e);
1687 }
1688 }
1689 }
1690 }
1691 );
1692 }
1693 foreach (SceneObjectGroup ol in returns)
1694 {
1695 ReturnObject(ol, client);
1696 }
1697 }
1698 }
1699 public void ReturnObject(SceneObjectGroup obj, IClientAPI client)
1700 {
1701 SceneObjectGroup[] objs = new SceneObjectGroup[1];
1702 objs[0] = obj;
1703 ((Scene)client.Scene).returnObjects(objs, client.AgentId);
1704 }
1705
1706 Dictionary<UUID, System.Threading.Timer> Timers = new Dictionary<UUID, System.Threading.Timer>();
1707
1708 public void ClientOnParcelFreezeUser(IClientAPI client, UUID parcelowner, uint flags, UUID target)
1709 {
1710 ScenePresence targetAvatar = null;
1711 ((Scene)client.Scene).TryGetScenePresence(target, out targetAvatar);
1712 ScenePresence parcelManager = null;
1713 ((Scene)client.Scene).TryGetScenePresence(client.AgentId, out parcelManager);
1714 System.Threading.Timer Timer;
1715
1716 if (targetAvatar.UserLevel == 0)
1717 {
1718 ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y);
1719 if (!((Scene)client.Scene).Permissions.CanEditParcelProperties(client.AgentId, land, GroupPowers.LandEjectAndFreeze))
1720 return;
1721 if (flags == 0)
1722 {
1723 targetAvatar.AllowMovement = false;
1724 targetAvatar.ControllingClient.SendAlertMessage(parcelManager.Firstname + " " + parcelManager.Lastname + " has frozen you for 30 seconds. You cannot move or interact with the world.");
1725 parcelManager.ControllingClient.SendAlertMessage("Avatar Frozen.");
1726 System.Threading.TimerCallback timeCB = new System.Threading.TimerCallback(OnEndParcelFrozen);
1727 Timer = new System.Threading.Timer(timeCB, targetAvatar, 30000, 0);
1728 Timers.Add(targetAvatar.UUID, Timer);
1729 }
1730 else
1731 {
1732 targetAvatar.AllowMovement = true;
1733 targetAvatar.ControllingClient.SendAlertMessage(parcelManager.Firstname + " " + parcelManager.Lastname + " has unfrozen you.");
1734 parcelManager.ControllingClient.SendAlertMessage("Avatar Unfrozen.");
1735 Timers.TryGetValue(targetAvatar.UUID, out Timer);
1736 Timers.Remove(targetAvatar.UUID);
1737 Timer.Dispose();
1738 }
1739 }
1740 }
1741 private void OnEndParcelFrozen(object avatar)
1742 {
1743 ScenePresence targetAvatar = (ScenePresence)avatar;
1744 targetAvatar.AllowMovement = true;
1745 System.Threading.Timer Timer;
1746 Timers.TryGetValue(targetAvatar.UUID, out Timer);
1747 Timers.Remove(targetAvatar.UUID);
1748 targetAvatar.ControllingClient.SendAgentAlertMessage("The freeze has worn off; you may go about your business.", false);
1749 }
1750
1751
1752 public void ClientOnParcelEjectUser(IClientAPI client, UUID parcelowner, uint flags, UUID target)
1753 {
1754 ScenePresence targetAvatar = null;
1755 ScenePresence parcelManager = null;
1756
1757 // Must have presences
1758 if (!m_scene.TryGetScenePresence(target, out targetAvatar) ||
1759 !m_scene.TryGetScenePresence(client.AgentId, out parcelManager))
1760 return;
1761
1762 // Cannot eject estate managers or gods
1763 if (m_scene.Permissions.IsAdministrator(target))
1764 return;
1765
1766 // Check if you even have permission to do this
1767 ILandObject land = m_scene.LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y);
1768 if (!m_scene.Permissions.CanEditParcelProperties(client.AgentId, land, GroupPowers.LandEjectAndFreeze) &&
1769 !m_scene.Permissions.IsAdministrator(client.AgentId))
1770 return;
1771
1772 Vector3 pos = m_scene.GetNearestAllowedPosition(targetAvatar, land);
1773
1774 targetAvatar.TeleportWithMomentum(pos);
1775 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1776 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected.");
1777
1778 if ((flags & 1) != 0) // Ban TODO: Remove magic number
1779 {
1780 LandAccessEntry entry = new LandAccessEntry();
1781 entry.AgentID = targetAvatar.UUID;
1782 entry.Flags = AccessList.Ban;
1783 entry.Expires = 0; // Perm
1784
1785 land.LandData.ParcelAccessList.Add(entry);
1786 }
1787 }
1667 1788
1668 protected void InstallInterfaces() 1789 protected void InstallInterfaces()
1669 { 1790 {
@@ -1726,5 +1847,27 @@ namespace OpenSim.Region.CoreModules.World.Land
1726 1847
1727 MainConsole.Instance.Output(report.ToString()); 1848 MainConsole.Instance.Output(report.ToString());
1728 } 1849 }
1850
1851 public void EnforceBans(ILandObject land, ScenePresence avatar)
1852 {
1853 if (avatar.AbsolutePosition.Z > LandChannel.BAN_LINE_SAFETY_HIEGHT)
1854 return;
1855
1856 if (land.IsEitherBannedOrRestricted(avatar.UUID))
1857 {
1858 if (land.ContainsPoint(Convert.ToInt32(avatar.lastKnownAllowedPosition.X), Convert.ToInt32(avatar.lastKnownAllowedPosition.Y)))
1859 {
1860 Vector3? pos = m_scene.GetNearestAllowedPosition(avatar);
1861 if (pos == null)
1862 m_scene.TeleportClientHome(avatar.UUID, avatar.ControllingClient);
1863 else
1864 ForceAvatarToPosition(avatar, (Vector3)pos);
1865 }
1866 else
1867 {
1868 ForceAvatarToPosition(avatar, avatar.lastKnownAllowedPosition);
1869 }
1870 }
1871 }
1729 } 1872 }
1730} 1873}
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
index 0536f6e..16792b3 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
@@ -193,10 +193,27 @@ namespace OpenSim.Region.CoreModules.World.Land
193 else 193 else
194 { 194 {
195 // Normal Calculations 195 // Normal Calculations
196 int parcelMax = (int)(((float)LandData.Area / 65536.0f) 196 int parcelMax = (int)((long)LandData.Area
197 * (float)m_scene.RegionInfo.ObjectCapacity 197 * (long)m_scene.RegionInfo.ObjectCapacity
198 * (float)m_scene.RegionInfo.RegionSettings.ObjectBonus); 198 * (long)m_scene.RegionInfo.RegionSettings.ObjectBonus
199 // TODO: The calculation of ObjectBonus should be refactored. It does still not work in the same manner as SL! 199 / 65536L);
200 m_log.DebugFormat("Area: {0}, Capacity {1}, Bonus {2}, Parcel {3}", LandData.Area, m_scene.RegionInfo.ObjectCapacity, m_scene.RegionInfo.RegionSettings.ObjectBonus, parcelMax);
201 return parcelMax;
202 }
203 }
204
205 private int GetParcelBasePrimCount()
206 {
207 if (overrideParcelMaxPrimCount != null)
208 {
209 return overrideParcelMaxPrimCount(this);
210 }
211 else
212 {
213 // Normal Calculations
214 int parcelMax = (int)((long)LandData.Area
215 * (long)m_scene.RegionInfo.ObjectCapacity
216 / 65536L);
200 return parcelMax; 217 return parcelMax;
201 } 218 }
202 } 219 }
@@ -210,8 +227,9 @@ namespace OpenSim.Region.CoreModules.World.Land
210 else 227 else
211 { 228 {
212 //Normal Calculations 229 //Normal Calculations
213 int simMax = (int)(((float)LandData.SimwideArea / 65536.0f) 230 int simMax = (int)((long)LandData.SimwideArea
214 * (float)m_scene.RegionInfo.ObjectCapacity); 231 * (long)m_scene.RegionInfo.ObjectCapacity / 65536L);
232 // m_log.DebugFormat("Simwide Area: {0}, Capacity {1}, SimMax {2}", LandData.SimwideArea, m_scene.RegionInfo.ObjectCapacity, simMax);
215 return simMax; 233 return simMax;
216 } 234 }
217 } 235 }
@@ -248,7 +266,7 @@ namespace OpenSim.Region.CoreModules.World.Land
248 remote_client.SendLandProperties(seq_id, 266 remote_client.SendLandProperties(seq_id,
249 snap_selection, request_result, this, 267 snap_selection, request_result, this,
250 (float)m_scene.RegionInfo.RegionSettings.ObjectBonus, 268 (float)m_scene.RegionInfo.RegionSettings.ObjectBonus,
251 GetParcelMaxPrimCount(), 269 GetParcelBasePrimCount(),
252 GetSimulatorMaxPrimCount(), regionFlags); 270 GetSimulatorMaxPrimCount(), regionFlags);
253 } 271 }
254 272
@@ -308,7 +326,7 @@ namespace OpenSim.Region.CoreModules.World.Land
308 326
309 allowedDelta |= (uint)(ParcelFlags.ShowDirectory | 327 allowedDelta |= (uint)(ParcelFlags.ShowDirectory |
310 ParcelFlags.AllowPublish | 328 ParcelFlags.AllowPublish |
311 ParcelFlags.MaturePublish); 329 ParcelFlags.MaturePublish) | (uint)(1 << 23);
312 } 330 }
313 331
314 if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.LandChangeIdentity)) 332 if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.LandChangeIdentity))
diff --git a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
index efede5c..5122734 100644
--- a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
@@ -206,7 +206,7 @@ namespace OpenSim.Region.CoreModules.World.Land
206 if (m_ParcelCounts.TryGetValue(landData.GlobalID, out parcelCounts)) 206 if (m_ParcelCounts.TryGetValue(landData.GlobalID, out parcelCounts))
207 { 207 {
208 UUID landOwner = landData.OwnerID; 208 UUID landOwner = landData.OwnerID;
209 int partCount = obj.Parts.Length; 209 int partCount = obj.GetPartCount();
210 210
211 m_SimwideCounts[landOwner] += partCount; 211 m_SimwideCounts[landOwner] += partCount;
212 if (parcelCounts.Users.ContainsKey(obj.OwnerID)) 212 if (parcelCounts.Users.ContainsKey(obj.OwnerID))
@@ -593,4 +593,4 @@ namespace OpenSim.Region.CoreModules.World.Land
593 } 593 }
594 } 594 }
595 } 595 }
596} \ No newline at end of file 596}
diff --git a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs
index 1e4f0a4..eb4731c 100644
--- a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs
+++ b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs
@@ -176,6 +176,13 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
176 return false; 176 return false;
177 } 177 }
178 178
179 if ((perms & (uint)PermissionMask.Copy) == 0)
180 {
181 if (m_dialogModule != null)
182 m_dialogModule.SendAlertToUser(remoteClient, "This sale has been blocked by the permissions system");
183 return false;
184 }
185
179 AssetBase asset = m_scene.CreateAsset( 186 AssetBase asset = m_scene.CreateAsset(
180 group.GetPartName(localID), 187 group.GetPartName(localID),
181 group.GetPartDescription(localID), 188 group.GetPartDescription(localID),
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
index 2032905..881b24a 100644
--- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
@@ -367,7 +367,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
367 367
368 public string Name 368 public string Name
369 { 369 {
370 get { return "PermissionsModule"; } 370 get { return "DefaultPermissionsModule"; }
371 } 371 }
372 372
373 public bool IsSharedModule 373 public bool IsSharedModule
diff --git a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
index fea4de0..65180b5a 100644
--- a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
+++ b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
@@ -28,6 +28,8 @@
28using System; 28using System;
29using System.Reflection; 29using System.Reflection;
30using System.Timers; 30using System.Timers;
31using System.IO;
32using System.Diagnostics;
31using System.Threading; 33using System.Threading;
32using System.Collections.Generic; 34using System.Collections.Generic;
33using log4net; 35using log4net;
@@ -56,13 +58,23 @@ namespace OpenSim.Region.CoreModules.World.Region
56 protected UUID m_Initiator; 58 protected UUID m_Initiator;
57 protected bool m_Notice = false; 59 protected bool m_Notice = false;
58 protected IDialogModule m_DialogModule = null; 60 protected IDialogModule m_DialogModule = null;
61 protected string m_MarkerPath = String.Empty;
59 62
60 public void Initialise(IConfigSource config) 63 public void Initialise(IConfigSource config)
61 { 64 {
65 IConfig restartConfig = config.Configs["RestartModule"];
66 if (restartConfig != null)
67 {
68 m_MarkerPath = restartConfig.GetString("MarkerPath", String.Empty);
69 }
62 } 70 }
63 71
64 public void AddRegion(Scene scene) 72 public void AddRegion(Scene scene)
65 { 73 {
74 if (m_MarkerPath != String.Empty)
75 File.Delete(Path.Combine(m_MarkerPath,
76 scene.RegionInfo.RegionID.ToString()));
77
66 m_Scene = scene; 78 m_Scene = scene;
67 79
68 scene.RegisterModuleInterface<IRestartModule>(this); 80 scene.RegisterModuleInterface<IRestartModule>(this);
@@ -121,6 +133,7 @@ namespace OpenSim.Region.CoreModules.World.Region
121 133
122 if (alerts == null) 134 if (alerts == null)
123 { 135 {
136 CreateMarkerFile();
124 m_Scene.RestartNow(); 137 m_Scene.RestartNow();
125 return; 138 return;
126 } 139 }
@@ -134,6 +147,7 @@ namespace OpenSim.Region.CoreModules.World.Region
134 147
135 if (m_Alerts[0] == 0) 148 if (m_Alerts[0] == 0)
136 { 149 {
150 CreateMarkerFile();
137 m_Scene.RestartNow(); 151 m_Scene.RestartNow();
138 return; 152 return;
139 } 153 }
@@ -147,6 +161,7 @@ namespace OpenSim.Region.CoreModules.World.Region
147 { 161 {
148 if (m_Alerts.Count == 0 || m_Alerts[0] == 0) 162 if (m_Alerts.Count == 0 || m_Alerts[0] == 0)
149 { 163 {
164 CreateMarkerFile();
150 m_Scene.RestartNow(); 165 m_Scene.RestartNow();
151 return 0; 166 return 0;
152 } 167 }
@@ -225,6 +240,9 @@ namespace OpenSim.Region.CoreModules.World.Region
225 if (m_DialogModule != null && message != String.Empty) 240 if (m_DialogModule != null && message != String.Empty)
226 m_DialogModule.SendGeneralAlert(message); 241 m_DialogModule.SendGeneralAlert(message);
227 } 242 }
243 if (m_MarkerPath != String.Empty)
244 File.Delete(Path.Combine(m_MarkerPath,
245 m_Scene.RegionInfo.RegionID.ToString()));
228 } 246 }
229 247
230 private void HandleRegionRestart(string module, string[] args) 248 private void HandleRegionRestart(string module, string[] args)
@@ -266,5 +284,25 @@ namespace OpenSim.Region.CoreModules.World.Region
266 284
267 ScheduleRestart(UUID.Zero, args[3], times.ToArray(), notice); 285 ScheduleRestart(UUID.Zero, args[3], times.ToArray(), notice);
268 } 286 }
287
288 protected void CreateMarkerFile()
289 {
290 if (m_MarkerPath == String.Empty)
291 return;
292
293 string path = Path.Combine(m_MarkerPath, m_Scene.RegionInfo.RegionID.ToString());
294 try
295 {
296 string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();
297 FileStream fs = File.Create(path);
298 System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
299 Byte[] buf = enc.GetBytes(pidstring);
300 fs.Write(buf, 0, buf.Length);
301 fs.Close();
302 }
303 catch (Exception)
304 {
305 }
306 }
269 } 307 }
270} 308}
diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
index 8535a5a..e2bd769 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
@@ -636,6 +636,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain
636 m_scene.PhysicsScene.SetTerrain(m_channel.GetFloatsSerialised()); 636 m_scene.PhysicsScene.SetTerrain(m_channel.GetFloatsSerialised());
637 m_scene.SaveTerrain(); 637 m_scene.SaveTerrain();
638 638
639 m_scene.EventManager.TriggerTerrainUpdate();
640
639 // Clients who look at the map will never see changes after they looked at the map, so i've commented this out. 641 // Clients who look at the map will never see changes after they looked at the map, so i've commented this out.
640 //m_scene.CreateTerrainTexture(true); 642 //m_scene.CreateTerrainTexture(true);
641 } 643 }
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs
index 6163fd1..e6f2855 100644
--- a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs
+++ b/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs
@@ -64,6 +64,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
64 private bool m_useAntiAliasing = false; // TODO: Make this a config option 64 private bool m_useAntiAliasing = false; // TODO: Make this a config option
65 private bool m_Enabled = false; 65 private bool m_Enabled = false;
66 66
67 private Bitmap lastImage = null;
68 private DateTime lastImageTime = DateTime.MinValue;
69
67 #region IRegionModule Members 70 #region IRegionModule Members
68 71
69 public void Initialise(IConfigSource source) 72 public void Initialise(IConfigSource source)
@@ -86,14 +89,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
86 89
87 List<string> renderers = RenderingLoader.ListRenderers(Util.ExecutingDirectory()); 90 List<string> renderers = RenderingLoader.ListRenderers(Util.ExecutingDirectory());
88 if (renderers.Count > 0) 91 if (renderers.Count > 0)
89 { 92 m_log.Info("[MAPTILE]: Loaded prim mesher " + renderers[0]);
90 m_primMesher = RenderingLoader.LoadRenderer(renderers[0]);
91 m_log.Info("[MAPTILE]: Loaded prim mesher " + m_primMesher.ToString());
92 }
93 else 93 else
94 {
95 m_log.Info("[MAPTILE]: No prim mesher loaded, prim rendering will be disabled"); 94 m_log.Info("[MAPTILE]: No prim mesher loaded, prim rendering will be disabled");
96 }
97 95
98 m_scene.RegisterModuleInterface<IMapImageGenerator>(this); 96 m_scene.RegisterModuleInterface<IMapImageGenerator>(this);
99 } 97 }
@@ -126,9 +124,25 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
126 124
127 public Bitmap CreateMapTile() 125 public Bitmap CreateMapTile()
128 { 126 {
127 if ((DateTime.Now - lastImageTime).TotalSeconds < 3600)
128 {
129 return lastImage.Clone(new Rectangle(0, 0, 256, 256), lastImage.PixelFormat);
130 }
131
132 List<string> renderers = RenderingLoader.ListRenderers(Util.ExecutingDirectory());
133 if (renderers.Count > 0)
134 {
135 m_primMesher = RenderingLoader.LoadRenderer(renderers[0]);
136 }
137
129 Vector3 camPos = new Vector3(127.5f, 127.5f, 221.7025033688163f); 138 Vector3 camPos = new Vector3(127.5f, 127.5f, 221.7025033688163f);
130 Viewport viewport = new Viewport(camPos, -Vector3.UnitZ, 1024f, 0.1f, (int)Constants.RegionSize, (int)Constants.RegionSize, (float)Constants.RegionSize, (float)Constants.RegionSize); 139 Viewport viewport = new Viewport(camPos, -Vector3.UnitZ, 1024f, 0.1f, (int)Constants.RegionSize, (int)Constants.RegionSize, (float)Constants.RegionSize, (float)Constants.RegionSize);
131 return CreateMapTile(viewport, false); 140 Bitmap tile = CreateMapTile(viewport, false);
141 m_primMesher = null;
142
143 lastImage = tile;
144 lastImageTime = DateTime.Now;
145 return lastImage.Clone(new Rectangle(0, 0, 256, 256), lastImage.PixelFormat);
132 } 146 }
133 147
134 public Bitmap CreateViewImage(Vector3 camPos, Vector3 camDir, float fov, int width, int height, bool useTextures) 148 public Bitmap CreateViewImage(Vector3 camPos, Vector3 camDir, float fov, int width, int height, bool useTextures)
@@ -655,4 +669,4 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
655 return result; 669 return result;
656 } 670 }
657 } 671 }
658} \ No newline at end of file 672}
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
index f37dd94..4e6bfb8 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
@@ -86,9 +86,9 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
86 86
87 private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags) 87 private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags)
88 { 88 {
89 if (mapName.Length < 3) 89 if (mapName.Length < 2)
90 { 90 {
91 remoteClient.SendAlertMessage("Use a search string with at least 3 characters"); 91 remoteClient.SendAlertMessage("Use a search string with at least 2 characters");
92 return; 92 return;
93 } 93 }
94 94
@@ -112,10 +112,10 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
112 112
113 // try to fetch from GridServer 113 // try to fetch from GridServer
114 List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20); 114 List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20);
115 if (regionInfos.Count == 0) 115// if (regionInfos.Count == 0)
116 remoteClient.SendAlertMessage("Hyperlink could not be established."); 116// remoteClient.SendAlertMessage("Hyperlink could not be established.");
117 117
118 m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions. Flags={2}", mapName, regionInfos.Count, flags); 118 //m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count);
119 List<MapBlockData> blocks = new List<MapBlockData>(); 119 List<MapBlockData> blocks = new List<MapBlockData>();
120 120
121 MapBlockData data; 121 MapBlockData data;
@@ -149,7 +149,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
149 data.Agents = 0; 149 data.Agents = 0;
150 data.Access = 255; 150 data.Access = 255;
151 data.MapImageId = UUID.Zero; 151 data.MapImageId = UUID.Zero;
152 data.Name = ""; // mapName; 152 data.Name = mapName;
153 data.RegionFlags = 0; 153 data.RegionFlags = 0;
154 data.WaterHeight = 0; // not used 154 data.WaterHeight = 0; // not used
155 data.X = 0; 155 data.X = 0;
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
index faaf928..899e5ea 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
@@ -1240,7 +1240,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
1240 } 1240 }
1241 else 1241 else
1242 { 1242 {
1243 OSDArray responsearr = new OSDArray(m_scene.GetRootAgentCount()); 1243 OSDArray responsearr = new OSDArray(); // Don't preallocate. MT (m_scene.GetRootAgentCount());
1244 m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) 1244 m_scene.ForEachRootScenePresence(delegate(ScenePresence sp)
1245 { 1245 {
1246 OSDMap responsemapdata = new OSDMap(); 1246 OSDMap responsemapdata = new OSDMap();
@@ -1459,9 +1459,10 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
1459 Color background = Color.FromArgb(0, 0, 0, 0); 1459 Color background = Color.FromArgb(0, 0, 0, 0);
1460 SolidBrush transparent = new SolidBrush(background); 1460 SolidBrush transparent = new SolidBrush(background);
1461 Graphics g = Graphics.FromImage(overlay); 1461 Graphics g = Graphics.FromImage(overlay);
1462 g.FillRectangle(transparent, 0, 0, 256, 256); 1462 g.FillRectangle(transparent, 0, 0, 255, 255);
1463 1463
1464 SolidBrush yellow = new SolidBrush(Color.FromArgb(255, 249, 223, 9)); 1464 SolidBrush yellow = new SolidBrush(Color.FromArgb(255, 249, 223, 9));
1465 Pen grey = new Pen(Color.FromArgb(255, 92, 92, 92));
1465 1466
1466 foreach (ILandObject land in parcels) 1467 foreach (ILandObject land in parcels)
1467 { 1468 {
@@ -1469,8 +1470,42 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
1469 if ((land.LandData.Flags & (uint)ParcelFlags.ForSale) != 0) 1470 if ((land.LandData.Flags & (uint)ParcelFlags.ForSale) != 0)
1470 { 1471 {
1471 landForSale = true; 1472 landForSale = true;
1473
1474 bool[,] landBitmap = land.GetLandBitmap();
1475
1476 for (int x = 0 ; x < 64 ; x++)
1477 {
1478 for (int y = 0 ; y < 64 ; y++)
1479 {
1480 if (landBitmap[x, y])
1481 {
1482 g.FillRectangle(yellow, x * 4, 252 - (y * 4), 4, 4);
1483
1484 if (x > 0)
1485 {
1486 if ((saleBitmap[x - 1, y] || landBitmap[x - 1, y]) == false)
1487 g.DrawLine(grey, x * 4, 252 - (y * 4), x * 4, 255 - (y * 4));
1488 }
1489 if (y > 0)
1490 {
1491 if ((saleBitmap[x, y-1] || landBitmap[x, y-1]) == false)
1492 g.DrawLine(grey, x * 4, 255 - (y * 4), x * 4 + 3, 255 - (y * 4));
1493 }
1494 if (x < 63)
1495 {
1496 if ((saleBitmap[x + 1, y] || landBitmap[x + 1, y]) == false)
1497 g.DrawLine(grey, x * 4 + 3, 252 - (y * 4), x * 4 + 3, 255 - (y * 4));
1498 }
1499 if (y < 63)
1500 {
1501 if ((saleBitmap[x, y + 1] || landBitmap[x, y + 1]) == false)
1502 g.DrawLine(grey, x * 4, 252 - (y * 4), x * 4 + 3, 252 - (y * 4));
1503 }
1504 }
1505 }
1506 }
1472 1507
1473 saleBitmap = land.MergeLandBitmaps(saleBitmap, land.GetLandBitmap()); 1508 saleBitmap = land.MergeLandBitmaps(saleBitmap, landBitmap);
1474 } 1509 }
1475 } 1510 }
1476 1511
@@ -1482,15 +1517,6 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
1482 1517
1483 m_log.DebugFormat("[WORLD MAP]: Region {0} has parcels for sale, generating overlay", m_scene.RegionInfo.RegionName); 1518 m_log.DebugFormat("[WORLD MAP]: Region {0} has parcels for sale, generating overlay", m_scene.RegionInfo.RegionName);
1484 1519
1485 for (int x = 0 ; x < 64 ; x++)
1486 {
1487 for (int y = 0 ; y < 64 ; y++)
1488 {
1489 if (saleBitmap[x, y])
1490 g.FillRectangle(yellow, x * 4, 252 - (y * 4), 4, 4);
1491 }
1492 }
1493
1494 try 1520 try
1495 { 1521 {
1496 return OpenJPEG.EncodeFromImage(overlay, true); 1522 return OpenJPEG.EncodeFromImage(overlay, true);