diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 5aa7f5f641..2870e3c9da 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2139,6 +2139,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } MessageObject(objUUID, message); + ScriptSleep(25); // mostly a thread yield } private void MessageObject(UUID objUUID, string message) @@ -4341,51 +4342,53 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { CheckThreatLevel(ThreatLevel.Moderate, "osMessageAttachments"); - if (!UUID.TryParse(avatar.ToString(), out UUID targetUUID)) - return; - - if (targetUUID == UUID.Zero) + if (!UUID.TryParse(avatar.ToString(), out UUID targetUUID) || targetUUID == UUID.Zero) return; if (!World.TryGetScenePresence(targetUUID, out ScenePresence target)) return; - if (target.IsDeleted || target.IsInTransit) return; - List aps = new List(); - if(attachmentPoints.Length != 0) + bool invertPoints = (options & ScriptBaseClass.OS_ATTACH_MSG_INVERT_POINTS) != 0; + bool msgAll = false; + + List aps; + if(attachmentPoints.Length > 0) { + aps = new List(attachmentPoints.Length); foreach (object point in attachmentPoints.Data) { - if (int.TryParse(point.ToString(), out int ipoint)) + if (!int.TryParse(point.ToString(), out int ipoint)) + return; + if(ipoint == ScriptBaseClass.OS_ATTACH_MSG_ALL) { - aps.Add(ipoint); + if(invertPoints) + return; + msgAll = true; + break; } + else + aps.Add(ipoint); } - // parsing failed - if(aps.Count != attachmentPoints.Length) - return; } - - List attachments = new List(); - - bool msgAll; - bool invertPoints = (options & ScriptBaseClass.OS_ATTACH_MSG_INVERT_POINTS) != 0; + else + { + if (!invertPoints) + return; + aps = new List(); + } if(aps.Count == 0) { - if(!invertPoints) - return; msgAll = true; invertPoints = false; } - else - msgAll = aps.Contains(ScriptBaseClass.OS_ATTACH_MSG_ALL); if (msgAll && invertPoints) return; + List attachments = new List(); if (msgAll || invertPoints) { attachments = target.GetAttachments(); @@ -4407,17 +4410,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; } - bool optionObjCreator = (options & - ScriptBaseClass.OS_ATTACH_MSG_OBJECT_CREATOR) != 0; - bool optionScriptCreator = (options & - ScriptBaseClass.OS_ATTACH_MSG_SCRIPT_CREATOR) != 0; + bool optionObjCreator = (options & ScriptBaseClass.OS_ATTACH_MSG_OBJECT_CREATOR) != 0; + bool optionScriptCreator = (options & ScriptBaseClass.OS_ATTACH_MSG_SCRIPT_CREATOR) != 0; UUID hostCreatorID = m_host.CreatorID; UUID itemCreatorID = m_item.CreatorID; + int penalty = 200; foreach (SceneObjectGroup sog in attachments) { - if(sog.IsDeleted || sog.inTransit) + if(sog.IsDeleted || sog.inTransit || ((sog.ScriptEvents & scriptEvents.dataserver) == 0)) continue; if (invertPoints && aps.Contains((int)sog.AttachmentPoint)) @@ -4432,8 +4434,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api SceneObjectPart[] parts = sog.Parts; foreach(SceneObjectPart p in parts) - MessageObject(p.UUID, message); + { + if((p.ScriptEvents & scriptEvents.dataserver) != 0) + { + MessageObject(p.UUID, message); + penalty += 10; + } + } } + ScriptSleep(penalty); } #endregion diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index 936ea60936..22217988e5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -285,12 +285,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase /// /// Instructs osMessageAttachements to send the message to attachments /// on every point. + /// Note that is to be present on selected attachment points list, not options /// /// - /// One might expect this to be named OS_ATTACH_ALL, but then one might - /// also expect functions designed to attach or detach or get - /// attachments to work with it too. Attaching a no-copy item to - /// many attachments could be dangerous. /// when combined with OS_ATTACH_MSG_INVERT_POINTS, will prevent the /// message from being sent. /// if combined with OS_ATTACH_MSG_OBJECT_CREATOR or