aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs39
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs115
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs4
-rw-r--r--OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs25
-rw-r--r--OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs5
-rw-r--r--OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs70
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs63
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs57
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs19
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs761
-rw-r--r--OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs10
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs74
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs17
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs15
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs18
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs37
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs351
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandObject.cs24
-rw-r--r--OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs4
22 files changed, 1258 insertions, 456 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 1744fb3..fc92fc3 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;
@@ -233,15 +234,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
233 public UUID RezSingleAttachmentFromInventory( 234 public UUID RezSingleAttachmentFromInventory(
234 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus) 235 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus)
235 { 236 {
236 m_log.DebugFormat( 237 return RezSingleAttachmentFromInventory(remoteClient, itemID, AttachmentPt, true, null);
237 "[ATTACHMENTS MODULE]: Rezzing attachment to point {0} from item {1} for {2}", 238 }
238 (AttachmentPoint)AttachmentPt, itemID, remoteClient.Name); 239
239 240 public UUID RezSingleAttachmentFromInventory(
241 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc)
242 {
240 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should 243 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
241 // be removed when that functionality is implemented in opensim 244 // be removed when that functionality is implemented in opensim
242 AttachmentPt &= 0x7f; 245 AttachmentPt &= 0x7f;
243 246
244 SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(remoteClient, itemID, AttachmentPt); 247 SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(remoteClient, itemID, AttachmentPt, doc);
245 248
246 if (updateInventoryStatus) 249 if (updateInventoryStatus)
247 { 250 {
@@ -258,7 +261,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
258 } 261 }
259 262
260 protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( 263 protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal(
261 IClientAPI remoteClient, UUID itemID, uint AttachmentPt) 264 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, XmlDocument doc)
262 { 265 {
263 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); 266 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
264 if (invAccess != null) 267 if (invAccess != null)
@@ -296,13 +299,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
296 if (tainted) 299 if (tainted)
297 objatt.HasGroupChanged = true; 300 objatt.HasGroupChanged = true;
298 301
302 if (doc != null)
303 {
304 objatt.LoadScriptState(doc);
305 objatt.ResetOwnerChangeFlag();
306 }
307
299 // Fire after attach, so we don't get messy perms dialogs 308 // Fire after attach, so we don't get messy perms dialogs
300 // 4 == AttachedRez 309 // 4 == AttachedRez
301 objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4); 310 objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4);
302 objatt.ResumeScripts(); 311 objatt.ResumeScripts();
303 312
304 // Do this last so that event listeners have access to all the effects of the attachment 313 // Do this last so that event listeners have access to all the effects of the attachment
305 m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId); 314 //m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId);
306 } 315 }
307 else 316 else
308 { 317 {
@@ -339,9 +348,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
339 if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) 348 if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence))
340 { 349 {
341 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 350 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
342 item = m_scene.InventoryService.GetItem(item); 351 if (m_scene.InventoryService != null)
352 item = m_scene.InventoryService.GetItem(item);
343 353
344 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); 354 if (presence.Appearance != null)
355 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/);
345 } 356 }
346 357
347 return att.UUID; 358 return att.UUID;
@@ -384,6 +395,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
384 { 395 {
385 // XXYY!! 396 // XXYY!!
386 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 397 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
398 if (item == null)
399 m_log.Error("[ATTACHMENT]: item == null");
400 if (m_scene == null)
401 m_log.Error("[ATTACHMENT]: m_scene == null");
402 if (m_scene.InventoryService == null)
403 m_log.Error("[ATTACHMENT]: m_scene.InventoryService == null");
387 item = m_scene.InventoryService.GetItem(item); 404 item = m_scene.InventoryService.GetItem(item);
388 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */); 405 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */);
389 406
@@ -472,6 +489,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
472 if (group.GetFromItemID() == itemID) 489 if (group.GetFromItemID() == itemID)
473 { 490 {
474 m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); 491 m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero);
492 // CM / XMREngine!!!! Needed to conclude attach event
493 //SceneObjectSerializer.ToOriginalXmlFormat(group);
475 group.DetachToInventoryPrep(); 494 group.DetachToInventoryPrep();
476 m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString()); 495 m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString());
477 496
@@ -598,7 +617,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
598 // 617 //
599 if (so.IsSelected) 618 if (so.IsSelected)
600 { 619 {
601 m_scene.SendKillObject(so.RootPart.LocalId); 620 m_scene.SendKillObject(new List<uint> { so.RootPart.LocalId });
602 } 621 }
603 622
604 so.IsSelected = false; // fudge.... 623 so.IsSelected = false; // fudge....
diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
index 4359c01..35a3f43 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 string message = c.Message; 200 string message = c.Message;
190 IScene scene = c.Scene; 201 IScene scene = c.Scene;
@@ -207,7 +218,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
207 fromPos = avatar.AbsolutePosition; 218 fromPos = avatar.AbsolutePosition;
208 fromName = avatar.Name; 219 fromName = avatar.Name;
209 fromID = c.Sender.AgentId; 220 fromID = c.Sender.AgentId;
210 221 if (avatar.GodLevel >= 200)
222 {
223 fromNamePrefix = m_adminPrefix;
224 }
211 break; 225 break;
212 226
213 case ChatSourceType.Object: 227 case ChatSourceType.Object:
@@ -231,8 +245,20 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
231 s.ForEachScenePresence( 245 s.ForEachScenePresence(
232 delegate(ScenePresence presence) 246 delegate(ScenePresence presence)
233 { 247 {
234 if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, c.Type, message, sourceType)) 248 ILandObject Presencecheck = s.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y);
235 receiverIDs.Add(presence.UUID); 249 if (Presencecheck != null)
250 {
251 // This will pass all chat from objects. Not
252 // perfect, but it will do. For now. Better
253 // than the prior behavior of muting all
254 // objects on a parcel with access restrictions
255 if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true)
256 {
257 if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix + fromName, c.Type, message, sourceType))
258 receiverIDs.Add(presence.UUID);
259 }
260 }
261
236 } 262 }
237 ); 263 );
238 } 264 }
@@ -276,31 +302,34 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
276 } 302 }
277 303
278 // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType); 304 // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType);
279
280 HashSet<UUID> receiverIDs = new HashSet<UUID>(); 305 HashSet<UUID> receiverIDs = new HashSet<UUID>();
281 306
282 ((Scene)c.Scene).ForEachScenePresence( 307 if (c.Scene != null)
283 delegate(ScenePresence presence) 308 {
284 { 309 ((Scene)c.Scene).ForEachScenePresence
285 // ignore chat from child agents 310 (
286 if (presence.IsChildAgent) return; 311 delegate(ScenePresence presence)
287 312 {
288 IClientAPI client = presence.ControllingClient; 313 // ignore chat from child agents
289 314 if (presence.IsChildAgent) return;
290 // don't forward SayOwner chat from objects to 315
291 // non-owner agents 316 IClientAPI client = presence.ControllingClient;
292 if ((c.Type == ChatTypeEnum.Owner) && 317
293 (null != c.SenderObject) && 318 // don't forward SayOwner chat from objects to
294 (((SceneObjectPart)c.SenderObject).OwnerID != client.AgentId)) 319 // non-owner agents
295 return; 320 if ((c.Type == ChatTypeEnum.Owner) &&
296 321 (null != c.SenderObject) &&
297 client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID, 322 (((SceneObjectPart)c.SenderObject).OwnerID != client.AgentId))
298 (byte)sourceType, (byte)ChatAudibleLevel.Fully); 323 return;
299 receiverIDs.Add(presence.UUID); 324
300 }); 325 client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID,
301 326 (byte)sourceType, (byte)ChatAudibleLevel.Fully);
302 (c.Scene as Scene).EventManager.TriggerOnChatToClients( 327 receiverIDs.Add(presence.UUID);
303 fromID, receiverIDs, c.Message, cType, CenterOfRegion, fromName, sourceType, ChatAudibleLevel.Fully); 328 }
329 );
330 (c.Scene as Scene).EventManager.TriggerOnChatToClients(
331 fromID, receiverIDs, c.Message, cType, CenterOfRegion, fromName, sourceType, ChatAudibleLevel.Fully);
332 }
304 } 333 }
305 334
306 /// <summary> 335 /// <summary>
@@ -343,5 +372,35 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
343 372
344 return true; 373 return true;
345 } 374 }
375
376 Dictionary<UUID, System.Threading.Timer> Timers = new Dictionary<UUID, System.Threading.Timer>();
377 public void ParcelFreezeUser(IClientAPI client, UUID parcelowner, uint flags, UUID target)
378 {
379 System.Threading.Timer Timer;
380 if (flags == 0)
381 {
382 FreezeCache.Add(target.ToString());
383 System.Threading.TimerCallback timeCB = new System.Threading.TimerCallback(OnEndParcelFrozen);
384 Timer = new System.Threading.Timer(timeCB, target, 30000, 0);
385 Timers.Add(target, Timer);
386 }
387 else
388 {
389 FreezeCache.Remove(target.ToString());
390 Timers.TryGetValue(target, out Timer);
391 Timers.Remove(target);
392 Timer.Dispose();
393 }
394 }
395
396 private void OnEndParcelFrozen(object avatar)
397 {
398 UUID target = (UUID)avatar;
399 FreezeCache.Remove(target.ToString());
400 System.Threading.Timer Timer;
401 Timers.TryGetValue(target, out Timer);
402 Timers.Remove(target);
403 Timer.Dispose();
404 }
346 } 405 }
347} 406}
diff --git a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
index 2b3d2a9..a514a83 100644
--- a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
@@ -239,4 +239,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
239 return result; 239 return result;
240 } 240 }
241 } 241 }
242} \ No newline at end of file 242}
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
index b3f0a25..45c3f49 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
@@ -273,7 +273,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
273 273
274 // Inform the friends that this user is online 274 // Inform the friends that this user is online
275 StatusChange(agentID, true); 275 StatusChange(agentID, true);
276 276
277 // Register that we need to send the list of online friends to this user 277 // Register that we need to send the list of online friends to this user
278 lock (m_NeedsListOfFriends) 278 lock (m_NeedsListOfFriends)
279 m_NeedsListOfFriends.Add(agentID); 279 m_NeedsListOfFriends.Add(agentID);
@@ -701,7 +701,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
701 // we're done 701 // we're done
702 return true; 702 return true;
703 } 703 }
704 704
705 return false; 705 return false;
706 } 706 }
707 707
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs
index af39565..347708d 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs
@@ -156,6 +156,31 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
156 return; 156 return;
157 } 157 }
158 158
159 DateTime dt = DateTime.UtcNow;
160
161 // Ticks from UtcNow, but make it look like local. Evil, huh?
162 dt = DateTime.SpecifyKind(dt, DateTimeKind.Local);
163
164 try
165 {
166 // Convert that to the PST timezone
167 TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("America/Los_Angeles");
168 dt = TimeZoneInfo.ConvertTime(dt, timeZoneInfo);
169 }
170 catch
171 {
172 //m_log.Info("[OFFLINE MESSAGING]: No PST timezone found on this machine. Saving with local timestamp.");
173 }
174
175 // And make it look local again to fool the unix time util
176 dt = DateTime.SpecifyKind(dt, DateTimeKind.Utc);
177
178 im.timestamp = (uint)Util.ToUnixTime(dt);
179
180 // If client is null, this message comes from storage and IS offline
181 if (client != null)
182 im.offline = 0;
183
159 if (m_TransferModule != null) 184 if (m_TransferModule != null)
160 { 185 {
161 if (client != null) 186 if (client != null)
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
index 918fa04..d8e0f96 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
@@ -145,8 +145,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
145 ScenePresence user = (ScenePresence) scene.Entities[toAgentID]; 145 ScenePresence user = (ScenePresence) scene.Entities[toAgentID];
146 if (!user.IsChildAgent) 146 if (!user.IsChildAgent)
147 { 147 {
148 // Local message 148 // m_log.DebugFormat("[INSTANT MESSAGE]: Delivering to client");
149 m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", user.Name, toAgentID);
150 user.ControllingClient.SendInstantMessage(im); 149 user.ControllingClient.SendInstantMessage(im);
151 150
152 // Message sent 151 // Message sent
@@ -168,7 +167,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
168 // Local message 167 // Local message
169 ScenePresence user = (ScenePresence) scene.Entities[toAgentID]; 168 ScenePresence user = (ScenePresence) scene.Entities[toAgentID];
170 169
171 m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", user.Name, toAgentID); 170 // m_log.DebugFormat("[INSTANT MESSAGE]: Delivering to client");
172 user.ControllingClient.SendInstantMessage(im); 171 user.ControllingClient.SendInstantMessage(im);
173 172
174 // Message sent 173 // Message sent
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs
index fdfcd10..d3db5b7 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs
@@ -172,13 +172,16 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
172 172
173 private void RetrieveInstantMessages(IClientAPI client) 173 private void RetrieveInstantMessages(IClientAPI client)
174 { 174 {
175 if (m_RestURL != "") 175 if (m_RestURL == String.Empty)
176 { 176 return;
177 m_log.DebugFormat("[OFFLINE MESSAGING] Retrieving stored messages for {0}", client.AgentId);
178 177
179 List<GridInstantMessage> msglist = SynchronousRestObjectPoster.BeginPostObject<UUID, List<GridInstantMessage>>( 178 m_log.DebugFormat("[OFFLINE MESSAGING] Retrieving stored messages for {0}", client.AgentId);
179
180 List<GridInstantMessage> msglist = SynchronousRestObjectPoster.BeginPostObject<UUID, List<GridInstantMessage>>(
180 "POST", m_RestURL + "/RetrieveMessages/", client.AgentId); 181 "POST", m_RestURL + "/RetrieveMessages/", client.AgentId);
181 182
183 if (msglist != null)
184 {
182 foreach (GridInstantMessage im in msglist) 185 foreach (GridInstantMessage im in msglist)
183 { 186 {
184 // client.SendInstantMessage(im); 187 // client.SendInstantMessage(im);
@@ -189,6 +192,17 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
189 // Needed for proper state management for stored group 192 // Needed for proper state management for stored group
190 // invitations 193 // invitations
191 // 194 //
195
196 im.offline = 1;
197
198 // Reconstruct imSessionID
199 if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent)
200 {
201 UUID fromAgentID = new UUID(im.fromAgentID);
202 UUID sessionID = fromAgentID ^ client.AgentId;
203 im.imSessionID = new Guid(sessionID.ToString());
204 }
205
192 Scene s = FindScene(client.AgentId); 206 Scene s = FindScene(client.AgentId);
193 if (s != null) 207 if (s != null)
194 s.EventManager.TriggerIncomingInstantMessage(im); 208 s.EventManager.TriggerIncomingInstantMessage(im);
@@ -198,26 +212,38 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
198 212
199 private void UndeliveredMessage(GridInstantMessage im) 213 private void UndeliveredMessage(GridInstantMessage im)
200 { 214 {
201 if ((im.offline != 0) 215 if (im.dialog != (byte)InstantMessageDialog.MessageFromObject &&
202 && (!im.fromGroup || (im.fromGroup && m_ForwardOfflineGroupMessages))) 216 im.dialog != (byte)InstantMessageDialog.MessageFromAgent &&
217 im.dialog != (byte)InstantMessageDialog.GroupNotice &&
218 im.dialog != (byte)InstantMessageDialog.GroupInvitation &&
219 im.dialog != (byte)InstantMessageDialog.InventoryOffered)
203 { 220 {
204 bool success = SynchronousRestObjectPoster.BeginPostObject<GridInstantMessage, bool>( 221 return;
205 "POST", m_RestURL+"/SaveMessage/", im); 222 }
206 223
207 if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent) 224 // It's not delivered. Make sure the scope id is saved
208 { 225 // We don't need the imSessionID here anymore, overwrite it
209 IClientAPI client = FindClient(new UUID(im.fromAgentID)); 226 Scene scene = FindScene(new UUID(im.fromAgentID));
210 if (client == null) 227 if (scene == null)
211 return; 228 scene = m_SceneList[0];
212 229 im.imSessionID = new Guid(scene.RegionInfo.ScopeID.ToString());
213 client.SendInstantMessage(new GridInstantMessage( 230
214 null, new UUID(im.toAgentID), 231 bool success = SynchronousRestObjectPoster.BeginPostObject<GridInstantMessage, bool>(
215 "System", new UUID(im.fromAgentID), 232 "POST", m_RestURL+"/SaveMessage/", im);
216 (byte)InstantMessageDialog.MessageFromAgent, 233
217 "User is not logged in. "+ 234 if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent)
218 (success ? "Message saved." : "Message not saved"), 235 {
219 false, new Vector3())); 236 IClientAPI client = FindClient(new UUID(im.fromAgentID));
220 } 237 if (client == null)
238 return;
239
240 client.SendInstantMessage(new GridInstantMessage(
241 null, new UUID(im.toAgentID),
242 "System", new UUID(im.fromAgentID),
243 (byte)InstantMessageDialog.MessageFromAgent,
244 "User is not logged in. "+
245 (success ? "Message saved." : "Message not saved"),
246 false, new Vector3()));
221 } 247 }
222 } 248 }
223 } 249 }
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
index e3d4969..528bc8d 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 {
@@ -248,6 +248,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
248 im.imSessionID = itemID.Guid; 248 im.imSessionID = itemID.Guid;
249 } 249 }
250 250
251 im.offline = 1; // Remember these
252
251 // Send the IM to the recipient. The item is already 253 // Send the IM to the recipient. The item is already
252 // in their inventory, so it will not be lost if 254 // in their inventory, so it will not be lost if
253 // they are offline. 255 // they are offline.
@@ -417,22 +419,67 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
417 /// 419 ///
418 /// </summary> 420 /// </summary>
419 /// <param name="msg"></param> 421 /// <param name="msg"></param>
420 private void OnGridInstantMessage(GridInstantMessage msg) 422 private void OnGridInstantMessage(GridInstantMessage im)
421 { 423 {
422 // Check if this is ours to handle 424 // Check if this is ours to handle
423 // 425 //
424 Scene scene = FindClientScene(new UUID(msg.toAgentID)); 426 Scene scene = FindClientScene(new UUID(im.toAgentID));
425 427
426 if (scene == null) 428 if (scene == null)
427 return; 429 return;
428 430
429 // Find agent to deliver to 431 // Find agent to deliver to
430 // 432 //
431 ScenePresence user = scene.GetScenePresence(new UUID(msg.toAgentID)); 433 ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID));
434 if (user == null)
435 return;
436
437 // This requires a little bit of processing because we have to make the
438 // new item visible in the recipient's inventory here
439 //
440 if (im.dialog == (byte) InstantMessageDialog.InventoryOffered)
441 {
442 if (im.binaryBucket.Length < 17) // Invalid
443 return;
444
445 UUID recipientID = new UUID(im.toAgentID);
446
447 // First byte is the asset type
448 AssetType assetType = (AssetType)im.binaryBucket[0];
449
450 if (AssetType.Folder == assetType)
451 {
452 UUID folderID = new UUID(im.binaryBucket, 1);
453
454 InventoryFolderBase given =
455 new InventoryFolderBase(folderID, recipientID);
456 InventoryFolderBase folder =
457 scene.InventoryService.GetFolder(given);
458
459 if (folder != null)
460 user.ControllingClient.SendBulkUpdateInventory(folder);
461 }
462 else
463 {
464 UUID itemID = new UUID(im.binaryBucket, 1);
432 465
433 // Just forward to local handling 466 InventoryItemBase given =
434 OnInstantMessage(user.ControllingClient, msg); 467 new InventoryItemBase(itemID, recipientID);
468 InventoryItemBase item =
469 scene.InventoryService.GetItem(given);
435 470
471 if (item != null)
472 {
473 user.ControllingClient.SendBulkUpdateInventory(item);
474 }
475 }
476 user.ControllingClient.SendInstantMessage(im);
477 }
478 else if (im.dialog == (byte) InstantMessageDialog.InventoryAccepted ||
479 im.dialog == (byte) InstantMessageDialog.InventoryDeclined)
480 {
481 user.ControllingClient.SendInstantMessage(im);
482 }
436 } 483 }
437 } 484 }
438} 485}
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index b5cab84..3c7638d 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -99,7 +99,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
99 99
100 protected virtual void OnNewClient(IClientAPI client) 100 protected virtual void OnNewClient(IClientAPI client)
101 { 101 {
102 client.OnTeleportHomeRequest += TeleportHome; 102 client.OnTeleportHomeRequest += TeleportHomeFired;
103 } 103 }
104 104
105 public virtual void Close() 105 public virtual void Close()
@@ -269,7 +269,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
269 // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, 269 // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field,
270 // it's actually doing a lot of work. 270 // it's actually doing a lot of work.
271 IPEndPoint endPoint = finalDestination.ExternalEndPoint; 271 IPEndPoint endPoint = finalDestination.ExternalEndPoint;
272 if (endPoint.Address != null) 272 if (endPoint != null && endPoint.Address != null)
273 { 273 {
274 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from 274 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from
275 // both regions 275 // both regions
@@ -529,7 +529,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
529 529
530 protected void KillEntity(Scene scene, uint localID) 530 protected void KillEntity(Scene scene, uint localID)
531 { 531 {
532 scene.SendKillObject(localID); 532 scene.SendKillObject(new List<uint>() { localID });
533 } 533 }
534 534
535 protected virtual GridRegion GetFinalDestination(GridRegion region) 535 protected virtual GridRegion GetFinalDestination(GridRegion region)
@@ -567,7 +567,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
567 567
568 #region Teleport Home 568 #region Teleport Home
569 569
570 public virtual void TeleportHome(UUID id, IClientAPI client) 570 public void TeleportHomeFired(UUID id, IClientAPI client)
571 {
572 TeleportHome(id, client);
573 }
574
575 public virtual bool TeleportHome(UUID id, IClientAPI client)
571 { 576 {
572 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); 577 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName);
573 578
@@ -576,12 +581,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
576 581
577 if (uinfo != null) 582 if (uinfo != null)
578 { 583 {
584 if (uinfo.HomeRegionID == UUID.Zero)
585 {
586 // can't find the Home region: Tell viewer and abort
587 client.SendTeleportFailed("You don't have a home position set.");
588 return false;
589 }
579 GridRegion regionInfo = m_aScene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); 590 GridRegion regionInfo = m_aScene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID);
580 if (regionInfo == null) 591 if (regionInfo == null)
581 { 592 {
582 // can't find the Home region: Tell viewer and abort 593 // can't find the Home region: Tell viewer and abort
583 client.SendTeleportFailed("Your home region could not be found."); 594 client.SendTeleportFailed("Your home region could not be found.");
584 return; 595 return false;
585 } 596 }
586 597
587 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: User's home region is {0} {1} ({2}-{3})", 598 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: User's home region is {0} {1} ({2}-{3})",
@@ -592,6 +603,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
592 client, regionInfo.RegionHandle, uinfo.HomePosition, uinfo.HomeLookAt, 603 client, regionInfo.RegionHandle, uinfo.HomePosition, uinfo.HomeLookAt,
593 (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome)); 604 (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome));
594 } 605 }
606 else
607 {
608 // can't find the Home region: Tell viewer and abort
609 client.SendTeleportFailed("Your home region could not be found.");
610 return false;
611 }
612 return true;
595 } 613 }
596 614
597 #endregion 615 #endregion
@@ -879,15 +897,19 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
879 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); 897 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID);
880 898
881 IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>(); 899 IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>();
882 if (eq != null) 900 IPEndPoint neighbourExternal = neighbourRegion.ExternalEndPoint;
901 if (neighbourExternal != null)
883 { 902 {
884 eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, 903 if (eq != null)
885 capsPath, agent.UUID, agent.ControllingClient.SessionId); 904 {
886 } 905 eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourExternal,
887 else 906 capsPath, agent.UUID, agent.ControllingClient.SessionId);
888 { 907 }
889 agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, 908 else
890 capsPath); 909 {
910 agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourExternal,
911 capsPath);
912 }
891 } 913 }
892 914
893 if (!WaitForCallback(agent.UUID)) 915 if (!WaitForCallback(agent.UUID))
@@ -989,10 +1011,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
989 agent.Id0 = currentAgentCircuit.Id0; 1011 agent.Id0 = currentAgentCircuit.Id0;
990 } 1012 }
991 1013
992 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; 1014 IPEndPoint external = region.ExternalEndPoint;
993 d.BeginInvoke(sp, agent, region, region.ExternalEndPoint, true, 1015 if (external != null)
1016 {
1017 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
1018 d.BeginInvoke(sp, agent, region, external, true,
994 InformClientOfNeighbourCompleted, 1019 InformClientOfNeighbourCompleted,
995 d); 1020 d);
1021 }
996 } 1022 }
997 #endregion 1023 #endregion
998 1024
@@ -1125,6 +1151,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1125 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; 1151 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
1126 try 1152 try
1127 { 1153 {
1154 //neighbour.ExternalEndPoint may return null, which will be caught
1128 d.BeginInvoke(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent, 1155 d.BeginInvoke(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent,
1129 InformClientOfNeighbourCompleted, 1156 InformClientOfNeighbourCompleted,
1130 d); 1157 d);
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
index 1ac7508..47898cc 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
@@ -86,7 +86,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
86 86
87 protected override void OnNewClient(IClientAPI client) 87 protected override void OnNewClient(IClientAPI client)
88 { 88 {
89 client.OnTeleportHomeRequest += TeleportHome; 89 client.OnTeleportHomeRequest += TeleportHomeFired;
90 client.OnConnectionClosed += new Action<IClientAPI>(OnConnectionClosed); 90 client.OnConnectionClosed += new Action<IClientAPI>(OnConnectionClosed);
91 } 91 }
92 92
@@ -174,7 +174,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
174 return m_aScene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason); 174 return m_aScene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason);
175 } 175 }
176 176
177 public override void TeleportHome(UUID id, IClientAPI client) 177 public void TeleportHomeFired(UUID id, IClientAPI client)
178 {
179 TeleportHome(id, client);
180 }
181
182 public override bool TeleportHome(UUID id, IClientAPI client)
178 { 183 {
179 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); 184 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName);
180 185
@@ -184,8 +189,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
184 { 189 {
185 // local grid user 190 // local grid user
186 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local"); 191 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local");
187 base.TeleportHome(id, client); 192 return base.TeleportHome(id, client);
188 return;
189 } 193 }
190 194
191 // Foreign user wants to go home 195 // Foreign user wants to go home
@@ -195,7 +199,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
195 { 199 {
196 client.SendTeleportFailed("Your information has been lost"); 200 client.SendTeleportFailed("Your information has been lost");
197 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Unable to locate agent's gateway information"); 201 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Unable to locate agent's gateway information");
198 return; 202 return false;
199 } 203 }
200 204
201 IUserAgentService userAgentService = new UserAgentServiceConnector(aCircuit.ServiceURLs["HomeURI"].ToString()); 205 IUserAgentService userAgentService = new UserAgentServiceConnector(aCircuit.ServiceURLs["HomeURI"].ToString());
@@ -205,7 +209,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
205 { 209 {
206 client.SendTeleportFailed("Your home region could not be found"); 210 client.SendTeleportFailed("Your home region could not be found");
207 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent's home region not found"); 211 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent's home region not found");
208 return; 212 return false;
209 } 213 }
210 214
211 ScenePresence sp = ((Scene)(client.Scene)).GetScenePresence(client.AgentId); 215 ScenePresence sp = ((Scene)(client.Scene)).GetScenePresence(client.AgentId);
@@ -213,7 +217,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
213 { 217 {
214 client.SendTeleportFailed("Internal error"); 218 client.SendTeleportFailed("Internal error");
215 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent not found in the scene where it is supposed to be"); 219 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent not found in the scene where it is supposed to be");
216 return; 220 return false;
217 } 221 }
218 222
219 IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); 223 IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>();
@@ -223,6 +227,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
223 aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ExternalHostName, homeGatekeeper.HttpPort, homeGatekeeper.RegionName); 227 aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ExternalHostName, homeGatekeeper.HttpPort, homeGatekeeper.RegionName);
224 228
225 DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq); 229 DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq);
230 return true;
226 } 231 }
227 #endregion 232 #endregion
228 233
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index ef21834..2e3db48 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -28,6 +28,7 @@
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Net; 30using System.Net;
31using System.Xml;
31using System.Reflection; 32using System.Reflection;
32using System.Threading; 33using System.Threading;
33 34
@@ -191,11 +192,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
191 public virtual UUID DeleteToInventory(DeRezAction action, UUID folderID, 192 public virtual UUID DeleteToInventory(DeRezAction action, UUID folderID,
192 List<SceneObjectGroup> objectGroups, IClientAPI remoteClient) 193 List<SceneObjectGroup> objectGroups, IClientAPI remoteClient)
193 { 194 {
194 // HACK: This is only working for lists containing a single item!
195 // It's just a hack to make this WIP compile and run. Nothing
196 // currently calls this with multiple items.
197 UUID ret = UUID.Zero; 195 UUID ret = UUID.Zero;
198 196
197 // The following code groups the SOG's by owner. No objects
198 // belonging to different people can be coalesced, for obvious
199 // reasons.
199 Dictionary<UUID, List<SceneObjectGroup>> deletes = 200 Dictionary<UUID, List<SceneObjectGroup>> deletes =
200 new Dictionary<UUID, List<SceneObjectGroup>>(); 201 new Dictionary<UUID, List<SceneObjectGroup>>();
201 202
@@ -207,264 +208,334 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
207 deletes[g.OwnerID].Add(g); 208 deletes[g.OwnerID].Add(g);
208 } 209 }
209 210
211 // This is pethod scoped and will be returned. It will be the
212 // last created asset id
213 UUID assetID = UUID.Zero;
214
215 // Each iteration is really a separate asset being created,
216 // with distinct destinations as well.
210 foreach (List<SceneObjectGroup> objlist in deletes.Values) 217 foreach (List<SceneObjectGroup> objlist in deletes.Values)
211 { 218 {
212 foreach (SceneObjectGroup g in objlist) 219 Dictionary<UUID, string> xmlStrings =
213 ret = DeleteToInventory(action, folderID, g, remoteClient); 220 new Dictionary<UUID, string>();
214 }
215 221
216 return ret; 222 foreach (SceneObjectGroup objectGroup in objlist)
217 } 223 {
224 Vector3 inventoryStoredPosition = new Vector3
225 (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
226 ? 250
227 : objectGroup.AbsolutePosition.X)
228 ,
229 (objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
230 ? 250
231 : objectGroup.AbsolutePosition.X,
232 objectGroup.AbsolutePosition.Z);
218 233
219 private UUID DeleteToInventory(DeRezAction action, UUID folderID, 234 Vector3 originalPosition = objectGroup.AbsolutePosition;
220 SceneObjectGroup objectGroup, IClientAPI remoteClient)
221 {
222 UUID assetID = UUID.Zero;
223 235
224 Vector3 inventoryStoredPosition = new Vector3 236 // Restore attachment data after trip through the sim
225 (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize) 237 if (objectGroup.RootPart.AttachPoint > 0)
226 ? 250 238 inventoryStoredPosition = objectGroup.RootPart.AttachOffset;
227 : objectGroup.AbsolutePosition.X) 239 objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint;
228 ,
229 (objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
230 ? 250
231 : objectGroup.AbsolutePosition.X,
232 objectGroup.AbsolutePosition.Z);
233 240
234 Vector3 originalPosition = objectGroup.AbsolutePosition; 241 objectGroup.AbsolutePosition = inventoryStoredPosition;
235 242
236 objectGroup.AbsolutePosition = inventoryStoredPosition; 243 // Make sure all bits but the ones we want are clear
244 // on take.
245 // This will be applied to the current perms, so
246 // it will do what we want.
247 objectGroup.RootPart.NextOwnerMask &=
248 ((uint)PermissionMask.Copy |
249 (uint)PermissionMask.Transfer |
250 (uint)PermissionMask.Modify);
251 objectGroup.RootPart.NextOwnerMask |=
252 (uint)PermissionMask.Move;
237 253
238 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup); 254 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup);
239 255
240 objectGroup.AbsolutePosition = originalPosition; 256 objectGroup.AbsolutePosition = originalPosition;
241 257
242 // Get the user info of the item destination 258 xmlStrings[objectGroup.UUID] = sceneObjectXml;
243 // 259 }
244 UUID userID = UUID.Zero;
245 260
246 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy || 261 string itemXml;
247 action == DeRezAction.SaveToExistingUserInventoryItem)
248 {
249 // Take or take copy require a taker
250 // Saving changes requires a local user
251 //
252 if (remoteClient == null)
253 return UUID.Zero;
254 262
255 userID = remoteClient.AgentId; 263 if (objlist.Count > 1)
256 } 264 {
257 else 265 float minX, minY, minZ;
258 { 266 float maxX, maxY, maxZ;
259 // All returns / deletes go to the object owner
260 //
261 267
262 userID = objectGroup.RootPart.OwnerID; 268 Vector3[] offsets = m_Scene.GetCombinedBoundingBox(objlist,
263 } 269 out minX, out maxX, out minY, out maxY,
270 out minZ, out maxZ);
264 271
265 if (userID == UUID.Zero) // Can't proceed 272 // CreateWrapper
266 { 273 XmlDocument itemDoc = new XmlDocument();
267 return UUID.Zero; 274 XmlElement root = itemDoc.CreateElement("", "CoalescedObject", "");
268 } 275 itemDoc.AppendChild(root);
269 276
270 // If we're returning someone's item, it goes back to the 277 // Embed the offsets into the group XML
271 // owner's Lost And Found folder. 278 for ( int i = 0 ; i < objlist.Count ; i++ )
272 // Delete is treated like return in this case 279 {
273 // Deleting your own items makes them go to trash 280 XmlDocument doc = new XmlDocument();
274 // 281 SceneObjectGroup g = objlist[i];
275 282 doc.LoadXml(xmlStrings[g.UUID]);
276 InventoryFolderBase folder = null; 283 XmlElement e = (XmlElement)doc.SelectSingleNode("/SceneObjectGroup");
277 InventoryItemBase item = null; 284 e.SetAttribute("offsetx", offsets[i].X.ToString());
285 e.SetAttribute("offsety", offsets[i].Y.ToString());
286 e.SetAttribute("offsetz", offsets[i].Z.ToString());
287
288 XmlNode objectNode = itemDoc.ImportNode(e, true);
289 root.AppendChild(objectNode);
290 }
278 291
279 if (DeRezAction.SaveToExistingUserInventoryItem == action) 292 float sizeX = maxX - minX;
280 { 293 float sizeY = maxY - minY;
281 item = new InventoryItemBase(objectGroup.RootPart.FromUserInventoryItemID, userID); 294 float sizeZ = maxZ - minZ;
282 item = m_Scene.InventoryService.GetItem(item);
283 295
284 //item = userInfo.RootFolder.FindItem( 296 root.SetAttribute("x", sizeX.ToString());
285 // objectGroup.RootPart.FromUserInventoryItemID); 297 root.SetAttribute("y", sizeY.ToString());
298 root.SetAttribute("z", sizeZ.ToString());
286 299
287 if (null == item) 300 itemXml = itemDoc.InnerXml;
301 }
302 else
288 { 303 {
289 m_log.DebugFormat( 304 itemXml = xmlStrings[objlist[0].UUID];
290 "[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.",
291 objectGroup.Name, objectGroup.UUID);
292 return UUID.Zero;
293 } 305 }
294 } 306
295 else 307 // Get the user info of the item destination
296 {
297 // Folder magic
298 // 308 //
299 if (action == DeRezAction.Delete) 309 UUID userID = UUID.Zero;
310
311 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy ||
312 action == DeRezAction.SaveToExistingUserInventoryItem)
300 { 313 {
301 // Deleting someone else's item 314 // Take or take copy require a taker
315 // Saving changes requires a local user
302 // 316 //
303 if (remoteClient == null || 317 if (remoteClient == null)
304 objectGroup.OwnerID != remoteClient.AgentId) 318 return UUID.Zero;
305 {
306 319
307 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); 320 userID = remoteClient.AgentId;
308 }
309 else
310 {
311 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
312 }
313 } 321 }
314 else if (action == DeRezAction.Return) 322 else
315 { 323 {
316 324 // All returns / deletes go to the object owner
317 // Dump to lost + found unconditionally
318 // 325 //
319 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); 326
327 userID = objlist[0].RootPart.OwnerID;
320 } 328 }
321 329
322 if (folderID == UUID.Zero && folder == null) 330 if (userID == UUID.Zero) // Can't proceed
323 { 331 {
324 if (action == DeRezAction.Delete) 332 return UUID.Zero;
333 }
334
335 // If we're returning someone's item, it goes back to the
336 // owner's Lost And Found folder.
337 // Delete is treated like return in this case
338 // Deleting your own items makes them go to trash
339 //
340
341 InventoryFolderBase folder = null;
342 InventoryItemBase item = null;
343
344 if (DeRezAction.SaveToExistingUserInventoryItem == action)
345 {
346 item = new InventoryItemBase(objlist[0].RootPart.FromUserInventoryItemID, userID);
347 item = m_Scene.InventoryService.GetItem(item);
348
349 //item = userInfo.RootFolder.FindItem(
350 // objectGroup.RootPart.FromUserInventoryItemID);
351
352 if (null == item)
325 { 353 {
326 // Deletes go to trash by default 354 m_log.DebugFormat(
327 // 355 "[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.",
328 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder); 356 objlist[0].Name, objlist[0].UUID);
357 return UUID.Zero;
329 } 358 }
330 else 359 }
360 else
361 {
362 // Folder magic
363 //
364 if (action == DeRezAction.Delete)
331 { 365 {
366 // Deleting someone else's item
367 //
332 if (remoteClient == null || 368 if (remoteClient == null ||
333 objectGroup.OwnerID != remoteClient.AgentId) 369 objlist[0].OwnerID != remoteClient.AgentId)
334 { 370 {
335 // Taking copy of another person's item. Take to 371
336 // Objects folder. 372 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
337 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.Object);
338 } 373 }
339 else 374 else
340 { 375 {
341 // Catch all. Use lost & found 376 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
377 }
378 }
379 else if (action == DeRezAction.Return)
380 {
381
382 // Dump to lost + found unconditionally
383 //
384 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
385 }
386
387 if (folderID == UUID.Zero && folder == null)
388 {
389 if (action == DeRezAction.Delete)
390 {
391 // Deletes go to trash by default
342 // 392 //
393 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
394 }
395 else
396 {
397 if (remoteClient == null ||
398 objlist[0].OwnerID != remoteClient.AgentId)
399 {
400 // Taking copy of another person's item. Take to
401 // Objects folder.
402 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.Object);
403 }
404 else
405 {
406 // Catch all. Use lost & found
407 //
343 408
344 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); 409 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
410 }
345 } 411 }
346 } 412 }
347 }
348 413
349 // Override and put into where it came from, if it came 414 // Override and put into where it came from, if it came
350 // from anywhere in inventory 415 // from anywhere in inventory
351 // 416 //
352 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy) 417 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy)
353 {
354 if (objectGroup.RootPart.FromFolderID != UUID.Zero)
355 { 418 {
356 InventoryFolderBase f = new InventoryFolderBase(objectGroup.RootPart.FromFolderID, userID); 419 if (objlist[0].RootPart.FromFolderID != UUID.Zero)
357 folder = m_Scene.InventoryService.GetFolder(f); 420 {
421 InventoryFolderBase f = new InventoryFolderBase(objlist[0].RootPart.FromFolderID, userID);
422 folder = m_Scene.InventoryService.GetFolder(f);
423 }
358 } 424 }
359 }
360 425
361 if (folder == null) // None of the above 426 if (folder == null) // None of the above
362 { 427 {
363 folder = new InventoryFolderBase(folderID); 428 folder = new InventoryFolderBase(folderID);
364 429
365 if (folder == null) // Nowhere to put it 430 if (folder == null) // Nowhere to put it
431 {
432 return UUID.Zero;
433 }
434 }
435
436 item = new InventoryItemBase();
437 // Can't know creator is the same, so null it in inventory
438 if (objlist.Count > 1)
439 item.CreatorId = UUID.Zero.ToString();
440 else
441 item.CreatorId = objlist[0].RootPart.CreatorID.ToString();
442 item.ID = UUID.Random();
443 item.InvType = (int)InventoryType.Object;
444 item.Folder = folder.ID;
445 item.Owner = userID;
446 if (objlist.Count > 1)
366 { 447 {
367 return UUID.Zero; 448 item.Flags = (uint)InventoryItemFlags.ObjectHasMultipleItems;
449 }
450 else
451 {
452 item.SaleType = objlist[0].RootPart.ObjectSaleType;
453 item.SalePrice = objlist[0].RootPart.SalePrice;
368 } 454 }
369 } 455 }
370 456
371 item = new InventoryItemBase(); 457 AssetBase asset = CreateAsset(
372 item.CreatorId = objectGroup.RootPart.CreatorID.ToString(); 458 objlist[0].GetPartName(objlist[0].RootPart.LocalId),
373 item.ID = UUID.Random(); 459 objlist[0].GetPartDescription(objlist[0].RootPart.LocalId),
374 item.InvType = (int)InventoryType.Object; 460 (sbyte)AssetType.Object,
375 item.Folder = folder.ID; 461 Utils.StringToBytes(itemXml),
376 item.Owner = userID; 462 objlist[0].OwnerID.ToString());
377 } 463 m_Scene.AssetService.Store(asset);
378 464 assetID = asset.FullID;
379 AssetBase asset = CreateAsset(
380 objectGroup.GetPartName(objectGroup.RootPart.LocalId),
381 objectGroup.GetPartDescription(objectGroup.RootPart.LocalId),
382 (sbyte)AssetType.Object,
383 Utils.StringToBytes(sceneObjectXml),
384 objectGroup.OwnerID.ToString());
385 m_Scene.AssetService.Store(asset);
386 assetID = asset.FullID;
387
388 if (DeRezAction.SaveToExistingUserInventoryItem == action)
389 {
390 item.AssetID = asset.FullID;
391 m_Scene.InventoryService.UpdateItem(item);
392 }
393 else
394 {
395 item.AssetID = asset.FullID;
396 465
397 if (remoteClient != null && (remoteClient.AgentId != objectGroup.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) 466 if (DeRezAction.SaveToExistingUserInventoryItem == action)
398 { 467 {
399 uint perms = objectGroup.GetEffectivePermissions(); 468 item.AssetID = asset.FullID;
400 uint nextPerms = (perms & 7) << 13; 469 m_Scene.InventoryService.UpdateItem(item);
401 if ((nextPerms & (uint)PermissionMask.Copy) == 0)
402 perms &= ~(uint)PermissionMask.Copy;
403 if ((nextPerms & (uint)PermissionMask.Transfer) == 0)
404 perms &= ~(uint)PermissionMask.Transfer;
405 if ((nextPerms & (uint)PermissionMask.Modify) == 0)
406 perms &= ~(uint)PermissionMask.Modify;
407
408 // Make sure all bits but the ones we want are clear
409 // on take.
410 // This will be applied to the current perms, so
411 // it will do what we want.
412 objectGroup.RootPart.NextOwnerMask &=
413 ((uint)PermissionMask.Copy |
414 (uint)PermissionMask.Transfer |
415 (uint)PermissionMask.Modify);
416 objectGroup.RootPart.NextOwnerMask |=
417 (uint)PermissionMask.Move;
418
419 item.BasePermissions = perms & objectGroup.RootPart.NextOwnerMask;
420 item.CurrentPermissions = item.BasePermissions;
421 item.NextPermissions = objectGroup.RootPart.NextOwnerMask;
422 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask;
423 item.GroupPermissions = objectGroup.RootPart.GroupMask & objectGroup.RootPart.NextOwnerMask;
424
425 // Magic number badness. Maybe this deserves an enum.
426 // bit 4 (16) is the "Slam" bit, it means treat as passed
427 // and apply next owner perms on rez
428 item.CurrentPermissions |= 16; // Slam!
429 } 470 }
430 else 471 else
431 { 472 {
432 item.BasePermissions = objectGroup.GetEffectivePermissions(); 473 item.AssetID = asset.FullID;
433 item.CurrentPermissions = objectGroup.GetEffectivePermissions();
434 item.NextPermissions = objectGroup.RootPart.NextOwnerMask;
435 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask;
436 item.GroupPermissions = objectGroup.RootPart.GroupMask;
437 474
438 item.CurrentPermissions &= 475 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move) | 7;
439 ((uint)PermissionMask.Copy | 476 foreach (SceneObjectGroup grp in objlist)
440 (uint)PermissionMask.Transfer | 477 effectivePerms &= grp.GetEffectivePermissions();
441 (uint)PermissionMask.Modify | 478 effectivePerms |= (uint)PermissionMask.Move;
442 (uint)PermissionMask.Move | 479
443 7); // Preserve folded permissions 480 if (remoteClient != null && (remoteClient.AgentId != objlist[0].RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions())
444 } 481 {
482 uint perms = effectivePerms;
483 uint nextPerms = (perms & 7) << 13;
484 if ((nextPerms & (uint)PermissionMask.Copy) == 0)
485 perms &= ~(uint)PermissionMask.Copy;
486 if ((nextPerms & (uint)PermissionMask.Transfer) == 0)
487 perms &= ~(uint)PermissionMask.Transfer;
488 if ((nextPerms & (uint)PermissionMask.Modify) == 0)
489 perms &= ~(uint)PermissionMask.Modify;
490
491 item.BasePermissions = perms & objlist[0].RootPart.NextOwnerMask;
492 item.CurrentPermissions = item.BasePermissions;
493 item.NextPermissions = perms & objlist[0].RootPart.NextOwnerMask;
494 item.EveryOnePermissions = objlist[0].RootPart.EveryoneMask & objlist[0].RootPart.NextOwnerMask;
495 item.GroupPermissions = objlist[0].RootPart.GroupMask & objlist[0].RootPart.NextOwnerMask;
496
497 // Magic number badness. Maybe this deserves an enum.
498 // bit 4 (16) is the "Slam" bit, it means treat as passed
499 // and apply next owner perms on rez
500 item.CurrentPermissions |= 16; // Slam!
501 }
502 else
503 {
504 item.BasePermissions = effectivePerms;
505 item.CurrentPermissions = effectivePerms;
506 item.NextPermissions = objlist[0].RootPart.NextOwnerMask & effectivePerms;
507 item.EveryOnePermissions = objlist[0].RootPart.EveryoneMask & effectivePerms;
508 item.GroupPermissions = objlist[0].RootPart.GroupMask & effectivePerms;
509
510 item.CurrentPermissions &=
511 ((uint)PermissionMask.Copy |
512 (uint)PermissionMask.Transfer |
513 (uint)PermissionMask.Modify |
514 (uint)PermissionMask.Move |
515 7); // Preserve folded permissions
516 }
445 517
446 // TODO: add the new fields (Flags, Sale info, etc) 518 item.CreationDate = Util.UnixTimeSinceEpoch();
447 item.CreationDate = Util.UnixTimeSinceEpoch(); 519 item.Description = asset.Description;
448 item.Description = asset.Description; 520 item.Name = asset.Name;
449 item.Name = asset.Name; 521 item.AssetType = asset.Type;
450 item.AssetType = asset.Type;
451 522
452 m_Scene.AddInventoryItem(item); 523 m_Scene.AddInventoryItem(item);
453 524
454 if (remoteClient != null && item.Owner == remoteClient.AgentId) 525 if (remoteClient != null && item.Owner == remoteClient.AgentId)
455 {
456 remoteClient.SendInventoryItemCreateUpdate(item, 0);
457 }
458 else
459 {
460 ScenePresence notifyUser = m_Scene.GetScenePresence(item.Owner);
461 if (notifyUser != null)
462 { 526 {
463 notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item, 0); 527 remoteClient.SendInventoryItemCreateUpdate(item, 0);
528 }
529 else
530 {
531 ScenePresence notifyUser = m_Scene.GetScenePresence(item.Owner);
532 if (notifyUser != null)
533 {
534 notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
535 }
464 } 536 }
465 } 537 }
466 } 538 }
467
468 return assetID; 539 return assetID;
469 } 540 }
470 541
@@ -515,8 +586,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
515 586
516 if (item != null) 587 if (item != null)
517 { 588 {
589 if (item.ID == UUID.Zero)
590 {
591 m_log.Debug("[InventoryAccessModule]: Inventory object has UUID.Zero! Position 1");
592 }
593
518 AssetBase rezAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); 594 AssetBase rezAsset = m_Scene.AssetService.Get(item.AssetID.ToString());
519 595
596 SceneObjectGroup group = null;
597
520 if (rezAsset != null) 598 if (rezAsset != null)
521 { 599 {
522 UUID itemId = UUID.Zero; 600 UUID itemId = UUID.Zero;
@@ -525,32 +603,83 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
525 // item that it came from. This allows us to enable 'save object to inventory' 603 // item that it came from. This allows us to enable 'save object to inventory'
526 if (!m_Scene.Permissions.BypassPermissions()) 604 if (!m_Scene.Permissions.BypassPermissions())
527 { 605 {
528 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy) 606 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy && (item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
529 { 607 {
530 itemId = item.ID; 608 itemId = item.ID;
531 } 609 }
532 } 610 }
533 else 611 else
534 { 612 {
535 // Brave new fullperm world 613 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
536 // 614 {
537 itemId = item.ID; 615 // Brave new fullperm world
616 itemId = item.ID;
617 }
618 }
619
620 if (item.ID == UUID.Zero)
621 {
622 m_log.Debug("[InventoryAccessModule]: Inventory object has UUID.Zero! Position 2");
538 } 623 }
539 624
540 string xmlData = Utils.BytesToString(rezAsset.Data); 625 string xmlData = Utils.BytesToString(rezAsset.Data);
541 SceneObjectGroup group 626 List<SceneObjectGroup> objlist =
542 = SceneObjectSerializer.FromOriginalXmlFormat(itemId, xmlData); 627 new List<SceneObjectGroup>();
628 List<Vector3> veclist = new List<Vector3>();
629
630 XmlDocument doc = new XmlDocument();
631 doc.LoadXml(xmlData);
632 XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject");
633 if (e == null || attachment) // Single
634 {
635 SceneObjectGroup g =
636 SceneObjectSerializer.FromOriginalXmlFormat(
637 itemId, xmlData);
638 objlist.Add(g);
639 veclist.Add(new Vector3(0, 0, 0));
640
641 float offsetHeight = 0;
642 pos = m_Scene.GetNewRezLocation(
643 RayStart, RayEnd, RayTargetID, Quaternion.Identity,
644 BypassRayCast, bRayEndIsIntersection, true, g.GetAxisAlignedBoundingBox(out offsetHeight), false);
645 pos.Z += offsetHeight;
646 }
647 else
648 {
649 XmlElement coll = (XmlElement)e;
650 float bx = Convert.ToSingle(coll.GetAttribute("x"));
651 float by = Convert.ToSingle(coll.GetAttribute("y"));
652 float bz = Convert.ToSingle(coll.GetAttribute("z"));
653 Vector3 bbox = new Vector3(bx, by, bz);
543 654
544 group.RootPart.FromFolderID = item.Folder; 655 pos = m_Scene.GetNewRezLocation(RayStart, RayEnd,
656 RayTargetID, Quaternion.Identity,
657 BypassRayCast, bRayEndIsIntersection, true,
658 bbox, false);
545 659
546 // If it's rezzed in world, select it. Much easier to 660 pos -= bbox / 2;
547 // find small items. 661
548 // 662 XmlNodeList groups = e.SelectNodes("SceneObjectGroup");
549 if (!attachment) 663 foreach (XmlNode n in groups)
550 group.RootPart.CreateSelected = true; 664 {
665 SceneObjectGroup g =
666 SceneObjectSerializer.FromOriginalXmlFormat(
667 itemId, n.OuterXml);
668 objlist.Add(g);
669 XmlElement el = (XmlElement)n;
670 float x = Convert.ToSingle(el.GetAttribute("offsetx"));
671 float y = Convert.ToSingle(el.GetAttribute("offsety"));
672 float z = Convert.ToSingle(el.GetAttribute("offsetz"));
673 veclist.Add(new Vector3(x, y, z));
674 }
675 }
676
677 int primcount = 0;
678 foreach (SceneObjectGroup g in objlist)
679 primcount += g.PrimCount;
551 680
552 if (!m_Scene.Permissions.CanRezObject( 681 if (!m_Scene.Permissions.CanRezObject(
553 group.PrimCount, remoteClient.AgentId, pos) 682 primcount, remoteClient.AgentId, pos)
554 && !attachment) 683 && !attachment)
555 { 684 {
556 // The client operates in no fail mode. It will 685 // The client operates in no fail mode. It will
@@ -563,116 +692,147 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
563 return null; 692 return null;
564 } 693 }
565 694
566 group.ResetIDs(); 695 for (int i = 0 ; i < objlist.Count ; i++ )
567
568 if (attachment)
569 {
570 group.RootPart.Flags |= PrimFlags.Phantom;
571 group.RootPart.IsAttachment = true;
572
573 // If we're rezzing an attachment then don't ask
574 // AddNewSceneObject() to update the client since
575 // we'll be doing that later on. Scheduling more
576 // than one full update during the attachment
577 // process causes some clients to fail to display
578 // the attachment properly.
579 // Also, don't persist attachments.
580 m_Scene.AddNewSceneObject(group, false, false);
581 }
582 else
583 { 696 {
584 m_Scene.AddNewSceneObject(group, true, false); 697 group = objlist[i];
585 }
586 698
587 // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); 699 Vector3 storedPosition = group.AbsolutePosition;
588 // if attachment we set it's asset id so object updates can reflect that 700 if (group.UUID == UUID.Zero)
589 // if not, we set it's position in world. 701 {
590 if (!attachment) 702 m_log.Debug("[InventoryAccessModule]: Inventory object has UUID.Zero! Position 3");
591 { 703 }
592 group.ScheduleGroupForFullUpdate(); 704 group.RootPart.FromFolderID = item.Folder;
593
594 float offsetHeight = 0;
595 pos = m_Scene.GetNewRezLocation(
596 RayStart, RayEnd, RayTargetID, Quaternion.Identity,
597 BypassRayCast, bRayEndIsIntersection, true, group.GetAxisAlignedBoundingBox(out offsetHeight), false);
598 pos.Z += offsetHeight;
599 group.AbsolutePosition = pos;
600 // m_log.InfoFormat("rezx point for inventory rezz is {0} {1} {2} and offsetheight was {3}", pos.X, pos.Y, pos.Z, offsetHeight);
601 705
602 } 706 // If it's rezzed in world, select it. Much easier to
603 else 707 // find small items.
604 { 708 //
605 group.SetFromItemID(itemID); 709 if (!attachment)
606 } 710 {
711 group.RootPart.CreateSelected = true;
712 foreach (SceneObjectPart child in group.Parts)
713 child.CreateSelected = true;
714 }
607 715
608 SceneObjectPart rootPart = null; 716 group.ResetIDs();
609 try
610 {
611 rootPart = group.GetChildPart(group.UUID);
612 }
613 catch (NullReferenceException)
614 {
615 string isAttachment = "";
616 717
617 if (attachment) 718 if (attachment)
618 isAttachment = " Object was an attachment"; 719 {
720 group.RootPart.Flags |= PrimFlags.Phantom;
721 group.RootPart.IsAttachment = true;
722
723 // If we're rezzing an attachment then don't ask
724 // AddNewSceneObject() to update the client since
725 // we'll be doing that later on. Scheduling more
726 // than one full update during the attachment
727 // process causes some clients to fail to display
728 // the attachment properly.
729 // Also, don't persist attachments.
730 m_Scene.AddNewSceneObject(group, false, false);
731 }
732 else
733 {
734 m_Scene.AddNewSceneObject(group, true, false);
735 }
619 736
620 m_log.Error("[AGENT INVENTORY]: Error rezzing ItemID: " + itemID + " object has no rootpart." + isAttachment); 737 // if attachment we set it's asset id so object updates
621 } 738 // can reflect that, if not, we set it's position in world.
739 if (!attachment)
740 {
741 group.ScheduleGroupForFullUpdate();
742
743 group.AbsolutePosition = pos + veclist[i];
744 }
745 else
746 {
747 group.SetFromItemID(itemID);
748 }
622 749
623 // Since renaming the item in the inventory does not affect the name stored 750 SceneObjectPart rootPart = null;
624 // in the serialization, transfer the correct name from the inventory to the
625 // object itself before we rez.
626 rootPart.Name = item.Name;
627 rootPart.Description = item.Description;
628 751
629 group.SetGroup(remoteClient.ActiveGroupId, remoteClient); 752 try
630 if ((rootPart.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0) 753 {
631 { 754 rootPart = group.GetChildPart(group.UUID);
632 //Need to kill the for sale here 755 }
633 rootPart.ObjectSaleType = 0; 756 catch (NullReferenceException)
634 rootPart.SalePrice = 10; 757 {
758 string isAttachment = "";
635 759
636 if (m_Scene.Permissions.PropagatePermissions()) 760 if (attachment)
761 isAttachment = " Object was an attachment";
762
763 m_log.Error("[AGENT INVENTORY]: Error rezzing ItemID: " + itemID + " object has no rootpart." + isAttachment);
764 }
765
766 // Since renaming the item in the inventory does not
767 // affect the name stored in the serialization, transfer
768 // the correct name from the inventory to the
769 // object itself before we rez.
770 // On coalesced objects, this has no effect.
771 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
772 {
773 rootPart.Name = item.Name;
774 rootPart.Description = item.Description;
775 rootPart.ObjectSaleType = item.SaleType;
776 rootPart.SalePrice = item.SalePrice;
777 }
778
779 group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
780 if ((rootPart.OwnerID != item.Owner) ||
781 (item.CurrentPermissions & 16) != 0)
637 { 782 {
638 foreach (SceneObjectPart part in group.Parts) 783 //Need to kill the for sale here
784 rootPart.ObjectSaleType = 0;
785 rootPart.SalePrice = 10;
786
787 if (m_Scene.Permissions.PropagatePermissions())
639 { 788 {
640 part.EveryoneMask = item.EveryOnePermissions; 789 foreach (SceneObjectPart part in group.Parts)
641 part.NextOwnerMask = item.NextPermissions; 790 {
642 part.GroupMask = 0; // DO NOT propagate here 791 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
792 {
793 part.EveryoneMask = item.EveryOnePermissions;
794 part.NextOwnerMask = item.NextPermissions;
795 }
796 part.GroupMask = 0; // DO NOT propagate here
797 }
798
799 group.ApplyNextOwnerPermissions();
643 } 800 }
644
645 group.ApplyNextOwnerPermissions();
646 } 801 }
647 }
648 802
649 foreach (SceneObjectPart part in group.Parts) 803 foreach (SceneObjectPart part in group.Parts)
650 {
651 if ((part.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0)
652 { 804 {
653 part.LastOwnerID = part.OwnerID; 805 if ((part.OwnerID != item.Owner) ||
654 part.OwnerID = item.Owner; 806 (item.CurrentPermissions & 16) != 0)
655 part.Inventory.ChangeInventoryOwner(item.Owner); 807 {
656 part.GroupMask = 0; // DO NOT propagate here 808 part.LastOwnerID = part.OwnerID;
809 part.OwnerID = item.Owner;
810 part.Inventory.ChangeInventoryOwner(item.Owner);
811 part.GroupMask = 0; // DO NOT propagate here
812 }
813 part.EveryoneMask = item.EveryOnePermissions;
814 part.NextOwnerMask = item.NextPermissions;
657 } 815 }
658 part.EveryoneMask = item.EveryOnePermissions;
659 part.NextOwnerMask = item.NextPermissions;
660 }
661 816
662 rootPart.TrimPermissions(); 817 rootPart.TrimPermissions();
663 818
664 if (!attachment) 819 if (!attachment)
665 {
666 if (group.RootPart.Shape.PCode == (byte)PCode.Prim)
667 { 820 {
668 group.ClearPartAttachmentData(); 821 if (group.RootPart.Shape.PCode == (byte)PCode.Prim)
669 } 822 {
670 823 // Save attachment data
671 // Fire on_rez 824 group.RootPart.AttachPoint = group.RootPart.Shape.State;
672 group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1); 825 group.RootPart.AttachOffset = storedPosition;
673 rootPart.ParentGroup.ResumeScripts();
674 826
675 rootPart.ScheduleFullUpdate(); 827 group.ClearPartAttachmentData();
828 }
829
830 // Fire on_rez
831 group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1);
832 rootPart.ParentGroup.ResumeScripts();
833
834 rootPart.ScheduleFullUpdate();
835 }
676 } 836 }
677 837
678 if (!m_Scene.Permissions.BypassPermissions()) 838 if (!m_Scene.Permissions.BypassPermissions())
@@ -690,9 +850,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
690 } 850 }
691 } 851 }
692 } 852 }
693
694 return rootPart.ParentGroup;
695 } 853 }
854 return group;
696 } 855 }
697 856
698 return null; 857 return null;
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index 9b565ed..1fd1f47 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -142,7 +142,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
142 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" }); 142 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
143 return urlcode; 143 return urlcode;
144 } 144 }
145 string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/"; 145 string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString();
146 146
147 UrlData urlData = new UrlData(); 147 UrlData urlData = new UrlData();
148 urlData.hostID = host.UUID; 148 urlData.hostID = host.UUID;
@@ -152,10 +152,9 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
152 urlData.urlcode = urlcode; 152 urlData.urlcode = urlcode;
153 urlData.requests = new Dictionary<UUID, RequestData>(); 153 urlData.requests = new Dictionary<UUID, RequestData>();
154 154
155
156 m_UrlMap[url] = urlData; 155 m_UrlMap[url] = urlData;
157 156
158 string uri = "/lslhttp/" + urlcode.ToString() + "/"; 157 string uri = "/lslhttp/" + urlcode.ToString();
159 158
160 m_HttpServer.AddPollServiceHTTPHandler(uri,HandleHttpPoll, 159 m_HttpServer.AddPollServiceHTTPHandler(uri,HandleHttpPoll,
161 new PollServiceEventArgs(HttpRequestHandler,HasEvents, GetEvents, NoEvents, 160 new PollServiceEventArgs(HttpRequestHandler,HasEvents, GetEvents, NoEvents,
@@ -386,6 +385,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
386 385
387 return response; 386 return response;
388 } 387 }
388
389 public void HttpRequestHandler(UUID requestID, Hashtable request) 389 public void HttpRequestHandler(UUID requestID, Hashtable request)
390 { 390 {
391 lock (request) 391 lock (request)
@@ -400,8 +400,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
400 400
401 int pos1 = uri.IndexOf("/");// /lslhttp 401 int pos1 = uri.IndexOf("/");// /lslhttp
402 int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/ 402 int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/
403 int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp/<UUID>/ 403 int pos3 = pos2 + 37; // /lslhttp/urlcode
404 string uri_tmp = uri.Substring(0, pos3 + 1); 404 string uri_tmp = uri.Substring(0, pos3);
405 //HTTP server code doesn't provide us with QueryStrings 405 //HTTP server code doesn't provide us with QueryStrings
406 string pathInfo; 406 string pathInfo;
407 string queryString; 407 string queryString;
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
index e54ee02..ebfba2b 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
@@ -57,9 +57,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
57 config.Configs["Modules"].Set("GridServices", "LocalGridServicesConnector"); 57 config.Configs["Modules"].Set("GridServices", "LocalGridServicesConnector");
58 config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Services.GridService.dll:GridService"); 58 config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Services.GridService.dll:GridService");
59 config.Configs["GridService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); 59 config.Configs["GridService"].Set("StorageProvider", "OpenSim.Data.Null.dll");
60 config.Configs["GridService"].Set("Region_Test_Region_1", "DefaultRegion"); 60 config.Configs["GridService"].Set("Region_Test_Region_1", "DefaultRegion");
61 config.Configs["GridService"].Set("Region_Test_Region_2", "FallbackRegion"); 61 config.Configs["GridService"].Set("Region_Test_Region_2", "FallbackRegion");
62 config.Configs["GridService"].Set("Region_Test_Region_3", "FallbackRegion"); 62 config.Configs["GridService"].Set("Region_Test_Region_3", "FallbackRegion");
63 config.Configs["GridService"].Set("Region_Other_Region_4", "FallbackRegion"); 63 config.Configs["GridService"].Set("Region_Other_Region_4", "FallbackRegion");
64 64
65 m_LocalConnector = new LocalGridServicesConnector(config); 65 m_LocalConnector = new LocalGridServicesConnector(config);
@@ -128,8 +128,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
128 Assert.IsNotNull(result, "Retrieved GetRegionByName is null"); 128 Assert.IsNotNull(result, "Retrieved GetRegionByName is null");
129 Assert.That(result.RegionName, Is.EqualTo("Test Region 1"), "Retrieved region's name does not match"); 129 Assert.That(result.RegionName, Is.EqualTo("Test Region 1"), "Retrieved region's name does not match");
130 130
131 m_LocalConnector.RegisterRegion(UUID.Zero, r2); 131 m_LocalConnector.RegisterRegion(UUID.Zero, r2);
132 m_LocalConnector.RegisterRegion(UUID.Zero, r3); 132 m_LocalConnector.RegisterRegion(UUID.Zero, r3);
133 m_LocalConnector.RegisterRegion(UUID.Zero, r4); 133 m_LocalConnector.RegisterRegion(UUID.Zero, r4);
134 134
135 result = m_LocalConnector.GetRegionByUUID(UUID.Zero, new UUID(1)); 135 result = m_LocalConnector.GetRegionByUUID(UUID.Zero, new UUID(1));
@@ -154,38 +154,38 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
154 Assert.IsNotNull(results, "Retrieved GetRegionRange collection is null"); 154 Assert.IsNotNull(results, "Retrieved GetRegionRange collection is null");
155 Assert.That(results.Count, Is.EqualTo(2), "Retrieved neighbour collection is not the number expected"); 155 Assert.That(results.Count, Is.EqualTo(2), "Retrieved neighbour collection is not the number expected");
156 156
157 results = m_LocalConnector.GetDefaultRegions(UUID.Zero); 157 results = m_LocalConnector.GetDefaultRegions(UUID.Zero);
158 Assert.IsNotNull(results, "Retrieved GetDefaultRegions collection is null"); 158 Assert.IsNotNull(results, "Retrieved GetDefaultRegions collection is null");
159 Assert.That(results.Count, Is.EqualTo(1), "Retrieved default regions collection has not the expected size"); 159 Assert.That(results.Count, Is.EqualTo(1), "Retrieved default regions collection has not the expected size");
160 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(1)), "Retrieved default region's UUID does not match"); 160 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(1)), "Retrieved default region's UUID does not match");
161 161
162 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r1.RegionLocX, r1.RegionLocY); 162 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r1.RegionLocX, r1.RegionLocY);
163 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 1 is null"); 163 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 1 is null");
164 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 1 has not the expected size"); 164 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 1 has not the expected size");
165 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions for default region are not in the expected order 2-4-3"); 165 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions for default region are not in the expected order 2-4-3");
166 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions for default region are not in the expected order 2-4-3"); 166 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions for default region are not in the expected order 2-4-3");
167 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions for default region are not in the expected order 2-4-3"); 167 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions for default region are not in the expected order 2-4-3");
168 168
169 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r2.RegionLocX, r2.RegionLocY); 169 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r2.RegionLocX, r2.RegionLocY);
170 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 2 is null"); 170 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 2 is null");
171 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 2 has not the expected size"); 171 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 2 has not the expected size");
172 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 2-4-3"); 172 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 2-4-3");
173 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 2-4-3"); 173 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 2-4-3");
174 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 2-4-3"); 174 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 2-4-3");
175 175
176 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r3.RegionLocX, r3.RegionLocY); 176 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r3.RegionLocX, r3.RegionLocY);
177 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 3 is null"); 177 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 3 is null");
178 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 3 has not the expected size"); 178 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 3 has not the expected size");
179 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 3-4-2"); 179 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 3-4-2");
180 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 3-4-2"); 180 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 3-4-2");
181 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 3-4-2"); 181 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 3-4-2");
182 182
183 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r4.RegionLocX, r4.RegionLocY); 183 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r4.RegionLocX, r4.RegionLocY);
184 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 4 is null"); 184 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 4 is null");
185 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 4 has not the expected size"); 185 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 4 has not the expected size");
186 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 4-3-2"); 186 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 4-3-2");
187 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 4-3-2"); 187 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 4-3-2");
188 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 4-3-2"); 188 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 4-3-2");
189 189
190 results = m_LocalConnector.GetHyperlinks(UUID.Zero); 190 results = m_LocalConnector.GetHyperlinks(UUID.Zero);
191 Assert.IsNotNull(results, "Retrieved GetHyperlinks list is null"); 191 Assert.IsNotNull(results, "Retrieved GetHyperlinks list is null");
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
index e32dbb3..329a259 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
@@ -290,6 +290,23 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
290 return false; 290 return false;
291 } 291 }
292 292
293 public bool CloseChildAgent(GridRegion destination, UUID id)
294 {
295 if (destination == null)
296 return false;
297
298 foreach (Scene s in m_sceneList)
299 {
300 if (s.RegionInfo.RegionID == destination.RegionID)
301 {
302 //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent");
303 return s.IncomingCloseChildAgent(id);
304 }
305 }
306 //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent");
307 return false;
308 }
309
293 /** 310 /**
294 * Object-related communications 311 * Object-related communications
295 */ 312 */
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
index 3f577f2..e16e273 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
@@ -252,6 +252,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
252 return false; 252 return false;
253 } 253 }
254 254
255 public bool CloseChildAgent(GridRegion destination, UUID id)
256 {
257 if (destination == null)
258 return false;
259
260 // Try local first
261 if (m_localBackend.CloseChildAgent(destination, id))
262 return true;
263
264 // else do the remote thing
265 if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
266 return m_remoteConnector.CloseChildAgent(destination, id);
267
268 return false;
269 }
255 270
256 public bool CloseAgent(GridRegion destination, UUID id) 271 public bool CloseAgent(GridRegion destination, UUID id)
257 { 272 {
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
index 117b2fd..1f85278 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
@@ -269,6 +269,23 @@ namespace OpenSim.Region.CoreModules.World.Archiver
269 // being no copy/no mod for everyone 269 // being no copy/no mod for everyone
270 lock (part.TaskInventory) 270 lock (part.TaskInventory)
271 { 271 {
272 if (!ResolveUserUuid(part.CreatorID))
273 part.CreatorID = m_scene.RegionInfo.EstateSettings.EstateOwner;
274
275 if (!ResolveUserUuid(part.OwnerID))
276 part.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
277
278 if (!ResolveUserUuid(part.LastOwnerID))
279 part.LastOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
280
281 // And zap any troublesome sit target information
282 part.SitTargetOrientation = new Quaternion(0, 0, 0, 1);
283 part.SitTargetPosition = new Vector3(0, 0, 0);
284
285 // Fix ownership/creator of inventory items
286 // Not doing so results in inventory items
287 // being no copy/no mod for everyone
288 part.TaskInventory.LockItemsForRead(true);
272 TaskInventoryDictionary inv = part.TaskInventory; 289 TaskInventoryDictionary inv = part.TaskInventory;
273 foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv) 290 foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv)
274 { 291 {
@@ -281,6 +298,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
281 kvp.Value.CreatorID = m_scene.RegionInfo.EstateSettings.EstateOwner; 298 kvp.Value.CreatorID = m_scene.RegionInfo.EstateSettings.EstateOwner;
282 } 299 }
283 } 300 }
301 part.TaskInventory.LockItemsForRead(false);
284 } 302 }
285 } 303 }
286 304
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index 6844c60..ab142f7 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -29,6 +29,7 @@ using System.Collections.Generic;
29using System.IO; 29using System.IO;
30using System.Reflection; 30using System.Reflection;
31using System.Security; 31using System.Security;
32using System.Timers;
32using log4net; 33using log4net;
33using Nini.Config; 34using Nini.Config;
34using OpenMetaverse; 35using OpenMetaverse;
@@ -45,6 +46,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
45 private delegate void LookupUUIDS(List<UUID> uuidLst); 46 private delegate void LookupUUIDS(List<UUID> uuidLst);
46 47
47 private Scene m_scene; 48 private Scene m_scene;
49 private Timer m_regionChangeTimer = new Timer();
48 50
49 private EstateTerrainXferHandler TerrainUploader; 51 private EstateTerrainXferHandler TerrainUploader;
50 52
@@ -250,7 +252,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
250 252
251 if ((estateAccessType & 4) != 0) // User add 253 if ((estateAccessType & 4) != 0) // User add
252 { 254 {
253 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions()) 255 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || m_scene.Permissions.BypassPermissions())
254 { 256 {
255 m_scene.RegionInfo.EstateSettings.AddEstateUser(user); 257 m_scene.RegionInfo.EstateSettings.AddEstateUser(user);
256 m_scene.RegionInfo.EstateSettings.Save(); 258 m_scene.RegionInfo.EstateSettings.Save();
@@ -265,7 +267,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
265 } 267 }
266 if ((estateAccessType & 8) != 0) // User remove 268 if ((estateAccessType & 8) != 0) // User remove
267 { 269 {
268 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions()) 270 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || m_scene.Permissions.BypassPermissions())
269 { 271 {
270 m_scene.RegionInfo.EstateSettings.RemoveEstateUser(user); 272 m_scene.RegionInfo.EstateSettings.RemoveEstateUser(user);
271 m_scene.RegionInfo.EstateSettings.Save(); 273 m_scene.RegionInfo.EstateSettings.Save();
@@ -280,7 +282,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
280 } 282 }
281 if ((estateAccessType & 16) != 0) // Group add 283 if ((estateAccessType & 16) != 0) // Group add
282 { 284 {
283 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions()) 285 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || m_scene.Permissions.BypassPermissions())
284 { 286 {
285 m_scene.RegionInfo.EstateSettings.AddEstateGroup(user); 287 m_scene.RegionInfo.EstateSettings.AddEstateGroup(user);
286 m_scene.RegionInfo.EstateSettings.Save(); 288 m_scene.RegionInfo.EstateSettings.Save();
@@ -294,7 +296,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
294 } 296 }
295 if ((estateAccessType & 32) != 0) // Group remove 297 if ((estateAccessType & 32) != 0) // Group remove
296 { 298 {
297 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions()) 299 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || m_scene.Permissions.BypassPermissions())
298 { 300 {
299 m_scene.RegionInfo.EstateSettings.RemoveEstateGroup(user); 301 m_scene.RegionInfo.EstateSettings.RemoveEstateGroup(user);
300 m_scene.RegionInfo.EstateSettings.Save(); 302 m_scene.RegionInfo.EstateSettings.Save();
@@ -343,7 +345,11 @@ namespace OpenSim.Region.CoreModules.World.Estate
343 { 345 {
344 if (!s.IsChildAgent) 346 if (!s.IsChildAgent)
345 { 347 {
346 m_scene.TeleportClientHome(user, s.ControllingClient); 348 if (!m_scene.TeleportClientHome(user, s.ControllingClient))
349 {
350 s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out.");
351 s.ControllingClient.Close();
352 }
347 } 353 }
348 } 354 }
349 355
@@ -477,7 +483,11 @@ namespace OpenSim.Region.CoreModules.World.Estate
477 ScenePresence s = m_scene.GetScenePresence(prey); 483 ScenePresence s = m_scene.GetScenePresence(prey);
478 if (s != null) 484 if (s != null)
479 { 485 {
480 m_scene.TeleportClientHome(prey, s.ControllingClient); 486 if (!m_scene.TeleportClientHome(prey, s.ControllingClient))
487 {
488 s.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out.");
489 s.ControllingClient.Close();
490 }
481 } 491 }
482 } 492 }
483 } 493 }
@@ -496,7 +506,11 @@ namespace OpenSim.Region.CoreModules.World.Estate
496 // Also make sure they are actually in the region 506 // Also make sure they are actually in the region
497 if (p != null && !p.IsChildAgent) 507 if (p != null && !p.IsChildAgent)
498 { 508 {
499 m_scene.TeleportClientHome(p.UUID, p.ControllingClient); 509 if (!m_scene.TeleportClientHome(p.UUID, p.ControllingClient))
510 {
511 p.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out.");
512 p.ControllingClient.Close();
513 }
500 } 514 }
501 } 515 }
502 }); 516 });
@@ -899,6 +913,9 @@ namespace OpenSim.Region.CoreModules.World.Estate
899 m_scene.RegisterModuleInterface<IEstateModule>(this); 913 m_scene.RegisterModuleInterface<IEstateModule>(this);
900 m_scene.EventManager.OnNewClient += EventManager_OnNewClient; 914 m_scene.EventManager.OnNewClient += EventManager_OnNewClient;
901 m_scene.EventManager.OnRequestChangeWaterHeight += changeWaterHeight; 915 m_scene.EventManager.OnRequestChangeWaterHeight += changeWaterHeight;
916 m_regionChangeTimer.AutoReset = false;
917 m_regionChangeTimer.Interval = 2000;
918 m_regionChangeTimer.Elapsed += RaiseRegionInfoChange;
902 919
903 m_scene.AddCommand(this, "set terrain texture", 920 m_scene.AddCommand(this, "set terrain texture",
904 "set terrain texture <number> <uuid> [<x>] [<y>]", 921 "set terrain texture <number> <uuid> [<x>] [<y>]",
@@ -1171,6 +1188,12 @@ namespace OpenSim.Region.CoreModules.World.Estate
1171 1188
1172 protected void TriggerRegionInfoChange() 1189 protected void TriggerRegionInfoChange()
1173 { 1190 {
1191 m_regionChangeTimer.Stop();
1192 m_regionChangeTimer.Start();
1193 }
1194
1195 protected void RaiseRegionInfoChange(object sender, ElapsedEventArgs e)
1196 {
1174 ChangeDelegate change = OnRegionInfoChange; 1197 ChangeDelegate change = OnRegionInfoChange;
1175 1198
1176 if (change != null) 1199 if (change != null)
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index 695202f..9779c68 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -85,6 +85,8 @@ namespace OpenSim.Region.CoreModules.World.Land
85 private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1; 85 private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
86 86
87 private bool m_allowedForcefulBans = true; 87 private bool m_allowedForcefulBans = true;
88 private UUID DefaultGodParcelGroup;
89 private string DefaultGodParcelName;
88 90
89 // caches ExtendedLandData 91 // caches ExtendedLandData
90 private Cache parcelInfoCache; 92 private Cache parcelInfoCache;
@@ -100,6 +102,12 @@ namespace OpenSim.Region.CoreModules.World.Land
100 102
101 public void Initialise(IConfigSource source) 103 public void Initialise(IConfigSource source)
102 { 104 {
105 IConfig cnf = source.Configs["LandManagement"];
106 if (cnf != null)
107 {
108 DefaultGodParcelGroup = new UUID(cnf.GetString("DefaultAdministratorGroupUUID", UUID.Zero.ToString()));
109 DefaultGodParcelName = cnf.GetString("DefaultAdministratorParcelName", "Default Parcel");
110 }
103 } 111 }
104 112
105 public void AddRegion(Scene scene) 113 public void AddRegion(Scene scene)
@@ -351,7 +359,7 @@ namespace OpenSim.Region.CoreModules.World.Land
351 { 359 {
352 if (avatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT) 360 if (avatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT)
353 { 361 {
354 if (parcelAvatarIsEntering.IsBannedFromLand(avatar.UUID)) 362 if (parcelAvatarIsEntering.IsEitherBannedOrRestricted(avatar.UUID))
355 { 363 {
356 SendYouAreBannedNotice(avatar); 364 SendYouAreBannedNotice(avatar);
357 ForceAvatarToPosition(avatar, m_scene.GetNearestAllowedPosition(avatar)); 365 ForceAvatarToPosition(avatar, m_scene.GetNearestAllowedPosition(avatar));
@@ -648,7 +656,7 @@ namespace OpenSim.Region.CoreModules.World.Land
648 int x; 656 int x;
649 int y; 657 int y;
650 658
651 if (x_float > Constants.RegionSize || x_float <= 0 || y_float > Constants.RegionSize || y_float <= 0) 659 if (x_float > Constants.RegionSize || x_float < 0 || y_float > Constants.RegionSize || y_float < 0)
652 return null; 660 return null;
653 661
654 try 662 try
@@ -991,6 +999,10 @@ namespace OpenSim.Region.CoreModules.World.Land
991 //Owner Flag 999 //Owner Flag
992 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_OWNED_BY_REQUESTER); 1000 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_OWNED_BY_REQUESTER);
993 } 1001 }
1002 else if (currentParcelBlock.LandData.IsGroupOwned && remote_client.IsGroupMember(currentParcelBlock.LandData.GroupID))
1003 {
1004 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_OWNED_BY_GROUP);
1005 }
994 else if (currentParcelBlock.LandData.SalePrice > 0 && 1006 else if (currentParcelBlock.LandData.SalePrice > 0 &&
995 (currentParcelBlock.LandData.AuthBuyerID == UUID.Zero || 1007 (currentParcelBlock.LandData.AuthBuyerID == UUID.Zero ||
996 currentParcelBlock.LandData.AuthBuyerID == remote_client.AgentId)) 1008 currentParcelBlock.LandData.AuthBuyerID == remote_client.AgentId))
@@ -1285,7 +1297,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1285 { 1297 {
1286 land.DeedToGroup(groupID); 1298 land.DeedToGroup(groupID);
1287 } 1299 }
1288 1300 EventManagerOnParcelPrimCountTainted();
1289 } 1301 }
1290 1302
1291 1303
@@ -1293,18 +1305,31 @@ namespace OpenSim.Region.CoreModules.World.Land
1293 1305
1294 public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data) 1306 public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data)
1295 { 1307 {
1296 for (int i = 0; i < data.Count; i++) 1308 lock (m_landList)
1297 { 1309 {
1298 IncomingLandObjectFromStorage(data[i]); 1310 //Remove all the land objects in the sim and then process our new data
1311 foreach (int n in m_landList.Keys)
1312 {
1313 m_scene.EventManager.TriggerLandObjectRemoved(m_landList[n].LandData.GlobalID);
1314 }
1315 m_landIDList.Initialize();
1316 m_landList.Clear();
1317
1318 for (int i = 0; i < data.Count; i++)
1319 {
1320 IncomingLandObjectFromStorage(data[i]);
1321 }
1299 } 1322 }
1300 } 1323 }
1301 1324
1302 public void IncomingLandObjectFromStorage(LandData data) 1325 public void IncomingLandObjectFromStorage(LandData data)
1303 { 1326 {
1327
1304 ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene); 1328 ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene);
1305 new_land.LandData = data.Copy(); 1329 new_land.LandData = data.Copy();
1306 new_land.SetLandBitmapFromByteArray(); 1330 new_land.SetLandBitmapFromByteArray();
1307 AddLandObject(new_land); 1331 AddLandObject(new_land);
1332 new_land.SendLandUpdateToAvatarsOverMe();
1308 } 1333 }
1309 1334
1310 public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient) 1335 public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient)
@@ -1577,5 +1602,321 @@ namespace OpenSim.Region.CoreModules.World.Land
1577 1602
1578 UpdateLandObject(localID, land.LandData); 1603 UpdateLandObject(localID, land.LandData);
1579 } 1604 }
1605
1606 public void ClientOnParcelGodMark(IClientAPI client, UUID god, int landID)
1607 {
1608 ILandObject land = null;
1609 List<ILandObject> Land = ((Scene)client.Scene).LandChannel.AllParcels();
1610 foreach (ILandObject landObject in Land)
1611 {
1612 if (landObject.LandData.LocalID == landID)
1613 {
1614 land = landObject;
1615 }
1616 }
1617 land.DeedToGroup(DefaultGodParcelGroup);
1618 land.LandData.Name = DefaultGodParcelName;
1619 land.SendLandUpdateToAvatarsOverMe();
1620 }
1621
1622 private void ClientOnSimWideDeletes(IClientAPI client, UUID agentID, int flags, UUID targetID)
1623 {
1624 ScenePresence SP;
1625 ((Scene)client.Scene).TryGetScenePresence(client.AgentId, out SP);
1626 List<SceneObjectGroup> returns = new List<SceneObjectGroup>();
1627 if (SP.GodLevel != 0)
1628 {
1629 if (flags == 0) //All parcels, scripted or not
1630 {
1631 ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e)
1632 {
1633 if (e.OwnerID == targetID)
1634 {
1635 returns.Add(e);
1636 }
1637 }
1638 );
1639 }
1640 if (flags == 4) //All parcels, scripted object
1641 {
1642 ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e)
1643 {
1644 if (e.OwnerID == targetID)
1645 {
1646 if (e.scriptScore >= 0.01)
1647 {
1648 returns.Add(e);
1649 }
1650 }
1651 }
1652 );
1653 }
1654 if (flags == 4) //not target parcel, scripted object
1655 {
1656 ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e)
1657 {
1658 if (e.OwnerID == targetID)
1659 {
1660 ILandObject landobject = ((Scene)client.Scene).LandChannel.GetLandObject(e.AbsolutePosition.X, e.AbsolutePosition.Y);
1661 if (landobject.LandData.OwnerID != e.OwnerID)
1662 {
1663 if (e.scriptScore >= 0.01)
1664 {
1665 returns.Add(e);
1666 }
1667 }
1668 }
1669 }
1670 );
1671 }
1672 foreach (SceneObjectGroup ol in returns)
1673 {
1674 ReturnObject(ol, client);
1675 }
1676 }
1677 }
1678 public void ReturnObject(SceneObjectGroup obj, IClientAPI client)
1679 {
1680 SceneObjectGroup[] objs = new SceneObjectGroup[1];
1681 objs[0] = obj;
1682 ((Scene)client.Scene).returnObjects(objs, client.AgentId);
1683 }
1684
1685 Dictionary<UUID, System.Threading.Timer> Timers = new Dictionary<UUID, System.Threading.Timer>();
1686
1687 public void ClientOnParcelFreezeUser(IClientAPI client, UUID parcelowner, uint flags, UUID target)
1688 {
1689 ScenePresence targetAvatar = null;
1690 ((Scene)client.Scene).TryGetScenePresence(target, out targetAvatar);
1691 ScenePresence parcelManager = null;
1692 ((Scene)client.Scene).TryGetScenePresence(client.AgentId, out parcelManager);
1693 System.Threading.Timer Timer;
1694
1695 if (targetAvatar.GodLevel == 0)
1696 {
1697 ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y);
1698 if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land))
1699 return;
1700 if (flags == 0)
1701 {
1702 targetAvatar.AllowMovement = false;
1703 targetAvatar.ControllingClient.SendAlertMessage(parcelManager.Firstname + " " + parcelManager.Lastname + " has frozen you for 30 seconds. You cannot move or interact with the world.");
1704 parcelManager.ControllingClient.SendAlertMessage("Avatar Frozen.");
1705 System.Threading.TimerCallback timeCB = new System.Threading.TimerCallback(OnEndParcelFrozen);
1706 Timer = new System.Threading.Timer(timeCB, targetAvatar, 30000, 0);
1707 Timers.Add(targetAvatar.UUID, Timer);
1708 }
1709 else
1710 {
1711 targetAvatar.AllowMovement = true;
1712 targetAvatar.ControllingClient.SendAlertMessage(parcelManager.Firstname + " " + parcelManager.Lastname + " has unfrozen you.");
1713 parcelManager.ControllingClient.SendAlertMessage("Avatar Unfrozen.");
1714 Timers.TryGetValue(targetAvatar.UUID, out Timer);
1715 Timers.Remove(targetAvatar.UUID);
1716 Timer.Dispose();
1717 }
1718 }
1719 }
1720 private void OnEndParcelFrozen(object avatar)
1721 {
1722 ScenePresence targetAvatar = (ScenePresence)avatar;
1723 targetAvatar.AllowMovement = true;
1724 System.Threading.Timer Timer;
1725 Timers.TryGetValue(targetAvatar.UUID, out Timer);
1726 Timers.Remove(targetAvatar.UUID);
1727 targetAvatar.ControllingClient.SendAgentAlertMessage("The freeze has worn off; you may go about your business.", false);
1728 }
1729
1730
1731 public void ClientOnParcelEjectUser(IClientAPI client, UUID parcelowner, uint flags, UUID target)
1732 {
1733 ScenePresence targetAvatar = null;
1734 ((Scene)client.Scene).TryGetScenePresence(target, out targetAvatar);
1735 ScenePresence parcelManager = null;
1736 ((Scene)client.Scene).TryGetScenePresence(client.AgentId, out parcelManager);
1737 //Just eject
1738 if (flags == 0)
1739 {
1740 if (targetAvatar.GodLevel == 0)
1741 {
1742 ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y);
1743 if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land))
1744 return;
1745
1746 Vector3 position = new Vector3(0, 0, 0);
1747 List<ILandObject> allParcels = new List<ILandObject>();
1748 allParcels = AllParcels();
1749 if (allParcels.Count != 1)
1750 {
1751 foreach (ILandObject parcel in allParcels)
1752 {
1753 if (parcel.LandData.GlobalID != land.LandData.GlobalID)
1754 {
1755 if (parcel.IsEitherBannedOrRestricted(targetAvatar.UUID) != true)
1756 {
1757 for (int x = 1; x <= Constants.RegionSize; x += 2)
1758 {
1759 for (int y = 1; y <= Constants.RegionSize; y += 2)
1760 {
1761 if (parcel.ContainsPoint(x, y))
1762 {
1763 position = new Vector3(x, y, targetAvatar.AbsolutePosition.Z);
1764 targetAvatar.TeleportWithMomentum(position);
1765 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1766 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected.");
1767 return;
1768 }
1769 }
1770 }
1771 }
1772 }
1773 }
1774 }
1775 Vector3 targetVector;
1776 if (targetAvatar.AbsolutePosition.X > targetAvatar.AbsolutePosition.Y)
1777 {
1778 if (targetAvatar.AbsolutePosition.X > .5 * Constants.RegionSize)
1779 {
1780 targetVector = new Vector3(Constants.RegionSize, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ;
1781 targetAvatar.TeleportWithMomentum(targetVector);
1782 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1783 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected.");
1784 return;
1785 }
1786 else
1787 {
1788 targetVector = new Vector3(0, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ;
1789 targetAvatar.TeleportWithMomentum(targetVector);
1790 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1791 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected.");
1792 return;
1793 }
1794 }
1795 else
1796 {
1797 if (targetAvatar.AbsolutePosition.Y > .5 * Constants.RegionSize)
1798 {
1799 targetVector = new Vector3(targetAvatar.AbsolutePosition.X, Constants.RegionSize, targetAvatar.AbsolutePosition.Z); ;
1800 targetAvatar.TeleportWithMomentum(targetVector);
1801 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1802 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected.");
1803 return;
1804 }
1805 else
1806 {
1807 targetVector = new Vector3(targetAvatar.AbsolutePosition.X, 0, targetAvatar.AbsolutePosition.Z); ;
1808 targetAvatar.TeleportWithMomentum(targetVector);
1809 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1810 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected.");
1811 return;
1812 }
1813 }
1814 }
1815 }
1816 //Eject and ban
1817 if (flags == 1)
1818 {
1819 if (targetAvatar.GodLevel == 0)
1820 {
1821 ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y);
1822 if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land))
1823 return;
1824
1825 Vector3 position = new Vector3(0, 0, 0);
1826 List<ILandObject> allParcels = new List<ILandObject>();
1827 allParcels = AllParcels();
1828 if (allParcels.Count != 1)
1829 {
1830 foreach (ILandObject parcel in allParcels)
1831 {
1832 if (parcel.LandData.GlobalID != land.LandData.GlobalID)
1833 {
1834 if (parcel.IsEitherBannedOrRestricted(targetAvatar.UUID) != true)
1835 {
1836 for (int x = 1; x <= Constants.RegionSize; x += 2)
1837 {
1838 for (int y = 1; y <= Constants.RegionSize; y += 2)
1839 {
1840 if (parcel.ContainsPoint(x, y))
1841 {
1842 position = new Vector3(x, y, targetAvatar.AbsolutePosition.Z);
1843 targetAvatar.TeleportWithMomentum(position);
1844 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1845 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned.");
1846 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
1847 entry.AgentID = targetAvatar.UUID;
1848 entry.Flags = AccessList.Ban;
1849 entry.Time = new DateTime();
1850 land.LandData.ParcelAccessList.Add(entry);
1851 return;
1852 }
1853 }
1854 }
1855 }
1856 }
1857 }
1858 }
1859 Vector3 targetVector;
1860 if (targetAvatar.AbsolutePosition.X > targetAvatar.AbsolutePosition.Y)
1861 {
1862 if (targetAvatar.AbsolutePosition.X > .5 * Constants.RegionSize)
1863 {
1864 targetVector = new Vector3(Constants.RegionSize, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ;
1865 targetAvatar.TeleportWithMomentum(targetVector);
1866 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1867 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned.");
1868 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
1869 entry.AgentID = targetAvatar.UUID;
1870 entry.Flags = AccessList.Ban;
1871 entry.Time = new DateTime();
1872 land.LandData.ParcelAccessList.Add(entry);
1873 return;
1874 }
1875 else
1876 {
1877 targetVector = new Vector3(0, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ;
1878 targetAvatar.TeleportWithMomentum(targetVector);
1879 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1880 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned.");
1881 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
1882 entry.AgentID = targetAvatar.UUID;
1883 entry.Flags = AccessList.Ban;
1884 entry.Time = new DateTime();
1885 land.LandData.ParcelAccessList.Add(entry);
1886 return;
1887 }
1888 }
1889 else
1890 {
1891 if (targetAvatar.AbsolutePosition.Y > .5 * Constants.RegionSize)
1892 {
1893 targetVector = new Vector3(targetAvatar.AbsolutePosition.X, Constants.RegionSize, targetAvatar.AbsolutePosition.Z); ;
1894 targetAvatar.TeleportWithMomentum(targetVector);
1895 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1896 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned.");
1897 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
1898 entry.AgentID = targetAvatar.UUID;
1899 entry.Flags = AccessList.Ban;
1900 entry.Time = new DateTime();
1901 land.LandData.ParcelAccessList.Add(entry);
1902 return;
1903 }
1904 else
1905 {
1906 targetVector = new Vector3(targetAvatar.AbsolutePosition.X, 0, targetAvatar.AbsolutePosition.Z); ;
1907 targetAvatar.TeleportWithMomentum(targetVector);
1908 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1909 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned.");
1910 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
1911 entry.AgentID = targetAvatar.UUID;
1912 entry.Flags = AccessList.Ban;
1913 entry.Time = new DateTime();
1914 land.LandData.ParcelAccessList.Add(entry);
1915 return;
1916 }
1917 }
1918 }
1919 }
1920 }
1580 } 1921 }
1581} 1922}
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
index d87352f..d0517b7 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
@@ -288,6 +288,22 @@ namespace OpenSim.Region.CoreModules.World.Land
288 return false; 288 return false;
289 } 289 }
290 290
291 public bool HasGroupAccess(UUID avatar)
292 {
293 if (LandData.GroupID != UUID.Zero && (LandData.Flags & (uint)ParcelFlags.UseAccessGroup) == (uint)ParcelFlags.UseAccessGroup)
294 {
295 ScenePresence sp;
296 if (!m_scene.TryGetScenePresence(avatar, out sp))
297 return false;
298
299 if (!sp.ControllingClient.IsGroupMember(LandData.GroupID))
300 return false;
301
302 return true;
303 }
304 return false;
305 }
306
291 public bool IsBannedFromLand(UUID avatar) 307 public bool IsBannedFromLand(UUID avatar)
292 { 308 {
293 if (m_scene.Permissions.IsAdministrator(avatar)) 309 if (m_scene.Permissions.IsAdministrator(avatar))
@@ -324,10 +340,14 @@ namespace OpenSim.Region.CoreModules.World.Land
324 //If they are not on the access list and are not the owner 340 //If they are not on the access list and are not the owner
325 if (!LandData.ParcelAccessList.Contains(entry) && LandData.OwnerID != avatar) 341 if (!LandData.ParcelAccessList.Contains(entry) && LandData.OwnerID != avatar)
326 { 342 {
327 //They are not allowed in this parcel, but not banned, so lets send them a notice about this parcel 343 if (!HasGroupAccess(avatar))
328 return true; 344 {
345 //They are not allowed in this parcel, but not banned, so lets send them a notice about this parcel
346 return true;
347 }
329 } 348 }
330 } 349 }
350
331 return false; 351 return false;
332 } 352 }
333 353
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
index f5f3839..289741f 100644
--- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
@@ -412,7 +412,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
412 412
413 public string Name 413 public string Name
414 { 414 {
415 get { return "PermissionsModule"; } 415 get { return "DefaultPermissionsModule"; }
416 } 416 }
417 417
418 public bool IsSharedModule 418 public bool IsSharedModule
diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
index 25d73c2..4611352 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
@@ -549,6 +549,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain
549 m_scene.PhysicsScene.SetTerrain(m_channel.GetFloatsSerialised()); 549 m_scene.PhysicsScene.SetTerrain(m_channel.GetFloatsSerialised());
550 m_scene.SaveTerrain(); 550 m_scene.SaveTerrain();
551 551
552 m_scene.EventManager.TriggerTerrainUpdate();
553
552 // Clients who look at the map will never see changes after they looked at the map, so i've commented this out. 554 // Clients who look at the map will never see changes after they looked at the map, so i've commented this out.
553 //m_scene.CreateTerrainTexture(true); 555 //m_scene.CreateTerrainTexture(true);
554 } 556 }
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
index 9f88517..d2c3afb 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) 87 private void OnMapNameRequest(IClientAPI remoteClient, string mapName)
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