aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs41
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs10
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs689
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs12
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs12
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs270
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs25
7 files changed, 486 insertions, 573 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs
index 47ed6ba..684138f 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs
@@ -29,42 +29,43 @@ using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Reflection; 31using System.Reflection;
32using log4net;
32using OpenSim.Region.ScriptEngine.Interfaces; 33using OpenSim.Region.ScriptEngine.Interfaces;
33 34
34namespace OpenSim.Region.ScriptEngine.Shared.Api 35namespace OpenSim.Region.ScriptEngine.Shared.Api
35{ 36{
36 public class ApiManager 37 public class ApiManager
37 { 38 {
39// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
40
38 private Dictionary<string,Type> m_Apis = new Dictionary<string,Type>(); 41 private Dictionary<string,Type> m_Apis = new Dictionary<string,Type>();
39 42
40 public string[] GetApis() 43 public string[] GetApis()
41 { 44 {
42 if (m_Apis.Count > 0) 45 if (m_Apis.Count <= 0)
43 { 46 {
44 List<string> l = new List<string>(m_Apis.Keys); 47 Assembly a = Assembly.GetExecutingAssembly();
45 return l.ToArray();
46 }
47 48
48 Assembly a = Assembly.GetExecutingAssembly(); 49 Type[] types = a.GetExportedTypes();
49 50
50 Type[] types = a.GetExportedTypes(); 51 foreach (Type t in types)
51
52 foreach (Type t in types)
53 {
54 string name = t.ToString();
55 int idx = name.LastIndexOf('.');
56 if (idx != -1)
57 name = name.Substring(idx+1);
58
59 if (name.EndsWith("_Api"))
60 { 52 {
61 name = name.Substring(0, name.Length - 4); 53 string name = t.ToString();
62 m_Apis[name] = t; 54 int idx = name.LastIndexOf('.');
55 if (idx != -1)
56 name = name.Substring(idx+1);
57
58 if (name.EndsWith("_Api"))
59 {
60 name = name.Substring(0, name.Length - 4);
61 m_Apis[name] = t;
62 }
63 } 63 }
64 } 64 }
65 65
66 List<string> ret = new List<string>(m_Apis.Keys); 66// m_log.DebugFormat("[API MANAGER]: Found {0} apis", m_Apis.Keys.Count);
67 return ret.ToArray(); 67
68 return new List<string>(m_Apis.Keys).ToArray();
68 } 69 }
69 70
70 public IScriptApi CreateApi(string api) 71 public IScriptApi CreateApi(string api)
@@ -76,4 +77,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
76 return ret; 77 return ret;
77 } 78 }
78 } 79 }
79} 80} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
index 489c1c6..b5fa6de 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
@@ -59,16 +59,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
59 { 59 {
60 internal IScriptEngine m_ScriptEngine; 60 internal IScriptEngine m_ScriptEngine;
61 internal SceneObjectPart m_host; 61 internal SceneObjectPart m_host;
62 internal uint m_localID; 62 internal TaskInventoryItem m_item;
63 internal UUID m_itemID;
64 internal bool m_CMFunctionsEnabled = false; 63 internal bool m_CMFunctionsEnabled = false;
65 64
66 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 65 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
67 { 66 {
68 m_ScriptEngine = ScriptEngine; 67 m_ScriptEngine = ScriptEngine;
69 m_host = host; 68 m_host = host;
70 m_localID = localID; 69 m_item = item;
71 m_itemID = itemID;
72 70
73 if (m_ScriptEngine.Config.GetBoolean("AllowCareminsterFunctions", false)) 71 if (m_ScriptEngine.Config.GetBoolean("AllowCareminsterFunctions", false))
74 m_CMFunctionsEnabled = true; 72 m_CMFunctionsEnabled = true;
@@ -95,7 +93,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
95 public string cmDetectedCountry(int number) 93 public string cmDetectedCountry(int number)
96 { 94 {
97 m_host.AddScriptLPS(1); 95 m_host.AddScriptLPS(1);
98 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 96 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
99 if (detectedParams == null) 97 if (detectedParams == null)
100 return String.Empty; 98 return String.Empty;
101 return detectedParams.Country; 99 return detectedParams.Country;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 6523c2d..5bd781c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -88,8 +88,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
88 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 88 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
89 protected IScriptEngine m_ScriptEngine; 89 protected IScriptEngine m_ScriptEngine;
90 protected SceneObjectPart m_host; 90 protected SceneObjectPart m_host;
91 protected uint m_localID; 91
92 protected UUID m_itemID; 92 /// <summary>
93 /// The item that hosts this script
94 /// </summary>
95 protected TaskInventoryItem m_item;
96
93 protected bool throwErrorOnNotImplemented = true; 97 protected bool throwErrorOnNotImplemented = true;
94 protected AsyncCommandManager AsyncCommands = null; 98 protected AsyncCommandManager AsyncCommands = null;
95 protected float m_ScriptDelayFactor = 1.0f; 99 protected float m_ScriptDelayFactor = 1.0f;
@@ -111,7 +115,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
111 protected Timer m_ShoutSayTimer; 115 protected Timer m_ShoutSayTimer;
112 protected int m_SayShoutCount = 0; 116 protected int m_SayShoutCount = 0;
113 117
114 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 118 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
115 { 119 {
116 m_ShoutSayTimer = new Timer(1000); 120 m_ShoutSayTimer = new Timer(1000);
117 m_ShoutSayTimer.Elapsed += SayShoutTimerElapsed; 121 m_ShoutSayTimer.Elapsed += SayShoutTimerElapsed;
@@ -120,8 +124,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
120 124
121 m_ScriptEngine = ScriptEngine; 125 m_ScriptEngine = ScriptEngine;
122 m_host = host; 126 m_host = host;
123 m_localID = localID; 127 m_item = item;
124 m_itemID = itemID;
125 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); 128 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
126 129
127 m_ScriptDelayFactor = 130 m_ScriptDelayFactor =
@@ -173,7 +176,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
173 [DebuggerNonUserCode] 176 [DebuggerNonUserCode]
174 public void state(string newState) 177 public void state(string newState)
175 { 178 {
176 m_ScriptEngine.SetState(m_itemID, newState); 179 m_ScriptEngine.SetState(m_item.ItemID, newState);
177 } 180 }
178 181
179 /// <summary> 182 /// <summary>
@@ -184,7 +187,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
184 public void llResetScript() 187 public void llResetScript()
185 { 188 {
186 m_host.AddScriptLPS(1); 189 m_host.AddScriptLPS(1);
187 m_ScriptEngine.ApiResetScript(m_itemID); 190 m_ScriptEngine.ApiResetScript(m_item.ItemID);
188 } 191 }
189 192
190 public void llResetOtherScript(string name) 193 public void llResetOtherScript(string name)
@@ -336,30 +339,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
336 } 339 }
337 } 340 }
338 341
339 protected UUID InventorySelf()
340 {
341 UUID invItemID = new UUID();
342 bool unlock = false;
343 if (!m_host.TaskInventory.IsReadLockedByMe())
344 {
345 m_host.TaskInventory.LockItemsForRead(true);
346 unlock = true;
347 }
348 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
349 {
350 if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID)
351 {
352 invItemID = inv.Key;
353 break;
354 }
355 }
356 if (unlock)
357 {
358 m_host.TaskInventory.LockItemsForRead(false);
359 }
360 return invItemID;
361 }
362
363 protected UUID InventoryKey(string name, int type) 342 protected UUID InventoryKey(string name, int type)
364 { 343 {
365 m_host.AddScriptLPS(1); 344 m_host.AddScriptLPS(1);
@@ -941,20 +920,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
941 920
942 public void llRegionSayTo(string target, int channel, string msg) 921 public void llRegionSayTo(string target, int channel, string msg)
943 { 922 {
944 string error = String.Empty;
945
946 if (msg.Length > 1023) 923 if (msg.Length > 1023)
947 msg = msg.Substring(0, 1023); 924 msg = msg.Substring(0, 1023);
948 925
949 m_host.AddScriptLPS(1); 926 m_host.AddScriptLPS(1);
950 927
928 if (channel == ScriptBaseClass.DEBUG_CHANNEL)
929 {
930 return;
931 }
932
951 UUID TargetID; 933 UUID TargetID;
952 UUID.TryParse(target, out TargetID); 934 UUID.TryParse(target, out TargetID);
953 935
954 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 936 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
955 if (wComm != null) 937 if (wComm != null)
956 if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error)) 938 wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg);
957 LSLError(error);
958 } 939 }
959 940
960 public LSL_Integer llListen(int channelID, string name, string ID, string msg) 941 public LSL_Integer llListen(int channelID, string name, string ID, string msg)
@@ -964,7 +945,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
964 UUID.TryParse(ID, out keyID); 945 UUID.TryParse(ID, out keyID);
965 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 946 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
966 if (wComm != null) 947 if (wComm != null)
967 return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, keyID, msg); 948 return wComm.Listen(m_host.LocalId, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg);
968 else 949 else
969 return -1; 950 return -1;
970 } 951 }
@@ -974,7 +955,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
974 m_host.AddScriptLPS(1); 955 m_host.AddScriptLPS(1);
975 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 956 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
976 if (wComm != null) 957 if (wComm != null)
977 wComm.ListenControl(m_itemID, number, active); 958 wComm.ListenControl(m_item.ItemID, number, active);
978 } 959 }
979 960
980 public void llListenRemove(int number) 961 public void llListenRemove(int number)
@@ -982,7 +963,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
982 m_host.AddScriptLPS(1); 963 m_host.AddScriptLPS(1);
983 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 964 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
984 if (wComm != null) 965 if (wComm != null)
985 wComm.ListenRemove(m_itemID, number); 966 wComm.ListenRemove(m_item.ItemID, number);
986 } 967 }
987 968
988 public void llSensor(string name, string id, int type, double range, double arc) 969 public void llSensor(string name, string id, int type, double range, double arc)
@@ -991,7 +972,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
991 UUID keyID = UUID.Zero; 972 UUID keyID = UUID.Zero;
992 UUID.TryParse(id, out keyID); 973 UUID.TryParse(id, out keyID);
993 974
994 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); 975 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, m_host);
995 } 976 }
996 977
997 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) 978 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate)
@@ -1000,13 +981,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1000 UUID keyID = UUID.Zero; 981 UUID keyID = UUID.Zero;
1001 UUID.TryParse(id, out keyID); 982 UUID.TryParse(id, out keyID);
1002 983
1003 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); 984 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, rate, m_host);
1004 } 985 }
1005 986
1006 public void llSensorRemove() 987 public void llSensorRemove()
1007 { 988 {
1008 m_host.AddScriptLPS(1); 989 m_host.AddScriptLPS(1);
1009 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_itemID); 990 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_host.LocalId, m_item.ItemID);
1010 } 991 }
1011 992
1012 public string resolveName(UUID objecUUID) 993 public string resolveName(UUID objecUUID)
@@ -1047,7 +1028,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1047 public LSL_String llDetectedName(int number) 1028 public LSL_String llDetectedName(int number)
1048 { 1029 {
1049 m_host.AddScriptLPS(1); 1030 m_host.AddScriptLPS(1);
1050 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1031 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1051 if (detectedParams == null) 1032 if (detectedParams == null)
1052 return String.Empty; 1033 return String.Empty;
1053 return detectedParams.Name; 1034 return detectedParams.Name;
@@ -1056,7 +1037,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1056 public LSL_String llDetectedKey(int number) 1037 public LSL_String llDetectedKey(int number)
1057 { 1038 {
1058 m_host.AddScriptLPS(1); 1039 m_host.AddScriptLPS(1);
1059 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1040 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1060 if (detectedParams == null) 1041 if (detectedParams == null)
1061 return String.Empty; 1042 return String.Empty;
1062 return detectedParams.Key.ToString(); 1043 return detectedParams.Key.ToString();
@@ -1065,7 +1046,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1065 public LSL_String llDetectedOwner(int number) 1046 public LSL_String llDetectedOwner(int number)
1066 { 1047 {
1067 m_host.AddScriptLPS(1); 1048 m_host.AddScriptLPS(1);
1068 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1049 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1069 if (detectedParams == null) 1050 if (detectedParams == null)
1070 return String.Empty; 1051 return String.Empty;
1071 return detectedParams.Owner.ToString(); 1052 return detectedParams.Owner.ToString();
@@ -1074,7 +1055,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1074 public LSL_Integer llDetectedType(int number) 1055 public LSL_Integer llDetectedType(int number)
1075 { 1056 {
1076 m_host.AddScriptLPS(1); 1057 m_host.AddScriptLPS(1);
1077 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1058 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1078 if (detectedParams == null) 1059 if (detectedParams == null)
1079 return 0; 1060 return 0;
1080 return new LSL_Integer(detectedParams.Type); 1061 return new LSL_Integer(detectedParams.Type);
@@ -1083,7 +1064,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1083 public LSL_Vector llDetectedPos(int number) 1064 public LSL_Vector llDetectedPos(int number)
1084 { 1065 {
1085 m_host.AddScriptLPS(1); 1066 m_host.AddScriptLPS(1);
1086 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1067 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1087 if (detectedParams == null) 1068 if (detectedParams == null)
1088 return new LSL_Vector(); 1069 return new LSL_Vector();
1089 return detectedParams.Position; 1070 return detectedParams.Position;
@@ -1092,7 +1073,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1092 public LSL_Vector llDetectedVel(int number) 1073 public LSL_Vector llDetectedVel(int number)
1093 { 1074 {
1094 m_host.AddScriptLPS(1); 1075 m_host.AddScriptLPS(1);
1095 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1076 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1096 if (detectedParams == null) 1077 if (detectedParams == null)
1097 return new LSL_Vector(); 1078 return new LSL_Vector();
1098 return detectedParams.Velocity; 1079 return detectedParams.Velocity;
@@ -1101,7 +1082,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1101 public LSL_Vector llDetectedGrab(int number) 1082 public LSL_Vector llDetectedGrab(int number)
1102 { 1083 {
1103 m_host.AddScriptLPS(1); 1084 m_host.AddScriptLPS(1);
1104 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1085 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1105 if (parms == null) 1086 if (parms == null)
1106 return new LSL_Vector(0, 0, 0); 1087 return new LSL_Vector(0, 0, 0);
1107 1088
@@ -1111,7 +1092,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1111 public LSL_Rotation llDetectedRot(int number) 1092 public LSL_Rotation llDetectedRot(int number)
1112 { 1093 {
1113 m_host.AddScriptLPS(1); 1094 m_host.AddScriptLPS(1);
1114 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1095 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1115 if (detectedParams == null) 1096 if (detectedParams == null)
1116 return new LSL_Rotation(); 1097 return new LSL_Rotation();
1117 return detectedParams.Rotation; 1098 return detectedParams.Rotation;
@@ -1120,7 +1101,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1120 public LSL_Integer llDetectedGroup(int number) 1101 public LSL_Integer llDetectedGroup(int number)
1121 { 1102 {
1122 m_host.AddScriptLPS(1); 1103 m_host.AddScriptLPS(1);
1123 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1104 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1124 if (detectedParams == null) 1105 if (detectedParams == null)
1125 return new LSL_Integer(0); 1106 return new LSL_Integer(0);
1126 if (m_host.GroupID == detectedParams.Group) 1107 if (m_host.GroupID == detectedParams.Group)
@@ -1131,7 +1112,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1131 public LSL_Integer llDetectedLinkNumber(int number) 1112 public LSL_Integer llDetectedLinkNumber(int number)
1132 { 1113 {
1133 m_host.AddScriptLPS(1); 1114 m_host.AddScriptLPS(1);
1134 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1115 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1135 if (parms == null) 1116 if (parms == null)
1136 return new LSL_Integer(0); 1117 return new LSL_Integer(0);
1137 1118
@@ -1144,7 +1125,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1144 public LSL_Vector llDetectedTouchBinormal(int index) 1125 public LSL_Vector llDetectedTouchBinormal(int index)
1145 { 1126 {
1146 m_host.AddScriptLPS(1); 1127 m_host.AddScriptLPS(1);
1147 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1128 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1148 if (detectedParams == null) 1129 if (detectedParams == null)
1149 return new LSL_Vector(); 1130 return new LSL_Vector();
1150 return detectedParams.TouchBinormal; 1131 return detectedParams.TouchBinormal;
@@ -1156,7 +1137,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1156 public LSL_Integer llDetectedTouchFace(int index) 1137 public LSL_Integer llDetectedTouchFace(int index)
1157 { 1138 {
1158 m_host.AddScriptLPS(1); 1139 m_host.AddScriptLPS(1);
1159 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1140 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1160 if (detectedParams == null) 1141 if (detectedParams == null)
1161 return new LSL_Integer(-1); 1142 return new LSL_Integer(-1);
1162 return new LSL_Integer(detectedParams.TouchFace); 1143 return new LSL_Integer(detectedParams.TouchFace);
@@ -1168,7 +1149,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1168 public LSL_Vector llDetectedTouchNormal(int index) 1149 public LSL_Vector llDetectedTouchNormal(int index)
1169 { 1150 {
1170 m_host.AddScriptLPS(1); 1151 m_host.AddScriptLPS(1);
1171 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1152 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1172 if (detectedParams == null) 1153 if (detectedParams == null)
1173 return new LSL_Vector(); 1154 return new LSL_Vector();
1174 return detectedParams.TouchNormal; 1155 return detectedParams.TouchNormal;
@@ -1180,7 +1161,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1180 public LSL_Vector llDetectedTouchPos(int index) 1161 public LSL_Vector llDetectedTouchPos(int index)
1181 { 1162 {
1182 m_host.AddScriptLPS(1); 1163 m_host.AddScriptLPS(1);
1183 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1164 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1184 if (detectedParams == null) 1165 if (detectedParams == null)
1185 return new LSL_Vector(); 1166 return new LSL_Vector();
1186 return detectedParams.TouchPos; 1167 return detectedParams.TouchPos;
@@ -1192,7 +1173,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1192 public LSL_Vector llDetectedTouchST(int index) 1173 public LSL_Vector llDetectedTouchST(int index)
1193 { 1174 {
1194 m_host.AddScriptLPS(1); 1175 m_host.AddScriptLPS(1);
1195 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1176 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1196 if (detectedParams == null) 1177 if (detectedParams == null)
1197 return new LSL_Vector(-1.0, -1.0, 0.0); 1178 return new LSL_Vector(-1.0, -1.0, 0.0);
1198 return detectedParams.TouchST; 1179 return detectedParams.TouchST;
@@ -1204,7 +1185,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1204 public LSL_Vector llDetectedTouchUV(int index) 1185 public LSL_Vector llDetectedTouchUV(int index)
1205 { 1186 {
1206 m_host.AddScriptLPS(1); 1187 m_host.AddScriptLPS(1);
1207 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1188 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1208 if (detectedParams == null) 1189 if (detectedParams == null)
1209 return new LSL_Vector(-1.0, -1.0, 0.0); 1190 return new LSL_Vector(-1.0, -1.0, 0.0);
1210 return detectedParams.TouchUV; 1191 return detectedParams.TouchUV;
@@ -1910,6 +1891,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1910 rgb.y = texcolor.G; 1891 rgb.y = texcolor.G;
1911 rgb.z = texcolor.B; 1892 rgb.z = texcolor.B;
1912 return rgb; 1893 return rgb;
1894
1913 } 1895 }
1914 else 1896 else
1915 { 1897 {
@@ -2948,20 +2930,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2948 2930
2949 public LSL_Integer llGiveMoney(string destination, int amount) 2931 public LSL_Integer llGiveMoney(string destination, int amount)
2950 { 2932 {
2951 UUID invItemID=InventorySelf();
2952 if (invItemID == UUID.Zero)
2953 return 0;
2954
2955 m_host.AddScriptLPS(1); 2933 m_host.AddScriptLPS(1);
2956 2934
2957 m_host.TaskInventory.LockItemsForRead(true); 2935 if (m_item.PermsGranter == UUID.Zero)
2958 TaskInventoryItem item = m_host.TaskInventory[invItemID];
2959 m_host.TaskInventory.LockItemsForRead(false);
2960
2961 if (item.PermsGranter == UUID.Zero)
2962 return 0; 2936 return 0;
2963 2937
2964 if ((item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) 2938 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0)
2965 { 2939 {
2966 LSLError("No permissions to give money"); 2940 LSLError("No permissions to give money");
2967 return 0; 2941 return 0;
@@ -3148,7 +3122,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3148 sec = m_MinTimerInterval; 3122 sec = m_MinTimerInterval;
3149 m_host.AddScriptLPS(1); 3123 m_host.AddScriptLPS(1);
3150 // Setting timer repeat 3124 // Setting timer repeat
3151 AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_itemID, sec); 3125 AsyncCommands.TimerPlugin.SetTimerEvent(m_host.LocalId, m_item.ItemID, sec);
3152 } 3126 }
3153 3127
3154 public virtual void llSleep(double sec) 3128 public virtual void llSleep(double sec)
@@ -3210,29 +3184,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3210 3184
3211 public void llTakeControls(int controls, int accept, int pass_on) 3185 public void llTakeControls(int controls, int accept, int pass_on)
3212 { 3186 {
3213 TaskInventoryItem item; 3187 if (m_item.PermsGranter != UUID.Zero)
3214
3215 m_host.TaskInventory.LockItemsForRead(true);
3216 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3217 { 3188 {
3218 m_host.TaskInventory.LockItemsForRead(false); 3189 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3219 return;
3220 }
3221 else
3222 {
3223 item = m_host.TaskInventory[InventorySelf()];
3224 }
3225 m_host.TaskInventory.LockItemsForRead(false);
3226
3227 if (item.PermsGranter != UUID.Zero)
3228 {
3229 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3230 3190
3231 if (presence != null) 3191 if (presence != null)
3232 { 3192 {
3233 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3193 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3234 { 3194 {
3235 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_itemID); 3195 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_host.LocalId, m_item.ItemID);
3236 } 3196 }
3237 } 3197 }
3238 } 3198 }
@@ -3242,38 +3202,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3242 3202
3243 public void llReleaseControls() 3203 public void llReleaseControls()
3244 { 3204 {
3245 TaskInventoryItem item;
3246
3247 m_host.TaskInventory.LockItemsForRead(true);
3248 lock (m_host.TaskInventory)
3249 {
3250
3251 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3252 {
3253 m_host.TaskInventory.LockItemsForRead(false);
3254 return;
3255 }
3256 else
3257 {
3258 item = m_host.TaskInventory[InventorySelf()];
3259 }
3260 }
3261 m_host.TaskInventory.LockItemsForRead(false);
3262
3263 m_host.AddScriptLPS(1); 3205 m_host.AddScriptLPS(1);
3264 3206
3265 if (item.PermsGranter != UUID.Zero) 3207 if (m_item.PermsGranter != UUID.Zero)
3266 { 3208 {
3267 ScenePresence presence = World.GetScenePresence(item.PermsGranter); 3209 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3268 3210
3269 if (presence != null) 3211 if (presence != null)
3270 { 3212 {
3271 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3213 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3272 { 3214 {
3273 // Unregister controls from Presence 3215 // Unregister controls from Presence
3274 presence.UnRegisterControlEventsToScript(m_localID, m_itemID); 3216 presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID);
3275 // Remove Take Control permission. 3217 // Remove Take Control permission.
3276 item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; 3218 m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS;
3277 } 3219 }
3278 } 3220 }
3279 } 3221 }
@@ -3286,86 +3228,71 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3286 m_UrlModule.ReleaseURL(url); 3228 m_UrlModule.ReleaseURL(url);
3287 } 3229 }
3288 3230
3289 public void llAttachToAvatar(int attachment) 3231 /// <summary>
3232 /// Attach the object containing this script to the avatar that owns it.
3233 /// </summary>
3234 /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param>
3235 /// <returns>true if the attach suceeded, false if it did not</returns>
3236 public bool AttachToAvatar(int attachmentPoint)
3290 { 3237 {
3291 m_host.AddScriptLPS(1); 3238 SceneObjectGroup grp = m_host.ParentGroup;
3292 3239 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
3293 TaskInventoryItem item;
3294 3240
3295 m_host.TaskInventory.LockItemsForRead(true); 3241 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3296 3242
3297 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3243 if (attachmentsModule != null)
3298 { 3244 return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false);
3299 m_host.TaskInventory.LockItemsForRead(false);
3300 return;
3301 }
3302 else 3245 else
3303 { 3246 return false;
3304 item = m_host.TaskInventory[InventorySelf()]; 3247 }
3305 }
3306
3307 m_host.TaskInventory.LockItemsForRead(false);
3308 3248
3309 if (item.PermsGranter != m_host.OwnerID) 3249 /// <summary>
3310 return; 3250 /// Detach the object containing this script from the avatar it is attached to.
3251 /// </summary>
3252 /// <remarks>
3253 /// Nothing happens if the object is not attached.
3254 /// </remarks>
3255 public void DetachFromAvatar()
3256 {
3257 Util.FireAndForget(DetachWrapper, m_host);
3258 }
3311 3259
3312 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3260 private void DetachWrapper(object o)
3313 { 3261 {
3314 SceneObjectGroup grp = m_host.ParentGroup; 3262 SceneObjectPart host = (SceneObjectPart)o;
3315 3263
3316 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 3264 SceneObjectGroup grp = host.ParentGroup;
3265 UUID itemID = grp.FromItemID;
3266 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3317 3267
3318 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; 3268 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3319 if (attachmentsModule != null) 3269 if (attachmentsModule != null)
3320 attachmentsModule.AttachObject(presence, grp, (uint)attachment, false); 3270 attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
3321 }
3322 } 3271 }
3323 3272
3324 public void llDetachFromAvatar() 3273 public void llAttachToAvatar(int attachmentPoint)
3325 { 3274 {
3326 m_host.AddScriptLPS(1); 3275 m_host.AddScriptLPS(1);
3327 3276
3328 if (m_host.ParentGroup.AttachmentPoint == 0) 3277 if (m_item.PermsGranter != m_host.OwnerID)
3329 return; 3278 return;
3330 3279
3331 TaskInventoryItem item; 3280 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3281 AttachToAvatar(attachmentPoint);
3282 }
3332 3283
3333 m_host.TaskInventory.LockItemsForRead(true); 3284 public void llDetachFromAvatar()
3285 {
3286 m_host.AddScriptLPS(1);
3334 3287
3335 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3288 if (m_host.ParentGroup.AttachmentPoint == 0)
3336 {
3337 m_host.TaskInventory.LockItemsForRead(false);
3338 return; 3289 return;
3339 }
3340 else
3341 {
3342 item = m_host.TaskInventory[InventorySelf()];
3343 }
3344 m_host.TaskInventory.LockItemsForRead(false);
3345
3346 3290
3347 if (item.PermsGranter != m_host.OwnerID) 3291 if (m_item.PermsGranter != m_host.OwnerID)
3348 return; 3292 return;
3349 3293
3350 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3294 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3351 { 3295 DetachFromAvatar();
3352 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3353 if (attachmentsModule != null)
3354 Util.FireAndForget(DetachWrapper, m_host);
3355 }
3356 }
3357
3358 private void DetachWrapper(object o)
3359 {
3360 SceneObjectPart host = (SceneObjectPart)o;
3361
3362 SceneObjectGroup grp = host.ParentGroup;
3363 UUID itemID = grp.FromItemID;
3364 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3365
3366 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3367 if (attachmentsModule != null)
3368 attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
3369 } 3296 }
3370 3297
3371 public void llTakeCamera(string avatar) 3298 public void llTakeCamera(string avatar)
@@ -3523,6 +3450,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3523 return m_host.UUID.ToString(); 3450 return m_host.UUID.ToString();
3524 } 3451 }
3525 3452
3453 public LSL_Key llGenerateKey()
3454 {
3455 m_host.AddScriptLPS(1);
3456 return UUID.Random().ToString();
3457 }
3458
3526 public void llSetBuoyancy(double buoyancy) 3459 public void llSetBuoyancy(double buoyancy)
3527 { 3460 {
3528 m_host.AddScriptLPS(1); 3461 m_host.AddScriptLPS(1);
@@ -3569,7 +3502,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3569 m_host.AddScriptLPS(1); 3502 m_host.AddScriptLPS(1);
3570 try 3503 try
3571 { 3504 {
3572 m_ScriptEngine.SetMinEventDelay(m_itemID, delay); 3505 m_ScriptEngine.SetMinEventDelay(m_item.ItemID, delay);
3573 } 3506 }
3574 catch (NotImplementedException) 3507 catch (NotImplementedException)
3575 { 3508 {
@@ -3622,29 +3555,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3622 { 3555 {
3623 m_host.AddScriptLPS(1); 3556 m_host.AddScriptLPS(1);
3624 3557
3625 UUID invItemID = InventorySelf(); 3558 if (m_item.PermsGranter == UUID.Zero)
3626 if (invItemID == UUID.Zero)
3627 return; 3559 return;
3628 3560
3629 TaskInventoryItem item; 3561 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3630
3631 m_host.TaskInventory.LockItemsForRead(true);
3632 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3633 { 3562 {
3634 m_host.TaskInventory.LockItemsForRead(false); 3563 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3635 return;
3636 }
3637 else
3638 {
3639 item = m_host.TaskInventory[InventorySelf()];
3640 }
3641 m_host.TaskInventory.LockItemsForRead(false);
3642 if (item.PermsGranter == UUID.Zero)
3643 return;
3644
3645 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3646 {
3647 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3648 3564
3649 if (presence != null) 3565 if (presence != null)
3650 { 3566 {
@@ -3662,38 +3578,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3662 { 3578 {
3663 m_host.AddScriptLPS(1); 3579 m_host.AddScriptLPS(1);
3664 3580
3665 UUID invItemID=InventorySelf(); 3581 if (m_item.PermsGranter == UUID.Zero)
3666 if (invItemID == UUID.Zero)
3667 return;
3668
3669 TaskInventoryItem item;
3670
3671 m_host.TaskInventory.LockItemsForRead(true);
3672 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3673 {
3674 m_host.TaskInventory.LockItemsForRead(false);
3675 return;
3676 }
3677 else
3678 {
3679 item = m_host.TaskInventory[InventorySelf()];
3680 }
3681 m_host.TaskInventory.LockItemsForRead(false);
3682
3683
3684 if (item.PermsGranter == UUID.Zero)
3685 return; 3582 return;
3686 3583
3687 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) 3584 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3688 { 3585 {
3689 UUID animID = new UUID(); 3586 UUID animID = new UUID();
3690 3587
3691 if (!UUID.TryParse(anim, out animID)) 3588 if (!UUID.TryParse(anim, out animID))
3692 { 3589 {
3693 animID=InventoryKey(anim); 3590 animID = InventoryKey(anim);
3694 } 3591 }
3695 3592
3696 ScenePresence presence = World.GetScenePresence(item.PermsGranter); 3593 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3697 3594
3698 if (presence != null) 3595 if (presence != null)
3699 { 3596 {
@@ -3729,44 +3626,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3729 public LSL_Integer llGetStartParameter() 3626 public LSL_Integer llGetStartParameter()
3730 { 3627 {
3731 m_host.AddScriptLPS(1); 3628 m_host.AddScriptLPS(1);
3732 return m_ScriptEngine.GetStartParameter(m_itemID); 3629 return m_ScriptEngine.GetStartParameter(m_item.ItemID);
3733 } 3630 }
3734 3631
3735 public void llRequestPermissions(string agent, int perm) 3632 public void llRequestPermissions(string agent, int perm)
3736 { 3633 {
3737 UUID agentID = new UUID(); 3634 UUID agentID;
3738 3635
3739 if (!UUID.TryParse(agent, out agentID)) 3636 if (!UUID.TryParse(agent, out agentID))
3740 return; 3637 return;
3741 3638
3742 UUID invItemID = InventorySelf();
3743
3744 if (invItemID == UUID.Zero)
3745 return; // Not in a prim? How??
3746
3747 TaskInventoryItem item;
3748
3749
3750 m_host.TaskInventory.LockItemsForRead(true);
3751 if (!m_host.TaskInventory.ContainsKey(invItemID))
3752 {
3753 m_host.TaskInventory.LockItemsForRead(false);
3754 return;
3755 }
3756 else
3757 {
3758 item = m_host.TaskInventory[invItemID];
3759 }
3760 m_host.TaskInventory.LockItemsForRead(false);
3761
3762 if (agentID == UUID.Zero || perm == 0) // Releasing permissions 3639 if (agentID == UUID.Zero || perm == 0) // Releasing permissions
3763 { 3640 {
3764 llReleaseControls(); 3641 llReleaseControls();
3765 3642
3766 item.PermsGranter = UUID.Zero; 3643 m_item.PermsGranter = UUID.Zero;
3767 item.PermsMask = 0; 3644 m_item.PermsMask = 0;
3768 3645
3769 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3646 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3770 "run_time_permissions", new Object[] { 3647 "run_time_permissions", new Object[] {
3771 new LSL_Integer(0) }, 3648 new LSL_Integer(0) },
3772 new DetectParams[0])); 3649 new DetectParams[0]));
@@ -3774,7 +3651,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3774 return; 3651 return;
3775 } 3652 }
3776 3653
3777 if (item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3654 if (m_item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3778 llReleaseControls(); 3655 llReleaseControls();
3779 3656
3780 m_host.AddScriptLPS(1); 3657 m_host.AddScriptLPS(1);
@@ -3791,11 +3668,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3791 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3668 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3792 { 3669 {
3793 m_host.TaskInventory.LockItemsForWrite(true); 3670 m_host.TaskInventory.LockItemsForWrite(true);
3794 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3671 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3795 m_host.TaskInventory[invItemID].PermsMask = perm; 3672 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3796 m_host.TaskInventory.LockItemsForWrite(false); 3673 m_host.TaskInventory.LockItemsForWrite(false);
3797 3674
3798 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3675 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3799 "run_time_permissions", new Object[] { 3676 "run_time_permissions", new Object[] {
3800 new LSL_Integer(perm) }, 3677 new LSL_Integer(perm) },
3801 new DetectParams[0])); 3678 new DetectParams[0]));
@@ -3830,11 +3707,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3830 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3707 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3831 { 3708 {
3832 m_host.TaskInventory.LockItemsForWrite(true); 3709 m_host.TaskInventory.LockItemsForWrite(true);
3833 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3710 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3834 m_host.TaskInventory[invItemID].PermsMask = perm; 3711 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3835 m_host.TaskInventory.LockItemsForWrite(false); 3712 m_host.TaskInventory.LockItemsForWrite(false);
3836 3713
3837 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3714 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3838 "run_time_permissions", new Object[] { 3715 "run_time_permissions", new Object[] {
3839 new LSL_Integer(perm) }, 3716 new LSL_Integer(perm) },
3840 new DetectParams[0])); 3717 new DetectParams[0]));
@@ -3855,8 +3732,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3855 if (!m_waitingForScriptAnswer) 3732 if (!m_waitingForScriptAnswer)
3856 { 3733 {
3857 m_host.TaskInventory.LockItemsForWrite(true); 3734 m_host.TaskInventory.LockItemsForWrite(true);
3858 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3735 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3859 m_host.TaskInventory[invItemID].PermsMask = 0; 3736 m_host.TaskInventory[m_item.ItemID].PermsMask = 0;
3860 m_host.TaskInventory.LockItemsForWrite(false); 3737 m_host.TaskInventory.LockItemsForWrite(false);
3861 3738
3862 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; 3739 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
@@ -3864,13 +3741,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3864 } 3741 }
3865 3742
3866 presence.ControllingClient.SendScriptQuestion( 3743 presence.ControllingClient.SendScriptQuestion(
3867 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm); 3744 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_item.ItemID, perm);
3868 3745
3869 return; 3746 return;
3870 } 3747 }
3871 3748
3872 // Requested agent is not in range, refuse perms 3749 // Requested agent is not in range, refuse perms
3873 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3750 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3874 "run_time_permissions", new Object[] { 3751 "run_time_permissions", new Object[] {
3875 new LSL_Integer(0) }, 3752 new LSL_Integer(0) },
3876 new DetectParams[0])); 3753 new DetectParams[0]));
@@ -3881,24 +3758,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3881 if (taskID != m_host.UUID) 3758 if (taskID != m_host.UUID)
3882 return; 3759 return;
3883 3760
3884 UUID invItemID = InventorySelf(); 3761 client.OnScriptAnswer -= handleScriptAnswer;
3885 3762 m_waitingForScriptAnswer = false;
3886 if (invItemID == UUID.Zero)
3887 return;
3888
3889 client.OnScriptAnswer-=handleScriptAnswer;
3890 m_waitingForScriptAnswer=false;
3891 3763
3892 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3764 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3893 llReleaseControls(); 3765 llReleaseControls();
3894 3766
3895
3896 m_host.TaskInventory.LockItemsForWrite(true); 3767 m_host.TaskInventory.LockItemsForWrite(true);
3897 m_host.TaskInventory[invItemID].PermsMask = answer; 3768 m_host.TaskInventory[m_item.ItemID].PermsMask = answer;
3898 m_host.TaskInventory.LockItemsForWrite(false); 3769 m_host.TaskInventory.LockItemsForWrite(false);
3899 3770
3900 3771 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3901 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3902 "run_time_permissions", new Object[] { 3772 "run_time_permissions", new Object[] {
3903 new LSL_Integer(answer) }, 3773 new LSL_Integer(answer) },
3904 new DetectParams[0])); 3774 new DetectParams[0]));
@@ -3908,41 +3778,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3908 { 3778 {
3909 m_host.AddScriptLPS(1); 3779 m_host.AddScriptLPS(1);
3910 3780
3911 m_host.TaskInventory.LockItemsForRead(true); 3781 return m_item.PermsGranter.ToString();
3912
3913 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3914 {
3915 if (item.Type == 10 && item.ItemID == m_itemID)
3916 {
3917 m_host.TaskInventory.LockItemsForRead(false);
3918 return item.PermsGranter.ToString();
3919 }
3920 }
3921 m_host.TaskInventory.LockItemsForRead(false);
3922
3923 return UUID.Zero.ToString();
3924 } 3782 }
3925 3783
3926 public LSL_Integer llGetPermissions() 3784 public LSL_Integer llGetPermissions()
3927 { 3785 {
3928 m_host.AddScriptLPS(1); 3786 m_host.AddScriptLPS(1);
3929 3787
3930 m_host.TaskInventory.LockItemsForRead(true); 3788 int perms = m_item.PermsMask;
3931 3789
3932 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3790 if (m_automaticLinkPermission)
3933 { 3791 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3934 if (item.Type == 10 && item.ItemID == m_itemID)
3935 {
3936 int perms = item.PermsMask;
3937 if (m_automaticLinkPermission)
3938 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3939 m_host.TaskInventory.LockItemsForRead(false);
3940 return perms;
3941 }
3942 }
3943 m_host.TaskInventory.LockItemsForRead(false);
3944 3792
3945 return 0; 3793 return perms;
3946 } 3794 }
3947 3795
3948 public LSL_Integer llGetLinkNumber() 3796 public LSL_Integer llGetLinkNumber()
@@ -3980,18 +3828,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3980 public void llCreateLink(string target, int parent) 3828 public void llCreateLink(string target, int parent)
3981 { 3829 {
3982 m_host.AddScriptLPS(1); 3830 m_host.AddScriptLPS(1);
3983 UUID invItemID = InventorySelf(); 3831
3984 UUID targetID; 3832 UUID targetID;
3985 3833
3986 if (!UUID.TryParse(target, out targetID)) 3834 if (!UUID.TryParse(target, out targetID))
3987 return; 3835 return;
3988 3836
3989 TaskInventoryItem item; 3837 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3990 m_host.TaskInventory.LockItemsForRead(true);
3991 item = m_host.TaskInventory[invItemID];
3992 m_host.TaskInventory.LockItemsForRead(false);
3993
3994 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3995 && !m_automaticLinkPermission) 3838 && !m_automaticLinkPermission)
3996 { 3839 {
3997 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3840 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
@@ -3999,7 +3842,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3999 } 3842 }
4000 3843
4001 IClientAPI client = null; 3844 IClientAPI client = null;
4002 ScenePresence sp = World.GetScenePresence(item.PermsGranter); 3845 ScenePresence sp = World.GetScenePresence(m_item.PermsGranter);
4003 if (sp != null) 3846 if (sp != null)
4004 client = sp.ControllingClient; 3847 client = sp.ControllingClient;
4005 3848
@@ -4045,18 +3888,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4045 public void llBreakLink(int linknum) 3888 public void llBreakLink(int linknum)
4046 { 3889 {
4047 m_host.AddScriptLPS(1); 3890 m_host.AddScriptLPS(1);
4048 UUID invItemID = InventorySelf();
4049 3891
4050 m_host.TaskInventory.LockItemsForRead(true); 3892 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4051 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3893 && !m_automaticLinkPermission)
4052 && !m_automaticLinkPermission) 3894 {
4053 { 3895 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
4054 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3896 return;
4055 m_host.TaskInventory.LockItemsForRead(false); 3897 }
4056 return; 3898
4057 }
4058 m_host.TaskInventory.LockItemsForRead(false);
4059
4060 if (linknum < ScriptBaseClass.LINK_THIS) 3899 if (linknum < ScriptBaseClass.LINK_THIS)
4061 return; 3900 return;
4062 3901
@@ -4155,12 +3994,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4155 { 3994 {
4156 m_host.AddScriptLPS(1); 3995 m_host.AddScriptLPS(1);
4157 3996
4158 UUID invItemID = InventorySelf(); 3997 TaskInventoryItem item = m_item;
4159
4160 TaskInventoryItem item;
4161 m_host.TaskInventory.LockItemsForRead(true);
4162 item = m_host.TaskInventory[invItemID];
4163 m_host.TaskInventory.LockItemsForRead(false);
4164 3998
4165 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3999 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4166 && !m_automaticLinkPermission) 4000 && !m_automaticLinkPermission)
@@ -4471,7 +4305,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4471 { 4305 {
4472 if (item.Name == name) 4306 if (item.Name == name)
4473 { 4307 {
4474 if (item.ItemID == m_itemID) 4308 if (item.ItemID == m_item.ItemID)
4475 throw new ScriptDeleteException(); 4309 throw new ScriptDeleteException();
4476 else 4310 else
4477 m_host.Inventory.RemoveInventoryItem(item.ItemID); 4311 m_host.Inventory.RemoveInventoryItem(item.ItemID);
@@ -4605,8 +4439,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4605 UUID rq = UUID.Random(); 4439 UUID rq = UUID.Random();
4606 4440
4607 UUID tid = AsyncCommands. 4441 UUID tid = AsyncCommands.
4608 DataserverPlugin.RegisterRequest(m_localID, 4442 DataserverPlugin.RegisterRequest(m_host.LocalId,
4609 m_itemID, rq.ToString()); 4443 m_item.ItemID, rq.ToString());
4610 4444
4611 AsyncCommands. 4445 AsyncCommands.
4612 DataserverPlugin.DataserverReply(rq.ToString(), reply); 4446 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -4633,8 +4467,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4633 if (item.Type == 3 && item.Name == name) 4467 if (item.Type == 3 && item.Name == name)
4634 { 4468 {
4635 UUID tid = AsyncCommands. 4469 UUID tid = AsyncCommands.
4636 DataserverPlugin.RegisterRequest(m_localID, 4470 DataserverPlugin.RegisterRequest(m_host.LocalId,
4637 m_itemID, item.AssetID.ToString()); 4471 m_item.ItemID, item.AssetID.ToString());
4638 4472
4639 Vector3 region = new Vector3( 4473 Vector3 region = new Vector3(
4640 World.RegionInfo.RegionLocX * Constants.RegionSize, 4474 World.RegionInfo.RegionLocX * Constants.RegionSize,
@@ -5033,22 +4867,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5033 4867
5034 public LSL_String llGetScriptName() 4868 public LSL_String llGetScriptName()
5035 { 4869 {
5036 string result = String.Empty;
5037
5038 m_host.AddScriptLPS(1); 4870 m_host.AddScriptLPS(1);
5039 4871
5040 m_host.TaskInventory.LockItemsForRead(true); 4872 return m_item.Name != null ? m_item.Name : String.Empty;
5041 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
5042 {
5043 if (item.Type == 10 && item.ItemID == m_itemID)
5044 {
5045 result = item.Name!=null?item.Name:String.Empty;
5046 break;
5047 }
5048 }
5049 m_host.TaskInventory.LockItemsForRead(false);
5050
5051 return result;
5052 } 4873 }
5053 4874
5054 public LSL_Integer llGetLinkNumberOfSides(int link) 4875 public LSL_Integer llGetLinkNumberOfSides(int link)
@@ -6333,7 +6154,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6333 if (m_host.OwnerID == land.LandData.OwnerID) 6154 if (m_host.OwnerID == land.LandData.OwnerID)
6334 { 6155 {
6335 Vector3 pos = World.GetNearestAllowedPosition(presence, land); 6156 Vector3 pos = World.GetNearestAllowedPosition(presence, land);
6336 presence.TeleportWithMomentum(pos); 6157 presence.TeleportWithMomentum(pos, null);
6337 presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); 6158 presence.ControllingClient.SendAlertMessage("You have been ejected from this land");
6338 } 6159 }
6339 } 6160 }
@@ -7280,14 +7101,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7280 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7101 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7281 if (xmlrpcMod.IsEnabled()) 7102 if (xmlrpcMod.IsEnabled())
7282 { 7103 {
7283 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, UUID.Zero); 7104 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_host.LocalId, m_item.ItemID, UUID.Zero);
7284 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>(); 7105 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>();
7285 if (xmlRpcRouter != null) 7106 if (xmlRpcRouter != null)
7286 { 7107 {
7287 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; 7108 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName;
7288 7109
7289 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, 7110 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID,
7290 m_itemID, String.Format("http://{0}:{1}/", ExternalHostName, 7111 m_item.ItemID, String.Format("http://{0}:{1}/", ExternalHostName,
7291 xmlrpcMod.Port.ToString())); 7112 xmlrpcMod.Port.ToString()));
7292 } 7113 }
7293 object[] resobj = new object[] 7114 object[] resobj = new object[]
@@ -7299,7 +7120,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7299 new LSL_Integer(0), 7120 new LSL_Integer(0),
7300 new LSL_String(String.Empty) 7121 new LSL_String(String.Empty)
7301 }; 7122 };
7302 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams("remote_data", resobj, 7123 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams("remote_data", resobj,
7303 new DetectParams[0])); 7124 new DetectParams[0]));
7304 } 7125 }
7305 ScriptSleep(1000); 7126 ScriptSleep(1000);
@@ -7310,7 +7131,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7310 m_host.AddScriptLPS(1); 7131 m_host.AddScriptLPS(1);
7311 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7132 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7312 ScriptSleep(3000); 7133 ScriptSleep(3000);
7313 return (xmlrpcMod.SendRemoteData(m_localID, m_itemID, channel, dest, idata, sdata)).ToString(); 7134 return (xmlrpcMod.SendRemoteData(m_host.LocalId, m_item.ItemID, channel, dest, idata, sdata)).ToString();
7314 } 7135 }
7315 7136
7316 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) 7137 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata)
@@ -8149,7 +7970,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8149 return; 7970 return;
8150 face = (int)rules.GetLSLIntegerItem(idx++); 7971 face = (int)rules.GetLSLIntegerItem(idx++);
8151 int shiny = (int)rules.GetLSLIntegerItem(idx++); 7972 int shiny = (int)rules.GetLSLIntegerItem(idx++);
8152 Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); 7973 Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++);
8153 7974
8154 SetShiny(part, face, shiny, bump); 7975 SetShiny(part, face, shiny, bump);
8155 7976
@@ -9953,13 +9774,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9953 { 9774 {
9954 m_host.AddScriptLPS(1); 9775 m_host.AddScriptLPS(1);
9955 if (m_UrlModule != null) 9776 if (m_UrlModule != null)
9956 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 9777 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
9957 return UUID.Zero.ToString(); 9778 return UUID.Zero.ToString();
9958 } 9779 }
9959 9780
9960 public LSL_String llRequestSimulatorData(string simulator, int data) 9781 public LSL_String llRequestSimulatorData(string simulator, int data)
9961 { 9782 {
9962 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_itemID, "OSSL"); 9783 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL");
9963 9784
9964 try 9785 try
9965 { 9786 {
@@ -10021,7 +9842,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10021 UUID rq = UUID.Random(); 9842 UUID rq = UUID.Random();
10022 9843
10023 UUID tid = AsyncCommands. 9844 UUID tid = AsyncCommands.
10024 DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 9845 DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
10025 9846
10026 AsyncCommands. 9847 AsyncCommands.
10027 DataserverPlugin.DataserverReply(rq.ToString(), reply); 9848 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -10040,7 +9861,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10040 m_host.AddScriptLPS(1); 9861 m_host.AddScriptLPS(1);
10041 9862
10042 if (m_UrlModule != null) 9863 if (m_UrlModule != null)
10043 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 9864 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
10044 return UUID.Zero.ToString(); 9865 return UUID.Zero.ToString();
10045 } 9866 }
10046 9867
@@ -10076,7 +9897,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10076 // child agents have a mass of 1.0 9897 // child agents have a mass of 1.0
10077 return 1; 9898 return 1;
10078 else 9899 else
10079 return avatar.GetMass(); 9900 return (double)avatar.GetMass();
10080 } 9901 }
10081 catch (KeyNotFoundException) 9902 catch (KeyNotFoundException)
10082 { 9903 {
@@ -10519,22 +10340,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10519 public LSL_Vector llGetCameraPos() 10340 public LSL_Vector llGetCameraPos()
10520 { 10341 {
10521 m_host.AddScriptLPS(1); 10342 m_host.AddScriptLPS(1);
10522 UUID invItemID = InventorySelf();
10523 10343
10524 if (invItemID == UUID.Zero) 10344 if (m_item.PermsGranter == UUID.Zero)
10525 return new LSL_Vector(); 10345 return new LSL_Vector();
10526 10346
10527 m_host.TaskInventory.LockItemsForRead(true); 10347 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10528 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
10529 {
10530 m_host.TaskInventory.LockItemsForRead(false);
10531 return new LSL_Vector();
10532 }
10533
10534 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10535 { 10348 {
10536 ShoutError("No permissions to track the camera"); 10349 ShoutError("No permissions to track the camera");
10537 m_host.TaskInventory.LockItemsForRead(false);
10538 return new LSL_Vector(); 10350 return new LSL_Vector();
10539 } 10351 }
10540 m_host.TaskInventory.LockItemsForRead(false); 10352 m_host.TaskInventory.LockItemsForRead(false);
@@ -10551,20 +10363,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10551 public LSL_Rotation llGetCameraRot() 10363 public LSL_Rotation llGetCameraRot()
10552 { 10364 {
10553 m_host.AddScriptLPS(1); 10365 m_host.AddScriptLPS(1);
10554 UUID invItemID = InventorySelf();
10555 if (invItemID == UUID.Zero)
10556 return new LSL_Rotation();
10557 10366
10558 m_host.TaskInventory.LockItemsForRead(true); 10367 if (m_item.PermsGranter == UUID.Zero)
10559 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 10368 return new LSL_Rotation();
10560 { 10369
10561 m_host.TaskInventory.LockItemsForRead(false); 10370 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10562 return new LSL_Rotation();
10563 }
10564 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10565 { 10371 {
10566 ShoutError("No permissions to track the camera"); 10372 ShoutError("No permissions to track the camera");
10567 m_host.TaskInventory.LockItemsForRead(false);
10568 return new LSL_Rotation(); 10373 return new LSL_Rotation();
10569 } 10374 }
10570 m_host.TaskInventory.LockItemsForRead(false); 10375 m_host.TaskInventory.LockItemsForRead(false);
@@ -10628,7 +10433,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10628 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt) 10433 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt)
10629 { 10434 {
10630 m_host.AddScriptLPS(1); 10435 m_host.AddScriptLPS(1);
10631 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0); 10436 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0);
10632 if (detectedParams == null) 10437 if (detectedParams == null)
10633 { 10438 {
10634 if (m_host.ParentGroup.IsAttachment == true) 10439 if (m_host.ParentGroup.IsAttachment == true)
@@ -10752,30 +10557,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10752 { 10557 {
10753 m_host.AddScriptLPS(1); 10558 m_host.AddScriptLPS(1);
10754 10559
10755 // our key in the object we are in
10756 UUID invItemID = InventorySelf();
10757 if (invItemID == UUID.Zero) return;
10758
10759 // the object we are in 10560 // the object we are in
10760 UUID objectID = m_host.ParentUUID; 10561 UUID objectID = m_host.ParentUUID;
10761 if (objectID == UUID.Zero) return; 10562 if (objectID == UUID.Zero)
10563 return;
10762 10564
10763 UUID agentID;
10764 m_host.TaskInventory.LockItemsForRead(true);
10765 // we need the permission first, to know which avatar we want to set the camera for 10565 // we need the permission first, to know which avatar we want to set the camera for
10766 agentID = m_host.TaskInventory[invItemID].PermsGranter; 10566 UUID agentID = m_item.PermsGranter;
10767 10567
10768 if (agentID == UUID.Zero) 10568 if (agentID == UUID.Zero)
10769 {
10770 m_host.TaskInventory.LockItemsForRead(false);
10771 return; 10569 return;
10772 } 10570
10773 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 10571 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
10774 {
10775 m_host.TaskInventory.LockItemsForRead(false);
10776 return; 10572 return;
10777 }
10778 m_host.TaskInventory.LockItemsForRead(false);
10779 10573
10780 ScenePresence presence = World.GetScenePresence(agentID); 10574 ScenePresence presence = World.GetScenePresence(agentID);
10781 10575
@@ -10817,34 +10611,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10817 { 10611 {
10818 m_host.AddScriptLPS(1); 10612 m_host.AddScriptLPS(1);
10819 10613
10820 // our key in the object we are in
10821 UUID invItemID=InventorySelf();
10822 if (invItemID == UUID.Zero) return;
10823
10824 // the object we are in 10614 // the object we are in
10825 UUID objectID = m_host.ParentUUID; 10615 UUID objectID = m_host.ParentUUID;
10826 if (objectID == UUID.Zero) return; 10616 if (objectID == UUID.Zero)
10617 return;
10827 10618
10828 // we need the permission first, to know which avatar we want to clear the camera for 10619 // we need the permission first, to know which avatar we want to clear the camera for
10829 UUID agentID; 10620 UUID agentID = m_item.PermsGranter;
10830 m_host.TaskInventory.LockItemsForRead(true); 10621
10831 agentID = m_host.TaskInventory[invItemID].PermsGranter;
10832 if (agentID == UUID.Zero) 10622 if (agentID == UUID.Zero)
10833 {
10834 m_host.TaskInventory.LockItemsForRead(false);
10835 return; 10623 return;
10836 } 10624
10837 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 10625 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
10838 {
10839 m_host.TaskInventory.LockItemsForRead(false);
10840 return; 10626 return;
10841 }
10842 m_host.TaskInventory.LockItemsForRead(false);
10843 10627
10844 ScenePresence presence = World.GetScenePresence(agentID); 10628 ScenePresence presence = World.GetScenePresence(agentID);
10845 10629
10846 // we are not interested in child-agents 10630 // we are not interested in child-agents
10847 if (presence.IsChildAgent) return; 10631 if (presence.IsChildAgent)
10632 return;
10848 10633
10849 presence.ControllingClient.SendClearFollowCamProperties(objectID); 10634 presence.ControllingClient.SendClearFollowCamProperties(objectID);
10850 } 10635 }
@@ -11035,8 +10820,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11035 } 10820 }
11036 } 10821 }
11037 10822
11038 UUID reqID = httpScriptMod. 10823 UUID reqID
11039 StartHttpRequest(m_localID, m_itemID, url, param, httpHeaders, body); 10824 = httpScriptMod.StartHttpRequest(m_host.LocalId, m_item.ItemID, url, param, httpHeaders, body);
11040 10825
11041 if (reqID != UUID.Zero) 10826 if (reqID != UUID.Zero)
11042 return reqID.ToString(); 10827 return reqID.ToString();
@@ -11268,19 +11053,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11268 break; 11053 break;
11269 // For the following 8 see the Object version below 11054 // For the following 8 see the Object version below
11270 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11055 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11271 ret.Add(new LSL_Integer(0)); 11056 ret.Add(new LSL_Integer(av.RunningScriptCount()));
11272 break; 11057 break;
11273 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11058 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11274 ret.Add(new LSL_Integer(0)); 11059 ret.Add(new LSL_Integer(av.ScriptCount()));
11275 break; 11060 break;
11276 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11061 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11277 ret.Add(new LSL_Integer(0)); 11062 ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384));
11278 break; 11063 break;
11279 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11064 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11280 ret.Add(new LSL_Float(0)); 11065 ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f));
11281 break; 11066 break;
11282 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11067 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11283 ret.Add(new LSL_Integer(0)); 11068 ret.Add(new LSL_Integer(1));
11284 break; 11069 break;
11285 case ScriptBaseClass.OBJECT_SERVER_COST: 11070 case ScriptBaseClass.OBJECT_SERVER_COST:
11286 ret.Add(new LSL_Float(0)); 11071 ret.Add(new LSL_Float(0));
@@ -11332,43 +11117,48 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11332 case ScriptBaseClass.OBJECT_CREATOR: 11117 case ScriptBaseClass.OBJECT_CREATOR:
11333 ret.Add(new LSL_String(obj.CreatorID.ToString())); 11118 ret.Add(new LSL_String(obj.CreatorID.ToString()));
11334 break; 11119 break;
11335 // The following 8 I have intentionaly coded to return zero. They are part of
11336 // "Land Impact" calculations. These calculations are probably not applicable
11337 // to OpenSim, required figures (cpu/memory usage) are not currently tracked
11338 // I have intentionally left these all at zero rather than return possibly
11339 // missleading numbers
11340 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11120 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11341 // in SL this currently includes crashed scripts 11121 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount()));
11342 ret.Add(new LSL_Integer(0));
11343 break; 11122 break;
11344 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11123 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11345 ret.Add(new LSL_Integer(0)); 11124 ret.Add(new LSL_Integer(obj.ParentGroup.ScriptCount()));
11346 break; 11125 break;
11347 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11126 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11348 // The value returned in SL for mono scripts is 65536 * number of active scripts 11127 // The value returned in SL for mono scripts is 65536 * number of active scripts
11349 ret.Add(new LSL_Integer(0)); 11128 // and 16384 * number of active scripts for LSO. since llGetFreememory
11129 // is coded to give the LSO value use it here
11130 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384));
11350 break; 11131 break;
11351 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11132 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11352 // Average cpu time per simulator frame expended on all scripts in the objetc 11133 // Average cpu time in seconds per simulator frame expended on all scripts in the object
11353 ret.Add(new LSL_Float(0)); 11134 ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f));
11354 break; 11135 break;
11355 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11136 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11356 // according to the SL wiki A prim or linkset will have prim 11137 // according to the SL wiki A prim or linkset will have prim
11357 // equivalent of the number of prims in a linkset if it does not 11138 // equivalent of the number of prims in a linkset if it does not
11358 // contain a mesh anywhere in the link set or is not a normal prim 11139 // contain a mesh anywhere in the link set or is not a normal prim
11359 // The value returned in SL for normal prims is prim count 11140 // The value returned in SL for normal prims is prim count
11360 ret.Add(new LSL_Integer(0)); 11141 ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount));
11361 break; 11142 break;
11143 // The following 3 costs I have intentionaly coded to return zero. They are part of
11144 // "Land Impact" calculations. These calculations are probably not applicable
11145 // to OpenSim and are not yet complete in SL
11362 case ScriptBaseClass.OBJECT_SERVER_COST: 11146 case ScriptBaseClass.OBJECT_SERVER_COST:
11363 // The value returned in SL for normal prims is prim count 11147 // The linden calculation is here
11148 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight
11149 // The value returned in SL for normal prims looks like the prim count
11364 ret.Add(new LSL_Float(0)); 11150 ret.Add(new LSL_Float(0));
11365 break; 11151 break;
11366 case ScriptBaseClass.OBJECT_STREAMING_COST: 11152 case ScriptBaseClass.OBJECT_STREAMING_COST:
11367 // The value returned in SL for normal prims is prim count * 0.06 11153 // The linden calculation is here
11154 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Streaming_Cost
11155 // The value returned in SL for normal prims looks like the prim count * 0.06
11368 ret.Add(new LSL_Float(0)); 11156 ret.Add(new LSL_Float(0));
11369 break; 11157 break;
11370 case ScriptBaseClass.OBJECT_PHYSICS_COST: 11158 case ScriptBaseClass.OBJECT_PHYSICS_COST:
11371 // The value returned in SL for normal prims is prim count 11159 // The linden calculation is here
11160 // http://wiki.secondlife.com/wiki/Mesh/Mesh_physics
11161 // The value returned in SL for normal prims looks like the prim count
11372 ret.Add(new LSL_Float(0)); 11162 ret.Add(new LSL_Float(0));
11373 break; 11163 break;
11374 default: 11164 default:
@@ -11466,7 +11256,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11466 } 11256 }
11467 11257
11468 // was: UUID tid = tid = AsyncCommands. 11258 // was: UUID tid = tid = AsyncCommands.
11469 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11259 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
11470 11260
11471 if (NotecardCache.IsCached(assetID)) 11261 if (NotecardCache.IsCached(assetID))
11472 { 11262 {
@@ -11529,7 +11319,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11529 } 11319 }
11530 11320
11531 // was: UUID tid = tid = AsyncCommands. 11321 // was: UUID tid = tid = AsyncCommands.
11532 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11322 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
11533 11323
11534 if (NotecardCache.IsCached(assetID)) 11324 if (NotecardCache.IsCached(assetID))
11535 { 11325 {
@@ -11613,7 +11403,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11613 { 11403 {
11614 UUID rq = UUID.Random(); 11404 UUID rq = UUID.Random();
11615 11405
11616 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 11406 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
11617 11407
11618 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); 11408 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id)));
11619 11409
@@ -11629,7 +11419,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11629 { 11419 {
11630 UUID rq = UUID.Random(); 11420 UUID rq = UUID.Random();
11631 11421
11632 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 11422 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
11633 11423
11634 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); 11424 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id));
11635 11425
@@ -12123,7 +11913,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12123 bool isAccount = false; 11913 bool isAccount = false;
12124 bool isGroup = false; 11914 bool isGroup = false;
12125 11915
12126 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManager(m_host.OwnerID)) 11916 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManagerOrOwner(m_host.OwnerID))
12127 return 0; 11917 return 0;
12128 11918
12129 UUID id = new UUID(); 11919 UUID id = new UUID();
@@ -12185,35 +11975,50 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12185 return 1; 11975 return 1;
12186 } 11976 }
12187 11977
12188 #region Not Implemented 11978 public LSL_Integer llGetMemoryLimit()
12189 // 11979 {
12190 // Listing the unimplemented lsl functions here, please move 11980 m_host.AddScriptLPS(1);
12191 // them from this region as they are completed 11981 // The value returned for LSO scripts in SL
12192 // 11982 return 16384;
11983 }
12193 11984
12194 public void llGetEnv(LSL_String name) 11985 public LSL_Integer llSetMemoryLimit(LSL_Integer limit)
12195 { 11986 {
12196 m_host.AddScriptLPS(1); 11987 m_host.AddScriptLPS(1);
12197 NotImplemented("llGetEnv"); 11988 // Treat as an LSO script
11989 return ScriptBaseClass.FALSE;
12198 } 11990 }
12199 11991
12200 public void llGetSPMaxMemory() 11992 public LSL_Integer llGetSPMaxMemory()
12201 { 11993 {
12202 m_host.AddScriptLPS(1); 11994 m_host.AddScriptLPS(1);
12203 NotImplemented("llGetSPMaxMemory"); 11995 // The value returned for LSO scripts in SL
11996 return 16384;
12204 } 11997 }
12205 11998
12206 public virtual LSL_Integer llGetUsedMemory() 11999 public virtual LSL_Integer llGetUsedMemory()
12207 { 12000 {
12208 m_host.AddScriptLPS(1); 12001 m_host.AddScriptLPS(1);
12209 NotImplemented("llGetUsedMemory"); 12002 // The value returned for LSO scripts in SL
12210 return 0; 12003 return 16384;
12211 } 12004 }
12212 12005
12213 public void llScriptProfiler(LSL_Integer flags) 12006 public void llScriptProfiler(LSL_Integer flags)
12214 { 12007 {
12215 m_host.AddScriptLPS(1); 12008 m_host.AddScriptLPS(1);
12216 //NotImplemented("llScriptProfiler"); 12009 // This does nothing for LSO scripts in SL
12010 }
12011
12012 #region Not Implemented
12013 //
12014 // Listing the unimplemented lsl functions here, please move
12015 // them from this region as they are completed
12016 //
12017
12018 public void llGetEnv(LSL_String name)
12019 {
12020 m_host.AddScriptLPS(1);
12021 NotImplemented("llGetEnv");
12217 } 12022 }
12218 12023
12219 public void llSetSoundQueueing(int queue) 12024 public void llSetSoundQueueing(int queue)
@@ -12293,8 +12098,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12293 12098
12294 try 12099 try
12295 { 12100 {
12296 UUID invItemID=InventorySelf(); 12101 TaskInventoryItem item = m_item;
12297 if (invItemID == UUID.Zero) 12102 if (item == null)
12298 { 12103 {
12299 replydata = "SERVICE_ERROR"; 12104 replydata = "SERVICE_ERROR";
12300 return; 12105 return;
@@ -12302,10 +12107,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12302 12107
12303 m_host.AddScriptLPS(1); 12108 m_host.AddScriptLPS(1);
12304 12109
12305 m_host.TaskInventory.LockItemsForRead(true);
12306 TaskInventoryItem item = m_host.TaskInventory[invItemID];
12307 m_host.TaskInventory.LockItemsForRead(false);
12308
12309 if (item.PermsGranter == UUID.Zero) 12110 if (item.PermsGranter == UUID.Zero)
12310 { 12111 {
12311 replydata = "MISSING_PERMISSION_DEBIT"; 12112 replydata = "MISSING_PERMISSION_DEBIT";
@@ -12347,7 +12148,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12347 } 12148 }
12348 finally 12149 finally
12349 { 12150 {
12350 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 12151 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
12351 "transaction_result", new Object[] { 12152 "transaction_result", new Object[] {
12352 new LSL_String(txn.ToString()), 12153 new LSL_String(txn.ToString()),
12353 new LSL_Integer(replycode), 12154 new LSL_Integer(replycode),
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
index 77a784d..795de80 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
@@ -58,17 +58,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
58 { 58 {
59 internal IScriptEngine m_ScriptEngine; 59 internal IScriptEngine m_ScriptEngine;
60 internal SceneObjectPart m_host; 60 internal SceneObjectPart m_host;
61 internal uint m_localID;
62 internal UUID m_itemID;
63 internal bool m_LSFunctionsEnabled = false; 61 internal bool m_LSFunctionsEnabled = false;
64 internal IScriptModuleComms m_comms = null; 62 internal IScriptModuleComms m_comms = null;
65 63
66 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 64 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
67 { 65 {
68 m_ScriptEngine = ScriptEngine; 66 m_ScriptEngine = ScriptEngine;
69 m_host = host; 67 m_host = host;
70 m_localID = localID;
71 m_itemID = itemID;
72 68
73 if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false)) 69 if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false))
74 m_LSFunctionsEnabled = true; 70 m_LSFunctionsEnabled = true;
@@ -449,7 +445,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
449 LSShoutError("LightShare functions are not enabled."); 445 LSShoutError("LightShare functions are not enabled.");
450 return 0; 446 return 0;
451 } 447 }
452 if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) 448 if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
453 { 449 {
454 LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); 450 LSShoutError("lsSetWindlightScene can only be used by estate managers or owners.");
455 return 0; 451 return 0;
@@ -477,7 +473,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
477 LSShoutError("LightShare functions are not enabled."); 473 LSShoutError("LightShare functions are not enabled.");
478 return; 474 return;
479 } 475 }
480 if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) 476 if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
481 { 477 {
482 LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); 478 LSShoutError("lsSetWindlightScene can only be used by estate managers or owners.");
483 return; 479 return;
@@ -500,7 +496,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
500 LSShoutError("LightShare functions are not enabled."); 496 LSShoutError("LightShare functions are not enabled.");
501 return 0; 497 return 0;
502 } 498 }
503 if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) 499 if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
504 { 500 {
505 LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners."); 501 LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners.");
506 return 0; 502 return 0;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
index 7c07e15..4bd3dff 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -57,17 +57,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
57 { 57 {
58 internal IScriptEngine m_ScriptEngine; 58 internal IScriptEngine m_ScriptEngine;
59 internal SceneObjectPart m_host; 59 internal SceneObjectPart m_host;
60 internal uint m_localID; 60 internal TaskInventoryItem m_item;
61 internal UUID m_itemID;
62 internal bool m_MODFunctionsEnabled = false; 61 internal bool m_MODFunctionsEnabled = false;
63 internal IScriptModuleComms m_comms = null; 62 internal IScriptModuleComms m_comms = null;
64 63
65 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 64 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
66 { 65 {
67 m_ScriptEngine = ScriptEngine; 66 m_ScriptEngine = ScriptEngine;
68 m_host = host; 67 m_host = host;
69 m_localID = localID; 68 m_item = item;
70 m_itemID = itemID;
71 69
72 if (m_ScriptEngine.Config.GetBoolean("AllowMODFunctions", false)) 70 if (m_ScriptEngine.Config.GetBoolean("AllowMODFunctions", false))
73 m_MODFunctionsEnabled = true; 71 m_MODFunctionsEnabled = true;
@@ -252,7 +250,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
252 // non-null but don't trust it completely 250 // non-null but don't trust it completely
253 try 251 try
254 { 252 {
255 object result = m_comms.InvokeOperation(m_host.UUID, m_itemID, fname, convertedParms); 253 object result = m_comms.InvokeOperation(m_host.UUID, m_item.ItemID, fname, convertedParms);
256 if (result != null) 254 if (result != null)
257 return result; 255 return result;
258 256
@@ -279,7 +277,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
279 277
280 UUID req = UUID.Random(); 278 UUID req = UUID.Random();
281 279
282 m_comms.RaiseEvent(m_itemID, req.ToString(), module, command, k); 280 m_comms.RaiseEvent(m_item.ItemID, req.ToString(), module, command, k);
283 281
284 return req.ToString(); 282 return req.ToString();
285 } 283 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 0dc2aa2..51ace1a 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -128,11 +128,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
128 { 128 {
129// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 129// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
130 130
131 public const string GridInfoServiceConfigSectionName = "GridInfoService";
132
131 internal IScriptEngine m_ScriptEngine; 133 internal IScriptEngine m_ScriptEngine;
132 internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there 134 internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there
133 internal SceneObjectPart m_host; 135 internal SceneObjectPart m_host;
134 internal uint m_localID; 136 internal TaskInventoryItem m_item;
135 internal UUID m_itemID;
136 internal bool m_OSFunctionsEnabled = false; 137 internal bool m_OSFunctionsEnabled = false;
137 internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow; 138 internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow;
138 internal float m_ScriptDelayFactor = 1.0f; 139 internal float m_ScriptDelayFactor = 1.0f;
@@ -140,12 +141,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
140 internal bool m_debuggerSafe = false; 141 internal bool m_debuggerSafe = false;
141 internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >(); 142 internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >();
142 143
143 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 144 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
144 { 145 {
145 m_ScriptEngine = ScriptEngine; 146 m_ScriptEngine = ScriptEngine;
146 m_host = host; 147 m_host = host;
147 m_localID = localID; 148 m_item = item;
148 m_itemID = itemID;
149 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); 149 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
150 150
151 if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false)) 151 if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false))
@@ -218,12 +218,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
218 } 218 }
219 } 219 }
220 220
221 /// <summary>
222 /// Initialize the LSL interface.
223 /// </summary>
224 /// <remarks>
225 /// FIXME: This is an abomination. We should be able to set this up earlier but currently we have no
226 /// guarantee the interface is present on Initialize(). There needs to be another post initialize call from
227 /// ScriptInstance.
228 /// </remarks>
221 private void InitLSL() 229 private void InitLSL()
222 { 230 {
223 if (m_LSL_Api != null) 231 if (m_LSL_Api != null)
224 return; 232 return;
225 233
226 m_LSL_Api = (ILSL_Api)m_ScriptEngine.GetApi(m_itemID, "LSL"); 234 m_LSL_Api = (ILSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "LSL");
227 } 235 }
228 236
229 // 237 //
@@ -342,22 +350,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
342 return; 350 return;
343 } 351 }
344 352
345 TaskInventoryItem ti = m_host.Inventory.GetInventoryItem(m_itemID); 353 UUID ownerID = m_item.OwnerID;
346 if (ti == null)
347 {
348 OSSLError(
349 String.Format("{0} permission error. Can't find script in prim inventory.",
350 function));
351 }
352
353 UUID ownerID = ti.OwnerID;
354 354
355 //OSSL only may be used if objet is in the same group as the parcel 355 //OSSL only may be used if object is in the same group as the parcel
356 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER")) 356 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER"))
357 { 357 {
358 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); 358 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
359 359
360 if (land.LandData.GroupID == ti.GroupID && land.LandData.GroupID != UUID.Zero) 360 if (land.LandData.GroupID == m_item.GroupID && land.LandData.GroupID != UUID.Zero)
361 { 361 {
362 return; 362 return;
363 } 363 }
@@ -378,7 +378,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
378 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("ESTATE_MANAGER")) 378 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("ESTATE_MANAGER"))
379 { 379 {
380 //Only Estate Managers may use the function 380 //Only Estate Managers may use the function
381 if (World.RegionInfo.EstateSettings.IsEstateManager(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID) 381 if (World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID)
382 { 382 {
383 return; 383 return;
384 } 384 }
@@ -393,13 +393,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
393 } 393 }
394 } 394 }
395 395
396 if (!m_FunctionPerms[function].AllowedCreators.Contains(ti.CreatorID)) 396 if (!m_FunctionPerms[function].AllowedCreators.Contains(m_item.CreatorID))
397 OSSLError( 397 OSSLError(
398 String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.", 398 String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.",
399 function)); 399 function));
400 if (ti.CreatorID != ownerID) 400
401 if (m_item.CreatorID != ownerID)
401 { 402 {
402 if ((ti.CurrentPermissions & (uint)PermissionMask.Modify) != 0) 403 if ((m_item.CurrentPermissions & (uint)PermissionMask.Modify) != 0)
403 OSSLError( 404 OSSLError(
404 String.Format("{0} permission denied. Script permissions error.", 405 String.Format("{0} permission denied. Script permissions error.",
405 function)); 406 function));
@@ -730,11 +731,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
730 731
731 m_host.AddScriptLPS(1); 732 m_host.AddScriptLPS(1);
732 733
734 // For safety, we add another permission check here, and don't rely only on the standard OSSL permissions
733 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) 735 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID))
734 { 736 {
735 MainConsole.Instance.RunCommand(command); 737 MainConsole.Instance.RunCommand(command);
736 return true; 738 return true;
737 } 739 }
740
738 return false; 741 return false;
739 } 742 }
740 743
@@ -1178,7 +1181,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1178 CheckThreatLevel(ThreatLevel.High, "osSetStateEvents"); 1181 CheckThreatLevel(ThreatLevel.High, "osSetStateEvents");
1179 m_host.AddScriptLPS(1); 1182 m_host.AddScriptLPS(1);
1180 1183
1181 m_host.SetScriptEvents(m_itemID, events); 1184 m_host.SetScriptEvents(m_item.ItemID, events);
1182 } 1185 }
1183 1186
1184 public void osSetRegionWaterHeight(double height) 1187 public void osSetRegionWaterHeight(double height)
@@ -1186,12 +1189,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1186 CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight"); 1189 CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight");
1187 1190
1188 m_host.AddScriptLPS(1); 1191 m_host.AddScriptLPS(1);
1189 //Check to make sure that the script's owner is the estate manager/master 1192
1190 //World.Permissions.GenericEstatePermission( 1193 World.EventManager.TriggerRequestChangeWaterHeight((float)height);
1191 if (World.Permissions.IsGod(m_host.OwnerID))
1192 {
1193 World.EventManager.TriggerRequestChangeWaterHeight((float)height);
1194 }
1195 } 1194 }
1196 1195
1197 /// <summary> 1196 /// <summary>
@@ -1202,27 +1201,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1202 /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> 1201 /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param>
1203 public void osSetRegionSunSettings(bool useEstateSun, bool sunFixed, double sunHour) 1202 public void osSetRegionSunSettings(bool useEstateSun, bool sunFixed, double sunHour)
1204 { 1203 {
1205 CheckThreatLevel(ThreatLevel.Nuisance, "osSetRegionSunSettings"); 1204 CheckThreatLevel(ThreatLevel.High, "osSetRegionSunSettings");
1206 1205
1207 m_host.AddScriptLPS(1); 1206 m_host.AddScriptLPS(1);
1208 //Check to make sure that the script's owner is the estate manager/master
1209 //World.Permissions.GenericEstatePermission(
1210 if (World.Permissions.IsGod(m_host.OwnerID))
1211 {
1212 while (sunHour > 24.0)
1213 sunHour -= 24.0;
1214 1207
1215 while (sunHour < 0) 1208 while (sunHour > 24.0)
1216 sunHour += 24.0; 1209 sunHour -= 24.0;
1217 1210
1211 while (sunHour < 0)
1212 sunHour += 24.0;
1218 1213
1219 World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun; 1214 World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun;
1220 World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30 1215 World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30
1221 World.RegionInfo.RegionSettings.FixedSun = sunFixed; 1216 World.RegionInfo.RegionSettings.FixedSun = sunFixed;
1222 World.RegionInfo.RegionSettings.Save(); 1217 World.RegionInfo.RegionSettings.Save();
1223 1218
1224 World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour); 1219 World.EventManager.TriggerEstateToolsSunUpdate(
1225 } 1220 World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour);
1226 } 1221 }
1227 1222
1228 /// <summary> 1223 /// <summary>
@@ -1232,26 +1227,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1232 /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> 1227 /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param>
1233 public void osSetEstateSunSettings(bool sunFixed, double sunHour) 1228 public void osSetEstateSunSettings(bool sunFixed, double sunHour)
1234 { 1229 {
1235 CheckThreatLevel(ThreatLevel.Nuisance, "osSetEstateSunSettings"); 1230 CheckThreatLevel(ThreatLevel.High, "osSetEstateSunSettings");
1236 1231
1237 m_host.AddScriptLPS(1); 1232 m_host.AddScriptLPS(1);
1238 //Check to make sure that the script's owner is the estate manager/master
1239 //World.Permissions.GenericEstatePermission(
1240 if (World.Permissions.IsGod(m_host.OwnerID))
1241 {
1242 while (sunHour > 24.0)
1243 sunHour -= 24.0;
1244 1233
1245 while (sunHour < 0) 1234 while (sunHour > 24.0)
1246 sunHour += 24.0; 1235 sunHour -= 24.0;
1247 1236
1248 World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed; 1237 while (sunHour < 0)
1249 World.RegionInfo.EstateSettings.SunPosition = sunHour; 1238 sunHour += 24.0;
1250 World.RegionInfo.EstateSettings.FixedSun = sunFixed;
1251 World.RegionInfo.EstateSettings.Save();
1252 1239
1253 World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour); 1240 World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed;
1254 } 1241 World.RegionInfo.EstateSettings.SunPosition = sunHour;
1242 World.RegionInfo.EstateSettings.FixedSun = sunFixed;
1243 World.RegionInfo.EstateSettings.Save();
1244
1245 World.EventManager.TriggerEstateToolsSunUpdate(
1246 World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour);
1255 } 1247 }
1256 1248
1257 /// <summary> 1249 /// <summary>
@@ -1627,7 +1619,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1627 1619
1628 public Object osParseJSONNew(string JSON) 1620 public Object osParseJSONNew(string JSON)
1629 { 1621 {
1630 CheckThreatLevel(ThreatLevel.None, "osParseJSON"); 1622 CheckThreatLevel(ThreatLevel.None, "osParseJSONNew");
1631 1623
1632 m_host.AddScriptLPS(1); 1624 m_host.AddScriptLPS(1);
1633 1625
@@ -2042,8 +2034,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2042 string nick = String.Empty; 2034 string nick = String.Empty;
2043 IConfigSource config = m_ScriptEngine.ConfigSource; 2035 IConfigSource config = m_ScriptEngine.ConfigSource;
2044 2036
2045 if (config.Configs["GridInfo"] != null) 2037 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2046 nick = config.Configs["GridInfo"].GetString("gridnick", nick); 2038 nick = config.Configs[GridInfoServiceConfigSectionName].GetString("gridnick", nick);
2047 2039
2048 if (String.IsNullOrEmpty(nick)) 2040 if (String.IsNullOrEmpty(nick))
2049 nick = GridUserInfo(InfoType.Nick); 2041 nick = GridUserInfo(InfoType.Nick);
@@ -2059,8 +2051,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2059 string name = String.Empty; 2051 string name = String.Empty;
2060 IConfigSource config = m_ScriptEngine.ConfigSource; 2052 IConfigSource config = m_ScriptEngine.ConfigSource;
2061 2053
2062 if (config.Configs["GridInfo"] != null) 2054 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2063 name = config.Configs["GridInfo"].GetString("gridname", name); 2055 name = config.Configs[GridInfoServiceConfigSectionName].GetString("gridname", name);
2064 2056
2065 if (String.IsNullOrEmpty(name)) 2057 if (String.IsNullOrEmpty(name))
2066 name = GridUserInfo(InfoType.Name); 2058 name = GridUserInfo(InfoType.Name);
@@ -2076,8 +2068,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2076 string loginURI = String.Empty; 2068 string loginURI = String.Empty;
2077 IConfigSource config = m_ScriptEngine.ConfigSource; 2069 IConfigSource config = m_ScriptEngine.ConfigSource;
2078 2070
2079 if (config.Configs["GridInfo"] != null) 2071 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2080 loginURI = config.Configs["GridInfo"].GetString("login", loginURI); 2072 loginURI = config.Configs[GridInfoServiceConfigSectionName].GetString("login", loginURI);
2081 2073
2082 if (String.IsNullOrEmpty(loginURI)) 2074 if (String.IsNullOrEmpty(loginURI))
2083 loginURI = GridUserInfo(InfoType.Login); 2075 loginURI = GridUserInfo(InfoType.Login);
@@ -2124,8 +2116,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2124 string retval = String.Empty; 2116 string retval = String.Empty;
2125 IConfigSource config = m_ScriptEngine.ConfigSource; 2117 IConfigSource config = m_ScriptEngine.ConfigSource;
2126 2118
2127 if (config.Configs["GridInfo"] != null) 2119 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2128 retval = config.Configs["GridInfo"].GetString(key, retval); 2120 retval = config.Configs[GridInfoServiceConfigSectionName].GetString(key, retval);
2129 2121
2130 if (String.IsNullOrEmpty(retval)) 2122 if (String.IsNullOrEmpty(retval))
2131 retval = GridUserInfo(InfoType.Custom, key); 2123 retval = GridUserInfo(InfoType.Custom, key);
@@ -2480,7 +2472,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2480 return; 2472 return;
2481 2473
2482 Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z); 2474 Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z);
2483 module.MoveToTarget(npcId, World, pos, false, true); 2475 module.MoveToTarget(npcId, World, pos, false, true, false);
2484 } 2476 }
2485 } 2477 }
2486 2478
@@ -2505,7 +2497,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2505 World, 2497 World,
2506 pos, 2498 pos,
2507 (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0, 2499 (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0,
2508 (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0); 2500 (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0,
2501 (options & ScriptBaseClass.OS_NPC_RUNNING) != 0);
2509 } 2502 }
2510 } 2503 }
2511 2504
@@ -2555,7 +2548,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2555 2548
2556 public void osNpcStopMoveToTarget(LSL_Key npc) 2549 public void osNpcStopMoveToTarget(LSL_Key npc)
2557 { 2550 {
2558 CheckThreatLevel(ThreatLevel.VeryLow, "osNpcStopMoveTo"); 2551 CheckThreatLevel(ThreatLevel.High, "osNpcStopMoveToTarget");
2559 m_host.AddScriptLPS(1); 2552 m_host.AddScriptLPS(1);
2560 2553
2561 INPCModule module = World.RequestModuleInterface<INPCModule>(); 2554 INPCModule module = World.RequestModuleInterface<INPCModule>();
@@ -2572,6 +2565,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2572 2565
2573 public void osNpcSay(LSL_Key npc, string message) 2566 public void osNpcSay(LSL_Key npc, string message)
2574 { 2567 {
2568 osNpcSay(npc, 0, message);
2569 }
2570
2571 public void osNpcSay(LSL_Key npc, int channel, string message)
2572 {
2575 CheckThreatLevel(ThreatLevel.High, "osNpcSay"); 2573 CheckThreatLevel(ThreatLevel.High, "osNpcSay");
2576 m_host.AddScriptLPS(1); 2574 m_host.AddScriptLPS(1);
2577 2575
@@ -2583,7 +2581,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2583 if (!module.CheckPermissions(npcId, m_host.OwnerID)) 2581 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2584 return; 2582 return;
2585 2583
2586 module.Say(npcId, World, message); 2584 module.Say(npcId, World, message, channel);
2585 }
2586 }
2587
2588 public void osNpcShout(LSL_Key npc, int channel, string message)
2589 {
2590 CheckThreatLevel(ThreatLevel.High, "osNpcShout");
2591 m_host.AddScriptLPS(1);
2592
2593 INPCModule module = World.RequestModuleInterface<INPCModule>();
2594 if (module != null)
2595 {
2596 UUID npcId = new UUID(npc.m_string);
2597
2598 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2599 return;
2600
2601 module.Shout(npcId, World, message, channel);
2587 } 2602 }
2588 } 2603 }
2589 2604
@@ -2684,6 +2699,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2684 } 2699 }
2685 } 2700 }
2686 2701
2702 public void osNpcWhisper(LSL_Key npc, int channel, string message)
2703 {
2704 CheckThreatLevel(ThreatLevel.High, "osNpcWhisper");
2705 m_host.AddScriptLPS(1);
2706
2707 INPCModule module = World.RequestModuleInterface<INPCModule>();
2708 if (module != null)
2709 {
2710 UUID npcId = new UUID(npc.m_string);
2711
2712 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2713 return;
2714
2715 module.Whisper(npcId, World, message, channel);
2716 }
2717 }
2718
2687 /// <summary> 2719 /// <summary>
2688 /// Save the current appearance of the script owner permanently to the named notecard. 2720 /// Save the current appearance of the script owner permanently to the named notecard.
2689 /// </summary> 2721 /// </summary>
@@ -2835,21 +2867,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2835 CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); 2867 CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar");
2836 m_host.AddScriptLPS(1); 2868 m_host.AddScriptLPS(1);
2837 2869
2838 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) 2870 World.ForEachRootScenePresence(delegate(ScenePresence sp)
2839 { 2871 {
2840 World.ForEachRootScenePresence(delegate(ScenePresence sp) 2872 if (sp.Firstname == FirstName && sp.Lastname == SurName)
2841 { 2873 {
2842 if (sp.Firstname == FirstName && sp.Lastname == SurName) 2874 // kick client...
2843 { 2875 if (alert != null)
2844 // kick client... 2876 sp.ControllingClient.Kick(alert);
2845 if (alert != null)
2846 sp.ControllingClient.Kick(alert);
2847 2877
2848 // ...and close on our side 2878 // ...and close on our side
2849 sp.Scene.IncomingCloseAgent(sp.UUID); 2879 sp.Scene.IncomingCloseAgent(sp.UUID);
2850 } 2880 }
2851 }); 2881 });
2852 }
2853 } 2882 }
2854 2883
2855 public void osCauseDamage(string avatar, double damage) 2884 public void osCauseDamage(string avatar, double damage)
@@ -3095,5 +3124,80 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3095 3124
3096 return ScriptBaseClass.TRUE; 3125 return ScriptBaseClass.TRUE;
3097 } 3126 }
3127
3128 /// <summary>
3129 /// Sets terrain estate texture
3130 /// </summary>
3131 /// <param name="level"></param>
3132 /// <param name="texture"></param>
3133 /// <returns></returns>
3134 public void osSetTerrainTexture(int level, LSL_Key texture)
3135 {
3136 CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture");
3137
3138 m_host.AddScriptLPS(1);
3139 //Check to make sure that the script's owner is the estate manager/master
3140 //World.Permissions.GenericEstatePermission(
3141 if (World.Permissions.IsGod(m_host.OwnerID))
3142 {
3143 if (level < 0 || level > 3)
3144 return;
3145
3146 UUID textureID = new UUID();
3147 if (!UUID.TryParse(texture, out textureID))
3148 return;
3149
3150 // estate module is required
3151 IEstateModule estate = World.RequestModuleInterface<IEstateModule>();
3152 if (estate != null)
3153 estate.setEstateTerrainBaseTexture(level, textureID);
3154 }
3155 }
3156
3157 /// <summary>
3158 /// Sets terrain heights of estate
3159 /// </summary>
3160 /// <param name="corner"></param>
3161 /// <param name="low"></param>
3162 /// <param name="high"></param>
3163 /// <returns></returns>
3164 public void osSetTerrainTextureHeight(int corner, double low, double high)
3165 {
3166 CheckThreatLevel(ThreatLevel.High, "osSetTerrainTextureHeight");
3167
3168 m_host.AddScriptLPS(1);
3169 //Check to make sure that the script's owner is the estate manager/master
3170 //World.Permissions.GenericEstatePermission(
3171 if (World.Permissions.IsGod(m_host.OwnerID))
3172 {
3173 if (corner < 0 || corner > 3)
3174 return;
3175
3176 // estate module is required
3177 IEstateModule estate = World.RequestModuleInterface<IEstateModule>();
3178 if (estate != null)
3179 estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high);
3180 }
3181 }
3182
3183 public void osForceAttachToAvatar(int attachmentPoint)
3184 {
3185 CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatar");
3186
3187 m_host.AddScriptLPS(1);
3188
3189 InitLSL();
3190 ((LSL_Api)m_LSL_Api).AttachToAvatar(attachmentPoint);
3191 }
3192
3193 public void osForceDetachFromAvatar()
3194 {
3195 CheckThreatLevel(ThreatLevel.High, "osForceDetachFromAvatar");
3196
3197 m_host.AddScriptLPS(1);
3198
3199 InitLSL();
3200 ((LSL_Api)m_LSL_Api).DetachFromAvatar();
3201 }
3098 } 3202 }
3099} 3203}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index 1373971..19f3ce1 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -308,7 +308,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
308 } 308 }
309 SceneObjectPart SensePoint = ts.host; 309 SceneObjectPart SensePoint = ts.host;
310 310
311 Vector3 fromRegionPos = SensePoint.AbsolutePosition; 311 Vector3 fromRegionPos = SensePoint.GetWorldPosition();
312 312
313 // pre define some things to avoid repeated definitions in the loop body 313 // pre define some things to avoid repeated definitions in the loop body
314 Vector3 toRegionPos; 314 Vector3 toRegionPos;
@@ -323,13 +323,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
323 Quaternion q = SensePoint.GetWorldRotation(); // non-attached prim Sensor *always* uses World rotation! 323 Quaternion q = SensePoint.GetWorldRotation(); // non-attached prim Sensor *always* uses World rotation!
324 if (SensePoint.ParentGroup.IsAttachment) 324 if (SensePoint.ParentGroup.IsAttachment)
325 { 325 {
326 // In attachments, the sensor cone always orients with the 326 // In attachments, rotate the sensor cone with the
327 // avatar rotation. This may include a nonzero elevation if 327 // avatar rotation. This may include a nonzero elevation if
328 // in mouselook. 328 // in mouselook.
329 // This will not include the rotation and position of the
330 // attachment point (e.g. your head when a sensor is in your
331 // hair attached to your scull. Your hair will turn with
332 // your head but the sensor will stay with your (global)
333 // avatar rotation and position.
334 // Position of a sensor in a child prim attached to an avatar
335 // will be still wrong.
329 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); 336 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar);
330 fromRegionPos = avatar.AbsolutePosition; 337 fromRegionPos = avatar.AbsolutePosition;
331 q = avatar.Rotation; 338 q = avatar.Rotation;
332 } 339 }
340
333 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); 341 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W);
334 LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); 342 LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r);
335 double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); 343 double mag_fwd = LSL_Types.Vector3.Mag(forward_dir);
@@ -441,14 +449,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
441 return sensedEntities; 449 return sensedEntities;
442 450
443 SceneObjectPart SensePoint = ts.host; 451 SceneObjectPart SensePoint = ts.host;
444 Vector3 fromRegionPos = SensePoint.AbsolutePosition; 452 Vector3 fromRegionPos = SensePoint.GetWorldPosition();
445 453
446 Quaternion q = SensePoint.RotationOffset; 454 Quaternion q = SensePoint.GetWorldRotation();
447 if (SensePoint.ParentGroup.IsAttachment) 455 if (SensePoint.ParentGroup.IsAttachment)
448 { 456 {
449 // In attachments, the sensor cone always orients with the 457 // In attachments, rotate the sensor cone with the
450 // avatar rotation. This may include a nonzero elevation if 458 // avatar rotation. This may include a nonzero elevation if
451 // in mouselook. 459 // in mouselook.
460 // This will not include the rotation and position of the
461 // attachment point (e.g. your head when a sensor is in your
462 // hair attached to your scull. Your hair will turn with
463 // your head but the sensor will stay with your (global)
464 // avatar rotation and position.
465 // Position of a sensor in a child prim attached to an avatar
466 // will be still wrong.
452 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); 467 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar);
453 if (avatar == null) 468 if (avatar == null)
454 return sensedEntities; 469 return sensedEntities;