diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation')
7 files changed, 418 insertions, 228 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs index 6879ebb..1e19032 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs | |||
@@ -37,6 +37,8 @@ using OpenSim.Region.ScriptEngine.Interfaces; | |||
37 | using OpenSim.Region.ScriptEngine.Shared; | 37 | using OpenSim.Region.ScriptEngine.Shared; |
38 | using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; | 38 | using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; |
39 | using Timer=OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer; | 39 | using Timer=OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer; |
40 | using System.Reflection; | ||
41 | using log4net; | ||
40 | 42 | ||
41 | namespace OpenSim.Region.ScriptEngine.Shared.Api | 43 | namespace OpenSim.Region.ScriptEngine.Shared.Api |
42 | { | 44 | { |
@@ -45,15 +47,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
45 | /// </summary> | 47 | /// </summary> |
46 | public class AsyncCommandManager | 48 | public class AsyncCommandManager |
47 | { | 49 | { |
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
51 | |||
48 | private static Thread cmdHandlerThread; | 52 | private static Thread cmdHandlerThread; |
49 | private static int cmdHandlerThreadCycleSleepms; | 53 | private static int cmdHandlerThreadCycleSleepms; |
50 | 54 | ||
51 | private static List<IScene> m_Scenes = new List<IScene>(); | 55 | /// <summary> |
56 | /// Lock for reading/writing static components of AsyncCommandManager. | ||
57 | /// </summary> | ||
58 | /// <remarks> | ||
59 | /// This lock exists so that multiple threads from different engines and/or different copies of the same engine | ||
60 | /// are prevented from running non-thread safe code (e.g. read/write of lists) concurrently. | ||
61 | /// </remarks> | ||
62 | private static object staticLock = new object(); | ||
63 | |||
52 | private static List<IScriptEngine> m_ScriptEngines = | 64 | private static List<IScriptEngine> m_ScriptEngines = |
53 | new List<IScriptEngine>(); | 65 | new List<IScriptEngine>(); |
54 | 66 | ||
55 | public IScriptEngine m_ScriptEngine; | 67 | public IScriptEngine m_ScriptEngine; |
56 | private IScene m_Scene; | ||
57 | 68 | ||
58 | private static Dictionary<IScriptEngine, Dataserver> m_Dataserver = | 69 | private static Dictionary<IScriptEngine, Dataserver> m_Dataserver = |
59 | new Dictionary<IScriptEngine, Dataserver>(); | 70 | new Dictionary<IScriptEngine, Dataserver>(); |
@@ -70,67 +81,99 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
70 | 81 | ||
71 | public Dataserver DataserverPlugin | 82 | public Dataserver DataserverPlugin |
72 | { | 83 | { |
73 | get { return m_Dataserver[m_ScriptEngine]; } | 84 | get |
85 | { | ||
86 | lock (staticLock) | ||
87 | return m_Dataserver[m_ScriptEngine]; | ||
88 | } | ||
74 | } | 89 | } |
75 | 90 | ||
76 | public Timer TimerPlugin | 91 | public Timer TimerPlugin |
77 | { | 92 | { |
78 | get { return m_Timer[m_ScriptEngine]; } | 93 | get |
94 | { | ||
95 | lock (staticLock) | ||
96 | return m_Timer[m_ScriptEngine]; | ||
97 | } | ||
79 | } | 98 | } |
80 | 99 | ||
81 | public HttpRequest HttpRequestPlugin | 100 | public HttpRequest HttpRequestPlugin |
82 | { | 101 | { |
83 | get { return m_HttpRequest[m_ScriptEngine]; } | 102 | get |
103 | { | ||
104 | lock (staticLock) | ||
105 | return m_HttpRequest[m_ScriptEngine]; | ||
106 | } | ||
84 | } | 107 | } |
85 | 108 | ||
86 | public Listener ListenerPlugin | 109 | public Listener ListenerPlugin |
87 | { | 110 | { |
88 | get { return m_Listener[m_ScriptEngine]; } | 111 | get |
112 | { | ||
113 | lock (staticLock) | ||
114 | return m_Listener[m_ScriptEngine]; | ||
115 | } | ||
89 | } | 116 | } |
90 | 117 | ||
91 | public SensorRepeat SensorRepeatPlugin | 118 | public SensorRepeat SensorRepeatPlugin |
92 | { | 119 | { |
93 | get { return m_SensorRepeat[m_ScriptEngine]; } | 120 | get |
121 | { | ||
122 | lock (staticLock) | ||
123 | return m_SensorRepeat[m_ScriptEngine]; | ||
124 | } | ||
94 | } | 125 | } |
95 | 126 | ||
96 | public XmlRequest XmlRequestPlugin | 127 | public XmlRequest XmlRequestPlugin |
97 | { | 128 | { |
98 | get { return m_XmlRequest[m_ScriptEngine]; } | 129 | get |
130 | { | ||
131 | lock (staticLock) | ||
132 | return m_XmlRequest[m_ScriptEngine]; | ||
133 | } | ||
99 | } | 134 | } |
100 | 135 | ||
101 | public IScriptEngine[] ScriptEngines | 136 | public IScriptEngine[] ScriptEngines |
102 | { | 137 | { |
103 | get { return m_ScriptEngines.ToArray(); } | 138 | get |
139 | { | ||
140 | lock (staticLock) | ||
141 | return m_ScriptEngines.ToArray(); | ||
142 | } | ||
104 | } | 143 | } |
105 | 144 | ||
106 | public AsyncCommandManager(IScriptEngine _ScriptEngine) | 145 | public AsyncCommandManager(IScriptEngine _ScriptEngine) |
107 | { | 146 | { |
108 | m_ScriptEngine = _ScriptEngine; | 147 | m_ScriptEngine = _ScriptEngine; |
109 | m_Scene = m_ScriptEngine.World; | 148 | |
110 | 149 | // If there is more than one scene in the simulator or multiple script engines are used on the same region | |
111 | if (m_Scenes.Count == 0) | 150 | // then more than one thread could arrive at this block of code simultaneously. However, it cannot be |
112 | ReadConfig(); | 151 | // executed concurrently both because concurrent list operations are not thread-safe and because of other |
113 | 152 | // race conditions such as the later check of cmdHandlerThread == null. | |
114 | if (!m_Scenes.Contains(m_Scene)) | 153 | lock (staticLock) |
115 | m_Scenes.Add(m_Scene); | 154 | { |
116 | if (!m_ScriptEngines.Contains(m_ScriptEngine)) | 155 | if (m_ScriptEngines.Count == 0) |
117 | m_ScriptEngines.Add(m_ScriptEngine); | 156 | ReadConfig(); |
118 | 157 | ||
119 | // Create instances of all plugins | 158 | if (!m_ScriptEngines.Contains(m_ScriptEngine)) |
120 | if (!m_Dataserver.ContainsKey(m_ScriptEngine)) | 159 | m_ScriptEngines.Add(m_ScriptEngine); |
121 | m_Dataserver[m_ScriptEngine] = new Dataserver(this); | 160 | |
122 | if (!m_Timer.ContainsKey(m_ScriptEngine)) | 161 | // Create instances of all plugins |
123 | m_Timer[m_ScriptEngine] = new Timer(this); | 162 | if (!m_Dataserver.ContainsKey(m_ScriptEngine)) |
124 | if (!m_HttpRequest.ContainsKey(m_ScriptEngine)) | 163 | m_Dataserver[m_ScriptEngine] = new Dataserver(this); |
125 | m_HttpRequest[m_ScriptEngine] = new HttpRequest(this); | 164 | if (!m_Timer.ContainsKey(m_ScriptEngine)) |
126 | if (!m_Listener.ContainsKey(m_ScriptEngine)) | 165 | m_Timer[m_ScriptEngine] = new Timer(this); |
127 | m_Listener[m_ScriptEngine] = new Listener(this); | 166 | if (!m_HttpRequest.ContainsKey(m_ScriptEngine)) |
128 | if (!m_SensorRepeat.ContainsKey(m_ScriptEngine)) | 167 | m_HttpRequest[m_ScriptEngine] = new HttpRequest(this); |
129 | m_SensorRepeat[m_ScriptEngine] = new SensorRepeat(this); | 168 | if (!m_Listener.ContainsKey(m_ScriptEngine)) |
130 | if (!m_XmlRequest.ContainsKey(m_ScriptEngine)) | 169 | m_Listener[m_ScriptEngine] = new Listener(this); |
131 | m_XmlRequest[m_ScriptEngine] = new XmlRequest(this); | 170 | if (!m_SensorRepeat.ContainsKey(m_ScriptEngine)) |
132 | 171 | m_SensorRepeat[m_ScriptEngine] = new SensorRepeat(this); | |
133 | StartThread(); | 172 | if (!m_XmlRequest.ContainsKey(m_ScriptEngine)) |
173 | m_XmlRequest[m_ScriptEngine] = new XmlRequest(this); | ||
174 | |||
175 | StartThread(); | ||
176 | } | ||
134 | } | 177 | } |
135 | 178 | ||
136 | private static void StartThread() | 179 | private static void StartThread() |
@@ -179,42 +222,43 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
179 | { | 222 | { |
180 | try | 223 | try |
181 | { | 224 | { |
182 | while (true) | 225 | Thread.Sleep(cmdHandlerThreadCycleSleepms); |
183 | { | ||
184 | Thread.Sleep(cmdHandlerThreadCycleSleepms); | ||
185 | 226 | ||
186 | DoOneCmdHandlerPass(); | 227 | DoOneCmdHandlerPass(); |
187 | 228 | ||
188 | Watchdog.UpdateThread(); | 229 | Watchdog.UpdateThread(); |
189 | } | ||
190 | } | 230 | } |
191 | catch | 231 | catch (Exception e) |
192 | { | 232 | { |
233 | m_log.Error("[ASYNC COMMAND MANAGER]: Exception in command handler pass: ", e); | ||
193 | } | 234 | } |
194 | } | 235 | } |
195 | } | 236 | } |
196 | 237 | ||
197 | private static void DoOneCmdHandlerPass() | 238 | private static void DoOneCmdHandlerPass() |
198 | { | 239 | { |
199 | // Check HttpRequests | 240 | lock (staticLock) |
200 | m_HttpRequest[m_ScriptEngines[0]].CheckHttpRequests(); | 241 | { |
242 | // Check HttpRequests | ||
243 | m_HttpRequest[m_ScriptEngines[0]].CheckHttpRequests(); | ||
201 | 244 | ||
202 | // Check XMLRPCRequests | 245 | // Check XMLRPCRequests |
203 | m_XmlRequest[m_ScriptEngines[0]].CheckXMLRPCRequests(); | 246 | m_XmlRequest[m_ScriptEngines[0]].CheckXMLRPCRequests(); |
204 | 247 | ||
205 | foreach (IScriptEngine s in m_ScriptEngines) | 248 | foreach (IScriptEngine s in m_ScriptEngines) |
206 | { | 249 | { |
207 | // Check Listeners | 250 | // Check Listeners |
208 | m_Listener[s].CheckListeners(); | 251 | m_Listener[s].CheckListeners(); |
209 | 252 | ||
210 | // Check timers | 253 | // Check timers |
211 | m_Timer[s].CheckTimerEvents(); | 254 | m_Timer[s].CheckTimerEvents(); |
212 | 255 | ||
213 | // Check Sensors | 256 | // Check Sensors |
214 | m_SensorRepeat[s].CheckSenseRepeaterEvents(); | 257 | m_SensorRepeat[s].CheckSenseRepeaterEvents(); |
215 | 258 | ||
216 | // Check dataserver | 259 | // Check dataserver |
217 | m_Dataserver[s].ExpireRequests(); | 260 | m_Dataserver[s].ExpireRequests(); |
261 | } | ||
218 | } | 262 | } |
219 | } | 263 | } |
220 | 264 | ||
@@ -226,31 +270,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
226 | public static void RemoveScript(IScriptEngine engine, uint localID, UUID itemID) | 270 | public static void RemoveScript(IScriptEngine engine, uint localID, UUID itemID) |
227 | { | 271 | { |
228 | // Remove a specific script | 272 | // Remove a specific script |
273 | // m_log.DebugFormat("[ASYNC COMMAND MANAGER]: Removing facilities for script {0}", itemID); | ||
229 | 274 | ||
230 | // Remove dataserver events | 275 | lock (staticLock) |
231 | m_Dataserver[engine].RemoveEvents(localID, itemID); | 276 | { |
277 | // Remove dataserver events | ||
278 | m_Dataserver[engine].RemoveEvents(localID, itemID); | ||
232 | 279 | ||
233 | // Remove from: Timers | 280 | // Remove from: Timers |
234 | m_Timer[engine].UnSetTimerEvents(localID, itemID); | 281 | m_Timer[engine].UnSetTimerEvents(localID, itemID); |
235 | 282 | ||
236 | // Remove from: HttpRequest | 283 | // Remove from: HttpRequest |
237 | IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface<IHttpRequestModule>(); | 284 | IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface<IHttpRequestModule>(); |
238 | if (iHttpReq != null) | 285 | if (iHttpReq != null) |
239 | iHttpReq.StopHttpRequest(localID, itemID); | 286 | iHttpReq.StopHttpRequest(localID, itemID); |
240 | 287 | ||
241 | IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>(); | 288 | IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>(); |
242 | if (comms != null) | 289 | if (comms != null) |
243 | comms.DeleteListener(itemID); | 290 | comms.DeleteListener(itemID); |
244 | 291 | ||
245 | IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>(); | 292 | IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>(); |
246 | if (xmlrpc != null) | 293 | if (xmlrpc != null) |
247 | { | 294 | { |
248 | xmlrpc.DeleteChannels(itemID); | 295 | xmlrpc.DeleteChannels(itemID); |
249 | xmlrpc.CancelSRDRequests(itemID); | 296 | xmlrpc.CancelSRDRequests(itemID); |
250 | } | 297 | } |
251 | 298 | ||
252 | // Remove Sensors | 299 | // Remove Sensors |
253 | m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID); | 300 | m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID); |
301 | } | ||
254 | } | 302 | } |
255 | 303 | ||
256 | /// <summary> | 304 | /// <summary> |
@@ -260,10 +308,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
260 | /// <returns></returns> | 308 | /// <returns></returns> |
261 | public static SensorRepeat GetSensorRepeatPlugin(IScriptEngine engine) | 309 | public static SensorRepeat GetSensorRepeatPlugin(IScriptEngine engine) |
262 | { | 310 | { |
263 | if (m_SensorRepeat.ContainsKey(engine)) | 311 | lock (staticLock) |
264 | return m_SensorRepeat[engine]; | 312 | { |
265 | else | 313 | if (m_SensorRepeat.ContainsKey(engine)) |
266 | return null; | 314 | return m_SensorRepeat[engine]; |
315 | else | ||
316 | return null; | ||
317 | } | ||
267 | } | 318 | } |
268 | 319 | ||
269 | /// <summary> | 320 | /// <summary> |
@@ -273,10 +324,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
273 | /// <returns></returns> | 324 | /// <returns></returns> |
274 | public static Dataserver GetDataserverPlugin(IScriptEngine engine) | 325 | public static Dataserver GetDataserverPlugin(IScriptEngine engine) |
275 | { | 326 | { |
276 | if (m_Dataserver.ContainsKey(engine)) | 327 | lock (staticLock) |
277 | return m_Dataserver[engine]; | 328 | { |
278 | else | 329 | if (m_Dataserver.ContainsKey(engine)) |
279 | return null; | 330 | return m_Dataserver[engine]; |
331 | else | ||
332 | return null; | ||
333 | } | ||
280 | } | 334 | } |
281 | 335 | ||
282 | /// <summary> | 336 | /// <summary> |
@@ -286,10 +340,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
286 | /// <returns></returns> | 340 | /// <returns></returns> |
287 | public static Timer GetTimerPlugin(IScriptEngine engine) | 341 | public static Timer GetTimerPlugin(IScriptEngine engine) |
288 | { | 342 | { |
289 | if (m_Timer.ContainsKey(engine)) | 343 | lock (staticLock) |
290 | return m_Timer[engine]; | 344 | { |
291 | else | 345 | if (m_Timer.ContainsKey(engine)) |
292 | return null; | 346 | return m_Timer[engine]; |
347 | else | ||
348 | return null; | ||
349 | } | ||
293 | } | 350 | } |
294 | 351 | ||
295 | /// <summary> | 352 | /// <summary> |
@@ -299,10 +356,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
299 | /// <returns></returns> | 356 | /// <returns></returns> |
300 | public static Listener GetListenerPlugin(IScriptEngine engine) | 357 | public static Listener GetListenerPlugin(IScriptEngine engine) |
301 | { | 358 | { |
302 | if (m_Listener.ContainsKey(engine)) | 359 | lock (staticLock) |
303 | return m_Listener[engine]; | 360 | { |
304 | else | 361 | if (m_Listener.ContainsKey(engine)) |
305 | return null; | 362 | return m_Listener[engine]; |
363 | else | ||
364 | return null; | ||
365 | } | ||
306 | } | 366 | } |
307 | 367 | ||
308 | public static void StateChange(IScriptEngine engine, uint localID, UUID itemID) | 368 | public static void StateChange(IScriptEngine engine, uint localID, UUID itemID) |
@@ -332,28 +392,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
332 | { | 392 | { |
333 | List<Object> data = new List<Object>(); | 393 | List<Object> data = new List<Object>(); |
334 | 394 | ||
335 | Object[] listeners = m_Listener[engine].GetSerializationData(itemID); | 395 | lock (staticLock) |
336 | if (listeners.Length > 0) | ||
337 | { | 396 | { |
338 | data.Add("listener"); | 397 | Object[] listeners = m_Listener[engine].GetSerializationData(itemID); |
339 | data.Add(listeners.Length); | 398 | if (listeners.Length > 0) |
340 | data.AddRange(listeners); | 399 | { |
341 | } | 400 | data.Add("listener"); |
401 | data.Add(listeners.Length); | ||
402 | data.AddRange(listeners); | ||
403 | } | ||
342 | 404 | ||
343 | Object[] timers=m_Timer[engine].GetSerializationData(itemID); | 405 | Object[] timers=m_Timer[engine].GetSerializationData(itemID); |
344 | if (timers.Length > 0) | 406 | if (timers.Length > 0) |
345 | { | 407 | { |
346 | data.Add("timer"); | 408 | data.Add("timer"); |
347 | data.Add(timers.Length); | 409 | data.Add(timers.Length); |
348 | data.AddRange(timers); | 410 | data.AddRange(timers); |
349 | } | 411 | } |
350 | 412 | ||
351 | Object[] sensors = m_SensorRepeat[engine].GetSerializationData(itemID); | 413 | Object[] sensors = m_SensorRepeat[engine].GetSerializationData(itemID); |
352 | if (sensors.Length > 0) | 414 | if (sensors.Length > 0) |
353 | { | 415 | { |
354 | data.Add("sensor"); | 416 | data.Add("sensor"); |
355 | data.Add(sensors.Length); | 417 | data.Add(sensors.Length); |
356 | data.AddRange(sensors); | 418 | data.AddRange(sensors); |
419 | } | ||
357 | } | 420 | } |
358 | 421 | ||
359 | return data.ToArray(); | 422 | return data.ToArray(); |
@@ -378,41 +441,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
378 | 441 | ||
379 | idx+=len; | 442 | idx+=len; |
380 | 443 | ||
444 | lock (staticLock) | ||
445 | { | ||
381 | switch (type) | 446 | switch (type) |
382 | { | 447 | { |
383 | case "listener": | 448 | case "listener": |
384 | m_Listener[engine].CreateFromData(localID, itemID, | 449 | m_Listener[engine].CreateFromData(localID, itemID, |
385 | hostID, item); | 450 | hostID, item); |
386 | break; | 451 | break; |
387 | case "timer": | 452 | case "timer": |
388 | m_Timer[engine].CreateFromData(localID, itemID, | 453 | m_Timer[engine].CreateFromData(localID, itemID, |
389 | hostID, item); | 454 | hostID, item); |
390 | break; | 455 | break; |
391 | case "sensor": | 456 | case "sensor": |
392 | m_SensorRepeat[engine].CreateFromData(localID, | 457 | m_SensorRepeat[engine].CreateFromData(localID, |
393 | itemID, hostID, item); | 458 | itemID, hostID, item); |
394 | break; | 459 | break; |
460 | } | ||
395 | } | 461 | } |
396 | } | 462 | } |
397 | } | 463 | } |
398 | } | 464 | } |
399 | |||
400 | #region Check llRemoteData channels | ||
401 | |||
402 | #endregion | ||
403 | |||
404 | #region Check llListeners | ||
405 | |||
406 | #endregion | ||
407 | |||
408 | /// <summary> | ||
409 | /// If set to true then threads and stuff should try to make a graceful exit | ||
410 | /// </summary> | ||
411 | public bool PleaseShutdown | ||
412 | { | ||
413 | get { return _PleaseShutdown; } | ||
414 | set { _PleaseShutdown = value; } | ||
415 | } | ||
416 | private bool _PleaseShutdown = false; | ||
417 | } | 465 | } |
418 | } | 466 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 3f0af6d..916d841 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -1664,6 +1664,75 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1664 | m_host.SetFaceColorAlpha(face, color, null); | 1664 | m_host.SetFaceColorAlpha(face, color, null); |
1665 | } | 1665 | } |
1666 | 1666 | ||
1667 | /* | ||
1668 | public void llSetContentType(LSL_Key id, LSL_Integer type) | ||
1669 | { | ||
1670 | m_host.AddScriptLPS(1); | ||
1671 | |||
1672 | if (m_UrlModule == null) | ||
1673 | return; | ||
1674 | |||
1675 | // Make sure the content type is text/plain to start with | ||
1676 | m_UrlModule.HttpContentType(new UUID(id), "text/plain"); | ||
1677 | |||
1678 | // Is the object owner online and in the region | ||
1679 | ScenePresence agent = World.GetScenePresence(m_host.ParentGroup.OwnerID); | ||
1680 | if (agent == null || agent.IsChildAgent) | ||
1681 | return; // Fail if the owner is not in the same region | ||
1682 | |||
1683 | // Is it the embeded browser? | ||
1684 | string userAgent = m_UrlModule.GetHttpHeader(new UUID(id), "user-agent"); | ||
1685 | if (userAgent.IndexOf("SecondLife") < 0) | ||
1686 | return; // Not the embedded browser. Is this check good enough? | ||
1687 | |||
1688 | // Use the IP address of the client and check against the request | ||
1689 | // seperate logins from the same IP will allow all of them to get non-text/plain as long | ||
1690 | // as the owner is in the region. Same as SL! | ||
1691 | string logonFromIPAddress = agent.ControllingClient.RemoteEndPoint.Address.ToString(); | ||
1692 | string requestFromIPAddress = m_UrlModule.GetHttpHeader(new UUID(id), "remote_addr"); | ||
1693 | //m_log.Debug("IP from header='" + requestFromIPAddress + "' IP from endpoint='" + logonFromIPAddress + "'"); | ||
1694 | if (requestFromIPAddress == null || requestFromIPAddress.Trim() == "") | ||
1695 | return; | ||
1696 | if (logonFromIPAddress == null || logonFromIPAddress.Trim() == "") | ||
1697 | return; | ||
1698 | |||
1699 | // If the request isnt from the same IP address then the request cannot be from the owner | ||
1700 | if (!requestFromIPAddress.Trim().Equals(logonFromIPAddress.Trim())) | ||
1701 | return; | ||
1702 | |||
1703 | switch (type) | ||
1704 | { | ||
1705 | case ScriptBaseClass.CONTENT_TYPE_HTML: | ||
1706 | m_UrlModule.HttpContentType(new UUID(id), "text/html"); | ||
1707 | break; | ||
1708 | case ScriptBaseClass.CONTENT_TYPE_XML: | ||
1709 | m_UrlModule.HttpContentType(new UUID(id), "application/xml"); | ||
1710 | break; | ||
1711 | case ScriptBaseClass.CONTENT_TYPE_XHTML: | ||
1712 | m_UrlModule.HttpContentType(new UUID(id), "application/xhtml+xml"); | ||
1713 | break; | ||
1714 | case ScriptBaseClass.CONTENT_TYPE_ATOM: | ||
1715 | m_UrlModule.HttpContentType(new UUID(id), "application/atom+xml"); | ||
1716 | break; | ||
1717 | case ScriptBaseClass.CONTENT_TYPE_JSON: | ||
1718 | m_UrlModule.HttpContentType(new UUID(id), "application/json"); | ||
1719 | break; | ||
1720 | case ScriptBaseClass.CONTENT_TYPE_LLSD: | ||
1721 | m_UrlModule.HttpContentType(new UUID(id), "application/llsd+xml"); | ||
1722 | break; | ||
1723 | case ScriptBaseClass.CONTENT_TYPE_FORM: | ||
1724 | m_UrlModule.HttpContentType(new UUID(id), "application/x-www-form-urlencoded"); | ||
1725 | break; | ||
1726 | case ScriptBaseClass.CONTENT_TYPE_RSS: | ||
1727 | m_UrlModule.HttpContentType(new UUID(id), "application/rss+xml"); | ||
1728 | break; | ||
1729 | default: | ||
1730 | m_UrlModule.HttpContentType(new UUID(id), "text/plain"); | ||
1731 | break; | ||
1732 | } | ||
1733 | } | ||
1734 | */ | ||
1735 | |||
1667 | public void SetTexGen(SceneObjectPart part, int face,int style) | 1736 | public void SetTexGen(SceneObjectPart part, int face,int style) |
1668 | { | 1737 | { |
1669 | if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) | 1738 | if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) |
@@ -2772,9 +2841,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2772 | // send the sound, once, to all clients in range | 2841 | // send the sound, once, to all clients in range |
2773 | if (m_SoundModule != null) | 2842 | if (m_SoundModule != null) |
2774 | { | 2843 | { |
2775 | m_SoundModule.SendSound(m_host.UUID, | 2844 | m_SoundModule.SendSound( |
2776 | ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), volume, false, 0, | 2845 | m_host.UUID, |
2777 | 0, false, false); | 2846 | ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), |
2847 | volume, false, m_host.SoundQueueing ? (byte)SoundFlags.Queue : (byte)SoundFlags.None, | ||
2848 | 0, false, false); | ||
2778 | } | 2849 | } |
2779 | } | 2850 | } |
2780 | 2851 | ||
@@ -3176,46 +3247,41 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3176 | // need the magnitude later | 3247 | // need the magnitude later |
3177 | // float velmag = (float)Util.GetMagnitude(llvel); | 3248 | // float velmag = (float)Util.GetMagnitude(llvel); |
3178 | 3249 | ||
3179 | SceneObjectGroup new_group = World.RezObject(m_host, item, pos, rot, vel, param); | 3250 | List<SceneObjectGroup> new_groups = World.RezObject(m_host, item, pos, rot, vel, param); |
3180 | 3251 | ||
3181 | // If either of these are null, then there was an unknown error. | 3252 | // If either of these are null, then there was an unknown error. |
3182 | if (new_group == null) | 3253 | if (new_groups == null) |
3183 | return; | 3254 | return; |
3184 | 3255 | ||
3185 | // objects rezzed with this method are die_at_edge by default. | 3256 | foreach (SceneObjectGroup group in new_groups) |
3186 | new_group.RootPart.SetDieAtEdge(true); | 3257 | { |
3187 | 3258 | // objects rezzed with this method are die_at_edge by default. | |
3188 | new_group.ResumeScripts(); | 3259 | group.RootPart.SetDieAtEdge(true); |
3189 | 3260 | ||
3190 | m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams( | 3261 | group.ResumeScripts(); |
3191 | "object_rez", new Object[] { | ||
3192 | new LSL_String( | ||
3193 | new_group.RootPart.UUID.ToString()) }, | ||
3194 | new DetectParams[0])); | ||
3195 | 3262 | ||
3196 | // do recoil | 3263 | m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams( |
3197 | SceneObjectGroup hostgrp = m_host.ParentGroup; | 3264 | "object_rez", new Object[] { |
3198 | if (hostgrp == null) | 3265 | new LSL_String( |
3199 | return; | 3266 | group.RootPart.UUID.ToString()) }, |
3267 | new DetectParams[0])); | ||
3200 | 3268 | ||
3201 | if (hostgrp.IsAttachment) // don't recoil avatars | 3269 | float groupmass = group.GetMass(); |
3202 | return; | ||
3203 | 3270 | ||
3204 | PhysicsActor pa = new_group.RootPart.PhysActor; | 3271 | PhysicsActor pa = group.RootPart.PhysActor; |
3205 | 3272 | ||
3206 | //Recoil. | 3273 | //Recoil. |
3207 | if (pa != null && pa.IsPhysical && (Vector3)vel != Vector3.Zero) | 3274 | if (pa != null && pa.IsPhysical && (Vector3)vel != Vector3.Zero) |
3208 | { | ||
3209 | float groupmass = new_group.GetMass(); | ||
3210 | Vector3 recoil = -vel * groupmass * m_recoilScaleFactor; | ||
3211 | if (recoil != Vector3.Zero) | ||
3212 | { | 3275 | { |
3213 | llApplyImpulse(recoil, 0); | 3276 | Vector3 recoil = -vel * groupmass * m_recoilScaleFactor; |
3277 | if (recoil != Vector3.Zero) | ||
3278 | { | ||
3279 | llApplyImpulse(recoil, 0); | ||
3280 | } | ||
3214 | } | 3281 | } |
3282 | // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay) | ||
3215 | } | 3283 | } |
3216 | // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay) | ||
3217 | return; | 3284 | return; |
3218 | |||
3219 | }); | 3285 | }); |
3220 | 3286 | ||
3221 | //ScriptSleep((int)((groupmass * velmag) / 10)); | 3287 | //ScriptSleep((int)((groupmass * velmag) / 10)); |
@@ -4746,6 +4812,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4746 | UUID av = new UUID(); | 4812 | UUID av = new UUID(); |
4747 | if (!UUID.TryParse(agent,out av)) | 4813 | if (!UUID.TryParse(agent,out av)) |
4748 | { | 4814 | { |
4815 | LSLError("First parameter to llTextBox needs to be a key"); | ||
4749 | return; | 4816 | return; |
4750 | } | 4817 | } |
4751 | 4818 | ||
@@ -5108,6 +5175,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5108 | 5175 | ||
5109 | s = Math.Cos(angle * 0.5); | 5176 | s = Math.Cos(angle * 0.5); |
5110 | t = Math.Sin(angle * 0.5); // temp value to avoid 2 more sin() calcs | 5177 | t = Math.Sin(angle * 0.5); // temp value to avoid 2 more sin() calcs |
5178 | axis = LSL_Vector.Norm(axis); | ||
5111 | x = axis.x * t; | 5179 | x = axis.x * t; |
5112 | y = axis.y * t; | 5180 | y = axis.y * t; |
5113 | z = axis.z * t; | 5181 | z = axis.z * t; |
@@ -5115,41 +5183,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5115 | return new LSL_Rotation(x,y,z,s); | 5183 | return new LSL_Rotation(x,y,z,s); |
5116 | } | 5184 | } |
5117 | 5185 | ||
5118 | 5186 | /// <summary> | |
5119 | // Xantor 29/apr/2008 | 5187 | /// Returns the axis of rotation for a quaternion |
5120 | // converts a Quaternion to X,Y,Z axis rotations | 5188 | /// </summary> |
5189 | /// <returns></returns> | ||
5190 | /// <param name='rot'></param> | ||
5121 | public LSL_Vector llRot2Axis(LSL_Rotation rot) | 5191 | public LSL_Vector llRot2Axis(LSL_Rotation rot) |
5122 | { | 5192 | { |
5123 | m_host.AddScriptLPS(1); | 5193 | m_host.AddScriptLPS(1); |
5124 | double x,y,z; | ||
5125 | 5194 | ||
5126 | if (rot.s > 1) // normalization needed | 5195 | if (Math.Abs(rot.s) > 1) // normalization needed |
5127 | { | 5196 | rot.Normalize(); |
5128 | double length = Math.Sqrt(rot.x * rot.x + rot.y * rot.y + | ||
5129 | rot.z * rot.z + rot.s * rot.s); | ||
5130 | |||
5131 | rot.x /= length; | ||
5132 | rot.y /= length; | ||
5133 | rot.z /= length; | ||
5134 | rot.s /= length; | ||
5135 | |||
5136 | } | ||
5137 | 5197 | ||
5138 | // double angle = 2 * Math.Acos(rot.s); | ||
5139 | double s = Math.Sqrt(1 - rot.s * rot.s); | 5198 | double s = Math.Sqrt(1 - rot.s * rot.s); |
5140 | if (s < 0.001) | 5199 | if (s < 0.001) |
5141 | { | 5200 | { |
5142 | x = 1; | 5201 | return new LSL_Vector(1, 0, 0); |
5143 | y = z = 0; | ||
5144 | } | 5202 | } |
5145 | else | 5203 | else |
5146 | { | 5204 | { |
5147 | x = rot.x / s; // normalise axis | 5205 | double invS = 1.0 / s; |
5148 | y = rot.y / s; | 5206 | if (rot.s < 0) invS = -invS; |
5149 | z = rot.z / s; | 5207 | return new LSL_Vector(rot.x * invS, rot.y * invS, rot.z * invS); |
5150 | } | 5208 | } |
5151 | |||
5152 | return new LSL_Vector(x,y,z); | ||
5153 | } | 5209 | } |
5154 | 5210 | ||
5155 | 5211 | ||
@@ -5158,18 +5214,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5158 | { | 5214 | { |
5159 | m_host.AddScriptLPS(1); | 5215 | m_host.AddScriptLPS(1); |
5160 | 5216 | ||
5161 | if (rot.s > 1) // normalization needed | 5217 | if (Math.Abs(rot.s) > 1) // normalization needed |
5162 | { | 5218 | rot.Normalize(); |
5163 | double length = Math.Sqrt(rot.x * rot.x + rot.y * rot.y + | ||
5164 | rot.z * rot.z + rot.s * rot.s); | ||
5165 | |||
5166 | rot.x /= length; | ||
5167 | rot.y /= length; | ||
5168 | rot.z /= length; | ||
5169 | rot.s /= length; | ||
5170 | } | ||
5171 | 5219 | ||
5172 | double angle = 2 * Math.Acos(rot.s); | 5220 | double angle = 2 * Math.Acos(rot.s); |
5221 | if (angle > Math.PI) | ||
5222 | angle = 2 * Math.PI - angle; | ||
5173 | 5223 | ||
5174 | return angle; | 5224 | return angle; |
5175 | } | 5225 | } |
@@ -6687,7 +6737,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6687 | PSYS_SRC_TARGET_KEY = 20, | 6737 | PSYS_SRC_TARGET_KEY = 20, |
6688 | PSYS_SRC_OMEGA = 21, | 6738 | PSYS_SRC_OMEGA = 21, |
6689 | PSYS_SRC_ANGLE_BEGIN = 22, | 6739 | PSYS_SRC_ANGLE_BEGIN = 22, |
6690 | PSYS_SRC_ANGLE_END = 23 | 6740 | PSYS_SRC_ANGLE_END = 23, |
6741 | PSYS_PART_BLEND_FUNC_SOURCE = 24, | ||
6742 | PSYS_PART_BLEND_FUNC_DEST = 25, | ||
6743 | PSYS_PART_START_GLOW = 26, | ||
6744 | PSYS_PART_END_GLOW = 27 | ||
6691 | } | 6745 | } |
6692 | 6746 | ||
6693 | internal Primitive.ParticleSystem.ParticleDataFlags ConvertUINTtoFlags(uint flags) | 6747 | internal Primitive.ParticleSystem.ParticleDataFlags ConvertUINTtoFlags(uint flags) |
@@ -6713,6 +6767,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6713 | ps.BurstRate = 0.1f; | 6767 | ps.BurstRate = 0.1f; |
6714 | ps.PartMaxAge = 10.0f; | 6768 | ps.PartMaxAge = 10.0f; |
6715 | ps.BurstPartCount = 1; | 6769 | ps.BurstPartCount = 1; |
6770 | ps.BlendFuncSource = ScriptBaseClass.PSYS_PART_BF_SOURCE_ALPHA; | ||
6771 | ps.BlendFuncDest = ScriptBaseClass.PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA; | ||
6772 | ps.PartStartGlow = 0.0f; | ||
6773 | ps.PartEndGlow = 0.0f; | ||
6774 | |||
6716 | return ps; | 6775 | return ps; |
6717 | } | 6776 | } |
6718 | 6777 | ||
@@ -6747,6 +6806,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6747 | LSL_Vector tempv = new LSL_Vector(); | 6806 | LSL_Vector tempv = new LSL_Vector(); |
6748 | 6807 | ||
6749 | float tempf = 0; | 6808 | float tempf = 0; |
6809 | int tmpi = 0; | ||
6750 | 6810 | ||
6751 | for (int i = 0; i < rules.Length; i += 2) | 6811 | for (int i = 0; i < rules.Length; i += 2) |
6752 | { | 6812 | { |
@@ -6805,7 +6865,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6805 | break; | 6865 | break; |
6806 | 6866 | ||
6807 | case (int)ScriptBaseClass.PSYS_SRC_PATTERN: | 6867 | case (int)ScriptBaseClass.PSYS_SRC_PATTERN: |
6808 | int tmpi = (int)rules.GetLSLIntegerItem(i + 1); | 6868 | tmpi = (int)rules.GetLSLIntegerItem(i + 1); |
6809 | prules.Pattern = (Primitive.ParticleSystem.SourcePattern)tmpi; | 6869 | prules.Pattern = (Primitive.ParticleSystem.SourcePattern)tmpi; |
6810 | break; | 6870 | break; |
6811 | 6871 | ||
@@ -6825,6 +6885,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6825 | prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off. | 6885 | prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off. |
6826 | break; | 6886 | break; |
6827 | 6887 | ||
6888 | case (int)ScriptBaseClass.PSYS_PART_BLEND_FUNC_SOURCE: | ||
6889 | tmpi = (int)rules.GetLSLIntegerItem(i + 1); | ||
6890 | prules.BlendFuncSource = (byte)tmpi; | ||
6891 | break; | ||
6892 | |||
6893 | case (int)ScriptBaseClass.PSYS_PART_BLEND_FUNC_DEST: | ||
6894 | tmpi = (int)rules.GetLSLIntegerItem(i + 1); | ||
6895 | prules.BlendFuncDest = (byte)tmpi; | ||
6896 | break; | ||
6897 | |||
6898 | case (int)ScriptBaseClass.PSYS_PART_START_GLOW: | ||
6899 | tempf = (float)rules.GetLSLFloatItem(i + 1); | ||
6900 | prules.PartStartGlow = (float)tempf; | ||
6901 | break; | ||
6902 | |||
6903 | case (int)ScriptBaseClass.PSYS_PART_END_GLOW: | ||
6904 | tempf = (float)rules.GetLSLFloatItem(i + 1); | ||
6905 | prules.PartEndGlow = (float)tempf; | ||
6906 | break; | ||
6907 | |||
6828 | case (int)ScriptBaseClass.PSYS_SRC_TEXTURE: | 6908 | case (int)ScriptBaseClass.PSYS_SRC_TEXTURE: |
6829 | prules.Texture = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, rules.GetLSLStringItem(i + 1)); | 6909 | prules.Texture = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, rules.GetLSLStringItem(i + 1)); |
6830 | break; | 6910 | break; |
@@ -8255,7 +8335,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8255 | return null; | 8335 | return null; |
8256 | 8336 | ||
8257 | string ph = rules.Data[idx++].ToString(); | 8337 | string ph = rules.Data[idx++].ToString(); |
8258 | parentgrp.ScriptSetPhantomStatus(ph.Equals("1")); | 8338 | part.ParentGroup.ScriptSetPhantomStatus(ph.Equals("1")); |
8259 | 8339 | ||
8260 | break; | 8340 | break; |
8261 | 8341 | ||
@@ -8308,7 +8388,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8308 | return null; | 8388 | return null; |
8309 | string temp = rules.Data[idx++].ToString(); | 8389 | string temp = rules.Data[idx++].ToString(); |
8310 | 8390 | ||
8311 | parentgrp.ScriptSetTemporaryStatus(temp.Equals("1")); | 8391 | part.ParentGroup.ScriptSetTemporaryStatus(temp.Equals("1")); |
8312 | 8392 | ||
8313 | break; | 8393 | break; |
8314 | 8394 | ||
@@ -8846,8 +8926,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8846 | int idx=0; | 8926 | int idx=0; |
8847 | while (idx < rules.Length) | 8927 | while (idx < rules.Length) |
8848 | { | 8928 | { |
8849 | int code=(int)rules.GetLSLIntegerItem(idx++); | 8929 | int code = (int)rules.GetLSLIntegerItem(idx++); |
8850 | int remain=rules.Length-idx; | 8930 | int remain = rules.Length - idx; |
8851 | 8931 | ||
8852 | switch (code) | 8932 | switch (code) |
8853 | { | 8933 | { |
@@ -8920,7 +9000,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8920 | break; | 9000 | break; |
8921 | 9001 | ||
8922 | case ScriptBaseClass.PRIM_TYPE_SCULPT: | 9002 | case ScriptBaseClass.PRIM_TYPE_SCULPT: |
8923 | res.Add(Shape.SculptTexture.ToString()); | 9003 | res.Add(new LSL_String(Shape.SculptTexture.ToString())); |
8924 | res.Add(new LSL_Integer(Shape.SculptType)); | 9004 | res.Add(new LSL_Integer(Shape.SculptType)); |
8925 | break; | 9005 | break; |
8926 | 9006 | ||
@@ -9262,7 +9342,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
9262 | )); | 9342 | )); |
9263 | break; | 9343 | break; |
9264 | case (int)ScriptBaseClass.PRIM_LINK_TARGET: | 9344 | case (int)ScriptBaseClass.PRIM_LINK_TARGET: |
9265 | if(remain < 3) | 9345 | |
9346 | // TODO: Should be issuing a runtime script warning in this case. | ||
9347 | if (remain < 2) | ||
9266 | return null; | 9348 | return null; |
9267 | 9349 | ||
9268 | return rules.GetSublist(idx, -1); | 9350 | return rules.GetSublist(idx, -1); |
@@ -12673,6 +12755,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12673 | public void llSetSoundQueueing(int queue) | 12755 | public void llSetSoundQueueing(int queue) |
12674 | { | 12756 | { |
12675 | m_host.AddScriptLPS(1); | 12757 | m_host.AddScriptLPS(1); |
12758 | |||
12759 | if (m_SoundModule != null) | ||
12760 | m_SoundModule.SetSoundQueueing(m_host.UUID, queue == ScriptBaseClass.TRUE.value); | ||
12676 | } | 12761 | } |
12677 | 12762 | ||
12678 | public void llCollisionSprite(string impact_sprite) | 12763 | public void llCollisionSprite(string impact_sprite) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs index 1d6cb6d..b13a5ae 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs | |||
@@ -434,6 +434,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
434 | } | 434 | } |
435 | return wl; | 435 | return wl; |
436 | } | 436 | } |
437 | |||
437 | /// <summary> | 438 | /// <summary> |
438 | /// Set the current Windlight scene | 439 | /// Set the current Windlight scene |
439 | /// </summary> | 440 | /// </summary> |
@@ -446,13 +447,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
446 | LSShoutError("LightShare functions are not enabled."); | 447 | LSShoutError("LightShare functions are not enabled."); |
447 | return 0; | 448 | return 0; |
448 | } | 449 | } |
449 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) | 450 | |
451 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID)) | ||
450 | { | 452 | { |
451 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); | 453 | ScenePresence sp = World.GetScenePresence(m_host.OwnerID); |
452 | return 0; | 454 | |
455 | if (sp == null || sp.GodLevel < 200) | ||
456 | { | ||
457 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); | ||
458 | return 0; | ||
459 | } | ||
453 | } | 460 | } |
461 | |||
454 | int success = 0; | 462 | int success = 0; |
455 | m_host.AddScriptLPS(1); | 463 | m_host.AddScriptLPS(1); |
464 | |||
456 | if (LightShareModule.EnableWindlight) | 465 | if (LightShareModule.EnableWindlight) |
457 | { | 466 | { |
458 | RegionLightShareData wl = getWindlightProfileFromRules(rules); | 467 | RegionLightShareData wl = getWindlightProfileFromRules(rules); |
@@ -465,8 +474,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
465 | LSShoutError("Windlight module is disabled"); | 474 | LSShoutError("Windlight module is disabled"); |
466 | return 0; | 475 | return 0; |
467 | } | 476 | } |
477 | |||
468 | return success; | 478 | return success; |
469 | } | 479 | } |
480 | |||
470 | public void lsClearWindlightScene() | 481 | public void lsClearWindlightScene() |
471 | { | 482 | { |
472 | if (!m_LSFunctionsEnabled) | 483 | if (!m_LSFunctionsEnabled) |
@@ -474,17 +485,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
474 | LSShoutError("LightShare functions are not enabled."); | 485 | LSShoutError("LightShare functions are not enabled."); |
475 | return; | 486 | return; |
476 | } | 487 | } |
477 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) | 488 | |
489 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID)) | ||
478 | { | 490 | { |
479 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); | 491 | ScenePresence sp = World.GetScenePresence(m_host.OwnerID); |
480 | return; | 492 | |
493 | if (sp == null || sp.GodLevel < 200) | ||
494 | { | ||
495 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); | ||
496 | return; | ||
497 | } | ||
481 | } | 498 | } |
482 | 499 | ||
483 | m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.valid = false; | 500 | m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.valid = false; |
484 | if (m_host.ParentGroup.Scene.SimulationDataService != null) | 501 | if (m_host.ParentGroup.Scene.SimulationDataService != null) |
485 | m_host.ParentGroup.Scene.SimulationDataService.RemoveRegionWindlightSettings(m_host.ParentGroup.Scene.RegionInfo.RegionID); | 502 | m_host.ParentGroup.Scene.SimulationDataService.RemoveRegionWindlightSettings(m_host.ParentGroup.Scene.RegionInfo.RegionID); |
503 | |||
486 | m_host.ParentGroup.Scene.EventManager.TriggerOnSaveNewWindlightProfile(); | 504 | m_host.ParentGroup.Scene.EventManager.TriggerOnSaveNewWindlightProfile(); |
487 | } | 505 | } |
506 | |||
488 | /// <summary> | 507 | /// <summary> |
489 | /// Set the current Windlight scene to a target avatar | 508 | /// Set the current Windlight scene to a target avatar |
490 | /// </summary> | 509 | /// </summary> |
@@ -497,13 +516,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
497 | LSShoutError("LightShare functions are not enabled."); | 516 | LSShoutError("LightShare functions are not enabled."); |
498 | return 0; | 517 | return 0; |
499 | } | 518 | } |
500 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) | 519 | |
520 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID)) | ||
501 | { | 521 | { |
502 | LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners."); | 522 | ScenePresence sp = World.GetScenePresence(m_host.OwnerID); |
503 | return 0; | 523 | |
524 | if (sp == null || sp.GodLevel < 200) | ||
525 | { | ||
526 | LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners."); | ||
527 | return 0; | ||
528 | } | ||
504 | } | 529 | } |
530 | |||
505 | int success = 0; | 531 | int success = 0; |
506 | m_host.AddScriptLPS(1); | 532 | m_host.AddScriptLPS(1); |
533 | |||
507 | if (LightShareModule.EnableWindlight) | 534 | if (LightShareModule.EnableWindlight) |
508 | { | 535 | { |
509 | RegionLightShareData wl = getWindlightProfileFromRules(rules); | 536 | RegionLightShareData wl = getWindlightProfileFromRules(rules); |
@@ -515,8 +542,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
515 | LSShoutError("Windlight module is disabled"); | 542 | LSShoutError("Windlight module is disabled"); |
516 | return 0; | 543 | return 0; |
517 | } | 544 | } |
545 | |||
518 | return success; | 546 | return success; |
519 | } | 547 | } |
520 | |||
521 | } | 548 | } |
522 | } | 549 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs index bd776b6..edcdfbc 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs | |||
@@ -319,7 +319,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
319 | 319 | ||
320 | object[] convertedParms = new object[parms.Length]; | 320 | object[] convertedParms = new object[parms.Length]; |
321 | for (int i = 0; i < parms.Length; i++) | 321 | for (int i = 0; i < parms.Length; i++) |
322 | convertedParms[i] = ConvertFromLSL(parms[i],signature[i], fname); | 322 | convertedParms[i] = ConvertFromLSL(parms[i], signature[i], fname); |
323 | 323 | ||
324 | // now call the function, the contract with the function is that it will always return | 324 | // now call the function, the contract with the function is that it will always return |
325 | // non-null but don't trust it completely | 325 | // non-null but don't trust it completely |
@@ -448,7 +448,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
448 | } | 448 | } |
449 | } | 449 | } |
450 | 450 | ||
451 | MODError(String.Format("{1}: parameter type mismatch; expecting {0}",type.Name, fname)); | 451 | MODError(String.Format("{0}: parameter type mismatch; expecting {1}, type(parm)={2}", fname, type.Name, lslparm.GetType())); |
452 | return null; | 452 | return null; |
453 | } | 453 | } |
454 | 454 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 9c148d1..7081416 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -3005,6 +3005,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3005 | return ret; | 3005 | return ret; |
3006 | } | 3006 | } |
3007 | 3007 | ||
3008 | public LSL_Vector osGetRegionSize() | ||
3009 | { | ||
3010 | CheckThreatLevel(ThreatLevel.None, "osGetRegionSize"); | ||
3011 | m_host.AddScriptLPS(1); | ||
3012 | |||
3013 | bool isMegaregion; | ||
3014 | IRegionCombinerModule rcMod = World.RequestModuleInterface<IRegionCombinerModule>(); | ||
3015 | if (rcMod != null) | ||
3016 | isMegaregion = rcMod.IsRootForMegaregion(World.RegionInfo.RegionID); | ||
3017 | else | ||
3018 | isMegaregion = false; | ||
3019 | |||
3020 | if (isMegaregion) | ||
3021 | { | ||
3022 | Vector2 size = rcMod.GetSizeOfMegaregion(World.RegionInfo.RegionID); | ||
3023 | return new LSL_Vector(size.X, size.Y, Constants.RegionHeight); | ||
3024 | } | ||
3025 | else | ||
3026 | { | ||
3027 | return new LSL_Vector((float)Constants.RegionSize, (float)Constants.RegionSize, Constants.RegionHeight); | ||
3028 | } | ||
3029 | } | ||
3030 | |||
3008 | public int osGetSimulatorMemory() | 3031 | public int osGetSimulatorMemory() |
3009 | { | 3032 | { |
3010 | CheckThreatLevel(ThreatLevel.Moderate, "osGetSimulatorMemory"); | 3033 | CheckThreatLevel(ThreatLevel.Moderate, "osGetSimulatorMemory"); |
@@ -3043,7 +3066,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3043 | sp.ControllingClient.Kick(alert); | 3066 | sp.ControllingClient.Kick(alert); |
3044 | 3067 | ||
3045 | // ...and close on our side | 3068 | // ...and close on our side |
3046 | sp.Scene.IncomingCloseAgent(sp.UUID, false); | 3069 | sp.Scene.CloseAgent(sp.UUID, false); |
3047 | } | 3070 | } |
3048 | }); | 3071 | }); |
3049 | } | 3072 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index a47e452..181399d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs | |||
@@ -353,6 +353,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
353 | // Position of a sensor in a child prim attached to an avatar | 353 | // Position of a sensor in a child prim attached to an avatar |
354 | // will be still wrong. | 354 | // will be still wrong. |
355 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); | 355 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); |
356 | |||
357 | // Don't proceed if the avatar for this attachment has since been removed from the scene. | ||
358 | if (avatar == null) | ||
359 | return sensedEntities; | ||
360 | |||
356 | fromRegionPos = avatar.AbsolutePosition; | 361 | fromRegionPos = avatar.AbsolutePosition; |
357 | q = avatar.Rotation; | 362 | q = avatar.Rotation; |
358 | } | 363 | } |
@@ -363,7 +368,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
363 | 368 | ||
364 | Vector3 ZeroVector = new Vector3(0, 0, 0); | 369 | Vector3 ZeroVector = new Vector3(0, 0, 0); |
365 | 370 | ||
366 | bool nameSearch = (ts.name != null && ts.name != ""); | 371 | bool nameSearch = !string.IsNullOrEmpty(ts.name); |
367 | 372 | ||
368 | foreach (EntityBase ent in Entities) | 373 | foreach (EntityBase ent in Entities) |
369 | { | 374 | { |
@@ -483,6 +488,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
483 | // Position of a sensor in a child prim attached to an avatar | 488 | // Position of a sensor in a child prim attached to an avatar |
484 | // will be still wrong. | 489 | // will be still wrong. |
485 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); | 490 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); |
491 | |||
492 | // Don't proceed if the avatar for this attachment has since been removed from the scene. | ||
486 | if (avatar == null) | 493 | if (avatar == null) |
487 | return sensedEntities; | 494 | return sensedEntities; |
488 | fromRegionPos = avatar.AbsolutePosition; | 495 | fromRegionPos = avatar.AbsolutePosition; |
@@ -601,7 +608,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
601 | return sensedEntities; | 608 | return sensedEntities; |
602 | senseEntity(sp); | 609 | senseEntity(sp); |
603 | } | 610 | } |
604 | else if (ts.name != null && ts.name != "") | 611 | else if (!string.IsNullOrEmpty(ts.name)) |
605 | { | 612 | { |
606 | ScenePresence sp; | 613 | ScenePresence sp; |
607 | // Try lookup by name will return if/when found | 614 | // Try lookup by name will return if/when found |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Properties/AssemblyInfo.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Properties/AssemblyInfo.cs index 6d218a6..9137c69 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Properties/AssemblyInfo.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Properties/AssemblyInfo.cs | |||
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices; | |||
29 | // Build Number | 29 | // Build Number |
30 | // Revision | 30 | // Revision |
31 | // | 31 | // |
32 | [assembly: AssemblyVersion("0.7.6.*")] | 32 | [assembly: AssemblyVersion("0.8.0.*")] |
33 | 33 | ||