aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs131
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs13
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs52
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs5
4 files changed, 201 insertions, 0 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 82114b3..8e80b4c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -3354,6 +3354,137 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3354 return resp; 3354 return resp;
3355 } 3355 }
3356 3356
3357 public void osMessageAttachments(LSL_Key avatar, string message, LSL_List attachmentPoints, int options)
3358 {
3359 CheckThreatLevel(ThreatLevel.Moderate, "osMessageAttachments");
3360 m_host.AddScriptLPS(1);
3361
3362 UUID targetUUID;
3363 ScenePresence target;
3364
3365 if (attachmentPoints.Length >= 1 && UUID.TryParse(avatar.ToString(), out targetUUID) && World.TryGetScenePresence(targetUUID, out target))
3366 {
3367 List<int> aps = new List<int>();
3368 foreach (object point in attachmentPoints.Data)
3369 {
3370 int ipoint;
3371 if (int.TryParse(point.ToString(), out ipoint))
3372 {
3373 aps.Add(ipoint);
3374 }
3375 }
3376
3377 List<SceneObjectGroup> attachments = new List<SceneObjectGroup>();
3378
3379 bool msgAll = aps.Contains(ScriptBaseClass.OS_ATTACH_MSG_ALL);
3380 bool invertPoints = (options & ScriptBaseClass.OS_ATTACH_MSG_INVERT_POINTS) != 0;
3381
3382 if (msgAll && invertPoints)
3383 {
3384 return;
3385 }
3386 else if (msgAll || invertPoints)
3387 {
3388 attachments = target.GetAttachments();
3389 }
3390 else
3391 {
3392 foreach (int point in aps)
3393 {
3394 if (point > 0)
3395 {
3396 attachments.AddRange(target.GetAttachments((uint)point));
3397 }
3398 }
3399 }
3400
3401 // if we have no attachments at this point, exit now
3402 if (attachments.Count == 0)
3403 {
3404 return;
3405 }
3406
3407 List<SceneObjectGroup> ignoreThese = new List<SceneObjectGroup>();
3408
3409 if (invertPoints)
3410 {
3411 foreach (SceneObjectGroup attachment in attachments)
3412 {
3413 if (aps.Contains((int)attachment.AttachmentPoint))
3414 {
3415 ignoreThese.Add(attachment);
3416 }
3417 }
3418 }
3419
3420 foreach (SceneObjectGroup attachment in ignoreThese)
3421 {
3422 attachments.Remove(attachment);
3423 }
3424 ignoreThese.Clear();
3425
3426 // if inverting removed all attachments to check, exit now
3427 if (attachments.Count < 1)
3428 {
3429 return;
3430 }
3431
3432 if ((options & ScriptBaseClass.OS_ATTACH_MSG_OBJECT_CREATOR) != 0)
3433 {
3434 foreach (SceneObjectGroup attachment in attachments)
3435 {
3436 if (attachment.RootPart.CreatorID != m_host.CreatorID)
3437 {
3438 ignoreThese.Add(attachment);
3439 }
3440 }
3441
3442 foreach (SceneObjectGroup attachment in ignoreThese)
3443 {
3444 attachments.Remove(attachment);
3445 }
3446 ignoreThese.Clear();
3447
3448 // if filtering by same object creator removed all
3449 // attachments to check, exit now
3450 if (attachments.Count == 0)
3451 {
3452 return;
3453 }
3454 }
3455
3456 if ((options & ScriptBaseClass.OS_ATTACH_MSG_SCRIPT_CREATOR) != 0)
3457 {
3458 foreach (SceneObjectGroup attachment in attachments)
3459 {
3460 if (attachment.RootPart.CreatorID != m_item.CreatorID)
3461 {
3462 ignoreThese.Add(attachment);
3463 }
3464 }
3465
3466 foreach (SceneObjectGroup attachment in ignoreThese)
3467 {
3468 attachments.Remove(attachment);
3469 }
3470 ignoreThese.Clear();
3471
3472 // if filtering by object creator must match originating
3473 // script creator removed all attachments to check,
3474 // exit now
3475 if (attachments.Count == 0)
3476 {
3477 return;
3478 }
3479 }
3480
3481 foreach (SceneObjectGroup attachment in attachments)
3482 {
3483 MessageObject(attachment.RootPart.UUID, message);
3484 }
3485 }
3486 }
3487
3357 #endregion 3488 #endregion
3358 3489
3359 /// <summary> 3490 /// <summary>
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 6db6443..bde7a8e 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -200,6 +200,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
200 /// <returns></returns> 200 /// <returns></returns>
201 LSL_List osGetNumberOfAttachments(LSL_Key avatar, LSL_List attachmentPoints); 201 LSL_List osGetNumberOfAttachments(LSL_Key avatar, LSL_List attachmentPoints);
202 202
203 /// <summary>
204 /// Sends a specified message to the specified avatar's attachments on
205 /// the specified attachment points.
206 /// </summary>
207 /// <remarks>
208 /// Behaves as osMessageObject(), without the sending script needing to know the attachment keys in advance.
209 /// </remarks>
210 /// <param name="avatar">avatar UUID</param>
211 /// <param name="message">message string</param>
212 /// <param name="attachmentPoints">list of ATTACH_* constants, or -1 for all attachments. If -1 is specified and OS_ATTACH_MSG_INVERT_POINTS is present in flags, no action is taken.</param>
213 /// <param name="flags">flags further constraining the attachments to deliver the message to.</param>
214 void osMessageAttachments(LSL_Key avatar, string message, LSL_List attachmentPoints, int flags);
215
203 #endregion 216 #endregion
204 217
205 //texture draw functions 218 //texture draw functions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index cad8518..60a7e14 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -237,6 +237,58 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
237 public const int ATTACH_HUD_BOTTOM = 37; 237 public const int ATTACH_HUD_BOTTOM = 37;
238 public const int ATTACH_HUD_BOTTOM_RIGHT = 38; 238 public const int ATTACH_HUD_BOTTOM_RIGHT = 38;
239 239
240 #region osMessageAttachments constants
241
242 /// <summary>
243 /// Instructs osMessageAttachements to send the message to attachments
244 /// on every point.
245 /// </summary>
246 /// <remarks>
247 /// One might expect this to be named OS_ATTACH_ALL, but then one might
248 /// also expect functions designed to attach or detach or get
249 /// attachments to work with it too. Attaching a no-copy item to
250 /// many attachments could be dangerous.
251 /// when combined with OS_ATTACH_MSG_INVERT_POINTS, will prevent the
252 /// message from being sent.
253 /// if combined with OS_ATTACH_MSG_OBJECT_CREATOR or
254 /// OS_ATTACH_MSG_SCRIPT_CREATOR, could result in no message being
255 /// sent- this is expected behaviour.
256 /// </remarks>
257 public const int OS_ATTACH_MSG_ALL = -65535;
258
259 /// <summary>
260 /// Instructs osMessageAttachements to invert how the attachment points
261 /// list should be treated (e.g. go from inclusive operation to
262 /// exclusive operation).
263 /// </summary>
264 /// <remarks>
265 /// This might be used if you want to deliver a message to one set of
266 /// attachments and a different message to everything else. With
267 /// this flag, you only need to build one explicit list for both calls.
268 /// </remarks>
269 public const int OS_ATTACH_MSG_INVERT_POINTS = 1;
270
271 /// <summary>
272 /// Instructs osMessageAttachments to only send the message to
273 /// attachments with a CreatorID that matches the host object CreatorID
274 /// </summary>
275 /// <remarks>
276 /// This would be used if distributed in an object vendor/updater server.
277 /// </remarks>
278 public const int OS_ATTACH_MSG_OBJECT_CREATOR = 2;
279
280 /// <summary>
281 /// Instructs osMessageAttachments to only send the message to
282 /// attachments with a CreatorID that matches the sending script CreatorID
283 /// </summary>
284 /// <remarks>
285 /// This might be used if the script is distributed independently of a
286 /// containing object.
287 /// </remarks>
288 public const int OS_ATTACH_MSG_SCRIPT_CREATOR = 4;
289
290 #endregion
291
240 public const int LAND_LEVEL = 0; 292 public const int LAND_LEVEL = 0;
241 public const int LAND_RAISE = 1; 293 public const int LAND_RAISE = 1;
242 public const int LAND_LOWER = 2; 294 public const int LAND_LOWER = 2;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 230c378..08ebfd6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -316,6 +316,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
316 return m_OSSL_Functions.osGetNumberOfAttachments(avatar, attachmentPoints); 316 return m_OSSL_Functions.osGetNumberOfAttachments(avatar, attachmentPoints);
317 } 317 }
318 318
319 public void osMessageAttachments(LSL_Key avatar, string message, LSL_List attachmentPoints, int flags)
320 {
321 m_OSSL_Functions.osMessageAttachments(avatar, message, attachmentPoints, flags);
322 }
323
319 #endregion 324 #endregion
320 325
321 // Texture Draw functions 326 // Texture Draw functions