aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs7
-rwxr-xr-xOpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs168
-rw-r--r--OpenSim/Region/Framework/Interfaces/IScenePresence.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs2
-rw-r--r--OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs1
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/YEngine/XMRScriptUThread.cs2
7 files changed, 100 insertions, 83 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
index 08c2b38..c1030ae 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
@@ -164,7 +164,6 @@ namespace OpenSim.Region.ClientStack.Linden
164 m_features["BakesOnMeshEnabled"] = true; 164 m_features["BakesOnMeshEnabled"] = true;
165 165
166 m_features["PhysicsMaterialsEnabled"] = true; 166 m_features["PhysicsMaterialsEnabled"] = true;
167
168 OSDMap typesMap = new OSDMap(); 167 OSDMap typesMap = new OSDMap();
169 typesMap["convex"] = true; 168 typesMap["convex"] = true;
170 typesMap["none"] = true; 169 typesMap["none"] = true;
@@ -175,10 +174,14 @@ namespace OpenSim.Region.ClientStack.Linden
175 m_features["LSLSyntaxId"] = OSD.FromUUID(m_scriptSyntaxID); 174 m_features["LSLSyntaxId"] = OSD.FromUUID(m_scriptSyntaxID);
176 175
177 OSDMap meshAnim = new OSDMap(); 176 OSDMap meshAnim = new OSDMap();
178 meshAnim["AnimatedObjectMaxTris"] = OSD.FromInteger(10000); 177 meshAnim["AnimatedObjectMaxTris"] = OSD.FromInteger(150000);
179 meshAnim["MaxAgentAnimatedObjectAttachments"] = OSD.FromInteger(2); 178 meshAnim["MaxAgentAnimatedObjectAttachments"] = OSD.FromInteger(2);
180 m_features["AnimatedObjects"] = meshAnim; 179 m_features["AnimatedObjects"] = meshAnim;
181 180
181 m_features["MaxAgentAttachments"] = OSD.FromInteger(Constants.MaxAgentAttachments);
182 m_features["MaxAgentGroupsBasic"] = OSD.FromInteger(Constants.MaxAgentGroups);
183 m_features["MaxAgentGroupsPremium"] = OSD.FromInteger(Constants.MaxAgentGroups);
184
182 // Extra information for viewers that want to use it 185 // Extra information for viewers that want to use it
183 // TODO: Take these out of here into their respective modules, like map-server-url 186 // TODO: Take these out of here into their respective modules, like map-server-url
184 OSDMap extrasMap; 187 OSDMap extrasMap;
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index e342897..e82dc7f 100755
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -59,6 +59,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
59 private Scene m_scene; 59 private Scene m_scene;
60 private IRegionConsole m_regionConsole; 60 private IRegionConsole m_regionConsole;
61 private IInventoryAccessModule m_invAccessModule; 61 private IInventoryAccessModule m_invAccessModule;
62 private bool m_wearReplacesAllOption = true;
62 63
63 /// <summary> 64 /// <summary>
64 /// Are attachments enabled? 65 /// Are attachments enabled?
@@ -74,6 +75,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
74 if (config != null) 75 if (config != null)
75 { 76 {
76 Enabled = config.GetBoolean("Enabled", true); 77 Enabled = config.GetBoolean("Enabled", true);
78 m_wearReplacesAllOption = config.GetBoolean("WearReplacesAll", true);
77 } 79 }
78 else 80 else
79 { 81 {
@@ -101,10 +103,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
101 103
102 public void RemoveRegion(Scene scene) 104 public void RemoveRegion(Scene scene)
103 { 105 {
104 m_scene.UnregisterModuleInterface<IAttachmentsModule>(this); 106 if (!Enabled)
107 return;
105 108
106 if (Enabled) 109 m_scene.UnregisterModuleInterface<IAttachmentsModule>(this);
107 m_scene.EventManager.OnNewClient -= SubscribeToClientEvents; 110 m_scene.EventManager.OnNewClient -= SubscribeToClientEvents;
108 } 111 }
109 112
110 public void RegionLoaded(Scene scene) 113 public void RegionLoaded(Scene scene)
@@ -225,8 +228,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
225 ConsoleDisplayList ct = new ConsoleDisplayList(); 228 ConsoleDisplayList ct = new ConsoleDisplayList();
226 229
227 List<SceneObjectGroup> attachmentObjects = sp.GetAttachments(); 230 List<SceneObjectGroup> attachmentObjects = sp.GetAttachments();
228 foreach (SceneObjectGroup attachmentObject in attachmentObjects) 231 for (int i = 0; i < attachmentObjects.Count; ++i)
229 { 232 {
233 SceneObjectGroup attachmentObject = attachmentObjects[i];
230 ct.Indent = 2; 234 ct.Indent = 2;
231 ct.AddRow("Attachment Name", attachmentObject.Name); 235 ct.AddRow("Attachment Name", attachmentObject.Name);
232 ct.AddRow("Local ID", attachmentObject.LocalId); 236 ct.AddRow("Local ID", attachmentObject.LocalId);
@@ -308,13 +312,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
308 List<SceneObjectGroup> attachments = sp.GetAttachments(); 312 List<SceneObjectGroup> attachments = sp.GetAttachments();
309 if (attachments.Count > 0) 313 if (attachments.Count > 0)
310 { 314 {
311 ad.AttachmentObjects = new List<ISceneObject>(); 315 ad.AttachmentObjects = new List<ISceneObject>(attachments.Count);
312 ad.AttachmentObjectStates = new List<string>(); 316 ad.AttachmentObjectStates = new List<string>(attachments.Count);
313 // IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>();
314 sp.InTransitScriptStates.Clear(); 317 sp.InTransitScriptStates.Clear();
315 318
316 foreach (SceneObjectGroup sog in attachments) 319 for (int indx = 0; indx < attachments.Count; ++indx)
317 { 320 {
321 SceneObjectGroup sog = attachments[indx];
318 // We need to make a copy and pass that copy 322 // We need to make a copy and pass that copy
319 // because of transfers withn the same sim 323 // because of transfers withn the same sim
320 ISceneObject clone = sog.CloneForNewScene(); 324 ISceneObject clone = sog.CloneForNewScene();
@@ -343,17 +347,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
343 sp.ClearAttachments(); 347 sp.ClearAttachments();
344 348
345 int i = 0; 349 int i = 0;
346 foreach (ISceneObject so in ad.AttachmentObjects) 350 for (int indx = 0; indx < ad.AttachmentObjects.Count; ++indx)
347 { 351 {
348 ((SceneObjectGroup)so).LocalId = 0; 352 SceneObjectGroup sog = (SceneObjectGroup)ad.AttachmentObjects[indx];
349 ((SceneObjectGroup)so).RootPart.ClearUpdateSchedule(); 353 sog.LocalId = 0;
354 sog.RootPart.ClearUpdateSchedule();
350 355
351// m_log.DebugFormat( 356// m_log.DebugFormat(
352// "[ATTACHMENTS MODULE]: Copying script state with {0} bytes for object {1} for {2} in {3}", 357// "[ATTACHMENTS MODULE]: Copying script state with {0} bytes for object {1} for {2} in {3}",
353// ad.AttachmentObjectStates[i].Length, so.Name, sp.Name, m_scene.Name); 358// ad.AttachmentObjectStates[i].Length, sog.Name, sp.Name, m_scene.Name);
354 359
355 so.SetState(ad.AttachmentObjectStates[i++], m_scene); 360 sog.SetState(ad.AttachmentObjectStates[i++], m_scene);
356 m_scene.IncomingCreateObject(Vector3.Zero, so); 361 m_scene.IncomingCreateObject(Vector3.Zero, sog);
357 } 362 }
358 } 363 }
359 } 364 }
@@ -363,14 +368,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
363 if (!Enabled) 368 if (!Enabled)
364 return; 369 return;
365 370
366 if (null == sp.Appearance) 371 if (sp.Appearance == null)
367 { 372 {
368 m_log.WarnFormat("[ATTACHMENTS MODULE]: Appearance has not been initialized for agent {0}", sp.UUID); 373 m_log.WarnFormat("[ATTACHMENTS MODULE]: Appearance has not been initialized for agent {0}", sp.UUID);
369
370 return; 374 return;
371 } 375 }
372 376
373 if (sp.GetAttachments().Count > 0) 377 if (sp.GetAttachmentsCount() > 0)
374 { 378 {
375 if (DebugLevel > 0) 379 if (DebugLevel > 0)
376 m_log.DebugFormat( 380 m_log.DebugFormat(
@@ -420,27 +424,20 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
420 424
421 // Let's get all items at once, so they get cached 425 // Let's get all items at once, so they get cached
422 UUID[] items = new UUID[attachments.Count]; 426 UUID[] items = new UUID[attachments.Count];
423 int i = 0; 427 for (int i = 0; i < attachments.Count; ++i)
424 foreach (AvatarAttachment attach in attachments) 428 items[i] = attachments[i].ItemID;
425 items[i++] = attach.ItemID; 429
426 m_scene.InventoryService.GetMultipleItems(sp.UUID, items); 430 m_scene.InventoryService.GetMultipleItems(sp.UUID, items);
427 431
428 foreach (AvatarAttachment attach in attachments) 432 for (int indx = 0; indx < attachments.Count; ++indx)
429 { 433 {
434 AvatarAttachment attach = attachments[indx];
430 uint attachmentPt = (uint)attach.AttachPoint; 435 uint attachmentPt = (uint)attach.AttachPoint;
431 436
432// m_log.DebugFormat( 437// m_log.DebugFormat(
433// "[ATTACHMENTS MODULE]: Doing initial rez of attachment with itemID {0}, assetID {1}, point {2} for {3} in {4}", 438// "[ATTACHMENTS MODULE]: Doing initial rez of attachment with itemID {0}, assetID {1}, point {2} for {3} in {4}",
434// attach.ItemID, attach.AssetID, p, sp.Name, m_scene.RegionInfo.RegionName); 439// attach.ItemID, attach.AssetID, p, sp.Name, m_scene.RegionInfo.RegionName);
435 440
436 // For some reason assetIDs are being written as Zero's in the DB -- need to track tat down
437 // But they're not used anyway, the item is being looked up for now, so let's proceed.
438 //if (UUID.Zero == assetID)
439 //{
440 // m_log.DebugFormat("[ATTACHMENT]: Cannot rez attachment in point {0} with itemID {1}", p, itemID);
441 // continue;
442 //}
443
444 try 441 try
445 { 442 {
446 string xmlData; 443 string xmlData;
@@ -482,24 +479,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
482 if (attachments.Count <= 0) 479 if (attachments.Count <= 0)
483 return; 480 return;
484 481
485 Dictionary<SceneObjectGroup, string> scriptStates = new Dictionary<SceneObjectGroup, string>();
486
487 if (sp.PresenceType != PresenceType.Npc) 482 if (sp.PresenceType != PresenceType.Npc)
488 { 483 {
489 foreach (SceneObjectGroup so in attachments)
490 {
491 // Scripts MUST be snapshotted before the object is
492 // removed from the scene because doing otherwise will
493 // clobber the run flag
494 // This must be done outside the sp.AttachmentSyncLock so that there is no risk of a deadlock from
495 // scripts performing attachment operations at the same time. Getting object states stops the scripts.
496 scriptStates[so] = PrepareScriptInstanceForSave(so, false);
497 }
498
499 lock (sp.AttachmentsSyncLock) 484 lock (sp.AttachmentsSyncLock)
500 { 485 {
501 foreach (SceneObjectGroup so in attachments) 486 for (int i = 0; i < attachments.Count; ++i)
502 UpdateDetachedObject(sp, so, scriptStates[so]); 487 {
488 SceneObjectGroup sog = attachments[i];
489 UpdateDetachedObject(sp, sog, PrepareScriptInstanceForSave(sog, false));
490 }
503 sp.ClearAttachments(); 491 sp.ClearAttachments();
504 } 492 }
505 } 493 }
@@ -507,8 +495,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
507 { 495 {
508 lock (sp.AttachmentsSyncLock) 496 lock (sp.AttachmentsSyncLock)
509 { 497 {
510 foreach (SceneObjectGroup so in attachments) 498 for (int i = 0; i < attachments.Count; ++i)
511 UpdateDetachedObject(sp, so, String.Empty); 499 UpdateDetachedObject(sp, attachments[i], String.Empty);
512 sp.ClearAttachments(); 500 sp.ClearAttachments();
513 } 501 }
514 } 502 }
@@ -524,9 +512,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
524 "[ATTACHMENTS MODULE]: Deleting attachments from scene {0} for {1}, silent = {2}", 512 "[ATTACHMENTS MODULE]: Deleting attachments from scene {0} for {1}, silent = {2}",
525 m_scene.RegionInfo.RegionName, sp.Name, silent); 513 m_scene.RegionInfo.RegionName, sp.Name, silent);
526 514
527 foreach (SceneObjectGroup sop in sp.GetAttachments()) 515 List<SceneObjectGroup> attachments = sp.GetAttachments();
516
517 for(int i = 0; i < attachments.Count; ++i)
528 { 518 {
529 sop.Scene.DeleteSceneObject(sop, silent); 519 SceneObjectGroup sog = attachments[i];
520 sog.Scene.DeleteSceneObject(sog, silent);
530 } 521 }
531 522
532 sp.ClearAttachments(); 523 sp.ClearAttachments();
@@ -612,41 +603,61 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
612 attachPos = Vector3.Zero; 603 attachPos = Vector3.Zero;
613 } 604 }
614 605
615 List<SceneObjectGroup> attachments = sp.GetAttachments(attachmentPt); 606 if(attachmentPt > (uint)AttachmentPoint.LastValid)
616 if (attachments.Contains(group))
617 { 607 {
618// if (DebugLevel > 0) 608 m_log.WarnFormat("[ATTACHMENTS MODULE]: Invalid attachment point {0} SP {1}", attachmentPt, sp.Name);
619// m_log.WarnFormat(
620// "[ATTACHMENTS MODULE]: Ignoring request to attach {0} {1} to {2} on {3} since it's already attached",
621// group.Name, group.LocalId, sp.Name, attachmentPt);
622
623 return false; 609 return false;
624 } 610 }
625 611
626 // If we already have 5, remove the oldest until only 4 are left. Skip over temp ones 612 List<SceneObjectGroup> attachments = sp.GetAttachments();
627 while (attachments.Count >= 5) 613 List<SceneObjectGroup> toRemove = new List<SceneObjectGroup>(attachments.Count);
628 { 614 bool doRemCheck = !append;
629 if (attachments[0].FromItemID != UUID.Zero)
630 DetachSingleAttachmentToInv(sp, attachments[0]);
631 attachments.RemoveAt(0);
632 }
633 615
634 // If we're not appending, remove the rest as well 616 for(int i = 0; i < attachments.Count; ++i)
635 if (attachments.Count != 0 && !append)
636 { 617 {
637 foreach (SceneObjectGroup g in attachments) 618 SceneObjectGroup sog = attachments[i];
619 // duplications ?
620 if (group.UUID == sog.UUID)
638 { 621 {
639 if (g.FromItemID != UUID.Zero) 622 // if (DebugLevel > 0)
640 DetachSingleAttachmentToInv(sp, g); 623 // m_log.WarnFormat(
624 // "[ATTACHMENTS MODULE]: Ignoring request to attach {0} {1} to {2} on {3} since it's already attached",
625 // group.Name, group.LocalId, sp.Name, attachmentPt);
626 return false;
641 } 627 }
628 if(doRemCheck)
629 {
630 if(sog.AttachmentPoint == attachmentPt)
631 {
632 toRemove.Add(sog);
633 if(!m_wearReplacesAllOption)
634 doRemCheck = false;
635 }
636 }
637 }
638
639 if(attachments.Count - toRemove.Count >= Constants.MaxAgentAttachments)
640 {
641 m_log.WarnFormat("[ATTACHMENTS MODULE]: Max attachments exceded {0}",sp.Name);
642 return false;
642 } 643 }
643 644
644 group.DetachFromBackup(); 645 group.DetachFromBackup();
646 group.AttachmentPoint = attachmentPt;
647 group.RootPart.AttachedPos = attachPos;
645 648
649 // If we're not appending, remove the rest as well
646 lock (sp.AttachmentsSyncLock) 650 lock (sp.AttachmentsSyncLock)
647 { 651 {
648 group.AttachmentPoint = attachmentPt; 652 if (toRemove.Count > 0)
649 group.RootPart.AttachedPos = attachPos; 653 {
654 for (int i = 0; i< toRemove.Count; ++i)
655 {
656 SceneObjectGroup g = toRemove[i];
657 if (g.FromItemID != UUID.Zero)
658 DetachSingleAttachmentToInv(sp, g);
659 }
660 }
650 661
651 if (addToInventory && sp.PresenceType != PresenceType.Npc) 662 if (addToInventory && sp.PresenceType != PresenceType.Npc)
652 UpdateUserInventoryWithAttachment(sp, group, attachmentPt, append); 663 UpdateUserInventoryWithAttachment(sp, group, attachmentPt, append);
@@ -668,7 +679,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
668 // and not all scripts are loaded at this point 679 // and not all scripts are loaded at this point
669 m_scene.EventManager.TriggerOnAttach(group.LocalId, group.FromItemID, sp.UUID); 680 m_scene.EventManager.TriggerOnAttach(group.LocalId, group.FromItemID, sp.UUID);
670 } 681 }
671
672 return true; 682 return true;
673 } 683 }
674 684
@@ -1255,10 +1265,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1255 1265
1256 // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller. 1266 // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller.
1257 objatt.HasGroupChanged = false; 1267 objatt.HasGroupChanged = false;
1258 bool tainted = false;
1259 if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint)
1260 tainted = true;
1261 1268
1269 Vector3 lastPos = objatt.RootPart.OffsetPosition;
1270 Vector3 lastAttPos = objatt.RootPart.AttachedPos;
1271 bool doneAttach = false;
1262 // FIXME: Detect whether it's really likely for AttachObject to throw an exception in the normal 1272 // FIXME: Detect whether it's really likely for AttachObject to throw an exception in the normal
1263 // course of events. If not, then it's probably not worth trying to recover the situation 1273 // course of events. If not, then it's probably not worth trying to recover the situation
1264 // since this is more likely to trigger further exceptions and confuse later debugging. If 1274 // since this is more likely to trigger further exceptions and confuse later debugging. If
@@ -1273,21 +1283,27 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1273 objatt.ResetOwnerChangeFlag(); 1283 objatt.ResetOwnerChangeFlag();
1274 } 1284 }
1275 1285
1276 AttachObjectInternal(sp, objatt, attachmentPt, false, true, true, append); 1286 doneAttach = AttachObjectInternal(sp, objatt, attachmentPt, false, true, true, append);
1277 } 1287 }
1278 catch (Exception e) 1288 catch (Exception e)
1279 { 1289 {
1280 m_log.ErrorFormat( 1290 m_log.ErrorFormat(
1281 "[ATTACHMENTS MODULE]: Failed to attach {0} {1} for {2}, exception {3}{4}", 1291 "[ATTACHMENTS MODULE]: Failed to attach {0} {1} for {2}, exception {3}{4}",
1282 objatt.Name, objatt.UUID, sp.Name, e.Message, e.StackTrace); 1292 objatt.Name, objatt.UUID, sp.Name, e.Message, e.StackTrace);
1293 doneAttach = false;
1294 }
1283 1295
1296 if(!doneAttach)
1297 {
1284 // Make sure the object doesn't stick around and bail 1298 // Make sure the object doesn't stick around and bail
1285 sp.RemoveAttachment(objatt); 1299 sp.RemoveAttachment(objatt);
1286 m_scene.DeleteSceneObject(objatt, false); 1300 m_scene.DeleteSceneObject(objatt, false);
1287 return null; 1301 return null;
1288 } 1302 }
1289 1303
1290 if (tainted) 1304 if ((attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint) ||
1305 lastPos != objatt.RootPart.OffsetPosition ||
1306 lastAttPos != objatt.RootPart.AttachedPos)
1291 objatt.HasGroupChanged = true; 1307 objatt.HasGroupChanged = true;
1292 1308
1293 return objatt; 1309 return objatt;
diff --git a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
index 412c86e..10d429d 100644
--- a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
@@ -53,7 +53,6 @@ namespace OpenSim.Region.Framework.Interfaces
53 /// All add and remove attachment operations must synchronize on this for the lifetime of their operations. 53 /// All add and remove attachment operations must synchronize on this for the lifetime of their operations.
54 /// </remarks> 54 /// </remarks>
55 Object AttachmentsSyncLock { get; } 55 Object AttachmentsSyncLock { get; }
56 int MaxNumberAttachments { get; }
57 int GetAttachmentsCount(); 56 int GetAttachmentsCount();
58 /// <summary> 57 /// <summary>
59 /// The scene objects attached to this avatar. 58 /// The scene objects attached to this avatar.
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 070a924..4413d26 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -78,8 +78,6 @@ namespace OpenSim.Region.Framework.Scenes
78 { 78 {
79 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 79 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
80 80
81 public int MaxNumberAttachments { get; } = 38; // per viewers limit
82
83 // ~ScenePresence() 81 // ~ScenePresence()
84 // { 82 // {
85 // m_log.DebugFormat("[SCENE PRESENCE]: Destructor called on {0}", Name); 83 // m_log.DebugFormat("[SCENE PRESENCE]: Destructor called on {0}", Name);
diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs
index 331f1bd..6357d4f 100644
--- a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs
+++ b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs
@@ -228,6 +228,7 @@ namespace OpenSim.Region.OptionalModules.Materials
228 private void OnSimulatorFeaturesRequest(UUID agentID, ref OSDMap features) 228 private void OnSimulatorFeaturesRequest(UUID agentID, ref OSDMap features)
229 { 229 {
230 features["MaxMaterialsPerTransaction"] = m_maxMaterialsPerTransaction; 230 features["MaxMaterialsPerTransaction"] = m_maxMaterialsPerTransaction;
231 features["RenderMaterialsCapability"] = OSD.FromReal(3);
231 } 232 }
232 233
233 /// <summary> 234 /// <summary>
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 5d291d5..1591cb1 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -14531,7 +14531,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
14531 ret.Add(new LSL_Integer(0)); 14531 ret.Add(new LSL_Integer(0));
14532 break; 14532 break;
14533 case ScriptBaseClass.OBJECT_ATTACHED_SLOTS_AVAILABLE: 14533 case ScriptBaseClass.OBJECT_ATTACHED_SLOTS_AVAILABLE:
14534 ret.Add(new LSL_Integer(38 - av.GetAttachmentsCount())); 14534 ret.Add(new LSL_Integer(Constants.MaxAgentAttachments - av.GetAttachmentsCount()));
14535 break; 14535 break;
14536 case ScriptBaseClass.OBJECT_CREATION_TIME: 14536 case ScriptBaseClass.OBJECT_CREATION_TIME:
14537 ret.Add(new LSL_String("")); 14537 ret.Add(new LSL_String(""));
diff --git a/OpenSim/Region/ScriptEngine/YEngine/XMRScriptUThread.cs b/OpenSim/Region/ScriptEngine/YEngine/XMRScriptUThread.cs
index 5806d36..6f26243 100644
--- a/OpenSim/Region/ScriptEngine/YEngine/XMRScriptUThread.cs
+++ b/OpenSim/Region/ScriptEngine/YEngine/XMRScriptUThread.cs
@@ -82,7 +82,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
82 if(callMode != XMRInstance.CallMode_SAVE) 82 if(callMode != XMRInstance.CallMode_SAVE)
83 throw new Exception("callMode=" + callMode); 83 throw new Exception("callMode=" + callMode);
84 } 84 }
85 catch(Exception e) 85 catch (Exception e)
86 { 86 {
87 return e; 87 return e;
88 } 88 }