aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs19
-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.cs723
-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
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs7
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs20
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs25
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs39
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs9
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs139
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs7
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs10
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs100
21 files changed, 835 insertions, 655 deletions
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs
index bb5bacc..2027ca6 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs
@@ -27,17 +27,22 @@
27 27
28using System; 28using System;
29using OpenMetaverse; 29using OpenMetaverse;
30using OpenSim.Framework;
30using OpenSim.Region.Framework.Scenes; 31using OpenSim.Region.Framework.Scenes;
31 32
32
33namespace OpenSim.Region.ScriptEngine.Interfaces 33namespace OpenSim.Region.ScriptEngine.Interfaces
34{ 34{
35 public interface IScriptApi 35 public interface IScriptApi
36 { 36 {
37 // 37 /// <summary>
38 // Each API has an identifier, which is used to load the 38 /// Initialize the API
39 // proper runtime assembly at load time. 39 /// </summary>
40 // 40 /// <remarks>
41 void Initialize(IScriptEngine engine, SceneObjectPart part, uint localID, UUID item); 41 /// Each API has an identifier, which is used to load the
42 /// proper runtime assembly at load time.
43 /// <param name='engine'>/param>
44 /// <param name='part'></param>
45 /// <param name='item'></param>
46 void Initialize(IScriptEngine engine, SceneObjectPart part, TaskInventoryItem item);
42 } 47 }
43} 48} \ No newline at end of file
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 eb68038..2533002 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;
@@ -107,11 +111,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
107 protected IUrlModule m_UrlModule = null; 111 protected IUrlModule m_UrlModule = null;
108 protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache = 112 protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache =
109 new Dictionary<UUID, UserInfoCacheEntry>(); 113 new Dictionary<UUID, UserInfoCacheEntry>();
114 protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp.
110 115
111 protected Timer m_ShoutSayTimer; 116 protected Timer m_ShoutSayTimer;
112 protected int m_SayShoutCount = 0; 117 protected int m_SayShoutCount = 0;
113 118
114 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 119 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
115 { 120 {
116 m_ShoutSayTimer = new Timer(1000); 121 m_ShoutSayTimer = new Timer(1000);
117 m_ShoutSayTimer.Elapsed += SayShoutTimerElapsed; 122 m_ShoutSayTimer.Elapsed += SayShoutTimerElapsed;
@@ -120,10 +125,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
120 125
121 m_ScriptEngine = ScriptEngine; 126 m_ScriptEngine = ScriptEngine;
122 m_host = host; 127 m_host = host;
123 m_localID = localID; 128 m_item = item;
124 m_itemID = itemID;
125 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); 129 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
126 130
131 LoadLimits(); // read script limits from config.
132
133 m_TransferModule =
134 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>();
135 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>();
136
137 AsyncCommands = new AsyncCommandManager(ScriptEngine);
138 }
139
140 /* load configuration items that affect script, object and run-time behavior. */
141 private void LoadLimits()
142 {
127 m_ScriptDelayFactor = 143 m_ScriptDelayFactor =
128 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f); 144 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f);
129 m_ScriptDistanceFactor = 145 m_ScriptDistanceFactor =
@@ -136,12 +152,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
136 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255); 152 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255);
137 if (m_notecardLineReadCharsMax > 65535) 153 if (m_notecardLineReadCharsMax > 65535)
138 m_notecardLineReadCharsMax = 65535; 154 m_notecardLineReadCharsMax = 65535;
139 155 // load limits for particular subsystems.
140 m_TransferModule = 156 IConfig SMTPConfig;
141 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>(); 157 if ((SMTPConfig = m_ScriptEngine.ConfigSource.Configs["SMTP"]) != null) {
142 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); 158 // there's an smtp config, so load in the snooze time.
143 159 EMAIL_PAUSE_TIME = SMTPConfig.GetInt("email_pause_time", EMAIL_PAUSE_TIME);
144 AsyncCommands = new AsyncCommandManager(ScriptEngine); 160 }
145 } 161 }
146 162
147 public override Object InitializeLifetimeService() 163 public override Object InitializeLifetimeService()
@@ -173,7 +189,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
173 [DebuggerNonUserCode] 189 [DebuggerNonUserCode]
174 public void state(string newState) 190 public void state(string newState)
175 { 191 {
176 m_ScriptEngine.SetState(m_itemID, newState); 192 m_ScriptEngine.SetState(m_item.ItemID, newState);
177 } 193 }
178 194
179 /// <summary> 195 /// <summary>
@@ -184,7 +200,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
184 public void llResetScript() 200 public void llResetScript()
185 { 201 {
186 m_host.AddScriptLPS(1); 202 m_host.AddScriptLPS(1);
187 m_ScriptEngine.ApiResetScript(m_itemID); 203 m_ScriptEngine.ApiResetScript(m_item.ItemID);
188 } 204 }
189 205
190 public void llResetOtherScript(string name) 206 public void llResetOtherScript(string name)
@@ -336,30 +352,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
336 } 352 }
337 } 353 }
338 354
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) 355 protected UUID InventoryKey(string name, int type)
364 { 356 {
365 m_host.AddScriptLPS(1); 357 m_host.AddScriptLPS(1);
@@ -941,20 +933,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
941 933
942 public void llRegionSayTo(string target, int channel, string msg) 934 public void llRegionSayTo(string target, int channel, string msg)
943 { 935 {
944 string error = String.Empty;
945
946 if (msg.Length > 1023) 936 if (msg.Length > 1023)
947 msg = msg.Substring(0, 1023); 937 msg = msg.Substring(0, 1023);
948 938
949 m_host.AddScriptLPS(1); 939 m_host.AddScriptLPS(1);
950 940
941 if (channel == ScriptBaseClass.DEBUG_CHANNEL)
942 {
943 return;
944 }
945
951 UUID TargetID; 946 UUID TargetID;
952 UUID.TryParse(target, out TargetID); 947 UUID.TryParse(target, out TargetID);
953 948
954 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 949 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
955 if (wComm != null) 950 if (wComm != null)
956 if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error)) 951 wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg);
957 LSLError(error);
958 } 952 }
959 953
960 public LSL_Integer llListen(int channelID, string name, string ID, string msg) 954 public LSL_Integer llListen(int channelID, string name, string ID, string msg)
@@ -964,7 +958,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
964 UUID.TryParse(ID, out keyID); 958 UUID.TryParse(ID, out keyID);
965 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 959 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
966 if (wComm != null) 960 if (wComm != null)
967 return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, keyID, msg); 961 return wComm.Listen(m_host.LocalId, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg);
968 else 962 else
969 return -1; 963 return -1;
970 } 964 }
@@ -974,7 +968,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
974 m_host.AddScriptLPS(1); 968 m_host.AddScriptLPS(1);
975 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 969 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
976 if (wComm != null) 970 if (wComm != null)
977 wComm.ListenControl(m_itemID, number, active); 971 wComm.ListenControl(m_item.ItemID, number, active);
978 } 972 }
979 973
980 public void llListenRemove(int number) 974 public void llListenRemove(int number)
@@ -982,7 +976,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
982 m_host.AddScriptLPS(1); 976 m_host.AddScriptLPS(1);
983 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 977 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
984 if (wComm != null) 978 if (wComm != null)
985 wComm.ListenRemove(m_itemID, number); 979 wComm.ListenRemove(m_item.ItemID, number);
986 } 980 }
987 981
988 public void llSensor(string name, string id, int type, double range, double arc) 982 public void llSensor(string name, string id, int type, double range, double arc)
@@ -991,7 +985,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
991 UUID keyID = UUID.Zero; 985 UUID keyID = UUID.Zero;
992 UUID.TryParse(id, out keyID); 986 UUID.TryParse(id, out keyID);
993 987
994 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); 988 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, m_host);
995 } 989 }
996 990
997 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) 991 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate)
@@ -1000,13 +994,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1000 UUID keyID = UUID.Zero; 994 UUID keyID = UUID.Zero;
1001 UUID.TryParse(id, out keyID); 995 UUID.TryParse(id, out keyID);
1002 996
1003 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); 997 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, rate, m_host);
1004 } 998 }
1005 999
1006 public void llSensorRemove() 1000 public void llSensorRemove()
1007 { 1001 {
1008 m_host.AddScriptLPS(1); 1002 m_host.AddScriptLPS(1);
1009 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_itemID); 1003 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_host.LocalId, m_item.ItemID);
1010 } 1004 }
1011 1005
1012 public string resolveName(UUID objecUUID) 1006 public string resolveName(UUID objecUUID)
@@ -1047,7 +1041,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1047 public LSL_String llDetectedName(int number) 1041 public LSL_String llDetectedName(int number)
1048 { 1042 {
1049 m_host.AddScriptLPS(1); 1043 m_host.AddScriptLPS(1);
1050 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1044 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1051 if (detectedParams == null) 1045 if (detectedParams == null)
1052 return String.Empty; 1046 return String.Empty;
1053 return detectedParams.Name; 1047 return detectedParams.Name;
@@ -1056,7 +1050,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1056 public LSL_String llDetectedKey(int number) 1050 public LSL_String llDetectedKey(int number)
1057 { 1051 {
1058 m_host.AddScriptLPS(1); 1052 m_host.AddScriptLPS(1);
1059 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1053 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1060 if (detectedParams == null) 1054 if (detectedParams == null)
1061 return String.Empty; 1055 return String.Empty;
1062 return detectedParams.Key.ToString(); 1056 return detectedParams.Key.ToString();
@@ -1065,7 +1059,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1065 public LSL_String llDetectedOwner(int number) 1059 public LSL_String llDetectedOwner(int number)
1066 { 1060 {
1067 m_host.AddScriptLPS(1); 1061 m_host.AddScriptLPS(1);
1068 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1062 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1069 if (detectedParams == null) 1063 if (detectedParams == null)
1070 return String.Empty; 1064 return String.Empty;
1071 return detectedParams.Owner.ToString(); 1065 return detectedParams.Owner.ToString();
@@ -1074,7 +1068,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1074 public LSL_Integer llDetectedType(int number) 1068 public LSL_Integer llDetectedType(int number)
1075 { 1069 {
1076 m_host.AddScriptLPS(1); 1070 m_host.AddScriptLPS(1);
1077 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1071 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1078 if (detectedParams == null) 1072 if (detectedParams == null)
1079 return 0; 1073 return 0;
1080 return new LSL_Integer(detectedParams.Type); 1074 return new LSL_Integer(detectedParams.Type);
@@ -1083,7 +1077,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1083 public LSL_Vector llDetectedPos(int number) 1077 public LSL_Vector llDetectedPos(int number)
1084 { 1078 {
1085 m_host.AddScriptLPS(1); 1079 m_host.AddScriptLPS(1);
1086 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1080 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1087 if (detectedParams == null) 1081 if (detectedParams == null)
1088 return new LSL_Vector(); 1082 return new LSL_Vector();
1089 return detectedParams.Position; 1083 return detectedParams.Position;
@@ -1092,7 +1086,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1092 public LSL_Vector llDetectedVel(int number) 1086 public LSL_Vector llDetectedVel(int number)
1093 { 1087 {
1094 m_host.AddScriptLPS(1); 1088 m_host.AddScriptLPS(1);
1095 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1089 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1096 if (detectedParams == null) 1090 if (detectedParams == null)
1097 return new LSL_Vector(); 1091 return new LSL_Vector();
1098 return detectedParams.Velocity; 1092 return detectedParams.Velocity;
@@ -1101,7 +1095,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1101 public LSL_Vector llDetectedGrab(int number) 1095 public LSL_Vector llDetectedGrab(int number)
1102 { 1096 {
1103 m_host.AddScriptLPS(1); 1097 m_host.AddScriptLPS(1);
1104 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1098 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1105 if (parms == null) 1099 if (parms == null)
1106 return new LSL_Vector(0, 0, 0); 1100 return new LSL_Vector(0, 0, 0);
1107 1101
@@ -1111,7 +1105,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1111 public LSL_Rotation llDetectedRot(int number) 1105 public LSL_Rotation llDetectedRot(int number)
1112 { 1106 {
1113 m_host.AddScriptLPS(1); 1107 m_host.AddScriptLPS(1);
1114 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1108 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1115 if (detectedParams == null) 1109 if (detectedParams == null)
1116 return new LSL_Rotation(); 1110 return new LSL_Rotation();
1117 return detectedParams.Rotation; 1111 return detectedParams.Rotation;
@@ -1120,7 +1114,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1120 public LSL_Integer llDetectedGroup(int number) 1114 public LSL_Integer llDetectedGroup(int number)
1121 { 1115 {
1122 m_host.AddScriptLPS(1); 1116 m_host.AddScriptLPS(1);
1123 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1117 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1124 if (detectedParams == null) 1118 if (detectedParams == null)
1125 return new LSL_Integer(0); 1119 return new LSL_Integer(0);
1126 if (m_host.GroupID == detectedParams.Group) 1120 if (m_host.GroupID == detectedParams.Group)
@@ -1131,7 +1125,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1131 public LSL_Integer llDetectedLinkNumber(int number) 1125 public LSL_Integer llDetectedLinkNumber(int number)
1132 { 1126 {
1133 m_host.AddScriptLPS(1); 1127 m_host.AddScriptLPS(1);
1134 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1128 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1135 if (parms == null) 1129 if (parms == null)
1136 return new LSL_Integer(0); 1130 return new LSL_Integer(0);
1137 1131
@@ -1144,7 +1138,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1144 public LSL_Vector llDetectedTouchBinormal(int index) 1138 public LSL_Vector llDetectedTouchBinormal(int index)
1145 { 1139 {
1146 m_host.AddScriptLPS(1); 1140 m_host.AddScriptLPS(1);
1147 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1141 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1148 if (detectedParams == null) 1142 if (detectedParams == null)
1149 return new LSL_Vector(); 1143 return new LSL_Vector();
1150 return detectedParams.TouchBinormal; 1144 return detectedParams.TouchBinormal;
@@ -1156,7 +1150,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1156 public LSL_Integer llDetectedTouchFace(int index) 1150 public LSL_Integer llDetectedTouchFace(int index)
1157 { 1151 {
1158 m_host.AddScriptLPS(1); 1152 m_host.AddScriptLPS(1);
1159 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1153 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1160 if (detectedParams == null) 1154 if (detectedParams == null)
1161 return new LSL_Integer(-1); 1155 return new LSL_Integer(-1);
1162 return new LSL_Integer(detectedParams.TouchFace); 1156 return new LSL_Integer(detectedParams.TouchFace);
@@ -1168,7 +1162,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1168 public LSL_Vector llDetectedTouchNormal(int index) 1162 public LSL_Vector llDetectedTouchNormal(int index)
1169 { 1163 {
1170 m_host.AddScriptLPS(1); 1164 m_host.AddScriptLPS(1);
1171 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1165 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1172 if (detectedParams == null) 1166 if (detectedParams == null)
1173 return new LSL_Vector(); 1167 return new LSL_Vector();
1174 return detectedParams.TouchNormal; 1168 return detectedParams.TouchNormal;
@@ -1180,7 +1174,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1180 public LSL_Vector llDetectedTouchPos(int index) 1174 public LSL_Vector llDetectedTouchPos(int index)
1181 { 1175 {
1182 m_host.AddScriptLPS(1); 1176 m_host.AddScriptLPS(1);
1183 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1177 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1184 if (detectedParams == null) 1178 if (detectedParams == null)
1185 return new LSL_Vector(); 1179 return new LSL_Vector();
1186 return detectedParams.TouchPos; 1180 return detectedParams.TouchPos;
@@ -1192,7 +1186,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1192 public LSL_Vector llDetectedTouchST(int index) 1186 public LSL_Vector llDetectedTouchST(int index)
1193 { 1187 {
1194 m_host.AddScriptLPS(1); 1188 m_host.AddScriptLPS(1);
1195 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1189 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1196 if (detectedParams == null) 1190 if (detectedParams == null)
1197 return new LSL_Vector(-1.0, -1.0, 0.0); 1191 return new LSL_Vector(-1.0, -1.0, 0.0);
1198 return detectedParams.TouchST; 1192 return detectedParams.TouchST;
@@ -1204,7 +1198,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1204 public LSL_Vector llDetectedTouchUV(int index) 1198 public LSL_Vector llDetectedTouchUV(int index)
1205 { 1199 {
1206 m_host.AddScriptLPS(1); 1200 m_host.AddScriptLPS(1);
1207 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1201 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1208 if (detectedParams == null) 1202 if (detectedParams == null)
1209 return new LSL_Vector(-1.0, -1.0, 0.0); 1203 return new LSL_Vector(-1.0, -1.0, 0.0);
1210 return detectedParams.TouchUV; 1204 return detectedParams.TouchUV;
@@ -1910,6 +1904,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1910 rgb.y = texcolor.G; 1904 rgb.y = texcolor.G;
1911 rgb.z = texcolor.B; 1905 rgb.z = texcolor.B;
1912 return rgb; 1906 return rgb;
1907
1913 } 1908 }
1914 else 1909 else
1915 { 1910 {
@@ -2948,20 +2943,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2948 2943
2949 public LSL_Integer llGiveMoney(string destination, int amount) 2944 public LSL_Integer llGiveMoney(string destination, int amount)
2950 { 2945 {
2951 UUID invItemID=InventorySelf();
2952 if (invItemID == UUID.Zero)
2953 return 0;
2954
2955 m_host.AddScriptLPS(1); 2946 m_host.AddScriptLPS(1);
2956 2947
2957 m_host.TaskInventory.LockItemsForRead(true); 2948 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; 2949 return 0;
2963 2950
2964 if ((item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) 2951 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0)
2965 { 2952 {
2966 LSLError("No permissions to give money"); 2953 LSLError("No permissions to give money");
2967 return 0; 2954 return 0;
@@ -3148,11 +3135,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3148 sec = m_MinTimerInterval; 3135 sec = m_MinTimerInterval;
3149 m_host.AddScriptLPS(1); 3136 m_host.AddScriptLPS(1);
3150 // Setting timer repeat 3137 // Setting timer repeat
3151 AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_itemID, sec); 3138 AsyncCommands.TimerPlugin.SetTimerEvent(m_host.LocalId, m_item.ItemID, sec);
3152 } 3139 }
3153 3140
3154 public virtual void llSleep(double sec) 3141 public virtual void llSleep(double sec)
3155 { 3142 {
3143// m_log.Info("llSleep snoozing " + sec + "s.");
3156 m_host.AddScriptLPS(1); 3144 m_host.AddScriptLPS(1);
3157 Thread.Sleep((int)(sec * 1000)); 3145 Thread.Sleep((int)(sec * 1000));
3158 } 3146 }
@@ -3211,29 +3199,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3211 3199
3212 public void llTakeControls(int controls, int accept, int pass_on) 3200 public void llTakeControls(int controls, int accept, int pass_on)
3213 { 3201 {
3214 TaskInventoryItem item; 3202 if (m_item.PermsGranter != UUID.Zero)
3215
3216 m_host.TaskInventory.LockItemsForRead(true);
3217 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3218 {
3219 m_host.TaskInventory.LockItemsForRead(false);
3220 return;
3221 }
3222 else
3223 {
3224 item = m_host.TaskInventory[InventorySelf()];
3225 }
3226 m_host.TaskInventory.LockItemsForRead(false);
3227
3228 if (item.PermsGranter != UUID.Zero)
3229 { 3203 {
3230 ScenePresence presence = World.GetScenePresence(item.PermsGranter); 3204 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3231 3205
3232 if (presence != null) 3206 if (presence != null)
3233 { 3207 {
3234 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3208 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3235 { 3209 {
3236 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_itemID); 3210 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_host.LocalId, m_item.ItemID);
3237 } 3211 }
3238 } 3212 }
3239 } 3213 }
@@ -3243,38 +3217,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3243 3217
3244 public void llReleaseControls() 3218 public void llReleaseControls()
3245 { 3219 {
3246 TaskInventoryItem item;
3247
3248 m_host.TaskInventory.LockItemsForRead(true);
3249 lock (m_host.TaskInventory)
3250 {
3251
3252 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3253 {
3254 m_host.TaskInventory.LockItemsForRead(false);
3255 return;
3256 }
3257 else
3258 {
3259 item = m_host.TaskInventory[InventorySelf()];
3260 }
3261 }
3262 m_host.TaskInventory.LockItemsForRead(false);
3263
3264 m_host.AddScriptLPS(1); 3220 m_host.AddScriptLPS(1);
3265 3221
3266 if (item.PermsGranter != UUID.Zero) 3222 if (m_item.PermsGranter != UUID.Zero)
3267 { 3223 {
3268 ScenePresence presence = World.GetScenePresence(item.PermsGranter); 3224 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3269 3225
3270 if (presence != null) 3226 if (presence != null)
3271 { 3227 {
3272 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3228 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3273 { 3229 {
3274 // Unregister controls from Presence 3230 // Unregister controls from Presence
3275 presence.UnRegisterControlEventsToScript(m_localID, m_itemID); 3231 presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID);
3276 // Remove Take Control permission. 3232 // Remove Take Control permission.
3277 item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; 3233 m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS;
3278 } 3234 }
3279 } 3235 }
3280 } 3236 }
@@ -3287,86 +3243,71 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3287 m_UrlModule.ReleaseURL(url); 3243 m_UrlModule.ReleaseURL(url);
3288 } 3244 }
3289 3245
3290 public void llAttachToAvatar(int attachment) 3246 /// <summary>
3247 /// Attach the object containing this script to the avatar that owns it.
3248 /// </summary>
3249 /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param>
3250 /// <returns>true if the attach suceeded, false if it did not</returns>
3251 public bool AttachToAvatar(int attachmentPoint)
3291 { 3252 {
3292 m_host.AddScriptLPS(1); 3253 SceneObjectGroup grp = m_host.ParentGroup;
3293 3254 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
3294 TaskInventoryItem item;
3295 3255
3296 m_host.TaskInventory.LockItemsForRead(true); 3256 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3297 3257
3298 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3258 if (attachmentsModule != null)
3299 { 3259 return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false);
3300 m_host.TaskInventory.LockItemsForRead(false);
3301 return;
3302 }
3303 else 3260 else
3304 { 3261 return false;
3305 item = m_host.TaskInventory[InventorySelf()]; 3262 }
3306 }
3307
3308 m_host.TaskInventory.LockItemsForRead(false);
3309 3263
3310 if (item.PermsGranter != m_host.OwnerID) 3264 /// <summary>
3311 return; 3265 /// Detach the object containing this script from the avatar it is attached to.
3266 /// </summary>
3267 /// <remarks>
3268 /// Nothing happens if the object is not attached.
3269 /// </remarks>
3270 public void DetachFromAvatar()
3271 {
3272 Util.FireAndForget(DetachWrapper, m_host);
3273 }
3312 3274
3313 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3275 private void DetachWrapper(object o)
3314 { 3276 {
3315 SceneObjectGroup grp = m_host.ParentGroup; 3277 SceneObjectPart host = (SceneObjectPart)o;
3316 3278
3317 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 3279 SceneObjectGroup grp = host.ParentGroup;
3280 UUID itemID = grp.FromItemID;
3281 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3318 3282
3319 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; 3283 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3320 if (attachmentsModule != null) 3284 if (attachmentsModule != null)
3321 attachmentsModule.AttachObject(presence, grp, (uint)attachment, false); 3285 attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
3322 }
3323 } 3286 }
3324 3287
3325 public void llDetachFromAvatar() 3288 public void llAttachToAvatar(int attachmentPoint)
3326 { 3289 {
3327 m_host.AddScriptLPS(1); 3290 m_host.AddScriptLPS(1);
3328 3291
3329 if (m_host.ParentGroup.AttachmentPoint == 0) 3292 if (m_item.PermsGranter != m_host.OwnerID)
3330 return; 3293 return;
3331 3294
3332 TaskInventoryItem item; 3295 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3296 AttachToAvatar(attachmentPoint);
3297 }
3333 3298
3334 m_host.TaskInventory.LockItemsForRead(true); 3299 public void llDetachFromAvatar()
3300 {
3301 m_host.AddScriptLPS(1);
3335 3302
3336 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3303 if (m_host.ParentGroup.AttachmentPoint == 0)
3337 {
3338 m_host.TaskInventory.LockItemsForRead(false);
3339 return; 3304 return;
3340 }
3341 else
3342 {
3343 item = m_host.TaskInventory[InventorySelf()];
3344 }
3345 m_host.TaskInventory.LockItemsForRead(false);
3346 3305
3347 3306 if (m_item.PermsGranter != m_host.OwnerID)
3348 if (item.PermsGranter != m_host.OwnerID)
3349 return; 3307 return;
3350 3308
3351 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3309 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3352 { 3310 DetachFromAvatar();
3353 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3354 if (attachmentsModule != null)
3355 Util.FireAndForget(DetachWrapper, m_host);
3356 }
3357 }
3358
3359 private void DetachWrapper(object o)
3360 {
3361 SceneObjectPart host = (SceneObjectPart)o;
3362
3363 SceneObjectGroup grp = host.ParentGroup;
3364 UUID itemID = grp.FromItemID;
3365 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3366
3367 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3368 if (attachmentsModule != null)
3369 attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
3370 } 3311 }
3371 3312
3372 public void llTakeCamera(string avatar) 3313 public void llTakeCamera(string avatar)
@@ -3487,7 +3428,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3487 } 3428 }
3488 3429
3489 emailModule.SendEmail(m_host.UUID, address, subject, message); 3430 emailModule.SendEmail(m_host.UUID, address, subject, message);
3490 ScriptSleep(15000); 3431 ScriptSleep(EMAIL_PAUSE_TIME * 1000);
3491 } 3432 }
3492 3433
3493 public void llGetNextEmail(string address, string subject) 3434 public void llGetNextEmail(string address, string subject)
@@ -3524,6 +3465,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3524 return m_host.UUID.ToString(); 3465 return m_host.UUID.ToString();
3525 } 3466 }
3526 3467
3468 public LSL_Key llGenerateKey()
3469 {
3470 m_host.AddScriptLPS(1);
3471 return UUID.Random().ToString();
3472 }
3473
3527 public void llSetBuoyancy(double buoyancy) 3474 public void llSetBuoyancy(double buoyancy)
3528 { 3475 {
3529 m_host.AddScriptLPS(1); 3476 m_host.AddScriptLPS(1);
@@ -3570,7 +3517,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3570 m_host.AddScriptLPS(1); 3517 m_host.AddScriptLPS(1);
3571 try 3518 try
3572 { 3519 {
3573 m_ScriptEngine.SetMinEventDelay(m_itemID, delay); 3520 m_ScriptEngine.SetMinEventDelay(m_item.ItemID, delay);
3574 } 3521 }
3575 catch (NotImplementedException) 3522 catch (NotImplementedException)
3576 { 3523 {
@@ -3623,29 +3570,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3623 { 3570 {
3624 m_host.AddScriptLPS(1); 3571 m_host.AddScriptLPS(1);
3625 3572
3626 UUID invItemID = InventorySelf(); 3573 if (m_item.PermsGranter == UUID.Zero)
3627 if (invItemID == UUID.Zero)
3628 return; 3574 return;
3629 3575
3630 TaskInventoryItem item; 3576 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3631
3632 m_host.TaskInventory.LockItemsForRead(true);
3633 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3634 { 3577 {
3635 m_host.TaskInventory.LockItemsForRead(false); 3578 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3636 return;
3637 }
3638 else
3639 {
3640 item = m_host.TaskInventory[InventorySelf()];
3641 }
3642 m_host.TaskInventory.LockItemsForRead(false);
3643 if (item.PermsGranter == UUID.Zero)
3644 return;
3645
3646 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3647 {
3648 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3649 3579
3650 if (presence != null) 3580 if (presence != null)
3651 { 3581 {
@@ -3663,38 +3593,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3663 { 3593 {
3664 m_host.AddScriptLPS(1); 3594 m_host.AddScriptLPS(1);
3665 3595
3666 UUID invItemID=InventorySelf(); 3596 if (m_item.PermsGranter == UUID.Zero)
3667 if (invItemID == UUID.Zero)
3668 return;
3669
3670 TaskInventoryItem item;
3671
3672 m_host.TaskInventory.LockItemsForRead(true);
3673 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3674 {
3675 m_host.TaskInventory.LockItemsForRead(false);
3676 return;
3677 }
3678 else
3679 {
3680 item = m_host.TaskInventory[InventorySelf()];
3681 }
3682 m_host.TaskInventory.LockItemsForRead(false);
3683
3684
3685 if (item.PermsGranter == UUID.Zero)
3686 return; 3597 return;
3687 3598
3688 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) 3599 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3689 { 3600 {
3690 UUID animID = new UUID(); 3601 UUID animID = new UUID();
3691 3602
3692 if (!UUID.TryParse(anim, out animID)) 3603 if (!UUID.TryParse(anim, out animID))
3693 { 3604 {
3694 animID=InventoryKey(anim); 3605 animID = InventoryKey(anim);
3695 } 3606 }
3696 3607
3697 ScenePresence presence = World.GetScenePresence(item.PermsGranter); 3608 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3698 3609
3699 if (presence != null) 3610 if (presence != null)
3700 { 3611 {
@@ -3730,44 +3641,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3730 public LSL_Integer llGetStartParameter() 3641 public LSL_Integer llGetStartParameter()
3731 { 3642 {
3732 m_host.AddScriptLPS(1); 3643 m_host.AddScriptLPS(1);
3733 return m_ScriptEngine.GetStartParameter(m_itemID); 3644 return m_ScriptEngine.GetStartParameter(m_item.ItemID);
3734 } 3645 }
3735 3646
3736 public void llRequestPermissions(string agent, int perm) 3647 public void llRequestPermissions(string agent, int perm)
3737 { 3648 {
3738 UUID agentID = new UUID(); 3649 UUID agentID;
3739 3650
3740 if (!UUID.TryParse(agent, out agentID)) 3651 if (!UUID.TryParse(agent, out agentID))
3741 return; 3652 return;
3742 3653
3743 UUID invItemID = InventorySelf();
3744
3745 if (invItemID == UUID.Zero)
3746 return; // Not in a prim? How??
3747
3748 TaskInventoryItem item;
3749
3750
3751 m_host.TaskInventory.LockItemsForRead(true);
3752 if (!m_host.TaskInventory.ContainsKey(invItemID))
3753 {
3754 m_host.TaskInventory.LockItemsForRead(false);
3755 return;
3756 }
3757 else
3758 {
3759 item = m_host.TaskInventory[invItemID];
3760 }
3761 m_host.TaskInventory.LockItemsForRead(false);
3762
3763 if (agentID == UUID.Zero || perm == 0) // Releasing permissions 3654 if (agentID == UUID.Zero || perm == 0) // Releasing permissions
3764 { 3655 {
3765 llReleaseControls(); 3656 llReleaseControls();
3766 3657
3767 item.PermsGranter = UUID.Zero; 3658 m_item.PermsGranter = UUID.Zero;
3768 item.PermsMask = 0; 3659 m_item.PermsMask = 0;
3769 3660
3770 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3661 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3771 "run_time_permissions", new Object[] { 3662 "run_time_permissions", new Object[] {
3772 new LSL_Integer(0) }, 3663 new LSL_Integer(0) },
3773 new DetectParams[0])); 3664 new DetectParams[0]));
@@ -3775,7 +3666,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3775 return; 3666 return;
3776 } 3667 }
3777 3668
3778 if (item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3669 if (m_item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3779 llReleaseControls(); 3670 llReleaseControls();
3780 3671
3781 m_host.AddScriptLPS(1); 3672 m_host.AddScriptLPS(1);
@@ -3792,11 +3683,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3792 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3683 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3793 { 3684 {
3794 m_host.TaskInventory.LockItemsForWrite(true); 3685 m_host.TaskInventory.LockItemsForWrite(true);
3795 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3686 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3796 m_host.TaskInventory[invItemID].PermsMask = perm; 3687 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3797 m_host.TaskInventory.LockItemsForWrite(false); 3688 m_host.TaskInventory.LockItemsForWrite(false);
3798 3689
3799 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3690 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3800 "run_time_permissions", new Object[] { 3691 "run_time_permissions", new Object[] {
3801 new LSL_Integer(perm) }, 3692 new LSL_Integer(perm) },
3802 new DetectParams[0])); 3693 new DetectParams[0]));
@@ -3831,11 +3722,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3831 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3722 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3832 { 3723 {
3833 m_host.TaskInventory.LockItemsForWrite(true); 3724 m_host.TaskInventory.LockItemsForWrite(true);
3834 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3725 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3835 m_host.TaskInventory[invItemID].PermsMask = perm; 3726 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3836 m_host.TaskInventory.LockItemsForWrite(false); 3727 m_host.TaskInventory.LockItemsForWrite(false);
3837 3728
3838 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3729 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3839 "run_time_permissions", new Object[] { 3730 "run_time_permissions", new Object[] {
3840 new LSL_Integer(perm) }, 3731 new LSL_Integer(perm) },
3841 new DetectParams[0])); 3732 new DetectParams[0]));
@@ -3856,8 +3747,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3856 if (!m_waitingForScriptAnswer) 3747 if (!m_waitingForScriptAnswer)
3857 { 3748 {
3858 m_host.TaskInventory.LockItemsForWrite(true); 3749 m_host.TaskInventory.LockItemsForWrite(true);
3859 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3750 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3860 m_host.TaskInventory[invItemID].PermsMask = 0; 3751 m_host.TaskInventory[m_item.ItemID].PermsMask = 0;
3861 m_host.TaskInventory.LockItemsForWrite(false); 3752 m_host.TaskInventory.LockItemsForWrite(false);
3862 3753
3863 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; 3754 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
@@ -3865,13 +3756,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3865 } 3756 }
3866 3757
3867 presence.ControllingClient.SendScriptQuestion( 3758 presence.ControllingClient.SendScriptQuestion(
3868 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm); 3759 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_item.ItemID, perm);
3869 3760
3870 return; 3761 return;
3871 } 3762 }
3872 3763
3873 // Requested agent is not in range, refuse perms 3764 // Requested agent is not in range, refuse perms
3874 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3765 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3875 "run_time_permissions", new Object[] { 3766 "run_time_permissions", new Object[] {
3876 new LSL_Integer(0) }, 3767 new LSL_Integer(0) },
3877 new DetectParams[0])); 3768 new DetectParams[0]));
@@ -3882,24 +3773,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3882 if (taskID != m_host.UUID) 3773 if (taskID != m_host.UUID)
3883 return; 3774 return;
3884 3775
3885 UUID invItemID = InventorySelf(); 3776 client.OnScriptAnswer -= handleScriptAnswer;
3886 3777 m_waitingForScriptAnswer = false;
3887 if (invItemID == UUID.Zero)
3888 return;
3889
3890 client.OnScriptAnswer-=handleScriptAnswer;
3891 m_waitingForScriptAnswer=false;
3892 3778
3893 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3779 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3894 llReleaseControls(); 3780 llReleaseControls();
3895 3781
3896
3897 m_host.TaskInventory.LockItemsForWrite(true); 3782 m_host.TaskInventory.LockItemsForWrite(true);
3898 m_host.TaskInventory[invItemID].PermsMask = answer; 3783 m_host.TaskInventory[m_item.ItemID].PermsMask = answer;
3899 m_host.TaskInventory.LockItemsForWrite(false); 3784 m_host.TaskInventory.LockItemsForWrite(false);
3900 3785
3901 3786 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3902 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3903 "run_time_permissions", new Object[] { 3787 "run_time_permissions", new Object[] {
3904 new LSL_Integer(answer) }, 3788 new LSL_Integer(answer) },
3905 new DetectParams[0])); 3789 new DetectParams[0]));
@@ -3909,41 +3793,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3909 { 3793 {
3910 m_host.AddScriptLPS(1); 3794 m_host.AddScriptLPS(1);
3911 3795
3912 m_host.TaskInventory.LockItemsForRead(true); 3796 return m_item.PermsGranter.ToString();
3913
3914 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3915 {
3916 if (item.Type == 10 && item.ItemID == m_itemID)
3917 {
3918 m_host.TaskInventory.LockItemsForRead(false);
3919 return item.PermsGranter.ToString();
3920 }
3921 }
3922 m_host.TaskInventory.LockItemsForRead(false);
3923
3924 return UUID.Zero.ToString();
3925 } 3797 }
3926 3798
3927 public LSL_Integer llGetPermissions() 3799 public LSL_Integer llGetPermissions()
3928 { 3800 {
3929 m_host.AddScriptLPS(1); 3801 m_host.AddScriptLPS(1);
3930 3802
3931 m_host.TaskInventory.LockItemsForRead(true); 3803 int perms = m_item.PermsMask;
3932 3804
3933 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3805 if (m_automaticLinkPermission)
3934 { 3806 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3935 if (item.Type == 10 && item.ItemID == m_itemID)
3936 {
3937 int perms = item.PermsMask;
3938 if (m_automaticLinkPermission)
3939 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3940 m_host.TaskInventory.LockItemsForRead(false);
3941 return perms;
3942 }
3943 }
3944 m_host.TaskInventory.LockItemsForRead(false);
3945 3807
3946 return 0; 3808 return perms;
3947 } 3809 }
3948 3810
3949 public LSL_Integer llGetLinkNumber() 3811 public LSL_Integer llGetLinkNumber()
@@ -3981,18 +3843,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3981 public void llCreateLink(string target, int parent) 3843 public void llCreateLink(string target, int parent)
3982 { 3844 {
3983 m_host.AddScriptLPS(1); 3845 m_host.AddScriptLPS(1);
3984 UUID invItemID = InventorySelf(); 3846
3985 UUID targetID; 3847 UUID targetID;
3986 3848
3987 if (!UUID.TryParse(target, out targetID)) 3849 if (!UUID.TryParse(target, out targetID))
3988 return; 3850 return;
3989 3851
3990 TaskInventoryItem item; 3852 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3991 m_host.TaskInventory.LockItemsForRead(true);
3992 item = m_host.TaskInventory[invItemID];
3993 m_host.TaskInventory.LockItemsForRead(false);
3994
3995 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3996 && !m_automaticLinkPermission) 3853 && !m_automaticLinkPermission)
3997 { 3854 {
3998 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3855 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
@@ -4000,7 +3857,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4000 } 3857 }
4001 3858
4002 IClientAPI client = null; 3859 IClientAPI client = null;
4003 ScenePresence sp = World.GetScenePresence(item.PermsGranter); 3860 ScenePresence sp = World.GetScenePresence(m_item.PermsGranter);
4004 if (sp != null) 3861 if (sp != null)
4005 client = sp.ControllingClient; 3862 client = sp.ControllingClient;
4006 3863
@@ -4046,18 +3903,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4046 public void llBreakLink(int linknum) 3903 public void llBreakLink(int linknum)
4047 { 3904 {
4048 m_host.AddScriptLPS(1); 3905 m_host.AddScriptLPS(1);
4049 UUID invItemID = InventorySelf();
4050 3906
4051 m_host.TaskInventory.LockItemsForRead(true); 3907 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4052 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3908 && !m_automaticLinkPermission)
4053 && !m_automaticLinkPermission) 3909 {
4054 { 3910 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
4055 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3911 return;
4056 m_host.TaskInventory.LockItemsForRead(false); 3912 }
4057 return; 3913
4058 }
4059 m_host.TaskInventory.LockItemsForRead(false);
4060
4061 if (linknum < ScriptBaseClass.LINK_THIS) 3914 if (linknum < ScriptBaseClass.LINK_THIS)
4062 return; 3915 return;
4063 3916
@@ -4156,12 +4009,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4156 { 4009 {
4157 m_host.AddScriptLPS(1); 4010 m_host.AddScriptLPS(1);
4158 4011
4159 UUID invItemID = InventorySelf(); 4012 TaskInventoryItem item = m_item;
4160
4161 TaskInventoryItem item;
4162 m_host.TaskInventory.LockItemsForRead(true);
4163 item = m_host.TaskInventory[invItemID];
4164 m_host.TaskInventory.LockItemsForRead(false);
4165 4013
4166 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 4014 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4167 && !m_automaticLinkPermission) 4015 && !m_automaticLinkPermission)
@@ -4472,7 +4320,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4472 { 4320 {
4473 if (item.Name == name) 4321 if (item.Name == name)
4474 { 4322 {
4475 if (item.ItemID == m_itemID) 4323 if (item.ItemID == m_item.ItemID)
4476 throw new ScriptDeleteException(); 4324 throw new ScriptDeleteException();
4477 else 4325 else
4478 m_host.Inventory.RemoveInventoryItem(item.ItemID); 4326 m_host.Inventory.RemoveInventoryItem(item.ItemID);
@@ -4606,8 +4454,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4606 UUID rq = UUID.Random(); 4454 UUID rq = UUID.Random();
4607 4455
4608 UUID tid = AsyncCommands. 4456 UUID tid = AsyncCommands.
4609 DataserverPlugin.RegisterRequest(m_localID, 4457 DataserverPlugin.RegisterRequest(m_host.LocalId,
4610 m_itemID, rq.ToString()); 4458 m_item.ItemID, rq.ToString());
4611 4459
4612 AsyncCommands. 4460 AsyncCommands.
4613 DataserverPlugin.DataserverReply(rq.ToString(), reply); 4461 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -4634,8 +4482,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4634 if (item.Type == 3 && item.Name == name) 4482 if (item.Type == 3 && item.Name == name)
4635 { 4483 {
4636 UUID tid = AsyncCommands. 4484 UUID tid = AsyncCommands.
4637 DataserverPlugin.RegisterRequest(m_localID, 4485 DataserverPlugin.RegisterRequest(m_host.LocalId,
4638 m_itemID, item.AssetID.ToString()); 4486 m_item.ItemID, item.AssetID.ToString());
4639 4487
4640 Vector3 region = new Vector3( 4488 Vector3 region = new Vector3(
4641 World.RegionInfo.RegionLocX * Constants.RegionSize, 4489 World.RegionInfo.RegionLocX * Constants.RegionSize,
@@ -5040,22 +4888,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5040 4888
5041 public LSL_String llGetScriptName() 4889 public LSL_String llGetScriptName()
5042 { 4890 {
5043 string result = String.Empty;
5044
5045 m_host.AddScriptLPS(1); 4891 m_host.AddScriptLPS(1);
5046 4892
5047 m_host.TaskInventory.LockItemsForRead(true); 4893 return m_item.Name != null ? m_item.Name : String.Empty;
5048 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
5049 {
5050 if (item.Type == 10 && item.ItemID == m_itemID)
5051 {
5052 result = item.Name!=null?item.Name:String.Empty;
5053 break;
5054 }
5055 }
5056 m_host.TaskInventory.LockItemsForRead(false);
5057
5058 return result;
5059 } 4894 }
5060 4895
5061 public LSL_Integer llGetLinkNumberOfSides(int link) 4896 public LSL_Integer llGetLinkNumberOfSides(int link)
@@ -6340,7 +6175,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6340 if (m_host.OwnerID == land.LandData.OwnerID) 6175 if (m_host.OwnerID == land.LandData.OwnerID)
6341 { 6176 {
6342 Vector3 pos = World.GetNearestAllowedPosition(presence, land); 6177 Vector3 pos = World.GetNearestAllowedPosition(presence, land);
6343 presence.TeleportWithMomentum(pos); 6178 presence.TeleportWithMomentum(pos, null);
6344 presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); 6179 presence.ControllingClient.SendAlertMessage("You have been ejected from this land");
6345 } 6180 }
6346 } 6181 }
@@ -7287,14 +7122,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7287 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7122 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7288 if (xmlrpcMod.IsEnabled()) 7123 if (xmlrpcMod.IsEnabled())
7289 { 7124 {
7290 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, UUID.Zero); 7125 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_host.LocalId, m_item.ItemID, UUID.Zero);
7291 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>(); 7126 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>();
7292 if (xmlRpcRouter != null) 7127 if (xmlRpcRouter != null)
7293 { 7128 {
7294 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; 7129 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName;
7295 7130
7296 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, 7131 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID,
7297 m_itemID, String.Format("http://{0}:{1}/", ExternalHostName, 7132 m_item.ItemID, String.Format("http://{0}:{1}/", ExternalHostName,
7298 xmlrpcMod.Port.ToString())); 7133 xmlrpcMod.Port.ToString()));
7299 } 7134 }
7300 object[] resobj = new object[] 7135 object[] resobj = new object[]
@@ -7306,7 +7141,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7306 new LSL_Integer(0), 7141 new LSL_Integer(0),
7307 new LSL_String(String.Empty) 7142 new LSL_String(String.Empty)
7308 }; 7143 };
7309 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams("remote_data", resobj, 7144 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams("remote_data", resobj,
7310 new DetectParams[0])); 7145 new DetectParams[0]));
7311 } 7146 }
7312 ScriptSleep(1000); 7147 ScriptSleep(1000);
@@ -7317,7 +7152,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7317 m_host.AddScriptLPS(1); 7152 m_host.AddScriptLPS(1);
7318 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7153 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7319 ScriptSleep(3000); 7154 ScriptSleep(3000);
7320 return (xmlrpcMod.SendRemoteData(m_localID, m_itemID, channel, dest, idata, sdata)).ToString(); 7155 return (xmlrpcMod.SendRemoteData(m_host.LocalId, m_item.ItemID, channel, dest, idata, sdata)).ToString();
7321 } 7156 }
7322 7157
7323 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) 7158 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata)
@@ -8156,7 +7991,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8156 return; 7991 return;
8157 face = (int)rules.GetLSLIntegerItem(idx++); 7992 face = (int)rules.GetLSLIntegerItem(idx++);
8158 int shiny = (int)rules.GetLSLIntegerItem(idx++); 7993 int shiny = (int)rules.GetLSLIntegerItem(idx++);
8159 Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); 7994 Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++);
8160 7995
8161 SetShiny(part, face, shiny, bump); 7996 SetShiny(part, face, shiny, bump);
8162 7997
@@ -9960,13 +9795,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9960 { 9795 {
9961 m_host.AddScriptLPS(1); 9796 m_host.AddScriptLPS(1);
9962 if (m_UrlModule != null) 9797 if (m_UrlModule != null)
9963 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 9798 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
9964 return UUID.Zero.ToString(); 9799 return UUID.Zero.ToString();
9965 } 9800 }
9966 9801
9967 public LSL_String llRequestSimulatorData(string simulator, int data) 9802 public LSL_String llRequestSimulatorData(string simulator, int data)
9968 { 9803 {
9969 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_itemID, "OSSL"); 9804 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL");
9970 9805
9971 try 9806 try
9972 { 9807 {
@@ -10028,7 +9863,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10028 UUID rq = UUID.Random(); 9863 UUID rq = UUID.Random();
10029 9864
10030 UUID tid = AsyncCommands. 9865 UUID tid = AsyncCommands.
10031 DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 9866 DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
10032 9867
10033 AsyncCommands. 9868 AsyncCommands.
10034 DataserverPlugin.DataserverReply(rq.ToString(), reply); 9869 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -10047,7 +9882,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10047 m_host.AddScriptLPS(1); 9882 m_host.AddScriptLPS(1);
10048 9883
10049 if (m_UrlModule != null) 9884 if (m_UrlModule != null)
10050 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 9885 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
10051 return UUID.Zero.ToString(); 9886 return UUID.Zero.ToString();
10052 } 9887 }
10053 9888
@@ -10083,7 +9918,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10083 // child agents have a mass of 1.0 9918 // child agents have a mass of 1.0
10084 return 1; 9919 return 1;
10085 else 9920 else
10086 return avatar.GetMass(); 9921 return (double)avatar.GetMass();
10087 } 9922 }
10088 catch (KeyNotFoundException) 9923 catch (KeyNotFoundException)
10089 { 9924 {
@@ -10526,26 +10361,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10526 public LSL_Vector llGetCameraPos() 10361 public LSL_Vector llGetCameraPos()
10527 { 10362 {
10528 m_host.AddScriptLPS(1); 10363 m_host.AddScriptLPS(1);
10529 UUID invItemID = InventorySelf();
10530 10364
10531 if (invItemID == UUID.Zero) 10365 if (m_item.PermsGranter == UUID.Zero)
10532 return new LSL_Vector(); 10366 return new LSL_Vector();
10533 10367
10534 m_host.TaskInventory.LockItemsForRead(true); 10368 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10535
10536 UUID agentID = m_host.TaskInventory[invItemID].PermsGranter;
10537
10538// if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
10539 if (agentID == UUID.Zero)
10540 {
10541 m_host.TaskInventory.LockItemsForRead(false);
10542 return new LSL_Vector();
10543 }
10544
10545 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10546 { 10369 {
10547 ShoutError("No permissions to track the camera"); 10370 ShoutError("No permissions to track the camera");
10548 m_host.TaskInventory.LockItemsForRead(false);
10549 return new LSL_Vector(); 10371 return new LSL_Vector();
10550 } 10372 }
10551 m_host.TaskInventory.LockItemsForRead(false); 10373 m_host.TaskInventory.LockItemsForRead(false);
@@ -10563,24 +10385,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10563 public LSL_Rotation llGetCameraRot() 10385 public LSL_Rotation llGetCameraRot()
10564 { 10386 {
10565 m_host.AddScriptLPS(1); 10387 m_host.AddScriptLPS(1);
10566 UUID invItemID = InventorySelf();
10567 if (invItemID == UUID.Zero)
10568 return new LSL_Rotation();
10569 10388
10570 m_host.TaskInventory.LockItemsForRead(true); 10389 if (m_item.PermsGranter == UUID.Zero)
10571 10390 return new LSL_Rotation();
10572 UUID agentID = m_host.TaskInventory[invItemID].PermsGranter;
10573 10391
10574// if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 10392 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10575 if (agentID == UUID.Zero)
10576 {
10577 m_host.TaskInventory.LockItemsForRead(false);
10578 return new LSL_Rotation();
10579 }
10580 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10581 { 10393 {
10582 ShoutError("No permissions to track the camera"); 10394 ShoutError("No permissions to track the camera");
10583 m_host.TaskInventory.LockItemsForRead(false);
10584 return new LSL_Rotation(); 10395 return new LSL_Rotation();
10585 } 10396 }
10586 m_host.TaskInventory.LockItemsForRead(false); 10397 m_host.TaskInventory.LockItemsForRead(false);
@@ -10645,7 +10456,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10645 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt) 10456 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt)
10646 { 10457 {
10647 m_host.AddScriptLPS(1); 10458 m_host.AddScriptLPS(1);
10648 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0); 10459 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0);
10649 if (detectedParams == null) 10460 if (detectedParams == null)
10650 { 10461 {
10651 if (m_host.ParentGroup.IsAttachment == true) 10462 if (m_host.ParentGroup.IsAttachment == true)
@@ -10769,30 +10580,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10769 { 10580 {
10770 m_host.AddScriptLPS(1); 10581 m_host.AddScriptLPS(1);
10771 10582
10772 // our key in the object we are in
10773 UUID invItemID = InventorySelf();
10774 if (invItemID == UUID.Zero) return;
10775
10776 // the object we are in 10583 // the object we are in
10777 UUID objectID = m_host.ParentUUID; 10584 UUID objectID = m_host.ParentUUID;
10778 if (objectID == UUID.Zero) return; 10585 if (objectID == UUID.Zero)
10586 return;
10779 10587
10780 UUID agentID;
10781 m_host.TaskInventory.LockItemsForRead(true);
10782 // we need the permission first, to know which avatar we want to set the camera for 10588 // we need the permission first, to know which avatar we want to set the camera for
10783 agentID = m_host.TaskInventory[invItemID].PermsGranter; 10589 UUID agentID = m_item.PermsGranter;
10784 10590
10785 if (agentID == UUID.Zero) 10591 if (agentID == UUID.Zero)
10786 {
10787 m_host.TaskInventory.LockItemsForRead(false);
10788 return; 10592 return;
10789 } 10593
10790 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 10594 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
10791 {
10792 m_host.TaskInventory.LockItemsForRead(false);
10793 return; 10595 return;
10794 }
10795 m_host.TaskInventory.LockItemsForRead(false);
10796 10596
10797 ScenePresence presence = World.GetScenePresence(agentID); 10597 ScenePresence presence = World.GetScenePresence(agentID);
10798 10598
@@ -10834,34 +10634,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10834 { 10634 {
10835 m_host.AddScriptLPS(1); 10635 m_host.AddScriptLPS(1);
10836 10636
10837 // our key in the object we are in
10838 UUID invItemID=InventorySelf();
10839 if (invItemID == UUID.Zero) return;
10840
10841 // the object we are in 10637 // the object we are in
10842 UUID objectID = m_host.ParentUUID; 10638 UUID objectID = m_host.ParentUUID;
10843 if (objectID == UUID.Zero) return; 10639 if (objectID == UUID.Zero)
10640 return;
10844 10641
10845 // we need the permission first, to know which avatar we want to clear the camera for 10642 // we need the permission first, to know which avatar we want to clear the camera for
10846 UUID agentID; 10643 UUID agentID = m_item.PermsGranter;
10847 m_host.TaskInventory.LockItemsForRead(true); 10644
10848 agentID = m_host.TaskInventory[invItemID].PermsGranter;
10849 if (agentID == UUID.Zero) 10645 if (agentID == UUID.Zero)
10850 {
10851 m_host.TaskInventory.LockItemsForRead(false);
10852 return; 10646 return;
10853 } 10647
10854 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 10648 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
10855 {
10856 m_host.TaskInventory.LockItemsForRead(false);
10857 return; 10649 return;
10858 }
10859 m_host.TaskInventory.LockItemsForRead(false);
10860 10650
10861 ScenePresence presence = World.GetScenePresence(agentID); 10651 ScenePresence presence = World.GetScenePresence(agentID);
10862 10652
10863 // we are not interested in child-agents 10653 // we are not interested in child-agents
10864 if (presence.IsChildAgent) return; 10654 if (presence.IsChildAgent)
10655 return;
10865 10656
10866 presence.ControllingClient.SendClearFollowCamProperties(objectID); 10657 presence.ControllingClient.SendClearFollowCamProperties(objectID);
10867 } 10658 }
@@ -11052,8 +10843,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11052 } 10843 }
11053 } 10844 }
11054 10845
11055 UUID reqID = httpScriptMod. 10846 UUID reqID
11056 StartHttpRequest(m_localID, m_itemID, url, param, httpHeaders, body); 10847 = httpScriptMod.StartHttpRequest(m_host.LocalId, m_item.ItemID, url, param, httpHeaders, body);
11057 10848
11058 if (reqID != UUID.Zero) 10849 if (reqID != UUID.Zero)
11059 return reqID.ToString(); 10850 return reqID.ToString();
@@ -11285,19 +11076,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11285 break; 11076 break;
11286 // For the following 8 see the Object version below 11077 // For the following 8 see the Object version below
11287 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11078 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11288 ret.Add(new LSL_Integer(0)); 11079 ret.Add(new LSL_Integer(av.RunningScriptCount()));
11289 break; 11080 break;
11290 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11081 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11291 ret.Add(new LSL_Integer(0)); 11082 ret.Add(new LSL_Integer(av.ScriptCount()));
11292 break; 11083 break;
11293 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11084 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11294 ret.Add(new LSL_Integer(0)); 11085 ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384));
11295 break; 11086 break;
11296 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11087 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11297 ret.Add(new LSL_Float(0)); 11088 ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f));
11298 break; 11089 break;
11299 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11090 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11300 ret.Add(new LSL_Integer(0)); 11091 ret.Add(new LSL_Integer(1));
11301 break; 11092 break;
11302 case ScriptBaseClass.OBJECT_SERVER_COST: 11093 case ScriptBaseClass.OBJECT_SERVER_COST:
11303 ret.Add(new LSL_Float(0)); 11094 ret.Add(new LSL_Float(0));
@@ -11349,43 +11140,48 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11349 case ScriptBaseClass.OBJECT_CREATOR: 11140 case ScriptBaseClass.OBJECT_CREATOR:
11350 ret.Add(new LSL_String(obj.CreatorID.ToString())); 11141 ret.Add(new LSL_String(obj.CreatorID.ToString()));
11351 break; 11142 break;
11352 // The following 8 I have intentionaly coded to return zero. They are part of
11353 // "Land Impact" calculations. These calculations are probably not applicable
11354 // to OpenSim, required figures (cpu/memory usage) are not currently tracked
11355 // I have intentionally left these all at zero rather than return possibly
11356 // missleading numbers
11357 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11143 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11358 // in SL this currently includes crashed scripts 11144 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount()));
11359 ret.Add(new LSL_Integer(0));
11360 break; 11145 break;
11361 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11146 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11362 ret.Add(new LSL_Integer(0)); 11147 ret.Add(new LSL_Integer(obj.ParentGroup.ScriptCount()));
11363 break; 11148 break;
11364 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11149 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11365 // The value returned in SL for mono scripts is 65536 * number of active scripts 11150 // The value returned in SL for mono scripts is 65536 * number of active scripts
11366 ret.Add(new LSL_Integer(0)); 11151 // and 16384 * number of active scripts for LSO. since llGetFreememory
11152 // is coded to give the LSO value use it here
11153 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384));
11367 break; 11154 break;
11368 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11155 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11369 // Average cpu time per simulator frame expended on all scripts in the objetc 11156 // Average cpu time in seconds per simulator frame expended on all scripts in the object
11370 ret.Add(new LSL_Float(0)); 11157 ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f));
11371 break; 11158 break;
11372 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11159 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11373 // according to the SL wiki A prim or linkset will have prim 11160 // according to the SL wiki A prim or linkset will have prim
11374 // equivalent of the number of prims in a linkset if it does not 11161 // equivalent of the number of prims in a linkset if it does not
11375 // contain a mesh anywhere in the link set or is not a normal prim 11162 // contain a mesh anywhere in the link set or is not a normal prim
11376 // The value returned in SL for normal prims is prim count 11163 // The value returned in SL for normal prims is prim count
11377 ret.Add(new LSL_Integer(0)); 11164 ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount));
11378 break; 11165 break;
11166 // The following 3 costs I have intentionaly coded to return zero. They are part of
11167 // "Land Impact" calculations. These calculations are probably not applicable
11168 // to OpenSim and are not yet complete in SL
11379 case ScriptBaseClass.OBJECT_SERVER_COST: 11169 case ScriptBaseClass.OBJECT_SERVER_COST:
11380 // The value returned in SL for normal prims is prim count 11170 // The linden calculation is here
11171 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight
11172 // The value returned in SL for normal prims looks like the prim count
11381 ret.Add(new LSL_Float(0)); 11173 ret.Add(new LSL_Float(0));
11382 break; 11174 break;
11383 case ScriptBaseClass.OBJECT_STREAMING_COST: 11175 case ScriptBaseClass.OBJECT_STREAMING_COST:
11384 // The value returned in SL for normal prims is prim count * 0.06 11176 // The linden calculation is here
11177 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Streaming_Cost
11178 // The value returned in SL for normal prims looks like the prim count * 0.06
11385 ret.Add(new LSL_Float(0)); 11179 ret.Add(new LSL_Float(0));
11386 break; 11180 break;
11387 case ScriptBaseClass.OBJECT_PHYSICS_COST: 11181 case ScriptBaseClass.OBJECT_PHYSICS_COST:
11388 // The value returned in SL for normal prims is prim count 11182 // The linden calculation is here
11183 // http://wiki.secondlife.com/wiki/Mesh/Mesh_physics
11184 // The value returned in SL for normal prims looks like the prim count
11389 ret.Add(new LSL_Float(0)); 11185 ret.Add(new LSL_Float(0));
11390 break; 11186 break;
11391 default: 11187 default:
@@ -11483,7 +11279,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11483 } 11279 }
11484 11280
11485 // was: UUID tid = tid = AsyncCommands. 11281 // was: UUID tid = tid = AsyncCommands.
11486 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11282 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
11487 11283
11488 if (NotecardCache.IsCached(assetID)) 11284 if (NotecardCache.IsCached(assetID))
11489 { 11285 {
@@ -11546,7 +11342,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11546 } 11342 }
11547 11343
11548 // was: UUID tid = tid = AsyncCommands. 11344 // was: UUID tid = tid = AsyncCommands.
11549 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11345 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
11550 11346
11551 if (NotecardCache.IsCached(assetID)) 11347 if (NotecardCache.IsCached(assetID))
11552 { 11348 {
@@ -11630,7 +11426,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11630 { 11426 {
11631 UUID rq = UUID.Random(); 11427 UUID rq = UUID.Random();
11632 11428
11633 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 11429 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
11634 11430
11635 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); 11431 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id)));
11636 11432
@@ -11646,7 +11442,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11646 { 11442 {
11647 UUID rq = UUID.Random(); 11443 UUID rq = UUID.Random();
11648 11444
11649 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 11445 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
11650 11446
11651 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); 11447 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id));
11652 11448
@@ -12140,7 +11936,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12140 bool isAccount = false; 11936 bool isAccount = false;
12141 bool isGroup = false; 11937 bool isGroup = false;
12142 11938
12143 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManager(m_host.OwnerID)) 11939 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManagerOrOwner(m_host.OwnerID))
12144 return 0; 11940 return 0;
12145 11941
12146 UUID id = new UUID(); 11942 UUID id = new UUID();
@@ -12202,35 +11998,50 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12202 return 1; 11998 return 1;
12203 } 11999 }
12204 12000
12205 #region Not Implemented 12001 public LSL_Integer llGetMemoryLimit()
12206 // 12002 {
12207 // Listing the unimplemented lsl functions here, please move 12003 m_host.AddScriptLPS(1);
12208 // them from this region as they are completed 12004 // The value returned for LSO scripts in SL
12209 // 12005 return 16384;
12006 }
12210 12007
12211 public void llGetEnv(LSL_String name) 12008 public LSL_Integer llSetMemoryLimit(LSL_Integer limit)
12212 { 12009 {
12213 m_host.AddScriptLPS(1); 12010 m_host.AddScriptLPS(1);
12214 NotImplemented("llGetEnv"); 12011 // Treat as an LSO script
12012 return ScriptBaseClass.FALSE;
12215 } 12013 }
12216 12014
12217 public void llGetSPMaxMemory() 12015 public LSL_Integer llGetSPMaxMemory()
12218 { 12016 {
12219 m_host.AddScriptLPS(1); 12017 m_host.AddScriptLPS(1);
12220 NotImplemented("llGetSPMaxMemory"); 12018 // The value returned for LSO scripts in SL
12019 return 16384;
12221 } 12020 }
12222 12021
12223 public virtual LSL_Integer llGetUsedMemory() 12022 public virtual LSL_Integer llGetUsedMemory()
12224 { 12023 {
12225 m_host.AddScriptLPS(1); 12024 m_host.AddScriptLPS(1);
12226 NotImplemented("llGetUsedMemory"); 12025 // The value returned for LSO scripts in SL
12227 return 0; 12026 return 16384;
12228 } 12027 }
12229 12028
12230 public void llScriptProfiler(LSL_Integer flags) 12029 public void llScriptProfiler(LSL_Integer flags)
12231 { 12030 {
12232 m_host.AddScriptLPS(1); 12031 m_host.AddScriptLPS(1);
12233 //NotImplemented("llScriptProfiler"); 12032 // This does nothing for LSO scripts in SL
12033 }
12034
12035 #region Not Implemented
12036 //
12037 // Listing the unimplemented lsl functions here, please move
12038 // them from this region as they are completed
12039 //
12040
12041 public void llGetEnv(LSL_String name)
12042 {
12043 m_host.AddScriptLPS(1);
12044 NotImplemented("llGetEnv");
12234 } 12045 }
12235 12046
12236 public void llSetSoundQueueing(int queue) 12047 public void llSetSoundQueueing(int queue)
@@ -12310,8 +12121,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12310 12121
12311 try 12122 try
12312 { 12123 {
12313 UUID invItemID=InventorySelf(); 12124 TaskInventoryItem item = m_item;
12314 if (invItemID == UUID.Zero) 12125 if (item == null)
12315 { 12126 {
12316 replydata = "SERVICE_ERROR"; 12127 replydata = "SERVICE_ERROR";
12317 return; 12128 return;
@@ -12319,10 +12130,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12319 12130
12320 m_host.AddScriptLPS(1); 12131 m_host.AddScriptLPS(1);
12321 12132
12322 m_host.TaskInventory.LockItemsForRead(true);
12323 TaskInventoryItem item = m_host.TaskInventory[invItemID];
12324 m_host.TaskInventory.LockItemsForRead(false);
12325
12326 if (item.PermsGranter == UUID.Zero) 12133 if (item.PermsGranter == UUID.Zero)
12327 { 12134 {
12328 replydata = "MISSING_PERMISSION_DEBIT"; 12135 replydata = "MISSING_PERMISSION_DEBIT";
@@ -12364,7 +12171,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12364 } 12171 }
12365 finally 12172 finally
12366 { 12173 {
12367 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 12174 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
12368 "transaction_result", new Object[] { 12175 "transaction_result", new Object[] {
12369 new LSL_String(txn.ToString()), 12176 new LSL_String(txn.ToString()),
12370 new LSL_Integer(replycode), 12177 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;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
index be5740e..048124d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
@@ -105,6 +105,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
105 LSL_Integer llFloor(double f); 105 LSL_Integer llFloor(double f);
106 void llForceMouselook(int mouselook); 106 void llForceMouselook(int mouselook);
107 LSL_Float llFrand(double mag); 107 LSL_Float llFrand(double mag);
108 LSL_Key llGenerateKey();
108 LSL_Vector llGetAccel(); 109 LSL_Vector llGetAccel();
109 LSL_Integer llGetAgentInfo(string id); 110 LSL_Integer llGetAgentInfo(string id);
110 LSL_String llGetAgentLanguage(string id); 111 LSL_String llGetAgentLanguage(string id);
@@ -150,7 +151,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
150 LSL_Rotation llGetLocalRot(); 151 LSL_Rotation llGetLocalRot();
151 LSL_Float llGetMass(); 152 LSL_Float llGetMass();
152 LSL_Float llGetMassMKS(); 153 LSL_Float llGetMassMKS();
153 void llGetNextEmail(string address, string subject); 154 LSL_Integer llGetMemoryLimit();
155 void llGetNextEmail(string address, string subject);
154 LSL_String llGetNotecardLine(string name, int line); 156 LSL_String llGetNotecardLine(string name, int line);
155 LSL_Key llGetNumberOfNotecardLines(string name); 157 LSL_Key llGetNumberOfNotecardLines(string name);
156 LSL_Integer llGetNumberOfPrims(); 158 LSL_Integer llGetNumberOfPrims();
@@ -188,6 +190,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
188 LSL_String llGetScriptName(); 190 LSL_String llGetScriptName();
189 LSL_Integer llGetScriptState(string name); 191 LSL_Integer llGetScriptState(string name);
190 LSL_String llGetSimulatorHostname(); 192 LSL_String llGetSimulatorHostname();
193 LSL_Integer llGetSPMaxMemory();
191 LSL_Integer llGetStartParameter(); 194 LSL_Integer llGetStartParameter();
192 LSL_Integer llGetStatus(int status); 195 LSL_Integer llGetStatus(int status);
193 LSL_String llGetSubString(string src, int start, int end); 196 LSL_String llGetSubString(string src, int start, int end);
@@ -323,6 +326,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
323 void llSay(int channelID, string text); 326 void llSay(int channelID, string text);
324 void llScaleTexture(double u, double v, int face); 327 void llScaleTexture(double u, double v, int face);
325 LSL_Integer llScriptDanger(LSL_Vector pos); 328 LSL_Integer llScriptDanger(LSL_Vector pos);
329 void llScriptProfiler(LSL_Integer flag);
326 LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata); 330 LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata);
327 void llSensor(string name, string id, int type, double range, double arc); 331 void llSensor(string name, string id, int type, double range, double arc);
328 void llSensorRemove(); 332 void llSensorRemove();
@@ -346,6 +350,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
346 void llSetLinkTexture(int linknumber, string texture, int face); 350 void llSetLinkTexture(int linknumber, string texture, int face);
347 void llSetLinkTextureAnim(int linknum, int mode, int face, int sizex, int sizey, double start, double length, double rate); 351 void llSetLinkTextureAnim(int linknum, int mode, int face, int sizex, int sizey, double start, double length, double rate);
348 void llSetLocalRot(LSL_Rotation rot); 352 void llSetLocalRot(LSL_Rotation rot);
353 LSL_Integer llSetMemoryLimit(LSL_Integer limit);
349 void llSetObjectDesc(string desc); 354 void llSetObjectDesc(string desc);
350 void llSetObjectName(string name); 355 void llSetObjectName(string name);
351 void llSetObjectPermMask(int mask, int value); 356 void llSetObjectPermMask(int mask, int value);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 444a681..7382495 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -98,6 +98,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
98 void osAvatarPlayAnimation(string avatar, string animation); 98 void osAvatarPlayAnimation(string avatar, string animation);
99 void osAvatarStopAnimation(string avatar, string animation); 99 void osAvatarStopAnimation(string avatar, string animation);
100 100
101 // Attachment commands
102
103 /// <summary>
104 /// Attach the object containing this script to the avatar that owns it without checking for PERMISSION_ATTACH
105 /// </summary>
106 /// <param name='attachment'>The attachment point. For example, ATTACH_CHEST</param>
107 void osForceAttachToAvatar(int attachment);
108
109 /// <summary>
110 /// Detach the object containing this script from the avatar it is attached to without checking for PERMISSION_ATTACH
111 /// </summary>
112 /// <remarks>Nothing happens if the object is not attached.</remarks>
113 void osForceDetachFromAvatar();
114
101 //texture draw functions 115 //texture draw functions
102 string osMovePen(string drawList, int x, int y); 116 string osMovePen(string drawList, int x, int y);
103 string osDrawLine(string drawList, int startX, int startY, int endX, int endY); 117 string osDrawLine(string drawList, int startX, int startY, int endX, int endY);
@@ -203,11 +217,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
203 void osNpcSetRot(LSL_Key npc, rotation rot); 217 void osNpcSetRot(LSL_Key npc, rotation rot);
204 void osNpcStopMoveToTarget(LSL_Key npc); 218 void osNpcStopMoveToTarget(LSL_Key npc);
205 void osNpcSay(key npc, string message); 219 void osNpcSay(key npc, string message);
220 void osNpcSay(key npc, int channel, string message);
221 void osNpcShout(key npc, int channel, string message);
206 void osNpcSit(key npc, key target, int options); 222 void osNpcSit(key npc, key target, int options);
207 void osNpcStand(LSL_Key npc); 223 void osNpcStand(LSL_Key npc);
208 void osNpcRemove(key npc); 224 void osNpcRemove(key npc);
209 void osNpcPlayAnimation(LSL_Key npc, string animation); 225 void osNpcPlayAnimation(LSL_Key npc, string animation);
210 void osNpcStopAnimation(LSL_Key npc, string animation); 226 void osNpcStopAnimation(LSL_Key npc, string animation);
227 void osNpcWhisper(key npc, int channel, string message);
211 228
212 LSL_Key osOwnerSaveAppearance(string notecard); 229 LSL_Key osOwnerSaveAppearance(string notecard);
213 LSL_Key osAgentSaveAppearance(key agentId, string notecard); 230 LSL_Key osAgentSaveAppearance(key agentId, string notecard);
@@ -234,5 +251,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
234 251
235 LSL_Integer osInviteToGroup(LSL_Key agentId); 252 LSL_Integer osInviteToGroup(LSL_Key agentId);
236 LSL_Integer osEjectFromGroup(LSL_Key agentId); 253 LSL_Integer osEjectFromGroup(LSL_Key agentId);
254
255 void osSetTerrainTexture(int level, LSL_Key texture);
256 void osSetTerrainTextureHeight(int corner, double low, double high);
237 } 257 }
238} 258}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 278f74e..5c6ad8a 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -383,6 +383,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
383 public const int PRIM_SCULPT_FLAG_INVERT = 64; 383 public const int PRIM_SCULPT_FLAG_INVERT = 64;
384 public const int PRIM_SCULPT_FLAG_MIRROR = 128; 384 public const int PRIM_SCULPT_FLAG_MIRROR = 128;
385 385
386 public const int PROFILE_NONE = 0;
387 public const int PROFILE_SCRIPT_MEMORY = 1;
388
386 public const int MASK_BASE = 0; 389 public const int MASK_BASE = 0;
387 public const int MASK_OWNER = 1; 390 public const int MASK_OWNER = 1;
388 public const int MASK_GROUP = 2; 391 public const int MASK_GROUP = 2;
@@ -641,6 +644,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
641 public const int OS_NPC_FLY = 0; 644 public const int OS_NPC_FLY = 0;
642 public const int OS_NPC_NO_FLY = 1; 645 public const int OS_NPC_NO_FLY = 1;
643 public const int OS_NPC_LAND_AT_TARGET = 2; 646 public const int OS_NPC_LAND_AT_TARGET = 2;
647 public const int OS_NPC_RUNNING = 4;
644 648
645 public const int OS_NPC_SIT_NOW = 0; 649 public const int OS_NPC_SIT_NOW = 0;
646 650
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
index 9ba9561..2d23d30 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
@@ -376,6 +376,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
376 return m_LSL_Functions.llFrand(mag); 376 return m_LSL_Functions.llFrand(mag);
377 } 377 }
378 378
379 public LSL_Key llGenerateKey()
380 {
381 return m_LSL_Functions.llGenerateKey();
382 }
383
379 public LSL_Vector llGetAccel() 384 public LSL_Vector llGetAccel()
380 { 385 {
381 return m_LSL_Functions.llGetAccel(); 386 return m_LSL_Functions.llGetAccel();
@@ -591,6 +596,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
591 return m_LSL_Functions.llGetMassMKS(); 596 return m_LSL_Functions.llGetMassMKS();
592 } 597 }
593 598
599 public LSL_Integer llGetMemoryLimit()
600 {
601 return m_LSL_Functions.llGetMemoryLimit();
602 }
603
594 public void llGetNextEmail(string address, string subject) 604 public void llGetNextEmail(string address, string subject)
595 { 605 {
596 m_LSL_Functions.llGetNextEmail(address, subject); 606 m_LSL_Functions.llGetNextEmail(address, subject);
@@ -781,6 +791,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
781 return m_LSL_Functions.llGetSimulatorHostname(); 791 return m_LSL_Functions.llGetSimulatorHostname();
782 } 792 }
783 793
794 public LSL_Integer llGetSPMaxMemory()
795 {
796 return m_LSL_Functions.llGetSPMaxMemory();
797 }
798
784 public LSL_Integer llGetStartParameter() 799 public LSL_Integer llGetStartParameter()
785 { 800 {
786 return m_LSL_Functions.llGetStartParameter(); 801 return m_LSL_Functions.llGetStartParameter();
@@ -1450,6 +1465,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1450 return m_LSL_Functions.llScriptDanger(pos); 1465 return m_LSL_Functions.llScriptDanger(pos);
1451 } 1466 }
1452 1467
1468 public void llScriptProfiler(LSL_Integer flags)
1469 {
1470 m_LSL_Functions.llScriptProfiler(flags);
1471 }
1472
1453 public LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata) 1473 public LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata)
1454 { 1474 {
1455 return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata); 1475 return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata);
@@ -1560,6 +1580,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1560 m_LSL_Functions.llSetLocalRot(rot); 1580 m_LSL_Functions.llSetLocalRot(rot);
1561 } 1581 }
1562 1582
1583 public LSL_Integer llSetMemoryLimit(LSL_Integer limit)
1584 {
1585 return m_LSL_Functions.llSetMemoryLimit(limit);
1586 }
1587
1563 public void llSetObjectDesc(string desc) 1588 public void llSetObjectDesc(string desc)
1564 { 1589 {
1565 m_LSL_Functions.llSetObjectDesc(desc); 1590 m_LSL_Functions.llSetObjectDesc(desc);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 680cefb4..d230662 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -289,8 +289,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
289 m_OSSL_Functions.osAvatarStopAnimation(avatar, animation); 289 m_OSSL_Functions.osAvatarStopAnimation(avatar, animation);
290 } 290 }
291 291
292 // Avatar functions
292 293
293 //Texture Draw functions 294 public void osForceAttachToAvatar(int attachmentPoint)
295 {
296 m_OSSL_Functions.osForceAttachToAvatar(attachmentPoint);
297 }
298
299 public void osForceDetachFromAvatar()
300 {
301 m_OSSL_Functions.osForceDetachFromAvatar();
302 }
303
304 // Texture Draw functions
294 305
295 public string osMovePen(string drawList, int x, int y) 306 public string osMovePen(string drawList, int x, int y)
296 { 307 {
@@ -569,6 +580,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
569 m_OSSL_Functions.osNpcSay(npc, message); 580 m_OSSL_Functions.osNpcSay(npc, message);
570 } 581 }
571 582
583 public void osNpcSay(key npc, int channel, string message)
584 {
585 m_OSSL_Functions.osNpcSay(npc, channel, message);
586 }
587
588
589 public void osNpcShout(key npc, int channel, string message)
590 {
591 m_OSSL_Functions.osNpcShout(npc, channel, message);
592 }
593
572 public void osNpcSit(LSL_Key npc, LSL_Key target, int options) 594 public void osNpcSit(LSL_Key npc, LSL_Key target, int options)
573 { 595 {
574 m_OSSL_Functions.osNpcSit(npc, target, options); 596 m_OSSL_Functions.osNpcSit(npc, target, options);
@@ -594,6 +616,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
594 m_OSSL_Functions.osNpcStopAnimation(npc, animation); 616 m_OSSL_Functions.osNpcStopAnimation(npc, animation);
595 } 617 }
596 618
619 public void osNpcWhisper(key npc, int channel, string message)
620 {
621 m_OSSL_Functions.osNpcWhisper(npc, channel, message);
622 }
623
597 public LSL_Key osOwnerSaveAppearance(string notecard) 624 public LSL_Key osOwnerSaveAppearance(string notecard)
598 { 625 {
599 return m_OSSL_Functions.osOwnerSaveAppearance(notecard); 626 return m_OSSL_Functions.osOwnerSaveAppearance(notecard);
@@ -878,5 +905,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
878 { 905 {
879 return m_OSSL_Functions.osEjectFromGroup(agentId); 906 return m_OSSL_Functions.osEjectFromGroup(agentId);
880 } 907 }
908
909 public void osSetTerrainTexture(int level, LSL_Key texture)
910 {
911 m_OSSL_Functions.osSetTerrainTexture(level, texture);
912 }
913
914 public void osSetTerrainTextureHeight(int corner, double low, double high)
915 {
916 m_OSSL_Functions.osSetTerrainTextureHeight(corner, low, high);
917 }
881 } 918 }
882} 919}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 5e68d69..1c59d45 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -232,7 +232,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
232 foreach (string api in am.GetApis()) 232 foreach (string api in am.GetApis())
233 { 233 {
234 m_Apis[api] = am.CreateApi(api); 234 m_Apis[api] = am.CreateApi(api);
235 m_Apis[api].Initialize(engine, part, LocalID, itemID); 235 m_Apis[api].Initialize(engine, part, ScriptTask);
236 } 236 }
237 237
238 try 238 try
@@ -966,7 +966,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
966 public IScriptApi GetApi(string name) 966 public IScriptApi GetApi(string name)
967 { 967 {
968 if (m_Apis.ContainsKey(name)) 968 if (m_Apis.ContainsKey(name))
969 {
970// m_log.DebugFormat("[SCRIPT INSTANCE]: Found api {0} in {1}@{2}", name, ScriptName, PrimName);
971
969 return m_Apis[name]; 972 return m_Apis[name];
973 }
974
975// m_log.DebugFormat("[SCRIPT INSTANCE]: Did not find api {0} in {1}@{2}", name, ScriptName, PrimName);
976
970 return null; 977 return null;
971 } 978 }
972 979
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
index e2d0db2..c73e22f 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
@@ -63,7 +63,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
63 IConfig config = initConfigSource.AddConfig("XEngine"); 63 IConfig config = initConfigSource.AddConfig("XEngine");
64 config.Set("Enabled", "true"); 64 config.Set("Enabled", "true");
65 65
66 m_scene = SceneHelpers.SetupScene(); 66 m_scene = new SceneHelpers().SetupScene();
67 SceneHelpers.SetupSceneModules(m_scene, initConfigSource); 67 SceneHelpers.SetupSceneModules(m_scene, initConfigSource);
68 68
69 m_engine = new XEngine.XEngine(); 69 m_engine = new XEngine.XEngine();
@@ -91,7 +91,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
91 TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId); 91 TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId);
92 92
93 LSL_Api api = new LSL_Api(); 93 LSL_Api api = new LSL_Api();
94 api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID); 94 api.Initialize(m_engine, so1.RootPart, null);
95 95
96 // Create a second object 96 // Create a second object
97 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100); 97 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100);
@@ -124,7 +124,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
124 SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10); 124 SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10);
125 m_scene.AddSceneObject(so1); 125 m_scene.AddSceneObject(so1);
126 LSL_Api api = new LSL_Api(); 126 LSL_Api api = new LSL_Api();
127 api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID); 127 api.Initialize(m_engine, so1.RootPart, null);
128 128
129 // Create an object embedded inside the first 129 // Create an object embedded inside the first
130 UUID itemId = TestHelpers.ParseTail(0x20); 130 UUID itemId = TestHelpers.ParseTail(0x20);
@@ -134,7 +134,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
134 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100); 134 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100);
135 m_scene.AddSceneObject(so2); 135 m_scene.AddSceneObject(so2);
136 LSL_Api api2 = new LSL_Api(); 136 LSL_Api api2 = new LSL_Api();
137 api2.Initialize(m_engine, so2.RootPart, so2.RootPart.LocalId, so2.RootPart.UUID); 137 api2.Initialize(m_engine, so2.RootPart, null);
138 138
139 // *** Firstly, we test where llAllowInventoryDrop() has not been called. *** 139 // *** Firstly, we test where llAllowInventoryDrop() has not been called. ***
140 api.llGiveInventory(so2.UUID.ToString(), inventoryItemName); 140 api.llGiveInventory(so2.UUID.ToString(), inventoryItemName);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs
new file mode 100644
index 0000000..bc3b790
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs
@@ -0,0 +1,139 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using System.Text;
32using log4net;
33using Nini.Config;
34using NUnit.Framework;
35using OpenMetaverse;
36using OpenMetaverse.Assets;
37using OpenMetaverse.StructuredData;
38using OpenSim.Framework;
39using OpenSim.Region.CoreModules.Avatar.AvatarFactory;
40using OpenSim.Region.OptionalModules.World.NPC;
41using OpenSim.Region.Framework.Scenes;
42using OpenSim.Region.ScriptEngine.Shared;
43using OpenSim.Region.ScriptEngine.Shared.Api;
44using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
45using OpenSim.Services.Interfaces;
46using OpenSim.Tests.Common;
47using OpenSim.Tests.Common.Mock;
48
49namespace OpenSim.Region.ScriptEngine.Shared.Tests
50{
51 /// <summary>
52 /// Tests for linking functions in LSL
53 /// </summary>
54 /// <remarks>
55 /// This relates to LSL. Actual linking functionality should be tested in the main
56 /// OpenSim.Region.Framework.Scenes.Tests.SceneObjectLinkingTests.
57 /// </remarks>
58 [TestFixture]
59 public class LSL_ApiLinkingTests
60 {
61 protected Scene m_scene;
62 protected XEngine.XEngine m_engine;
63
64 [SetUp]
65 public void SetUp()
66 {
67 IConfigSource initConfigSource = new IniConfigSource();
68 IConfig config = initConfigSource.AddConfig("XEngine");
69 config.Set("Enabled", "true");
70
71 m_scene = new SceneHelpers().SetupScene();
72 SceneHelpers.SetupSceneModules(m_scene, initConfigSource);
73
74 m_engine = new XEngine.XEngine();
75 m_engine.Initialise(initConfigSource);
76 m_engine.AddRegion(m_scene);
77 }
78
79 [Test]
80 public void TestllCreateLink()
81 {
82 TestHelpers.InMethod();
83
84 UUID ownerId = TestHelpers.ParseTail(0x1);
85
86 SceneObjectGroup grp1 = SceneHelpers.CreateSceneObject(2, ownerId, "grp1-", 0x10);
87 grp1.AbsolutePosition = new Vector3(10, 10, 10);
88 m_scene.AddSceneObject(grp1);
89
90 // FIXME: This should really be a script item (with accompanying script)
91 TaskInventoryItem grp1Item
92 = TaskInventoryHelpers.AddNotecard(m_scene, grp1.RootPart);
93 grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
94
95 SceneObjectGroup grp2 = SceneHelpers.CreateSceneObject(2, ownerId, "grp2-", 0x20);
96 grp2.AbsolutePosition = new Vector3(20, 20, 20);
97
98 // <180,0,0>
99 grp2.UpdateGroupRotationR(Quaternion.CreateFromEulers(180 * Utils.DEG_TO_RAD, 0, 0));
100
101 m_scene.AddSceneObject(grp2);
102
103 LSL_Api apiGrp1 = new LSL_Api();
104 apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item);
105
106 apiGrp1.llCreateLink(grp2.UUID.ToString(), ScriptBaseClass.TRUE);
107
108 Assert.That(grp1.Parts.Length, Is.EqualTo(4));
109 Assert.That(grp2.IsDeleted, Is.True);
110 }
111
112 [Test]
113 public void TestllBreakLink()
114 {
115 TestHelpers.InMethod();
116
117 UUID ownerId = TestHelpers.ParseTail(0x1);
118
119 SceneObjectGroup grp1 = SceneHelpers.CreateSceneObject(2, ownerId, "grp1-", 0x10);
120 grp1.AbsolutePosition = new Vector3(10, 10, 10);
121 m_scene.AddSceneObject(grp1);
122
123 // FIXME: This should really be a script item (with accompanying script)
124 TaskInventoryItem grp1Item
125 = TaskInventoryHelpers.AddNotecard(m_scene, grp1.RootPart);
126 grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
127
128 LSL_Api apiGrp1 = new LSL_Api();
129 apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item);
130
131 apiGrp1.llBreakLink(2);
132
133 Assert.That(grp1.Parts.Length, Is.EqualTo(1));
134
135 SceneObjectGroup grp2 = m_scene.GetSceneObjectGroup("grp1-Part1");
136 Assert.That(grp2, Is.Not.Null);
137 }
138 }
139} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
index 9cf9258..f96a156 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
@@ -58,7 +58,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
58 IConfig config = initConfigSource.AddConfig("XEngine"); 58 IConfig config = initConfigSource.AddConfig("XEngine");
59 config.Set("Enabled", "true"); 59 config.Set("Enabled", "true");
60 60
61 Scene scene = SceneHelpers.SetupScene(); 61 Scene scene = new SceneHelpers().SetupScene();
62 SceneObjectPart part = SceneHelpers.AddSceneObject(scene); 62 SceneObjectPart part = SceneHelpers.AddSceneObject(scene);
63 63
64 XEngine.XEngine engine = new XEngine.XEngine(); 64 XEngine.XEngine engine = new XEngine.XEngine();
@@ -66,8 +66,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
66 engine.AddRegion(scene); 66 engine.AddRegion(scene);
67 67
68 m_lslApi = new LSL_Api(); 68 m_lslApi = new LSL_Api();
69 m_lslApi.Initialize(engine, part, part.LocalId, part.UUID); 69 m_lslApi.Initialize(engine, part, null);
70
71 } 70 }
72 71
73 [Test] 72 [Test]
@@ -261,7 +260,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
261 TestHelpers.InMethod(); 260 TestHelpers.InMethod();
262 261
263 // Create Prim1. 262 // Create Prim1.
264 Scene scene = SceneHelpers.SetupScene(); 263 Scene scene = new SceneHelpers().SetupScene();
265 string obj1Name = "Prim1"; 264 string obj1Name = "Prim1";
266 UUID objUuid = new UUID("00000000-0000-0000-0000-000000000001"); 265 UUID objUuid = new UUID("00000000-0000-0000-0000-000000000001");
267 SceneObjectPart part1 = 266 SceneObjectPart part1 =
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
index 7573dff..3965734 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
@@ -67,7 +67,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
67 config = initConfigSource.AddConfig("NPC"); 67 config = initConfigSource.AddConfig("NPC");
68 config.Set("Enabled", "true"); 68 config.Set("Enabled", "true");
69 69
70 m_scene = SceneHelpers.SetupScene(); 70 m_scene = new SceneHelpers().SetupScene();
71 SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule()); 71 SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule());
72 72
73 m_engine = new XEngine.XEngine(); 73 m_engine = new XEngine.XEngine();
@@ -95,7 +95,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
95 m_scene.AddSceneObject(so); 95 m_scene.AddSceneObject(so);
96 96
97 OSSL_Api osslApi = new OSSL_Api(); 97 OSSL_Api osslApi = new OSSL_Api();
98 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 98 osslApi.Initialize(m_engine, part, null);
99 99
100 string notecardName = "appearanceNc"; 100 string notecardName = "appearanceNc";
101 osslApi.osOwnerSaveAppearance(notecardName); 101 osslApi.osOwnerSaveAppearance(notecardName);
@@ -130,7 +130,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
130 m_scene.AddSceneObject(so); 130 m_scene.AddSceneObject(so);
131 131
132 OSSL_Api osslApi = new OSSL_Api(); 132 OSSL_Api osslApi = new OSSL_Api();
133 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 133 osslApi.Initialize(m_engine, part, null);
134 134
135 string notecardName = "appearanceNc"; 135 string notecardName = "appearanceNc";
136 osslApi.osOwnerSaveAppearance(notecardName); 136 osslApi.osOwnerSaveAppearance(notecardName);
@@ -161,7 +161,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
161 m_scene.AddSceneObject(so); 161 m_scene.AddSceneObject(so);
162 162
163 OSSL_Api osslApi = new OSSL_Api(); 163 OSSL_Api osslApi = new OSSL_Api();
164 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 164 osslApi.Initialize(m_engine, part, null);
165 165
166 string notecardName = "appearanceNc"; 166 string notecardName = "appearanceNc";
167 167
@@ -202,7 +202,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
202 m_scene.AddSceneObject(so); 202 m_scene.AddSceneObject(so);
203 203
204 OSSL_Api osslApi = new OSSL_Api(); 204 OSSL_Api osslApi = new OSSL_Api();
205 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 205 osslApi.Initialize(m_engine, part, null);
206 206
207 string notecardName = "appearanceNc"; 207 string notecardName = "appearanceNc";
208 208
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
index 9d9fc51..0ccd889 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
@@ -68,7 +68,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
68 config = initConfigSource.AddConfig("NPC"); 68 config = initConfigSource.AddConfig("NPC");
69 config.Set("Enabled", "true"); 69 config.Set("Enabled", "true");
70 70
71 m_scene = SceneHelpers.SetupScene(); 71 m_scene = new SceneHelpers().SetupScene();
72 SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule()); 72 SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule());
73 73
74 m_engine = new XEngine.XEngine(); 74 m_engine = new XEngine.XEngine();
@@ -104,10 +104,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
104 m_scene.AddSceneObject(otherSo); 104 m_scene.AddSceneObject(otherSo);
105 105
106 OSSL_Api osslApi = new OSSL_Api(); 106 OSSL_Api osslApi = new OSSL_Api();
107 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 107 osslApi.Initialize(m_engine, part, null);
108 108
109 OSSL_Api otherOsslApi = new OSSL_Api(); 109 OSSL_Api otherOsslApi = new OSSL_Api();
110 otherOsslApi.Initialize(m_engine, otherPart, otherPart.LocalId, otherPart.UUID); 110 otherOsslApi.Initialize(m_engine, otherPart, null);
111 111
112 string notecardName = "appearanceNc"; 112 string notecardName = "appearanceNc";
113 osslApi.osOwnerSaveAppearance(notecardName); 113 osslApi.osOwnerSaveAppearance(notecardName);
@@ -151,7 +151,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
151 m_scene.AddSceneObject(so); 151 m_scene.AddSceneObject(so);
152 152
153 OSSL_Api osslApi = new OSSL_Api(); 153 OSSL_Api osslApi = new OSSL_Api();
154 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 154 osslApi.Initialize(m_engine, part, null);
155 155
156 string notecardName = "appearanceNc"; 156 string notecardName = "appearanceNc";
157 osslApi.osOwnerSaveAppearance(notecardName); 157 osslApi.osOwnerSaveAppearance(notecardName);
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs
index 7d7bd82..a3f848c 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs
@@ -73,7 +73,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests
73 // to AssemblyResolver.OnAssemblyResolve fails. 73 // to AssemblyResolver.OnAssemblyResolve fails.
74 xEngineConfig.Set("AppDomainLoading", "false"); 74 xEngineConfig.Set("AppDomainLoading", "false");
75 75
76 m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); 76 m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource);
77 SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); 77 SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule);
78 m_scene.StartScripts(); 78 m_scene.StartScripts();
79 } 79 }
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 1e0f01f..eeb125e 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1089,11 +1089,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1089 1089
1090 AppDomain sandbox; 1090 AppDomain sandbox;
1091 if (m_AppDomainLoading) 1091 if (m_AppDomainLoading)
1092 {
1092 sandbox = AppDomain.CreateDomain( 1093 sandbox = AppDomain.CreateDomain(
1093 m_Scene.RegionInfo.RegionID.ToString(), 1094 m_Scene.RegionInfo.RegionID.ToString(),
1094 evidence, appSetup); 1095 evidence, appSetup);
1096 m_AppDomains[appDomain].AssemblyResolve +=
1097 new ResolveEventHandler(
1098 AssemblyResolver.OnAssemblyResolve);
1099 }
1095 else 1100 else
1101 {
1096 sandbox = AppDomain.CurrentDomain; 1102 sandbox = AppDomain.CurrentDomain;
1103 }
1097 1104
1098 //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel(); 1105 //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel();
1099 //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition(); 1106 //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition();
@@ -1105,9 +1112,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1105 1112
1106 m_AppDomains[appDomain] = sandbox; 1113 m_AppDomains[appDomain] = sandbox;
1107 1114
1108 m_AppDomains[appDomain].AssemblyResolve +=
1109 new ResolveEventHandler(
1110 AssemblyResolver.OnAssemblyResolve);
1111 m_DomainScripts[appDomain] = new List<UUID>(); 1115 m_DomainScripts[appDomain] = new List<UUID>();
1112 } 1116 }
1113 catch (Exception e) 1117 catch (Exception e)
@@ -1898,9 +1902,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1898 // if there already exists a file at that location, it may be locked. 1902 // if there already exists a file at that location, it may be locked.
1899 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); 1903 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message);
1900 } 1904 }
1905
1906 string textpath = path + ".text";
1901 try 1907 try
1902 { 1908 {
1903 using (FileStream fs = File.Create(path + ".text")) 1909 using (FileStream fs = File.Create(textpath))
1904 { 1910 {
1905 using (StreamWriter sw = new StreamWriter(fs)) 1911 using (StreamWriter sw = new StreamWriter(fs))
1906 { 1912 {
@@ -1913,7 +1919,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1913 catch (IOException ex) 1919 catch (IOException ex)
1914 { 1920 {
1915 // if there already exists a file at that location, it may be locked. 1921 // if there already exists a file at that location, it may be locked.
1916 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); 1922 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", textpath, ex.Message);
1917 } 1923 }
1918 } 1924 }
1919 } 1925 }
@@ -1962,7 +1968,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1962 catch (IOException ex) 1968 catch (IOException ex)
1963 { 1969 {
1964 // if there already exists a file at that location, it may be locked. 1970 // if there already exists a file at that location, it may be locked.
1965 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", statepath, ex.Message); 1971 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", mappath, ex.Message);
1966 } 1972 }
1967 } 1973 }
1968 1974
@@ -1997,45 +2003,59 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1997 if (!topScripts.ContainsKey(si.LocalID)) 2003 if (!topScripts.ContainsKey(si.LocalID))
1998 topScripts[si.RootLocalID] = 0; 2004 topScripts[si.RootLocalID] = 0;
1999 2005
2000// long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; 2006 topScripts[si.RootLocalID] += CalculateAdjustedExectionTime(si, tickNow);
2001// float framesElapsed = ticksElapsed / (18.1818 * TimeSpan.TicksPerMillisecond); 2007 }
2002 2008 }
2003 // Execution time of the script adjusted by it's measurement period to make scripts started at
2004 // different times comparable.
2005// float adjustedExecutionTime
2006// = (float)si.MeasurementPeriodExecutionTime
2007// / ((float)(tickNow - si.MeasurementPeriodTickStart) / ScriptInstance.MaxMeasurementPeriod)
2008// / TimeSpan.TicksPerMillisecond;
2009
2010 long ticksElapsed = tickNow - si.MeasurementPeriodTickStart;
2011
2012 // Avoid divide by zerp
2013 if (ticksElapsed == 0)
2014 ticksElapsed = 1;
2015 2009
2016 // Scale execution time to the ideal 55 fps frame time for these reasons. 2010 return topScripts;
2017 // 2011 }
2018 // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no
2019 // 'script execution time per frame', which is the original purpose of this value.
2020 //
2021 // 2) Giving the raw execution times is misleading since scripts start at different times, making
2022 // it impossible to compare scripts.
2023 //
2024 // 3) Scaling the raw execution time to the time that the script has been running is better but
2025 // is still misleading since a script that has just been rezzed may appear to have been running
2026 // for much longer.
2027 //
2028 // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect
2029 // since the figure does not represent actual execution time and very hard running scripts will
2030 // never exceed 18ms (though this is a very high number for script execution so is a warning sign).
2031 float adjustedExecutionTime
2032 = ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f;
2033 2012
2034 topScripts[si.RootLocalID] += adjustedExecutionTime; 2013 public float GetScriptExecutionTime(List<UUID> itemIDs)
2014 {
2015 if (itemIDs == null|| itemIDs.Count == 0)
2016 {
2017 return 0.0f;
2018 }
2019 float time = 0.0f;
2020 long tickNow = Util.EnvironmentTickCount();
2021 IScriptInstance si;
2022 // Calculate the time for all scripts that this engine is executing
2023 // Ignore any others
2024 foreach (UUID id in itemIDs)
2025 {
2026 si = GetInstance(id);
2027 if (si != null && si.Running)
2028 {
2029 time += CalculateAdjustedExectionTime(si, tickNow);
2035 } 2030 }
2036 } 2031 }
2032 return time;
2033 }
2037 2034
2038 return topScripts; 2035 private float CalculateAdjustedExectionTime(IScriptInstance si, long tickNow)
2036 {
2037 long ticksElapsed = tickNow - si.MeasurementPeriodTickStart;
2038
2039 // Avoid divide by zero
2040 if (ticksElapsed == 0)
2041 ticksElapsed = 1;
2042
2043 // Scale execution time to the ideal 55 fps frame time for these reasons.
2044 //
2045 // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no
2046 // 'script execution time per frame', which is the original purpose of this value.
2047 //
2048 // 2) Giving the raw execution times is misleading since scripts start at different times, making
2049 // it impossible to compare scripts.
2050 //
2051 // 3) Scaling the raw execution time to the time that the script has been running is better but
2052 // is still misleading since a script that has just been rezzed may appear to have been running
2053 // for much longer.
2054 //
2055 // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect
2056 // since the figure does not represent actual execution time and very hard running scripts will
2057 // never exceed 18ms (though this is a very high number for script execution so is a warning sign).
2058 return ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f;
2039 } 2059 }
2040 2060
2041 public void SuspendScript(UUID itemID) 2061 public void SuspendScript(UUID itemID)