aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs167
1 files changed, 72 insertions, 95 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 4af4339..57bff6e 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -2664,13 +2664,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2664 private LSL_Key NpcCreate( 2664 private LSL_Key NpcCreate(
2665 string firstname, string lastname, LSL_Vector position, string notecard, bool owned, bool senseAsAgent, bool hostGroupID) 2665 string firstname, string lastname, LSL_Vector position, string notecard, bool owned, bool senseAsAgent, bool hostGroupID)
2666 { 2666 {
2667
2668 if (!World.Permissions.CanRezObject(1, m_host.OwnerID, new Vector3((float)position.x, (float)position.y, (float)position.z))) 2667 if (!World.Permissions.CanRezObject(1, m_host.OwnerID, new Vector3((float)position.x, (float)position.y, (float)position.z)))
2668 {
2669 OSSLError("no permission to rez NPC at requested location");
2669 return new LSL_Key(UUID.Zero.ToString()); 2670 return new LSL_Key(UUID.Zero.ToString());
2671 }
2670 2672
2671 INPCModule module = World.RequestModuleInterface<INPCModule>(); 2673 INPCModule module = World.RequestModuleInterface<INPCModule>();
2672 if(module == null) 2674 if(module == null)
2673 new LSL_Key(UUID.Zero.ToString()); 2675 {
2676 OSSLError("NPC module not enabled");
2677 return new LSL_Key(UUID.Zero.ToString());
2678 }
2674 2679
2675 string groupTitle = String.Empty; 2680 string groupTitle = String.Empty;
2676 UUID groupID = UUID.Zero; 2681 UUID groupID = UUID.Zero;
@@ -3878,11 +3883,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3878 m_host.AddScriptLPS(1); 3883 m_host.AddScriptLPS(1);
3879 3884
3880 UUID targetUUID; 3885 UUID targetUUID;
3886 if(!UUID.TryParse(avatar.ToString(), out targetUUID))
3887 return;
3888
3889 if(targetUUID == UUID.Zero)
3890 return;
3891
3881 ScenePresence target; 3892 ScenePresence target;
3893 if(!World.TryGetScenePresence(targetUUID, out target))
3894 return;
3882 3895
3883 if (attachmentPoints.Length >= 1 && UUID.TryParse(avatar.ToString(), out targetUUID) && World.TryGetScenePresence(targetUUID, out target)) 3896 if(target.IsDeleted || target.IsInTransit)
3897 return;
3898
3899 List<int> aps = new List<int>();
3900 if(attachmentPoints.Length != 0)
3884 { 3901 {
3885 List<int> aps = new List<int>();
3886 foreach (object point in attachmentPoints.Data) 3902 foreach (object point in attachmentPoints.Data)
3887 { 3903 {
3888 int ipoint; 3904 int ipoint;
@@ -3891,115 +3907,76 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3891 aps.Add(ipoint); 3907 aps.Add(ipoint);
3892 } 3908 }
3893 } 3909 }
3910 // parsing failed
3911 if(aps.Count != attachmentPoints.Length)
3912 return;
3913 }
3894 3914
3895 List<SceneObjectGroup> attachments = new List<SceneObjectGroup>(); 3915 List<SceneObjectGroup> attachments = new List<SceneObjectGroup>();
3896 3916
3897 bool msgAll = aps.Contains(ScriptBaseClass.OS_ATTACH_MSG_ALL); 3917 bool msgAll;
3898 bool invertPoints = (options & ScriptBaseClass.OS_ATTACH_MSG_INVERT_POINTS) != 0; 3918 bool invertPoints = (options & ScriptBaseClass.OS_ATTACH_MSG_INVERT_POINTS) != 0;
3899 3919
3900 if (msgAll && invertPoints) 3920 if(aps.Count == 0)
3901 { 3921 {
3902 return; 3922 if(!invertPoints)
3903 }
3904 else if (msgAll || invertPoints)
3905 {
3906 attachments = target.GetAttachments();
3907 }
3908 else
3909 {
3910 foreach (int point in aps)
3911 {
3912 if (point > 0)
3913 {
3914 attachments.AddRange(target.GetAttachments((uint)point));
3915 }
3916 }
3917 }
3918
3919 // if we have no attachments at this point, exit now
3920 if (attachments.Count == 0)
3921 {
3922 return; 3923 return;
3923 } 3924 msgAll = true;
3925 invertPoints = false;
3926 }
3927 else
3928 msgAll = aps.Contains(ScriptBaseClass.OS_ATTACH_MSG_ALL);
3924 3929
3925 List<SceneObjectGroup> ignoreThese = new List<SceneObjectGroup>(); 3930 if (msgAll && invertPoints)
3931 return;
3926 3932
3927 if (invertPoints) 3933 if (msgAll || invertPoints)
3934 {
3935 attachments = target.GetAttachments();
3936 }
3937 else
3938 {
3939 foreach (int point in aps)
3928 { 3940 {
3929 foreach (SceneObjectGroup attachment in attachments) 3941 if (point > 0)
3930 { 3942 {
3931 if (aps.Contains((int)attachment.AttachmentPoint)) 3943 attachments.AddRange(target.GetAttachments((uint)point));
3932 {
3933 ignoreThese.Add(attachment);
3934 }
3935 } 3944 }
3936 } 3945 }
3946 }
3937 3947
3938 foreach (SceneObjectGroup attachment in ignoreThese) 3948 // if we have no attachments at this point, exit now
3939 { 3949 if (attachments.Count == 0)
3940 attachments.Remove(attachment); 3950 {
3941 } 3951 return;
3942 ignoreThese.Clear(); 3952 }
3943
3944 // if inverting removed all attachments to check, exit now
3945 if (attachments.Count < 1)
3946 {
3947 return;
3948 }
3949 3953
3950 if ((options & ScriptBaseClass.OS_ATTACH_MSG_OBJECT_CREATOR) != 0) 3954 bool optionObjCreator = (options &
3951 { 3955 ScriptBaseClass.OS_ATTACH_MSG_OBJECT_CREATOR) != 0;
3952 foreach (SceneObjectGroup attachment in attachments) 3956 bool optionScriptCreator = (options &
3953 { 3957 ScriptBaseClass.OS_ATTACH_MSG_SCRIPT_CREATOR) != 0;
3954 if (attachment.RootPart.CreatorID != m_host.CreatorID)
3955 {
3956 ignoreThese.Add(attachment);
3957 }
3958 }
3959 3958
3960 foreach (SceneObjectGroup attachment in ignoreThese) 3959 UUID hostCreatorID = m_host.CreatorID;
3961 { 3960 UUID itemCreatorID = m_item.CreatorID;
3962 attachments.Remove(attachment);
3963 }
3964 ignoreThese.Clear();
3965 3961
3966 // if filtering by same object creator removed all 3962 foreach (SceneObjectGroup sog in attachments)
3967 // attachments to check, exit now 3963 {
3968 if (attachments.Count == 0) 3964 if(sog.IsDeleted || sog.inTransit)
3969 { 3965 continue;
3970 return;
3971 }
3972 }
3973 3966
3974 if ((options & ScriptBaseClass.OS_ATTACH_MSG_SCRIPT_CREATOR) != 0) 3967 if (invertPoints && aps.Contains((int)sog.AttachmentPoint))
3975 { 3968 continue;
3976 foreach (SceneObjectGroup attachment in attachments)
3977 {
3978 if (attachment.RootPart.CreatorID != m_item.CreatorID)
3979 {
3980 ignoreThese.Add(attachment);
3981 }
3982 }
3983 3969
3984 foreach (SceneObjectGroup attachment in ignoreThese) 3970 UUID CreatorID = sog.RootPart.CreatorID;
3985 { 3971 if (optionObjCreator && CreatorID != hostCreatorID)
3986 attachments.Remove(attachment); 3972 continue;
3987 }
3988 ignoreThese.Clear();
3989 3973
3990 // if filtering by object creator must match originating 3974 if (optionScriptCreator && CreatorID != itemCreatorID)
3991 // script creator removed all attachments to check, 3975 continue;
3992 // exit now
3993 if (attachments.Count == 0)
3994 {
3995 return;
3996 }
3997 }
3998 3976
3999 foreach (SceneObjectGroup attachment in attachments) 3977 SceneObjectPart[] parts = sog.Parts;
4000 { 3978 foreach(SceneObjectPart p in parts)
4001 MessageObject(attachment.RootPart.UUID, message); 3979 MessageObject(p.UUID, message);
4002 }
4003 } 3980 }
4004 } 3981 }
4005 3982